diff --git a/.planning/phases/08-oauth2-1-authorization-server/08-UI-SPEC.md b/.planning/phases/08-oauth2-1-authorization-server/08-UI-SPEC.md index 9ee6586..9fe894c 100644 --- a/.planning/phases/08-oauth2-1-authorization-server/08-UI-SPEC.md +++ b/.planning/phases/08-oauth2-1-authorization-server/08-UI-SPEC.md @@ -71,18 +71,13 @@ Declared values (all multiples of 4): | 2xl | 48px | Contextual empty-state vertical padding | | 3xl | 64px | Reserved page-level separation; inherited app shell only | -Exceptions that are already implemented and must be preserved rather than normalized: - -- interactive consent buttons, scope rows, settings tabs, and revoke icon button have a minimum 44px target; -- the app shell uses 20px mobile and 28px desktop horizontal padding; -- consent page uses 48px vertical padding and a 24px card rhythm; -- the connected-app scope badges retain their existing compact Tailwind `gap-1.5`; it is an inherited component detail, not a new phase spacing token. +The Phase 8 spacing scale is exactly the seven values above. The 44px minimum interactive target is an accessibility dimension, not a spacing token. The unchanged app shell's responsive horizontal padding and the connected-app scope badges' compact inherited gap are pre-existing, out-of-scope implementation observations; Phase 8 neither adopts them as tokens nor authorizes normalizing or editing them. The consent page uses only declared 48px vertical padding and 24px card rhythm. --- ## Typography -The phase declares four app roles and exactly two design weights. Existing shared components remain unchanged even where their vendored utilities use `font-medium` or the display font. +Phase 8 owns exactly the four sizes and two weights declared below. Existing shared components remain unchanged; their inherited rendering is implementation observation, not an extension of this phase's typography scale. | Role | Size | Weight | Line Height | |------|------|--------|-------------| @@ -94,10 +89,12 @@ The phase declares four app roles and exactly two design weights. Existing share Additional locked rendering details: - `redirect_host` uses IBM Plex Mono at the body size so the destination domain remains visually distinct; -- the untrusted application name is rendered as the existing quotation treatment (`text-lg font-medium`) with a disclaimer, never as trusted branding; -- the shared connected-app empty state keeps its existing Instrument Serif title treatment; +- the untrusted application name keeps the existing emphasized quotation treatment with a disclaimer, never as trusted branding; its inherited utility classes are out-of-scope observations, not Phase 8 size or weight tokens; +- the shared connected-app empty state keeps its existing Instrument Serif title treatment; that immutable shared-component rendering does not add a Phase 8 size or weight; - headings use tight tracking; body, hint, date, and error copy use IBM Plex Sans. +No additional font size or weight is adopted or requested, and this contract does not authorize a Nuxt source change to reconcile inherited component utilities with the phase-owned scale. + --- ## Color @@ -137,10 +134,14 @@ All copy is pre-existing and locked. The backend returns data only; it must not | Connected-app load error | Could not load connected applications. Try again. | Nie udało się wczytać połączonych aplikacji. Spróbuj ponownie. | | Revoke title | Revoke {name}? | Odwołać {name}? | | Revoke confirmation | This application will immediately lose access to the collection. This cannot be undone. | Ta aplikacja natychmiast straci dostęp do kolekcji. Tej operacji nie można cofnąć. | +| Dialog cancel action | Cancel | Anuluj | +| Destructive CTA | Revoke | Odwołaj | | Revoke success | Access revoked | Dostęp odwołany | Scope labels and explanations remain the existing localized `Read`/`Write`/`AI` copy. `client_name`, collection names, email, dates, and counts are data substitutions and must be rendered through Vue interpolation, never as HTML. +**Locked legacy CTA exception:** The exact unchanged labels **Allow**, **Deny**, **Revoke**, and **Cancel** (with their existing Polish translations above) are narrow exceptions to the UI-gate preference for verb-plus-noun action copy. **Allow** and **Deny** sit under the access-request title, explanatory lead, requested scopes, and destination context; **Revoke** sits in a destructive confirmation dialog named with the application and described by the irreversible consequence; **Cancel** is the non-destructive action in that same named dialog and closes it without an API call. Button styling, dialog semantics, focus management, visible surrounding copy, and the dynamic `Revoke {client_name}?` accessible name supply the action context. These are immutable legacy labels, not precedent for new copy, and Phase 8 does not authorize renaming them or making any Nuxt change. + --- ## Consent Screen Contract