v0.2.5
- 2.7 — Make the page shell configurable and hookable.
<body>'s classes
now come from[params.twClasses] bodyandbodyDarkinstead of being
hardcoded inbaseof.html; the wrapper<div>gains a stablesite-shell
class withposition: relative; and the dev-onlytw-size-indicatorpartial
moves inside that wrapper, so<body>has exactly one element child in every
environment.bodyDarkis separate frombodyso that customizing the body
font cannot silently disable dark mode, and sodarkMode = "off"still emits
nodark:variants (unchanged from v0.2.4). - 4.1 — Ship
ryderTrack, anAlpine.data()component that reads
data-track-event/data-track-propsoff the clicked element and forwards
them to the configured analytics provider (PostHog or Plausible). Missing
providers no-op and malformed props warn and degrade to{}— neither breaks
the handler. - 4.2 — Ship
ryderForm, anAlpine.data()component that POSTs a form as
JSON todata-form-action, exposesstatusplusisIdle/isLoading/
isSuccess/isError, honors a_gotchahoneypot, and fires an optional
data-track-eventon success. - 4.4 — Add
assets/js/cspLint.js, a development-only linter that warns in
the console about Alpine directives the CSP evaluator cannot run — references
to browser globals, and arrow functions — naming the offending element. It is
never loaded outsidehugo.Environment == "development". - 4.5 — Document the CSP-Alpine restriction in
README.md, along with both
new components andassets/js/extended.js, the theme's sanctioned custom-JS
hook, which was previously undocumented. - 2.1 — Ship
_default/list-plain.html(title +.Content, no
pagination/card grid) for data-driven singleton sections, selected via
Hugo's ownlayoutfront-matter field; shippartials/utils/data-items.html,
a returning partial for the.Site.Data.<name>.items | default sliceidiom. - 2.3 — Widen the OG image resolver with a front-matter
og_imageescape
hatch, checked before the existing bundle-resource /og_image_default
chain (which is otherwise unchanged). - 2.4 — Support
hideIfEmptyDataunder[menus.<id>.params], naming a
data/*.jsonfile whoseitemsarray must be non-empty for that menu
entry to render. - 2.5 — Resolve a page-overridable
navClass(ortwClasses.nav) in
header.htmland pass it into the menu partial, so a single page can
restyle just the nav without forkingheader.htmlinto a newheaderType
variant. Documented as the "one variant plus.Paramfor the skin"
pattern. - 5.1 — Ship
youtube-embedandspotify-embedshortcodes, following
thesoundcloud/openstreetmappattern of auto-registering their iframe
host in CSPframe-src. Named distinctly from Hugo's built-inyoutube
shortcode rather than overriding it. - 5.2 — Add a
video-lightboxshortcode and avideoLightbox
Alpine.data()component beside the existingimageGallery(images
only); the iframe'ssrcis only set once the modal opens. - 5.3 —
utils/socialslist.htmlnow accepts a flat name → URL map (what
Decap CMS emits) in addition to the original{main:[...]}shape, and
ships inline SVGs for Instagram, TikTok, Apple Music, Tidal, and Spotify
for entries with noiconfield, rather than widening the tree-shaken
Font Awesome brand set. - 5.4 — Add
logo_wrapperClass; the wrapper chrome (background, hover
state, padding) around the logo is now dropped automatically once
logo_pngis set.logo_png's.Param(page-overridable) contract is
documented as authoritative. - 5.5 — Parameterize
head/favicon.htmlvia[params.favicon](ico,
version,svg,appleTouchIcon,webmanifest), each defaulting to a
file the theme already ships. - 5.6 —
_default/home.htmlnow readsshowHomeFeedvia.Param
instead ofsite.Params, so a page-level override (e.g. a cascade) is
honored instead of being a silent no-op. - Issue #3 (partial) — Add
[params.fonts](family,
googleFontsFamily,disableGoogleFonts), coveringhead/fonts.html's
Google Fonts URL and a new--ryder-font-familyCSS custom property that
assets/css/main.css's.resp-sharing-buttonrule now reads. Does not
close issue #3 — seedocs/specs/v0.3.md's cross-check for what remains.
Breaking
None. Everything above is additive or opt-in.
Migration note — 2.7 changes the DOM around <body>
Two structural changes ship in 2.7. Neither changes rendered output on a stock
site, but both can affect a site with its own CSS. Grep your CSS for body >
before upgrading.
-
The wrapper
<div>is nowposition: relative. It was unpositioned, so
it did not establish a containing block. Anyposition: absolutedescendant
that was previously resolving against the viewport (or against some further
ancestor) now resolves against the shell instead, and may move. Audit
absolutely-positioned elements, particularly full-bleed and off-canvas
elements that relied oninset-0reaching the viewport. -
tw-size-indicatormoved inside the wrapper. In non-production builds it
used to render as a sibling of the wrapper, so<body>had two element
children in development and one in production. Any selector written against
<body>'s direct children —body > div,body > *:first-child,
:nth-child()on that level, or a:not()hack written to skip the
indicator — was already environment-dependent and will now behave
differently.The known real-world case is a rule of the shape:
body:has(.some-nav) > div:not(.fixed) { position: relative; }
That rule exists only to select the wrapper while skipping the dev-only
indicator. It can now be deleted outright: the theme provides both the hook
and the positioning./* replace the above with nothing, or target the hook directly */ .site-shell { … }
If you override layouts/_default/baseof.html in your own site, your copy
shadows the theme's and none of this applies until you re-sync it — which also
means you will not get twClasses.body or site-shell until you do.