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>
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>