10 — Interaction Specification (Students Module)
- 1. Gestures & inputs (phone/tablet)
- 2. Desktop/keyboard
- 3. Motion choreography
- 4. Micro-interactions
- 5. Frustration controls
- 6. Haptics map (mobile; off on web/desktop and when system disabled)
- 7. Realtime interplay
Interaction details on top of the global conventions (00-shared/08). Motion tokens from 00-shared/02 §6; haptics per 00-shared/08 §3.
1. Gestures & inputs (phone/tablet)
| Gesture | Behaviour | Screen |
|---|---|---|
| Tap row | open detail (Hero flight on avatar, m-slow) | Roster |
| Long-press row | AppMenu (same as trailing ⋮) | Roster |
| Swipe left (phone) | none — roster rows keep menu only (avoid accidental archive) | Roster |
| Pull down | refresh page 1 + reset infinite scroll (RefreshIndicator, lightImpact on success) | Roster, Documents, History, Parents |
| Scroll down/up | FAB hides on scroll-down, reappears scroll-up (00-shared/03 D) | Roster |
| Tab switch | indicator slide m-base; content cross-fade m-slow | Detail |
| Back on wizard | step back; at step 1 → leave prompt if dirty | Create/Import |
| Sheet dismiss | drag handle + barrier; state preserved on dismiss | Enroll/Upload/Link |
2. Desktop/keyboard
| Input | Behaviour |
|---|---|
Ctrl+F | focus roster search |
N | open create wizard (roster) |
Esc | close sheets/menus/clear search; step back in wizards |
Enter | submit focused form field chain |
| Right-click row | context menu = long-press menu |
| Hover row | 2% surface tint m-fast; tooltip on truncated names |
| Arrows | navigate dropdown options; timeline focusable nodes |
3. Motion choreography
| Moment | Motion |
|---|---|
| List → detail | Hero avatar m-slow; page slide m-base |
| Status badge change | AnimatedSwitcher icon morph m-fast + scale pop on badge |
| New document tile | entrance m-entrance (stagger 40 ms with list) |
| Import report numbers | count-up animation m-slow (reduced-motion: static) |
| Upload progress | determinate LinearProgressIndicator m-instant color shifts |
| Snackbar confirmations | success < 3 s, error ≥ 4 s, slide m-base (00-shared/03 A) |
| Skeleton → content | cross-fade m-slow, never pop-in (00-shared/08 §4) |
| Reduced motion | all of the above → fades ≤ m-instant; no count-up, no stagger, no shimmer |
4. Micro-interactions
| Interaction | Detail |
|---|---|
| Filter chip toggle | selected = secondaryContainer fill, m-fast |
| Search | 300 ms debounce; clear button restores; results count live-region |
| Submit buttons | spinner replaces label; success → check + snackbar (00-shared/08 §5) |
| Row tap | ink ripple + 40 ms press feedback |
| Timeline node | active node dot pulses m-fast; past nodes static |
| Unlink guardian | destructive confirm heavyImpact, then row removal on server 200 only (not optimistic — server-first) |
| Lifecycle actions | confirm dialog m-base; destructive label error; heavyImpact on confirm |
5. Frustration controls
- Every network action shows pending state (button spinner / skeleton) — never a silent wait (00-shared/08 §6).
- Repeated taps disabled while pending everywhere (create/enroll/transfer/upload/ import/link).
- 429 on any action → countdown + disabled CTA (00-shared/06 §5).
- Upload retry: error tile keeps file bytes in memory, retry re-posts; cancel discards.
6. Haptics map (mobile; off on web/desktop and when system disabled)
| Event | Haptic |
|---|---|
| Create/enroll/transfer success | lightImpact |
| Server 409/422 on lifecycle action | mediumImpact |
| Long-press menu | selectionClick |
| Destructive confirm (delete/graduate/archive/unlink) | heavyImpact |
| Pull-to-refresh complete | lightImpact |
7. Realtime interplay
- No WS topics for students today (00-shared/07 §8 topics list has none for
students). Roster freshness = pull-to-refresh + re-fetch on screen focus.
WS
roster.changedtopic(forward-looking). - In-app notifications (
StudentCreated→in-appstudent-enrolled,event-queue-map.ts:28) arrive to the actor; tapping a student notification → deep link/students/:id(studylyon://students/:id)(proposed).