├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── mocha.conf.js ├── package-lock.json ├── package.json ├── resume.html ├── resume.pdf ├── src ├── cli.js ├── markdown-resume.js └── pdf.js ├── standard.html ├── standard.pdf ├── templates ├── common.css ├── default │ ├── assets │ │ └── less │ │ │ ├── _partials │ │ │ ├── _mixins.less │ │ │ ├── _normalize.less │ │ │ ├── _pdf.less │ │ │ └── _variables.less │ │ │ └── resume.less │ └── index.html ├── roboto │ ├── assets │ │ └── less │ │ │ ├── elements.less │ │ │ ├── normalize.css │ │ │ ├── pdf.less │ │ │ ├── resume.less │ │ │ └── screen.less │ └── index.html ├── standard │ ├── assets │ │ └── less │ │ │ ├── new.less │ │ │ └── resume.less │ ├── index.html │ └── pdf.json └── swissen │ ├── assets │ └── less │ │ ├── elements.less │ │ ├── normalize.css │ │ ├── pdf.less │ │ ├── resume.less │ │ └── screen.less │ └── index.html └── test ├── fixtures ├── empty.md ├── other.html ├── resume.md ├── standard.md └── with_image.md ├── md2resume.spec.js └── mocha.opts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | 5 | # Change these settings to your own preference 6 | indent_style = space 7 | indent_size = 2 8 | 9 | # We recommend you to keep these unchanged 10 | end_of_line = lf 11 | charset = utf-8 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | 15 | [*.md] 16 | insert_final_newline = false 17 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'airbnb-base', 3 | env: { 4 | node: true, 5 | mocha: true 6 | }, 7 | globals: { 8 | expect: false 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | # Test files 64 | ./*.html 65 | ./*,.pdf 66 | 67 | .tmp/ 68 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 9 4 | - 8 5 | - 6 6 | after_success: npm run coverage 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mkenney/npm 2 | 3 | WORKDIR /src 4 | COPY . /src 5 | 6 | # extracted from https://github.com/LoicMahieu/alpine-wkhtmltopdf/blob/master/Dockerfile 7 | RUN apk add --no-cache \ 8 | xvfb \ 9 | # Additionnal dependencies for better rendering 10 | ttf-freefont \ 11 | fontconfig \ 12 | dbus \ 13 | && \ 14 | 15 | # Install wkhtmltopdf from `testing` repository 16 | apk add qt5-qtbase-dev \ 17 | wkhtmltopdf \ 18 | --no-cache \ 19 | --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ \ 20 | --allow-untrusted \ 21 | && \ 22 | 23 | # Wrapper for xvfb 24 | mv /usr/bin/wkhtmltopdf /usr/bin/wkhtmltopdf-origin && \ 25 | echo $'#!/usr/bin/env sh\n\ 26 | Xvfb :0 -screen 0 1024x768x24 -ac +extension GLX +render -noreset & \n\ 27 | DISPLAY=:0.0 wkhtmltopdf-origin $@ \n\ 28 | killall Xvfb\ 29 | ' > /usr/bin/wkhtmltopdf && \ 30 | chmod +x /usr/bin/wkhtmltopdf 31 | 32 | RUN npm install -g markdown-resume && rm -rf /src/* 33 | 34 | ENTRYPOINT ["md2resume"] 35 | CMD -h 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Brian Hann 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | markdown-resume.js [![Build Status](https://travis-ci.org/c0bra/markdown-resume-js.svg?branch=master)](https://travis-ci.org/c0bra/markdown-resume-js) [![Coverage Status](https://coveralls.io/repos/c0bra/markdown-resume-js/badge.svg?branch=master&service=github)](https://coveralls.io/github/c0bra/markdown-resume-js?branch=master) 2 | ================== 3 | 4 | Turn a simple markdown document into a resume in HTML and PDF. 5 | 6 | ## Features 7 | 8 | * PDF generation via wkhtmltopdf 9 | * Responsive design for multiple device viewport sizes 10 | * Simple Markdown formatting 11 | 12 | ## Quickstart 13 | 14 | The generated files will be put in the same directory as your source file. 15 | 16 | # For usage on the command line 17 | npm install -g markdown-resume 18 | 19 | # Generate HTML file 20 | md2resume my-resume-file.md 21 | 22 | # Generate PDF file 23 | md2resume --pdf my-resume-file.md 24 | 25 | ## Running with docker 26 | 27 | # Build a docker image 28 | docker build -t md2resume . 29 | 30 | # In the directory where your resume is, run the container 31 | docker run -v $PWD:/src md2resume resume.md 32 | 33 | # You can also generate the pdf format 34 | docker run -v $PWD:/src md2resume -pdf resume.md 35 | 36 | ## Run in Watch Mode w/ Live Reload 37 | 38 | npm install -g light-server 39 | light-server -s . -w "your_resume.md # md2resume your_resume.md" 40 | 41 | Open http://localhost:4000/your_resume.html in a browser and see changes live. 42 | 43 | ## Use as a node module 44 | 45 | var md2resume = require('markdown-resume') 46 | 47 | # Generate HTML 48 | md2resume('my-resume-file.md', 'default') 49 | .then(html) 50 | # ... do something with html 51 | }); 52 | 53 | ## Acknowledgments 54 | 55 | As above, this library steals pretty much everything from [markdown-resume](https://github.com/there4/markdown-resume). 56 | -------------------------------------------------------------------------------- /mocha.conf.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai'); 2 | 3 | global.expect = chai.expect; 4 | 5 | global.sinon = require('sinon'); 6 | 7 | chai.use(require('sinon-chai')); 8 | chai.use(require('chai-things')); 9 | chai.use(require('chai-as-promised')); 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markdown-resume", 3 | "version": "2.1.4", 4 | "description": "Turn a simple markdown document into a resume in HTML and PDF", 5 | "keywords": [ 6 | "markdown", 7 | "html", 8 | "pdf", 9 | "resume", 10 | "cv", 11 | "node", 12 | "js" 13 | ], 14 | "repository": { 15 | "type": "git", 16 | "url": "git://github.com/c0bra/markdown-resume-js.git" 17 | }, 18 | "bugs": { 19 | "url": "https://github.com/c0bra/markdown-resume-js/issues" 20 | }, 21 | "main": "src/markdown-resume.js", 22 | "bin": { 23 | "md2resume": "src/cli.js" 24 | }, 25 | "files": [ 26 | "templates", 27 | "src" 28 | ], 29 | "scripts": { 30 | "dev": "mocha --watch", 31 | "lint": "eslint ./src/ --fix", 32 | "prepublish": "npm run test", 33 | "pretest": "rimraf coverage/", 34 | "test": "nyc --reporter=html --reporter=text mocha", 35 | "coverage": "nyc report --reporter=text-lcov | coveralls" 36 | }, 37 | "author": "Brian Hann", 38 | "license": "MIT", 39 | "dependencies": { 40 | "bluebird": "^3.3.4", 41 | "chalk": "^2.3.0", 42 | "cheerio": "^1.0.0-rc.2", 43 | "clean-css": "^4.1.9", 44 | "commander": "^2.9.0", 45 | "html-minifier": "^3.5.8", 46 | "html-pdf": "^2.0.1", 47 | "inliner": "^1.13.1", 48 | "less": "^2.6.1", 49 | "marked": "^0.3.12", 50 | "meow": "^4.0.0", 51 | "mustache": "^2.2.1", 52 | "nyc": "^11.4.1", 53 | "read-pkg": "^3.0.0" 54 | }, 55 | "devDependencies": { 56 | "chai": "^4.1.2", 57 | "chai-as-promised": "^7.1.1", 58 | "chai-things": "^0.2.0", 59 | "coveralls": "^3.0.0", 60 | "eslint": "^4.15.0", 61 | "eslint-config-airbnb-base": "^12.1.0", 62 | "eslint-plugin-import": "^2.8.0", 63 | "istanbul": "^0.4.2", 64 | "juice": "^4.2.2", 65 | "mocha": "^4.1.0", 66 | "rimraf": "^2.5.2", 67 | "sinon": "^4.1.4", 68 | "sinon-chai": "^2.8.0" 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /resume.html: -------------------------------------------------------------------------------- 1 | Brian Hann | Senior Web Developer, Data Nerd

Brian Hann

Senior Web Developer, Data Nerd

Download PDF
me@mysite.com
(999) 888-7777


Profile

Progressively evolve cross-platform ideas before impactful infomediaries. Energistically visualize tactical initiatives before cross-media catalysts for change.


Skills


Technical

  1. XHTML
  2. CSS
  3. Javascript
  4. Jquery
  5. PHP
  6. CVS / Subversion
  7. OS X
  8. Windows XP/Vista
  9. Linux

Experience

Microsoft : Principal and Creative Lead 2004-2005
Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials.

International Business Machines (IBM) : Lead Web Designer 2001-2004
Globally re-engineer cross-media schemas through viral methods of empowerment. Proactively grow long-term high-impact human capital and highly efficient innovation. Intrinsicly iterate excellent e-tailers with timely e-markets.

-------------------------------------------------------------------------------- /resume.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/c0bra/markdown-resume-js/d43da4946c45fe3d6898672fe8b61b2d5ccaa8a9/resume.pdf -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* eslint no-console: 0 */ 4 | 5 | /* 6 | * decaffeinate suggestions: 7 | * DS102: Remove unnecessary code created because of implicit returns 8 | * DS207: Consider shorter variations of null checks 9 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 10 | */ 11 | 12 | const fs = require('fs'); 13 | const path = require('path'); 14 | const chalk = require('chalk'); 15 | const meow = require('meow'); 16 | const generatePdf = require('./pdf'); 17 | const md2resume = require('./markdown-resume'); 18 | 19 | const cli = meow(` 20 | Usage 21 | $ md2resume resume.md 22 | 23 | Options 24 | --template, -t Template to use 25 | --list, -l List available templates 26 | --pdf, -p Generate PDF resume 27 | 28 | Examples 29 | $ md2resume resume.md 30 | $ md2resume path/to/your_resume.md 31 | $ md2resume -t blocks resume.md 32 | $ md2resume --pdf resume.md 33 | `, { 34 | flags: { 35 | template: { 36 | default: 'default', 37 | alias: 't', 38 | }, 39 | pdf: { type: 'boolean', alias: 'p' }, 40 | list: { type: 'boolean', alias: 'l' }, 41 | }, 42 | }); 43 | 44 | if (cli.flags.list) { 45 | console.log('Available templates:'); 46 | const templateDir = path.join(__dirname, '..', 'templates'); 47 | const templates = fs.readdirSync(templateDir) 48 | .filter(p => fs.lstatSync(path.join(templateDir, p)).isDirectory()) 49 | .join('\n '); 50 | console.log(` ${templates}`); 51 | process.exit(0); 52 | } 53 | 54 | const sourceFile = cli.input[0]; 55 | if ((sourceFile == null)) { 56 | console.warn('Error: No source file specified.'); 57 | console.log(cli.help); 58 | process.exit(); 59 | } 60 | 61 | md2resume(sourceFile, cli.flags.template) 62 | .then((htmlContents) => { 63 | const sourceFileBasename = path.basename(sourceFile, path.extname(sourceFile)); 64 | 65 | if (cli.flags.pdf) { 66 | const pdfOutputFileName = `${sourceFileBasename}.pdf`; 67 | return generatePdf(htmlContents).then((stream) => { 68 | stream.pipe(fs.createWriteStream(pdfOutputFileName)); 69 | console.log(`Successfully wrote pdf file: ${pdfOutputFileName}`); 70 | }); 71 | } 72 | 73 | const outputFileName = `${sourceFileBasename}.html`; 74 | return fs.writeFile(outputFileName, htmlContents, (error) => { 75 | if (error) { throw error; } 76 | return console.log(`Successfully wrote html: ${process.cwd()}/${outputFileName}`); 77 | }); 78 | }).catch((error) => { 79 | console.log(chalk.red(error.message)); 80 | return process.exit(1); 81 | }); 82 | -------------------------------------------------------------------------------- /src/markdown-resume.js: -------------------------------------------------------------------------------- 1 | /* eslint arrow-body-style: 0, arrow-parens: 0, no-shadow: 0 */ 2 | 3 | /* 4 | * decaffeinate suggestions: 5 | * DS102: Remove unnecessary code created because of implicit returns 6 | * DS207: Consider shorter variations of null checks 7 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 8 | */ 9 | 10 | 11 | const { promisify } = require('bluebird'); 12 | const CleanCSS = require('clean-css'); 13 | const cheerio = require('cheerio'); 14 | const Inliner = require('inliner'); 15 | const less = require('less'); 16 | const marked = promisify(require('marked')); 17 | const { minify } = require('html-minifier'); 18 | const mustache = require('mustache'); 19 | const path = require('path'); 20 | const readFile = promisify(require('fs').readFile); 21 | 22 | const installDir = path.join(__dirname, '..'); 23 | 24 | // Use Github-flavored-markdown (GFM) which uses linebreaks differently 25 | marked.setOptions({ breaks: true }); 26 | 27 | const isMarkdown = file => ['.md', '.markdown'].indexOf(path.extname(file)) >= 0; 28 | const getCommonStyles = () => readFile(path.join(installDir, 'templates', 'common.css'), 'utf-8'); 29 | const getTemplateHtml = template => readFile(path.join(installDir, 'templates', template, 'index.html'), 'utf-8'); 30 | 31 | function getTemplateStyles(template = 'default') { 32 | const lessDir = path.join(installDir, 'templates', template, 'assets', 'less'); 33 | const lessOptions = { 34 | relativeUrls: true, 35 | paths: [lessDir], 36 | filename: 'resume.less', 37 | }; 38 | return readFile(path.join(lessDir, 'resume.less'), 'utf-8') 39 | .then(lessInput => Promise.all([ 40 | less.render(lessInput, lessOptions), 41 | getCommonStyles(), 42 | ])) 43 | .spread((output, common) => new CleanCSS().minify(common + output.css).styles); 44 | } 45 | 46 | module.exports = (fileName, template = 'default') => { 47 | if (!isMarkdown(fileName)) return Promise.reject(new Error('Only markdown files are supported')); 48 | 49 | return readFile(path.resolve('./', fileName), 'utf-8') 50 | .then((sourceContents) => { 51 | if ((sourceContents == null) || (sourceContents.trim() === '')) { 52 | throw new Error('Source file is empty'); 53 | } 54 | 55 | return Promise.all([ 56 | marked(sourceContents, { 57 | gfm: true, 58 | sanitize: false, 59 | }), 60 | getTemplateStyles(template), 61 | getTemplateHtml(template), 62 | ]); 63 | }) 64 | .then(([resume, css, tmpl]) => { 65 | const $ = cheerio.load(resume); 66 | const title = `${$('h1').first().text()} | ${$('h2').first().text()}`; 67 | 68 | return minify(mustache.render(tmpl, { 69 | title, 70 | style: css, 71 | resume, 72 | })); 73 | }) 74 | .then((html) => new Promise((resolve, reject) => { 75 | const i = new Inliner(html, (err, inlined) => { /* eslint no-unused-vars: 0 */ 76 | if (err) return reject(err); 77 | 78 | return resolve(inlined); 79 | }); 80 | })); 81 | }; 82 | -------------------------------------------------------------------------------- /src/pdf.js: -------------------------------------------------------------------------------- 1 | const pdf = require('html-pdf'); 2 | 3 | module.exports = function generate(html) { 4 | const generated = pdf.create(html); 5 | 6 | return new Promise((resolve, reject) => { 7 | generated.toStream((err, stream) => { 8 | if (err) return reject(err); 9 | 10 | return resolve(stream); 11 | }); 12 | }); 13 | }; 14 | -------------------------------------------------------------------------------- /standard.html: -------------------------------------------------------------------------------- 1 | Brian Hann | Senior Developer

Brian Hann

me@mysite.com
(888) 555-7777

Senior Developer

Kansas City, MO

Progressively evolve cross-platform ideas before impactful infomediaries. Energistically visualize tactical initiatives before cross-media catalysts for change.

Experience

Corp, Inc
Principal and Creative Lead | 2004 - Current
Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items.

Assertively incentivize sticky platforms without synergistic materials.

Globocom LLC
Lead Web Designer | 2001 - 2004
Globally re-engineer cross-media schemas through viral methods of empowerment. Proactively grow long-term high-impact human capital and highly efficient innovation. Intrinsicly iterate excellent e-tailers with timely e-markets.

Education

UNIVERSITY OF SOMEWHERE
MBA - Global Domination | 1999 – 2001

UNIVERSITY OF SOMEWHERE
Bachelor of Science - Future Tech | 1995 – 1998

Skills

  1. XHTML
  2. CSS
  3. Javascript
  4. Jquery
  5. PHP
  6. CVS / Subversion
  7. OS X
  8. Windows XP/Vista
  9. Linux
-------------------------------------------------------------------------------- /standard.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/c0bra/markdown-resume-js/d43da4946c45fe3d6898672fe8b61b2d5ccaa8a9/standard.pdf -------------------------------------------------------------------------------- /templates/common.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | .no-print { display: none; } 3 | } 4 | -------------------------------------------------------------------------------- /templates/default/assets/less/_partials/_mixins.less: -------------------------------------------------------------------------------- 1 | /* ================================================ */ 2 | /* ! Mixins */ 3 | /* ================================================ */ 4 | 5 | // Transitions 6 | .transition(@transition) { 7 | -webkit-transition: @transition; 8 | -moz-transition: @transition; 9 | -ms-transition: @transition; 10 | -o-transition: @transition; 11 | transition: @transition; 12 | } 13 | 14 | // Global Transition 15 | .transition-all (@duration: 0.3s) { 16 | transition: ease-in-out all @duration; 17 | -moz-transition: ease-in-out all @duration; 18 | -webkit-transition: ease-in-out all @duration; 19 | } 20 | 21 | // Box Shadow 22 | .box-shadow (@boxshadow: 0 1px 3px rgba(0,0,0,0.5)) { 23 | box-shadow: @boxshadow; 24 | -o-box-shadow: @boxshadow; 25 | -moz-box-shadow: @boxshadow; 26 | -webkit-box-shadow: @boxshadow; 27 | } 28 | 29 | // Background clip to allow borders to blend properly with the background 30 | .background-clip { 31 | -moz-background-clip: padding; 32 | -webkit-background-clip:padding-box; 33 | background-clip: padding-box; 34 | } 35 | 36 | .border-box () { 37 | -webkit-box-sizing: border-box; 38 | -moz-box-sizing: border-box; 39 | box-sizing: border-box; 40 | } 41 | 42 | .border-radius(@borderradius: 3px) { 43 | border-radius: @borderradius; 44 | -moz-border-radius: @borderradius; 45 | -webkit-border-radius: @borderradius; 46 | } 47 | 48 | .text-overflow () { 49 | white-space: nowrap; 50 | overflow: hidden; 51 | -o-text-overflow: ellipsis; 52 | -ms-text-overflow: ellipsis; 53 | text-overflow: ellipsis; /* or "clip" */ 54 | } 55 | 56 | // Opacity 57 | .opacity(@alpha: 50) { 58 | opacity: @alpha/100; 59 | filter: e("Alpha(Opacity=")@alpha e(")"); 60 | -ms-filter: e("progid:DXImageTransform.Microsoft.Alpha(Opacity=")@alpha e(")"); 61 | } 62 | 63 | // Font Stacks 64 | #font { 65 | .shorthand(@weight: normal, @size: 14px, @lineHeight: 20px) { 66 | font-size: @size; 67 | font-weight: @weight; 68 | line-height: @lineHeight; 69 | } 70 | .sans-serif(@weight: normal, @size: 14px, @lineHeight: 20px) { 71 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 72 | font-size: @size; 73 | font-weight: @weight; 74 | line-height: @lineHeight; 75 | } 76 | .serif(@weight: normal, @size: 14px, @lineHeight: 20px) { 77 | font-family: "Georgia", Times New Roman, Times, serif; 78 | font-size: @size; 79 | font-weight: @weight; 80 | line-height: @lineHeight; 81 | } 82 | .monospace(@weight: normal, @size: 12px, @lineHeight: 20px) { 83 | font-family: "Monaco", Courier New, monospace; 84 | font-size: @size; 85 | font-weight: @weight; 86 | line-height: @lineHeight; 87 | } 88 | } 89 | .font-size(@sizeValue){ 90 | @remValue: @sizeValue; 91 | @pxValue: (@sizeValue * 10); 92 | font-size: ~"@{pxValue}px"; 93 | font-size: ~"@{remValue}rem"; 94 | } 95 | 96 | // Gradient Bar Colors for buttons and allerts 97 | .gradientBar(@primaryColor, @secondaryColor) { 98 | #gradient > .vertical(@primaryColor, @secondaryColor); 99 | text-shadow: 0 -1px 0 rgba(0,0,0,.25); 100 | border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%); 101 | border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); 102 | 103 | &:hover { 104 | border-color: darken(@secondaryColor, 10%) darken(@secondaryColor, 10%) darken(@secondaryColor, 20%); 105 | border-color: rgba(0,0,0,.2) rgba(0,0,0,.2) fadein(rgba(0,0,0,.2), 15%); 106 | } 107 | &:active { 108 | #gradient > .vertical(darken(@primaryColor, 20%), @secondaryColor); 109 | } 110 | } 111 | 112 | // Gradients 113 | #gradient { 114 | .horizontal (@startColor: #555, @endColor: #333) { 115 | background-color: @endColor; 116 | background-repeat: repeat-x; 117 | background-image: -khtml-gradient(linear, left top, right top, from(@startColor), to(@endColor)); // Konqueror 118 | background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+ 119 | background-image: -ms-linear-gradient(left, @startColor, @endColor); // IE10 120 | background-image: -webkit-gradient(linear, left top, right top, color-stop(0%, @startColor), color-stop(100%, @endColor)); // Safari 4+, Chrome 2+ 121 | background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+ 122 | background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10 123 | background-image: linear-gradient(left, @startColor, @endColor); // Le standard 124 | //filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",@startColor,@endColor)); // IE9 and down 125 | } 126 | .vertical (@startColor: #555, @endColor: #333) { 127 | background-color: @endColor; 128 | background-repeat: repeat-x; 129 | background-image: -khtml-gradient(linear, left top, left bottom, from(@startColor), to(@endColor)); // Konqueror 130 | background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+ 131 | background-image: -ms-linear-gradient(top, @startColor, @endColor); // IE10 132 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, @startColor), color-stop(100%, @endColor)); // Safari 4+, Chrome 2+ 133 | background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+ 134 | background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10 135 | background-image: linear-gradient(top, @startColor, @endColor); // The standard 136 | //filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down 137 | } 138 | .directional (@startColor: #555, @endColor: #333, @deg: 45deg) { 139 | background-color: @endColor; 140 | background-repeat: repeat-x; 141 | background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+ 142 | background-image: -ms-linear-gradient(@deg, @startColor, @endColor); // IE10 143 | background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+ 144 | background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10 145 | background-image: linear-gradient(@deg, @startColor, @endColor); // The standard 146 | } 147 | .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { 148 | background-color: @endColor; 149 | background-repeat: no-repeat; 150 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); 151 | background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor); 152 | background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor); 153 | background-image: -ms-linear-gradient(@startColor, @midColor @colorStop, @endColor); 154 | background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor); 155 | background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor); 156 | //filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down, gets no color-stop at all for proper fallback 157 | } 158 | } 159 | 160 | // Reset filters for IE 161 | .reset-filter() { 162 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 163 | } 164 | -------------------------------------------------------------------------------- /templates/default/assets/less/_partials/_normalize.less: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.0.0 | MIT License | git.io/normalize */ 2 | 3 | /* ============================================================================= 4 | HTML5 display definitions 5 | ========================================================================== */ 6 | 7 | article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } 8 | audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } 9 | audio:not([controls]) { display: none; } 10 | [hidden] { display: none; } 11 | 12 | 13 | /* ============================================================================= 14 | Base 15 | ========================================================================== */ 16 | 17 | /* 18 | * 1. Correct text resizing oddly in IE6/7 when body font-size is set using em units 19 | * 2. Force vertical scrollbar in non-IE 20 | * 3. Prevent iOS text size adjust on device orientation change, without disabling user zoom: h5bp.com/g 21 | */ 22 | 23 | html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } 24 | 25 | body { margin: 0; font-size: 1em; line-height: 1.4; } 26 | 27 | body, button, input, select, textarea { font-family: sans-serif; } 28 | 29 | /* 30 | * Remove text-shadow in selection highlight: h5bp.com/i 31 | * These selection declarations have to be separate 32 | * Also: hot pink! (or customize the background color to match your design) 33 | */ 34 | 35 | ::-moz-selection { background: @linkColor; color: #fff; text-shadow: none; } 36 | ::selection { background: @linkColor; color: #fff; text-shadow: none; } 37 | 38 | 39 | /* ============================================================================= 40 | Links 41 | ========================================================================== */ 42 | 43 | a { color: #00e; } 44 | a:visited { color: #551a8b; } 45 | a:hover { color: #06e; } 46 | a:focus { outline: thin dotted; } 47 | 48 | /* Improve readability when focused and hovered in all browsers: h5bp.com/h */ 49 | a:hover, a:active { outline: 0; } 50 | 51 | 52 | /* ============================================================================= 53 | Typography 54 | ========================================================================== */ 55 | 56 | abbr[title] { border-bottom: 1px dotted; } 57 | 58 | b, strong { font-weight: bold; } 59 | 60 | blockquote { margin: 1em 40px; } 61 | 62 | dfn { font-style: italic; } 63 | 64 | hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; } 65 | 66 | ins { background: #ff9; color: #000; text-decoration: none; } 67 | 68 | mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; } 69 | 70 | /* Redeclare monospace font family: en.wikipedia.org/wiki/User:Davidgothberg/Test59 */ 71 | pre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 1em; } 72 | 73 | /* Improve readability of pre-formatted text in all browsers */ 74 | pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } 75 | 76 | q { quotes: none; } 77 | q:before, q:after { content: ""; content: none; } 78 | 79 | small { font-size: 85%; } 80 | 81 | /* Position subscript and superscript content without affecting line-height: gist.github.com/413930 */ 82 | sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } 83 | sup { top: -0.5em; } 84 | sub { bottom: -0.25em; } 85 | 86 | 87 | /* ============================================================================= 88 | Lists 89 | ========================================================================== */ 90 | 91 | ul, ol { margin: 0 0 1em 0; padding: 0 0 0 40px; } 92 | dd { margin: 0 0 0 40px; } 93 | nav ul, nav ol { list-style: none; margin: 0; padding: 0; } 94 | 95 | 96 | /* ============================================================================= 97 | Embedded content 98 | ========================================================================== */ 99 | 100 | /* 101 | * Improve image quality when scaled in IE7 102 | * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ 103 | */ 104 | 105 | img { border: 0; -ms-interpolation-mode: bicubic; } 106 | 107 | /* 108 | * Correct overflow displayed oddly in IE9 109 | */ 110 | 111 | svg:not(:root) { overflow: hidden; } 112 | 113 | 114 | /* ============================================================================= 115 | Figures 116 | ========================================================================== */ 117 | 118 | figure { margin: 0; } 119 | 120 | 121 | /* ============================================================================= 122 | Forms 123 | ========================================================================== */ 124 | 125 | form { margin: 0; } 126 | fieldset { border: 0; margin: 0; padding: 0; } 127 | 128 | /* Indicate that 'label' will shift focus to the associated form element */ 129 | label { cursor: pointer; } 130 | 131 | /* 132 | * 1. Correct color not inheriting in IE6/7/8/9 133 | * 2. Correct alignment displayed oddly in IE6/7 134 | */ 135 | 136 | legend { border: 0; *margin-left: -7px; padding: 0; } 137 | 138 | /* 139 | * 1. Correct font-size not inheriting in all browsers 140 | * 2. Remove margins in FF3/4 S5 Chrome 141 | * 3. Define consistent vertical alignment display in all browsers 142 | */ 143 | 144 | button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; } 145 | 146 | /* 147 | * 1. Define line-height as normal to match FF3/4 (set using !important in the UA stylesheet) 148 | */ 149 | 150 | button, input { line-height: normal; } 151 | 152 | /* 153 | * 1. Display hand cursor for clickable form elements 154 | * 2. Allow styling of clickable form elements in iOS 155 | * 3. Correct inner spacing displayed oddly in IE7 (doesn't effect IE6) 156 | */ 157 | 158 | button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; } 159 | 160 | /* 161 | * Consistent box sizing and appearance 162 | */ 163 | 164 | input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } 165 | input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } 166 | input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } 167 | 168 | /* 169 | * Remove inner padding and border in FF3/4: h5bp.com/l 170 | */ 171 | 172 | button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } 173 | 174 | /* 175 | * 1. Remove default vertical scrollbar in IE6/7/8/9 176 | * 2. Allow only vertical resizing 177 | */ 178 | 179 | textarea { overflow: auto; vertical-align: top; resize: vertical; } 180 | 181 | /* Colors for form validity */ 182 | input:valid, textarea:valid { } 183 | input:invalid, textarea:invalid { background-color: #f0dddd; } 184 | 185 | 186 | /* ============================================================================= 187 | Tables 188 | ========================================================================== */ 189 | 190 | table { border-collapse: collapse; border-spacing: 0; } 191 | 192 | 193 | 194 | 195 | /* ============================================================================= 196 | Non-semantic helper classes 197 | Please define your styles before this section. 198 | ========================================================================== */ 199 | 200 | /* For image replacement */ 201 | .ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; *line-height: 0; } 202 | .ir br { display: none; } 203 | 204 | /* Hide from both screenreaders and browsers: h5bp.com/u */ 205 | .hidden { display: none !important; visibility: hidden; } 206 | 207 | /* Hide only visually, but have it available for screenreaders: h5bp.com/v */ 208 | .visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } 209 | 210 | /* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: h5bp.com/p */ 211 | .visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; } 212 | 213 | /* Hide visually and from screenreaders, but maintain layout */ 214 | .invisible { visibility: hidden; } 215 | 216 | /* Contain floats: h5bp.com/q */ 217 | .clearfix:before, .clearfix:after { content: ""; display: table; } 218 | .clearfix:after { clear: both; } 219 | .clearfix { *zoom: 1; } 220 | 221 | //Text modifiers 222 | 223 | //Included in style.less 224 | ///* Contain floats: nicolasgallagher.com/micro-clearfix-hack/ */ 225 | //.cf:before, .cf:after { content: ""; display: table; } 226 | //.cf:after { clear: both; } 227 | //.cf { zoom: 1; } 228 | -------------------------------------------------------------------------------- /templates/default/assets/less/_partials/_pdf.less: -------------------------------------------------------------------------------- 1 | body.pdf { 2 | color: black; 3 | 4 | a { 5 | text-decoration: none; 6 | color: black; 7 | } 8 | .container { 9 | width: 1000px; 10 | margin: 0 auto; 11 | padding: 0; 12 | background: none; 13 | border: none; 14 | border-width: 8px 0 2px 0; 15 | text-align: left; 16 | } 17 | 18 | .resume { 19 | position:relative; 20 | padding: 40px 80px; 21 | } 22 | 23 | a[href$='.pdf'] { 24 | display: none; 25 | } 26 | 27 | h1 { 28 | letter-spacing: 0; 29 | margin-top: 0; 30 | font-size: 48px; 31 | text-transform: uppercase; 32 | font-weight: normal; 33 | } 34 | h2 { 35 | letter-spacing: 0; 36 | text-transform: uppercase; 37 | font-style: italic; 38 | font-weight: normal; 39 | } 40 | h3 { 41 | float: left; 42 | width: 16%; 43 | font-style: normal; 44 | } 45 | 46 | h3~p { 47 | float: left; 48 | margin-left: 16%; 49 | } 50 | 51 | h3+p { 52 | margin-left: inherit; 53 | float: left; 54 | width: 84%; 55 | } 56 | 57 | blockquote { 58 | top: 40px; 59 | right: 50px; 60 | position: absolute; 61 | } 62 | 63 | ul li { 64 | width: 28%; 65 | float: left; 66 | } 67 | ul dl { 68 | margin: 0; 69 | padding: 0.3em 0 0; 70 | dt { 71 | font-size: 122%; 72 | font-weight: normal; 73 | margin: 0 0 .75em; 74 | } 75 | dd { 76 | padding: 0 4em 0 0; 77 | } 78 | } 79 | 80 | ol { 81 | float: left; 82 | width: 84%; 83 | margin: .7em 0 0; 84 | } 85 | 86 | ol li { 87 | width: 33%; 88 | margin: 0; 89 | } 90 | ol li:nth-child(3n) { 91 | width: 34%; 92 | } 93 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 94 | border-top: none; 95 | } 96 | 97 | dl { 98 | margin: .7em 0 0; 99 | dt { 100 | } 101 | dd { 102 | } 103 | strong { 104 | float: right; 105 | margin-top: -2em; 106 | } 107 | em { 108 | font-size: 130%; 109 | font-style: normal; 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /templates/default/assets/less/_partials/_variables.less: -------------------------------------------------------------------------------- 1 | // Accent Colors 2 | @blue: #049CDB; 3 | @blueDark: #0064CD; 4 | @green: #46a546; 5 | @red: #9d261d; 6 | @yellow: #ffc40d; 7 | @orange: #f89406; 8 | @pink: #c3325f; 9 | @purple: #7a43b6; 10 | 11 | // Color Scheme 12 | @baseColor: @blue; // Set a base color 13 | @complement: spin(@baseColor, 180); // Determine a complementary color 14 | @linkColor: @blue; 15 | @split1: spin(@baseColor, 158); // Split complements 16 | @split2: spin(@baseColor, -158); 17 | @triad1: spin(@baseColor, 135); // Triads colors 18 | @triad2: spin(@baseColor, -135); 19 | @tetra1: spin(@baseColor, 90); // Tetra colors 20 | @tetra2: spin(@baseColor, -90); 21 | @analog1: spin(@baseColor, 22); // Analogs colors 22 | @analog2: spin(@baseColor, -22); 23 | -------------------------------------------------------------------------------- /templates/default/assets/less/resume.less: -------------------------------------------------------------------------------- 1 | @import "_partials/_variables"; 2 | @import "_partials/_normalize"; 3 | @import "_partials/_mixins"; 4 | @import "_partials/_pdf"; 5 | 6 | /* clearfix */ 7 | .container:before, 8 | .container:after { 9 | content:""; 10 | display:table; 11 | } 12 | .container:after { 13 | clear:both; 14 | } 15 | /* For IE 6/7 (trigger hasLayout) */ 16 | .container { 17 | zoom:1; 18 | } 19 | 20 | body { 21 | font-family: 'Hoefler Text', Times New Roman, Times, serif; 22 | color: #444; 23 | } 24 | h1, h2, h3, h4, ul dl dt { 25 | font-family: Futura, "Century Gothic", AppleGothic, sans-serif; 26 | } 27 | 28 | .container { 29 | margin: 0 auto; 30 | padding: 0; 31 | background: whiteSmoke; 32 | border: solid #666; 33 | border-width: 8px 0 4px 0; 34 | text-align: left; 35 | } 36 | 37 | .resume { 38 | position:relative; 39 | padding: 10px 20px; 40 | } 41 | 42 | a { 43 | color: #990003; 44 | } 45 | 46 | a[href$='.pdf'] { 47 | display: inline-block; 48 | background: #666; 49 | color: white; 50 | padding: 6px 12px; 51 | margin-bottom: 6px; 52 | text-decoration: none; 53 | } 54 | 55 | blockquote { 56 | margin: 0; 57 | padding: 0; 58 | line-height: 1.4em; 59 | } 60 | 61 | hr:nth-of-type(1) { 62 | margin-top: 32px; 63 | } 64 | 65 | hr { 66 | display: block; 67 | position: relative; 68 | padding: 0; 69 | margin: 18px auto; 70 | width: 100%; 71 | clear: both; 72 | border: none; 73 | border-top: 1px solid #CCC; 74 | font-size: 1px; 75 | line-height: 0; 76 | overflow: visible; 77 | page-break-after: avoid; 78 | } 79 | 80 | h1 { 81 | margin: 0; 82 | padding: 0; 83 | font-size: 36px; 84 | letter-spacing: -1px; 85 | font-weight: normal; 86 | } 87 | h2 { 88 | margin: 0; 89 | padding: 0; 90 | font-size: 18px; 91 | font-style: italic; 92 | letter-spacing: -1px; 93 | font-weight: normal; 94 | } 95 | 96 | h3 { 97 | margin: 0; 98 | padding: 0 0 .5em; 99 | font-size: 150%; 100 | font-style: italic; 101 | font-weight: normal; 102 | } 103 | 104 | h3+p { 105 | margin: .6em 0 16px; 106 | padding: 0; 107 | display: block; 108 | font-size: 104%; 109 | line-height: 24px; 110 | } 111 | 112 | 113 | ul { 114 | margin: 0; 115 | padding: 0; 116 | list-style: none; 117 | } 118 | ul li { 119 | margin: 0; 120 | padding: 0; 121 | } 122 | 123 | ul li p { 124 | margin: 1em 0.5em; 125 | } 126 | 127 | ul dl { 128 | margin: .3em 0 0; 129 | padding: 0; 130 | width: 100%; 131 | dt { 132 | font-size: 100%; 133 | } 134 | dd { 135 | margin: 0 0 1em; 136 | padding: 0 2em 0 0; 137 | font-size: .8em; 138 | line-height: 1.5em; 139 | } 140 | } 141 | 142 | ol { 143 | margin: 0; 144 | padding: 0 0 .75em; 145 | width: 84%; 146 | display: inline-block; 147 | } 148 | 149 | ol li { 150 | margin: 0 0 0 1em; 151 | padding: 0; 152 | /*border-top: 1px solid #CCCCCC;*/ 153 | width: 100%; 154 | float: left; 155 | list-style: none; 156 | line-height: 24px; 157 | font-size: 14px; 158 | } 159 | ol li:nth-child(1) { 160 | border-top: none; 161 | } 162 | 163 | dl { 164 | display: inline-block; 165 | width: 75%; 166 | margin: 0; 167 | padding: 0; 168 | dt { 169 | margin: 0; 170 | padding: 0; 171 | font-size: 140%; 172 | } 173 | dd { 174 | margin: 0 0 1.5em; 175 | padding: 0; 176 | font-size: 80%; 177 | line-height: 1.4em; 178 | } 179 | strong { 180 | display: block; 181 | } 182 | em { 183 | display: block; 184 | font-size: 110%; 185 | margin: .15em 0 .5em; 186 | font-style: bold; 187 | } 188 | } 189 | 190 | #footer { 191 | display: none; 192 | } 193 | 194 | #footer + p { 195 | width: 100%; 196 | font-size: 11px; 197 | text-align: center; 198 | } 199 | -------------------------------------------------------------------------------- /templates/default/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#reload}} 6 | 7 | {{/reload}} 8 | 9 | {{title}} 10 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | {{{resume}}} 20 |
21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /templates/roboto/assets/less/elements.less: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------- 2 | LESS Elements 0.6 3 | --------------------------------------------------- 4 | A set of useful LESS mixins by Dmitry Fadeyev 5 | Special thanks for mixin suggestions to: 6 | Kris Van Herzeele, 7 | Benoit Adam, 8 | Portenart Emile-Victor, 9 | Ryan Faerman 10 | 11 | More info at: http://lesselements.com 12 | -----------------------------------------------------*/ 13 | 14 | .gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { 15 | background: @color; 16 | background: -webkit-gradient(linear, 17 | left bottom, 18 | left top, 19 | color-stop(0, @start), 20 | color-stop(1, @stop)); 21 | background: -ms-linear-gradient(bottom, 22 | @start, 23 | @stop); 24 | background: -moz-linear-gradient(center bottom, 25 | @start 0%, 26 | @stop 100%); 27 | } 28 | .bw-gradient(@color: #F5F5F5, @start: 0, @stop: 255) { 29 | background: @color; 30 | background: -webkit-gradient(linear, 31 | left bottom, 32 | left top, 33 | color-stop(0, rgb(@start,@start,@start)), 34 | color-stop(1, rgb(@stop,@stop,@stop))); 35 | background: -ms-linear-gradient(bottom, 36 | rgb(@start,@start,@start) 0%, 37 | rgb(@start,@start,@start) 100%); 38 | background: -moz-linear-gradient(center bottom, 39 | rgb(@start,@start,@start) 0%, 40 | rgb(@stop,@stop,@stop) 100%); 41 | } 42 | .bordered(@top-color: #EEE, @right-color: #EEE, @bottom-color: #EEE, @left-color: #EEE) { 43 | border-top: solid 1px @top-color; 44 | border-left: solid 1px @left-color; 45 | border-right: solid 1px @right-color; 46 | border-bottom: solid 1px @bottom-color; 47 | } 48 | .drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) { 49 | -webkit-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 50 | -moz-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 51 | box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 52 | } 53 | .rounded(@radius: 2px) { 54 | -webkit-border-radius: @radius; 55 | -moz-border-radius: @radius; 56 | border-radius: @radius; 57 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 58 | } 59 | .border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) { 60 | -webkit-border-top-right-radius: @topright; 61 | -webkit-border-bottom-right-radius: @bottomright; 62 | -webkit-border-bottom-left-radius: @bottomleft; 63 | -webkit-border-top-left-radius: @topleft; 64 | -moz-border-radius-topright: @topright; 65 | -moz-border-radius-bottomright: @bottomright; 66 | -moz-border-radius-bottomleft: @bottomleft; 67 | -moz-border-radius-topleft: @topleft; 68 | border-top-right-radius: @topright; 69 | border-bottom-right-radius: @bottomright; 70 | border-bottom-left-radius: @bottomleft; 71 | border-top-left-radius: @topleft; 72 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 73 | } 74 | .opacity(@opacity: 0.5) { 75 | -moz-opacity: @opacity; 76 | -khtml-opacity: @opacity; 77 | -webkit-opacity: @opacity; 78 | opacity: @opacity; 79 | } 80 | .transition-duration(@duration: 0.2s) { 81 | -moz-transition-duration: @duration; 82 | -webkit-transition-duration: @duration; 83 | transition-duration: @duration; 84 | } 85 | .rotation(@deg:5deg){ 86 | -webkit-transform: rotate(@deg); 87 | -moz-transform: rotate(@deg); 88 | transform: rotate(@deg); 89 | } 90 | .scale(@ratio:1.5){ 91 | -webkit-transform:scale(@ratio); 92 | -moz-transform:scale(@ratio); 93 | transform:scale(@ratio); 94 | } 95 | .transition(@duration:0.2s, @ease:ease-out) { 96 | -webkit-transition: all @duration @ease; 97 | -moz-transition: all @duration @ease; 98 | transition: all @duration @ease; 99 | } 100 | .inner-shadow(@horizontal:0, @vertical:1px, @blur:2px, @alpha: 0.4) { 101 | -webkit-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 102 | -moz-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 103 | box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 104 | } 105 | .box-shadow(@arguments) { 106 | -webkit-box-shadow: @arguments; 107 | -moz-box-shadow: @arguments; 108 | box-shadow: @arguments; 109 | } 110 | .columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) { 111 | -moz-column-width: @colwidth; 112 | -moz-column-count: @colcount; 113 | -moz-column-gap: @colgap; 114 | -moz-column-rule-color: @columnRuleColor; 115 | -moz-column-rule-style: @columnRuleStyle; 116 | -moz-column-rule-width: @columnRuleWidth; 117 | -webkit-column-width: @colwidth; 118 | -webkit-column-count: @colcount; 119 | -webkit-column-gap: @colgap; 120 | -webkit-column-rule-color: @columnRuleColor; 121 | -webkit-column-rule-style: @columnRuleStyle; 122 | -webkit-column-rule-width: @columnRuleWidth; 123 | column-width: @colwidth; 124 | column-count: @colcount; 125 | column-gap: @colgap; 126 | column-rule-color: @columnRuleColor; 127 | column-rule-style: @columnRuleStyle; 128 | column-rule-width: @columnRuleWidth; 129 | } 130 | .translate(@x:0, @y:0) { 131 | -moz-transform: translate(@x, @y); 132 | -webkit-transform: translate(@x, @y); 133 | -o-transform: translate(@x, @y); 134 | -ms-transform: translate(@x, @y); 135 | transform: translate(@x, @y); 136 | } -------------------------------------------------------------------------------- /templates/roboto/assets/less/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css 2012-02-07T12:37 UTC - http://github.com/necolas/normalize.css */ 2 | 3 | /* ============================================================================= 4 | HTML5 display definitions 5 | ========================================================================== */ 6 | 7 | /* 8 | * Corrects block display not defined in IE6/7/8/9 & FF3 9 | */ 10 | 11 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | hgroup, 19 | nav, 20 | section, 21 | summary { 22 | display: block; 23 | } 24 | 25 | /* 26 | * Corrects inline-block display not defined in IE6/7/8/9 & FF3 27 | */ 28 | 29 | audio, 30 | canvas, 31 | video { 32 | display: inline-block; 33 | *display: inline; 34 | *zoom: 1; 35 | } 36 | 37 | /* 38 | * Prevents modern browsers from displaying 'audio' without controls 39 | */ 40 | 41 | audio:not([controls]) { 42 | display: none; 43 | } 44 | 45 | /* 46 | * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 47 | * Known issue: no IE6 support 48 | */ 49 | 50 | [hidden] { 51 | display: none; 52 | } 53 | 54 | 55 | /* ============================================================================= 56 | Base 57 | ========================================================================== */ 58 | 59 | /* 60 | * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units 61 | * http://clagnut.com/blog/348/#c790 62 | * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom 63 | * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ 64 | */ 65 | 66 | html { 67 | font-size: 100%; /* 1 */ 68 | -webkit-text-size-adjust: 100%; /* 2 */ 69 | -ms-text-size-adjust: 100%; /* 2 */ 70 | } 71 | 72 | /* 73 | * Addresses font-family inconsistency between 'textarea' and other form elements. 74 | */ 75 | 76 | html, 77 | button, 78 | input, 79 | select, 80 | textarea { 81 | font-family: sans-serif; 82 | } 83 | 84 | /* 85 | * Addresses margins handled incorrectly in IE6/7 86 | */ 87 | 88 | body { 89 | margin: 0; 90 | } 91 | 92 | 93 | /* ============================================================================= 94 | Links 95 | ========================================================================== */ 96 | 97 | /* 98 | * Addresses outline displayed oddly in Chrome 99 | */ 100 | 101 | a:focus { 102 | outline: thin dotted; 103 | } 104 | 105 | /* 106 | * Improves readability when focused and also mouse hovered in all browsers 107 | * people.opera.com/patrickl/experiments/keyboard/test 108 | */ 109 | 110 | a:hover, 111 | a:active { 112 | outline: 0; 113 | } 114 | 115 | 116 | /* ============================================================================= 117 | Typography 118 | ========================================================================== */ 119 | 120 | /* 121 | * Addresses font sizes and margins set differently in IE6/7 122 | * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 123 | */ 124 | 125 | h1 { 126 | font-size: 2em; 127 | margin: 0.67em 0; 128 | } 129 | 130 | h2 { 131 | font-size: 1.5em; 132 | margin: 0.83em 0; 133 | } 134 | 135 | h3 { 136 | font-size: 1.17em; 137 | margin: 1em 0; 138 | } 139 | 140 | h4 { 141 | font-size: 1em; 142 | margin: 1.33em 0; 143 | } 144 | 145 | h5 { 146 | font-size: 0.83em; 147 | margin: 1.67em 0; 148 | } 149 | 150 | h6 { 151 | font-size: 0.75em; 152 | margin: 2.33em 0; 153 | } 154 | 155 | /* 156 | * Addresses styling not present in IE7/8/9, S5, Chrome 157 | */ 158 | 159 | abbr[title] { 160 | border-bottom: 1px dotted; 161 | } 162 | 163 | /* 164 | * Addresses style set to 'bolder' in FF3+, S4/5, Chrome 165 | */ 166 | 167 | b, 168 | strong { 169 | font-weight: bold; 170 | } 171 | 172 | blockquote { 173 | margin: 1em 40px; 174 | } 175 | 176 | /* 177 | * Addresses styling not present in S5, Chrome 178 | */ 179 | 180 | dfn { 181 | font-style: italic; 182 | } 183 | 184 | /* 185 | * Addresses styling not present in IE6/7/8/9 186 | */ 187 | 188 | mark { 189 | background: #ff0; 190 | color: #000; 191 | } 192 | 193 | /* 194 | * Addresses margins set differently in IE6/7 195 | */ 196 | 197 | p, 198 | pre { 199 | margin: 1em 0; 200 | } 201 | 202 | /* 203 | * Corrects font family set oddly in IE6, S4/5, Chrome 204 | * en.wikipedia.org/wiki/User:Davidgothberg/Test59 205 | */ 206 | 207 | pre, 208 | code, 209 | kbd, 210 | samp { 211 | font-family: monospace, serif; 212 | _font-family: 'courier new', monospace; 213 | font-size: 1em; 214 | } 215 | 216 | /* 217 | * Improves readability of pre-formatted text in all browsers 218 | */ 219 | 220 | pre { 221 | white-space: pre; 222 | white-space: pre-wrap; 223 | word-wrap: break-word; 224 | } 225 | 226 | /* 227 | * 1. Addresses CSS quotes not supported in IE6/7 228 | * 2. Addresses quote property not supported in S4 229 | */ 230 | 231 | /* 1 */ 232 | 233 | q { 234 | quotes: none; 235 | } 236 | 237 | /* 2 */ 238 | 239 | q:before, 240 | q:after { 241 | content: ''; 242 | content: none; 243 | } 244 | 245 | small { 246 | font-size: 75%; 247 | } 248 | 249 | /* 250 | * Prevents sub and sup affecting line-height in all browsers 251 | * gist.github.com/413930 252 | */ 253 | 254 | sub, 255 | sup { 256 | font-size: 75%; 257 | line-height: 0; 258 | position: relative; 259 | vertical-align: baseline; 260 | } 261 | 262 | sup { 263 | top: -0.5em; 264 | } 265 | 266 | sub { 267 | bottom: -0.25em; 268 | } 269 | 270 | 271 | /* ============================================================================= 272 | Lists 273 | ========================================================================== */ 274 | 275 | /* 276 | * Addresses margins set differently in IE6/7 277 | */ 278 | 279 | dl, 280 | menu, 281 | ol, 282 | ul { 283 | margin: 1em 0; 284 | } 285 | 286 | dd { 287 | margin: 0 0 0 40px; 288 | } 289 | 290 | /* 291 | * Addresses paddings set differently in IE6/7 292 | */ 293 | 294 | menu, 295 | ol, 296 | ul { 297 | padding: 0 0 0 40px; 298 | } 299 | 300 | /* 301 | * Corrects list images handled incorrectly in IE7 302 | */ 303 | 304 | nav ul, 305 | nav ol { 306 | list-style: none; 307 | list-style-image: none; 308 | } 309 | 310 | 311 | /* ============================================================================= 312 | Embedded content 313 | ========================================================================== */ 314 | 315 | /* 316 | * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 317 | * 2. Improves image quality when scaled in IE7 318 | * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ 319 | */ 320 | 321 | img { 322 | border: 0; /* 1 */ 323 | -ms-interpolation-mode: bicubic; /* 2 */ 324 | } 325 | 326 | /* 327 | * Corrects overflow displayed oddly in IE9 328 | */ 329 | 330 | svg:not(:root) { 331 | overflow: hidden; 332 | } 333 | 334 | 335 | /* ============================================================================= 336 | Figures 337 | ========================================================================== */ 338 | 339 | /* 340 | * Addresses margin not present in IE6/7/8/9, S5, O11 341 | */ 342 | 343 | figure { 344 | margin: 0; 345 | } 346 | 347 | 348 | /* ============================================================================= 349 | Forms 350 | ========================================================================== */ 351 | 352 | /* 353 | * Corrects margin displayed oddly in IE6/7 354 | */ 355 | 356 | form { 357 | margin: 0; 358 | } 359 | 360 | /* 361 | * Define consistent border, margin, and padding 362 | */ 363 | 364 | fieldset { 365 | border: 1px solid #c0c0c0; 366 | margin: 0 2px; 367 | padding: 0.35em 0.625em 0.75em; 368 | } 369 | 370 | /* 371 | * 1. Corrects color not being inherited in IE6/7/8/9 372 | * 2. Corrects text not wrapping in FF3 373 | * 3. Corrects alignment displayed oddly in IE6/7 374 | */ 375 | 376 | legend { 377 | border: 0; /* 1 */ 378 | padding: 0; 379 | white-space: normal; /* 2 */ 380 | *margin-left: -7px; /* 3 */ 381 | } 382 | 383 | /* 384 | * 1. Corrects font size not being inherited in all browsers 385 | * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome 386 | * 3. Improves appearance and consistency in all browsers 387 | */ 388 | 389 | button, 390 | input, 391 | select, 392 | textarea { 393 | font-size: 100%; /* 1 */ 394 | margin: 0; /* 2 */ 395 | vertical-align: baseline; /* 3 */ 396 | *vertical-align: middle; /* 3 */ 397 | } 398 | 399 | /* 400 | * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet 401 | */ 402 | 403 | button, 404 | input { 405 | line-height: normal; /* 1 */ 406 | } 407 | 408 | /* 409 | * 1. Improves usability and consistency of cursor style between image-type 'input' and others 410 | * 2. Corrects inability to style clickable 'input' types in iOS 411 | * 3. Removes inner spacing in IE7 without affecting normal text inputs 412 | * Known issue: inner spacing remains in IE6 413 | */ 414 | 415 | button, 416 | input[type="button"], 417 | input[type="reset"], 418 | input[type="submit"] { 419 | cursor: pointer; /* 1 */ 420 | -webkit-appearance: button; /* 2 */ 421 | *overflow: visible; /* 3 */ 422 | } 423 | 424 | /* 425 | * Re-set default cursor for disabled elements 426 | */ 427 | 428 | button[disabled], 429 | input[disabled] { 430 | cursor: default; 431 | } 432 | 433 | /* 434 | * 1. Addresses box sizing set to content-box in IE8/9 435 | * 2. Removes excess padding in IE8/9 436 | * 3. Removes excess padding in IE7 437 | Known issue: excess padding remains in IE6 438 | */ 439 | 440 | input[type="checkbox"], 441 | input[type="radio"] { 442 | box-sizing: border-box; /* 1 */ 443 | padding: 0; /* 2 */ 444 | *height: 13px; /* 3 */ 445 | *width: 13px; /* 3 */ 446 | } 447 | 448 | /* 449 | * 1. Addresses appearance set to searchfield in S5, Chrome 450 | * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) 451 | */ 452 | 453 | input[type="search"] { 454 | -webkit-appearance: textfield; /* 1 */ 455 | -moz-box-sizing: content-box; 456 | -webkit-box-sizing: content-box; /* 2 */ 457 | box-sizing: content-box; 458 | } 459 | 460 | /* 461 | * Removes inner padding and search cancel button in S5, Chrome on OS X 462 | */ 463 | 464 | input[type="search"]::-webkit-search-decoration, 465 | input[type="search"]::-webkit-search-cancel-button { 466 | -webkit-appearance: none; 467 | } 468 | 469 | /* 470 | * Removes inner padding and border in FF3+ 471 | * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ 472 | */ 473 | 474 | button::-moz-focus-inner, 475 | input::-moz-focus-inner { 476 | border: 0; 477 | padding: 0; 478 | } 479 | 480 | /* 481 | * 1. Removes default vertical scrollbar in IE6/7/8/9 482 | * 2. Improves readability and alignment in all browsers 483 | */ 484 | 485 | textarea { 486 | overflow: auto; /* 1 */ 487 | vertical-align: top; /* 2 */ 488 | } 489 | 490 | 491 | /* ============================================================================= 492 | Tables 493 | ========================================================================== */ 494 | 495 | /* 496 | * Remove most spacing between table cells 497 | */ 498 | 499 | table { 500 | border-collapse: collapse; 501 | border-spacing: 0; 502 | } -------------------------------------------------------------------------------- /templates/roboto/assets/less/pdf.less: -------------------------------------------------------------------------------- 1 | body.pdf { 2 | color: black; 3 | 4 | a { 5 | text-decoration: none; 6 | color: black; 7 | 8 | &[href$='.pdf'], 9 | &[href*='github'] { 10 | display: none; 11 | } 12 | } 13 | 14 | .container { 15 | width: 1080px; 16 | margin: 0 auto; 17 | padding: 0; 18 | background: none; 19 | border: 0; 20 | text-align: left; 21 | } 22 | 23 | .resume { 24 | position:relative; 25 | padding: 40px 80px; 26 | } 27 | 28 | h1 { 29 | letter-spacing: 0; 30 | margin-top: 0; 31 | text-transform: uppercase; 32 | font-weight: normal; 33 | } 34 | 35 | h2 { 36 | letter-spacing: 0; 37 | text-transform: uppercase; 38 | font-style: italic; 39 | font-weight: normal; 40 | } 41 | 42 | h3 { 43 | font-style: normal; 44 | 45 | + p { 46 | 47 | } 48 | } 49 | 50 | blockquote { 51 | top: 40px; 52 | right: 50px; 53 | position: absolute; 54 | } 55 | 56 | ul { 57 | } 58 | 59 | ul li { 60 | } 61 | 62 | // ul dl { 63 | // margin: 0; 64 | // padding: 0.3em 0 0; 65 | 66 | // dt { 67 | // font-size: 122%; 68 | // font-weight: normal; 69 | // margin: 0 0 .75em; 70 | // } 71 | 72 | // dd { 73 | // padding: 0 4em 0 0; 74 | // } 75 | // } 76 | 77 | // ol { 78 | // margin: .7em 0 0; 79 | // } 80 | 81 | // ol li { 82 | // margin: 0; 83 | // } 84 | 85 | // dl { 86 | // margin: .7em 0 0; 87 | // page-break-inside: avoid !important; 88 | // display: block; 89 | // // width:90%; 90 | 91 | // em { 92 | // font-size: 130%; 93 | // font-style: normal; 94 | // } 95 | // } 96 | } -------------------------------------------------------------------------------- /templates/roboto/assets/less/resume.less: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | zoom: 1; 3 | &:after { 4 | display: block; 5 | visibility: hidden; 6 | height: 0; 7 | clear: both; 8 | content: "."; 9 | } 10 | } 11 | 12 | body { 13 | /*font: 12px normal 'Hoefler Text', Times New Roman, Times, serif;*/ 14 | /*font-family: 'Roboto', sans-serif;*/ 15 | color: #444; 16 | } 17 | h1, h2, h3, h4, ul dl dt { 18 | /*font-family: Futura, "Century Gothic", AppleGothic, sans-serif;*/ 19 | } 20 | 21 | .container { 22 | margin: 0 auto; 23 | padding: 0; 24 | background: whiteSmoke; 25 | border: solid #666; 26 | border-width: 8px 0 2px 0; 27 | text-align: left; 28 | } 29 | 30 | .resume { 31 | position:relative; 32 | padding: 10px 20px; 33 | } 34 | 35 | a[href$='.pdf'] { 36 | background: #666; 37 | color: white; 38 | padding: 6px 12px; 39 | margin-bottom: 6px; 40 | text-decoration: none; 41 | position: absolute; 42 | top: 15px; 43 | right: 25px; 44 | } 45 | a[href*='github'] { 46 | background: #000; 47 | color: white; 48 | padding: 6px 12px; 49 | margin-bottom: 6px; 50 | text-decoration: none; 51 | position: absolute; 52 | top: 45px; 53 | right: 25px; 54 | 55 | &:hover { 56 | background: white; 57 | color: #000; 58 | } 59 | } 60 | 61 | /*p { 62 | font-size: 1em; 63 | }*/ 64 | 65 | blockquote { 66 | margin: 0; 67 | padding: 0; 68 | line-height: 1.4em; 69 | } 70 | 71 | blockquote a { 72 | color: #990003; 73 | display: block; 74 | } 75 | 76 | hr { 77 | display: block; 78 | position: relative; 79 | padding: 0; 80 | margin: 18px auto; 81 | width: 100%; 82 | clear: both; 83 | border: 0; 84 | border-top: 1px solid #CCC; 85 | font-size: 1px; 86 | line-height: 0; 87 | overflow: visible; 88 | page-break-after: avoid; 89 | } 90 | 91 | ul { 92 | margin: 0; 93 | padding: 0; 94 | } 95 | 96 | h1 { 97 | margin: 0; 98 | padding: 0; 99 | font-size: 3em; 100 | letter-spacing: -1px; 101 | font-weight: normal; 102 | } 103 | h2 { 104 | margin: 0; 105 | padding: 0; 106 | font-size: 2em; 107 | font-style: italic; 108 | letter-spacing: -1px; 109 | font-weight: normal; 110 | } 111 | 112 | h3 { 113 | border-bottom: 5px solid #000; 114 | margin: 0; 115 | padding: .25em 0 .25em .3em; 116 | font-size: 2em; 117 | font-style: italic; 118 | font-weight: normal; 119 | } 120 | 121 | h3+p, 122 | h3~ul { 123 | margin: .2em 0 1.2em; 124 | padding: 0; 125 | display: block; 126 | font-size: 1em; 127 | line-height: 1.5; 128 | } 129 | h3~ul { 130 | padding-left: 1.5em; 131 | } 132 | 133 | h4 { 134 | font-size: 1.5em; 135 | margin: 0; 136 | } 137 | 138 | ul li { 139 | margin: 0; 140 | padding: 0; 141 | /*font-size: 1.2em;*/ 142 | } 143 | 144 | ul, 145 | ol { 146 | li ul li { 147 | font-style: italic; 148 | margin: 0 0 0 1.5em; 149 | width: 80%; 150 | } 151 | } 152 | 153 | ul dl { 154 | margin: .3em 0 0; 155 | padding: 0; 156 | width: 100%; 157 | dt { 158 | /*font-size: 1em;*/ 159 | } 160 | dd { 161 | margin: 0 0 1em; 162 | padding: 0 2em 0 0; 163 | font-size: .8em; 164 | line-height: 1.5em; 165 | } 166 | } 167 | 168 | ol { 169 | margin: 0; 170 | margin-left: 1em; 171 | padding: 0 0 .75em; 172 | width: 84%; 173 | display: inline-block; 174 | } 175 | 176 | ol li { 177 | margin: 0 0 0 .5em; 178 | padding: 0; 179 | border-top: 1px solid #CCCCCC; 180 | width: 100%; 181 | /*float: left;*/ 182 | /*list-style: none;*/ 183 | line-height: 1.5em; 184 | font-size: 1em; 185 | } 186 | ol li:nth-child(1) { 187 | border-top: 0; 188 | } 189 | 190 | dl { 191 | display: inline-block; 192 | width: 95%; 193 | margin: 0; 194 | padding: 0; 195 | dt { 196 | margin: 0; 197 | padding: 0; 198 | /*font-size: 1.4em;*/ 199 | } 200 | dd { 201 | padding: 0; 202 | font-size: 0.8em; 203 | } 204 | strong { 205 | display: block; 206 | font-size: 1.2em; 207 | } 208 | em { 209 | display: block; 210 | font-size: 1.2em; 211 | margin: .15em 0 .5em; 212 | } 213 | } 214 | 215 | #experience { 216 | ~ dl { 217 | dt { 218 | float: left; 219 | margin-top: 1em; 220 | } 221 | dd { 222 | float: right; 223 | text-align: right; 224 | width: 45%; 225 | } 226 | } 227 | 228 | ~ p { 229 | width: 85%; 230 | } 231 | 232 | ~ ul { 233 | width: 85%; 234 | } 235 | 236 | ~ ol li { 237 | border: 0; 238 | font-size: 1em; 239 | } 240 | } 241 | 242 | #footer { 243 | display: none; 244 | 245 | + p { 246 | width: 100%; 247 | font-size: 0.8em; 248 | text-align: center; 249 | } 250 | } -------------------------------------------------------------------------------- /templates/roboto/assets/less/screen.less: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | Mobile layout 5 | 240–479 px 6 | Zoomed out below 320 px 7 | */ 8 | 9 | @media screen and (min-width: 15em) { 10 | } 11 | 12 | 13 | /* 14 | Wide mobile layout 15 | 480-767 px 16 | Zoomed in above 480 px 17 | */ 18 | 19 | @media screen and (min-width: 30em) { 20 | } 21 | 22 | 23 | /* 24 | Tablet layout 25 | 600-911 px 26 | Zoomed in above 600 px 27 | */ 28 | 29 | @media screen and (min-width: 37.5em) { 30 | body { 31 | padding: 2em 0; 32 | } 33 | blockquote { 34 | top: 10px; 35 | right: 50px; 36 | position: absolute; 37 | } 38 | h1 { /* Open up the top section height so we don't collapse on the blockquote */ 39 | margin-top: .5em; 40 | } 41 | ol { 42 | margin: 0 0 0 1em; 43 | } 44 | ol li { 45 | width: 50%; 46 | margin: 0; 47 | } 48 | ol li:nth-child(1), ol li:nth-child(2) { 49 | border-top: none; 50 | } 51 | } 52 | 53 | 54 | /* 55 | Widescreen layout 56 | 912-1887 px 57 | Zoomed in above 912 px 58 | */ 59 | 60 | /*@media screen and (min-width: 57em) { 61 | .container { 62 | width: 912px; 63 | } 64 | .resume { 65 | position:relative; 66 | padding: 40px 50px; 67 | } 68 | blockquote { 69 | top: 40px; 70 | right: 50px; 71 | position: absolute; 72 | } 73 | h1 { 74 | margin-top: 0; 75 | font-size: 48px; 76 | text-transform: uppercase; 77 | letter-spacing: 3px; 78 | font-weight: normal; 79 | } 80 | h2 { 81 | text-transform: uppercase; 82 | font-style: italic; 83 | letter-spacing: 2px; 84 | font-weight: normal; 85 | } 86 | 87 | h3 { 88 | float: left; 89 | width: 16%; 90 | } 91 | 92 | h3+p { 93 | float: left; 94 | width: 84%; 95 | } 96 | 97 | ul li { 98 | width: 28%; 99 | float: left; 100 | } 101 | ul dl { 102 | dt { 103 | font-size: 122%; 104 | font-weight: normal; 105 | margin-bottom: .75em; 106 | } 107 | dd { 108 | padding: 0 4em 0 0; 109 | } 110 | } 111 | 112 | ol { 113 | float: left; 114 | width: 84%; 115 | margin: .6em 0 0; 116 | } 117 | 118 | ol li { 119 | width: 33%; 120 | margin: 0; 121 | } 122 | ol li:nth-child(3n) { 123 | width: 34%; 124 | } 125 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 126 | border-top: none; 127 | } 128 | 129 | dl { 130 | margin: .5em 0 0; 131 | dt { 132 | } 133 | dd { 134 | } 135 | strong { 136 | float: right; 137 | margin-top: -2em; 138 | } 139 | em { 140 | font-size: 130%; 141 | font-style: normal; 142 | } 143 | 144 | } 145 | 146 | 147 | }*/ 148 | 149 | 150 | /* 151 | Huge-screen layout 152 | 1888-2520 px 153 | Zoomed in above 1920 px 154 | */ 155 | 156 | @media screen and (min-width: 118em) { 157 | 158 | 159 | } -------------------------------------------------------------------------------- /templates/roboto/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#reload}} 6 | 7 | {{/reload}} 8 | 9 | {{title}} 10 | 13 | 14 | 15 | 16 | 17 |
18 |
{{{header}}}
19 |
20 | {{{resume}}} 21 |
22 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /templates/standard/assets/less/new.less: -------------------------------------------------------------------------------- 1 | .standard-resume { 2 | position: relative; 3 | width: 580px; 4 | margin: 0 auto; 5 | display: block; 6 | font-size: 14px; 7 | font-weight: 300; 8 | 9 | blockquote { 10 | right: 50px; 11 | top: -18px; 12 | position: absolute; 13 | padding: 0; 14 | margin: 0; 15 | max-width: 200px; 16 | white-space: nowrap; 17 | } 18 | 19 | h2, h3 { 20 | font-weight: bold; 21 | } 22 | 23 | h2 { 24 | color: #323336; 25 | margin: 25px 0; 26 | text-transform: none; 27 | font-size: 20px; 28 | } 29 | 30 | h3 { 31 | margin: 20px 0; 32 | color: darken(#c9cccf, 60%); 33 | text-transform: uppercase; 34 | font-size: 16px; 35 | } 36 | 37 | 38 | h4 { 39 | color: darken(#c9cccf, 50%); 40 | font-size: 14px; 41 | & > a { 42 | color: inherit; 43 | } 44 | } 45 | 46 | p { 47 | color: #96999b; 48 | } 49 | 50 | hr { 51 | display: none; 52 | } 53 | 54 | ol, ul { 55 | padding: 0; 56 | margin: 0; 57 | list-style: none; 58 | zoom: 1; 59 | font-size: 0; 60 | 61 | &:after { 62 | content: ""; 63 | display: block; 64 | clear: both; 65 | } 66 | 67 | li { 68 | display: inline-block; 69 | padding: 5px 18px; 70 | background-color: #f1f5f7; 71 | margin-right: 3px; 72 | margin-bottom: 5px; 73 | font-size: 14px; 74 | } 75 | } 76 | 77 | p + p { 78 | margin-top: 10px !important; 79 | } 80 | 81 | h3 ~ p { 82 | color: #323336; 83 | line-height: 1.66em; 84 | margin-top: 15px; 85 | 86 | strong { 87 | text-transform: uppercase; 88 | font-size: 18px; 89 | font-weight: 600; 90 | padding-bottom: 12px; 91 | } 92 | 93 | em { 94 | color: #96999b; 95 | font-style: normal; 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /templates/standard/assets/less/resume.less: -------------------------------------------------------------------------------- 1 | @import "new"; 2 | 3 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 4 | 5 | @linkcolor: black; 6 | 7 | html { 8 | font-family: sans-serif; 9 | -ms-text-size-adjust: 100%; 10 | -webkit-text-size-adjust: 100% 11 | } 12 | 13 | body { 14 | margin: 0 15 | } 16 | 17 | article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { 18 | display: block 19 | } 20 | 21 | audio, canvas, progress, video { 22 | display: inline-block; 23 | vertical-align: baseline 24 | } 25 | 26 | audio:not([controls]) { 27 | display: none; 28 | height: 0 29 | } 30 | 31 | [hidden], template { 32 | display: none 33 | } 34 | 35 | a { 36 | background-color: transparent 37 | } 38 | 39 | a:active, a:hover { 40 | outline: 0 41 | } 42 | 43 | abbr[title] { 44 | border-bottom: 1px dotted 45 | } 46 | 47 | b, strong { 48 | font-weight: 700 49 | } 50 | 51 | dfn { 52 | font-style: italic 53 | } 54 | 55 | h1 { 56 | font-size: 2em; 57 | margin: .67em 0 58 | } 59 | 60 | mark { 61 | background: #ff0; 62 | color: #000 63 | } 64 | 65 | small { 66 | font-size: 80% 67 | } 68 | 69 | sub, sup { 70 | font-size: 75%; 71 | line-height: 0; 72 | position: relative; 73 | vertical-align: baseline 74 | } 75 | 76 | sup { 77 | top: -.5em 78 | } 79 | 80 | sub { 81 | bottom: -.25em 82 | } 83 | 84 | img { 85 | border: 0 86 | } 87 | 88 | svg:not(:root) { 89 | overflow: hidden 90 | } 91 | 92 | figure { 93 | margin: 1em 40px 94 | } 95 | 96 | hr { 97 | box-sizing: content-box; 98 | height: 0 99 | } 100 | 101 | pre { 102 | overflow: auto 103 | } 104 | 105 | code, kbd, pre, samp { 106 | font-family: monospace, monospace; 107 | font-size: 1em 108 | } 109 | 110 | button, input, optgroup, select, textarea { 111 | color: inherit; 112 | font: inherit; 113 | margin: 0 114 | } 115 | 116 | button { 117 | overflow: visible 118 | } 119 | 120 | button, select { 121 | text-transform: none 122 | } 123 | 124 | button, html input[type=button], input[type=reset], input[type=submit] { 125 | -webkit-appearance: button; 126 | cursor: pointer 127 | } 128 | 129 | button[disabled], html input[disabled] { 130 | cursor: default 131 | } 132 | 133 | button::-moz-focus-inner, input::-moz-focus-inner { 134 | border: 0; 135 | padding: 0 136 | } 137 | 138 | input { 139 | line-height: normal 140 | } 141 | 142 | input[type=checkbox], input[type=radio] { 143 | box-sizing: border-box; 144 | padding: 0 145 | } 146 | 147 | input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { 148 | height: auto 149 | } 150 | 151 | input[type=search] { 152 | -webkit-appearance: textfield; 153 | box-sizing: content-box 154 | } 155 | 156 | input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { 157 | -webkit-appearance: none 158 | } 159 | 160 | fieldset { 161 | border: 1px solid silver; 162 | margin: 0 2px; 163 | padding: .35em .625em .75em 164 | } 165 | 166 | legend { 167 | border: 0; 168 | padding: 0 169 | } 170 | 171 | textarea { 172 | overflow: auto 173 | } 174 | 175 | optgroup { 176 | font-weight: 700 177 | } 178 | 179 | table { 180 | border-collapse: collapse; 181 | border-spacing: 0 182 | } 183 | 184 | td, th { 185 | padding: 0 186 | } 187 | 188 | html { 189 | box-sizing: border-box; 190 | overflow-y: scroll 191 | } 192 | 193 | *, :after, :before { 194 | box-sizing: inherit 195 | } 196 | 197 | body { 198 | font-family: sans-serif; 199 | font-weight: 300; 200 | color: #323336; 201 | font-size: 16px; 202 | line-height: 1.5 203 | } 204 | 205 | body, html { 206 | height: 100% 207 | } 208 | 209 | h1, h2, h3 { 210 | font-weight: 600; 211 | line-height: 1; 212 | margin: 0 213 | } 214 | 215 | h1 { 216 | font-size: 30px; 217 | letter-spacing: 1.3px 218 | } 219 | 220 | h1, h2 { 221 | text-transform: uppercase 222 | } 223 | 224 | h2 { 225 | font-size: 12px 226 | } 227 | 228 | h2, h3 { 229 | letter-spacing: 1.2px 230 | } 231 | 232 | h3 { 233 | font-size: 24px; 234 | font-weight: 300 235 | } 236 | 237 | p.small, span.small { 238 | font-size: 12px 239 | } 240 | 241 | ul { 242 | list-style: disc 243 | } 244 | 245 | ul.basic { 246 | margin: 0; 247 | padding: 0; 248 | list-style: none 249 | } 250 | 251 | a { 252 | color: @linkcolor; 253 | text-decoration: none 254 | } 255 | 256 | input, textarea { 257 | -webkit-appearance: none; 258 | border-radius: 0 259 | } 260 | 261 | input[type=checkbox] { 262 | -webkit-appearance: checkbox 263 | } 264 | 265 | .standard-resume { 266 | margin-top: 20px; 267 | margin-bottom: 160px 268 | } 269 | 270 | @media (min-width:900px) { 271 | .standard-resume { 272 | margin-top: 50px 273 | } 274 | } 275 | -------------------------------------------------------------------------------- /templates/standard/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#reload}} 6 | 7 | {{/reload}} 8 | 9 | {{ title }} 10 | 39 | 42 | 43 | 44 | 45 |
46 |
47 | {{{resume}}} 48 |
49 |
50 | 51 | 52 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /templates/standard/pdf.json: -------------------------------------------------------------------------------- 1 | { 2 | "border": "0.5in" 3 | } 4 | -------------------------------------------------------------------------------- /templates/swissen/assets/less/elements.less: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------- 2 | LESS Elements 0.6 3 | --------------------------------------------------- 4 | A set of useful LESS mixins by Dmitry Fadeyev 5 | Special thanks for mixin suggestions to: 6 | Kris Van Herzeele, 7 | Benoit Adam, 8 | Portenart Emile-Victor, 9 | Ryan Faerman 10 | More info at: http://lesselements.com 11 | -----------------------------------------------------*/ 12 | 13 | .gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { 14 | background: @color; 15 | background: -webkit-gradient(linear, 16 | left bottom, 17 | left top, 18 | color-stop(0, @start), 19 | color-stop(1, @stop)); 20 | background: -ms-linear-gradient(bottom, 21 | @start, 22 | @stop); 23 | background: -moz-linear-gradient(center bottom, 24 | @start 0%, 25 | @stop 100%); 26 | } 27 | .bw-gradient(@color: #F5F5F5, @start: 0, @stop: 255) { 28 | background: @color; 29 | background: -webkit-gradient(linear, 30 | left bottom, 31 | left top, 32 | color-stop(0, rgb(@start,@start,@start)), 33 | color-stop(1, rgb(@stop,@stop,@stop))); 34 | background: -ms-linear-gradient(bottom, 35 | rgb(@start,@start,@start) 0%, 36 | rgb(@start,@start,@start) 100%); 37 | background: -moz-linear-gradient(center bottom, 38 | rgb(@start,@start,@start) 0%, 39 | rgb(@stop,@stop,@stop) 100%); 40 | } 41 | .bordered(@top-color: #EEE, @right-color: #EEE, @bottom-color: #EEE, @left-color: #EEE) { 42 | border-top: solid 1px @top-color; 43 | border-left: solid 1px @left-color; 44 | border-right: solid 1px @right-color; 45 | border-bottom: solid 1px @bottom-color; 46 | } 47 | .drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) { 48 | -webkit-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 49 | -moz-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 50 | box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 51 | } 52 | .rounded(@radius: 2px) { 53 | -webkit-border-radius: @radius; 54 | -moz-border-radius: @radius; 55 | border-radius: @radius; 56 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 57 | } 58 | .border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) { 59 | -webkit-border-top-right-radius: @topright; 60 | -webkit-border-bottom-right-radius: @bottomright; 61 | -webkit-border-bottom-left-radius: @bottomleft; 62 | -webkit-border-top-left-radius: @topleft; 63 | -moz-border-radius-topright: @topright; 64 | -moz-border-radius-bottomright: @bottomright; 65 | -moz-border-radius-bottomleft: @bottomleft; 66 | -moz-border-radius-topleft: @topleft; 67 | border-top-right-radius: @topright; 68 | border-bottom-right-radius: @bottomright; 69 | border-bottom-left-radius: @bottomleft; 70 | border-top-left-radius: @topleft; 71 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 72 | } 73 | .opacity(@opacity: 0.5) { 74 | -moz-opacity: @opacity; 75 | -khtml-opacity: @opacity; 76 | -webkit-opacity: @opacity; 77 | opacity: @opacity; 78 | } 79 | .transition-duration(@duration: 0.2s) { 80 | -moz-transition-duration: @duration; 81 | -webkit-transition-duration: @duration; 82 | transition-duration: @duration; 83 | } 84 | .rotation(@deg:5deg){ 85 | -webkit-transform: rotate(@deg); 86 | -moz-transform: rotate(@deg); 87 | transform: rotate(@deg); 88 | } 89 | .scale(@ratio:1.5){ 90 | -webkit-transform:scale(@ratio); 91 | -moz-transform:scale(@ratio); 92 | transform:scale(@ratio); 93 | } 94 | .transition(@duration:0.2s, @ease:ease-out) { 95 | -webkit-transition: all @duration @ease; 96 | -moz-transition: all @duration @ease; 97 | transition: all @duration @ease; 98 | } 99 | .inner-shadow(@horizontal:0, @vertical:1px, @blur:2px, @alpha: 0.4) { 100 | -webkit-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 101 | -moz-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 102 | box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 103 | } 104 | .box-shadow(@arguments) { 105 | -webkit-box-shadow: @arguments; 106 | -moz-box-shadow: @arguments; 107 | box-shadow: @arguments; 108 | } 109 | .columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) { 110 | -moz-column-width: @colwidth; 111 | -moz-column-count: @colcount; 112 | -moz-column-gap: @colgap; 113 | -moz-column-rule-color: @columnRuleColor; 114 | -moz-column-rule-style: @columnRuleStyle; 115 | -moz-column-rule-width: @columnRuleWidth; 116 | -webkit-column-width: @colwidth; 117 | -webkit-column-count: @colcount; 118 | -webkit-column-gap: @colgap; 119 | -webkit-column-rule-color: @columnRuleColor; 120 | -webkit-column-rule-style: @columnRuleStyle; 121 | -webkit-column-rule-width: @columnRuleWidth; 122 | column-width: @colwidth; 123 | column-count: @colcount; 124 | column-gap: @colgap; 125 | column-rule-color: @columnRuleColor; 126 | column-rule-style: @columnRuleStyle; 127 | column-rule-width: @columnRuleWidth; 128 | } 129 | .translate(@x:0, @y:0) { 130 | -moz-transform: translate(@x, @y); 131 | -webkit-transform: translate(@x, @y); 132 | -o-transform: translate(@x, @y); 133 | -ms-transform: translate(@x, @y); 134 | transform: translate(@x, @y); 135 | } -------------------------------------------------------------------------------- /templates/swissen/assets/less/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css 2012-02-07T12:37 UTC - http://github.com/necolas/normalize.css */ 2 | 3 | /* ============================================================================= 4 | HTML5 display definitions 5 | ========================================================================== */ 6 | 7 | /* 8 | * Corrects block display not defined in IE6/7/8/9 & FF3 9 | */ 10 | 11 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | hgroup, 19 | nav, 20 | section, 21 | summary { 22 | display: block; 23 | } 24 | 25 | /* 26 | * Corrects inline-block display not defined in IE6/7/8/9 & FF3 27 | */ 28 | 29 | audio, 30 | canvas, 31 | video { 32 | display: inline-block; 33 | *display: inline; 34 | *zoom: 1; 35 | } 36 | 37 | /* 38 | * Prevents modern browsers from displaying 'audio' without controls 39 | */ 40 | 41 | audio:not([controls]) { 42 | display: none; 43 | } 44 | 45 | /* 46 | * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 47 | * Known issue: no IE6 support 48 | */ 49 | 50 | [hidden] { 51 | display: none; 52 | } 53 | 54 | 55 | /* ============================================================================= 56 | Base 57 | ========================================================================== */ 58 | 59 | /* 60 | * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units 61 | * http://clagnut.com/blog/348/#c790 62 | * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom 63 | * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ 64 | */ 65 | 66 | html { 67 | font-size: 100%; /* 1 */ 68 | -webkit-text-size-adjust: 100%; /* 2 */ 69 | -ms-text-size-adjust: 100%; /* 2 */ 70 | } 71 | 72 | /* 73 | * Addresses font-family inconsistency between 'textarea' and other form elements. 74 | */ 75 | 76 | html, 77 | button, 78 | input, 79 | select, 80 | textarea { 81 | font-family: sans-serif; 82 | } 83 | 84 | /* 85 | * Addresses margins handled incorrectly in IE6/7 86 | */ 87 | 88 | body { 89 | margin: 0; 90 | } 91 | 92 | 93 | /* ============================================================================= 94 | Links 95 | ========================================================================== */ 96 | 97 | /* 98 | * Addresses outline displayed oddly in Chrome 99 | */ 100 | 101 | a:focus { 102 | outline: thin dotted; 103 | } 104 | 105 | /* 106 | * Improves readability when focused and also mouse hovered in all browsers 107 | * people.opera.com/patrickl/experiments/keyboard/test 108 | */ 109 | 110 | a:hover, 111 | a:active { 112 | outline: 0; 113 | } 114 | 115 | 116 | /* ============================================================================= 117 | Typography 118 | ========================================================================== */ 119 | 120 | /* 121 | * Addresses font sizes and margins set differently in IE6/7 122 | * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 123 | */ 124 | 125 | h1 { 126 | font-size: 2em; 127 | margin: 0.67em 0; 128 | } 129 | 130 | h2 { 131 | font-size: 1.5em; 132 | margin: 0.83em 0; 133 | } 134 | 135 | h3 { 136 | font-size: 1.17em; 137 | margin: 1em 0; 138 | } 139 | 140 | h4 { 141 | font-size: 1em; 142 | margin: 1.33em 0; 143 | } 144 | 145 | h5 { 146 | font-size: 0.83em; 147 | margin: 1.67em 0; 148 | } 149 | 150 | h6 { 151 | font-size: 0.75em; 152 | margin: 2.33em 0; 153 | } 154 | 155 | /* 156 | * Addresses styling not present in IE7/8/9, S5, Chrome 157 | */ 158 | 159 | abbr[title] { 160 | border-bottom: 1px dotted; 161 | } 162 | 163 | /* 164 | * Addresses style set to 'bolder' in FF3+, S4/5, Chrome 165 | */ 166 | 167 | b, 168 | strong { 169 | font-weight: bold; 170 | } 171 | 172 | blockquote { 173 | margin: 1em 40px; 174 | } 175 | 176 | /* 177 | * Addresses styling not present in S5, Chrome 178 | */ 179 | 180 | dfn { 181 | font-style: italic; 182 | } 183 | 184 | /* 185 | * Addresses styling not present in IE6/7/8/9 186 | */ 187 | 188 | mark { 189 | background: #ff0; 190 | color: #000; 191 | } 192 | 193 | /* 194 | * Addresses margins set differently in IE6/7 195 | */ 196 | 197 | p, 198 | pre { 199 | margin: 1em 0; 200 | } 201 | 202 | /* 203 | * Corrects font family set oddly in IE6, S4/5, Chrome 204 | * en.wikipedia.org/wiki/User:Davidgothberg/Test59 205 | */ 206 | 207 | pre, 208 | code, 209 | kbd, 210 | samp { 211 | font-family: monospace, serif; 212 | _font-family: 'courier new', monospace; 213 | font-size: 1em; 214 | } 215 | 216 | /* 217 | * Improves readability of pre-formatted text in all browsers 218 | */ 219 | 220 | pre { 221 | white-space: pre; 222 | white-space: pre-wrap; 223 | word-wrap: break-word; 224 | } 225 | 226 | /* 227 | * 1. Addresses CSS quotes not supported in IE6/7 228 | * 2. Addresses quote property not supported in S4 229 | */ 230 | 231 | /* 1 */ 232 | 233 | q { 234 | quotes: none; 235 | } 236 | 237 | /* 2 */ 238 | 239 | q:before, 240 | q:after { 241 | content: ''; 242 | content: none; 243 | } 244 | 245 | small { 246 | font-size: 75%; 247 | } 248 | 249 | /* 250 | * Prevents sub and sup affecting line-height in all browsers 251 | * gist.github.com/413930 252 | */ 253 | 254 | sub, 255 | sup { 256 | font-size: 75%; 257 | line-height: 0; 258 | position: relative; 259 | vertical-align: baseline; 260 | } 261 | 262 | sup { 263 | top: -0.5em; 264 | } 265 | 266 | sub { 267 | bottom: -0.25em; 268 | } 269 | 270 | 271 | /* ============================================================================= 272 | Lists 273 | ========================================================================== */ 274 | 275 | /* 276 | * Addresses margins set differently in IE6/7 277 | */ 278 | 279 | dl, 280 | menu, 281 | ol, 282 | ul { 283 | margin: 1em 0; 284 | } 285 | 286 | dd { 287 | margin: 0 0 0 40px; 288 | } 289 | 290 | /* 291 | * Addresses paddings set differently in IE6/7 292 | */ 293 | 294 | menu, 295 | ol, 296 | ul { 297 | padding: 0 0 0 40px; 298 | } 299 | 300 | /* 301 | * Corrects list images handled incorrectly in IE7 302 | */ 303 | 304 | nav ul, 305 | nav ol { 306 | list-style: none; 307 | list-style-image: none; 308 | } 309 | 310 | 311 | /* ============================================================================= 312 | Embedded content 313 | ========================================================================== */ 314 | 315 | /* 316 | * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 317 | * 2. Improves image quality when scaled in IE7 318 | * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ 319 | */ 320 | 321 | img { 322 | border: 0; /* 1 */ 323 | -ms-interpolation-mode: bicubic; /* 2 */ 324 | } 325 | 326 | /* 327 | * Corrects overflow displayed oddly in IE9 328 | */ 329 | 330 | svg:not(:root) { 331 | overflow: hidden; 332 | } 333 | 334 | 335 | /* ============================================================================= 336 | Figures 337 | ========================================================================== */ 338 | 339 | /* 340 | * Addresses margin not present in IE6/7/8/9, S5, O11 341 | */ 342 | 343 | figure { 344 | margin: 0; 345 | } 346 | 347 | 348 | /* ============================================================================= 349 | Forms 350 | ========================================================================== */ 351 | 352 | /* 353 | * Corrects margin displayed oddly in IE6/7 354 | */ 355 | 356 | form { 357 | margin: 0; 358 | } 359 | 360 | /* 361 | * Define consistent border, margin, and padding 362 | */ 363 | 364 | fieldset { 365 | border: 1px solid #c0c0c0; 366 | margin: 0 2px; 367 | padding: 0.35em 0.625em 0.75em; 368 | } 369 | 370 | /* 371 | * 1. Corrects color not being inherited in IE6/7/8/9 372 | * 2. Corrects text not wrapping in FF3 373 | * 3. Corrects alignment displayed oddly in IE6/7 374 | */ 375 | 376 | legend { 377 | border: 0; /* 1 */ 378 | padding: 0; 379 | white-space: normal; /* 2 */ 380 | *margin-left: -7px; /* 3 */ 381 | } 382 | 383 | /* 384 | * 1. Corrects font size not being inherited in all browsers 385 | * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome 386 | * 3. Improves appearance and consistency in all browsers 387 | */ 388 | 389 | button, 390 | input, 391 | select, 392 | textarea { 393 | font-size: 100%; /* 1 */ 394 | margin: 0; /* 2 */ 395 | vertical-align: baseline; /* 3 */ 396 | *vertical-align: middle; /* 3 */ 397 | } 398 | 399 | /* 400 | * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet 401 | */ 402 | 403 | button, 404 | input { 405 | line-height: normal; /* 1 */ 406 | } 407 | 408 | /* 409 | * 1. Improves usability and consistency of cursor style between image-type 'input' and others 410 | * 2. Corrects inability to style clickable 'input' types in iOS 411 | * 3. Removes inner spacing in IE7 without affecting normal text inputs 412 | * Known issue: inner spacing remains in IE6 413 | */ 414 | 415 | button, 416 | input[type="button"], 417 | input[type="reset"], 418 | input[type="submit"] { 419 | cursor: pointer; /* 1 */ 420 | -webkit-appearance: button; /* 2 */ 421 | *overflow: visible; /* 3 */ 422 | } 423 | 424 | /* 425 | * Re-set default cursor for disabled elements 426 | */ 427 | 428 | button[disabled], 429 | input[disabled] { 430 | cursor: default; 431 | } 432 | 433 | /* 434 | * 1. Addresses box sizing set to content-box in IE8/9 435 | * 2. Removes excess padding in IE8/9 436 | * 3. Removes excess padding in IE7 437 | Known issue: excess padding remains in IE6 438 | */ 439 | 440 | input[type="checkbox"], 441 | input[type="radio"] { 442 | box-sizing: border-box; /* 1 */ 443 | padding: 0; /* 2 */ 444 | *height: 13px; /* 3 */ 445 | *width: 13px; /* 3 */ 446 | } 447 | 448 | /* 449 | * 1. Addresses appearance set to searchfield in S5, Chrome 450 | * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) 451 | */ 452 | 453 | input[type="search"] { 454 | -webkit-appearance: textfield; /* 1 */ 455 | -moz-box-sizing: content-box; 456 | -webkit-box-sizing: content-box; /* 2 */ 457 | box-sizing: content-box; 458 | } 459 | 460 | /* 461 | * Removes inner padding and search cancel button in S5, Chrome on OS X 462 | */ 463 | 464 | input[type="search"]::-webkit-search-decoration, 465 | input[type="search"]::-webkit-search-cancel-button { 466 | -webkit-appearance: none; 467 | } 468 | 469 | /* 470 | * Removes inner padding and border in FF3+ 471 | * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ 472 | */ 473 | 474 | button::-moz-focus-inner, 475 | input::-moz-focus-inner { 476 | border: 0; 477 | padding: 0; 478 | } 479 | 480 | /* 481 | * 1. Removes default vertical scrollbar in IE6/7/8/9 482 | * 2. Improves readability and alignment in all browsers 483 | */ 484 | 485 | textarea { 486 | overflow: auto; /* 1 */ 487 | vertical-align: top; /* 2 */ 488 | } 489 | 490 | 491 | /* ============================================================================= 492 | Tables 493 | ========================================================================== */ 494 | 495 | /* 496 | * Remove most spacing between table cells 497 | */ 498 | 499 | table { 500 | border-collapse: collapse; 501 | border-spacing: 0; 502 | } -------------------------------------------------------------------------------- /templates/swissen/assets/less/pdf.less: -------------------------------------------------------------------------------- 1 | body.pdf { 2 | color: black; 3 | 4 | a { 5 | text-decoration: none; 6 | color: black; 7 | } 8 | .container { 9 | width: 1000px; 10 | margin: 0 auto; 11 | padding: 0; 12 | background: none; 13 | border: none; 14 | border-width: 8px 0 2px 0; 15 | text-align: left; 16 | } 17 | 18 | .resume { 19 | position:relative; 20 | padding: 40px 80px; 21 | } 22 | 23 | a[href$='.pdf'] { 24 | display: none; 25 | } 26 | 27 | h1 { 28 | letter-spacing: 0; 29 | margin-top: 0; 30 | font-size: 48px; 31 | text-transform: none; 32 | } 33 | h2 { 34 | letter-spacing: 0; 35 | text-transform: uppercase; 36 | font-weight: normal; 37 | } 38 | h3 { 39 | float: left; 40 | width: 20%; 41 | font-style: normal; 42 | } 43 | h3+p { 44 | float: left; 45 | width: 80%; 46 | } 47 | 48 | blockquote { 49 | top: 40px; 50 | right: 50px; 51 | position: absolute; 52 | } 53 | 54 | ul li { 55 | width: 33.33%; 56 | float: left; 57 | } 58 | ul dl { 59 | margin: 0; 60 | padding: 0.3em 0 0; 61 | dt { 62 | font-size: 122%; 63 | font-weight: normal; 64 | margin: 0 0 .75em; 65 | } 66 | dd { 67 | padding: 0 4em 0 0; 68 | } 69 | } 70 | 71 | ol { 72 | float: left; 73 | width: 80%; 74 | margin: .7em 0 0; 75 | } 76 | 77 | ol li { 78 | width: 33%; 79 | margin: 0; 80 | } 81 | ol li:nth-child(3n) { 82 | width: 34%; 83 | } 84 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 85 | border-top: none; 86 | } 87 | 88 | dl { 89 | margin: .7em 0 0; 90 | page-break-inside: avoid !important; 91 | display: block; 92 | dt {} 93 | dd { 94 | } 95 | strong { 96 | float: right; 97 | margin-top: -2em; 98 | } 99 | em { 100 | font-size: 130%; 101 | font-style: normal; 102 | } 103 | 104 | } 105 | 106 | } -------------------------------------------------------------------------------- /templates/swissen/assets/less/resume.less: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | zoom: 1; 3 | &:after { 4 | display: block; 5 | visibility: hidden; 6 | height: 0; 7 | clear: both; 8 | content: "."; 9 | } 10 | } 11 | 12 | body { 13 | font-family: 'Helvetica Neue', 'Helvetica', Arial, serif; 14 | color: #444; 15 | } 16 | h1, h2, h3, h4, ul dl dt { 17 | font-family: 'Helvetica Neue Light', 'Helvetica', Arial, serif; 18 | } 19 | 20 | h1:before{ 21 | content: "+"; 22 | font-weight: bold; 23 | color: orange; 24 | margin: -1em 0 0 -0.5em; 25 | position: relative; 26 | top: -0.4em; 27 | } 28 | 29 | .container { 30 | margin: 0 auto; 31 | padding: 0; 32 | background: whiteSmoke; 33 | border: solid #666; 34 | border-width: 8px 0 2px 0; 35 | text-align: left; 36 | } 37 | 38 | .resume { 39 | position:relative; 40 | padding: 10px 20px; 41 | } 42 | 43 | a { 44 | color: #990003; 45 | } 46 | 47 | a[href$='.pdf'] { 48 | display: inline-block; 49 | background: #666; 50 | color: white; 51 | padding: 6px 12px; 52 | margin-bottom: 6px; 53 | text-decoration: none; 54 | } 55 | 56 | blockquote { 57 | margin: 0; 58 | padding: 0; 59 | line-height: 1.4em; 60 | } 61 | 62 | hr { 63 | display: block; 64 | position: relative; 65 | padding: 0; 66 | margin: 18px auto; 67 | width: 100%; 68 | clear: both; 69 | border: none; 70 | border-top: 1px solid #CCC; 71 | font-size: 1px; 72 | line-height: 0; 73 | overflow: visible; 74 | page-break-after: avoid; 75 | } 76 | 77 | h1 { 78 | margin: 0; 79 | padding: 0; 80 | font-size: 36px; 81 | letter-spacing: -1px; 82 | font-weight: bold; 83 | } 84 | h2 { 85 | margin: 0; 86 | padding: 0; 87 | font-size: 18px; 88 | letter-spacing: -1px; 89 | font-weight: bold; 90 | } 91 | 92 | h3 { 93 | margin: 0; 94 | padding: 0 0 .5em; 95 | font-size: 150%; 96 | font-weight: bold; 97 | } 98 | 99 | h3+p { 100 | margin: 0 0 16px; 101 | padding: 0; 102 | display: block; 103 | font-size: 104%; 104 | line-height: 24px; 105 | } 106 | 107 | 108 | ul { 109 | margin: 0; 110 | padding: 0; 111 | list-style: none; 112 | display: table; 113 | } 114 | ul li { 115 | margin: 0; 116 | padding: 0; 117 | } 118 | 119 | ul dl { 120 | margin: .3em 0 0; 121 | padding: 0; 122 | width: 100%; 123 | dt { 124 | font-size: 100%; 125 | } 126 | dd { 127 | margin: 0 0 1em; 128 | padding: 0 2em 0 0; 129 | font-size: .8em; 130 | line-height: 1.5em; 131 | } 132 | } 133 | 134 | ol { 135 | margin: 0; 136 | padding: 0 0 .75em; 137 | width: 80%; 138 | display: inline-block; 139 | } 140 | 141 | ol li { 142 | margin: 0 0 0 1em; 143 | padding: 0; 144 | border-top: 1px solid #CCCCCC; 145 | width: 100%; 146 | float: left; 147 | list-style: none; 148 | line-height: 24px; 149 | font-size: 14px; 150 | } 151 | ol li:nth-child(1) { 152 | border-top: none; 153 | } 154 | 155 | dl { 156 | float:left; 157 | display: block; 158 | /*display: inline-block;*/ 159 | width: 75%; 160 | margin: 0; 161 | padding: 0; 162 | dt { 163 | margin: 0; 164 | padding: 0; 165 | font-size: 140%; 166 | } 167 | dd { 168 | margin: 0 0 1.5em; 169 | padding: 0; 170 | font-size: 80%; 171 | line-height: 1.4em; 172 | } 173 | strong { 174 | display: block; 175 | } 176 | em { 177 | display: block; 178 | font-size: 110%; 179 | margin: .15em 0 .5em; 180 | font-style: bold; 181 | } 182 | } 183 | 184 | dl dd li{width: 100%; margin: 0 1em 1em; list-style-type: square;} 185 | dl dt{display: block; clear: both;} 186 | dl dt{border-top: 1px solid #ccc; padding-top: 1em;} 187 | h3 + dl dt:first-child{border: 0;padding-top: 0;} 188 | dl dd p:first-child{font-weight: bold; text-transform: uppercase; font-size: 1.2em;} 189 | 190 | ul li dt{border: 0; padding-top: 0;} 191 | 192 | #footer { 193 | display: none; 194 | } 195 | 196 | #footer + p { 197 | width: 100%; 198 | font-size: 11px; 199 | text-align: center; 200 | } -------------------------------------------------------------------------------- /templates/swissen/assets/less/screen.less: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | Mobile layout 4 | 240–479 px 5 | Zoomed out below 320 px 6 | */ 7 | 8 | @media screen and (min-width: 15em) { 9 | } 10 | 11 | 12 | /* 13 | Wide mobile layout 14 | 480-767 px 15 | Zoomed in above 480 px 16 | */ 17 | 18 | @media screen and (min-width: 30em) { 19 | } 20 | 21 | 22 | /* 23 | Tablet layout 24 | 600-911 px 25 | Zoomed in above 600 px 26 | */ 27 | 28 | @media screen and (min-width: 37.5em) { 29 | body { 30 | padding: 2em 0; 31 | } 32 | blockquote { 33 | top: 10px; 34 | right: 50px; 35 | position: absolute; 36 | } 37 | h1 { /* Open up the top section height so we don't collapse on the blockquote */ 38 | margin-top: .5em; 39 | } 40 | ol { 41 | margin: 0 0 0 1em; 42 | } 43 | ol li { 44 | width: 50%; 45 | margin: 0; 46 | } 47 | ol li:nth-child(1), ol li:nth-child(2) { 48 | border-top: none; 49 | } 50 | } 51 | 52 | 53 | /* 54 | Widescreen layout 55 | 912-1887 px 56 | Zoomed in above 912 px 57 | */ 58 | 59 | @media screen and (min-width: 57em) { 60 | .container { 61 | width: 912px; 62 | } 63 | .resume { 64 | position:relative; 65 | padding: 40px 50px; 66 | } 67 | blockquote { 68 | top: 40px; 69 | right: 50px; 70 | position: absolute; 71 | } 72 | h1 { 73 | margin-top: 0; 74 | font-size: 48px; 75 | letter-spacing: -1px; 76 | } 77 | h2 { 78 | text-transform: uppercase; 79 | letter-spacing: 3px; 80 | } 81 | 82 | h3 { 83 | float: left; 84 | width: 20%; 85 | } 86 | 87 | h3+p { 88 | float: left; 89 | width: 80%; 90 | } 91 | 92 | ul li { 93 | width: 33.33%; 94 | float: left; 95 | } 96 | ul dl { 97 | dt { 98 | font-size: 122%; 99 | font-weight: normal; 100 | margin-bottom: .75em; 101 | } 102 | dd { 103 | padding: 0 4em 0 0; 104 | } 105 | } 106 | 107 | ol { 108 | float: left; 109 | width: 80%; 110 | margin: .6em 0 0; 111 | } 112 | 113 | ol li { 114 | width: 33%; 115 | margin: 0; 116 | } 117 | ol li:nth-child(3n) { 118 | width: 34%; 119 | } 120 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 121 | border-top: none; 122 | } 123 | 124 | dl { 125 | /*margin: .5em 0 0;*/ 126 | dt { 127 | } 128 | dd { 129 | } 130 | strong { 131 | float: right; 132 | margin-top: -2em; 133 | } 134 | em { 135 | font-size: 130%; 136 | font-style: normal; 137 | } 138 | 139 | } 140 | 141 | 142 | } 143 | 144 | 145 | /* 146 | Huge-screen layout 147 | 1888-2520 px 148 | Zoomed in above 1920 px 149 | */ 150 | 151 | @media screen and (min-width: 118em) { 152 | 153 | 154 | } -------------------------------------------------------------------------------- /templates/swissen/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#reload}} 6 | 7 | {{/reload}} 8 | 9 | {{title}} 10 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | {{{resume}}} 20 |
21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /test/fixtures/empty.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/c0bra/markdown-resume-js/d43da4946c45fe3d6898672fe8b61b2d5ccaa8a9/test/fixtures/empty.md -------------------------------------------------------------------------------- /test/fixtures/other.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Not a markdown file! 9 | 10 | 11 | -------------------------------------------------------------------------------- /test/fixtures/resume.md: -------------------------------------------------------------------------------- 1 | # Brian Hann 2 | ## Senior Web Developer, Data Nerd 3 | 4 | > [Download PDF](resume.pdf) 5 | > [me@mysite.com](me@mysite.com) 6 | > (999) 888-7777 7 | 8 | --- 9 | 10 | ### Profile 11 | 12 | Progressively evolve cross-platform ideas before impactful infomediaries. Energistically visualize tactical initiatives before cross-media catalysts for change. 13 | 14 | --- 15 | 16 | ### Skills 17 | 18 | * **Web Design** 19 | Assertively exploit wireless initiatives rather than synergistic core competencies. 20 | 21 | * **Interface Design** 22 | Credibly streamline mission-critical value with multifunctional functionalities. 23 | 24 | * **Project Direction** 25 | Proven ability to lead and manage a wide variety of design and development projects in team and independent situations. 26 | 27 | --- 28 | 29 | ### Technical 30 | 31 | 1. XHTML 32 | 1. CSS 33 | 1. Javascript 34 | 1. Jquery 35 | 1. PHP 36 | 1. CVS / Subversion 37 | 1. OS X 38 | 1. Windows XP/Vista 39 | 1. Linux 40 | 41 | --- 42 | 43 | ### Experience 44 | 45 | **Microsoft** : *Principal and Creative Lead* __2004-2005__ 46 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 47 | 48 | **International Business Machines (IBM)** : *Lead Web Designer* __2001-2004__ 49 | Globally re-engineer cross-media schemas through viral methods of empowerment. Proactively grow long-term high-impact human capital and highly efficient innovation. Intrinsicly iterate excellent e-tailers with timely e-markets. 50 | -------------------------------------------------------------------------------- /test/fixtures/standard.md: -------------------------------------------------------------------------------- 1 | # Brian Hann 2 | 3 | > [me@mysite.com](me@mysite.com) 4 | > (888) 555-7777 5 | 6 | ## Senior Developer 7 | 8 | Kansas City, MO 9 | 10 | Progressively evolve cross-platform ideas before impactful infomediaries. Energistically visualize tactical initiatives before cross-media catalysts for change. 11 | 12 | 13 | ### Experience 14 | 15 | **Corp, Inc** 16 | *Principal and Creative Lead | 2004 - Current* 17 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. 18 | 19 | Assertively incentivize sticky platforms without synergistic materials. 20 | 21 | **Globocom LLC** 22 | *Lead Web Designer | 2001 - 2004* 23 | Globally re-engineer cross-media schemas through viral methods of empowerment. Proactively grow long-term high-impact human capital and highly efficient innovation. Intrinsicly iterate excellent e-tailers with timely e-markets. 24 | 25 | 26 | ### Education 27 | 28 | **UNIVERSITY OF SOMEWHERE** 29 | *MBA - Global Domination | 1999 – 2001* 30 | 31 | **UNIVERSITY OF SOMEWHERE** 32 | *Bachelor of Science - Future Tech | 1995 – 1998* 33 | 34 | ### Skills 35 | 36 | 1. XHTML 37 | 1. CSS 38 | 1. Javascript 39 | 1. Jquery 40 | 1. PHP 41 | 1. CVS / Subversion 42 | 1. OS X 43 | 1. Windows XP/Vista 44 | 1. Linux 45 | -------------------------------------------------------------------------------- /test/fixtures/with_image.md: -------------------------------------------------------------------------------- 1 | # Brian Hann 2 | ## Senior Web Developer, Data Nerd 3 | 4 | > ![image](https://en.gravatar.com/userimage/43313446/2bfb3e704774a71fca3ea109129a481e.jpeg) 5 | 6 | --- 7 | 8 | ### Profile 9 | 10 | Progressively evolve cross-platform ideas before impactful infomediaries. Energistically visualize tactical initiatives before cross-media catalysts for change. 11 | 12 | --- 13 | 14 | ### Skills 15 | 16 | * **Web Design** 17 | Assertively exploit wireless initiatives rather than synergistic core competencies. 18 | 19 | * **Interface Design** 20 | Credibly streamline mission-critical value with multifunctional functionalities. 21 | 22 | * **Project Direction** 23 | Proven ability to lead and manage a wide variety of design and development projects in team and independent situations. 24 | 25 | --- 26 | 27 | ### Technical 28 | 29 | 1. XHTML 30 | 1. CSS 31 | 1. Javascript 32 | 1. Jquery 33 | 1. PHP 34 | 1. CVS / Subversion 35 | 1. OS X 36 | 1. Windows XP/Vista 37 | 1. Linux 38 | 39 | --- 40 | 41 | ### Experience 42 | 43 | **Microsoft** : *Principal and Creative Lead* __2004-2005__ 44 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 45 | 46 | **International Business Machines (IBM)** : *Lead Web Designer* __2001-2004__ 47 | Globally re-engineer cross-media schemas through viral methods of empowerment. Proactively grow long-term high-impact human capital and highly efficient innovation. Intrinsicly iterate excellent e-tailers with timely e-markets. 48 | -------------------------------------------------------------------------------- /test/md2resume.spec.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | const md2resume = require('../src/markdown-resume'); 7 | const cheerio = require('cheerio'); 8 | const juice = require('juice'); 9 | 10 | describe('markdown-resume-js', () => { 11 | context('Reading non-markdown files', () => { 12 | it('should reject the promise when given a non-markdown file', () => { 13 | const readNonMarkdownFile = Promise.resolve(md2resume('test/fixtures/other.html')); 14 | return expect(readNonMarkdownFile) 15 | .to.be.rejectedWith(/Only markdown files are supported/); 16 | }); 17 | }); 18 | 19 | context('Reading missing markdown', () => { 20 | it('should reject the promise when the markdown file is missing', () => { 21 | const readMissingFilePromise = Promise.resolve(md2resume('missing-file.md')); 22 | return expect(readMissingFilePromise).to.be.rejectedWith(/no such file/); 23 | }); 24 | 25 | return it('should reject the promise with an error when the file is empty', () => { 26 | const readEmptyFilePromise = Promise.resolve(md2resume('test/fixtures/empty.md')); 27 | return expect(readEmptyFilePromise).to.be.rejectedWith(/Source file is empty/); 28 | }); 29 | }); 30 | 31 | context('Writing html', () => { 32 | // FIXME - this is a roundabout kind of way to test that the styles are being 33 | // applied correctly. 34 | it('should produce valid html with the right styles applied', () => { 35 | const contentChecks = (resume) => { 36 | const resumeClassStyles = { 37 | position: 'relative', 38 | padding: '10px 20px', 39 | }; 40 | 41 | const $ = cheerio.load(juice(resume)); 42 | expect($('.resume').css()).to.deep.equal(resumeClassStyles); 43 | expect($('ol li').get().length).to.equal(9); 44 | return expect($('title').text()) 45 | .to.equal('Brian Hann | Senior Web Developer, Data Nerd'); 46 | }; 47 | 48 | const renderResumePromise = Promise.resolve(md2resume('test/fixtures/resume.md')); 49 | return expect(renderResumePromise).to.be.fulfilled 50 | .and.eventually.satisfy(contentChecks); 51 | }); 52 | }); 53 | 54 | return context('Writing pdf', () => {}); 55 | }); 56 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require mocha.conf.js 2 | --------------------------------------------------------------------------------