Concrete interaction rules for the Houses module. Motion tokens (m-fast,
m-base) and gesture standards from 00-shared/08 (Interaction & Motion);
accessibility from 00-shared/09 ; offline behaviour from 00-shared/10 .
From Gesture Result Rule
List card tap push /houses/:id haptic light on phones
List FAB tap open editor sheet (create) gated houses.create
Detail edit menu tap open editor sheet (update, prefilled) gated houses.update
Detail delete menu tap open DeleteHouseDialog (07 §7) gated houses.delete
Member row tap push /students/:id cross-module; deep link back
AppBar back swipe-back / button pop standard
Action Behaviour
Open (create) sheet slides up m-base (320 ms); focus Name
Open (update) same; fields prefilled from loaded house
Color swatch tap selects; ring indicator m-fast; haptic light
Custom hex input validates on blur; invalid → field error + shake m-fast
Submit (Enter / button) single-flight; button spinner; fields disabled
409 conflict ConflictFieldError under Code + shake + focus + live-region
Dismiss with dirty form discard-confirm dialog (first time only, then silent)
Success sheet closes m-base; list/detail refetch (response-driven, 13 §6)
Action Behaviour
Pull-to-refresh refetch page 1 (keep scroll position)
Pagination footer AppPagination; disabled Prev on page 1, Next when !meta.hasNext (pagination-query.dto.ts:52-53)
Card press elevation + m-fast; pressed state ≤ 200 ms perceived
Action Behaviour
Pull-to-refresh refetch house + members section independently (13 §4)
Members refresh icon refetch students join only; spinner on count badge
Delete confirm destructive button error; confirm → DELETE → snackbar "House deleted" → pop to list; failure → snackbar + dialog stays
Element Token (00-shared/08 )
Card appear stagger m-fast (≤4 rows)
Sheet slide / dialog scale m-base
Field error shake m-fast
Colour swatch selection m-fast, 120 ms
Cross-screen push platform default; no custom hero except HouseHeader color bridge (list card swatch → detail banner, m-base)
Mode Behaviour
List cached render cached houses + AppOfflineBanner; refresh disabled
Detail cached show from list cache; members section shows stale join or hidden
Mutation blocked; FAB/menu disabled with tooltip "You're offline"
Conflict while offline queued? No - mutations never queue; user retries manually
Permission Visible Hidden behaviour
houses.read absentnothing empty state + "contact your admin" (06 §1.3)
houses.create absentno FAB -
houses.update/delete absentno card menu -
403 on direct deep link AppEmptyState + backnever auto-redirect loop
Source: permissions.constants.ts:46-49; server RBAC not wired - client gating only
(AGENTS.md).
All interactive elements ≥ 48 dp hit area; cards expose onTap semantics.
Focus order: header → members → meta; menus traversable by keyboard.
Error announcements via live region, never visual-only.
Color swatches carry labels; selection announced ("Color Red selected").