Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
75ec902
fix(scripts): keep generated audit JSON output parseable
Sep 9, 2026
afb8591
fix(release): support prepared stable releases
Oct 22, 2026
a085460
fix(templates): correct fallback pagination markup and URLs
Oct 22, 2026
d564eb8
fix(a11y): mark the current fallback menu item
Oct 22, 2026
3addd33
test(templates): cover fallback navigation and search pagination
Oct 22, 2026
ab8b1b4
fix(twig): resolve grouped project components like Emulsify Core
Oct 22, 2026
6392ff5
fix(compat): raise the minimum WordPress version to 6.8
Oct 23, 2026
a67113b
fix(theme): remove link state styles that never applied
Oct 23, 2026
a918a51
fix(scripts): integrate generated audit wrapper JSON contract
Oct 23, 2026
f7075d8
build(deps): update Whisk to Emulsify Core 4.5.0
Oct 23, 2026
015b0df
fix(whisk): align copied scripts and project test runners
Oct 23, 2026
28db7c3
ci: validate Whisk tests and sandboxed runner Chrome
Oct 23, 2026
5ea0d6b
test(templates): capture parent layout output before extension blocks
Oct 23, 2026
9056a3d
feat(templates): add stable parent layout extension blocks
Oct 23, 2026
6bd2cd9
fix(whisk): inherit parent templates without starter overrides
Oct 23, 2026
48304b7
docs: document parent Twig extension and starter inheritance
Oct 23, 2026
04f765e
feat(whisk): ship AI guidance with generated child themes
Oct 23, 2026
951cdf1
docs: add WordPress contributor guidance
Oct 23, 2026
9c91e96
fix(whisk): contain guidance links within generated themes
Oct 23, 2026
b169657
fix(a11y): prefix numbered pagination links with Page
Oct 23, 2026
925b667
fix(a11y): preserve language attributes and inherit link colors
Oct 23, 2026
5caab31
fix(a11y): render pager prefix attributes through the theme helper
Oct 23, 2026
72df473
ci: audit rendered WordPress pages with sandboxed Chrome
Oct 23, 2026
eda8cca
docs: explain rendered accessibility audits and project styling
Oct 23, 2026
adfdce9
test(twig): characterize PHP and JavaScript helper output
Oct 23, 2026
6e82b68
fix(twig): separate injected context in argumentless helper calls
Oct 23, 2026
d7d5867
chore(deps-dev): update vulnerable release tooling dependencies
Oct 23, 2026
62a05e9
ci: pin actions and enforce supported readiness matrices
Oct 23, 2026
91a1cca
docs: record readiness coverage and dependency audit
Oct 23, 2026
53dee9b
ci: make search audit independent of relevance ordering
Oct 23, 2026
19e18a3
ci: give release test remotes an explicit default branch
Oct 23, 2026
884e45f
ci: expose resolved WordPress versions in release summaries
Oct 23, 2026
90ad7e3
feat(media): add opt-in privacy and native video posters
Oct 23, 2026
c7171b4
docs: record Drupal 7.3 sync and finalize 2.1 release guidance
Oct 23, 2026
99c31e2
fix(media): accept missing post IDs in the embed filter
Oct 24, 2026
58b567d
fix(blocks): keep block data out of HTML attributes
Oct 24, 2026
98523f2
fix(twig): drop event-handler attribute names
Oct 24, 2026
3f6be6a
docs: document block_attributes and its upgrade action
Oct 24, 2026
011ec31
fix(theme): remove failing and inert quote and button styles
Oct 24, 2026
a6c9d2e
test(theme): check theme.json style values and preset references
Oct 24, 2026
7e79db4
docs: describe the global styles the parent still produces
Oct 24, 2026
62a21cf
fix(templates): decode page-number entities in pagination
Oct 24, 2026
21dd39f
fix(media): declare the poster document's text direction
Oct 24, 2026
d1d343b
docs: record the Drupal 1bc8fb3 sync
Oct 24, 2026
d234d8a
docs: finalize the 2.1.0 release notes
Oct 24, 2026
1c93266
chore(release): prepare 2.1.0
Oct 24, 2026
64aac7c
test(templates): verify child page lookup and restoration
Oct 24, 2026
037251f
fix(templates): hide password-protected content and excerpts
Oct 29, 2026
6c16bd4
test(templates): cover password-protected pages, posts and listings
Oct 29, 2026
e605d8d
docs: document password-protected content handling
Oct 29, 2026
e9d6295
ci: keep the contributors bot from committing to main
Oct 29, 2026
a4b2546
fix(release): explain a release that main moved under
Oct 29, 2026
7324353
docs: document the release run's main-branch requirement
Oct 29, 2026
62730c3
docs: record the Drupal 7.3.0 release sync
Oct 29, 2026
f1e2c1f
chore(deps-dev): refresh release tooling to match Drupal 7.3.0
Oct 29, 2026
64fef87
fix(templates): print WordPress-formatted text without double escaping
Oct 29, 2026
dd200fb
test(templates): check visible text for titles, names and searches
Oct 29, 2026
a5c4d3f
docs: explain escaping WordPress-formatted text in Twig
Oct 29, 2026
a32452f
fix(media): fail closed per embed when the poster can't render
Oct 29, 2026
9637f8a
fix(media): keep srcdoc escaping exact on WordPress 6.8
Oct 29, 2026
8bcec87
fix(media): cache metadata only when posters need it
Oct 29, 2026
af5f0ce
fix(media): keep provider permissions and lazy-load poster thumbnails
Oct 29, 2026
4f7c020
refactor(media): simplify validation and remove dead code
Oct 29, 2026
9c51137
docs: update media embed CSP and failure guidance
Oct 29, 2026
27f0b48
fix(twig): resolve @components references like Emulsify Core
Oct 29, 2026
4404144
fix(twig): derive component roots from structureImplementations like …
Oct 29, 2026
69c7fb7
perf(twig): cache component discovery for the whole request
Oct 29, 2026
e80c270
test(twig): compare component resolution with Emulsify Core
Oct 29, 2026
6f88588
docs: describe component resolution and caching
Oct 29, 2026
599cb17
fix(discovery): skip unreadable component directories
Oct 29, 2026
3d5431d
fix(blocks): invalidate component discovery after deploys and builds
Oct 29, 2026
e15954c
test(discovery): cover unreadable and moved component trees
Oct 29, 2026
0ddc631
perf(blocks): index only JSON metadata for component discovery
Oct 29, 2026
1876a19
fix(release): fail when a tagged release is missing its GitHub releas…
Oct 29, 2026
fd9146d
ci: gate publishing on the full readiness workflow
Oct 29, 2026
6522c48
ci: scope release credentials and reuse the tested ZIP
Oct 29, 2026
d2aca19
chore: mark the package private and require the release ZIP
Oct 29, 2026
0d16996
test(release): disable signing in release test fixtures
Oct 29, 2026
70493c8
ci: skip add-to-project for forks and Dependabot
Oct 29, 2026
e9c3fcc
docs: document local release dry-run requirements
Oct 29, 2026
1b9c459
ci: audit shipped Composer and Whisk dependencies
Oct 29, 2026
eb1d417
build: run commitlint from a Husky 9 commit-msg hook
Oct 29, 2026
597ef12
ci: keep the Whisk audit informational
Oct 29, 2026
1f8bdc4
docs: clarify validation when recovering a released tag
Oct 29, 2026
f7f7db0
fix(blocks): keep inner blocks in mapped block content
Oct 29, 2026
c0a1d48
perf(blocks): build mapped block context once per request
Oct 29, 2026
1ea673d
fix(templates): use front-page.twig only for the front page
Oct 29, 2026
280c222
fix(templates): correct custom post type and day archive handling
Oct 29, 2026
22d900a
fix(twig): block script URLs and framework event attributes in Attrib…
Oct 29, 2026
75add7f
fix(runtime): let robots, feeds and sitemaps load without Timber
Oct 29, 2026
0aeb6bf
fix(cli): share one machine-name rule between the generators
Oct 29, 2026
eb2f448
fix(build): package only committed files without symlinks
Oct 29, 2026
ab7c083
fix(assets): keep scoped subfolder assets off unrelated pages
Oct 29, 2026
ac8e8b2
fix(cli): handle symlinked starter directories
Oct 29, 2026
39194d6
fix(templates): fire get_footer before wp_footer
Oct 29, 2026
d9f0590
fix(twig): match Twig's template freshness check
Oct 29, 2026
e7b2f1c
refactor: remove dead fallbacks and duplicated helpers
Oct 29, 2026
3e3aa37
fix(cli): require plain text in standalone generation metadata
Oct 29, 2026
88043e1
test: align release assertions with shared runtime helpers
Oct 29, 2026
bf81a06
fix(assets): normalize scoped metadata asset paths
Oct 29, 2026
bd9df57
docs: finalize the 2.1.0 notes after the October 28 fixes
Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
/CODE_OF_CONDUCT.md export-ignore
/commitlint.config.js export-ignore
/composer.lock export-ignore
/husky.config.js export-ignore
/package-lock.json export-ignore
/package.json export-ignore
/phpcs.xml.dist export-ignore
Expand Down
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
31 changes: 31 additions & 0 deletions .github/fixtures/template-extension/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Parent template output goldens

These HTML files capture the parent templates at commit
`28db7c3f58387e08176664163fdbf92ab515d572`, before the new extension blocks.
Every byte, including whitespace, is compared without output normalization.

The harness uses the parent's real Twig namespace registration, autoescaping,
attribute/BEM helpers, and head/menu/footer partials. WordPress functions and
actions emit deterministic hook markers. Only the literal date input `now` is
frozen at `2026-10-22T12:00:00Z`; formatting still delegates to Twig's real date
formatter in UTC, keeping the footer's year stable.

The eight `content-*` files cover every combination of title, menu, and
populated/empty content. Empty cases render the real base directly and compare
it with an empty ArrayLoader child content block at runtime. Populated cases
use that child template to supply the real base's content block. The two
`page-*` files render the real parent page fallback with a post and without one.

Verify without rewriting fixtures:

```sh
php .github/scripts/template-extension-smoke.php
```

Capture intentionally, after reviewing the rendered-output change:

```sh
php .github/scripts/template-extension-smoke.php --update-goldens
```

Updating goldens is an explicit review step. Do not use the capture option in CI.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

<nav class="site-header__navigation" aria-label="Primary navigation">
<ul class="menu menu--primary">
<li class="menu__item menu__item--has-children fixture-menu-item">
<a class="menu__link" href="/current/?first=1&amp;second=2" aria-current="page">
Current &lt;link&gt; &amp; fixture
</a>

<ul class="menu menu--sub">
<li class="menu__item">
<a class="menu__link" href="/nested/" target="_blank" rel="noopener">
Nested &amp; fixture
</a>

</li>
</ul>
</li>
<li class="menu__item">
<a class="menu__link" href="/other/">
Other &amp; fixture
</a>

</li>
</ul>
</nav>
</div>
</header>

<main class="site-main" id="content" tabindex="-1">

</main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

<nav class="site-header__navigation" aria-label="Primary navigation">
<ul class="menu menu--primary">
<li class="menu__item menu__item--has-children fixture-menu-item">
<a class="menu__link" href="/current/?first=1&amp;second=2" aria-current="page">
Current &lt;link&gt; &amp; fixture
</a>

<ul class="menu menu--sub">
<li class="menu__item">
<a class="menu__link" href="/nested/" target="_blank" rel="noopener">
Nested &amp; fixture
</a>

</li>
</ul>
</li>
<li class="menu__item">
<a class="menu__link" href="/other/">
Other &amp; fixture
</a>

</li>
</ul>
</nav>
</div>
</header>

<main class="site-main" id="content" tabindex="-1">

<p>Content &amp; fixture</p> </main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

</div>
</header>

<main class="site-main" id="content" tabindex="-1">

</main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

</div>
</header>

<main class="site-main" id="content" tabindex="-1">

<p>Content &amp; fixture</p> </main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
63 changes: 63 additions & 0 deletions .github/fixtures/template-extension/content-title-menu-empty.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

<nav class="site-header__navigation" aria-label="Primary navigation">
<ul class="menu menu--primary">
<li class="menu__item menu__item--has-children fixture-menu-item">
<a class="menu__link" href="/current/?first=1&amp;second=2" aria-current="page">
Current &lt;link&gt; &amp; fixture
</a>

<ul class="menu menu--sub">
<li class="menu__item">
<a class="menu__link" href="/nested/" target="_blank" rel="noopener">
Nested &amp; fixture
</a>

</li>
</ul>
</li>
<li class="menu__item">
<a class="menu__link" href="/other/">
Other &amp; fixture
</a>

</li>
</ul>
</nav>
</div>
</header>

<main class="site-main" id="content" tabindex="-1">
<header class="page-header">
<h1 class="page-header__title">Page &lt;title&gt; &amp; fixture</h1>
</header>

</main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- action:get_header --> <!-- wp_head -->
</head>

<body class="fixture-body route-page">
<!-- wp_body_open -->
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>

<header class="site-header" role="banner">
<div class="site-header__inner">
<a class="site-header__brand" href="https://example.test/?first=1&amp;second=2" rel="home">
Fixture &lt;site&gt; &amp; WordPress
</a>

<nav class="site-header__navigation" aria-label="Primary navigation">
<ul class="menu menu--primary">
<li class="menu__item menu__item--has-children fixture-menu-item">
<a class="menu__link" href="/current/?first=1&amp;second=2" aria-current="page">
Current &lt;link&gt; &amp; fixture
</a>

<ul class="menu menu--sub">
<li class="menu__item">
<a class="menu__link" href="/nested/" target="_blank" rel="noopener">
Nested &amp; fixture
</a>

</li>
</ul>
</li>
<li class="menu__item">
<a class="menu__link" href="/other/">
Other &amp; fixture
</a>

</li>
</ul>
</nav>
</div>
</header>

<main class="site-main" id="content" tabindex="-1">
<header class="page-header">
<h1 class="page-header__title">Page &lt;title&gt; &amp; fixture</h1>
</header>

<p>Content &amp; fixture</p> </main>

<!-- action:get_footer -->

<footer class="site-footer" role="contentinfo">
<p class="site-footer__copyright">
&copy; 2026 Fixture &lt;site&gt; &amp; WordPress
</p>
</footer>

<!-- wp_footer -->
</body>
</html>
Loading
Loading