Patterns
Each recipe specifies a composition the system endorses: which components, in which arrangement, for which problem, with which voice. Recipes are how the system answers questions like "how do we lay out a dashboard row?" without re-deciding every time. Spec §8.17.
12-column grid · metric-card + sparkline + horizontal-bar · responsive stacking.
dashboard-chart-rowcomparison-mode · score-mode (replaces metric card with gauge)template_id 10.5.5 (help text). Each card title sentence-case verb-or-noun; delta uses arrows + tabular-nums per §10.3.3.2.aria-label reads as "{title}: {value} {delta description}".Line (2 series) + metric card + sparkbar · vertical stack.
Assessments completed
time-comparison-chartdelta-mode (paired-bar of period-by-period delta) · annotation-mode (RuleMark events overlaid)↑/↓ {magnitude} vs {comparator}. Tied to template_id 10.5.3.aria-label from the legend.Histogram + box-plot + bar-horizontal + metric card · 7:5 split layout.
Time-to-completion (days)
distribution-drilldowntable-detail (replaces bar with paginated table) · filter-bound (histogram clicks drive surrounding filters)template_id 10.8.1 (AI-hedging where IRIS surfaces stats).Settings-surface toggle for reduced motion · MotionProvider + labelled switch · new in v4.4 (D-110).
Reduce motion
Fewer animations, same information. Currently following your system setting.
motion-preferenceprefers-reduced-motion signal is the default; the explicit choice (persisted to risqbase:motion) overrides it in both directions.setMotionPreference('full' | 'reduced' | null)data-motion="full | reduced" on the provider wrapper; central [data-motion="reduced"] rules in tokens.css; scanner rule R13 gates component animation.template_id 10.5.5.src/core/MotionProvider/accessibility.md./patterns/motion-preference.md (llms.txt corpus)Every recipe authored to the same §20.0 schema. Editors can grep for "patterns/*.mdx" + assert each carries template_id + voice_examples per §20.0.1.
// docs/patterns/<recipe-id>.mdx
---
id: dashboard-chart-row
title: Dashboard chart row
visibility: PUBLIC
status: stable
problem: |
How do we render a top-of-dashboard summary…
when_to_use: |
Top-fold of any dashboard…
when_not_to_use: |
Fewer than 3 metrics…
composed_of:
- Metric / KPI card (§7.10)
- Sparkline (§8.1.1 time)
layout: |
12-column grid…
variants:
- id: comparison-mode
description: …
- id: score-mode
description: …
voice_examples:
- template_id: 10.5.5
context: card-title
rendered: "Open DPIAs"
- template_id: 10.5.5
context: card-delta
rendered: "↑ 12 vs last month"
keyboard: |
Tab into cards…
accessibility: |
Per-card aria-label…
last_reviewed: 2026-05-07
owner: G4
---
(Body content - usage examples, code snippets, anti-patterns.)Every voice_examples entry must carry a template_id matching ^10\.[58]\.\d+$ - referencing a real template from spec §10.5 or §10.8. The CI gate lint:recipes-voice enforces this. Without the binding, the glossary is decorative; with it, copy on every shipped surface is testably the same word, the same sentence shape, the same hedge.