08 — Interaction & Motion (Shared)
- 1. Touch gestures (phone/tablet)
- 2. Desktop/web (mouse + keyboard)
- 3. Haptics (mobile)
- 4. Motion language
- 5. Micro-interaction catalogue
- 6. Frustration controls
Global interaction conventions and motion language. Module docs 10_Interaction_Specification.md specialize per module.
1. Touch gestures (phone/tablet)
| Gesture | Behaviour | Where |
|---|---|---|
| Tap | Primary action, ripple m-fast | Everywhere |
| Long-press | Context menu (AppMenu), reorder, multi-select entry | List rows, cards, attachments |
| Double-tap | Zoom on images/PDF; nothing else | Media previews |
| Swipe left/right | Row actions (mark read, delete draft, archive) | Lists with Dismissible-style actions (keep ≤ 2) |
| Pull down | Refresh | All scrollables |
| Pinch | Zoom | Media, charts (tablet) |
| Drag | Reorder (timetable slots, dashboard widgets), image preview dismiss | Module-specific |
| Hardware back / back gesture | Pop; on root tab → exit app (Android) or previous shell branch | All |
| Edge swipe | Drawer on phone | App shell |
2. Desktop/web (mouse + keyboard)
| Input | Behaviour |
|---|---|
| Hover | m-fast surface tint, tooltip after 500 ms |
| Click | Tap equivalent |
| Right-click | Context menu (same as long-press) |
| Wheel | Scroll; Ctrl+wheel zoom on media |
| ESC | Close dialog/sheet/menu/search; cancel selection |
| Tab / Shift+Tab | Focus traversal (logical order), visible focus ring primary |
| Enter | Submit focused form; Space toggles focused control |
| Ctrl+K | Global search |
| Ctrl/Cmd+Enter | Submit from text areas |
| Arrows | List navigation in menus/dropdowns |
3. Haptics (mobile)
| Event | Haptic |
|---|---|
| Success | HapticFeedback.lightImpact() |
| Error | HapticFeedback.mediumImpact() |
| Long-press menu | HapticFeedback.selectionClick() |
| Pull-to-refresh completion | lightImpact() |
| Destructive confirm | heavyImpact() |
| Rule | Haptics off when system setting disabled; no haptics on web/desktop |
4. Motion language
- Enter: new screen slides forward (
m-base); content fades + slight rise (m-slow). - Exit: reverse slide; dialogs/sheets scale+fade in, slide down on dismiss.
- Hero: shared-element flight for list→detail (avatar→profile header, thumbnail→
attachment preview)
m-slow. - State change: color/size transitions
m-fast; icon morph viaAnimatedSwitcher. - Skeleton→content: cross-fade
m-slow, no pop. - Reduced motion (accessibility setting): all transitions become fades ≤
m-instant; no parallax, no stagger, no shimmer loop. - Density: never animate layout shifts; use
AnimatedSizefor expanding sections.
5. Micro-interaction catalogue
| Interaction | Detail |
|---|---|
| Row tap | Ink ripple + 2% surface darken; 40 ms press latency feedback |
| FAB appear | Scale-in m-entrance; hide on scroll-down |
| Tab switch | Indicator slide m-base |
| Badge update | Scale pop on unread count change |
| Pull-to-refresh | Spinner primary, m-slow; on success + lightImpact |
| Submit button | Loading spinner replaces label; success → brief check + snackbar |
| Infinite scroll load | Bottom spinner fade-in m-instant |
6. Frustration controls
- Every interactive element responds within 100 ms of press (press state visible).
- Network-bound actions always show pending state — never a silent wait.
- Repeated taps on submit are disabled while pending (anti-double-submit).
m-fastripple only — no full-screen flashes.