Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .design-sync/config.json

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion .design-sync/previews/AnswerCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export const WithFooter = () => (
<AnswerCard
state={readyState}
verification={readyVerification}
support="strong"
provenance={{
publisher: "Sir Charles Gairdner Hospital",
version: "4.2",
Expand All @@ -26,7 +27,7 @@ export const WithFooter = () => (

export const PlainAnswer = () => (
<div className="w-[40rem]">
<AnswerCard state={readyState} verification={readyVerification}>
<AnswerCard state={readyState} verification={readyVerification} support="supported">
<p>No local guideline covers this question. The linked sources are the closest available.</p>
</AnswerCard>
</div>
Expand All @@ -37,6 +38,7 @@ export const MissingReviewDate = () => (
<AnswerCard
state={readyState}
verification={readyVerification}
support="supported"
provenance={{ publisher: "RANZCP", generatedAt: "2026-07-31T13:04:00+08:00" }}
>
<p>Review status is unknown for this source, so the footer says so rather than staying blank.</p>
Expand All @@ -61,6 +63,7 @@ export const StaleEvidence = () => (
],
}}
verification={{ state: "stale_evidence", sourceCount: 2 }}
support="supported"
onOpenSource={openSource}
>
<p>This answer uses a source whose scheduled review is overdue.</p>
Expand All @@ -78,6 +81,7 @@ export const PartialRetrieval = () => (
missing: [{ sourceId: "local-monitoring-addendum", title: "Local monitoring addendum", locator: "p. 4" }],
}}
verification={{ state: "partial_retrieval", sourceCount: 2 }}
support="limited"
onOpenSource={openSource}
>
<p>This answer may omit local guidance because one named source was unavailable.</p>
Expand All @@ -90,6 +94,7 @@ export const Ungrounded = () => (
<AnswerCard
state={{ kind: "ungrounded", reason: "unverified_numeric", sourceCount: 2 }}
verification={{ state: "ungrounded", sourceCount: 2 }}
support="limited"
onOpenSource={openSource}
>
<p>The cited passages did not verify every clinical number in this answer.</p>
Expand All @@ -102,6 +107,7 @@ export const SourceOnly = () => (
<AnswerCard
state={{ kind: "source_only", reason: "quality_gate" }}
verification={{ state: "source_only", attribution: "extractive", sourceCount: 2 }}
support="unassessed"
onOpenSource={openSource}
>
<p>This answer was assembled from source passages without model synthesis.</p>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
| 2026-08-21 | claude/frontend-design-6sl1ft | eaae8bde3066749f105233c1492d6f044671b91b | full-frontend design review remediation: tokens, ward a11y, answer support label, gate gaps | applied — 20 review findings resolved or dispositioned; 3 architectural items deliberately deferred | verify:pr-local exit 0 (19/19 gates; 7599 tests passed, 4 skipped, 0 errors; build 1871 pages); verify:ui delegated to CI Production UI (playwright revision drift #255) |
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
| 2026-08-21 | claude/frontend-design-6sl1ft | 8b26a5c4ce836db00e031e2ad3ee3980e8a9d1a9 | design-review remediation + loose ends + nested-mockup CI scope routing | applied — 20 review findings resolved or dispositioned, 5 loose ends closed, 1 CI scope gap fixed; 3 architectural items recorded as decisions in TOKENS.md §9 / COMPONENTS.md §0.4 | verify:pr-local exit 0 (28/28 gates after CI-scope widening; 7599 tests passed, 4 skipped, 0 errors; build ok); full suite green with no gh CLI; verify:ui delegated to CI Production UI (playwright revision drift #255, and heavy jobs are draft-gated) |
64 changes: 36 additions & 28 deletions docs/design-system/COMPONENTS.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions docs/design-system/GATES.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ than CI, two of them by the second reader; review does not scale past two carefu
| `tests/source-metadata-browser-safety.test.ts` | The `process is not defined` client-bundle crash stays fixed (server logger never ships to the browser) | implemented-blocking |
| `tests/accessible-table.dom.test.tsx`, `tests/accessible-table-alignment.dom.test.tsx` | Table semantics, numeric alignment, expander `aria-controls` | implemented-blocking |
| `tests/ui-primitives.dom.test.tsx`, `tests/ui-v2-components.dom.test.tsx` | Behavioural coverage for the tested subset (COMPONENTS §0) | implemented-blocking (subset) |
| ESLint repo rules: `no-hardcoded-hex`, `require-button-wiring`, `require-lucide-icon-aria`, `require-z-index-ladder`, `restrict-suppress-hydration-warning` | Raw hex, un-wired buttons, icon aria, z-ladder discipline, hydration-warning abuse | implemented-blocking |
| ESLint repo rules: `no-hardcoded-hex`, `require-button-wiring`, `require-lucide-icon-aria`, `require-z-index-ladder`, `restrict-suppress-hydration-warning` | Raw hex (`bg-`/`text-`/`border-` bracket-hex ONLY; `ring-`/`shadow-`/`outline-`/`from-`/`via-`/`to-`/`fill-`/`stroke-` and inline `style={{}}` are out of scope), un-wired buttons, icon aria (values imported directly from `lucide-react` only - the `icon: LucideIcon` prop form is structurally invisible), z-ladder discipline (see the scoped row below), hydration-warning abuse | implemented-blocking |
| `tests/route-reachability.test.ts` | No orphan production routes | implemented-blocking |
| `npm run verify:ui` (+ `verify:phone-chrome`) | Chromium production journeys; phone-chrome owners | implemented-blocking (journey scope) |
| Visual-baseline harness (PR #1404) | Screenshot baselines exist but ship **zero committed baselines with `continue-on-error` on, deliberately** — a held gate until the design is declared final (issue `#118`). Includes the `--spacing-tap` probe floor. | implemented-partial (non-blocking by hold) |
Expand Down Expand Up @@ -117,7 +117,7 @@ theme-list parity, and remote design-project publication remain separate concern
| Raw pixel size, padding, radius, gap or line-height in markup | `check:design-system-contract` — `rawPaddingLiterals` (63), `rawRadiusLiterals` (23), `rawGapLiterals` (31), `rawLineHeightLiterals` (3) | **implemented-blocking for new use** (9 Aug 2026) — per-path ratchets over both the utility and the CSS-declaration spelling, so a literal cannot move into `globals.css` to escape. Values containing a CSS function (`env(`, `clamp(`, `max(`, `calc(`) are sanctioned computed forms and exempt. Raw _size_ is still covered only for tap/shadow/colour |
| Animate `width`, `height`, `grid-template-*`, `top`, `left`, `gap` | `check:design-system-contract` — `layoutTransitionExceptions`, ratcheted at 11 with per-path pins | **implemented-blocking for new use** — `SAFE_TRANSITION_PROPERTIES` carries the compositor-only allowlist; phone chrome's deliberate `grid-template-rows` is in the recorded 11 |
| Hardcode a transition duration | `check:design-system-contract` — `hardcodedMotionClasses` (**zero**) + `hardcodedCssMotionDurations` (41) | **implemented-blocking** for the Tailwind `duration-*`/`delay-*`/`transition-all` form; the CSS form is a ratchet, so its 42 are debt |
| A `z-` value outside the named rungs | `require-z-index-ladder` (ESLint) | implemented-blocking |
| A `z-[N]` literal outside the named rungs, in JS/TS only | `require-z-index-ladder` (ESLint) | implemented-blocking. Scope: `z-[N]` literals in JS/TS AST nodes. Plain `z-30` utilities and every `.css` / `.module.css` declaration are invisible to an ESLint rule - `sidebar-live-shell.module.css` carries an off-ladder `z-index: var(--z-sidebar-flyout, 50)` this cannot see. |
| Ship a registered component without a direct publication test | Gate 12 | implemented-blocking |
| Lower a production tap target below 48px | `check:design-system-contract` — `interactiveTapFloorDeclarations` (40) + Gate 2's phone-viewport `ui-style-contract` audit + `ui-smoke` flake history | **implemented-blocking for new use** (15 Aug 2026) — a new interactive control declaring a sub-floor `min-h-*`, including comparable arbitrary values and any reachable conditional branch, fails on both the total and its own path; the 40 recorded sites remain debt. Component-wrapper tags such as `<Link>` are a known blind spot |
| Construct an enabled control with no action, destination or name | PR 4 discriminated unions + DOM contracts; `require-button-wiring` covers raw `<button>` | implemented-blocking (Citation/Chip/ToggleSwitch/RadioGroup) |
Expand Down
Loading
Loading