Interaction, motion, and feedback rules for the i18n surface. Tokens and
timing per 00-shared/08 ; states legend per 05_Screen_Inventory.md .
Interaction Specification
App launch fetch catalog for resolved locale (GET /i18n/messages?locale=, i18n.controller.ts:13-17) in parallel with session bootstrap; render with cached catalog first (offline-first), swap when fresh map arrives
Locale change (forward-looking) refetch + rebuild widget tree; keep scroll positions
Retry 3 attempts, exponential backoff 1 s / 2 s / 4 s; offline banner (00-shared/03 )
Cache versioning (planned) catalog hash header on response; app refetches when hash differs; delta push (forward-looking)
Gesture/input Behavior
Tap row open Key Editor (450 ms m-base slide)
Long-press multi-select mode; AppBar shows "3 selected" + bulk bar (delete / export)
/focus search; Esc clears filters
Filter chip immediate list filter with m-base fade (200 ms); badge counts animate
Pull-to-refresh re-pull from GET /api/v1/i18n/keys; silent on error
Infinite scroll "load more" at 25-row pages; skeleton 6 rows while fetching
Feedback: save/delete → AppSnackbar (module-scoped); errors → inline banner,
never blocking.
Interaction Behavior
Field focus locale rail scrolls field into view (desktop); phone switches tab
Typing live placeholder parity check (debounced 300 ms); amber line appears without focus loss
Save Ctrl/Cmd+S anywhere; button spinner; success = field check morph m-fast (120 ms)
Dirty navigation unsaved-changes dialog before leaving (discard/cancel)
Conflict 409 → dialog "Reload or overwrite" (06 §2 )
Delete destructive confirm; undo snackbar 5 s (planned)
Multiline growth field auto-grows to 6 rows max, then scrolls internally
Interaction Behavior
Add locale bottom sheet (phone) / dialog (desktop); on success → card appears with coverage ring animation m-base ease-out
Coverage ring tap drill into Key List filtered missing:<locale>
Promote enabled only at 100 % coverage + zero param drift; confirm dialog explaining runtime switch-over (new catalog becomes active for that locale)
Demote confirm; blocked if it holds the only copy of any key
Interaction Behavior
Run now spinner on button; results stream in rows as CI completes; stale state after 24 h
Row expand DriftTableRow expands missing-key list; "Fix" jumps to editor with filter preset
Export CSV download; success snackbar; failure toast
Token Use
m-fast (120 ms)field check, chip status change, badge update
m-base (200 ms)list filter fade, pane slide, coverage ring
ease-out all entrances; no bounce effects on admin surfaces
Phone: light haptic on save success; warning haptic on param-mismatch line
(only on explicit save, not during typing).
Desktop: none.
Error Feedback
401 catalog fetch silent retry ×1, then offline state; no nagging UI
403 console permission screen + "ask admin" copy (perm i18n.* (planned) )
409 duplicate key inline field error + "Open existing" link
429 rate limit countdown chip on Save (00-shared/10 )
Network lost mid-save banner "Saved locally, retrying"; draft preserved