Repository navigation
Releases: markrusselldev/blockwright-blocks
Releases · markrusselldev/blockwright-blocks
Release list
blockwright-blocks 1.4.0
Your colors now stay put when the theme updates.
- Color designer: your scheme was saved inside the theme's files, so a theme update put the default colors back. The plugin now keeps it, and schemes you already applied move over automatically. Colors the scheme does not set keep following the theme.
- New: "Copy to site styles" keeps your colors if you deactivate the plugin.
- The Colorfulness and Chroma limit controls reopen where you left them, and the designer works on hosts that block theme file writes.
- Deleting the plugin now removes the data it saved.
- On a theme other than Blockwright, the Design screen now says it is built for the Blockwright theme and links to it.
blockwright-blocks 1.3.1
[1.3.1] - 2026-09-21
Fixed
- Design tool: the brand-color WCAG indicator now flags a color that had to be
contrast-nudged. It grades the shipped color (post-fit), so an out-of-range
pick used to read a false "pass"; per mode it now shows an amber "adjusted"
state (with a word tag, not color alone) when the entered color was moved to
stay legible. Grayscale is unaffected (its identity is mirrored, not fitted,
so it stays a clean pass and never false-flags).
blockwright-blocks 1.3.0
[1.3.0] - 2026-09-18
Added
-
Design-system control plane (Appearance -> Design admin screen): a tabbed hub - an
Overview that shows the modules at a glance plus shared restore points, then one tab per
ability (Color live now; Typography, Spacing and Autowright stubbed "coming soon" so the
structure is what it grows into). Tabs use the native TabPanel (ARIA tabs contract for
free) and stay on one row.- Color module: pick a brand color plus a few bounded, WCAG-gated knobs and generate a
full accessible color scheme, preview it live in light and dark, and Apply it to the
active theme. One-click presets apply the theme's shipped schemes; the brand swatch
follows the active color (preset or seed) and opens a color picker in place. The live
preview is a small real interface (heading, links, the four button styles, and drawn
checkbox/radio/focused-field) showing the brand color in context - the form controls are
drawn rather than native so WP admin's own control styling cannot override the scheme
color. The whole palette is also shown as a resolved light/dark token table, grouped by
role and split into what the brand color drives vs what is independent, with each group
collapsible. - Restore points are captured before every change, shown on the Overview and in the Color
module, and can be deleted (the pristine "original" baseline is protected). The apply
confirmation says a restore point was saved and clears itself. - Built on shared layers: the registry (which theme.json path the color category owns),
the write engine (the supported theme.json file write - merge-patch the changed slice,
surgically clear the same keys from the user Global Styles record, bust caches - with an
automatic snapshot in uploads first), and the shared color recipe reused from the theme
build. All writes requireedit_theme_options+ the REST nonce, and every incoming
color value passes a strict allowlist. First ability; typography/spacing follow. - The shared color engine generates the filled-tonal Soft button (formerly "Accent") as a real solid tonal
container (btn-soft-bg+ hover/active +btn-soft-textink gated to 4.5:1) alongside the
Fill CTA (btn-fill-*), so every generated scheme - in the theme build AND this tool's
Apply/preview - carries a real tonal button, not a faint accent wash. Button tokens are named
after the styles (Fill/Soft);accentstays the brand color the swatch reads. Dropped the
earlier "Bold accent" knob (it only produced an unshippably faint accent). - The WCAG-AA status line next to Apply is now quiet on success (a green check glyph, but the
label itself is muted, not a green badge) and keeps the prominent red only for the actionable
failure state; "WCAG AA" links to the W3C contrast-minimum page so users can learn more. - The color engine now degrades gracefully if the active theme's palette lags this plugin
(a theme older than the plugin, or a stale theme.json cache): it generates every scheme it
can and skips only the tokens the theme has not registered, instead of erroring out the
whole tool. The build keeps the strict check that fails loudly on real drift. - The interactive role colors (links, their hover/active states, and the focus ring) are
generated CONTRAST-FIRST - each solved to meet its accessibility target at the brand hue,
rather than fixed to a preset lightness step. That keeps them vivid and on-hue in both light
and dark instead of washing out pale (a dark-mode red link used to collapse to pale pink);
tonal container backgrounds still derive from the ramp. On near-neutral schemes (Grayscale,
Slate) a visited link is separated from the unvisited link by lightness, since there is no hue
to distinguish them, so visited no longer renders identical to the link. - Added a committed color regression harness (
npm run check:color-sweep): it runs a dense
hue x chroma grid plus corner/known-bug fixtures through the shared engine and asserts WCAG
AND identity (each role shade stays on-hue, is not chroma-collapsed, and the base link does not
overshoot its target). The prior automated check gated only on contrast, which the wash-out
failure mode passes - this catches it. All seeds pass. - Color module polish (pre-ship): preset chips now carry each scheme's own accent color
instead of five identical buttons; the token-role groups collapse consistently (up to five
rows, then a reveal) rather than one group showing six; the Advanced panel's control help and
its lightness/contrast aside now share one type treatment; the Advanced panel has breathing
room from the control above it; and the Chroma-limit help now names the hues the ceiling
actually affects. Selecting a preset now syncs the controls to it (brand swatch, Chroma
and Chroma-limit), so the sliders show the preset's real values and editing a control
continues from the preset's hue instead of snapping back to the previously applied color. - The live preview now also renders the theme's editorial block-style roles in context -
the brand site title (the exact brand color), the eyebrow, the badge pill, and the
callout band - alongside the type/button/form samples, in both light and dark, so applying
a scheme shows those roles rendered rather than only as swatches in the token table.
- Color module: pick a brand color plus a few bounded, WCAG-gated knobs and generate a
-
readme.txt: added a Source Code section linking the public GitHub repository (WordPress.org guideline 4).
Changed
- Color engine unified onto one seed-build formula (the math the Design tool and the theme share):
a fixed accessible lightness ramp at the brand's hue, with link/focus/tonal-button tokens derived
as ramp aliases. Any brand color you enter - light, dark, warm, or neutral - now builds the same
way, so the light-hue brands that used to come out muddy generate cleanly. Contrast is measured in
the 8-bit color the browser actually paints, so the tool's "always meets AA" guarantee holds at
render precision. - A solid button's automatic dark label is now a deep shade of the brand color instead of flat
black (pure gray on a grayscale brand), and a visited link is a softer, desaturated shade of the
link's own hue (the accessibility-recommended "used" look) - distinct per scheme, not all one
purple. - The generated CTA fill IS the brand color (ADR 0015 "brand-hug") and its label is pure white: the
engine uses the exact brand and moves its lightness only for a WCAG contrast floor (3:1 vs the page,
and - since the CTA label is large text, bold 700 / 19px - a small on-hue deepen so white clears 3:1).
The label gates at the WCAG large-text 3:1 level, so a pure-white label works on a vivid brand color;
pale hues that can't reach white within the cap keep the dark brand-toned ink. The CTA is now
borderless (the oldbtn-fill-borderis removed - a white-labeled fill already reads on the page).
WCAG 2 is the gate; APCA is advisory only, confirming the white labels are crisp (Lc 62-100) and never
moving the fill (enforced by check:brand-fill, hue-locked, 0.14 L cap). Same math in the Design tool's
live preview and the theme build, so they cannot drift. Details: docs/color-role-research.md §5.
Added
check:apca-advisoryscript (scripts/check-apca-advisory.mjs, dev-only): reports each shipped
scheme's CTA fill/label APCA Lc in light and dark, flagging pairings that pass WCAG but read
perceptually weak. Advisory - never gates. Uses a vendored, reference-validated APCA implementation
(lib/color/apca.mjs, W3-licensed).
Security
- Restore-point snapshots (
uploads/blockwright/snapshots/) are now web-hardened on creation:
a core-style<?php // Silence is golden.index.phpin the directory and its parent to
prevent directory listing on any server, plus a.htaccessdenying direct file access on
Apache/LiteSpeed (guarded for Apache 2.4 and 2.2). The files capture theme.json and the global
styles record, so they should not be publicly listable or fetchable.
Fixed
- The palette token-reference group titles and descriptions in the Color module are now
translatable (__()); they were previously hardcoded English and shipped untranslated. - REST design routes now return the correct HTTP status for each condition (404 for a missing
restore point, 409 for a not-writable/locked theme, 422 for an unreadable snapshot) instead of
a blanket 400/500; the status is set at each error's source in the write engine. - The generated-scheme WCAG gate now also covers the active and visited link states (it checked
only the default and hover states), so the tool's "always meets WCAG AA" statement holds for
every emitted link color. Verified across the full brand-seed spread. - The color engine's CTA-fit fallback for extreme (very light/dark) brand colors now clamps
lightness to the valid band, so it can never emit an out-of-range OKLCH value. - The live preview is now marked
inert: its illustrative buttons and links are no longer in
the tab order or exposed to screen readers (the accessible path to every value is the token
inventory below). A translatable, non-split engine-error message replaces a concatenated one. - Applying a scheme no longer offers a no-op Apply on page load (which created an empty restore
point); Apply activates only after a real control or preset change.