From b2845e016b0d6a89eac744edb690b44f3f443deb Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Mon, 28 Sep 2026 16:54:41 +0200 Subject: [PATCH] docs(10.1): approve UI design contract and resolve state gaps --- .../10.1-UI-SPEC.md | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/.planning/phases/10.1-runtime-admin-extension-point/10.1-UI-SPEC.md b/.planning/phases/10.1-runtime-admin-extension-point/10.1-UI-SPEC.md index 859f91c..5222faf 100644 --- a/.planning/phases/10.1-runtime-admin-extension-point/10.1-UI-SPEC.md +++ b/.planning/phases/10.1-runtime-admin-extension-point/10.1-UI-SPEC.md @@ -1,7 +1,8 @@ --- phase: "10.1" slug: "runtime-admin-extension-point" -status: draft +status: approved +reviewed_at: "2026-09-28" shadcn_initialized: false preset: none created: "2026-09-28" @@ -278,7 +279,7 @@ Every string is a phrase key with `en` and `pl` entries. There is no hardcoded c ## UI Considerations -Applicable state considerations resolved: 17 covered, 3 backstop, 0 unresolved. +Applicable state considerations resolved: 20 covered, 3 backstop, 1 dismissed, 0 unresolved. | Category | Element(s) | Status | Resolution / Reason | |----------|------------|--------|---------------------| @@ -301,6 +302,10 @@ Applicable state considerations resolved: 17 covered, 3 backstop, 0 unresolved. | form | S3 fill write-back | โœ… covered | Only `field.fill` keys present in `result.fill` are patched. The form becomes dirty, those fields' errors clear, and nothing saves until Save. | | long-text | S3 widget button / S4 toolbar button | ๐Ÿงช backstop | Labels are `white-space: nowrap`. The toolbar cluster wraps with the existing `flex-wrap`, and the widget button grows past its 160px min-width. Needs a visual check at 768px with the pl labels. | | loading / error | S4 custom toolbar action | โœ… covered | Disabled with `aria-busy` during the POST. Success toast, then list reload and partial refetch. Failure gives a danger toast. | +| long-text | S2 form partial output | โœ… covered | `.summer-partial` sets `overflow-wrap: anywhere`. Long words and URLs wrap inside the row and are never truncated or scrolled horizontally. | +| empty | S3 widget with no fill values | โœ… covered | The element still mounts when `fill-values` is `{}` and `record-id` is `""`, and its button stays enabled. The plugin decides what to do with an empty context; the framework never hides or disables the widget. | +| long-text / overflow | S5 extension failure box | โœ… covered | The text wraps and the box grows past `min-h-input`, switching to `items-start` with 10px vertical padding once it is multi-line. It never clips, so the pl `widget_failed` copy stays fully readable. | +| partial / zero-one-many | S1 header partial host | โž– dismissed | The host renders one opaque server node tree all-or-nothing (a failure gives the S5 box). Item counts belong to the partial's own content, which the stats strip rows above cover. | | error | S6 CSS bleed across controllers | ๐Ÿงช backstop | Links of inactive controllers get `disabled`. `pluginAssets.test.ts` covers the toggle, and a real-browser UAT (A4) confirms that module scripts load under CSP `script-src 'self'`. | --- @@ -328,12 +333,12 @@ Applicable state considerations resolved: 17 covered, 3 backstop, 0 unresolved. ## Checker Sign-Off -- [ ] Dimension 1 Copywriting: PASS -- [ ] Dimension 2 Visuals: PASS -- [ ] Dimension 3 Color: PASS -- [ ] Dimension 4 Typography: PASS -- [ ] Dimension 5 Spacing: PASS -- [ ] Dimension 6 Registry Safety: PASS -- [ ] Dimension 7 Inventory Provenance: PASS +- [x] Dimension 1 Copywriting: PASS +- [x] Dimension 2 Visuals: FLAG (non-blocking) +- [x] Dimension 3 Color: PASS +- [x] Dimension 4 Typography: FLAG (non-blocking) +- [x] Dimension 5 Spacing: FLAG (non-blocking) +- [x] Dimension 6 Registry Safety: PASS +- [x] Dimension 7 Inventory Provenance: PASS -**Approval:** pending +**Approval:** approved 2026-09-28 (FLAGs on Visuals, Typography and Spacing are non-blocking recommendations)