├── .gitignore ├── README.md ├── assets ├── css │ └── style.css ├── images │ └── cover.jpg └── js │ └── script.js ├── author.hbs ├── default.hbs ├── error.hbs ├── home.hbs ├── index.hbs ├── package.json ├── page-contact.hbs ├── page.hbs ├── partials ├── contact.hbs ├── excerpt.hbs ├── nav-container.hbs ├── navigation.hbs └── pagination.hbs ├── post.hbs ├── private.hbs ├── screenshot1.png ├── screenshot2.png └── tag.hbs /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | development 3 | gulpfile.js 4 | assets/images/cover-old.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenWriter 2 | ### A free theme for Ghost 3 | 4 | I created this theme as a way to learn how Ghost works. It is available for free. If you use the theme or have any suggestions for improvements, do tweet me at [@ireaderinokun](https://twitter.com/ireaderinokun)! 5 | 6 | ![OpenWriter Example](screenshot1.png) 7 | 8 | ![OpenWriter Example](screenshot2.png) 9 | 10 | 11 | ## Getting Started 12 | 13 | If you are completely new to Ghost, you should read their [documentation here first](https://github.com/tryghost/Ghost). Otherwise, continue reading! 14 | 15 | To install this theme, simply download this repo as a zip file, extract, and place in your themes directory. In your Ghost backend, go to 'settings' and select the OpenWriter theme. 16 | 17 | 18 | ## Key features 19 | 20 | - Clean design with parallax scroll 21 | - Fully responsive design 22 | - Ready to use, no configuration needed 23 | - Support for all main ghost features - author pages, tag pages, etc. 24 | - Default cover image 25 | - Cover image size smaller on subsequent archive pages 26 | - Contact form pre-installed 27 | - Support for private blogs *NEW* 28 | 29 | 30 | ### Contact Form 31 | 32 | Thanks to [Formspree](http://formspree.io), I was able to include a free contact form. Because Ghost no longer allows themes to have direct access to your remail for security reasons, you will need to add your email address manually. To do this, follow these steps: 33 | 34 | 1. Find "contact.hbs" in the partials folder of the theme 35 | 2. Place your email address in the specified section on line 2 36 | 3. Save the file and activate OpenWriter as your theme 37 | 4. Create a new post 38 | 5. Title the post 'Contact' and make sure the post URL is also 'contact' 39 | 6. Under the settings, check the box that says "Turn this post into a static page" 40 | 7. Publish the page 41 | 8. Visit the Contact page and fill in the form once to activate it with Formspree 42 | 43 | 44 | 45 | ### Cover Images 46 | 47 | Each page features a cover image. This is determined by the following hierarchy: 48 | 49 | 1. The individual page's cover image 50 | 2. The blog's cover image 51 | 3. The default cover image bundled with the theme 52 | 53 | Special thanks to [The Stocks](http://thestocks.im/) for providing the default cover image under the Creative Commons Zero licence. 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | @import url(http://fonts.googleapis.com/css?family=PT+Mono);@import url(http://fonts.googleapis.com/css?family=Libre+Baskerville:700,400italic,400);html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}#hidden-nav{z-index:3}main{z-index:2}html{font-size:62.5%}body,input,textarea{font-family:"Libre Baskerville",serif;font-size:14px;font-size:1.4rem;line-height:1.8;font-weight:400;color:#505050}h1{font-family:"Libre Baskerville",serif;font-size:30px;font-size:3rem;color:#fafafa}h2{font-size:22px;font-size:2.2rem}h2 a{text-decoration:none}h3{font-size:14px;font-size:1.4rem;font-weight:700;color:#c8c8c8}label{font-style:italic}a{color:inherit;font-weight:700;text-decoration:none;transition:color 0.6s}a:hover{color:#710109}nav a{text-decoration:none}.btn,input[type="submit"],.homepage-links li a{font-family:"Libre Baskerville",serif;font-size:12px;font-size:1.2rem}small{font-size:12px;font-size:1.2rem}blockquote{font-size:2rem}.regular nav{font-size:12px;font-size:1.2rem}.regular nav .fa{font-size:18px;font-size:1.8rem}pre,code{font-family:"PT Mono",monospace}.btn,input[type="submit"],.homepage-links li a{width:16rem;min-height:3.5rem;margin:1rem 0;padding:0.4rem;text-align:center;border:3px solid #710109;border-radius:20px;display:inline-block;transition:background-color 0.6s, color 0.6s}.btn:hover,input[type="submit"]:hover,.homepage-links li a:hover,.btn:focus,input[type="submit"]:focus,.homepage-links li a:focus{background-color:#710109;color:#fafafa}.pagination{margin-top:1rem}.pagination .page-number{margin:0 1rem}span.error-message{padding-bottom:1rem;display:block}body main,body footer{top:50vh;position:relative}body.error-template main,body.error-template footer,body.author-template main,body.author-template footer,body.home-template main,body.home-template footer,body.private-template main,body.private-template footer{top:0}header.regular{position:fixed;top:0;left:0;background-size:cover;background-position:center;width:100%;height:50vh}header.regular nav{color:#fafafa}.title-container{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%);width:75%;text-align:center}.regular nav{position:absolute;top:0;left:0;width:100%;height:50px;padding:0 7%;line-height:50px}.regular nav:after{content:"";display:table;clear:both}.brand{float:left}.brand img{height:35px;width:auto;margin-top:7px}ul.navigation{float:right}@media screen and (min-width: 600px){ul.navigation li{display:inline-block;padding:0 5px;margin:0 5px}ul.navigation li#show-nav{display:none}}@media screen and (max-width: 600px){ul.navigation li{display:none}ul.navigation li#show-nav{display:inline-block}}#hidden-nav{top:-50vh;position:fixed;width:100%;height:50vh;background-color:#c8c8c8;text-align:center;padding:20px}#hidden-nav ul{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%);width:85%}#hidden-nav li{display:block;padding:1rem;border-bottom:1px solid #fafafa}#hidden-nav li a{text-decoration:none}#hidden-nav li:last-child{border-bottom:none}p{margin-bottom:1.5rem}blockquote{margin-bottom:1.5rem;border-left:5px solid #c8c8c8;padding:1rem;quotes:"“" "”" "‘" "’"}blockquote p{margin-bottom:0}blockquote:before{content:open-quote;float:left;padding-right:1rem;font-size:5rem;line-height:1;color:#c8c8c8}pre,code{background-color:#fff}code{padding:0 5px}pre{padding:10px;margin-bottom:1.5rem}.post-content h1,.post-content h2,.post-content h3{margin:2.5rem 0 1.5rem}.post-content ul{list-style-type:disc}.post-content ul,.post-content ol{display:block;width:100%;padding-left:10%;margin-bottom:1.5rem}.post-content img{max-width:100%;height:auto;margin:0 auto}.post-excerpt{padding:2rem 0;border-top:1px solid #c8c8c8}.post-excerpt:after{content:"";display:table;clear:both}.post-excerpt hgroup{padding-bottom:2rem}.post-excerpt .read-more{float:right}.post-excerpt:first-child{border-top:none}.pagination{width:100%;text-align:center;margin-bottom:20px}textarea,input,input[type="text"],input[type="button"],input[type="submit"]{-webkit-appearance:none;-moz-appearance:none;border-radius:0}input,textarea{margin:0.3rem auto 1rem;padding:5px;text-align:center;border:3px solid #c8c8c8;width:85%;max-width:400px;outline:none}input:focus,textarea:focus{border:3px solid #710109}input{height:3.5rem}input[type="submit"]{border-radius:20px;background-color:#fafafa;cursor:pointer}label,input,textarea{display:block}#contactform{text-align:center;margin-top:3rem}html,body{background-color:#fafafa}main{width:100%;padding:3rem 7% 2rem;margin:0 auto;background-color:#fafafa;position:relative}.post-content,.post-excerpt{max-width:960px;margin-left:auto;margin-right:auto}footer{height:70px;border-top:1px solid #c8c8c8;text-align:center;padding:20px;position:relative;background-color:#fff}#homepage-hero{background-size:cover;background-position:center;width:100%;height:100vh;position:relative;color:#fafafa}#homepage-hero .btn,#homepage-hero input[type="submit"],#homepage-hero .homepage-links li a,.homepage-links li #homepage-hero a{margin:1rem}.blog-description{margin:2rem auto}.homepage-links li{display:inline-block}.homepage-links li a{display:inline-block}body.post-template .post-excerpt .author{display:none}.post-meta,.tags{color:#fafafa}.tags{margin-top:1.5rem}.post-footer{margin-top:3rem;padding-top:2rem;padding-bottom:3rem;text-align:center}.post-footer .share .fa{width:30px;height:30px;background-color:#c8c8c8;color:#fafafa;border-radius:50%;text-align:center;padding:8px;margin:5px 0 0 5px;transition:background-color 0.6s}.post-footer .share .fa:hover{background-color:#710109}.more-post{border-top:1px solid #c8c8c8;text-align:left} 2 | -------------------------------------------------------------------------------- /assets/images/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ireade/openwriter/7aebf7e3fe3af3c4f34ffdc4e167b4dd0786d1ff/assets/images/cover.jpg -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | function parallax(){$(document).on("scroll",function(){var n=$(document).scrollTop(),o=-(n/2);$("header.regular").css("top",o),$("header.regular .title-container").css("opacity",1-n/300)})}$(document).ready(function(){parallax(),$("a#blog").on("click",function(){return $("html, body").animate({scrollTop:$("#home-latest-post").offset().top},1e3),!1}),$("#show-nav").on("click",function(){return $("#hidden-nav").animate({top:"0"},800),$("#hidden-nav").addClass("open"),!1}),$("#hide-nav").on("click",function(){return $("#hidden-nav").animate({top:"-50vh"},800),$("#hidden-nav").removeClass("open"),!1})}); -------------------------------------------------------------------------------- /author.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | 3 | {{#author}} 4 |
15 |
16 | 17 |

{{name}}

18 |

{{bio}}

19 | 20 | 33 |
34 | 35 |
36 | {{/author}} 37 | 38 |
39 | {{#foreach posts}} 40 | {{> excerpt}} 41 | {{/foreach}} 42 | 43 | {{pagination}} 44 |
-------------------------------------------------------------------------------- /default.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{meta_title}} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{ghost_head}} 14 | 15 | 16 | 17 | {{{body}}} 18 | 19 | 24 | 25 | {{ghost_foot}} 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /error.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Oops! 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{ghost_head}} 14 | 15 | 16 | 17 |
24 |
25 |

Uh Oh!

26 |

There seems to be a problem, we can't find what you are looking for.

27 | 28 | 31 |
32 |
33 | {{ghost_foot}} 34 | 35 | -------------------------------------------------------------------------------- /home.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | 3 |
10 | 11 |
12 |

{{@blog.title}}

13 |

{{@blog.description}}

14 | 15 | 19 |
20 | 21 |
22 | 23 |
24 | {{#foreach posts}} 25 | {{> excerpt}} 26 | {{/foreach}} 27 | 28 | {{pagination}} 29 |
-------------------------------------------------------------------------------- /index.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | 3 |
10 | {{> nav-container}} 11 | 12 |
13 |

Latest Blog Posts

14 |
15 |
16 | 17 |
18 | {{#foreach posts}} 19 | {{> excerpt}} 20 | {{/foreach}} 21 | 22 | {{pagination}} 23 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "OpenWriter", 3 | "version": "1.1.0", 4 | "description": "An open theme for Ghost", 5 | "main": "gulpfile.js", 6 | "devDependencies": { 7 | "gulp-concat": "^2.4.2", 8 | "gulp": "^3.8.10", 9 | "gulp-sass": "^1.1.0", 10 | "gulp-uglify": "^1.0.1", 11 | "gulp-util": "^3.0.1" 12 | }, 13 | "author": "Ire Aderinokun" 14 | } 15 | -------------------------------------------------------------------------------- /page-contact.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | {{#post}} 3 |
14 | {{> nav-container}} 15 | 16 |
17 |

{{title}}

18 |
19 |
20 | 21 |
22 |
{{content}}
23 | 24 | {{> contact}} 25 | 26 |
27 | {{/post}} -------------------------------------------------------------------------------- /page.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | {{#post}} 3 |
14 | {{> nav-container}} 15 | 16 |
17 |

{{title}}

18 |
19 |
20 | 21 |
22 |
{{content}}
23 |
24 | {{/post}} -------------------------------------------------------------------------------- /partials/contact.hbs: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
-------------------------------------------------------------------------------- /partials/excerpt.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{{{title}}}

4 |

Posted on by {{author}}

5 |
6 |
7 | {{excerpt words="80"}}... 8 |
9 |
Continue Reading
10 |
-------------------------------------------------------------------------------- /partials/nav-container.hbs: -------------------------------------------------------------------------------- 1 | 19 | 20 | {{#if @blog.navigation}} 21 |
22 | 26 |
27 | {{/if}} -------------------------------------------------------------------------------- /partials/navigation.hbs: -------------------------------------------------------------------------------- 1 | {{#foreach navigation}} 2 |
  • {{label}}
  • 3 | {{/foreach}} -------------------------------------------------------------------------------- /partials/pagination.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /post.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | {{#post}} 3 |
    14 | {{> nav-container}} 15 | 16 |
    17 |

    {{title}}

    18 | 19 | 20 | {{#if tags}} 21 |
    22 | {{tags}} 23 |
    24 | {{/if}} 25 |
    26 |
    27 | 28 |
    29 |
    {{content}}
    30 | 31 |
    32 | 33 | 44 | 45 | 46 | 47 |
    48 | 49 | {{#prev_post}} 50 |
    51 | {{> excerpt}} 52 |
    53 | {{else}} 54 | {{/prev_post}} 55 | 56 | 57 |
    58 | {{/post}} -------------------------------------------------------------------------------- /private.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | 3 |
    10 | 11 |
    12 |

    {{@blog.title}}

    13 |

    {{@blog.description}}

    14 | 15 | {{#if error}} 16 | {{error.message}} 17 | {{/if}} 18 |
    19 | 20 | {{input_password}} 21 | 22 |
    23 |
    24 | 25 |
    -------------------------------------------------------------------------------- /screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ireade/openwriter/7aebf7e3fe3af3c4f34ffdc4e167b4dd0786d1ff/screenshot1.png -------------------------------------------------------------------------------- /screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ireade/openwriter/7aebf7e3fe3af3c4f34ffdc4e167b4dd0786d1ff/screenshot2.png -------------------------------------------------------------------------------- /tag.hbs: -------------------------------------------------------------------------------- 1 | {{!< default}} 2 | 3 |
    10 | {{> nav-container}} 11 | 12 |
    13 |

    {{tag.name}}

    14 | 21 |
    22 |
    23 | 24 |
    25 | {{#foreach posts}} 26 | {{> excerpt}} 27 | {{/foreach}} 28 | 29 | {{pagination}} 30 |
    --------------------------------------------------------------------------------