Browse Source

update to 3.x

master
Albakham 3 months ago
parent
commit
98d05948c3
Signed by: albakham <dev@geber.ga> GPG Key ID: 6CE390277A579221
48 changed files with 3387 additions and 2302 deletions
  1. +15
    -0
      .github/workflows/deploy-theme.yml
  2. +32
    -0
      .github/workflows/test.yml
  3. +1
    -1
      LICENSE
  4. +38
    -1
      README.md
  5. +0
    -101
      amp.hbs
  6. +2
    -0
      assets/built/casper.js
  7. +1
    -0
      assets/built/casper.js.map
  8. +1
    -1
      assets/built/custom.css
  9. +1
    -1
      assets/built/custom.css.map
  10. +1
    -1
      assets/built/global.css
  11. +1
    -1
      assets/built/global.css.map
  12. +0
    -2
      assets/built/infinitescroll.js
  13. +0
    -1
      assets/built/infinitescroll.js.map
  14. +0
    -2
      assets/built/jquery.fitvids.js
  15. +0
    -1
      assets/built/jquery.fitvids.js.map
  16. +1
    -1
      assets/built/screen.css
  17. +1
    -1
      assets/built/screen.css.map
  18. +95
    -17
      assets/css/custom.css
  19. +10
    -8
      assets/css/global.css
  20. +1557
    -914
      assets/css/screen.css
  21. +1
    -344
      assets/fonts/source-sans-pro-v11-latin-regular.svg
  22. +24
    -0
      assets/js/gallery-card.js
  23. +26
    -6
      assets/js/infinite-scroll.js
  24. +0
    -4
      assets/js/jquery-3.2.1.min.js
  25. +2
    -0
      assets/js/jquery-3.4.1.min.js
  26. +0
    -0
      assets/js/lib/jquery.fitvids.js
  27. +61
    -0
      assets/js/sticky-nav-title.js
  28. BIN
      assets/screenshot-desktop.jpg
  29. BIN
      assets/screenshot-mobile.jpg
  30. +33
    -25
      author.hbs
  31. +68
    -17
      default.hbs
  32. +22
    -39
      error-404.hbs
  33. +17
    -10
      error.hbs
  34. +15
    -6
      gulpfile.js
  35. +76
    -13
      index.hbs
  36. +21
    -9
      package.json
  37. +11
    -9
      page.hbs
  38. +47
    -0
      partials/header-background.hbs
  39. +1
    -1
      partials/icons/facebook.hbs
  40. +11
    -0
      partials/icons/loader.hbs
  41. +18
    -12
      partials/post-card.hbs
  42. +5
    -0
      partials/site-header.hbs
  43. +27
    -7
      partials/site-nav.hbs
  44. +19
    -0
      partials/subscribe-form.hbs
  45. +126
    -107
      post.hbs
  46. +0
    -1
      renovate.json
  47. +7
    -7
      tag.hbs
  48. +992
    -631
      yarn.lock

+ 15
- 0
.github/workflows/deploy-theme.yml View File

@@ -0,0 +1,15 @@
name: Deploy Theme
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@master
- uses: TryGhost/action-deploy-theme@v1.2.0
with:
api-url: ${{ secrets.GHOST_ADMIN_API_URL }}
api-key: ${{ secrets.GHOST_ADMIN_API_KEY }}
theme-name: "casper-master"

+ 32
- 0
.github/workflows/test.yml View File

@@ -0,0 +1,32 @@
name: Test
on:
pull_request:
push:
branches:
- master

jobs:
build:
runs-on: ubuntu-18.04
strategy:
matrix:
node: [ '10' ]
name: Node ${{ matrix.node }}
steps:
- uses: actions/checkout@v1
- name: Cache node modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{ runner.OS }}-build-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.OS }}-build-${{ env.cache-name }}-
${{ runner.OS }}-build-
${{ runner.OS }}-
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
- run: npm install yarn
- run: yarn install
- run: yarn test:ci

+ 1
- 1
LICENSE View File

@@ -1,4 +1,4 @@
Copyright (c) 2013-2019 Ghost Foundation
Copyright (c) 2013-2020 Ghost Foundation

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation


+ 38
- 1
README.md View File

@@ -1,9 +1,46 @@
# Casper

<<<<<<< HEAD
This is the [Ghost](https://github.com/tryghost/ghost/) theme of [www.geber.ga](https://www.geber.ga), based on [Casper](https://github.com/TryGhost/Casper).

For more information regarding how to use the theme with Ghost, please refer to the [original README](https://github.com/TryGhost/Casper)

=======
This is the [Ghost](https://github.com/tryghost/ghost/) theme of [angristan.xyz](https://angristan.xyz), based on [Casper](https://github.com/TryGhost/Casper).

For more information regarding how to use the theme with Ghost, please refer to the [original README](https://github.com/TryGhost/Casper)

## Fork

I keep my fork [up-to-date](https://github.com/angristan/Casper-XYZ/wiki/Maintaining-the-fork) with the upstream.

List of the modifications made in this fork:

* [Custom CSS](https://github.com/angristan/Casper-XYZ/blob/master/assets/css/custom.css)
* Use the Open Sans Pro font
* Header image is the same width as the content, and the content doesn't step on it
* Use GitLab-like font for code blocks instead of ugly monospace
* Disable dark mode
* Isso (comments) style enhancements
* A lot more, check the comments!
* [Removed share buttons in the header](https://github.com/angristan/Casper-XYZ/commit/b4530b973a71bcdfce82c02572525171a5fa9159)
* [Replaced Feedly links by original RSS links](https://github.com/angristan/Casper-XYZ/commit/c618bc702969c217b6f48277244b6bf04b4e46bd)
* [Host jQuery locally](https://github.com/angristan/Casper-XYZ/commit/d9105f2667ed7ae8de32a3cd36d1bea8a910f77d)
* [GitHub, Mastodon, Linkedin, Instagram and Shaarli links and SVG icons](https://github.com/angristan/Casper-XYZ/blob/master/partials/site-nav.hbs#L16)
* [Use GitHub Actions for CI instead of Travis (test + deploy)](https://github.com/angristan/Casper-XYZ/tree/master/.github/workflows)
* [Replaced estimated reading time on posts list by the release date](https://github.com/angristan/Casper-XYZ/pull/4)

### Hardcoded stuff

I try to make the theme reusable as possible, but I still have to hardcode some stuff.

* [Isso comments](https://github.com/angristan/Casper-XYZ/blob/master/post.hbs)
* [GitHub, Mastodon, Linkedin, Instagram and Shaarli links](https://github.com/angristan/Casper-XYZ/blob/master/partials/site-nav.hbs)
* [Vultr affiliate link](https://github.com/angristan/Casper-XYZ/blob/master/default.hbs)

**MAKE SURE TO UPDATE/REMOVE THEM IF YOU PLAN ON REUSING MY THEME!**

>>>>>>> upstream/master
### External assets embedded

Here are the assets that are downloaded and included in the repo as I don't want to make call to 3rd-party services:
@@ -11,4 +48,4 @@ Here are the assets that are downloaded and included in the repo as I don't want
* [jQuery](https://github.com/jquery/jquery)
* [Source Sans Pro font from Google Fonts](https://fonts.google.com/specimen/Source+Sans+Pro)

They are all under their respective licence.
They are all under their respective license.

+ 0
- 101
amp.hbs
File diff suppressed because it is too large
View File


+ 2
- 0
assets/built/casper.js
File diff suppressed because it is too large
View File


+ 1
- 0
assets/built/casper.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
assets/built/custom.css View File

@@ -1,2 +1,2 @@
@font-face{font-family:Source Sans Pro;font-style:normal;font-weight:400;src:url(../fonts/source-sans-pro-v11-latin-regular.eot);src:local("Source Sans Pro Regular"),local("SourceSansPro-Regular"),url(../fonts/source-sans-pro-v11-latin-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/source-sans-pro-v11-latin-regular.woff2) format("woff2"),url(../fonts/source-sans-pro-v11-latin-regular.woff) format("woff"),url(../fonts/source-sans-pro-v11-latin-regular.ttf) format("truetype"),url(../fonts/source-sans-pro-v11-latin-regular.svg#SourceSansPro) format("svg")}.post-card-excerpt,.post-full-content,.post-full-content h5,.site-header-content .author-meta,.subscribe-overlay-description{font-family:Source Sans Pro,Georgia,serif}.post-full-content{font-size:1.9rem}.post-full-content h2{margin:.5em 0;font-size:3rem}#isso-thread{padding:0 100px!important}@media (max-width:1170px){#isso-thread{padding:5vw 7vw 0!important}}@media (max-width:500px){#isso-thread{padding:0!important}}.post-full-footer{padding:3vw 0}@media (min-width:900px){.floating-header{height:50px}}.post-template .post-content>p:first-child{font-size:inherit;line-height:inherit}.site-footer{padding-bottom:20px}.author-card-name{padding:0 0 5px}.post-full-content img,.post-full-content video{margin:.5em auto}.post-full-content pre{margin:0 0 2em}.post-full-header{padding:3vw}@media (max-width:500px){.post-full-header{padding:10vw 3vw 8vw}}.post-full-image{display:block;margin:auto}.post-full-image img{height:100%!important}@media (max-width:500px){.post-full-image{height:100%!important}}.post-full-content:after,.post-full-content:before{display:none}@media (max-width:500px){.post-full-content{padding:30px 0 0}}.floating-header-blog-title{margin-right:1px}.isso-comment-footer svg{-webkit-transform:translateY(-5px);transform:translateY(-5px)}.isso-comment-footer .downvote svg{-webkit-transform:translateY(-5px) translateX(3px);transform:translateY(-5px) translateX(3px)}.isso-comment-footer .reply{display:inline-block;-webkit-transform:translateY(-2px);transform:translateY(-2px)}.isso-comment-footer .votes{display:inline-block;-webkit-transform:translateY(2px);transform:translateY(2px)}.kg-image-card figcaption{margin:0}code,kbd,pre,samp{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.post-full-content h4{font-size:2.4rem}.avatar img{border-radius:10px}.kg-image-card figcaption{margin-top:10px}.post-full-content p code{word-break:inherit}
@font-face{font-family:Source Sans Pro;font-style:normal;font-weight:400;src:url(../fonts/source-sans-pro-v11-latin-regular.eot);src:local("Source Sans Pro Regular"),local("SourceSansPro-Regular"),url(../fonts/source-sans-pro-v11-latin-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/source-sans-pro-v11-latin-regular.woff2) format("woff2"),url(../fonts/source-sans-pro-v11-latin-regular.woff) format("woff"),url(../fonts/source-sans-pro-v11-latin-regular.ttf) format("truetype"),url(../fonts/source-sans-pro-v11-latin-regular.svg#SourceSansPro) format("svg")}.post-card-excerpt,.post-full-content,.post-full-content h5,.site-header-content .author-meta,.subscribe-overlay-description{font-family:Source Sans Pro,Georgia,serif}.post-full-content{font-size:1.9rem}.post-full-content h2{margin:.5em 0;font-size:3rem}.post-full-footer{padding:3vw 0}@media (min-width:900px){.floating-header{height:50px}}.post-template .post-content>p:first-child{font-size:inherit;line-height:inherit}.site-footer{padding-bottom:20px}.author-card-name{padding:0 0 5px}.post-full-content img,.post-full-content video{margin:.5em auto}.post-full-content pre{margin:0 0 2em}.post-full-header{padding:3vw}@media (max-width:500px){.post-full-header{padding:10vw 3vw 8vw}}.post-full-image{display:block;margin-top:0}.post-full-image img{height:100%!important}@media (max-width:500px){.post-full-image{height:100%!important}}.post-full-content:after,.post-full-content:before{display:none}@media (max-width:500px){.post-full-content{padding:30px 0 0}}.floating-header-blog-title{margin-right:1px}.isso-comment-footer svg{-webkit-transform:translateY(-5px);transform:translateY(-5px)}.isso-comment-footer .downvote svg{-webkit-transform:translateY(-5px) translateX(3px);transform:translateY(-5px) translateX(3px)}.isso-comment-footer .reply{display:inline-block;-webkit-transform:translateY(-2px);transform:translateY(-2px)}.isso-comment-footer .votes{display:inline-block;-webkit-transform:translateY(2px);transform:translateY(2px)}.kg-image-card figcaption{margin:0}code,kbd,pre,samp{font-family:Menlo,DejaVu Sans Mono,Liberation Mono,Consolas,Ubuntu Mono,Courier New,andale mono,lucida console,monospace}.post-full-content h4{font-size:2.4rem}.avatar img{border-radius:10px}.kg-image-card figcaption{margin-top:10px}.post-full-content p code{word-break:inherit}.post-full-comments{padding:0 170px}@media (max-width:1170px){.post-full-comments{padding:0 11vw}}@media (max-width:800px){.post-full-comments{padding:0 5vw}}@media (max-width:500px){.post-full-comments{padding:30px 0 0}}.post-full-content{padding-bottom:4vw}#isso-thread .textarea-wrapper{margin-bottom:1em}#isso-thread .auth-section{margin-bottom:.7em}@media screen and (min-width:600px){.isso-postbox>.form-wrapper>.auth-section .input-wrapper{margin-right:5px!important}}.isso-postbox>.form-wrapper>.auth-section .post-action>input{padding:calc(.4em - 1px) calc(.6em - 1px)!important}.isso-postbox>.form-wrapper input[type=checkbox]{margin-right:1em}.isso-comment>div.text-wrapper>.isso-comment-footer,.isso-comment>div.text-wrapper>.text{padding-left:calc(7% + 15px)}#isso-thread>h4{margin-bottom:1em}#isso-thread code{padding:0 5px 2px;font-size:.8em;line-height:1em;font-weight:400!important;background:#e5eff5;border-radius:3px}@media screen and (min-width:600px){.isso-postbox>.form-wrapper>.auth-section .input-wrapper{max-width:23%!important}}@media screen and (max-width:720px){.isso-postbox>.form-wrapper>.auth-section .input-wrapper{display:block!important;max-width:100%!important;margin:0 0 .3em!important}}#isso-thread blockquote{font-size:80%}
/*# sourceMappingURL=custom.css.map */

+ 1
- 1
assets/built/custom.css.map
File diff suppressed because it is too large
View File


+ 1
- 1
assets/built/global.css 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{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{-webkit-box-sizing:inherit;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]{-webkit-box-sizing:border-box;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]{-webkit-box-sizing:content-box;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}
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:#313b3f;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1.6rem;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:600;text-rendering:optimizeLegibility}h1{margin:0 0 .5em;font-size:5.5rem;font-weight:600}@media (max-width:500px){h1{font-size:2.2rem}}h2{margin:1.5em 0 .5em;font-size:2.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 */

+ 1
- 1
assets/built/global.css.map
File diff suppressed because it is too large
View File


+ 0
- 2
assets/built/infinitescroll.js View File

@@ -1,2 +0,0 @@
!function(n,t){var r=t.querySelector("link[rel=next]");if(r){var i=t.querySelector(".post-feed");if(i){var o=300,s=!1,l=!1,c=n.scrollY,u=n.innerHeight,d=t.documentElement.scrollHeight;n.addEventListener("scroll",a,{passive:!0}),n.addEventListener("resize",m),f()}}function v(){if(404===this.status)return n.removeEventListener("scroll",a),void n.removeEventListener("resize",m);this.response.querySelectorAll(".post-card").forEach(function(e){i.appendChild(e)});var e=this.response.querySelector("link[rel=next]");e?r.href=e.href:(n.removeEventListener("scroll",a),n.removeEventListener("resize",m)),d=t.documentElement.scrollHeight,l=s=!1}function e(){if(!l)if(c+u<=d-o)s=!1;else{l=!0;var e=new n.XMLHttpRequest;e.responseType="document",e.addEventListener("load",v),e.open("GET",r.href),e.send(null)}}function f(){s||n.requestAnimationFrame(e),s=!0}function a(){c=n.scrollY,f()}function m(){u=n.innerHeight,d=t.documentElement.scrollHeight,f()}}(window,document);
//# sourceMappingURL=infinitescroll.js.map

+ 0
- 1
assets/built/infinitescroll.js.map View File

@@ -1 +0,0 @@
{"version":3,"sources":["infinitescroll.js"],"names":["window","document","nextElement","querySelector","feedElement","buffer","ticking","loading","lastScrollY","scrollY","lastWindowHeight","innerHeight","lastDocumentHeight","documentElement","scrollHeight","addEventListener","onScroll","passive","onResize","requestTick","onPageLoad","this","status","removeEventListener","response","querySelectorAll","forEach","item","appendChild","resNextElement","href","onUpdate","xhr","XMLHttpRequest","responseType","open","send","requestAnimationFrame"],"mappings":"CAIA,SAAUA,EAAQC,GAEd,IAAIC,EAAcD,EAASE,cAAc,kBACzC,GAAKD,EAAL,CAGA,IAAIE,EAAcH,EAASE,cAAc,cACzC,GAAKC,EAAL,CAEA,IAAIC,EAAS,IAETC,GAAU,EACVC,GAAU,EAEVC,EAAcR,EAAOS,QACrBC,EAAmBV,EAAOW,YAC1BC,EAAqBX,EAASY,gBAAgBC,aAmElDd,EAAOe,iBAAiB,SAAUC,EAAU,CAAEC,SAAS,IACvDjB,EAAOe,iBAAiB,SAAUG,GAElCC,KApEA,SAASC,IACL,GAAoB,MAAhBC,KAAKC,OAGL,OAFAtB,EAAOuB,oBAAoB,SAAUP,QACrChB,EAAOuB,oBAAoB,SAAUL,GAKtBG,KAAKG,SAASC,iBAAiB,cACrCC,QAAQ,SAAUC,GAC3BvB,EAAYwB,YAAYD,KAI5B,IAAIE,EAAiBR,KAAKG,SAASrB,cAAc,kBAC7C0B,EACA3B,EAAY4B,KAAOD,EAAeC,MAElC9B,EAAOuB,oBAAoB,SAAUP,GACrChB,EAAOuB,oBAAoB,SAAUL,IAIzCN,EAAqBX,EAASY,gBAAgBC,aAE9CP,EADAD,GAAU,EAId,SAASyB,IAEL,IAAIxB,EAGJ,GAAIC,EAAcE,GAAoBE,EAAqBP,EACvDC,GAAU,MADd,CAKAC,GAAU,EAEV,IAAIyB,EAAM,IAAIhC,EAAOiC,eACrBD,EAAIE,aAAe,WAEnBF,EAAIjB,iBAAiB,OAAQK,GAE7BY,EAAIG,KAAK,MAAOjC,EAAY4B,MAC5BE,EAAII,KAAK,OAGb,SAASjB,IACLb,GAAWN,EAAOqC,sBAAsBN,GACxCzB,GAAU,EAGd,SAASU,IACLR,EAAcR,EAAOS,QACrBU,IAGJ,SAASD,IACLR,EAAmBV,EAAOW,YAC1BC,EAAqBX,EAASY,gBAAgBC,aAC9CK,KAhFR,CAuFGnB,OAAQC","file":"infinitescroll.js","sourcesContent":["/**\n * Infinite Scroll\n */\n\n(function(window, document) {\n // next link element\n var nextElement = document.querySelector('link[rel=next]');\n if (!nextElement) return;\n\n // post feed element\n var feedElement = document.querySelector('.post-feed');\n if (!feedElement) return;\n\n var buffer = 300;\n\n var ticking = false;\n var loading = false;\n\n var lastScrollY = window.scrollY;\n var lastWindowHeight = window.innerHeight;\n var lastDocumentHeight = document.documentElement.scrollHeight;\n\n function onPageLoad() {\n if (this.status === 404) {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', onResize);\n return;\n }\n\n // append contents\n var postElements = this.response.querySelectorAll('.post-card');\n postElements.forEach(function (item) {\n feedElement.appendChild(item);\n });\n\n // set next link\n var resNextElement = this.response.querySelector('link[rel=next]');\n if (resNextElement) {\n nextElement.href = resNextElement.href;\n } else {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', onResize);\n }\n\n // sync status\n lastDocumentHeight = document.documentElement.scrollHeight;\n ticking = false;\n loading = false;\n }\n\n function onUpdate() {\n // return if already loading\n if (loading) return;\n\n // return if not scroll to the bottom\n if (lastScrollY + lastWindowHeight <= lastDocumentHeight - buffer) {\n ticking = false;\n return;\n }\n\n loading = true;\n\n var xhr = new window.XMLHttpRequest();\n xhr.responseType = 'document';\n\n xhr.addEventListener('load', onPageLoad);\n\n xhr.open('GET', nextElement.href);\n xhr.send(null);\n }\n\n function requestTick() {\n ticking || window.requestAnimationFrame(onUpdate);\n ticking = true;\n }\n\n function onScroll() {\n lastScrollY = window.scrollY;\n requestTick();\n }\n\n function onResize() {\n lastWindowHeight = window.innerHeight;\n lastDocumentHeight = document.documentElement.scrollHeight;\n requestTick();\n }\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('resize', onResize);\n\n requestTick();\n})(window, document);\n"]}

+ 0
- 2
assets/built/jquery.fitvids.js View File

@@ -1,2 +0,0 @@
!function(d){"use strict";d.fn.fitVids=function(t){var i={customSelector:null,ignore:null};if(!document.getElementById("fit-vids-style")){var e=document.head||document.getElementsByTagName("head")[0],r=document.createElement("div");r.innerHTML='<p>x</p><style id="fit-vids-style">.fluid-width-video-container{flex-grow: 1;width:100%;}.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}</style>',e.appendChild(r.childNodes[1])}return t&&d.extend(i,t),this.each(function(){var t=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"];i.customSelector&&t.push(i.customSelector);var r=".fitvidsignore";i.ignore&&(r=r+", "+i.ignore);var e=d(this).find(t.join(","));(e=(e=e.not("object object")).not(r)).each(function(){var t=d(this);if(!(0<t.parents(r).length||"embed"===this.tagName.toLowerCase()&&t.parent("object").length||t.parent(".fluid-width-video-wrapper").length)){t.css("height")||t.css("width")||!isNaN(t.attr("height"))&&!isNaN(t.attr("width"))||(t.attr("height",9),t.attr("width",16));var e=("object"===this.tagName.toLowerCase()||t.attr("height")&&!isNaN(parseInt(t.attr("height"),10))?parseInt(t.attr("height"),10):t.height())/(isNaN(parseInt(t.attr("width"),10))?t.width():parseInt(t.attr("width"),10));if(!t.attr("name")){var i="fitvid"+d.fn.fitVids._count;t.attr("name",i),d.fn.fitVids._count++}t.wrap('<div class="fluid-width-video-container"><div class="fluid-width-video-wrapper"></div></div>').parent(".fluid-width-video-wrapper").css("padding-top",100*e+"%"),t.removeAttr("height").removeAttr("width")}})})},d.fn.fitVids._count=0}(window.jQuery||window.Zepto);
//# sourceMappingURL=jquery.fitvids.js.map

+ 0
- 1
assets/built/jquery.fitvids.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
assets/built/screen.css
File diff suppressed because it is too large
View File


+ 1
- 1
assets/built/screen.css.map
File diff suppressed because it is too large
View File


+ 95
- 17
assets/css/custom.css View File

@@ -48,22 +48,6 @@
font-size: 3rem;
}

/* Make the thread the same width as the post */
#isso-thread {
padding: 0 100px 0 !important;
}

@media (max-width: 1170px) {
#isso-thread {
padding: 5vw 7vw 0 !important;
}
}

@media (max-width: 500px) {
#isso-thread {
padding: 0 !important;
}
}
/* reduce the bottom padding of the author card */
.post-full-footer {
padding: 3vw 0 3vw;
@@ -118,7 +102,7 @@
/* Center the header post image */
.post-full-image {
display: block;
margin: auto;
margin-top: 0;
}

/* Do not stretch header image */
@@ -209,3 +193,97 @@ samp {
.post-full-content p code {
word-break: inherit;
}

/* Make comments the same width as content */
.post-full-comments {
padding: 0 170px 0;
}

@media (max-width: 1170px) {
.post-full-comments {
padding: 0 11vw;
}
}

@media (max-width: 800px) {
.post-full-comments {
padding: 0 5vw;
}
}

@media (max-width: 500px) {
.post-full-comments {
padding: 30px 0 0;
}
}

/* Remove uesless space between post and comments */

.post-full-content {
padding-bottom: 4vw;
}

/* Some margin around isso buttons */
#isso-thread .textarea-wrapper {
margin-bottom: 1em;
}
#isso-thread .auth-section {
margin-bottom: 0.7em;
}
@media screen and (min-width: 600px) {
.isso-postbox > .form-wrapper > .auth-section .input-wrapper {
margin-right: 5px !important;
}
}

.isso-postbox > .form-wrapper > .auth-section .post-action > input {
padding: calc(0.4em - 1px) calc(0.6em - 1px) !important;
}

.isso-postbox > .form-wrapper input[type="checkbox"] {
margin-right: 1em;
}

/* Add some left padding to Isso comment text and reply button to match avatar width */

.isso-comment > div.text-wrapper > .isso-comment-footer,
.isso-comment > div.text-wrapper > .text {
padding-left: calc(7% + 15px);
}

/* Add some margin between the number of Isso comments and the form */

#isso-thread > h4 {
margin-bottom: 1em;
}

/* Add Ghost-like look to inline code in Isso comments */
#isso-thread code {
padding: 0 5px 2px;
font-size: 0.8em;
line-height: 1em;
font-weight: 400 !important;
background: #e5eff5;
border-radius: 3px;
}

/* Make sure the 2nd part of the Isso form stays on one line even when responding to a nested comment. */

@media screen and (min-width: 600px) {
.isso-postbox > .form-wrapper > .auth-section .input-wrapper {
max-width: 23% !important;
}
}

@media screen and (max-width: 720px) {
.isso-postbox > .form-wrapper > .auth-section .input-wrapper {
display: block !important;
max-width: 100% !important;
margin: 0 0 0.3em !important;
}
}

/* Make blockquotes the same font size as the rest of the comment */
#isso-thread blockquote {
font-size: 80%;
}

+ 10
- 8
assets/css/global.css View File

@@ -8,12 +8,13 @@
--purple: #ad26b4;
--yellow: #fecd35;
--red: #f05230;
--darkgrey: #15171A;
--darkgrey: #15171a;
--midgrey: #738a94;
--lightgrey: #c5d2d9;
--whitegrey: #e5eff5;
--pink: #fa3a57;
--brown: #a3821a;
--darkmode: color(var(--darkgrey) l(+2%));
}

/* Reset
@@ -280,9 +281,10 @@ html {
}
body {
overflow-x: hidden;
color: color(var(--midgrey) l(-25%));
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
font-size: 1.5rem;
color: color(var(--midgrey) l(-30%));
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
font-size: 1.6rem;
line-height: 1.6em;
font-weight: 400;
font-style: normal;
@@ -431,14 +433,14 @@ h5,
h6 {
margin-top: 0;
line-height: 1.15;
font-weight: 700;
font-weight: 600;
text-rendering: optimizeLegibility;
}

h1 {
margin: 0 0 0.5em 0;
font-size: 5rem;
font-weight: 700;
font-size: 5.5rem;
font-weight: 600;
}
@media (max-width: 500px) {
h1 {
@@ -448,7 +450,7 @@ h1 {

h2 {
margin: 1.5em 0 0.5em 0;
font-size: 2rem;
font-size: 2.2rem;
}
@media (max-width: 500px) {
h2 {


+ 1557
- 914
assets/css/screen.css
File diff suppressed because it is too large
View File


+ 1
- 344
assets/fonts/source-sans-pro-v11-latin-regular.svg
File diff suppressed because it is too large
View File


+ 24
- 0
assets/js/gallery-card.js View File

@@ -0,0 +1,24 @@
/* eslint-env browser */

/**
* Gallery card support
* Used on any individual post/page
*
* Detects when a gallery card has been used and applies sizing to make sure
* the display matches what is seen in the editor.
*/

(function (window, document) {
var resizeImagesInGalleries = function resizeImagesInGalleries() {
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%';
});
};

document.addEventListener('DOMContentLoaded', resizeImagesInGalleries);
})(window, document);

assets/js/infinitescroll.js → assets/js/infinite-scroll.js View File

@@ -1,15 +1,30 @@
/* eslint-env browser */

/**
* Infinite Scroll
* Used on all pages where there is a list of posts (homepage, tag index, etc).
*
* When the page is scrolled to 300px from the bottom, the next page of posts
* is fetched by following the the <link rel="next" href="..."> that is output
* by {{ghost_head}}.
*
* The individual post items are extracted from the fetched pages by looking for
* a wrapper element with the class "post-card". Any found elements are appended
* to the element with the class "post-feed" in the currently viewed page.
*/

(function(window, document) {
(function (window, document) {
// next link element
var nextElement = document.querySelector('link[rel=next]');
if (!nextElement) return;
if (!nextElement) {
return;
}

// post feed element
var feedElement = document.querySelector('.post-feed');
if (!feedElement) return;
if (!feedElement) {
return;
}

var buffer = 300;

@@ -30,7 +45,10 @@
// append contents
var postElements = this.response.querySelectorAll('.post-card');
postElements.forEach(function (item) {
feedElement.appendChild(item);
// document.importNode is important, without it the item's owner
// document will be different which can break resizing of
// `object-fit: cover` images in Safari
feedElement.appendChild(document.importNode(item, true));
});

// set next link
@@ -50,7 +68,9 @@

function onUpdate() {
// return if already loading
if (loading) return;
if (loading) {
return;
}

// return if not scroll to the bottom
if (lastScrollY + lastWindowHeight <= lastDocumentHeight - buffer) {
@@ -85,7 +105,7 @@
requestTick();
}

window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('scroll', onScroll, {passive: true});
window.addEventListener('resize', onResize);

requestTick();

+ 0
- 4
assets/js/jquery-3.2.1.min.js
File diff suppressed because it is too large
View File


+ 2
- 0
assets/js/jquery-3.4.1.min.js
File diff suppressed because it is too large
View File


assets/js/jquery.fitvids.js → assets/js/lib/jquery.fitvids.js View File


+ 61
- 0
assets/js/sticky-nav-title.js View File

@@ -0,0 +1,61 @@
/* eslint-env browser */

/**
* Nav/Title replacement
* Used on invividual post pages, displays the post title in place of the nav
* bar when scrolling past the title
*
* Usage:
* ```
* Casper.stickyTitle({
* navSelector: '.site-nav-main',
* titleSelector: '.post-full-title',
* activeClass: 'nav-post-title-active'
* });
* ```
*/

(function (window, document) {
// set up Casper as a global object
if (!window.Casper) {
window.Casper = {};
}

window.Casper.stickyNavTitle = function stickyNavTitle(options) {
var nav = document.querySelector(options.navSelector);
var title = document.querySelector(options.titleSelector);

var lastScrollY = window.scrollY;
var ticking = false;

function onScroll() {
lastScrollY = window.scrollY;
requestTick();
}

function requestTick() {
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}

function update() {
var trigger = title.getBoundingClientRect().top + window.scrollY;
var triggerOffset = title.offsetHeight + 35;

// show/hide post title
if (lastScrollY >= trigger + triggerOffset) {
nav.classList.add(options.activeClass);
} else {
nav.classList.remove(options.activeClass);
}

ticking = false;
}

window.addEventListener('scroll', onScroll, {passive: true});

update();
};
})(window, document);

BIN
assets/screenshot-desktop.jpg View File

Before After
Width: 1400  |  Height: 1123  |  Size: 106 KiB Width: 2636  |  Height: 2200  |  Size: 132 KiB

BIN
assets/screenshot-mobile.jpg View File

Before After
Width: 890  |  Height: 1528  |  Size: 102 KiB Width: 890  |  Height: 1846  |  Size: 60 KiB

+ 33
- 25
author.hbs View File

@@ -5,34 +5,42 @@
{{!-- Everything inside the #author tags pulls data from the author --}}


{{> header background=cover_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
<div class="inner">
{{> "site-nav"}}
<div class="site-header-content">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{/if}}
<h1 class="site-title">{{name}}</h1>
{{#if bio}}
<h2 class="author-bio">{{bio}}</h2>
{{/if}}
<div class="author-meta">
{{#if location}}
<div class="author-location">{{location}} <span class="bull">&bull;</span></div>
<header class="site-archive-header">
{{> site-header}}
{{> header-background background=cover_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner">
<div class="site-header-content author-header">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{/if}}
<<<<<<< HEAD
<div class="author-stats">
{{plural ../pagination.total empty=(t "No posts") singular=(t "1 post") plural=(t "% posts")}}
=======
<div class="author-header-content">
<h1 class="site-title">{{name}}</h1>
{{#if bio}}
<h2 class="author-bio">{{bio}}</h2>
{{/if}}
<div class="author-meta">
{{#if location}}
<div class="author-location">{{location}}</div>
{{/if}}
<div class="author-stats">
{{plural ../pagination.total empty='No posts' singular='% post' plural='% posts'}}
</div>
{{#if website}}
<span class="author-social-link"><a href="{{website}}" target="_blank" rel="noopener">Website</a></span>
{{/if}}
{{#if twitter}}
<span class="author-social-link"><a href="{{twitter_url}}" target="_blank" rel="noopener">Twitter</a></span>
{{/if}}
{{#if facebook}}
<span class="author-social-link"><a href="{{facebook_url}}" target="_blank" rel="noopener">Facebook</a></span>
{{/if}}
</div>
>>>>>>> upstream/master
</div>
{{#if website}}
<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" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
{{#if facebook}}
<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="{{url absolute="true"}}/rss/" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
</div>
</div>
</div>
@@ -41,7 +49,7 @@

{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="inner posts">

<div class="post-feed">
{{#foreach posts}}


+ 68
- 17
default.hbs View File

@@ -41,37 +41,88 @@
</div>

{{!-- The big email subscribe modal content --}}
{{#if @labs.subscribers}}
{{#if @labs.members}}
<div class="subscribe-success-message">
<a class="subscribe-close" href="javascript:;"></a>
You've successfully subscribed to {{@site.title}}!
</div>

<div id="subscribe" class="subscribe-overlay">
<a class="subscribe-overlay-close" href="#"></a>
<a class="subscribe-close" href="#"></a>
<div class="subscribe-overlay-content">
{{#if @site.logo}}
<img class="subscribe-overlay-logo" src="{{@site.logo}}" alt="{{@site.title}}" />
{{/if}}
<<<<<<< HEAD
<h1 class="subscribe-overlay-title">S'abonnez à {{@site.title}}</h1>
<p class="subscribe-overlay-description">Restez au courant ! Recevez toutes les dernières nouveautés &amp; meilleures publications délivrées directement dans votre boîte de réception.</p>
{{subscribe_form placeholder="youremail@example.com"}}
=======
<div class="subscribe-form">
<h1 class="subscribe-overlay-title">Subscribe to {{@site.title}}</h1>
<p class="subscribe-overlay-description">Stay up to date! Get all the latest & greatest posts delivered straight to your inbox</p>
<form data-members-form="subscribe">
<div class="form-group">
<input class="subscribe-email" data-members-email placeholder="youremail@example.com"
autocomplete="false" />
<button class="button primary" type="submit">
<span class="button-content">Subscribe</span>
<span class="button-loader">{{> "icons/loader"}}</span>
</button>
</div>
<div class="message-success">
<strong>Great!</strong> Check your inbox and click the link to confirm your subscription.
</div>
<div class="message-error">
Please enter a valid email address!
</div>
</form>
</div>
>>>>>>> upstream/master
</div>
</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%';
})
{{!-- jQuery, required for fitvids --}}
<script
src="{{asset "js/jquery-3.4.1.min.js"}}"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=">
</script>
{{!-- Fitvids (for responsive video embeds), infinite scroll, floating header, and gallery card support --}}
<script src="{{asset "built/casper.js"}}"></script>


{{!-- jQuery + Fitvids, which makes all video embeds responsive --}}
<script src="{{asset "js/jquery-3.2.1.min.js"}}"></script>
<script type="text/javascript" src="{{asset "built/jquery.fitvids.js"}}"></script>

<script src="{{asset "built/infinitescroll.js"}}"></script>
{{!-- Scripts for Members subscription --}}
<script>
// Parse the URL parameter
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}

// Give the parameter a variable name
var action = getParameterByName('action');

$(document).ready(function () {
if (action == 'subscribe') {
$('body').addClass("subscribe-success");
}

$('.subscribe-success-message .subscribe-close').click(function () {
$('.subscribe-success-message').addClass('close');
});

// Reset form on opening subscrion overlay
$('.subscribe-button').click(function() {
$('.subscribe-overlay form').removeClass();
$('.subscribe-email').val('');
});
});
</script>

{{!-- The #block helper will pull in data from the #contentFor other template files. In this case, there's some JavaScript which we only want to use in post.hbs, but it needs to be included down here, after jQuery has already loaded. --}}
{{{block "scripts"}}}


+ 22
- 39
error-404.hbs View File

@@ -3,35 +3,15 @@ This error template is used for all 404 errors, which might occur on your site.
It's a good idea to keep this template as minimal as possible in terms of both file size and complexity.
--}}

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>{{meta_title}}</title>
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="{{asset "built/screen.css"}}" />
<link rel="stylesheet" type="text/css" href="{{asset "built/custom.css"}}" />
</head>
<body class="error-template">
<div class="site-wrapper">
{{!< default}}
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}

<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-image{{/if}}">
<div class="inner">
<nav class="site-nav-center">
{{#if @site.logo}}
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{img_url @site.logo size="xs"}}" alt="{{@site.title}}" /></a>
{{else}}
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
{{/if}}
</nav>
</div>
</header>

<main id="site-main" class="site-main outer">
<div class="inner">
<header class="site-header">
{{> site-header}}
</header>

<<<<<<< HEAD
<section class="error-message">
<h1 class="error-code">{{error.statusCode}}</h1>
<p class="error-description">{{message}}</p>
@@ -39,19 +19,22 @@ It's a good idea to keep this template as minimal as possible in terms of both f
</section>
</div>
</main>
=======
<main id="site-main" class="site-main outer error-content">
<div class="inner">
<section class="error-message">
<h1 class="error-code">{{statusCode}}</h1>
<p class="error-description">{{message}}</p>
<a class="error-link" href="{{@site.url}}">Go to the front page →</a>
</section>
>>>>>>> upstream/master

{{#get "posts" limit="3"}}
<aside class="outer">
<div class="inner">
<div class="post-feed">
{{#foreach posts}}
{{> "post-card"}}
{{/foreach}}
</div>
{{#get "posts" limit="3" include="authors,tags"}}
<div class="post-feed">
{{#foreach posts}}
{{> "post-card"}}
{{/foreach}}
</div>
</aside>
{{/get}}

</div>
</body>
</html>
</main>

+ 17
- 10
error.hbs View File

@@ -15,26 +15,33 @@ You'll notice that we *don't* use any JavaScript, or ghost_head / ghost_foot in
<link rel="stylesheet" type="text/css" href="{{asset "built/screen.css"}}" />
<link rel="stylesheet" type="text/css" href="{{asset "built/custom.css"}}" />
</head>
<body class="error-template">
<body>
<div class="site-wrapper">

<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-image{{/if}}">
<div class="inner">
<nav class="site-nav-center">
{{#if @site.logo}}
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{img_url @site.logo size="xs"}}" alt="{{@site.title}}" /></a>
{{else}}
<header class="site-header no-image">
<div class="site-nav-main outer">
<div class="inner">
<nav class="site-nav-center">
{{#if @site.logo}}
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{img_url @site.logo size="xs"}}"
alt="{{@site.title}}" /></a>
{{else}}
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
{{/if}}
</nav>
{{/if}}
</nav>
</div>
</div>
</header>

<main id="site-main" class="site-main outer">
<main id="site-main" class="site-main outer error-content">
<div class="inner">

<section class="error-message">
<<<<<<< HEAD
<h1 class="error-code">{{error.statusCode}}</h1>
=======
<h1 class="error-code">{{statusCode}}</h1>
>>>>>>> upstream/master
<p class="error-description">{{message}}</p>
<a class="error-link" href="{{@site.url}}">Go to the front page →</a>
</section>


+ 15
- 6
gulpfile.js View File

@@ -5,8 +5,10 @@ const pump = require('pump');
const livereload = require('gulp-livereload');
const postcss = require('gulp-postcss');
const zip = require('gulp-zip');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
const beeper = require('beeper');
const fs = require('fs');

// postcss plugins
const autoprefixer = require('autoprefixer');
@@ -41,7 +43,7 @@ function css(done) {
easyimport,
customProperties({preserve: false}),
colorFunction(),
autoprefixer({browsers: ['last 2 versions']}),
autoprefixer(),
cssnano()
];

@@ -55,7 +57,12 @@ function css(done) {

function js(done) {
pump([
src('assets/js/*.js', {sourcemaps: true}),
src([
// pull in lib files first so our own code can depend on it
'assets/js/lib/*.js',
'assets/js/*.js'
], {sourcemaps: true}),
concat('casper.js'),
uglify(),
dest('assets/built/', {sourcemaps: '.'}),
livereload()
@@ -130,9 +137,9 @@ const previousRelease = () => {
console.log('No releases found. Skipping');
return;
}
console.log(`Previous version ${response[0].name}`);
return response[0].name;
let prevVersion = response[0].tag_name || response[0].name;
console.log(`Previous version ${prevVersion}`);
return prevVersion;
});
};

@@ -152,7 +159,9 @@ const previousRelease = () => {
*/
const release = () => {
// @NOTE: https://yarnpkg.com/lang/en/docs/cli/version/
const newVersion = process.env.npm_package_version;
// require(./package.json) can run into caching issues, this re-reads from file everytime on release
var packageJSON = JSON.parse(fs.readFileSync('./package.json'));
const newVersion = packageJSON.version;
let shipsWithGhost = '{version}';
let compatibleWithGhost = '2.10.0';
const ghostEnvValues = process.env.GHOST || null;


+ 76
- 13
index.hbs View File

@@ -2,25 +2,27 @@
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}

{{> header background=@site.cover_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
<div class="inner">
<div class="site-header-content">
<h1 class="site-title">
{{#if @site.logo}}
<img class="site-logo" src="{{img_url @site.logo size="l"}}" alt="{{@site.title}}" />
{{else}}
{{@site.title}}
{{/if}}
</h1>
<h2 class="site-description">{{@site.description}}</h2>
<header class="site-home-header">
{{> header-background background=@site.cover_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner">
{{> "site-nav"}}
<div class="site-header-content">
<h1 class="site-title">
{{#if @site.logo}}
<img class="site-logo" src="{{img_url @site.logo size="l"}}" alt="{{@site.title}}" />
{{else}}
{{@site.title}}
{{/if}}
</h1>
<h2 class="site-description">{{@site.description}}</h2>
</div>
</div>
{{> "site-nav"}}
</div>
</header>

{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="inner posts">

<div class="post-feed">
{{#foreach posts}}
@@ -33,3 +35,64 @@ into the {body} of the default.hbs template --}}

</div>
</main>

{{> site-header}}

{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>

// NOTE: Scroll performance is poor in Safari
// - this appears to be due to the events firing much more slowly in Safari.
// Dropping the scroll event and using only a raf loop results in smoother
// scrolling but continuous processing even when not scrolling
$(document).ready(function () {
var nav = document.querySelector('.site-nav-main .site-nav');
var feed = document.querySelector('.post-feed');

var lastScrollY = window.scrollY;
var lastWindowHeight = window.innerHeight;
var lastDocumentHeight = $(document).height();
var ticking = false;

function onScroll() {
lastScrollY = window.scrollY;
requestTick();
}

function onResize() {
lastWindowHeight = window.innerHeight;
lastDocumentHeight = $(document).height();
requestTick();
}

function requestTick() {
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}

function update() {
var trigger = feed.getBoundingClientRect().top + window.scrollY;
var progressMax = lastDocumentHeight - lastWindowHeight;

// show/hide nav
if (lastScrollY >= trigger - 20) {
nav.classList.add('fixed-nav-active');
} else {
nav.classList.remove('fixed-nav-active');
}

ticking = false;
}

window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', onResize, false);

update();

});
</script>
{{/contentFor}}

+ 21
- 9
package.json View File

@@ -1,11 +1,18 @@
{
<<<<<<< HEAD
"name": "casper-geber",
"description": "This is the Ghost theme of www.geber.ga, based on Casper.",
"demo": "https://www.geber.ga",
"version": "2.11.1",
=======
"name": "casper-xyz",
"description": "This is the Ghost theme of angristan.xyz, based on Casper.",
"demo": "https://angristan.xyz",
"version": "3.0.6",
>>>>>>> upstream/master
"engines": {
"ghost": ">=2.0.0",
"ghost-api": "v2"
"ghost": ">=3.0.0",
"ghost-api": "v3"
},
"license": "MIT",
"screenshots": {
@@ -16,6 +23,7 @@
"dev": "gulp",
"zip": "gulp zip",
"test": "gscan .",
"test:ci": "gscan --fatal --verbose .",
"pretest": "gulp build",
"preship": "yarn test",
"ship": "STATUS=$(git status --porcelain); echo $STATUS; if [ -z \"$STATUS\" ]; then yarn version && git push --follow-tags; else echo \"Uncomitted changes found.\" && exit 1; fi",
@@ -45,21 +53,25 @@
"bugs": "https://git.drycat.fr/albakham/Casper-Geber/issues",
"contributors": "https://github.com/Angristan/Casper/graphs/contributors",
"devDependencies": {
"@tryghost/release-utils": "0.3.2",
"autoprefixer": "9.6.1",
"beeper": "1.1.1",
"@tryghost/release-utils": "0.3.3",
"autoprefixer": "9.7.1",
"beeper": "2.0.0",
"cssnano": "4.1.10",
"gscan": "2.7.0",
"gscan": "3.2.1",
"gulp": "4.0.2",
"gulp-livereload": "4.0.1",
"gulp-concat": "2.6.1",
"gulp-livereload": "4.0.2",
"gulp-postcss": "8.0.0",
"gulp-uglify": "3.0.2",
"gulp-zip": "4.2.0",
"gulp-zip": "5.0.1",
"postcss-color-function": "4.1.0",
"postcss-custom-properties": "8.0.11",
"postcss-custom-properties": "9.0.2",
"postcss-easy-import": "3.0.0",
"pump": "3.0.0"
},
"browserslist": [
"defaults"
],
"config": {
"posts_per_page": 25,
"image_sizes": {


+ 11
- 9
page.hbs View File

@@ -3,9 +3,11 @@
into the {body} of the default.hbs template --}}

{{!-- The big featured header, it uses blog cover image as a BG if available --}}
<header class="site-header outer">
<div class="inner">
{{> "site-nav"}}
<header class="site-header">
<div class="outer site-nav-main">
<div class="inner">
{{> "site-nav"}}
</div>
</div>
</header>

@@ -31,8 +33,8 @@ into the {body} of the default.hbs template --}}
{{img_url feature_image size="l"}} 1000w,
{{img_url feature_image size="xl"}} 2000w"
sizes="(max-width: 800px) 400px,
(max-width: 1170px) 700px,
1400px"
(max-width: 1170px) 1170px,
2000px"
src="{{img_url feature_image size="xl"}}"
alt="{{title}}"
/>
@@ -55,9 +57,9 @@ into the {body} of the default.hbs template --}}
{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>
$(function() {
var $postContent = $(".post-full-content");
$postContent.fitVids();
});
$(function() {
var $postContent = $(".post-full-content");
$postContent.fitVids();
});
</script>
{{/contentFor}}

+ 47
- 0
partials/header-background.hbs View File

@@ -0,0 +1,47 @@
{{!--
Wow what the hell is going on in here even?

Ok so, several templates use this big header with a giant BG image. Nice idea, but big images
have a heavy impact on performance, so it's a good idea to make them responsive. Because we
can only get the image dynamically using Handlebars, and we can only set the image to properly
be a background image using CSS, we end up with a handful of inline styles.

If the template in question has a background image, then we render responsive image styles
for it, and apply those styles to the <header> tag. Else, we just output a <header> tag
with a `no-image` class so we can style it accordingly.
--}}

{{#if background}}

<style type="text/css">
.responsive-header-img {
background-image: url({{img_url background size='xl'}});
}

@media(max-width: 1000px) {
.responsive-header-img {
background-image: url({{img_url background size='l'}});
background-image: -webkit-image-set(url({{img_url background size='l'}}) 1x,
url({{img_url background size='xl'}}) 2x);
background-image: image-set(url({{img_url background size='l'}}) 1x,
url({{img_url background size='xl'}}) 2x);
}
}

@media(max-width: 600px) {
.responsive-header-img {
background-image: url({{img_url background size='m'}});
background-image: -webkit-image-set(url({{img_url background size='m'}}) 1x,
url({{img_url background size='l'}}) 2x);
background-image: image-set(url({{img_url background size='m'}}) 1x,
url({{img_url background size='l'}}) 2x);
}
}
</style>
<div class="outer site-header-background responsive-header-img">

{{else}}

<div class="outer site-header-background no-image">

{{/if}}

+ 1
- 1
partials/icons/facebook.hbs View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M19 6h5V0h-5c-3.86 0-7 3.14-7 7v3H8v6h4v16h6V16h5l1-6h-6V7c0-.542.458-1 1-1z"/></svg>
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M16 0c8.837 0 16 7.163 16 16s-7.163 16-16 16S0 24.837 0 16 7.163 0 16 0zm5.204 4.911h-3.546c-2.103 0-4.443.885-4.443 3.934.01 1.062 0 2.08 0 3.225h-2.433v3.872h2.509v11.147h4.61v-11.22h3.042l.275-3.81h-3.397s.007-1.695 0-2.187c0-1.205 1.253-1.136 1.329-1.136h2.054V4.911z" /></svg>

+ 11
- 0
partials/icons/loader.hbs View File

@@ -0,0 +1,11 @@
<svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="40px" height="40px" viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
<path opacity="0.2" fill="#000" d="M20.201,5.169c-8.254,0-14.946,6.692-14.946,14.946c0,8.255,6.692,14.946,14.946,14.946
s14.946-6.691,14.946-14.946C35.146,11.861,28.455,5.169,20.201,5.169z M20.201,31.749c-6.425,0-11.634-5.208-11.634-11.634
c0-6.425,5.209-11.634,11.634-11.634c6.425,0,11.633,5.209,11.633,11.634C31.834,26.541,26.626,31.749,20.201,31.749z" />
<path fill="#000" d="M26.013,10.047l1.654-2.866c-2.198-1.272-4.743-2.012-7.466-2.012h0v3.312h0
C22.32,8.481,24.301,9.057,26.013,10.047z">
<animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 20 20" to="360 20 20"
dur="0.5s" repeatCount="indefinite" />
</path>
</svg>

+ 18
- 12
partials/post-card.hbs View File

@@ -22,21 +22,26 @@

<header class="post-card-header">
{{#if primary_tag}}
<span class="post-card-tags">{{primary_tag.name}}</span>
{{#primary_tag}}
<div class="post-card-primary-tag">{{name}}</div>
{{/primary_tag}}
{{/if}}
<h2 class="post-card-title">{{title}}</h2>
</header>

<section class="post-card-excerpt">
<p>{{excerpt words="33"}}</p>
{{#if feature_image}}
<p>{{excerpt words="30"}}</p>
{{else}}
<p>{{excerpt words="44"}}</p>
{{/if}}
</section>

</a>

<footer class="post-card-meta">

<ul class="author-list">
{{#foreach authors}}
{{#foreach authors}}
<li class="author-list-item">

<div class="author-name-tooltip">
@@ -44,18 +49,19 @@
</div>

{{#if profile_image}}
<a href="{{url}}" class="static-avatar">
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
</a>
<a href="{{url}}" class="static-avatar">
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
</a>
{{else}}
<a href="{{url}}" class="static-avatar author-profile-image">{{> "icons/avatar"}}</a>
<a href="{{url}}" class="static-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}
</li>
{{/foreach}}
{{/foreach}}
</ul>

<time class="reading-time" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMMM YYYY"}}</time>

<div class="post-card-byline-content">
<span>{{#has author="count:>2"}}Multiple authors{{else}}{{authors}}{{/has}}</span>
<span class="post-card-byline-date"><time datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time> <span class="bull">&bull;</span> {{reading_time}}</span>
</div>
</footer>

</div>{{!--/.post-card-content--}}


+ 5
- 0
partials/site-header.hbs View File

@@ -0,0 +1,5 @@
<div class="outer site-nav-main">
<div class="inner">
{{> "site-nav"}}
</div>
</div>

+ 27
- 7
partials/site-nav.hbs View File

@@ -1,19 +1,28 @@
<nav class="site-nav">
<div class="site-nav-left">
{{^is "home"}}
<div class="site-nav-left-wrapper">
<div class="site-nav-left">
{{#if @site.logo}}
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{@site.logo}}" alt="{{@site.title}}" /></a>
{{else}}
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
{{/if}}
{{/is}}
{{#if @site.navigation}}
{{navigation}}
{{/if}}
<div class="site-nav-content">
{{#if @site.navigation}}
{{navigation}}
{{/if}}
{{#is "post"}}
<span class="nav-post-title {{#unless @site.logo}}dash{{/unless}}">{{post.title}}</span>
{{/is}}
</div>
</div>
</div>
<div class="site-nav-right">
<div class="social-links">
{{#if @site.twitter}}
{{#if @site.secondary_navigation}}
{{navigation type="secondary"}}
{{else}}
<div class="social-links">
{{#if @site.twitter}}
<a class="social-link social-link-tw" href="{{twitter_url @site.twitter}}" title="Twitter" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
<a rel="me" class="social-link social-link-ms" href="https://miaou.drycat.fr/@albakham" target="_blank" rel="noopener">{{> "icons/mastodon"}}</a>
@@ -22,10 +31,21 @@
{{#if @site.facebook}}
<a class="social-link social-link-fb" href="{{facebook_url @site.facebook}}" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
{{/if}}
<<<<<<< HEAD
<a class="rss-button" href="{{@site.url}}/rss/" title="RSS" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
</div>
{{#if @labs.subscribers}}
<a class="subscribe-button" href="#subscribe">S'abonner</a>
=======
</div>
{{#unless @labs.members}}
<a class="rss-button" href="{{@site.url}}/rss/" title="RSS" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
{{/unless}}
{{/if}}

{{#if @labs.members}}
<a class="subscribe-button" href="#subscribe">Subscribe</a>
>>>>>>> upstream/master
{{/if}}
</div>
</nav>

+ 19
- 0
partials/subscribe-form.hbs View File

@@ -0,0 +1,19 @@
<section class="subscribe-form">
<h3 class="subscribe-form-title">Subscribe to {{@site.title}}</h3>
<p class="subscribe-form-description">Get the latest posts delivered right to your inbox</p>
<form data-members-form="subscribe">
<div class="form-group">
<input class="subscribe-email" data-members-email placeholder="youremail@example.com" autocomplete="false" />
<button class="button primary" type="submit">
<span class="button-content">Subscribe</span>
<span class="button-loader">{{> "icons/loader"}}</span>
</button>
</div>
<div class="message-success">
<strong>Great!</strong> Check your inbox and click the link to confirm your subscription.
</div>
<div class="message-error">
Please enter a valid email address!
</div>
</form>
</section>

+ 126
- 107
post.hbs View File

@@ -3,10 +3,8 @@
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}

<header class="site-header outer">
<div class="inner">
{{> "site-nav"}}
</div>
<header class="site-header">
{{> site-header}}
</header>

{{!-- Everything inside the #post tags pulls data from the post --}}
@@ -18,13 +16,73 @@ into the {body} of the default.hbs template --}}
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">

<header class="post-full-header">
<section class="post-full-meta">
<time class="post-full-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMMM YYYY"}}</time>

{{#if primary_tag}}
<section class="post-full-tags">
{{#primary_tag}}
<span class="date-divider">/</span> <a href="{{url}}">{{name}}</a>
<a href="{{url}}">{{name}}</a>
{{/primary_tag}}
</section>
{{/if}}

<h1 class="post-full-title">{{title}}</h1>

{{#if custom_excerpt}}
<p class="post-full-custom-excerpt">{{custom_excerpt}}</p>
{{/if}}

<div class="post-full-byline">

<section class="post-full-byline-content">

<ul class="author-list">
{{#foreach authors}}
<li class="author-list-item">

<div class="author-card">
{{#if profile_image}}
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
{{else}}
<div class="author-profile-image">{{> "icons/avatar"}}</div>
{{/if}}
<div class="author-info">
{{#if bio}}
<div class="bio">
<h2>{{name}}</h2>
<p>{{bio}}</p>
<p><a href="{{url}}">More posts</a> by {{name}}.</p>
</div>
{{else}}
<h2>{{name}}</h2>
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
{{/if}}
</div>
</div>

{{#if profile_image}}
<a href="{{url}}" class="author-avatar">
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
</a>
{{else}}
<a href="{{url}}" class="author-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}

</li>
{{/foreach}}
</ul>

<section class="post-full-byline-meta">
<h4 class="author-name">{{authors}}</h4>
<div class="byline-meta-content">
<time class="byline-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time>
<span class="byline-reading-time"><span class="bull">&bull;</span> {{reading_time}}</span>
</div>
</section>

</section>


</div>
</header>

{{#if feature_image}}
@@ -37,8 +95,8 @@ into the {body} of the default.hbs template --}}
{{img_url feature_image size="l"}} 1000w,
{{img_url feature_image size="xl"}} 2000w"
sizes="(max-width: 800px) 400px,
(max-width: 1170px) 700px,
1400px"
(max-width: 1170px) 1170px,
2000px"
src="{{img_url feature_image size="xl"}}"
alt="{{title}}"
/>
@@ -52,29 +110,24 @@ into the {body} of the default.hbs template --}}
</section>

{{!-- Email subscribe form at the bottom of the page --}}
{{#if @labs.subscribers}}
<section class="subscribe-form">
<h3 class="subscribe-form-title">Subscribe to {{@site.title}}</h3>
<p>Get the latest posts delivered right to your inbox</p>
{{subscribe_form placeholder="youremail@example.com"}}
</section>
{{#if @labs.members}}
{{> subscribe-form}}
{{/if}}

<footer class="post-full-footer">

{{!-- 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}}

</footer>
<section class="post-full-comments">
<script data-isso="https://isso.angristan.xyz/"
data-isso-gravatar="true"
data-isso-avatar="false"
data-isso-reply-notifications="true"
data-isso-vote="false"
data-isso-require-author="true"
data-isso-lang="{{@site.lang}}"
src="https://isso.angristan.xyz/js/embed.min.js"></script>
<section id="isso-thread"></section>
</section>

<<<<<<< HEAD
{{!-- Isso (hardcoded) --}}
<<<<<<< HEAD
<script data-isso="https://isso.geber.ga/" src="https://isso.geber.ga/js/embed.min.js"></script>
@@ -83,6 +136,8 @@ into the {body} of the default.hbs template --}}
src="https://isso.angristan.xyz/js/embed.min.js"></script>
>>>>>>> upstream/master
<section id="isso-thread"></section>
=======
>>>>>>> upstream/master

</article>
</div>
@@ -94,30 +149,28 @@ into the {body} of the default.hbs template --}}
{{#if primary_tag}}
{{#get "posts" filter="tags:{{primary_tag.slug}}+id:-{{comment_id}}" limit="3" as |related_posts|}}
{{#if related_posts}}
<article class="read-next-card"
{{#if ../primary_tag.feature_image}}
style="background-image: url({{img_url ../primary_tag.feature_image size="m"}})"
{{else}}
{{#if @site.cover_image}}
style="background-image: url({{img_url @site.cover_image size="m"}})"{{/if}}
{{/if}}
>
<article class="read-next-card">
<header class="read-next-card-header">
<small class="read-next-card-header-sitetitle">&mdash; {{@site.title}} &mdash;</small>
{{#../primary_tag}}
<h3 class="read-next-card-header-title"><a href="{{url}}">{{name}}</a></h3>
<h3><span>More in</span> <a href="{{url}}">{{name}}</a></h3>
{{/../primary_tag}}
</header>
<div class="read-next-divider">{{> "icons/infinity"}}</div>
<div class="read-next-card-content">
<ul>
{{#foreach related_posts}}
<li><a href="{{url}}">{{title}}</a></li>
<li>
<h4><a href="{{url}}">{{title}}</a></h4>
<div class="read-next-card-meta">
<p><time datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time> –
{{reading_time}}</p>
</div>
</li>
{{/foreach}}
</ul>
</div>
<footer class="read-next-card-footer">
<a href="{{#../primary_tag}}{{url}}{{/../primary_tag}}">{{plural meta.pagination.total empty='No posts' singular='% post' plural='See all % posts'}} →</a>
<a href="{{#../primary_tag}}{{url}}{{/../primary_tag}}">{{plural meta.pagination.total empty='No posts' singular='% post' plural='See all % posts'}}
→</a>
</footer>
</article>
{{/if}}
@@ -133,80 +186,46 @@ into the {body} of the default.hbs template --}}
{{#prev_post}}
{{> "post-card"}}
{{/prev_post}}

</div>
</div>
</aside>

{{!-- Floating header which appears on-scroll, included from includes/floating-header.hbs --}}
{{> floating-header}}

{{/post}}

{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>

// NOTE: Scroll performance is poor in Safari
// - this appears to be due to the events firing much more slowly in Safari.
// Dropping the scroll event and using only a raf loop results in smoother
// scrolling but continuous processing even when not scrolling
$(document).ready(function () {
// Start fitVids
var $postContent = $(".post-full-content");
$postContent.fitVids();
// End fitVids

var progressBar = document.querySelector('#reading-progress');
var header = document.querySelector('.floating-header');
var title = document.querySelector('.post-full-title');

var lastScrollY = window.scrollY;
var lastWindowHeight = window.innerHeight;
var lastDocumentHeight = $(document).height();
var ticking = false;

function onScroll() {
lastScrollY = window.scrollY;
requestTick();
}

function onResize() {
lastWindowHeight = window.innerHeight;
lastDocumentHeight = $(document).height();
requestTick();
}

function requestTick() {
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}

function update() {
var trigger = title.getBoundingClientRect().top + window.scrollY;
var triggerOffset = title.offsetHeight + 35;
var progressMax = lastDocumentHeight - lastWindowHeight;

// show/hide floating header
if (lastScrollY >= trigger + triggerOffset) {
header.classList.add('floating-active');
} else {
header.classList.remove('floating-active');
}

progressBar.setAttribute('max', progressMax);
progressBar.setAttribute('value', lastScrollY);

ticking = false;
}

window.addEventListener('scroll', onScroll, {passive: true});
window.addEventListener('resize', onResize, false);

update();

});
$(document).ready(function () {
// FitVids - start
var $postContent = $(".post-full-content");
$postContent.fitVids();
// FitVids - end

// Replace nav with title on scroll - start
Casper.stickyNavTitle({
navSelector: '.site-nav-main',
titleSelector: '.post-full-title',
activeClass: 'nav-post-title-active'
});
// Replace nav with title on scroll - end

// Hover on avatar
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}}

+ 0
- 1
renovate.json View File

@@ -2,7 +2,6 @@
"extends": [
"@tryghost:theme"
],
"travis": { "enabled": true },
"node": {
"supportPolicy": ["lts_latest"]
}


+ 7
- 7
tag.hbs View File

@@ -2,16 +2,16 @@
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}

{{#tag}}
{{> header background=feature_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
<div class="inner">
{{> "site-nav"}}
<div class="site-header-content">
<header class="site-archive-header">
{{> site-header}}
{{> header-background background=feature_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner site-header-content">
<h1 class="site-title">{{name}}</h1>
<h2 class="site-description">
{{#if description}}
{{description}}
{{description}}
{{else}}
A collection of {{plural ../pagination.total empty='posts' singular='% post' plural='% posts'}}
A collection of {{plural ../pagination.total empty='posts' singular='% post' plural='% posts'}}
{{/if}}
</h2>
</div>
@@ -21,7 +21,7 @@

{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner">
<div class="inner posts">
<div class="post-feed">
{{#foreach posts}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}


+ 992
- 631
yarn.lock
File diff suppressed because it is too large
View File


Loading…
Cancel
Save