All notable changes to Dirtbag are documented here.
This project follows the spirit of Keep a Changelog and uses version tags such as v0.1.2.
- Emit
color-schemeandtheme-colormeta tags derived from the active style variation's background colour. WordPress core emits neither; withoutcolor-scheme, form controls and scrollbars render as light user-agent widgets on the dark variations (Terminal, Amber CRT, Blueprint). Derived from the resolved global styles rather than a variation slug, so the tags follow the site owner's own Site Editor customisations. The default Brutalist style declares no background and deliberately gets neither tag. docs/head-metadata.md— who emits what in<head>: what core already provides a block theme, the two tags Dirtbag adds, and why meta description, Open Graph, and JSON-LD deliberately need a plugin.- Unit tests for the colour-scheme derivation (
tests/php/color-scheme-test.php, dependency-free plain PHP, run bybin/package-check) and a per-style browser spec (tests/styles/head-meta.spec.js). bin/package-checknow requiresstyles.color.backgroundin each style variation to be a literal hex colour, since a non-hex value would silently drop both meta tags.bin/package-checknow rejects astyles.csskey in any style variation, which would clobbertheme.json's root CSS the same way user Additional CSS did.tests/styles/additional-css.spec.js— regression coverage for that clobber, tagged@self-switchingalongsidesticking.spec.jsso the per-style sweep excludes both.- A print stylesheet, as an
@media printblock intheme.json's rootstyles.css(the theme ships no CSS files). The site printed as-styled before, and browsers do not print background colours: the dark variations (Terminal, Amber CRT, Blueprint) kept their near-white text, lost the black behind it, and came out of the printer blank. Printing is now black on white whatever the variation, with the truck logo's dark-screen filter reset, navigation, skip links, search, post navigation and comment chrome dropped, absolute links in the article body spelled out, and headings kept with what they head. tests/styles/print.spec.js— per-style print coverage, including a check that the post title and content still print, so an over-eager reset fails loudly. Runs in CI as well as locally: every assertion holds for any active variation.docs/print-styles.md— what prints, what deliberately does not, and why the guard has to run per style.
playground/apply-style.phpnow links the global-styles post it writes to the active theme, and refuses to report success unless that post is the one the front end reads. Awp_global_stylespost is bound to a theme by awp_themeterm; core creates the post withtax_input, whichwp_insert_post()applies only when the current user can assign terms — and WP-CLI runs with no current user. On a site with no global-styles post for the active theme yet, every invocation therefore created a fresh, untagged post that the front end's own lookup can never find: the helper printed success, the page never changed, and the per-style sweep scanned the default variation seven times over. Observed on the Studio site as 25 orphaned posts alongside the one working post created through the browser.- Repointed the WordPress Studio theme symlink, which referenced a stale path (
Developer/GitHub/dirtbagrather thanDeveloper/GitHub/dknauss/dirtbag). The per-style Playwright sweep had been running against whatever theme was active instead of Dirtbag. - Adding Additional CSS in the Site Editor no longer deletes the theme's own CSS. Core merges global styles with
array_replace_recursive(), and rootstyles.cssis a string, so anything a user typed there replacedtheme.json's entire root stylesheet — silently breaking the per-style truck-icon colour, the front-page column grid, the sidebar thumbnails, and the gallery captions. The theme's rules are now re-prepended to the user layer, so both apply and the user's CSS still wins ties. Clearing the panel again is covered too: core merges on the key rather than the value, so astyles.cssleft present but empty wiped the theme's CSS just as thoroughly.
0.1.17 - 2026-07-03
- Add the WordPress.org theme listing, support forum, and GitHub Sponsors donation link to the WordPress.org readme and maintainer docs.
- Reframe theme-review/testing/backlog docs for post-acceptance maintenance and future WordPress.org releases.
0.1.16 - 2026-06-30
- Theme review (themes.trac #277839): refreshed the front-page screenshot to match the current two-column masthead and dynamic Query Loop sections. Version bump for the WordPress.org resubmission accepted in the theme directory.
0.1.15 - 2026-06-23
- Theme review (themes.trac #277839): replaced real external links in the Blogroll with XFN pattern with example.com placeholders and generic relationship labels, so the theme ships no hard-coded third-party URLs.
- Made every user-facing string in
patterns/front-page.phptranslation-ready and replaced hard-coded demo post links with dynamic Query Loop blocks. - Added explicit licence type and URL details to each resource entry in
readme.txt, clarified that photographs are Playground-only demo media except as incorporated intoscreenshot.png, and removed the Butterick's Practical Typography influence note from bundled-resource credits.
0.1.14 - 2026-06-21
- Packaging:
assets/icons/now ships only the two SVGs the theme actually references (pickup-truck-header.svgfor the Site Logo fallback,pickup-truck.svgfor the h-card photo). The demo site-logo and favicon PNGs moved toplayground/media/(export-ignored; the seed imports them from there), and three unused variants (pickup-truck-header-white.svg,pickup-truck-white.svg,dirtbag-site-icon-white.png) were removed. Trims the WordPress.org zip; the Playground demo's favicon behaviour is unchanged.
- An opaque, manila-backed Site Icon variant (
assets/icons/dirtbag-site-icon-opaque.png) for the browser-tab favicon and the WordPress-admin site icon. CSS filters never reach those raster contexts, so the transparent dark truck disappeared on dark tabs / dark mode; the opaque variant stays visible on any background. Documented indocs/site-icons-and-logos.md.
- The header Site Logo no longer syncs the Site Icon (
shouldSyncIcon:falseon both header logos). The header keeps the transparent truck so the per-styletruckIconFiltercan recolour it on coloured/dark variations, while the favicon uses the opaque variant — the two are now independent. The Playground seed sets a transparentcustom_logoand an opaquesite_iconaccordingly.
functions.phpgives the core image lightbox trigger button a static, translatablearia-label("Enlarge image"). Core renders that<button class="lightbox-trigger">with only a runtime-bounddata-wp-bind--aria-label, so with JavaScript off — or before the Interactivity API hydrates — it has no accessible name and fails the WCAGbutton-namecheck. Arender_blockfilter adds the name in the server HTML using the HTML API (matched at the enclosing block, where the lightbox markup is final); core's script still overrides it with the image-specific label once it runs. This lets images keep the lightbox enabled and stay accessible (cf. 0.1.5, which instead disabled the lightbox on the decorative h-card avatar).
- A first
functions.php: when no Site Logo is set, the header'score/site-logoblock falls back to the bundledassets/icons/pickup-truck-header.svg, sized to the block width and wrapped in core's markup so existing styles (including the dark-mode icon filter) apply. This makes the truck appear on a fresh install and in the generic WordPress.org directory preview, which never runs the demo seed that sets the custom logo. An uploaded Site Logo, or a synced Site Icon, still wins.bin/package-checknow also lintsfunctions.php.
- Front page: the masthead is now a wide two-column row — the
<h1>and an italicised standfirst on the left, a curated "featured posts" link list (bottom-aligned) on the right. The trailing period is dropped from the heading.
languages/dirtbag.pot: corrected the Theme URI and Author URI (danknauss→dknauss, matchingstyle.cssand the git remote) and refreshed the version metadata.
- Theme tags for the WordPress.org directory listing:
block-patterns(17 patterns),translation-ready(full.pot, patterns use translation functions),microformats(h-card / u-url / h-entry markup), and theblogsubject tag. All verified against Theme Check's allowed-tag list.
- Regenerated
languages/dirtbag.potafter the 0.1.6–0.1.8 content additions, picking up 13 previously-missing translatable strings (the Almanac-card and Byline patterns, the front-page pattern title, the Navigation Overlay template part, and the Archive/Search custom-template names).
docs/theme-review.md: documented the WordPress.org upload-scanner (Theme Check) triage. Scanning the 0.1.8 release zip yields no required or warning notes; the remaining two Recommended notes (register_block_style/register_block_patternnot found) are block-theme false positives, and the two Info notes (hard-coded blogroll links, single text-domain) are intentional. None require a code change.
- Front-page standfirst line under the masthead ("Rural speed, shed talk, hard chirps…").
- The "We blamed the browser" post's three-screenshot gallery now seeds into the Playground demo. The seed importer gained a small, general token-rewrite step (
__DBSRC_<id>__/__DBID_<id>__) so in-content media is portable across sites.
- Front-page masthead: "A Roadside Almanac" → "Roadside Almanac." Gallery images get a 2px
currentColorframe.
- Accessibility: gallery image captions render below the image in normal flow instead of WordPress core's white-on-image overlay — fixing colour contrast over light images and the
scrollable-region-focusableoverlay (the issue first removed in 0.1.4).
- Front-page sidebar can render two ways, toggled by one class on
.sidebar-content: a magazine float (title/date/excerpt wrap beside and under the thumbnail; the default) or a media-object grid (.is-grid; thumbnail column + text column). - Posts "The price of a pun" and "We blamed the browser".
docs/repro/: a WordPress-free reproduction and write-up of the Post Title float interaction, filed upstream as WordPress/gutenberg#79372.
- Every post now uses a distinct featured image.
- Baseline-aligned the two front-page section headings; the sidebar's first thumbnail top is flush with the wide column's first image.
- Pinned the stable Playground blueprint to the current release; ignore
.DS_Store.
- Front-page sidebar float: WordPress core styles the Post Title link
display: inline-block, an atomic box that drops below the float when it can't fit beside it (longest titles first). A scopeddisplay: inlineoverride restores the wrap. It is not lazy-loading, DPR, subgrid, or a browser bug — see docs/sidebar-thumbnail-layout.md.
- Front page: a "Used Cars & Unused Plans" sidebar — a compact secondary feed of non-featured posts with square thumbnails — and a small "The Almanac" card. The masthead gains an
<h1>, "A Roadside Almanac". - Published "The build sheet" post.
docs/sidebar-thumbnail-layout.md: the full investigation of a Chrome below-the-fold float bug and the layout shipped in response.
- Front page: shorter tagline ("Good bones and road grit."); a CSS subgrid aligns the two section columns so their first post rows start on the same line, and the sidebar heading is baseline-aligned to the taller wide-column heading.
- Sidebar thumbnails use a CSS grid (fixed thumbnail track + text column). A
floatwrap-under was the goal but proved unreliable in Chrome for below-the-fold entries on narrow/scaled viewports; the float is kept as a documented one-block alternative. - Every post now has a distinct featured image — "The build sheet" gets its own (a rusty Ford pickup), no longer sharing the Datsun with "Tools that earn their keep".
- Per-style accessibility sweep: axe runs against every global style variation with
color-contrastgated, in CI and via a localnpm run test:stylesrunner. All seven styles (including the dark Terminal, Amber CRT, and Blueprint themes) are contrast-clean. - Commit attribution: a
commit-msghook (.githooks/) requires aCo-Authored-Bytrailer on every commit.
- Accessibility test suite graduated to gating: the confirmed-clean axe rule set (
image-alt,link-name,label,heading-order,landmark-unique,region,color-contrast,button-name) now fails the build on regression, with coverage widened to a single post and the 404 template. The scan includes thebest-practicetag so the heading/landmark rules are actually evaluated. - Photo-free package: removed the bundled CC-licensed photographs and refreshed the theme screenshot.
- README overview and JavaScript-policy wording.
- Accessibility: the decorative h-card avatar (a 96px icon,
alt="") inherited the theme-wide image lightbox, so core rendered an unnamed "enlarge" control (axebutton-name, critical). Disabled the lightbox on that block.
0.1.4 - 2026-06-19
- Accessibility: removed the scrollable overlay captions from the front-page gallery (axe
scrollable-region-focusable); alt text retained and CC credits remain inreadme.txt.
- WordPress.org Theme Check cleanup: removed the invalid
block-themetag, added a GPL copyright notice toreadme.txt, and externalized the Playground seed so nobase64_decoderemains in the source. - Expanded the README overview and aligned the JavaScript policy wording with the core-Interactivity-first doctrine.
- Repointed the stable and theme-test Playground blueprints at the release; added a theme-unit-test blueprint.
0.1.3 - 2026-06-18
- Archive (master index) and Search page templates.
- Core WordPress 7.0 Breadcrumbs block in the header.
- Core progressive enhancements — navigation overlay, enhanced (no-reload) query pagination, and image lightbox — each with a plain-HTML fallback.
- Playground demo content (CC0 imagery and seed posts) and a Playwright end-to-end/accessibility harness with CI.
bin/package-checkcoverage for seed-content integrity, reconcile guardrails, the i18n text domain, and the image inventory.
- Stated the JavaScript policy honestly: Dirtbag ships no theme-authored or bundled JavaScript, but WordPress core may load its own (the Interactivity API) when core blocks need it. Where a runtime is ever warranted the order is native HTML → core Interactivity API (the OEM part) → tiny vanilla JavaScript → aftermarket frameworks (Alpine/Reef/VanJS) as an approved exception.
- Collapsed the style variations to their deltas over
theme.json. - Documented the editor-controls policy, the CSS and i18n boundaries, and the Studio-versus-demo reseed policy.
- Required WordPress 7.0 and PHP 7.2+.
- Microformats: h-card profile icon path, front-page post date binding, and
u-url. - Made the post byline translatable via a pattern.
- Corrected the GitHub (dknauss) and WordPress.org (dpknauss) usernames.
- Accessibility: underlined links and post titles sized by heading level.
0.1.2 - 2026-06-18
- Applied the barebones Playground export for the header and front page.
0.1.1 - 2026-06-18
- Refined header layout.
- Added Playground demo content.
0.1.0 - 2026-06-18
- Initial Dirtbag block theme release.