Module-specific interactions precise for the settings list, typed editors and batch save,
layered on shared 00-shared/08 . Covers every input modality on phone/tablet/desktop.
Gesture Behaviour Where
Tap open row, open editor, toggle switch, chip filter, FAB new all
Tap row menu AppMenu (Edit value, Duplicate key, Delete)rows
Long-press enter batch selection mode (multi-select) rows
Double-tap none (no media) —
Swipe left none — destructive swipe disabled (delete needs confirm) —
Pull down RefreshIndicator → refetch current group (bypasses cache)list
Pinch/drag none —
Hardware back close editor (discard prompt if dirty) → list; on root → exit all
Edge swipe shell drawer (authed) shell
Input Behaviour
Tab search → chips → rows → FAB (desktop pane: then detail fields key→group→value)
Enter save active editor (single-line); submit Create sheet
Esc close editor/sheet/dialog → focus returns to trigger; cancels selection mode
Ctrl/Cmd+F focus client search (00-shared/08 §2 )
Ctrl/Cmd+Enter save JSON editor
+ / Nnew setting (list screen, desktop)
Arrows navigate group chips (focused chip), dropdown options
Right-click context menu (same as long-press: row menu, multi-select toggle)
Hover row tint m-fast, tooltip after 500 ms (key copy button, type chip)
Focus visible primary ring on all controls; logical order
Event Haptic Ref
Save success lightImpact—
Save/batch failure mediumImpact—
Boolean toggle applied selectionClick—
Delete confirm heavyImpact—
Rule disabled when system haptics off; none on desktop 08 §3
Transition Duration/curve Used by
Route push (list→detail) m-base slidephone
Detail pane swap (master-detail) m-base fadetablet/desktop
Row saved → dirty dot clears m-fast fadelist
Row removed (delete) m-base fade-outlist
Batch bar appears m-entrance (300 ms, easeOutBack)list
JSON editor error m-fast outline color swap + AnimatedSwitcher message (no shake)editors
FAB hide/show on scroll m-entrance/fade, scroll-dir drivenlist
Reduced-motion: fades + instant only; no stagger, no entrance bounce (00-shared/08 §4 ).
Interaction Detail
Save pressed button loading spinner swap m-base; double-tap locked; on success check + snackbar
Boolean toggle switch animates m-fast, optimistic; failure → rollback + error snackbar
Group chip tap chip indicator slide m-base; list refetches (server filter)
Dirty edit row dot primary pops in m-fast; Save bar count updates
Batch save completes per-row ✓/✗ (m-fast); snackbar "Saved N of M"
Type chip tap tooltip "value type: number" (desktop) / no-op (phone)
Key copy (detail) Clipboard.setData + snackbar "Copied" + selectionClick
All presses respond < 100 ms with m-fast ripple.
Every network action shows pending state (row spinner, button spinner).
Save buttons disabled while pending — no double-submit.
429 → never auto-retry; countdown surfaced.
Errors persist until corrected/dismissed (banner or inline field error).
Batch retry: tap a failed row's ✓/✗ chip → re-sends the full dirty set for that key
(idempotent upsert, 08 §4 ).
JSON paste: editor accepts multi-line paste; parse check runs debounced (300 ms);
invalid → Save disabled until fixed.
Deep links (forward-looking): studylyon://settings/group/:group pre-selects chip;
studylyon://settings/:key opens detail directly.
"Save all" only ever sends dirty keys, each as full {key, value, group} — matches
PUT /settings/bulk (settings.controller.ts:43-47).
No optimistic saves for explicit editors (server truth returned in data,
setting.repository.ts:39).
Delete never offers undo (soft-delete is irreversible through the API — OQ-5).
Group chips always refetch server-side — never client-filter the full list, because the
API contract filters on the server (settings.controller.ts:26-28).