Compare commits

...

79 Commits
2.1.1 ... 2.6.3

Author SHA1 Message Date
8a9efb5ef1 Upgrading Casper to 2.6.3 2018-09-25 11:32:08 +07:00
04854967a8 Adjusting spaces for galleries and wide images in a sequence (#480) 2018-09-24 14:35:47 +02:00
fa18115aa6 Upgrading Casper to 2.6.2 2018-09-11 13:42:34 +02:00
ae192a9fff 🐛 Fixed word-wrap for extra long anchor links text (#478)
refs #466

Anchor links didn't break, when the text was too long. Using `word-break: break-all` specifically on a-tags in post-content fixes this without screwing up other tags and their breaks.
2018-09-07 14:45:18 +02:00
78993720fd Upgrading Casper to 2.6.1 2018-08-31 11:26:01 +01:00
676e17bd13 Restructure spacings for generic figure element 2018-08-31 11:24:50 +01:00
67e595741c Upgrading Casper to 2.6.0 2018-08-30 17:45:43 +01:00
7a88c88ea2 Added Koenig gallery card support (#475)
no issue

- Update CSS and JS for new gallery card
- Updates CSS to support new gallery card
- Adds JS to support grid layout for gallery view
- Fix gallery breakout size
- Refining styles for gallery card
2018-08-30 17:44:55 +01:00
a0e42e0599 Rebuild CSS 2018-08-30 14:56:38 +01:00
dc3bb316c7 Fixed incorrect image aspect ratio when images have width/height attrs
no issue
- when large images have width/height attributes but the image is constrained to it's container or `max-width` style the aspect ratio would be broken because browsers use the `height` attribute value even though the width is smaller
2018-08-30 14:49:40 +01:00
7380ed0291 Upgrading Casper to 2.5.1 2018-08-22 14:31:02 +02:00
ecaf3d921f 🐛 Fixed image positioning on pages
closes https://github.com/TryGhost/Casper/issues/473
- added missing `<div class="post-content">` wrapper around `{{content}}`
2018-08-21 17:47:42 +01:00
89ea6c5872 Upgrading Casper to 2.5.0 2018-08-16 13:59:03 +02:00
9d803067a4 🛠 Added .travis.yml and gscan tests (#470)
- Add gscan dependency & travis.yml file, so that we can run gscan as a test for this repo
- This check tells us whether or not the theme is valid & compatible with Ghost according to gscan
- We recommend that all themes do this!
2018-08-14 22:10:01 +01:00
0ea375643b Added required "ghost-theme" keyword
- We're going to start showing this as a warning in gscan
- The purpose is to give us a way to detect if a package is a valid Ghost theme
2018-08-13 14:29:56 +01:00
f31957bd0d Replaced {{author}} by {{primary_author}} in byline-single.hbs
refs https://github.com/TryGhost/gscan/issues/99

- single author usages will be deprecated in Ghost 2.0
- make Casper 100% compatible with Ghost 2.0
2018-08-12 15:02:03 +02:00
36841d4624 Set minimum Ghost version to 2.0 2018-08-11 20:22:43 +01:00
d41fcbbc8a Remove .kg-card-markdown styles
no issue
- `.kg-card-markdown` no longer exists in Ghost 2.x
2018-08-11 19:09:58 +01:00
5d318225f5 Upgrading Casper to 2.4.2 2018-08-08 17:08:21 +02:00
9b56779ca6 Use id attribute to query reading progress element (#467)
no issue
- using an `id` selector doesn't break if other `progress` elements are present on a page
2018-08-03 09:21:05 +01:00
1bf2cdb52a Upgrading Casper to 2.4.1 2018-07-31 11:31:35 +01:00
f67caaba5c 🐛 Fixed content overflow on mobile
closes https://github.com/TryGhost/Casper/issues/464
- setting max-width of `kg-markdown-card` wrapper that is still used by non-Koenig posts
2018-07-30 12:21:17 +01:00
25d1e368d6 Upgrading Casper to 2.4.0 2018-07-24 15:13:30 +02:00
5c6cce1519 Ghost 1.25 Koenig updates (#463)
refs https://github.com/TryGhost/Ghost/pull/9741
- Ghost 1.25 has updated the HTML output of Koenig beta posts
  - the `<div class="kg-post">` wrapper around post content has been removed
  - for image cards the `.kg-image-wide` and `.kg-image-full` classes have been changed to `.kg-width-wide` and `.kg-width-full` and applied to the `<figure>` element rather than the `<img>` element
- this will be the default for *all* posts after upgrading to Ghost 2.0

Example output of the `{{content}}` helper for Koenig beta...

Before 1.25.0 (Ghost 1.23.0-1.24.9):
```html
<div class="kg-post">
    <figure class="kg-image-card">
        <img class="kg-image kg-image-wide" src="...">
        <figcaption>example wide image</figcaption>
    </figure>
</div>
```

After 1.25.0:
```html
<figure class="kg-image-card kg-width-wide">
    <img class="kg-image" src="...">
    <figcaption>example wide image</figcaption>
</figure>
```

For reference, in Ghost 1.x a non Koenig post with nothing but an image in the markdown (`![](...)`) would generate output like this:

```html
<div class="kg-card-markdown">
    <img src="...">
</div>
```
2018-07-23 12:20:46 +01:00
019842155a Upgrading Casper to 2.3.3 2018-06-14 17:00:26 +01:00
1860a8305b Koenig embed card (#460) 2018-06-13 18:34:59 +01:00
6417b4cf2a Fix rendering bug for non-square user images 2018-06-06 19:29:22 -07:00
1c61bc5f16 Upgrading Casper to 2.3.2 2018-05-29 16:10:07 +01:00
7a7f04c716 Update built files 2018-05-29 16:09:40 +01:00
fd56128f9b Upgrading Casper to 2.3.1 2018-05-29 15:40:50 +01:00
cd3b470c18 Fix for missing default avatar and firefox footer misalignment (#458) 2018-05-29 10:38:27 +02:00
f3b44a7411 Upgrading Casper to 2.3.0 2018-05-22 20:17:56 +01:00
b83917060f Applying styles for Koenig content (#455)
refs https://github.com/TryGhost/Ghost/issues/9311
- move `.kg-card-markdown` styles and add deprecation notice
- add support for new `.kg-post` wrapper
- add support for `.kg-image` and `.kg-image-wide/full` image variants
- add support for image captions
2018-05-22 19:09:58 +01:00
4aaedf69d2 Running CSSComb 2018-05-21 17:36:08 +02:00
03ac0d91b8 Upgrading Casper to 2.2.1 2018-04-24 10:53:15 +08:00
b55d5e2b32 Remove unnecessary role attributes from main element
Source: https://validator.w3.org/nu/#textarea
2018-04-17 22:19:05 +02:00
4fe2eac739 Additional comments 2018-04-12 10:05:53 +02:00
6e3399366d Small refactor of multi-authors 2018-04-12 10:05:40 +02:00
98e9c12018 Split out different byline templates into separate files 2018-04-11 11:05:25 +02:00
986a954f33 Upgrading Casper to 2.2.0
no issue
2018-04-10 23:27:53 +02:00
636882bce4 Fix mobile display bug on smaller screens 2018-04-10 20:34:35 +02:00
79e113226c Multiple authors in Casper (#448) 2018-04-10 20:19:29 +02:00
8e865b797b Maybe fix it properly this time instead of completely failing 2018-04-10 15:29:09 +02:00
a655b59e69 Fix link target size 2018-04-10 15:27:01 +02:00
b078dcb86e Updated hover animations 2018-04-10 15:21:25 +02:00
d5002f2c51 🐛 Fixed infinitescroll when a paged url is loaded directly (#447)
closes #445
- added an fn to sanitize the pathname, that might include a pagination url
- fixed an issue, where the request would still be made if the current page is bigger than max pages
- added comments
2018-04-10 10:04:43 +01:00
41bcbb7157 💨 Infinite scroll perf improvements
no issue
- swap jQuery HTML parsing and insertion for pure DOM
- remove fade animation
- increase buffer by 100px so next page request happens sooner
2018-04-09 11:03:48 +01:00
452776939c Added yarn.lock and updated README for new yarn scripts
no issue
2018-04-09 16:19:05 +08:00
57c31ddacb Add HTML lang head tag (#429)
Refs #286
2018-04-06 20:49:42 +02:00
21088b1d38 Slack -> Forum
- replacing references to slack with forum
2018-04-02 16:35:21 +01:00
16f283e675 Upgrading Casper to 2.1.10 2018-03-16 15:53:45 +07:00
942054ba0d Revert "Upgrading Casper to 2.2.0"
This reverts commit 782aba3991.
2018-03-16 15:52:56 +07:00
782aba3991 Upgrading Casper to 2.2.0 2018-03-16 09:50:09 +07:00
9df85fbbe5 CSS built and comb
no issue
2018-02-27 11:48:17 +07:00
1e10549ee2 🐛Fixed render issue with code blocks in lists (#436)
Closes #415

* Add max-width to ul & ol tags
2018-02-27 11:43:39 +07:00
a6eb6848de Removed obsolete gulp-nodemon (#435)
Closes #420

* Remove gulp-nodemon from dev dependencies
* Remove required dependency from gulpfile
2018-02-27 11:18:32 +07:00
6788302f62 🐛Removed unnecessary slash from Feedly URL (#437)
closes #434.
2018-02-27 11:11:29 +07:00
67e55abfed Upgrading Casper to 2.1.9 2018-01-23 16:19:58 +00:00
bfaae0f7ba 🐛 Fixed Feedly URL and protocol (#418)
no issue

* Changed Feedly URL to HTTPS protocol
* Updated Feedly URL pattern
2018-01-23 10:30:03 +07:00
edfafffd32 Upgrading Casper to 2.1.8 2018-01-03 13:47:12 +00:00
7798bf115f 2018 2018-01-02 21:48:53 +00:00
9395846fdf Upgrading Casper to 2.1.7 2017-11-21 21:26:49 +08:00
99fad4cbc4 Fix colors in code blocks
Closes #407
The font color should be inherited to avoid "invisible" text.

* fix conflicts with upstream branch
2017-11-21 17:50:54 +08:00
990f712209 💅 CSS comb and built
no issue
2017-11-20 13:42:32 +08:00
4ff4b4c7f8 Removed double semicolons (#400)
no issue
2017-11-20 13:38:20 +08:00
de05d90fe9 Upgrading Casper to 2.1.6 2017-10-26 19:03:21 +07:00
978e54403c 🐛 Do not exclude assets/css from built zips
no issue

https://github.com/TryGhost/Casper/pull/403 added optimisations for reducing size of zip files but unfortunately it also stripped out `assets/css` which means that it's no longer possible to download the theme from the admin panel and use it for development.

- remove `assets/css` from the ignored files in the `zip` task
2017-10-24 12:08:26 +01:00
73bd9c630e Upgrading Casper to 2.1.5 2017-10-24 16:10:48 +07:00
9597a28320 🎨 Optimized gulp zip file generation (#403)
no issue

- Optimised the `gulp zip` task, so the zip file doesn't include the `assets/css` (`built` folder is used for CSS) and the `dist` folder (is used to output the zip file)
2017-10-23 16:52:52 +07:00
461639886e Upgrading Casper to 2.1.4 2017-10-03 18:20:14 +07:00
7592ad182b 🔒 Added rel="noopener" to all target="_blank" links (#398)
closes #394
- closes potential phishing avenues by preventing external sites from changing the blogs url in the background after opening
- see https://mathiasbynens.github.io/rel-noopener/ for more info
2017-10-03 16:42:08 +07:00
97a522a037 Fix permissions on certain files 2017-10-02 13:29:23 +01:00
25f12d760b Fix typo in default.hbs (#393) 2017-09-29 08:23:39 -04:00
4f78d99112 Upgrading Casper to 2.1.3 2017-09-26 14:38:05 +01:00
f5b7b45f2e Remove /dist/casper.zip
no issue

With https://github.com/TryGhost/Casper/pull/384 the directory `/dist` was created and includes a `casper.zip` file. The PR, that got merged after that (https://github.com/TryGhost/Casper/pull/374) actually implemented the creation of this, but also added the directory to `.gitignore` so it wouldn't be pushed to the repo.
2017-09-19 12:01:17 +07:00
d34ff1d32b Add a Gulp task to create the zip (#374) 2017-09-18 09:37:00 -07:00
73a1ab52da Add the same .editorconfig as from the Ghost repository (#384) 2017-09-18 09:35:53 -07:00
5ec77dfb31 Upgrading Casper to 2.1.2 2017-09-12 18:34:23 +07:00
269d2b5787 Fix border radius bug on featured posts 2017-09-07 09:34:44 -07:00
33 changed files with 5597 additions and 166 deletions

17
.editorconfig Normal file
View File

@ -0,0 +1,17 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.hbs]
insert_final_newline = false
[*.md]
trim_trailing_whitespace = false

View File

@ -1,4 +1,4 @@
Do you need help or have a question? Please come chat in Slack: https://ghost.org/slack 👫.
Do you need help or have a question? Please come chat in our forum: https://forum.ghost.org 👫.
If you're filing a bug 🐛, please include the following information:

5
.gitignore vendored
View File

@ -13,9 +13,12 @@ results
npm-debug.log
node_modules
package-lock.json
.idea/*
*.iml
projectFilesBackup
.DS_Store
.DS_Store
dist/

6
.travis.yml Normal file
View File

@ -0,0 +1,6 @@
language: node_js
sudo: false
node_js:
- "8"

View File

@ -1,4 +1,4 @@
Copyright (c) 2013-2017 Ghost Foundation
Copyright (c) 2013-2018 Ghost Foundation
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation

View File

@ -34,12 +34,18 @@ One really neat trick is that you can also create custom one-off templates just
Casper styles are compiled using Gulp/PostCSS to polyfill future CSS spec. You'll need Node and Gulp installed globally. After that, from the theme's root directory:
`$ npm install`
`$ gulp`
```bash
$ yarn install
$ yarn dev
```
Now you can edit `/assets/css/` files, which will be compiled to `/assets/built/` automatically.
The `zip` Gulp task packages the theme files into `dist/<theme-name>.zip`, which you can then upload to your site.
```bash
$ yarn zip
```
# PostCSS Features Used
@ -57,4 +63,4 @@ You can add your own SVG icons in the same manner.
# Copyright & License
Copyright (c) 2013-2017 Ghost Foundation - Released under the [MIT license](LICENSE).
Copyright (c) 2013-2018 Ghost Foundation - Released under the [MIT license](LICENSE).

View File

@ -1,2 +1,2 @@
a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{max-width:100%}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{margin:.67em 0;font-size:2em}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit}button{overflow:visible;border:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}html{overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{overflow-x:hidden}body{color:#3c484e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on}::-moz-selection{text-shadow:none;background:#cbeafb}::selection{text-shadow:none;background:#cbeafb}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid #e3e9ed}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{margin:0;padding:0;border:0}textarea{resize:vertical}blockquote,dl,ol,p,ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0 1em}ul{list-style:disc}ol{list-style:decimal}li{margin:.5em 0;padding-left:.3em;line-height:1.6em}dt{float:left;margin:0 20px 0 0;width:120px;color:#15171a;font-weight:500;text-align:right}dd{margin:0 0 5px;text-align:left}blockquote{margin:1.5em 0;padding:0 1.6em;border-left:.5em solid #e5eff5}blockquote p{margin:.8em 0;font-size:1.2em;font-weight:300}blockquote small{display:inline-block;margin:.8em 0 .8em 1.5em;font-size:.9em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#26a8ed;text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility}h1{margin:0 0 .5em;font-size:5rem;font-weight:700}@media (max-width:500px){h1{font-size:2.2rem}}h2{margin:1.5em 0 .5em;font-size:2rem}@media (max-width:500px){h2{font-size:1.8rem}}h3{margin:1.5em 0 .5em;font-size:1.8rem;font-weight:500}@media (max-width:500px){h3{font-size:1.7rem}}h4{margin:1.5em 0 .5em;font-size:1.6rem;font-weight:500}h5,h6{margin:1.5em 0 .5em;font-size:1.4rem;font-weight:500}
a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{max-width:100%}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{margin:.67em 0;font-size:2em}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit}button{overflow:visible;border:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}html{overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{overflow-x:hidden}body{color:#3c484e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on}::-moz-selection{text-shadow:none;background:#cbeafb}::selection{text-shadow:none;background:#cbeafb}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid #e3e9ed}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{margin:0;padding:0;border:0}textarea{resize:vertical}blockquote,dl,ol,p,ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0 1em}ul{list-style:disc}ol{list-style:decimal}ol,ul{max-width:100%}li{margin:.5em 0;padding-left:.3em;line-height:1.6em}dt{float:left;margin:0 20px 0 0;width:120px;color:#15171a;font-weight:500;text-align:right}dd{margin:0 0 5px;text-align:left}blockquote{margin:1.5em 0;padding:0 1.6em;border-left:.5em solid #e5eff5}blockquote p{margin:.8em 0;font-size:1.2em;font-weight:300}blockquote small{display:inline-block;margin:.8em 0 .8em 1.5em;font-size:.9em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#26a8ed;text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility}h1{margin:0 0 .5em;font-size:5rem;font-weight:700}@media (max-width:500px){h1{font-size:2.2rem}}h2{margin:1.5em 0 .5em;font-size:2rem}@media (max-width:500px){h2{font-size:1.8rem}}h3{margin:1.5em 0 .5em;font-size:1.8rem;font-weight:500}@media (max-width:500px){h3{font-size:1.7rem}}h4{margin:1.5em 0 .5em;font-size:1.6rem;font-weight:500}h5,h6{margin:1.5em 0 .5em;font-size:1.4rem;font-weight:500}
/*# sourceMappingURL=global.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -267,7 +267,6 @@ th {
padding: 0;
}
/* ==========================================================================
Base styles: opinionated defaults
========================================================================== */
@ -360,6 +359,11 @@ ol {
list-style: decimal;
}
ul,
ol {
max-width: 100%;
}
li {
margin: 0.5em 0;
padding-left: 0.3em;
@ -383,7 +387,7 @@ dd {
blockquote {
margin: 1.5em 0;
padding: 0 1.6em 0 1.6em;
border-left: var(--whitegrey) 0.5em solid;;
border-left: var(--whitegrey) 0.5em solid;
}
blockquote p {

View File

@ -13,9 +13,12 @@ production stylesheet in assets/built/screen.css
7. Single Post
7.1. Subscribe Form
7.2. Post Footer
7.2.1 Single Author Byline
7.2.2 Multiple Author Byline
7.3. Comments
7.4. Related Posts
7.5. Floating Header
7.6. Koenig Styles
8. Author Template
9. Error Template
10. Subscribe Overlay
@ -36,8 +39,8 @@ body {
display: block;
width: 100%;
height: 100%;
background-size: cover;
background-position: center center;
background-size: cover;
border-radius: 100%;
}
@ -70,9 +73,9 @@ body {
/* Centered content container blocks */
.inner {
width: 100%;
max-width: 1040px;
margin: 0 auto;
max-width: 1040px;
width: 100%;
}
/* Usage:
@ -149,9 +152,9 @@ body {
flex-direction: column;
justify-content: center;
align-items: center;
padding: 10vw 4vw;
min-height: 200px;
max-height: 450px;
padding: 10vw 4vw;
text-align: center;
}
@ -196,8 +199,8 @@ body {
display: flex;
justify-content: space-between;
align-items: flex-start;
height: 40px;
overflow-y: hidden;
height: 40px;
font-size: 1.2rem;
}
@ -206,11 +209,12 @@ body {
align-items: center;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
margin-right: 10px;
padding-bottom: 80px;
letter-spacing: 0.4px;
white-space: nowrap;
-webkit-overflow-scrolling: touch;
-ms-overflow-scrolling: touch;
}
@ -348,8 +352,8 @@ The knock-on effect of this is ugly browser-scroll bars at the bottom, so 80px o
}
.rss-button svg {
height: 2.1rem;
margin-bottom: 1px;
height: 2.1rem;
fill: #fff;
}
@ -383,9 +387,9 @@ The knock-on effect of this is ugly browser-scroll bars at the bottom, so 80px o
flex: 1 1 300px;
display: flex;
flex-direction: column;
min-height: 300px;
overflow: hidden;
margin: 0 20px 40px;
min-height: 300px;
background: #fff center center;
background-size: cover;
border-radius: 5px;
@ -394,9 +398,9 @@ The knock-on effect of this is ugly browser-scroll bars at the bottom, so 80px o
}
.post-card:hover {
box-shadow: 0 0 1px rgba(39,44,49,0.10), 0 3px 16px rgba(39, 44, 49,0.07);
transition: all 0.3s ease;
transform: translate3D(0, -1px, 0);
box-shadow: rgba(39,44,49,0.07) 8px 28px 50px, rgba(39, 44, 49, 0.04) 1px 6px 12px;
transition: all 0.4s ease;
transform: translate3D(0, -1px, 0) scale(1.02);
}
.post-card-image-link {
@ -415,6 +419,7 @@ The knock-on effect of this is ugly browser-scroll bars at the bottom, so 80px o
.post-card-content-link {
position: relative;
flex-grow: 1;
display: block;
padding: 25px 25px 0;
color: var(--darkgrey);
@ -451,20 +456,138 @@ The knock-on effect of this is ugly browser-scroll bars at the bottom, so 80px o
}
.post-card-meta {
display: flex;
justify-content: space-between;
align-items: flex-end;
padding: 0 25px 25px;
}
.author-profile-image {
width: 25px;
height: 25px;
margin-right: 5px;
.author-profile-image,
.avatar-wrapper {
display: block;
width: 100%;
height: 100%;
background: color(var(--lightgrey) l(+10%));
border-radius: 100%;
object-fit: cover;
}
.post-card-author {
font-size: 1.3rem;
.post-card-meta .profile-image-wrapper,
.post-card-meta .avatar-wrapper {
position: relative;
}
.author-list {
display: flex;
flex-wrap: wrap-reverse;
margin: 0;
padding: 0;
list-style: none;
}
.author-list-item {
position: relative;
flex-shrink: 0;
margin: 0;
padding: 0;
}
.author-list-item:nth-child(1) {
z-index: 10;
}
.author-list-item:nth-child(2) {
z-index: 9;
}
.author-list-item:nth-child(3) {
z-index: 8;
}
.author-list-item:nth-child(4) {
z-index: 7;
}
.author-list-item:nth-child(5) {
z-index: 6;
}
.author-list-item:nth-child(6) {
z-index: 5;
}
.author-list-item:nth-child(7) {
z-index: 4;
}
.author-list-item:nth-child(8) {
z-index: 3;
}
.author-list-item:nth-child(9) {
z-index: 2;
}
.author-list-item:nth-child(10) {
z-index: 1;
}
.static-avatar {
display: block;
overflow: hidden;
margin: 0 -5px;
width: 34px;
height: 34px;
border: #fff 2px solid;
border-radius: 100%;
}
.moving-avatar {
display: block;
overflow: hidden;
margin: 0 -6px;
width: 56px;
height: 56px;
border: #fff 2px solid;
border-radius: 100%;
transition: all 0.5s cubic-bezier(0.4, 0.01, 0.165, 0.99) 0.7s;
}
@media (min-width: 800px) {
.author-list:hover .moving-avatar {
margin: 0;
transition: all 0.3s cubic-bezier(0.4, 0.01, 0.165, 0.99);
}
}
.author-name-tooltip {
position: absolute;
bottom: 105%;
z-index: 999;
display: block;
padding: 2px 8px;
color: white;
font-size: 1.2rem;
letter-spacing: 0.2px;
white-space: nowrap;
background: var(--darkgrey);
border-radius: 3px;
box-shadow: rgba(39,44,49,0.08) 0 12px 26px, rgba(39, 44, 49, 0.03) 1px 3px 8px;
opacity: 0;
transition: all 0.3s cubic-bezier(0.4, 0.01, 0.165, 0.99);
transform: translateY(6px);
pointer-events: none;
}
.author-list-item:hover .author-name-tooltip {
opacity: 1.0;
transform: translateY(0px);
}
@media (max-width: 650px) {
.author-name-tooltip {
display: none;
}
}
.reading-time {
flex-shrink: 0;
margin-left: 20px;
color: var(--midgrey);
font-size: 1.2rem;
line-height: 33px;
font-weight: 500;
letter-spacing: 0.5px;
text-transform: uppercase;
@ -485,6 +608,7 @@ The first (most recent) post in the list is styled to be bigger than the others
.home-template .post-feed .post-card:nth-child(6n+1):not(.no-image) .post-card-image-link {
position: relative;
flex: 1 1 auto;
border-radius: 5px 0 0 5px;
}
.home-template .post-feed .post-card:nth-child(6n+1):not(.no-image) .post-card-image {
@ -548,9 +672,9 @@ The first (most recent) post in the list is styled to be bigger than the others
/* ^ Required to make .post-full-content:before/after z-index stacking work */
.post-full-header {
max-width: 1040px;
margin: 0 auto;
padding: 6vw 3vw 3vw;
max-width: 1040px;
text-align: center;
}
@media (max-width: 500px) {
@ -584,8 +708,8 @@ The first (most recent) post in the list is styled to be bigger than the others
}
.post-full-image {
height: 800px;
margin: 0 -10vw -165px;
height: 800px;
background: var(--lightgrey) center center;
background-size: cover;
border-radius: 5px;
@ -593,8 +717,8 @@ The first (most recent) post in the list is styled to be bigger than the others
@media (max-width: 1170px) {
.post-full-image {
height: 600px;
margin: 0 -4vw -100px;
height: 600px;
border-radius: 0;
}
}
@ -607,9 +731,9 @@ The first (most recent) post in the list is styled to be bigger than the others
.post-full-content {
position: relative;
min-height: 230px;
margin: 0 auto;
padding: 70px 100px 0;
min-height: 230px;
font-family: Georgia, serif;
font-size: 2.2rem;
line-height: 1.6em;
@ -664,13 +788,6 @@ The first (most recent) post in the list is styled to be bigger than the others
display: none;
}
.kg-card-markdown {
display: flex;
flex-direction: column;
align-items: center;
max-width: 920px;
}
.post-full-content h1,
.post-full-content h2,
.post-full-content h3,
@ -696,13 +813,9 @@ The first (most recent) post in the list is styled to be bigger than the others
margin: 0;
}
.post-template .kg-card-markdown > p:first-child {
font-size: 1.25em;
line-height: 1.5em;
}
.post-full-content a {
color: #000;
word-break: break-word;
box-shadow: var(--blue) 0 -1px 0 inset;
}
@ -728,8 +841,9 @@ The first (most recent) post in the list is styled to be bigger than the others
.post-full-content img,
.post-full-content video {
display: block;
max-width: 1040px;
margin: 1.5em auto;
max-width: 1040px;
height: auto;
}
@media (max-width: 1040px) {
.post-full-content img,
@ -748,8 +862,8 @@ Usage (In Ghost edtior):
*/
.post-full-content img[src$="#full"] {
width: 100vw;
max-width: none;
width: 100vw;
}
@ -765,11 +879,13 @@ Usage (In Ghost editor):
display: block;
margin-top: -3em;
margin-bottom: 1.5em;
text-align: center;
}
/* Override third party iframe styles */
.post-full-content iframe {
margin: 0 auto;
margin: 0 auto !important;
}
.post-full-content blockquote {
@ -800,10 +916,10 @@ Usage (In Ghost editor):
}
.post-full-content pre {
max-width: 100%;
overflow-x: auto;
margin: 1.5em 0 3em;
padding: 20px;
max-width: 100%;
border: color(var(--darkgrey) l(-10%)) 1px solid;
color: var(--whitegrey);
font-size: 1.4rem;
@ -819,6 +935,10 @@ Usage (In Ghost editor):
background: transparent;
}
.post-full-content pre code * {
color: inherit;
}
.post-full-content .fluid-width-video-wrapper {
margin: 1.5em 0 3em;
}
@ -833,9 +953,9 @@ Usage (In Ghost editor):
top: -15px;
left: 50%;
display: block;
margin-left: -10px;
width: 1px;
height: 30px;
margin-left: -10px;
background: color(var(--lightgrey) l(+10%));
box-shadow: #fff 0 0 0 5px;
transform: rotate(45deg);
@ -908,8 +1028,8 @@ Usage (In Ghost editor):
}
@media (min-width: 1180px) {
.post-full-content h5 {
width: 100vw;
max-width: 1060px;
width: 100vw;
}
}
@media (max-width: 500px) {
@ -960,8 +1080,8 @@ Usage (In Ghost editor):
font-size: 2.9rem;
}
.post-full-image {
height: 350px;
margin-bottom: 4vw;
height: 350px;
}
.post-full-content {
padding: 0;
@ -975,24 +1095,24 @@ Usage (In Ghost editor):
/* Tables */
.post-full-content table {
display: inline-block;
width: auto;
max-width: 100%;
overflow-x: auto;
margin: 0.5em 0 2.5em;
max-width: 100%;
width: auto;
border-spacing: 0;
border-collapse: collapse;
vertical-align: top;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
font-size: 1.6rem;
white-space: nowrap;
vertical-align: top;
}
.post-full-content table {
background: radial-gradient(ellipse at left, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0) 75%) 0 center, radial-gradient(ellipse at right, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0) 75%) 100% center;
background-size: 10px 100%, 10px 100%;
background-attachment: scroll, scroll;
background-repeat: no-repeat;
-webkit-overflow-scrolling: touch;
background: radial-gradient(ellipse at left, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0) 75%) 0 center, radial-gradient(ellipse at right, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0) 75%) 100% center;
background-attachment: scroll, scroll;
background-size: 10px 100%, 10px 100%;
background-repeat: no-repeat;
}
.post-full-content table td:first-child {
@ -1003,8 +1123,8 @@ Usage (In Ghost editor):
.post-full-content table td:last-child {
background-image: linear-gradient(to left, rgba(255,255,255, 1) 50%, rgba(255,255,255, 0) 100%);
background-size: 20px 100%;
background-position: 100% 0;
background-size: 20px 100%;
background-repeat: no-repeat;
}
@ -1058,8 +1178,8 @@ Usage (In Ghost editor):
display: flex;
justify-content: center;
align-items: center;
max-width: 420px;
margin: 0 auto;
max-width: 420px;
}
.subscribe-form .form-group {
@ -1068,8 +1188,8 @@ Usage (In Ghost editor):
.subscribe-email {
display: block;
width: 100%;
padding: 10px;
width: 100%;
border: color(var(--lightgrey) l(+7%)) 1px solid;
color: var(--midgrey);
font-size: 1.8rem;
@ -1089,9 +1209,9 @@ Usage (In Ghost editor):
.subscribe-form button {
display: inline-block;
height: 41px;
margin: 0 0 0 10px;
padding: 0 20px;
height: 41px;
outline: none;
color: #fff;
font-size: 1.5rem;
@ -1133,8 +1253,8 @@ Usage (In Ghost editor):
width: 100%;
}
.subscribe-form button {
width: 100%;
margin: 10px 0 0 0;
width: 100%;
}
}
@ -1146,24 +1266,27 @@ Usage (In Ghost editor):
display: flex;
justify-content: space-between;
align-items: center;
max-width: 840px;
margin: 0 auto;
padding: 3vw 0 6vw 0;
max-width: 840px;
}
/* 7.2.1 Single Author Byline
/* ---------------------------------------------------------- */
.author-card {
display: flex;
align-items: center;
}
.author-card .author-profile-image {
.author-card .author-profile-image,
.author-card .avatar-wrapper {
margin-right: 15px;
width: 60px;
height: 60px;
margin-right: 15px;
}
.author-card-name {
margin: 0 0 2px 0;
margin: 8px 0 2px 0;
padding: 0;
font-size: 2rem;
}
@ -1206,13 +1329,144 @@ Usage (In Ghost editor):
text-decoration: none;
}
/* 7.2.2 Multiple Author Byline
/* ---------------------------------------------------------- */
.post-full-authors {
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20px;
padding-top: 40px;
border-top: color(var(--lightgrey) l(+10%)) 1px solid;
}
.post-full-authors-content {
margin-bottom: 20px;
}
.post-full-authors-content p {
margin-bottom: 0;
color: var(--midgrey);
font-size: 1.4rem;
letter-spacing: 0.2px;
text-align: center;
text-transform: uppercase;
}
.post-full-authors-content a {
display: inline-block;
color: color(var(--darkgrey) l(+20%));
font-size: 1.4rem;
font-weight: 600;
text-transform: uppercase;
}
.post-full-footer .author-list {
justify-content: center;
padding: 10px 20px;
}
.author-card .author-profile-image,
.author-card .avatar-wrapper {
position: relative;
margin-right: 15px;
}
.author-list-item .author-card {
position: absolute;
bottom: 130%;
left: 50%;
z-index: 300;
display: block;
margin-left: -160px;
width: 320px;
font-size: 1.4rem;
letter-spacing: 0.2px;
background: white;
border-radius: 6px;
box-shadow: rgba(39,44,49,0.08) 0 12px 26px, rgba(39, 44, 49, 0.03) 1px 3px 8px;
opacity: 0;
transition: all 0.3s cubic-bezier(0.4, 0.01, 0.165, 0.99);
transform: scale(0.98) translateY(15px);
pointer-events: none;
}
.author-list-item .author-card:before {
content: "";
position: absolute;
top: 100%;
left: 50%;
display: block;
margin-left: -12px;
width: 0;
height: 0;
border-top: 12px solid #fff;
border-right: 12px solid transparent;
border-left: 12px solid transparent;
}
.author-list-item .author-card.hovered {
opacity: 1.0;
transform: scale(1) translateY(0px);
pointer-events: auto;
}
.author-card .basic-info {
display: flex;
flex-direction: column;
align-items: center;
padding: 30px 20px 20px 20px;
color: #fff;
background: var(--darkgrey);
border-radius: 6px 6px 0 0;
}
.author-card .basic-info h2 {
margin: 1em 0 0.5em;
}
.author-card .bio {
padding: 20px 20px 0;
}
@media (max-width: 650px) {
.author-list-item .author-card {
display: none;
}
}
.basic-info .author-profile-image {
margin: 0;
width: 88px;
height: 88px;
border: none;
}
.basic-info .avatar-wrapper {
position: relative;
margin: 0;
width: 88px;
height: 88px;
border: none;
background: rgba(229, 239, 245, 0.1);
}
.basic-info .avatar-wrapper svg {
margin: 0;
width: 88px;
height: 88px;
opacity: 0.15;
}
/* 7.3. Comments
/* ---------------------------------------------------------- */
.post-full-comments {
max-width: 840px;
margin: 0 auto;
max-width: 840px;
}
@ -1297,8 +1551,9 @@ Usage (In Ghost editor):
.read-next-divider svg {
width: 40px;
stroke: #fff;
fill: transparent;
stroke: #fff;
stroke-width: 0.5px;
stroke-opacity: 0.65;
}
@ -1316,8 +1571,8 @@ Usage (In Ghost editor):
flex-direction: column;
margin: 0 auto;
padding: 0;
list-style: none;
text-align: center;
list-style: none;
}
.read-next-card-content li {
@ -1333,9 +1588,9 @@ Usage (In Ghost editor):
display: block;
padding: 20px 0;
border-bottom: rgba(255,255,255,0.3) 1px solid;
vertical-align: top;
color: #fff;
font-weight: 500;
vertical-align: top;
transition: opacity 0.3s ease;
}
@ -1406,8 +1661,8 @@ Usage (In Ghost editor):
}
.floating-header-logo img {
max-height: 20px;
margin: 0 10px 0 0;
max-height: 20px;
}
.floating-header-divider {
@ -1458,9 +1713,9 @@ Usage (In Ghost editor):
}
.floating-header-share-label svg {
margin: 0 5px 0 10px;
width: 18px;
height: 18px;
margin: 0 5px 0 10px;
stroke: rgba(0,0,0,0.7);
transform: rotate(90deg);
}
@ -1564,23 +1819,127 @@ Usage (In Ghost editor):
}
/* 7.6. Koenig Styles
/* ---------------------------------------------------------- */
.post-content {
display: flex;
flex-direction: column;
align-items: center;
max-width: 920px;
}
.post-template .post-content > p:first-child {
font-size: 1.25em;
line-height: 1.5em;
}
.post-full-content .kg-image {
max-width: 100%;
}
/* Preventing full-width image overlap with post image. */
.post-full-image + .post-full-content .kg-content *:first-child .kg-image {
width: 100%;
}
.post-full-content .kg-width-wide .kg-image {
max-width: 1040px;
}
.post-full-content .kg-width-full .kg-image {
max-width: 100vw;
}
.post-full-content figure {
margin: 1.5em 0 3em;
}
.post-full-content figure img {
margin: 0;
}
.post-full-content figcaption {
margin: 1.0em 0 0;
font-size: 80%;
line-height: 1.6em;
text-align: center;
}
.kg-width-full figcaption {
padding: 0 1.5em;
}
.kg-embed-card {
display: flex;
flex-direction: column;
align-items: center;
min-width: 100%;
}
.kg-embed-card .fluid-width-video-wrapper {
margin: 0;
}
@media (max-width: 1040px) {
.post-full-content .kg-width-full .kg-image {
width: 100vw;
}
}
.kg-gallery-container {
display: flex;
flex-direction: column;
max-width: 1040px;
width: 100vw;
}
.kg-gallery-row {
display: flex;
flex-direction: row;
justify-content: center;
}
.kg-gallery-image img {
display: block;
margin: 0;
width: 100%;
height: 100%;
}
.kg-gallery-row:not(:first-of-type) {
margin: 0.75em 0 0 0;
}
.kg-gallery-image:not(:first-of-type) {
margin: 0 0 0 0.75em;
}
.kg-gallery-card + .kg-image-card.kg-width-wide,
.kg-gallery-card + .kg-gallery-card,
.kg-image-card.kg-width-wide + .kg-gallery-card,
.kg-image-card.kg-width-wide + .kg-image-card.kg-width-wide {
margin: -2.25em 0 3em;
}
/* 8. Author Template
/* ---------------------------------------------------------- */
.site-header-content .author-profile-image {
z-index: 10;
flex-shrink: 0;
margin: 0 0 20px 0;
width: 100px;
height: 100px;
margin: 0 0 20px 0;
box-shadow: rgba(255,255,255,0.1) 0 0 0 6px;
}
.site-header-content .author-bio {
z-index: 10;
flex-shrink: 0;
max-width: 600px;
margin: 5px 0 10px 0;
max-width: 600px;
font-size: 2rem;
line-height: 1.3em;
font-weight: 300;
@ -1732,8 +2091,8 @@ Usage (In Ghost editor):
}
.subscribe-overlay-description {
max-width: 650px;
margin: 0 auto 50px;
max-width: 650px;
font-family: Georgia, serif;
font-size: 3rem;
line-height: 1.3em;
@ -1745,8 +2104,8 @@ Usage (In Ghost editor):
display: flex;
justify-content: center;
align-items: center;
max-width: 500px;
margin: 0 auto;
max-width: 500px;
}
.subscribe-overlay .form-group {
@ -1755,8 +2114,8 @@ Usage (In Ghost editor):
.subscribe-overlay .subscribe-email {
display: block;
width: 100%;
padding: 14px 20px;
width: 100%;
border: none;
color: var(--midgrey);
font-size: 2rem;
@ -1777,9 +2136,9 @@ Usage (In Ghost editor):
.subscribe-overlay button {
display: inline-block;
height: 52px;
margin: 0 0 0 15px;
padding: 0 25px;
height: 52px;
outline: none;
color: #fff;
font-size: 1.7rem;
@ -1857,15 +2216,15 @@ Usage (In Ghost editor):
.site-footer-content {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
color: rgba(255,255,255,0.7);
font-size: 1.3rem;
}
.site-footer-content a {
color: rgba(255,255,255,0.7);;
color: rgba(255,255,255,0.7);
}
.site-footer-content a:hover {

View File

@ -1,10 +1,12 @@
/* global maxPages */
// Code snippet inspired by https://github.com/douglasrodrigues5/ghost-blog-infinite-scroll
$(function ($) {
var currentPage = 1;
var pathname = window.location.pathname;
var $document = $(document);
var $result = $('.post-feed');
var buffer = 100;
var buffer = 300;
var ticking = false;
var isLoading = false;
@ -13,9 +15,6 @@ $(function ($) {
var lastWindowHeight = window.innerHeight;
var lastDocumentHeight = $document.height();
// remove hash params from pathname
pathname = pathname.replace(/#(.*)$/g, '').replace('/\//g', '/');
function onScroll() {
lastScrollY = window.scrollY;
requestTick();
@ -29,12 +28,34 @@ $(function ($) {
function requestTick() {
if (!ticking) {
requestAnimationFrame(infiniteScroll)
requestAnimationFrame(infiniteScroll);
}
ticking = true;
}
function infiniteScroll () {
function sanitizePathname(path) {
var paginationRegex = /(?:page\/)(\d)(?:\/)$/i;
// remove hash params from path
path = path.replace(/#(.*)$/g, '').replace('////g', '/');
// remove pagination from the path and replace the current pages
// with the actual requested page. E. g. `/page/3/` indicates that
// the user actually requested page 3, so we should request page 4
// next, unless it's the last page already.
if (path.match(paginationRegex)) {
currentPage = parseInt(path.match(paginationRegex)[1]);
path = path.replace(paginationRegex, '');
}
return path;
}
function infiniteScroll() {
// sanitize the pathname from possible pagination or hash params
pathname = sanitizePathname(pathname);
// return if already loading
if (isLoading) {
return;
@ -46,29 +67,40 @@ $(function ($) {
return;
}
// return if currentPage is the last page already
if (currentPage === maxPages) {
/**
* maxPages is defined in default.hbs and is the value
* of the amount of pagination pages.
* If we reached the last page or are past it,
* we return and disable the listeners.
*/
if (currentPage >= maxPages) {
window.removeEventListener('scroll', onScroll, {passive: true});
window.removeEventListener('resize', onResize);
return;
}
isLoading = true;
// next page
currentPage++;
currentPage += 1;
// Load more
var nextPage = pathname + 'page/' + currentPage + '/';
$.get(nextPage, function (content) {
$result.append($(content).find('.post').hide().fadeIn(100));
var parse = document.createRange().createContextualFragment(content);
var posts = parse.querySelectorAll('.post');
if (posts.length) {
[].forEach.call(posts, function (post) {
$result[0].appendChild(post);
});
}
}).fail(function (xhr) {
// 404 indicates we've run out of pages
if (xhr.status === 404) {
window.removeEventListener('scroll', onScroll, {passive: true});
window.removeEventListener('resize', onResize);
}
}).always(function () {
lastDocumentHeight = $document.height();
isLoading = false;

0
assets/screenshot-desktop.jpg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

0
assets/screenshot-mobile.jpg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View File

@ -22,15 +22,15 @@
{{plural ../pagination.total empty='No posts' singular='% post' plural='% posts'}} <span class="bull">&bull;</span>
</div>
{{#if website}}
<a class="social-link social-link-wb" href="{{website}}" target="_blank">{{> "icons/website"}}</a>
<a class="social-link social-link-wb" href="{{website}}" target="_blank" rel="noopener">{{> "icons/website"}}</a>
{{/if}}
{{#if twitter}}
<a class="social-link social-link-tw" href="{{twitter_url}}" target="_blank">{{> "icons/twitter"}}</a>
<a class="social-link social-link-tw" href="{{twitter_url}}" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
{{#if facebook}}
<a class="social-link social-link-fb" href="{{facebook_url}}" target="_blank">{{> "icons/facebook"}}</a>
<a class="social-link social-link-fb" href="{{facebook_url}}" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
{{/if}}
<a class="social-link social-link-rss" href="http://cloud.feedly.com/#subscription/feed/{{url absolute="true"}}/rss/" target="_blank">{{> "icons/rss"}}</a>
<a class="social-link social-link-rss" href="https://feedly.com/i/subscription/feed/{{url absolute="true"}}rss/" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
</div>
</div>
</div>
@ -38,7 +38,7 @@
{{/author}}
{{!-- The main content area --}}
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="post-feed">

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="{{lang}}">
<head>
{{!-- Document Settings --}}
@ -14,7 +14,7 @@
{{!-- Styles'n'Scripts --}}
<link rel="stylesheet" type="text/css" href="{{asset "built/screen.css"}}" />
{{!-- This tag outputes SEO meta+structured data and other important settings --}}
{{!-- This tag outputs SEO meta+structured data and other important settings --}}
{{ghost_head}}
</head>
@ -31,9 +31,9 @@
<section class="copyright"><a href="{{@blog.url}}">{{@blog.title}}</a> &copy; {{date format="YYYY"}}</section>
<nav class="site-footer-nav">
<a href="{{@blog.url}}">Latest Posts</a>
{{#if @blog.facebook}}<a href="{{facebook_url @blog.facebook}}" target="_blank">Facebook</a>{{/if}}
{{#if @blog.twitter}}<a href="{{twitter_url @blog.twitter}}" target="_blank">Twitter</a>{{/if}}
<a href="https://ghost.org" target="_blank">Ghost</a>
{{#if @blog.facebook}}<a href="{{facebook_url @blog.facebook}}" target="_blank" rel="noopener">Facebook</a>{{/if}}
{{#if @blog.twitter}}<a href="{{twitter_url @blog.twitter}}" target="_blank" rel="noopener">Twitter</a>{{/if}}
<a href="https://ghost.org" target="_blank" rel="noopener">Ghost</a>
</nav>
</div>
</footer>
@ -55,6 +55,18 @@
</div>
{{/if}}
<script>
var images = document.querySelectorAll('.kg-gallery-image img');
images.forEach(function (image) {
var container = image.closest('.kg-gallery-image');
var width = image.attributes.width.value;
var height = image.attributes.height.value;
var ratio = width / height;
container.style.flex = ratio + ' 1 0%';
})
</script>
{{!-- jQuery + Fitvids, which makes all video embeds responsive --}}
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
@ -65,6 +77,9 @@
{{#if pagination.pages}}
<script>
// maxPages is a global variable that is needed to determine
// if we need to load more pages for the infinitescroll, or if
// we reached the last page already.
var maxPages = parseInt('{{pagination.pages}}');
</script>
<script src="{{asset "js/infinitescroll.js"}}"></script>

View File

@ -28,7 +28,7 @@ It's a good idea to keep this template as minimal as possible in terms of both f
</div>
</header>
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<section class="error-message">

View File

@ -29,7 +29,7 @@ You'll notice that we *don't* use any JavsScript, or ghost_head / ghost_foot in
</div>
</header>
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<section class="error-message">

View File

@ -3,9 +3,9 @@ var gulp = require('gulp');
// gulp plugins and utils
var gutil = require('gulp-util');
var livereload = require('gulp-livereload');
var nodemon = require('gulp-nodemon');
var postcss = require('gulp-postcss');
var sourcemaps = require('gulp-sourcemaps');
var zip = require('gulp-zip');
// postcss plugins
var autoprefixer = require('autoprefixer');
@ -36,7 +36,8 @@ gulp.task('css', function () {
autoprefixer({browsers: ['last 2 versions']}),
cssnano()
];
gulp.src('assets/css/*.css')
return gulp.src('assets/css/*.css')
.on('error', swallowError)
.pipe(sourcemaps.init())
.pipe(postcss(processors))
@ -49,6 +50,20 @@ gulp.task('watch', function () {
gulp.watch('assets/css/**', ['css']);
});
gulp.task('zip', ['css'], function () {
var targetDir = 'dist/';
var themeName = require('./package.json').name;
var filename = themeName + '.zip';
return gulp.src([
'**',
'!node_modules', '!node_modules/**',
'!dist', '!dist/**'
])
.pipe(zip(filename))
.pipe(gulp.dest(targetDir));
});
gulp.task('default', ['build'], function () {
gulp.start('watch');
});

View File

@ -20,7 +20,7 @@ into the {body} of the default.hbs template --}}
</header>
{{!-- The main content area --}}
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="post-feed">

View File

@ -2,15 +2,20 @@
"name": "casper",
"description": "The default personal blogging theme for Ghost. Beautiful, minimal and responsive.",
"demo": "https://demo.ghost.io",
"version": "2.1.1",
"version": "2.6.3",
"engines": {
"ghost": ">=1.2.0"
"ghost": ">=2.0.0"
},
"license": "MIT",
"screenshots": {
"desktop": "assets/screenshot-desktop.jpg",
"mobile": "assets/screenshot-mobile.jpg"
},
"scripts": {
"dev": "gulp",
"zip": "gulp zip",
"test": "gscan ."
},
"author": {
"name": "Ghost Foundation",
"email": "hello@ghost.org",
@ -25,7 +30,8 @@
},
"keywords": [
"ghost",
"theme"
"theme",
"ghost-theme"
],
"repository": {
"type": "git",
@ -36,13 +42,14 @@
"devDependencies": {
"autoprefixer": "6.3.6",
"cssnano": "3.7.1",
"gscan": "^2.0.0",
"gulp": "3.9.1",
"gulp-livereload": "3.8.1",
"gulp-nodemon": "2.1.0",
"gulp-postcss": "6.1.1",
"gulp-sourcemaps": "1.6.0",
"gulp-util": "3.0.7",
"gulp-watch": "4.3.8",
"gulp-zip": "4.0.0",
"postcss-color-function": "2.0.1",
"postcss-custom-properties": "5.0.1",
"postcss-easy-import": "1.0.1"

View File

@ -12,7 +12,7 @@ into the {body} of the default.hbs template --}}
{{!-- Everything inside the #post tags pulls data from the post --}}
{{#post}}
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">
@ -27,7 +27,9 @@ into the {body} of the default.hbs template --}}
{{/if}}
<section class="post-full-content">
{{content}}
<div class="post-content">
{{content}}
</div>
</section>
</article>

View File

@ -0,0 +1,72 @@
<section class="post-full-authors">
<div class="post-full-authors-content">
<p>This post was a collaboration between</p>
<p>{{authors}}</p>
</div>
<ul class="author-list">
{{#foreach authors}}
<li class="author-list-item">
<div class="author-card">
<div class="basic-info">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{else}}
<div class="author-profile-image">{{> "icons/avatar"}}</div>
{{/if}}
<h2>{{name}}</h2>
</div>
<div class="bio">
{{#if bio}}
<p>{{bio}}</p>
<p><a href="{{url}}">More posts</a> by {{name}}.</p>
{{else}}
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
{{/if}}
</div>
</div>
{{#if profile_image}}
<a href="{{url}}" class="moving-avatar"><img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" /></a>
{{else}}
<a href="{{url}}" class="moving-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}
</li>
{{/foreach}}
</ul>
</section>
{{#contentFor "scripts"}}
<script>
// Adds delay to author card dropups to disappear. This gives enough
// time for the user to interact with the author card while they move
// the mouse from the avatar to the card. Also makes space for the
// interacted avatar.
$(document).ready(function () {
var hoverTimeout;
$('.author-list-item').hover(function(){
var $this = $(this);
clearTimeout(hoverTimeout);
$('.author-card').removeClass('hovered');
$(this).children('.author-card').addClass('hovered');
}, function() {
var $this = $(this);
hoverTimeout = setTimeout(function() {
$this.children('.author-card').removeClass('hovered');
}, 800);
});
});
</script>
{{/contentFor}}

View File

@ -0,0 +1,23 @@
{{!-- Everything inside the #author tags pulls data from the author --}}
{{#primary_author}}
<section class="author-card">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{else}}
<span class="avatar-wrapper">{{> "icons/avatar"}}</span>
{{/if}}
<section class="author-card-content">
<h4 class="author-card-name"><a href="{{url}}">{{name}}</a></h4>
{{#if bio}}
<p>{{bio}}</p>
{{else}}
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
{{/if}}
</section>
</section>
<div class="post-full-footer-right">
<a class="author-card-button" href="{{url}}">Read More</a>
</div>
{{/primary_author}}

View File

@ -20,7 +20,7 @@
{{> "icons/facebook"}}
</a>
</div>
<progress class="progress" value="0">
<progress id="reading-progress" class="progress" value="0">
<div class="progress-container">
<span class="progress-bar"></span>
</div>

View File

@ -0,0 +1 @@
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M3.513 18.998C4.749 15.504 8.082 13 12 13s7.251 2.504 8.487 5.998C18.47 21.442 15.417 23 12 23s-6.47-1.558-8.487-4.002zM12 12c2.21 0 4-2.79 4-5s-1.79-4-4-4-4 1.79-4 4 1.79 5 4 5z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 308 B

0
partials/icons/facebook.hbs Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 155 B

After

Width:  |  Height:  |  Size: 155 B

View File

@ -17,10 +17,26 @@
</section>
</a>
<footer class="post-card-meta">
{{#if author.profile_image}}
<img class="author-profile-image" src="{{author.profile_image}}" alt="{{author.name}}" />
{{/if}}
<span class="post-card-author">{{author}}</span>
<ul class="author-list">
{{#foreach authors}}
<li class="author-list-item">
<div class="author-name-tooltip">
{{name}}
</div>
{{#if profile_image}}
<a href="{{url}}" class="static-avatar"><img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" /></a>
{{else}}
<a href="{{url}}" class="static-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}
</li>
{{/foreach}}
</ul>
<span class="reading-time">{{reading_time}}</span>
</footer>
</div>
</article>

View File

@ -14,16 +14,16 @@
<div class="site-nav-right">
<div class="social-links">
{{#if @blog.facebook}}
<a class="social-link social-link-fb" href="{{facebook_url @blog.facebook}}" target="_blank">{{> "icons/facebook"}}</a>
<a class="social-link social-link-fb" href="{{facebook_url @blog.facebook}}" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
{{/if}}
{{#if @blog.twitter}}
<a class="social-link social-link-tw" href="{{twitter_url @blog.twitter}}" target="_blank">{{> "icons/twitter"}}</a>
<a class="social-link social-link-tw" href="{{twitter_url @blog.twitter}}" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
</div>
{{#if @labs.subscribers}}
<a class="subscribe-button" href="#subscribe">Subscribe</a>
{{else}}
<a class="rss-button" href="http://cloud.feedly.com/#subscription/feed/{{@blog.url}}/rss/" target="_blank">{{> "icons/rss"}}</a>
<a class="rss-button" href="https://feedly.com/i/subscription/feed/{{@blog.url}}/rss/" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
{{/if}}
</div>
</nav>

View File

@ -12,7 +12,7 @@ into the {body} of the default.hbs template --}}
{{!-- Everything inside the #post tags pulls data from the post --}}
{{#post}}
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">
@ -33,7 +33,9 @@ into the {body} of the default.hbs template --}}
{{/if}}
<section class="post-full-content">
{{content}}
<div class="post-content">
{{content}}
</div>
</section>
{{!-- Email subscribe form at the bottom of the page --}}
@ -46,49 +48,23 @@ into the {body} of the default.hbs template --}}
{{/if}}
<footer class="post-full-footer">
{{!-- Everything inside the #author tags pulls data from the author --}}
{{#author}}
<section class="author-card">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{/if}}
<section class="author-card-content">
<h4 class="author-card-name"><a href="{{url}}">{{name}}</a></h4>
{{#if bio}}
<p>{{bio}}</p>
{{else}}
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
{{/if}}
</section>
</section>
<div class="post-full-footer-right">
<a class="author-card-button" href="{{url}}">Read More</a>
</div>
{{!-- There are two options for how we display the byline/author-info.
If the post has more than one author, we load a specific template
from includes/byline-multiple.hbs, otherwise, we just use the
default byline. --}}
{{#has author="count:>1"}}
{{> "byline-multiple"}}
{{else}}
{{> "byline-single"}}
{{/has}}
{{/author}}
</footer>
{{!--
If you use Disqus comments, just uncomment this block.
The only thing you need to change is "test-apkdzgmqhj" - which
should be replaced with your own Disqus site-id.
<section class="post-full-comments">
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = '{{url absolute="true"}}';
this.page.identifier = 'ghost-{{comment_id}}';
};
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://test-apkdzgmqhj.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
If you want to embed comments, this is a good place to do it!
</section>
--}}
@ -167,7 +143,7 @@ $(document).ready(function () {
$postContent.fitVids();
// End fitVids
var progressBar = document.querySelector('progress');
var progressBar = document.querySelector('#reading-progress');
var header = document.querySelector('.floating-header');
var title = document.querySelector('.post-full-title');
@ -216,6 +192,7 @@ $(document).ready(function () {
window.addEventListener('resize', onResize, false);
update();
});
</script>
{{/contentFor}}

View File

@ -21,7 +21,7 @@
{{/tag}}
{{!-- The main content area --}}
<main id="site-main" class="site-main outer" role="main">
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="post-feed">
{{#foreach posts}}

4876
yarn.lock Normal file

File diff suppressed because it is too large Load Diff