├── .gitignore ├── output ├── favicon.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── style-guide.html ├── projects.html ├── index.html ├── markdown-style-guide.html ├── feed.json ├── feed.xml ├── feed.atom ├── raven-doc.html └── css │ └── site.css ├── themes └── feather │ ├── sass │ ├── media.scss │ ├── site.scss │ ├── functions.scss │ ├── buttons.scss │ ├── structure.scss │ ├── code-highlight.scss │ ├── type.scss │ ├── variables.scss │ ├── html.scss │ ├── logo.scss │ ├── posts.scss │ ├── navigation.scss │ └── normalize.css │ ├── favicons │ ├── favicon.ico │ ├── favicon-16x16.png │ └── favicon-32x32.png │ ├── templates │ ├── index.pug │ ├── post-detail.pug │ ├── pager.pug │ ├── analytics.pug │ ├── disqus.pug │ ├── post.pug │ └── base.pug │ ├── icons │ ├── label.svg │ ├── clock.svg │ ├── codepen.svg │ ├── twitter.svg │ └── github.svg │ └── svg │ └── sprite.symbol.svg ├── content ├── _draft.md ├── future-post.md ├── markdown-style-guide.md └── raven-doc.md ├── .editorconfig ├── README.md ├── package.json └── gulpfile.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /output/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/output/favicon.ico -------------------------------------------------------------------------------- /output/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/output/favicon-16x16.png -------------------------------------------------------------------------------- /output/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/output/favicon-32x32.png -------------------------------------------------------------------------------- /themes/feather/sass/media.scss: -------------------------------------------------------------------------------- 1 | svg { 2 | display: block; 3 | height: 1em; 4 | width: 1em; 5 | } 6 | -------------------------------------------------------------------------------- /themes/feather/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/themes/feather/favicons/favicon.ico -------------------------------------------------------------------------------- /themes/feather/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/themes/feather/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /themes/feather/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mimoduo/raven/HEAD/themes/feather/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /content/_draft.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Draft That B 3 | date: 2017-06-29 4 | category: projects 5 | summary: Drafts are created with an underscore prefix 6 | --- 7 | -------------------------------------------------------------------------------- /themes/feather/templates/index.pug: -------------------------------------------------------------------------------- 1 | extends base 2 | 3 | block pageData 4 | 5 | block content 6 | each post in posts 7 | - detail = false 8 | include post 9 | include pager 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # indicate this is the root of the project 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_style = space 8 | indent_size = 2 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /content/future-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: From the Future 3 | date: 2220-06-29 4 | category: projects 5 | summary: Posts from the future will not be displayed unless their date is older than or equal to the current date 6 | --- 7 | -------------------------------------------------------------------------------- /themes/feather/templates/post-detail.pug: -------------------------------------------------------------------------------- 1 | extends base 2 | 3 | block pageData 4 | - title = post.title 5 | 6 | block content 7 | - detail = true 8 | - postClass = 'post-detail-theme' 9 | include post 10 | -------------------------------------------------------------------------------- /themes/feather/templates/pager.pug: -------------------------------------------------------------------------------- 1 | - var page = 1 2 | 3 | if pager && pager > 1 4 | nav.pager 5 | while page < pager + 1 6 | if page == 1 7 | a.pager-link(href="./")= page 8 | else 9 | a.pager-link(href="page-" + page + ".html")= page 10 | - page++ 11 | -------------------------------------------------------------------------------- /themes/feather/sass/site.scss: -------------------------------------------------------------------------------- 1 | @import "normalize"; 2 | @import "variables"; 3 | @import "functions"; 4 | @import "buttons"; 5 | @import "type"; 6 | @import "logo"; 7 | @import "html"; 8 | @import "media"; 9 | @import "structure"; 10 | @import "navigation"; 11 | @import "posts"; 12 | @import "code-highlight"; 13 | -------------------------------------------------------------------------------- /themes/feather/sass/functions.scss: -------------------------------------------------------------------------------- 1 | @function em($value, $base: 16) { 2 | $newValue: $value / $base * 1em; 3 | 4 | @return $newValue; 5 | } 6 | 7 | @function rem($value) { 8 | $newValue: $value / 16 * 1rem; 9 | 10 | @return $newValue; 11 | } 12 | 13 | @function nu($value, $base) { 14 | $newValue: $value / $base; 15 | 16 | @return $newValue; 17 | } 18 | -------------------------------------------------------------------------------- /themes/feather/sass/buttons.scss: -------------------------------------------------------------------------------- 1 | @mixin button { 2 | display: inline-block; 3 | border: em(2) solid #D0B240; 4 | margin-right: em(8); 5 | margin-bottom: em(8); 6 | padding: em(10) em(20); 7 | font-weight: 700; 8 | background: #000; 9 | color: #fff; 10 | transition: 11 | background .25s, 12 | color .25s; 13 | 14 | &:focus, 15 | &:hover { 16 | background: #D0B240; 17 | color: #000; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /themes/feather/icons/label.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | label_outline 4 | 5 | 6 | -------------------------------------------------------------------------------- /themes/feather/templates/analytics.pug: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /themes/feather/sass/structure.scss: -------------------------------------------------------------------------------- 1 | /* Document */ 2 | 3 | html {} 4 | 5 | body {} 6 | 7 | 8 | /* Grid */ 9 | 10 | @mixin row { 11 | max-width: $mq_min_md + ($gutter * 2); 12 | margin-right: auto; 13 | margin-left: auto; 14 | padding-right: $gutter; 15 | padding-left: $gutter; 16 | } 17 | 18 | .row { 19 | @include row; 20 | } 21 | 22 | 23 | /* Page */ 24 | 25 | .page {} 26 | 27 | .page-body {} 28 | 29 | .page-header { 30 | margin-bottom: em(60); 31 | padding-top: em(60); 32 | } 33 | 34 | .page-footer { 35 | padding: em(60) 0; 36 | } 37 | -------------------------------------------------------------------------------- /themes/feather/icons/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | clock2 4 | 5 | 6 | -------------------------------------------------------------------------------- /themes/feather/sass/code-highlight.scss: -------------------------------------------------------------------------------- 1 | // https://github.com/isagalaev/highlight.js/tree/master/src/styles 2 | 3 | [class^="language"] { 4 | display: block; 5 | overflow-x: auto; 6 | margin-bottom: em(30); 7 | padding: em(20); 8 | background: #272822; 9 | border-radius: em(4); 10 | color: #f8f8f8; 11 | } 12 | 13 | $p1: #80aafc; 14 | $p2: #72cdc6; 15 | 16 | .hljs-comment { 17 | opacity: .45; 18 | } 19 | 20 | .hljs-attribute, 21 | .hljs-keyword { 22 | color: $p1; 23 | } 24 | 25 | .hljs-selector-class, 26 | .hljs-name, 27 | .hljs-string, 28 | .hljs-number, 29 | .hljs-literal { 30 | color: $p2; 31 | } 32 | -------------------------------------------------------------------------------- /themes/feather/templates/disqus.pug: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /themes/feather/sass/type.scss: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Oxygen', sans-serif; 3 | font-size: em(16); 4 | font-weight: 300; 5 | line-height: (28 / 16); 6 | } 7 | 8 | h1, h2, h3, h4, h5, h6 { 9 | font-family: 'Playfair Display', serif; 10 | line-height: 1.25; 11 | margin: rem(50) 0 rem(20); 12 | } 13 | 14 | h1 { 15 | font-size: rem(40); 16 | 17 | @media #{$min_md} { 18 | font-size: rem(50); 19 | } 20 | } 21 | 22 | h2 { 23 | font-size: rem(30); 24 | 25 | @media #{$min_md} { 26 | font-size: rem(40); 27 | } 28 | } 29 | 30 | h3 { 31 | font-size: rem(25); 32 | 33 | @media #{$min_md} { 34 | font-size: rem(30); 35 | } 36 | } 37 | 38 | h4 { 39 | font-size: rem(20); 40 | } 41 | 42 | h5, 43 | h6 { 44 | font-family: 'Oxygen', sans-serif; 45 | text-transform: uppercase; 46 | } 47 | -------------------------------------------------------------------------------- /themes/feather/icons/codepen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | codepen 4 | 5 | 6 | -------------------------------------------------------------------------------- /themes/feather/sass/variables.scss: -------------------------------------------------------------------------------- 1 | $gutter: 20px; 2 | 3 | $mq-min-ht: 800; 4 | $mq-min-xs: 320; 5 | $mq-min-sm: 500; 6 | $mq-min-md: 740; 7 | $mq-min-lg: 980; 8 | $mq-min-xl: 1200; 9 | 10 | $min-xs: "screen and (min-width:" + ($mq-min-xs * 1px) + ")"; 11 | $min-sm: "screen and (min-width:" + ($mq-min-sm * 1px) + ")"; 12 | $min-md: "screen and (min-width:" + ($mq-min-md * 1px) + ")"; 13 | $min-lg: "screen and (min-width:" + ($mq-min-lg * 1px) + ")"; 14 | $min-xl: "screen and (min-width:" + ($mq-min-xl * 1px) + ")"; 15 | 16 | $max-xs: "screen and (max-width:" + ($mq-min-xs - 1px) + ")"; 17 | $max-sm: "screen and (max-width:" + ($mq-min-sm - 1px) + ")"; 18 | $max-md: "screen and (max-width:" + ($mq-min-md - 1px) + ")"; 19 | $max-lg: "screen and (max-width:" + ($mq-min-lg - 1px) + ")"; 20 | $max-xl: "screen and (max-width:" + ($mq-min-xl - 1px) + ")"; 21 | -------------------------------------------------------------------------------- /themes/feather/templates/post.pug: -------------------------------------------------------------------------------- 1 | article.post(class=postClass) 2 | header.post-header 3 | h2.post-title 4 | a.post-link(href=post.link)= post.title 5 | .post-summary 6 | p= post.summary 7 | if detail 8 | .post-details 9 | .post-detail 10 | span.post-detail-icon 11 | +icon("clock") 12 | time(datetime=new Date(post.date)).post-detail-label= post.date 13 | .post-detail 14 | span.post-detail-icon 15 | +icon("label") 16 | span.post-detail-label In  17 | a.post-detail-link(href=post.category + ".html")= post.category 18 | else 19 | a.post-readmore(href=post.link) Read More 20 | if detail 21 | .post-content 22 | != post.markup 23 | footer.post-footer 24 | .post-comments 25 | h2 Your Thoughts 26 | #disqus_thread 27 | include disqus 28 | -------------------------------------------------------------------------------- /themes/feather/icons/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | twitter 4 | 5 | 6 | -------------------------------------------------------------------------------- /themes/feather/icons/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | github 4 | 5 | 6 | -------------------------------------------------------------------------------- /themes/feather/sass/html.scss: -------------------------------------------------------------------------------- 1 | a { 2 | text-decoration: none; 3 | } 4 | 5 | abbr[title] { 6 | text-decoration: none; 7 | } 8 | 9 | code:not([class*="language"]) { 10 | background: #eee; 11 | border: 1px solid #ddd; 12 | border-radius: em(4); 13 | padding: em(2) em(4); 14 | } 15 | 16 | .post-content { 17 | 18 | a { 19 | border-bottom: 1px dotted; 20 | color: #280353; 21 | transition: color .25s; 22 | 23 | &:focus, 24 | &:hover { 25 | color: #D0B240; 26 | } 27 | } 28 | 29 | ul, 30 | ol { 31 | margin: em(20) 0; 32 | 33 | li { 34 | margin-top: em(10); 35 | } 36 | } 37 | 38 | ol { 39 | counter-reset: li; 40 | list-style: none; 41 | padding-left: 1.5em; 42 | 43 | > li { 44 | 45 | &:before { 46 | content: counter(li) ". "; 47 | counter-increment: li; 48 | font-weight: 700; 49 | } 50 | } 51 | } 52 | 53 | blockquote { 54 | margin: em(20) 0; 55 | padding: em(20); 56 | font-size: 125%; 57 | font-weight: 400; 58 | 59 | p { 60 | margin: 0; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /content/markdown-style-guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown Style Guide 3 | date: 2017-06-28 4 | category: style guide 5 | summary: The basics of markdown ready to style! 6 | --- 7 | 8 | # h1 9 | **Heading 1** has *1 pounds sign*. 10 | 11 | ## h2 12 | **Heading 2** has *2 pounds signs*. 13 | 14 | ### h3 15 | **Heading 3** has *3 pounds signs*. 16 | 17 | #### h4 18 | **Heading 4** has *4 pounds signs*. 19 | 20 | ##### h5 21 | **Heading 5** has *5 pounds signs*. 22 | 23 | ###### h6 24 | **Heading 6** has *6 pounds signs*. 25 | 26 | ### Formatting Text 27 | 28 | A paragraph can be as simple as **bolded text** or as hard as *italicized marks*. Yet creating a [link](google.com) can be as easy as pie. 29 | 30 | ### Blockquotes 31 | 32 | > And there's always the trusty blockquote to emphasize an incredible situation. 33 | 34 | ### Unordered List 35 | 36 | * Lists 37 | * are 38 | * just 39 | * as 40 | * simple 41 | 42 | ### Ordered List 43 | 44 | 1. So 45 | 2. are 46 | 3. ordered 47 | 4. lists 48 | 49 | ### Code Snippets 50 | 51 | ```css 52 | .mage { 53 | content: 'code snippet' 54 | } 55 | ``` 56 | 57 | ```js 58 | var delthea = 'orange raven'; 59 | ``` 60 | 61 | ### Tables 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 |
EffectExample
WillstrumsDating a tree back to the 18th century
TashleAssigning a rabbit the name of a turtle
77 | -------------------------------------------------------------------------------- /themes/feather/sass/logo.scss: -------------------------------------------------------------------------------- 1 | .site-title { 2 | position: relative; 3 | display: inline-block; 4 | margin: 1.25em 0 0; 5 | 6 | &:before { 7 | position: absolute; 8 | top: 0; 9 | left: 1.1em; 10 | height: .5em; 11 | width: .5em; 12 | content: ''; 13 | background: 14 | linear-gradient( 15 | -45deg, 16 | #000, 17 | #280353, 18 | #D0B240 19 | ); 20 | box-shadow: 21 | -.5em 0 0 -.075em #000, 22 | -.5em 0 0 0 #D0B240, 23 | 0 -.5em 0 -.075em #000, 24 | 0 -.5em 0 0 #D0B240; 25 | transform: 26 | translate(0, -50%) 27 | scale(.5, 1) 28 | rotate(45deg); 29 | } 30 | } 31 | 32 | .site-link { 33 | display: block; 34 | padding: rem(20) 0; 35 | color: inherit; 36 | 37 | &:before, 38 | &:after { 39 | position: absolute; 40 | bottom: 100%; 41 | height: .75em; 42 | width: .75em; 43 | content: ''; 44 | } 45 | 46 | &:before { 47 | right: 100%; 48 | margin-right: -1.185em; 49 | background: 50 | linear-gradient( 51 | 145deg, 52 | #000, 53 | #280353 54 | ); 55 | transform-origin: right bottom; 56 | transform: 57 | rotate(18deg) 58 | skew(45deg); 59 | } 60 | 61 | &:after { 62 | left: 1.525em; 63 | background: 64 | linear-gradient( 65 | -145deg, 66 | #000, 67 | #280353 68 | ); 69 | transform-origin: left bottom; 70 | transform: 71 | rotate(-18deg) 72 | skew(-45deg); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /themes/feather/sass/posts.scss: -------------------------------------------------------------------------------- 1 | .post { 2 | border-bottom: 1px solid #D0B240; 3 | margin-bottom: em(40); 4 | padding-bottom: em(40); 5 | 6 | &:last-child { 7 | border-bottom: 0; 8 | margin-bottom: 0; 9 | padding-bottom: 0; 10 | } 11 | } 12 | 13 | .post-header { 14 | 15 | .post-detail-theme & { 16 | margin-bottom: em(40); 17 | } 18 | } 19 | 20 | .post-title {} 21 | 22 | .post-link { 23 | display: inline-block; 24 | color: #280353; 25 | transition: color .25s; 26 | 27 | &:before { 28 | display: inline-block; 29 | vertical-align: middle; 30 | height: .25em; 31 | width: .25em; 32 | margin-right: em(5); 33 | content: ''; 34 | background: #D0B240; 35 | transform: rotate(45deg); 36 | } 37 | 38 | &:focus, 39 | &:hover { 40 | color: #D0B240; 41 | } 42 | } 43 | 44 | .post-summary { 45 | font-size: 125%; 46 | } 47 | 48 | .post-details {} 49 | 50 | .post-detail { 51 | margin-bottom: em(10); 52 | 53 | &:last-child { 54 | margin-bottom: 0; 55 | } 56 | } 57 | 58 | .post-detail-icon { 59 | display: inline-block; 60 | vertical-align: middle; 61 | margin-right: em(15); 62 | } 63 | 64 | .post-detail-label { 65 | display: inline-block; 66 | vertical-align: middle; 67 | } 68 | 69 | .post-detail-link { 70 | border-bottom: 1px dotted; 71 | font-weight: 700; 72 | color: inherit; 73 | } 74 | 75 | .post-readmore { 76 | @include button; 77 | } 78 | 79 | .post-content {} 80 | 81 | .post-footer {} 82 | 83 | .post-comments { 84 | padding: em(40) 0; 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![raven logo](https://image.prntscr.com/image/0cI781sNT1KgO53d6CWfdQ.png) 2 | 3 | # Raven 4 | 5 | > Raven is a *theme-able and flexible* **static blog generator** fed with Markdown and processed with gulp, pug, and sass built with lightning, simplicity, and awesomeness in mind. 6 | 7 | ## Features 8 | 9 | * ⚡ **Fast (re)build times** and *completely static output* 10 | * **Semantic HTML boilerplate** written in [Pug](https://github.com/pugjs/pug) 11 | * **Theme-able CSS boilerplate** written in [Sass](http://sass-lang.com/guide) 12 | * **Live reloading** and device synchronization 13 | * Automatic **syntax highlighting** via [highlight.js](https://highlightjs.org/) 14 | * Integration boilerplate for Disqus and Google Analytics 15 | * Automatically generated RSS feeds with rss2, atom1, and json1 support 16 | * Streamlined [surge.sh](http://surge.sh/help/getting-started-with-surge) deployments 17 | * Drafts and future post publication support 18 | 19 | ## Getting Started 20 | 21 | Once you're set with [npm](https://nodejs.org/en/), whip out your terminal and enter in the following: 22 | 23 | ```ssh 24 | git clone https://github.com/mimoduo/raven.git 25 | cd raven 26 | sudo npm install gulp-cli -g 27 | npm install 28 | gulp 29 | ``` 30 | 31 | *That's it*! **Raven will spin up a live reload server and begin to watch for any changes**. At this point, you're either ready to dive right in (especially for those familiar with Pelican blogs) or take a peak into the [raven doc](https://github.com/mimoduo/raven/blob/master/content/raven-doc.md). 32 | 33 | ## Contributions 34 | 35 | **Contributions are welcome**! *Ask ahead of time if there's any new feature or modification you'd like to add/make*. You wouldn't wanna spend a whole bunch of time on something that may be rejected. 36 | 37 | ## Blogs Running Raven 38 | 39 | The best kind of contribution is a **successful blog**. Add yours below for extra recognition in the github spotlight ;) 40 | 41 | * [mimoduo](http://mimoduo.surge.sh/) 42 | * [raven](http://raven.surge.sh/) 43 | * [your blog](#) 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "raven", 3 | "version": "0.6.0", 4 | "description": "A refined and flexible static blog generator", 5 | "keywords": [ 6 | "blog", 7 | "boilerplate", 8 | "gulp", 9 | "pug", 10 | "sass", 11 | "markdown" 12 | ], 13 | "author": "Bryan Stoner", 14 | "email": "mimoduo@gmail.com", 15 | "link": "http://mimoduo.surge.sh/", 16 | "license": "MIT", 17 | "data": { 18 | "site": { 19 | "name": "Raven", 20 | "description": "A refined and flexible static blog generator", 21 | "url": "http://raven.surge.sh/" 22 | }, 23 | "fonts": [ 24 | { 25 | "family": "Playfair+Display", 26 | "weights": "400" 27 | }, 28 | { 29 | "family": "Oxygen", 30 | "weights": "300,400,700" 31 | } 32 | ], 33 | "analytics": { 34 | "include": true, 35 | "UA": "UA-66664949-3" 36 | }, 37 | "disqus": { 38 | "include": true, 39 | "shortname": "raven-blog" 40 | }, 41 | "static": "output", 42 | "theme": "themes/feather", 43 | "templates": "themes/feather", 44 | "pager": 8, 45 | "links": { 46 | "social": [ 47 | { 48 | "name": "Github", 49 | "url": "https://github.com/mimoduo" 50 | }, 51 | { 52 | "name": "Codepen", 53 | "url": "https://codepen.io/mimoduo/" 54 | } 55 | ] 56 | } 57 | }, 58 | "devDependencies": { 59 | "autoprefixer": "^7.1.5", 60 | "browser-sync": "^2.18.13", 61 | "del": "^3.0.0", 62 | "feed": "^1.1.0", 63 | "front-matter": "^2.2.0", 64 | "fs": "0.0.1-security", 65 | "globby": "^6.1.0", 66 | "gulp": "^3.9.1", 67 | "gulp-front-matter": "^1.3.0", 68 | "gulp-postcss": "^7.0.0", 69 | "gulp-pug": "^3.3.0", 70 | "gulp-sass": "^3.1.0", 71 | "gulp-sass-glob": "^1.0.8", 72 | "gulp-surge": "^0.1.0", 73 | "gulp-svg-sprite": "^1.3.7", 74 | "gulp-svgmin": "^1.2.4", 75 | "highlight.js": "^9.12.0", 76 | "hljs": "^6.2.3", 77 | "markdown-it": "^8.4.0", 78 | "markdown-it-named-headers": "0.0.4", 79 | "pug": "^2.0.0-rc.4", 80 | "require-reload": "^0.2.2" 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /themes/feather/sass/navigation.scss: -------------------------------------------------------------------------------- 1 | /* Main Nav */ 2 | 3 | .main-nav {} 4 | 5 | .main-nav-list { 6 | display: inline-block; 7 | margin: 0; 8 | padding: em(4); 9 | list-style: none; 10 | background: 11 | linear-gradient( 12 | -45deg, 13 | #000, 14 | #280353 80%, 15 | #D0B240 100% 16 | ); 17 | } 18 | 19 | .main-nav-item { 20 | display: inline-block; 21 | } 22 | 23 | .main-nav-link { 24 | display: block; 25 | padding: em(10) em(20); 26 | font-weight: 700; 27 | color: #fff; 28 | transition: 29 | background .25s, 30 | color .25s; 31 | 32 | &:focus, 33 | &:hover { 34 | background: #fff; 35 | color: #000; 36 | } 37 | } 38 | 39 | 40 | /* Social Nav */ 41 | 42 | .social-nav {} 43 | 44 | .social-nav-list { 45 | margin: 0; 46 | padding: 0; 47 | list-style: none; 48 | } 49 | 50 | .social-nav-item { 51 | display: inline-block; 52 | margin: 0 em(30) 0 0; 53 | } 54 | 55 | .social-nav-link { 56 | display: block; 57 | color: #000; 58 | transition: color .25s; 59 | 60 | &:focus, 61 | &:hover { 62 | color: #D0B240; 63 | } 64 | } 65 | 66 | .social-nav-icon { 67 | display: inline-block; 68 | margin-right: em(5); 69 | vertical-align: middle; 70 | } 71 | 72 | .social-nav-label { 73 | display: inline-block; 74 | font-size: 125%; 75 | font-weight: 700; 76 | vertical-align: middle; 77 | } 78 | 79 | 80 | /* Pager */ 81 | 82 | .pager {} 83 | 84 | .pager-link { 85 | position: relative; 86 | display: inline-block; 87 | margin-right: em(10); 88 | padding: em(5) em(10); 89 | font-weight: 700; 90 | color: #000; 91 | transition: color .25s; 92 | 93 | &:focus, 94 | &:hover { 95 | color: #D0B240; 96 | } 97 | 98 | &:after { 99 | position: absolute; 100 | top: 50%; 101 | left: 100%; 102 | width: em(10); 103 | display: inline-block; 104 | border-bottom: 1px solid #280353; 105 | vertical-align: middle; 106 | content: ''; 107 | } 108 | 109 | &:last-child { 110 | 111 | &:after { 112 | display: none; 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /themes/feather/svg/sprite.symbol.svg: -------------------------------------------------------------------------------- 1 | clock2codepengithublabel_outlinetwitter -------------------------------------------------------------------------------- /themes/feather/templates/base.pug: -------------------------------------------------------------------------------- 1 | mixin icon(name) 2 | svg.symbol(class="symbol-" + name.toLowerCase()) 3 | use(xlink:href="#" + name.toLowerCase()) 4 | 5 | block pageData 6 | - title = "" 7 | - description = "" 8 | 9 | doctype html 10 | html(lang="en") 11 | head 12 | meta( 13 | http-equiv="X-UA-Compatible" 14 | content="IE=edge" 15 | ) 16 | meta(charset="utf-8") 17 | meta( 18 | name="viewport" 19 | content="width=device-width, initial-scale=1.0" 20 | ) 21 | if title 22 | title=data.site.name + ' | ' + title 23 | else 24 | title=data.site.name 25 | if description 26 | meta( 27 | name="description" 28 | content=description 29 | ) 30 | else 31 | meta( 32 | name="description" 33 | content=data.site.description 34 | ) 35 | mixin favicon(sizes) 36 | each size in sizes 37 | link( 38 | rel="icon" 39 | href="favicon-" + size + "x" + size + ".png" 40 | sizes=size + "x" + size 41 | type="image/png" 42 | ) 43 | +favicon([16, 32]) 44 | link( 45 | rel="stylesheet" 46 | href="css/site.css" 47 | ) 48 | - includedFonts = ""; 49 | each font, index in data.fonts 50 | if index > 0 51 | - includedFonts += "|" 52 | - includedFonts += font.family + ":" 53 | - includedFonts += font.weights 54 | link( 55 | href="https://fonts.googleapis.com/css?family=" + includedFonts 56 | rel="stylesheet" 57 | ) 58 | link( 59 | href="feed.atom" 60 | type="application/atom+xml" 61 | rel="alternate" 62 | title=data.site.name + " Atom Feed" 63 | ) 64 | link( 65 | href="feed.xml" 66 | type="application/rss+xml" 67 | rel="alternate" 68 | title=data.site.name + " RSS Feed" 69 | ) 70 | link( 71 | href="feed.json" 72 | type="application/json" 73 | rel="alternate" 74 | title=data.site.name + " JSON Feed" 75 | ) 76 | body.page 77 | figure(style="display: none") 78 | include ../svg/sprite.symbol.svg 79 | header.page-header 80 | .row 81 | .page-header-content 82 | h1.site-title 83 | a.site-link(href="./")= data.site.name 84 | nav.main-nav 85 | ul.main-nav-list 86 | each category in categories 87 | li.main-nav-item 88 | a.main-nav-link(href=category.url)= category.name 89 | main.page-main 90 | .row 91 | .page-main-content 92 | block content 93 | footer.page-footer 94 | .row 95 | .page-footer-content 96 | nav.social-nav 97 | ul.social-nav-list 98 | each link in data.links.social 99 | li.social-nav-item 100 | a.social-nav-link(href=link.url) 101 | span.social-nav-icon 102 | +icon(link.name) 103 | span.social-nav-label= link.name 104 | if data.analytics.include 105 | include analytics 106 | -------------------------------------------------------------------------------- /output/style-guide.html: -------------------------------------------------------------------------------- 1 | Raven
clock2codepengithublabel_outlinetwitter
-------------------------------------------------------------------------------- /output/projects.html: -------------------------------------------------------------------------------- 1 | Raven
clock2codepengithublabel_outlinetwitter

Raven Documentation

AAWWW yeaaa!!! Time to get drilling down to the Raven blog workflow - from getting familiar with Raven's structure to creating your own theme. If you're familiar with Pelican, you'll feel right at home (p^-^)p

Read More
-------------------------------------------------------------------------------- /output/index.html: -------------------------------------------------------------------------------- 1 | Raven
clock2codepengithublabel_outlinetwitter

Raven Documentation

AAWWW yeaaa!!! Time to get drilling down to the Raven blog workflow - from getting familiar with Raven's structure to creating your own theme. If you're familiar with Pelican, you'll feel right at home (p^-^)p

Read More
-------------------------------------------------------------------------------- /content/raven-doc.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Raven Documentation 3 | date: 2017-06-29 4 | category: projects 5 | summary: AAWWW yeaaa!!! Time to get drilling down to the Raven blog workflow - from getting familiar with Raven's structure to creating your own theme. If you're familiar with Pelican, you'll feel right at home (p^-^)p 6 | --- 7 | 8 | ### Installing Raven 9 | 10 | Once you're set with [npm](https://nodejs.org/en/), whip out your terminal and enter in the following: 11 | 12 | ```ssh 13 | git clone https://github.com/mimoduo/raven.git 14 | cd raven 15 | sudo npm install gulp-cli -g 16 | npm install 17 | gulp 18 | ``` 19 | 20 | > **That's it!** Gulp will begin to process all posts, spin up a live reload server, and begin watching for any post, template, icon, or style changes. 21 | 22 | **Now you're officially ready to start creating your new blog by**: 23 | 24 | * [learning Raven's folder structure](#wheres-your), 25 | * [learning how Raven works](#how-raven-works), 26 | * [configuring your blog's settings](#configuring-raven), 27 | * [structuring your blog](#structuring-your-blog), 28 | * [styling your blog](#styling-your-blog), 29 | * and [creating markdown content](#creating-content)! 30 | 31 | ## Where's Your @&#* 32 | 33 | First, let's start with some of the basics of Raven by detailing where everything is: 34 | 35 | * **content**: markdown files representing your blog posts 36 | * **output**: static files generated based on the theme and content 37 | * **themes**: appearance and markup of your blog 38 | 39 | ## How Raven Works 40 | 41 | Raven grabs all the markdown files you've written in the content folder and processes them as such: 42 | 43 | **markdown >> json >> pug :: index/post-detail/categories pages** 44 | 45 | 1. Retrieves the contents of each markdown file 46 | 2. Processes the file's front matter field 47 | 3. Renders the file's markdown content into viable HTML 48 | 4. Pushes a json object representation of the file to a blog array 49 | 5. Sorts the newly created array by date 50 | 6. Sorts the articles by category 51 | 7. Compiles index pages using the blog array 52 | 8. Compiles post detail pages using the blog array 53 | 8. Compiles category pages using the blog array 54 | 55 | ## Configuring Raven 56 | 57 | Raven pulls in the `"data"` object from the **package.json** file to render your blog. *Feel free to add key: value pairs here to help better represent your blog*: 58 | 59 | ```js 60 | "data": { 61 | "site": { 62 | "name": "raven", 63 | "url": "raven.surge.sh" 64 | }, 65 | "fonts": [ 66 | { 67 | "family": "Oxygen", 68 | "weights": "300,400,700" 69 | } 70 | ], 71 | "analytics": true, 72 | "disqus": { 73 | "include": true, 74 | "shortname": "raven-blog" 75 | }, 76 | "static": "output", 77 | "theme": "themes/feather", 78 | "templates": "themes/feather", 79 | "pager": 8, 80 | "links": { 81 | "social": [ 82 | { 83 | "name": "Github", 84 | "url": "https://github.com" 85 | }, 86 | { 87 | "name": "Codepen", 88 | "url": "https://codepen.io" 89 | } 90 | ] 91 | } 92 | } 93 | ``` 94 | 95 | ### Data Object Reference 96 | 97 | * **fonts**: provides pug the data needed to dynamically pull google fonts 98 | * **static**: determines the output directory of static content 99 | * **theme**: determines which sass theme folder to pull from 100 | * **templates**: determines which pug templates folder to pull from 101 | * **pager**: the amount of posts on each index page 102 | 103 | ### Using Data Within Templates 104 | 105 | Data can be referenced within pug by **evaluating template locals**: 106 | 107 | ```pug 108 | //- Render the site name from data: { site: { name: ""}} 109 | h1= data.site.name 110 | p Thanks to the power of Raven my blog, #{data.site.name}, was possible! 111 | 112 | //- Render each link from data: { links: { social: []}} 113 | each link in data.links.social 114 | a(href=link.url)= link.name 115 | 116 | //- Render arbitrary values from data: { custom: ""} 117 | h2= data.custom 118 | ``` 119 | 120 | ## Structuring Your Blog 121 | 122 | The first thing you'll likely want to do is modify the templates a bit, starting from base.pug. If you haven't written in pug before, here's an [awesome pug tutorial](http://mimoduo.surge.sh/learn-pug-js-with-pugs.html) for you! 123 | 124 | > **Remember**, all of the variables used within each template are provided to pug from your *package.json's* `"data"` *object* and *each markdown post's front matter*. 125 | 126 | **base.pug** is the foundational template that provides the structure to all other page templates, namely: 127 | 128 | * **index.pug**: *list view for blog articles* 129 | * **post-detail.pug**: *detail view for a specific blog article* 130 | 131 | All other templates are considered **partials** that are included on the aforementioned templates: 132 | 133 | * **post.pug**: foundational template to represent each post 134 | * **pager.pug**: provides the ability to chunk your blog list 135 | * **analytics.pug**: *conditionally included based on your blog's settings* 136 | * **disqus.pug**: *conditionally included based on your blog's settings* 137 | 138 | ## Styling Your Blog 139 | 140 | All of the classes used within the base templates are available to style within the **feather theme** under `/themes/feather/sass/*`. For those new to Sass, here's a quick [sass cheat sheet](https://codepen.io/mimoduo/post/sass-cheat-sheet) for you! 141 | 142 | There are a few utility files to help you through development: 143 | 144 | * normalize.css: *basic reset for browser consistency* 145 | * functions.scss: *several inline font sizing functions for ems & rems* 146 | * variables.scss: *grid variables & a space for custom variables* 147 | 148 | ### Creating Your Own Theme 149 | 150 | Creating your own theme is a piece of cake. Since Raven treats markup and styles separately, you can continue to use the feather theme templates while developing your own theme outside of feather. *Just reconfigure your blog's settings to point to a different theme folder*: 151 | 152 | ```json 153 | "data": { 154 | "theme": "themes/yourTheme" 155 | } 156 | ``` 157 | 158 | Afterwards, make sure that your new theme folder contains the following folder structure for gulp to process Sass correctly: 159 | 160 | `/themes/yourTheme/sass/site.scss` 161 | 162 | ## Creating Content 163 | 164 | Each blog article is written in **Markdown** with the addition of **front matter**. If you're diggin for a markdown tutorial, [daring fireball](https://daringfireball.net/projects/markdown/syntax) has you covered! The following front matter meets the minimum requirements for a blog article: 165 | 166 | ```md 167 | --- 168 | title: Blog Post Title Field 169 | date: 2017-07-24 170 | category: navie 171 | summary: Blog Post Summary Field 172 | --- 173 | 174 | # Your Markdown Content! 175 | ``` 176 | 177 | After saving this post, you'll notice a new entry on the index page, a new detail page, and a new category in the main navigation. 178 | 179 | ## Fly With the Wind! 180 | 181 | All the basics of Raven have been covered! There's a bit more to explore and a lot more on the way. I hope you enjoy publishing your blog with Raven! And if you have already published your blog, wouldn't you want some free recognition? Jump over to the [Raven github repo](https://github.com/mimoduo/raven) and add your blog to the [Blogs Running Raven](https://github.com/mimoduo/raven#blogs-running-raven) section. 182 | -------------------------------------------------------------------------------- /output/markdown-style-guide.html: -------------------------------------------------------------------------------- 1 | Raven | Markdown Style Guide
clock2codepengithublabel_outlinetwitter

Markdown Style Guide

The basics of markdown ready to style!

In style guide

h1

2 |

Heading 1 has 1 pounds sign.

3 |

h2

4 |

Heading 2 has 2 pounds signs.

5 |

h3

6 |

Heading 3 has 3 pounds signs.

7 |

h4

8 |

Heading 4 has 4 pounds signs.

9 |
h5
10 |

Heading 5 has 5 pounds signs.

11 |
h6
12 |

Heading 6 has 6 pounds signs.

13 |

Formatting Text

14 |

A paragraph can be as simple as bolded text or as hard as italicized marks. Yet creating a link can be as easy as pie.

15 |

Blockquotes

16 |
17 |

And there's always the trusty blockquote to emphasize an incredible situation.

18 |
19 |

Unordered List

20 |
    21 |
  • Lists
  • 22 |
  • are
  • 23 |
  • just
  • 24 |
  • as
  • 25 |
  • simple
  • 26 |
27 |

Ordered List

28 |
    29 |
  1. So
  2. 30 |
  3. are
  4. 31 |
  5. ordered
  6. 32 |
  7. lists
  8. 33 |
34 |

Code Snippets

35 |
.mage {
36 |   content: 'code snippet'
37 | }
38 | 
39 |
var delthea = 'orange raven';
40 | 
41 |

Tables

42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
EffectExample
WillstrumsDating a tree back to the 18th century
TashleAssigning a rabbit the name of a turtle
56 |
-------------------------------------------------------------------------------- /themes/feather/sass/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in 9 | * IE on Windows Phone and in iOS. 10 | */ 11 | 12 | html { 13 | line-height: 1.15; /* 1 */ 14 | -ms-text-size-adjust: 100%; /* 2 */ 15 | -webkit-text-size-adjust: 100%; /* 2 */ 16 | } 17 | 18 | /* Sections 19 | ========================================================================== */ 20 | 21 | /** 22 | * Remove the margin in all browsers (opinionated). 23 | */ 24 | 25 | body { 26 | margin: 0; 27 | } 28 | 29 | /** 30 | * Add the correct display in IE 9-. 31 | */ 32 | 33 | article, 34 | aside, 35 | footer, 36 | header, 37 | nav, 38 | section { 39 | display: block; 40 | } 41 | 42 | /** 43 | * Correct the font size and margin on `h1` elements within `section` and 44 | * `article` contexts in Chrome, Firefox, and Safari. 45 | */ 46 | 47 | h1 { 48 | font-size: 2em; 49 | margin: 0.67em 0; 50 | } 51 | 52 | /* Grouping content 53 | ========================================================================== */ 54 | 55 | /** 56 | * Add the correct display in IE 9-. 57 | * 1. Add the correct display in IE. 58 | */ 59 | 60 | figcaption, 61 | figure, 62 | main { /* 1 */ 63 | display: block; 64 | } 65 | 66 | /** 67 | * Add the correct margin in IE 8. 68 | */ 69 | 70 | figure { 71 | margin: 1em 40px; 72 | } 73 | 74 | /** 75 | * 1. Add the correct box sizing in Firefox. 76 | * 2. Show the overflow in Edge and IE. 77 | */ 78 | 79 | hr { 80 | box-sizing: content-box; /* 1 */ 81 | height: 0; /* 1 */ 82 | overflow: visible; /* 2 */ 83 | } 84 | 85 | /** 86 | * 1. Correct the inheritance and scaling of font size in all browsers. 87 | * 2. Correct the odd `em` font sizing in all browsers. 88 | */ 89 | 90 | pre { 91 | font-family: monospace, monospace; /* 1 */ 92 | font-size: 1em; /* 2 */ 93 | } 94 | 95 | /* Text-level semantics 96 | ========================================================================== */ 97 | 98 | /** 99 | * 1. Remove the gray background on active links in IE 10. 100 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 101 | */ 102 | 103 | a { 104 | background-color: transparent; /* 1 */ 105 | -webkit-text-decoration-skip: objects; /* 2 */ 106 | } 107 | 108 | /** 109 | * 1. Remove the bottom border in Chrome 57- and Firefox 39-. 110 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 111 | */ 112 | 113 | abbr[title] { 114 | border-bottom: none; /* 1 */ 115 | text-decoration: underline; /* 2 */ 116 | text-decoration: underline dotted; /* 2 */ 117 | } 118 | 119 | /** 120 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 121 | */ 122 | 123 | b, 124 | strong { 125 | font-weight: inherit; 126 | } 127 | 128 | /** 129 | * Add the correct font weight in Chrome, Edge, and Safari. 130 | */ 131 | 132 | b, 133 | strong { 134 | font-weight: bold; 135 | } 136 | 137 | /** 138 | * 1. Correct the inheritance and scaling of font size in all browsers. 139 | * 2. Correct the odd `em` font sizing in all browsers. 140 | */ 141 | 142 | code, 143 | kbd, 144 | samp { 145 | font-family: monospace, monospace; /* 1 */ 146 | font-size: 1em; /* 2 */ 147 | } 148 | 149 | /** 150 | * Add the correct font style in Android 4.3-. 151 | */ 152 | 153 | dfn { 154 | font-style: italic; 155 | } 156 | 157 | /** 158 | * Add the correct background and color in IE 9-. 159 | */ 160 | 161 | mark { 162 | background-color: #ff0; 163 | color: #000; 164 | } 165 | 166 | /** 167 | * Add the correct font size in all browsers. 168 | */ 169 | 170 | small { 171 | font-size: 80%; 172 | } 173 | 174 | /** 175 | * Prevent `sub` and `sup` elements from affecting the line height in 176 | * all browsers. 177 | */ 178 | 179 | sub, 180 | sup { 181 | font-size: 75%; 182 | line-height: 0; 183 | position: relative; 184 | vertical-align: baseline; 185 | } 186 | 187 | sub { 188 | bottom: -0.25em; 189 | } 190 | 191 | sup { 192 | top: -0.5em; 193 | } 194 | 195 | /* Embedded content 196 | ========================================================================== */ 197 | 198 | /** 199 | * Add the correct display in IE 9-. 200 | */ 201 | 202 | audio, 203 | video { 204 | display: inline-block; 205 | } 206 | 207 | /** 208 | * Add the correct display in iOS 4-7. 209 | */ 210 | 211 | audio:not([controls]) { 212 | display: none; 213 | height: 0; 214 | } 215 | 216 | /** 217 | * Remove the border on images inside links in IE 10-. 218 | */ 219 | 220 | img { 221 | border-style: none; 222 | } 223 | 224 | /** 225 | * Hide the overflow in IE. 226 | */ 227 | 228 | svg:not(:root) { 229 | overflow: hidden; 230 | } 231 | 232 | /* Forms 233 | ========================================================================== */ 234 | 235 | /** 236 | * 1. Change the font styles in all browsers (opinionated). 237 | * 2. Remove the margin in Firefox and Safari. 238 | */ 239 | 240 | button, 241 | input, 242 | optgroup, 243 | select, 244 | textarea { 245 | font-family: sans-serif; /* 1 */ 246 | font-size: 100%; /* 1 */ 247 | line-height: 1.15; /* 1 */ 248 | margin: 0; /* 2 */ 249 | } 250 | 251 | /** 252 | * Show the overflow in IE. 253 | * 1. Show the overflow in Edge. 254 | */ 255 | 256 | button, 257 | input { /* 1 */ 258 | overflow: visible; 259 | } 260 | 261 | /** 262 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 263 | * 1. Remove the inheritance of text transform in Firefox. 264 | */ 265 | 266 | button, 267 | select { /* 1 */ 268 | text-transform: none; 269 | } 270 | 271 | /** 272 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 273 | * controls in Android 4. 274 | * 2. Correct the inability to style clickable types in iOS and Safari. 275 | */ 276 | 277 | button, 278 | html [type="button"], /* 1 */ 279 | [type="reset"], 280 | [type="submit"] { 281 | -webkit-appearance: button; /* 2 */ 282 | } 283 | 284 | /** 285 | * Remove the inner border and padding in Firefox. 286 | */ 287 | 288 | button::-moz-focus-inner, 289 | [type="button"]::-moz-focus-inner, 290 | [type="reset"]::-moz-focus-inner, 291 | [type="submit"]::-moz-focus-inner { 292 | border-style: none; 293 | padding: 0; 294 | } 295 | 296 | /** 297 | * Restore the focus styles unset by the previous rule. 298 | */ 299 | 300 | button:-moz-focusring, 301 | [type="button"]:-moz-focusring, 302 | [type="reset"]:-moz-focusring, 303 | [type="submit"]:-moz-focusring { 304 | outline: 1px dotted ButtonText; 305 | } 306 | 307 | /** 308 | * Correct the padding in Firefox. 309 | */ 310 | 311 | fieldset { 312 | padding: 0.35em 0.75em 0.625em; 313 | } 314 | 315 | /** 316 | * 1. Correct the text wrapping in Edge and IE. 317 | * 2. Correct the color inheritance from `fieldset` elements in IE. 318 | * 3. Remove the padding so developers are not caught out when they zero out 319 | * `fieldset` elements in all browsers. 320 | */ 321 | 322 | legend { 323 | box-sizing: border-box; /* 1 */ 324 | color: inherit; /* 2 */ 325 | display: table; /* 1 */ 326 | max-width: 100%; /* 1 */ 327 | padding: 0; /* 3 */ 328 | white-space: normal; /* 1 */ 329 | } 330 | 331 | /** 332 | * 1. Add the correct display in IE 9-. 333 | * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. 334 | */ 335 | 336 | progress { 337 | display: inline-block; /* 1 */ 338 | vertical-align: baseline; /* 2 */ 339 | } 340 | 341 | /** 342 | * Remove the default vertical scrollbar in IE. 343 | */ 344 | 345 | textarea { 346 | overflow: auto; 347 | } 348 | 349 | /** 350 | * 1. Add the correct box sizing in IE 10-. 351 | * 2. Remove the padding in IE 10-. 352 | */ 353 | 354 | [type="checkbox"], 355 | [type="radio"] { 356 | box-sizing: border-box; /* 1 */ 357 | padding: 0; /* 2 */ 358 | } 359 | 360 | /** 361 | * Correct the cursor style of increment and decrement buttons in Chrome. 362 | */ 363 | 364 | [type="number"]::-webkit-inner-spin-button, 365 | [type="number"]::-webkit-outer-spin-button { 366 | height: auto; 367 | } 368 | 369 | /** 370 | * 1. Correct the odd appearance in Chrome and Safari. 371 | * 2. Correct the outline style in Safari. 372 | */ 373 | 374 | [type="search"] { 375 | -webkit-appearance: textfield; /* 1 */ 376 | outline-offset: -2px; /* 2 */ 377 | } 378 | 379 | /** 380 | * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. 381 | */ 382 | 383 | [type="search"]::-webkit-search-cancel-button, 384 | [type="search"]::-webkit-search-decoration { 385 | -webkit-appearance: none; 386 | } 387 | 388 | /** 389 | * 1. Correct the inability to style clickable types in iOS and Safari. 390 | * 2. Change font properties to `inherit` in Safari. 391 | */ 392 | 393 | ::-webkit-file-upload-button { 394 | -webkit-appearance: button; /* 1 */ 395 | font: inherit; /* 2 */ 396 | } 397 | 398 | /* Interactive 399 | ========================================================================== */ 400 | 401 | /* 402 | * Add the correct display in IE 9-. 403 | * 1. Add the correct display in Edge, IE, and Firefox. 404 | */ 405 | 406 | details, /* 1 */ 407 | menu { 408 | display: block; 409 | } 410 | 411 | /* 412 | * Add the correct display in all browsers. 413 | */ 414 | 415 | summary { 416 | display: list-item; 417 | } 418 | 419 | /* Scripting 420 | ========================================================================== */ 421 | 422 | /** 423 | * Add the correct display in IE 9-. 424 | */ 425 | 426 | canvas { 427 | display: inline-block; 428 | } 429 | 430 | /** 431 | * Add the correct display in IE. 432 | */ 433 | 434 | template { 435 | display: none; 436 | } 437 | 438 | /* Hidden 439 | ========================================================================== */ 440 | 441 | /** 442 | * Add the correct display in IE 10-. 443 | */ 444 | 445 | [hidden] { 446 | display: none; 447 | } 448 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | reload = require('require-reload')(require), 3 | pkg = reload('./package.json'), 4 | fs = require('fs'), 5 | path = require('path'), 6 | del = require('del'), 7 | globby = require('globby'), 8 | frontMatter = require('front-matter'), 9 | feed = require('feed'), 10 | hljs = require('highlight.js'), 11 | mdnh = require('markdown-it-named-headers'), 12 | markdown = require('markdown-it')({ 13 | html: true, 14 | highlight: function (str, lang) { 15 | if (lang && hljs.getLanguage(lang)) { 16 | try { 17 | return hljs.highlight(lang, str).value; 18 | } catch (__) {} 19 | } 20 | 21 | return ''; 22 | } 23 | }) 24 | .use(mdnh), 25 | pug = require('pug'), 26 | browserSync = require('browser-sync').create(), 27 | svgSprite = require('gulp-svg-sprite'), 28 | postcss = require('gulp-postcss'), 29 | sass = require('gulp-sass'), 30 | sassGlob = require('gulp-sass-glob'), 31 | surge = require('gulp-surge'), 32 | blog, 33 | nav; 34 | 35 | 36 | function formatDate(date) { 37 | var monthNames = [ 38 | "January", 39 | "February", 40 | "March", 41 | "April", 42 | "May", 43 | "June", 44 | "July", 45 | "August", 46 | "September", 47 | "October", 48 | "November", 49 | "December" 50 | ]; 51 | 52 | var day = date.getDate(); 53 | var monthIndex = date.getMonth(); 54 | var year = date.getFullYear(); 55 | 56 | return monthNames[monthIndex] + ' ' + day + ', ' + year; 57 | } 58 | 59 | 60 | gulp.task('clean', function() { 61 | 62 | if (fs.existsSync(pkg.data.static)) { 63 | del(pkg.data.static + '/*'); 64 | } 65 | 66 | }); 67 | 68 | 69 | gulp.task('prep', function() { 70 | 71 | if (!fs.existsSync(pkg.data.static)) { 72 | fs.mkdirSync(pkg.data.static); 73 | } 74 | 75 | }); 76 | 77 | 78 | gulp.task('process', ['prep'], function() { 79 | 80 | blog = []; 81 | nav = []; 82 | 83 | var files = globby.sync([ 84 | 'content/*.md', 85 | '!content/_*md' 86 | ]); 87 | 88 | for (file in files) { 89 | var contents = fs.readFileSync(files[file], 'utf8'); 90 | 91 | var content = frontMatter(contents); 92 | var currentDate = new Date(); 93 | content.attributes.markup = markdown.render(content.body); 94 | content.attributes.name = path.basename(files[file], '.md'); 95 | content.attributes.link = content.attributes.name + '.html'; 96 | 97 | if(content.attributes.date <= currentDate) { 98 | content.attributes.date = formatDate(content.attributes.date); 99 | blog.push(content.attributes); 100 | } 101 | } 102 | 103 | blog.sort(function(a, b) { 104 | a = new Date(a.date); 105 | b = new Date(b.date); 106 | return a > b ? -1 : a < b ? 1 : 0; 107 | }); 108 | 109 | for (var post in blog) { 110 | var category; 111 | 112 | if(blog[post].category) { 113 | category = blog[post].category; 114 | } else { 115 | category = 'misc'; 116 | } 117 | 118 | nav.push({ 119 | name: category, 120 | url: category.replace(' ', '-') + '.html', 121 | posts: [] 122 | }); 123 | } 124 | 125 | // Prevent duplicate nav labels 126 | for (var i = 0; i < nav.length; i++) { 127 | for (var x = i+1; x < nav.length; x++) { 128 | if (i !== x && nav[i].name === nav[x].name) { 129 | nav.splice(x, 1); 130 | } 131 | } 132 | } 133 | 134 | for (var post in blog) { 135 | for (var item in nav) { 136 | if (blog[post].category == nav[item].name) { 137 | nav[item].posts.push(blog[post]); 138 | } 139 | } 140 | } 141 | 142 | }); 143 | 144 | 145 | gulp.task('index', ['process'], function() { 146 | 147 | var page = 1; 148 | var division = pkg.data.pager; 149 | 150 | for (var i = 0; i <= blog.length; i+=division) { 151 | var fn = pug.compileFile(pkg.data.templates + '/templates/index.pug'); 152 | var html = fn({ 153 | categories: nav, 154 | data: pkg.data, 155 | posts: blog.slice(i, i + division), 156 | pager: Math.round(blog.length / division) 157 | }); 158 | 159 | var dir; 160 | 161 | if (i == 0) { 162 | dir = pkg.data.static + '/index.html'; 163 | } else { 164 | dir = pkg.data.static + '/page-' + page + '.html'; 165 | } 166 | 167 | fs.writeFile(dir, html, function(err) { 168 | if (err) console.log(err); 169 | }); 170 | 171 | page++; 172 | } 173 | 174 | }); 175 | 176 | 177 | gulp.task('categories', ['process'], function() { 178 | 179 | for (var item in nav) { 180 | var fn = pug.compileFile(pkg.data.templates + '/templates/index.pug'); 181 | var html = fn({ 182 | categories: nav, 183 | data: pkg.data, 184 | posts: nav[item].posts 185 | }); 186 | 187 | var dir = pkg.data.static + '/' + nav[item].name.toLowerCase().replace(' ', '-') + '.html' 188 | 189 | fs.writeFile(dir, html, function(err) { 190 | if (err) console.log(err); 191 | }); 192 | } 193 | 194 | }); 195 | 196 | 197 | gulp.task('posts', ['process'], function() { 198 | 199 | for (post in blog) { 200 | var fn = pug.compileFile(pkg.data.templates + '/templates/post-detail.pug'); 201 | var html = fn({ 202 | categories: nav, 203 | data: pkg.data, 204 | post: blog[post] 205 | }); 206 | 207 | var dir = pkg.data.static + '/' + blog[post].name + '.html'; 208 | 209 | fs.writeFile(dir, html, function(err) { 210 | if (err) console.log(err); 211 | }); 212 | } 213 | 214 | }); 215 | 216 | 217 | gulp.task('sprite', function() { 218 | 219 | return gulp.src(pkg.data.theme + '/icons/*.svg') 220 | .pipe(svgSprite({ 221 | mode: { 222 | inline: true, 223 | symbol: { 224 | dest: pkg.data.theme 225 | } 226 | }, 227 | svg: { 228 | xmlDeclaration: false, 229 | doctypeDeclaration: false, 230 | dimensionAttributes: true 231 | } 232 | })) 233 | .pipe(gulp.dest('.')); 234 | 235 | }); 236 | 237 | 238 | gulp.task('sass', function() { 239 | 240 | return gulp.src(pkg.data.theme + '/sass/site.scss') 241 | .pipe(sassGlob()) 242 | .pipe(sass().on('error', sass.logError)) 243 | .pipe(postcss([ 244 | require('autoprefixer')({ 245 | browsers: [ 246 | '> 1%', 247 | 'last 2 versions' 248 | ], 249 | cascade: false 250 | }) 251 | ])) 252 | .pipe(gulp.dest(pkg.data.static + '/css')) 253 | .pipe(browserSync.stream()); 254 | 255 | }); 256 | 257 | 258 | gulp.task('favicon', function() { 259 | 260 | return gulp.src(pkg.data.theme + '/favicons/*') 261 | .pipe(gulp.dest(pkg.data.static)); 262 | 263 | }); 264 | 265 | 266 | gulp.task('rss', function() { 267 | 268 | rss = new feed({ 269 | title: pkg.data.site.name, 270 | description: pkg.data.site.description, 271 | id: pkg.data.site.url, 272 | link: pkg.data.site.url, 273 | image: pkg.data.site.url + 'favicon-32x32.png', 274 | favicon: pkg.data.site.url + 'favicon.ico', 275 | copyright: 'All rights reserved ' + new Date().getFullYear() + ', ' + pkg.author, 276 | updated: new Date(), 277 | feedLinks: { 278 | json: pkg.data.site.url + 'json', 279 | atom: pkg.data.site.url + 'atom', 280 | }, 281 | author: { 282 | name: pkg.author, 283 | email: pkg.email, 284 | link: pkg.link 285 | } 286 | }); 287 | 288 | var files = globby.sync([ 289 | 'content/*.md', 290 | '!content/_*md' 291 | ]); 292 | 293 | for (file in files) { 294 | var contents = fs.readFileSync(files[file], 'utf8'); 295 | 296 | var content = frontMatter(contents); 297 | content.attributes.markup = markdown.render(content.body); 298 | content.attributes.name = path.basename(files[file], '.md'); 299 | content.attributes.link = content.attributes.name + '.html'; 300 | 301 | rss.addItem({ 302 | title: content.attributes.title, 303 | id: content.attributes.name, 304 | link: pkg.data.site.url + content.attributes.link, 305 | description: content.attributes.summary, 306 | content: content.attributes.markup, 307 | author: [{ 308 | name: pkg.author, 309 | email: pkg.email, 310 | link: pkg.link 311 | }], 312 | date: content.attributes.date 313 | }); 314 | } 315 | 316 | var rss2 = rss.rss2(); 317 | var atom1 = rss.atom1(); 318 | var json1 = rss.json1(); 319 | 320 | fs.writeFile(pkg.data.static + '/feed.xml', rss2, function(err) { 321 | if (err) console.log(err); 322 | }); 323 | 324 | fs.writeFile(pkg.data.static + '/feed.atom', atom1, function(err) { 325 | if (err) console.log(err); 326 | }); 327 | 328 | fs.writeFile(pkg.data.static + '/feed.json', json1, function(err) { 329 | if (err) console.log(err); 330 | }); 331 | 332 | }); 333 | 334 | 335 | gulp.task('surge', ['render', 'favicon', 'rss'], function() { 336 | 337 | return surge({ 338 | project: './' + pkg.data.static, 339 | domain: pkg.data.site.url 340 | }); 341 | 342 | }); 343 | 344 | 345 | gulp.task('browser-sync', function() { 346 | 347 | browserSync.init({ 348 | logPrefix: pkg.name, 349 | ui: false, 350 | server: './' + pkg.data.static + '/', 351 | notify: { 352 | styles: { 353 | top: 'auto', 354 | bottom: '0', 355 | padding: '4px 8px', 356 | fontSize: '12px', 357 | borderBottomLeftRadius: '0' 358 | } 359 | } 360 | }); 361 | 362 | }); 363 | 364 | 365 | gulp.task('reload', function() { 366 | 367 | browserSync.reload(); 368 | 369 | }); 370 | 371 | 372 | gulp.task('reset', function() { 373 | 374 | try { 375 | pkg = reload('./package.json'); 376 | } catch (e) { 377 | console.error("Failed to reload package.json! Error: ", e); 378 | } 379 | 380 | }); 381 | 382 | 383 | gulp.task('watch', function() { 384 | 385 | gulp.watch('package.json', ['reset', 'render', 'reload']); 386 | gulp.watch('content/*.md', ['render', 'reload']); 387 | gulp.watch(pkg.data.theme + '/icons/*.svg', ['sprite', 'render', 'reload']); 388 | gulp.watch(pkg.data.theme + '/sass/*.scss', ['sass']); 389 | gulp.watch(pkg.data.theme + '/templates/*.pug', ['render', 'reload']); 390 | gulp.watch(pkg.data.theme + '/favicons/*', ['favicon', 'reload']); 391 | 392 | }); 393 | 394 | 395 | gulp.task('render', [ 396 | 'index', 397 | 'categories', 398 | 'posts' 399 | ]); 400 | 401 | 402 | gulp.task('default', [ 403 | 'sprite', 404 | 'render', 405 | 'sass', 406 | 'watch', 407 | 'browser-sync' 408 | ]); 409 | -------------------------------------------------------------------------------- /output/feed.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "https://jsonfeed.org/version/1", 3 | "title": "Raven", 4 | "home_page_url": "http://raven.surge.sh/", 5 | "feed_url": "http://raven.surge.sh/json", 6 | "description": "A refined and flexible static blog generator", 7 | "icon": "http://raven.surge.sh/favicon-32x32.png", 8 | "author": { 9 | "name": "Bryan Stoner", 10 | "url": "http://mimoduo.surge.sh/" 11 | }, 12 | "items": [ 13 | { 14 | "id": "future-post", 15 | "html_content": "", 16 | "url": "http://raven.surge.sh/future-post.html", 17 | "title": "From the Future", 18 | "summary": "Posts from the future will not be displayed unless their date is older than or equal to the current date", 19 | "date_modified": "2220-06-29T00:00:00Z", 20 | "author": { 21 | "name": "Bryan Stoner", 22 | "url": "http://mimoduo.surge.sh/" 23 | } 24 | }, 25 | { 26 | "id": "markdown-style-guide", 27 | "html_content": "

h1

\n

Heading 1 has 1 pounds sign.

\n

h2

\n

Heading 2 has 2 pounds signs.

\n

h3

\n

Heading 3 has 3 pounds signs.

\n

h4

\n

Heading 4 has 4 pounds signs.

\n
h5
\n

Heading 5 has 5 pounds signs.

\n
h6
\n

Heading 6 has 6 pounds signs.

\n

Formatting Text

\n

A paragraph can be as simple as bolded text or as hard as italicized marks. Yet creating a link can be as easy as pie.

\n

Blockquotes

\n
\n

And there's always the trusty blockquote to emphasize an incredible situation.

\n
\n

Unordered List

\n\n

Ordered List

\n
    \n
  1. So
  2. \n
  3. are
  4. \n
  5. ordered
  6. \n
  7. lists
  8. \n
\n

Code Snippets

\n
.mage {\n  content: 'code snippet'\n}\n
\n
var delthea = 'orange raven';\n
\n

Tables

\n\n \n \n \n \n \n \n \n \n \n \n \n \n
EffectExample
WillstrumsDating a tree back to the 18th century
TashleAssigning a rabbit the name of a turtle
\n", 28 | "url": "http://raven.surge.sh/markdown-style-guide.html", 29 | "title": "Markdown Style Guide", 30 | "summary": "The basics of markdown ready to style!", 31 | "date_modified": "2017-06-28T00:00:00Z", 32 | "author": { 33 | "name": "Bryan Stoner", 34 | "url": "http://mimoduo.surge.sh/" 35 | } 36 | }, 37 | { 38 | "id": "raven-doc", 39 | "html_content": "

Installing Raven

\n

Once you're set with npm, whip out your terminal and enter in the following:

\n
git clone https://github.com/mimoduo/raven.git\ncd raven\nsudo npm install gulp-cli -g\nnpm install\ngulp\n
\n
\n

That's it! Gulp will begin to process all posts, spin up a live reload server, and begin watching for any post, template, icon, or style changes.

\n
\n

Now you're officially ready to start creating your new blog by:

\n\n

Where's Your @&#*

\n

First, let's start with some of the basics of Raven by detailing where everything is:

\n\n

How Raven Works

\n

Raven grabs all the markdown files you've written in the content folder and processes them as such:

\n

markdown >> json >> pug :: index/post-detail/categories pages

\n
    \n
  1. Retrieves the contents of each markdown file
  2. \n
  3. Processes the file's front matter field
  4. \n
  5. Renders the file's markdown content into viable HTML
  6. \n
  7. Pushes a json object representation of the file to a blog array
  8. \n
  9. Sorts the newly created array by date
  10. \n
  11. Sorts the articles by category
  12. \n
  13. Compiles index pages using the blog array
  14. \n
  15. Compiles post detail pages using the blog array
  16. \n
  17. Compiles category pages using the blog array
  18. \n
\n

Configuring Raven

\n

Raven pulls in the "data" object from the package.json file to render your blog. Feel free to add key: value pairs here to help better represent your blog:

\n
\"data\": {\n  \"site\": {\n    \"name\": \"raven\",\n    \"url\": \"raven.surge.sh\"\n  },\n  \"fonts\": [\n    {\n      \"family\": \"Oxygen\",\n      \"weights\": \"300,400,700\"\n    }\n  ],\n  \"analytics\": true,\n  \"disqus\": {\n    \"include\": true,\n    \"shortname\": \"raven-blog\"\n  },\n  \"static\": \"output\",\n  \"theme\": \"themes/feather\",\n  \"templates\": \"themes/feather\",\n  \"pager\": 8,\n  \"links\": {\n    \"social\": [\n      {\n        \"name\": \"Github\",\n        \"url\": \"https://github.com\"\n      },\n      {\n        \"name\": \"Codepen\",\n        \"url\": \"https://codepen.io\"\n      }\n    ]\n  }\n}\n
\n

Data Object Reference

\n\n

Using Data Within Templates

\n

Data can be referenced within pug by evaluating template locals:

\n
//- Render the site name from data: { site: { name: ""}}\nh1= data.site.name\np Thanks to the power of Raven my blog, #{data.site.name}, was possible!\n\n//- Render each link from data: { links: { social: []}}\neach link in data.links.social\n  a(href=link.url)= link.name\n\n//- Render arbitrary values from data: { custom: ""}\nh2= data.custom\n
\n

Structuring Your Blog

\n

The first thing you'll likely want to do is modify the templates a bit, starting from base.pug. If you haven't written in pug before, here's an awesome pug tutorial for you!

\n
\n

Remember, all of the variables used within each template are provided to pug from your package.json's "data" object and each markdown post's front matter.

\n
\n

base.pug is the foundational template that provides the structure to all other page templates, namely:

\n\n

All other templates are considered partials that are included on the aforementioned templates:

\n\n

Styling Your Blog

\n

All of the classes used within the base templates are available to style within the feather theme under /themes/feather/sass/*. For those new to Sass, here's a quick sass cheat sheet for you!

\n

There are a few utility files to help you through development:

\n\n

Creating Your Own Theme

\n

Creating your own theme is a piece of cake. Since Raven treats markup and styles separately, you can continue to use the feather theme templates while developing your own theme outside of feather. Just reconfigure your blog's settings to point to a different theme folder:

\n
\"data\": {\n  \"theme\": \"themes/yourTheme\"\n}\n
\n

Afterwards, make sure that your new theme folder contains the following folder structure for gulp to process Sass correctly:

\n

/themes/yourTheme/sass/site.scss

\n

Creating Content

\n

Each blog article is written in Markdown with the addition of front matter. If you're diggin for a markdown tutorial, daring fireball has you covered! The following front matter meets the minimum requirements for a blog article:

\n
---\ntitle: Blog Post Title Field\ndate: 2017-07-24\ncategory: navie\nsummary: Blog Post Summary Field\n---\n\n# Your Markdown Content!\n
\n

After saving this post, you'll notice a new entry on the index page, a new detail page, and a new category in the main navigation.

\n

Fly With the Wind!

\n

All the basics of Raven have been covered! There's a bit more to explore and a lot more on the way. I hope you enjoy publishing your blog with Raven! And if you have already published your blog, wouldn't you want some free recognition? Jump over to the Raven github repo and add your blog to the Blogs Running Raven section.

\n", 40 | "url": "http://raven.surge.sh/raven-doc.html", 41 | "title": "Raven Documentation", 42 | "summary": "AAWWW yeaaa!!! Time to get drilling down to the Raven blog workflow - from getting familiar with Raven's structure to creating your own theme. If you're familiar with Pelican, you'll feel right at home (p^-^)p", 43 | "date_modified": "2017-06-29T00:00:00Z", 44 | "author": { 45 | "name": "Bryan Stoner", 46 | "url": "http://mimoduo.surge.sh/" 47 | } 48 | } 49 | ] 50 | } -------------------------------------------------------------------------------- /output/feed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Raven 5 | http://raven.surge.sh/ 6 | A refined and flexible static blog generator 7 | Mon, 09 Oct 2017 20:42:56 GMT 8 | http://blogs.law.harvard.edu/tech/rss 9 | Feed for Node.js 10 | 11 | Raven 12 | http://raven.surge.sh/favicon-32x32.png 13 | http://raven.surge.sh/ 14 | 15 | All rights reserved 2017, Bryan Stoner 16 | 17 | 18 | <![CDATA[From the Future]]> 19 | http://raven.surge.sh/future-post.html 20 | http://raven.surge.sh/future-post.html 21 | Thu, 29 Jun 2220 00:00:00 GMT 22 | 23 | mimoduo@gmail.com (Bryan Stoner) 24 | 25 | 26 | <![CDATA[Markdown Style Guide]]> 27 | http://raven.surge.sh/markdown-style-guide.html 28 | http://raven.surge.sh/markdown-style-guide.html 29 | Wed, 28 Jun 2017 00:00:00 GMT 30 | 31 | h1 32 |

Heading 1 has 1 pounds sign.

33 |

h2

34 |

Heading 2 has 2 pounds signs.

35 |

h3

36 |

Heading 3 has 3 pounds signs.

37 |

h4

38 |

Heading 4 has 4 pounds signs.

39 |
h5
40 |

Heading 5 has 5 pounds signs.

41 |
h6
42 |

Heading 6 has 6 pounds signs.

43 |

Formatting Text

44 |

A paragraph can be as simple as bolded text or as hard as italicized marks. Yet creating a link can be as easy as pie.

45 |

Blockquotes

46 |
47 |

And there's always the trusty blockquote to emphasize an incredible situation.

48 |
49 |

Unordered List

50 |
    51 |
  • Lists
  • 52 |
  • are
  • 53 |
  • just
  • 54 |
  • as
  • 55 |
  • simple
  • 56 |
57 |

Ordered List

58 |
    59 |
  1. So
  2. 60 |
  3. are
  4. 61 |
  5. ordered
  6. 62 |
  7. lists
  8. 63 |
64 |

Code Snippets

65 |
.mage {
 66 |   content: 'code snippet'
 67 | }
 68 | 
69 |
var delthea = 'orange raven';
 70 | 
71 |

Tables

72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 |
EffectExample
WillstrumsDating a tree back to the 18th century
TashleAssigning a rabbit the name of a turtle
86 | ]]>
87 | mimoduo@gmail.com (Bryan Stoner) 88 |
89 | 90 | <![CDATA[Raven Documentation]]> 91 | http://raven.surge.sh/raven-doc.html 92 | http://raven.surge.sh/raven-doc.html 93 | Thu, 29 Jun 2017 00:00:00 GMT 94 | 95 | Installing Raven 96 |

Once you're set with npm, whip out your terminal and enter in the following:

97 |
git clone https://github.com/mimoduo/raven.git
 98 | cd raven
 99 | sudo npm install gulp-cli -g
100 | npm install
101 | gulp
102 | 
103 |
104 |

That's it! Gulp will begin to process all posts, spin up a live reload server, and begin watching for any post, template, icon, or style changes.

105 |
106 |

Now you're officially ready to start creating your new blog by:

107 | 115 |

Where's Your @&#*

116 |

First, let's start with some of the basics of Raven by detailing where everything is:

117 |
    118 |
  • content: markdown files representing your blog posts
  • 119 |
  • output: static files generated based on the theme and content
  • 120 |
  • themes: appearance and markup of your blog
  • 121 |
122 |

How Raven Works

123 |

Raven grabs all the markdown files you've written in the content folder and processes them as such:

124 |

markdown >> json >> pug :: index/post-detail/categories pages

125 |
    126 |
  1. Retrieves the contents of each markdown file
  2. 127 |
  3. Processes the file's front matter field
  4. 128 |
  5. Renders the file's markdown content into viable HTML
  6. 129 |
  7. Pushes a json object representation of the file to a blog array
  8. 130 |
  9. Sorts the newly created array by date
  10. 131 |
  11. Sorts the articles by category
  12. 132 |
  13. Compiles index pages using the blog array
  14. 133 |
  15. Compiles post detail pages using the blog array
  16. 134 |
  17. Compiles category pages using the blog array
  18. 135 |
136 |

Configuring Raven

137 |

Raven pulls in the "data" object from the package.json file to render your blog. Feel free to add key: value pairs here to help better represent your blog:

138 |
"data": {
139 |   "site": {
140 |     "name": "raven",
141 |     "url": "raven.surge.sh"
142 |   },
143 |   "fonts": [
144 |     {
145 |       "family": "Oxygen",
146 |       "weights": "300,400,700"
147 |     }
148 |   ],
149 |   "analytics": true,
150 |   "disqus": {
151 |     "include": true,
152 |     "shortname": "raven-blog"
153 |   },
154 |   "static": "output",
155 |   "theme": "themes/feather",
156 |   "templates": "themes/feather",
157 |   "pager": 8,
158 |   "links": {
159 |     "social": [
160 |       {
161 |         "name": "Github",
162 |         "url": "https://github.com"
163 |       },
164 |       {
165 |         "name": "Codepen",
166 |         "url": "https://codepen.io"
167 |       }
168 |     ]
169 |   }
170 | }
171 | 
172 |

Data Object Reference

173 |
    174 |
  • fonts: provides pug the data needed to dynamically pull google fonts
  • 175 |
  • static: determines the output directory of static content
  • 176 |
  • theme: determines which sass theme folder to pull from
  • 177 |
  • templates: determines which pug templates folder to pull from
  • 178 |
  • pager: the amount of posts on each index page
  • 179 |
180 |

Using Data Within Templates

181 |

Data can be referenced within pug by evaluating template locals:

182 |
//- Render the site name from data: { site: { name: ""}}
183 | h1= data.site.name
184 | p Thanks to the power of Raven my blog, #{data.site.name}, was possible!
185 | 
186 | //- Render each link from data: { links: { social: []}}
187 | each link in data.links.social
188 |   a(href=link.url)= link.name
189 | 
190 | //- Render arbitrary values from data: { custom: ""}
191 | h2= data.custom
192 | 
193 |

Structuring Your Blog

194 |

The first thing you'll likely want to do is modify the templates a bit, starting from base.pug. If you haven't written in pug before, here's an awesome pug tutorial for you!

195 |
196 |

Remember, all of the variables used within each template are provided to pug from your package.json's "data" object and each markdown post's front matter.

197 |
198 |

base.pug is the foundational template that provides the structure to all other page templates, namely:

199 |
    200 |
  • index.pug: list view for blog articles
  • 201 |
  • post-detail.pug: detail view for a specific blog article
  • 202 |
203 |

All other templates are considered partials that are included on the aforementioned templates:

204 |
    205 |
  • post.pug: foundational template to represent each post
  • 206 |
  • pager.pug: provides the ability to chunk your blog list
  • 207 |
  • analytics.pug: conditionally included based on your blog's settings
  • 208 |
  • disqus.pug: conditionally included based on your blog's settings
  • 209 |
210 |

Styling Your Blog

211 |

All of the classes used within the base templates are available to style within the feather theme under /themes/feather/sass/*. For those new to Sass, here's a quick sass cheat sheet for you!

212 |

There are a few utility files to help you through development:

213 |
    214 |
  • normalize.css: basic reset for browser consistency
  • 215 |
  • functions.scss: several inline font sizing functions for ems & rems
  • 216 |
  • variables.scss: grid variables & a space for custom variables
  • 217 |
218 |

Creating Your Own Theme

219 |

Creating your own theme is a piece of cake. Since Raven treats markup and styles separately, you can continue to use the feather theme templates while developing your own theme outside of feather. Just reconfigure your blog's settings to point to a different theme folder:

220 |
"data": {
221 |   "theme": "themes/yourTheme"
222 | }
223 | 
224 |

Afterwards, make sure that your new theme folder contains the following folder structure for gulp to process Sass correctly:

225 |

/themes/yourTheme/sass/site.scss

226 |

Creating Content

227 |

Each blog article is written in Markdown with the addition of front matter. If you're diggin for a markdown tutorial, daring fireball has you covered! The following front matter meets the minimum requirements for a blog article:

228 |
---
229 | title: Blog Post Title Field
230 | date: 2017-07-24
231 | category: navie
232 | summary: Blog Post Summary Field
233 | ---
234 | 
235 | # Your Markdown Content!
236 | 
237 |

After saving this post, you'll notice a new entry on the index page, a new detail page, and a new category in the main navigation.

238 |

Fly With the Wind!

239 |

All the basics of Raven have been covered! There's a bit more to explore and a lot more on the way. I hope you enjoy publishing your blog with Raven! And if you have already published your blog, wouldn't you want some free recognition? Jump over to the Raven github repo and add your blog to the Blogs Running Raven section.

240 | ]]>
241 | mimoduo@gmail.com (Bryan Stoner) 242 |
243 |
244 |
-------------------------------------------------------------------------------- /output/feed.atom: -------------------------------------------------------------------------------- 1 | 2 | 3 | http://raven.surge.sh/ 4 | Raven 5 | 2017-10-09T20:42:56Z 6 | Feed for Node.js 7 | 8 | Bryan Stoner 9 | mimoduo@gmail.com 10 | http://mimoduo.surge.sh/ 11 | 12 | 13 | 14 | A refined and flexible static blog generator 15 | http://raven.surge.sh/favicon-32x32.png 16 | http://raven.surge.sh/favicon.ico 17 | All rights reserved 2017, Bryan Stoner 18 | 19 | <![CDATA[From the Future]]> 20 | future-post 21 | 22 | 23 | 2220-06-29T00:00:00Z 24 | 25 | 26 | Bryan Stoner 27 | mimoduo@gmail.com 28 | http://mimoduo.surge.sh/ 29 | 30 | 31 | 32 | <![CDATA[Markdown Style Guide]]> 33 | markdown-style-guide 34 | 35 | 36 | 2017-06-28T00:00:00Z 37 | 38 | h1 39 |

Heading 1 has 1 pounds sign.

40 |

h2

41 |

Heading 2 has 2 pounds signs.

42 |

h3

43 |

Heading 3 has 3 pounds signs.

44 |

h4

45 |

Heading 4 has 4 pounds signs.

46 |
h5
47 |

Heading 5 has 5 pounds signs.

48 |
h6
49 |

Heading 6 has 6 pounds signs.

50 |

Formatting Text

51 |

A paragraph can be as simple as bolded text or as hard as italicized marks. Yet creating a link can be as easy as pie.

52 |

Blockquotes

53 |
54 |

And there's always the trusty blockquote to emphasize an incredible situation.

55 |
56 |

Unordered List

57 |
    58 |
  • Lists
  • 59 |
  • are
  • 60 |
  • just
  • 61 |
  • as
  • 62 |
  • simple
  • 63 |
64 |

Ordered List

65 |
    66 |
  1. So
  2. 67 |
  3. are
  4. 68 |
  5. ordered
  6. 69 |
  7. lists
  8. 70 |
71 |

Code Snippets

72 |
.mage {
 73 |   content: 'code snippet'
 74 | }
 75 | 
76 |
var delthea = 'orange raven';
 77 | 
78 |

Tables

79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
EffectExample
WillstrumsDating a tree back to the 18th century
TashleAssigning a rabbit the name of a turtle
93 | ]]>
94 | 95 | Bryan Stoner 96 | mimoduo@gmail.com 97 | http://mimoduo.surge.sh/ 98 | 99 |
100 | 101 | <![CDATA[Raven Documentation]]> 102 | raven-doc 103 | 104 | 105 | 2017-06-29T00:00:00Z 106 | 107 | Installing Raven 108 |

Once you're set with npm, whip out your terminal and enter in the following:

109 |
git clone https://github.com/mimoduo/raven.git
110 | cd raven
111 | sudo npm install gulp-cli -g
112 | npm install
113 | gulp
114 | 
115 |
116 |

That's it! Gulp will begin to process all posts, spin up a live reload server, and begin watching for any post, template, icon, or style changes.

117 |
118 |

Now you're officially ready to start creating your new blog by:

119 | 127 |

Where's Your @&#*

128 |

First, let's start with some of the basics of Raven by detailing where everything is:

129 |
    130 |
  • content: markdown files representing your blog posts
  • 131 |
  • output: static files generated based on the theme and content
  • 132 |
  • themes: appearance and markup of your blog
  • 133 |
134 |

How Raven Works

135 |

Raven grabs all the markdown files you've written in the content folder and processes them as such:

136 |

markdown >> json >> pug :: index/post-detail/categories pages

137 |
    138 |
  1. Retrieves the contents of each markdown file
  2. 139 |
  3. Processes the file's front matter field
  4. 140 |
  5. Renders the file's markdown content into viable HTML
  6. 141 |
  7. Pushes a json object representation of the file to a blog array
  8. 142 |
  9. Sorts the newly created array by date
  10. 143 |
  11. Sorts the articles by category
  12. 144 |
  13. Compiles index pages using the blog array
  14. 145 |
  15. Compiles post detail pages using the blog array
  16. 146 |
  17. Compiles category pages using the blog array
  18. 147 |
148 |

Configuring Raven

149 |

Raven pulls in the "data" object from the package.json file to render your blog. Feel free to add key: value pairs here to help better represent your blog:

150 |
"data": {
151 |   "site": {
152 |     "name": "raven",
153 |     "url": "raven.surge.sh"
154 |   },
155 |   "fonts": [
156 |     {
157 |       "family": "Oxygen",
158 |       "weights": "300,400,700"
159 |     }
160 |   ],
161 |   "analytics": true,
162 |   "disqus": {
163 |     "include": true,
164 |     "shortname": "raven-blog"
165 |   },
166 |   "static": "output",
167 |   "theme": "themes/feather",
168 |   "templates": "themes/feather",
169 |   "pager": 8,
170 |   "links": {
171 |     "social": [
172 |       {
173 |         "name": "Github",
174 |         "url": "https://github.com"
175 |       },
176 |       {
177 |         "name": "Codepen",
178 |         "url": "https://codepen.io"
179 |       }
180 |     ]
181 |   }
182 | }
183 | 
184 |

Data Object Reference

185 |
    186 |
  • fonts: provides pug the data needed to dynamically pull google fonts
  • 187 |
  • static: determines the output directory of static content
  • 188 |
  • theme: determines which sass theme folder to pull from
  • 189 |
  • templates: determines which pug templates folder to pull from
  • 190 |
  • pager: the amount of posts on each index page
  • 191 |
192 |

Using Data Within Templates

193 |

Data can be referenced within pug by evaluating template locals:

194 |
//- Render the site name from data: { site: { name: ""}}
195 | h1= data.site.name
196 | p Thanks to the power of Raven my blog, #{data.site.name}, was possible!
197 | 
198 | //- Render each link from data: { links: { social: []}}
199 | each link in data.links.social
200 |   a(href=link.url)= link.name
201 | 
202 | //- Render arbitrary values from data: { custom: ""}
203 | h2= data.custom
204 | 
205 |

Structuring Your Blog

206 |

The first thing you'll likely want to do is modify the templates a bit, starting from base.pug. If you haven't written in pug before, here's an awesome pug tutorial for you!

207 |
208 |

Remember, all of the variables used within each template are provided to pug from your package.json's "data" object and each markdown post's front matter.

209 |
210 |

base.pug is the foundational template that provides the structure to all other page templates, namely:

211 |
    212 |
  • index.pug: list view for blog articles
  • 213 |
  • post-detail.pug: detail view for a specific blog article
  • 214 |
215 |

All other templates are considered partials that are included on the aforementioned templates:

216 |
    217 |
  • post.pug: foundational template to represent each post
  • 218 |
  • pager.pug: provides the ability to chunk your blog list
  • 219 |
  • analytics.pug: conditionally included based on your blog's settings
  • 220 |
  • disqus.pug: conditionally included based on your blog's settings
  • 221 |
222 |

Styling Your Blog

223 |

All of the classes used within the base templates are available to style within the feather theme under /themes/feather/sass/*. For those new to Sass, here's a quick sass cheat sheet for you!

224 |

There are a few utility files to help you through development:

225 |
    226 |
  • normalize.css: basic reset for browser consistency
  • 227 |
  • functions.scss: several inline font sizing functions for ems & rems
  • 228 |
  • variables.scss: grid variables & a space for custom variables
  • 229 |
230 |

Creating Your Own Theme

231 |

Creating your own theme is a piece of cake. Since Raven treats markup and styles separately, you can continue to use the feather theme templates while developing your own theme outside of feather. Just reconfigure your blog's settings to point to a different theme folder:

232 |
"data": {
233 |   "theme": "themes/yourTheme"
234 | }
235 | 
236 |

Afterwards, make sure that your new theme folder contains the following folder structure for gulp to process Sass correctly:

237 |

/themes/yourTheme/sass/site.scss

238 |

Creating Content

239 |

Each blog article is written in Markdown with the addition of front matter. If you're diggin for a markdown tutorial, daring fireball has you covered! The following front matter meets the minimum requirements for a blog article:

240 |
---
241 | title: Blog Post Title Field
242 | date: 2017-07-24
243 | category: navie
244 | summary: Blog Post Summary Field
245 | ---
246 | 
247 | # Your Markdown Content!
248 | 
249 |

After saving this post, you'll notice a new entry on the index page, a new detail page, and a new category in the main navigation.

250 |

Fly With the Wind!

251 |

All the basics of Raven have been covered! There's a bit more to explore and a lot more on the way. I hope you enjoy publishing your blog with Raven! And if you have already published your blog, wouldn't you want some free recognition? Jump over to the Raven github repo and add your blog to the Blogs Running Raven section.

252 | ]]>
253 | 254 | Bryan Stoner 255 | mimoduo@gmail.com 256 | http://mimoduo.surge.sh/ 257 | 258 |
259 |
-------------------------------------------------------------------------------- /output/raven-doc.html: -------------------------------------------------------------------------------- 1 | Raven | Raven Documentation
clock2codepengithublabel_outlinetwitter

Raven Documentation

AAWWW yeaaa!!! Time to get drilling down to the Raven blog workflow - from getting familiar with Raven's structure to creating your own theme. If you're familiar with Pelican, you'll feel right at home (p^-^)p

In projects

Installing Raven

2 |

Once you're set with npm, whip out your terminal and enter in the following:

3 |
git clone https://github.com/mimoduo/raven.git
  4 | cd raven
  5 | sudo npm install gulp-cli -g
  6 | npm install
  7 | gulp
  8 | 
9 |
10 |

That's it! Gulp will begin to process all posts, spin up a live reload server, and begin watching for any post, template, icon, or style changes.

11 |
12 |

Now you're officially ready to start creating your new blog by:

13 | 21 |

Where's Your @&#*

22 |

First, let's start with some of the basics of Raven by detailing where everything is:

23 |
    24 |
  • content: markdown files representing your blog posts
  • 25 |
  • output: static files generated based on the theme and content
  • 26 |
  • themes: appearance and markup of your blog
  • 27 |
28 |

How Raven Works

29 |

Raven grabs all the markdown files you've written in the content folder and processes them as such:

30 |

markdown >> json >> pug :: index/post-detail/categories pages

31 |
    32 |
  1. Retrieves the contents of each markdown file
  2. 33 |
  3. Processes the file's front matter field
  4. 34 |
  5. Renders the file's markdown content into viable HTML
  6. 35 |
  7. Pushes a json object representation of the file to a blog array
  8. 36 |
  9. Sorts the newly created array by date
  10. 37 |
  11. Sorts the articles by category
  12. 38 |
  13. Compiles index pages using the blog array
  14. 39 |
  15. Compiles post detail pages using the blog array
  16. 40 |
  17. Compiles category pages using the blog array
  18. 41 |
42 |

Configuring Raven

43 |

Raven pulls in the "data" object from the package.json file to render your blog. Feel free to add key: value pairs here to help better represent your blog:

44 |
"data": {
 45 |   "site": {
 46 |     "name": "raven",
 47 |     "url": "raven.surge.sh"
 48 |   },
 49 |   "fonts": [
 50 |     {
 51 |       "family": "Oxygen",
 52 |       "weights": "300,400,700"
 53 |     }
 54 |   ],
 55 |   "analytics": true,
 56 |   "disqus": {
 57 |     "include": true,
 58 |     "shortname": "raven-blog"
 59 |   },
 60 |   "static": "output",
 61 |   "theme": "themes/feather",
 62 |   "templates": "themes/feather",
 63 |   "pager": 8,
 64 |   "links": {
 65 |     "social": [
 66 |       {
 67 |         "name": "Github",
 68 |         "url": "https://github.com"
 69 |       },
 70 |       {
 71 |         "name": "Codepen",
 72 |         "url": "https://codepen.io"
 73 |       }
 74 |     ]
 75 |   }
 76 | }
 77 | 
78 |

Data Object Reference

79 |
    80 |
  • fonts: provides pug the data needed to dynamically pull google fonts
  • 81 |
  • static: determines the output directory of static content
  • 82 |
  • theme: determines which sass theme folder to pull from
  • 83 |
  • templates: determines which pug templates folder to pull from
  • 84 |
  • pager: the amount of posts on each index page
  • 85 |
86 |

Using Data Within Templates

87 |

Data can be referenced within pug by evaluating template locals:

88 |
//- Render the site name from data: { site: { name: ""}}
 89 | h1= data.site.name
 90 | p Thanks to the power of Raven my blog, #{data.site.name}, was possible!
 91 | 
 92 | //- Render each link from data: { links: { social: []}}
 93 | each link in data.links.social
 94 |   a(href=link.url)= link.name
 95 | 
 96 | //- Render arbitrary values from data: { custom: ""}
 97 | h2= data.custom
 98 | 
99 |

Structuring Your Blog

100 |

The first thing you'll likely want to do is modify the templates a bit, starting from base.pug. If you haven't written in pug before, here's an awesome pug tutorial for you!

101 |
102 |

Remember, all of the variables used within each template are provided to pug from your package.json's "data" object and each markdown post's front matter.

103 |
104 |

base.pug is the foundational template that provides the structure to all other page templates, namely:

105 |
    106 |
  • index.pug: list view for blog articles
  • 107 |
  • post-detail.pug: detail view for a specific blog article
  • 108 |
109 |

All other templates are considered partials that are included on the aforementioned templates:

110 |
    111 |
  • post.pug: foundational template to represent each post
  • 112 |
  • pager.pug: provides the ability to chunk your blog list
  • 113 |
  • analytics.pug: conditionally included based on your blog's settings
  • 114 |
  • disqus.pug: conditionally included based on your blog's settings
  • 115 |
116 |

Styling Your Blog

117 |

All of the classes used within the base templates are available to style within the feather theme under /themes/feather/sass/*. For those new to Sass, here's a quick sass cheat sheet for you!

118 |

There are a few utility files to help you through development:

119 |
    120 |
  • normalize.css: basic reset for browser consistency
  • 121 |
  • functions.scss: several inline font sizing functions for ems & rems
  • 122 |
  • variables.scss: grid variables & a space for custom variables
  • 123 |
124 |

Creating Your Own Theme

125 |

Creating your own theme is a piece of cake. Since Raven treats markup and styles separately, you can continue to use the feather theme templates while developing your own theme outside of feather. Just reconfigure your blog's settings to point to a different theme folder:

126 |
"data": {
127 |   "theme": "themes/yourTheme"
128 | }
129 | 
130 |

Afterwards, make sure that your new theme folder contains the following folder structure for gulp to process Sass correctly:

131 |

/themes/yourTheme/sass/site.scss

132 |

Creating Content

133 |

Each blog article is written in Markdown with the addition of front matter. If you're diggin for a markdown tutorial, daring fireball has you covered! The following front matter meets the minimum requirements for a blog article:

134 |
---
135 | title: Blog Post Title Field
136 | date: 2017-07-24
137 | category: navie
138 | summary: Blog Post Summary Field
139 | ---
140 | 
141 | # Your Markdown Content!
142 | 
143 |

After saving this post, you'll notice a new entry on the index page, a new detail page, and a new category in the main navigation.

144 |

Fly With the Wind!

145 |

All the basics of Raven have been covered! There's a bit more to explore and a lot more on the way. I hope you enjoy publishing your blog with Raven! And if you have already published your blog, wouldn't you want some free recognition? Jump over to the Raven github repo and add your blog to the Blogs Running Raven section.

146 |
-------------------------------------------------------------------------------- /output/css/site.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ 2 | /* Document 3 | ========================================================================== */ 4 | /** 5 | * 1. Correct the line height in all browsers. 6 | * 2. Prevent adjustments of font size after orientation changes in 7 | * IE on Windows Phone and in iOS. 8 | */ 9 | html { 10 | line-height: 1.15; 11 | /* 1 */ 12 | -ms-text-size-adjust: 100%; 13 | /* 2 */ 14 | -webkit-text-size-adjust: 100%; 15 | /* 2 */ } 16 | 17 | /* Sections 18 | ========================================================================== */ 19 | /** 20 | * Remove the margin in all browsers (opinionated). 21 | */ 22 | body { 23 | margin: 0; } 24 | 25 | /** 26 | * Add the correct display in IE 9-. 27 | */ 28 | article, 29 | aside, 30 | footer, 31 | header, 32 | nav, 33 | section { 34 | display: block; } 35 | 36 | /** 37 | * Correct the font size and margin on `h1` elements within `section` and 38 | * `article` contexts in Chrome, Firefox, and Safari. 39 | */ 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; } 43 | 44 | /* Grouping content 45 | ========================================================================== */ 46 | /** 47 | * Add the correct display in IE 9-. 48 | * 1. Add the correct display in IE. 49 | */ 50 | figcaption, 51 | figure, 52 | main { 53 | /* 1 */ 54 | display: block; } 55 | 56 | /** 57 | * Add the correct margin in IE 8. 58 | */ 59 | figure { 60 | margin: 1em 40px; } 61 | 62 | /** 63 | * 1. Add the correct box sizing in Firefox. 64 | * 2. Show the overflow in Edge and IE. 65 | */ 66 | hr { 67 | -webkit-box-sizing: content-box; 68 | box-sizing: content-box; 69 | /* 1 */ 70 | height: 0; 71 | /* 1 */ 72 | overflow: visible; 73 | /* 2 */ } 74 | 75 | /** 76 | * 1. Correct the inheritance and scaling of font size in all browsers. 77 | * 2. Correct the odd `em` font sizing in all browsers. 78 | */ 79 | pre { 80 | font-family: monospace, monospace; 81 | /* 1 */ 82 | font-size: 1em; 83 | /* 2 */ } 84 | 85 | /* Text-level semantics 86 | ========================================================================== */ 87 | /** 88 | * 1. Remove the gray background on active links in IE 10. 89 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 90 | */ 91 | a { 92 | background-color: transparent; 93 | /* 1 */ 94 | -webkit-text-decoration-skip: objects; 95 | /* 2 */ } 96 | 97 | /** 98 | * 1. Remove the bottom border in Chrome 57- and Firefox 39-. 99 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 100 | */ 101 | abbr[title] { 102 | border-bottom: none; 103 | /* 1 */ 104 | text-decoration: underline; 105 | /* 2 */ 106 | -webkit-text-decoration: underline dotted; 107 | text-decoration: underline dotted; 108 | /* 2 */ } 109 | 110 | /** 111 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 112 | */ 113 | b, 114 | strong { 115 | font-weight: inherit; } 116 | 117 | /** 118 | * Add the correct font weight in Chrome, Edge, and Safari. 119 | */ 120 | b, 121 | strong { 122 | font-weight: bold; } 123 | 124 | /** 125 | * 1. Correct the inheritance and scaling of font size in all browsers. 126 | * 2. Correct the odd `em` font sizing in all browsers. 127 | */ 128 | code, 129 | kbd, 130 | samp { 131 | font-family: monospace, monospace; 132 | /* 1 */ 133 | font-size: 1em; 134 | /* 2 */ } 135 | 136 | /** 137 | * Add the correct font style in Android 4.3-. 138 | */ 139 | dfn { 140 | font-style: italic; } 141 | 142 | /** 143 | * Add the correct background and color in IE 9-. 144 | */ 145 | mark { 146 | background-color: #ff0; 147 | color: #000; } 148 | 149 | /** 150 | * Add the correct font size in all browsers. 151 | */ 152 | small { 153 | font-size: 80%; } 154 | 155 | /** 156 | * Prevent `sub` and `sup` elements from affecting the line height in 157 | * all browsers. 158 | */ 159 | sub, 160 | sup { 161 | font-size: 75%; 162 | line-height: 0; 163 | position: relative; 164 | vertical-align: baseline; } 165 | 166 | sub { 167 | bottom: -0.25em; } 168 | 169 | sup { 170 | top: -0.5em; } 171 | 172 | /* Embedded content 173 | ========================================================================== */ 174 | /** 175 | * Add the correct display in IE 9-. 176 | */ 177 | audio, 178 | video { 179 | display: inline-block; } 180 | 181 | /** 182 | * Add the correct display in iOS 4-7. 183 | */ 184 | audio:not([controls]) { 185 | display: none; 186 | height: 0; } 187 | 188 | /** 189 | * Remove the border on images inside links in IE 10-. 190 | */ 191 | img { 192 | border-style: none; } 193 | 194 | /** 195 | * Hide the overflow in IE. 196 | */ 197 | svg:not(:root) { 198 | overflow: hidden; } 199 | 200 | /* Forms 201 | ========================================================================== */ 202 | /** 203 | * 1. Change the font styles in all browsers (opinionated). 204 | * 2. Remove the margin in Firefox and Safari. 205 | */ 206 | button, 207 | input, 208 | optgroup, 209 | select, 210 | textarea { 211 | font-family: sans-serif; 212 | /* 1 */ 213 | font-size: 100%; 214 | /* 1 */ 215 | line-height: 1.15; 216 | /* 1 */ 217 | margin: 0; 218 | /* 2 */ } 219 | 220 | /** 221 | * Show the overflow in IE. 222 | * 1. Show the overflow in Edge. 223 | */ 224 | button, 225 | input { 226 | /* 1 */ 227 | overflow: visible; } 228 | 229 | /** 230 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 231 | * 1. Remove the inheritance of text transform in Firefox. 232 | */ 233 | button, 234 | select { 235 | /* 1 */ 236 | text-transform: none; } 237 | 238 | /** 239 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 240 | * controls in Android 4. 241 | * 2. Correct the inability to style clickable types in iOS and Safari. 242 | */ 243 | button, 244 | html [type="button"], 245 | [type="reset"], 246 | [type="submit"] { 247 | -webkit-appearance: button; 248 | /* 2 */ } 249 | 250 | /** 251 | * Remove the inner border and padding in Firefox. 252 | */ 253 | button::-moz-focus-inner, 254 | [type="button"]::-moz-focus-inner, 255 | [type="reset"]::-moz-focus-inner, 256 | [type="submit"]::-moz-focus-inner { 257 | border-style: none; 258 | padding: 0; } 259 | 260 | /** 261 | * Restore the focus styles unset by the previous rule. 262 | */ 263 | button:-moz-focusring, 264 | [type="button"]:-moz-focusring, 265 | [type="reset"]:-moz-focusring, 266 | [type="submit"]:-moz-focusring { 267 | outline: 1px dotted ButtonText; } 268 | 269 | /** 270 | * Correct the padding in Firefox. 271 | */ 272 | fieldset { 273 | padding: 0.35em 0.75em 0.625em; } 274 | 275 | /** 276 | * 1. Correct the text wrapping in Edge and IE. 277 | * 2. Correct the color inheritance from `fieldset` elements in IE. 278 | * 3. Remove the padding so developers are not caught out when they zero out 279 | * `fieldset` elements in all browsers. 280 | */ 281 | legend { 282 | -webkit-box-sizing: border-box; 283 | box-sizing: border-box; 284 | /* 1 */ 285 | color: inherit; 286 | /* 2 */ 287 | display: table; 288 | /* 1 */ 289 | max-width: 100%; 290 | /* 1 */ 291 | padding: 0; 292 | /* 3 */ 293 | white-space: normal; 294 | /* 1 */ } 295 | 296 | /** 297 | * 1. Add the correct display in IE 9-. 298 | * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. 299 | */ 300 | progress { 301 | display: inline-block; 302 | /* 1 */ 303 | vertical-align: baseline; 304 | /* 2 */ } 305 | 306 | /** 307 | * Remove the default vertical scrollbar in IE. 308 | */ 309 | textarea { 310 | overflow: auto; } 311 | 312 | /** 313 | * 1. Add the correct box sizing in IE 10-. 314 | * 2. Remove the padding in IE 10-. 315 | */ 316 | [type="checkbox"], 317 | [type="radio"] { 318 | -webkit-box-sizing: border-box; 319 | box-sizing: border-box; 320 | /* 1 */ 321 | padding: 0; 322 | /* 2 */ } 323 | 324 | /** 325 | * Correct the cursor style of increment and decrement buttons in Chrome. 326 | */ 327 | [type="number"]::-webkit-inner-spin-button, 328 | [type="number"]::-webkit-outer-spin-button { 329 | height: auto; } 330 | 331 | /** 332 | * 1. Correct the odd appearance in Chrome and Safari. 333 | * 2. Correct the outline style in Safari. 334 | */ 335 | [type="search"] { 336 | -webkit-appearance: textfield; 337 | /* 1 */ 338 | outline-offset: -2px; 339 | /* 2 */ } 340 | 341 | /** 342 | * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. 343 | */ 344 | [type="search"]::-webkit-search-cancel-button, 345 | [type="search"]::-webkit-search-decoration { 346 | -webkit-appearance: none; } 347 | 348 | /** 349 | * 1. Correct the inability to style clickable types in iOS and Safari. 350 | * 2. Change font properties to `inherit` in Safari. 351 | */ 352 | ::-webkit-file-upload-button { 353 | -webkit-appearance: button; 354 | /* 1 */ 355 | font: inherit; 356 | /* 2 */ } 357 | 358 | /* Interactive 359 | ========================================================================== */ 360 | /* 361 | * Add the correct display in IE 9-. 362 | * 1. Add the correct display in Edge, IE, and Firefox. 363 | */ 364 | details, 365 | menu { 366 | display: block; } 367 | 368 | /* 369 | * Add the correct display in all browsers. 370 | */ 371 | summary { 372 | display: list-item; } 373 | 374 | /* Scripting 375 | ========================================================================== */ 376 | /** 377 | * Add the correct display in IE 9-. 378 | */ 379 | canvas { 380 | display: inline-block; } 381 | 382 | /** 383 | * Add the correct display in IE. 384 | */ 385 | template { 386 | display: none; } 387 | 388 | /* Hidden 389 | ========================================================================== */ 390 | /** 391 | * Add the correct display in IE 10-. 392 | */ 393 | [hidden] { 394 | display: none; } 395 | 396 | body { 397 | font-family: 'Oxygen', sans-serif; 398 | font-size: 1em; 399 | font-weight: 300; 400 | line-height: 1.75; } 401 | 402 | h1, h2, h3, h4, h5, h6 { 403 | font-family: 'Playfair Display', serif; 404 | line-height: 1.25; 405 | margin: 3.125rem 0 1.25rem; } 406 | 407 | h1 { 408 | font-size: 2.5rem; } 409 | @media screen and (min-width: 740px) { 410 | h1 { 411 | font-size: 3.125rem; } } 412 | 413 | h2 { 414 | font-size: 1.875rem; } 415 | @media screen and (min-width: 740px) { 416 | h2 { 417 | font-size: 2.5rem; } } 418 | 419 | h3 { 420 | font-size: 1.5625rem; } 421 | @media screen and (min-width: 740px) { 422 | h3 { 423 | font-size: 1.875rem; } } 424 | 425 | h4 { 426 | font-size: 1.25rem; } 427 | 428 | h5, 429 | h6 { 430 | font-family: 'Oxygen', sans-serif; 431 | text-transform: uppercase; } 432 | 433 | .site-title { 434 | position: relative; 435 | display: inline-block; 436 | margin: 1.25em 0 0; } 437 | .site-title:before { 438 | position: absolute; 439 | top: 0; 440 | left: 1.1em; 441 | height: .5em; 442 | width: .5em; 443 | content: ''; 444 | background: linear-gradient(-45deg, #000, #280353, #D0B240); 445 | -webkit-box-shadow: -.5em 0 0 -.075em #000, -.5em 0 0 0 #D0B240, 0 -.5em 0 -.075em #000, 0 -.5em 0 0 #D0B240; 446 | box-shadow: -.5em 0 0 -.075em #000, -.5em 0 0 0 #D0B240, 0 -.5em 0 -.075em #000, 0 -.5em 0 0 #D0B240; 447 | -webkit-transform: translate(0, -50%) scale(0.5, 1) rotate(45deg); 448 | transform: translate(0, -50%) scale(0.5, 1) rotate(45deg); } 449 | 450 | .site-link { 451 | display: block; 452 | padding: 1.25rem 0; 453 | color: inherit; } 454 | .site-link:before, .site-link:after { 455 | position: absolute; 456 | bottom: 100%; 457 | height: .75em; 458 | width: .75em; 459 | content: ''; } 460 | .site-link:before { 461 | right: 100%; 462 | margin-right: -1.185em; 463 | background: linear-gradient(145deg, #000, #280353); 464 | -webkit-transform-origin: right bottom; 465 | transform-origin: right bottom; 466 | -webkit-transform: rotate(18deg) skew(45deg); 467 | transform: rotate(18deg) skew(45deg); } 468 | .site-link:after { 469 | left: 1.525em; 470 | background: linear-gradient(-145deg, #000, #280353); 471 | -webkit-transform-origin: left bottom; 472 | transform-origin: left bottom; 473 | -webkit-transform: rotate(-18deg) skew(-45deg); 474 | transform: rotate(-18deg) skew(-45deg); } 475 | 476 | a { 477 | text-decoration: none; } 478 | 479 | abbr[title] { 480 | text-decoration: none; } 481 | 482 | code:not([class*="language"]) { 483 | background: #eee; 484 | border: 1px solid #ddd; 485 | border-radius: 0.25em; 486 | padding: 0.125em 0.25em; } 487 | 488 | .post-content a { 489 | border-bottom: 1px dotted; 490 | color: #280353; 491 | -webkit-transition: color .25s; 492 | transition: color .25s; } 493 | .post-content a:focus, .post-content a:hover { 494 | color: #D0B240; } 495 | 496 | .post-content ul, 497 | .post-content ol { 498 | margin: 1.25em 0; } 499 | .post-content ul li, 500 | .post-content ol li { 501 | margin-top: 0.625em; } 502 | 503 | .post-content ol { 504 | counter-reset: li; 505 | list-style: none; 506 | padding-left: 1.5em; } 507 | .post-content ol > li:before { 508 | content: counter(li) ". "; 509 | counter-increment: li; 510 | font-weight: 700; } 511 | 512 | .post-content blockquote { 513 | margin: 1.25em 0; 514 | padding: 1.25em; 515 | font-size: 125%; 516 | font-weight: 400; } 517 | .post-content blockquote p { 518 | margin: 0; } 519 | 520 | svg { 521 | display: block; 522 | height: 1em; 523 | width: 1em; } 524 | 525 | /* Document */ 526 | /* Grid */ 527 | .row { 528 | max-width: 780px; 529 | margin-right: auto; 530 | margin-left: auto; 531 | padding-right: 20px; 532 | padding-left: 20px; } 533 | 534 | /* Page */ 535 | .page-header { 536 | margin-bottom: 3.75em; 537 | padding-top: 3.75em; } 538 | 539 | .page-footer { 540 | padding: 3.75em 0; } 541 | 542 | /* Main Nav */ 543 | .main-nav-list { 544 | display: inline-block; 545 | margin: 0; 546 | padding: 0.25em; 547 | list-style: none; 548 | background: linear-gradient(-45deg, #000, #280353 80%, #D0B240 100%); } 549 | 550 | .main-nav-item { 551 | display: inline-block; } 552 | 553 | .main-nav-link { 554 | display: block; 555 | padding: 0.625em 1.25em; 556 | font-weight: 700; 557 | color: #fff; 558 | -webkit-transition: background .25s, color .25s; 559 | transition: background .25s, color .25s; } 560 | .main-nav-link:focus, .main-nav-link:hover { 561 | background: #fff; 562 | color: #000; } 563 | 564 | /* Social Nav */ 565 | .social-nav-list { 566 | margin: 0; 567 | padding: 0; 568 | list-style: none; } 569 | 570 | .social-nav-item { 571 | display: inline-block; 572 | margin: 0 1.875em 0 0; } 573 | 574 | .social-nav-link { 575 | display: block; 576 | color: #000; 577 | -webkit-transition: color .25s; 578 | transition: color .25s; } 579 | .social-nav-link:focus, .social-nav-link:hover { 580 | color: #D0B240; } 581 | 582 | .social-nav-icon { 583 | display: inline-block; 584 | margin-right: 0.3125em; 585 | vertical-align: middle; } 586 | 587 | .social-nav-label { 588 | display: inline-block; 589 | font-size: 125%; 590 | font-weight: 700; 591 | vertical-align: middle; } 592 | 593 | /* Pager */ 594 | .pager-link { 595 | position: relative; 596 | display: inline-block; 597 | margin-right: 0.625em; 598 | padding: 0.3125em 0.625em; 599 | font-weight: 700; 600 | color: #000; 601 | -webkit-transition: color .25s; 602 | transition: color .25s; } 603 | .pager-link:focus, .pager-link:hover { 604 | color: #D0B240; } 605 | .pager-link:after { 606 | position: absolute; 607 | top: 50%; 608 | left: 100%; 609 | width: 0.625em; 610 | display: inline-block; 611 | border-bottom: 1px solid #280353; 612 | vertical-align: middle; 613 | content: ''; } 614 | .pager-link:last-child:after { 615 | display: none; } 616 | 617 | .post { 618 | border-bottom: 1px solid #D0B240; 619 | margin-bottom: 2.5em; 620 | padding-bottom: 2.5em; } 621 | .post:last-child { 622 | border-bottom: 0; 623 | margin-bottom: 0; 624 | padding-bottom: 0; } 625 | 626 | .post-detail-theme .post-header { 627 | margin-bottom: 2.5em; } 628 | 629 | .post-link { 630 | display: inline-block; 631 | color: #280353; 632 | -webkit-transition: color .25s; 633 | transition: color .25s; } 634 | .post-link:before { 635 | display: inline-block; 636 | vertical-align: middle; 637 | height: .25em; 638 | width: .25em; 639 | margin-right: 0.3125em; 640 | content: ''; 641 | background: #D0B240; 642 | -webkit-transform: rotate(45deg); 643 | transform: rotate(45deg); } 644 | .post-link:focus, .post-link:hover { 645 | color: #D0B240; } 646 | 647 | .post-summary { 648 | font-size: 125%; } 649 | 650 | .post-detail { 651 | margin-bottom: 0.625em; } 652 | .post-detail:last-child { 653 | margin-bottom: 0; } 654 | 655 | .post-detail-icon { 656 | display: inline-block; 657 | vertical-align: middle; 658 | margin-right: 0.9375em; } 659 | 660 | .post-detail-label { 661 | display: inline-block; 662 | vertical-align: middle; } 663 | 664 | .post-detail-link { 665 | border-bottom: 1px dotted; 666 | font-weight: 700; 667 | color: inherit; } 668 | 669 | .post-readmore { 670 | display: inline-block; 671 | border: 0.125em solid #D0B240; 672 | margin-right: 0.5em; 673 | margin-bottom: 0.5em; 674 | padding: 0.625em 1.25em; 675 | font-weight: 700; 676 | background: #000; 677 | color: #fff; 678 | -webkit-transition: background .25s, color .25s; 679 | transition: background .25s, color .25s; } 680 | .post-readmore:focus, .post-readmore:hover { 681 | background: #D0B240; 682 | color: #000; } 683 | 684 | .post-comments { 685 | padding: 2.5em 0; } 686 | 687 | [class^="language"] { 688 | display: block; 689 | overflow-x: auto; 690 | margin-bottom: 1.875em; 691 | padding: 1.25em; 692 | background: #272822; 693 | border-radius: 0.25em; 694 | color: #f8f8f8; } 695 | 696 | .hljs-comment { 697 | opacity: .45; } 698 | 699 | .hljs-attribute, 700 | .hljs-keyword { 701 | color: #80aafc; } 702 | 703 | .hljs-selector-class, 704 | .hljs-name, 705 | .hljs-string, 706 | .hljs-number, 707 | .hljs-literal { 708 | color: #72cdc6; } 709 | --------------------------------------------------------------------------------