Add kendal2 theme

This commit is contained in:
Arnaud Ysmal 2021-02-07 21:10:42 +01:00
parent 5b68510c0d
commit e19cc078da
11 changed files with 1367 additions and 12 deletions

View File

@ -34,6 +34,7 @@ import (
"jsonresume/model"
"jsonresume/themes"
_ "jsonresume/themes/kendall"
_ "jsonresume/themes/kendall2"
_ "jsonresume/themes/stackoverflow"
_ "jsonresume/themes/tex"
)

View File

@ -1,5 +1,7 @@
#!/bin/bash
go-bindata -pkg kendall -o themes/kendall/kendall-assets.go themes/kendall/{resume.template,style.css,print.css}
for theme in kendall kendall2; do
go-bindata -pkg ${theme} -o themes/${theme}/${theme}-assets.go themes/${theme}/{resume.template,style.css,print.css}
done
go-bindata -pkg stackoverflow -o themes/stackoverflow/stackoverflow-assets.go themes/stackoverflow/{resume.template,style.css}
go-bindata -pkg tex -o themes/tex/tex-assets.go themes/tex/resume_template.tex

View File

@ -134,6 +134,7 @@ type Volunteer struct {
type Education struct {
Institution string `json:"institution"`
Hide bool `json:"hide"`
Location string `json:"location"`
Area string `json:"area"`
StudyType string `json:"studyType"`
StartDate ResumeDate `json:"startDate"`

View File

@ -95,7 +95,7 @@ func themesKendallResumeTemplate() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "themes/kendall/resume.template", size: 12378, mode: os.FileMode(420), modTime: time.Unix(1612213494, 0)}
info := bindataFileInfo{name: "themes/kendall/resume.template", size: 12378, mode: os.FileMode(420), modTime: time.Unix(1612727562, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -115,7 +115,7 @@ func themesKendallStyleCss() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "themes/kendall/style.css", size: 5262, mode: os.FileMode(420), modTime: time.Unix(1596890556, 0)}
info := bindataFileInfo{name: "themes/kendall/style.css", size: 5262, mode: os.FileMode(420), modTime: time.Unix(1612707068, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -135,7 +135,7 @@ func themesKendallPrintCss() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "themes/kendall/print.css", size: 1186, mode: os.FileMode(420), modTime: time.Unix(1596890556, 0)}
info := bindataFileInfo{name: "themes/kendall/print.css", size: 1186, mode: os.FileMode(420), modTime: time.Unix(1612727562, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}

6
themes/kendall2/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 2018 Arnaud Ysmal. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package kendall2
import (
"jsonresume/model"
"jsonresume/themes"
"path"
"text/template"
)
const (
packageDirectory = "themes/kendall2"
fileCSS = "style.css"
fileCSSPrint = "print.css"
fileTemplate = "resume.template"
)
var Theme = themes.Theme{
Name: "kendall2",
Directory: packageDirectory,
Functions: template.FuncMap{
"css": getCSS,
"printcss": getPrintCSS,
"md2html": md2html,
},
}
func init() {
t, _ := Asset(path.Join(packageDirectory, fileTemplate))
Theme.Template = string(t)
(&Theme).Register()
}
func getCSS() string {
r, _ := Asset(path.Join(packageDirectory, fileCSS))
return string(r)
}
func getPrintCSS() string {
r, _ := Asset(path.Join(packageDirectory, fileCSSPrint))
return string(r)
}
func md2html(s string) string {
return model.MarkdownURLRegexp.ReplaceAllString(s, `<a href="$2" target="_blank">$1</a>`)
}

337
themes/kendall2/print.css Normal file
View File

@ -0,0 +1,337 @@
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800);
@charset "utf-8";
@-webkit-viewport { width: device-width; }
@-moz-viewport { width: device-width; }
@-ms-viewport { width: device-width; }
@-o-viewport { width: device-width; }
@viewport { width: device-width; }
body{
font-family: 'Open Sans', Arial, Tahoma;
font-weight: 400;
color: #363636;
background: none;
}
blockquote {
font-size: 1em;
}
blockquote,
#education,
#awards,
.contact-item,
.publication,
.skills,
.interests,
.clearfix{
page-break-inside: avoid;
}
.container{
margin-top: 0px;
margin-bottom: 0px;
background: #fff;
}
#photo-header{
margin-top: -75px;
}
#photo{
width: 160px;
height: 160px;
border-radius: 50%;
overflow: hidden;
padding: 5px;
background: #334960;
display: inline-block;
}
#photo img{
width: 150px;
height: 150px;
border-radius: 50%;
}
#text-header h1{
margin: 0;
padding: 0;
font-size: 1.5em;
font-weight: 700;
text-transform: uppercase;
letter-spacing: -1px;
}
#text-header h1::first-line{
font-size: 1.5em;
font-weight: 800;
line-height: 1.5em;
}
#text-header h1 span{
color: #334960;
opacity: 0.7;
}
#text-header h1 sup{
opacity: 0.5;
}
#text-header:after{
width: 100%;
height: 3px;
border-bottom: 1px solid #ddd;
margin-top: 15px;
content: '';
display: block;
}
.box{
padding-bottom: 10px;
margin-bottom: 25px;
}
.box h2{
color: #227c74;
font-size: 1.5em;
font-weight: 700;
text-transform: uppercase;
}
#awards,
#education{
margin-top: 20px;
margin-bottom: 0;
position: relative;
padding: 1em 0;
list-style: none;
}
#awards:before,
#education:before {
background: none;
}
/*
#awards:before,
#education:before {
width: 5px;
height: 100%;
position: absolute;
left: 35px;
top: 0;
content: ' ';
display: block;
background: #32475c;
background: -moz-linear-gradient(top, #ffffff 0%, #32475c 7%, #32475c 89%, #ffffff 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(7%,#32475c), color-stop(89%,#32475c), color-stop(100%,#ffffff));
background: -webkit-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: -o-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: -ms-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: linear-gradient(to bottom, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ffffff',GradientType=0 );
}
*/
#awards li,
#education li{
width: 100%;
z-index: 2;
position: relative;
float: left;
}
#awards .year,
#education .year{
width: 14%;
background: #fff;
padding: 10px;
font-weight: 700;
display: inline-block;
}
#awards .description,
#education .description{
width: 83%;
display: inline-block;
background: #eee;
margin-bottom: 10px;
position: relative;
padding: 10px;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
}
/*
#awards .description:after,
#education .description:after {
content: '';
position: absolute;
top: 15px;
right: 0;
left: -16px;
height: 0;
width: 0;
border: solid transparent;
border-right-color: #eee;
border-width: 8px;
pointer-events: none;
}
*/
#awards .description h3,
#education .description h3{
font-size: 1.2em;
margin: 0;
padding: 0;
font-weight: 700;
}
#awards .description p,
#education .description p{
margin-top: 5px;
padding: 0;
}
.job{
margin-bottom: 15px;
}
.job .details {
margin-left: 3%;
width: 95%;
padding: 10px;
margin-bottom: 10px;
background: #eee;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
}
.job .where{
font-size: 1.2em;
font-weight: bold;
}
.job .year{
opacity: 0.7;
}
.job .profession{
font-size: 1.2em;
font-weight: bold;
}
.job .description{
line-height: 1.5em;
}
.job .highlights{
padding: 5px 0;
font-weight: bold;
}
.job .job-details {
padding-left: 5%;
width: 100%;
}
.publication {
margin-bottom: 0;
}
.publication .name{
font-size: 1em;
font-weight: bold;
}
.publication .year{
opacity: 0.7;
}
.publication p{
margin: 0;
padding-top: 10px;
}
.contact-item{
width: 100%;
float: left;
}
.contact-item .icon{
padding: 10px;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
color: #32475c;
background: #eee;
}
.contact-item:last-child .icon{
border-bottom: none;
}
.contact-item .title{
width: 80%;
width: calc(100% - 55px);
font-weight: 700;
opacity: 0.9;
}
.contact-item .title.only{
margin-top: 10px;
}
.contact-item .description{
width: 80%;
width: calc(100% - 55px);
color: #334960;
}
.item-interests,
.item-skills{
height: 30px;
color: #334960;
padding: 5px 10px;
margin-bottom: 5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 1.1em;
font-weight: 600;
}
.interest,
.skill{
color: #fff;
display: inline-block;
margin-right: 5px;
margin-bottom: 5px;
padding: 5px 10px;
background: #32475c;
position: relative;
font-size: .85em;
}
.skill-level {
background-color: #227c74;
border-radius: 4px;
color: #fff;
padding: 1px 8px;
font-size: .75em;
position: absolute;
margin: 1px 10px;
}
#language-skills .skill{
margin: 10px 0;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
/*
body {
font-size: .90em;
}
.box {
margin-bottom: -10px;
}
*/
.col-sm-5{
width: 40%;
padding: 0 15px;
}
.col-sm-7{
width: 60%;
padding: 0 15px;
}
.list-group-item{
margin: 0;
padding: 5px 15px;
border: none;
}
.body{
margin: 0 !important;
}
a[href]:after {
content: none !important;
}
.box:after {
background: none;
}
.colle {
page-break-inside: avoid;
}
ul li .list-group-item {
list-style-type: decimal !important;
}

View File

@ -0,0 +1,305 @@
<!DOCTYPE html>
<html lang="{{.Language}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{.Lang.TitlePrefix}} {{.Basic.Name}}</title>
<link href="bootstrap.min.css" rel="stylesheet">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<style>{{css}}</style>
<style media="print">{{printcss}}</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<div id="photo-header" class="text-center">
<!-- PHOTO (AVATAR) -->
{{if .Basic.Image -}}
<div id="photo">
<img src="{{.Basic.Image}}" alt="avatar">
</div>
{{- end}}
<div id="text-header" {{if not .Basic.Image}}style="margin-top: 90px;"{{- end}}>
<h1>{{.Basic.Name}}<br>{{if .Basic.Label}}<span>{{.Basic.Label}}</span>{{- end}}</h1>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-7">
{{if .Basic.Summary -}}
<!-- ABOUT ME -->
<div class="box">
<h2><i class="fa fa-user ico"></i> {{.Lang.About}}</h2>
<p>{{.Basic.Summary}}</p>
</div>
{{- end}}
{{if .Work -}}
<!-- WORK EXPERIENCE -->
<div class="box">
<h2><i class= "fa fa-suitcase ico"></i> {{.Lang.WorkExperience}}</h2>
{{range .Work -}}
<div class="job clearfix">
<div class="row">
<div class="details">
<div class="where">{{.Position}}</div>
{{if .URL -}}
<div class="address">
<a href="{{.URL}}" target= "_blank"><i class="fa fa-globe ico"></i> {{.URL}}</a>
</div>
{{- end}}
<div class="year">{{formatDateShortMY .StartDate}} {{formatDateShortMY .EndDate}} | <b>{{.Name}}</b> <i>({{.Location}})</i></div>
</div>
</div>
<div class="row">
<div class="job-details col-xs-11">
<div class="description">
{{.Summary -}}
{{if .Highlights -}}
<div class="highlights"></div>
<ul class="list-group">
{{range .Highlights -}}
<li class="list-group-item">
{{.Title}}
{{if .Items -}}
<ul>
{{range .Items}}<li>{{.}}</li>{{end}}
</ul>
{{- end}}
</li>
{{- end}}
</ul>
{{- end}}
</div>
</div>
</div>
</div>
{{- end}}
</div>
{{- end}}
{{if .Awards -}}
<!-- AWARDS -->
<div class="box">
<h2><i class="fa fa-certificate ico"></i> {{.Lang.Awards}}</h2>
<ul id="awards" class="clearfix">
{{range .Awards -}}
<li>
<div class="year pull-left">{{formatDateDMY .Date}}</div>
<div class="description pull-right">
<h3>{{.Awarder}}</h3>
<p><i class="fa fa-trophy ico"></i> {{.Title}}</p>
<p>{{.Summary}}</p>
</div>
</li>
{{- end}}
</ul>
</div>
{{- end}}
{{if .Volunteer -}}
<!-- VOLUNTEER -->
<div class="box">
<h2><i class= "fa fa-group ico"></i> {{.Lang.Volunteer}}</h2>
{{range .Volunteer -}}
<div class="job clearfix">
<div class="row">
<div class="details">
<div class="where">{{.Organization}}</div>
{{if .URL -}}
<div class="address">
<a href="{{.URL}}" target= "_blank"><i class="fa fa-globe ico"></i> {{.URL}}</a>
</div>
{{- end}}
<div class="year">{{formatDateShortMY .StartDate}} {{formatDateShortMY .EndDate}}</div>
</div>
</div>
<div class="row">
<div class="job-details col-xs-11">
<div class="profession">{{.Position}}</div>
<div class="description">
{{.Summary -}}
{{if .Highlights -}}
<div class="highlights"></div>
<ul class="list-group">
{{range .Highlights -}}
<li class="list-group-item">
{{md2html .Title}}
{{if .Items -}}
<ul>
{{range .Items}}<li>{{md2html .}}</li>{{end}}
</ul>
{{- end}}
</li>
{{- end}}
</ul>
{{- end}}
</div>
</div>
</div>
</div>
{{- end}}
</div>
{{- end}}
</div>
<div class="col-xs-12 col-sm-5">
<!-- CONTACT -->
<div class="box clearfix">
<h2><i class="fa fa-bullseye ico"></i> {{.Lang.Contact}}</h2>
{{if .Basic.Location.City -}}
<div class="contact-item">
<div class="icon pull-left text-center"><span class="fa fa-map-marker fa-fw"></span></div>
{{if .Basic.Location.Address}}<div class="title pull-right">{{.Basic.Location.Address}}</div>{{- end}}
<div class="title {{if not .Basic.Location.Address}}only {{- end}} pull-right">{{if .Basic.Location.PostalCode}} {{.Basic.Location.PostalCode}}{{- end}} {{.Basic.Location.City}}{{if .Basic.Location.Region}}, {{.Basic.Location.Region}}{{- end}}{{if .Basic.Location.CountryCode}} {{.Basic.Location.CountryCode}}{{- end}}</div>
</div>
{{- end}}
{{if .Basic.Phone -}}
<div class="contact-item">
<div class="icon pull-left text-center"><span class="fa fa-phone fa-fw"></span></div>
<div class="title only pull-right">{{.Basic.Phone}}</div>
</div>
{{- end}}
{{if .Basic.Email -}}
<div class="contact-item">
<div class="icon pull-left text-center"><span class="fa fa-envelope fa-fw"></span></div>
<div class="title only pull-right"><a href="mailto:{{.Basic.Email}}" target="_blank">{{.Basic.Email}}</a></div>
</div>
{{- end}}
{{if .Basic.URL -}}
<div class="contact-item">
<div class="icon pull-left text-center"><span class="fa fa-globe fa-fw"></span></div>
<div class="title only pull-right"><a href="{{.Basic.URL}}" target="_blank">{{.Basic.URL}}</a></div>
</div>
{{- end}}
{{range .Basic.Profiles -}}
<div class="contact-item">
<div class="icon pull-left text-center"><span class="{{iconClass .Network}} fa-fw"></span></div>
<div class="title pull-right">{{.Network}}</div>
<div class="description pull-right"><a href="{{.URL}}" target="_blank">{{if .UserName}}{{.UserName}}{{- end}}{{if not .UserName}}{{.URL}}{{- end}}</a></div>
</div>
{{- end}}
</div>
{{if .Education -}}
<!-- EDUCATION -->
<div class="box">
<h2><i class="fa fa-university ico"></i> {{.Lang.Education}}</h2>
<ul id="education" class="clearfix">
{{range .Education -}}
<li>
<div class="year pull-left">{{formatDateY .StartDate}} {{formatDateY .EndDate}}</div>
<div class="description pull-right">
<h3>{{.Institution}}</h3>
<p><i>({{.Location}})</i></p>
{{if .StudyType}}<p><i class= "fa fa-graduation-cap ico"></i> {{.StudyType}}</p>{{end}}
<p>{{.Area}}</p>
{{if .GPA -}}
<p>
GPA: {{.GPA}}
</p>
{{- end}}
{{if .Courses -}}
<div>Courses</div>
<ul class="list-group">
{{range .Courses -}}
<li class="list-group-item">{{.}}</li>
{{- end}}
</ul>
{{- end}}
</div>
</li>
{{- end}}
</ul>
</div>
{{- end}}
{{if .Skills -}}
<!-- SKILLS -->
<div class="box">
<h2><i class="fa fa-tasks ico"></i> {{.Lang.Skills}}</h2>
{{range .Skills -}}
<div class="skills clearfix">
<div class="item-skills">
{{.Name}}
{{if .Level}}<span class="skill-level">{{.Level}}</span>{{- end}}
</div>
<div class="col-sm-offset-1 col-sm-12 clearfix">
{{range .Keywords -}}
<span class= "skill badge">{{.}}</span>
{{- end}}
</div>
</div>
{{- end}}
</div>
{{- end}}
{{if .Publications -}}
<!-- PUBLICATIONS -->
<div class="box">
<h2><i class="fa fa-book ico"></i> {{.Lang.Publications}}</h2>
{{range .Publications -}}
<div class="publication panel panel-default">
<div class="panel-heading">
<div class="name panel-title">{{.Name}}</div>
</div>
<div class="panel-body">
{{if .Publisher -}}
<div class="publisher"><i class= "fa fa-bookmark ico"></i> {{.Publisher}}</div>
{{- end}}
<div class="year">{{formatDateDMY .ReleaseDate}}</div>
{{if .URL -}}
<div class="address">
<a href="{{.URL}}" target= "_blank"><i class="fa fa-globe ico"></i> {{.URL}}</a>
</div>
{{- end}}
{{if .Summary -}}
<p>{{.Summary}}</p>
{{- end}}
</div>
</div>
{{- end}}
</div>
{{- end}}
{{if .Languages -}}
<!-- LANGUAGES -->
<div class="box colle">
<h2><i class="fa fa-language ico"></i> {{.Lang.Languages}}</h2>
<ul class="list-group">
{{range .Languages -}}
<li class=" list-group-item">{{.Language}}<span class="skill badge pull-right">{{.Fluency}}</span></li>
{{- end}}
</ul>
</div>
{{- end}}
{{if .Interests -}}
<!-- HOBBIES -->
<div class="box">
<h2><i class="fa fa-heart ico"></i> {{.Lang.Interests}}</h2>
{{range .Interests -}}
<div class="interests clearfix">
<div class="item-interests">
{{.Name -}}
</div>
<div class="col-sm-offset-1 col-sm-12 clearfix">
{{range .Keywords -}}
<span class= "interest badge">{{.}}</span>
{{- end}}
</div>
</div>
{{- end}}
</div>
{{- end}}
{{if .References -}}
<div class="box">
<h2><i class= "fa fa-check-square ico"></i> {{.Lang.References}}</h2>
{{range .References -}}
<blockquote>
<div>{{.Reference}}</div>
<footer>{{.Name}}</footer>
</blockquote><br>
{{- end}}
</div>
{{- end}}
</div>
</div>
</div>
</body>
</html>

276
themes/kendall2/style.css Normal file
View File

@ -0,0 +1,276 @@
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800);
@charset "utf-8";
@-webkit-viewport { width: device-width; }
@-moz-viewport { width: device-width; }
@-ms-viewport { width: device-width; }
@-o-viewport { width: device-width; }
@viewport { width: device-width; }
body{
font-family: 'Open Sans', Arial, Tahoma;
font-weight: 400;
color: #363636;
background: #334960;
}
blockquote {
font-size: 1em;
}
.container{
margin-top: 80px;
margin-bottom: 15px;
background: #fff;
}
#photo-header{
margin-top: -75px;
}
#photo{
width: 160px;
height: 160px;
border-radius: 50%;
overflow: hidden;
padding: 5px;
background: #334960;
display: inline-block;
}
#photo img{
width: 150px;
height: 150px;
border-radius: 50%;
}
#text-header h1{
margin: 0;
padding: 0;
font-size: 1.5em;
font-weight: 700;
text-transform: uppercase;
letter-spacing: -1px;
}
#text-header h1::first-line{
font-size: 1.5em;
font-weight: 800;
line-height: 1.5em;
}
#text-header h1 span{
color: #334960;
opacity: 0.7;
}
#text-header h1 sup{
opacity: 0.5;
}
#text-header:after{
width: 100%;
height: 3px;
border-bottom: 1px solid #ddd;
margin-top: 15px;
content: '';
display: block;
}
.box{
padding-bottom: 10px;
margin-bottom: 25px;
}
.box h2{
color: #227c74;
font-size: 1.5em;
font-weight: 700;
text-transform: uppercase;
}
#awards,
#education{
margin-top: 20px;
margin-bottom: 0;
position: relative;
padding: 1em 0;
list-style: none;
}
#awards:before,
#education:before {
width: 5px;
height: 100%;
position: absolute;
left: 35px;
top: 0;
content: ' ';
display: block;
background: #32475c;
background: -moz-linear-gradient(top, #ffffff 0%, #32475c 7%, #32475c 89%, #ffffff 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(7%,#32475c), color-stop(89%,#32475c), color-stop(100%,#ffffff));
background: -webkit-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: -o-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: -ms-linear-gradient(top, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
background: linear-gradient(to bottom, #ffffff 0%,#32475c 7%,#32475c 89%,#ffffff 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ffffff',GradientType=0 );
}
#awards li,
#education li{
width: 100%;
z-index: 2;
position: relative;
float: left;
}
#awards .year,
#education .year{
width: 14%;
background: #fff;
padding: 10px;
font-weight: 700;
display: inline-block;
}
#awards .description,
#education .description{
width: 83%;
display: inline-block;
background: #eee;
margin-bottom: 10px;
position: relative;
padding: 10px;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
}
#awards .description:after,
#education .description:after {
content: '';
position: absolute;
top: 15px;
right: 0;
left: -16px;
height: 0;
width: 0;
border: solid transparent;
border-right-color: #eee;
border-width: 8px;
pointer-events: none;
}
#awards .description h3,
#education .description h3{
font-size: 1.2em;
margin: 0;
padding: 0;
font-weight: 700;
}
#awards .description p,
#education .description p{
margin-top: 5px;
padding: 0;
}
.job{
margin-bottom: 15px;
}
.job .details {
margin-left: 3%;
width: 95%;
padding: 10px;
margin-bottom: 10px;
background: #eee;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
}
.job .where{
font-size: 1.2em;
font-weight: bold;
}
.job .year{
opacity: 0.7;
}
.job .profession{
font-size: 1.2em;
font-weight: bold;
}
.job .description{
line-height: 1.5em;
}
.job .highlights{
padding: 5px 0;
font-weight: bold;
}
.job .job-details {
padding-left: 5%;
width: 100%;
}
.publication {
margin-bottom: 0;
}
.publication .name{
font-size: 1em;
font-weight: bold;
}
.publication .year{
opacity: 0.7;
}
.publication p{
margin: 0;
padding-top: 10px;
}
.contact-item{
width: 100%;
float: left;
}
.contact-item .icon{
padding: 10px;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
color: #32475c;
background: #eee;
}
.contact-item:last-child .icon{
border-bottom: none;
}
.contact-item .title{
width: 80%;
width: calc(100% - 55px);
font-weight: 700;
opacity: 0.9;
}
.contact-item .title.only{
margin-top: 10px;
}
.contact-item .description{
width: 80%;
width: calc(100% - 55px);
color: #334960;
}
.item-interests,
.item-skills{
height: 30px;
color: #334960;
padding: 5px 10px;
margin-bottom: 5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 1.1em;
font-weight: 600;
}
.interest,
.skill{
color: #fff;
display: inline-block;
margin-right: 5px;
margin-bottom: 5px;
padding: 5px 10px;
background: #32475c;
position: relative;
font-size: .85em;
}
.skill-level {
background-color: #227c74;
border-radius: 4px;
color: #fff;
padding: 1px 8px;
font-size: .75em;
position: absolute;
margin: 1px 10px;
}
#language-skills .skill{
margin: 10px 0;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}

View File

@ -81,10 +81,12 @@ var Langs = map[string]LangString{
}
var CommonFuncs = map[string]template.FuncMap{
"en": template.FuncMap{
"iconClass": iconClass,
"formatDateY": formatDateY,
"formatDateMY": formatDateMY,
"formatDateDMY": formatDateDMY,
"iconClass": iconClass,
"formatDateY": formatDateY,
"formatDateMY": formatDateMY,
"formatDateDMY": formatDateDMY,
"formatDateShortMY": formatDateShortMY,
"formatDateDShortMY": formatDateDShortMY,
},
}
@ -180,6 +182,20 @@ func formatDateDMY(date model.ResumeDate) string {
return fmt.Sprintf("%d %s %d", date.Day(), date.Month().String(), date.Year())
}
func formatDateShortMY(date model.ResumeDate) string {
if date.IsZero() {
return "Present"
}
return fmt.Sprintf("%s %d", date.Format("Jan"), date.Year())
}
func formatDateDShortMY(date model.ResumeDate) string {
if date.IsZero() {
return "Present"
}
return fmt.Sprintf("%d %s %d", date.Day(), date.Format("Jan"), date.Year())
}
func setupFrenchTranslation() {
Langs["fr"] = LangString{
TitlePrefix: "CV de",
@ -199,13 +215,45 @@ func setupFrenchTranslation() {
At: "à",
}
CommonFuncs["fr"] = template.FuncMap{
"iconClass": iconClass,
"formatDateY": formatDateYFR,
"formatDateMY": formatDateMYFR,
"formatDateDMY": formatDateDMYFR,
"iconClass": iconClass,
"formatDateY": formatDateYFR,
"formatDateMY": formatDateMYFR,
"formatDateDMY": formatDateDMYFR,
"formatDateShortMY": formatDateShortMYFR,
"formatDateDShortMY": formatDateDShortMYFR,
}
}
func getMonthFRShort(date model.ResumeDate) string {
switch date.Month() {
case time.January:
return "Janv."
case time.February:
return "Fév."
case time.March:
return "Mars"
case time.April:
return "Avril"
case time.May:
return "Mai"
case time.June:
return "Juin"
case time.July:
return "Juil."
case time.August:
return "Août"
case time.September:
return "Sept."
case time.October:
return "Oct."
case time.November:
return "Nov."
case time.December:
return "Déc."
}
return ""
}
func getMonthFR(date model.ResumeDate) string {
switch date.Month() {
case time.January:
@ -256,3 +304,17 @@ func formatDateDMYFR(date model.ResumeDate) string {
}
return fmt.Sprintf("%d %s %d", date.Day(), getMonthFR(date), date.Year())
}
func formatDateShortMYFR(date model.ResumeDate) string {
if date.IsZero() {
return "Présent"
}
return fmt.Sprintf("%s %d", getMonthFRShort(date), date.Year())
}
func formatDateDShortMYFR(date model.ResumeDate) string {
if date.IsZero() {
return "Présent"
}
return fmt.Sprintf("%d %s %d", date.Day(), getMonthFRShort(date), date.Year())
}