From 735914621454ac753bfa89ca7aadca2f9b8e8d29 Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Tue, 13 Jan 2026 16:15:31 +1300 Subject: [PATCH 1/8] Add blog posts feature --- kibble.json | 17 ++++ package-lock.json | 15 ++-- package.json | 2 +- site/en_AU.all.json | 11 ++- site/styles/_pages.scss | 2 + site/styles/_posts.scss | 130 +++++++++++++++++++++++++++ site/styles/_variables.scss | 5 ++ site/styles/main.scss | 1 + site/templates/page/post.jet | 29 ++++++ site/templates/page/posts-index.jet | 66 ++++++++++++++ site/templates/page/posts/shared.jet | 34 +++++++ 11 files changed, 303 insertions(+), 9 deletions(-) create mode 100644 site/styles/_posts.scss create mode 100644 site/templates/page/post.jet create mode 100644 site/templates/page/posts-index.jet create mode 100644 site/templates/page/posts/shared.jet diff --git a/kibble.json b/kibble.json index ececa720..21ba65ad 100644 --- a/kibble.json +++ b/kibble.json @@ -173,6 +173,23 @@ "datasource": "PageIndex", "pageSize": 0 }, + { + "name": "postIndex", + "firstPageUrlPath": "/posts/", + "urlPath": "/posts/:index/", + "templatePath": "templates/page/posts-index.jet", + "datasource": "PageIndex", + "options": { + "pageTypes": [ + "post" + ], + "sortBy": [ + "published_date:desc", + "title:asc" + ] + }, + "pageSize": 5 + }, { "name": "bundleItem", "urlPath": "/bundle/:slug/", diff --git a/package-lock.json b/package-lock.json index 53e0771a..a06f8367 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "postcss-cli": "^11.0.1", "rollup": "^2.23.0", "rollup-plugin-terser": "^6.1.0", - "s72-kibble": "^0.17.8", + "s72-kibble": "^0.17.9", "sass": "^1.36.0" }, "devDependencies": { @@ -8180,10 +8180,11 @@ } }, "node_modules/s72-kibble": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/s72-kibble/-/s72-kibble-0.17.8.tgz", - "integrity": "sha512-YzmlHFZxZfAZX6Jzk/CniLF7M51PIa5xTYZ1pdsdOPNgaXviLo4aD9Zkt4eqvdgReJ/8MRkZXqT4nMmA+cwbyg==", + "version": "0.17.9", + "resolved": "https://registry.npmjs.org/s72-kibble/-/s72-kibble-0.17.9.tgz", + "integrity": "sha512-nZZP0gCu88n9u37VhgHEijR2pWPNYDNpAKcPdvMQ+cGclsJdBT+DkRiZHHeR0sa7jOvEeHGxDuENzLrNRov3AA==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "binwrap": "^0.2.0" }, @@ -15367,9 +15368,9 @@ } }, "s72-kibble": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/s72-kibble/-/s72-kibble-0.17.8.tgz", - "integrity": "sha512-YzmlHFZxZfAZX6Jzk/CniLF7M51PIa5xTYZ1pdsdOPNgaXviLo4aD9Zkt4eqvdgReJ/8MRkZXqT4nMmA+cwbyg==", + "version": "0.17.9", + "resolved": "https://registry.npmjs.org/s72-kibble/-/s72-kibble-0.17.9.tgz", + "integrity": "sha512-nZZP0gCu88n9u37VhgHEijR2pWPNYDNpAKcPdvMQ+cGclsJdBT+DkRiZHHeR0sa7jOvEeHGxDuENzLrNRov3AA==", "requires": { "binwrap": "^0.2.0" } diff --git a/package.json b/package.json index 70eaccae..a096ff5d 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "postcss-cli": "^11.0.1", "rollup": "^2.23.0", "rollup-plugin-terser": "^6.1.0", - "s72-kibble": "^0.17.8", + "s72-kibble": "^0.17.9", "sass": "^1.36.0" }, "devDependencies": { diff --git a/site/en_AU.all.json b/site/en_AU.all.json index ea582408..e5f1f5db 100644 --- a/site/en_AU.all.json +++ b/site/en_AU.all.json @@ -1745,5 +1745,14 @@ }, "wcag_aria_label_social_bluesky": { "other": "Visit us on Bluesky" + }, + "posts_pagination_next": { + "other": "Older posts" + }, + "posts_pagination_prev": { + "other": "Newer posts" + }, + "post_preview_show_more": { + "other": "Read more" } -} \ No newline at end of file +} diff --git a/site/styles/_pages.scss b/site/styles/_pages.scss index 3dc57a4c..743da10f 100644 --- a/site/styles/_pages.scss +++ b/site/styles/_pages.scss @@ -38,6 +38,8 @@ .curated-page, .library-page, .content-page, +.post-page, +.posts-index-page, .form-page, .wishlist-page, .search-page, diff --git a/site/styles/_posts.scss b/site/styles/_posts.scss new file mode 100644 index 00000000..3db31461 --- /dev/null +++ b/site/styles/_posts.scss @@ -0,0 +1,130 @@ +.post-page, +.posts-index-page { + & { + margin-top: 2rem; + margin-left: auto; + margin-right: auto; + padding-left: 0; + padding-right: 0; + width: var(--page-reading-column-width); + max-width: calc(min(95vw, 1100px)); + } + + .post-title { + @include heading-2-style(); + margin-bottom: 0.5rem; + line-height: 1.3; + + & > a { + text-decoration: none; + &:hover { + text-decoration: underline; + } + } + } + + .post-meta { + display: flex; + flex-wrap: wrap; + opacity: 0.7; + font-size: var(--body-2-style-font-size); + margin-bottom: 1rem; + } + + .post-published-date::first-letter { + text-transform: capitalize; // icky hack for dates like "yesterday 10:32am" maybe the s72-time component needs a 'format' prop so we can force short dates? + } + + .post-header-image { + margin-bottom: 1rem; + + s72-image { + display: flex; + flex-direction: column; + aspect-ratio: 1200 / 422; + + border-radius: 0.5rem; + overflow: hidden; + + transition: background-color 0.25s ease; + background-color: var(--poster-skeleton-background-color); + + &.s72-image--loaded { + background-color: transparent; + aspect-ratio: unset; + } + + img { + transition: opacity 0.25s ease; + opacity: 0; + &.s72-image--loaded { + opacity: 1; + } + } + + } + } + + .post-body { + &, & p { + word-wrap: break-word; + font-weight: var(--post-body-font-weight); + line-height: var(--post-body-line-height); + } + + strong { + font-weight: bolder; + } + + a { + @include a; + } + } + + comment-section { + padding: 0; + margin-top: 3rem; + } + +} + +.posts-index-page { + .post-preview + .post-preview { + margin-top: 8rem; + } + + .post-preview-show-more { + text-align: center; + opacity: 0.7; + } + + // Overflow behaviour: js in the template applies a .post-preview--overflowed class + .post-preview { + .post-body { + max-height: 400px; + } + + .post-preview-show-more { + display: none; + } + + &.post-preview--overflowed { + .post-preview-show-more { display: block; } + .post-body { + mask-image: linear-gradient(180deg, #000 72%, transparent); + } + } + } + + .posts-pagination { + display: flex; + justify-content: space-between; + margin-top: 4rem; + padding-top: 2rem; + border-top: 1px solid #fff5; + + .posts-pagination-next { + margin-left: auto; + } + } +} diff --git a/site/styles/_variables.scss b/site/styles/_variables.scss index cb4b40aa..6fef1680 100644 --- a/site/styles/_variables.scss +++ b/site/styles/_variables.scss @@ -140,6 +140,11 @@ --page-detail-padding-hz: 20px; --page-detail-padding-hz-lg: 50px; + --page-reading-column-width: 69ch; + + --post-body-font-weight: 400; + --post-body-line-height: 1.55; + --heading-1-style-letter-spacing: normal; --heading-2-style-letter-spacing: normal; --heading-3-style-letter-spacing: normal; diff --git a/site/styles/main.scss b/site/styles/main.scss index 1ecf3ae5..8c73c885 100644 --- a/site/styles/main.scss +++ b/site/styles/main.scss @@ -10,6 +10,7 @@ @import '_buttons'; @import '_cta-buttons'; @import '_pages'; +@import '_posts'; @import '_forms'; @import '_card'; diff --git a/site/templates/page/post.jet b/site/templates/page/post.jet new file mode 100644 index 00000000..4bc3dd50 --- /dev/null +++ b/site/templates/page/post.jet @@ -0,0 +1,29 @@ +{{extends "templates/application/application.jet"}} + +{{import "templates/page/posts/shared.jet"}} +{{import "templates/common/background-image.jet"}} + +{{block head()}} + {{yield seo() page}} +{{end}} + +{{block body()}} +
+ {{yield backgroundImage(containerClass="page-bg", gradientClass="right-gradient", imageClass="page-bg-img", imageSrc=page.Images.Background)}} + +
+ {{yield postTitle(post=page)}} + {{yield postMeta(post=page)}} + {{yield postHeaderImage(post=page)}} + {{yield postBody(text=page.Content)}} +
+ + {{if isEnabled("commenting")}} + + {{end}} +
+{{end}} + + + +{{block appBadges()}}{{end}} diff --git a/site/templates/page/posts-index.jet b/site/templates/page/posts-index.jet new file mode 100644 index 00000000..841d519a --- /dev/null +++ b/site/templates/page/posts-index.jet @@ -0,0 +1,66 @@ +{{extends "templates/application/application.jet"}} + +{{import "templates/page/posts/shared.jet"}} +{{import "templates/common/background-image.jet"}} + +{{block body()}} +
+ {{range page := pages}} + {{yield postPreview(post=page)}} + {{end}} + +
+ {{ if len(pagination.PreviousURL) > 0 }} + {{i18n("posts_pagination_prev")}} + {{end}} + {{ if len(pagination.NextURL) > 0 }} + {{i18n("posts_pagination_next")}} + {{end}} +
+ + +{{end}} + + +{{block postPreview(post)}} +
+ {{yield postTitle(post=post, href=routeTo(post, "pageItem"))}} + {{yield postMeta(post=post)}} + {{yield postHeaderImage(post=post)}} + {{yield postBody(text=post.Content)}} + {{i18n("post_preview_show_more")}} +
+{{end}} + + +{{block appBadges()}}{{end}} diff --git a/site/templates/page/posts/shared.jet b/site/templates/page/posts/shared.jet new file mode 100644 index 00000000..9bd2c02d --- /dev/null +++ b/site/templates/page/posts/shared.jet @@ -0,0 +1,34 @@ +{{block postTitle(post, href="")}} +

+ {{if len(href) > 0}} + {{post.Title}} + {{else}} + {{post.Title}} + {{end}} +

+{{end}} + +{{block postMeta(post)}} +
+ {{if !post.PublishedDate.IsZero()}} + + {{end}} +
+{{end}} + +{{block postHeaderImage(post)}} + {{if len(post.Images.Header) > 0}} +
+ +
+ {{end}} +{{end}} + +{{block postBody(text="")}} +
+ {{text | raw}} +
+{{end}} From afbc576f1b2dd3ffa447007887ad20fb9e721f6d Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Tue, 13 Jan 2026 16:15:57 +1300 Subject: [PATCH 2/8] bump builderVersion --- kibble.json | 1 + 1 file changed, 1 insertion(+) diff --git a/kibble.json b/kibble.json index 21ba65ad..f2a73ebd 100644 --- a/kibble.json +++ b/kibble.json @@ -3,6 +3,7 @@ "version": "1.9.31", "siteUrl": "https://tvoddemo.shift72.com", "builderVersion": "0.17.8", + "builderVersion": "0.17.9", "defaultLanguage": "en", "languages": { "ar": { From a8be73bfeb8a28bba90c6558bf399ba8500b427d Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Tue, 13 Jan 2026 16:20:24 +1300 Subject: [PATCH 3/8] blog feed: reduce spacing a bit, make it a parameter --- site/styles/_posts.scss | 2 +- site/styles/_variables.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/site/styles/_posts.scss b/site/styles/_posts.scss index 3db31461..80f76aad 100644 --- a/site/styles/_posts.scss +++ b/site/styles/_posts.scss @@ -90,7 +90,7 @@ .posts-index-page { .post-preview + .post-preview { - margin-top: 8rem; + margin-top: var(--posts-index-spacing); } .post-preview-show-more { diff --git a/site/styles/_variables.scss b/site/styles/_variables.scss index 6fef1680..32458e6b 100644 --- a/site/styles/_variables.scss +++ b/site/styles/_variables.scss @@ -142,6 +142,7 @@ --page-reading-column-width: 69ch; + --posts-index-spacing: 6rem; --post-body-font-weight: 400; --post-body-line-height: 1.55; From d5183509924917830f1c1e65f7e977d326ad6899 Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Tue, 13 Jan 2026 16:33:56 +1300 Subject: [PATCH 4/8] make post preview height a param too --- site/styles/_posts.scss | 2 +- site/styles/_variables.scss | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/site/styles/_posts.scss b/site/styles/_posts.scss index 80f76aad..7bd799c3 100644 --- a/site/styles/_posts.scss +++ b/site/styles/_posts.scss @@ -101,7 +101,7 @@ // Overflow behaviour: js in the template applies a .post-preview--overflowed class .post-preview { .post-body { - max-height: 400px; + max-height: var(--post-preview-height); } .post-preview-show-more { diff --git a/site/styles/_variables.scss b/site/styles/_variables.scss index 32458e6b..3274138a 100644 --- a/site/styles/_variables.scss +++ b/site/styles/_variables.scss @@ -143,6 +143,8 @@ --page-reading-column-width: 69ch; --posts-index-spacing: 6rem; + --post-preview-height: 300px; + --post-body-font-weight: 400; --post-body-line-height: 1.55; From 49351436fed52edc139ca99badc255a32c79d6fb Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Tue, 13 Jan 2026 16:37:03 +1300 Subject: [PATCH 5/8] rename posts index -> post feed --- kibble.json | 2 +- site/styles/_pages.scss | 2 +- site/styles/_posts.scss | 6 +++--- site/styles/_variables.scss | 2 +- site/templates/page/{posts-index.jet => posts-feed.jet} | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename site/templates/page/{posts-index.jet => posts-feed.jet} (97%) diff --git a/kibble.json b/kibble.json index f2a73ebd..e724d10d 100644 --- a/kibble.json +++ b/kibble.json @@ -178,7 +178,7 @@ "name": "postIndex", "firstPageUrlPath": "/posts/", "urlPath": "/posts/:index/", - "templatePath": "templates/page/posts-index.jet", + "templatePath": "templates/page/posts-feed.jet", "datasource": "PageIndex", "options": { "pageTypes": [ diff --git a/site/styles/_pages.scss b/site/styles/_pages.scss index 743da10f..6f36c4c5 100644 --- a/site/styles/_pages.scss +++ b/site/styles/_pages.scss @@ -39,7 +39,7 @@ .library-page, .content-page, .post-page, -.posts-index-page, +.posts-feed-page, .form-page, .wishlist-page, .search-page, diff --git a/site/styles/_posts.scss b/site/styles/_posts.scss index 7bd799c3..ef42a64c 100644 --- a/site/styles/_posts.scss +++ b/site/styles/_posts.scss @@ -1,5 +1,5 @@ .post-page, -.posts-index-page { +.posts-feed-page { & { margin-top: 2rem; margin-left: auto; @@ -88,9 +88,9 @@ } -.posts-index-page { +.posts-feed-page { .post-preview + .post-preview { - margin-top: var(--posts-index-spacing); + margin-top: var(--posts-feed-spacing); } .post-preview-show-more { diff --git a/site/styles/_variables.scss b/site/styles/_variables.scss index 3274138a..66e5634e 100644 --- a/site/styles/_variables.scss +++ b/site/styles/_variables.scss @@ -142,7 +142,7 @@ --page-reading-column-width: 69ch; - --posts-index-spacing: 6rem; + --posts-feed-spacing: 6rem; --post-preview-height: 300px; --post-body-font-weight: 400; diff --git a/site/templates/page/posts-index.jet b/site/templates/page/posts-feed.jet similarity index 97% rename from site/templates/page/posts-index.jet rename to site/templates/page/posts-feed.jet index 841d519a..6c041191 100644 --- a/site/templates/page/posts-index.jet +++ b/site/templates/page/posts-feed.jet @@ -4,7 +4,7 @@ {{import "templates/common/background-image.jet"}} {{block body()}} -
+
{{range page := pages}} {{yield postPreview(post=page)}} {{end}} From a760c76d73d2207040e9228f9d3bd490b15cca90 Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Wed, 14 Jan 2026 14:53:01 +1300 Subject: [PATCH 6/8] css fixes --- site/styles/_posts.scss | 142 ++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/site/styles/_posts.scss b/site/styles/_posts.scss index ef42a64c..4ae11633 100644 --- a/site/styles/_posts.scss +++ b/site/styles/_posts.scss @@ -1,91 +1,98 @@ .post-page, .posts-feed-page { - & { - margin-top: 2rem; - margin-left: auto; - margin-right: auto; - padding-left: 0; - padding-right: 0; - width: var(--page-reading-column-width); - max-width: calc(min(95vw, 1100px)); - } + margin-top: 2rem; + margin-left: auto; + margin-right: auto; + padding-left: 0; + padding-right: 0; + width: var(--page-reading-column-width); + max-width: calc(min(95vw, 1100px)); +} - .post-title { - @include heading-2-style(); - margin-bottom: 0.5rem; - line-height: 1.3; +.post-title { + @include heading-2-style(); + margin-bottom: 0.5rem; + line-height: 1.3; - & > a { - text-decoration: none; - &:hover { - text-decoration: underline; - } - } - } + > a { + text-decoration: none; - .post-meta { - display: flex; - flex-wrap: wrap; - opacity: 0.7; - font-size: var(--body-2-style-font-size); - margin-bottom: 1rem; + &:hover { + text-decoration: underline; + } } +} - .post-published-date::first-letter { - text-transform: capitalize; // icky hack for dates like "yesterday 10:32am" maybe the s72-time component needs a 'format' prop so we can force short dates? - } +.post-meta { + display: flex; + flex-wrap: wrap; + opacity: 0.7; + font-size: var(--body-2-style-font-size); + margin-bottom: 1rem; +} - .post-header-image { - margin-bottom: 1rem; +.post-published-date::first-letter { + text-transform: capitalize; // icky hack for dates like "yesterday 10:32am" maybe the s72-time component needs a 'format' prop so we can force short dates? +} - s72-image { - display: flex; - flex-direction: column; - aspect-ratio: 1200 / 422; +.post-header-image { + margin-bottom: 1rem; - border-radius: 0.5rem; - overflow: hidden; + s72-image { + display: flex; + flex-direction: column; + aspect-ratio: 1200 / 422; + + border-radius: 0.5rem; + overflow: hidden; + + transition: background-color 0.25s ease; + background-color: var(--poster-skeleton-background-color); + + /* stylelint-disable selector-no-qualifying-type */ + // a bit of a pedantic rule, wrong in this case. applies the + // modifier classes to the wrapper element as well as the , but setting + // a background color for the skeleton needs to happen on the wrapper + // because you can't colour an + &.s72-image--loaded { + background-color: transparent; + aspect-ratio: unset; + } - transition: background-color 0.25s ease; - background-color: var(--poster-skeleton-background-color); + img { + transition: opacity 0.25s ease; + opacity: 0; &.s72-image--loaded { - background-color: transparent; - aspect-ratio: unset; + opacity: 1; } - - img { - transition: opacity 0.25s ease; - opacity: 0; - &.s72-image--loaded { - opacity: 1; - } - } - } + /* stylelint-enable selector-no-qualifying-type */ } +} - .post-body { - &, & p { - word-wrap: break-word; - font-weight: var(--post-body-font-weight); - line-height: var(--post-body-line-height); - } +.post-body { + &, + p { + word-wrap: break-word; + font-weight: var(--post-body-font-weight); + line-height: var(--post-body-line-height); + } - strong { - font-weight: bolder; - } + strong { + font-weight: bolder; + } - a { - @include a; - } + a { + @include a; } +} +.post-page { comment-section { padding: 0; margin-top: 3rem; } - } .posts-feed-page { @@ -95,11 +102,13 @@ .post-preview-show-more { text-align: center; - opacity: 0.7; + opacity: 0.8; } // Overflow behaviour: js in the template applies a .post-preview--overflowed class .post-preview { + overflow: hidden; + .post-body { max-height: var(--post-preview-height); } @@ -109,7 +118,10 @@ } &.post-preview--overflowed { - .post-preview-show-more { display: block; } + .post-preview-show-more { + display: block; + } + .post-body { mask-image: linear-gradient(180deg, #000 72%, transparent); } From 846551b116ee4b2dca1e028596f210b3b3bc8f04 Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Wed, 14 Jan 2026 14:59:15 +1300 Subject: [PATCH 7/8] css linting --- site/styles/_forms.scss | 2 +- site/styles/_legacy.scss | 2 +- site/styles/_meta-detail.scss | 8 ++++---- site/styles/_meta-sub-item.scss | 1 - site/styles/_variables.scss | 1 - 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/site/styles/_forms.scss b/site/styles/_forms.scss index ff2345fc..8f481758 100644 --- a/site/styles/_forms.scss +++ b/site/styles/_forms.scss @@ -1,4 +1,4 @@ -@use "sass:math"; +@use 'sass:math'; label { @include subtitle-1-style; diff --git a/site/styles/_legacy.scss b/site/styles/_legacy.scss index 9a0ed169..598f3238 100644 --- a/site/styles/_legacy.scss +++ b/site/styles/_legacy.scss @@ -1,4 +1,4 @@ -@use "sass:math"; +@use 'sass:math'; html { height: 100%; diff --git a/site/styles/_meta-detail.scss b/site/styles/_meta-detail.scss index e7df45b3..19c607e7 100644 --- a/site/styles/_meta-detail.scss +++ b/site/styles/_meta-detail.scss @@ -169,10 +169,6 @@ margin-right: 20px; width: 110px; - &.poster-image { - margin-bottom: 0px; - } - @include media-breakpoint-up(xs) { width: 155px; } @@ -181,6 +177,10 @@ width: 208px; } + &.poster-image { + margin-bottom: 0; + } + .live { display: none; } diff --git a/site/styles/_meta-sub-item.scss b/site/styles/_meta-sub-item.scss index fab076f7..def18d4e 100644 --- a/site/styles/_meta-sub-item.scss +++ b/site/styles/_meta-sub-item.scss @@ -110,7 +110,6 @@ } } - s72-show-hide-switcher { display: block; margin-bottom: 15px; diff --git a/site/styles/_variables.scss b/site/styles/_variables.scss index 66e5634e..1286e5fc 100644 --- a/site/styles/_variables.scss +++ b/site/styles/_variables.scss @@ -195,7 +195,6 @@ --playback-progress-bar-color: var(--secondary); --playback-progress-bar-bg-color: rgba(var(--body-bg-rgb), 0.5); - // Detail player --page-detail-player-padding-top: 140px; --page-detail-player-padding-top-lg: 200px; From 2f43bb7cfe5005c24ef09b80aa4b2f3217a96d5e Mon Sep 17 00:00:00 2001 From: Sam Douglas Date: Wed, 14 Jan 2026 15:05:11 +1300 Subject: [PATCH 8/8] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e44afe25..017589a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased](https://github.com/shift72/core-template/compare/1.9.31...HEAD) +### Added + +Blog posts and feed. A /posts/ route has been added to kibble.json for the feed, +but it shouldn't affect sites that don't actively use the posts feature and link +to it from the nav. + ## [1.9.31](https://github.com/shift72/core-template/compare/1.9.29...1.9.31) ### Added