Meridian Field Services: instructional example, not project evidence
The full machine per component; documenting only default and hover is the anti-pattern this table kills.
| State | Suggestion card (the board's primary component) |
|---|---|
| default | Rank, technician code, reason chips (tokens: component tokens[1]) |
| hover | Elevation raise; the assign affordance surfaces |
| focus | The visible focus ring token; matches the a11y indicator (2.4.7[2]) |
| active | Press depression on assign |
| disabled | An ineligible candidate: greyed, the reason on hover (BR-01[3]) |
| loading | The skeleton while suggestions compute (§3) |
| error | suggestions_unavailable renders the full-list fallback, not a broken card (error registry[4]) |
| empty | Zero eligible technicians states the reason and opens the full list (EC-01[5]) |
Every state the board's wireframe implies has a machine here; the disabled and empty states the wireframe only hints at are specified, not left to the build.
The rules live in business_rules; this section owns timing and placement.
| Field | Trigger · placement | Rule (cited) |
|---|---|---|
| Job address / dates | On blur; error adjacent; recovery clears on valid entry | VR-04 cross-field[3]: the "end after start" bound lives there |
| reason_code (override) | On submit (a select, no keystroke) | VR-03 closed set[3] |
| Position skew | Not a form field; validated server-side; noted so the intake team does not expect a client message | VR-02[3] |
Error-message discipline: "Choose an end time after the start time," never "Invalid input"; success is silent where the field's validity is obvious.
| Surface | Pattern · threshold | Budget (cited) |
|---|---|---|
| Board initial load | Skeleton (layout-bearing: the grid renders before data) · under the 1-second direct-manipulation feel | NFR-P1[6] |
| Suggestion computation | Spinner inside the card · instantaneous-to-1s; past the 2-second boundary it degrades to the full list (FLW-01[7]): the empty-and-error pairing | NFR-P2[6] |
| Assignment write | Optimistic: the card renders assigned immediately, rolling back on stale_version (error registry[4], reconciliation[8]) | success near-certain; perceived latency decouples from the round trip |
Every pattern cites its budget; none assumes a number.
| Motion | Purpose · duration | Reduced-motion fallback (in this entry) |
|---|---|---|
| Suggestion panel slide-in on job select | Continuity (the panel comes from the selected row); duration/easing from the motion tokens (motion tokens[1]) | An instant cross-fade, no translate (reduced motion[2]) |
| Stale-badge pulse on a disconnected board | Feedback (attention to staleness) | A static badge, no pulse |
Decorative motion: none; a transition without a purpose was cut at review. Every motion carries its fallback; none is a follow-up ticket.
| Chord | Action | Conflict check |
|---|---|---|
| J / K | Move job selection | No OS/browser/screen-reader conflict |
| Enter | Assign the top suggestion | Clear |
| O | Open the override panel | Clear |
| / | Focus search | Scoped to the board canvas so it does not steal the browser quick-find |
Discoverability: "?" opens the shortcut sheet; each is hinted in its control's tooltip. No reserved-chord collision; the conflict check ran and is recorded.
| Interaction | Focus rule (cites the a11y contract) |
|---|---|
| Route → exception-review view | Focus lands on the view heading (2.4.3 focus order[2]) |
| Override modal | Focus traps inside on open, restores to the triggering card on close (the dialog contract, modal contract[2], not re-specified here) |
| Live position updates | A POLITE live region (announced without stealing focus), the high-risk surface the a11y mapping named (4.1.3[2]) |
Focus order matches the visual grid; the indicator is the design system's focus token. Every rule cites its contract; none re-derives the dialog mechanics.
| Question | Owner | Answer by | Blocks |
|---|---|---|---|
| Does the "/" search shortcut scope conflict with a screen-reader user's expectation of the browser find (the canvas-scoping needs an AT test to confirm)? | UX owner with the QA owner | At the accessibility audit | The shortcut map's search row only |