├── .gitignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── bin └── md2resume ├── build └── update_readme.php ├── composer.json ├── composer.lock ├── examples ├── output │ ├── EMPTY │ ├── blockish.pdf │ ├── modern.pdf │ ├── readable.pdf │ ├── swissen.pdf │ └── unstyled.pdf └── source │ ├── sample.md │ ├── sample_long.md │ └── zhsample.md ├── phpunit.xml ├── src └── Resume │ ├── Cli │ ├── Resume.php │ └── TwigFormatters.php │ ├── Command │ ├── HtmlCommand.php │ ├── PdfCommand.php │ ├── StatsCommand.php │ ├── TemplatesCommand.php │ └── VersionCommand.php │ └── Templates │ ├── frequency.twig │ └── templates.twig ├── templates ├── blockish │ ├── css │ │ ├── elements.less │ │ ├── normalize.css │ │ ├── pdf.css │ │ ├── resume.css │ │ └── screen.css │ ├── description.txt │ └── index.html ├── modern │ ├── css │ │ ├── elements.less │ │ ├── normalize.css │ │ ├── pdf.css │ │ ├── resume.css │ │ └── screen.css │ ├── description.txt │ └── index.html ├── readable │ ├── css │ │ └── resume.css │ ├── description.txt │ ├── index.html │ └── links │ │ └── bootswatch ├── roboto │ ├── css │ │ ├── elements.less │ │ ├── normalize.css │ │ ├── pdf.less │ │ ├── resume.less │ │ └── screen.less │ ├── description.txt │ └── index.html ├── swissen │ ├── css │ │ ├── elements.less │ │ ├── normalize.css │ │ ├── pdf.css │ │ ├── resume.css │ │ └── screen.css │ ├── description.txt │ └── index.html └── unstyled │ ├── css │ ├── elements.less │ ├── normalize.css │ ├── pdf.css │ ├── resume.css │ └── screen.css │ ├── description.txt │ └── index.html └── tests ├── ListCommandTest.php ├── VersionCommandTest.php └── bootstrap.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor 3 | examples/resume/_*.md 4 | examples/output/*.html 5 | examples/output/*.pdf 6 | .tmp_pdf_source.html 7 | 8 | # OSX files 9 | .DS_Store 10 | .AppleDouble 11 | .LSOverride 12 | Icon 13 | 14 | # Thumbnails 15 | ._* 16 | 17 | # Files that might appear on external disk 18 | .Spotlight-V100 19 | .Trashes 20 | *.sublime* 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - '7.1' 5 | - '7.2' 6 | 7 | install: 8 | - travis_retry composer self-update 9 | - travis_retry composer install --prefer-source --no-interaction --dev 10 | 11 | script: 12 | - composer test 13 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Utilize multi-stage build to keep image size down 2 | FROM composer:2.0.4 as composer 3 | COPY composer.* ./ 4 | RUN composer install --no-dev --optimize-autoloader --no-progress --no-suggest 5 | 6 | # Build the actual image 7 | FROM php:7.1 8 | 9 | ENV LC_ALL C.UTF-8 10 | WORKDIR /resume 11 | CMD ["/bin/bash"] 12 | 13 | RUN apt-get update \ 14 | && apt-get install -qqy --no-install-recommends \ 15 | # This is for enabling the program to be run with watch 16 | procps \ 17 | # Required to run PDF generation 18 | wget apt-utils libjpeg62-turbo libxrender1 xfonts-75dpi xfonts-base fontconfig libxext6 \ 19 | && apt-get autoremove \ 20 | && rm -rf /var/lib/apt/lists/* 21 | 22 | RUN cd /root \ 23 | && wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.stretch_amd64.deb --no-verbose \ 24 | && dpkg -i wkhtmltox_0.12.6-1.stretch_amd64.deb 25 | 26 | # Enables continously calling a command and piping the output to STDOUT, viewable via docker logs 27 | RUN printf '#!/bin/bash\nwhile sleep 1; do\n "$@"\ndone' >> /usr/bin/watch-docker \ 28 | && chmod +x /usr/bin/watch-docker 29 | 30 | COPY --from=composer /app/vendor /app/vendor 31 | COPY . /app 32 | 33 | RUN ln -s /app/bin/md2resume /usr/bin/md2resume 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Craig Davis 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 Generator [![Build Status](https://travis-ci.org/there4/markdown-resume.png?branch=master)](https://travis-ci.org/there4/markdown-resume)[![nodesource/node](http://dockeri.co/image/there4/markdown-resume)](https://registry.hub.docker.com/u/there4/markdown-resume/) 2 | 3 | > Convert markdown to HTML and PDF resumes 4 | 5 | Turn a simple Markdown document into an elegant resume with both a perfect 6 | pdf printable format, and a responsive css3 html5 file. You can view a sample 7 | at the [blog post for the project][blog], or look in examples/output to see sample PDFs. 8 | 9 | ## Features 10 | 11 | * Multiple styles to choose from: `modern`, `blockish`, `unstyled`, `readable`, `swissen` _(Fork and add more!)_ 12 | * PDF generation via [wkhtmltopdf][wkhtmltopdf] 13 | * Responsive design for multiple device viewport sizes 14 | * Simple Markdown formatting 15 | * Single file deployment (no external stylesheets) 16 | * You can now version control and branch your resume. 17 | 18 | ## Installation 19 | 20 | ### Docker 21 | 22 | Run those commands in the directory where you put your markdown resume. 23 | 24 | #### Oneshot command 25 | 26 | This is best suited for use in scripts or in CI environments: 27 | 28 | `docker run -v ${PWD}:/resume there4/markdown-resume md2resume [options] command [arguments]` 29 | 30 | #### Interactive console 31 | 32 | This allows you to enter an interactive console where you can easily experiment and run different commands: 33 | 34 | `docker run -it -v ${PWD}:/resume there4/markdown-resume` 35 | 36 | ### Local 37 | 38 | 1. Clone the repo `git clone git@github.com:there4/markdown-resume.git` or [Download ZIP](https://github.com/there4/markdown-resume/archive/master.zip) 39 | 2. **PHP 7** and **[composer](https://getcomposer.org/download/)** are installed and on your PATH 40 | 3. `composer install` inside of the project directory to install dependencies 41 | 42 | 4. For generating PDF files, you need to install `wkhtmltopdf` 43 | * OSX: `brew cask install wkhtmltopdf` via [Homebrew Cask](https://caskroom.github.io/) 44 | * Debian: `sudo apt install php7.0-mbstring wkhtmltopdf` 45 | * Fedora `sudo dnf install php-mbstring wkhtmltopdf` 46 | 47 | ## Usage 48 | 49 | The two most important commands are the following two. Run them 50 | inside the cloned directory 51 | 52 | ```bash 53 | ./bin/md2resume html examples/source/sample.md examples/output/ 54 | ./bin/md2resume pdf examples/source/sample.md examples/output/ 55 | ``` 56 | 57 | ## Help 58 | 59 | ``` 60 | Markdown Resume Generator version 2.3.0 by Craig Davis 61 | 62 | Usage: 63 | [options] command [arguments] 64 | 65 | Options: 66 | --help -h Display this help message. 67 | --quiet -q Do not output any message. 68 | --verbose -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug 69 | --version -V Display this application version. 70 | --ansi Force ANSI output. 71 | --no-ansi Disable ANSI output. 72 | --no-interaction -n Do not ask any interactive question. 73 | 74 | Available commands: 75 | help Displays help for a command 76 | html Generate an HTML resume from a markdown file 77 | list Lists commands 78 | pdf Generate a PDF from a markdown file 79 | stats Generate a word frequency analysis of your resume 80 | templates List available templates 81 | version Show current version information 82 | 83 | ``` 84 | 85 | ## Examples 86 | 87 | Choose a template with the -t option. 88 | 89 | ```bash 90 | ./bin/md2resume html --template blockish examples/source/sample.md examples/output/ 91 | ``` 92 | 93 | If you want to edit your markdown resume in your editor while watching it 94 | update in your browser, run this command: 95 | 96 | ```bash 97 | watch ./bin/md2resume html --refresh yes --template modern examples/source/sample.md examples/output/ 98 | ``` 99 | 100 | This makes the build script run periodically, and html document will refresh 101 | every two seconds via a meta tag. Open the `./examples/ouput/sample.html` file 102 | in your browser, and then just save your markdown document when you want to see 103 | a fresh preview. 104 | 105 | ## Authoring Your Resume 106 | 107 | Markdown is limited to basic html markup. Follow the `examples/source/sample.md` 108 | file as a guideline. This file includes various headers and several nested 109 | elements. This allows us to construct a semantic HTML document for the resume, 110 | and then use CSS rules to display a nicely formatted resume. Note that because 111 | we have very few ways to nest or identify elements that many of the css rules 112 | are based on descendant and adjacent selectors. 113 | 114 | ## Feature Development 115 | 116 | In order to add new commands, you'll need to first install the dependencies via `composer install` 117 | 118 | After that, you can run the `md2resume_dev.php` file from the command line. 119 | 120 | ## Building a Release 121 | 122 | 1. Tag the repo with the new build number. 123 | 2. Run `composer build`. 124 | 3. Push both the tag and the code. 125 | 126 | ## Acknowledgments 127 | 128 | The initial inspiration is from the [Sample Resume Template][srt]. 129 | However, no HTML from that project has been used in this. General layout has 130 | been reused, and media queries have been added. It's a nice template, and if you 131 | are a more comfortable with html than markdown, you should use it. 132 | 133 | ## Changelog 134 | 135 | * __2.3.1__ : Fix embedded images in PDF generation with Docker [@danielklim](https://github.com/danielklim) 136 | * __2.3.0__ : Add Docker support to ease the installation process [@spawnia](https://github.com/spawnia) 137 | * __2.2.0__ : Dropped phar file distribution, removed Pake and migrated to composer commands 138 | * __2.1.0__ : Dropped PHP5 support 139 | * __2.0.12__ : Added new `Roboto` template from [@ejwaibel](https://github.com/ejwaibel) 140 | * __2.0.10__ : Updated spacing in moder template with commites from [@501st-alpha1](https://github.com/501st-alpha1) 141 | * __2.0.9__ : Updated Modern template with improved spacing. Update parsing of 142 | `--template` option to close [issue #7](https://github.com/there4/markdown-resume/issues/7) 143 | * __2.0.8__ : New `readable` theme contributed by @ahmadnazir, minor refactor 144 | to support a /links directory 145 | * __2.0.7__ : Update composer to use `sunra/php-simple-html-dom-parser` this 146 | appears to be better maintained and more popular to [close #27](https://github.com/there4/markdown-resume/issues/27) 147 | * __2.0.6__ : Fix empty template list from phar file to [close #24](https://github.com/there4/markdown-resume/issues/24) 148 | * __2.0.5__ : Remove default value for the `--refresh` option to [close #22](https://github.com/there4/markdown-resume/issues/22) 149 | * __2.0.4__ : Fix path resolution problem with absolute paths to [close #16](https://github.com/there4/markdown-resume/issues/16) 150 | * __2.0.3__ : Add optional duration to the `--refresh` option to [close #15](https://github.com/there4/markdown-resume/issues/15) 151 | * __2.0.2__ : Add new dependency check for `mbstring` to [close #20](https://github.com/there4/markdown-resume/issues/20) 152 | * __2.0.1__ : Add new `swissen` template with Helvetica styling [@beautifulcode](https://github.com/beautifulcode) 153 | * __2.0.0__ : Complete rewrite with the [symfony console component][console]. 154 | Deployment is now done with a compiled phar file, and development dependencies 155 | are managed with composer. 156 | * __0.9.0__ : Add composer and update README with new changelog 157 | * __0.8.8__ : Add Chinese text example [@ishitcno1](https://github.com/ishitcno1) 158 | * __0.8.7__ : Update pdf formatting of the modern template [@roleary](https://github.com/roleary) 159 | * __0.8.6__ : Fix output path [@abhikandoi2000](https://github.com/abhikandoi2000) 160 | * __0.8.5__ : Fix [issue #2](https://github.com/there4/markdown-resume/issues/2) 161 | * __0.8.4__ : Correct chmod and add parameter for output directory [@kevinxucs](https://github.com/kevinxucs) 162 | * __0.8.2__ : Update build script and add refresh command option 163 | * __0.8.1__ : Updating formatting of initial templates 164 | * __0.8__ : Initial Release to Public 165 | 166 | [srt]: http://sampleresumetemplate.net/ "A great starting point" 167 | [blog]: http://there4development.com/blog/2012/12/31/markdown-resume-builder/ 168 | [pake]: https://github.com/indeyets/pake/wiki/Installing-Pake 169 | [wkhtmltopdf]: https://github.com/pdfkit/pdfkit/wiki/Installing-WKHTMLTOPDF 170 | [console]: http://symfony.com/doc/current/components/console/introduction.html 171 | -------------------------------------------------------------------------------- /bin/md2resume: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | add('Resume', $baseDir . '/src'); 25 | 26 | // Instantiate our Console application 27 | $console = new Resume\Cli\Resume(); 28 | 29 | // Fetch the version 30 | chdir($baseDir); 31 | $versionCmd = 'git describe --abbrev=0 --tags 2>/dev/null'; 32 | $version = trim(shell_exec($versionCmd)); 33 | chdir($cwd); 34 | 35 | // Fetch the project name and description 36 | $project = json_decode(file_get_contents(__DIR__ . '/../composer.json')); 37 | $project->version = $version; 38 | 39 | // Init the app with these params 40 | $console->initialize($templatePath, $consoleTemplatePath, $project); 41 | 42 | // Execute the console app. 43 | $console->run(); 44 | 45 | /* End of resume.php */ 46 | -------------------------------------------------------------------------------- /build/update_readme.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | =7.1", 52 | "kriswallsmith/assetic": "1.1.2", 53 | "leafo/lessphp": "v0.4.0", 54 | "michelf/php-markdown": "1.4.0", 55 | "michelf/php-smartypants": "^1.8", 56 | "mustache/mustache": "2.5.1", 57 | "sunra/php-simple-html-dom-parser": "v1.5.0", 58 | "symfony/config": "v2.3.4", 59 | "symfony/console": "v2.3.4", 60 | "symfony/yaml": "v2.3.4", 61 | "twig/twig": "v1.13.2", 62 | "symfony/event-dispatcher": "^4.0@dev", 63 | "leafo/scssphp": "dev-master" 64 | }, 65 | "bin": [ 66 | "bin/md2resume" 67 | ], 68 | "require-dev": { 69 | "phpunit/phpunit": "^6.2", 70 | "squizlabs/php_codesniffer": "^3.0@dev", 71 | "jakub-onderka/php-parallel-lint": "dev-master", 72 | "jakub-onderka/php-console-highlighter": "dev-master" 73 | }, 74 | "scripts": { 75 | "build": [ 76 | "@lint", 77 | "@format", 78 | "@sniff", 79 | "@test", 80 | "@readme" 81 | ], 82 | "lint": "vendor/bin/parallel-lint --exclude app --exclude vendor .", 83 | "sniff": "vendor/bin/phpcs --standard=PSR2 -n --extensions=php src", 84 | "format": "vendor/bin/phpcbf --standard=PSR2 --extensions=php src", 85 | "readme": "build/update_readme.php", 86 | "test": "vendor/bin/phpunit" 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /examples/output/EMPTY: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/EMPTY -------------------------------------------------------------------------------- /examples/output/blockish.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/blockish.pdf -------------------------------------------------------------------------------- /examples/output/modern.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/modern.pdf -------------------------------------------------------------------------------- /examples/output/readable.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/readable.pdf -------------------------------------------------------------------------------- /examples/output/swissen.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/swissen.pdf -------------------------------------------------------------------------------- /examples/output/unstyled.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/there4/markdown-resume/317f33e33c584be56c6c48fcf2deb211a7278075/examples/output/unstyled.pdf -------------------------------------------------------------------------------- /examples/source/sample.md: -------------------------------------------------------------------------------- 1 | # Craig Davis 2 | ## Senior PHP Developer, UX Director 3 | 4 | > [Download PDF](resume.pdf) 5 | > [craig@there4development.com](craig@there4development.com) 6 | > (999) 888-7777 7 | 8 | ------ 9 | 10 | ### Profile {#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 {#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 {#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 {#experience} 44 | 45 | Initrode Conglomerated 46 | : *Principal and Creative Lead* 47 | __2004-2005__ 48 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 49 | 50 | Gizmonic Institute Company (GIM) 51 | : *Lead Web Designer* 52 | __2001-2004__ 53 | 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. 54 | 55 | ------ 56 | 57 | ### Footer {#footer} 58 | 59 | Craig Davis -- [craig@there4development.com](craig@there4development.com) -- (999) 888-7777 60 | 61 | ------ 62 | -------------------------------------------------------------------------------- /examples/source/sample_long.md: -------------------------------------------------------------------------------- 1 | # Craig Davis 2 | ## Senior PHP Developer, UX Director 3 | 4 | > [Download PDF](resume.pdf) 5 | > [craig@there4development.com](craig@there4development.com) 6 | > (999) 888-7777 7 | 8 | ------ 9 | 10 | ### Profile {#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 {#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 {#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 {#experience} 44 | 45 | Initrode Conglomerated 46 | : *Principal and Creative Lead* 47 | __2004-2005__ 48 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 49 | 50 | Gizmonic Institute Company (GIM) 51 | : *Lead Web Designer* 52 | __2001-2004__ 53 | 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. 54 | 55 | 56 | Initrode Conglomerated 57 | : *Principal and Creative Lead* 58 | __2004-2005__ 59 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 60 | 61 | Gizmonic Institute Company (GIM) 62 | : *Lead Web Designer* 63 | __2001-2004__ 64 | 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. 65 | 66 | 67 | Initrode Conglomerated 68 | : *Principal and Creative Lead* 69 | __2004-2005__ 70 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 71 | 72 | Gizmonic Institute Company (GIM) 73 | : *Lead Web Designer* 74 | __2001-2004__ 75 | 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. 76 | 77 | 78 | Initrode Conglomerated 79 | : *Principal and Creative Lead* 80 | __2004-2005__ 81 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 82 | 83 | Gizmonic Institute Company (GIM) 84 | : *Lead Web Designer* 85 | __2001-2004__ 86 | 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. 87 | 88 | 89 | Initrode Conglomerated 90 | : *Principal and Creative Lead* 91 | __2004-2005__ 92 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 93 | 94 | Gizmonic Institute Company (GIM) 95 | : *Lead Web Designer* 96 | __2001-2004__ 97 | 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. 98 | 99 | 100 | Initrode Conglomerated 101 | : *Principal and Creative Lead* 102 | __2004-2005__ 103 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 104 | 105 | Gizmonic Institute Company (GIM) 106 | : *Lead Web Designer* 107 | __2001-2004__ 108 | 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. 109 | 110 | 111 | Initrode Conglomerated 112 | : *Principal and Creative Lead* 113 | __2004-2005__ 114 | Intrinsicly transform flexible manufactured products without excellent intellectual capital. Energistically evisculate orthogonal architectures through covalent action items. Assertively incentivize sticky platforms without synergistic materials. 115 | 116 | Gizmonic Institute Company (GIM) 117 | : *Lead Web Designer* 118 | __2001-2004__ 119 | 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. 120 | 121 | ------ 122 | 123 | ### Footer {#footer} 124 | 125 | Craig Davis -- [craig@there4development.com](craig@there4development.com) -- (999) 888-7777 126 | 127 | ------ 128 | -------------------------------------------------------------------------------- /examples/source/zhsample.md: -------------------------------------------------------------------------------- 1 | # 杜少陵 2 | ## 高级Android工程师 3 | 4 | > 浙江杭州,男,1989年 5 | > [email@example.com](email@example.com) 6 | > (+86) 101-2345-6789 7 | 8 | ------ 9 | 10 | ### 简介 {#profile} 11 | 12 | 扎实的Java基础,富有激情与创意。 13 | 14 | ------ 15 | 16 | ### 技能 {#skills} 17 | 18 | * Android开发 19 | : 三年Android开发经验。 20 | 21 | * 服务器端开发 22 | : 一年服务器端开发经验。 23 | 24 | ------- 25 | 26 | ### 技术 {#technical} 27 | 28 | 1. Android 29 | 1. Java 30 | 1. C 31 | 1. Node.js 32 | 1. MongoDB 33 | 1. Git 34 | 1. Linux 35 | 1. html5 CSS3 36 | 1. JQuery 37 | 38 | ------ 39 | 40 | ### 工作经验 {#experience} 41 | 42 | BBB信息技术有限公司 43 | : *Android高级工程师* 44 | __2012年至今__ 45 | 工作详情说明 46 | 47 | AAA信息技术有限公司 48 | : *Android工程师* 49 | __2010年至年2012年__ 50 | 工作详情说明 51 | 52 | ------ 53 | 54 | ### 学历 {#degree} 55 | 56 | 学位 57 | : *学校专业* 58 | __2006年至2010年__ 59 | 学位与学校说明 60 | 61 | ------ 62 | 63 | ### Footer {#footer} 64 | 65 | Github: [https://github.com/username](https://github.com/username) 66 | Stack Overflow: [http://stackoverflow.com/users/id/username](http://stackoverflow.com/users/id/username) 67 | 68 | ------ 69 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ./tests/ 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/Resume/Cli/Resume.php: -------------------------------------------------------------------------------- 1 | project = $project; 23 | 24 | // The absolute path to the html output templates 25 | $this->templatePath = $templatePath; 26 | 27 | // https://github.com/symfony/Console/blob/master/Output/Output.php 28 | // the alternative is OutputInterface::OUTPUT_PLAIN; 29 | $this->outputFormat = OutputInterface::OUTPUT_NORMAL; 30 | 31 | // Exits on missing dependencies 32 | $this->checkDependencies(); 33 | 34 | // We do this now because we've loaded the project info from the composer file 35 | $this->setName($this->project->description); 36 | $this->setVersion($this->project->version); 37 | 38 | // Load our commands into the application 39 | $this->add(new Command\HtmlCommand()); 40 | $this->add(new Command\PdfCommand()); 41 | $this->add(new Command\StatsCommand()); 42 | $this->add(new Command\TemplatesCommand()); 43 | $this->add(new Command\VersionCommand()); 44 | 45 | // We'll use [Twig](http://twig.sensiolabs.org/) for template output 46 | $loader = new \Twig_Loader_Filesystem($consoleTemplatePath); 47 | $this->twig = new \Twig_Environment( 48 | $loader, 49 | array( 50 | "cache" => false, 51 | "autoescape" => false, 52 | "strict_variables" => false // SET TO TRUE WHILE DEBUGGING 53 | ) 54 | ); 55 | 56 | // These are helpers that we use to format output on the cli: styling and padding and such 57 | $this->twig->addFilter('pad', new \Twig_Filter_Function("Resume\Cli\TwigFormatters::strpad")); 58 | $this->twig->addFilter('style', new \Twig_Filter_Function("Resume\Cli\TwigFormatters::style")); 59 | $this->twig->addFilter('repeat', new \Twig_Filter_Function("str_repeat")); 60 | $this->twig->addFilter('wrap', new \Twig_Filter_Function("wordwrap")); 61 | } 62 | 63 | public function getLongVersion() 64 | { 65 | return parent::getLongVersion().' by Craig Davis'; 66 | } 67 | 68 | public function checkDependencies() 69 | { 70 | $output = new ConsoleOutput(); 71 | if (!extension_loaded('mbstring')) { 72 | $output->writeln( 73 | "\nMissing Dependency: Please install the Multibyte String Functions.\n" . 74 | "More help: http://www.php.net/manual/en/mbstring.installation.php\n", 75 | $this->outputFormat 76 | ); 77 | exit(1); 78 | } 79 | } 80 | 81 | public function registerStyles(&$output) 82 | { 83 | // https://github.com/symfony/Console/blob/master/Formatter/OutputFormatterStyle.php 84 | // http://symfony.com/doc/2.0/components/console/introduction.html#coloring-the-output 85 | // 86 | // * green 87 | // * yellow 88 | // * black text on a cyan background 89 | // * yellow 90 | // * white text on a red background 91 | // * red text on a yellow background 92 | // * blue 93 | // * black on white 94 | 95 | $style = new OutputFormatterStyle('red', 'yellow', array('bold')); 96 | $output->getFormatter()->setStyle('fire', $style); 97 | 98 | $style = new OutputFormatterStyle('blue', 'black', array()); 99 | $output->getFormatter()->setStyle('notice', $style); 100 | 101 | $style = new OutputFormatterStyle('red', 'black', array('bold')); 102 | $output->getFormatter()->setStyle('alert', $style); 103 | 104 | $style = new OutputFormatterStyle('white', 'black', array('bold')); 105 | $output->getFormatter()->setStyle('bold', $style); 106 | 107 | $style = new OutputFormatterStyle('black', 'white', array()); 108 | $output->getFormatter()->setStyle('heading', $style); 109 | 110 | $style = new OutputFormatterStyle('blue', 'black', array('bold')); 111 | $output->getFormatter()->setStyle('logo', $style); 112 | 113 | return $output; 114 | } 115 | 116 | public function statusStyle($status) 117 | { 118 | switch (true) { 119 | case (strpos(strtolower($status), 'closed') === 0): 120 | return 'alert'; 121 | case (strpos(strtolower($status), 'open') === 0): 122 | case (strpos(strtolower($status), 'active') === 0): 123 | return 'logo'; 124 | // fallthrough to final return 125 | } 126 | 127 | return "info"; 128 | } 129 | 130 | public function run(InputInterface $input = null, OutputInterface $output = null) 131 | { 132 | if (null === $input) { 133 | $input = new ArgvInput(); 134 | } 135 | 136 | if (null === $output) { 137 | $output = new ConsoleOutput(); 138 | } 139 | 140 | $this->registerStyles($output); 141 | 142 | // Did they supply a command name? 143 | $name = $this->getCommandName($input); 144 | if ($name) { 145 | // Does the command exist and is not ambiguous? 146 | try { 147 | $command = $this->find($name); 148 | } catch (\Exception $e) { 149 | exit($e->getMessage() . "\n"); 150 | } 151 | } 152 | 153 | return parent::run($input, $output); 154 | } 155 | } 156 | 157 | /* End of file Resume.php */ 158 | -------------------------------------------------------------------------------- /src/Resume/Cli/TwigFormatters.php: -------------------------------------------------------------------------------- 1 | this is a long title 22 | $total_length = strlen($string); 23 | $stripped_length = strlen(strip_tags($string)); 24 | 25 | $length = $length + $total_length - $stripped_length; 26 | 27 | return str_pad(substr($string, 0, $length), $length, " ", $padding); 28 | } 29 | 30 | public static function style($string, $format) 31 | { 32 | return sprintf('<%2$s>%1$s', $string, $format); 33 | } 34 | } 35 | 36 | /* End of file TwigFormatters */ 37 | -------------------------------------------------------------------------------- /src/Resume/Command/HtmlCommand.php: -------------------------------------------------------------------------------- 1 | setName('html') 23 | ->setDescription('Generate an HTML resume from a markdown file') 24 | ->addArgument( 25 | 'source', 26 | InputArgument::REQUIRED, 27 | 'Source markdown document' 28 | ) 29 | ->addArgument( 30 | 'destination', 31 | InputArgument::REQUIRED, 32 | 'Output destination folder' 33 | ) 34 | ->addOption( 35 | 'template', 36 | 't', 37 | InputOption::VALUE_REQUIRED, 38 | 'Which of the templates to use. Use an absolute path for a custom template.' 39 | ) 40 | ->addOption( 41 | 'refresh', 42 | 'r', 43 | InputOption::VALUE_REQUIRED, 44 | 'Regenerate the html and include a meta command to refresh the ' . 45 | 'document every periodically. Measured in seconds.' 46 | ) 47 | ->addOption( 48 | 'output', 49 | 'o', 50 | InputOption::VALUE_REQUIRED, 51 | 'The optional override of default filename to output to' 52 | ); 53 | } 54 | 55 | protected function execute(InputInterface $input, OutputInterface $output) 56 | { 57 | $this->app = $this->getApplication(); 58 | $source = $input->getArgument('source'); 59 | $sourceName = pathinfo($source, PATHINFO_FILENAME); 60 | $destination = rtrim($input->getArgument('destination'), DIRECTORY_SEPARATOR); 61 | $template = $input->getOption('template'); 62 | $refresh = $input->getOption('refresh'); 63 | $optFilename = $input->getOption('output'); 64 | $destFilename = ""; 65 | 66 | if ($optFilename) { 67 | $destFilename = $destination . DIRECTORY_SEPARATOR . $optFilename . '.html'; 68 | } else { 69 | $destFilename = $destination . DIRECTORY_SEPARATOR . $sourceName . '.html'; 70 | } 71 | 72 | $rendered = $this->generateHtml($source, $template, $refresh); 73 | file_put_contents($destFilename, $rendered); 74 | $output->writeln( 75 | sprintf( 76 | 'Wrote resume to: %s', 77 | $destFilename 78 | ), 79 | $this->app->outputFormat 80 | ); 81 | 82 | return true; 83 | } 84 | 85 | protected function generateContent($templatePath, $contentType) 86 | { 87 | // We build these into a single string so that we can deploy this resume as a 88 | // single file. 89 | $assetPath = join(DIRECTORY_SEPARATOR, array($templatePath, $contentType)); 90 | 91 | if (!file_exists($assetPath)) { 92 | return ''; 93 | } 94 | 95 | $assets = array(); 96 | 97 | // Our PHAR deployment can't handle the GlobAsset typically used here 98 | foreach (new \DirectoryIterator($assetPath) as $fileInfo) { 99 | if ($fileInfo->isDot() || !$fileInfo->isFile()) { 100 | continue; 101 | } 102 | array_push($assets, new FileAsset($fileInfo->getPathname())); 103 | } 104 | 105 | usort($assets, function (FileAsset $a, FileAsset $b) { 106 | return strcmp($a->getSourcePath(), $b->getSourcePath()); 107 | }); 108 | 109 | $collection = new AssetCollection( 110 | $assets 111 | ); 112 | 113 | switch ($contentType) { 114 | case 'css': 115 | $collection->ensureFilter(new Filter\LessphpFilter()); 116 | break; 117 | } 118 | 119 | return $collection->dump(); 120 | } 121 | 122 | protected function generateHtml($source, $template, $refresh) 123 | { 124 | // Check that the source file is sane 125 | if (!file_exists($source)) { 126 | throw new \Exception("Unable to open source file: $source"); 127 | } 128 | 129 | // Check that our template is sane, or set to the default one 130 | if (!$template) { 131 | $template = $this->app->defaultTemplate; 132 | } 133 | 134 | if (strpos($template, DIRECTORY_SEPARATOR) !== false) { 135 | $templatePath = realpath($template); 136 | } else { 137 | $templatePath = join(DIRECTORY_SEPARATOR, array($this->app->templatePath, basename($template))); 138 | } 139 | 140 | $templateIndexPath = join(DIRECTORY_SEPARATOR, array($templatePath, 'index.html')); 141 | 142 | if (!file_exists($templateIndexPath)) { 143 | throw new \Exception("Unable to open template file: $templateIndexPath"); 144 | } 145 | 146 | $style = $this->generateContent($templatePath, 'css'); 147 | 148 | $links = $this->generateContent($templatePath, 'links'); 149 | 150 | $templateContent = file_get_contents($templateIndexPath); 151 | $resumeContent = file_get_contents($source); 152 | 153 | // Process with Markdown, and then use SmartyPants to clean up punctuation. 154 | $resumeHtml = MarkdownExtra::defaultTransform($resumeContent); 155 | $resumeHtml = SmartyPants::defaultTransform($resumeHtml); 156 | 157 | // Construct the title for the html document from the h1 and h2 tags 158 | $simpleDom = HtmlDomParser::str_get_html($resumeHtml); 159 | $title = sprintf( 160 | '%s | %s', 161 | $simpleDom->find('h1', 0)->innertext, 162 | $simpleDom->find('h2', 0)->innertext 163 | ); 164 | 165 | // Render the Markdown into an html file with Mustache Templates 166 | $m = new \Mustache_Engine; 167 | $rendered = $m->render($templateContent, array( 168 | 'title' => $title, 169 | 'style' => $style, 170 | 'links' => $links, 171 | 'resume' => $resumeHtml, 172 | 'reload' => (bool) $refresh, 173 | 'refresh_rate' => $refresh 174 | )); 175 | 176 | return $rendered; 177 | } 178 | 179 | protected function determineOutfile($outputFilename) 180 | { 181 | return join(DIRECTORY_SEPARATOR, array($destination, pathinfo($source, PATHINFO_FILENAME) . '.html')); 182 | } 183 | } 184 | 185 | /* End of file HtmlCommand.php */ 186 | -------------------------------------------------------------------------------- /src/Resume/Command/PdfCommand.php: -------------------------------------------------------------------------------- 1 | setName('pdf') 17 | ->setDescription('Generate a PDF from a markdown file') 18 | ->addArgument( 19 | 'source', 20 | InputArgument::REQUIRED, 21 | 'Source markdown document' 22 | ) 23 | ->addArgument( 24 | 'destination', 25 | InputArgument::REQUIRED, 26 | 'Output destination folder' 27 | ) 28 | ->addOption( 29 | 'template', 30 | 't', 31 | InputOption::VALUE_REQUIRED, 32 | 'Which of the templates to use' 33 | ) 34 | ->addOption( 35 | 'htmlonly', 36 | 'H', 37 | InputOption::VALUE_NONE, 38 | 'Only render interim HTML (don\'t run wkhtmltopdf)' 39 | ) 40 | ->addOption( 41 | 'keephtml', 42 | 'k', 43 | InputOption::VALUE_NONE, 44 | 'Keep interim HTML' 45 | ) 46 | ->addOption( 47 | 'pdfargs', 48 | 'p', 49 | InputOption::VALUE_REQUIRED, 50 | 'Passthrough arguments for wkhtmltopdf', 51 | '--dpi 300 -s Letter' 52 | ) 53 | ->addOption( 54 | 'output', 55 | 'o', 56 | InputOption::VALUE_REQUIRED, 57 | 'The optional override of default filename to output to' 58 | ); 59 | } 60 | 61 | protected function execute(InputInterface $input, OutputInterface $output) 62 | { 63 | $this->app = $this->getApplication(); 64 | $source = $input->getArgument('source'); 65 | $sourceName = pathinfo($source, PATHINFO_FILENAME); 66 | $destination = rtrim($input->getArgument('destination'), DIRECTORY_SEPARATOR); 67 | $template = $input->getOption('template'); 68 | $pdfSource = join(DIRECTORY_SEPARATOR, array($destination, '.tmp_pdf_source.html')); 69 | $optFilename = $input->getOption('output'); 70 | $htmlonly = $input->getOption('htmlonly'); 71 | $keephtml = $input->getOption('keephtml'); 72 | $pdfargs = $input->getOption('pdfargs'); 73 | 74 | $destFilename = join(DIRECTORY_SEPARATOR, array($destination, pathinfo($source, PATHINFO_FILENAME) . '.pdf')); 75 | 76 | if ($optFilename) { 77 | $destFilename = $destination . DIRECTORY_SEPARATOR . $optFilename . '.pdf'; 78 | } else { 79 | $destFilename = $destination . DIRECTORY_SEPARATOR . $sourceName . '.pdf'; 80 | } 81 | // Make sure we've got out converter available 82 | exec('wkhtmltopdf -V', $results, $returnVal); 83 | if ($returnVal) { 84 | $output->writeln( 85 | "\nError: Unable to locate wkhtmltopdf.\n" . 86 | " Please make sure that it is installed and available in " . 87 | "your path. \n For installation help, please read: " . 88 | "https://github.com/pdfkit/pdfkit/wiki/Installing-WKHTMLTOPDF \n\n", 89 | $this->app->outputFormat 90 | ); 91 | 92 | return false; 93 | } 94 | 95 | $rendered = $this->generateHtml($source, $template, false); 96 | 97 | // The pdf needs some extra css rules, and so we'll add them here 98 | // to our html document 99 | $simpleDom = HtmlDomParser::str_get_html($rendered); 100 | $body = $simpleDom->find('body', 0); 101 | $body->class = $body->class . ' pdf'; 102 | $rendered = (string) $simpleDom; 103 | 104 | // Save to a temp destination for the pdf renderer to use 105 | file_put_contents($pdfSource, $rendered); 106 | 107 | // command that will be invoked to convert html to pdf 108 | $cmd = "wkhtmltopdf $pdfargs $pdfSource $destFilename"; 109 | 110 | // Process the document with wkhtmltopdf 111 | if(!$htmlonly) 112 | exec($cmd); 113 | 114 | // Unlink the temporary file 115 | if(!($htmlonly || $keephtml)) 116 | unlink($pdfSource); 117 | else 118 | $output->writeln( 119 | sprintf( 120 | "Keeping interim HTML: %s", 121 | $pdfSource 122 | ), 123 | $this->app->outputFormat 124 | ); 125 | 126 | $output->writeln( 127 | sprintf( 128 | "Wrote pdf resume to: %s", 129 | $destFilename 130 | ), 131 | $this->app->outputFormat 132 | ); 133 | 134 | return true; 135 | } 136 | } 137 | 138 | /* End of file PdfCommand.php */ 139 | -------------------------------------------------------------------------------- /src/Resume/Command/StatsCommand.php: -------------------------------------------------------------------------------- 1 | setName('stats') 15 | ->setDescription('Generate a word frequency analysis of your resume') 16 | ->addArgument( 17 | 'source', 18 | InputArgument::REQUIRED, 19 | 'Source markdown document' 20 | ); 21 | } 22 | 23 | protected function execute(InputInterface $input, OutputInterface $output) 24 | { 25 | $this->app = $this->getApplication(); 26 | $source = $input->getArgument('source'); 27 | 28 | $text = file_get_contents($source); 29 | $text = $this->stripCommon($text); 30 | $analysis = array( 31 | 'single' => $this->buildStats($text, 1), 32 | 'double' => $this->buildStats($text, 2), 33 | 'triple' => $this->buildStats($text, 3), 34 | ); 35 | 36 | $template = $this->app->twig->loadTemplate('frequency.twig'); 37 | $view = $template->render($analysis); 38 | $output->write($view, true, $this->app->outputFormat); 39 | 40 | return true; 41 | } 42 | 43 | private function stripCommon($content) 44 | { 45 | $content = preg_replace("/(,|\"|\.|\?|:|!|;|#|-|>|{|\*| - )/", " ", $content); 46 | $content = preg_replace("/\n/", " ", $content); 47 | $content = preg_replace("/\s\s+/", " ", $content); 48 | $content = explode(" ", $content); 49 | 50 | return $content; 51 | } 52 | 53 | // source: https://github.com/benbalter/Frequency-Analysis/blob/master/frequency-analysis.php 54 | private function buildStats($input, $num) 55 | { 56 | $results = array(); 57 | 58 | foreach ($input as $key => $word) { 59 | $phrase = ''; 60 | 61 | //look for every n-word pattern and tally counts in array 62 | for ($i=0; $i < $num; $i++) { 63 | if ($i != 0) { 64 | $phrase .= ' '; 65 | } 66 | if (!empty($input[$key+$i])) { 67 | $phrase .= strtolower($input[$key+$i]); 68 | } 69 | } 70 | if (!isset($results[$phrase])) { 71 | $results[$phrase] = 1; 72 | } else { 73 | $results[$phrase]++; 74 | } 75 | } 76 | if ($num == 1) { 77 | //clean boring words 78 | $a = explode( 79 | " ", 80 | "the of and to a in that it is was i for on you he be with as by " . 81 | "at have are this not but had his they from she which or we an there " . 82 | "her were one do been all their has would will what if can when so my" 83 | ); 84 | foreach ($a as $banned) { 85 | unset($results[$banned]); 86 | } 87 | } 88 | 89 | //sort, clean, return 90 | array_multisort($results, SORT_DESC); 91 | unset($results[""]); 92 | 93 | return $results; 94 | } 95 | } 96 | 97 | /* End of file StatsCommand.php */ 98 | -------------------------------------------------------------------------------- /src/Resume/Command/TemplatesCommand.php: -------------------------------------------------------------------------------- 1 | setName('templates') 14 | ->setDescription('List available templates'); 15 | } 16 | 17 | protected function execute(InputInterface $input, OutputInterface $output) 18 | { 19 | $this->app = $this->getApplication(); 20 | $tplData = array('templates' => array()); 21 | foreach (new \DirectoryIterator($this->app->templatePath) as $fileInfo) { 22 | if ($fileInfo->isDot() || !$fileInfo->isDir()) { 23 | continue; 24 | } 25 | $descriptionPath = $fileInfo->getPathname() . '/description.txt'; 26 | print $descriptionPath . "\n"; 27 | $tplData['templates'][] = (object) array( 28 | 'name' => $fileInfo->getBasename(), 29 | 'description' => file_exists($descriptionPath) 30 | ? trim(file_get_contents($descriptionPath)) 31 | : 'No description available' 32 | ); 33 | } 34 | $template = $this->app->twig->loadTemplate('templates.twig'); 35 | $view = $template->render($tplData); 36 | $output->write($view, true, $this->app->outputFormat); 37 | } 38 | } 39 | 40 | /* End of file TemplatesCommand.php */ 41 | -------------------------------------------------------------------------------- /src/Resume/Command/VersionCommand.php: -------------------------------------------------------------------------------- 1 | setName('version') 14 | ->setDescription('Show current version information'); 15 | } 16 | 17 | protected function execute(InputInterface $input, OutputInterface $output) 18 | { 19 | $this->app = $this->getApplication(); 20 | $output->writeln($this->app->project->version, $this->app->outputFormat); 21 | } 22 | } 23 | 24 | /* End of file VersionCommand.php */ 25 | -------------------------------------------------------------------------------- /src/Resume/Templates/frequency.twig: -------------------------------------------------------------------------------- 1 | ———————————————————————————————————————————————————————————————————————————————— 2 | Word Frequency Analysis 3 | ———————————————————————————————————————————————————————————————————————————————— 4 | 5 | Triple Word Phrases: 6 | {% for phrase, frequency in triple %} 7 | {% if frequency > 1%} 8 | {{frequency|style("info")|pad(3, "right")}} {{phrase}} 9 | {% endif %} 10 | {% endfor %} 11 | 12 | Double Word Phrases: 13 | {% for phrase, frequency in double %} 14 | {% if frequency > 1%} 15 | {{frequency|style("info")|pad(3, "right")}} {{phrase}} 16 | {% endif %} 17 | {% endfor %} 18 | 19 | Single Words: 20 | {% for phrase, frequency in single %} 21 | {% if frequency > 1%} 22 | {{frequency|style("info")|pad(3, "right")}} {{phrase}} 23 | {% endif %} 24 | {% endfor %} 25 | -------------------------------------------------------------------------------- /src/Resume/Templates/templates.twig: -------------------------------------------------------------------------------- 1 | ———————————————————————————————————————————————————————————————————————————————— 2 | Available Templates 3 | ———————————————————————————————————————————————————————————————————————————————— 4 | {% for template in templates %} 5 | {{template.name|style("info")|pad(15, "left")}}{{template.description}} 6 | {% endfor %} 7 | {% if templates|length == 0%} 8 | There are no templates available 9 | {% endif %} 10 | -------------------------------------------------------------------------------- /templates/blockish/css/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 | } 137 | -------------------------------------------------------------------------------- /templates/blockish/css/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/blockish/css/pdf.css: -------------------------------------------------------------------------------- 1 | body.pdf { 2 | color: black; 3 | background: none; 4 | 5 | a { 6 | text-decoration: none; 7 | color: black; 8 | } 9 | .container { 10 | width: 1000px; 11 | margin: 0 auto; 12 | padding: 0; 13 | background: none; 14 | border: none; 15 | border-width: 8px 0 2px 0; 16 | text-align: left; 17 | } 18 | 19 | .resume { 20 | position:relative; 21 | padding: 40px 80px; 22 | 23 | -webkit-box-shadow: none; 24 | box-shadow: none; 25 | } 26 | 27 | a[href$='.pdf'] { 28 | display: none; 29 | } 30 | 31 | h1 { 32 | letter-spacing: 0; 33 | margin-top: 0; 34 | font-size: 48px; 35 | text-transform: uppercase; 36 | font-weight: normal; 37 | } 38 | h2 { 39 | letter-spacing: 0; 40 | text-transform: uppercase; 41 | font-style: italic; 42 | font-weight: normal; 43 | } 44 | h3 { 45 | float: left; 46 | width: 16%; 47 | font-style: normal; 48 | } 49 | h3+p { 50 | float: left; 51 | width: 84%; 52 | } 53 | 54 | blockquote { 55 | top: 45px; 56 | right: 50px; 57 | position: absolute; 58 | } 59 | blockquote a { 60 | color: #F7F2C7; 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 | 114 | } -------------------------------------------------------------------------------- /templates/blockish/css/resume.css: -------------------------------------------------------------------------------- 1 | @headerBackground: #2D6FC7; 2 | @headerColor: #F7F2C7; 3 | 4 | .clearfix { 5 | zoom: 1; 6 | &:after { 7 | display: block; 8 | visibility: hidden; 9 | height: 0; 10 | clear: both; 11 | content: "."; 12 | } 13 | } 14 | 15 | body { 16 | font-family: Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif; 17 | color: #444; 18 | background: #fff url(data:image/png;base64,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); 19 | } 20 | 21 | h1, h2, h3, h4 { 22 | font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif; 23 | color: @headerBackground; 24 | } 25 | 26 | .container { 27 | margin: 0 auto; 28 | padding: 0; 29 | background: #ffffff; 30 | text-align: left; 31 | } 32 | 33 | .resume { 34 | position:relative; 35 | padding: 10px 20px; 36 | 37 | -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, .2); 38 | box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, .2); 39 | } 40 | 41 | a { 42 | color: #375AC5; 43 | } 44 | 45 | blockquote, blockquote a { 46 | color: @headerColor; 47 | background: @headerBackground; 48 | } 49 | 50 | a[href$='.pdf'] { 51 | display: inline-block; 52 | background: #F79A1D; 53 | border: 1px solid #BE7D1D; 54 | color: white; 55 | padding: 6px 12px; 56 | margin-bottom: 6px; 57 | text-decoration: none; 58 | -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, .2); 59 | box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, .2); 60 | -webkit-border-radius: 3px; 61 | -moz-border-radius: 3px; 62 | border-radius: 3px; 63 | } 64 | 65 | blockquote { 66 | margin: 0; 67 | padding: 0; 68 | line-height: 1.4em; 69 | } 70 | 71 | hr { 72 | display: block; 73 | position: relative; 74 | padding: 0; 75 | margin: 18px auto; 76 | width: 100%; 77 | clear: both; 78 | border: none; 79 | font-size: 1px; 80 | line-height: 0; 81 | overflow: visible; 82 | page-break-after: avoid; 83 | } 84 | 85 | h1 { 86 | margin: -40px -50px 0; 87 | padding: 40px 0 0 30px; 88 | font-size: 36px; 89 | letter-spacing: -1px; 90 | font-weight: 900; 91 | text-transform: uppercase; 92 | background: @headerBackground; 93 | border-top: 5px solid #333333; 94 | color: #FFFFFF; 95 | 96 | -webkit-border-top-left-radius: 5px; 97 | -webkit-border-top-right-radius: 5px; 98 | -moz-border-radius-topleft: 5px; 99 | -moz-border-radius-topright: 5px; 100 | border-top-left-radius: 5px; 101 | border-top-right-radius: 5px; 102 | 103 | } 104 | h2 { 105 | background: @headerBackground; 106 | margin: -10px -50px 0; 107 | padding: 0 0 40px 33px; 108 | font-size: 18px; 109 | letter-spacing: -1px; 110 | font-weight: normal; 111 | color: #F7F2C7; 112 | } 113 | 114 | h3 { 115 | margin: 0; 116 | padding: 0 0 .5em; 117 | font-size: 150%; 118 | font-style: italic; 119 | font-weight: normal; 120 | } 121 | 122 | blockquote+hr { 123 | display: none; 124 | } 125 | 126 | h3+p { 127 | margin: .6em 0 16px; 128 | padding: 0; 129 | display: block; 130 | font-size: 104%; 131 | line-height: 24px; 132 | } 133 | 134 | ul { 135 | margin: 0; 136 | padding: 0; 137 | list-style: none; 138 | } 139 | ul li { 140 | margin: 0; 141 | padding: 0; 142 | } 143 | 144 | ul dl { 145 | margin: .3em 0 0; 146 | padding: 0; 147 | width: 100%; 148 | dt { 149 | font-size: 100%; 150 | } 151 | dd { 152 | margin: 0 0 1em; 153 | padding: 0 2em 0 0; 154 | font-size: .8em; 155 | line-height: 1.5em; 156 | } 157 | } 158 | 159 | ol { 160 | margin: 0; 161 | padding: 0 0 .75em; 162 | width: 84%; 163 | display: inline-block; 164 | } 165 | 166 | ol li { 167 | margin: 0 0 0 1em; 168 | padding: 0; 169 | border-top: 1px solid #CCCCCC; 170 | width: 100%; 171 | float: left; 172 | list-style: none; 173 | line-height: 24px; 174 | font-size: 14px; 175 | } 176 | ol li:nth-child(1) { 177 | border-top: none; 178 | } 179 | 180 | dl { 181 | display: inline-block; 182 | width: 75%; 183 | margin: 0; 184 | padding: 0; 185 | dt { 186 | margin: 0; 187 | padding: 0; 188 | font-size: 140%; 189 | } 190 | dd { 191 | margin: 0 0 1.5em; 192 | padding: 0; 193 | font-size: 80%; 194 | line-height: 1.4em; 195 | } 196 | strong { 197 | display: block; 198 | } 199 | em { 200 | display: block; 201 | font-size: 110%; 202 | margin: .15em 0 .5em; 203 | font-style: bold; 204 | } 205 | 206 | } 207 | 208 | 209 | #footer { 210 | display: none; 211 | } 212 | 213 | #footer + p { 214 | width: 100%; 215 | font-size: 11px; 216 | text-align: center; 217 | } 218 | -------------------------------------------------------------------------------- /templates/blockish/css/screen.css: -------------------------------------------------------------------------------- 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 | h1 { 11 | padding: 40px 0 0 40px; 12 | } 13 | h2 { 14 | padding: 0 30px 0 43px; 15 | } 16 | blockquote { 17 | margin: -20px -20px 10px; 18 | padding: 10px 20px 10px; 19 | } 20 | #profile+p { 21 | width: 100%; 22 | margin: 0 -10px; 23 | padding: 10px; 24 | } 25 | } 26 | 27 | 28 | /* 29 | Wide mobile layout 30 | 480-767 px 31 | Zoomed in above 480 px 32 | */ 33 | 34 | @media screen and (min-width: 30em) { 35 | 36 | h1 { 37 | margin: -40px -50px 0; 38 | padding: 40px 0 0 40px; 39 | font-size: 36px; 40 | letter-spacing: -1px; 41 | font-weight: 900; 42 | text-transform: uppercase; 43 | background: @headerBackground; 44 | border-top: 5px solid #333333; 45 | color: #FFFFFF; 46 | } 47 | h2 { 48 | background: @headerBackground; 49 | margin: -10px -50px 0; 50 | padding: 0 0 40px 43px; 51 | font-size: 18px; 52 | letter-spacing: -1px; 53 | font-weight: normal; 54 | color: #F7F2C7; 55 | } 56 | blockquote { 57 | margin-top: -50px; 58 | } 59 | } 60 | 61 | 62 | /* 63 | Tablet layout 64 | 600-911 px 65 | Zoomed in above 600 px 66 | */ 67 | 68 | @media screen and (min-width: 37.5em) { 69 | body { 70 | padding: 20px 0; 71 | } 72 | blockquote { 73 | top: 10px; 74 | right: 50px; 75 | position: absolute; 76 | padding-bottom: 0; 77 | } 78 | h1 { /* Open up the top section height so we don't collapse on the blockquote */ 79 | margin-top: -30px; 80 | padding-left: 40px; 81 | } 82 | h2 { 83 | padding-bottom: 55px; 84 | padding-left: 43px; 85 | } 86 | ol { 87 | margin: 0 0 0 1em; 88 | } 89 | ol li { 90 | width: 50%; 91 | margin: 0; 92 | } 93 | ol li:nth-child(1), ol li:nth-child(2) { 94 | border-top: none; 95 | } 96 | 97 | blockquote { 98 | margin-top: -10px; 99 | } 100 | } 101 | 102 | 103 | /* 104 | Widescreen layout 105 | 912-1887 px 106 | Zoomed in above 912 px 107 | */ 108 | 109 | @media screen and (min-width: 57em) { 110 | .container { 111 | width: 912px; 112 | } 113 | .resume { 114 | position:relative; 115 | padding: 40px 50px; 116 | } 117 | blockquote { 118 | top: 40px; 119 | right: 50px; 120 | position: absolute; 121 | } 122 | h1 { 123 | font-size: 48px; 124 | margin-top: -45px; 125 | } 126 | h2 { 127 | text-transform: uppercase; 128 | letter-spacing: 1px; 129 | font-weight: normal; 130 | } 131 | 132 | h3 { 133 | float: left; 134 | width: 16%; 135 | } 136 | 137 | h3+p { 138 | float: left; 139 | width: 84%; 140 | } 141 | 142 | 143 | 144 | ul li { 145 | width: 28%; 146 | float: left; 147 | } 148 | ul dl { 149 | dt { 150 | font-size: 122%; 151 | font-weight: normal; 152 | margin-bottom: .75em; 153 | } 154 | dd { 155 | padding: 0 4em 0 0; 156 | } 157 | } 158 | 159 | ol { 160 | float: left; 161 | width: 84%; 162 | margin: .6em 0 0; 163 | } 164 | 165 | ol li { 166 | width: 33%; 167 | margin: 0; 168 | } 169 | ol li:nth-child(3n) { 170 | width: 34%; 171 | } 172 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 173 | border-top: none; 174 | } 175 | 176 | dl { 177 | margin: .5em 0 0; 178 | dt { 179 | } 180 | dd { 181 | } 182 | strong { 183 | float: right; 184 | margin-top: -2em; 185 | } 186 | em { 187 | font-size: 130%; 188 | font-style: normal; 189 | } 190 | 191 | } 192 | 193 | 194 | #profile { 195 | display: none; 196 | } 197 | 198 | #profile+p { 199 | padding: 5px 300px 20px 33px; 200 | margin: -30px -50px 20px; 201 | width: (912px - 300px - 33px); 202 | float: none; 203 | background: #2D6FC7; 204 | color: #F7F2C7; 205 | font-family: "Gill Sans", "Gill Sans MT", Calibri, sans-serif; 206 | font-weight: 100; 207 | } 208 | 209 | } 210 | 211 | 212 | /* 213 | Huge-screen layout 214 | 1888-2520 px 215 | Zoomed in above 1920 px 216 | */ 217 | 218 | @media screen and (min-width: 118em) { 219 | 220 | 221 | } -------------------------------------------------------------------------------- /templates/blockish/description.txt: -------------------------------------------------------------------------------- 1 | Blocky and bold colors 2 | -------------------------------------------------------------------------------- /templates/blockish/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 | -------------------------------------------------------------------------------- /templates/modern/css/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 | } 137 | -------------------------------------------------------------------------------- /templates/modern/css/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/modern/css/pdf.css: -------------------------------------------------------------------------------- 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 | h3+p { 46 | float: left; 47 | width: 78%; 48 | } 49 | 50 | blockquote { 51 | top: 40px; 52 | right: 50px; 53 | position: absolute; 54 | } 55 | 56 | ul dl { 57 | margin: 0; 58 | padding: 0.3em 0 0; 59 | dt { 60 | font-size: 122%; 61 | font-weight: normal; 62 | margin: 0 0 .75em; 63 | } 64 | dd { 65 | padding: 0 2em 0 0; 66 | } 67 | } 68 | 69 | ol { 70 | float: left; 71 | width: 79%; 72 | margin: .7em 0 0; 73 | } 74 | 75 | ol li { 76 | width: 33%; 77 | margin: 0; 78 | } 79 | ol li:nth-child(3n) { 80 | width: 34%; 81 | } 82 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 83 | border-top: none; 84 | } 85 | 86 | dl { 87 | margin: .7em 0 0; 88 | page-break-inside: avoid !important; 89 | display: block; 90 | width:79%; 91 | float: left; 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 | } 107 | -------------------------------------------------------------------------------- /templates/modern/css/resume.css: -------------------------------------------------------------------------------- 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: 'Hoefler Text', Times New Roman, Times, serif; 14 | color: #444; 15 | } 16 | h1, h2, h3, h4, ul dl dt { 17 | font-family: Futura, "Century Gothic", AppleGothic, sans-serif; 18 | } 19 | 20 | .container { 21 | margin: 0 auto; 22 | padding: 0; 23 | background: whiteSmoke; 24 | border: solid #666; 25 | border-width: 8px 0 2px 0; 26 | text-align: left; 27 | } 28 | 29 | .resume { 30 | position:relative; 31 | padding: 10px 20px; 32 | } 33 | 34 | a { 35 | color: #990003; 36 | } 37 | 38 | a[href$='.pdf'] { 39 | display: inline-block; 40 | background: #666; 41 | color: white; 42 | padding: 6px 12px; 43 | margin-bottom: 6px; 44 | text-decoration: none; 45 | } 46 | 47 | blockquote { 48 | margin: 0; 49 | padding: 0; 50 | line-height: 1.4em; 51 | } 52 | 53 | hr { 54 | display: block; 55 | position: relative; 56 | padding: 0; 57 | margin: 18px auto; 58 | width: 100%; 59 | clear: both; 60 | border: none; 61 | border-top: 1px solid #CCC; 62 | font-size: 1px; 63 | line-height: 0; 64 | overflow: visible; 65 | page-break-after: avoid; 66 | } 67 | 68 | h1 { 69 | margin: 0; 70 | padding: 0; 71 | font-size: 36px; 72 | letter-spacing: -1px; 73 | font-weight: normal; 74 | } 75 | h2 { 76 | margin: 0; 77 | padding: 0; 78 | font-size: 18px; 79 | font-style: italic; 80 | letter-spacing: -1px; 81 | font-weight: normal; 82 | } 83 | 84 | h3 { 85 | margin: 0px 20px; 86 | padding: 0 0 .5em; 87 | font-size: 150%; 88 | font-style: italic; 89 | font-weight: normal; 90 | } 91 | 92 | h3+p { 93 | margin: .6em 0 16px; 94 | padding: 0; 95 | display: block; 96 | font-size: 104%; 97 | line-height: 24px; 98 | } 99 | 100 | 101 | ul { 102 | margin: 0; 103 | padding: 0; 104 | list-style: none; 105 | display: flex; 106 | flex-wrap: wrap 107 | } 108 | ul li { 109 | margin: 0; 110 | padding: 0; 111 | flex-basis: 33%; 112 | } 113 | 114 | ul dl { 115 | margin: .3em 0 0; 116 | padding: 0; 117 | width: 100%; 118 | dt { 119 | font-size: 100%; 120 | } 121 | dd { 122 | margin: 0 0 1em; 123 | padding: 0 2em 0 0; 124 | font-size: .8em; 125 | line-height: 1.5em; 126 | } 127 | } 128 | 129 | ol { 130 | margin: 0; 131 | padding: 0 0 .75em; 132 | width: 84%; 133 | display: inline-block; 134 | } 135 | 136 | ol li { 137 | margin: 0 0 0 1em; 138 | padding: 0; 139 | border-top: 1px solid #CCCCCC; 140 | width: 100%; 141 | float: left; 142 | list-style: none; 143 | line-height: 24px; 144 | font-size: 14px; 145 | } 146 | ol li:nth-child(1) { 147 | border-top: none; 148 | } 149 | 150 | dl { 151 | display: inline-block; 152 | width: 78%; 153 | margin: 0; 154 | padding: 0; 155 | dt { 156 | margin: 0; 157 | padding: 0; 158 | font-size: 140%; 159 | } 160 | dd { 161 | margin: 0 0 1.5em; 162 | padding: 0; 163 | font-size: 80%; 164 | line-height: 1.4em; 165 | } 166 | strong { 167 | display: block; 168 | } 169 | em { 170 | display: block; 171 | font-size: 110%; 172 | margin: .15em 0 .5em; 173 | font-style: bold; 174 | } 175 | 176 | } 177 | 178 | 179 | #footer { 180 | display: none; 181 | } 182 | 183 | #footer + p { 184 | width: 100%; 185 | font-size: 11px; 186 | text-align: center; 187 | } 188 | -------------------------------------------------------------------------------- /templates/modern/css/screen.css: -------------------------------------------------------------------------------- 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: 78%; 95 | } 96 | 97 | ul dl { 98 | dt { 99 | font-size: 122%; 100 | font-weight: normal; 101 | margin-bottom: .75em; 102 | } 103 | dd { 104 | padding: 0 2em 0 0; 105 | } 106 | } 107 | 108 | ol { 109 | float: left; 110 | width: 79%; 111 | margin: .6em 0 0; 112 | } 113 | 114 | ol li { 115 | width: 33%; 116 | margin: 0; 117 | } 118 | ol li:nth-child(3n) { 119 | width: 34%; 120 | } 121 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 122 | border-top: none; 123 | } 124 | 125 | dl { 126 | margin: .5em 0 0; 127 | dt { 128 | } 129 | dd { 130 | } 131 | strong { 132 | float: right; 133 | margin-top: -2em; 134 | } 135 | em { 136 | font-size: 130%; 137 | font-style: normal; 138 | } 139 | 140 | } 141 | 142 | 143 | } 144 | 145 | 146 | /* 147 | Huge-screen layout 148 | 1888-2520 px 149 | Zoomed in above 1920 px 150 | */ 151 | 152 | @media screen and (min-width: 118em) { 153 | 154 | 155 | } 156 | -------------------------------------------------------------------------------- /templates/modern/description.txt: -------------------------------------------------------------------------------- 1 | Modern and clean layout (default) 2 | -------------------------------------------------------------------------------- /templates/modern/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 | -------------------------------------------------------------------------------- /templates/readable/css/resume.css: -------------------------------------------------------------------------------- 1 | #footer { 2 | display: none; 3 | } 4 | 5 | #footer + p { 6 | width: 100%; 7 | font-size: 11px; 8 | } 9 | -------------------------------------------------------------------------------- /templates/readable/description.txt: -------------------------------------------------------------------------------- 1 | Bootswatch 'readable' theme 2 | -------------------------------------------------------------------------------- /templates/readable/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#reload}} 6 | 7 | {{/reload}} 8 | {{title}} 9 | {{{links}}} 10 | 13 | 14 | 15 |
16 | {{{resume}}} 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /templates/readable/links/bootswatch: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /templates/roboto/css/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 | } 137 | -------------------------------------------------------------------------------- /templates/roboto/css/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/css/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 | } 97 | -------------------------------------------------------------------------------- /templates/roboto/css/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 | } 251 | -------------------------------------------------------------------------------- /templates/roboto/css/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/description.txt: -------------------------------------------------------------------------------- 1 | Layout with static header, format for GitHub link, and Google Roboto font. 2 | -------------------------------------------------------------------------------- /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 | 27 | -------------------------------------------------------------------------------- /templates/swissen/css/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 | } 137 | -------------------------------------------------------------------------------- /templates/swissen/css/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/css/pdf.css: -------------------------------------------------------------------------------- 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 dl { 55 | margin: 0; 56 | padding: 0.3em 0 0; 57 | dt { 58 | font-size: 122%; 59 | font-weight: normal; 60 | margin: 0 0 .75em; 61 | } 62 | dd { 63 | padding: 0 4em 0 0; 64 | } 65 | } 66 | 67 | ol { 68 | float: left; 69 | width: 80%; 70 | margin: .7em 0 0; 71 | } 72 | 73 | ol li { 74 | width: 33%; 75 | margin: 0; 76 | } 77 | ol li:nth-child(3n) { 78 | width: 34%; 79 | } 80 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 81 | border-top: none; 82 | } 83 | 84 | dl { 85 | margin: .7em 0 0; 86 | page-break-inside: avoid !important; 87 | display: block; 88 | dt {} 89 | dd { 90 | } 91 | strong { 92 | float: right; 93 | margin-top: -2em; 94 | } 95 | em { 96 | font-size: 130%; 97 | font-style: normal; 98 | } 99 | 100 | } 101 | 102 | } 103 | -------------------------------------------------------------------------------- /templates/swissen/css/resume.css: -------------------------------------------------------------------------------- 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: flex; 113 | flex-wrap: wrap; 114 | } 115 | ul li { 116 | margin: 0; 117 | padding: 0; 118 | flex-basis: 33%; 119 | } 120 | 121 | ul dl { 122 | margin: .3em 0 0; 123 | padding: 0; 124 | width: 100%; 125 | dt { 126 | font-size: 100%; 127 | } 128 | dd { 129 | margin: 0 0 1em; 130 | padding: 0 2em 0 0; 131 | font-size: .8em; 132 | line-height: 1.5em; 133 | } 134 | } 135 | 136 | ol { 137 | margin: 0; 138 | padding: 0 0 .75em; 139 | width: 80%; 140 | display: inline-block; 141 | } 142 | 143 | ol li { 144 | margin: 0 0 0 1em; 145 | padding: 0; 146 | border-top: 1px solid #CCCCCC; 147 | width: 100%; 148 | float: left; 149 | list-style: none; 150 | line-height: 24px; 151 | font-size: 14px; 152 | } 153 | ol li:nth-child(1) { 154 | border-top: none; 155 | } 156 | 157 | dl { 158 | float:left; 159 | display: block; 160 | /*display: inline-block;*/ 161 | width: 75%; 162 | margin: 0; 163 | padding: 0; 164 | dt { 165 | margin: 0; 166 | padding: 0; 167 | font-size: 140%; 168 | } 169 | dd { 170 | margin: 0 0 1.5em; 171 | padding: 0; 172 | font-size: 80%; 173 | line-height: 1.4em; 174 | } 175 | strong { 176 | display: block; 177 | } 178 | em { 179 | display: block; 180 | font-size: 110%; 181 | margin: .15em 0 .5em; 182 | font-style: bold; 183 | } 184 | 185 | } 186 | 187 | dl dd li{width: 100%; margin: 0 1em 1em; list-style-type: square;} 188 | dl dt{display: block; clear: both;} 189 | dl dt{border-top: 1px solid #ccc; padding-top: 1em;} 190 | h3 + dl dt:first-child{border: 0;padding-top: 0;} 191 | dl dd p:first-child{font-weight: bold; text-transform: uppercase; font-size: 1.2em;} 192 | 193 | ul li dt{border: 0; padding-top: 0;} 194 | 195 | #footer { 196 | display: none; 197 | } 198 | 199 | #footer + p { 200 | width: 100%; 201 | font-size: 11px; 202 | text-align: center; 203 | } 204 | -------------------------------------------------------------------------------- /templates/swissen/css/screen.css: -------------------------------------------------------------------------------- 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 | letter-spacing: -1px; 77 | } 78 | h2 { 79 | text-transform: uppercase; 80 | letter-spacing: 3px; 81 | } 82 | 83 | h3 { 84 | float: left; 85 | width: 20%; 86 | } 87 | 88 | h3+p { 89 | float: left; 90 | width: 80%; 91 | } 92 | ul dl { 93 | dt { 94 | font-size: 122%; 95 | font-weight: normal; 96 | margin-bottom: .75em; 97 | } 98 | dd { 99 | padding: 0 4em 0 0; 100 | } 101 | } 102 | 103 | ol { 104 | float: left; 105 | width: 80%; 106 | margin: .6em 0 0; 107 | } 108 | 109 | ol li { 110 | width: 33%; 111 | margin: 0; 112 | } 113 | ol li:nth-child(3n) { 114 | width: 34%; 115 | } 116 | ol li:nth-child(1), ol li:nth-child(2), ol li:nth-child(3) { 117 | border-top: none; 118 | } 119 | 120 | dl { 121 | /*margin: .5em 0 0;*/ 122 | dt { 123 | } 124 | dd { 125 | } 126 | strong { 127 | float: right; 128 | margin-top: -2em; 129 | } 130 | em { 131 | font-size: 130%; 132 | font-style: normal; 133 | } 134 | 135 | } 136 | 137 | 138 | } 139 | 140 | 141 | /* 142 | Huge-screen layout 143 | 1888-2520 px 144 | Zoomed in above 1920 px 145 | */ 146 | 147 | @media screen and (min-width: 118em) { 148 | 149 | 150 | } 151 | -------------------------------------------------------------------------------- /templates/swissen/description.txt: -------------------------------------------------------------------------------- 1 | Simple Helvetica based layout from Aaron Glenn -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /templates/unstyled/css/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 | } 137 | -------------------------------------------------------------------------------- /templates/unstyled/css/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/unstyled/css/pdf.css: -------------------------------------------------------------------------------- 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 | text-align: left; 15 | } 16 | 17 | a[href$='.pdf'] { 18 | display: none; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /templates/unstyled/css/resume.css: -------------------------------------------------------------------------------- 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 | color: #222; 14 | margin: 1em; 15 | } 16 | 17 | #footer { 18 | display: none; 19 | } 20 | #footer + p { 21 | font-size: 13px; 22 | font-style: italic; 23 | color: #444; 24 | } -------------------------------------------------------------------------------- /templates/unstyled/css/screen.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | Mobile layout 5 | 240–479 px 6 | Zoomed out below 320 px 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 | @media screen and (min-width: 30em) { 18 | } 19 | 20 | 21 | /* 22 | Tablet layout 23 | 600-911 px 24 | Zoomed in above 600 px 25 | */ 26 | @media screen and (min-width: 37.5em) { 27 | 28 | } 29 | 30 | 31 | /* 32 | Widescreen layout 33 | 912-1887 px 34 | Zoomed in above 912 px 35 | */ 36 | @media screen and (min-width: 57em) { 37 | 38 | } 39 | 40 | 41 | /* 42 | Huge-screen layout 43 | 1888-2520 px 44 | Zoomed in above 1920 px 45 | */ 46 | @media screen and (min-width: 118em) { 47 | 48 | 49 | } -------------------------------------------------------------------------------- /templates/unstyled/description.txt: -------------------------------------------------------------------------------- 1 | Unstyled, useful as a base for your own templates 2 | -------------------------------------------------------------------------------- /templates/unstyled/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 | -------------------------------------------------------------------------------- /tests/ListCommandTest.php: -------------------------------------------------------------------------------- 1 | console->find('list'); 11 | $commandTester = new CommandTester($command); 12 | $commandTester->execute(array( 13 | 'command' => $command->getName() 14 | )); 15 | $this->assertRegExp('/Available commands/', $commandTester->getDisplay()); 16 | $this->assertRegExp('/Options/', $commandTester->getDisplay()); 17 | $this->assertRegExp('/list/', $commandTester->getDisplay()); 18 | } 19 | } 20 | 21 | 22 | /* End of file ListCommandTest.php */ 23 | -------------------------------------------------------------------------------- /tests/VersionCommandTest.php: -------------------------------------------------------------------------------- 1 | console->find('version'); 11 | $commandTester = new CommandTester($command); 12 | $commandTester->execute(array( 13 | 'command' => $command->getName() 14 | )); 15 | $this->assertEquals($this->console->project->version, trim($commandTester->getDisplay())); 16 | } 17 | } 18 | 19 | 20 | /* End of file VersionCommandTest.php */ 21 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | add('Resume', __DIR__ . '/../src'); 5 | 6 | use PHPUnit\Framework\TestCase; 7 | use Resume\Cli\Resume; 8 | 9 | class ResumeTest extends TestCase 10 | { 11 | public $console; 12 | 13 | public function setUp() 14 | { 15 | $templatePath = realpath(__DIR__ . '/../templates/'); 16 | $consoleTemplatePath = realpath(__DIR__ . '/../src/Resume/Templates'); 17 | $project = json_decode(file_get_contents(__DIR__ . '/../composer.json')); 18 | $project->version = 0; 19 | 20 | $this->console = new Resume(); 21 | $this->console->initialize($templatePath, $consoleTemplatePath, $project); 22 | } 23 | } 24 | 25 | /* End file bootstrap.php */ 26 | --------------------------------------------------------------------------------