mirror of
https://github.com/GenZmeY/casper-i18n.git
synced 2025-07-13 09:16:06 +00:00
Compare commits
64 Commits
Author | SHA1 | Date | |
---|---|---|---|
21d097d530 | |||
ec296edfa0 | |||
ff43de1c63 | |||
0b17a6ac06 | |||
64fdc798d9 | |||
88552e5d18 | |||
93c4ea58ed | |||
87abdc2c31 | |||
dc05ff2f49 | |||
50c53f4263 | |||
2a5aac2719 | |||
b4d0219d4e | |||
85fed4f083 | |||
aac62daaca | |||
fef2307d6d | |||
de8b83738e | |||
4a2e9c9b20 | |||
070bed3f40 | |||
7f8990c0d8 | |||
23bd9cc1d5 | |||
8e5c1b22dd | |||
c4fb156508 | |||
91ffa335de | |||
0d8f4471d9 | |||
4464d5809b | |||
37c0f22b09 | |||
7706045616 | |||
51b93e389c | |||
b1ce464ea3 | |||
8729dafcf5 | |||
406ef78109 | |||
2bf64cbffc | |||
a212518827 | |||
2da714ef2e | |||
66def0d7c0 | |||
6640701aeb | |||
7fec21f7d9 | |||
018423738e | |||
371ad586d3 | |||
06c8020c16 | |||
3a40332515 | |||
56c9795306 | |||
dd19a0a65b | |||
3b3a091069 | |||
ff189b7c08 | |||
5bbaa68863 | |||
10672c642e | |||
3e7a85a82e | |||
8fa0aa1b64 | |||
18018d9edf | |||
e0faae69ed | |||
bf89e8e5ab | |||
c8c63d170c | |||
40ae0e97f9 | |||
6541544026 | |||
d92b90db96 | |||
9ababa2886 | |||
047c7c0c9c | |||
273e987240 | |||
0171b3e05b | |||
72a9416197 | |||
f57f9ebc99 | |||
b2322157d5 | |||
3b8f3f1eac |
4
.gitignore
vendored
4
.gitignore
vendored
@ -22,3 +22,7 @@ projectFilesBackup
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
dist/
|
dist/
|
||||||
|
|
||||||
|
config.json
|
||||||
|
changelog.md
|
||||||
|
changelog.md.bk
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
|
dist: xenial
|
||||||
language: node_js
|
language: node_js
|
||||||
sudo: false
|
|
||||||
node_js:
|
node_js:
|
||||||
- "8"
|
- 10
|
||||||
|
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
# Don't run builds for renovate PRs
|
||||||
|
if: NOT head_branch =~ ^renovate
|
||||||
|
|
||||||
|
|
||||||
|
9
SECURITY.md
Normal file
9
SECURITY.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Reporting Security Vulnerabilities
|
||||||
|
|
||||||
|
Potential security vulnerabilities can be reported directly us at `security@ghost.org`. The Ghost Security Team communicates privately and works in a secured, isolated repository for tracking, testing, and resolving security-related issues.
|
||||||
|
|
||||||
|
The full, up-to-date details of our security policy and procedure can always be found in our documentation:
|
||||||
|
|
||||||
|
https://docs.ghost.org/security/
|
||||||
|
|
||||||
|
Please refer to this before emailing us. Thanks for helping make Ghost safe for everyone 🙏.
|
@ -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}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{-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}
|
||||||
/*# sourceMappingURL=global.css.map */
|
/*# sourceMappingURL=global.css.map */
|
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
{"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"],"sourceRoot":"/source/"}
|
{"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"]}
|
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
@ -142,8 +142,8 @@ body {
|
|||||||
background: linear-gradient(rgba(0,0,0,0.1),rgba(0,0,0,0));
|
background: linear-gradient(rgba(0,0,0,0.1),rgba(0,0,0,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
.site-header.no-cover:before,
|
.site-header.no-image:before,
|
||||||
.site-header.no-cover:after {
|
.site-header.no-image:after {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1887,7 +1887,7 @@ Usage (In Ghost editor):
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
min-width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kg-embed-card .fluid-width-video-wrapper {
|
.kg-embed-card .fluid-width-video-wrapper {
|
||||||
@ -1936,6 +1936,15 @@ Usage (In Ghost editor):
|
|||||||
margin: -2.25em 0 3em;
|
margin: -2.25em 0 3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* keep existing <pre> styles for code cards with captions */
|
||||||
|
.kg-code-card {
|
||||||
|
min-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kg-code-card pre {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* 8. Author Template
|
/* 8. Author Template
|
||||||
/* ---------------------------------------------------------- */
|
/* ---------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
{{!-- Everything inside the #author tags pulls data from the author --}}
|
{{!-- Everything inside the #author tags pulls data from the author --}}
|
||||||
|
|
||||||
|
|
||||||
{{> header background=feature_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
|
{{> header background=cover_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
{{> "site-nav"}}
|
{{> "site-nav"}}
|
||||||
<div class="site-header-content">
|
<div class="site-header-content">
|
||||||
|
6
config.example.json
Normal file
6
config.example.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"github": {
|
||||||
|
"username": "<username>",
|
||||||
|
"token": "<gh-personal-access-token>"
|
||||||
|
}
|
||||||
|
}
|
16
default.hbs
16
default.hbs
@ -1,5 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="{{lang}}">
|
<html lang="{{@site.lang}}">
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
{{!-- Document Settings --}}
|
{{!-- Document Settings --}}
|
||||||
@ -28,11 +28,11 @@
|
|||||||
{{!-- The footer at the very bottom of the screen --}}
|
{{!-- The footer at the very bottom of the screen --}}
|
||||||
<footer class="site-footer outer">
|
<footer class="site-footer outer">
|
||||||
<div class="site-footer-content inner">
|
<div class="site-footer-content inner">
|
||||||
<section class="copyright"><a href="{{@blog.url}}">{{@blog.title}}</a> © {{date format="YYYY"}}</section>
|
<section class="copyright"><a href="{{@site.url}}">{{@site.title}}</a> © {{date format="YYYY"}}</section>
|
||||||
<nav class="site-footer-nav">
|
<nav class="site-footer-nav">
|
||||||
<a href="{{@blog.url}}">Latest Posts</a>
|
<a href="{{@site.url}}">Latest Posts</a>
|
||||||
{{#if @blog.facebook}}<a href="{{facebook_url @blog.facebook}}" target="_blank" rel="noopener">Facebook</a>{{/if}}
|
{{#if @site.facebook}}<a href="{{facebook_url @site.facebook}}" target="_blank" rel="noopener">Facebook</a>{{/if}}
|
||||||
{{#if @blog.twitter}}<a href="{{twitter_url @blog.twitter}}" target="_blank" rel="noopener">Twitter</a>{{/if}}
|
{{#if @site.twitter}}<a href="{{twitter_url @site.twitter}}" target="_blank" rel="noopener">Twitter</a>{{/if}}
|
||||||
<a href="https://ghost.org" target="_blank" rel="noopener">Ghost</a>
|
<a href="https://ghost.org" target="_blank" rel="noopener">Ghost</a>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
@ -45,10 +45,10 @@
|
|||||||
<div id="subscribe" class="subscribe-overlay">
|
<div id="subscribe" class="subscribe-overlay">
|
||||||
<a class="subscribe-overlay-close" href="#"></a>
|
<a class="subscribe-overlay-close" href="#"></a>
|
||||||
<div class="subscribe-overlay-content">
|
<div class="subscribe-overlay-content">
|
||||||
{{#if @blog.logo}}
|
{{#if @site.logo}}
|
||||||
<img class="subscribe-overlay-logo" src="{{@blog.logo}}" alt="{{@blog.title}}" />
|
<img class="subscribe-overlay-logo" src="{{@site.logo}}" alt="{{@site.title}}" />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<h1 class="subscribe-overlay-title">Subscribe to {{@blog.title}}</h1>
|
<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>
|
<p class="subscribe-overlay-description">Stay up to date! Get all the latest & greatest posts delivered straight to your inbox</p>
|
||||||
{{subscribe_form placeholder="youremail@example.com"}}
|
{{subscribe_form placeholder="youremail@example.com"}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,13 +16,13 @@ It's a good idea to keep this template as minimal as possible in terms of both f
|
|||||||
<body class="error-template">
|
<body class="error-template">
|
||||||
<div class="site-wrapper">
|
<div class="site-wrapper">
|
||||||
|
|
||||||
<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-cover{{/if}}">
|
<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-image{{/if}}">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<nav class="site-nav-center">
|
<nav class="site-nav-center">
|
||||||
{{#if @blog.logo}}
|
{{#if @site.logo}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}"><img src="{{img_url @blog.logo size="xs"}}" alt="{{@blog.title}}" /></a>
|
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{img_url @site.logo size="xs"}}" alt="{{@site.title}}" /></a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}">{{@blog.title}}</a>
|
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
@ -34,7 +34,7 @@ It's a good idea to keep this template as minimal as possible in terms of both f
|
|||||||
<section class="error-message">
|
<section class="error-message">
|
||||||
<h1 class="error-code">{{code}}</h1>
|
<h1 class="error-code">{{code}}</h1>
|
||||||
<p class="error-description">{{message}}</p>
|
<p class="error-description">{{message}}</p>
|
||||||
<a class="error-link" href="{{@blog.url}}">Go to the front page →</a>
|
<a class="error-link" href="{{@site.url}}">Go to the front page →</a>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
10
error.hbs
10
error.hbs
@ -17,13 +17,13 @@ You'll notice that we *don't* use any JavsScript, or ghost_head / ghost_foot in
|
|||||||
<body class="error-template">
|
<body class="error-template">
|
||||||
<div class="site-wrapper">
|
<div class="site-wrapper">
|
||||||
|
|
||||||
<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-cover{{/if}}">
|
<header class="site-header outer {{#if feature_image}}" style="background-image: url({{feature_image}}){{else}}no-image{{/if}}">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<nav class="site-nav-center">
|
<nav class="site-nav-center">
|
||||||
{{#if @blog.logo}}
|
{{#if @site.logo}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}"><img src="{{img_url @blog.logo size="xs"}}" alt="{{@blog.title}}" /></a>
|
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{img_url @site.logo size="xs"}}" alt="{{@site.title}}" /></a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}">{{@blog.title}}</a>
|
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
@ -35,7 +35,7 @@ You'll notice that we *don't* use any JavsScript, or ghost_head / ghost_foot in
|
|||||||
<section class="error-message">
|
<section class="error-message">
|
||||||
<h1 class="error-code">{{code}}</h1>
|
<h1 class="error-code">{{code}}</h1>
|
||||||
<p class="error-description">{{message}}</p>
|
<p class="error-description">{{message}}</p>
|
||||||
<a class="error-link" href="{{@blog.url}}">Go to the front page →</a>
|
<a class="error-link" href="{{@site.url}}">Go to the front page →</a>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{{#if errorDetails}}
|
{{#if errorDetails}}
|
||||||
|
248
gulpfile.js
248
gulpfile.js
@ -1,87 +1,207 @@
|
|||||||
var gulp = require('gulp');
|
const {series, watch, src, dest, parallel} = require('gulp');
|
||||||
|
const pump = require('pump');
|
||||||
|
|
||||||
// gulp plugins and utils
|
// gulp plugins and utils
|
||||||
var gutil = require('gulp-util');
|
const livereload = require('gulp-livereload');
|
||||||
var livereload = require('gulp-livereload');
|
const postcss = require('gulp-postcss');
|
||||||
var postcss = require('gulp-postcss');
|
const zip = require('gulp-zip');
|
||||||
var sourcemaps = require('gulp-sourcemaps');
|
const uglify = require('gulp-uglify');
|
||||||
var zip = require('gulp-zip');
|
const beeper = require('beeper');
|
||||||
var uglify = require('gulp-uglify');
|
|
||||||
var filter = require('gulp-filter');
|
|
||||||
|
|
||||||
// postcss plugins
|
// postcss plugins
|
||||||
var autoprefixer = require('autoprefixer');
|
const autoprefixer = require('autoprefixer');
|
||||||
var colorFunction = require('postcss-color-function');
|
const colorFunction = require('postcss-color-function');
|
||||||
var cssnano = require('cssnano');
|
const cssnano = require('cssnano');
|
||||||
var customProperties = require('postcss-custom-properties');
|
const customProperties = require('postcss-custom-properties');
|
||||||
var easyimport = require('postcss-easy-import');
|
const easyimport = require('postcss-easy-import');
|
||||||
|
|
||||||
var swallowError = function swallowError(error) {
|
function serve(done) {
|
||||||
gutil.log(error.toString());
|
livereload.listen();
|
||||||
gutil.beep();
|
done();
|
||||||
this.emit('end');
|
}
|
||||||
|
|
||||||
|
const handleError = (done) => {
|
||||||
|
return function (err) {
|
||||||
|
if (err) {
|
||||||
|
beeper();
|
||||||
|
}
|
||||||
|
return done(err);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var nodemonServerInit = function () {
|
function hbs(done) {
|
||||||
livereload.listen(1234);
|
pump([
|
||||||
};
|
src(['*.hbs', 'partials/**/*.hbs', '!node_modules/**/*.hbs']),
|
||||||
|
livereload()
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
gulp.task('build', ['css', 'js'], function (/* cb */) {
|
function css(done) {
|
||||||
return nodemonServerInit();
|
const processors = [
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('generate', ['css', 'js']);
|
|
||||||
|
|
||||||
gulp.task('css', function () {
|
|
||||||
var processors = [
|
|
||||||
easyimport,
|
easyimport,
|
||||||
customProperties,
|
customProperties({preserve: false}),
|
||||||
colorFunction(),
|
colorFunction(),
|
||||||
autoprefixer({browsers: ['last 2 versions']}),
|
autoprefixer({browsers: ['last 2 versions']}),
|
||||||
cssnano()
|
cssnano()
|
||||||
];
|
];
|
||||||
|
|
||||||
return gulp.src('assets/css/*.css')
|
pump([
|
||||||
.on('error', swallowError)
|
src('assets/css/*.css', {sourcemaps: true}),
|
||||||
.pipe(sourcemaps.init())
|
postcss(processors),
|
||||||
.pipe(postcss(processors))
|
dest('assets/built/', {sourcemaps: '.'}),
|
||||||
.pipe(sourcemaps.write('.'))
|
livereload()
|
||||||
.pipe(gulp.dest('assets/built/'))
|
], handleError(done));
|
||||||
.pipe(livereload());
|
}
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('js', function () {
|
function js(done) {
|
||||||
var jsFilter = filter(['**/*.js'], {restore: true});
|
pump([
|
||||||
|
src('assets/js/*.js', {sourcemaps: true}),
|
||||||
|
uglify(),
|
||||||
|
dest('assets/built/', {sourcemaps: '.'}),
|
||||||
|
livereload()
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
return gulp.src('assets/js/*.js')
|
function zipper(done) {
|
||||||
.on('error', swallowError)
|
const targetDir = 'dist/';
|
||||||
.pipe(sourcemaps.init())
|
const themeName = require('./package.json').name;
|
||||||
.pipe(jsFilter)
|
const filename = themeName + '.zip';
|
||||||
.pipe(uglify())
|
|
||||||
.pipe(jsFilter.restore)
|
|
||||||
.pipe(sourcemaps.write('.'))
|
|
||||||
.pipe(gulp.dest('assets/built/'))
|
|
||||||
.pipe(livereload());
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('watch', function () {
|
pump([
|
||||||
gulp.watch('assets/css/**', ['css']);
|
src([
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('zip', ['css', 'js'], function () {
|
|
||||||
var targetDir = 'dist/';
|
|
||||||
var themeName = require('./package.json').name;
|
|
||||||
var filename = themeName + '.zip';
|
|
||||||
|
|
||||||
return gulp.src([
|
|
||||||
'**',
|
'**',
|
||||||
'!node_modules', '!node_modules/**',
|
'!node_modules', '!node_modules/**',
|
||||||
'!dist', '!dist/**'
|
'!dist', '!dist/**'
|
||||||
])
|
]),
|
||||||
.pipe(zip(filename))
|
zip(filename),
|
||||||
.pipe(gulp.dest(targetDir));
|
dest(targetDir)
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
|
const cssWatcher = () => watch('assets/css/**', css);
|
||||||
|
const hbsWatcher = () => watch(['*.hbs', 'partials/**/*.hbs', '!node_modules/**/*.hbs'], hbs);
|
||||||
|
const watcher = parallel(cssWatcher, hbsWatcher);
|
||||||
|
const build = series(css, js);
|
||||||
|
const dev = series(build, serve, watcher);
|
||||||
|
|
||||||
|
exports.build = build;
|
||||||
|
exports.zip = series(build, zipper);
|
||||||
|
exports.default = dev;
|
||||||
|
|
||||||
|
// release imports
|
||||||
|
const path = require('path');
|
||||||
|
const releaseUtils = require('@tryghost/release-utils');
|
||||||
|
|
||||||
|
let config;
|
||||||
|
try {
|
||||||
|
config = require('./config');
|
||||||
|
} catch (err) {
|
||||||
|
config = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const REPO = 'TryGhost/Casper';
|
||||||
|
const USER_AGENT = 'Casper';
|
||||||
|
const CHANGELOG_PATH = path.join(process.cwd(), '.', 'changelog.md');
|
||||||
|
|
||||||
|
const changelog = ({previousVersion}) => {
|
||||||
|
const changelog = new releaseUtils.Changelog({
|
||||||
|
changelogPath: CHANGELOG_PATH,
|
||||||
|
folder: path.join(process.cwd(), '.')
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('default', ['build'], function () {
|
changelog
|
||||||
gulp.start('watch');
|
.write({
|
||||||
|
githubRepoPath: `https://github.com/${REPO}`,
|
||||||
|
lastVersion: previousVersion
|
||||||
|
})
|
||||||
|
.sort()
|
||||||
|
.clean();
|
||||||
|
};
|
||||||
|
|
||||||
|
const previousRelease = () => {
|
||||||
|
return releaseUtils
|
||||||
|
.releases
|
||||||
|
.get({
|
||||||
|
userAgent: USER_AGENT,
|
||||||
|
uri: `https://api.github.com/repos/${REPO}/releases`
|
||||||
|
})
|
||||||
|
.then((response) => {
|
||||||
|
if (!response || !response.length) {
|
||||||
|
console.log('No releases found. Skipping');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Previous version ${response[0].name}`);
|
||||||
|
return response[0].name;
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* `yarn ship` will trigger `postship` task.
|
||||||
|
*
|
||||||
|
* [optional] For full automation
|
||||||
|
*
|
||||||
|
* `GHOST=2.10.1,2.10.0 yarn ship`
|
||||||
|
* First value: Ships with Ghost
|
||||||
|
* Second value: Compatible with Ghost/GScan
|
||||||
|
*
|
||||||
|
* You can manually run in case the task has thrown an error.
|
||||||
|
*
|
||||||
|
* `npm_package_version=0.5.0 gulp release`
|
||||||
|
*/
|
||||||
|
const release = () => {
|
||||||
|
// @NOTE: https://yarnpkg.com/lang/en/docs/cli/version/
|
||||||
|
const newVersion = process.env.npm_package_version;
|
||||||
|
let shipsWithGhost = '{version}';
|
||||||
|
let compatibleWithGhost = '2.10.0';
|
||||||
|
const ghostEnvValues = process.env.GHOST || null;
|
||||||
|
|
||||||
|
if (ghostEnvValues) {
|
||||||
|
shipsWithGhost = ghostEnvValues.split(',')[0];
|
||||||
|
compatibleWithGhost = ghostEnvValues.split(',')[1];
|
||||||
|
|
||||||
|
if (!compatibleWithGhost) {
|
||||||
|
compatibleWithGhost = '2.10.0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newVersion || newVersion === '') {
|
||||||
|
console.log('Invalid version.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\nDraft release for ${newVersion}.`);
|
||||||
|
|
||||||
|
if (!config || !config.github || !config.github.username || !config.github.token) {
|
||||||
|
console.log('Please copy config.example.json and configure Github token.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return previousRelease()
|
||||||
|
.then((previousVersion) => {
|
||||||
|
changelog({previousVersion});
|
||||||
|
|
||||||
|
return releaseUtils
|
||||||
|
.releases
|
||||||
|
.create({
|
||||||
|
draft: true,
|
||||||
|
preRelease: false,
|
||||||
|
tagName: newVersion,
|
||||||
|
releaseName: newVersion,
|
||||||
|
userAgent: USER_AGENT,
|
||||||
|
uri: `https://api.github.com/repos/${REPO}/releases`,
|
||||||
|
github: {
|
||||||
|
username: config.github.username,
|
||||||
|
token: config.github.token
|
||||||
|
},
|
||||||
|
content: [`**Ships with Ghost ${shipsWithGhost} Compatible with Ghost >= ${compatibleWithGhost}**\n\n`],
|
||||||
|
changelogPath: CHANGELOG_PATH
|
||||||
|
})
|
||||||
|
.then((response) => {
|
||||||
|
console.log(`\nRelease draft generated: ${response.releaseUrl}\n`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.release = release;
|
||||||
|
10
index.hbs
10
index.hbs
@ -2,17 +2,17 @@
|
|||||||
{{!-- The tag above means: insert everything in this file
|
{{!-- The tag above means: insert everything in this file
|
||||||
into the {body} of the default.hbs template --}}
|
into the {body} of the default.hbs template --}}
|
||||||
|
|
||||||
{{> header background=@blog.cover_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
|
{{> header background=@site.cover_image}} {{!--Special header.hbs partial to generate the <header> tag--}}
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<div class="site-header-content">
|
<div class="site-header-content">
|
||||||
<h1 class="site-title">
|
<h1 class="site-title">
|
||||||
{{#if @blog.logo}}
|
{{#if @site.logo}}
|
||||||
<img class="site-logo" src="{{img_url @blog.logo size="s"}}" alt="{{@blog.title}}" />
|
<img class="site-logo" src="{{img_url @site.logo size="l"}}" alt="{{@site.title}}" />
|
||||||
{{else}}
|
{{else}}
|
||||||
{{@blog.title}}
|
{{@site.title}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</h1>
|
</h1>
|
||||||
<h2 class="site-description">{{@blog.description}}</h2>
|
<h2 class="site-description">{{@site.description}}</h2>
|
||||||
</div>
|
</div>
|
||||||
{{> "site-nav"}}
|
{{> "site-nav"}}
|
||||||
</div>
|
</div>
|
||||||
|
40
package.json
40
package.json
@ -2,9 +2,10 @@
|
|||||||
"name": "casper",
|
"name": "casper",
|
||||||
"description": "The default personal blogging theme for Ghost. Beautiful, minimal and responsive.",
|
"description": "The default personal blogging theme for Ghost. Beautiful, minimal and responsive.",
|
||||||
"demo": "https://demo.ghost.io",
|
"demo": "https://demo.ghost.io",
|
||||||
"version": "2.8.1",
|
"version": "2.10.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"ghost": ">=2.0.0"
|
"ghost": ">=2.0.0",
|
||||||
|
"ghost-api": "v2"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"screenshots": {
|
"screenshots": {
|
||||||
@ -14,7 +15,11 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "gulp",
|
"dev": "gulp",
|
||||||
"zip": "gulp zip",
|
"zip": "gulp zip",
|
||||||
"test": "gscan ."
|
"test": "gscan .",
|
||||||
|
"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",
|
||||||
|
"postship": "git fetch && gulp release"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Ghost Foundation",
|
"name": "Ghost Foundation",
|
||||||
@ -40,21 +45,20 @@
|
|||||||
"bugs": "https://github.com/TryGhost/Casper/issues",
|
"bugs": "https://github.com/TryGhost/Casper/issues",
|
||||||
"contributors": "https://github.com/TryGhost/Casper/graphs/contributors",
|
"contributors": "https://github.com/TryGhost/Casper/graphs/contributors",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "6.3.6",
|
"@tryghost/release-utils": "0.3.2",
|
||||||
"cssnano": "3.7.1",
|
"autoprefixer": "9.5.1",
|
||||||
"gscan": "^2.0.0",
|
"beeper": "1.1.1",
|
||||||
"gulp": "3.9.1",
|
"cssnano": "4.1.10",
|
||||||
"gulp-livereload": "3.8.1",
|
"gscan": "2.5.1",
|
||||||
"gulp-postcss": "6.1.1",
|
"gulp": "4.0.1",
|
||||||
"gulp-sourcemaps": "1.6.0",
|
"gulp-livereload": "4.0.1",
|
||||||
"gulp-util": "3.0.7",
|
"gulp-postcss": "8.0.0",
|
||||||
"gulp-watch": "4.3.8",
|
"gulp-uglify": "3.0.2",
|
||||||
"gulp-zip": "4.0.0",
|
"gulp-zip": "4.2.0",
|
||||||
"postcss-color-function": "2.0.1",
|
"postcss-color-function": "4.1.0",
|
||||||
"postcss-custom-properties": "5.0.1",
|
"postcss-custom-properties": "8.0.10",
|
||||||
"postcss-easy-import": "1.0.1",
|
"postcss-easy-import": "3.0.0",
|
||||||
"gulp-filter": "5.1.0",
|
"pump": "3.0.0"
|
||||||
"gulp-uglify": "3.0.1"
|
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"posts_per_page": 25,
|
"posts_per_page": 25,
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<div class="floating-header">
|
<div class="floating-header">
|
||||||
<div class="floating-header-logo">
|
<div class="floating-header-logo">
|
||||||
<a href="{{@blog.url}}">
|
<a href="{{@site.url}}">
|
||||||
{{#if @blog.icon}}
|
{{#if @site.icon}}
|
||||||
<img src="{{img_url @blog.icon size="xxs"}}" alt="{{@blog.title}} icon" />
|
<img src="{{img_url @site.icon size="xxs"}}" alt="{{@site.title}} icon" />
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<span>{{@blog.title}}</span>
|
<span>{{@site.title}}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<span class="floating-header-divider">—</span>
|
<span class="floating-header-divider">—</span>
|
||||||
|
@ -29,6 +29,7 @@ with a `no-image` class so we can style it accordingly.
|
|||||||
url({{img_url background size='xl'}}) 2x
|
url({{img_url background size='xl'}}) 2x
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@media(max-width: 600px) {
|
@media(max-width: 600px) {
|
||||||
.responsive-header-img {
|
.responsive-header-img {
|
||||||
background-image: url({{img_url background size='m'}});
|
background-image: url({{img_url background size='m'}});
|
||||||
@ -41,6 +42,7 @@ with a `no-image` class so we can style it accordingly.
|
|||||||
url({{img_url background size='l'}}) 2x
|
url({{img_url background size='l'}}) 2x
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<header class="site-header outer responsive-header-img">
|
<header class="site-header outer responsive-header-img">
|
||||||
|
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
<nav class="site-nav">
|
<nav class="site-nav">
|
||||||
<div class="site-nav-left">
|
<div class="site-nav-left">
|
||||||
{{^is "home"}}
|
{{^is "home"}}
|
||||||
{{#if @blog.logo}}
|
{{#if @site.logo}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>
|
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{@site.logo}}" alt="{{@site.title}}" /></a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class="site-nav-logo" href="{{@blog.url}}">{{@blog.title}}</a>
|
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/is}}
|
{{/is}}
|
||||||
{{#if @blog.navigation}}
|
{{#if @site.navigation}}
|
||||||
{{navigation}}
|
{{navigation}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="site-nav-right">
|
<div class="site-nav-right">
|
||||||
<div class="social-links">
|
<div class="social-links">
|
||||||
{{#if @blog.facebook}}
|
{{#if @site.facebook}}
|
||||||
<a class="social-link social-link-fb" href="{{facebook_url @blog.facebook}}" title="Facebook" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
|
<a class="social-link social-link-fb" href="{{facebook_url @site.facebook}}" title="Facebook" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if @blog.twitter}}
|
{{#if @site.twitter}}
|
||||||
<a class="social-link social-link-tw" href="{{twitter_url @blog.twitter}}" title="Twitter" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
|
<a class="social-link social-link-tw" href="{{twitter_url @site.twitter}}" title="Twitter" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{#if @labs.subscribers}}
|
{{#if @labs.subscribers}}
|
||||||
<a class="subscribe-button" href="#subscribe">Subscribe</a>
|
<a class="subscribe-button" href="#subscribe">Subscribe</a>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class="rss-button" href="https://feedly.com/i/subscription/feed/{{@blog.url}}/rss/" title="RSS" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
|
<a class="rss-button" href="https://feedly.com/i/subscription/feed/{{@site.url}}/rss/" title="RSS" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
8
post.hbs
8
post.hbs
@ -54,7 +54,7 @@ into the {body} of the default.hbs template --}}
|
|||||||
{{!-- Email subscribe form at the bottom of the page --}}
|
{{!-- Email subscribe form at the bottom of the page --}}
|
||||||
{{#if @labs.subscribers}}
|
{{#if @labs.subscribers}}
|
||||||
<section class="subscribe-form">
|
<section class="subscribe-form">
|
||||||
<h3 class="subscribe-form-title">Subscribe to {{@blog.title}}</h3>
|
<h3 class="subscribe-form-title">Subscribe to {{@site.title}}</h3>
|
||||||
<p>Get the latest posts delivered right to your inbox</p>
|
<p>Get the latest posts delivered right to your inbox</p>
|
||||||
{{subscribe_form placeholder="youremail@example.com"}}
|
{{subscribe_form placeholder="youremail@example.com"}}
|
||||||
</section>
|
</section>
|
||||||
@ -97,12 +97,12 @@ into the {body} of the default.hbs template --}}
|
|||||||
{{#if ../primary_tag.feature_image}}
|
{{#if ../primary_tag.feature_image}}
|
||||||
style="background-image: url({{img_url ../primary_tag.feature_image size="m"}})"
|
style="background-image: url({{img_url ../primary_tag.feature_image size="m"}})"
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if @blog.cover_image}}
|
{{#if @site.cover_image}}
|
||||||
style="background-image: url({{img_url @blog.cover_image size="m"}})"{{/if}}
|
style="background-image: url({{img_url @site.cover_image size="m"}})"{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
>
|
>
|
||||||
<header class="read-next-card-header">
|
<header class="read-next-card-header">
|
||||||
<small class="read-next-card-header-sitetitle">— {{@blog.title}} —</small>
|
<small class="read-next-card-header-sitetitle">— {{@site.title}} —</small>
|
||||||
{{#../primary_tag}}
|
{{#../primary_tag}}
|
||||||
<h3 class="read-next-card-header-title"><a href="{{url}}">{{name}}</a></h3>
|
<h3 class="read-next-card-header-title"><a href="{{url}}">{{name}}</a></h3>
|
||||||
{{/../primary_tag}}
|
{{/../primary_tag}}
|
||||||
|
9
renovate.json
Normal file
9
renovate.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"@tryghost:theme"
|
||||||
|
],
|
||||||
|
"travis": { "enabled": true },
|
||||||
|
"node": {
|
||||||
|
"supportPolicy": ["lts_latest"]
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user