docs(10.1): approve UI design contract and resolve state gaps

This commit is contained in:
Jakub Zych
2026-09-28 16:54:41 +02:00
parent f4459ac7c2
commit b2845e016b

View File

@@ -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)