All notable changes to @neuravision/construct will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Datum grammar — the signature, now spoken by components. The orange "datum"
(Construct's reference line for focus / active / current state) was promoted from focus
rings and bespoke docs CSS into reusable, opt-in component vocabulary in a new
components/datum.css:.ct-eyebrow— a mono kicker with a leading datum tick, for labelling sections..ct-datum-scale— a measured reference line (a ruler with minor/major ticks and an orange "origin" segment) for section headers..ct-specs/.ct-spec(+.ct-spec--origin) — an engineering datasheet for key figures.- Card modifiers in
card.css:.ct-card--datum(a corner registration mark) and an active state (.ct-card--active/[data-state="active"]) that carries the same orange leading edge as.ct-list__itemand.ct-sidebar, so every active surface reads as one system.
- Eyebrow and spec labels use
--color-text-secondary(≥7:1 on every surface across light, dark and high-contrast); orange is reserved for non-text edges/ticks (--color-brand-accent, ≥3:1 as a graphic object). Default cards and existingaria-selectedcard behaviour are unchanged.
- Lato typeface was declared but never loaded. The 2.0.2 switch updated the font-family
tokens to Lato but left the Google Fonts
@importinfoundations.csspointing at Manrope, so consumers loaded Manrope (unused) while Lato fell back to a system sans-serif. The@importnow loadsLato:wght@400;700;900(JetBrains Mono unchanged). Documentation (DesignTokens,Accessibility,Introduction) updated from Manrope to Lato.
- Lato ships only in 400/700/900 — it has no 500/600/800. The
medium(500) andsemibold(600) weight tokens therefore resolve to the nearest available face (400 and 700), andextrabold(800) to 900. This is inherent to Lato;font-synthesis: nonekeeps these as real faces (no faux weights).
2.0.2 - 2026-06-28
- Switch primary typeface from Manrope to Lato (400/700/900)
2.0.1 - 2026-06-27
- Navbar height token. The navbar referenced a non-existent
--control-height-xlprimitive (the control-height scale ends atlg), so the navbar fell back to an undefined height. Introduced a dedicatedlayout.navbar.heightprimitive (--navbar-height, 56px) and pointed.ct-navbarat it. The control-height scale stays reserved for form controls.
2.0.0 - 2026-06-27
A new visual identity — "engineered for everyone." Construct moves from a generic tech-blue/slate look to a distinctive system: warm concrete neutrals, an ink-steel primary, and a safety-orange accent that acts as a single recurring "datum" marking what is focused / active / selected / current. Verified WCAG AA across light, dark, and high-contrast themes.
BREAKING CHANGES:
- Neutral primitive ramp renamed
slate→stone. Consumers referencingcolor.slate.*or--color-slate-*must migrate tostone.*. The neutral palette is now warm concrete/graphite instead of cool blue-grey. - Default typefaces changed from Sora + Source Sans 3 to Manrope (display + body). The Google Fonts import in
foundations.csswas updated accordingly; self-hosting consumers must update their font files.
- The "datum" signature — the orange accent now marks focus rings, active tab underlines, checked selection controls, slider fills, selected chips, the current pagination page, and active navigation (leading edge) across all components.
- New semantic tokens:
color.brand.onAccent,color.text.onPrimary,color.state.onSolid(theme-aware foregrounds for solid fills), and thefont.weight.extrabold(800) display weight. - New
orangeprimitive ramp (structural safety orange).
- State ramps retuned to widen hue separation from the brand orange:
ocean→ blueprint blue (info),amber→ gold (warning),red→ crimson (danger). - Shadows warmed (warm-ink instead of cool blue); display headings now use weight 800.
- Solid chips and solid banners now use a theme-aware foreground (
state.onSolid) so their labels meet AA contrast in dark and high-contrast themes.
1.4.0 - 2026-06-27
- Tooling — design-sync for claude.ai/design: Construct can now be synced to a Claude Design project so Claude's design agent builds with the real Construct components. Because Construct is a pure CSS/token system, an off-script generator (
.design-sync/build.mjs) flattens the authored CSS into one bundle and builds one preview card per component from the true Storybook-rendered HTML, plus per-component usage docs and a class-vocabulary README header. Sync state lives under.design-sync/; no change to the published package surface.
1.3.1 - 2026-06-17
- a11y / focus: Raised the
--color-focus-ringcontrast so the focus indicator meets the WCAG 2.2 ≥ 3:1 non-text-contrast minimum against the canvas and surface backgrounds. Thelightring (teal.400, 2.59:1 on canvas) →teal.600(5.09:1) and thehigh-contrastring (amber.400, 2.07:1) →amber.700(6.68:1); thedarkring already passed and is unchanged. Affects every component that uses the shared focus token (24 files).
1.3.0 - 2026-06-17
- Chart styling skin (
ct-chart) — a framework-agnostic theme layer for SVG data-visualisation primitives (line/area, bar, donut, sparkline, gauge). Provides series colour mapping (.ct-chart__series--{1..8}viacurrentColor), grid/axis, legend, donut/gauge text, and a visually-hidden accessible data-table fallback (.ct-chart__table, revealed with.ct-chart--show-table). Geometry is supplied by the consuming layer; this file only themes the result.prefers-reduced-motionandforced-colorssupported. - New categorical chart palette tokens
--color-chart-series-{1..8}, defined forlight,dark, andhigh-contrastthemes. Every series colour meets the WCAG 1.4.11 non-text contrast minimum (≥ 3:1) against both the canvas and surface backgrounds. - Storybook coverage for
ct-chart(Chart.stories.js): line/area, bar, donut, gauge, sparkline, empty state, the interactive data-table toggle (documenting thearia-expanded/aria-controlscontract), and an optional keyboard-focusable-marks example. All stories pass the a11y addon inerrormode.
ct-chart: interactive marks (.ct-chart__bar,.ct-chart__slice,.ct-chart__dot) now have:focus-visibleparity with their:hoveraffordance, so consumer-focusable data points show a visible focus ring.ct-chart: hoisted--ct-chart-gauge-widthinto the.ct-chartconfig block (was an inlinevar()fallback duplicated across two rules), making it discoverable and overridable like the other--ct-chart-*properties.ct-chart: consistentforced-colorsbehaviour — data marks (line, area, dots, bars, slices, legend marker, gauge) now uniformly preserve their series/state colour viaforced-color-adjust: none, so a coloured legend no longer describes monochrome lines in Windows High Contrast. Grid and axes still follow the user's forced palette, and the data-table fallback remains the fully compliant path.
1.2.0 - 2026-05-07
- Tree component (
ct-tree) implementing the WAI-ARIA Tree View pattern: n-level nesting, roving tabindex, full keyboard navigation (↑/↓/→/←/Home/End/*/type-ahead), single & multi selection, async loading state (aria-busy), and an orphan-node modifier (.ct-tree__node--orphan) for hierarchies with missing parents. Modifiers:--guides,--dense,--bordered. Forced-colors andprefers-reduced-motionsupported. (#86)
1.1.6 - 2026-04-09
- Avatar seeded color palette:
.ct-avatar[data-seed-color="N"](N = 1–8) selects a deterministic background/foreground pair from the palette, letting consumers give each user a stable color. Avatars without the attribute keep the existing default — fully backwards compatible. (#85) - New semantic tokens
--color-avatar-seed-{1..8}-{bg,fg}and component-level--ct-avatar-seed-{1..8}-{bg,fg}aliases, defined forlight,dark, andhigh-contrastthemes. Every pair meets WCAG AA (≥ 4.5:1, lowest measured 6.48:1). - New color primitives
purpleandpink(50–900 scales) feeding the seed palette. - Storybook story
Data Display/Avatar/Seeded Colorsshowcasing the palette and confirming the unseeded fallback.
1.1.5 - 2026-04-03
1.1.4 - 2026-03-27
1.1.3 - 2026-03-27
1.1.2 - 2026-03-21
1.1.1 - 2026-03-21
1.1.0 - 2026-03-21
0.2.0 - 2026-03-12
- Toolbar component (
ct-toolbar) with brand, navigation, and action slots - Sidebar component (
ct-sidebar) with side, over, and push modes - Progress bar component (
ct-progress-bar) with determinate, indeterminate, and size/variant modifiers - Toggle group component (
ct-toggle-group) with single/multiple selection and size variants - Nav list component (
ct-nav-list,ct-nav-item) for sidebar navigation - Icon component (
ct-icon) with sm, md, lg, xl sizes prefers-reduced-motionsupport in components layer for self-contained usage- Explicit
:focus-visiblestyles for all interactive components (button, form controls, checkbox, radio, switch, tabs, dropdown items, pagination, datepicker, table sort, nav items, toolbar links)
- Inconsistent focus indicators across components (standardized to
outline: 2px solidwith appropriate offsets) - Missing focus styles on
.ct-button,.ct-check__input,.ct-radio__input,.ct-switch__input,.ct-tabs__trigger - Form controls now show both border-color change and outline ring on focus for WCAG 2.1 AA compliance
0.1.1 - 2026-03-12
- Updated
.gitignoreto exclude internal documentation and mock data - Project configuration and metadata cleanup
0.1.0 - 2026-01-31
- Initial release of the Construct Design System
- Two-tier token pipeline (primitives + semantic) with CSS, JSON, and TypeScript outputs
- Three theme modes: light (default), dark, high-contrast
- System preference fallback via
prefers-color-schemeandprefers-contrast - Foundation styles: CSS reset, typography scale, layout utilities
- Component library with
ct-prefix and BEM naming:- Button (primary, secondary, outline, ghost, accent, danger, link variants; sm/md/lg sizes)
- Form controls: input, select, textarea with field wrapper, hints, and error states
- Selection controls: checkbox, radio, switch
- Card with header, body, footer, and interactive variant
- Table with striped, compact, sortable, and numeric cell variants
- Data table with header, toolbar, filters, search, pagination, and footer
- Modal and confirmation dialog
- Toast notifications with info, success, warning, danger variants
- Tooltip with top, bottom, left, right positioning
- Tabs with trigger and panel
- Dropdown menu with items, labels, separators
- Pagination with navigation links
- Breadcrumbs
- Datepicker with calendar grid
- Badge and chip with variant and interactive modifiers
- File upload with drag-and-drop dropzone and file list
- Spinner, skeleton loader, and loading overlay
- Accessibility: ARIA attribute-driven states, semantic HTML patterns
- Storybook with HTML Vite, a11y addon (error-level), theme switching, autodocs
- Story-driven testing via Vitest + Playwright
- GitHub Actions workflow for Storybook deployment to GitHub Pages
- Token build script with
--checkmode for CI validation