From 80a6fe17d0df6d9fd3e649ddc77c3c7608a96770 Mon Sep 17 00:00:00 2001 From: Chris Raible Date: Wed, 6 Sep 2023 13:22:12 -0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Added=20`Source`=20as=20the=20new?= =?UTF-8?q?=20default=20theme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs TryGhost/Product#3510 - Added `TryGhost/Source` as a submodule in `ghost/core/content/themes` so `Source` will ship with Ghost (along with Casper) - With this change, new installs will use `Source` as the default theme. Existing sites will have `Source` installed, but not activated, as this is a large change and we don't want to drastically change existing sites without warning. Users can upgrade to use `Source` simply by clicking 'Activate' in design settings. - Updated protections to prevent users from uploading their own conflicting version of `Source` --- .gitignore | 1 + .gitmodules | 4 + apps/admin-x-settings/src/api/themes.ts | 6 +- .../site/theme/AdvancedThemeSettings.tsx | 4 +- .../settings/site/theme/OfficialThemes.tsx | 54 ++++- .../settings/site/theme/ThemePreview.tsx | 41 +++- apps/admin-x-settings/src/main.tsx | 6 + .../admin/app/components/admin-x/settings.js | 22 +- ghost/admin/app/components/gh-theme-table.js | 32 ++- .../components/modals/design/install-theme.js | 11 +- .../components/modals/design/upload-theme.js | 4 +- .../settings/design/change-theme.js | 22 +- ghost/admin/app/controllers/setup/done.js | 1 + ghost/admin/mirage/fixtures/settings.js | 4 +- ghost/admin/mirage/fixtures/themes.js | 11 +- .../assets/img/themes/Source-Magazine.png | Bin 0 -> 114502 bytes .../assets/img/themes/Source-Newsletter.png | Bin 0 -> 56006 bytes .../admin/public/assets/img/themes/Source.png | Bin 0 -> 67697 bytes .../tests/acceptance/settings/design-test.js | 4 +- .../components/gh-theme-table-test.js | 27 ++- ghost/core/.npmignore | 5 + ghost/core/content/themes/source | 1 + ...23-10-03-00-32-32-rollback-source-theme.js | 40 ++++ .../default-settings/default-settings.json | 2 +- ghost/core/core/server/services/auth/setup.js | 6 +- .../core/server/services/themes/storage.js | 14 +- ghost/core/test/.eslintignore | 1 + .../admin/__snapshots__/settings.test.js.snap | 16 +- ghost/core/test/e2e-api/admin/themes.test.js | 65 +++--- .../test/e2e-frontend/default_routes.test.js | 1 - .../core/test/integration/importer/v2.test.js | 2 +- .../api/admin/authentication.test.js | 6 +- .../regression/site/dynamic_routing.test.js | 6 +- .../unit/server/data/schema/integrity.test.js | 2 +- ghost/core/test/utils/e2e-framework.js | 2 +- ghost/core/test/utils/e2e-utils.js | 6 +- .../fixtures/default-settings-browser.json | 2 +- .../test/utils/fixtures/default-settings.json | 2 +- .../core/test/utils/fixtures/themes/README.md | 19 ++ .../themes/source/assets/built/screen.css | 2 + .../themes/source/assets/built/screen.css.map | 1 + .../themes/source/assets/built/source.js | 2 + .../themes/source/assets/built/source.js.map | 1 + .../assets/fonts/eb-garamond-italic.woff2 | Bin 0 -> 41180 bytes .../assets/fonts/eb-garamond-roman.woff2 | Bin 0 -> 40064 bytes .../source/assets/fonts/inter-roman.woff2 | Bin 0 -> 37780 bytes .../assets/fonts/roboto-slab-roman.woff2 | Bin 0 -> 34772 bytes .../source/assets/images/default-skin.png | Bin 0 -> 547 bytes .../source/assets/images/default-skin.svg | 1 + .../themes/source/assets/images/preloader.gif | Bin 0 -> 866 bytes .../utils/fixtures/themes/source/author.hbs | 43 ++++ .../utils/fixtures/themes/source/default.hbs | 67 ++++++ .../utils/fixtures/themes/source/home.hbs | 12 ++ .../utils/fixtures/themes/source/index.hbs | 6 + .../utils/fixtures/themes/source/package.json | 199 ++++++++++++++++++ .../utils/fixtures/themes/source/page.hbs | 26 +++ .../themes/source/partials/components/cta.hbs | 25 +++ .../source/partials/components/featured.hbs | 14 ++ .../source/partials/components/footer.hbs | 35 +++ .../partials/components/header-content.hbs | 77 +++++++ .../source/partials/components/header.hbs | 23 ++ .../source/partials/components/navigation.hbs | 53 +++++ .../source/partials/components/post-list.hbs | 133 ++++++++++++ .../source/partials/email-subscription.hbs | 8 + .../themes/source/partials/feature-image.hbs | 17 ++ .../themes/source/partials/icons/arrow.hbs | 1 + .../themes/source/partials/icons/avatar.hbs | 1 + .../themes/source/partials/icons/burger.hbs | 1 + .../source/partials/icons/checkmark.hbs | 24 +++ .../themes/source/partials/icons/close.hbs | 1 + .../themes/source/partials/icons/facebook.hbs | 1 + .../themes/source/partials/icons/fire.hbs | 3 + .../themes/source/partials/icons/loader.hbs | 17 ++ .../themes/source/partials/icons/lock.hbs | 5 + .../themes/source/partials/icons/rss.hbs | 1 + .../themes/source/partials/icons/search.hbs | 1 + .../themes/source/partials/icons/twitter.hbs | 1 + .../themes/source/partials/lightbox.hbs | 41 ++++ .../themes/source/partials/post-card.hbs | 35 +++ .../themes/source/partials/search-toggle.hbs | 3 + .../utils/fixtures/themes/source/post.hbs | 63 ++++++ .../test/utils/fixtures/themes/source/tag.hbs | 22 ++ 82 files changed, 1294 insertions(+), 124 deletions(-) create mode 100644 ghost/admin/public/assets/img/themes/Source-Magazine.png create mode 100644 ghost/admin/public/assets/img/themes/Source-Newsletter.png create mode 100644 ghost/admin/public/assets/img/themes/Source.png create mode 160000 ghost/core/content/themes/source create mode 100644 ghost/core/core/server/data/migrations/versions/5.67/2023-10-03-00-32-32-rollback-source-theme.js create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/built/screen.css create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/built/screen.css.map create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/built/source.js create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/built/source.js.map create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/fonts/eb-garamond-italic.woff2 create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/fonts/eb-garamond-roman.woff2 create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/fonts/inter-roman.woff2 create mode 100644 ghost/core/test/utils/fixtures/themes/source/assets/fonts/roboto-slab-roman.woff2 create mode 100755 ghost/core/test/utils/fixtures/themes/source/assets/images/default-skin.png create mode 100755 ghost/core/test/utils/fixtures/themes/source/assets/images/default-skin.svg create mode 100755 ghost/core/test/utils/fixtures/themes/source/assets/images/preloader.gif create mode 100644 ghost/core/test/utils/fixtures/themes/source/author.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/default.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/home.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/index.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/package.json create mode 100644 ghost/core/test/utils/fixtures/themes/source/page.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/cta.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/featured.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/footer.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/header-content.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/header.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/navigation.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/components/post-list.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/email-subscription.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/feature-image.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/arrow.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/avatar.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/burger.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/checkmark.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/close.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/facebook.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/fire.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/loader.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/lock.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/rss.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/search.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/icons/twitter.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/lightbox.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/post-card.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/partials/search-toggle.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/post.hbs create mode 100644 ghost/core/test/utils/fixtures/themes/source/tag.hbs diff --git a/.gitignore b/.gitignore index d34e475636..3162730395 100644 --- a/.gitignore +++ b/.gitignore @@ -97,6 +97,7 @@ typings/ /ghost/core/content/adapters/storage/**/* /ghost/core/content/adapters/scheduling/**/* /ghost/core/content/themes/casper +/ghost/core/content/themes/source !/ghost/core/README.md !/ghost/core/content/**/README.md diff --git a/.gitmodules b/.gitmodules index db85f8f508..1df7c0ee43 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,7 @@ path = ghost/core/content/themes/casper url = ../../TryGhost/Casper.git ignore = all +[submodule "ghost/core/content/themes/source"] + path = ghost/core/content/themes/source + url = ../../TryGhost/Source.git + ignore = all diff --git a/apps/admin-x-settings/src/api/themes.ts b/apps/admin-x-settings/src/api/themes.ts index 3b8b2a90f0..09e83dcb11 100644 --- a/apps/admin-x-settings/src/api/themes.ts +++ b/apps/admin-x-settings/src/api/themes.ts @@ -133,9 +133,13 @@ export function isActiveTheme(theme: Theme): boolean { } export function isDefaultTheme(theme: Theme): boolean { + return theme.name === 'source'; +} + +export function isLegacyTheme(theme: Theme): boolean { return theme.name === 'casper'; } export function isDeletableTheme(theme: Theme): boolean { - return !isDefaultTheme(theme) && !isActiveTheme(theme); + return !isDefaultTheme(theme) && !isLegacyTheme(theme) && !isActiveTheme(theme); } diff --git a/apps/admin-x-settings/src/components/settings/site/theme/AdvancedThemeSettings.tsx b/apps/admin-x-settings/src/components/settings/site/theme/AdvancedThemeSettings.tsx index 2188886fb2..bc0565cdaf 100644 --- a/apps/admin-x-settings/src/components/settings/site/theme/AdvancedThemeSettings.tsx +++ b/apps/admin-x-settings/src/components/settings/site/theme/AdvancedThemeSettings.tsx @@ -7,7 +7,7 @@ import ModalPage from '../../../../admin-x-ds/global/modal/ModalPage'; import NiceModal from '@ebay/nice-modal-react'; import React from 'react'; import useHandleError from '../../../../utils/api/handleError'; -import {Theme, isActiveTheme, isDefaultTheme, isDeletableTheme, useActivateTheme, useDeleteTheme} from '../../../../api/themes'; +import {Theme, isActiveTheme, isDefaultTheme, isDeletableTheme, isLegacyTheme, useActivateTheme, useDeleteTheme} from '../../../../api/themes'; import {downloadFile, getGhostPaths} from '../../../../utils/helpers'; interface ThemeActionProps { @@ -23,6 +23,8 @@ function getThemeLabel(theme: Theme): React.ReactNode { if (isDefaultTheme(theme)) { label += ' (default)'; + } else if (isLegacyTheme(theme)) { + label += ' (legacy)'; } else if (theme.package?.name !== theme.name) { label = diff --git a/apps/admin-x-settings/src/components/settings/site/theme/OfficialThemes.tsx b/apps/admin-x-settings/src/components/settings/site/theme/OfficialThemes.tsx index 860fb95053..39ddf9dd37 100644 --- a/apps/admin-x-settings/src/components/settings/site/theme/OfficialThemes.tsx +++ b/apps/admin-x-settings/src/components/settings/site/theme/OfficialThemes.tsx @@ -4,6 +4,13 @@ import ModalPage from '../../../../admin-x-ds/global/modal/ModalPage'; import React from 'react'; import {OfficialTheme, useOfficialThemes} from '../../../providers/ServiceProvider'; import {getGhostPaths, resolveAsset} from '../../../../utils/helpers'; +import {useEffect, useState} from 'react'; + +const sourceDemos = [ + {image: 'Source.png', category: 'News'}, + {image: 'Source-Magazine.png', category: 'Magazine'}, + {image: 'Source-Newsletter.png', category: 'Newsletter'} +]; const OfficialThemes: React.FC<{ onSelectTheme?: (theme: OfficialTheme) => void; @@ -12,6 +19,20 @@ const OfficialThemes: React.FC<{ }) => { const {adminRoot} = getGhostPaths(); const officialThemes = useOfficialThemes(); + const [currentSourceDemoIndex, setCurrentSourceDemoIndex] = useState(0); + const [isHovered, setIsHovered] = useState(false); + + useEffect(() => { + const interval = setInterval(() => { + if (isHovered) { + setCurrentSourceDemoIndex(prevIndex => (prevIndex + 1) % sourceDemos.length); + } + }, 3000); + + return () => { + clearInterval(interval); + }; + }, [isHovered]); return ( @@ -22,16 +43,33 @@ const OfficialThemes: React.FC<{ onSelectTheme?.(theme); }}> {/* {theme.name} */} -
- {`${theme.name} +
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}> + {theme.name !== 'Source' ? + {`${theme.name} : + <> + {sourceDemos.map((demo, index) => ( + {`${theme.name} + ))} + + }
-
+
{theme.name} - {theme.category} + {theme.name !== 'Source' ? + {theme.category} : + sourceDemos.map((demo, index) => ( + {demo.category} + )) + }
); diff --git a/apps/admin-x-settings/src/components/settings/site/theme/ThemePreview.tsx b/apps/admin-x-settings/src/components/settings/site/theme/ThemePreview.tsx index eefe52f479..31f185c89a 100644 --- a/apps/admin-x-settings/src/components/settings/site/theme/ThemePreview.tsx +++ b/apps/admin-x-settings/src/components/settings/site/theme/ThemePreview.tsx @@ -7,9 +7,16 @@ import MobileChrome from '../../../../admin-x-ds/global/chrome/MobileChrome'; import NiceModal from '@ebay/nice-modal-react'; import PageHeader from '../../../../admin-x-ds/global/layout/PageHeader'; import React, {useState} from 'react'; +import Select, {SelectOption} from '../../../../admin-x-ds/global/form/Select'; import {OfficialTheme} from '../../../providers/ServiceProvider'; import {Theme} from '../../../../api/themes'; +const sourceDemos = [ + {label: 'News', value: 'news', url: 'https://source.ghost.io'}, + {label: 'Magazine', value: 'magazine', url: 'https://source-magazine.ghost.io'}, + {label: 'Newsletter', value: 'newsletter', url: 'https://source-newsletter.ghost.io'} +]; + const ThemePreview: React.FC<{ selectedTheme?: OfficialTheme; isInstalling?: boolean; @@ -26,6 +33,7 @@ const ThemePreview: React.FC<{ onInstall }) => { const [previewMode, setPreviewMode] = useState('desktop'); + const [currentSourceDemo, setCurrentSourceDemo] = useState(sourceDemos[0]); if (!selectedTheme) { return null; @@ -68,6 +76,7 @@ const ThemePreview: React.FC<{
+ {selectedTheme.name === 'Source' ? + <> + + + + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/feature-image.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/feature-image.hbs new file mode 100644 index 0000000000..2dc4f73094 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/feature-image.hbs @@ -0,0 +1,17 @@ +{{#if feature_image}} +
+ {{title}} + {{#if feature_image_caption}} +
{{feature_image_caption}}
+ {{/if}} +
+{{/if}} \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/arrow.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/arrow.hbs new file mode 100644 index 0000000000..babf7d93d6 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/arrow.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/avatar.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/avatar.hbs new file mode 100644 index 0000000000..af37fca396 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/avatar.hbs @@ -0,0 +1 @@ + diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/burger.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/burger.hbs new file mode 100644 index 0000000000..e2f34637e2 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/burger.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/checkmark.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/checkmark.hbs new file mode 100644 index 0000000000..0d65d581c9 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/checkmark.hbs @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/close.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/close.hbs new file mode 100644 index 0000000000..d0bb34863d --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/close.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/facebook.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/facebook.hbs new file mode 100644 index 0000000000..7c12d7c56e --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/facebook.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/fire.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/fire.hbs new file mode 100644 index 0000000000..9978809a4d --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/fire.hbs @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/loader.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/loader.hbs new file mode 100644 index 0000000000..4616576d1b --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/loader.hbs @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/lock.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/lock.hbs new file mode 100644 index 0000000000..0bbd8b405a --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/lock.hbs @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/rss.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/rss.hbs new file mode 100644 index 0000000000..384023893c --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/rss.hbs @@ -0,0 +1 @@ + diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/search.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/search.hbs new file mode 100644 index 0000000000..369d7f9cc1 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/search.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/icons/twitter.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/icons/twitter.hbs new file mode 100644 index 0000000000..70b73bd3c3 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/icons/twitter.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/lightbox.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/lightbox.hbs new file mode 100644 index 0000000000..642d86d14c --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/lightbox.hbs @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/post-card.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/post-card.hbs new file mode 100644 index 0000000000..ca20282aa2 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/post-card.hbs @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/partials/search-toggle.hbs b/ghost/core/test/utils/fixtures/themes/source/partials/search-toggle.hbs new file mode 100644 index 0000000000..ab24c8230a --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/partials/search-toggle.hbs @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/post.hbs b/ghost/core/test/utils/fixtures/themes/source/post.hbs new file mode 100644 index 0000000000..efb90b52fb --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/post.hbs @@ -0,0 +1,63 @@ +{{!< default}} +{{!-- The tag above means: insert everything in this file into the body of the default.hbs template --}} + +{{#post}} + +
+ +
+ +
+ + {{#if primary_tag}} + + {{/if}} +

{{title}}

+ {{#if custom_excerpt}} +

{{custom_excerpt}}

+ {{/if}} + + + + {{> "feature-image"}} + +
+ +
+ {{content}} +
+ +
+ + {{#if comments}} +
+ {{comments}} +
+ {{/if}} + +
+ +{{/post}} + +{{> "components/post-list" feed="recent" postFeedStyle="Grid" title="Read more" showTitle=true showSidebar=false}} \ No newline at end of file diff --git a/ghost/core/test/utils/fixtures/themes/source/tag.hbs b/ghost/core/test/utils/fixtures/themes/source/tag.hbs new file mode 100644 index 0000000000..4ab5adf838 --- /dev/null +++ b/ghost/core/test/utils/fixtures/themes/source/tag.hbs @@ -0,0 +1,22 @@ +{{!< default}} +{{!-- The tag above means: insert everything in this file into the body of the default.hbs template --}} + +
+ + {{#tag}} +
+
+
+

{{name}}

+ {{#if description}} +

{{description}}

+ {{/if}} +
+ {{> "feature-image"}} +
+
+ {{/tag}} + + {{> "components/post-list" feed="archive" postFeedStyle=@custom.post_feed_style showTitle=false showSidebar=@custom.show_site_in_sidebar}} + +
\ No newline at end of file