Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

10 — Interaction Specification (Timetable Module)

Specializes 00-shared/08 for this module. All motion tokens from 02_Design_Tokens.md §6. The grid is the hero surface: drag-to-edit on desktop, long-press on mobile (06 §S1, 07 §A1).


1. Touch gestures (phone/tablet)

GestureBehaviourScreen
Tap empty cellOpen S4 editor prefilled (class + day + time of cell)S1/S2 (coordinator)
Tap slotSlotDetailPopover: subject/teacher/room/time + actions (Duplicate, Edit/Delete (planned))S1/S2/S3
Long-press slotSame popover as tap (selectionClick haptic) — no drag on mobile; edit happens in the editor, not by draggingS1
Long-press on TimetableSlotCard conflict badgeTooltip/semantics "Double-booked" detail (proposed)S1
Swipe left on slotRemove — (planned) (no DELETE endpoint; disabled until backend lands)S1/S2
Pull downRefresh grid (cache-bypass)S1/S2/S3
Tap FABScale-in (m-entrance) → S4S1 (coordinator)
Tap /Week shift m-base cross-fadeS1/S2/S3
Back gestureEditor sheet → grid (discard confirm if dirty (proposed)); grid → previous surfaceS4

2. Desktop/web (mouse + keyboard)

InputBehaviour
Hover slotm-fast surface tint, e-2; tooltip after 500 ms (full label) (08 §2)
Hover empty cellsubtle fill; drop-target highlight primaryContainer when a slot is dragged over
Drag slot → cellDraggable<TimetableEntry>DragTarget cell: drop opens S4 editor prefilled with new day/time + slot's subject/teacher/room. Creates a new entry — no PATCH exists; banner in editor: "This creates a new slot; the original stays until you delete it (planned)" (09 §5)
Drag to invalid target (occupied non-empty cell)Rejected: cell shows errorContainer outline; slot returns (spring m-base)
Right-click slotSame popover as long-press
+ / NNew slot (S4) on grid screens (05_Global_Information_Architecture.md §7)
/ Week navigation (grid focused)
Ctrl+FFocus scope/class search (proposed)
EscClose editor sheet/dialog/popover
EnterSubmit focused editor; Tab logical order; visible focus ring primary 2 dp (09 §6)
Delete keyOn focused slot → delete confirm (planned)

3. Haptics (mobile)

EventHaptic
Entry created (200)lightImpact()
Conflict (409 / pre-flight)mediumImpact() + banner
Slot long-press popoverselectionClick()
Pull-to-refresh donelightImpact()
Ruledisabled when system haptics off; none on web/desktop (08 §3)

4. Motion per screen

ScreenEntranceElement motion
S1/S2 gridpage fade+rise m-slowslot insert/remove: AnimatedList m-base; week shift cross-fade m-base; conflict border pulse once m-fast
S3 room viewgrid fade m-fastmerge updates cross-fade m-fast
S4 editorsheet slide-up m-base, r-xl corners (phone) / dialog scale m-base (desktop)picker options m-fast; conflict banner slide-down m-base; Save spinner replaces label
S5 bannerslide-down m-basedismiss slide-up m-fast
S6 week navoffset label cross-fade m-fast

Reduced-motion: all collapse to fades ≤ m-instant, no stagger, no drag ghost animation (08 §4, 09 §8).

5. Micro-interactions

  • FAB hide/show on scroll (grid): hide on scroll-down, show on scroll-up (03 §D).
  • Slot drag ghost (desktop): card lifts to e-4 + 0.95 scale while dragged; drop snaps into cell (08 §2); drop → editor opens m-base (create semantics per 09 §5).
  • Save button: label → spinner → check + snackbar "Slot added"; disabled while pending (anti-double-submit 08 §6).
  • Week navigator: ‹/› + cross-fade; "Today" resets offset.
  • Scope switch: segmented control; grid cross-fades m-fast while refetching.
  • Conflict banner: auto-announce via live region; dismiss returns focus to conflicting field.

6. Frustration controls

  • Every interactive element responds ≤ 100 ms (08 §6).
  • Network-bound actions always pending-visible — never silent.
  • Submit double-tap prevented; destructive actions (planned) require explicit confirm dialog (typed confirm not required — soft-delete is reversible server-side; 05_Global_Information_Architecture.md §5 applies to irreversible purge only).
  • Grid never blocks input during refetch: stale requests dropped via request generation token (13 §5).