Initial commit

This commit is contained in:
2018-08-23 16:44:53 +02:00
commit 1f06564778
115 changed files with 13984 additions and 0 deletions

1
app/tpl/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/latex/

View File

@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="{{ locale }}">
<!-- Build with magdev/dossier -->
<head>
<meta char{{ ('set="'~config('charset')~'"')|raw }}>
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
{% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">{% endif %}
<title>{{ 'cover.subtitle'|trans }} | {{ person.name }}</title>
<style media="screen,print">
{{ stylesheet|raw }}
{{ userstyles|raw }}
</style>
</head>
<body class="theme-{{ theme }}">
{% if is_disabled(disabled.cover) == false %}
{{ include('parts/cover.html.twig') }}
{% endif %}
<article>
{% if is_disabled(disabled.intro) == false %}
{{ include('parts/intro.html.twig') }}
{% endif %}
{% if is_disabled(disabled.resume) == false %}
{{ include('parts/resume.html.twig') }}
{% endif %}
{% if is_disabled(disabled.projects) == false %}
{{ include('parts/projects.html.twig') }}
{% endif %}
{% if is_disabled(disabled.cv) == false %}
{{ include('parts/cv.html.twig') }}
{% endif %}
{% if is_disabled(disabled.certs) == false %}
{{ include('parts/certs.html.twig') }}
{% endif %}
</article>
</body>
</html>

BIN
app/tpl/print/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
app/tpl/print/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,603 @@
/**
* LESS for magdev/resume print theme
*/
// MIXINS:START
//
// Mixins
//
.no-page-break-inside() {
page-break-after: auto;
page-break-before: auto;
page-break-inside: avoid;
}
.border-radius(@radius) {
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
border-radius: @radius;
}
.border-box(@width) {
border-right: @width solid @base-accent-color;
border-bottom: (@width * 2) solid @base-background-color;
}
.clearfix() {
&::after {
display: block;
content: '.';
clear: both;
visibility: hidden;
height: 1px;
font-size: 1px;
}
}
// MIXINS:END
// VARS:START
//
// Variables
//
// Base styles
@base-font-family: Arial, Verdana;
@base-font-size: 10pt;
@base-font-color: #222;
@base-background-color: #fff;
@base-accent-color: #68d19b;
// Page format
@page-format: A4 portrait;
@page-margins: 11mm 17mm 17mm 17mm;
// Typography
@headline-small-font-style: italic;
@headline-font-weight: bold;
@headline-border-style: 1px solid @base-accent-color;
@headline-1-size: (@base-font-size + 8pt);
@headline-1-size-small: (@headline-1-size - 5pt);
@headline-1-color: @base-font-color;
@headline-1-color-small: lighten(@base-font-color, 20%);
@headline-2-size: (@base-font-size + 6pt);
@headline-2-size-small: (@headline-2-size - 4pt);
@headline-2-color: @base-font-color;
@headline-2-color-small: lighten(@base-font-color, 20%);
@headline-3-size: @base-font-size;
@headline-3-size-small: (@headline-3-size - 2pt);
@headline-3-color: lighten(@base-font-color, 30%);
@headline-3-color-small: lighten(@base-font-color, 15%);
@headline-3-spacing: .4pt;
@headline-3-transform: uppercase;
@headline-4-size: (@base-font-size + 1pt);
@headline-4-size-small: (@headline-4-size - 2pt);
@headline-4-color: @base-font-color;
@headline-4-color-small: lighten(@base-font-color, 20%);
@paragraph-size: @base-font-size;
@paragraph-size-small: (@paragraph-size - 2pt);
@paragraph-color: @base-font-color;
@paragraph-text-align: left;
@date-base-color: lighten(@base-font-color, 30%);
@date-start-color: @base-accent-color;
// Whitespace
@headline-margin: .5cm 0 .2cm;
@paragraph-margin: 0 0 .3cm;
@paragraph-line-height: (@paragraph-size + 2pt);
@column-space: .3cm;
@blockquote-vertical-space: .5cm;
@blockquote-horizontal-wide: 3cm;
@blockquote-horizontal-narrow: 1.5cm;
// Cover
@cover-border-width: 6pt;
@cover-text-position: 18cm 0 0 8cm;
// Intro
@intro-paragraph-size: (@paragraph-size + .5pt);
@intro-paragraph-line-height: (@intro-paragraph-size + 3pt);
@intro-photo-border-radius: 0;
@intro-photo-margin: .15cm 0 .3cm .5cm;
@intro-photo-align: right;
@intro-text-inset: .1cm;
@intro-text-right-inset: .5cm;
@intro-text-align: justify;
// Resume
@resume-column-space: @column-space;
@resume-border-width: @cv-border-width;
@resume-label-color: lighten(@base-font-color, 30%);
@resume-gutter-padding: .6cm;
@resume-text-inset: .1cm;
@resume-text-align: left;
// CV
@cv-column-space: @column-space;
@cv-border-width: 4pt;
@cv-label-color: lighten(@base-font-color, 30%);
@cv-text-align: @resume-text-align;
// VARS:END
//
// Styles
//
// Reset
* {
margin: 0;
padding: 0;
border: 0;
font-weight: normal;
font-style: normal;
}
// Grid
.row {
display: flex;
}
.col {
flex: 1;
}
.col-border { flex: 0 0 1%; }
.col-tenth { flex: 0 0 10%; }
.col-eighth { flex: 0 0 12.5%; }
.col-fifteen { flex: 0 0 15%; }
.col-fifth { flex: 0 0 20%; }
.col-quarter { flex: 0 0 25%; }
.col-third { flex: 0 0 33.3333334%; }
.col-half { flex: 0 0 50%; }
.col-resume { flex: 0 0 48.5%; }
.col-golden-narrow { flex: 0 0 38%; }
.col-golden-wide { flex: 0 0 62%; }
// Page settings for printing
@page {
size: @page-format;
margin: @page-margins;
}
// Base elements
html, body {
background-color: @base-background-color;
font-family: @base-font-family;
font-size: @base-font-size;
color: @base-font-color;
}
section {
page-break-before: always;
}
h1, h2, h3 {
font-weight: @headline-font-weight;
margin: @headline-margin;
page-break-after: avoid;
small {
font-style: @headline-small-font-style;
}
}
h1 {
font-size: @headline-1-size;
margin-top: 0;
small {
font-size: @headline-1-size-small;
color: @headline-1-color-small;
}
}
h2 {
font-size: @headline-2-size;
border-bottom: @headline-border-style;
margin-top: 0;
small {
font-size: @headline-2-size-small;
color: @headline-2-color-small;
}
}
h3 {
font-size: @headline-3-size;
color: @headline-3-color;
letter-spacing: @headline-3-spacing;
text-transform: @headline-3-transform;
small {
font-size: @headline-3-size-small;
color: @headline-3-color-small;
text-transform: none;
}
}
p {
margin: @paragraph-margin;
font-size: @paragraph-size;
text-align: @paragraph-text-align;
color: @paragraph-color;
small {
font-size: @paragraph-size-small;
}
}
ul, ol, li {
list-style-type: none;
}
a, a:active, a:hover, a:visited {
text-decoration: none;
color: @base-font-color;
}
strong {
font-weight: bold;
}
em {
font-style: italic;
}
blockquote {
padding: .3cm 1cm .15cm;
color: lighten(@base-font-color, 30%);
background-color: lighten(@base-font-color, 80%);
border: 1px solid lighten(@base-font-color, 80%);
font-style: italic;
.border-radius(5pt);
.clearfix();
.text {
font-family: Georgia;
font-size: (@paragraph-size + 2pt);
font-style: italic;
}
.author {
font-family: Georgia;
font-size: (@paragraph-size - 1pt);
font-style: italic;
float: right;
margin-top: .2cm;
}
}
blockquote:nth-child(even) {
margin: @blockquote-vertical-space @blockquote-horizontal-wide @blockquote-vertical-space @blockquote-horizontal-narrow;
}
blockquote:nth-child(odd) {
margin: @blockquote-vertical-space @blockquote-horizontal-narrow @blockquote-vertical-space @blockquote-horizontal-wide;
}
dl.horizontal {
dl {
.no-page-break-inside();
}
dt, dd {
display: inline-block;
line-height: 14pt;
}
dt {
text-align: right;
padding-right: .2cm;
font-size: (@base-font-size - 1pt);
vertical-align: top;
color: @resume-label-color;
margin-top: .5pt;
}
dd {
font-size: @base-font-size;
text-align: @resume-text-align;
li, p {
padding-left: 0;
padding-right: 0;
}
}
}
// Cover page
.cover {
.col-border {
.border-box(@cover-border-width);
}
.col-content {
padding-left: .3cm;
}
.text {
margin: @cover-text-position;
h1 {
font-size: 30pt;
font-weight: bold;
margin-top: 0;
margin-bottom: .5cm;
line-height: 26pt;
}
.tagline {
font-size: 20pt;
color: lighten(@base-font-color, 30%);
}
.subtitle {
font-size: 12pt;
font-style: italic;
color: @base-accent-color;
margin-bottom: 0;
}
}
}
// Certificate pages
.certs {
.certificate {
text-align: center;
page-break-after: always;
figcaption {
text-align: left;
margin-bottom: .2cm;
h3 {
small {
text-transform: none;
display: block;
}
}
}
img {
width: 95%;
height: auto;
}
}
}
// Introduction page
.intro {
h4 {
border-bottom: 1pt solid lighten(@base-font-color, 40%);
margin-bottom: 2pt;
margin-top: 1.2cm;
display: inline-block;
}
.toc {
list-style-position: inside;
padding-left: .3cm;
li {
list-style-type: circle;
font-size: @base-font-size;
}
}
.content {
padding-left: @intro-text-inset;
padding-right: @intro-text-right-inset;
.clearfix();
h2, h3 {
margin-left: -@intro-text-inset;
margin-right: -(@intro-text-inset + @intro-text-right-inset);
}
}
.quotes {
&.top {
margin-bottom: 1cm;
}
&.bottom {
margin-top: 1cm;
}
}
p, li {
line-height: @intro-paragraph-line-height;
font-size: @intro-paragraph-size;
text-align: @intro-text-align;
}
.photo {
float: @intro-photo-align;
margin: @intro-photo-margin;
height: auto;
.border-radius(@intro-photo-border-radius);
}
}
// Curriculum vitae
.cv {
.cv-entry {
.no-page-break-inside();
margin-bottom: .5cm;
h4 {
font-weight: bold;
font-size: @headline-4-size;
color: @headline-4-color;
small {
font-size: @headline-4-size-small;
font-style: italic;
color: @headline-4-color-small;
}
}
p {
text-align: @cv-text-align;
small {
color: @cv-label-color;
font-style: italic;
}
}
.col-date {
padding-right: @column-space;
.border-box(@cv-border-width);
}
.col-info {
padding-left: @column-space;
p {
margin-bottom: .1cm;
&:last-child {
margin-bottom: 0;
}
}
}
.date {
font-size: @base-font-size;
font-weight: bold;
text-align: right;
color: @date-base-color;
.start, .end {
display: block;
}
.start {
font-size: (@base-font-size + 4pt);
font-weight: bold;
color: @date-start-color;
}
}
.company {
font-size: (@base-font-size - 1pt);
font-style: italic;
}
}
}
// Projects
.projects {
.content {
padding-left: @intro-text-inset;
padding-right: @intro-text-right-inset;
.clearfix();
h2, h3 {
margin-left: -@intro-text-inset;
margin-right: -(@intro-text-inset + @intro-text-right-inset);
}
}
.short-description {
font-weight: bold;
font-size: (@base-font-size + .5pt);
}
dl.horizontal {
display: none;
dt {
text-align: left;
width: 1cm;
}
dd {
padding-right: 1cm;
p {
margin: 0;
}
}
}
p, li {
line-height: @intro-paragraph-line-height;
font-size: @intro-paragraph-size;
text-align: @intro-text-align;
}
}
// Resume
.resume {
dl.horizontal {
dt {
width: 2.1cm;
}
dd {
width: 6cm;
}
}
li, p {
font-size: @base-font-size;
text-align: @resume-text-align;
padding-left: @resume-text-inset;
padding-right: @resume-gutter-padding;
}
.col-resume {
margin-top: .45cm;
h3:first-child {
margin-top: .05cm;
}
}
.col-1 {
.border-box(@resume-border-width);
flex: 0 0 47.5%;
}
.col-2 {
padding-left: @resume-gutter-padding;
flex: 0 0 50.5%;
li {
margin-bottom: 3pt;
}
}
}
// Footers and headers or PDF generation
footer,
header {
display: block;
.left {
text-align: left;
}
.center {
text-align: center;
}
.right {
text-align: right;
}
}
// Specific screen styles
@media screen {
html, body {
height: 100%;
}
body {
margin: 20px 30px 0;
width: 19.5cm;
}
section {
margin-bottom: 2cm;
&.cover {
.text {
margin: 0;
}
}
}
.certs {
.certificate {
margin-bottom: 1.5cm;
}
}
}

View File

@@ -0,0 +1,50 @@
{% macro show_quotes(quotes, class) %}
<div class="quotes {{ class|default('top') }}">
{% for quote in quotes %}
<blockquote>
<span class="text">{{ quote.quoteText }}</span>
{% if quote.quoteAuthor %}
<span class="author">{{ quote.quoteAuthor }}</span>
{% endif %}
</blockquote>
{% endfor %}
</div>
{% endmacro %}
{% macro list_simple_array(entries, tag) %}
{% set tag = tag|default('li') %}
{% for line in entries %}
<{{ tag }}>{{ line|inlinemd }}</{{ tag }}>
{% endfor %}
{% endmacro %}
{% macro list_link_array(entries, tag) %}
{% set tag = tag|default('li') %}
{% for link in entries %}
<{{ tag }}><a href="{{ link }}" target="_blank">{{ link }}</a></{{ tag }}>
{% endfor %}
{% endmacro %}
{% macro list_entry_attribute(entries, attribute, tag) %}
{% set tag = tag|default('li') %}
{% for entry in entries %}
{% if attribute(entry, attribute)|length > 0 %}
{% for line in attribute(entry, attribute) %}
<{{ tag }}>{{ line|inlinemd }}</{{ tag }}>
{% endfor %}
{% endif %}
{% endfor %}
{% endmacro %}
{% macro list_references(references) %}
{% for reference in references %}
<li>
</li>
{% endfor %}
{% endmacro %}

View File

@@ -0,0 +1,16 @@
<section class="certs">
<h2>{{ 'certs.header'|trans }}</h2>
{% for entry in cv.filterByCertificates() %}
{% for cert in entry.certificates %}
<div class="certificate">
<figure>
<figcaption>
<h3>{{ entry.position }} {% if cert.type %}- {{ cert.type }}{% endif %}
<small>{{ entry.endDate.format('Y') }} - {{ entry.company }}</small></h3>
</figcaption>
<img src="{{ cert.dataUri|raw }}" alt="{{ cert.fileObject.filename }}">
</figure>
</div>
{% endfor %}
{% endfor %}
</section>

View File

@@ -0,0 +1,10 @@
<section class="cover">
<div class="text row">
<div class="col col-border">&nbsp;</div>
<div class="col col-content">
<h1 class="title">{{ person.name }}</h1>
<p class="tagline">{{ person.tagline|splitmerge|raw }}</p>
<p class="subtitle">{{ 'cover.subtitle'|trans }}</p>
</div>
</div>
</section>

View File

@@ -0,0 +1,12 @@
<section class="cv">
<h2>{{ 'cv.header'|trans }}</h2>
{% for tag in tags %}
<div class="tag tag-{{ tag }}">
<h3>{{ ('cv.headers.' ~ tag)|trans }}</h3>
{% for entry in cv.filterByTag(tag) %}
{{ include('parts/cv/entry.html.twig') }}
{% endfor %}
</div>
{% endfor %}
</section>

View File

@@ -0,0 +1,32 @@
<div class="cv-entry row">
<div class="col col-fifteen col-date">
<p class="date">
<span class="start">{{ entry.startDate.format(config('date.format.short')) }}</span>
<span class="end"><small>{{ 'date.until'|trans }}</small>
{% if is_today(entry.endDate) %}
{{ 'date.today'|trans }}
{% else %}
{{ entry.endDate.format(config('date.format.short')) }}
{% endif %}
</span>
</p>
</div>
<div class="col col-info">
<h4>{{ entry.position }} {% if entry.industry %}<small>({{ entry.industry }})</small>{% endif %}</h4>
<p class="company">{{ entry.company }}</p>
{% if entry.description %}
<div class="content">
{{ entry.description|raw }}
</div>
{% endif %}
{% if entry.qualification %}
<p class="qualification"><small>{{ 'cv.entry.qualification'|trans }}</small><br/>{{ entry.qualification }}</p>
{% endif %}
{% if entry.skills|length > 0 %}
<p class="skills"><small>{{ 'cv.entry.skills'|trans }}</small><br/>{{ entry.skills|merge|inlinemd }}</p>
{% endif %}
{% if entry.achievements|length > 0 %}
<p class="achievements"><small>{{ 'cv.entry.achievements'|trans }}</small><br/>{{ entry.achievements|merge|inlinemd }}</p>
{% endif %}
</div>
</div>

View File

@@ -0,0 +1,37 @@
<section class="intro">
{% import "macros.html.twig" as macros %}
{% if is_disabled(disabled.quotes) == false and intro.quotes|length > 0 and intro.showQuotes == 'top' %}
{{ macros.show_quotes(intro.quotes, intro.showQuotes) }}
{% endif %}
<div class="content">
{% if intro.headline %}<h2>{{ intro.headline }}</h2>{% endif %}
{% if intro.hasPhoto() %}
<img src="{{ intro.photoDataUri }}" alt="{{ person.name }}" class="photo" width="{{ intro.photoSize }}">
{% endif %}
{{ intro.content|raw }}
</div>
{% if is_disabled(disabled.quotes) == false and intro.quotes|length > 0 and intro.showQuotes == 'bottom' %}
{{ macros.show_quotes(intro.quotes, intro.showQuotes) }}
{% endif %}
{% if is_disabled(disabled.toc) == false %}
<h4>{{ 'intro.toc'|trans }}</h4>
<ul class="toc">
{% if is_disabled(disabled.resume) == false %}
<li>{{ 'toc.resume'|trans }}</li>
{% endif %}
{% if is_disabled(disabled.projects) == false %}
<li>{{ 'toc.projects'|trans }}</li>
{% endif %}
{% if is_disabled(disabled.cv) == false %}
<li>{{ 'toc.cv'|trans }}</li>
{% endif %}
{% if is_disabled(disabled.certs) == false %}
<li>{{ 'toc.certs'|trans }}</li>
{% endif %}
</ul>
{% endif %}
</section>

View File

@@ -0,0 +1,11 @@
<footer class="row">
<div class="col col-third left">
</div>
<div class="col col-third center">
{{ 'pdf.page.number'|trans|raw }}
</div>
<div class="col col-third right">
</div>
</footer>

View File

@@ -0,0 +1,8 @@
<header class="row">
<div class="col col-half left">
{{ 'pdf.page.title'|trans|raw }}
</div>
<div class="col col-half right">
{{ 'pdf.page.date'|trans|raw }}
</div>
</header>

View File

@@ -0,0 +1,25 @@
{% if projects|length > 0 %}
<section class="projects">
<h2>{{ 'projects.header'|trans }}</h2>
<div class="content">
{% for project in projects %}
<article class="project">
<h3>{{ project.name }} {% if project.stack %}<small>({{ project.stack }})</small>{% endif %}</h3>
<dl class="horizontal">
<dt>{{ 'projects.fields.status'|trans }}</dt>
<dd>
<p class="badge badge-{{ project.status }}">{{ ('projects.status.' ~ project.status)|trans }}</p>
</dd>
{% if project.role %}
<dt>{{ 'projects.fields.role'|trans }}</dt>
<dd>{{ project.role }}</dd>
{% endif %}
</dl>
<p class="short-description">{{ project.shortDescription }}</p>
{{ project.content|raw }}
</article>
{% endfor %}
</div>
</section>
{% endif %}

View File

@@ -0,0 +1,139 @@
{% set useInResume = cv.filterByUseInResume() %}
{% set toolbox = cv.filterByToolbox() %}
{% import "macros.html.twig" as macros %}
<section class="resume">
<h2>{{ 'resume.header'|trans }}</h2>
<div class="row">
<div class="col col-resume col-1">
<!-- Personal Information -->
<h3>{{ 'resume.headers.personal'|trans }}</h3>
<dl class="horizontal">
<dt>{{ 'resume.personal.name'|trans }}</dt>
<dd>{{ person.getName(true) }}</dd>
<dt>{{ 'resume.personal.birthdate'|trans }}</dt>
<dd>{{ person.birthdate.format(config('date.format.long')) }}</dd>
<dt>{{ 'resume.personal.birthplace'|trans }}</dt>
<dd>{{ person.birthplace }}</dd>
<dt>{{ 'resume.personal.residence'|trans }}</dt>
<dd>{{ person.residence }}</dd>
<dt>{{ 'resume.personal.status'|trans }}</dt>
<dd>{{ person.status }}</dd>
<dt>{{ 'resume.personal.nationality'|trans }}</dt>
<dd>{{ person.nationality }}</dd>
{% if person.workLicense %}
<dt>{{ 'resume.personal.work_license'|trans }}</dt>
<dd>{{ person.workLicense }}</dd>
{% endif %}
{% if person.languages|length > 0 %}
<dt>{{ 'resume.personal.languages'|trans }}</dt>
<dd>
<ul>
{% for lang in person.languages %}
<li>{{ lang.language }} <small>({{ ('resume.language.level.' ~ lang.level)|trans }})</small></li>
{% endfor %}
</ul>
</dd>
{% endif %}
</dl>
<!-- Contact Information -->
{% if person.contacts|length > 0 %}
<h3>{{ 'resume.headers.contact'|trans }}</h3>
<dl class="horizontal">
{% for contact in person.contacts %}
{% set type = contact.type %}
{% if contact.type == 'email' or contact.type == 'phone' %}
{% set type = ('resume.contact.' ~ contact.type)|trans %}
{% endif %}
<dt>{{ type }}</dt>
<dd>{{ contact.address }}</dd>
{% endfor %}
</dl>
{% endif %}
<!-- Job Experience -->
<h3>{{ 'resume.headers.experience'|trans }}</h3>
<dl class="horizontal">
{% for industry, length in cv.getExperienceYears() %}
<dt>{{ industry }}</dt>
<dd>{{ length }}</dd>
{% endfor %}
</dl>
<!-- Bio -->
{% if person.content %}
<h3>{{ 'resume.headers.bio'|trans }}</h3>
<div class="bio">{{ person.content|raw }}</div>
{% endif %}
<!-- Qualifications -->
<h3>{{ 'resume.headers.qualification'|trans }}</h3>
<ul>
{% for entry in cv.qualifications %}
<li>{{ entry.qualification|splitmerge(',', '</li><li>') }}</li>
{% endfor %}
</ul>
<!-- Personal Toolbox -->
{% if toolbox|length > 0 %}
<h3>{{ 'resume.headers.toolbox'|trans }}</h3>
<ul>
{% for entry in toolbox %}
{{ macros.list_simple_array(entry.toolbox) }}
{% endfor %}
</ul>
{% endif %}
<!-- Personal Interests -->
{% if person.interests|length > 0 %}
<h3>{{ 'resume.headers.personal_interest'|trans }}</h3>
<ul>
{{ macros.list_simple_array(person.interests) }}
</ul>
{% endif %}
</div>
<div class="col col-resume col-2">
<!-- Links -->
{% if person.links|length > 0 %}
<h3>{{ 'resume.headers.links'|trans }}</h3>
<ul>
{{ macros.list_link_array(person.links) }}
</ul>
{% endif %}
<!-- References -->
{% if person.references|length > 0 %}
<h3>{{ 'resume.headers.references'|trans }}</h3>
<ul>
{{ macros.list_references(person.references) }}
</ul>
{% endif %}
{% if person.projects|length > 0 %}
<h3>{{ 'resume.headers.current_projects'|trans }}</h3>
<ul>
{{ macros.list_simple_array(person.projects) }}
</ul>
{% endif %}
{% if useInResume|length > 0 %}
<h3>{{ 'resume.headers.skills'|trans }}</h3>
<ul>
{{ macros.list_entry_attribute(useInResume, 'skills') }}
</ul>
<h3>{{ 'resume.headers.achievements'|trans }}</h3>
<ul>
{{ macros.list_entry_attribute(useInResume, 'achievements') }}
</ul>
{% endif %}
</div>
</div>
</section>

BIN
app/tpl/server/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
app/tpl/server/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABHVBMVEX////Z7vt+xfFEqusonugpnuhDqut+xPHX7fv2+/55wvE4pepBqeuKyvL5/P7W7PuTzvMuoOl9xPH4/P73+/5ZtO0gmudlue4xoulJrevi8vySzfMqnuhWs+18xPFYs+2NzPPq9f37/f/g8fxetu5ouu9Gq+vY7fsim+c3pOne8Puu2vZqvO+Y0PQ2pOl3wfC33/fV7Prt9/0hmudCqeuRzfPl8/wlnOjQ6vqi1fXL5/m13ffu9/2c0vQqn+hHrOu53/et2vaz3ffm9Pwnnejd8PvK5/lxv/Da7vvS6/qHyfL0+v78/v+84PgjnOfc7/tpu+/9/v9wvvD6/f7P6fqCxvJXs+1nuu94wvG94fhtve9dtu6AxvFUse1/xfE/bvvIAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAADsSURBVBjTY2CgImBkYmZhZWPnQBHk5OLm4eXj5BcQFBJGiIqIiolLSPIxMEhJy8iKwIXlxORlFBSVGBiUVVTV5GCi6hpimlpglraOrrKeOlSYSd/AEMwwUhMT0zMWggqbmJpBGAJiIMAGFTa3sLSytgEybMHCdlBhVmElezFuBwYGJUcnVYQwD7+zsZiYi6orkO0mJqYGFWaXZnAH6fYAsj3FxLygwvya3j6yYmL2ILavmJ8/3DsBgUFiEsEgZohYKNyXwmHhES6RIJZ3VHQwIlD4YjRi1ZVE1KW54/hQwpCDndnFhS2OkZqRBQA4TBqQiOWEHQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

View File

@@ -0,0 +1 @@
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAw1BMVEX////++/v42dv30tXupqvyu7/0wsbtnaPwsLX54ePWJTL65ef31tjaO0flc3vVIS7xt7vPARD65ufgWmTQBRTPAA/zvsL//v7ldX3YLjryvMDgW2X53uDtnqTZNEDQBBPgWWPzv8PqkpjdSVTUHCnWJzTnf4fRCRfldn7hYmv31df//f34293eUlzXKDX0x8raPEfPAhHfU130xsnjbHXcRlHYMj7toqfeT1nkcnrvqa7smJ7SDhzaOUXcR1L53d/smqDOQe/+AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAACSSURBVBjTY2CgEmBkYmbBIszKxsDOgSnMycXNw4tFOR+/gKAQFsOFRUTFsCgXlxCVZMMiLiXKKygtgyEsKyrEKievoKikrKKK5Fg1dXEGBg1RUVFNLW0dhLCuHoO+gaGRsZQJrymSan4zaXlNHXSjzQVFLbQwLLQUFbXCdJ21jaQtFkfbManaYxFmc2AmNg5IAgAkagqCGD9ZrwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

View File

@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="{{ locale }}">
<!-- Build with magdev/dossier -->
<head>
<meta char{{ ('set="'~config('charset')~'"')|raw }}>
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
{% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">{% endif %}
<title>{{ 'server.index.title'|trans }} | {{ person.name }}</title>
<style media="screen,print">
{{ stylesheet|raw }}
</style>
</head>
<body class="theme-{{ theme }}">
<div class="row row-main">
<div class="col col-left">
<h1>{{ 'server.index.header'|trans }}</h1>
<nav>
<ul>
{% for link in links %}
{% set parts = parseFilename(link.filename) %}
{% set time = link.getCTime()|unixToDateTime %}
<li class="{{ parts.type }}">
<a href="/{{ link.filename }}" target="ifm">
<h2>{{ parts.name }} <small>({{ parts.theme }}, {{ parts.locale }})</small></h2>
</a>
<dl>
<dt>{{ 'server.index.filesize'|trans }}</dt>
<dd>{{ link.size|filesize }}</dd>
<dt>{{ 'server.index.filetime'|trans }}</dt>
<dd>{{ time.format('d.m.Y H:i:s') }}</dd>
</dl>
<a href="/{{ link.filename }}" target="_blank">{{ 'server.index.new_window'|trans }}</a>
</li>
{% endfor %}
</ul>
</nav>
</div>
<div class="col col-main">
<iframe height="100%" width="100%" name="ifm" src="/{{ first_link.filename }}"></iframe>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,153 @@
/**
* LESS for magdev/resume print theme
*/
// MIXINS:START
//
// Mixins
//
.border-radius(@radius) {
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
border-radius: @radius;
}
// MIXINS:END
// VARS:START
//
// Variables
//
@base-font-family: Arial, Verdana;
@base-font-size: 13px;
@base-font-color: #222;
@base-background-color: #fff;
@base-accent-color: #68d19b;
@headline-1-size: (@base-font-size * 3);
@headline-1-color: #fff;
@headline-1-background-color: darken(@base-accent-color, 15%);
@headline-2-color: @base-font-color;
@headline-2-color-small: lighten(@headline-2-color, 30%);
@headline-2-size: floor(@base-font-size * 1.6);
@headline-2-size-small: (@headline-2-size - 5px);
@leftcol-width: 350px;
@leftcol-nav-margin: 10px 10px 0 15px;
@icon-pdf: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAw1BMVEX////++/v42dv30tXupqvyu7/0wsbtnaPwsLX54ePWJTL65ef31tjaO0flc3vVIS7xt7vPARD65ufgWmTQBRTPAA/zvsL//v7ldX3YLjryvMDgW2X53uDtnqTZNEDQBBPgWWPzv8PqkpjdSVTUHCnWJzTnf4fRCRfldn7hYmv31df//f34293eUlzXKDX0x8raPEfPAhHfU130xsnjbHXcRlHYMj7toqfeT1nkcnrvqa7smJ7SDhzaOUXcR1L53d/smqDOQe/+AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAACSSURBVBjTY2CgEmBkYmbBIszKxsDOgSnMycXNw4tFOR+/gKAQFsOFRUTFsCgXlxCVZMMiLiXKKygtgyEsKyrEKievoKikrKKK5Fg1dXEGBg1RUVFNLW0dhLCuHoO+gaGRsZQJrymSan4zaXlNHXSjzQVFLbQwLLQUFbXCdJ21jaQtFkfbManaYxFmc2AmNg5IAgAkagqCGD9ZrwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==');
@icon-html: url('data:text/html;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABHVBMVEX////Z7vt+xfFEqusonugpnuhDqut+xPHX7fv2+/55wvE4pepBqeuKyvL5/P7W7PuTzvMuoOl9xPH4/P73+/5ZtO0gmudlue4xoulJrevi8vySzfMqnuhWs+18xPFYs+2NzPPq9f37/f/g8fxetu5ouu9Gq+vY7fsim+c3pOne8Puu2vZqvO+Y0PQ2pOl3wfC33/fV7Prt9/0hmudCqeuRzfPl8/wlnOjQ6vqi1fXL5/m13ffu9/2c0vQqn+hHrOu53/et2vaz3ffm9Pwnnejd8PvK5/lxv/Da7vvS6/qHyfL0+v78/v+84PgjnOfc7/tpu+/9/v9wvvD6/f7P6fqCxvJXs+1nuu94wvG94fhtve9dtu6AxvFUse1/xfE/bvvIAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAADsSURBVBjTY2CgImBkYmZhZWPnQBHk5OLm4eXj5BcQFBJGiIqIiolLSPIxMEhJy8iKwIXlxORlFBSVGBiUVVTV5GCi6hpimlpglraOrrKeOlSYSd/AEMwwUhMT0zMWggqbmJpBGAJiIMAGFTa3sLSytgEybMHCdlBhVmElezFuBwYGJUcnVYQwD7+zsZiYi6orkO0mJqYGFWaXZnAH6fYAsj3FxLygwvya3j6yYmL2ILavmJ8/3DsBgUFiEsEgZohYKNyXwmHhES6RIJZ3VHQwIlD4YjRi1ZVE1KW54/hQwpCDndnFhS2OkZqRBQA4TBqQiOWEHQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==');
// VARS:END
//
// Styles
//
// Reset
* {
margin: 0;
padding: 0;
border: 0;
font-weight: normal;
font-style: normal;
list-style-type: none;
}
// Base elements
html, body {
background-color: @base-background-color;
font-family: @base-font-family;
font-size: @base-font-size;
color: @base-font-color;
}
html,body,.row-main,.col-main,.col-left {
height: 100%
}
body {
overflow: hidden;
}
h1 {
font-size: @headline-1-size;
color: @headline-1-color;
font-weight: bold;
background-color: @headline-1-background-color;
padding: 2px auto;
text-transform: uppercase;
letter-spacing: 3px;
text-align: center;
}
h2 {
font-size: @headline-2-size;
color: @headline-2-color;
font-weight: bold;
small {
font-size: @headline-2-size-small;
color: @headline-2-color-small;
font-style: italic;
}
}
a {
text-decoration: none;
}
// Grid
.row {
display: flex;
}
.col {
flex: 1;
}
.col-golden-narrow { flex: 0 0 38%; }
.col-golden-wide { flex: 0 1 62%; }
.col-left {
flex: 0 0 @leftcol-width;
background-color: lighten(@base-accent-color, 10%);
border-right: 5px solid @headline-1-background-color;
nav {
margin: @leftcol-nav-margin;
li {
margin-bottom: 10px;
background-color: @base-background-color;
padding: 5px 10px;
.border-radius(5px);
&.html {
background: @base-background-color @icon-html no-repeat top right;
}
&.pdf {
background: @base-background-color @icon-pdf no-repeat top right;
}
a:first-child {
color: @base-font-color;
}
dt,dd {
display: inline-block;
}
dt {
width: 38%;
float: left;
}
dd {
width: 62%;
}
}
}
}