Get started

Release · July 1, 2026 · v0.6.55

What's new

Jul 1 (0.6.55) hardens agent discipline when screenshots are attached: exxat-image-ia-gate records the upload on submit; exxat-brief-gate escalates with IA-only + brief-first messaging on the next design-critical write. Onboarding step 1 hides sidebar and site header; step 2+ shows a live preview. Typography fixes darken --muted-foreground, keep helpers at text-sm, and drop muted opacity hacks on nav and breadcrumbs. Jun 30 (0.6.53) shipped the 978/978 axe gate, ScrollRegion primitives, and Google Antigravity .agents/ mirror — still the accessibility floor on every upgrade.

978
Axe ship scans pass
227
Design tokens
109
Package components
29
AI skills shipped
55
Binding Cursor rules

0 · Agent context + onboarding · 0.6.55

Screenshots are IA — not pixels.

Uploaded mockups inform information architecture only. The new beforeSubmitPrompt hook writes a short-lived flag when a turn includes an image; the brief-gate then appends an IA-only escalation on the next design-critical write — so agents cannot silently pixel-copy chrome. Constitution + ux-discovery rules carry the same mandate; exxat-ui doctor smoke-tests the pipeline end-to-end.

exxat-image-ia-gate.mjs beforeSubmitPrompt brief-gate escalation agent:context:validate Restart Cursor after upgrade
Design OS onboarding step 1 — product picker, no sidebar (light mode) Design OS onboarding step 1 — product picker, no sidebar (dark mode)
Design OS onboarding step 2 — live sidebar preview (light mode) Design OS onboarding step 2 — live sidebar preview (dark mode)

Step 1 is focus mode

Sidebar and site header hidden on the welcome step; breadcrumb chrome returns from step 2 with a live nav preview.

Welcome to Design OS

Onboarding title reads as Design OS — not a generic product welcome. Ivy wordmark on the sidebar B2 lockup uses font-heading.

Readable meta copy

--muted-foreground darkened; helper/description text stays text-sm; nav and breadcrumb opacity hacks removed.

Release gates enforce parity

pnpm release:gates runs agent:context:validate — hooks, rules, and Claude mirrors must match before publish.

0a · Accessibility ship · 0.6.53

978 scans. Zero violations.

The ship matrix runs 163 routes × six variants (desktop light/dark, Windows high contrast, reflow-320) with axe-core + Playwright. Pass means zero WCAG 2.x AA violations — not a Lighthouse spot-check on one page. Fixes belong in packages/ui primitives so every consumer inherits them on upgrade.

pnpm a11y:axe:all --variants ship pnpm a11y:axe:report ScrollRegion HorizontalScrollViewport BadgeAi · Badge prompt .agents/ Antigravity mirror

Component-level fixes

scrollable-region-focusable and color-contrast failures resolved in shared scroll + badge chrome — not per-route doc previews.

Markdown receipts

Every gate run writes axe-a11y-summary.json + axe-a11y-report.md under .axe-reports/.

Inline agent workflow

Accessibility skills run axe + read the report in the main agent — no sub-agent dispatch.

Antigravity parity

pnpm sync-antigravity mirrors Cursor rules/skills to .agents/ with slash-command workflows.

I · Hub table filters

Every column can filter.

Before 0.6.50, only columns with an explicit filter: block appeared in Add filter. Now cellKind on each column definition drives the filter type — person, status, rating, progress, currency, numeric range, date range, or text — and the toolbar chips use the same runtime as Table properties.

filterableColumns() resolveColumnFilter filterFieldContext FilterPersonOptionList FilterRangeControl FilterDateRangeControl
Column types hub filter demo (light mode) Column types hub filter demo (dark mode)
Library hub with filter toolbar (light mode) Library hub with filter toolbar (dark mode)

Add filter lists all columns

Data columns with a cellKind show up even when you never wrote a filter: block.

Person pickers from row data

derivePersonFilterOptions builds the avatar list from the hub dataset — not a hard-coded mock array.

Chips match Properties

Range sliders, date windows, and rich option previews in the toolbar mirror the Properties sheet controls.

One filter bag

Table, list, board, and dashboard views read the same useTableState filters — change once, every view follows.

II · Component catalog

Live hub previews — not sandboxes.

The dogfood catalog split into list + details. Hub primitives (DataTable, KPI strip, board cards) render the same reference tables you ship in Library — including the column-types rule demo at /column-types-demo. Side panels use FloatingSheetPanel (no overlay bleed, no sharp-corner Sheet chrome).

List + details IA ColumnTypesRuleDemoTable FloatingSheetPanel Reversed category order
Component catalog with live hub table previews

III · Exam lock · 0.6.50

Assessment delivery — no hub chrome.

Timed exams are not list hubs. ExamLockTemplate owns the full viewport: brand bg-sidebar canvas, inset question card, transparent app header (title, timer, tools, avatar), and card-top progress. App.tsx omits sidebar, ⌘K, Ask Leo, and system banner on /exam-lock.

ExamLockTemplate MCQ · T/F · fill-blank · essay Stem figures + image zoom Color mode toggle Submitted confirmation

Question renderer

One switch routes stem + body by type — shared nav, progress, and keyboard submit.

Native figure dialog

Stem images open in <dialog> with DS tokens — not a bespoke modal stack.

Enter / Esc parity

Submit and cancel pair inline Kbd hints with <Shortcut> bindings.

Showcase route

/design-os/exam-lock demos the full delivery loop for design review and QA.

Exam lock MCQ delivery (light mode) Exam lock MCQ delivery (dark mode)

Focus ≠ hub (P9)

Do not put exam delivery inside ListPageTemplate. Register suffixes in lib/exam-lock-shell.ts; agents load exxat-focus-workflow before authoring.

IV · Focus workflow · 0.6.50

One task — sidebars off.

Create-question and short compose flows use FocusWorkflowTemplate: primary + secondary sidebars hidden via isSidebarHiddenPath, but ⌘K and Leo stay available unless the product opts out. Reference: /library/new and /design-os/focus-workflow showcase.

FocusWorkflowTemplate NewFocusTemplate Compact scope rail (0.6.49) focus-workflow-pattern.md jobs/focus-workflow.md
Focus workflow template showcase (light mode) Focus workflow template showcase (dark mode)
Library new question focus shell (light mode) Library new question focus shell (dark mode)

V · Library secondary panel · 0.6.49

Folder labels wrap.

Long folder names in the Library scope rail no longer truncate or overlap the next row. Rows use h-auto min-h-8 with top-aligned chrome; the active highlight grows with the label. On /library/new, the focus shell keeps a compact icon scope rail while the primary sidebar is hidden.

Multi-line folder rows Focus shell scope rail ⌘B width sharing openPanel compact mode
Library secondary panel with wrapped folder tree labels

Primary + secondary rails

Expanding the main sidebar while a scope rail is open collapses the secondary panel to its icon strip — both rails no longer fight for width on narrow laptops.

VI · Column cell primitives

Pick the right cell — and filter.

The table-column-cells pattern now documents which primitive belongs on each data point — person avatar column, status badge, progress bar, currency, rating — and how each cellKind wires into filters. Agents load exxat-table-column-cells instead of inventing bespoke filter markup.

Person columns

Avatar + name + email in tables; filter picker lists people from the hub rows.

Status + badge columns

Shared list-status badges; filter dropdown matches chip vocabulary.

Progress + rating

ProgressCell and star ratings filter as numeric ranges — not free-text search.

Date + currency

Date-range control and numeric bounds reuse the same toolbar chip shell.

Dashboard view with KPI strip and charts
Prism dashboard shell (light mode) Prism dashboard shell (dark mode)

VII · Agent context shipped

Rules + skills for tables.

table-column-cells-pattern.md, focus-workflow-pattern.md, exxat-table-column-cells.mdc, exxat-focus-workflow.mdc, and consolidated skills (exxat-kpi, exxat-overlays, exxat-sidebar-nav) sync to consumer apps via exxat-ui sync-extras. When a PM asks for a placements column or an exam screen, the agent maps to documented templates — not a one-off div stack.

exxat-table-column-cells skill exxat-data-tables rule consumer-extras mirror 50 binding rules 28 AI skills

What this means in review

Filter chips, person pickers, and column types should match Library reference — agents cite apps/web/docs/table-column-cells-pattern.md and the hub table in library-table.tsx, not screenshots pasted into chat.

VIII · Polish & fixes

Small things that blocked.

Slider thumbs no longer remount mid-drag (key={index} on thumbs). Dev toolchain deps patched (vite, vitest, hono, ws) via pnpm overrides — no runtime API change, cleaner Dependabot posture.

Slider drag fix

Catalog range demos and Properties sliders stay draggable end-to-end.

No raw Sheet in catalog

Side panels demo FloatingSheetPanel — matches production overlay rules.

React Doctor 100

Reference app clears react-doctor warnings on filter + catalog surfaces.

Still no toasts

Feedback stays on banners, inline status, and dialogs — Sonner remains gone.

VII · Day by day

The arc of the sprint.

Jul 1

0.6.55 — Image IA gate + onboarding chrome

exxat-image-ia-gate + brief-gate escalation; step 1 hides sidebar/header; typography and contrast fixes; agent-context validation in release gates.

Jun 30

0.6.53 — 978/978 axe ship pass

ScrollRegion + contrast fixes at the primitive layer; pnpm a11y:axe:all gate; Google Antigravity .agents/ mirror.

Jun 23

0.6.50 — Filters + exam lock + catalog

cellKind filter stack; ExamLockTemplate + question types; FocusWorkflowTemplate showcase; catalog live hub previews; agent context (table cells, focus workflow, KPI/overlays skills).

Jun 17

0.6.49 — Library folder wrap

Multi-line folder labels in the secondary panel; compact focus-shell scope rail; primary + secondary sidebars share width without overlap.

Earlier

May 26–Jun 2 · 0.6.27–0.6.34

Onboarding wizard, four-app switcher, Properties compact rail, Settings tiles, SidebarNavLabel, and upgrade UX — see spring changelog ↓.

VIII · Semver changelog

0.6.550.6.53

Engineering source of truth: packages/ui/RELEASES.md. Summaries below are designer-facing; upgrade with pnpm add @exxatdesignux/ui@0.6.55 then npx exxat-ui upgrade — restart Cursor so hooks reload.

0.6.55 · Jul 1

  • Added — Image IA gate. exxat-image-ia-gate.mjs on beforeSubmitPrompt; brief-gate escalates with IA-only + brief-first copy when a screenshot was attached.
  • Added — Onboarding chrome store. Step 1 hides sidebar and site header; preview from step 2; title Welcome to Design OS; Ivy wordmark on sidebar B2 lockup.
  • Fixed — Typography & contrast. Darker --muted-foreground; helpers stay text-sm; removed /60//70 muted opacity on nav, breadcrumbs, and table cells.
  • Fixed — Agent context. Constitution + ux-discovery IMAGE blocks; sessionStart IA reminder; agent:context:validate in release gates; exxat-ui doctor smoke-tests image escalation.

0.6.54 · Jul 1

  • Fixed — Publish gates. agent:context:validate wired into pnpm release:gates; Design OS shell dependency sync before tarball.

0.6.53 · Jun 30

  • Added — Axe ship gate. 978/978 scans pass; ScrollRegion, BadgeAi, Leo prompt chips; pnpm a11y:axe:report markdown receipts.
  • Added — Antigravity mirror. .agents/ rules, skills, workflows via pnpm sync-antigravity.

0.6.50 · Jun 23

  • Added — Exam lock shell. ExamLockTemplate, MCQ/T-F/fill-blank/essay renderers, stem figures, timer header, color-mode toggle; /design-os/exam-lock showcase; full chrome strip via isExamLockPath.
  • Added — Focus workflow. FocusWorkflowTemplate, /design-os/focus-workflow showcase, focus-workflow-pattern.md + exxat-focus-workflow.mdc.
  • Fixed — Hub table filters. Add filter lists every data column via filterableColumns + resolveColumnFilter — not only columns with explicit filter: blocks.
  • Fixed — Filter chips. Person pickers, range sliders, date-range, and rich option previews in the toolbar (filterFieldContext from row data).
  • Fixed — Slider. Thumb no longer remounts mid-drag.
  • Added — Column filter stack. cellKind presets + FilterPersonOptionList, range/date controls.
  • Changed — Catalog. List + details split, live hub previews, /column-types-demo; FloatingSheetPanel for side panels.
  • Changed — Agent context. Table-column-cells + focus-workflow patterns; consolidated KPI/overlays/sidebar-nav skills; 50 rules in consumer extras.

0.6.49 · Jun 17

  • Fixed — Library folder tree. Multi-line labels wrap with top-aligned chrome; active highlight follows expanded row height.
  • Changed — Library focus shell. Compact icon scope rail while primary sidebar is hidden on /library/new.
  • Changed — Sidebar width. Expanding primary sidebar (⌘B) collapses secondary panel to icon strip so rails don't compete.

VIIIb · Earlier spring releases

0.6.270.6.34

May 26–Jun 2 shell polish — sidebar labels, Properties rail, Settings tiles, upgrade UX. Upgrade path for these lines: pnpm add @exxatdesignux/ui@0.6.34 then npx exxat-ui upgrade.

0.6.34 · Jun 2

  • Fixed — Vite scaffolds boot. sidebar-nav-label shim, SwitcherProductEntry import, router-compat navigation (no invalid second args).
  • Fixed — Landing sync. landing:sync semver-sorts and patches What's new rows via patchWhatsNew.
  • Changed — product-framework@0.1.6. exxat-design-os on Product; scaffold pnpm.overrides until transitive install catches up.

0.6.33 · Jun 2

  • Fixed — Settings appearance tile size. labelPlacement="below" + default density no longer uses aspect-square w-full previews.
  • Fixed 96px (size-24) preview wells in a w-fit row; column count follows option count (Theme/Text size use 3 cols, not 4).
  • Properties compact rail unchanged (density="compact" stays on the sheet only).

0.6.32 · Jun 2

  • Fixed — Settings appearance density. Reverts density="compact" on Theme / Contrast / Text size in settings-appearance-card.tsx.
  • Compact caption-below rail remains on Table Properties (view type, row height, export format).

0.6.31 · Jun 2

  • Changed — Upgrade UX matches fresh install. exxat-ui upgrade prints the same receipt as create-exxat-app.
  • exxat-ui sync-extras quiet by default on TTY; auto-runs upgrade when shell drift is detected.
  • Fixed manual sync-extras after a bump — no 100+ file lines + separate upgrade step.
  • builder-onboarding.tsx added to exxat-ui upgrade auto-port list (prism/one skip nav builder step).

0.6.30 · Jun 2

  • Added — SelectionTileGrid compact rail for Properties view type + Export format (icon well + caption below).
  • Added — View type overflowinlineVisibleCount={4} + More menu; overflow selection keeps ⋯ + label active.
  • Added — HorizontalScrollRegion / HorizontalScrollControls for dense toolbars and tab strips.
  • Changed view-type labels shortened (Table, List, Board, … — dropped “view” suffix).
  • Changed — PageHeader collaboration — title, face rail, actions on one row; subtitle on row two.
  • Changed — KeyMetrics insight — description clamped to two lines.
  • Fixed Properties sheet fourth view-type tile clipping in the 20rem panel.
  • Fixed page header title wrap (stale globals.css overrides removed).

0.6.28 · May 29

  • Added — SidebarNavLabel — wrap on expanded rail; icon rail still hides labels + uses tooltips.
  • Added — exxat-sidebar-nav-labels.mdc vendored via sync-extras.
  • Fixed sidebar nav ellipsis (truncate removed; globals.css enforces wrap on [data-sidebar-nav-label]).
  • Fixed — ensure-dist rebuilds when dist is missing SidebarNavLabel.

0.6.27 · May 29

  • Fixed — Consumer install / upgrade hardening. postinstall + create-exxat-app run exxat-ui upgrade (globals, app-store shim, vite dedupe, product-authoring libs).
  • Fixed — exxat-ui upgrade skips missing template paths instead of crashing.
  • Fixed — exxat-ui doctor flags stale @source …/ui/src, missing product-framework, forked app-store, postinstall wiring.

IX · The full inventory

More than fits one page.

The Jun 17–23 hub-filter push on top of the May 26–Jun 2 platform work. Below is UX-facing inventory from 0.6.0 through 0.6.50. Patch-level detail for 0.6.49–0.6.50 is in the changelog section above.

Platform & routing

  • @exxatdesignux/product-framework published
  • defineProduct() + registerProducts()
  • Four-app switcher (Prism, One Schools, One Sites, Custom)
  • URL-is-truth product adoption on direct visits
  • productPersistKey() — no cross-app filter leaks
  • Custom suffix slugs (/assessment/*)
  • Library under product roots + back-compat alias
  • First-visit → onboarding; then default dashboard
  • Custom nav active state at runtime
  • Empty default tenant catalog (no seeded Assessment)

Builder authoring

  • Product Studio — catalog sync, route roots, checklist
  • Add product CLI + shipped catalog import
  • tenant-products.json dev sync (no reload trap)
  • Builder mode on in dev; end-user mode in prod builds
  • Authoring hard floor — import.meta.env.DEV
  • Wordmark editor aligned with ExxatProductLogo
  • Logo cascade: full → suffix → wrap
  • Suffix clamped to 24 chars in registry
  • Appearance card — brand tint on neutral card
  • Restart onboarding from Profile settings

Onboarding wizard

  • 5 steps with live sidebar preview
  • 3-card picker — ring selection, no black fill
  • Built-ins lock wordmark + brand colour
  • Re-pick product without stale preview
  • 80-icon FA matcher from label text
  • Suggested nav rows (Library, Reports, …)
  • Enter / Esc workflow shortcuts
  • Leaner copy — no ALL CAPS eyebrows
  • BlobBackground clip fix at wizard bottom
  • Per-device completion flag

Shell & hubs

  • Real starter dashboard (KPI + charts, not marketing cards)
  • SidebarNavLabel — wrap, don't truncate (0.6.28)
  • SelectionTileGrid compact Properties rail (0.6.30)
  • Settings appearance fixed-size tiles (0.6.33)
  • HorizontalScrollRegion for dense chrome (0.6.30)
  • Secondary panel OKLCH brand elevation
  • SidebarDrillIn in package barrel
  • DataTable fills canvas when columns are narrow
  • Seven hub view types parity
  • cellKind filter stack — person, range, date chips (0.6.50)
  • ExamLockTemplate + question primitives (0.6.50)
  • FocusWorkflowTemplate + focus-shell rails (0.6.49–50)
  • Catalog live hub previews (0.6.50)
  • Org settings product list for end users
  • Profile / Organization settings split
  • Product switcher with mark colours
  • HC polish on panel, tabs, ToggleSwitch

AI & consumer DX

  • Brief-gate hook — ask before design-critical writes
  • exxat-senior-ux + discovery protocol
  • 50 binding Cursor rules via sync-extras
  • 28 AI skills vendored to consumer apps
  • exxat-table-column-cells skill + rule (0.6.50)
  • exxat-product-context rule
  • exxat-domain-context skill
  • exxat-ui upgrade — port shell files + install-style receipt (0.6.31)
  • Quiet sync-extras + auto-upgrade when shell drifts (0.6.31)
  • exxat-ui doctor — drift detection
  • Postinstall auto-upgrade on fresh installs (0.6.27)
  • Zero-warning pnpm dev on scaffold

Quality & packaging

  • Sonner removed — no-toast guardrail
  • Package tarball ~50% smaller (no source maps)
  • Tailwind self-scan — scaffolds styled on install
  • Persisted-state no-op write guard
  • Resize handles off tab order (WCAG 2.4.7)
  • react-router-dom peer + built-in ThemeProvider
  • Consumer rules globs fixed for Vite apps
  • RELEASES.md renamed (no 120 KB in node_modules)
  • 222 tokens · 101 components in package (0.6.50)
  • Builder onboarding handoff doc shipped