SLASHED Framework Changelog
The format is based on Keep a Changelog, and this project follows Semantic Versioning.
Unreleased
[0.7.30] - 2026-07-28
Features
- configurator: warn when fixed step values shadow a generated scale
Bug Fixes
- configurator: correct shadow-notice wording and label its disclosure
- configurator: track ratio tokens in the scale cards’ override state
[0.7.29] - 2026-07-25
Bug Fixes
- configurator: resync panels with the live token API
[0.7.28] - 2026-07-24
Features
- layout: add
.sf-place-center— box-neutral centring primitive (grid+place-items:center) that centres content on both axes without adopting cluster/stack/imposter semantics
[0.7.27] - 2026-07-23
Breaking Changes
- states: rename .sf-is-skeleton to .sf-is-shimmer (#575)
Features
- layout: give .sf-content-grid an inline-size CQ scope, at parity with .sf-container
- docs: generate distilled llms.txt AI-assistant context file (#472)
- utilities: add fractional content-width utilities .sf-width-* (#531)
Bug Fixes
- layout: address review — name the content-grid container, guard the guttered reset
- layout: full-bleed reaches section edge in a guttered content grid; doc center CQ scope
- address PR review — correct demo migration note + anchor llms.txt version regex
[0.7.26] - 2026-07-22
Breaking Changes
- states: remove speculative interaction-state flags, relocate visibility helpers
- tokens: rename –sf-color-text–secondary to –sf-color-text–subtle
Features
- a11y: add .sf-touch-target opt-in class for the WCAG 44px hit area
Bug Fixes
- a11y: address PR review — empty class=””, native display, docs, gallery
- a11y: scope coarse-pointer touch-target floor to class-less controls
[0.7.25] - 2026-07-20
Features
- configurator: colour fields now accept any CSS colour format — paste a hex,
rgb(),hsl(), a named colour,lab()/lch(),color(), etc. and it is converted automatically into the token’s canonical space (OKLCH, or OKLAB where that is the field’s default). Conversion uses the browser’s own colour engine, so it matches exactly what gets painted;var()references and already-canonical values pass through untouched.
Bug Fixes
- themes: headings, body text and cards now auto-flip their foreground on coloured surfaces (
.sf-surface--*) and in[data-theme]sections (#496). The:root-only alias overrides (--sf-heading-color,--sf-body-color,--sf-card-border-color) previously sealed the page value at:root— so a heading stayed dark on a dark surface, and a.sf-cardon a coloured surface rendered its title/body/border for the wrong background. A.sf-cardkeeps the page surface as its own (non-adapting) background and now restores surface-appropriate, legible foreground for it; a consumer’s own--sf-color-headingoverride on a non-surface ancestor is still inherited.
[0.7.24] - 2026-07-19
Features
- colors: LumLocker now takes a separate dark-mode lightness (
--sf-lumlocker-dark). It defaults to the light L mirrored around the light/dark background midpoint (clamp(0.5, calc(1.18 - var(--sf-lumlocker)), 0.92)), so a lock keeps equivalent contrast against the surface in both themes instead of reusing one shared L that read poorly in dark mode. Override it to break the mirror. - configurator: LumLocker panel gains a second “L · dark” slider and the locked-swatch preview resolves dark rows against the dark L.
[0.7.23] - 2026-07-18
Bug Fixes
- configurator: reactive style name in the focus-ring preview label
- configurator: dedupe cross-panel controls; full Google Fonts catalogue with mono target
[0.7.22] - 2026-07-18
Bug Fixes
- configurator: drop tokens from the TypographyPanel call site
- configurator: address PR review comments
- configurator: reset buttons always visible when a token is overridden
- configurator: stack TokenRow layout — name, description, full-width value
- configurator: unique, self-describing labels in the fluid scale section
- configurator: live var() previews everywhere; unified per-type tabs incl. display
[0.7.21] - 2026-07-18
Features
- configurator: variable-first dropdown for every scale-referencing token
- configurator: consistency pass across colors, macros & effects panels
- configurator: unify text & display typographic scale controls
- configurator: add Grid gap control + document responsive gap pattern
Bug Fixes
- configurator: address PR review comments
- configurator: normalise sidebar preview bars to their max, no collapsing caps
- configurator: typography scale preview shows real sizes, not capped
- demo: escape and <hr> tag names in two captions
- configurator: reflect grid gap in the Auto grid preview
- demo: drop removed overlap variants from cov-data coverage blob
[0.7.20] - 2026-07-16
Features
- configurator: rewire Colors palette-ramp panel to the anchor model
Bug Fixes
- demo: widen sidebar nav so labels aren’t clipped
- demo: load full bundle so components render styled
- tokens: unify status -subtle alpha to 0.12; drop dev-notes from manual
- address PR #627 review — changelog copy-paste, dark sweep, dead assignment
- tokens: make brand colour ramps monotonic for any source colour
[0.7.19] - 2026-07-16
Bug Fixes
- tokens:
--sf-color-info-subtleand--sf-color-danger-subtlewere0.10alpha while--sf-color-success-subtle/--sf-color-warning-subtlewere0.12, so adanger/infoalert-box background rendered slightly fainter than asuccess/warningone at the same content. Unified all four status-subtlewashes to0.12(the-muted0.3and-tint0.05rungs were already consistent). - tokens: the numeric brand ramps (
--sf-color-{primary,secondary,tertiary,action,neutral}-50…950) no longer fold into a “U”. The previous model generated each step withcolor-mix()toward the theme’s--sf-color-surface(tints) /--sf-color-text(shades) — so when a chosen source colour fell outside the band between those two anchors (e.g. a brand darker than the text colour, or a project that lightened--sf-color-neutral), the shade half inverted and climbed back up: steps 600–950 came out lighter than 500, and 50 ≈ 950. The ramp is now generated in OKLCH by pulling the family colour’s own lightness a fixed fraction toward an absolute target —--sf-palette-tint-l(tints) /--sf-palette-shade-l(shades) — clamped withmax()/min()so a tint can never end darker than the base nor a shade lighter. The ladder is therefore monotonic light→dark for any source colour and any anchor configuration. Chroma is tapered toward the extremes to avoid oversaturation. For default-palette colours (which already sat inside the safe band) the output is visually unchanged; only out-of-band / moved-anchor cases are corrected.baseis unchanged (it already used absolute lightness steps). New parametric testtests/ramp-monotonic.spec.jssweeps the lightness axis for all five families and asserts the ramp never folds and no step is transparent. - configurator: the Colors panel’s “Palette ramp” section now edits the two lightness anchors (
--sf-palette-tint-l/--sf-palette-shade-l) with two0–1sliders instead of the ten removed--sf-palette-mix-*percentage sliders; the Softer/Default/Punchy presets and the live palette preview were rewired to the absolute-anchor model so the preview matches the framework and stays monotonic. - layout:
@containerbreakpoints for.sf-grid-cols-*,.sf-bentoand.sf-alternatenow usereminstead ofem. Inside a container query anemresolves against the query container’s own font-size, which under the default fluid type scale is inherited frombody(aclamp()over100vw, ~16–20px) — so the same fixed-width container rendered a different column count depending on the viewport: an 800px container showed.sf-grid-cols-3as 3 columns at a 500px viewport but 1 column at 1200px+.remresolves against the fixed root (htmlstays 16px; fluid type is applied tobody), restoring the documented “responds to its own container width, not the viewport” contract. Thresholds are unchanged numerically (30rem = 480px, 48rem = 768px) and still honour user zoom / root-font-size. Also correctsdocs/architecture.md, which wrongly listed.sf-grid/.sf-sidebaras@containerprimitives (both are intrinsic and carry no container query).
Breaking Changes
- tokens: removed the
--sf-palette-mix-50…950ramp-shape knobs (color-mix percentages of the old model) and replaced them with two lightness-anchor knobs —--sf-palette-tint-l(default0.97) and--sf-palette-shade-l(default0.1) — which set how light the lightest / how dark the darkest generated palette step may reach. Per-step pull fraction and chroma taper are now baked into each family. If you overrode--sf-palette-mix-*to reshape the ramp, retune via the two new anchors instead (or override individual--sf-color-{family}-{step}resolved tokens).
[0.7.18] - 2026-07-16
Features
- demo: render every class live in the coverage gallery
Bug Fixes
- demo: address review findings in the coverage gallery
- clear CodeQL log finding and address review nits
- test: don’t dump identifier lists in coverage log output
[0.7.17] - 2026-07-15
Features
- tokens: add
--sf-density(PUBLIC-ADVANCED, default1) — the compact ↔ comfortable dial for interactive control geometry. It scales the--sf-size-*rung ladder (24·32·40·48·56px at1); below1packs controls tighter for dashboards / data tables / power-user tools, above1loosens them. A deliberate design or user-preference choice, not viewport-fluid (control height must not shrink on small screens where touch targets need to grow), so the size ladder — previously static literals scaled by no knob — now moves only by this one dial. Orthogonal to--sf-space-scale(whitespace) and--sf-section-scale(section rhythm); combine them for a fully compact UI. The--sf-touch-targetaccessibility floor stays independent, so a small value can’t pull native controls under the WCAG target. Wired through the configurator (spacing domain) and the LLM guide’s global-multipliers section. - motion: add
.sf-stagger— put it on a parent and every direct child gets an incrementinganimation-delay, so a group of time-based entrance animations (.sf-fade-in/.sf-slide-in-*) plays in sequence. Works on any number of children with no manual per-item index: wheresibling-index()is supported the ramp is unbounded, otherwise it falls back to an 8-step:nth-childramp (covering a 4-column grid’s first two rows) that plateaus. One knob,--sf-stagger-step(default75ms), retunes the whole sequence; each child’s delay isindex × --sf-stagger-step × --sf-motion-scale. Choreography only — a child without its own animation just carries an inert delay, so animating only some children needs no opt-out on the rest. - tokens: the
.sf-hover-*transform utilities now read magnitude knobs instead of hard-coded values —--sf-hover-grow-scale(1.05),--sf-hover-shrink-scale(0.95),--sf-hover-lift(0.25em, float/sink),--sf-hover-slide(0.5em, slide-start/end) — so each effect’s strength is one global override.
Breaking Changes
- tokens: removed the fixed
--sf-animation-delay-1…5stagger tokens, superseded by the new.sf-staggerutility +--sf-stagger-stepknob. Replacestyle="animation-delay: var(--sf-animation-delay-N)"on hand-indexed children with a single.sf-staggerclass on their parent (seedocs/motion.md); to keep a fixed manual delay, use a literal (e.g.animation-delay: 150ms). - macros: removed
.sf-corner-scoop(and its--top-left/--top-right/--bottom-left/--bottom-rightmodifiers and--sf-corner-scoop-size/--sf-corner-scoop-atknobs). Judged too niche for the public API relative to its cost — the single absolute cut size needed per-element tuning across control- vs hero-sized boxes, and the mask clippedbox-shadow/borderand could not compose with the other mask-based macros. To keep a concave corner, apply the mask directly on the element:style="-webkit-mask-image: radial-gradient(circle at 100% 0, transparent 24px, black 24.5px); mask-image: radial-gradient(circle at 100% 0, transparent 24px, black 24.5px)". - layout: renamed
.sf-bento--compact/.sf-bento--tall(container row-height modifiers) to.sf-bento--row-compact/.sf-bento--row-tall, matching the--sf-bento-row-*tokens they set. The old names collided visually with the unrelated child modifier.sf-bento-tall(spans one item over 2 rows) — same word, one dash apart. Child span classes (.sf-bento-wide/-full/-tall/-featured) are unchanged. Seedocs/migration.md.
Bug Fixes
- layout:
.sf-bentoand.sf-grid-cols-2/3/4/6now actually respond to their@containerbreakpoints — both used to declare acontaineron themselves and then query that same container to resize themselves, which is a no-op per spec (a container can’t be the subject of its own@containerquery). Fixed by relying on an ancestor container (.sf-container/.sf-cq/.sf-fluid-cq) instead, matching how.sf-alternateand.sf-grid-cols-1-2etc. already do it..sf-bento-wide/.sf-bento-featuredalso no longer force a phantom 2nd column once the grid collapses to 1 column at the mobile breakpoint.
[0.7.16] - 2026-07-13
Features
- forms: add
.sf-live-validate— an opt-in scope (apply to a<form>/<fieldset>) that restores native:user-invalid/:user-valid→--sf-field-border-colorfeedback within that subtree, gated behind a real submit attempt rather than firing unconditionally on simple focus+blur. The zero-JS convenience of the removed automatic behaviour, without its premature-feedback failure mode.
Breaking Changes
- components:
.sf-btnnested in.sf-cardno longer auto-shrinks its label to--sf-text-s. Buttons in cards now render at their own size like anywhere else; add.sf-btn--sfor a compact card action. The orphaned--sf-card-btn-font-sizetoken is removed. Seedocs/migration.md. - forms: form fields no longer auto-colour on native
:user-invalid/:user-valid— a field no longer looks “broken” the instant the browser considers it invalid, before your app or the user submits anything. The explicit.sf-is-invalid/.sf-is-valid(and.sf-is-warning/.sf-is-info/.sf-is-danger) state classes are unaffected and remain the way to colour a field’s validation state;.sf-live-validateopts a<form>back into native-triggered feedback. Seedocs/migration.md.
[0.7.15] - 2026-07-11
Features
- components: extend the per-size
.sf-btnknobs to padding + height —--sf-btn-{xs,s,m,l,xl}-{padding-block,padding-inline,min-height}(15 new PUBLIC knobs) join the per-sizefont-sizeknobs, so each rung’s font/padding/height can be retuned independently without flattening the.sf-btn--xs…xlladder - configurator: the button panel’s per-size editor now tunes font-size / padding / min-height per rung (and drives the live preview); the flatten-all knobs move out of the panel into the All-tokens tab’s Advanced group
Changed
- tokens: re-tier the flatten-all
.sf-btnoverrides (--sf-btn-font-size,--sf-btn-padding-block,--sf-btn-padding-inline,--sf-btn-min-height) to PUBLIC-ADVANCED — same SemVer guarantee, surfaced as advanced (the per-size knobs are the everyday path)
[0.7.14] - 2026-07-10
Features
- components: add
--sf-btn-font-scalelabel-size multiplier + per-size label knobs (--sf-btn-{xs,s,m,l,xl}-font-size) — scale button text proportionally, or retune a single rung, without flattening the.sf-btn--xs…xlsize ladder - configurator: rework button label-size controls (scale multiplier + per-size editor; demote the flatten-all knobs to an Advanced disclosure) and add tier group dividers (Public → Advanced → Internal) to the All-tokens tab
[0.7.13] - 2026-07-10
Breaking Changes
- a11y: let .sf-btn size scale win over the coarse-pointer 44px floor
[0.7.12] - 2026-07-10
Bug Fixes
- configurator: keep preview iframe bundle fresh + guard button size scale
[0.7.11] - 2026-07-10
Features
- configurator: enrich preview domain tabs with remaining primitives
- configurator: exhaustive API coverage + preview coverage gate
- configurator: rebuild live preview as a token-driven API gallery
Bug Fixes
- css: layout layer wins over components (cards compose with layout)
- css: let .sf-card compose with layout primitives
- configurator: make button size-scale behaviour intuitive
- configurator: restore hero spacing collapsed by sf-card + sf-stack
[0.7.10] - 2026-07-09
[0.7.9] - 2026-07-09
Breaking Changes
- tokens: decouple –sf-touch-target from –sf-size-l; regularise the size scale (#582)
- components: remap .sf-btn min-height ladder onto the –sf-size-* rungs (#582 E1)
Bug Fixes
- ci: drop stale bundle names from release asset list
- audit: address PR #584 review comments
- tokens: remediate source-CSS audit findings (#582)
- configurator: keep Marketing preview nav links inert inside the iframe
[0.7.8] - 2026-07-09
Bug Fixes
- components:
.sf-card__mediahad nomargin-block-end, so it touched whatever followed (__headeror__body) directly with zero gap. Now spaces itself the same as the header/footer dividers (--sf-card-gap). - themes: a card (or any component whose tokens simply alias a themed core token, e.g.
--sf-card-bg: var(--sf-color-surface)) nested inside a non-root[data-theme]section —<section data-theme="dark">on an otherwise light page — kept the page’s background while its text correctly switched to the section’s theme, since the alias froze at:root’s value and never re-evaluated locally.--sf-card-bg/--sf-card-border-colorare now re-declared at the same nested-section scope as the rest of the section-level theming block, restoring the “data-themeworks on any element” guarantee (docs/theming.md) for cards. - configurator: the Card and Button live previews in the Components control panel didn’t set
data-theme, so they only ever reflected the ambient/OS colour scheme — toggling the Studio’s own dark-mode chrome desynced the preview’s background from its text (the exact bug above, reproduced by the Studio’s own theme toggle). Both previews now pindata-themeto the Studio’s chrome theme. - tokens: removed a phantom
--sf-space-3xsreference in.sf-btn--xs(no such token exists in the spacing scale — it always silently fell through to a hardcoded0.125remfallback); replaced with the literal value it always resolved to. Mirrored the same simplification in the configurator’s internal spacing-scale demo.
Documentation
- docs:
docs/llm-guide.md’s code-block override hooks referenced a nonexistent.sf-code-blockclass; the real consumer ispre. - docs: removed three orphaned
--sf-button-padding-block/-inline/-radiusentries fromdocs/token-annotations.json(stale pre-rename duplicates of the live--sf-btn-*entries). - docs:
README.mdno longer claims “by design there is no broad component library” — it now points todocs/roadmap.md/#384 for the planned components, matchingdocs/components.md.
[0.7.7] - 2026-07-08
⚠️ Breaking Changes
- components:
.sf-btn--secondarychanged meaning: it now selects the secondary brand colour (--sf-color-secondary) as part of the completed colour axis. The soft-tonal style it used to name is renamed to.sf-btn--soft. Before → after:class="sf-btn sf-btn--secondary"(old soft style) →class="sf-btn sf-btn--soft";class="sf-btn sf-btn--secondary"(new) = secondary-coloured solid button. (#571) - components:
.sf-btn--ghostremoved entirely — no alias. Closest replacements:.sf-btn--soft(tonal wash) or a plain link. (#571) - tokens:
--sf-color-{primary,secondary,tertiary,action,neutral,base}-ghostrenamed to--sf-color-{family}-tint(the ghost button style no longer exists; the name now describes what the token is — a 5%-alpha near-transparent tint). (#572) - tokens:
--sf-avatar-sizerenamed to--sf-card-avatar-size, now declared with a real default (2.5rem) inoptional/tokens.components.cssand documented/registered like every other card token. (#577)
Added
- components:
.sf-btncolour axis completed to all 10 palette families — new.sf-btn--secondary(colour),.sf-btn--tertiary,.sf-btn--action(explicit name for the default),.sf-btn--base. (#571) - components:
.sf-btn--gradient— new gradient axis. Composes with the colour axis (real gradients for the 4 core brand families: primary/secondary/tertiary/action; solid no-op elsewhere) and with--outline(masked gradient border ring, replacing the old copy-paste.btn-gradient-outlinedocs recipe — no hand-set--sf-grad-a/--sf-grad-bvariables needed). (#571) - tokens:
--sf-gradient-action— core-4 gradient parity with primary/secondary/tertiary. (#571) - tokens:
--sf-color-{success,warning,info,danger}-tint— the 5%-alpha tint rung now covers all 10 families. (#572)
Changed
- components:
.sf-btn--soft(ex--secondarystyle) now reads the semantic alpha aliases directly —--sf-color-{family}-subtleat rest,-mutedon hover — instead of computing its own inlinecolor-mix()wash, giving the wash a single source of truth incore/tokens.css. (#572)
Documentation
- docs:
docs/macros.mdno longer lists a nonexistent.sf-surface--errorvariant (10 variants, not 11 — the negative-status surface is--danger). (#574) - docs: removed “base” as generic prose for “default” where it collided with the
--sf-color-basepalette family; the button’s default colour is described as--sf-color-actionexplicitly. (#573) - docs:
docs/components.mdnow documents the composition pattern for coloured cards (.sf-surface--{family}or--sf-card-bg/--sf-card-border-coloroverrides). (#576) - docs:
docs/components.mdno longer claims “no broader component library on the roadmap” — it points todocs/roadmap.md/#384. Reserved-but-unconsumed--sf-field-*tokens are labelled as such; the typography-vs-card meaning of “interactive” is documented as deliberate. (#578) - docs: skeleton naming decision recorded in
docs/roadmap.md: the future component keeps.sf-skeleton; the shimmer state.sf-is-skeletonwill be renamed.sf-is-shimmerwhen it ships; placeholder shape modifier is--rect, not--card. (#575)
[0.7.6] - 2026-07-08
[0.7.5] - 2026-07-08
[0.7.4] - 2026-07-08
Bug Fixes
- components:
.sf-btnsize modifiers (--xs/--s/--l/--xl) no longer shadow the sizing knobs — a:rootoverride of--sf-btn-font-size/-padding-block/-padding-inline/-min-heightnow applies on every button size (previously it only affected the defaultmsize). The four knobs are now declaredinitial(opt-in hooks with no baked default); their per-size defaults live on rule-local--sf-btn-*--sizetier tokens. Public token surface is unchanged — the knobs stay catalogued and share-encodable. - components:
.sf-btn--secondaryis now a soft tonal fill (a light wash of the family colour, no border) instead of being visually identical to--outline, giving a real emphasis ladder (fill > secondary > ghost > outline). - components:
.sf-card__medianow honours--sf-object-fit(was hard-coded tocover).
[0.7.5] - 2026-07-08
Bug Fixes
- resolve the trimmed SLASHED_ROOT value, not the raw env var
- normalize SLASHED_ROOT override in root-resolving scripts
- tests: make @supports stripper skip string literals
- close audit gaps in artifact gates and @supports coverage
- enforce flat bundle source order
- order flat bundles by cascade layers
[0.7.3] - 2026-07-07
Bug Fixes
- configurator: validate host-provided share base URL
- resolve macro catalog drift and wire check:macros into CI
- configurator: fit mobile header toolbar, share correct config link
[0.7.2] - 2026-07-07
Bug Fixes
- configurator: fix stale computed radius display in ComponentsPanel
[0.7.1] - 2026-07-07
Features
- configurator: surface the .sf-surface-bg macro tokens in controls
- tokens,themes,macros,tooling: ship #497 #526 #523 + #505 dist rename
- configurator: refine live preview tabs
- landing: publish the new standalone landing page
- layout,utilities: ship #536, #535; activate #540, #542 into 0.7.0
Bug Fixes
- configurator: address review on surface-bg controls
- configurator: categorise –sf-fluid-width knob under typography domain
- configurator: keep preview tabs framework-native
- utilities: scope .sf-marker to brand/action families + exclude prose
[0.7.0] - 2026-07-06
Added
- components:
.sf-btn— first shipped button component (was staged/commented out). Colour families (--primary/--neutral/--success/--warning/--info/--danger), style treatments (--secondary/--ghost/--outline), a size scale (--xs/--s/--l/--xl), width (--block/--block-cq), and:disabled/.is-loadingstates. The new--outlinemodifier composes orthogonally with any colour family. Ships in the*-componentsandfullbundles. (#493, #486) - components:
.sf-card— first shipped card component (was staged/commented out).__header/__body/__footer/__media/__avatar/__titlesubcomponents with concentric-radius math, plus--bordered/--elevated/--interactivemodifiers. (#494) - tokens: activated the button knobs
--sf-btn-gap/-font-size/-font-weight/-min-height/-border-widthand the full--sf-card-*token block (padding, gap, radius, radius-outer, bg, border, shadow,--shadow--elevated/--shadow--hover, media-ratio/-radius, heading-size, btn-font-size). - docs: documented
.sf-btn/.sf-cardindocs/components.mdwith HTML examples, plus a copy-paste gradient-outline button recipe. - macros:
.sf-corner-scoop— mask-based concave-corner cut, with--top-left/--top-right/--bottom-left/--bottom-rightplacement modifiers and--sf-corner-scoop-size/--sf-corner-scoop-atknobs. - macros:
.sf-overlap/.sf-overlap-host— negative-margin overlap recipe (--down/--start/--endmodifiers) driven by--sf-overlap-pull, with a host class that reserves matching space. - tokens:
--sf-drop-shadow-xs/-xland--sf-text-shadow-xs/-xl— extend both scales to matchbox-shadow’sxs..2xlrhythm;.sf-drop-shadow-xs/-xlutility classes added alongside the existing-s/-m/-l. - utilities: activate staged
.sf-h1–.sf-h6(heading-level typography on any element) and add.sf-text-2xs–.sf-text-4xl(full text-size role: size, line-height, weight, tracking, measure) inoptional/utilities.css. - utilities: activate staged
.sf-hover-grow/-shrink/-float/-sink/-slide-start/-slide-endinoptional/utilities.css. - macros:
.sf-link-externalnow includes a localisable, screen-reader-only accessible name (--sf-link-external-label) for its marker glyph via the CSScontentalt-text syntax. - layout:
.sf-divide(+--vertical) — places a border between direct children in one class, reusing.sf-divider’s width/style/color tokens. (#537) - base:
--sf-media-radius— opt-in global media radius (0 by default) applied via:where(img, figure); set the token to round media globally without fighting.sf-bg-layeror a component’s own radius. (#529) - motion:
.sf-exit--fade/-fade-up/-fade-down/-fade-left/-fade-right/-scale-down— scroll-driven exit effects mirroring.sf-entrance--*, usinganimation-timeline: view()with a new--sf-scroll-timeline-range-exit-start/-endrange. Engines withoutview()support render the element statically rather than fading it out unconditionally. (#527) - utilities:
.sf-list-noneand.sf-selection--alt(backed by new--sf-color-selection-*--alttokens) — written and staged (commented out) inoptional/utilities.css, pending activation. (#540) - utilities:
.sf-sticky+--s/-m/-loffset modifiers — written and staged (commented out) inoptional/utilities.css, layering extra gap on top of the existing--sf-sticky-offsetfluid offset. (#542)
Bug Fixes
- motion:
core/motion.css’s global interactive-element transition (a, button, input, select, textarea, summary) now includesscale/translate, so utilities that animate those properties (e.g..sf-hover-*) aren’t silently discarded by the laterslashed.motioncascade layer on those elements.
[0.6.35] - 2026-07-03
⚠️ Breaking Changes
- layout:
.sf-equalnow implements real CSS multi-column flowing layout (column-width/column-count/column-gap) instead of duplicating.sf-grid--fit’sauto-fitgrid. Content now flows between columns like a newspaper — the previous grid-cell placement is gone.--sf-equal-min-col-2/-3/-4/-6are removed;.sf-equal--2/--3/--4/--6now setcolumn-countdirectly instead of tuning a width threshold. Seedocs/layout.md.
Added
- layout:
--sf-equal-rule-width/-style/-color— optionalcolumn-rulebetween.sf-equal’s flowing columns, off by default. - macros:
.sf-drop-shadow-s/-m/-lutility classes consuming the existing--sf-drop-shadow-*tokens. - print: static pt heading sizes (
h1–h6) inside@media print, replacing the unreliable viewport-relative fluid scale. - tooling: generated VS Code CSS Custom Data (
badges/css-custom-data.json) for--sf-*token autocomplete in-editor.
Changed
- tooling: dist bundle headers now use a minifier-safe
/*! ... */license banner (MIT notice survives minification).
[0.6.34] - 2026-07-02
Bug Fixes
- configurator: clean up leaked test iframes and decouple canvas test from environment
- configurator: remove redundant previewVersion bumps and skip split-mode effect when inactive
- configurator: stop advertising an ignored sanitize option on share-link readers
- configurator,scripts: address CodeRabbit review on PR 474
- configurator: surface save failures instead of silently reverting (SL-018)
- configurator: align All-tokens badge count with domainOf() scoping
- configurator: scope category reset by domainOf(), not raw pattern overlap
- configurator: add per-category reset button, fix invisible reset icons
Performance Improvements
- configurator: rAF-coalesce preview iframe writes during rapid override changes
[0.6.33] - 2026-07-01
Bug Fixes
- configurator: let the preview toolbar grow instead of clipping
- configurator: keep preview toolbar to a single row on mobile
[0.6.32] - 2026-07-01
Bug Fixes
- configurator: move mobile Controls/Preview switcher to the top
- configurator: stop mobile domain panel overflowing past the icon rail
[0.6.31] - 2026-07-01
Bug Fixes
- configurator: hide swatch hover label from assistive tech
- configurator: stop faking a 50-950 ramp for status colors
- configurator: use host-presence check for embedded layout sizing
- configurator: stop full-viewport sizing from clipping inside WP admin
[0.6.30] - 2026-06-30
Bug Fixes
- configurator: validate JSON-import keys against the token allowlist
- configurator: guard empty JSON import, fix dark-surface precedence
- configurator: sanitize override keys before CSS emission
- configurator: null-safe JSON import, finite-number guards, style-injection hardening
[0.6.29] - 2026-06-30
Features
- configurator: show light and dark in semantic color preview
- configurator: live semantic color preview atop colors panel
- configurator: base palette display + status auto-dark default
Bug Fixes
- configurator: resolve auto-dark from loaded token value, not default
[0.6.28] - 2026-06-30
Features
- configurator: keep all header actions on mobile; drop docs/dashboard previews
- configurator: responsive mobile layout for studio shell
- configurator: token-first controls, user themes, motion overhaul
Bug Fixes
- configurator: address review findings from CodeRabbit and Qodo
[0.6.27] - 2026-06-30
Bug Fixes
- configurator: give undefined –sf-space-3xs a fallback in preview skin
- configurator: rebuild live-preview templates on the framework, drop inline styles
[0.6.26] - 2026-06-30
⚠️ Breaking Changes
- tokens: remove the six
baserelative shade aliases (--sf-color-base-superlight,-xlight,-lighter,-darker,-xdark,-superdark).baseis an absolute scale, so direction-named aliases were misleading (e.g.-lighterresolved darker than a near-white base in light mode). Use the numeric ramp (--sf-color-base-50…-950) for fixed shades, or the surface tokens (--sf-color-bg/-inset/-raised) for mode-adaptive elevation. Seedocs/migration.md.
[0.6.25] - 2026-06-29
Features
- configurator: add reset-all confirmation dialog; move save button left
Bug Fixes
- configurator: raw input no longer clears while typing
- configurator: correct token defaults and add raw CSS input mode
- add focus management to reset confirmation dialog in StudioHeader
Performance Improvements
- replace JSON.stringify comparisons with shallow equality for slider responsiveness
[0.6.24] - 2026-06-29
Features
- configurator: replace auto-save with explicit Save button
Bug Fixes
- configurator: harden save state with snapshot-based dirty tracking
[0.6.23] - 2026-06-28
Bug Fixes
- tests: replace brittle source-patch with SLASHED_ROOT env var override
[0.6.22] - 2026-06-28
Features
- configurator: make the configurator embeddable
Bug Fixes
- configurator: isolate WP embedded mode and surface save failures
[0.6.21] - 2026-06-28
Added
- layout:
.sf-bg-layerbackground-layer primitive — absolutely-positioned cover media that sits behind a parent’s content (parent auto-positions and isolates via:has()), composing under.sf-scrim. New knobs:--sf-bg-layer-inset,--sf-bg-layer-fit,--sf-bg-layer-position,--sf-bg-layer-radius,--sf-bg-layer-z.
⚠️ Breaking Changes
- tokens:
--sf-button-radius,--sf-button-padding-block, and--sf-button-padding-inlinerenamed to--sf-btn-radius,--sf-btn-padding-block, and--sf-btn-padding-inline. The button component class is also renamed from.sf-buttonto.sf-btn. Both were staged/commented-out and never shipped in a release.
Staged (commented out — not yet shipped)
- utilities: staged
.sf-balance/.sf-pretty(text-wrap) and.sf-object-cover/-contain/-top/-center/-bottom(object-fit/position) helpers inoptional/utilities.css, commented out likeoptional/components.css. SLASHED stays BEM-first and ships no utility classes in 0.x; uncomment to activate.
[0.6.20] - 2026-06-27
Features
- configurator: make all setting groups collapsible across panels
- configurator: collapsible color panel sections + shade curve mini palettes + fade gradient fix
- configurator: lumlocker preview, gradient editor, macros panel, layout UI
- configurator: show both light and dark palette previews in color controls
Bug Fixes
- configurator: remove duplicate aria-expanded in LayoutPanel
- configurator: aria-expanded, session hook, and review bug fixes
- configurator: gradient tab crash and dark palette swatch bugs
Performance Improvements
- configurator: cache getComputedStyle results per preview version
[0.6.19] - 2026-06-27
Features
- configurator: add contrast tool, fix split preview, enrich panels
- configurator: compress share URLs with deflate (codec v2)
- configurator: google fonts in preview iframe + stylescape template
Bug Fixes
- configurator: address pr review findings
- configurator: guard isAutoMode against external dark overrides
- configurator: align Auto dark derivation with CSS formula
- configurator: symmetric size cap in encoder, harden test preconditions
- configurator: guard against decompression bomb in share URL decoder
[0.6.18] - 2026-06-26
Bug Fixes
- configurator: live preview now reacts to panel changes
- tests: update Playwright spec paths from dist/ to badges/
- update configurator dist/ references to badges/
[0.6.17] - 2026-06-26
Features
- configurator: p0-p5 improvements — bug fixes, new controls, split preview, ⌘k search
- replace configurator with conf-v2 redesign, wire to framework
Bug Fixes
- configurator: address review feedback (partial — interrupted)
- configurator: don’t auto-dark colors that already have dark overrides
- tests: remove redundant fillStyle assignment in contrastBetween
- release: sync root package-lock.json on every version bump
- configurator: suppress horizontal scroll in sidebar nav
- configurator: correct all live preview CSS variables to real SLASHED tokens
- tests: resolve 3 CI failures in configurator e2e shell spec
- ci: build root dist before configurator E2E tests
- configurator: resolve svelte-check type errors
- ci: add test infrastructure and fix lint exclusion for configurator v2
Performance Improvements
- ci: eliminate redundant builds and extract shared test helpers
[0.6.16] - 2026-06-25
Features
- redesign bundle structure — drop essential, remove legacy from defaults
- configurator: consolidate studio redesign
Bug Fixes
- remove essential bundle from release artifacts list
- update demo.html and bundle-picker test to drop essential references
- configurator/tests: fix display-tab generator test for unified ScaleGenerator
- configurator: update e2e tests and DomainPanel for Studio refactor
- tests: update DomainPreview no-spec test to use ‘misc’ domain
- docs: address CodeRabbit review comments on PR #400
[0.6.15] - 2026-06-25
Features
- configurator: screenshot QA, mobile ergonomics, control UX
- configurator: deepen remaining studio workflows
- configurator: deepen layout studio workflow
- configurator: deepen spacing studio workflow
- configurator: deepen color studio workflow
- configurator: expand studio redesign controls
- configurator: deepen visual studios
- configurator: redesign visual editor panels
Bug Fixes
- configurator: address CodeRabbit review comments
- configurator: address all open PR #402 review threads
- configurator: correct a11y test to use Gradients domain for row__info-btn
- configurator: resolve CI failures and address CodeRabbit review comments on PR #401
[0.6.14] - 2026-06-24
Bug Fixes
- configurator: add component swatch to Colors preview section to fix failing e2e test
- configurator: address PR #398 review — ARIA tabs, dynamic bar count, shade-strip perf
- configurator: address preview hub review feedback
- configurator: make radius mini controls accessible
- gen-api-index: detect condensed file headers without requiring DIVIDER_RUN
- configurator: show effective value + reset in readonly consume rows; guard picker on parseability
- css: restore source comments, revert badge sizes, fix indentation
- configurator: make Smart Settings controls editable when tagged consumption
- address live preview review feedback
[0.6.13] - 2026-06-24
Bug Fixes
- configurator: replace all pv__* macro simulations with real sf-* framework classes
- configurator: use real sf-* layout classes in live preview Layout tab
- configurator: fix hardcoded/stale color previews across panels
- three bugs in configurator colors panel
[0.6.12] - 2026-06-24
Features
- @property typed tokens, surface consolidation, macro/CQ tests, drift-check
Bug Fixes
- themes: use –sf-color-action-source-dark in dark selection-bg
- test: update P8 baseline for –sf-color-selection-bg dark branch
- review: complete source-token migration in demo, coverage pages, configurator
- tests+demo: remove error color refs, add sf-section–guttered demo
- configurator: align shade ramp probe with live framework cascade
- restore named-surface colour fallbacks and harden catalog/test checks
[0.6.11] - 2026-06-23
⚠️ Breaking Changes
- tokens: removed
--sf-color-errorfamily (7 tokens:--sf-color-error,-dark,-light,-muted,-strong,-subtle,--sf-color-text--on-error) — use--sf-color-dangerequivalents; seedocs/migration.md - tokens: brand + status source tokens renamed from
-light/-darkto-source-light/-source-dark(e.g.--sf-color-primary-light→--sf-color-primary-source-light); resolved semantic tokens are unchanged
Features
- configurator: add shade ramp without new utility classes
- docs: add CI gate to keep llm-guide.md in sync with token registry
- configurator: add smart settings panels
- configurator: restructure domain panels for clarity and better DX
Bug Fixes
- ShadeRamp: use canonical BRAND_COLOR_KEYS, shared parseRgb, declarative isBase
- docs: restore scoped override tokens; extend live set to CSS source
- configurator: keep curated groups with smart panels
- configurator: reset all smart setting preset tokens
- configurator: restore preview-leads-panel for all domains; keep generators adjacent
[0.6.10] - 2026-06-22
Features
- configurator: inline svg icons + useful, preview-first domain panels
[0.6.9] - 2026-06-22
Features
- configurator: inline live preview for every token domain
Bug Fixes
- configurator: respect reduced-motion for easing bars; assert live override in e2e
[0.6.8] - 2026-06-22
Bug Fixes
- ci: stamp publish-dist provenance with checked-out SHA, not trigger SHA
- ci: eliminate race condition between version-sync push and deploy dispatch
- move Action color from status to brand section in Colors panel
[0.6.7] - 2026-06-22
Features
- configurator: dx slice 1 — scale generator, color roles, accordion brand colors
Bug Fixes
- configurator: keep always-open generator from overlapping; update shell title
- configurator: normalize ramp bars on both endpoints; pin color-role tokens
- configurator: track override keys in role effect; badge dark-only overrides
[0.6.6] - 2026-06-21
Features
- configurator: replace lz-string share links with binary config codes
Bug Fixes
- configurator: harden token-registry id-permanence and uint16 bounds
[0.6.5] - 2026-06-21
Features
- configurator: dogfood SLASHED’s own tokens + theme for the chrome
- configurator: bundle / module picker (Install panel)
- configurator: shareable config URLs + component-test harness
Bug Fixes
- e2e: use page.reload() for share URL restoration test
- configurator: load shared URL config before $state proxy is created
- configurator: resolve three CI test failures
- configurator: resolve 3 review issues
- sync configurator version with framework on every release
[0.6.4] - 2026-06-21
Features
- merge per-size typography sub-properties into core/tokens.css
Bug Fixes
- remove trailing comma in artifacts.json
[0.6.3] - 2026-06-19
Bug Fixes
- ci: ensure both downstream dispatches run even if one fails
- ci: always dispatch configurator deploy on release
[0.6.2] - 2026-06-19
Bug Fixes
- configurator: prioritize group description annotations over source descriptions
- docs: correct sf-bento–compact annotation to row height not gap
- docs: add core/themes.css to gen-class-reference and regenerate
- docs: correct token descriptions in generated API index
[0.6.1] - 2026-06-19
Breaking Changes
- drop the last backward-compat token alias (pre-1.0)
[0.6.0] - 2026-06-19
A usability-driven token-surface reduction: ~182 tokens removed from the public
API (876 → 694) by cutting power-user/vestigial families that real marketing,
landing, and business sites never reach for, while keeping (and clarifying) the
families they do. See docs/migration.md for the upgrade guide.
Features
- themes: add opt-in
.sf-theme-transitionhelper +--sf-theme-transition-durationknob for a soft light/dark cross-fade - tokens: add
--sf-blur(single frosted-surface default) and--sf-opacity-muted - tokens: add semantic font-weight roles
--sf-font-weight-interactiveand--sf-font-weight-strong - tokens: z-index is now a semantic, Bootstrap/Chakra-style ladder — adds
--sf-z-modal,--sf-z-tooltip - tokens: flatten the gap system to a base→semantic→component model — three semantic rhythms
--sf-gap(loose),--sf-content-gap(tight),--sf-gutter(wide); every layout primitive defaults straight to one - tokens: brand ghost/subtle/muted tokens (
--sf-color-{primary,secondary,tertiary,action,neutral,base}-{ghost,subtle,muted}) moved fromoptional/tokens.palette.csstocore/tokens.css— now available in the essential bundle, no longer requiring the optional palette file
Bug Fixes
- tokens:
--sf-color-text--mutednow uses a contrast-aware neutral-lightness formula instead of a plain neutral reference - tokens:
--sf-color-text--on-inversenow correctly references--sf-color-inverse(was--sf-color-text--inverse) - tokens: add
var(--sf-color-bg, …)fallback to--sf-focus-ring-shadowfor contexts where--sf-color-bgis unset - forms: scope button default styles to
:not([class*="sf-"])to avoid overriding Slashed UI component classes - deps: pin undici to >=7.28.0 via overrides to resolve high-severity CVEs
Changed
- tokens: alpha transparency for brand ghost/subtle/muted tokens now uses
oklch(from …)syntax instead ofcolor-mix(…, transparent)— equivalent output, better color-space fidelity - optional/tokens.palette.css: numeric alpha scale is now gated behind
@supports (color: oklch(from red l c h)); older engines receive no alpha tokens instead of invalid values
⚠️ Breaking Changes
- tokens: removed the combinatorial fluid-pair “bridge” matrix
--sf-{space,text}-{step}-to-{step}(optional/tokens.sizes-extended.css). Use the already-fluid base scales, or a customclamp(). - tokens: trimmed alpha ramps to 5 steps per family — kept
-a5/-a10/-a30/-a50/-a80; removed-a20/-a40/-a60/-a70/-a90/-a95. For an intermediate alpha useoklch(from var(--sf-color-x) l c h / .NN). - tokens: removed the custom fluid slots
--sf-fluid-custom-{1,2,3}and their-min/-maxendpoints. Write aclamp()directly; engine knobs--sf-fluid-{min,max}-vware unchanged. - tokens: collapsed the 5-step blur scale
--sf-blur-{xs,s,m,l,xl}to a single--sf-blur. Other amounts: inlineblur(Npx). - tokens: removed the numeric opacity scale
--sf-opacity-{0,10,25,50,75,100}. Kept--sf-opacity-disabled; added--sf-opacity-muted(0.5). - tokens: removed stroke presets
--sf-stroke-{thin,regular,bold,heavy}. Set SVGstroke-widthdirectly or reuse--sf-border-width-*. - tokens: removed multi-column presets
--sf-col-width-{s,m,l}and--sf-col-rule-width-{s,m,l}. - tokens: removed
--sf-truncate-suffix(was never read —text-overflowstring values are Firefox-only). - tokens: removed rare font-weights
--sf-font-weight-{thin,extralight,extrabold,black}. Keptlight/normal/medium/semibold/bold; for an off-scale weight writefont-weight: 100or override a role token.--sf-body-strong-weightnow references--sf-font-weight-strong. - tokens: removed the z-index numeric ladder
--sf-z-{low,mid,high,top,max}. Use the semantic roles--sf-z-{sticky,fixed,dropdown,overlay,modal,toast,tooltip}(values shifted to the 1000-base Bootstrap/Chakra convention). - tokens: flattened the gap aliases. Removed the middle “layout” tier
--sf-space-gap,--sf-space-content,--sf-space-gutter,--sf-gap-size, and folded the container gutter into a single--sf-gutter(no separate--sf-gutter-width/--sf-space-gutter). Layout primitives now default straight to the semantic--sf-gap/--sf-content-gap/--sf-gutter. To retune all primitives at once, override the semantic token (e.g.--sf-gap); per-primitive knobs (--sf-cluster-gap, …) are unchanged. - tokens: removed the
--sf-color-text--on-surfacecompat alias — use--sf-color-text--on-base. SLASHED is pre-1.0 and retains no backward-compat aliases.
[0.5.47] - 2026-06-18
Bug Fixes
- tokens: add static fallbacks for –sf-color-text–on-* outside sign() gate
- print: globally force-expand all in print
- macros: correct margin-block-end-only on prose lists
- print: scope details rules to .sf-prose; remove sub-floor RTL fallback
- demo: add sf-scrim__content and sf-clickable-parent__overlay examples
- post-freeze: implement category-2 audit fixes for issue #327
[0.5.46] - 2026-06-17
Features
- layout: add .sf-cq and refactor .sf-equal to RAM pattern
- configurator: foldable generators, fullscreen preview, a11y & theme import/export
- bento: default 4 cols, add child span modifiers (School 1)
Bug Fixes
- themes,tokens: add [data-theme=”light”] scoped token re-declarations and correct -dark token group
- themes: re-declare surface and on-colour tokens in [data-theme=”dark”]
- tokens,tests,docs: register -dark tokens as @property
and update baselines - tests: add 11 -dark @property tokens to token-api snapshot
- tokens,themes: re-enable @property
for computed tokens via -dark source tokens - tokens: remove @property registration for computed color tokens
- tokens: computed color mirrors resolve via -light tokens, not hardcoded values
- tokens,layout,macros: pre-freeze audit fixes — overflow fallback, color @property, radius-2xs, equal tokens
- extend prose heading gap to h5/h6 and fix entrance animation fill-mode
- framework: cover-max min-height bug + overflow logical property fallbacks
- framework: audit — replace transition-all, motion/a11y/form fixes
- docs: update sf-grid-cols-1 description to reflect no container context
- ci: sync configurator api-index.generated.json
- ci: sync docs and registry with bento API changes
- bento: remove redundant .sf-bento–3
- lumlocker: scope to 4 brand colors, fix section-theme bypass
[0.5.45] - 2026-06-15
Bug Fixes
- tests: update semantic snapshot for opaque –sf-color-text–muted
- restore select chevron, make muted text opaque, fix is-* group metadata
[0.5.44] - 2026-06-15
Features
- api-freeze: implement all Category 1 pre-freeze public API changes
- preview: comprehensive framework showcase with 7 tabbed sections
- notify slashed-plugins when configurator source changes
- configurator: make consume tokens read-only
Bug Fixes
- preserve @layer declaration in minified CSS bundles
- tests: sync token-api snapshot with new tokens from merged PR
- tests: update snapshots for new h*-max-width tokens and border-scale
- tests: update api-index-sync and p7-oldengine after HSL fallback removal
- docs: update all references to renamed tokens and layout classes
- a11y: forced-colors fixes for text-gradient, spinner, and button borders
- api-freeze: move component tokens to tokens.components.css, drop premature utility classes
- preview: address CodeRabbit a11y findings
- add permissions block to notify workflow (CodeQL)
- tests: use power-knob number input for preset-deactivation test
- tests: use shadow-strength knob for preset-deactivation test
- tests: update presets test to use a knob token
Reverts
- layout: restore .sf-equal class and –sf-equal-cols/–sf-equal-gap tokens
[0.5.44] - 2026-06-15
Features
- api-freeze: implement all Category 1 pre-freeze public API changes
- preview: comprehensive framework showcase with 7 tabbed sections
- notify slashed-plugins when configurator source changes
- configurator: make consume tokens read-only
Bug Fixes
- tests: sync token-api snapshot with new tokens from merged PR
- tests: update snapshots for new h*-max-width tokens and border-scale
- tests: update api-index-sync and p7-oldengine after HSL fallback removal
- docs: update all references to renamed tokens and layout classes
- a11y: forced-colors fixes for text-gradient, spinner, and button borders
- api-freeze: move component tokens to tokens.components.css, drop premature utility classes
- preview: address CodeRabbit a11y findings
- add permissions block to notify workflow (CodeQL)
- tests: use power-knob number input for preset-deactivation test
- tests: use shadow-strength knob for preset-deactivation test
- tests: update presets test to use a knob token
Reverts
- layout: restore .sf-equal class and –sf-equal-cols/–sf-equal-gap tokens
[0.5.43] - 2026-06-13
Features
- configurator: add light/dark mode toggle for the configurator UI
[0.5.42] - 2026-06-13
Features
- configurator: add Gradients, Palette, and Forms sidebar domains
- configurator: expand live preview with gradients, navigation, form states, motion
Bug Fixes
- configurator: use correct duration token names in motion preview
- tests: update assertions for logical property changes + fix version sync
[0.5.41] - 2026-06-13
Bug Fixes
- release: add actions:write and use gh CLI for workflow dispatch
- release: dispatch deploy/dist workflows after sync-main push
[0.5.40] - 2026-06-13
Bug Fixes
- configurator: two root-cause bugs on mobile
- configurator: prevent spacing-scale bars from overflowing Preview pane
- configurator: prevent ScaleGenerator preview from overflowing on mobile
[0.5.39] - 2026-06-13
Bug Fixes
- configurator: hide brand-colors card in Advanced mode (filter bypass)
- configurator: hide essentials card in Advanced mode
[0.5.38] - 2026-06-13
Bug Fixes
- configurator: eliminate preview flash + fix narrow-viewport overflow
[0.5.37] - 2026-06-13
Bug Fixes
- configurator: track viewport changes for output drawer collapse
- configurator: collapse output drawer on mobile + limit max-height
- configurator: remove unused sync import from css.js
- configurator: inject version at build time — eliminates off-by-one release bug
[0.5.36] - 2026-06-12
Features
- configurator: ux/a11y polish — escape, focus, persisted prefs, meta
Bug Fixes
- configurator: resolve horizontal overflow + CodeRabbit review fixes
- configurator: font-weight tokens no longer get font-family picker + draggable pane widths
- configurator: preview overlay self-contained controls + a11y polish
- configurator: garbage css import no longer wipes existing overrides
- configurator: track viewport changes live + dedupe count helpers
- configurator: make the live preview reachable on narrow viewports
[0.5.35] - 2026-06-11
Features
- configurator: docs links per domain, header export shortcut
- configurator: scalar-writing scale generator + style preset rows
- configurator: curated Basic forms with friendly labels
- configurator: demote quick knobs to Advanced, add Basic Home screen
Bug Fixes
- configurator: address review feedback on PR #311
[0.5.34] - 2026-06-11
Bug Fixes
- address CodeRabbit review comments
- tokens: classify –sf-shadow-strength as role:knob in generation pipeline
- configurator: audit fixes — resetDomain history, shadow role, dead code
- configurator: add danger to brand color keys
- configurator: brand colors, consume/configure filter, cheatsheet tab
- configurator: domain essentials, token descriptions, css source banners
- configurator: address 6 reported issues
[0.5.33] - 2026-06-10
Features
- configurator: add configure/consume usage filter for token classification
- badges: add optimal bundle size, zero-deps, and CDN badges
Bug Fixes
- configurator: replace overflow:hidden with overflow:clip in panel cards
- configurator: address code-review findings on mobile layout
- badges: use namedLogo instead of logo in endpoint badge JSON
- bundle: warn instead of silently skip when badge bundle is missing
- configurator: fix token editor overflow hiding inputs on mobile
- configurator: correct version display and improve mobile header layout
[0.5.32] - 2026-06-10
Features
- configurator: knob-density pack — slider editors, drives/contrast badges, viewport ruler, RM preview, diff view
- configurator: advanced configurator DX — quick knobs, theme presets, undo/redo
- configurator: full redesign — categorised UI, sidebar nav, classifier coverage
- palette mix knobs, surface cascade, [data-theme] bg fix, alpha leak fix
Bug Fixes
- configurator: address CodeRabbit review on knob-density commit
- configurator: honour quoted parens in light-dark() depth scan
- configurator: tabbed Basic/Advanced UI, dark-mode preview, display scale
- address review findings on palette knobs, docs, and tier metadata
[0.5.31] - 2026-06-10
Added
- Custom fluid slots —
--sf-fluid-custom-{1,2,3}ad-hoc fluid values: set a-min/-maxendpoint pair (unitless rem), read the slot as a length that interpolates across the engine’s viewport range and recalibrates with--sf-fluid-{min,max}-vw. - Generic surface —
.sf-surface(core/macros.css) +--sf-surface-color(core/tokens.macros.css): give it any color (including palette shades) and it derives background, auto-contrast foreground, and the full contextual token cascade — extending the colour-context contract beyond the 11 named.sf-surface--*variants. --sf-section-scale— global multiplier over every--sf-section-pad--*size; one dial re-rhythms all section padding (default1, no visual change).--sf-leading-taper— progressive per-size line-height tightener consumed byoptional/tokens.sizes-extended.css(default0, no visual change).optional/config-example.css— single annotated “control panel” reference file: brand colours, the 12 fluid-engine inputs, custom slots, all scale multipliers, font families, radius.- docs: new “Fluid engine” and “Root size, rem and user zoom” sections in
docs/theming.md(engine inputs, worked examples, canonicalclamp()recipe); generic-surface + author-your-own-surface recipes indocs/macros.md; “Fluid engine” section in the README; roadmap entries for a native@function --fluid()module and surface consolidation.
[0.5.30] - 2026-06-10
Bug Fixes
- configurator: render WCAG color swatches, sync to 0.5.29, show display type
[0.5.29] - 2026-06-10
Features
- configurator: unify into one palette generator + on-color usage preview
- configurator: add WCAG color locks + richer live preview
- pages: deploy full docs site — docs, demo, coverage, configurator
Bug Fixes
- configurator: gate usage-preview roles on the on-color token too
- configurator: address self-review of the OKLCH generator
- pages: fix _site permission denied after jekyll-build-pages
[0.5.28] - 2026-06-09
Features
- configurator: add Accessibility + Scales views and shared parity modules
- configurator: add Accessibility + Scales views and shared parity modules
- picker: convert hex and hsl → oklch on parse
- configurator: oklch/oklab picker, wider inputs, token descriptions
Bug Fixes
- configurator: a11y polish on the new tools (self-review)
- configurator: a11y polish on the new tools (self-review)
- annotations: remove duplicate –sf-color-dim key; widen artifact srcPrefixes
- artifacts: auto-sync configurator on token-annotations.json changes
[0.5.27] - 2026-06-09
Features
- tokens: retier fluid -to- bridges as PUBLIC-ADVANCED and add knob/consumption role axis
- release: auto-generate changelog + restore Unreleased + breaking-change guard
Bug Fixes
- release: address CodeRabbit review findings
- convert changelog-release.js to ES module + sync v0.5.26 artifacts
[0.5.26] - 2026-06-09
Note: v0.5.25 was published on 2026-06-08 but its
sync-mainCI step failed due to the ESMrequire()bug fixed in this release. That release had no additional changes relative to v0.5.24; v0.5.26 supersedes it.
- Generative fluid scale engine — the fluid type, display, and space scales are now computed at runtime from override-able input tokens instead of hard-coded
clamp()slopes. No build step.Added
--sf-fluid-min-vw/--sf-fluid-max-vw— fluid interpolation viewport range (rem, unitless). Override once to recalibrate every fluid token.--sf-text-ratio-min/--sf-text-ratio-max,--sf-text-base-min/--sf-text-base-max— generative TYPE scale inputs (dual modular ratio: 1.25 mobile → 1.333 desktop).--sf-text-display-base-min/--sf-text-display-base-max— generative DISPLAY scale base (reuses the type ratios).--sf-space-ratio-min/--sf-space-ratio-max,--sf-space-base-min/--sf-space-base-max— generative SPACE scale inputs (independent of type).--sf-display-s-line-height/--sf-display-m-line-height/--sf-display-l-line-height— tighter leading for display sizes (not auto-applied; wire alongsidefont-size).--sf-prose-blockquote-padding,--sf-prose-blockquote-border,--sf-prose-hr-margin,--sf-prose-nested-list-gap,--sf-prose-table-pad— extended.sf-proseeditorial spacing knobs (auto-applied inside.sf-prose, reset by.sf-not-prose)..sf-surface--*now also rebind--sf-color-link/--sf-color-link--hover/--sf-color-link--underlineso links on coloured surfaces stay contrast-safe (lightness preserved, chroma nudged; underline carries the affordance).scripts/gen-sizes-extended.jsnow emits the bridge matrix over the same generative engine, sooptional/tokens.sizes-extended.cssrecalibrates with the inputs.Changed
--sf-text-*,--sf-text-display-*,--sf-space-*,--sf-header-height, and--sf-sticky-offsetformulas rewritten ascalc()/pow()over the new inputs. Default computed values are within rounding of the previous scale.core/tokens.color-fallbacks.css(HSL legacy fallbacks) is no longer bundled intoslashed.essential*— those bundles are now modern-only. It remains first-loaded in everyoptimal*/fullbundle, and can be<link>ed before an essential build to restore old-engine colour fallbacks.Removed
- ⚠️ Breaking:
--sf-perspective-near/--sf-perspective-normal/--sf-perspective-far— unused 3D tokens with no framework integration.Browser support
- ⚠️ Floor raised Chrome 123 → 125 to gain the CSS
pow()math function that drives the generative scales. Safari 17.5+ / Firefox 128+ unchanged.
- #269 — fix changelog version ordering
Reorder PR summary newest→oldest (v0.5.24 → v0.0.1). Rename “Unreleased” to “v0.0.1 / Pre-release”. Remove orphaned content block floating between sections.
- #268 — consolidate post-0.3.0 work under v0.5.24 in CHANGELOG
Restructures CHANGELOG.md to assign 222 merged PRs to proper version buckets (v0.1.0–v0.5.24), replacing a perpetual [Unreleased] accumulation.
- #267 — add CHANGELOG_FULL.md with complete development history
Adds CHANGELOG_FULL.md — a master changelog organized by version and category (Framework vs Plugins) covering all 222 PRs.
- #266 — docs: consolidate and trim documentation
Merges three overlapping docs into existing files (dark-mode.md → theming.md, performance.md → architecture.md, browser-support.md → README). Cuts filler prose throughout.
- #265 — docs: add token index (tier + fallback cross-reference)
Adds scripts/gen-token-index.js + docs/token-index.md — a generated per-token table cross-referencing stability tier (PUBLIC/ADVANCED/INTERNAL), source file, HSL fallback coverage, and default value for all 771 tokens.
v0.5.24
- #264 — consolidate post-0.3.0 work under v0.5.24
Fixes the framework changelog version history. The changelog was stuck at 0.3.0 with everything piled under a perpetual [Unreleased] section, even tho
v0.5.0
- #179 — Identity Refresh and Documentation Overhaul for v0.5.0
This comprehensive update refreshes the SLASHED framework’s identity and documentation for the v0.5.0 release.
- #181 — don’t abort commits staging gitignored dist bundles
The .githooks/pre-commit hook rebuilds dist bundles and git adds every output. But dist/*.css is gitignored on main (built via npm run build, shipped
- #188 — complete color system — shade scale, section theming, swatch coverage
A comprehensive pass over the SLASHED color system touching the core framework CSS, the Bricks Builder integration, and the documentation. All changes
- #192 — refresh all docs, add WordPress plugin section, fix version sync
- E: Edgeless → Explicit — describes @layer declaration order, BEM naming, and the token API contract more precisely than the opaque “Edgeless”
- #194 — Rename –sf-color-base to –sf-color-surface
This PR renames the –sf-color-base token family to –sf-color-surface throughout the codebase, along with renaming –sf-color-well to –sf-color-inse
- #196 — Harden CSS value validation and fix color export regression
This PR addresses critical security and correctness issues in the CSS generator and color handling:
- #197 — move numeric scale ownership to tokens.palette.css
Removes 121 numeric-scale lines (50–950) from core/tokens.css across
- #198 — Redesign SF colors panel: Quick Use + Palette layout, two distinct modes
Badge (bottom-right): reference-only. Click copies var() to clipboard.
- #199 — Redesign SF Colors panel: Quick Use + Palette layout, two behaviour modes
- Two distinct modes replace the old single-mode panel:
- #200 — handle border/box-shadow colour inputs without explicit type attribute
- SF Colors picker was throwing “Couldn’t apply var… input not found” when used inside border and box-shadow controls, while working correctly for bac
- #201 — SF Colors picker panel — Quick Use + Palette, active swatch, border support, base rename
Full overhaul of the SF Colors panel and the –sf-color-base brand family rename.
- #203 — Add contextual color cascade and fluid layout dimension controls
This PR enhances the design system with two major features: a contextual color cascade for surfaces that automatically adapts semantic color tokens to
- #209 — Replace modifier mode with multi-modifier support in all modes
This PR removes the dedicated “modifier” mode and instead adds support for multiple modifiers across all non-migrate modes (add, rename, replace). Mod
- #210 — Build reBEMer editor app (multi-block + multi-modifier)
- Compiles the Svelte source changes from #209 into the deployed plugin assets
- #211 — auto-rebuild all generated artifacts on commit + CI
- Adds scripts/artifacts.json — a single manifest mapping source globs → build command → outputs for every generated/compiled file in the repo
- #213 — escape Liquid delimiters in rebemer.md code block
- Fixes the red cross on main — GitHub Pages build was failing with a Liquid syntax error
- #224 — Add optional sizes-extended tokens and color/border shorthands
Introduces a new optional token module (optional/tokens.sizes-extended.css) that extends the core spacing and typography scales with bridge variables
- #226 — add All-in-one (mixed) mode with per-row op toggle and family picker
New ‘mixed’ mode in the reBEMer panel lets users assign BEM classes to a
- #228 — Document all framework tokens/classes in cheatsheet with coverage enforcement
This PR significantly expands and reorganizes the Cheatsheet documentation to cover every token and class shipped in the framework, and adds automated
- #229 — Sync viewport previews, revamp live preview, icon-trigger class hints
- Live Scale Preview sliders in the Spacing and Typography tabs now scrub
- #232 — Fix SF color button state sync and touch event handling
This PR improves the reliability of the SLASHED color button in the Bricks editor by ensuring its visual state stays synchronized with the color input
- #233 — restore -webkit-background-clip for .sf-text-gradient (Safari 17.5)
A full audit pass over the CSS source (core/ + optional/, 22 files) found the framework in excellent shape — stylelint is clean, tradeoffs are documen
- #234 — native validation, autofill, auto-grow textarea & numeric/overlay tokens
Resolves the batch of well-scoped, low-risk open issues. Each change is additive, progressively enhanced, and built on existing tokens.
- #235 — add .sf-content-auto and .sf-tabular-nums macros (#222, #214)
Follow-up to #234. Resolves the two remaining issues that I’d previously mis-shelved as “blocked utilities” — they’re actually macros (token-driven re
- #236 — class-family picker for rename/replace + remove-all toggle
In the reBEMer panel, Rename mode previously always renamed the first class on an element (“This element has 2 classes. Only the first will be renam
- #237 — scrim, focus-shadow, divider & link recipes + auto-colour tests
Implements the recipe-tier enhancements and tests recommended after the SLASHED recipe coverage audit. Everything here is a token-driven macro/rec
- #239 — prepare for WordPress.org submission
- Add readme.txt (required for wp.org review)
- #240 — WordPress.org submission prep, docs cleanup, ESM scripts
- WordPress.org submission prep — local-first CSS delivery (dist/ bundled in plugin), in-admin updater to download latest bundles from jsDelivr, optio
- #241 — add feature-completeness & graceful-degradation issue backlog
Adds docs/issue-backlog.md — a grouped backlog of suggested GitHub issues covering feature completeness on the modern CSS baseline and graceful degrad
- #251 — add path to maximum engine-design score
- Adds docs/path-to-max-score.md, a per-criterion roadmap for raising SLASHED toward the ceiling of the 14-category engine-design scoring model (max 1
- #252 — Add comprehensive index documentation for optimal bundle
This PR adds a complete reference index document (docs/optimal-bundle-index.md) that exhaustively catalogs everything shipped in the SLASHED optimal b
- #253 — add 100% framework coverage test pages
Adds a six-page manual cross-browser test suite under docs/, designed to exercise 100% of the framework in action. Loads only the full variant via the
- #254 — add Tier-1 sRGB color fallbacks for pre-Chrome-123 / pre-Safari-17.5 engines
Implements the “gate at declaration site” pattern to fix IACVT failures on
- #255 — add optimal bundle master index
Adds docs/optimal-bundle-index.md — a complete master reference for the dist/slashed.optimal.css bundle variant, built directly from all 18 source fil
- #256 — keep WordPress plugin’s bundled CSS in sync with core builds
The plugin ships local copies of the essential/optimal/full CSS bundles
- #257 — version sync to 0.5.21 + pre-release audit fixes (0.6.0 prep)
Pre-release audit and cleanup ahead of the 0.6.0 freeze. This does not release 0.6.0 — it restores the version invariant to the current released versi
- #259 — Remove unused semantic color variant tokens
Removed 45 unused semantic color variant tokens across success, warning, error, info, and danger color families. These tokens were defined but not uti
- #260 — full token palette, gradients, font-size/spacing presets + in-editor token panel
Brings the Gutenberg integration up to parity with the Bricks one. The block editor was shipping a stale, hand-maintained 20-entry color palette with
- #261 — : wire scales, semantic z-index aliases, complete Tier-1 fallbacks
Token-layer audit follow-ups: fixes dead/non-functional tokens, completes the Tier-1 sRGB fallback coverage, adds a semantic z-index layer, and makes
- #262 — Split WordPress plugin into its own repo; decouple framework + docs cleanup
Prepares the framework repo for the upcoming API freeze by splitting the bundled WordPress plugin out into its own repository (codeslash-dev/slashed-f
- #263 — Make framework plugin-agnostic and fix release version drift
Follow-up to the plugin split (#262). Removes leftover integration references from the framework and fixes the version pipeline that left bundle heade
v0.3.0
- #79 — class taxonomy + macros layer + components blueprint
Class taxonomy refactor for v0.3.0. Introduces the new slashed.macros cascade layer, ships 12 macro recipes, adds 3 recipe-coverage essentials (icon-boxed
- #80 — add workflow_dispatch trigger to release workflow
Allows publishing a release manually (e.g. v0.3.0) without needing to
- #82 — replace ‘blueprint’ with plain language
Replaces the word “blueprint” across docs, README, CHANGELOG, and CSS file headers with plain language (“not yet complete”, “commented out”, “8 compon
- #85 — POC: Svelte 5 admin page (alongside legacy jQuery one)
Hypothetical, non-merging PR. Goal: see what adopting Svelte 5 for the admin settings page actually looks like in this codebase. Discardable.
- #86 — Replace light-dark() with FieldText system color for select chevron
Replaces the light-dark() function with the CSS system color FieldText for the select element chevron SVG stroke. This simplifies the implementation w
- #87 — bump softprops/action-gh-release from 2 to 3
Bumps softprops/action-gh-release from 2 to 3.
- #88 — bump actions/upload-artifact from 4.6.2 to 7.0.1
Bumps actions/upload-artifact from 4.6.2 to 7.0.1.
- #89 — bump actions/checkout from 4 to 6
Bumps actions/checkout from 4 to 6.
- #90 — bump actions/setup-node from 4 to 6
Bumps actions/setup-node from 4 to 6.
- #91 — surface macros, entrance effects, unified lightness, section collapse
Implements the full Tier 1 feature set discussed in the framework audit session:
- #93 — surface macros, entrance effects, unified lightness, section collapse (replaces #91)
Replaces #91, which got tangled in non-fast-forward state after PR #92 landed and could not be cleanly updated in place.
- #94 — Add comprehensive public API audit for SLASHED v0.3.0
This PR adds a detailed public API audit document (audits/audit-c.md) for SLASHED v0.3.0, conducted on 2026-05-25. The audit comprehensively reviews t
- #95 — pre-freeze API audit (audit-b) for v0.3.0
Full public API audit of the SLASHED framework v0.3.0, performed before the API freeze.
- #96 — pre-freeze API audit for v0.3.0
Full public API audit of SLASHED v0.3.0 before the token-API freeze. The audit reads every source file (core/.css, active optional/.css, all docs/*.
- #99 — admin panel full API coverage + cheatsheet (v2)
This PR supersedes #98 with review feedback fixes applied.
- #100 — address PR #98 review feedback (a11y, timer, tab separation)
Addresses all CodeRabbit review comments from PR #98.
- #101 — add canonical token/class counter as single source of truth
Introduce scripts/audit.js + docs/registry.json to eliminate count
- #102 — Depersonalize framework references in docs and comments
Replace named third-party framework references in documentation and source comments with neutral wording.
- #104 — API freeze - new tokens, hardcode fixes, cleanup
Prepares the token layer for API freeze by:
- #107 — PUBLIC/ADVANCED/INTERNAL contract + docs sync
Completes the PUBLIC/ADVANCED/INTERNAL token classification and syncs documentation with code for the v0.3.0 API freeze.
- #110 — dual-mode link selection, built-in focus ring, broader lifting
Explicit mode: add [data-overlay-link] to the primary link and every
- #111 — rebuild minified bundles to purge stale vendor wording from sourcemaps
Rebuilds all 10 minified CSS bundles and their sourcemaps to remove a stale vendor-specific comment that survived PR #102’s framework-name cleanup.
- #112 — Remove all third-party CSS framework references
Strip mentions of specific framework names and comparative advantage claims
- #113 — Pre-freeze cleanup: drop deprecated, consolidate hover, canonical xs..2xl scale
Pre-freeze cleanup. Single PR, no version bump (no users yet). Five logical commits:
- #115 — Standardize hover color variable naming convention
This PR standardizes the naming convention for hover state color variables across the design system by replacing double-dash separators (–) with sing
- #117 — Add .sf-gap and .sf-equal layout utility classes
Adds layout-agnostic gap utilities and a fixed equal-column grid system to provide more flexible spacing and grid options for developers.
- #118 — resolve pre-freeze audit items (9 remaining 🟠)
Addresses all remaining 🟠 items from the v0.3.0 API audit. After this PR, the only open items are 🟡 (cosmetic/historical, safe to defer).
- #121 — pre-freeze audit fixes (rebased onto main)
Rebased PR #118 (audit-fixes-pre-freeze) onto current main (which now includes PRs #116, #117, #120). All merge conflicts resolved.
- #126 — resolve pre-freeze API audit findings
Resolves all findings from the pre-freeze API audit (9 issues across documentation drift, naming inconsistencies, and tooling gaps).
- #127 — auto-bundle WordPress plugin zip in dist folder
Adds automatic packaging of the “SLASHED for Bricks” WordPress plugin into a distributable zip (dist/slashed-bricks.zip) as part of the standard build
- #128 — prevent node_modules from being staged on dist branch
git rm -rf . (in the orphan checkout step) deletes .gitignore from
- #130 — implement element-aware suggestions, auto-numbering, migrate mode, unused-class endpoint
Stacked on #129 — branch is feat/rebemer-v1-implementations ⇐ fix/natural-sort-color-palette ⇐ main. Merge #129 first, then this.
- #131 — Fix/natural sort color palette
- Added “Migrate ID Styles” mode to reBEMer panel with class migration preview and summary
- #133 — remove redundant .visually-hidden alias from .sr-only rule
.sr-only is the canonical class name used throughout the codebase.
- #135 — Generalize Auto-BEM references and remove vendor-specific wording
Updated documentation to use neutral language for Auto-BEM tooling and remove vendor-specific references.
- #136 — Add CodeSlash homepage design and layout
Added a complete, production-ready homepage for CodeSlash — a senior WordPress developer portfolio/service site. This is a standalone HTML file with e
- #138 — Redesign default token palette and fix selection color
- Redesigned default color palette — all 6 brand source tokens updated for a more vibrant, internally cohesive out-of-the-box appearance; neutral bump
- #141 — add comprehensive Playwright test suite (172 tests)
Six spec files covering every major framework area:
- #146 — automatic version sync on release
Adds scripts/version-sync.js which reads the canonical version from
- #147 — Add typography preview and improve color swatches in admin UI
This PR enhances the Bricks admin app with a live typography scale preview component and improves the color preview to show dark mode variants and sta
- #148 — version display, generated CSS fix, spacing step controls, type scale generator
- Version pills in admin header: Framework version (SLASHED_BRICKS_CSS_REF) and plugin version (SLASHED_BRICKS_VERSION) now appear as small monospace
- #149 — Sync version constants during release and update bundle size
This PR improves the release workflow by automatically syncing version constants to match the release tag, and updates documentation to reflect curren
- #150 — Fix OKLch color conversion matrices for accurate round-trip conversion
This PR corrects the color conversion matrices used in the OKLch to hex and hex to OKLch conversion functions to use the standard OKLab matrices, ensu
- #151 — richer live preview — motion, focus ring, card, dark mode toggle, CSS export
- Replace static dark section with ☀/☾ Light/Dark toggle; all swatches,
- #152 — dark swatches respect the dark-overrides-enabled toggle
- Bug: When the “Custom dark mode colors” toggle was OFF, the live preview still injected explicit –sf-color-*-dark custom properties — from previous
- #153 — remove dead code, stale artifacts, and empty placeholder
- Delete legacy admin-page.js/.css (17KB) — PHP now enqueues admin-app/app.js/.css
- #154 — comprehensive CSS quality review — 49 issues corrected
- print.css: remove var() from @page (not valid there); hardcode A4/2cm
- #155 — 16 CSS correctness issues found in systematic audit
- layout.css: replace physical left with logical-safe approach for
- #156 — add roadmap with pre-1.0 priorities and post-1.0 enhancements
Captures planned work (reBEMer v1, prose tokens, contrast table, class
- #158 — mid-apply snapshot/rollback
- applyToSubtree() now snapshots each element’s class IDs, structure-panel label, and (for migrate mode) the exact setting keys that will be deleted,
- #159 — WCAG contrast checker + reBEMer undo batching
- New WCAG tab in the admin settings page with two features:
- #160 — add Jekyll _config.yml to stop Pages build failing on Liquid syntax
- Adds a minimal _config.yml at the repo root with render_with_liquid: false
- #161 — require class-admin-page-svelte before reBEMer enqueue (frontend fatal)
- Adds require_once for class-admin-page-svelte.php inside slashed_bricks_rebemer_init() before instantiating Slashed_Bricks_ReBEMer_Enqueue
- #162 — modifier ensures base class present; rename carries modifiers
Two reBEMer apply-mode bugs related to modifier classes.
- #165 — serve CSS from dist-branch SHA + add Layouts admin tab
- CDN URL now uses immutable dist-branch SHA instead of the release tag, so the jsDelivr URL is stable and doesn’t require CSS files to be tracked on
- #168 — add standalone Gutenberg integration plugin (v1)
Three files, zero Bricks dependencies — designed to be severable into an
- #169 — move token infrastructure to global includes/
- Token overrides, REST API, and admin page are now global — moved from integrations/bricks/includes/ to includes/ and renamed from Slashed_Bricks_* t
- #175 — move WP plugin into plugins/SLASHED-for-WP/
Separates the WordPress plugin from the SLASHED CSS framework at the repository level. The framework stays at root; all WordPress-specific code moves
v0.2.0
- #30 — v0.2.0: bugfixes from quality audit + token enrichment + a11y/docs/tooling
Doprowadza framework do stanu opisanego w zatwierdzonym 7-fazowym planie: 3 bugfixy z audits/quality-audit-2024-full.md, 5 warningów rozstrzygniętych
- #32 — show auto-derived dark colors in the configurator
Follow-up to #29. The theme configurator’s dark color pickers were seeded from a hardcoded TOKEN_DEFAULTS table, which:
- #33 — Add comprehensive comparative audit against reference CSS frameworks
This PR adds a detailed comparative audit of SLASHED against a curated set of reference CSS frameworks
- #34 — Phase 1: truthfulness foundation — themes layer extraction, bundle scope, browser floor accuracy
Phase 1 of the perfection roadmap from audits/comparative-audit-2026.md Resolution Log. Foundation pass — no behavioural changes, no breaking changes.
- #35 — clear WCAG AA Normal by default for every brand & status on-color (Phase 2)
Phase 2 of the perfection roadmap. Tightens the default brand & status palette so every on-color foreground clears WCAG AA Normal (4.5:1) by default —
- #36 — WCAG AA Normal by default for every brand & status on-color (Phase 2 redo)
Phase 2 (#35) was approved and clicked-merge, but its base.ref was chore/phase-1-truthfulness (the now-deleted Phase 1 branch) instead of main. After
- #37 — preserve authored colour by default; opt-in .print-color-exact / .print-no-color (Phase 3)
Phase 3 of the perfection roadmap. Reverses the print-stylesheet colour contract: authored colour is preserved by default, ink-on-paper is now an opt-
- #38 — comparative audit of framework coverage (2026-05-20)
Adds a single new file: audits/comparative-audit-2026-05-20.md (1501 linii, narracja po polsku, nagłówki sekcji po angielsku zgodnie ze specyfikacją a
- #39 — name container queries — sf-layout and sf-alternate (Phase 4)
Phase 4 of the perfection roadmap. Names two of the framework’s container-query containers and binds one framework-internal query to a name. The remai
- #40 — Phase 5 — Motion API polish
Phase 5 of the framework perfection plan. Polishes the motion/transition API, modernizes accessibility patterns, and proves @property color interpolat
- #41 — Phase 6 — regression tests & full demo coverage
Phase 6 — Coverage & regression tests. Completes the full audit remediation plan.
v0.1.0
- #42 — add v0.1.0 entries for last 7 merged PRs (Phases 1–6)
Covers PRs #34–41: truthfulness foundation, WCAG AA token fix, print colour
- #43 — use oklab for palette color-mix to prevent hue drift
Two fixes addressing palette correctness and demo page performance:
- #44 — comprehensive visual tests + missing layout demos
- Replace text-only layout references in docs/demo.html with proper visual demonstrations
- #45 — tighten assertions flagged in PR #44 review
- Replace permissive regex on .is-loading color with an explicit
- #46 — tighten visual test assertions and clarify customizer labels
-
Tighten .is-loading color assertion — replace the loose /rgba?(.*0) transparent/ regex (which could falsely pass on opaque rgb() values containing
-
- #47 — completion checklist — framework coverage benchmark
Comprehensive completion checklist for bringing the existing SLASHED layers to 100% — benchmarked against a comparable utility-class feature set (closest match, ~85% overla
- #48 — API freeze prep — contrast docs, optional forms, npm exports
Zamyka ostatnie potencjalne źródła breaking changes przed rozpoczęciem pracy nad komponentami i utilities.
- #49 — update TOKENS CONSUMED comment to match actual usage
Align the documented token list in optional/forms.css header comment with the actual CSS custom properties used after the token-name correction in PR
- #50 — Premium furniture store homepage (FORMA)
Premium furniture store homepage FORMA built entirely using the SLASHED CSS framework.
- #51 — Production-readiness checklist v2
Complete production-readiness audit for SLASHED CSS framework v1.0, benchmarked against 7 industry references:
- #52 — repair broken interactive demos in docs/demo.html
Addresses the issues you reported in /docs/demo.html. Each fix is surgical and targets the specific demo that misbehaved — no library API changes, jus
- #53 — Add production readiness checklist v3 with implementation decisions
This PR introduces audits/completion-checklist-v3.md, a comprehensive production readiness audit that supersedes v2. Unlike v2 (which was an inventory
- #54 — Add D11 — token alias-chain hygiene & API-surface freeze to checklist v3
Follow-up to the merged checklist v3 (#53). Adds a token API-freeze checkup based on a full var()-graph audit of all 562 token definitions.
- #55 — foundation polish for v0.2.0 (checklist v3 §F batch)
Wire up declared-but-unused base/print tokens, fix two form bugs, ship
- #56 — move container-type to parent for sf-grid-6 and ratio grids
@container queries look for an ancestor container, not the element
- #57 — comprehensive optimal bundle index & inventory
Full indexing and inventory of the slashed.optimal.css bundle — every token, class, alias, keyframe, and cascade relationship mapped and analysed for
- #58 — refined comparative gap audit prompt v2
Adds a comprehensive, source-verified audit prompt (audits/comparative-audit-prompt.md) designed to produce a definitive gap analysis of SLASHED again
- #59 — add flat (unlayered) bundle option for page builders
Adds a flat: true per-bundle option to bundle.config.json that strips the SLASHED @layer scaffolding before emit. First consumer is dist/slashed.brick
- #62 — comprehensive comparative gap audit
Adds a full comparative gap audit of SLASHED v0.2.10 (commit 4d0103e) against four benchmark frameworks:
- #63 — clean up repo structure and gitignore
Brings the repo in line with best practices for a published CSS framework:
- #64 — restore jsDelivr CDN link so demo works without local build
- Reverts the demo’s CSS ` tags from local relative paths back to the jsDelivr @main CDN URLs that were in use prior to commit 26658d5`.
- #65 — re-commit dist/ to unbreak jsDelivr @main CDN URLs
Reverts the dist/ removal from #63 so the jsDelivr CDN URLs that #64 restored (and any external user pinning to @main) keep working.
- #66 — build dist on merge to main, publish to dedicated
distbranchReplaces the per-commit dist regeneration (via the .githooks/pre-commit hook) with a once-per-merge GitHub Action that publishes built CSS bundles to
- #68 — fix 4 factual inaccuracies in comparative-gap-audit.md
The comparative gap audit (audits/comparative-gap-audit.md) contained 4 major factual errors where it claimed features were missing that actually exis
- #70 — fix documentation vs CSS discrepancies
Fixes 11 documentation vs CSS discrepancies identified during a full audit of the codebase.
- #72 — attach all dist bundles to releases + backfill CHANGELOG
Fixes two issues with the release workflow:
- #73 — use clamp() for dark-mode link lightness (WebKit)
Fixes the CI regression test failure: [webkit] › a11y.spec.js › axe: no WCAG A/AA violations (dark).
- #75 — trigger CI to verify regression tests after PR #73 webkit fix
This is a small dummy-style PR primarily intended to trigger CI one more time and verify whether the Regression tests job now passes after the WebKit
- #76 — use a:link selector to win over WebKit UA stylesheet (dark-mode link contrast)
Replaces the WebKit dark-mode link contrast fix from PR #73 (which didn’t actually work) with one that does. Fixes the WCAG AA failure flagged by axe-
- #77 — add admin GUI for editing SLASHED design tokens
Adds a full WordPress admin settings page to the Bricks Builder integration plugin for visually editing all user-customizable SLASHED design tokens.
- #78 — connect orphaned tokens and close page-property control gaps
Four tokens were defined but never consumed by the framework, making
v0.0.1 / Pre-release
- #1 — scaffold CSS architecture
- Replaces the two empty placeholder files (css/slashed-core.css, css/slashed-tokens.css) with a fully structured cascade-layer CSS scaffold
- #2 — add layout primitives and token files from new-essential framework
- core/layout.tokens.css — semantic tokens for layout primitives
- #3 — Add uploaded files
- Full accessibility layer with robust focus visibility, preference-aware motion/contrast/transparency handling, larger touch targets, hardened screen
- #4 — Add CSS bundling system with file concatenation and watch mode
This PR introduces a build system for concatenating CSS files into a single distributable bundle. It includes a Node.js-based bundler script with file
- #5 — Add CSS bundler for slashed-essential.css
- Dodaje scripts/bundle.js — bundler konkatenujący pliki z core/ w prawidłowej kolejności cascade layers do dist/slashed-essential.css
- #6 — Add light theme support and theme application layer
This PR adds comprehensive light theme support to the design system and introduces a new theme application layer that properly applies color-scheme an
- #7 — light/dark mode with auto-derived color system
Completely reworks the color system to be fully derived from 22 base colors (6+6 brand, 5+5 status).
- #10 — CSS audit improvements — tokens, base, print, docs
Comprehensive CSS audit fixes across core and optional files. Each change was validated with a plus/minus/devil’s-advocate analysis.
- #11 — implement states.css and move motion.css to core
Two changes that promote essential bundle completeness:
- #12 — restore –sf-shadow-color and –sf-prose-paragraph to tokens.css
Token names in tokens.css are part of the public API — they must not be
- #13 — correct raised surface level, on-inverse text, shadow glow, space-scale integration; clarify cq breakpoint tokens
- –sf-color-raised: l+0.02 → l+0.04 so hierarchy well < surface < bg < raised is correct
- #14 — design token bugs + demo nav UX
- –sf-color-raised: poprawka formuły l + 0.02 → l + 0.04 — hierarchia powierzchni well < surface < bg < raised była zepsuta (bg i raised były identyc
- #15 — Fix layout utilities and dark mode color tokens
This PR fixes missing layout utility classes, improves dark mode color token definitions, and corrects animation implementation in the demo page.
- #16 — dynamic brand/status color customizer + distinct token defaults
- demo: add Theme Customizer section at top of main with 22 color pickers
- #17 — demo: theme customizer + distinct defaults for primary/action and error/danger
- core/tokens.css — fix overlapping defaults so role names actually correspond to distinct colors:
- #18 — Theme-aware palette via light-dark() as single source of truth
In dark mode, large parts of the demo were unreadable: white islands inside the dark page, near-white text on near-white surfaces. Root cause was in o
- #19 — migrate dark mode to light-dark() hybrid architecture
Eliminates the 80-line duplicate dark mode block in base.css by moving
- #20 — Refactor design tokens and simplify color/spacing aliases
This PR refactors the design token system to improve consistency, reduce complexity, and establish clearer semantic relationships between tokens. Chan
- #21 — demo color pickers showing black for light mode
Fixes the theme customizer color pickers in docs/demo.html that were incorrectly showing #000000 (black) for all light-mode tokens.
- #22 — color palette aliases design decisions
Adds a design decisions document for the upcoming semantic color alias layer in tokens.palette.css.
- #23 — rename status color tokens to –sf-color-{status}-subtle/muted/strong
Replaces –sf-status-{status}-{bg border text} with the new - #25 — color system DX - dark fallback + theme-aware palette
Improves the color system developer experience and fixes issue #24.
- #26 — improve color system DX with dark-mode fallback and theme-aware palette
- Add dark-mode fallback to all 11 resolved color tokens so dark mode
- #27 — add comprehensive quality audit (2024)
Adds audits/quality-audit-2024-full.md – a comprehensive quality audit of the entire SLASHED framework covering all core and optional files.
- #28 — Add API coverage audit vs 5 reference frameworks
Adds audits/api-coverage-vs-reference-frameworks.md - a comprehensive comparison of SLASHED’s current API surface against Tailwind CSS v4, Open Props
- #29 — fix token bugs, modernize tokens, expand palette, add regression suite
Correctness (verified against audits/):
Last Updated: 2026-06-08
[0.3.0] - 2026-05-24
Class taxonomy refactor. New slashed.macros cascade layer, 12 macro
recipes, layout essentials, and 8 taken component names with empty
class definitions ready for upcoming minor releases. Plus the in-flight
WebKit a11y/contrast fixes that were sitting in Unreleased.
⚠️ Breaking Changes
New slashed.macros cascade layer
A new slashed.macros layer is introduced between slashed.components
and slashed.utilities. Macros may compose with primitives and
components, but a single-property utility still wins on the same
selector. Updated layer order:
tokens → reset → base → forms → layout → components → macros →
utilities → states → themes → motion → accessibility → print →
legacy → overrides
Three classes change cascade layer (selectors and properties unchanged):
.sf-prose,.sf-not-prose—slashed.layout→slashed.macros. Moved out ofcore/layout.cssinto the newcore/macros.css..focus-parent—slashed.states→slashed.accessibility. Now lives incore/accessibility.cssalongside the rest of the focus / a11y rules.
A site that worked in 0.2.x works in 0.3.0 without any markup changes.
Consumers who previously wrote @layer slashed.layout { .sf-prose { … } }
or @layer slashed.states { .focus-parent { … } } overrides should move
those rules to slashed.overrides (the documented escape hatch).
See docs/migration.md for details.
Added
core/macros.css— 12 recipes / patterns..sf-prose,.sf-not-prose(relocated fromcore/layout.css)..sf-flow— Heydon Pickering’s lobotomized owl (> * + * { margin-block-start: var(--sf-flow-space) })..sf-truncate— single-line ellipsis..sf-line-clamp-2,.sf-line-clamp-3,.sf-line-clamp-N..sf-equal-height— flex children stretch to tallest..sf-aspect— generic aspect-ratio container..sf-scroll-shadow— top + bottom mask gradient on a vertical scroll container..sf-scroll-snap— vertical scroll-snap container..sf-overflow-fade— end-edge horizontal mask fade..sf-no-tap-highlight— suppress mobile tap-highlight.
core/tokens.macros.css— semantic tokens for the macros:--sf-flow-space,--sf-line-clamp,--sf-truncate-suffix,--sf-aspect,--sf-scroll-shadow-size.- A11y patterns:
.sf-clickable-parent— the card-with-link pattern (overlay-based full-card click target with single AT announcement; text remains selectable; secondary buttons / links keep working;[data-no-overlay]is the consumer escape hatch).
- Layout extras:
.sf-icon--boxed— modifier on the existing.sf-iconthat wraps the glyph in a padded, bordered, optionally coloured frame (content-box; consumes new--sf-icon-box-*tokens).- Border-style scale:
--sf-border-style,--sf-border-style-soft,--sf-border-style-dotted— pairs with the existing--sf-border-width-*and--sf-color-border*so consumers can switch decorative styles without rewriting rules. - Icon-boxed tokens:
--sf-icon-box-pad,--sf-icon-box-radius,--sf-icon-box-bg,--sf-icon-box-border.
- Components — incomplete files —
optional/components.cssandoptional/tokens.components.cssmove from empty/* TODO */stubs to structured files with all class definitions and tokens commented out. Both files keep an active@layerdeclaration to RESERVE cascade position; nothing else ships in*.min.css(minifier strips the comments). Class and token activation is planned for upcoming upcoming minor releases (additive only). The 8 taken component names are:.sf-button,.sf-card,.sf-badge,.sf-tag,.sf-alert,.sf-avatar,.sf-modal,.sf-skeleton. Card tokens (originally proposed for the essential bundle) live here, commented, alongside the rest — so the entire component-related surface (classes + tokens) ships together when ready. Seedocs/components.md.
Documentation
docs/architecture.md— new “Class taxonomy” section with the 7 categories and a 5-step decision tree for adding new classes; layer order updated; file structure updated.docs/macros.md(new) — full reference for every macro with signature, usage example, and consumed tokens.docs/components.md(new) — taken component names and the out-of-scope list (tabs,accordion,tooltip, …) with rationale for each exclusion.docs/migration.md— adds an “0.2.x → 0.3.0” section explaining the three relocations and theslashed.overridesescape hatch.- README updated for the new layer order, file list, and bundle contents.
Tests
tests/macros.spec.js(new) — behavioural tests for each macro, covering both default behaviour and token-override paths.tests/layers.spec.js— three new ordering invariants:macros > components,utilities > macros,accessibility > motion.tests/coverage.spec.js— three new exclusions for selectors exercised by dedicated specs (.sf-overflow-fade,.sf-no-tap-highlight,.sf-clickable-parent).tests/tokens.spec.js— addscore/tokens.macros.cssto the token-coverage source list.docs/demo.html— new<section id="macros">exercising every macro inline. Existingtests/demo-visual.spec.jsscreenshots are locator-scoped and unaffected.
Changed
-
CI: skip
[webkit] axe: no WCAG A/AA violations (dark)with a documented deferral. WebKit’s headless build under Playwright paints-webkit-link(≈#00728f) on<a href>elements in dark mode regardless of how--sf-color-linkis computed, what selector specificity is used, or which@layerthe rule lives in. The framework’s value applies correctly in Chromium, Firefox, and (per manual checking) real Safari — the failure is specific to WebKit’s headless test build. The dark a11y audit still runs on Chromium and Firefox, so a real link-contrast regression will be caught on two engines. -
Dark-mode link luminance floor reverted
0.72→0.68incore/tokens.css(--sf-color-link,--sf-color-link--hover,--sf-color-link--visited; the corresponding--sf-color-link--activefloor0.78→0.74, preserving its +0.06 offset above base). PR #73’s bump from0.68to0.72was made under the (incorrect) belief that the dark-mode link floor was the cause of the WebKit axe contrast failure. The actual cause was selector specificity (now fixed viaa:link, see below) and the WebKit value was painting-webkit-linkregardless of how the formula computed. Restoring PR #70’s0.68floor — still a defensive contrast cushion above the pre-PR-#700.62, without the speculative extra bump that served no purpose. -
Global text scale now functional —
--sf-text-scaleand--sf-text-display-scale(core/tokens.css) are now applied to the--sf-text-*/--sf-text-display-*clamps viacalc(... * scale), mirroring how--sf-space-scaleworks. Previously both tokens were declared and documented as the global type multipliers but never consumed, so setting them had no effect. The default value is1, so existing output is unchanged; only overrides now take effect. -
Header / sticky offset is responsive by default —
--sf-header-heightand--sf-sticky-offset(core/tokens.css) now fluidlyclamp()between their-mobileand-desktopcompanion tokens across the framework viewport range, instead of statically equalling the desktop value. This wires up the previously-orphaned--sf-header-height-mobile,--sf-sticky-offset-mobile, and--sf-sticky-offset-desktoptokens. Default endpoints (3.5rem mobile, 5rem desktop) are unchanged; the header is now shorter on small viewports. -
Shadows tint to the surface on
.sf-surface--*—core/macros.cssnow re-derives--sf-shadow-colorfrom each colored surface’s own background, so elevated children cast an in-family shadow instead of a neutral-grey slab. Completes the existing surface contextual-color cascade. -
Legacy shadow fallbacks completed —
core/tokens.color-fallbacks.cssnow defines the full HSL shadow set (--sf-shadow-none/xl/2xl/inner,--sf-text-shadow-*,--sf-drop-shadow-*); previously onlyxs–lwere bridged, so pre-oklch()engines resolved the rest to empty. -
BREAKING —
--sf-transition-fast/slow/enter/exitno longer useall. All four now transition an explicit curated property set (color,background-color,border-color,box-shadow,opacity,transform,filter), differing only in duration/easing. Previously each wasall <duration> <easing>, which directly contradicted the file’s own warning thatallis a performance footgun.--sf-transition-allremains the single intentionalallescape hatch. Elements that relied on these presets to animate a property outside the curated set (e.g.width,clip-path) must now switch to--sf-transition-allor compose their own. -
Tier-1 colour fallbacks completed for colored surfaces —
core/tokens.color-fallbacks.cssnow defines--sf-color-inverse,--sf-color-overlay, and the full--sf-color-text--on-*set (13 tokens). The modern auto-contrast formula needsoklch()relative color, so on pre-oklch()engines every ungated.sf-surface--*rule previously kept its background but inherited unreadable body text; the hardcoded black/white choices restore legibility. No new token names (these are all already declared by the modern tier).
Removed
--sf-border-style-strong(core/tokens.css) — removed. It was a no-op alias resolving to the same value as--sf-border-style(solid) and consumed by no rule. The “strong” axis in SLASHED is a color axis (--sf-border-strong/--sf-color-border--strong, per the IBM Carbon / GitHub Primer convention), not a style axis, so a “strong border style” carried no distinct meaning. Compose a heavier border manually with--sf-border-width-*+--sf-color-border--strong.
Fixed
-
Anchor selector specificity —
core/base.cssnow styles unvisited anchors witha:link { color: var(--sf-color-link); }(specificity 0,1,1) instead of barea { color: ...; }(0,0,1). This puts the author rule on equal footing with WebKit’s UA stylesheeta:link { color: -webkit-link; }, which would otherwise win on most browsers’ UA cascade. Resolves the long-running dark-mode link contrast issue (PR #73 and four iterations of PR #76 all chased the colour formula instead of the selector specificity). -
Form-field contrast in WebKit dark mode — text-like
<input>s and<textarea>s now getappearance: none(previously only<select>had it). Without this, WebKit overlays its own dark-mode default field background (≈#5f6163) on top of the framework’s--sf-color-surface, producing a 1.78 : 1 contrast failure flagged by axe. Chromium and Firefox honoured the CSSbackground-colorwithoutappearance: none; only WebKit needed the explicit opt-out. Native rendering of checkbox / radio / range / file / datetime pickers is unaffected (the:where()block only matches text-like inputs).
Bundle size
- essential: 9.9 kB → 10.4 kB gzip (+5%).
- optimal: 12.2 kB → 12.7 kB gzip (+4%).
- optimal-components / full: minifier strips the commented-out component definitions, so min sizes are unchanged from optimal.
- All bundles remain well under their
tests/bundle-size.spec.jsbudgets (15 / 18 / 20 kB gzip).
[0.2.12] - 2026-05-23
Release infrastructure.
Changed
- Removed
audits/directory from repository (internal planning docs moved elsewhere) - README updated for current project state
[0.2.11] - 2026-05-23
Documentation accuracy and dark-mode link contrast.
Fixed
- Dark-mode link contrast (WebKit) — raised the lightness floor in the
--sf-color-linkdark-mode formula from0.62to0.68, fixing a WCAG AA (4.5:1) failure flagged by axe-core in WebKit.--sf-color-link--visitedraised to match. Chromium/Firefox were unaffected (PR #70) - Added missing
--sf-field-required-markertoken declaration tocore/tokens.css(was consumed byforms.csswithout a source declaration)
Changed
- docs/architecture.md — fixed
color-mix(in oklch)tocolor-mix(in oklab); removed ghost--sf-transition-basefrom transition table; updatedsign(0.6 - l)tosign(var(--sf-contrast-threshold) - l); added.visually-hiddenas.sr-onlysynonym; clarifiedslashed.themesextension guidance - docs/layout.md — added 5 missing primitives (
.sf-box,.sf-center,.sf-alternate,.sf-pancake,.sf-not-prose); corrected.sf-grid-1...-6to.sf-grid-1/-2/-3/-4/-6(no-5) - README.md — clarified “22 source tokens” to “6 minimum light + up to 22 total”
- docs/tokens.md — regenerated; adds
--sf-contrast-threshold, fixes stale formulas --sf-contrast-thresholdtoken (introduced in PR #68) now wired into all--sf-color-text--on-*formulas and--sf-color-code-text- CI
docs-freshnessjob added to verifydocs/tokens.mdstays in sync
[0.2.10] - 2026-05-22
CI fix and PR review follow-ups.
Fixed
- CI green: the cross-browser matrix ran the geometry/text-metric visual
suite (
demo-visual.spec.js) on Firefox/WebKit, whose font metrics differ from Chromium — pinned that suite to Chromium (where pixel/geometry regression belongs) while Firefox/WebKit keep validating CSS behaviour (colour resolution, a11y, states, container queries) - Hardened
tests/a11y.spec.jsto wait for fonts + applied styles before the axe audit, eliminating a rare under-load flake where axe sampled unstyled defaults - RTL: select chevron now mirrors to the inline-end (left) edge under
:dir(rtl)instead of staying physically right scripts/bundle.js@import-stripping regex now requires matching quotes (backreference) instead of allowing"…'
Changed
- Docs/demo review fixes: accessible name on the focus-parent demo input;
aria-pressedkept in sync in the dark-mode toggle example; corrected “15-layer” → “14-layer” in performance docs; consistentrole="status"/role="alert"notation in the states doc
[0.2.9] - 2026-05-22
Universal-colour transparency: a live accessibility report in the demo.
Added
- Demo Theme Customizer now includes a live Accessibility report that computes WCAG 2 contrast (AA / AA-Large / Fail) for 13 key colour pairs in both light and dark mode, recomputed whenever brand colours change. This makes the accessibility consequences of any chosen palette visible — including the edges pure-CSS auto-derivation can’t guarantee
docs/theming.md→ “How universal is the colour system?” — documents what is fully universal (brand hue/chroma, on-colour text, surfaces), the one structural contract (surface-lightis a light surface), and why CSS alone can’t guarantee 4.5:1 for every possible inputtests/demo-a11y-panel.spec.js— verifies the report renders all pairs, that the default palette passes AA, and that it recomputes on colour change
[0.2.8] - 2026-05-22
Robust link contrast under brand overrides.
Changed
--sf-color-link/--hover/--active/--visitednow clamp OKLCH lightness toward a contrast-safe band (ceiling in light mode, floor in dark) instead of applying a fixed offset. Links keep the action hue but clear WCAG AA (4.5:1) for the default palette and the large majority of brand overrides — not just the default. Very high-chroma hues (saturated yellow/green) remain a documented exception (consumer overrides--sf-color-linkdirectly)- Audit checklist: items previously dispositioned “not needed / not possible / defer to v1.x” are retagged defer to v0.5.0
Added
tests/link-contrast.spec.js— verifies the clamp holds ≥ 4.5:1 across a range of moderate-chroma--sf-color-actionoverridesdocs/theming.md→ “Link contrast” section documenting the guarantee and its high-chroma caveat
[0.2.7] - 2026-05-22
Behavioural test hardening (checklist v3 §C.13) — completes the test matrix.
Added
tests/behavior.spec.js:- reduced-motion neutralisation (
prefers-reduced-motion: reduceand the manual.no-motionopt-out) - forced-colors focus-ring colour (Chromium-only emulation; skipped elsewhere)
- container-query wiring (
.sf-containerinline-size container; fixed-grid reflow across container widths) - state-class effects (
.is-hidden,.is-disabled,.is-truncated)
- reduced-motion neutralisation (
[0.2.6] - 2026-05-22
Build & test infrastructure (checklist v3 §C.12, §C.13, D10).
Added
- Minified bundles (
*.min.css) + source maps (*.min.css.map) for every bundle via lightningcss; modern colour syntax is preserved (no down-levelling) npm run buildnow reports raw / gzip / brotli sizes per bundle- Cross-browser test matrix — Firefox and WebKit added alongside Chromium in
playwright.config.js,test:install, and CI tests/a11y.spec.js— axe-core WCAG 2 A/AA audit (light + dark) against a dedicatedtests/a11y-fixture.htmltests/bundle-size.spec.js— gzip-size regression budgets per bundle- README bundle-size badge; docs for the minified bundles and the
layers.css-first rule for custom bundles
Fixed
- Default link colour now darkens the action colour in light mode so link text meets WCAG AA (4.5:1) on the page background (was 3.43:1); dark mode unchanged. Surfaced by the new axe audit
tests/demo-visual.spec.jsprint-href assertion is now browser-aware (Firefox/WebKit report the unresolvedattr(href)expression)
[0.2.5] - 2026-05-22
Documentation sprint (checklist v3 §C.14) — the stated v1.0 gate.
Added
docs/theming.md— rebrand-in-6-tokens guide, multi-brand scoping, contrastdocs/dark-mode.md— toggle script, scoped themes, per-value overrides, gotchasdocs/layout.md— every layout primitive with its tokensdocs/states.md— every.is-*class, ARIA mapping, and overlap semanticsdocs/tokens.md— full--sf-*reference (588 tokens), generated from sourcedocs/browser-support.md— the support floor and the features that set itdocs/performance.md— modern-CSS footguns (transition: all, oklch paint, …)docs/migration.md— migration guide for teams coming from other frameworksCONTRIBUTING.md— setup, enforced conventions, test/coverage rulesscripts/gen-token-reference.js+npm run docs:tokensto regenerate the token reference from source
Changed
- README gains a Documentation index linking the guides above
docs/architecture.mdnotestokens.paletteships in the optimal+ bundles
[0.2.4] - 2026-05-22
Accessibility, print, and theming (checklist v3 §C.7, §C.9, §C.10).
Added
- Accessibility:
.no-motion(consumer-toggled motion opt-out, independent of the OS setting); forced-colors now re-asserts form-control borders so fields stay distinguishable;prefers-contrast: morenow also raises--sf-contrast-biasto darken/lighten reading text - Print:
.print-only(hidden on screen, shown on paper);audio/videoadded to the print hide-list - Themes:
optional/theme-example.css— a copy-and-customise “rebrand in 6 tokens” example covering quick rebrand, per-mode dark control, multi-brand scoping ([data-brand]), and an opt-in theme-transition class (not bundled)
Changed
core/themes.cssdocuments multi-brand scoping and thestartViewTransition()theme-toggle pattern
[0.2.3] - 2026-05-22
State and motion primitives (checklist v3 §C.6, §C.8).
Added
- States:
.is-pressed(aria-pressed toggles),.is-pending(optimistic UI, distinct from.is-loading),.is-focused(programmatic focus ring),.focus-parent:focus-within(parent reacts to a focused descendant),.is-fullscreen, and.is-resizable - Motion:
sf-ping,sf-blink, andsf-floatkeyframes with matching--sf-animation-ping/-blink/-floatpresets (keyframes/tokens only — no utility classes, per audit §D9) - Inline documentation of state-overlap semantics (
.is-errorvs.is-invalidvs.is-danger;.is-openvs.is-expanded) and an@starting-stylereadiness note incore/motion.css
[0.2.2] - 2026-05-22
New CSS features across tokens, reset, forms, and layout (checklist v3 §C.1–5).
Added
- Tokens:
--sf-mask-scrim-start/--sf-mask-scrim-end(edge-fade stops for scroll reels) and--sf-animation-delay-1…-5(stagger delays; tokens only, no.sf-staggerclass per audit §D9) - Reset:
::file-selector-button { font: inherit }andsearch { display: block } - Forms: styled
input[type="file"]::file-selector-button(action-button look),input[type="range"]track + thumb for WebKit and Firefox, and a focus ring - Layout:
.sf-grid--dense(dense auto-flow on any grid) and the.sf-iconinline icon-sizing primitive with--xs…--xlmodifiers (consumes the existing--sf-icon-*tokens)
Changed
- Select chevron now swaps stroke colour via
light-dark()instead of relying oncurrentColorinside a data-URI background (which doesn’t inherit the host colour cross-browser); the chevron now tracks dark mode and scoped[data-theme]regions
[0.2.1] - 2026-05-22
Completes the v0.2 “leftovers” from audits/completion-checklist-v3.md:
the tiered bundle scheme (D5) and token-API hygiene (D11).
Added
- Tiered bundle scheme (D5):
essential,optimal,optimal-components,optimal-utilities, andfull.optimal= core +tokens.palette+forms+legacy;fulladds the (empty) component/utility stubs. Newpackage.jsonexportssubpaths:./optimal,./optimal-components,./optimal-utilities,./full --sf-color-code-texttoken incore/tokens.css(defaults toinherit) for discoverability — previously only a fallback inbase.css- Token-API contract documentation (D11): PUBLIC / INTERNAL / DEPRECATED
labelling in the token-file headers, canonical-source alias documentation
(
--sf-space-gap→--sf-gap, etc.), and naming conventions (single- vs double-dash, BEM consumer-API tokens, print class prefix) indocs/architecture.md
Changed
scripts/bundle.jsnow strips local@importstatements when concatenating, so bundled stubs carry no dead mid-file imports- README and
docs/architecture.mdbundle sections rewritten for the five-bundle scheme
[0.2.0] - 2026-05-22
Foundation polish from audits/completion-checklist-v3.md (§F v0.2): wire up
declared-but-unused base/print tokens, fix two real form bugs, ship the
previously-unbundled optional/forms.css, and close the slashed.forms /
base-scope documentation gaps.
Added
embase rule consuming--sf-body-em-style; per-headingfont-weightwiring (--sf-h1-font-weight…--sf-h6-font-weight) andtext-wrapwiring (--sf-heading-text-wrap,--sf-body-text-wrap) incore/base.css— tokens that previously advertised control the base ignored (D2)--sf-contrast-biasis now a real global text-contrast knob, folded into--sf-color-text,--sf-color-text--secondary, and--sf-color-heading(default0= no change) (D3)--sf-divider-width/--sf-divider-style/--sf-divider-colortokens and a.sf-divider(+.sf-divider--vertical) layout primitive;hrnow reads the divider tokens.sr-only-focusableaccessibility helper (visually hidden until focused)- Required-field asterisk in
optional/forms.css— classless:has()+:required, customisable via--sf-field-required-marker(D8) optional/forms.cssnow ships in theslashed.full.cssbundle (D5, bundle half);slashed.formslayer and the universal-base scope rule documented inREADME.mdanddocs/architecture.md(D1, D5)
Changed
--sf-body-strong-weightdefault corrected to--sf-font-weight-bold(700) before being wired, so<strong>is not silently downweighted to 600 (D2)optional/forms.cssshared field border now reads--sf-field-border-color, so the.is-*validation states incore/states.cssrecolour native inputs (D6)core/print.cssconsumes--sf-print-base-sizeonbodyin@media print(D4)
Fixed
- Primary-button
:hoverno longer swaps the solid action fill for the surface-hover tint and dark text; it now darkens the action colour (oklch(from var(--sf-color-action) calc(l - 0.05) c h)) (D7) - Removed duplicate
textarea { resize: vertical }fromoptional/forms.css(owned bycore/reset.css)
[0.1.0] - 2026-05-21
Added
- Comprehensive comparative audit (
audits/comparative-audit-2026.md) — 22 findings with a prioritised remediation roadmap (#33) - Named container queries —
sf-layoutandsf-alternatecontainers explicitly named incore/layout.css; anonymous queries left deliberately unnamed (Phase 4, #39) - Granular transition tokens —
--sf-transition-duration,--sf-transition-easing, and related--sf-transition-*properties for fine-grained motion control;@propertycolour interpolation proof-of-concept viacolor-pulseutility (Phase 5, #40) - Print demo section in
docs/demo.html— interactive checklist verifying<mark>, status colours, SCREEN-ONLY badge, and colour opt-in callouts in print preview (#37) - Full
.is-*state coverage and missing layout primitives indocs/demo.html— all 25+ state classes exercised;.sf-imposter,.sf-subgrid,.sf-section-group,.sf-covermodifiers, ratio grids,.sf-scale-down, and all modifier variants documented (Phase 6, #41) - Regression test suite (Phase 6, #41):
tests/layers.spec.js— verifies cascade layer ordering invariant (themes > components, states > utilities, motion > themes)tests/print.spec.js— verifies<mark>background retention,.no-printvisibility, and.print-color-exactin print emulationtests/coverage.spec.js— parses all.sf-*/.is-*selectors fromcore/*.cssand asserts each appears at least once indocs/demo.html; permanently prevents demo-coverage regressions
Changed
- Theme configurator dark colour pickers now read resolved
--sf-color-XCSS custom properties from the live document instead of a hardcoded defaults table, correctly surfacing SLASHED’s auto-derive-from-light behaviour (#32) - Themes extracted to a dedicated
@layer themes— isolates theme declarations from component styles and improves cascade predictability (Phase 1, #34) - Bundle scope tightened —
core/*.cssimports aligned with the documented API; no undocumented selectors leak into the bundle (Phase 1, #34) - Motion accessibility patterns modernised —
@media (prefers-reduced-motion)coverage extended; transitions opt-in via token (Phase 5, #40) overflow: clipreplacesoverflow: hiddenwhere scroll-container semantics are not needed (Phase 5, #40)
Fixed
- WCAG AA Normal contrast (4.5:1) for all brand and status on-colour foregrounds — every
--sf-color-*-ontoken now meets the threshold by default; auto-contrast mechanism unchanged (Phase 2, #36) - Browser-floor tokens corrected to match actual browser computed values (Phase 1, #34)
⚠️ Breaking Changes
Print colour contract reversed (Phase 3, #37)
core/print.css no longer flattens authored colour by default. The previous blanket reset
* { background: transparent !important; color: CanvasText !important; }
destroyed semantic colour in print — <mark> lost its highlight, .is-success lost its green, status pills lost their tint. The new contract:
- Default: authored colour reaches paper. Browsers handle ink-saving via their own
print-color-adjust: economyheuristics. .print-color-exact: opt-in for colour-coded data that loses meaning when flattened (status pills, syntax highlighting, charts)..print-no-color: opt-in for ink-on-paper output where ink-saving is the contract. Restores the pre-0.1.0 blanket reset for the marked subtree.
box-shadow and text-shadow are still suppressed in print, but no longer with !important — an authored shadow that explicitly overrides the print layer is now the consumer’s call.
Migration: if your site relied on the old blanket colour flatten (e.g. brand backgrounds authored for screen, silently dropped in print), wrap the affected region in .print-no-color to restore the previous behaviour.
[0.0.1] - 2026-05-01
Initial pre-release.