Module-specific interactions layered on 00-shared/08 . Covers every input modality on
phone/tablet/desktop.
Gesture Behaviour Where
Tap toggle switch, row → detail, chip filter, menu open list, detail
Tap on switch while pending ignored (switch disabled during flight) all toggles
Long-press enter selection mode (bulk), open AppMenu when menu exists list rows
Swipe left/right none (delete is destructive → menu + dialog only; 00-shared/08 §1 keeps ≤ 2 non-destructive actions)—
Pull down RefreshIndicator → full list refetch and FeatureFlagsCubit.refresh() (gating set stays in sync)list
Hardware back sheet → dismiss (selection kept); detail → list; editor dirty → discard confirm all
Edge swipe drawer (shell) —
Input Behaviour
Tab chips → rows (row = one stop: switch+menu) → FAB; focus ring primary
Space toggles focused switch; toggles chip selection
Enter opens focused row detail; submits editor; applies bulk
Esc closes sheet / dialog / discards editor (with confirm if dirty)
Ctrl/Cmd+N new flag (editor, create mode)
Ctrl/Cmd+Click / Shift+Click multi-select rows for bulk
Right-click AppMenu (same as long-press)
Hover row tint m-fast; tooltip after 500 ms (switch disabled reason, key copy)
Arrows navigate chip rows in module filter; move between switch and menu in a row
Event Haptic Ref
Toggle applied (200) lightImpact—
Toggle rollback (error) mediumImpact—
Copy key selectionClick—
Bulk applied lightImpact—
Delete confirm heavyImpact—
Rule off when system haptics off; none on desktop 08 §3
Transition Duration/curve Used by
List → detail m-base slide (hero optional m-slow)rows
Row insert/remove m-entrance fade-up stagger 40 msafter bulk/delete refresh
Switch state change m-fast color/thumball toggles
Filter chip swap / tab m-base cross-fade of list contentfilter row
Sheet (bulk) m-base bottom slide, r-xl topbulk
Result rows m-entrance fade-upbulk results
Error rollback AnimatedSwitcher fade + error ring (no shake on toggles)switches
Reduced motion: fades + m-instant only; no stagger, no hero.
Interaction Detail
Switch flipped thumb animates m-fast; row enters pending ("Saving…") without blocking other rows
Save in editor button loading swap m-base; double-tap locked
Copy key snackbar "Copied" + selectionClick
Bulk apply progress bar m-base; count "Applying 3 of 5"
Delete dialog m-base scale+fade; row fade-out on 200
Filter change list content cross-fade m-slow; active chip secondaryContainer
Gating flip (client) gated widgets appear/disappear with m-fast fade — never a full-screen reload
All presses respond < 100 ms with m-fast ripple.
Every network action shows pending state (switch pending, save spinner, bulk progress).
Writes disabled while offline; tooltip explains.
429 → countdown; no auto-retry (rate-limit.constants.ts:6).
Errors persist as banners/snackbars until dismissed or corrected; toggles roll back
visibly (never silently).
Bulk partial-failure retry: "Retry failed (n)" re-sends only missing keys
(feature-flags.service.ts:40-44 sequential apply → client diffs by key).
Deep-link prefilter: studylyon://settings/feature-flags?module=biometric pre-selects
the chip; :key deep link loads detail directly (404 → "flag not found" + back).
Selection persistence: bulk sheet dismissal keeps selection; re-open restores it.
No drag/drop, no QR, no media in this module.
Toggle rollback on error matches server truth (no cache of a state the server rejected).
Editor never claims description/module saved (repo drops them, feature-flag.repository.ts:40).
Bulk results respect sequential no-transaction semantics (feature-flags.service.ts:40-44).
Delete shows the re-create caveat (unique index + soft delete, OQ-4).
Org overlay UI merges before PATCH (full-replace semantics, organizations.service.ts:149-151).
Enabled set refresh keeps client gating aligned with GET /feature-flags/enabled
(feature-flag.repository.ts:28-30).