The prebuild hook runs phpunit via composer exec, but Composer
dependencies were not installed until after npm run build. Moved
composer install (with dev) before the build step, then reinstall
with --no-dev for the release package.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PHPUnit 11 + Brain\Monkey for WordPress function mocking. Tests cover
BlockRenderer (28), WidgetRenderer (9), NavWalker (14), and
TemplateController (12). Includes functional WP_HTML_Tag_Processor stub,
CI test job between lint and build-release, prebuild hook gating npm
build on passing tests, and release package exclusions for test files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add BlockRenderer class injecting Bootstrap classes into 8 core block types
(table, button, buttons, image, search, quote, pullquote, list) via per-block
render_block filters using WP_HTML_Tag_Processor.
Add WidgetRenderer class wrapping sidebar widgets in Bootstrap card components
with h4 heading hierarchy via dynamic_sidebar_params and widget_block_content
filters.
Add widget SCSS stylesheet for list styling, search input-group, tag cloud
pills, and card-flush list positioning.
Add single-sidebar.html.twig as the default post template with two-column
Bootstrap layout (col-lg-8 content, col-lg-4 sidebar). Full-width available
via template selection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap the offcanvas padding-top rule in a max-width: 991.98px media query
so it only applies when the offcanvas is active, not on wide screens
where the navbar renders inline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch mobile nav from collapse to offcanvas, add logged-in user avatar
and My Account link to offcanvas header, move dark mode toggle to
offcanvas footer. Fix admin bar overlapping offcanvas via inline CSS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WordPress's get_the_title() pre-encodes & as &. Twig autoescape
re-encoded the & in & to &#038;, rendering as literal &
in the browser. Wrapped all 6 get_the_title() calls in ContextBuilder
with wp_specialchars_decode() so Twig can properly re-encode once.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- functions.php: cache wp_bootstrap_variation_colors() output in a 24-hour
transient keyed by md5(get_stylesheet()); invalidate on switch_theme and
save_post_wp_global_styles so Design Editor changes apply immediately
- TwigService.php: change auto_reload from hardcoded true to WP_DEBUG so
Twig stops stat()-ing compiled template files on every production request
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Archive XSS: wrap get_the_archive_title/description with wp_kses_post()
in ContextBuilder to sanitize Editor-editable term content rendered via |raw
- Comment fields: esc_html() on comment_author, esc_url() on comment_author_url
at data source; template updated to output pre-escaped URL via |raw
- dark-mode.js: whitelist localStorage value against ['dark','light'] to
prevent attribute injection from third-party script tampering
- TwigService: add is_safe=>html to esc_html/esc_attr/esc_url Twig functions
to prevent double-encoding if autoescape is ever enabled
- Add .markdownlint.json (disable MD024 duplicate headings, MD013 line length)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds do_shortcode to TwigService::registerWordPressFunctions() so child
themes and partials can render WordPress shortcodes directly inside Twig
templates via {{ do_shortcode('[shortcode]') }}.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ContextBuilder now calls getSidebarData() when page template slug is
'page-sidebar', fixing empty sidebar on pages with that template
- Added block_template_part() Twig function to TwigService for FSE
Template Editor compatibility
- Changed footer rendering from include to block_template_part() so
footer edits in the Template Editor take effect
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows plugins and child themes to prevent the theme's TemplateController
from rendering specific requests, enabling clean separation of concerns.
Co-Authored-By: Claude <noreply@anthropic.com>
When plugins inject content via TwigService with empty post.title,
the theme's <h1> is now skipped. Prevents duplicate headings on
plugin-rendered pages that provide their own titles.
Co-Authored-By: Claude <noreply@anthropic.com>
Add bootstrap-icons npm package with SCSS import and font file copy
build step. All 2,000+ icons available via CSS classes (bi bi-*) in
both frontend and block editor.
Co-Authored-By: Claude <noreply@anthropic.com>
- Register sidebar widget area via register_sidebar()
- Render WordPress widgets in Twig sidebar with fallback to built-in content
- Update README.md with accurate feature counts and descriptions
- Update translation files with widget area strings
- Bump version to 1.0.0
Co-Authored-By: Claude <noreply@anthropic.com>
WordPress puts active variation colors in the 'theme' palette origin,
not 'custom'. Detection now compares theme origin against base defaults.
Co-Authored-By: Claude <noreply@anthropic.com>
Fix dark mode body colors overridden by WordPress theme.json styles.color,
add broad dark mode rules for plugin form elements, fix footer-columns
template, and add style variation bridge function.
Co-Authored-By: Claude <noreply@anthropic.com>
Add Rose, Sand, Lavender, Mint (light) and Ember, Arctic, Amethyst,
Slate, Mocha, Nebula, Obsidian (dark) color palettes for the Design
Editor. Total of 15 style variations available (7 light, 7 dark).
Co-Authored-By: Claude <noreply@anthropic.com>
Full Design Editor compatibility with custom block categories, page templates,
header/footer variations, and navigation styles. Both FSE (admin) and Twig
(frontend) sides kept in sync.
Co-Authored-By: Claude <noreply@anthropic.com>
Replace FSE block markup on the frontend with proper Bootstrap 5 HTML
rendered through Twig templates. The Site Editor remains functional for
admin editing while the public site outputs Bootstrap navbar, cards,
pagination, grid layout, and responsive components.
New PHP classes: TemplateController, ContextBuilder, NavWalker
New Twig templates: 20 files (base, pages, partials, components)
Enhanced TwigService with WordPress functions and globals
Co-Authored-By: Claude <noreply@anthropic.com>
Replace all yarn references with npm across README, CLAUDE.md,
CHANGELOG, .gitignore, and CI workflow. Remove yarn.lock.
Co-Authored-By: Claude <noreply@anthropic.com>
The CI runner does not have yarn installed. Switch to npm install
and npm run build. Also add package-lock.json for reproducible
installs and exclude it from the release ZIP.
Co-Authored-By: Claude <noreply@anthropic.com>