Design Site on Layer
Close the layer gaps so the design site uses only q-nuxt-layer components for everything presentational
Why
The design site is the first consumer of the design system, but a sweep (2026-06-11) found it still hand-rolls recurring presentational patterns: left-border callouts (15+ uses), index card links (5 pages), code blocks, inline code (24+ uses), back links (12+ pages), filter button groups, read-only pills, and static doc tables. It also bypasses layer components that already exist (DataMetric for stat cards, Sentence* — which NotificationRuleCard duplicates with inline render functions, UxSimpleSelect). Per the unified pantry rule, these patterns belong in the layer; the site should consume them.
Objective
Add 8 primitives to the layer, move the PatternCard doc scaffold to the dev group, and migrate every design-site call site — so that grep finds zero hand-rolled presentational markup outside _demos, and local components are limited to site chrome and data-wired logic (~16 files, down from 30).
Scope
Layer (q-nuxt-layer):
- New:
prose/Callout.vue,ux/CardLink.vue,ux/CodeBlock.vue,ux/Code.vue,ux/BackLink.vue,ux/Pill.vue,ux/FilterGroup.vue,ux/Table.vue - Moved:
dev/PatternCard.vue(from design'sapp/components/PatternCard.vue) - Release 0.6.0 at the end (additive minor)
Design site:
- Migrate call sites across
app/pages/(brand, layer, method, philosophy, visualization, history, archive, timeline, coverage, index pages) - Refactor
NotificationRuleCardontoSentence*,TimelineFiltersontoUxSimpleSelect/UxFilterGroup, stat cards ontoDataMetric* - Delete
patterns/CodeBlock.vue; renamePatternCardusages toDevPatternCard - Document all new components (demos + registry + coverage fields)
Out: _demos/ markup, sectioned link grid (document as pattern), moving patterns/* compositions, bulk h2+p heading migration.
Full phase-by-phase detail: execution-plan.md
Key Changes
Layer (q-nuxt-layer):
- Added 10 components:
ProseCallout(tone/tag),UxCardLink(optionalto→ static card),UxCodeBlock(label/collapsible/dark+light themes — absorbed design's CodeBlock.vue),UxCode(0.9em inline, warn tone),UxBackLink,UxPill(grape/leaf/grey/warn),UxFilterGroup(single/multiple/required, grape/leaf/dark),UxTable(line/band variants, semantic tokens),UxSelect(bordered form select),DataMetric_Card(bordered stat card layout) - Moved design's
PatternCard→dev/PatternCard.vue(DevPatternCard), refactored ontoUxCodeBlock ProseSectionHeadlinegainedsize: 'display' | 'doc'prop (doc = text-28 font-semi scale)- CLAUDE.md catalog updated
Design site:
- Migrated all call sites: 17 callouts, 8 card links, 16 back links, 73 inline code spans, 10 code blocks, 10 tables (incl. the component detail page's props/emits/slots tables), archive filters + pills
- Adoption pass:
NotificationRuleCardnow uses the layerSentence*family (deleted its 4 inlineh()duplicates),TimelineFiltersusesUxSelect, timeline/coverage stat cards useDataMetric_Card/DataMetricValue+Label,ArchiveArtifactDetail/TimelineInspectorbadges useUxPill - Deleted
app/components/PatternCard.vueandapp/components/patterns/CodeBlock.vue; renamed 18PatternCardusages toDevPatternCard - Documented all 11 new components: demos in
_demos/, registry entries with coverage fields
Known remnants (intentional):
designs/index.vue<pre v-html>— ANSI art renderer, not a code blockArchiveArtifactDetailgrey back link — different tone thanUxBackLink; candidate for a tone prop later- Small bordered buttons in timeline components ("Clear filters", inspector links) — a "small button" layer gap, noted for a future cycle
archive/index.vue_shadow-boxcard — image-card pattern, out of scope- TimelineOverview micro-pills — canvas-presentation-tuned
Outcome
Eleven presentational primitives shipped to q-nuxt-layer (ProseCallout, UxCardLink, UxCodeBlock, UxCode, UxBackLink, UxPill, UxFilterGroup, UxTable, UxSelect, DataMetric_Card, plus DevPatternCard moved from the design site), with every design-site call site migrated — 17 callouts, 8 card links, 16 back links, 73 inline code spans, 10 code blocks, 10 tables — and an adoption pass onto the Sentence* family, UxSelect, and DataMetric_Card. All components documented with demos, registry entries, and coverage fields; intentional remnants (ANSI art renderer, grey back link, small bordered buttons) recorded for future cycles. The once-pending 0.6.0 layer release long since shipped (layer at 0.9.x).
Pending
- Layer release 0.6.0 (
/release-layer) + consumerpackage.jsonupdates — awaiting review - Opportunistic
h2+p→ProseSectionHeadline size="doc"migration as pages are touched
Visual record
2 captures — heroes, page slices, and full-page renders. Click to view.


In the archive
Artifacts
- initial-prompt.md
- initial-prompt.md