Compare commits
768 Commits
Author | SHA1 | Date | |
---|---|---|---|
0d7b4fe2a6 | |||
ddf213bf70 | |||
e151531988 | |||
cec4ee9021 | |||
351d7acd6c | |||
13fbe85077 | |||
a737f16c9f | |||
037dd8a8e2 | |||
e29691b46e | |||
d9942b8a1b | |||
6c4397a3f9 | |||
cdaa6b3c0b | |||
d147bb158e | |||
01f2b67810 | |||
36e886a668 | |||
bf3617a726 | |||
6d8cc3ae66 | |||
f13641dd7e | |||
46c586644d | |||
87395c500f | |||
331257ea29 | |||
4f1958d3b5 | |||
6b6b6a7e69 | |||
aa270b35a9 | |||
a511bd56f6 | |||
7a790020cb | |||
4c6d33f3df | |||
cf569ac7b3 | |||
276e2c9d01 | |||
4d3319d05c | |||
43688cfa01 | |||
592226b75e | |||
9f9348544e | |||
840b1b9c50 | |||
cc3fca004f | |||
f8b34f9786 | |||
b9f5d591d3 | |||
a60e3e976a | |||
d9c9390e17 | |||
84f201d293 | |||
c7fdfb7479 | |||
d3483498d4 | |||
4ae190c1a6 | |||
22c83f9128 | |||
10fd2f3a1c | |||
b1a10873ff | |||
0e76b5abef | |||
d75ffc78ac | |||
fa76f77006 | |||
dda827ded3 | |||
bdf150658e | |||
2fafe722d1 | |||
0721600075 | |||
a18367200f | |||
294b1e30e5 | |||
aa8ca0794b | |||
ba0b3d08cc | |||
50d5727f77 | |||
23f7c30365 | |||
8ff3c6fcf1 | |||
5c7fb39df9 | |||
4851606d9d | |||
afca9cb27e | |||
b56bec2cb8 | |||
0c4164c5bd | |||
e6326eadf9 | |||
3ed94d68fa | |||
505503a63b | |||
bd3fc7c2af | |||
5e0f765852 | |||
4293dab0a7 | |||
f00918589f | |||
0200889148 | |||
248c122f86 | |||
a007415d89 | |||
31188ce3c0 | |||
e1967f8546 | |||
5259d551f5 | |||
115d1d820c | |||
81e4dfd52d | |||
cc4d828575 | |||
ebb2538215 | |||
3767e3d994 | |||
6d290485dc | |||
7da41d344f | |||
55a90a9252 | |||
b20dceae22 | |||
88ca182a58 | |||
140632b885 | |||
8f2b806673 | |||
4af198a19f | |||
f846ceb7ed | |||
7390c17a26 | |||
55d5345800 | |||
cf30adacce | |||
38426cd9e6 | |||
c7713df88f | |||
e6fdb4bfa3 | |||
657bb8f986 | |||
005211ff8f | |||
e2096ee731 | |||
20ced95885 | |||
2aaf7441af | |||
d687d0f099 | |||
96f69f8c07 | |||
4808700c0f | |||
6459992d9a | |||
b28258d0c8 | |||
f3c0526ea5 | |||
129a578751 | |||
1b3541ef2a | |||
664afdb158 | |||
d386ab090f | |||
c6411dbf41 | |||
7eb472ab81 | |||
ae7b6e1022 | |||
b74032835f | |||
eab9e1ae0f | |||
873566a24c | |||
1ade4c8816 | |||
245969800d | |||
db37f3caa8 | |||
a15e9bda40 | |||
ffcbc42d13 | |||
d373d926fa | |||
8699a22019 | |||
eff8d360ba | |||
3e7ca9cb36 | |||
b5297f16d7 | |||
ccf82ec6c1 | |||
d9d70e7010 | |||
52663e9be7 | |||
d1b1d383f5 | |||
cf50364c6d | |||
22e3f69aed | |||
d1ac1b8c2c | |||
45bc14f08d | |||
e27ea96779 | |||
e51c1aff42 | |||
d00647009c | |||
c75b67cf5d | |||
9ebb26559a | |||
0e78d9ed40 | |||
08b3054ada | |||
f5cb9a73d0 | |||
e27f2190d6 | |||
c205947374 | |||
628a32ba96 | |||
0bf84b2b80 | |||
7a86c6fd92 | |||
cfd767be88 | |||
4461d5e2f8 | |||
9efff7d6fa | |||
358f3d6d35 | |||
4e30aff168 | |||
362a4995a2 | |||
b0dfa11ff0 | |||
508bbf1fb0 | |||
a0cedfe23e | |||
1076078f8b | |||
fe257987ce | |||
83669da41c | |||
be6943780d | |||
1f7cd51245 | |||
082cadf640 | |||
c74be0e346 | |||
5fc101fb2c | |||
6439992db2 | |||
21c6f59a61 | |||
5424c465fb | |||
994a2287a2 | |||
6236067373 | |||
68c6224a92 | |||
838120323a | |||
98f7f53119 | |||
d9f92dfe89 | |||
b811b72333 | |||
6c922fca35 | |||
4c8ccde081 | |||
5672c0b6c8 | |||
f74e9241bb | |||
ff4e4226c0 | |||
9a09ff41c3 | |||
f41761e0ad | |||
11b52ed0cf | |||
c3fa4f6b24 | |||
19d5b6c297 | |||
76f0037467 | |||
37a09189c3 | |||
13458e0d2d | |||
eb007cb1c1 | |||
55f5ba65c6 | |||
5cdcda15ee | |||
18f6d85da5 | |||
1f3418708c | |||
05d0b0c7db | |||
08f480ff78 | |||
56ec2e9a90 | |||
c4f2d74d80 | |||
c378e9a9c9 | |||
db98015d41 | |||
7e9cf5c478 | |||
0f9a3c79c1 | |||
8ff91f709e | |||
feb2de765c | |||
9b45ff3418 | |||
827f37255c | |||
ffdf853323 | |||
e4543555fa | |||
67e7291c2b | |||
c880856a32 | |||
b06bcd6534 | |||
49f99d956f | |||
cdb03b65fb | |||
e80f22c2a5 | |||
b6474446f8 | |||
462770968a | |||
017a2829b6 | |||
198f12b725 | |||
48260130fe | |||
8b392ec6dd | |||
4ea98431b3 | |||
6bc9b021b5 | |||
c1006ec649 | |||
cad48b230c | |||
b3f6b8a82c | |||
2d940d8f59 | |||
b7ea0cbff7 | |||
a8150f7c30 | |||
b5b1ea001e | |||
370b9ec74e | |||
3cbe9b2c97 | |||
d652252699 | |||
6107a411a1 | |||
8feb988375 | |||
e898d56f0b | |||
b8319c5bb9 | |||
ceaa887371 | |||
c63a07e8df | |||
0e0898d7e9 | |||
2234b14bbd | |||
046d53e885 | |||
e49664eca4 | |||
21bdffbd8a | |||
ea33b00c0a | |||
17c9fe6c55 | |||
5adeaa458b | |||
5013c91f1a | |||
f43f6c567f | |||
69feef6c46 | |||
4708987c39 | |||
a4eb58f8e7 | |||
5ad96f7c12 | |||
6ac55407b3 | |||
b0e21fe0f7 | |||
85cd131cf1 | |||
53ff37cf10 | |||
816e1f608e | |||
0d49da97a2 | |||
e34e2e3e0a | |||
18ceb822dd | |||
08c1e38ae1 | |||
d9e9e097cd | |||
96aac80081 | |||
3fa7f25147 | |||
b16671d8a7 | |||
3d6a3dc68f | |||
48d06196c2 | |||
573e384381 | |||
5f127c395b | |||
3cc9cb0988 | |||
ca36c4fe91 | |||
260d5ec4e6 | |||
410ec1a9d5 | |||
e72f4236be | |||
c0d5a3d999 | |||
b927cf62ed | |||
91ced578c5 | |||
87772282c8 | |||
bcfeb9be74 | |||
5b310a00f4 | |||
a6a5d1eba1 | |||
fa8cc4cf2e | |||
3a5fda7009 | |||
4f2fe7eb43 | |||
be0600a603 | |||
e4faa3141a | |||
a78784decf | |||
a516282b73 | |||
ea6942a7fe | |||
b5c2869ff6 | |||
b7faac9eda | |||
372dca859b | |||
30cd8d97e0 | |||
0584a58c6c | |||
2231274b07 | |||
715f95d209 | |||
1e0e813931 | |||
2c356f1cc4 | |||
140666ee44 | |||
70f71e9839 | |||
bd1dbd51c7 | |||
f590fb029a | |||
7617c7baf2 | |||
b5d0589222 | |||
e95293cc22 | |||
2d27e13f14 | |||
0d1cf89cc0 | |||
a43c6b3cbc | |||
1365eab4ae | |||
cf24eccdf2 | |||
f12ce05454 | |||
44e33120cb | |||
6c7cf02111 | |||
609507d22d | |||
fd89c6575c | |||
c680f4efcd | |||
b59893091c | |||
5fd447b815 | |||
9ac38156da | |||
f9d9b1fab5 | |||
1ea3ad649b | |||
fc8cf0b2f4 | |||
676b73172f | |||
2505089a41 | |||
957d3049aa | |||
8f81522907 | |||
28d63e1cd2 | |||
b374b88126 | |||
0449bf5537 | |||
e985805958 | |||
c1fcece376 | |||
306f7b2d9b | |||
7e3e891338 | |||
69f5108a39 | |||
44fa55be19 | |||
df4bfbffb2 | |||
bcfbc21b8e | |||
41330614cd | |||
069280eea2 | |||
52f763859a | |||
e3fd4d707e | |||
854880747d | |||
6b9df8bb51 | |||
1360ed83bd | |||
adfb47009e | |||
4752bf03c9 | |||
a17155a3b6 | |||
a1bf3f3823 | |||
d063fb2806 | |||
4a6dfa8e04 | |||
e4a5e96d06 | |||
35e68f6d3f | |||
f631f874f7 | |||
74d787831e | |||
739deb3e4d | |||
bc3e072d31 | |||
838c4ecca2 | |||
7a61bf55ed | |||
9baffdd03f | |||
30ccbca28a | |||
def78b102b | |||
dfb6444b25 | |||
4c298b97cf | |||
6c8a048bad | |||
fd02a6c722 | |||
493da38cff | |||
19cf4adb74 | |||
daa69cbd31 | |||
267fd00802 | |||
8fefeca41b | |||
45f5c83118 | |||
c3cb51711a | |||
3d189760a8 | |||
8087366537 | |||
7748f8c781 | |||
8783bd4ee8 | |||
006b056adc | |||
fe690d4048 | |||
c3c0374ca6 | |||
0429f85774 | |||
1f8df12a7c | |||
75e68ce5b7 | |||
fa15a48192 | |||
0c36dc5235 | |||
aa3c83ec35 | |||
38481aac9a | |||
0052c2ddc3 | |||
9d12bc32f0 | |||
cb674ab56c | |||
c86ee63b86 | |||
b92f18e55a | |||
827940c836 | |||
db0af7f759 | |||
af87b9b3b0 | |||
ec03acff02 | |||
fa48995326 | |||
6350790798 | |||
ab521da23a | |||
91185016eb | |||
0af8d2d8bc | |||
f50f663ef7 | |||
a467e31457 | |||
807018ca97 | |||
ce9918de2f | |||
df2d20caab | |||
c6cb667fea | |||
a1d9eae840 | |||
59eefa3659 | |||
78bde5f3dc | |||
e637d809f6 | |||
e4793cc743 | |||
cd7016493e | |||
7421cff4fe | |||
c465d95e14 | |||
c1c6fed941 | |||
5664f81564 | |||
8838afe43f | |||
f53b6b3435 | |||
be77dad00e | |||
408cf0cc1e | |||
cfdc8a3b85 | |||
e6a24de5c4 | |||
6d0a3a8899 | |||
b54c3debd4 | |||
0e0589cb04 | |||
5bfc82bf0c | |||
d3ffc71b34 | |||
871fc4075f | |||
6f37e5a148 | |||
adc055495c | |||
2ed7ea8f13 | |||
4ddbaae803 | |||
7e0e45c643 | |||
e0771bfc7e | |||
8f1a15296a | |||
2bd82a30e8 | |||
feb7f3aac6 | |||
eed15fd9a5 | |||
201b1924cf | |||
387a2aa3f0 | |||
690ca22fb7 | |||
31d43860ac | |||
14f7cc4e31 | |||
7646f90556 | |||
8e17cdc1fb | |||
2da322d93b | |||
709c7196b9 | |||
c97b847002 | |||
7d37adb3cd | |||
4fe7010f4e | |||
6bf34a5a70 | |||
c9a54e25ab | |||
3281f75945 | |||
c8abe3a7c4 | |||
150b698b1c | |||
9ff3aa7858 | |||
8886056719 | |||
93628dc7f0 | |||
702b2cbf1f | |||
e5969f93da | |||
9e29e145fc | |||
74ae3d5140 | |||
1ec7a12d43 | |||
9ec0f08a48 | |||
b09e846fd2 | |||
92d9174b24 | |||
c27fc17844 | |||
d9cf22a0f7 | |||
7c87383bc6 | |||
09d701c4bc | |||
aec67d8b5f | |||
f55e2b0266 | |||
fee94ba192 | |||
bf4b8d7f15 | |||
98543dd068 | |||
5063d40a32 | |||
7c8cba7fab | |||
e253954051 | |||
4c7fced3aa | |||
fb9f0e6804 | |||
88e3db9d3b | |||
7733f0db63 | |||
1c5db5c027 | |||
e4afcc233f | |||
a66beb4e10 | |||
c82e1cb035 | |||
065849105b | |||
a1fc6090d2 | |||
68b0270ed5 | |||
6d56e5866e | |||
8993409296 | |||
307c334cd5 | |||
17ba4add5c | |||
e37e444e9a | |||
57cee0c680 | |||
ff51925567 | |||
3e910e954e | |||
50437fd72e | |||
1915a91c5b | |||
b51dd8ce22 | |||
7ad20d1325 | |||
978ffe0eb6 | |||
53ad2d8096 | |||
f7e4cabc58 | |||
392626f3b2 | |||
8bb4508ff2 | |||
e5e62f1eed | |||
2eaeba8ba8 | |||
728392e51e | |||
7161dca4ca | |||
215d837848 | |||
d2ec8d1c31 | |||
4a4f66a710 | |||
8729af090f | |||
c40627256a | |||
32d3538f6b | |||
f5b2a2f209 | |||
29426e1483 | |||
f5bba69235 | |||
788ee59fd4 | |||
a6ce913546 | |||
8ad3b82f58 | |||
c66d64dd79 | |||
095d7f85c6 | |||
812b9ba657 | |||
56d1ff2337 | |||
dc74e24d0c | |||
e4e97aefa9 | |||
df7c2321c6 | |||
6886798b60 | |||
42c26629bf | |||
89a12765be | |||
fa54c4713f | |||
0494b48ad0 | |||
e6cb772b2d | |||
2dad5af417 | |||
43b8f3d11a | |||
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 | |||
7d080d564f | |||
3388283f02 | |||
475c015fa2 | |||
79ebbd50a3 | |||
a22dda9694 | |||
3c2347c7f9 | |||
f695d69aeb | |||
d53b25bf5d | |||
bef56a2294 | |||
5ad6e1ed1f | |||
36971db512 | |||
bfcab7172f | |||
fce92d6cf1 | |||
d48178fde9 | |||
6f4fe840b3 | |||
8a9efb5ef1 | |||
04854967a8 | |||
fa18115aa6 | |||
ae192a9fff | |||
78993720fd | |||
676e17bd13 | |||
67e595741c | |||
7a88c88ea2 | |||
a0e42e0599 | |||
dc3bb316c7 | |||
7380ed0291 | |||
ecaf3d921f | |||
89ea6c5872 | |||
9d803067a4 | |||
0ea375643b | |||
f31957bd0d | |||
36841d4624 | |||
d41fcbbc8a | |||
5d318225f5 | |||
9b56779ca6 | |||
1bf2cdb52a | |||
f67caaba5c | |||
25d1e368d6 | |||
5c6cce1519 | |||
019842155a | |||
1860a8305b | |||
6417b4cf2a | |||
1c61bc5f16 | |||
7a7f04c716 | |||
fd56128f9b | |||
cd3b470c18 | |||
f3b44a7411 | |||
b83917060f | |||
4aaedf69d2 | |||
03ac0d91b8 | |||
b55d5e2b32 | |||
4fe2eac739 | |||
6e3399366d | |||
98e9c12018 | |||
986a954f33 | |||
636882bce4 | |||
79e113226c | |||
8e865b797b | |||
a655b59e69 | |||
b078dcb86e | |||
d5002f2c51 | |||
41bcbb7157 | |||
452776939c | |||
57c31ddacb | |||
21088b1d38 | |||
16f283e675 | |||
942054ba0d | |||
782aba3991 | |||
9df85fbbe5 | |||
1e10549ee2 | |||
a6eb6848de | |||
6788302f62 | |||
67e55abfed | |||
bfaae0f7ba | |||
edfafffd32 | |||
7798bf115f | |||
9395846fdf | |||
99fad4cbc4 | |||
990f712209 | |||
4ff4b4c7f8 | |||
de05d90fe9 | |||
978e54403c | |||
73bd9c630e | |||
9597a28320 | |||
461639886e | |||
7592ad182b | |||
97a522a037 | |||
25f12d760b | |||
4f78d99112 | |||
f5b7b45f2e | |||
d34ff1d32b | |||
73a1ab52da | |||
5ec77dfb31 | |||
269d2b5787 | |||
d1d0bca2d8 | |||
d92dda3523 | |||
ca325285bf | |||
aee9f69bb0 | |||
a7d5c885bd | |||
9bc5c92628 | |||
0f3651c23f | |||
d739bb52a4 | |||
8d17e9a452 | |||
e4e6bb9c5a | |||
d2375a3917 | |||
577b92811c | |||
2f385ba5f1 | |||
b024b544e4 | |||
9caeb2a2e7 | |||
12d139aa7d | |||
690e1bad1f | |||
c63804006d | |||
65d0104224 | |||
ba10cb1516 | |||
d7ca6fd2f6 | |||
10f11bb14f | |||
7d4f93bf23 | |||
11f61782ad | |||
fd108b1b40 | |||
33005666ca | |||
1767ca59b8 | |||
5cafa756ef | |||
08e5cbe021 | |||
615d8a9001 | |||
f08f07fd7e | |||
2565c16916 | |||
4b66223bb3 | |||
35e91ecee9 | |||
2b2d6e6d14 | |||
cd4e0e03f5 | |||
3993cbdcfa | |||
6c5d6af6d0 | |||
9aa6ff1716 | |||
551aeb3ca5 | |||
8690450eae | |||
2fdfc5285d | |||
0f9410fb3d | |||
d3a9af0666 | |||
96ffcdceed | |||
aa80667232 | |||
0914d43a86 | |||
d6d9711b9d | |||
2ca409032a | |||
902b6dcdbc | |||
6f441794e4 | |||
c97defd40a | |||
397a096949 | |||
4b6905f175 | |||
535ead65e7 | |||
b7a788f973 | |||
1214676bd5 | |||
0791b0fdb7 | |||
67f27e2add | |||
9f7c0e30e2 | |||
eb84edae6d | |||
834d14b204 | |||
19a8b85aac | |||
eeb8b248ca | |||
7f4d581caf | |||
655c35b53c | |||
55f35da8e9 | |||
d55446f2ca | |||
938eaaf7a6 | |||
bc9e5a0b2e | |||
ad9cb81a06 | |||
eda0ec4db2 |
9
.gitignore
vendored
@ -13,9 +13,16 @@ results
|
|||||||
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
node_modules
|
node_modules
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
.idea/*
|
.idea/*
|
||||||
*.iml
|
*.iml
|
||||||
projectFilesBackup
|
projectFilesBackup
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
dist/
|
||||||
|
|
||||||
|
config.json
|
||||||
|
changelog.md
|
||||||
|
changelog.md.bk
|
||||||
|
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2013-2017 Ghost Foundation
|
Copyright (c) 2013-2025 Ghost Foundation
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
67
README.md
@ -1,10 +1,69 @@
|
|||||||
# Casper
|
# Casper
|
||||||
|
|
||||||
The default theme for [Ghost](http://github.com/tryghost/ghost/).
|
The default theme for [Ghost](http://github.com/tryghost/ghost/). This is the latest development version of Casper! If you're just looking to download the latest release, head over to the [releases](https://github.com/TryGhost/Casper/releases) page.
|
||||||
|
|
||||||
To download, visit the [releases](https://github.com/TryGhost/Casper/releases) page.
|
|
||||||
|
|
||||||
## Copyright & License
|

|
||||||
|
|
||||||
Copyright (c) 2013-2017 Ghost Foundation - Released under the [MIT license](LICENSE).
|
|
||||||
|
|
||||||
|
# First time using a Ghost theme?
|
||||||
|
|
||||||
|
Ghost uses a simple templating language called [Handlebars](http://handlebarsjs.com/) for its themes.
|
||||||
|
|
||||||
|
This theme has lots of code comments to help explain what's going on just by reading the code. Once you feel comfortable with how everything works, we also have full [theme API documentation](https://ghost.org/docs/themes/) which explains every possible Handlebars helper and template.
|
||||||
|
|
||||||
|
**The main files are:**
|
||||||
|
|
||||||
|
- `default.hbs` - The parent template file, which includes your global header/footer
|
||||||
|
- `index.hbs` - The main template to generate a list of posts, usually the home page
|
||||||
|
- `post.hbs` - The template used to render individual posts
|
||||||
|
- `page.hbs` - Used for individual pages
|
||||||
|
- `tag.hbs` - Used for tag archives, eg. "all posts tagged with `news`"
|
||||||
|
- `author.hbs` - Used for author archives, eg. "all posts written by Jamie"
|
||||||
|
|
||||||
|
One neat trick is that you can also create custom one-off templates by adding the slug of a page to a template file. For example:
|
||||||
|
|
||||||
|
- `page-about.hbs` - Custom template for an `/about/` page
|
||||||
|
- `tag-news.hbs` - Custom template for `/tag/news/` archive
|
||||||
|
- `author-ali.hbs` - Custom template for `/author/ali/` archive
|
||||||
|
|
||||||
|
|
||||||
|
# Development
|
||||||
|
|
||||||
|
Casper styles are compiled using Gulp/PostCSS to polyfill future CSS spec. You'll need [Node](https://nodejs.org/), [Yarn](https://yarnpkg.com/) and [Gulp](https://gulpjs.com) installed globally. After that, from the theme's root directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# install dependencies
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# run development server
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can edit `/assets/css/` files, which will be compiled to `/assets/built/` automatically.
|
||||||
|
|
||||||
|
The `zip` Gulp task packages the theme files into `dist/<theme-name>.zip`, which you can then upload to your site.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# create .zip file
|
||||||
|
yarn zip
|
||||||
|
```
|
||||||
|
|
||||||
|
# PostCSS Features Used
|
||||||
|
|
||||||
|
- Autoprefixer - Don't worry about writing browser prefixes of any kind, it's all done automatically with support for the latest 2 major versions of every browser.
|
||||||
|
- [Color Mod](https://github.com/jonathantneal/postcss-color-mod-function)
|
||||||
|
|
||||||
|
|
||||||
|
# SVG Icons
|
||||||
|
|
||||||
|
Casper uses inline SVG icons, included via Handlebars partials. You can find all icons inside `/partials/icons`. To use an icon just include the name of the relevant file, eg. To include the SVG icon in `/partials/icons/rss.hbs` - use `{{> "icons/rss"}}`.
|
||||||
|
|
||||||
|
You can add your own SVG icons in the same manner.
|
||||||
|
|
||||||
|
|
||||||
|
# Copyright & License
|
||||||
|
|
||||||
|
Copyright (c) 2013-2025 Ghost Foundation - Released under the [MIT license](LICENSE).
|
||||||
|
2
assets/built/casper.js
Normal file
1
assets/built/casper.js.map
Normal file
2
assets/built/global.css
Normal file
@ -0,0 +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{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{display:block;height:auto;max-width:100%}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;font-family:sans-serif}*,: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{font-size:2em;margin:.67em 0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;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}kbd{background:#f6f8fa;border:1px solid rgba(124,139,154,.25);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(124,139,154,.25);font-family:var(--font-mono);font-size:1.5rem;padding:3px 5px}@media (max-width:600px){kbd{font-size:1.3rem}}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{border:none;overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding: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]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:62.5%}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on;background:#fff;color:var(--color-darkgrey);font-family:var(--gh-font-body,var(--font-sans));font-size:1.6rem;font-style:normal;font-weight:400;letter-spacing:0;line-height:1.6em}::-moz-selection{background:#daf2fd;text-shadow:none}::selection{background:#daf2fd;text-shadow:none}hr{border:0;border-top:1px solid #f0f0f0;display:block;height:1px;margin:2.5em 0 3.5em;padding:0;position:relative;width:100%}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}::not(.gh-content) blockquote,::not(.gh-content) dl,::not(.gh-content) ol,::not(.gh-content) p,::not(.gh-content) 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}ol,ul{max-width:100%}li{line-height:1.6em;padding-left:.3em}li+li{margin-top:.5em}dt{color:#daf2fd;float:left;font-weight:500;margin:0 20px 0 0;text-align:right;width:120px}dd{margin:0 0 5px;text-align:left}blockquote{border-left:#daf2fd;margin:1.5em 0;padding:0 1.6em}blockquote small{display:inline-block;font-size:.9em;margin:.8em 0 .8em 1.5em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#15171a;text-decoration:none}h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;font-family:var(--gh-font-heading,var(--font-sans));font-weight:600;letter-spacing:-.01em;line-height:1.15;margin-top:0}h1{font-size:4.8rem;font-weight:700;letter-spacing:-.015em;margin:0 0 .5em}@media (max-width:600px){h1{font-size:2.8rem}}h2{font-size:2.8rem;font-weight:700;margin:1.5em 0 .5em}@media (max-width:600px){h2{font-size:2.3rem}}h3{font-size:2.4rem;font-weight:600;margin:1.5em 0 .5em}@media (max-width:600px){h3{font-size:1.7rem}}h4{font-size:2rem;margin:1.5em 0 .5em}@media (max-width:600px){h4{font-size:1.7rem}}h5{font-size:2rem}h5,h6{margin:1.5em 0 .5em}h6{font-size:1.8rem}
|
||||||
|
/*# sourceMappingURL=global.css.map */
|
1
assets/built/global.css.map
Normal file
2
assets/built/screen.css
Normal file
1
assets/built/screen.css.map
Normal file
468
assets/css/global.css
Normal file
@ -0,0 +1,468 @@
|
|||||||
|
/* Reset
|
||||||
|
/* ---------------------------------------------------------- */
|
||||||
|
|
||||||
|
html,
|
||||||
|
body,
|
||||||
|
div,
|
||||||
|
span,
|
||||||
|
applet,
|
||||||
|
object,
|
||||||
|
iframe,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6,
|
||||||
|
p,
|
||||||
|
blockquote,
|
||||||
|
pre,
|
||||||
|
a,
|
||||||
|
abbr,
|
||||||
|
acronym,
|
||||||
|
address,
|
||||||
|
big,
|
||||||
|
cite,
|
||||||
|
code,
|
||||||
|
del,
|
||||||
|
dfn,
|
||||||
|
em,
|
||||||
|
img,
|
||||||
|
ins,
|
||||||
|
kbd,
|
||||||
|
q,
|
||||||
|
s,
|
||||||
|
samp,
|
||||||
|
small,
|
||||||
|
strike,
|
||||||
|
strong,
|
||||||
|
sub,
|
||||||
|
sup,
|
||||||
|
tt,
|
||||||
|
var,
|
||||||
|
dl,
|
||||||
|
dt,
|
||||||
|
dd,
|
||||||
|
ol,
|
||||||
|
ul,
|
||||||
|
li,
|
||||||
|
fieldset,
|
||||||
|
form,
|
||||||
|
label,
|
||||||
|
legend,
|
||||||
|
table,
|
||||||
|
caption,
|
||||||
|
tbody,
|
||||||
|
tfoot,
|
||||||
|
thead,
|
||||||
|
tr,
|
||||||
|
th,
|
||||||
|
td,
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
canvas,
|
||||||
|
details,
|
||||||
|
embed,
|
||||||
|
figure,
|
||||||
|
figcaption,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
menu,
|
||||||
|
nav,
|
||||||
|
output,
|
||||||
|
ruby,
|
||||||
|
section,
|
||||||
|
summary,
|
||||||
|
time,
|
||||||
|
mark,
|
||||||
|
audio,
|
||||||
|
video {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
font: inherit;
|
||||||
|
font-size: 100%;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
blockquote,
|
||||||
|
q {
|
||||||
|
quotes: none;
|
||||||
|
}
|
||||||
|
blockquote:before,
|
||||||
|
blockquote:after,
|
||||||
|
q:before,
|
||||||
|
q:after {
|
||||||
|
content: "";
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
border-spacing: 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: sans-serif;
|
||||||
|
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
}
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after {
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
a:active,
|
||||||
|
a:hover {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
i,
|
||||||
|
em,
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin: 0.67em 0;
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
position: relative;
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
mark {
|
||||||
|
background-color: #fdffb6;
|
||||||
|
}
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
kbd {
|
||||||
|
padding: 3px 5px;
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
font-size: 1.5rem;
|
||||||
|
background: #f6f8fa;
|
||||||
|
border: 1px solid rgba(124, 139, 154, 0.25);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: inset 0 -1px 0 rgba(124, 139, 154, 0.25);
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
kbd {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
optgroup,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
margin: 0; /* 3 */
|
||||||
|
color: inherit; /* 1 */
|
||||||
|
font: inherit; /* 2 */
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
overflow: visible;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
button,
|
||||||
|
select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
button,
|
||||||
|
html input[type="button"],
|
||||||
|
/* 1 */
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"] {
|
||||||
|
cursor: pointer; /* 3 */
|
||||||
|
|
||||||
|
-webkit-appearance: button; /* 2 */
|
||||||
|
}
|
||||||
|
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; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
input[type="number"]::-webkit-inner-spin-button,
|
||||||
|
input[type="number"]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
input[type="search"] {
|
||||||
|
box-sizing: content-box; /* 2 */
|
||||||
|
|
||||||
|
-webkit-appearance: textfield; /* 1 */
|
||||||
|
}
|
||||||
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
|
input[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
legend {
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
border: 0; /* 1 */
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
border-spacing: 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Base styles: opinionated defaults
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 62.5%;
|
||||||
|
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
color: var(--color-darkgrey);
|
||||||
|
font-family: var(--gh-font-body, var(--font-sans));
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #daf2fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
margin: 2.5em 0 3.5em;
|
||||||
|
padding: 0;
|
||||||
|
height: 1px;
|
||||||
|
border: 0;
|
||||||
|
border-top: 1px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
audio,
|
||||||
|
canvas,
|
||||||
|
iframe,
|
||||||
|
img,
|
||||||
|
svg,
|
||||||
|
video {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
::not(.gh-content) p,
|
||||||
|
::not(.gh-content) ul,
|
||||||
|
::not(.gh-content) ol,
|
||||||
|
::not(.gh-content) dl,
|
||||||
|
::not(.gh-content) blockquote {
|
||||||
|
margin: 0 0 1.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol,
|
||||||
|
ul {
|
||||||
|
padding-left: 1.3em;
|
||||||
|
padding-right: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol ol,
|
||||||
|
ul ul,
|
||||||
|
ul ol,
|
||||||
|
ol ul {
|
||||||
|
margin: 0.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul,
|
||||||
|
ol {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: 0.3em;
|
||||||
|
line-height: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
li + li {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
float: left;
|
||||||
|
margin: 0 20px 0 0;
|
||||||
|
width: 120px;
|
||||||
|
color: #daf2fd;
|
||||||
|
font-weight: 500;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin: 0 0 5px 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
margin: 1.5em 0;
|
||||||
|
padding: 0 1.6em 0 1.6em;
|
||||||
|
border-left: #daf2fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote small {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0.8em 0 0.8em 1.5em;
|
||||||
|
font-size: 0.9em;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
/* Quotation marks */
|
||||||
|
blockquote small:before {
|
||||||
|
content: "\2014 \00A0";
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote cite {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
blockquote cite a {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #15171A;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
margin-top: 0;
|
||||||
|
line-height: 1.15;
|
||||||
|
font-family: var(--gh-font-heading, var(--font-sans));
|
||||||
|
font-weight: 600;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 0.5em 0;
|
||||||
|
font-size: 4.8rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: -0.015em;
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
h1 {
|
||||||
|
font-size: 2.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin: 1.5em 0 0.5em 0;
|
||||||
|
font-size: 2.8rem;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
h2 {
|
||||||
|
font-size: 2.3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin: 1.5em 0 0.5em 0;
|
||||||
|
font-size: 2.4rem;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
h3 {
|
||||||
|
font-size: 1.7rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
margin: 1.5em 0 0.5em 0;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
h4 {
|
||||||
|
font-size: 1.7rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
margin: 1.5em 0 0.5em 0;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
margin: 1.5em 0 0.5em 0;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
}
|
@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<metadata>Generated by IcoMoon</metadata>
|
|
||||||
<defs>
|
|
||||||
<font id="icomoon" horiz-adv-x="512">
|
|
||||||
<font-face units-per-em="512" ascent="480" descent="-32" />
|
|
||||||
<missing-glyph horiz-adv-x="512" />
|
|
||||||
<glyph unicode=" " d="" horiz-adv-x="256" />
|
|
||||||
<glyph unicode="" d="M0 480v-102.4h307.2v102.4h-307.2zM0 275.2v-102.4h512v102.4h-512zM0 70.4v-102.4h204.8v102.4h-204.8zM307.2 70.4v-102.4h204.8v102.4h-204.8zM409.6 480v-102.4h102.4v102.4h-102.4z" />
|
|
||||||
<glyph unicode="" d="M421.344-32c-0.4 229.616-200.752 417.264-421.344 417.696v94.304c270.656 0 512-230.304 512-512h-90.656zM343.6-31.968h-90.608c0.304 56.384-28.336 119.488-73.664 166.736-45.072 47.632-124.96 77.648-179.104 77.36v94.272c169.040-3.648 339.936-163.312 343.376-338.368zM64.256 96.048c35.312 0 63.936-28.656 63.936-64 0-35.328-28.624-63.984-63.936-63.984s-63.936 28.656-63.936 63.984c0 35.344 28.624 64 63.936 64z" />
|
|
||||||
<glyph unicode="" d="M512 382.791c-18.838-8.354-39.082-14.001-60.33-16.54 21.686 13 38.343 33.585 46.186 58.115-20.298-12.039-42.778-20.78-66.705-25.49-19.16 20.415-46.461 33.17-76.673 33.17-58.011 0-105.044-47.029-105.044-105.039 0-8.233 0.929-16.25 2.72-23.939-87.3 4.382-164.701 46.2-216.509 109.753-9.042-15.514-14.223-33.558-14.223-52.809 0-36.444 18.544-68.596 46.73-87.433-17.219 0.546-33.416 5.271-47.577 13.139-0.010-0.438-0.010-0.878-0.010-1.321 0-50.894 36.209-93.348 84.261-103-8.813-2.4-18.094-3.686-27.674-3.686-6.769 0-13.349 0.66-19.764 1.886 13.368-41.73 52.16-72.103 98.126-72.948-35.95-28.175-81.243-44.967-130.458-44.967-8.479 0-16.84 0.497-25.058 1.47 46.486-29.805 101.701-47.197 161.021-47.197 193.211 0 298.868 160.062 298.868 298.872 0 4.554-0.103 9.084-0.305 13.59 20.528 14.81 38.336 33.31 52.418 54.374z" />
|
|
||||||
<glyph unicode="" d="M0.403 45.168c-0.122 1.266-0.226 2.535-0.292 3.815 0.065-1.28 0.17-2.549 0.292-3.815zM117.954 197.426c46.005-1.369 76.867 46.349 68.931 106.599-7.947 60.24-51.698 108.584-97.704 109.961-46.013 1.365-76.87-44.741-68.926-105 7.941-60.234 51.676-110.187 97.699-111.56zM512 352v42.655c0 46.94-38.391 85.345-85.329 85.345h-341.328c-46.138 0-84.006-37.116-85.282-82.963 29.181 25.693 69.662 47.158 111.437 47.158 44.652 0 178.622 0 178.622 0l-39.974-33.809h-56.634c37.565-14.402 57.578-58.062 57.578-102.861 0-37.624-20.905-69.977-50.444-92.984-28.822-22.451-34.286-31.854-34.286-50.939 0-16.289 30.873-44 47.016-55.394 47.191-33.269 62.458-64.156 62.458-115.728 0-8.214-1.021-16.415-3.033-24.48h153.871c46.937 0 85.328 38.375 85.328 85.345v266.654h-96v-95.999h-32v96h-95.999v32h95.999v96h32v-96h96zM92.943 97.032c10.807 0 20.711 0.295 30.968 0.295-13.573 13.167-24.313 29.3-24.313 49.19 0 11.804 3.782 23.168 9.067 33.26-5.391-0.385-10.895-0.497-16.563-0.497-37.178 0-68.753 12.038-92.102 31.927v-33.621l0.003-100.865c26.72 12.687 58.444 20.311 92.94 20.311zM1.71 36.371c-0.556 2.729-0.983 5.503-1.271 8.317 0.287-2.814 0.715-5.588 1.271-8.317zM227.725 3.577c-7.529 29.403-34.227 43.982-71.444 69.784-13.536 4.366-28.447 6.937-44.447 7.104-44.809 0.482-86.554-17.471-110.108-44.186 7.96-38.853 42.517-68.279 83.617-68.279h143.222c0.908 5.564 1.348 11.316 1.348 17.216 0 6.267-0.767 12.396-2.188 18.361z" />
|
|
||||||
<glyph unicode="" d="M426.672 480h-341.33c-46.936 0-85.342-38.407-85.342-85.344v-341.313c0-46.969 38.406-85.343 85.342-85.343l341.33 0.001c46.938 0 85.328 38.373 85.328 85.344v341.311c0 46.937-38.391 85.344-85.328 85.344zM435.296 224h-83.296v-224h-96v224h-46.263v73.282h46.263v47.593c0 64.671 27.896 103.125 103.935 103.125h87.622v-79.285h-71.565c-21.241 0.035-23.876-11.076-23.876-31.756l-0.116-39.677h96l-12.704-73.282z" />
|
|
||||||
<glyph unicode="" d="M368.615 34.099c6.861-6.938 6.861-18.125 0-25.063s-17.945-6.938-24.807 0l-200.448 202.419c-6.861 6.938-6.861 18.15 0 25.063l200.448 202.445c6.861 6.938 17.945 6.938 24.807 0s6.861-18.125 0-25.063l-182.784-189.901 182.784-189.901z" />
|
|
||||||
<glyph unicode="" d="M435.2 454.4h-56.32c-14.131 0-20.48-11.469-20.48-25.6v-435.2h102.4v435.2c0 14.131-11.443 25.6-25.6 25.6zM281.6 300.8h-56.32c-14.131 0-20.48-11.469-20.48-25.6v-281.6h102.4v281.6c0 14.131-11.443 25.6-25.6 25.6zM128 147.2h-56.32c-14.131 0-20.48-11.443-20.48-25.6v-128h102.4v128c0 14.157-11.469 25.6-25.6 25.6z" />
|
|
||||||
<glyph unicode="" d="M256 428.8c-70.707 0-128-57.319-128-128 0-122.214 128-281.6 128-281.6s128 159.386 128 281.6c0 70.681-57.293 128-128 128zM256 230.144c-38.169 0-69.12 30.951-69.12 69.12s30.951 69.12 69.12 69.12 69.12-30.951 69.12-69.12-30.95-69.12-69.12-69.12z" />
|
|
||||||
<glyph unicode="" d="M201.19 103.834l-20.736-20.582c-17.971-17.792-47.181-17.817-65.126 0-8.627 8.576-13.363 19.917-13.363 32.026s4.761 23.475 13.363 32.051l76.288 75.699c15.795 15.693 45.542 38.759 67.226 17.255 9.959-9.881 26.035-9.805 35.891 0.128 9.882 9.933 9.83 26.010-0.128 35.891-36.839 36.557-91.315 29.798-138.752-17.255l-76.288-75.699c-18.279-18.176-28.365-42.343-28.365-68.070 0-25.702 10.087-49.869 28.391-68.045 18.841-18.714 43.571-28.032 68.301-28.032s49.511 9.318 68.352 28.032l20.736 20.608c9.958 9.882 10.010 25.959 0.128 35.865-9.881 9.933-25.958 9.984-35.917 0.128zM432.409 397.85c-39.577 39.27-94.899 41.395-131.558 5.043l-25.831-25.626c-9.959-9.882-10.035-25.933-0.154-35.891 9.907-9.958 25.959-10.010 35.891-0.128l25.83 25.625c18.969 18.841 43.827 11.034 60.058-5.043 8.627-8.55 13.363-19.942 13.363-32.026 0-12.109-4.762-23.475-13.363-32.026l-81.408-80.742c-37.197-36.915-54.682-19.61-62.131-12.211-9.958 9.882-26.010 9.805-35.865-0.128-9.881-9.959-9.831-26.035 0.128-35.891 17.075-16.947 36.608-25.344 57.037-25.344 25.037 0 51.481 12.595 76.621 37.555l81.382 80.743c18.304 18.151 28.39 42.317 28.39 68.019s-10.087 49.894-28.39 68.070z" />
|
|
||||||
<glyph unicode="" d="M64 362.667h384q8.834 0 15.084-6.25t6.25-15.083-6.25-15.084-15.084-6.25h-384q-8.834 0-15.084 6.25t-6.25 15.084 6.25 15.083 15.084 6.25zM64 106.667h384q8.834 0 15.084-6.25t6.25-15.084-6.25-15.084-15.084-6.25h-384q-8.834 0-15.084 6.25t-6.25 15.084 6.25 15.084 15.084 6.25zM64 234.667h384q8.834 0 15.084-6.25t6.25-15.084-6.25-15.084-15.084-6.25h-384q-8.834 0-15.084 6.25t-6.25 15.084 6.25 15.084 15.084 6.25z" />
|
|
||||||
</font></defs></svg>
|
|
Before Width: | Height: | Size: 6.1 KiB |
BIN
assets/images/default-skin.png
Executable file
After Width: | Height: | Size: 547 B |
1
assets/images/default-skin.svg
Executable file
@ -0,0 +1 @@
|
|||||||
|
<svg width="264" height="88" viewBox="0 0 264 88" xmlns="http://www.w3.org/2000/svg"><title>default-skin 2</title><g fill="none" fill-rule="evenodd"><g><path d="M67.002 59.5v3.768c-6.307.84-9.184 5.75-10.002 9.732 2.22-2.83 5.564-5.098 10.002-5.098V71.5L73 65.585 67.002 59.5z" id="Shape" fill="#fff"/><g fill="#fff"><path d="M13 29v-5h2v3h3v2h-5zM13 15h5v2h-3v3h-2v-5zM31 15v5h-2v-3h-3v-2h5zM31 29h-5v-2h3v-3h2v5z" id="Shape"/></g><g fill="#fff"><path d="M62 24v5h-2v-3h-3v-2h5zM62 20h-5v-2h3v-3h2v5zM70 20v-5h2v3h3v2h-5zM70 24h5v2h-3v3h-2v-5z"/></g><path d="M20.586 66l-5.656-5.656 1.414-1.414L22 64.586l5.656-5.656 1.414 1.414L23.414 66l5.656 5.656-1.414 1.414L22 67.414l-5.656 5.656-1.414-1.414L20.586 66z" fill="#fff"/><path d="M111.785 65.03L110 63.5l3-3.5h-10v-2h10l-3-3.5 1.785-1.468L117 59l-5.215 6.03z" fill="#fff"/><path d="M152.215 65.03L154 63.5l-3-3.5h10v-2h-10l3-3.5-1.785-1.468L147 59l5.215 6.03z" fill="#fff"/><g><path id="Rectangle-11" fill="#fff" d="M160.957 28.543l-3.25-3.25-1.413 1.414 3.25 3.25z"/><path d="M152.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" id="Oval-1" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M150 21h5v1h-5z"/></g><g><path d="M116.957 28.543l-1.414 1.414-3.25-3.25 1.414-1.414 3.25 3.25z" fill="#fff"/><path d="M108.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M106 21h5v1h-5z"/><path fill="#fff" d="M109.043 19.008l-.085 5-1-.017.085-5z"/></g></g></g></svg>
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/images/preloader.gif
Executable file
After Width: | Height: | Size: 866 B |
85
assets/js/dropdown.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
(function () {
|
||||||
|
const mediaQuery = window.matchMedia('(max-width: 767px)');
|
||||||
|
|
||||||
|
const head = document.querySelector('.gh-head');
|
||||||
|
const menu = head.querySelector('.gh-head-menu');
|
||||||
|
const nav = menu.querySelector('.nav');
|
||||||
|
if (!nav) return;
|
||||||
|
|
||||||
|
const logo = document.querySelector('.gh-head-logo');
|
||||||
|
const navHTML = nav.innerHTML;
|
||||||
|
|
||||||
|
if (mediaQuery.matches) {
|
||||||
|
const items = nav.querySelectorAll('li');
|
||||||
|
items.forEach(function (item, index) {
|
||||||
|
item.style.transitionDelay = 0.03 * (index + 1) + 's';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var windowClickListener;
|
||||||
|
const makeDropdown = function () {
|
||||||
|
if (mediaQuery.matches) return;
|
||||||
|
const submenuItems = [];
|
||||||
|
|
||||||
|
while ((nav.offsetWidth + 64) > menu.offsetWidth) {
|
||||||
|
if (nav.lastElementChild) {
|
||||||
|
submenuItems.unshift(nav.lastElementChild);
|
||||||
|
nav.lastElementChild.remove();
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!submenuItems.length) {
|
||||||
|
document.body.classList.add('is-dropdown-loaded');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggle = document.createElement('button');
|
||||||
|
toggle.setAttribute('class', 'nav-more-toggle');
|
||||||
|
toggle.setAttribute('aria-label', 'More');
|
||||||
|
toggle.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor"><path d="M21.333 16c0-1.473 1.194-2.667 2.667-2.667v0c1.473 0 2.667 1.194 2.667 2.667v0c0 1.473-1.194 2.667-2.667 2.667v0c-1.473 0-2.667-1.194-2.667-2.667v0zM13.333 16c0-1.473 1.194-2.667 2.667-2.667v0c1.473 0 2.667 1.194 2.667 2.667v0c0 1.473-1.194 2.667-2.667 2.667v0c-1.473 0-2.667-1.194-2.667-2.667v0zM5.333 16c0-1.473 1.194-2.667 2.667-2.667v0c1.473 0 2.667 1.194 2.667 2.667v0c0 1.473-1.194 2.667-2.667 2.667v0c-1.473 0-2.667-1.194-2.667-2.667v0z"></path></svg>';
|
||||||
|
|
||||||
|
const wrapper = document.createElement('div');
|
||||||
|
wrapper.setAttribute('class', 'gh-dropdown');
|
||||||
|
|
||||||
|
if (submenuItems.length >= 10) {
|
||||||
|
document.body.classList.add('is-dropdown-mega');
|
||||||
|
wrapper.style.gridTemplateRows = 'repeat(' + Math.ceil(submenuItems.length / 2) + ', 1fr)';
|
||||||
|
} else {
|
||||||
|
document.body.classList.remove('is-dropdown-mega');
|
||||||
|
}
|
||||||
|
|
||||||
|
submenuItems.forEach(function (child) {
|
||||||
|
wrapper.appendChild(child);
|
||||||
|
});
|
||||||
|
|
||||||
|
toggle.appendChild(wrapper);
|
||||||
|
nav.appendChild(toggle);
|
||||||
|
|
||||||
|
document.body.classList.add('is-dropdown-loaded');
|
||||||
|
|
||||||
|
toggle.addEventListener('click', function () {
|
||||||
|
document.body.classList.toggle('is-dropdown-open');
|
||||||
|
});
|
||||||
|
|
||||||
|
windowClickListener = function (e) {
|
||||||
|
if (!toggle.contains(e.target) && document.body.classList.contains('is-dropdown-open')) {
|
||||||
|
document.body.classList.remove('is-dropdown-open');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener('click', windowClickListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
imagesLoaded(head, function () {
|
||||||
|
makeDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('resize', function () {
|
||||||
|
setTimeout(function () {
|
||||||
|
window.removeEventListener('click', windowClickListener);
|
||||||
|
nav.innerHTML = navHTML;
|
||||||
|
makeDropdown();
|
||||||
|
}, 1);
|
||||||
|
});
|
||||||
|
})();
|
@ -1,56 +0,0 @@
|
|||||||
/**
|
|
||||||
* Main JS file for Casper behaviours
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* globals jQuery, document */
|
|
||||||
(function ($, undefined) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var $document = $(document);
|
|
||||||
|
|
||||||
$document.ready(function () {
|
|
||||||
|
|
||||||
var $postContent = $(".post-content");
|
|
||||||
$postContent.fitVids();
|
|
||||||
|
|
||||||
$(".scroll-down").arctic_scroll();
|
|
||||||
|
|
||||||
$(".menu-button, .nav-cover, .nav-close").on("click", function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
$("body").toggleClass("nav-opened nav-closed");
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// Arctic Scroll by Paul Adam Davis
|
|
||||||
// https://github.com/PaulAdamDavis/Arctic-Scroll
|
|
||||||
$.fn.arctic_scroll = function (options) {
|
|
||||||
|
|
||||||
var defaults = {
|
|
||||||
elem: $(this),
|
|
||||||
speed: 500
|
|
||||||
},
|
|
||||||
|
|
||||||
allOptions = $.extend(defaults, options);
|
|
||||||
|
|
||||||
allOptions.elem.click(function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
var $this = $(this),
|
|
||||||
$htmlBody = $('html, body'),
|
|
||||||
offset = ($this.attr('data-offset')) ? $this.attr('data-offset') : false,
|
|
||||||
position = ($this.attr('data-position')) ? $this.attr('data-position') : false,
|
|
||||||
toMove;
|
|
||||||
|
|
||||||
if (offset) {
|
|
||||||
toMove = parseInt(offset);
|
|
||||||
$htmlBody.stop(true, false).animate({scrollTop: ($(this.hash).offset().top + toMove) }, allOptions.speed);
|
|
||||||
} else if (position) {
|
|
||||||
toMove = parseInt(position);
|
|
||||||
$htmlBody.stop(true, false).animate({scrollTop: toMove }, allOptions.speed);
|
|
||||||
} else {
|
|
||||||
$htmlBody.stop(true, false).animate({scrollTop: ($(this.hash).offset().top) }, allOptions.speed);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
})(jQuery);
|
|
114
assets/js/infinite-scroll.js
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/* 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) {
|
||||||
|
if (document.documentElement.classList.contains('no-infinite-scroll')) return;
|
||||||
|
|
||||||
|
// next link element
|
||||||
|
var nextElement = document.querySelector('link[rel=next]');
|
||||||
|
if (!nextElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// post feed element
|
||||||
|
var feedElement = document.querySelector('.post-feed');
|
||||||
|
if (!feedElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var buffer = 300;
|
||||||
|
|
||||||
|
var ticking = false;
|
||||||
|
var loading = false;
|
||||||
|
|
||||||
|
var lastScrollY = window.scrollY;
|
||||||
|
var lastWindowHeight = window.innerHeight;
|
||||||
|
var lastDocumentHeight = document.documentElement.scrollHeight;
|
||||||
|
|
||||||
|
function onPageLoad() {
|
||||||
|
if (this.status === 404) {
|
||||||
|
window.removeEventListener('scroll', onScroll);
|
||||||
|
window.removeEventListener('resize', onResize);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append contents
|
||||||
|
var postElements = this.response.querySelectorAll('article.post-card');
|
||||||
|
postElements.forEach(function (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
|
||||||
|
var resNextElement = this.response.querySelector('link[rel=next]');
|
||||||
|
if (resNextElement) {
|
||||||
|
nextElement.href = resNextElement.href;
|
||||||
|
} else {
|
||||||
|
window.removeEventListener('scroll', onScroll);
|
||||||
|
window.removeEventListener('resize', onResize);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sync status
|
||||||
|
lastDocumentHeight = document.documentElement.scrollHeight;
|
||||||
|
ticking = false;
|
||||||
|
loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onUpdate() {
|
||||||
|
// return if already loading
|
||||||
|
if (loading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return if not scroll to the bottom
|
||||||
|
if (lastScrollY + lastWindowHeight <= lastDocumentHeight - buffer) {
|
||||||
|
ticking = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loading = true;
|
||||||
|
|
||||||
|
var xhr = new window.XMLHttpRequest();
|
||||||
|
xhr.responseType = 'document';
|
||||||
|
|
||||||
|
xhr.addEventListener('load', onPageLoad);
|
||||||
|
|
||||||
|
xhr.open('GET', nextElement.href);
|
||||||
|
xhr.send(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestTick() {
|
||||||
|
ticking || window.requestAnimationFrame(onUpdate);
|
||||||
|
ticking = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onScroll() {
|
||||||
|
lastScrollY = window.scrollY;
|
||||||
|
requestTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onResize() {
|
||||||
|
lastWindowHeight = window.innerHeight;
|
||||||
|
lastDocumentHeight = document.documentElement.scrollHeight;
|
||||||
|
requestTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('scroll', onScroll, {passive: true});
|
||||||
|
window.addEventListener('resize', onResize);
|
||||||
|
|
||||||
|
requestTick();
|
||||||
|
})(window, document);
|
@ -1,67 +0,0 @@
|
|||||||
/*global jQuery */
|
|
||||||
/*jshint browser:true */
|
|
||||||
/*!
|
|
||||||
* FitVids 1.1
|
|
||||||
*
|
|
||||||
* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
|
|
||||||
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
|
|
||||||
* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function( $ ){
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
$.fn.fitVids = function( options ) {
|
|
||||||
var settings = {
|
|
||||||
customSelector: null
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!document.getElementById('fit-vids-style')) {
|
|
||||||
// appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
|
|
||||||
var head = document.head || document.getElementsByTagName('head')[0];
|
|
||||||
var css = '.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%;}';
|
|
||||||
var div = document.createElement('div');
|
|
||||||
div.innerHTML = '<p>x</p><style id="fit-vids-style">' + css + '</style>';
|
|
||||||
head.appendChild(div.childNodes[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( options ) {
|
|
||||||
$.extend( settings, options );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each(function(){
|
|
||||||
var selectors = [
|
|
||||||
"iframe[src*='player.vimeo.com']",
|
|
||||||
"iframe[src*='youtube.com']",
|
|
||||||
"iframe[src*='youtube-nocookie.com']",
|
|
||||||
"iframe[src*='kickstarter.com'][src*='video.html']",
|
|
||||||
"object",
|
|
||||||
"embed"
|
|
||||||
];
|
|
||||||
|
|
||||||
if (settings.customSelector) {
|
|
||||||
selectors.push(settings.customSelector);
|
|
||||||
}
|
|
||||||
|
|
||||||
var $allVideos = $(this).find(selectors.join(','));
|
|
||||||
$allVideos = $allVideos.not("object object"); // SwfObj conflict patch
|
|
||||||
|
|
||||||
$allVideos.each(function(){
|
|
||||||
var $this = $(this);
|
|
||||||
if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
|
|
||||||
var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
|
|
||||||
width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
|
|
||||||
aspectRatio = height / width;
|
|
||||||
if(!$this.attr('id')){
|
|
||||||
var videoID = 'fitvid' + Math.floor(Math.random()*999999);
|
|
||||||
$this.attr('id', videoID);
|
|
||||||
}
|
|
||||||
$this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%");
|
|
||||||
$this.removeAttr('height').removeAttr('width');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
// Works with either jQuery or Zepto
|
|
||||||
})( window.jQuery || window.Zepto );
|
|
7
assets/js/lib/imagesloaded.pkgd.min.js
vendored
Normal file
89
assets/js/lib/jquery.fitvids.js
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/*jshint browser:true */
|
||||||
|
/*!
|
||||||
|
* FitVids 1.3
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright 2017, Chris Coyier + Dave Rupert + Ghost Foundation
|
||||||
|
* This is an unofficial release, ported by John O'Nolan
|
||||||
|
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
|
||||||
|
* Released under the MIT license
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
;(function( $ ){
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$.fn.fitVids = function( options ) {
|
||||||
|
var settings = {
|
||||||
|
customSelector: null,
|
||||||
|
ignore: null
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!document.getElementById('fit-vids-style')) {
|
||||||
|
// appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
|
||||||
|
var head = document.head || document.getElementsByTagName('head')[0];
|
||||||
|
var css = '.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%;}';
|
||||||
|
var div = document.createElement("div");
|
||||||
|
div.innerHTML = '<p>x</p><style id="fit-vids-style">' + css + '</style>';
|
||||||
|
head.appendChild(div.childNodes[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( options ) {
|
||||||
|
$.extend( settings, options );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function(){
|
||||||
|
var selectors = [
|
||||||
|
'iframe[src*="player.vimeo.com"]',
|
||||||
|
'iframe[src*="youtube.com"]',
|
||||||
|
'iframe[src*="youtube-nocookie.com"]',
|
||||||
|
'iframe[src*="kickstarter.com"][src*="video.html"]',
|
||||||
|
'object',
|
||||||
|
'embed'
|
||||||
|
];
|
||||||
|
|
||||||
|
if (settings.customSelector) {
|
||||||
|
selectors.push(settings.customSelector);
|
||||||
|
}
|
||||||
|
|
||||||
|
var ignoreList = '.fitvidsignore';
|
||||||
|
|
||||||
|
if(settings.ignore) {
|
||||||
|
ignoreList = ignoreList + ', ' + settings.ignore;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $allVideos = $(this).find(selectors.join(','));
|
||||||
|
$allVideos = $allVideos.not('object object'); // SwfObj conflict patch
|
||||||
|
$allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video.
|
||||||
|
|
||||||
|
$allVideos.each(function(){
|
||||||
|
var $this = $(this);
|
||||||
|
if($this.parents(ignoreList).length > 0) {
|
||||||
|
return; // Disable FitVids on this video.
|
||||||
|
}
|
||||||
|
if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
|
||||||
|
if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width'))))
|
||||||
|
{
|
||||||
|
$this.attr('height', 9);
|
||||||
|
$this.attr('width', 16);
|
||||||
|
}
|
||||||
|
var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
|
||||||
|
width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
|
||||||
|
aspectRatio = height / width;
|
||||||
|
if(!$this.attr('name')){
|
||||||
|
var videoName = 'fitvid' + $.fn.fitVids._count;
|
||||||
|
$this.attr('name', videoName);
|
||||||
|
$.fn.fitVids._count++;
|
||||||
|
}
|
||||||
|
$this.wrap('<div class="fluid-width-video-container"><div class="fluid-width-video-wrapper"></div></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%');
|
||||||
|
$this.removeAttr('height').removeAttr('width');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Internal counter for unique video names.
|
||||||
|
$.fn.fitVids._count = 0;
|
||||||
|
|
||||||
|
// Works with either jQuery or Zepto
|
||||||
|
})( window.jQuery || window.Zepto );
|
4
assets/js/lib/photoswipe-ui-default.min.js
vendored
Executable file
4
assets/js/lib/photoswipe.min.js
vendored
Executable file
109
assets/js/lightbox.js
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
function lightbox(trigger) {
|
||||||
|
var onThumbnailsClick = function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var items = [];
|
||||||
|
var index = 0;
|
||||||
|
|
||||||
|
var prevSibling = e.target.closest('.kg-card').previousElementSibling;
|
||||||
|
|
||||||
|
while (prevSibling && (prevSibling.classList.contains('kg-image-card') || prevSibling.classList.contains('kg-gallery-card'))) {
|
||||||
|
var prevItems = [];
|
||||||
|
|
||||||
|
prevSibling.querySelectorAll('img').forEach(function (item) {
|
||||||
|
prevItems.push({
|
||||||
|
src: item.getAttribute('src'),
|
||||||
|
msrc: item.getAttribute('src'),
|
||||||
|
w: item.getAttribute('width'),
|
||||||
|
h: item.getAttribute('height'),
|
||||||
|
el: item,
|
||||||
|
})
|
||||||
|
|
||||||
|
index += 1;
|
||||||
|
});
|
||||||
|
prevSibling = prevSibling.previousElementSibling;
|
||||||
|
|
||||||
|
items = prevItems.concat(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.target.classList.contains('kg-image')) {
|
||||||
|
items.push({
|
||||||
|
src: e.target.getAttribute('src'),
|
||||||
|
msrc: e.target.getAttribute('src'),
|
||||||
|
w: e.target.getAttribute('width'),
|
||||||
|
h: e.target.getAttribute('height'),
|
||||||
|
el: e.target,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var reachedCurrentItem = false;
|
||||||
|
|
||||||
|
e.target.closest('.kg-gallery-card').querySelectorAll('img').forEach(function (item) {
|
||||||
|
items.push({
|
||||||
|
src: item.getAttribute('src'),
|
||||||
|
msrc: item.getAttribute('src'),
|
||||||
|
w: item.getAttribute('width'),
|
||||||
|
h: item.getAttribute('height'),
|
||||||
|
el: item,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!reachedCurrentItem && item !== e.target) {
|
||||||
|
index += 1;
|
||||||
|
} else {
|
||||||
|
reachedCurrentItem = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var nextSibling = e.target.closest('.kg-card').nextElementSibling;
|
||||||
|
|
||||||
|
while (nextSibling && (nextSibling.classList.contains('kg-image-card') || nextSibling.classList.contains('kg-gallery-card'))) {
|
||||||
|
nextSibling.querySelectorAll('img').forEach(function (item) {
|
||||||
|
items.push({
|
||||||
|
src: item.getAttribute('src'),
|
||||||
|
msrc: item.getAttribute('src'),
|
||||||
|
w: item.getAttribute('width'),
|
||||||
|
h: item.getAttribute('height'),
|
||||||
|
el: item,
|
||||||
|
})
|
||||||
|
});
|
||||||
|
nextSibling = nextSibling.nextElementSibling;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pswpElement = document.querySelectorAll('.pswp')[0];
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
bgOpacity: 0.9,
|
||||||
|
closeOnScroll: true,
|
||||||
|
fullscreenEl: false,
|
||||||
|
history: false,
|
||||||
|
index: index,
|
||||||
|
shareEl: false,
|
||||||
|
zoomEl: false,
|
||||||
|
getThumbBoundsFn: function(index) {
|
||||||
|
var thumbnail = items[index].el,
|
||||||
|
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
|
||||||
|
rect = thumbnail.getBoundingClientRect();
|
||||||
|
|
||||||
|
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
|
||||||
|
gallery.init();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
var triggers = document.querySelectorAll(trigger);
|
||||||
|
triggers.forEach(function (trig) {
|
||||||
|
trig.addEventListener('click', function (e) {
|
||||||
|
onThumbnailsClick(e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
lightbox(
|
||||||
|
'.kg-image-card > .kg-image[width][height], .kg-gallery-image > img'
|
||||||
|
);
|
||||||
|
})();
|
BIN
assets/screenshot-desktop.jpg
Normal file → Executable file
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 132 KiB |
BIN
assets/screenshot-mobile.jpg
Normal file → Executable file
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 60 KiB |
118
author.hbs
@ -1,41 +1,97 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
|
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
|
||||||
|
|
||||||
{{!-- The big featured header --}}
|
<main id="site-main" class="site-main outer">
|
||||||
|
<div class="inner posts">
|
||||||
|
|
||||||
{{!-- Everything inside the #author tags pulls data from the author --}}
|
<div class="post-feed">
|
||||||
{{#author}}
|
|
||||||
<header class="main-header author-head {{#if cover}}" style="background-image: url({{cover}}){{else}}no-cover{{/if}}">
|
{{#author}}
|
||||||
<nav class="main-nav overlay clearfix">
|
<section class="post-card post-card-large">
|
||||||
{{#if @blog.logo}}<a class="blog-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>{{/if}}
|
|
||||||
{{#if @blog.navigation}}
|
{{#if cover_image}}
|
||||||
<a class="menu-button icon-menu" href="#"><span class="word">Menu</span></a>
|
<div class="post-card-image-link">
|
||||||
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
|
<img class="post-card-image"
|
||||||
|
srcset="{{img_url cover_image size="s"}} 300w,
|
||||||
|
{{img_url cover_image size="m"}} 600w,
|
||||||
|
{{img_url cover_image size="l"}} 1000w,
|
||||||
|
{{img_url cover_image size="xl"}} 2000w"
|
||||||
|
sizes="(max-width: 1000px) 400px, 800px"
|
||||||
|
src="{{img_url cover_image size="m"}}"
|
||||||
|
alt="{{title}}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<section class="author-profile inner">
|
<div class="post-card-content">
|
||||||
{{#if image}}
|
<div class="post-card-content-link">
|
||||||
<figure class="author-image">
|
|
||||||
<div class="img" style="background-image: url({{image}})"><span class="hidden">{{name}}'s Picture</span></div>
|
|
||||||
</figure>
|
|
||||||
{{/if}}
|
|
||||||
<h1 class="author-title">{{name}}</h1>
|
|
||||||
{{#if bio}}
|
|
||||||
<h2 class="author-bio">{{bio}}</h2>
|
|
||||||
{{/if}}
|
|
||||||
<div class="author-meta">
|
|
||||||
{{#if location}}<span class="author-location icon-location">{{location}}</span>{{/if}}
|
|
||||||
{{#if website}}<span class="author-link icon-link"><a href="{{website}}">{{website}}</a></span>{{/if}}
|
|
||||||
<span class="author-stats"><i class="icon-stats"></i> {{plural ../pagination.total empty='No posts' singular='% post' plural='% posts'}}</span>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{{/author}}
|
|
||||||
|
|
||||||
{{!-- The main content area on the homepage --}}
|
{{#if profile_image}}
|
||||||
<main class="content" role="main">
|
<img class="author-profile-pic" src="{{profile_image}}" alt="{{name}}" />
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{!-- The tag below includes the post loop - partials/loop.hbs --}}
|
<header class="post-card-header">
|
||||||
{{> "loop"}}
|
<h2 class="post-card-title">{{name}}</h2>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{#if bio}}
|
||||||
|
<div class="post-card-excerpt">{{bio}}</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<footer class="author-profile-footer">
|
||||||
|
{{#if location}}
|
||||||
|
<div class="author-profile-location">{{location}}</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="author-profile-meta">
|
||||||
|
{{#if website}}
|
||||||
|
<a class="author-profile-social-link" href="{{website}}" target="_blank" rel="noopener">{{website}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if twitter}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="twitter"}}" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if facebook}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="facebook"}}" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if linkedin}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="linkedin"}}" target="_blank" rel="noopener">{{> "icons/linkedin"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if bluesky}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="bluesky"}}" target="_blank" rel="noopener">{{> "icons/bluesky"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if threads}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="threads"}}" target="_blank" rel="noopener">{{> "icons/threads"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if mastodon}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="mastodon"}}" target="_blank" rel="noopener">{{> "icons/mastodon"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if tiktok}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="tiktok"}}" target="_blank" rel="noopener">{{> "icons/tiktok"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if youtube}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="youtube"}}" target="_blank" rel="noopener">{{> "icons/youtube"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
{{#if instagram}}
|
||||||
|
<a class="author-profile-social-link" href="{{social_url type="instagram"}}" target="_blank" rel="noopener">{{> "icons/instagram"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
{{/author}}
|
||||||
|
|
||||||
|
{{#foreach posts}}
|
||||||
|
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/foreach}}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{pagination}}
|
||||||
|
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
137
default.hbs
@ -1,55 +1,120 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="{{@site.locale}}"{{#match @custom.color_scheme "Dark"}} class="dark-mode"{{else match @custom.color_scheme "Auto"}} class="auto-color"{{/match}}>
|
||||||
<head>
|
<head>
|
||||||
{{!-- Document Settings --}}
|
|
||||||
|
{{!-- Basic meta - advanced meta is output with {ghost_head} below --}}
|
||||||
|
<title>{{meta_title}}</title>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
|
||||||
{{!-- Page Meta --}}
|
|
||||||
<title>{{meta_title}}</title>
|
|
||||||
<meta name="description" content="{{meta_description}}" />
|
|
||||||
|
|
||||||
{{!-- Mobile Meta --}}
|
|
||||||
<meta name="HandheldFriendly" content="True" />
|
<meta name="HandheldFriendly" content="True" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
||||||
|
{{!-- Preload scripts --}}
|
||||||
|
<link rel="preload" as="style" href="{{asset "built/screen.css"}}" />
|
||||||
|
<link rel="preload" as="script" href="{{asset "built/casper.js"}}" />
|
||||||
|
|
||||||
{{!-- Brand icon --}}
|
{{!-- Theme assets - use the {asset} helper to reference styles & scripts,
|
||||||
<link rel="shortcut icon" href="{{asset "favicon.ico"}}">
|
this will take care of caching and cache-busting automatically --}}
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{asset "built/screen.css"}}" />
|
||||||
|
|
||||||
{{!-- Styles'n'Scripts --}}
|
{{!-- This tag outputs all your advanced SEO meta, structured data, and other important settings,
|
||||||
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
|
it should always be the last tag before the closing head tag --}}
|
||||||
<link rel="stylesheet" type="text/css" href="{{asset "css/screen.css"}}" />
|
|
||||||
|
|
||||||
|
|
||||||
{{!-- Ghost outputs important style and meta data with this tag --}}
|
|
||||||
{{ghost_head}}
|
{{ghost_head}}
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body class="{{body_class}} nav-closed">
|
<body class="{{body_class}} is-head-{{#match @custom.navigation_layout "Logo on cover"}}left-logo{{else match @custom.navigation_layout "Logo in the middle"}}middle-logo{{else}}stacked{{/match}}{{#match @custom.title_font "=" "Elegant serif"}} has-serif-title{{/match}}{{#match @custom.body_font "=" "Modern sans-serif"}} has-sans-body{{/match}}{{#if @custom.show_publication_cover}} has-cover{{/if}}">
|
||||||
|
<div class="viewport">
|
||||||
|
|
||||||
{{!-- The blog navigation links --}}
|
<header id="gh-head" class="gh-head outer{{#match @custom.header_style "Hidden"}} is-header-hidden{{/match}}">
|
||||||
{{navigation}}
|
<div class="gh-head-inner inner">
|
||||||
|
<div class="gh-head-brand">
|
||||||
|
<a class="gh-head-logo{{#unless @site.logo}} no-image{{/unless}}" href="{{@site.url}}">
|
||||||
|
{{#if @site.logo}}
|
||||||
|
<img src="{{@site.logo}}" alt="{{@site.title}}">
|
||||||
|
{{else}}
|
||||||
|
{{@site.title}}
|
||||||
|
{{/if}}
|
||||||
|
</a>
|
||||||
|
<button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search>{{> "icons/search"}}</button>
|
||||||
|
<button class="gh-burger" aria-label="Main Menu"></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="site-wrapper">
|
<nav class="gh-head-menu">
|
||||||
|
{{navigation}}
|
||||||
|
{{#unless @site.members_enabled}}
|
||||||
|
{{#match @custom.navigation_layout "Stacked"}}
|
||||||
|
<button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search>{{> "icons/search"}}</button>
|
||||||
|
{{/match}}
|
||||||
|
{{/unless}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
{{!-- All the main content gets inserted here, index.hbs, post.hbs, etc --}}
|
<div class="gh-head-actions">
|
||||||
|
{{#unless @site.members_enabled}}
|
||||||
|
{{^match @custom.navigation_layout "Stacked"}}
|
||||||
|
<button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search>{{> "icons/search"}}</button>
|
||||||
|
{{/match}}
|
||||||
|
{{else}}
|
||||||
|
<button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search>{{> "icons/search"}}</button>
|
||||||
|
<div class="gh-head-members">
|
||||||
|
{{#unless @member}}
|
||||||
|
{{#unless @site.members_invite_only}}
|
||||||
|
<a class="gh-head-link" href="#/portal/signin" data-portal="signin">Sign in</a>
|
||||||
|
<a class="gh-head-button" href="#/portal/signup" data-portal="signup">Subscribe</a>
|
||||||
|
{{else}}
|
||||||
|
<a class="gh-head-button" href="#/portal/signin" data-portal="signin">Sign in</a>
|
||||||
|
{{/unless}}
|
||||||
|
{{else}}
|
||||||
|
<a class="gh-head-button" href="#/portal/account" data-portal="account">Account</a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="site-content">
|
||||||
|
{{!-- All other templates get inserted here, index.hbs, post.hbs, etc --}}
|
||||||
{{{body}}}
|
{{{body}}}
|
||||||
|
|
||||||
{{!-- The tiny footer at the very bottom --}}
|
|
||||||
<footer class="site-footer clearfix">
|
|
||||||
<section class="copyright"><a href="{{@blog.url}}">{{@blog.title}}</a> © {{date format="YYYY"}}</section>
|
|
||||||
<section class="poweredby">Proudly published with <a href="https://ghost.org">Ghost</a></section>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- jQuery needs to come before `{{ghost_foot}}` so that jQuery can be used in code injection --}}
|
{{!-- The global footer at the very bottom of the screen --}}
|
||||||
<script type="text/javascript" src="//code.jquery.com/jquery-1.12.0.min.js"></script>
|
<footer class="site-footer outer">
|
||||||
{{!-- Ghost outputs important scripts and data with this tag --}}
|
<div class="inner">
|
||||||
{{ghost_foot}}
|
<section class="copyright"><a href="{{@site.url}}">{{@site.title}}</a> © {{date format="YYYY"}}</section>
|
||||||
{{!-- Fitvids makes video embeds responsive and awesome --}}
|
<nav class="site-footer-nav">
|
||||||
<script type="text/javascript" src="{{asset "js/jquery.fitvids.js"}}"></script>
|
{{navigation type="secondary"}}
|
||||||
{{!-- The main JavaScript file for Casper --}}
|
</nav>
|
||||||
<script type="text/javascript" src="{{asset "js/index.js"}}"></script>
|
<div class="gh-powered-by"><a href="https://ghost.org/" target="_blank" rel="noopener">Powered by Ghost</a></div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{!-- /.viewport --}}
|
||||||
|
|
||||||
|
{{#is "post, page"}}
|
||||||
|
{{> "lightbox"}}
|
||||||
|
{{/is}}
|
||||||
|
|
||||||
|
{{!-- Scripts - handle member signups, responsive videos, infinite scroll, floating headers, and galleries --}}
|
||||||
|
<script
|
||||||
|
src="https://code.jquery.com/jquery-3.5.1.min.js"
|
||||||
|
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
|
||||||
|
crossorigin="anonymous">
|
||||||
|
</script>
|
||||||
|
<script src="{{asset "built/casper.js"}}"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
// Mobile Menu Trigger
|
||||||
|
$('.gh-burger').click(function () {
|
||||||
|
$('body').toggleClass('gh-head-open');
|
||||||
|
});
|
||||||
|
// FitVids - Makes video embeds responsive
|
||||||
|
$(".gh-content").fitVids();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{!-- Ghost outputs required functional scripts with this tag - it should always be the last thing before the closing body tag --}}
|
||||||
|
{{ghost_foot}}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
37
error-404.hbs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{{!< default}}
|
||||||
|
|
||||||
|
{{!--
|
||||||
|
|
||||||
|
There are two error files in this theme, one for 404s and one for all other errors.
|
||||||
|
This file is the former, and handles all 404 Page Not Found errors.
|
||||||
|
|
||||||
|
The 404 error is the most common error that a visitor might see, for example when
|
||||||
|
following a broken link
|
||||||
|
|
||||||
|
Keep this template as lightweight as you can!
|
||||||
|
|
||||||
|
--}}
|
||||||
|
|
||||||
|
<section class="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>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{!-- Given that people landing on this page didn't find what they
|
||||||
|
were looking for, let's give them some alternative stuff to read. --}}
|
||||||
|
<aside class="read-more-wrap outer">
|
||||||
|
<div class="read-more inner">
|
||||||
|
{{#get "posts" include="authors" limit="3" as |more_posts|}}
|
||||||
|
{{#if more_posts}}
|
||||||
|
{{#foreach more_posts}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/foreach}}
|
||||||
|
{{/if}}
|
||||||
|
{{/get}}
|
||||||
|
</div>
|
||||||
|
</aside>
|
74
error.hbs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
{{!--
|
||||||
|
|
||||||
|
There are two error files in this theme, one for 404s and one for all other errors.
|
||||||
|
This file is the latter, and handles all 400/500 errors that might occur.
|
||||||
|
|
||||||
|
Because 500 errors in particular usually happen when a server is struggling, this
|
||||||
|
template is as simple as possible. No template dependencies, no JS, no API calls.
|
||||||
|
This is to prevent rendering the error-page itself compounding the issue causing
|
||||||
|
the error in the first place.
|
||||||
|
|
||||||
|
Keep this template as lightweight as you can!
|
||||||
|
|
||||||
|
--}}
|
||||||
|
|
||||||
|
<!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"}}" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper">
|
||||||
|
|
||||||
|
<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>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="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>
|
||||||
|
|
||||||
|
{{#if errorDetails}}
|
||||||
|
<section class="error-stack">
|
||||||
|
<h3>Theme errors</h3>
|
||||||
|
<ul class="error-stack-list">
|
||||||
|
{{#foreach errorDetails}}
|
||||||
|
<li>
|
||||||
|
<em class="error-stack-function">{{{rule}}}</em>
|
||||||
|
|
||||||
|
{{#foreach failures}}
|
||||||
|
<p><span class="error-stack-file">Ref: {{ref}}</span></p>
|
||||||
|
<p><span class="error-stack-file">Message: {{message}}</span></p>
|
||||||
|
{{/foreach}}
|
||||||
|
</li>
|
||||||
|
{{/foreach}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
176
gulpfile.js
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
const {series, watch, src, dest, parallel} = require('gulp');
|
||||||
|
const pump = require('pump');
|
||||||
|
const path = require('path');
|
||||||
|
const releaseUtils = require('@tryghost/release-utils');
|
||||||
|
const inquirer = require('inquirer');
|
||||||
|
|
||||||
|
// gulp plugins and utils
|
||||||
|
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');
|
||||||
|
const colorFunction = require('postcss-color-mod-function');
|
||||||
|
const cssnano = require('cssnano');
|
||||||
|
const easyimport = require('postcss-easy-import');
|
||||||
|
|
||||||
|
const REPO = 'TryGhost/Casper';
|
||||||
|
const REPO_READONLY = 'TryGhost/Casper';
|
||||||
|
const CHANGELOG_PATH = path.join(process.cwd(), '.', 'changelog.md');
|
||||||
|
|
||||||
|
function serve(done) {
|
||||||
|
livereload.listen();
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleError = (done) => {
|
||||||
|
return function (err) {
|
||||||
|
if (err) {
|
||||||
|
beeper();
|
||||||
|
}
|
||||||
|
return done(err);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function hbs(done) {
|
||||||
|
pump([
|
||||||
|
src(['*.hbs', 'partials/**/*.hbs']),
|
||||||
|
livereload()
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
|
function css(done) {
|
||||||
|
pump([
|
||||||
|
src('assets/css/*.css', {sourcemaps: true}),
|
||||||
|
postcss([
|
||||||
|
easyimport,
|
||||||
|
colorFunction(),
|
||||||
|
autoprefixer(),
|
||||||
|
cssnano()
|
||||||
|
]),
|
||||||
|
dest('assets/built/', {sourcemaps: '.'}),
|
||||||
|
livereload()
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
|
function js(done) {
|
||||||
|
pump([
|
||||||
|
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()
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
|
function zipper(done) {
|
||||||
|
const filename = require('./package.json').name + '.zip';
|
||||||
|
|
||||||
|
pump([
|
||||||
|
src([
|
||||||
|
'**',
|
||||||
|
'!node_modules', '!node_modules/**',
|
||||||
|
'!dist', '!dist/**',
|
||||||
|
'!yarn-error.log',
|
||||||
|
'!yarn.lock',
|
||||||
|
'!gulpfile.js'
|
||||||
|
]),
|
||||||
|
zip(filename),
|
||||||
|
dest('dist/')
|
||||||
|
], handleError(done));
|
||||||
|
}
|
||||||
|
|
||||||
|
const cssWatcher = () => watch('assets/css/**', css);
|
||||||
|
const jsWatcher = () => watch('assets/js/**', js);
|
||||||
|
const hbsWatcher = () => watch(['*.hbs', 'partials/**/*.hbs'], hbs);
|
||||||
|
const watcher = parallel(cssWatcher, jsWatcher, hbsWatcher);
|
||||||
|
const build = series(css, js);
|
||||||
|
|
||||||
|
exports.build = build;
|
||||||
|
exports.zip = series(build, zipper);
|
||||||
|
exports.default = series(build, serve, watcher);
|
||||||
|
|
||||||
|
exports.release = async () => {
|
||||||
|
// @NOTE: https://yarnpkg.com/lang/en/docs/cli/version/
|
||||||
|
// require(./package.json) can run into caching issues, this re-reads from file everytime on release
|
||||||
|
let packageJSON = JSON.parse(fs.readFileSync('./package.json'));
|
||||||
|
const newVersion = packageJSON.version;
|
||||||
|
|
||||||
|
if (!newVersion || newVersion === '') {
|
||||||
|
console.log(`Invalid version: ${newVersion}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\nCreating release for ${newVersion}...`);
|
||||||
|
|
||||||
|
const githubToken = process.env.GST_TOKEN;
|
||||||
|
|
||||||
|
if (!githubToken) {
|
||||||
|
console.log('Please configure your environment with a GitHub token located in GST_TOKEN');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await inquirer.prompt([{
|
||||||
|
type: 'input',
|
||||||
|
name: 'compatibleWithGhost',
|
||||||
|
message: 'Which version of Ghost is it compatible with?',
|
||||||
|
default: '5.0.0'
|
||||||
|
}]);
|
||||||
|
|
||||||
|
const compatibleWithGhost = result.compatibleWithGhost;
|
||||||
|
|
||||||
|
const releasesResponse = await releaseUtils.releases.get({
|
||||||
|
userAgent: 'Casper',
|
||||||
|
uri: `https://api.github.com/repos/${REPO_READONLY}/releases`
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!releasesResponse || !releasesResponse) {
|
||||||
|
console.log('No releases found. Skipping...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let previousVersion = releasesResponse[0].tag_name || releasesResponse[0].name;
|
||||||
|
console.log(`Previous version: ${previousVersion}`);
|
||||||
|
|
||||||
|
const changelog = new releaseUtils.Changelog({
|
||||||
|
changelogPath: CHANGELOG_PATH,
|
||||||
|
folder: path.join(process.cwd(), '.')
|
||||||
|
});
|
||||||
|
|
||||||
|
changelog
|
||||||
|
.write({
|
||||||
|
githubRepoPath: `https://github.com/${REPO}`,
|
||||||
|
lastVersion: previousVersion
|
||||||
|
})
|
||||||
|
.sort()
|
||||||
|
.clean();
|
||||||
|
|
||||||
|
const newReleaseResponse = await releaseUtils.releases.create({
|
||||||
|
draft: true,
|
||||||
|
preRelease: false,
|
||||||
|
tagName: 'v' + newVersion,
|
||||||
|
releaseName: newVersion,
|
||||||
|
userAgent: 'Casper',
|
||||||
|
uri: `https://api.github.com/repos/${REPO}/releases`,
|
||||||
|
github: {
|
||||||
|
token: githubToken
|
||||||
|
},
|
||||||
|
content: [`**Compatible with Ghost ≥ ${compatibleWithGhost}**\n\n`],
|
||||||
|
changelogPath: CHANGELOG_PATH
|
||||||
|
});
|
||||||
|
console.log(`\nRelease draft generated: ${newReleaseResponse.releaseUrl}\n`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
};
|
65
index.hbs
@ -1,27 +1,54 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
|
{{!-- The tag above means: insert everything in this file
|
||||||
|
into the {body} of the default.hbs template --}}
|
||||||
|
|
||||||
{{!-- The big featured header --}}
|
<div class="site-header-content outer{{#match @custom.header_style "Left aligned"}} left-aligned{{/match}}{{#unless @custom.show_publication_cover}}{{#match @custom.header_style "Hidden"}} no-content{{/match}}{{/unless}}">
|
||||||
<header class="main-header {{#if @blog.cover}}" style="background-image: url({{@blog.cover}}){{else}}no-cover{{/if}}">
|
|
||||||
<nav class="main-nav overlay clearfix">
|
{{#if @custom.show_publication_cover}}
|
||||||
{{#if @blog.logo}}<a class="blog-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>{{/if}}
|
{{#if @site.cover_image}}
|
||||||
{{#if @blog.navigation}}
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
<a class="menu-button icon-menu" href="#"><span class="word">Menu</span></a>
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
|
<img class="site-header-cover"
|
||||||
|
srcset="{{img_url @site.cover_image size="s"}} 300w,
|
||||||
|
{{img_url @site.cover_image size="m"}} 600w,
|
||||||
|
{{img_url @site.cover_image size="l"}} 1000w,
|
||||||
|
{{img_url @site.cover_image size="xl"}} 2000w"
|
||||||
|
sizes="100vw"
|
||||||
|
src="{{img_url @site.cover_image size="xl"}}"
|
||||||
|
alt="{{@site.title}}"
|
||||||
|
/>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</nav>
|
{{/if}}
|
||||||
<div class="vertical">
|
|
||||||
<div class="main-header-content inner">
|
{{#match @custom.header_style "!=" "Hidden"}}
|
||||||
<h1 class="page-title">{{@blog.title}}</h1>
|
<div class="site-header-inner inner">
|
||||||
<h2 class="page-description">{{@blog.description}}</h2>
|
{{#match @custom.navigation_layout "Logo on cover"}}
|
||||||
|
{{#if @site.logo}}
|
||||||
|
<img class="site-logo" src="{{@site.logo}}" alt="{{@site.title}}">
|
||||||
|
{{else}}
|
||||||
|
<h1 class="site-title">{{@site.title}}</h1>
|
||||||
|
{{/if}}
|
||||||
|
{{/match}}
|
||||||
|
{{#if @site.description}}
|
||||||
|
<p class="site-description">{{@site.description}}</p>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
{{/match}}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{!-- The main content area --}}
|
||||||
|
<main id="site-main" class="site-main outer">
|
||||||
|
<div class="inner posts">
|
||||||
|
|
||||||
|
<div class="post-feed">
|
||||||
|
{{#foreach posts}}
|
||||||
|
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/foreach}}
|
||||||
</div>
|
</div>
|
||||||
<a class="scroll-down icon-arrow-left" href="#content" data-offset="-45"><span class="hidden">Scroll Down</span></a>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{{!-- The main content area on the homepage --}}
|
{{pagination}}
|
||||||
<main id="content" class="content" role="main">
|
|
||||||
|
|
||||||
{{!-- The tag below includes the post loop - partials/loop.hbs --}}
|
|
||||||
{{> "loop"}}
|
|
||||||
|
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
157
package.json
@ -1,36 +1,179 @@
|
|||||||
{
|
{
|
||||||
"name": "casper",
|
"name": "casper",
|
||||||
"description": "The default personal blogging theme for Ghost. Beautiful, minimal and responsive.",
|
"description": "A clean, minimal default theme for the Ghost publishing platform",
|
||||||
"demo": "https://demo.ghost.io",
|
"demo": "https://demo.ghost.io",
|
||||||
"version": "1.3.6",
|
"version": "5.9.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"ghost": ">=0.9.0 <1.0.0"
|
"ghost": ">=5.0.0"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"screenshots": {
|
"screenshots": {
|
||||||
"desktop": "assets/screenshot-desktop.jpg",
|
"desktop": "assets/screenshot-desktop.jpg",
|
||||||
"mobile": "assets/screenshot-mobile.jpg"
|
"mobile": "assets/screenshot-mobile.jpg"
|
||||||
},
|
},
|
||||||
|
"scripts": {
|
||||||
|
"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",
|
||||||
|
"postship": "git fetch && gulp release"
|
||||||
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Ghost Foundation",
|
"name": "Ghost Foundation",
|
||||||
"email": "hello@ghost.org",
|
"email": "hello@ghost.org",
|
||||||
"url": "https://ghost.org"
|
"url": "https://ghost.org/"
|
||||||
},
|
},
|
||||||
"gpm": {
|
"gpm": {
|
||||||
"type": "theme",
|
"type": "theme",
|
||||||
"categories": [
|
"categories": [
|
||||||
"Minimal",
|
"Minimal",
|
||||||
"Personal Blogs"
|
"Magazine"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"ghost",
|
"ghost",
|
||||||
"theme"
|
"theme",
|
||||||
|
"ghost-theme"
|
||||||
],
|
],
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/TryGhost/Casper.git"
|
"url": "https://github.com/TryGhost/Casper.git"
|
||||||
},
|
},
|
||||||
"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": {
|
||||||
|
"@tryghost/release-utils": "0.8.1",
|
||||||
|
"autoprefixer": "10.4.7",
|
||||||
|
"beeper": "2.1.0",
|
||||||
|
"cssnano": "5.1.12",
|
||||||
|
"gscan": "4.48.0",
|
||||||
|
"gulp": "4.0.2",
|
||||||
|
"gulp-concat": "2.6.1",
|
||||||
|
"gulp-livereload": "4.0.2",
|
||||||
|
"gulp-postcss": "9.0.1",
|
||||||
|
"gulp-uglify": "3.0.2",
|
||||||
|
"gulp-zip": "5.1.0",
|
||||||
|
"inquirer": "8.2.4",
|
||||||
|
"postcss": "8.2.13",
|
||||||
|
"postcss-color-mod-function": "3.0.3",
|
||||||
|
"postcss-easy-import": "4.0.0",
|
||||||
|
"pump": "3.0.0"
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
"defaults"
|
||||||
|
],
|
||||||
|
"config": {
|
||||||
|
"posts_per_page": 25,
|
||||||
|
"image_sizes": {
|
||||||
|
"xxs": {
|
||||||
|
"width": 30
|
||||||
|
},
|
||||||
|
"xs": {
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"width": 300
|
||||||
|
},
|
||||||
|
"m": {
|
||||||
|
"width": 600
|
||||||
|
},
|
||||||
|
"l": {
|
||||||
|
"width": 1000
|
||||||
|
},
|
||||||
|
"xl": {
|
||||||
|
"width": 2000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"card_assets": true,
|
||||||
|
"custom": {
|
||||||
|
"navigation_layout": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Logo on cover",
|
||||||
|
"Logo in the middle",
|
||||||
|
"Stacked"
|
||||||
|
],
|
||||||
|
"default": "Logo on cover"
|
||||||
|
},
|
||||||
|
"title_font": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Modern sans-serif",
|
||||||
|
"Elegant serif"
|
||||||
|
],
|
||||||
|
"default": "Modern sans-serif"
|
||||||
|
},
|
||||||
|
"body_font": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Modern sans-serif",
|
||||||
|
"Elegant serif"
|
||||||
|
],
|
||||||
|
"default": "Elegant serif"
|
||||||
|
},
|
||||||
|
"show_publication_cover": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true,
|
||||||
|
"group": "homepage"
|
||||||
|
},
|
||||||
|
"header_style": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Center aligned",
|
||||||
|
"Left aligned",
|
||||||
|
"Hidden"
|
||||||
|
],
|
||||||
|
"default": "Center aligned",
|
||||||
|
"group": "homepage"
|
||||||
|
},
|
||||||
|
"feed_layout": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Classic",
|
||||||
|
"Grid",
|
||||||
|
"List"
|
||||||
|
],
|
||||||
|
"default": "Classic",
|
||||||
|
"group": "homepage"
|
||||||
|
},
|
||||||
|
"color_scheme": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Light",
|
||||||
|
"Dark",
|
||||||
|
"Auto"
|
||||||
|
],
|
||||||
|
"default": "Light"
|
||||||
|
},
|
||||||
|
"post_image_style": {
|
||||||
|
"type": "select",
|
||||||
|
"options": [
|
||||||
|
"Wide",
|
||||||
|
"Full",
|
||||||
|
"Small",
|
||||||
|
"Hidden"
|
||||||
|
],
|
||||||
|
"default": "Wide",
|
||||||
|
"group": "post"
|
||||||
|
},
|
||||||
|
"email_signup_text": {
|
||||||
|
"type": "text",
|
||||||
|
"default": "Sign up for more like this.",
|
||||||
|
"group": "post"
|
||||||
|
},
|
||||||
|
"show_recent_posts_footer": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true,
|
||||||
|
"group": "post"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"renovate": {
|
||||||
|
"extends": [
|
||||||
|
"@tryghost:theme"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
56
page.hbs
@ -1,31 +1,47 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
|
|
||||||
{{!-- This is a page template. A page outputs content just like any other post, and has all the same
|
{{!-- The tag above means: insert everything in this file
|
||||||
attributes by default, but you can also customise it to behave differently if you prefer. --}}
|
into the {body} tag of the default.hbs template --}}
|
||||||
|
|
||||||
|
|
||||||
{{!-- Everything inside the #post tags pulls data from the page --}}
|
|
||||||
{{#post}}
|
{{#post}}
|
||||||
|
{{!-- Everything inside the #post block pulls data from the page --}}
|
||||||
|
|
||||||
<header class="main-header post-head {{#if image}}" style="background-image: url({{image}}){{else}}no-cover{{/if}}">
|
<main id="site-main" class="site-main">
|
||||||
<nav class="main-nav {{#if image}}overlay{{/if}} clearfix">
|
<article class="article {{post_class}}">
|
||||||
{{#if @blog.logo}}<a class="blog-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>{{/if}}
|
|
||||||
{{#if @blog.navigation}}
|
|
||||||
<a class="menu-button icon-menu" href="#"><span class="word">Menu</span></a>
|
|
||||||
{{/if}}
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main class="content" role="main">
|
{{#match @page.show_title_and_feature_image}}
|
||||||
<article class="{{post_class}}">
|
<header class="article-header gh-canvas">
|
||||||
|
|
||||||
|
<h1 class="article-title">{{title}}</h1>
|
||||||
|
|
||||||
|
{{#if feature_image}}
|
||||||
|
<figure class="article-image">
|
||||||
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
|
<img
|
||||||
|
srcset="{{img_url feature_image size="s"}} 300w,
|
||||||
|
{{img_url feature_image size="m"}} 600w,
|
||||||
|
{{img_url feature_image size="l"}} 1000w,
|
||||||
|
{{img_url feature_image size="xl"}} 2000w"
|
||||||
|
sizes="(min-width: 1400px) 1400px, 92vw"
|
||||||
|
src="{{img_url feature_image size="xl"}}"
|
||||||
|
alt="{{#if feature_image_alt}}{{feature_image_alt}}{{else}}{{title}}{{/if}}"
|
||||||
|
/>
|
||||||
|
{{#if feature_image_caption}}
|
||||||
|
<figcaption>{{feature_image_caption}}</figcaption>
|
||||||
|
{{/if}}
|
||||||
|
</figure>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
<header class="post-header">
|
|
||||||
<h1 class="post-title">{{title}}</h1>
|
|
||||||
</header>
|
</header>
|
||||||
|
{{/match}}
|
||||||
|
|
||||||
<section class="post-content">
|
<section class="gh-content gh-canvas">
|
||||||
{{content}}
|
{{content}}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
</article>
|
</article>
|
||||||
</main>
|
</main>
|
||||||
{{/post}}
|
|
||||||
|
{{/post}}
|
1
partials/icons/avatar.hbs
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M3.513 18.998C4.749 15.504 8.082 13 12 13s7.251 2.504 8.487 5.998C18.47 21.442 15.417 23 12 23s-6.47-1.558-8.487-4.002zM12 12c2.21 0 4-2.79 4-5s-1.79-4-4-4-4 1.79-4 4 1.79 5 4 5z" fill="#FFF"/></g></svg>
|
After Width: | Height: | Size: 308 B |
3
partials/icons/bluesky.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.8868 11.3624C10.8107 9.1288 7.87874 4.96656 5.15331 2.91348C3.18679 1.43245 0 0.28612 0 3.93314C0 4.66121 0.416033 10.0519 0.660462 10.927C1.50889 13.9693 4.60131 14.7453 7.352 14.2758C2.54378 15.0967 1.32092 17.8158 3.9624 20.535C8.97901 25.6994 11.1728 19.2393 11.7346 17.584C11.8385 17.2784 11.8868 17.1365 11.8868 17.262C11.8868 17.1365 11.9351 17.2784 12.0391 17.584C12.6008 19.2393 14.7946 25.6994 19.8113 20.535C22.4527 17.8158 21.2298 15.0967 16.4217 14.2758C19.1723 14.7453 22.2648 13.9693 23.1132 10.927C23.3576 10.0519 23.7736 4.66121 23.7736 3.93314C23.7736 0.28612 20.5872 1.43245 18.6204 2.91348C15.8949 4.96656 12.963 9.1288 11.8868 11.3624Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 789 B |
1
partials/icons/facebook.hbs
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M23.9981 11.9991C23.9981 5.37216 18.626 0 11.9991 0C5.37216 0 0 5.37216 0 11.9991C0 17.9882 4.38789 22.9522 10.1242 23.8524V15.4676H7.07758V11.9991H10.1242V9.35553C10.1242 6.34826 11.9156 4.68714 14.6564 4.68714C15.9692 4.68714 17.3424 4.92149 17.3424 4.92149V7.87439H15.8294C14.3388 7.87439 13.8739 8.79933 13.8739 9.74824V11.9991H17.2018L16.6698 15.4676H13.8739V23.8524C19.6103 22.9522 23.9981 17.9882 23.9981 11.9991Z"/></svg>
|
After Width: | Height: | Size: 531 B |
3
partials/icons/fire.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.49365 4.58752C3.53115 6.03752 2.74365 7.70002 2.74365 9.25002C2.74365 10.6424 3.29678 11.9778 4.28134 12.9623C5.26591 13.9469 6.60127 14.5 7.99365 14.5C9.38604 14.5 10.7214 13.9469 11.706 12.9623C12.6905 11.9778 13.2437 10.6424 13.2437 9.25002C13.2437 6.00002 10.9937 3.50002 9.16865 1.68127L6.99365 6.25002L4.49365 4.58752Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 538 B |
5
partials/icons/instagram.hbs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M12 2.982C14.937 2.982 15.285 2.993 16.445 3.046C17.1424 3.05412 17.8331 3.18233 18.487 3.425C18.965 3.60111 19.3973 3.88237 19.752 4.248C20.1176 4.60269 20.3989 5.035 20.575 5.513C20.8177 6.16685 20.9459 6.85762 20.954 7.555C21.007 8.715 21.018 9.063 21.018 12C21.018 14.937 21.007 15.285 20.954 16.445C20.9459 17.1424 20.8177 17.8331 20.575 18.487C20.3919 18.9615 20.1116 19.3924 19.752 19.752C19.3924 20.1116 18.9615 20.3919 18.487 20.575C17.8331 20.8177 17.1424 20.9459 16.445 20.954C15.285 21.007 14.937 21.018 12 21.018C9.063 21.018 8.715 21.007 7.555 20.954C6.85762 20.9459 6.16685 20.8177 5.513 20.575C5.035 20.3989 4.60269 20.1176 4.248 19.752C3.88237 19.3973 3.60111 18.965 3.425 18.487C3.18233 17.8331 3.05412 17.1424 3.046 16.445C2.993 15.285 2.982 14.937 2.982 12C2.982 9.063 2.993 8.715 3.046 7.555C3.05412 6.85762 3.18233 6.16685 3.425 5.513C3.60111 5.035 3.88237 4.60269 4.248 4.248C4.60269 3.88237 5.035 3.60111 5.513 3.425C6.16685 3.18233 6.85762 3.05412 7.555 3.046C8.715 2.993 9.063 2.982 12 2.982ZM12 1C9.013 1 8.638 1.013 7.465 1.066C6.55258 1.08486 5.6499 1.25762 4.795 1.577C4.06355 1.86017 3.3994 2.29319 2.84521 2.84824C2.29102 3.40329 1.85904 4.06811 1.577 4.8C1.25762 5.6549 1.08486 6.55758 1.066 7.47C1.013 8.638 1 9.013 1 12C1 14.987 1.013 15.362 1.066 16.535C1.08486 17.4474 1.25762 18.3501 1.577 19.205C1.86017 19.9365 2.29319 20.6006 2.84824 21.1548C3.40329 21.709 4.06811 22.141 4.8 22.423C5.6549 22.7424 6.55758 22.9151 7.47 22.934C8.638 22.987 9.013 23 12 23C14.987 23 15.362 22.987 16.535 22.934C17.4474 22.9151 18.3501 22.7424 19.205 22.423C19.9365 22.1398 20.6006 21.7068 21.1548 21.1518C21.709 20.5967 22.141 19.9319 22.423 19.2C22.7424 18.3451 22.9151 17.4424 22.934 16.53C22.987 15.362 23 14.987 23 12C23 9.013 22.987 8.638 22.934 7.465C22.9151 6.55258 22.7424 5.6499 22.423 4.795C22.1398 4.06355 21.7068 3.3994 21.1518 2.84521C20.5967 2.29102 19.9319 1.85904 19.2 1.577C18.3451 1.25762 17.4424 1.08486 16.53 1.066C15.362 1.013 14.987 1 12 1Z" fill="currentColor"/>
|
||||||
|
<path d="M11.9996 6.35107C10.8823 6.35107 9.79015 6.68238 8.86117 7.3031C7.9322 7.92382 7.20815 8.80608 6.78059 9.8383C6.35303 10.8705 6.24116 12.0063 6.45913 13.1021C6.6771 14.1979 7.21512 15.2045 8.00514 15.9945C8.79517 16.7845 9.80172 17.3226 10.8975 17.5405C11.9933 17.7585 13.1291 17.6466 14.1614 17.2191C15.1936 16.7915 16.0758 16.0675 16.6966 15.1385C17.3173 14.2095 17.6486 13.1173 17.6486 12.0001C17.6486 10.5019 17.0534 9.06502 15.994 8.00563C14.9346 6.94624 13.4978 6.35107 11.9996 6.35107ZM11.9996 15.6671C11.2743 15.6671 10.5653 15.452 9.96231 15.0491C9.35928 14.6461 8.88927 14.0734 8.61172 13.4034C8.33418 12.7333 8.26156 11.996 8.40305 11.2847C8.54454 10.5734 8.89379 9.91995 9.40663 9.40711C9.91947 8.89427 10.5729 8.54503 11.2842 8.40353C11.9955 8.26204 12.7328 8.33466 13.4029 8.61221C14.0729 8.88975 14.6457 9.35976 15.0486 9.9628C15.4515 10.5658 15.6666 11.2748 15.6666 12.0001C15.6666 12.9726 15.2802 13.9053 14.5925 14.593C13.9049 15.2807 12.9721 15.6671 11.9996 15.6671Z" fill="currentColor"/>
|
||||||
|
<path d="M17.8718 7.44811C18.6008 7.44811 19.1918 6.85712 19.1918 6.12811C19.1918 5.39909 18.6008 4.80811 17.8718 4.80811C17.1427 4.80811 16.5518 5.39909 16.5518 6.12811C16.5518 6.85712 17.1427 7.44811 17.8718 7.44811Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
3
partials/icons/linkedin.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M22.2 0H1.8C1.32261 0 0.864773 0.18964 0.527213 0.527213C0.18964 0.864773 0 1.32261 0 1.8V22.2C0 22.6773 0.18964 23.1352 0.527213 23.4728C0.864773 23.8104 1.32261 24 1.8 24H22.2C22.6773 24 23.1352 23.8104 23.4728 23.4728C23.8104 23.1352 24 22.6773 24 22.2V1.8C24 1.32261 23.8104 0.864773 23.4728 0.527213C23.1352 0.18964 22.6773 0 22.2 0ZM7.2 20.4H3.6V9.6H7.2V20.4ZM5.4 7.5C4.98741 7.48821 4.58747 7.35509 4.25011 7.11729C3.91275 6.87949 3.65293 6.54755 3.50316 6.16293C3.35337 5.77832 3.32025 5.35809 3.40793 4.95476C3.4956 4.55144 3.7002 4.18288 3.99613 3.89517C4.29208 3.60745 4.66624 3.41332 5.07188 3.33704C5.47752 3.26075 5.89664 3.30569 6.27688 3.46625C6.65712 3.6268 6.98163 3.89585 7.20983 4.23977C7.43804 4.58371 7.55983 4.98725 7.56 5.4C7.55052 5.96441 7.318 6.50213 6.91327 6.89564C6.50852 7.28913 5.96447 7.50643 5.4 7.5ZM20.4 20.4H16.8V14.712C16.8 13.008 16.08 12.396 15.144 12.396C14.8696 12.4143 14.6015 12.4865 14.3551 12.6088C14.1087 12.7309 13.8888 12.9007 13.7081 13.108C13.5276 13.3155 13.3896 13.5565 13.3024 13.8173C13.2152 14.0781 13.1804 14.3536 13.2 14.628C13.194 14.6839 13.194 14.7401 13.2 14.796V20.4H9.6V9.6H13.08V11.16C13.4311 10.626 13.9133 10.1911 14.4807 9.89693C15.048 9.6028 15.6813 9.4592 16.32 9.48C18.18 9.48 20.352 10.512 20.352 13.872L20.4 20.4Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
11
partials/icons/loader.hbs
Normal 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>
|
After Width: | Height: | Size: 923 B |
5
partials/icons/lock.hbs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.25 6.875H3.75C3.40482 6.875 3.125 7.15482 3.125 7.5V16.25C3.125 16.5952 3.40482 16.875 3.75 16.875H16.25C16.5952 16.875 16.875 16.5952 16.875 16.25V7.5C16.875 7.15482 16.5952 6.875 16.25 6.875Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||||
|
<path d="M7.1875 6.875V4.0625C7.1875 3.31658 7.48382 2.60121 8.01126 2.07376C8.53871 1.54632 9.25408 1.25 10 1.25C10.7459 1.25 11.4613 1.54632 11.9887 2.07376C12.5162 2.60121 12.8125 3.31658 12.8125 4.0625V6.875" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||||
|
<path d="M10 13.125C10.6904 13.125 11.25 12.5654 11.25 11.875C11.25 11.1846 10.6904 10.625 10 10.625C9.30964 10.625 8.75 11.1846 8.75 11.875C8.75 12.5654 9.30964 13.125 10 13.125Z" fill="currentColor"></path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 932 B |
3
partials/icons/mastodon.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.68 18.2926C19.6352 17.9336 22.2083 16.0807 22.5317 14.3878C23.0412 11.7208 22.9992 7.87958 22.9992 7.87958C22.9992 2.67325 19.647 1.14719 19.647 1.14719C17.9569 0.357269 15.0545 0.0250852 12.0393 0H11.9652C8.94993 0.0250852 6.04953 0.357269 4.35923 1.14719C4.35923 1.14719 1.00697 2.67325 1.00697 7.87958C1.00697 8.19521 1.00537 8.52719 1.0037 8.87279C0.999066 9.83259 0.993924 10.8974 1.02121 12.0089C1.14294 17.1004 1.93853 22.1184 6.56468 23.3644C8.69769 23.9389 10.529 24.0591 12.004 23.9766C14.6787 23.8257 16.1801 23.0053 16.1801 23.0053L16.092 21.0305C16.092 21.0305 14.1806 21.6438 12.0339 21.5691C9.90716 21.4949 7.66194 21.3357 7.31796 18.6786C7.28619 18.4452 7.2703 18.1957 7.2703 17.9336C7.2703 17.9336 9.35808 18.4528 12.004 18.5762C13.6218 18.6517 15.1391 18.4797 16.68 18.2926ZM19.045 14.5875V8.28346C19.045 6.99507 18.7227 5.97123 18.0752 5.21376C17.4074 4.45629 16.5328 4.06799 15.4474 4.06799C14.1913 4.06799 13.2402 4.55922 12.6114 5.54181L12 6.58465L11.3886 5.54181C10.7598 4.55922 9.80863 4.06799 8.55266 4.06799C7.46709 4.06799 6.59259 4.45629 5.92483 5.21376C5.27728 5.97123 4.9549 6.99507 4.9549 8.28346V14.5875H7.40928V8.46875C7.40928 7.17894 7.94259 6.52427 9.00936 6.52427C10.1888 6.52427 10.7801 7.30087 10.7801 8.8365V12.1856H13.22V8.8365C13.22 7.30087 13.8111 6.52427 14.9906 6.52427C16.0573 6.52427 16.5907 7.17894 16.5907 8.46875V14.5875H19.045Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
1
partials/icons/rss.hbs
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="6.18" cy="17.82" r="2.18"/><path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"/></svg>
|
After Width: | Height: | Size: 263 B |
1
partials/icons/search.hbs
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg>
|
After Width: | Height: | Size: 248 B |
3
partials/icons/threads.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M17.5609 11.1236C17.4575 11.074 17.3526 11.0263 17.2462 10.9806C17.0611 7.56727 15.1967 5.61312 12.0661 5.59312C12.0519 5.59304 12.0379 5.59304 12.0237 5.59304C10.1512 5.59304 8.59388 6.39262 7.63537 7.84759L9.35708 9.0291C10.0732 7.94229 11.1969 7.7106 12.0245 7.7106C12.034 7.7106 12.0436 7.7106 12.0531 7.71068C13.0839 7.71726 13.8618 8.01708 14.3652 8.60175C14.7315 9.02742 14.9765 9.61563 15.0978 10.3579C14.1839 10.2026 13.1956 10.1548 12.139 10.2155C9.16261 10.387 7.24916 12.1235 7.37767 14.5365C7.44288 15.7605 8.05242 16.8135 9.09393 17.5014C9.97446 18.0829 11.1087 18.3673 12.2874 18.3029C13.844 18.2175 15.0652 17.6234 15.9171 16.5371C16.564 15.712 16.9732 14.6429 17.154 13.2958C17.8957 13.7436 18.4455 14.333 18.7492 15.0414C19.2655 16.2459 19.2956 18.225 17.6814 19.8385C16.267 21.2521 14.5669 21.8635 11.9976 21.8824C9.14756 21.8613 6.9921 20.9468 5.59068 19.1646C4.27836 17.4958 3.60015 15.0852 3.57484 12C3.60015 8.91472 4.27836 6.5042 5.59068 4.83533C6.9921 3.05312 9.14752 2.13875 11.9976 2.11756C14.8684 2.13891 17.0614 3.05767 18.5164 4.8485C19.2299 5.7267 19.7677 6.8311 20.1224 8.11879L22.14 7.58028C21.7102 5.99527 21.0338 4.62946 20.1135 3.49675C18.248 1.20083 15.5199 0.024398 12.0046 0H11.9906C8.48249 0.0243044 5.78485 1.20522 3.97257 3.50991C2.3599 5.5608 1.52804 8.41446 1.50008 11.9916L1.5 12L1.50008 12.0084C1.52804 15.5855 2.3599 18.4393 3.97257 20.4901C5.78485 22.7947 8.48249 23.9758 11.9906 24H12.0046C15.1235 23.9783 17.3219 23.1615 19.1329 21.3513C21.5024 18.9833 21.431 16.0149 20.6501 14.1927C20.0898 12.8859 19.0216 11.8245 17.5609 11.1236ZM12.1759 16.1884C10.8715 16.2619 9.51623 15.6761 9.44937 14.4215C9.39984 13.4913 10.1111 12.4533 12.256 12.3296C12.5016 12.3154 12.7427 12.3085 12.9794 12.3085C13.7585 12.3085 14.4874 12.3842 15.1499 12.5292C14.9028 15.6169 13.4532 16.1183 12.1759 16.1884Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
3
partials/icons/tiktok.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10.1891 8.937V13.059C9.66997 12.9221 9.12673 12.9034 8.59942 13.0044C8.07212 13.1054 7.57419 13.3234 7.14234 13.6424C6.7105 13.9613 6.35575 14.3732 6.10423 14.8475C5.85272 15.3218 5.71085 15.8466 5.6891 16.383C5.65937 16.8449 5.72887 17.3078 5.89293 17.7405C6.057 18.1733 6.31182 18.5659 6.64027 18.892C6.96872 19.2181 7.36318 19.4701 7.79713 19.631C8.23108 19.7919 8.69446 19.8581 9.1561 19.825C9.62242 19.8608 10.0909 19.7949 10.5293 19.6319C10.9677 19.4689 11.3654 19.2126 11.6951 18.8809C12.0247 18.5491 12.2784 18.1498 12.4387 17.7104C12.5989 17.271 12.6618 16.8021 12.6231 16.336V0H16.7001C17.3931 4.315 19.5511 5.316 22.4401 5.778V9.913C20.438 9.74881 18.5067 9.09645 16.8151 8.013V16.18C16.8151 19.88 14.6251 24 9.1881 24C8.16806 23.9955 7.15918 23.7875 6.22058 23.3881C5.28199 22.9886 4.43258 22.4059 3.72213 21.6739C3.01168 20.942 2.4545 20.0755 2.08325 19.1254C1.712 18.1754 1.53414 17.1607 1.5601 16.141C1.59241 15.0794 1.84936 14.0366 2.31401 13.0815C2.77866 12.1265 3.44047 11.2807 4.2558 10.6C5.07114 9.9193 6.02148 9.41915 7.0442 9.1325C8.06691 8.84586 9.13876 8.77923 10.1891 8.937Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
3
partials/icons/twitter.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.2439 2.25H21.5519L14.3249 10.51L22.8269 21.75H16.1699L10.9559 14.933L4.98991 21.75H1.67991L9.40991 12.915L1.25391 2.25H8.07991L12.7929 8.481L18.2439 2.25ZM17.0829 19.77H18.9159L7.08391 4.126H5.11691L17.0829 19.77Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 346 B |
3
partials/icons/youtube.hbs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.3763 2.59736C22.4096 2.92662 23.2216 3.89324 23.4982 5.12324C23.9979 7.35042 24 12 24 12C24 12 24 16.6496 23.4982 18.8768C23.2216 20.1068 22.4096 21.0734 21.3763 21.4026C19.5055 22 12 22 12 22C12 22 4.49456 22 2.62363 21.4026C1.59039 21.0734 0.7784 20.1068 0.501806 18.8768C0 16.6496 0 12 0 12C0 12 0 7.35042 0.501806 5.12324C0.7784 3.89324 1.59039 2.92662 2.62363 2.59736C4.49456 2 12 2 12 2C12 2 19.5055 2 21.3763 2.59736ZM16.0153 12.0004L9.48326 15.8822V8.11841L16.0153 12.0004Z" fill="currentColor"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 654 B |
41
partials/lightbox.hbs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||||
|
<div class="pswp__bg"></div>
|
||||||
|
|
||||||
|
<div class="pswp__scroll-wrap">
|
||||||
|
<div class="pswp__container">
|
||||||
|
<div class="pswp__item"></div>
|
||||||
|
<div class="pswp__item"></div>
|
||||||
|
<div class="pswp__item"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pswp__ui pswp__ui--hidden">
|
||||||
|
<div class="pswp__top-bar">
|
||||||
|
<div class="pswp__counter"></div>
|
||||||
|
|
||||||
|
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
|
||||||
|
<button class="pswp__button pswp__button--share" title="Share"></button>
|
||||||
|
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
|
||||||
|
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
|
||||||
|
|
||||||
|
<div class="pswp__preloader">
|
||||||
|
<div class="pswp__preloader__icn">
|
||||||
|
<div class="pswp__preloader__cut">
|
||||||
|
<div class="pswp__preloader__donut"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
|
||||||
|
<div class="pswp__share-tooltip"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"></button>
|
||||||
|
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"></button>
|
||||||
|
|
||||||
|
<div class="pswp__caption">
|
||||||
|
<div class="pswp__caption__center"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -1,25 +0,0 @@
|
|||||||
{{!-- Previous/next page links - only displayed on page 2+ --}}
|
|
||||||
<div class="extra-pagination inner">
|
|
||||||
{{pagination}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{!-- This is the post loop - each post will be output using this markup --}}
|
|
||||||
{{#foreach posts}}
|
|
||||||
<article class="{{post_class}}">
|
|
||||||
<header class="post-header">
|
|
||||||
<h2 class="post-title"><a href="{{url}}">{{title}}</a></h2>
|
|
||||||
</header>
|
|
||||||
<section class="post-excerpt">
|
|
||||||
<p>{{excerpt words="26"}} <a class="read-more" href="{{url}}">»</a></p>
|
|
||||||
</section>
|
|
||||||
<footer class="post-meta">
|
|
||||||
{{#if author.image}}<img class="author-thumb" src="{{author.image}}" alt="{{author.name}}" nopin="nopin" />{{/if}}
|
|
||||||
{{author}}
|
|
||||||
{{tags prefix=" on "}}
|
|
||||||
<time class="post-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="DD MMMM YYYY"}}</time>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
{{/foreach}}
|
|
||||||
|
|
||||||
{{!-- Previous/next page links - displayed on every page --}}
|
|
||||||
{{pagination}}
|
|
@ -1,17 +0,0 @@
|
|||||||
<div class="nav">
|
|
||||||
<h3 class="nav-title">Menu</h3>
|
|
||||||
<a href="#" class="nav-close">
|
|
||||||
<span class="hidden">Close</span>
|
|
||||||
</a>
|
|
||||||
<ul>
|
|
||||||
{{#foreach navigation}}
|
|
||||||
<li class="nav-{{slug}}{{#if current}} nav-current{{/if}}"><a href="{{url absolute="true"}}">{{label}}</a></li>
|
|
||||||
{{/foreach}}
|
|
||||||
</ul>
|
|
||||||
{{#if @labs.subscribers}}
|
|
||||||
<a class="subscribe-button" href="{{@blog.url}}/subscribe/">Subscribe</a>
|
|
||||||
{{else}}
|
|
||||||
<a class="subscribe-button icon-feed" href="{{@blog.url}}/rss/">Subscribe</a>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
<span class="nav-cover"></span>
|
|
78
partials/post-card.hbs
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{{!-- This is a partial file used to generate a post "card"
|
||||||
|
which templates loop over to generate a list of posts. --}}
|
||||||
|
|
||||||
|
<article class="post-card {{post_class}}{{#match @custom.feed_layout "Classic"}}{{#is "home"}}{{#has index="0"}} post-card-large{{/has}}{{#has index="1,2"}} dynamic{{/has}}{{/is}}{{/match}}{{#match @custom.feed_layout "Grid"}} keep-ratio{{/match}}{{#match @custom.feed_layout "List"}}{{^is "tag, author"}} post-card-large{{/is}}{{/match}}{{#unless access}} post-access-{{visibility}}{{/unless}}">
|
||||||
|
|
||||||
|
{{#if feature_image}}
|
||||||
|
<a class="post-card-image-link" href="{{url}}">
|
||||||
|
|
||||||
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
|
<img class="post-card-image"
|
||||||
|
srcset="{{img_url feature_image size="s"}} 300w,
|
||||||
|
{{img_url feature_image size="m"}} 600w,
|
||||||
|
{{img_url feature_image size="l"}} 1000w,
|
||||||
|
{{img_url feature_image size="xl"}} 2000w"
|
||||||
|
sizes="(max-width: 1000px) 400px, 800px"
|
||||||
|
src="{{img_url feature_image size="m"}}"
|
||||||
|
alt="{{#if feature_image_alt}}{{feature_image_alt}}{{else}}{{title}}{{/if}}"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{{#unless access}}
|
||||||
|
{{^has visibility="public"}}
|
||||||
|
<div class="post-card-access">
|
||||||
|
{{> "icons/lock"}}
|
||||||
|
{{#has visibility="members"}}
|
||||||
|
Members only
|
||||||
|
{{else}}
|
||||||
|
Paid-members only
|
||||||
|
{{/has}}
|
||||||
|
</div>
|
||||||
|
{{/has}}
|
||||||
|
{{/unless}}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<div class="post-card-content">
|
||||||
|
|
||||||
|
<a class="post-card-content-link" href="{{url}}">
|
||||||
|
<header class="post-card-header">
|
||||||
|
<div class="post-card-tags">
|
||||||
|
{{#primary_tag}}
|
||||||
|
<span class="post-card-primary-tag">{{name}}</span>
|
||||||
|
{{/primary_tag}}
|
||||||
|
{{#if featured}}
|
||||||
|
<span class="post-card-featured">{{> "icons/fire"}} Featured</span>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<h2 class="post-card-title">
|
||||||
|
{{#unless access}}
|
||||||
|
{{^has visibility="public"}}
|
||||||
|
{{#unless feature_image}}
|
||||||
|
{{> "icons/lock"}}
|
||||||
|
{{/unless}}
|
||||||
|
{{/has}}
|
||||||
|
{{/unless}}
|
||||||
|
{{title}}
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
{{#if excerpt}}
|
||||||
|
<div class="post-card-excerpt">{{excerpt}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<footer class="post-card-meta">
|
||||||
|
<time class="post-card-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="DD MMM YYYY"}}</time>
|
||||||
|
{{#if reading_time}}
|
||||||
|
<span class="post-card-meta-length">{{reading_time}}</span>
|
||||||
|
{{/if}}
|
||||||
|
{{#if @site.comments_enabled}}
|
||||||
|
{{comment_count}}
|
||||||
|
{{/if}}
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</article>
|
212
post.hbs
@ -1,110 +1,140 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
|
|
||||||
{{!-- The comment above "< default" means - insert everything in this file into
|
{{!-- The tag above means: insert everything in this file
|
||||||
the {{{body}}} of the default.hbs template, containing the blog header/footer. --}}
|
into the {body} tag of the default.hbs template --}}
|
||||||
|
|
||||||
|
|
||||||
{{!-- Everything inside the #post tags pulls data from the post --}}
|
|
||||||
{{#post}}
|
{{#post}}
|
||||||
|
{{!-- Everything inside the #post block pulls data from the post --}}
|
||||||
|
|
||||||
<header class="main-header post-head {{#if image}}" style="background-image: url({{image}}){{else}}no-cover{{/if}}">
|
<main id="site-main" class="site-main">
|
||||||
<nav class="main-nav {{#if image}}overlay{{/if}} clearfix">
|
<article class="article {{post_class}} {{#match @custom.post_image_style "Full"}}image-full{{else match @custom.post_image_style "=" "Small"}}image-small{{/match}}">
|
||||||
{{#if @blog.logo}}<a class="blog-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>{{/if}}
|
|
||||||
{{#if @blog.navigation}}
|
<header class="article-header gh-canvas">
|
||||||
<a class="menu-button icon-menu" href="#"><span class="word">Menu</span></a>
|
|
||||||
|
<div class="article-tag post-card-tags">
|
||||||
|
{{#primary_tag}}
|
||||||
|
<span class="post-card-primary-tag">
|
||||||
|
<a href="{{url}}">{{name}}</a>
|
||||||
|
</span>
|
||||||
|
{{/primary_tag}}
|
||||||
|
{{#if featured}}
|
||||||
|
<span class="post-card-featured">{{> "icons/fire"}} Featured</span>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 class="article-title">{{title}}</h1>
|
||||||
|
|
||||||
|
{{#if custom_excerpt}}
|
||||||
|
<p class="article-excerpt">{{custom_excerpt}}</p>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main class="content" role="main">
|
<div class="article-byline">
|
||||||
<article class="{{post_class}}">
|
<section class="article-byline-content">
|
||||||
|
|
||||||
<header class="post-header">
|
<ul class="author-list instapaper_ignore">
|
||||||
<h1 class="post-title">{{title}}</h1>
|
{{#foreach authors}}
|
||||||
<section class="post-meta">
|
<li class="author-list-item">
|
||||||
<time class="post-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="DD MMMM YYYY"}}</time> {{tags prefix=" on "}}
|
{{#if profile_image}}
|
||||||
</section>
|
<a href="{{url}}" class="author-avatar" aria-label="Read more of {{name}}">
|
||||||
</header>
|
<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" aria-label="Read more of {{name}}">{{> "icons/avatar"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
</li>
|
||||||
|
{{/foreach}}
|
||||||
|
</ul>
|
||||||
|
|
||||||
<section class="post-content">
|
<div class="article-byline-meta">
|
||||||
{{content}}
|
<h4 class="author-name">{{authors}}</h4>
|
||||||
</section>
|
<div class="byline-meta-content">
|
||||||
|
<time class="byline-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="DD MMM YYYY"}}</time>
|
||||||
<footer class="post-footer">
|
{{#if reading_time}}
|
||||||
|
<span class="byline-reading-time"><span class="bull">•</span> {{reading_time}}</span>
|
||||||
{{!-- Everything inside the #author tags pulls data from the author --}}
|
{{/if}}
|
||||||
{{#author}}
|
|
||||||
|
|
||||||
{{#if image}}
|
|
||||||
<figure class="author-image">
|
|
||||||
<a class="img" href="{{url}}" style="background-image: url({{image}})"><span class="hidden">{{name}}'s Picture</span></a>
|
|
||||||
</figure>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<section class="author">
|
|
||||||
<h4><a href="{{url}}">{{name}}</a></h4>
|
|
||||||
|
|
||||||
{{#if bio}}
|
|
||||||
<p>{{bio}}</p>
|
|
||||||
{{else}}
|
|
||||||
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
|
|
||||||
{{/if}}
|
|
||||||
<div class="author-meta">
|
|
||||||
{{#if location}}<span class="author-location icon-location">{{location}}</span>{{/if}}
|
|
||||||
{{#if website}}<span class="author-link icon-link"><a href="{{website}}">{{website}}</a></span>{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
|
|
||||||
{{/author}}
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
<section class="share">
|
{{#match @custom.post_image_style "!=" "Hidden"}}
|
||||||
<h4>Share this post</h4>
|
{{#if feature_image}}
|
||||||
<a class="icon-twitter" href="https://twitter.com/intent/tweet?text={{encode title}}&url={{url absolute="true"}}"
|
<figure class="article-image">
|
||||||
onclick="window.open(this.href, 'twitter-share', 'width=550,height=235');return false;">
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
<span class="hidden">Twitter</span>
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
</a>
|
<img
|
||||||
<a class="icon-facebook" href="https://www.facebook.com/sharer/sharer.php?u={{url absolute="true"}}"
|
srcset="{{img_url feature_image size="s"}} 300w,
|
||||||
onclick="window.open(this.href, 'facebook-share','width=580,height=296');return false;">
|
{{img_url feature_image size="m"}} 600w,
|
||||||
<span class="hidden">Facebook</span>
|
{{img_url feature_image size="l"}} 1000w,
|
||||||
</a>
|
{{img_url feature_image size="xl"}} 2000w"
|
||||||
<a class="icon-google-plus" href="https://plus.google.com/share?url={{url absolute="true"}}"
|
sizes="(min-width: 1400px) 1400px, 92vw"
|
||||||
onclick="window.open(this.href, 'google-plus-share', 'width=490,height=530');return false;">
|
src="{{img_url feature_image size="xl"}}"
|
||||||
<span class="hidden">Google+</span>
|
alt="{{#if feature_image_alt}}{{feature_image_alt}}{{else}}{{title}}{{/if}}"
|
||||||
</a>
|
/>
|
||||||
</section>
|
{{#if feature_image_caption}}
|
||||||
|
<figcaption>{{feature_image_caption}}</figcaption>
|
||||||
|
{{/if}}
|
||||||
|
</figure>
|
||||||
|
{{/if}}
|
||||||
|
{{/match}}
|
||||||
|
|
||||||
{{!-- Email subscribe form at the bottom of the page --}}
|
</header>
|
||||||
{{#if @labs.subscribers}}
|
|
||||||
<section class="gh-subscribe">
|
|
||||||
<h3 class="gh-subscribe-title">Subscribe to {{@blog.title}}</h3>
|
|
||||||
<p>Get the latest posts delivered right to your inbox.</p>
|
|
||||||
{{subscribe_form placeholder="Your email address"}}
|
|
||||||
<span class="gh-subscribe-rss">or subscribe <a href="http://cloud.feedly.com/#subscription/feed/{{@blog.url}}/rss/">via RSS</a> with Feedly!</span>
|
|
||||||
</section>
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
</footer>
|
<section class="gh-content gh-canvas">
|
||||||
|
{{content}}
|
||||||
|
</section>
|
||||||
|
|
||||||
</article>
|
{{#if comments}}
|
||||||
|
<section class="article-comments gh-canvas">
|
||||||
|
{{comments}}
|
||||||
|
</section>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
</article>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
{{!-- Links to Previous/Next posts --}}
|
{{!-- A signup call to action is displayed here, unless viewed as a logged-in member --}}
|
||||||
<aside class="read-next">
|
{{#if @site.members_enabled}}
|
||||||
{{#next_post}}
|
{{#unless @member}}
|
||||||
<a class="read-next-story {{#if image}}" style="background-image: url({{image}}){{else}}no-cover{{/if}}" href="{{url}}">
|
{{#unless @site.comments_enabled}}
|
||||||
<section class="post">
|
{{#if access}}
|
||||||
<h2>{{title}}</h2>
|
<section class="footer-cta outer">
|
||||||
<p>{{excerpt words="19"}}…</p>
|
<div class="inner">
|
||||||
</section>
|
{{#if @custom.email_signup_text}}<h2 class="footer-cta-title">{{@custom.email_signup_text}}</h2>{{/if}}
|
||||||
</a>
|
<a class="footer-cta-button" href="#/portal" data-portal>
|
||||||
{{/next_post}}
|
<div class="footer-cta-input">Enter your email</div>
|
||||||
{{#prev_post}}
|
<span>Subscribe</span>
|
||||||
<a class="read-next-story prev {{#if image}}" style="background-image: url({{image}}){{else}}no-cover{{/if}}" href="{{url}}">
|
</a>
|
||||||
<section class="post">
|
</div>
|
||||||
<h2>{{title}}</h2>
|
</section>
|
||||||
<p>{{excerpt words="19"}}…</p>
|
{{/if}}
|
||||||
</section>
|
{{/unless}}
|
||||||
</a>
|
{{/unless}}
|
||||||
{{/prev_post}}
|
{{/if}}
|
||||||
</aside>
|
|
||||||
|
|
||||||
|
{{!-- Read more links, just above the footer --}}
|
||||||
|
{{#if @custom.show_recent_posts_footer}}
|
||||||
|
{{!-- The {#get} helper below fetches some of the latest posts here
|
||||||
|
so that people have something else to read when they finish this one.
|
||||||
|
|
||||||
|
This query gets the latest 3 posts on the site, but adds a filter to
|
||||||
|
exclude the post we're currently on from being included. --}}
|
||||||
|
{{#get "posts" filter="id:-{{id}}" limit="3" as |more_posts|}}
|
||||||
|
|
||||||
|
{{#if more_posts}}
|
||||||
|
<aside class="read-more-wrap outer">
|
||||||
|
<div class="read-more inner">
|
||||||
|
{{#foreach more_posts}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/foreach}}
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{/get}}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{/post}}
|
{{/post}}
|
||||||
|
73
tag.hbs
@ -1,34 +1,55 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
|
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
|
||||||
|
|
||||||
{{!-- If we have a tag cover, display that - else blog cover - else nothing --}}
|
<main id="site-main" class="site-main outer">
|
||||||
<header class="main-header tag-head {{#if tag.image}}" style="background-image: url({{tag.image}}){{else}}{{#if @blog.cover}}" style="background-image: url({{@blog.cover}}){{else}}no-cover{{/if}}{{/if}}">
|
<div class="inner posts">
|
||||||
<nav class="main-nav overlay clearfix">
|
<div class="post-feed">
|
||||||
{{#if @blog.logo}}<a class="blog-logo" href="{{@blog.url}}"><img src="{{@blog.logo}}" alt="{{@blog.title}}" /></a>{{/if}}
|
|
||||||
{{#if @blog.navigation}}
|
|
||||||
<a class="menu-button icon-menu" href="#"><span class="word">Menu</span></a>
|
|
||||||
{{/if}}
|
|
||||||
</nav>
|
|
||||||
<div class="vertical">
|
|
||||||
{{#tag}}
|
{{#tag}}
|
||||||
<div class="main-header-content inner">
|
<section class="post-card post-card-large">
|
||||||
<h1 class="page-title">{{name}}</h1>
|
|
||||||
<h2 class="page-description">
|
{{#if feature_image}}
|
||||||
{{#if description}}
|
<div class="post-card-image-link">
|
||||||
{{description}}
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
{{else}}
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
A {{../pagination.total}}-post collection
|
<img class="post-card-image"
|
||||||
{{/if}}
|
srcset="{{img_url feature_image size="s"}} 300w,
|
||||||
</h2>
|
{{img_url feature_image size="m"}} 600w,
|
||||||
</div>
|
{{img_url feature_image size="l"}} 1000w,
|
||||||
|
{{img_url feature_image size="xl"}} 2000w"
|
||||||
|
sizes="(max-width: 1000px) 400px, 800px"
|
||||||
|
src="{{img_url feature_image size="m"}}"
|
||||||
|
alt="{{title}}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<div class="post-card-content">
|
||||||
|
<div class="post-card-content-link">
|
||||||
|
<header class="post-card-header">
|
||||||
|
<h2 class="post-card-title">{{name}}</h2>
|
||||||
|
</header>
|
||||||
|
<div class="post-card-excerpt">
|
||||||
|
{{#if description}}
|
||||||
|
{{description}}
|
||||||
|
{{else}}
|
||||||
|
A collection of {{plural ../pagination.total empty='zero posts' singular='% post' plural='% posts'}}
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
{{/tag}}
|
{{/tag}}
|
||||||
|
|
||||||
|
{{#foreach posts}}
|
||||||
|
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/foreach}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
|
||||||
|
|
||||||
{{!-- The main content area on the homepage --}}
|
|
||||||
<main class="content" role="main">
|
|
||||||
|
|
||||||
{{!-- The tag below includes the post loop - partials/loop.hbs --}}
|
|
||||||
{{> "loop"}}
|
|
||||||
|
|
||||||
|
{{pagination}}
|
||||||
|
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|