Compare commits

...

309 Commits

Author SHA1 Message Date
f13641dd7e v5.7.3 2024-07-03 13:09:51 +08:00
46c586644d Fixed bookmark card background color issue 2024-07-03 12:37:15 +08:00
87395c500f Improved Safari Reader support 2024-07-02 13:58:20 +08:00
331257ea29 v5.7.2 2024-04-09 14:24:03 +08:00
4f1958d3b5 Fixed cover image tinting issue in dark mode 2024-04-09 14:23:43 +08:00
6b6b6a7e69 v5.7.1 2024-03-12 12:08:54 +08:00
aa270b35a9 Rebuilt assets 2024-03-11 18:12:44 +08:00
a511bd56f6 Fixed post card styling issue on tag and author templates 2024-03-11 18:12:37 +08:00
7a790020cb Added aria-label to default.hbs' search button
no issue
- Improve accessibility
- Improve SEO (by improving accessibility)
2024-01-02 15:26:23 +07:00
4c6d33f3df Added aria-label to default.hbs' burger menu
no issue

- Improve accessibility
- Improve SEO (by improving accessibility)
2023-11-21 12:02:20 +08:00
cf569ac7b3 Added aria-label for the avatar/image of the author to post.hbs
no issue

- Improve accessibility
- Improve SEO (by improving accessibility)
2023-11-21 11:57:31 +08:00
276e2c9d01 Fix: #952 (#953) 2023-08-31 19:08:28 +08:00
4d3319d05c v5.7.0 2023-08-23 16:55:59 +08:00
43688cfa01 Added lightbox support 2023-08-23 16:55:41 +08:00
592226b75e 2023 2023-08-03 20:38:12 +01:00
9f9348544e v5.6.0 2023-07-31 13:51:45 -05:00
840b1b9c50 Switched from padding to margin for page card spacing 2023-07-24 16:58:30 +08:00
cc3fca004f Fixed cards not having space below 2023-07-22 00:08:12 +08:00
f8b34f9786 Fixed article header spacing on post template 2023-07-19 19:05:22 +08:00
b9f5d591d3 Rebuilt assets 2023-07-19 10:14:41 +08:00
a60e3e976a Updated hiding page title and feature image implementation (#946)
https://github.com/TryGhost/Product/issues/3568
2023-07-17 20:31:26 +08:00
d9c9390e17 Removed padding between navigation and full width content (#944) 2023-07-17 16:26:18 +08:00
84f201d293 Updated class to 'kg-card-hascaption'
Refs https://github.com/TryGhost/Product/issues/3589
2023-07-13 18:32:48 +08:00
c7fdfb7479 Removed spacing between full-width cards
Refs https://github.com/TryGhost/Product/issues/3589
2023-07-13 18:32:48 +08:00
d3483498d4 Added support for hidden title and feature image on pages (#943)
* Added support for hidden title and feature image on pages

Refs https://github.com/TryGhost/Product/issues/3568

* Switched from match to if helper for show_title_and_feature_image

Refs https://github.com/TryGhost/Product/issues/3568
2023-07-10 12:19:00 +02:00
4ae190c1a6 v5.5.3 2023-07-06 09:46:25 +08:00
22c83f9128 Fixed tag and author description character limit 2023-07-06 09:46:03 +08:00
10fd2f3a1c v5.5.2 2023-07-03 18:52:41 +08:00
b1a10873ff Fixed nested list spacing 2023-07-03 18:03:47 +08:00
0e76b5abef Removed unnecessary JS hack for nested list 2023-07-03 17:37:39 +08:00
d75ffc78ac Added nested list support 2023-06-28 18:25:13 +08:00
fa76f77006 Consistent syntax 2023-06-27 13:01:12 +08:00
dda827ded3 Head > Adding preload 2023-06-27 12:59:56 +08:00
bdf150658e v5.5.1 2023-06-22 21:19:57 +02:00
2fafe722d1 Added grid to full width cards with wide content
Refs https://github.com/TryGhost/Team/issues/3459
2023-06-22 21:17:03 +02:00
0721600075 v5.5.0 2023-06-22 17:17:43 +08:00
a18367200f Updated post content grid for additional widths 2023-06-22 16:37:59 +08:00
294b1e30e5 v5.4.12 2023-06-20 12:09:25 +08:00
aa8ca0794b Fixed main nav background color in dark mode
closes https://github.com/TryGhost/Casper/issues/942
2023-06-20 12:09:08 +08:00
ba0b3d08cc v5.4.11 2023-05-09 13:30:12 +08:00
50d5727f77 Fixed mobile menu background in dark mode
no issues

- when there's no publication cover and the color scheme is in dark mode, the mobile menu had white background
- this fixes the issue by adding explicit dark mode rules to the styles
2023-05-09 13:27:37 +08:00
23f7c30365 v5.4.10 2023-04-21 09:49:57 +01:00
8ff3c6fcf1 Fixed main nav to make it work with the announcement bar 2023-04-21 09:49:37 +01:00
5c7fb39df9 v5.4.9 2023-04-10 13:42:17 +08:00
4851606d9d Rebuilt assets 2023-04-10 13:41:59 +08:00
afca9cb27e Fix problem showing dropdown after window resize
When the browser window is resized, a new click event listener is added
to the window but the old one is not removed. The old one ends up
preventing the newly-made dropdown from opening.

Fix this by remembering the click event listener function added to the
window, and remove it before making the new dropdown after a window
resize.
2023-04-10 13:40:33 +08:00
b56bec2cb8 Fixed header action background color for smaller screens
closes #934

- the accent color is used for the header background, so we don't need to add explicit dark mode color to the action on mobile screens
2023-04-10 13:24:11 +08:00
0c4164c5bd v5.4.8 2023-03-28 16:01:50 +08:00
e6326eadf9 Added a class name to the powered by text
no issues

- our other themes have this class, and this makes it consistent across over all offcial themes
2023-03-28 16:01:24 +08:00
3ed94d68fa Update dependency gscan to v4.36.1 2023-03-07 09:25:32 +01:00
505503a63b v5.4.7 2023-03-01 13:54:29 +08:00
bd3fc7c2af Fixed textarea color in dark mode 2023-03-01 13:53:58 +08:00
5e0f765852 v5.4.6 2023-02-28 13:57:36 +08:00
4293dab0a7 Fixed burger menu icon visibility on dark mode
refs #925
2023-02-28 13:57:05 +08:00
f00918589f Update comment grammar 2023-02-27 17:13:31 +08:00
0200889148 Fix Table of Contents Numbering in screen.css 2023-02-27 15:39:25 +08:00
248c122f86 re-add aria-label to search button for screen readers
This was added by https://github.com/TryGhost/Casper/pull/896 

but then appears to have been accidentally reverted in the merge of https://github.com/TryGhost/Casper/pull/906
2023-02-27 15:10:09 +08:00
a007415d89 v5.4.5 2023-01-20 09:50:01 +01:00
31188ce3c0 Fixed author's cover image not showing up
no refs.

The author's cover image didn't show up on the theme because the author template used `feature_image` instead of `cover_image`.
2023-01-19 09:51:08 +01:00
e1967f8546 v5.4.4 2022-12-16 12:35:19 +08:00
5259d551f5 Fixed mobile navbar height 2022-12-16 12:33:11 +08:00
115d1d820c Fixed sign in link placement on mobile screen
fixes #913
2022-12-16 12:12:22 +08:00
81e4dfd52d Minor spacing adjustment 2022-12-16 12:02:08 +08:00
cc4d828575 Fixed logo visibility when the header is hidden 2022-12-16 11:57:59 +08:00
ebb2538215 v5.4.3 2022-12-15 10:12:38 +08:00
3767e3d994 Adjusted the pagination to dark mode 2022-12-15 10:00:58 +08:00
6d290485dc Fixed account button background 2022-12-15 09:55:41 +08:00
7da41d344f Added sign in link to the navbar 2022-12-14 16:42:46 +08:00
55a90a9252 v5.4.2 2022-12-12 14:55:31 +08:00
b20dceae22 Rebuilt assets 2022-12-12 14:55:02 +08:00
88ca182a58 Added regular pagination option
Casper comes with infinite scrolling by default. This update makes it possible to go with the default pagination style when the <html> element has a class no-infinite-scroll.
2022-12-08 12:50:24 +08:00
140632b885 fixes #910
When the publication cover is turned off and the header style is set to hidden, the header section shouldn't be taking much space like it does regularly.
2022-12-07 15:29:23 +08:00
8f2b806673 v5.4.1 2022-11-14 11:05:28 +08:00
4af198a19f Fixed dropdown menu width 2022-11-14 10:42:10 +08:00
f846ceb7ed Fixed minor spacing issues on the header 2022-11-14 10:37:50 +08:00
7390c17a26 Fix for intended location of search icon 2022-11-14 10:31:51 +08:00
55d5345800 v5.4.0 2022-11-11 11:31:39 +08:00
cf30adacce Added navbar options (#906) 2022-11-11 11:30:32 +08:00
38426cd9e6 Added aria-label to search button (#896) 2022-10-31 16:01:42 +08:00
c7713df88f v5.3.2 2022-10-04 14:43:34 +08:00
e6fdb4bfa3 Excluded GitHub Gist table from being styled
fixes #895
2022-10-04 14:31:38 +08:00
657bb8f986 Add me relation to social links 2022-09-12 12:57:24 +08:00
005211ff8f Remove ununsed file 2022-09-01 11:36:01 +08:00
e2096ee731 v5.3.1 2022-08-16 10:54:22 +08:00
20ced95885 Fix search icon placement
fixes #894
2022-08-16 10:54:04 +08:00
2aaf7441af v5.3.0 2022-08-12 21:32:28 +08:00
d687d0f099 Add comments support (#893)
* Added comments to theme

* Cleanup

* Updated spacing and typography

* Removed bottom border

* Added comment counter

* Updated theme name and post template

* Added search support

* Compiled css for search

* Removed the border and brackets for comment count

* Moved the comments helper into the content block so it gets the same paddings at narrow viewports

* Package version bump

* Updated comments helper in post template

* Final tweaks for the comments support

* Revert the package info

* Update {{comment_count}} helper usage

The helper now outputs a span wrapper by default, so we won't have to add a wrapper in the theme

Co-authored-by: Peter Zimon <peter.zimon@gmail.com>
Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
Co-authored-by: James Morris <moreofmorris@users.noreply.github.com>
2022-08-12 21:30:06 +08:00
96f69f8c07 Update dependency gscan to v4.34.0 (#884)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-08 16:31:53 +08:00
4808700c0f Update dependency @tryghost/release-utils to v0.8.1 (#886)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-08 16:30:45 +08:00
6459992d9a Update screenshot 2022-08-08 10:57:04 +08:00
b28258d0c8 v5.2.3 2022-08-02 14:23:57 +08:00
f3c0526ea5 Increase the width of header on author and tag page
The width used to be equal to one post card width and it wasn't enough for longer author name and description.
2022-07-28 12:37:32 +08:00
129a578751 Fix author profile social link hover color on dark mode 2022-07-28 12:35:23 +08:00
1b3541ef2a v5.2.2 2022-07-26 10:23:06 +08:00
664afdb158 Rebuild assets 2022-07-26 10:22:49 +08:00
d386ab090f Update Ghost version compatibility default value 2022-07-20 12:18:01 +08:00
c6411dbf41 Update dependency gscan to v4.31.2 (#851)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:14:22 +08:00
7eb472ab81 Update dependency gulp-postcss to v9.0.1 (#815)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:13:15 +08:00
ae7b6e1022 Update dependency inquirer to v8.2.4 (#806)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:12:28 +08:00
b74032835f Update dependency postcss to v8.2.13 [SECURITY] (#805)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:10:33 +08:00
eab9e1ae0f Update dependency autoprefixer to v10.4.7 (#796)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:09:58 +08:00
873566a24c Update dependency @tryghost/release-utils to v0.8.0 (#793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:02:59 +08:00
1ade4c8816 Update CSS preprocessors (#797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-19 16:01:28 +08:00
245969800d Rebuild assets 2022-07-19 15:54:01 +08:00
db37f3caa8 Fix author profile location is dark color in dark mode (#874) 2022-07-19 15:52:59 +08:00
a15e9bda40 v5.2.1 2022-07-14 15:17:44 +08:00
ffcbc42d13 Fix search icon spacing 2022-07-14 15:16:32 +08:00
d373d926fa v5.2.0 2022-07-12 19:15:38 +08:00
8699a22019 Add search attribute 2022-07-12 19:14:29 +08:00
eff8d360ba Add search support 2022-07-12 19:14:29 +08:00
3e7ca9cb36 v5.1.5 2022-07-04 19:02:25 +08:00
b5297f16d7 Rebuild assets 2022-07-04 19:02:07 +08:00
ccf82ec6c1 Let social links inherit their color 2022-07-04 15:12:36 +08:00
d9d70e7010 v5.1.4 2022-06-03 17:07:58 +08:00
52663e9be7 Fix unexpected cropping in grid layout 2022-06-03 17:07:38 +08:00
d1b1d383f5 v5.1.3 2022-06-01 19:43:57 +08:00
cf50364c6d Fix members only post indicator visibility when logged in 2022-06-01 19:43:34 +08:00
22e3f69aed v5.1.2 2022-05-31 16:18:53 +08:00
d1ac1b8c2c Distinguish members and paid-members only post indicators 2022-05-31 13:50:54 +08:00
45bc14f08d v5.1.1 2022-05-27 18:19:39 +08:00
e27ea96779 Fix blurry tag image 2022-05-27 18:19:14 +08:00
e51c1aff42 v5.1.0 2022-05-27 15:13:32 +08:00
d00647009c Fix post access indicator background 2022-05-27 15:10:47 +08:00
c75b67cf5d Fix author avatar in dark mode 2022-05-27 15:01:51 +08:00
9ebb26559a Auto dark mode 2022-05-27 14:46:30 +08:00
0e78d9ed40 Fix recent posts alignment 2022-05-26 17:41:59 +08:00
08b3054ada Hover effect 2022-05-26 16:25:05 +08:00
f5cb9a73d0 Fix featured post indicator layout shifting 2022-05-26 16:19:59 +08:00
e27f2190d6 Add conditions to check if members feature is enabled 2022-05-26 16:08:10 +08:00
c205947374 Fix table element selector 2022-05-26 15:55:16 +08:00
628a32ba96 Rename has-cover-image body class 2022-05-26 14:33:06 +08:00
0bf84b2b80 Post access indicator 2022-05-26 14:31:14 +08:00
7a86c6fd92 Show the reading time separate only if it exists 2022-05-26 13:56:10 +08:00
cfd767be88 Social links 2022-05-26 13:44:38 +08:00
4461d5e2f8 Featured post indicator 2022-05-26 13:31:16 +08:00
9efff7d6fa v5.0.0 2022-05-20 21:51:00 +08:00
358f3d6d35 Archive template spacing 2022-05-20 21:49:12 +08:00
4e30aff168 Minor dark mode fix 2022-05-20 21:49:12 +08:00
362a4995a2 Page template specific fixes 2022-05-20 21:49:12 +08:00
b0dfa11ff0 Polishing 2022-05-20 21:49:12 +08:00
508bbf1fb0 Spacing, spacing and spacing 2022-05-20 21:49:12 +08:00
a0cedfe23e Rename @custom.site_logo_in_main_navigation 2022-05-20 21:49:12 +08:00
1076078f8b Update ghost version 2022-05-20 21:49:12 +08:00
fe257987ce More spacing issue fixes 2022-05-20 21:49:12 +08:00
83669da41c Minor thing 2022-05-20 21:49:12 +08:00
be6943780d Remove auto dark mode 2022-05-20 21:49:12 +08:00
1f7cd51245 Minor detail adjustments 2022-05-20 21:49:12 +08:00
082cadf640 Rename recent posts setting 2022-05-20 21:49:12 +08:00
c74be0e346 Post image style setting 2022-05-20 21:49:12 +08:00
5fc101fb2c Layout settings cleanup 2022-05-20 21:49:12 +08:00
6439992db2 Fix wrong conditions for @custom.site_logo_in_main_navigation 2022-05-20 21:49:12 +08:00
21c6f59a61 Header settings cleanup 2022-05-20 21:49:12 +08:00
5424c465fb Settings cleanup 2022-05-20 21:49:12 +08:00
994a2287a2 List layout 2022-05-20 21:49:12 +08:00
6236067373 Minor adjustments 2022-05-20 21:49:12 +08:00
68c6224a92 Mobile screen refinement 2022-05-20 21:49:12 +08:00
838120323a More theme settings cleanup 2022-05-20 21:49:12 +08:00
98f7f53119 Post template 2022-05-20 21:49:12 +08:00
d9f92dfe89 Author and tag templates 2022-05-20 21:49:12 +08:00
b811b72333 Post layouts 2022-05-20 21:49:12 +08:00
6c922fca35 Cleanup header style 2022-05-20 21:49:12 +08:00
4c8ccde081 Header option 2022-05-20 21:49:12 +08:00
5672c0b6c8 Post card 2022-05-20 21:49:12 +08:00
f74e9241bb Header 2022-05-20 21:49:12 +08:00
ff4e4226c0 v4.7.5 2022-05-02 17:44:06 +08:00
9a09ff41c3 Add a class name to site description 2022-05-02 17:43:02 +08:00
f41761e0ad v4.7.4 2022-04-08 18:05:35 +08:00
11b52ed0cf Fix paginated posts of the list layout 2022-04-08 18:04:54 +08:00
c3fa4f6b24 Remove deprecated ghost-api property 2022-03-28 15:48:20 +08:00
19d5b6c297 Remove unused csscomb files 2022-03-23 11:15:07 +08:00
76f0037467 v4.7.3 2022-03-01 11:44:07 +08:00
37a09189c3 Make editor and markdown blockquote styles consistent 2022-03-01 11:43:00 +08:00
13458e0d2d Add a class to card meta author 2022-01-26 13:10:55 +08:00
eb007cb1c1 Show read more wrapper when only there are other recent posts 2022-01-25 14:28:22 +08:00
55f5ba65c6 Update dependency gscan to v4.22.0 (#827)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-01-14 10:39:46 +00:00
5cdcda15ee 2022 2022-01-05 12:43:26 +00:00
18f6d85da5 Updating spelling fixes #834 2022-01-04 11:57:24 +08:00
1f3418708c Add <kbd> style
fixes #822
2022-01-03 12:08:16 +08:00
05d0b0c7db v4.7.2 2021-12-17 18:16:43 +08:00
08f480ff78 Update dark style header card background color 2021-12-17 18:16:21 +08:00
56ec2e9a90 v4.7.1 2021-12-17 16:30:15 +08:00
c4f2d74d80 Apply custom heading color only to light header style 2021-12-17 16:24:24 +08:00
c378e9a9c9 v4.7.0 2021-12-17 15:58:13 +08:00
db98015d41 Header card tweaks 2021-12-17 15:06:34 +08:00
7e9cf5c478 v4.6.1 2021-12-16 09:46:13 +01:00
0f9a3c79c1 Fix list layout style on medium screen size 2021-12-16 12:53:45 +08:00
8ff91f709e Updated callout emoji line-height 2021-12-15 15:00:52 +01:00
feb2de765c v4.6.0 2021-12-15 13:02:03 +00:00
9b45ff3418 Card css specificity update (#832)
The default CSS styles of new Koenig cards that have been released in the past couple of weeks was updated for better usability in themes in general (read commit message for reasons and more reference).

This commit contains CSS cleanup and updates in theme styles that aligns Casper to this change.
2021-12-15 13:06:42 +01:00
827f37255c Updated styles for file upload card 2021-12-14 14:38:49 +01:00
ffdf853323 v4.5.0 2021-12-13 17:47:11 +01:00
e4543555fa Fixed a rule so that it doesn't overrides the product card css
refs https://github.com/TryGhost/Team/issues/1245

- Followed the same pattern as the callout, ntf and bookmark cards.
2021-12-13 17:23:49 +01:00
67e7291c2b Footer > Adding Lazy loading in the profile image 2021-12-13 16:09:13 +08:00
c880856a32 Revert dark mode style of product card rating 2021-12-10 09:55:52 +08:00
b06bcd6534 v4.4.0 2021-12-08 15:00:14 +00:00
49f99d956f Add dark mode support to product card star rating 2021-12-08 17:17:47 +08:00
cdb03b65fb Add alternate blockquote styles 2021-12-07 19:05:00 +08:00
e80f22c2a5 v4.3.1 2021-12-06 18:52:26 +08:00
b6474446f8 Updated toggle styles 2021-12-04 08:14:00 -04:00
462770968a Updated callout styles 2021-12-04 08:06:09 -04:00
017a2829b6 v4.3.0 2021-12-01 12:56:41 +00:00
198f12b725 Updated yarn.lock
no issue

- this needed updating after we bumped gscan
2021-12-01 12:55:55 +00:00
48260130fe Update toggle card heading selector 2021-11-29 13:33:59 +08:00
8b392ec6dd Add typography option to toggle card heading 2021-11-25 18:42:19 +08:00
4ea98431b3 Card responsive style refinements 2021-11-25 10:44:09 +08:00
6bc9b021b5 Add toggle content flow spacing 2021-11-25 10:31:36 +08:00
c1006ec649 Use data attribute for Portal links 2021-11-24 10:50:46 +08:00
cad48b230c Add missing styles for toggle card content 2021-11-23 11:32:24 +08:00
b3f6b8a82c Include lists inside toggle card to content styling 2021-11-23 11:28:35 +08:00
2d940d8f59 Exclude default CTA links from link styling 2021-11-23 11:22:56 +08:00
b7ea0cbff7 Upgrade gscan 2021-11-22 21:37:28 +08:00
a8150f7c30 Include toggle text in content styling 2021-11-22 21:35:48 +08:00
b5b1ea001e Updated NFT card styles 2021-11-19 12:02:09 +01:00
370b9ec74e Include .kg-callout-text to content styling 2021-11-19 16:07:09 +08:00
3cbe9b2c97 Remove bookmark card related CSS 2021-11-17 18:22:47 +08:00
d652252699 Remove gallery card related CSS and JS 2021-11-17 17:02:16 +08:00
6107a411a1 Exclude cards from default link styling
refs https://github.com/TryGhost/Team/issues/1227
2021-11-17 15:40:32 +08:00
8feb988375 Update heading selector on dark mode 2021-11-15 13:22:03 +08:00
e898d56f0b v4.2.0 2021-11-05 20:58:43 +08:00
b8319c5bb9 Update gscan 2021-11-05 20:17:41 +08:00
ceaa887371 Add custom settings 2021-11-05 20:14:53 +08:00
c63a07e8df v4.1.1 2021-09-22 15:28:46 +08:00
0e0898d7e9 Fix W3C warning about section lacks heading 2021-09-22 15:26:39 +08:00
2234b14bbd Fix nested main element issue 2021-09-22 15:24:17 +08:00
046d53e885 v4.1.0 2021-07-07 12:16:03 +08:00
e49664eca4 Add alt and caption support to feature images (#812)
* Add alt and caption support to feature images

* Add feature image alt support to post card

* Remove three-curlies
2021-07-05 10:59:21 +08:00
21bdffbd8a Fix header element inside header 2021-06-10 13:32:41 +08:00
ea33b00c0a Author page: remove span stray end tag (#808) 2021-06-03 10:15:25 +08:00
17c9fe6c55 v4.0.5 2021-05-10 14:21:53 +08:00
5adeaa458b Make the footer stick to bottom
Currently, the footer doesn't stick to the bottom of the viewport when the page content is small. This fixes the issue by making the <main> element fill the remaining space
2021-05-10 14:20:40 +08:00
5013c91f1a Revert "Pin beeper to v2"
This reverts commit f43f6c567f.
2021-05-06 15:48:36 +08:00
f43f6c567f Pin beeper to v2
Beeper started requiring ESM syntax from v3, and it caused an error when running development workflow
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
2021-05-06 12:28:54 +08:00
69feef6c46 Exclude development files from zipped theme 2021-05-05 07:53:10 +08:00
4708987c39 Update signup button Portal link
fixes #791
2021-04-02 14:45:33 +08:00
a4eb58f8e7 v4.0.4 2021-04-01 16:18:12 +08:00
5ad96f7c12 Fix post featured image width 2021-04-01 13:20:50 +08:00
6ac55407b3 Break long words
Fixes #788
2021-04-01 13:01:09 +08:00
b0e21fe0f7 Improve code block styling 2021-04-01 12:58:41 +08:00
85cd131cf1 v4.0.3 2021-03-29 11:57:50 +08:00
53ff37cf10 Add background color to default profile image
Fixes #785
2021-03-29 11:43:45 +08:00
816e1f608e Make image block element by default
By doing that, any possible future image alignment issues in post content can be prevented
refs #786
2021-03-29 11:34:53 +08:00
0d49da97a2 Fix list item spacing issue
List items had both top and bottom margin, and it caused some inconsistent spacing for lists inside post content. This updates fixes the issue by only assigning top margin on list items except the first one.
refs: #787
2021-03-29 10:52:15 +08:00
e34e2e3e0a Fix mobile menu overlapping Portal popup
fixes #784
2021-03-22 11:38:03 +08:00
18ceb822dd Update screen.css (#778) 2021-03-19 07:19:03 -04:00
08c1e38ae1 v4.0.2 2021-03-19 16:47:30 +08:00
d9e9e097cd Fix headings and card caption color on dark mode
refs #780
2021-03-19 14:15:52 +08:00
96aac80081 v4.0.1 2021-03-18 17:35:03 +00:00
3fa7f25147 Add Facebook link to the header
Fixes #776
2021-03-18 14:31:56 +08:00
b16671d8a7 v4.0.0 2021-03-15 23:33:48 +00:00
3d6a3dc68f v4.0.0-rc.2 2021-03-12 20:27:07 +00:00
48d06196c2 Fix horizontal scrolling caused by scaling on the subscribe CTA h2 (#765) 2021-03-12 09:53:43 -05:00
573e384381 Add space between gallery/image cards with caption (#766)
Co-authored-by: John O'Nolan <john@ghost.org>
2021-03-12 08:29:53 -05:00
5f127c395b Fix traditional Instagram embeds (#767)
Highly specific styles for traditional Instagram embeds

Co-authored-by: John O'Nolan <john@ghost.org>
2021-03-12 08:27:58 -05:00
3cc9cb0988 Fix headings typography scale (#771) 2021-03-12 08:25:37 -05:00
ca36c4fe91 Only use post-card-large variation if feature_image exists (#764) 2021-03-11 13:44:10 -05:00
260d5ec4e6 Fix horizontal alignment of smaller post images (#759)
Co-authored-by: John O'Nolan <john@ghost.org>
2021-03-11 13:37:58 -05:00
410ec1a9d5 Fix logo size in header on small screens (#760)
Co-authored-by: John O'Nolan <john@ghost.org>
2021-03-11 13:37:00 -05:00
e72f4236be Fix long links causing horizontal scrolling on small screens (#761)
Co-authored-by: John O'Nolan <john@ghost.org>
2021-03-11 13:36:13 -05:00
c0d5a3d999 Fix broken card layout caused by long strings (#762) 2021-03-11 13:33:25 -05:00
b927cf62ed Adjust infinite scroll selector to target article.post-card (#763)
The tag archive header shares the same classes as post cards, but have different elements.

This changes the selector to target article.post-card, which ignores header.post-card
2021-03-11 13:32:57 -05:00
91ced578c5 Updated tagName in release script
no issue

- as of 4.0, we're shipping tags with the preceding `v`, but this script
  ignored that and so the release was incorrect
- this commit updates the tagName to have the preceding `v`
2021-03-10 21:11:23 +00:00
87772282c8 v4.0.0-rc.1 2021-03-10 21:08:10 +00:00
bcfeb9be74 Update dependency gscan to v4 2021-03-10 21:04:49 +00:00
5b310a00f4 Merged 4.0 into main
no issue

- Casper is now ready for 4.0 so this commit merges the branch in to try
  and keep the Git history as clean as possible
2021-03-10 21:03:13 +00:00
3a5fda7009 Spacing fix on author profile 2021-03-09 22:23:47 -05:00
4f2fe7eb43 Update page template style 2021-03-09 22:02:35 -05:00
be0600a603 Update end of post CTA bg color 2021-03-09 21:33:13 -05:00
a78784decf Fix codeblock specificity, props @pauladamdavis 2021-03-09 09:27:47 -05:00
a516282b73 Correct logo height in navbar 2021-03-09 09:04:50 -05:00
ea6942a7fe Fix bug with :not unfixing previous fix of ::not which it turns out is not a thing 2021-03-09 09:03:54 -05:00
b5c2869ff6 Fix bug where incorrect styles were applied if codeblocks have captions 2021-03-08 16:08:47 -05:00
b7faac9eda Dark codeblocks by default 2021-03-08 15:59:11 -05:00
372dca859b Reinstate a class which as it turns out was not unused after all 2021-03-08 11:46:41 -05:00
30cd8d97e0 Remove unused old script from homepage 2021-03-08 11:30:16 -05:00
0584a58c6c Remove overlays from cover image, these only worked when CSS bg image, not img tag 2021-03-08 11:28:11 -05:00
2231274b07 Remove unused old class 2021-03-08 11:25:46 -05:00
715f95d209 Typography fixes 2021-03-06 21:54:43 -05:00
2c356f1cc4 Update dates to be locale-friendly, props @levee223 2021-03-05 10:13:14 -05:00
140666ee44 v4.0.0-rc.0 2021-03-05 14:07:06 +00:00
70f71e9839 Updated built JS assets
no issue

- these weren't rebuilt when changing the code
2021-03-05 14:05:57 +00:00
bd1dbd51c7 Updated default Ghost compatibility in release script
no issue

- not important, but it saves manually entering it during the release
  process
- Casper is only compatible with Ghost 4.0 moving forwards
2021-03-05 13:28:15 +00:00
f590fb029a Tag archive 2021-03-04 18:31:29 -05:00
7617c7baf2 Author profile 2021-03-04 17:22:45 -05:00
b5d0589222 And so the lord said unto Moses, let us obliterate this CSS 2021-03-04 08:05:28 -05:00
Naz
e95293cc22 Updated deprecated @site.lang to @site.locale
refs https://github.com/TryGhost/Team/issues/509
refs b0f80be408

- @site.lang property is being deprecated with Ghsot 4.0 and @site.locale is advised to be used instead
2021-03-04 19:48:58 +13:00
2d27e13f14 Remove visibility parameter 2021-03-04 12:20:10 +08:00
a43c6b3cbc Fixed logic for checking GitHub token
no issue 

- the check needs to be inverted to ensure we're being passed a token
2021-03-04 00:29:56 +00:00
1365eab4ae Cleanup 2021-03-03 15:44:30 -05:00
cf24eccdf2 Added Renovate to package.json
no issue

- the renovate.json file was removed to clean up the repository files,
  but we still want Renovate to update dependencies
- Renovate allows us to configure the config in the package.json, so
  this commit moves the previous contents there
2021-03-03 13:24:16 +00:00
f12ce05454 Removed the need for config.json when releasing
no issue

- we previously needed a config.json to provide the GitHub token for
  publishing new Casper releases
- this commit removes the need for this file by pulling the token from
  the environment variable, which everyone in the Core team has set up
2021-03-03 13:20:58 +00:00
44e33120cb Cleanup 2021-03-03 08:11:16 -05:00
6c7cf02111 Style refresh 2021-03-02 21:48:32 -05:00
609507d22d Keep bookmark author and publisher classes for GScan 2021-03-02 16:53:53 +08:00
fd89c6575c Remove specific selectors from bookmark metadata 2021-03-02 13:59:05 +08:00
c680f4efcd Style refresh 2021-03-01 20:34:12 -05:00
Naz
b59893091c Removed conditions which used @labs.members helper
refs https://github.com/TryGhost/Team/issues/332
refs 870a09b109

- The {{@labs.members}} always evaluates to "true" starting with Ghost 4.0 and will be "null" coercing to "false" starting Ghost 5.0
- Enabled all conditionals be default to pass the build in main Ghost repository. These changes should be reviewed - special attentio to the left out RSS feed which was surrounded with {{unless @labs.members}} condition
2021-03-01 19:44:07 +13:00
5fd447b815 Style refresh 2021-02-28 20:10:09 -05:00
f9d9b1fab5 Disable dark mode by default
Dark mode is disabled by default, but can be enabled by adding a class dark-mode to html element.
2021-02-25 21:58:09 +08:00
Naz
1ea3ad649b Updated ghost-engine to v4
refs https://github.com/TryGhost/Team/issues/221
26e20d223d

- The default engine for Casper shipping with Ghost v4 has to match up.
This way it uses all the correct APIs
2021-02-25 03:17:07 +13:00
676b73172f Increase contrast of excerpts 2021-02-18 15:16:42 +08:00
2505089a41 Use old font size for primary tags 2021-02-18 15:09:33 +08:00
957d3049aa Fix link hover effect 2021-02-18 14:50:59 +08:00
8f81522907 Remove focus state from buttons 2021-02-18 14:48:24 +08:00
28d63e1cd2 Accent color for subscribe overlay button 2021-02-18 14:36:49 +08:00
b374b88126 Dark grey as subscribe form border 2021-02-18 12:17:40 +08:00
0449bf5537 Use grey for blockquotes 2021-02-18 12:16:27 +08:00
e985805958 Try a new default accent color 2021-02-18 12:05:56 +08:00
c1fcece376 Use accent color as header background when there is no cover image 2021-02-18 11:40:20 +08:00
306f7b2d9b Accent color usage and subscribe form design update 2021-02-18 11:32:40 +08:00
53 changed files with 4985 additions and 5337 deletions

View File

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

View File

@ -1,19 +0,0 @@
Do you need help or have a question? Please come chat in our forum: https://forum.ghost.org 👫.
If you're filing a bug 🐛, please include the following information:
### Screenshot
![]()
### Steps to Reproduce
1. This is the first step
2. This may be the post content used to cause an issue...
### Technical details
* Casper Version:
* Ghost Version:
* Browser Version:
* OS Version:

View File

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

View File

@ -1,15 +0,0 @@
name: Test
on:
pull_request:
push:
branches:
- master
- 'renovate/*'
jobs:
test:
runs-on: ubuntu-latest
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
steps:
- uses: actions/checkout@v2
- run: yarn
- run: yarn test:ci

View File

@ -1,2 +0,0 @@
version-tag-prefix ""
version-git-message "%s"

View File

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

View File

@ -4,7 +4,7 @@ The default theme for [Ghost](http://github.com/tryghost/ghost/). This is the la
&nbsp;
![screenshot-desktop](https://user-images.githubusercontent.com/353959/66987533-40eae100-f0c1-11e9-822e-cbaf38fb8e3f.png)
![screenshot-desktop](https://user-images.githubusercontent.com/1418797/183329195-8e8f2ee5-a473-4694-a813-a2575491209e.png)
&nbsp;
@ -66,4 +66,4 @@ You can add your own SVG icons in the same manner.
# Copyright & License
Copyright (c) 2013-2021 Ghost Foundation - Released under the [MIT license](LICENSE).
Copyright (c) 2013-2023 Ghost Foundation - Released under the [MIT license](LICENSE).

View File

@ -1,9 +0,0 @@
# Reporting Security Vulnerabilities
Potential security vulnerabilities can be reported directly us at `security@ghost.org`. The Ghost Security Team communicates privately and works in a secured, isolated repository for tracking, testing, and resolving security-related issues.
The full, up-to-date details of our security policy and procedure can always be found in our documentation:
https://ghost.org/docs/security/
Please refer to this before emailing us. Thanks for helping make Ghost safe for everyone 🙏.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,237 +0,0 @@
{
"remove-empty-rulesets": true,
"always-semicolon": true,
"color-case": "lower",
"block-indent": " ",
"color-shorthand": true,
"element-case": "lower",
"eof-newline": true,
"leading-zero": true,
"quotes": "double",
"space-before-colon": "",
"space-after-colon": " ",
"space-before-combinator": " ",
"space-after-combinator": " ",
"space-between-declarations": "\n",
"space-before-opening-brace": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": "\n",
"space-before-selector-delimiter": "",
"space-before-closing-brace": "\n",
"strip-spaces": true,
"tab-size": 4,
"unitless-zero": true,
"sort-order": [ [
"content",
"visibility",
"position",
"top",
"right",
"bottom",
"left",
"z-index",
"order",
"flex",
"flex-grow",
"flex-shrink",
"flex-basis",
"align-self",
"display",
"flex-flow",
"flex-direction",
"flex-wrap",
"justify-content",
"align-items",
"align-content",
"flex-order",
"flex-pack",
"flex-align",
"float",
"clear",
"overflow",
"overflow-x",
"overflow-y",
"-webkit-overflow-scrolling",
"clip",
"box-sizing",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"min-width",
"min-height",
"max-width",
"max-height",
"width",
"height",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"border",
"border-spacing",
"border-collapse",
"border-width",
"border-style",
"border-color",
"border-top",
"border-top-width",
"border-top-style",
"border-top-color",
"border-right",
"border-right-width",
"border-right-style",
"border-right-color",
"border-bottom",
"border-bottom-width",
"border-bottom-style",
"border-bottom-color",
"border-left",
"border-left-width",
"border-left-style",
"border-left-color",
"border-image",
"border-image-source",
"border-image-slice",
"border-image-width",
"border-image-outset",
"border-image-repeat",
"border-top-image",
"border-right-image",
"border-bottom-image",
"border-left-image",
"border-corner-image",
"border-top-left-image",
"border-top-right-image",
"border-bottom-right-image",
"border-bottom-left-image",
"color",
"font",
"font-family",
"font-size",
"line-height",
"font-weight",
"font-style",
"font-variant",
"font-size-adjust",
"font-stretch",
"font-feature-settings",
"letter-spacing",
"text-rendering",
"text-align",
"text-align-last",
"text-decoration",
"text-emphasis",
"text-emphasis-position",
"text-emphasis-style",
"text-emphasis-color",
"text-indent",
"text-justify",
"text-outline",
"text-transform",
"text-wrap",
"text-overflow",
"text-overflow-ellipsis",
"text-overflow-mode",
"text-shadow",
"white-space",
"word-spacing",
"word-wrap",
"word-break",
"tab-size",
"hyphens",
"user-select",
"fill",
"stroke",
"background",
"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
"background-color",
"background-image",
"background-attachment",
"background-position",
"background-position-x",
"background-position-y",
"background-clip",
"background-origin",
"background-size",
"background-repeat",
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"box-decoration-break",
"box-shadow",
"table-layout",
"caption-side",
"empty-cells",
"list-style",
"list-style-position",
"list-style-type",
"list-style-image",
"quotes",
"counter-increment",
"counter-reset",
"vertical-align",
"src",
"opacity",
"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
"filter",
"resize",
"cursor",
"nav-index",
"nav-up",
"nav-right",
"nav-down",
"nav-left",
"transition",
"transition-delay",
"transition-timing-function",
"transition-duration",
"transition-property",
"transform",
"transform-origin",
"animation",
"animation-name",
"animation-duration",
"animation-play-state",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-fill-mode",
"pointer-events",
"unicode-bidi",
"direction",
"columns",
"column-span",
"column-width",
"column-count",
"column-fill",
"column-gap",
"column-rule",
"column-rule-width",
"column-rule-style",
"column-rule-color",
"break-before",
"break-inside",
"break-after",
"page-break-before",
"page-break-inside",
"page-break-after",
"orphans",
"widows",
"zoom",
"max-zoom",
"min-zoom",
"user-zoom",
"orientation"
] ]
}

View File

@ -1,240 +0,0 @@
{
"remove-empty-rulesets": true,
"always-semicolon": true,
"color-case": "lower",
"block-indent": " ",
"color-shorthand": true,
"element-case": "lower",
"eof-newline": true,
"leading-zero": true,
"quotes": "double",
"space-before-colon": "",
"space-after-colon": " ",
"space-before-combinator": " ",
"space-after-combinator": " ",
"space-between-declarations": "\n",
"space-before-opening-brace": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": "\n",
"space-before-selector-delimiter": "",
"space-before-closing-brace": "\n",
"strip-spaces": true,
"tab-size": 4,
"unitless-zero": true,
"sort-order": [ [
"content",
"visibility",
"position",
"top",
"right",
"bottom",
"left",
"z-index",
"order",
"flex",
"flex-grow",
"flex-shrink",
"flex-basis",
"align-self",
"display",
"flex-flow",
"flex-direction",
"justify-content",
"align-items",
"align-content",
"flex-wrap",
"flex-order",
"flex-pack",
"flex-align",
"float",
"clear",
"box-sizing",
"width",
"height",
"min-width",
"min-height",
"max-width",
"max-height",
"overflow",
"overflow-x",
"overflow-y",
"clip",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"border",
"border-spacing",
"border-collapse",
"border-width",
"border-style",
"border-color",
"border-top",
"border-top-width",
"border-top-style",
"border-top-color",
"border-right",
"border-right-width",
"border-right-style",
"border-right-color",
"border-bottom",
"border-bottom-width",
"border-bottom-style",
"border-bottom-color",
"border-left",
"border-left-width",
"border-left-style",
"border-left-color",
"border-image",
"border-image-source",
"border-image-slice",
"border-image-width",
"border-image-outset",
"border-image-repeat",
"border-top-image",
"border-right-image",
"border-bottom-image",
"border-left-image",
"border-corner-image",
"border-top-left-image",
"border-top-right-image",
"border-bottom-right-image",
"border-bottom-left-image",
"table-layout",
"caption-side",
"empty-cells",
"list-style",
"list-style-position",
"list-style-type",
"list-style-image",
"quotes",
"counter-increment",
"counter-reset",
"vertical-align",
"stroke",
"fill",
"stroke-width",
"stroke-opacity",
"color",
"font",
"font-family",
"font-size",
"line-height",
"font-weight",
"font-style",
"font-variant",
"font-size-adjust",
"font-stretch",
"text-rendering",
"font-feature-settings",
"letter-spacing",
"hyphens",
"text-align",
"text-align-last",
"text-decoration",
"text-emphasis",
"text-emphasis-position",
"text-emphasis-style",
"text-emphasis-color",
"text-indent",
"text-justify",
"text-outline",
"text-transform",
"text-wrap",
"text-overflow",
"text-overflow-ellipsis",
"text-overflow-mode",
"text-shadow",
"white-space",
"word-spacing",
"word-wrap",
"word-break",
"tab-size",
"user-select",
"src",
"resize",
"cursor",
"nav-index",
"nav-up",
"nav-right",
"nav-down",
"nav-left",
"background",
"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
"background-color",
"background-image",
"background-size",
"background-attachment",
"background-position",
"background-position-x",
"background-position-y",
"background-clip",
"background-origin",
"background-repeat",
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"box-decoration-break",
"box-shadow",
"opacity",
"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
"filter",
"transition",
"transition-delay",
"transition-timing-function",
"transition-duration",
"transition-property",
"transform",
"transform-origin",
"animation",
"animation-name",
"animation-duration",
"animation-play-state",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-fill-mode",
"pointer-events",
"unicode-bidi",
"direction",
"columns",
"column-span",
"column-width",
"column-count",
"column-fill",
"column-gap",
"column-rule",
"column-rule-width",
"column-rule-style",
"column-rule-color",
"break-before",
"break-inside",
"break-after",
"page-break-before",
"page-break-inside",
"page-break-after",
"orphans",
"widows",
"zoom",
"max-zoom",
"min-zoom",
"user-zoom",
"orientation",
"-webkit-overflow-scrolling",
"-ms-overflow-scrolling"
] ]
}

View File

@ -1,22 +1,3 @@
/* Variables
/* ---------------------------------------------------------- */
:root {
/* Colours */
--blue: #3eb0ef;
--green: #a4d037;
--purple: #ad26b4;
--yellow: #fecd35;
--red: #f05230;
--darkgrey: #15171A;
--midgrey: #738a94;
--lightgrey: #c5d2d9;
--whitegrey: #e5eff5;
--pink: #fa3a57;
--brown: #a3821a;
--darkmode: color-mod(var(--darkgrey) l(+2%));
}
/* Reset
/* ---------------------------------------------------------- */
@ -107,10 +88,6 @@ video {
body {
line-height: 1;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
@ -127,7 +104,9 @@ table {
border-collapse: collapse;
}
img {
display: block;
max-width: 100%;
height: auto;
}
html {
box-sizing: border-box;
@ -193,6 +172,20 @@ 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,
@ -273,16 +266,13 @@ th {
========================================================================== */
html {
overflow-x: hidden;
overflow-y: scroll;
font-size: 62.5%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
overflow-x: hidden;
color: color-mod(var(--midgrey) l(-30%));
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
color: var(--color-darkgrey);
font-family: var(--font-sans);
font-size: 1.6rem;
line-height: 1.6em;
font-weight: 400;
@ -298,7 +288,7 @@ body {
::selection {
text-shadow: none;
background: color-mod(var(--blue) lightness(+30%));
background: #daf2fd;
}
hr {
@ -309,7 +299,7 @@ hr {
padding: 0;
height: 1px;
border: 0;
border-top: 1px solid color-mod(var(--lightgrey) l(+10%));
border-top: 1px solid #f0f0f0;
}
audio,
@ -331,11 +321,11 @@ textarea {
resize: vertical;
}
p,
ul,
ol,
dl,
blockquote {
::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;
}
@ -349,15 +339,7 @@ ol ol,
ul ul,
ul ol,
ol ul {
margin: 0.5em 0 1em;
}
ul {
list-style: disc;
}
ol {
list-style: decimal;
margin: 0.5em 0;
}
ul,
@ -366,16 +348,19 @@ ol {
}
li {
margin: 0.5em 0;
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: var(--darkgrey);
color: #daf2fd;
font-weight: 500;
text-align: right;
}
@ -388,13 +373,7 @@ dd {
blockquote {
margin: 1.5em 0;
padding: 0 1.6em 0 1.6em;
border-left: var(--whitegrey) 0.5em solid;
}
blockquote p {
margin: 0.8em 0;
font-size: 1.2em;
font-weight: 300;
border-left: #daf2fd;
}
blockquote small {
@ -416,14 +395,10 @@ blockquote cite a {
}
a {
color: color-mod(var(--blue) l(-5%));
color: #15171A;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
h1,
h2,
h3,
@ -434,35 +409,38 @@ h6 {
line-height: 1.15;
font-weight: 600;
text-rendering: optimizeLegibility;
letter-spacing: -0.01em;
}
h1 {
margin: 0 0 0.5em 0;
font-size: 5.5rem;
font-weight: 600;
font-size: 4.8rem;
font-weight: 700;
letter-spacing: -0.015em;
}
@media (max-width: 500px) {
@media (max-width: 600px) {
h1 {
font-size: 2.2rem;
font-size: 2.8rem;
}
}
h2 {
margin: 1.5em 0 0.5em 0;
font-size: 2.2rem;
font-size: 2.8rem;
font-weight: 700;
}
@media (max-width: 500px) {
@media (max-width: 600px) {
h2 {
font-size: 1.8rem;
font-size: 2.3rem;
}
}
h3 {
margin: 1.5em 0 0.5em 0;
font-size: 1.8rem;
font-weight: 500;
font-size: 2.4rem;
font-weight: 600;
}
@media (max-width: 500px) {
@media (max-width: 600px) {
h3 {
font-size: 1.7rem;
}
@ -470,18 +448,20 @@ h3 {
h4 {
margin: 1.5em 0 0.5em 0;
font-size: 1.6rem;
font-weight: 500;
font-size: 2rem;
}
@media (max-width: 600px) {
h4 {
font-size: 1.7rem;
}
}
h5 {
margin: 1.5em 0 0.5em 0;
font-size: 1.4rem;
font-weight: 500;
font-size: 2rem;
}
h6 {
margin: 1.5em 0 0.5em 0;
font-size: 1.4rem;
font-weight: 500;
font-size: 1.8rem;
}

File diff suppressed because it is too large Load Diff

BIN
assets/images/default-skin.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

1
assets/images/default-skin.svg Executable file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

85
assets/js/dropdown.js Normal file
View 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);
});
})();

View File

@ -1,24 +0,0 @@
/* eslint-env browser */
/**
* Gallery card support
* Used on any individual post/page
*
* Detects when a gallery card has been used and applies sizing to make sure
* the display matches what is seen in the editor.
*/
(function (window, document) {
var resizeImagesInGalleries = function resizeImagesInGalleries() {
var images = document.querySelectorAll('.kg-gallery-image img');
images.forEach(function (image) {
var container = image.closest('.kg-gallery-image');
var width = image.attributes.width.value;
var height = image.attributes.height.value;
var ratio = width / height;
container.style.flex = ratio + ' 1 0%';
});
};
document.addEventListener('DOMContentLoaded', resizeImagesInGalleries);
})(window, document);

View File

@ -14,6 +14,8 @@
*/
(function (window, document) {
if (document.documentElement.classList.contains('no-infinite-scroll')) return;
// next link element
var nextElement = document.querySelector('link[rel=next]');
if (!nextElement) {
@ -43,7 +45,7 @@
}
// append contents
var postElements = this.response.querySelectorAll('.post-card');
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

File diff suppressed because one or more lines are too long

4
assets/js/lib/photoswipe-ui-default.min.js vendored Executable file

File diff suppressed because one or more lines are too long

4
assets/js/lib/photoswipe.min.js vendored Executable file

File diff suppressed because one or more lines are too long

109
assets/js/lightbox.js Normal file
View 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'
);
})();

View File

@ -1,61 +0,0 @@
/* eslint-env browser */
/**
* Nav/Title replacement
* Used on invividual post pages, displays the post title in place of the nav
* bar when scrolling past the title
*
* Usage:
* ```
* Casper.stickyTitle({
* navSelector: '.site-nav-main',
* titleSelector: '.post-full-title',
* activeClass: 'nav-post-title-active'
* });
* ```
*/
(function (window, document) {
// set up Casper as a global object
if (!window.Casper) {
window.Casper = {};
}
window.Casper.stickyNavTitle = function stickyNavTitle(options) {
var nav = document.querySelector(options.navSelector);
var title = document.querySelector(options.titleSelector);
var lastScrollY = window.scrollY;
var ticking = false;
function onScroll() {
lastScrollY = window.scrollY;
requestTick();
}
function requestTick() {
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}
function update() {
var trigger = title.getBoundingClientRect().top + window.scrollY;
var triggerOffset = title.offsetHeight + 35;
// show/hide post title
if (lastScrollY >= trigger + triggerOffset) {
nav.classList.add(options.activeClass);
} else {
nav.classList.remove(options.activeClass);
}
ticking = false;
}
window.addEventListener('scroll', onScroll, {passive: true});
update();
};
})(window, document);

View File

@ -1,61 +1,76 @@
{{!< default}}
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
{{#author}}
{{!-- Everything inside the #author tags pulls data from the author --}}
<main id="site-main" class="site-main outer">
<div class="inner posts">
<div class="post-feed">
{{#author}}
<section class="post-card post-card-large">
{{#if cover_image}}
<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}}
<div class="post-card-content">
<div class="post-card-content-link">
<header class="site-archive-header">
{{> site-header}}
{{> header-background background=cover_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner">
<div class="site-header-content author-header">
{{#if profile_image}}
<img class="author-profile-image" src="{{profile_image}}" alt="{{name}}" />
{{else}}
<span class="author-profile-image">{{> "icons/avatar"}}</span>
<img class="author-profile-pic" src="{{profile_image}}" alt="{{name}}" />
{{/if}}
<div class="author-header-content">
<h1 class="site-title">{{name}}</h1>
{{#if bio}}
<h2 class="author-bio">{{bio}}</h2>
<header class="post-card-header">
<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-meta">
{{#if location}}
<div class="author-location">{{location}}</div>
{{/if}}
<div class="author-stats">
{{plural ../pagination.total empty='No posts' singular='% post' plural='% posts'}}
</div>
<div class="author-profile-meta">
{{#if website}}
<span class="author-social-link"><a href="{{website}}" target="_blank" rel="noopener">Website</a></span>
<a class="author-profile-social-link" href="{{website}}" target="_blank" rel="noopener">{{website}}</a>
{{/if}}
{{#if twitter}}
<span class="author-social-link"><a href="{{twitter_url}}" target="_blank" rel="noopener">Twitter</a></span>
<a class="author-profile-social-link" href="{{twitter_url}}" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
{{#if facebook}}
<span class="author-social-link"><a href="{{facebook_url}}" target="_blank" rel="noopener">Facebook</a></span>
<a class="author-profile-social-link" href="{{facebook_url}}" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
{{/if}}
</div>
</div>
</footer>
</div>
</div>
</div>
</div>
</header>
{{/author}}
{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner posts">
</section>
{{/author}}
<div class="post-feed">
{{#foreach posts visibility="all"}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
{{> "post-card"}}
{{/foreach}}
</div>
{{#foreach posts}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
{{> "post-card"}}
{{/foreach}}
</div>
{{pagination}}
</div>
</main>

View File

@ -1,5 +0,0 @@
{
"github": {
"token": "<gh-personal-access-token>"
}
}

View File

@ -1,139 +1,120 @@
<!DOCTYPE html>
<html lang="{{@site.lang}}">
<html lang="{{@site.locale}}"{{#match @custom.color_scheme "Dark"}} class="dark-mode"{{else match @custom.color_scheme "Auto"}} class="auto-color"{{/match}}>
<head>
{{!-- Document Settings --}}
{{!-- Basic meta - advanced meta is output with {ghost_head} below --}}
<title>{{meta_title}}</title>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
{{!-- Base Meta --}}
<title>{{meta_title}}</title>
<meta name="HandheldFriendly" content="True" />
<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"}}" />
{{!-- Styles'n'Scripts --}}
{{!-- Theme assets - use the {asset} helper to reference styles & scripts,
this will take care of caching and cache-busting automatically --}}
<link rel="stylesheet" type="text/css" href="{{asset "built/screen.css"}}" />
{{!-- This tag outputs SEO meta+structured data and other important settings --}}
{{!-- This tag outputs all your advanced SEO meta, structured data, and other important settings,
it should always be the last tag before the closing head tag --}}
{{ghost_head}}
</head>
<body class="{{body_class}}">
<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">
<div class="site-wrapper">
{{!-- All the main content gets inserted here, index.hbs, post.hbs, etc --}}
{{{body}}}
{{!-- The footer at the very bottom of the screen --}}
<footer class="site-footer outer">
<div class="site-footer-content inner">
<section class="copyright"><a href="{{@site.url}}">{{@site.title}}</a> &copy; {{date format="YYYY"}}</section>
<nav class="site-footer-nav">
<a href="{{@site.url}}">Latest Posts</a>
{{#if @site.facebook}}<a href="{{facebook_url @site.facebook}}" target="_blank" rel="noopener">Facebook</a>{{/if}}
{{#if @site.twitter}}<a href="{{twitter_url @site.twitter}}" target="_blank" rel="noopener">Twitter</a>{{/if}}
<a href="https://ghost.org/" target="_blank" rel="noopener">Ghost</a>
</nav>
<header id="gh-head" class="gh-head outer{{#match @custom.header_style "Hidden"}} is-header-hidden{{/match}}">
<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>
</footer>
</div>
<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>
{{!-- The big email subscribe modal content --}}
{{#if @labs.members}}
<div class="subscribe-notification subscribe-success-message">
<a class="subscribe-close-button" href="javascript:;"></a>
You've successfully subscribed to {{@site.title}}!
</div>
<div class="subscribe-notification subscribe-failure-message">
<a class="subscribe-close-button" href="javascript:;"></a>
Could not sign up! Invalid sign up link.
</div>
<div id="subscribe" class="subscribe-overlay">
<a class="subscribe-close-overlay" href="#"></a>
<a class="subscribe-close-button" href="#"></a>
<div class="subscribe-overlay-content">
{{#if @site.logo}}
<img class="subscribe-overlay-logo" src="{{@site.logo}}" alt="{{@site.title}}" />
{{/if}}
<div class="subscribe-form">
<h1 class="subscribe-overlay-title">Subscribe to {{@site.title}}</h1>
<p class="subscribe-overlay-description">Stay up to date! Get all the latest & greatest posts delivered straight to your inbox</p>
<form data-members-form="subscribe">
<div class="form-group">
<input class="subscribe-email" data-members-email placeholder="youremail@example.com"
autocomplete="false" />
<button class="button primary" type="submit">
<span class="button-content">Subscribe</span>
<span class="button-loader">{{> "icons/loader"}}</span>
</button>
<div 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>
<div class="message-success">
<strong>Great!</strong> Check your inbox and click the link to confirm your subscription.
</div>
<div class="message-error">
Please enter a valid email address!
</div>
</form>
{{/unless}}
</div>
</div>
</header>
<div class="site-content">
{{!-- All other templates get inserted here, index.hbs, post.hbs, etc --}}
{{{body}}}
</div>
{{/if}}
{{!-- jQuery, required for fitvids --}}
<script
src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
crossorigin="anonymous">
</script>
{{!-- Fitvids (for responsive video embeds), infinite scroll, floating header, and gallery card support --}}
<script src="{{asset "built/casper.js"}}"></script>
{{!-- The global footer at the very bottom of the screen --}}
<footer class="site-footer outer">
<div class="inner">
<section class="copyright"><a href="{{@site.url}}">{{@site.title}}</a> &copy; {{date format="YYYY"}}</section>
<nav class="site-footer-nav">
{{navigation type="secondary"}}
</nav>
<div class="gh-powered-by"><a href="https://ghost.org/" target="_blank" rel="noopener">Powered by Ghost</a></div>
</div>
</footer>
{{!-- Scripts for Members subscription --}}
<script>
// Parse the URL parameter
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
</div>
{{!-- /.viewport --}}
// Give the parameter a variable name
var action = getParameterByName('action');
var success = getParameterByName('success');
{{#is "post, page"}}
{{> "lightbox"}}
{{/is}}
$(document).ready(function () {
if (action == 'subscribe' && (success === null || success === 'true')) {
$('body').addClass('subscribe-success');
}
{{!-- 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>
if (action == 'subscribe' && success === 'false') {
$('body').addClass('subscribe-failure');
}
$('.subscribe-notification .subscribe-close-button').click(function () {
$('.subscribe-notification').addClass('close');
});
// Reset form on opening subscrion overlay
$('.subscribe-button').click(function() {
$('.subscribe-overlay form').removeClass();
$('.subscribe-email').val('');
});
});
</script>
{{!-- The #block helper will pull in data from the #contentFor other template files. In this case, there's some JavaScript which we only want to use in post.hbs, but it needs to be included down here, after jQuery has already loaded. --}}
{{{block "scripts"}}}
{{!-- Ghost outputs important scripts and data with this tag - it should always be the very last thing before the closing body tag --}}
{{ghost_foot}}
{{!-- Ghost outputs required functional scripts with this tag - it should always be the last thing before the closing body tag --}}
{{ghost_foot}}
</body>
</html>

View File

@ -1,30 +1,37 @@
{{!< default}}
{{!--
This error template is used for all 404 errors, which might occur on your site.
It's a good idea to keep this template as minimal as possible in terms of both file size and complexity.
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!
--}}
{{!< default}}
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}
<header class="site-header">
{{> site-header}}
</header>
<main id="site-main" class="site-main outer error-content">
<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>
{{#get "posts" limit="3" include="authors,tags"}}
<div class="post-feed">
{{#foreach posts}}
{{> "post-card"}}
{{!-- 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}}
</div>
{{/if}}
{{/get}}
</div>
</main>
</aside>

View File

@ -1,7 +1,15 @@
{{!--
This error template is used for all 400/500 errors, except 404, which might occur on your site.
It's a good idea to keep this template as minimal as possible in terms of both file size and complexity.
You'll notice that we *don't* use any JavaScript, or ghost_head / ghost_foot in this file.
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>
@ -32,7 +40,7 @@ You'll notice that we *don't* use any JavaScript, or ghost_head / ghost_foot in
</div>
</header>
<main id="site-main" class="site-main outer error-content">
<main class="outer error-content">
<div class="inner">
<section class="error-message">

View File

@ -80,7 +80,9 @@ function zipper(done) {
'**',
'!node_modules', '!node_modules/**',
'!dist', '!dist/**',
'!yarn-error.log'
'!yarn-error.log',
'!yarn.lock',
'!gulpfile.js'
]),
zip(filename),
dest('dist/')
@ -88,18 +90,19 @@ function zipper(done) {
}
const cssWatcher = () => watch('assets/css/**', css);
const jsWatcher = () => watch('assets/js/**', js);
const hbsWatcher = () => watch(['*.hbs', 'partials/**/*.hbs'], hbs);
const watcher = parallel(cssWatcher, hbsWatcher);
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 = () => {
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
var packageJSON = JSON.parse(fs.readFileSync('./package.json'));
let packageJSON = JSON.parse(fs.readFileSync('./package.json'));
const newVersion = packageJSON.version;
if (!newVersion || newVersion === '') {
@ -109,45 +112,36 @@ exports.release = () => {
console.log(`\nCreating release for ${newVersion}...`);
let config;
try {
config = require('./config');
} catch (err) {
config = null;
}
const githubToken = process.env.GST_TOKEN;
if (!config || !config.github || !config.github.token) {
console.log('Please copy config.example.json and configure Github token.');
if (!githubToken) {
console.log('Please configure your environment with a GitHub token located in GST_TOKEN');
return;
}
let compatibleWithGhost;
try {
const result = await inquirer.prompt([{
type: 'input',
name: 'compatibleWithGhost',
message: 'Which version of Ghost is it compatible with?',
default: '5.0.0'
}]);
return inquirer.prompt([{
type: 'input',
name: 'compatibleWithGhost',
message: 'Which version of Ghost is it compatible with?',
default: '3.0.0'
}])
.then(result => {
compatibleWithGhost = result.compatibleWithGhost;
return Promise.resolve();
})
.then(() => releaseUtils.releases.get({
userAgent: 'Casper',
uri: `https://api.github.com/repos/${REPO_READONLY}/releases`
}))
.then((response) => {
if (!response || !response.length) {
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 = response[0].tag_name || response[0].name;
let previousVersion = releasesResponse[0].tag_name || releasesResponse[0].name;
console.log(`Previous version: ${previousVersion}`);
return Promise.resolve(previousVersion);
})
.then((previousVersion) => {
const changelog = new releaseUtils.Changelog({
changelogPath: CHANGELOG_PATH,
folder: path.join(process.cwd(), '.')
@ -161,27 +155,22 @@ exports.release = () => {
.sort()
.clean();
return Promise.resolve();
})
.then(() => releaseUtils.releases.create({
draft: true,
preRelease: false,
tagName: newVersion,
releaseName: newVersion,
userAgent: 'Casper',
uri: `https://api.github.com/repos/${REPO}/releases`,
github: {
token: config.github.token
},
content: [`**Compatible with Ghost ≥ ${compatibleWithGhost}**\n\n`],
changelogPath: CHANGELOG_PATH
}))
.then((response) => {
console.log(`\nRelease draft generated: ${response.releaseUrl}\n`);
return Promise.resolve();
})
.catch((err) => {
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);
});
}
};

130
index.hbs
View File

@ -2,97 +2,53 @@
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}
<header class="site-home-header">
{{> header-background background=@site.cover_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner">
{{> "site-nav"}}
<div class="site-header-content">
<h1 class="site-title">
{{#if @site.logo}}
<img class="site-logo" src="{{img_url @site.logo size="l"}}" alt="{{@site.title}}" />
{{else}}
{{@site.title}}
{{/if}}
</h1>
<h2 class="site-description">{{@site.description}}</h2>
</div>
<div 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}}">
{{#if @custom.show_publication_cover}}
{{#if @site.cover_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 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}}
{{#match @custom.header_style "!=" "Hidden"}}
<div class="site-header-inner inner">
{{#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>
</header>
{{/match}}
</div>
{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner posts">
<div class="post-feed">
{{#foreach posts visibility="all"}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
{{> "post-card"}}
{{/foreach}}
</div>
<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>
{{pagination}}
</div>
</main>
{{> site-header}}
{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>
// NOTE: Scroll performance is poor in Safari
// - this appears to be due to the events firing much more slowly in Safari.
// Dropping the scroll event and using only a raf loop results in smoother
// scrolling but continuous processing even when not scrolling
$(document).ready(function () {
var nav = document.querySelector('.site-nav-main .site-nav');
var feed = document.querySelector('.post-feed');
var lastScrollY = window.scrollY;
var lastWindowHeight = window.innerHeight;
var lastDocumentHeight = $(document).height();
var ticking = false;
function onScroll() {
lastScrollY = window.scrollY;
requestTick();
}
function onResize() {
lastWindowHeight = window.innerHeight;
lastDocumentHeight = $(document).height();
requestTick();
}
function requestTick() {
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}
function update() {
var trigger = feed.getBoundingClientRect().top + window.scrollY;
var progressMax = lastDocumentHeight - lastWindowHeight;
// show/hide nav
if (lastScrollY >= trigger - 20) {
nav.classList.add('fixed-nav-active');
} else {
nav.classList.remove('fixed-nav-active');
}
ticking = false;
}
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', onResize, false);
update();
});
</script>
{{/contentFor}}

View File

@ -2,10 +2,9 @@
"name": "casper",
"description": "A clean, minimal default theme for the Ghost publishing platform",
"demo": "https://demo.ghost.io",
"version": "3.1.3",
"version": "5.7.3",
"engines": {
"ghost": ">=3.0.0",
"ghost-api": "v3"
"ghost": ">=5.0.0"
},
"license": "MIT",
"screenshots": {
@ -46,21 +45,21 @@
"bugs": "https://github.com/TryGhost/Casper/issues",
"contributors": "https://github.com/TryGhost/Casper/graphs/contributors",
"devDependencies": {
"@tryghost/release-utils": "0.6.12",
"autoprefixer": "10.2.5",
"@tryghost/release-utils": "0.8.1",
"autoprefixer": "10.4.7",
"beeper": "2.1.0",
"cssnano": "4.1.10",
"gscan": "3.6.1",
"cssnano": "5.1.12",
"gscan": "4.36.1",
"gulp": "4.0.2",
"gulp-concat": "2.6.1",
"gulp-livereload": "4.0.2",
"gulp-postcss": "9.0.0",
"gulp-postcss": "9.0.1",
"gulp-uglify": "3.0.2",
"gulp-zip": "5.1.0",
"inquirer": "8.0.0",
"postcss": "8.2.8",
"inquirer": "8.2.4",
"postcss": "8.2.13",
"postcss-color-mod-function": "3.0.3",
"postcss-easy-import": "3.0.0",
"postcss-easy-import": "4.0.0",
"pump": "3.0.0"
},
"browserslist": [
@ -87,6 +86,94 @@
"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"
]
}
}

View File

@ -1,65 +1,47 @@
{{!< default}}
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}
into the {body} tag of the default.hbs template --}}
{{!-- The big featured header, it uses blog cover image as a BG if available --}}
<header class="site-header">
<div class="outer site-nav-main">
<div class="inner">
{{> "site-nav"}}
</div>
</div>
</header>
{{!-- Everything inside the #post tags pulls data from the post --}}
{{#post}}
{{!-- Everything inside the #post block pulls data from the page --}}
<main id="site-main" class="site-main outer">
<div class="inner">
<main id="site-main" class="site-main">
<article class="article {{post_class}}">
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">
{{#match @page.show_title_and_feature_image}}
<header class="article-header gh-canvas">
<header class="post-full-header">
<h1 class="post-full-title">{{title}}</h1>
</header>
<h1 class="article-title">{{title}}</h1>
{{#if feature_image}}
<figure class="post-full-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="(max-width: 800px) 400px,
(max-width: 1170px) 1170px,
2000px"
src="{{img_url feature_image size="xl"}}"
alt="{{title}}"
/>
</figure>
<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}}
<section class="post-full-content">
<div class="post-content">
{{content}}
</div>
</section>
</header>
{{/match}}
</article>
<section class="gh-content gh-canvas">
{{content}}
</section>
</div>
</article>
</main>
{{/post}}
{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>
$(function() {
var $postContent = $(".post-full-content");
$postContent.fitVids();
});
</script>
{{/contentFor}}
{{/post}}

View File

@ -1,47 +0,0 @@
{{!--
Wow what the hell is going on in here even?
Ok so, several templates use this big header with a giant BG image. Nice idea, but big images
have a heavy impact on performance, so it's a good idea to make them responsive. Because we
can only get the image dynamically using Handlebars, and we can only set the image to properly
be a background image using CSS, we end up with a handful of inline styles.
If the template in question has a background image, then we render responsive image styles
for it, and apply those styles to the <header> tag. Else, we just output a <header> tag
with a `no-image` class so we can style it accordingly.
--}}
{{#if background}}
<style type="text/css">
.responsive-header-img {
background-image: url({{img_url background size='xl'}});
}
@media(max-width: 1000px) {
.responsive-header-img {
background-image: url({{img_url background size='l'}});
background-image: -webkit-image-set(url({{img_url background size='l'}}) 1x,
url({{img_url background size='xl'}}) 2x);
background-image: image-set(url({{img_url background size='l'}}) 1x,
url({{img_url background size='xl'}}) 2x);
}
}
@media(max-width: 600px) {
.responsive-header-img {
background-image: url({{img_url background size='m'}});
background-image: -webkit-image-set(url({{img_url background size='m'}}) 1x,
url({{img_url background size='l'}}) 2x);
background-image: image-set(url({{img_url background size='m'}}) 1x,
url({{img_url background size='l'}}) 2x);
}
}
</style>
<div class="outer site-header-background responsive-header-img">
{{else}}
<div class="outer site-header-background no-image">
{{/if}}

View File

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

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 531 B

3
partials/icons/fire.hbs Normal file
View 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/lock.hbs Normal file
View 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

View 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

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z"/></svg>
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z"/></svg>

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 752 B

41
partials/lightbox.hbs Normal file
View 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>

View File

@ -1,7 +1,11 @@
<article class="post-card {{post_class}} {{#unless feature_image}}no-image{{else}}{{#is "home"}}{{#has index="nth:6"}}post-card-large{{/has}}{{/is}}{{/unless}}">
{{!-- 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"
@ -9,62 +13,66 @@
{{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, 700px"
loading="lazy"
sizes="(max-width: 1000px) 400px, 800px"
src="{{img_url feature_image size="m"}}"
alt="{{title}}"
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">
{{#if primary_tag}}
<div class="post-card-tags">
{{#primary_tag}}
<div class="post-card-primary-tag">{{name}}</div>
<span class="post-card-primary-tag">{{name}}</span>
{{/primary_tag}}
{{/if}}
<h2 class="post-card-title">{{title}}</h2>
{{#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>
<section class="post-card-excerpt">
{{#if feature_image}}
<p>{{excerpt words="30"}}</p>
{{else}}
<p>{{excerpt words="44"}}</p>
{{/if}}
</section>
{{#if excerpt}}
<div class="post-card-excerpt">{{excerpt}}</div>
{{/if}}
</a>
<footer class="post-card-meta">
<ul class="author-list">
{{#foreach authors}}
<li class="author-list-item">
<div class="author-name-tooltip">
{{name}}
</div>
{{#if profile_image}}
<a href="{{url}}" class="static-avatar">
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
</a>
{{else}}
<a href="{{url}}" class="static-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}
</li>
{{/foreach}}
</ul>
<div class="post-card-byline-content">
<span>{{#has author="count:>2"}}Multiple authors{{else}}{{authors}}{{/has}}</span>
<span class="post-card-byline-date"><time datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time> <span class="bull">&bull;</span> {{reading_time}}</span>
</div>
<time class="post-card-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date}}</time>
{{#if reading_time}}
<span class="post-card-meta-length">{{reading_time}}</span>
{{/if}}
{{#if @site.comments_enabled}}
{{comment_count}}
{{/if}}
</footer>
</div>{{!--/.post-card-content--}}
</div>
</article>

View File

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

View File

@ -1,44 +0,0 @@
<nav class="site-nav">
<div class="site-nav-left-wrapper">
<div class="site-nav-left">
{{#if @site.logo}}
<a class="site-nav-logo" href="{{@site.url}}"><img src="{{@site.logo}}" alt="{{@site.title}}" /></a>
{{else}}
<a class="site-nav-logo" href="{{@site.url}}">{{@site.title}}</a>
{{/if}}
<div class="site-nav-content">
{{#if @site.navigation}}
{{navigation}}
{{/if}}
{{#is "post"}}
<span class="nav-post-title {{#unless @site.logo}}dash{{/unless}}">{{post.title}}</span>
{{/is}}
</div>
</div>
</div>
<div class="site-nav-right">
{{#if @site.secondary_navigation}}
{{navigation type="secondary"}}
{{else}}
<div class="social-links">
{{#if @site.facebook}}
<a class="social-link social-link-fb" href="{{facebook_url @site.facebook}}" title="Facebook" target="_blank" rel="noopener">{{> "icons/facebook"}}</a>
{{/if}}
{{#if @site.twitter}}
<a class="social-link social-link-tw" href="{{twitter_url @site.twitter}}" title="Twitter" target="_blank" rel="noopener">{{> "icons/twitter"}}</a>
{{/if}}
</div>
{{#unless @labs.members}}
<a class="rss-button" href="https://feedly.com/i/subscription/feed/{{@site.url}}/rss/" title="RSS" target="_blank" rel="noopener">{{> "icons/rss"}}</a>
{{/unless}}
{{/if}}
{{#if @labs.members}}
{{#unless @member}}
<a class="subscribe-button" href="#subscribe">Subscribe</a>
{{else}}
<a class="subscribe-button" href="#/portal/account">Account</a>
{{/unless}}
{{/if}}
</div>
</nav>

View File

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

282
post.hbs
View File

@ -1,92 +1,67 @@
{{!< default}}
{{!-- The tag above means: insert everything in this file
into the {body} of the default.hbs template --}}
into the {body} tag of the default.hbs template --}}
<header class="site-header">
{{> site-header}}
</header>
{{!-- Everything inside the #post tags pulls data from the post --}}
{{#post}}
{{!-- Everything inside the #post block pulls data from the post --}}
<main id="site-main" class="site-main outer">
<div class="inner">
<main id="site-main" class="site-main">
<article class="article {{post_class}} {{#match @custom.post_image_style "Full"}}image-full{{else match @custom.post_image_style "=" "Small"}}image-small{{/match}}">
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">
<header class="article-header gh-canvas">
<header class="post-full-header">
{{#if primary_tag}}
<section class="post-full-tags">
{{#primary_tag}}
<div class="article-tag post-card-tags">
{{#primary_tag}}
<span class="post-card-primary-tag">
<a href="{{url}}">{{name}}</a>
{{/primary_tag}}
</section>
{{/if}}
</span>
{{/primary_tag}}
{{#if featured}}
<span class="post-card-featured">{{> "icons/fire"}} Featured</span>
{{/if}}
</div>
<h1 class="post-full-title">{{title}}</h1>
<h1 class="article-title">{{title}}</h1>
{{#if custom_excerpt}}
<p class="post-full-custom-excerpt">{{custom_excerpt}}</p>
{{/if}}
{{#if custom_excerpt}}
<p class="article-excerpt">{{custom_excerpt}}</p>
{{/if}}
<div class="post-full-byline">
<section class="post-full-byline-content">
<ul class="author-list">
{{#foreach authors}}
<li class="author-list-item">
<div class="author-card">
{{#if profile_image}}
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
{{else}}
<div class="author-profile-image">{{> "icons/avatar"}}</div>
{{/if}}
<div class="author-info">
{{#if bio}}
<div class="bio">
<h2>{{name}}</h2>
<p>{{bio}}</p>
<p><a href="{{url}}">More posts</a> by {{name}}.</p>
</div>
{{else}}
<h2>{{name}}</h2>
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
{{/if}}
</div>
</div>
{{#if profile_image}}
<a href="{{url}}" class="author-avatar">
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
</a>
{{else}}
<a href="{{url}}" class="author-avatar author-profile-image">{{> "icons/avatar"}}</a>
{{/if}}
</li>
{{/foreach}}
</ul>
<section class="post-full-byline-meta">
<h4 class="author-name">{{authors}}</h4>
<div class="byline-meta-content">
<time class="byline-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time>
<span class="byline-reading-time"><span class="bull">&bull;</span> {{reading_time}}</span>
</div>
</section>
</section>
<div class="article-byline">
<section class="article-byline-content">
<ul class="author-list instapaper_ignore">
{{#foreach authors}}
<li class="author-list-item">
{{#if profile_image}}
<a href="{{url}}" class="author-avatar" aria-label="Read more of {{name}}">
<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>
<div class="article-byline-meta">
<h4 class="author-name">{{authors}}</h4>
<div class="byline-meta-content">
<time class="byline-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date}}</time>
{{#if reading_time}}
<span class="byline-reading-time"><span class="bull">&bull;</span> {{reading_time}}</span>
{{/if}}
</div>
</header>
</div>
{{#if feature_image}}
<figure class="post-full-image">
</section>
</div>
{{#match @custom.post_image_style "!=" "Hidden"}}
{{#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
@ -94,121 +69,72 @@ into the {body} of the default.hbs template --}}
{{img_url feature_image size="m"}} 600w,
{{img_url feature_image size="l"}} 1000w,
{{img_url feature_image size="xl"}} 2000w"
sizes="(max-width: 800px) 400px,
(max-width: 1170px) 1170px,
2000px"
sizes="(min-width: 1400px) 1400px, 92vw"
src="{{img_url feature_image size="xl"}}"
alt="{{title}}"
alt="{{#if feature_image_alt}}{{feature_image_alt}}{{else}}{{title}}{{/if}}"
/>
{{#if feature_image_caption}}
<figcaption>{{feature_image_caption}}</figcaption>
{{/if}}
</figure>
{{/if}}
{{/if}}
{{/match}}
<section class="post-full-content">
<div class="post-content">
{{content}}
</div>
</section>
</header>
{{!-- Email subscribe form at the bottom of the page --}}
{{#if @labs.members}}
{{> subscribe-form}}
{{/if}}
<section class="gh-content gh-canvas">
{{content}}
</section>
{{!--
<section class="post-full-comments">
If you want to embed comments, this is a good place to do it!
</section>
--}}
{{#if comments}}
<section class="article-comments gh-canvas">
{{comments}}
</section>
{{/if}}
</article>
</div>
</article>
</main>
{{!-- Links to Previous/Next posts --}}
<aside class="read-next outer">
<div class="inner">
<div class="read-next-feed">
{{#if primary_tag}}
{{#get "posts" filter="tags:{{primary_tag.slug}}+id:-{{id}}" limit="3" as |related_posts|}}
{{#if related_posts}}
<article class="read-next-card">
<header class="read-next-card-header">
{{#../primary_tag}}
<h3><span>More in</span> <a href="{{url}}">{{name}}</a></h3>
{{/../primary_tag}}
</header>
<div class="read-next-card-content">
<ul>
{{#foreach related_posts}}
<li>
<h4><a href="{{url}}">{{title}}</a></h4>
<div class="read-next-card-meta">
<p><time datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time>
{{reading_time}}</p>
</div>
</li>
{{/foreach}}
</ul>
</div>
<footer class="read-next-card-footer">
<a href="{{#../primary_tag}}{{url}}{{/../primary_tag}}">{{plural meta.pagination.total empty='No posts' singular='% post' plural='See all % posts'}}
→</a>
</footer>
</article>
{{/if}}
{{/get}}
{{/if}}
{{!-- If there's a next post, display it using the same markup included from - partials/post-card.hbs --}}
{{#next_post}}
{{> "post-card"}}
{{/next_post}}
{{!-- If there's a previous post, display it using the same markup included from - partials/post-card.hbs --}}
{{#prev_post}}
{{> "post-card"}}
{{/prev_post}}
{{!-- A signup call to action is displayed here, unless viewed as a logged-in member --}}
{{#if @site.members_enabled}}
{{#unless @member}}
{{#unless @site.comments_enabled}}
{{#if access}}
<section class="footer-cta outer">
<div class="inner">
{{#if @custom.email_signup_text}}<h2 class="footer-cta-title">{{@custom.email_signup_text}}</h2>{{/if}}
<a class="footer-cta-button" href="#/portal" data-portal>
<div class="footer-cta-input">Enter your email</div>
<span>Subscribe</span>
</a>
</div>
</div>
</aside>
</section>
{{/if}}
{{/unless}}
{{/unless}}
{{/if}}
{{!-- 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}}
{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
{{#contentFor "scripts"}}
<script>
$(document).ready(function () {
// FitVids - start
var $postContent = $(".post-full-content");
$postContent.fitVids();
// FitVids - end
// Replace nav with title on scroll - start
Casper.stickyNavTitle({
navSelector: '.site-nav-main',
titleSelector: '.post-full-title',
activeClass: 'nav-post-title-active'
});
// Replace nav with title on scroll - end
// Hover on avatar
var hoverTimeout;
$('.author-list-item').hover(function () {
var $this = $(this);
clearTimeout(hoverTimeout);
$('.author-card').removeClass('hovered');
$(this).children('.author-card').addClass('hovered');
}, function () {
var $this = $(this);
hoverTimeout = setTimeout(function () {
$this.children('.author-card').removeClass('hovered');
}, 800);
});
});
</script>
{{/contentFor}}

View File

@ -1,5 +0,0 @@
{
"extends": [
"@tryghost:theme"
]
}

75
tag.hbs
View File

@ -1,32 +1,55 @@
{{!< default}}
{{!-- The tag above means - insert everything in this file into the {body} of the default.hbs template --}}
{{#tag}}
<header class="site-archive-header">
{{> site-header}}
{{> header-background background=feature_image}} {{!--Special header-image.hbs partial to generate the background image--}}
<div class="inner site-header-content">
<h1 class="site-title">{{name}}</h1>
<h2 class="site-description">
{{#if description}}
{{description}}
{{else}}
A collection of {{plural ../pagination.total empty='posts' singular='% post' plural='% posts'}}
{{/if}}
</h2>
</div>
</div>
</header>
{{/tag}}
{{!-- The main content area --}}
<main id="site-main" class="site-main outer">
<div class="inner posts">
<div class="post-feed">
{{#foreach posts visibility="all"}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
{{> "post-card"}}
{{/foreach}}
</div>
<div class="inner posts">
<div class="post-feed">
{{#tag}}
<section class="post-card post-card-large">
{{#if feature_image}}
<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 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="{{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}}
{{#foreach posts}}
{{!-- The tag below includes the markup for each post - partials/post-card.hbs --}}
{{> "post-card"}}
{{/foreach}}
</div>
{{pagination}}
</div>
</main>

3027
yarn.lock

File diff suppressed because it is too large Load Diff