DRIFTLANDS co-op survival on drifting tides — studio progress

Interaction Pattern Library: Driftlands

Status: Draft — /ux-review 2026-08-29 findings all applied 2026-08-30; formally pending its own re-review, though every entry has since been cross-checked by the six screen-spec reviews of 2026-08-31 (see Version)
Author: Jeroen + ux-designer
Last Updated: 2026-08-31
Version: 0.19 (2026-09-01: Gaps — character stepper, the declared #27 deviation from the title-screen re-review) · 0.18 (2026-09-01: Gaps — text input, screen-level notice slot, invisible timed hold; from the title-screen review) · 0.17 (2026-08-31: #4 — armed-state exemption from hover==focus, after the pause re-review) · 0.16 (2026-08-31: #1 no-Primary-for-dismissal note; Gaps + two-step-arm candidate row — after the pause /ux-review) · 0.15 (2026-08-31: #20 glyph source precision; settings.md APPROVED) · 0.14 (2026-08-31: #20 — Reset Secondary, primary-only rows + fixed secondaries, glyph-templated refusal, prompt modality; after the settings re-review) · 0.13 (2026-08-31: #20 — protected collision refused pre-prompt, pair-as-rebound, capture-only exclusion; after the settings /ux-review) · 0.12 (2026-08-31: #25 Slider, #26 Toggle, #27 Option Cycler added from design/ux/settings.md; #20 amended — conflict = exchange, Interact / Revive one row; Gaps: settings controls closed)
Engine: Unity 6.3 LTS (6000.3)
UI Framework: Unity UI Toolkit (screens; architecture.md ruling) · world-space flyouts/markers as sprites · project-wide Driftlands.inputactions (ADR-0007)
Template: Interaction Pattern Library
Related Documents:
- design/art/art-bible.md §7 — UI/HUD visual direction (diegetic rule, closed HUD list, typography, iconography, animation & input commitments)
- design/quick-specs/ui-hud-2026-08-27.md — the HUD ledger, the two UI-layer bans, the /ux-design queue
- design/accessibility-requirements.md — accessibility commitments (Standard tier, committed 2026-08-29)
- docs/architecture/adr-0007-input-action-map.md — action list, shared controls, InputFrame, rebinding
- design/ux/*.md — per-screen specs that reference these patterns: inventory.md, hud.md, crafting.md, build-mode.md, settings.md (all APPROVED)

Why this document exists: every screen spec should be able to say "uses World-Fact Reason String" rather than re-specifying precedence, hysteresis, tone, and focus behaviour from scratch. When a screen spec references a pattern name, the programmer looks it up here; when the behaviour changes, it changes here and applies everywhere. Do not design a new interaction without checking here first.

Status definitions: Draft — specified, not yet implemented; Stable — implemented and validated in at least one shipped screen; Deprecated — being phased out.


Overview

Driftlands' UI is governed by three documents this library only applies: art bible §7 (the diegetic-first decision rule, the closed screen-space HUD list, typography/iconography/animation commitments), the ui-hud quick-spec (the per-system ledger and the two UI-layer bans — the tone rule: every string states a world fact, never a scolding or an urgency prompt; and the no-contribution-comparison rule: no per-player counts, logs, sorts or groupings anywhere), and ADR-0007 (one action map; Strike/Confirm share LMB and Demolish/Cancel share RMB by design; Revive is the only hold in the game; every panel is fully operable on gamepad with a visible focus state).

Patterns fall into three groups. Standard controls are the ordinary widgets (button, list, panel, tooltip, rebind row) with Driftlands' focus/animation rules baked in. Game-specific patterns are the ones the GDDs contracted: world-fact reason strings, honest no-op cues, the ghost outline, hold-channel, and the co-op affordances. Feedback standards pin the authority split every effect must respect — predicted (instant, local) vs host-confirmed (arrives ~1 RTT later, never faked) — because a pattern that shows a confirmed outcome before the host confirms it is a correctness bug, not a polish choice.

Every pattern states its when not to use; the commonest misuse in this project is reaching for a dialog, toast, or timer where the GDDs demand a diegetic cue or a silent no-op.

Scale convention: every pixel value in this library (hit targets, row heights, text sizes, flyout rise, shake amplitude) is stated at 100 % UI scale on 1080p and multiplies with the accessibility UI-scale option (100 / 125 / 150 %); nothing may be hardcoded in pixels.

Input context (technical-preferences / ADR-0007): KB/M primary (WASD + mouse-aim), gamepad secondary (twin-stick), no touch, PC 16:9 baseline. Every pattern below is specified for both schemes; where the schemes differ the difference is stated, never implied.


Pattern Catalog

Deliberately not in the catalog: enemy HP bars (banned at MVP), node health bars (banned), minimap / node overlay (banned), any build log / craft counter / contribution view (banned), a numeric tide timer (impossible by API — tide AC-27).

# Pattern Category One-liner Contracted by Status
1Button (Primary / Secondary)StandardConfirm/cancel affordance; 100–150 ms ease-out; focus outline slate-lightart bible §7.5Draft
2List PickerStandardVertical list (never a card grid at MVP); d-pad/stick order; greyed rows carry a reason stringBB picker, crafting recipe listDraft
3Panel / ModalStandardOpens instantly, captures UI input; the bag closes by Inventory, every panel closes by Menu / UI.Cancel; no menu-open delay§7.5, ADR-0007 §3Draft
4Focus & Navigation OrderStandardExplicit per-panel grid order, visible focus state, never hover-only§7.5, technical-preferencesDraft
5Tooltip / InspectStandardHover on KB/M, focus-dwell on gamepad; hosts the maker's markcrafting AC-13Draft
6World-Fact Reason StringGamePer-cause short string; first-failing-gate precedence; held stable; minimum display / snap hysteresiscrafting Rule 3, BB UI RequirementsDraft
7Honest No-Op CueGameA rejected action shows nothing extra except a non-modal, distinguishable cue ("bag full" ≠ "someone got there first"); never a dialog or toastharvesting OQ6, inventory Rule 7Draft
8Ghost Outline & Reach GridGameSolid ink = valid, dashed = invalid, zero fill; grid only within placementReach, only in build modeBB Visual RequirementsDraft
9Demolish Target SelectGameCursor-raycast (KB/M) / nearest-in-reticle-cone (gamepad); highlight + refund-preview promptBB UI Requirements (delegated)Draft
10Hold ChannelGameThe only hold: Revive HeldFor with a filling read; any cancel cause breaks it, no drain-backcombat Rule 9, ADR-0007 rule (d)Draft
11Craft-Beat ProgressGameFilling motion at the station, predicted; stance break = cancel, fill vanishes, no confirmationcrafting UI RequirementsDraft
12Maker's-Mark InspectGameCrafter name + "forged N tides ago" + tier, readable per item in tooltip / rack / examine; no aggregation affordancecrafting Rule 5, CD C2Draft
13Storage Who-Took-WhatGameHost-confirmed live take feedback on the storage panel; the anti-double-hauling mechanism§7.2, inventory Rule 7Draft
14Edge Indicator (Ally / Downed)GameHat-silhouette edge markers; the Downed variant is the same system§7.2, combat UI RequirementsDraft
15World PingGamePlaceable world-space marker, signal-orange, never Ember Crimson§7.2Draft
16Compass Tide-GlintGamePer-socket direction + temperature glint; no timer, no countdown, evertide UI Requirements, §7.1Draft
17Carry MeterGameSlate fill + icon shake near full; never crimson; glanceable without a menu§7.1, harvesting UI RequirementsDraft
18Confirmed Number FlyoutFeedbackDamage numbers / yield flyouts — world-space, host-confirmed only, the only numeric feedbackcombat + harvesting UI RequirementsDraft
19Predicted vs Confirmed Feedback SplitFeedbackThe authority table every pattern inherits: what may fire instantly, what waits for the hostcombat Rule 8; harvesting, BB, crafting authority tablesDraft
20Rebind RowStandardPer-action rebind with swap-on-confirm (exchange) conflict, protected actions, reset floor; Interact / Revive one rowADR-0007 §4 (amended 2026-08-31); design/ux/settings.mdDraft
21Stack GridGameFungible-slot inventory grid; one press = one whole-stack move; no drag / split at MVPinventory quick-spec Rules 2–7; design/ux/inventory.mdDraft
24Interact PromptGameOne world-space glyph + verb + noun above the nearest interactable in range; never for enemies / nodesdesign/ux/hud.md E11Draft
25SliderStandardStepped track + knob + always-visible numeric readout; ←/→ one step; live-apply; the wheel never moves ita11y doc (volumes, gamma, HUD opacity); design/ux/settings.mdDraft
26ToggleStandardTwo-cell `[ OFF \ON ]` switch; the active cell is filled and worded; Submit / ←/→ flips; live-applya11y doc (reduced motion, flash, mono, toggle-hold); design/ux/settings.mdDraft
27Option CyclerStandard◂ value ▸ over a short fixed list; no wrap (end arrow dashed); Submit = forward; never a dropdowna11y doc (UI scale); design/ux/settings.mdDraft
29Repair ActionGamePinned per-item rows at a station; one press, instant, free, host-confirmed; panel stays opencrafting Rule 9; design/ux/crafting.mdDraft
31Repeat PlacementGameConfirm held → one atomic commit per cell along the last ghost-move direction; ≤ 1 in flight; stops on a refused cellBB Rule 11b; design/ux/build-mode.mdDraft
30Examine CardGameRead-only world-space card of another player's equipped gear + maker's marks, opened by Interactcrafting AC-13; design/ux/crafting.mdDraft

Patterns

Standard Control Patterns

1. Button (Primary / Secondary)

Category: Standard · Status: Draft Used In: every panel; BB build picker (Confirm), crafting station (Craft), settings, pause

Description: The one button style. Primary = the panel's single default action (Craft, Place, Apply); Secondary = everything else. Hierarchy comes from weight and outline, never from a second colour.

Specification:

When to Use: any discrete confirmable action inside a panel. When NOT to Use: for in-world verbs (strike, dash, interact, demolish) — those are Player-map actions, never on-screen buttons; for "destructive" confirmations (none exist at MVP — demolish refunds in full, so there is nothing to confirm); as the weight for a dismissal — a panel whose default action is leaving has no Primary (settings.md Z4; pause.md Resume — hierarchy there comes from first focus + top position, added 2026-08-31).

2. List Picker

Category: Standard · Status: Draft Used In: BB build-mode picker (3 entries at MVP), crafting recipe list, settings lists

Description: A vertical list of rows, one focused, one selected. Never a card grid at MVP (BB UI Requirements: "a list, not a grid of cards"). Vertical by default; the build picker strip is the one horizontal instance (build-mode.md S1, in-mode context (a)).

Specification:

Allowed variant — commit-on-Submit (added 2026-08-31, design/ux/crafting.md): a list whose focus already drives a detail pane may treat Submit as the row's commit rather than a selection, provided the panel has no selected-but-uncommitted state and any duplicate button is pointer-only (never focusable). State the variant in the screen spec.

When to Use: choosing one of N known items. When NOT to Use: with any sort / group / filter control keyed on a player identity (aggregation ban — pickers have no sort control at all at MVP); for inventories (bag/storage use a stack grid — see Gaps).

3. Panel / Modal

Category: Standard · Status: Draft Used In: bag, storage, recipe list, rack / examine, pause / settings

Description: A screen-space panel that captures UI input while open. Driftlands has no nested dialogs and no confirmation dialogs at MVP — one panel at a time.

Specification:

When to Use: bag, storage, recipes, rack, settings. When NOT to Use: for errors or rejected actions (Honest No-Op Cue #7 — never a modal); for anything that gates an input mid-combat; for "are you sure?" (none exist — demolish shows a refund-preview prompt, not a dialog).

4. Focus & Navigation Order

Category: Standard · Status: Draft Used In: every panel (the closed HUD elements are non-interactive and have no order)

Description: The gamepad-parity contract: every panel declares an explicit navigation order and a visible focus state; nothing is hover-only (technical-preferences; art bible §7.5).

Specification:

When to Use: always. When NOT to Use: no exception exists.

5. Tooltip / Inspect

Category: Standard · Status: Draft Used In: bag, storage rack, equipped-gear examine, recipe rows

Description: The per-item detail surface and the only place the maker's mark is read (#12 defines the content; this pattern defines the container).

Specification:

When to Use: any per-item read. When NOT to Use: for aggregate views (none exist); for anything that must be read during combat — tooltips are panel-scoped.

Game-Specific Patterns

6. World-Fact Reason String

Category: Game · Status: Draft Used In: BB ghost preview, BB picker rows, crafting recipe rows, storage transfer no-ops, revive race loss

Description: A short string stating which world fact blocks an action — never a generic "invalid", never a scolding, never a grind prompt ("locked", "come back later"). Crafting has three causes (station / world / affordability); Base Building has eight (its F1 gates).

Specification:

When to Use: any action the player could attempt but the world currently refuses. When NOT to Use: for successful actions; for anything the player could not have attempted (hidden state stays hidden — never "enemy has 3 HP left").

7. Honest No-Op Cue

Category: Game · Status: Draft Used In: harvest swing on a full bag; harvest swing on a node someone else just emptied; storage withdraw race loss; craft-commit race loss; placement race loss (BB EC11)

Description: When the host rejects an action, the world shows the truth and nothing else: the predicted effect simply fails to be confirmed, plus one non-modal cue that says which kind of nothing happened. Never a dialog, toast, error sound, or red flash. Harvesting OQ6's bar: "bag full" and "someone got there first" must be distinguishable by a first-time player with no explanation — the pre-playtest gate.

Specification:

When to Use: every rejected host-rail action. When NOT to Use: for actions refused before being attempted (that is #6's job); never combined with a modal or a retry prompt.

8. Ghost Outline & Reach Grid

Category: Game · Status: Draft Used In: BB build mode only

Description: The placement preview: outline-only ghost (solid ink = valid, broken/dashed = invalid, zero fill in either state) plus a grid overlay drawn only within placementReach of the player, only while build mode is active.

Specification:

When to Use: structure placement. When NOT to Use: for demolish (#9 — a targeted action, not a mode); outside build mode; never with a fill tint.

9. Demolish Target Select

Category: Game · Status: Draft Used In: BB demolish — an instant targeted action from Idle/Move, never a mode

Description: How the player picks which structure Demolish acts on, with gamepad parity and a deterministic rule for dense clusters. Delegated to /ux-design by the BB GDD; this entry is the ruling.

Specification:

When to Use: demolish only. When NOT to Use: for any other interact target (Interact uses proximity, not this selector); never as a persistent "demolish mode".

10. Hold Channel

Category: Game · Status: Draft Used In: Revive — the only in-world channel hold (ADR-0007 rule (d): exactly one asset-level hold). The other Held reads are the title-screen reset floor (#20) and Repeat Placement (#31); all three are inventoried in accessibility-requirements.md. A further hold is a design change, not a reuse

Description: A held input that fills a read over reviveChannelTime (3 s) and completes host-side. Any cancel cause breaks it instantly with no drain-back and no confirmation.

Specification:

When to Use: revive. When NOT to Use: harvesting (Rule 1: press-only, no hold-to-channel), crafting (a stance, not a hold — #11), any menu confirmation (banned).

11. Craft-Beat Progress

Category: Game · Status: Draft Used In: every station craft (craftTimeSeconds 2 s at MVP)

Description: The station work-loop read during the craft beat: a filling motion on the station, client-predicted, cancelled by the stance breaking.

Specification:

When to Use: station crafting. When NOT to Use: anything requiring a hold (#10); equip (instant swap-in-place, no beat); demolish / placement (their own thunks).

12. Maker's-Mark Inspect

Category: Game · Status: Draft Used In: Tooltip / Inspect (#5) in bag, storage rack, equipped-gear examine

Description: The per-item provenance line — the headline fantasy's UI floor (CD A3). Read per item only; no aggregation affordance may exist anywhere.

Specification:

When to Use: any gear item read. When NOT to Use: materials (no mark); structures (BB Rule 7 — collectively anonymous, no builder field exists); any aggregate view.

13. Storage Who-Took-What

Category: Game · Status: Draft Used In: the shared-storage panel (Panel #3 for a SharedStorage chest)

Description: The anti-double-hauling mechanism: the storage panel renders host-confirmed state only and shows, live, who just took what — Inventory Rule 7 made visible.

Specification:

When to Use: shared storage only. When NOT to Use: the personal bag (owner-predicted, no tags); any history / log view (banned).

14. Edge Indicator (Ally / Downed)

Category: Game · Status: Draft Used In: HUD (closed list: off-screen party status); combat's Downed indicator is the same system

Description: Hat-silhouette markers pinned to the screen edge toward each off-screen party member; the Downed variant reuses the system with a low prone silhouette so a downed friend is findable at a glance (Fellowship floor).

Specification:

When to Use: party tracking. When NOT to Use: enemies (never — no threat radar); structures; the ping (#15 is world-space, not edge-clamped, though it borrows the clamp when off-screen).

15. World Ping

Category: Game · Status: Draft Used In: gameplay — any player, any time

Description: A placeable world-space marker — the non-voice coordination tool. Signal-orange, never Ember Crimson (crimson means danger, exclusively — art bible §4.2).

Specification:

When to Use: pointing at a node, a threat, a build spot. When NOT to Use: as a map / waypoint system (none exists); as text chat (none); never persistent.

16. Compass Tide-Glint

Category: Game · Status: Draft Used In: HUD (closed list) — the only tide UI

Description: A per-socket screen-edge glint giving direction + temperature only for a socket the player cannot see from where they stand. No timer, no countdown, no progress — impossible by API (tide AC-27; the HUD receives TintFloats only).

Specification:

When to Use: tide state while the shore is off-screen. When NOT to Use: when the shore is on-screen (the world says it); any numeric or textual tide readout; threat-land warnings (danger reads on the land, never in the announcement).

17. Carry Meter

Category: Game · Status: Draft Used In: HUD (closed list: carry capacity)

Description: The bag-fill read: a slate meter that escalates near full via fill level + icon shake — never crimson — and is glanceable without opening a menu (harvesting UI Requirements; art bible §7.1).

Specification:

When to Use: carry capacity at a glance. When NOT to Use: storage chests (read in the panel); weight / encumbrance (none exist — schema-negative); any crimson use.

21. Stack Grid

Category: Game · Status: Draft Used In: bag panel (5×2, bagSlots), shared-storage panel (8×5, storageSlots) — design/ux/inventory.md; the equipment strip is a two-slot variant

Description: The inventory grid. Slots are fungible — a stack has no fixed position and fills the first free slot — so the grid is a container view, not a layout the player arranges. One press on a stack performs the container's single verb on the whole stack.

Specification:

When to Use: any container of ItemStacks. When NOT to Use: for recipes / structures (List Picker #2); for anything that would need arranging, sorting, or filtering (banned); as a drag target.

24. Interact Prompt

Category: Game · Status: Draft Used In: HUD (design/ux/hud.md E11) — chests, stations, any Interact target

Description: A world-space prompt showing which interactable Interact will act on and what it does. One at a time, nearest wins.

Specification:

When to Use: any Interact target. When NOT to Use: enemies, nodes, the revive channel (#10 has its own prompt), build mode (the ghost is the prompt).

29. Repair Action

Category: Game · Status: Draft Used In: station panel (design/ux/crafting.md)

Description: Repair is an instant, stateless station verb (crafting Rule 9: free, instant, at a station of the gear's tier or higher), presented as pinned rows — one per repairable worn item — above the recipe list. Never a mode, never a material cost, never a timer.

Specification:

When to Use: worn gear at an eligible station. When NOT to Use: as a "repair all" button (the per-item read is the point); anywhere off-station; for a higher-tier item at a lower-tier station (no row, no explanation needed — the station header states its tier).

30. Examine Card

Category: Game · Status: Draft Used In: gameplay — any nearby player (design/ux/crafting.md, AC-13's third inspection context)

Description: A read-only world-space card showing another player's equipped gear with each item's maker's mark — so the mark can be read off the item on your friend without asking (crafting Rule 5).

Specification:

When to Use: reading another player's gear. When NOT to Use: for enemies or NPCs (none exist); as a stats/compare panel (flat stats — there is nothing to compare); never persistent.

31. Repeat Placement

Category: Game · Status: Draft Used In: build mode (design/ux/build-mode.md) — BB Rule 11b's repeat-placement deliverable

Description: Holding Build.Confirm after a confirmed placement advances the ghost one cell in the last ghost-move direction and commits again, one atomic PlaceStructure per cell (Rule 11a: at most one in flight). The gesture spends none of the per-cell "event": one thunk per wall.

Specification:

When to Use: rows of walls (the common case). When NOT to Use: multi-cell preview / drag-a-row (a second ghost grammar, rejected 2026-08-31); anything with a placement timer (banned); crafting (Rule 8 — one craft at a time, no repeat).

Feedback Patterns

18. Confirmed Number Flyout

Category: Feedback · Status: Draft Used In: combat damage numbers; harvesting yield flyouts — the only numeric feedback in the game

Description: A world-space number rising from the point of impact only when the host confirms the outcome. Never predicted, never for misses, never for enemy HP.

Specification:

When to Use: confirmed damage and yield. When NOT to Use: predicted feedback (swing anim, whiff — silent by design); UI-panel numbers (plain text); anything the GDDs keep hidden.

19. Predicted vs Confirmed Feedback Split

Category: Feedback — the standard every pattern inherits · Status: Draft Used In: everything

Description: The authority table for effects. A pattern that shows a host-owned outcome before the host confirms it is a correctness bug, not a polish choice. This entry consolidates the four GDD authority tables so screen specs cite one place.

Specification:

Effect Timing Source
Swing / whiff anim + sound, blade trail, recovery lockout, dash stretch-blurPredicted (owner, instant)combat Rule 8
Impact VFX, hitstop (local), Stagger White, knockback, damage number, death / DownedHost-confirmedcombat Rule 8
Harvest swing anim / soundPredictedharvesting
Crack stage, yield burst, yield flyout, bag flashHost-confirmedharvesting
Ghost state, grid, build-mode enter / exit cuePredictedbase building
Placement thunk + squash / settle + structure; demolish sound + removal; refundHost-confirmedbase building
Craft stance + fill (#11); stance-break cancelPredictedcrafting
Completion thunk + item + maker's markHost-confirmedcrafting
Own CARRY changes from own actions — harvest gain, craft output, demolish refund, deposit-side removalPredicted (owner rail)inventory
Storage → bag withdraws (item appears in the bag)Host-confirmed only — not predicted (ruled 2026-08-30, #13)inventory
Storage contents, who-took-what tags, any other player's inventoryHost-confirmed onlyinventory
Bag pulse — the bag-full no-op cue (#7 family a, #17)Predicted (owner, instant — the client knows its own bag)harvesting / inventory
Revive ring fillPredicted, resynced from replicated statecombat / ADR-0015
Revive completion, cancel-by-damageHost-confirmedcombat

When to Use: every screen spec cites this table for each effect it introduces. When NOT to Use: no exception exists.

Standard Control Patterns (continued)

20. Rebind Row

Category: Standard · Status: Draft Used In: Settings → Controls (design/ux/settings.md; ADR-0014's screen; behaviour fixed by ADR-0007 §4 as amended 2026-08-31)

Description: One row per action per scheme: action name · current binding glyph · Rebind button. Swap-on-confirm conflicts, protected actions, and a reset floor that works with no bindings at all.

Specification:

When to Use: control rebinding. When NOT to Use: in-game (title / pause settings only); the UI map (Unity's reference set, not rebindable); aim-persistence or deadzone tuning (those are input.json knobs, not bindings — a deadzone slider is a Tier 1 settings item).

25. Slider

Category: Standard · Status: Draft Used In: Settings → Display (Brightness, HUD opacity), Audio (Music / SFX / UI) — design/ux/settings.md; Tier 1: deadzone / aim-sensitivity

Description: A stepped linear control with an always-visible numeric readout. The number is the read; the track is the affordance. Every step applies live.

Specification:

When to Use: any bounded numeric setting (volume, gamma, opacity, deadzone). When NOT to Use: for anything in-world (no gameplay value is a slider — Pillar / tuning knobs are data, not UI); for timers; where finer than the step is wanted (the step is the design); where two states suffice (#26).

26. Toggle

Category: Standard · Status: Draft Used In: Settings → Display (VSync — provisional), Audio (Mono), Accessibility (Reduced motion, Flash reduction, Revive toggle-hold) — design/ux/settings.md

Description: A two-cell switch [ OFF | ON ]. The active cell is filled and carries the word, so the state reads by word + fill — never by colour or knob position alone.

Specification:

When to Use: any binary setting. When NOT to Use: three or more options (#27); an action (#1); any in-world state (nothing in the world is a switch); as a checkbox list (none exist).

27. Option Cycler

Category: Standard · Status: Draft Used In: Settings → Controls (Scheme), Display (Window mode, Resolution — provisional), Accessibility (UI scale) — design/ux/settings.md

Description: ◂ value ▸ over a short, fixed, ordered list. No wrap: the arrow at an end turns dashed. The project's answer to every "dropdown" — nested popups do not exist (#3: one panel at a time).

Specification:

When to Use: 2–6 discrete named options whose set is known and short. When NOT to Use: more than ~6 options (a #2 list — none needed at MVP); numeric ranges (#25); binary (#26); anything that would tempt a popup / dropdown (never).


Animation & Sound Standards

Animation (art bible §7.5, binding):

Sound (GDD audio rows; desirable, not MVP-blocking unless a GDD says otherwise):


Gaps & Patterns Needed

Gap Needed by Owner / next step
~~Stack Grid~~ — added as #21 (2026-08-31, from design/ux/inventory.md)—done
Ping action — not in ADR-0007's action list#15ADR-0007 amendment (MMB / R3 proposed; must exist in both schemes)
Toggle-hold accessibility option for #10accessibility tierdesign/accessibility-requirements.md (queue item ⑤)
~~HUD composition~~ — closed by hud.md (corner clusters, centre clear)—done 2026-08-31
~~Hotbar / equipped-tool row~~ and ~~dash-cooldown glyph~~ — closed by hud.md E3 / E2 (HUD-owned elements; numbers #22–23 released, not used)—done 2026-08-31
~~Party HP row~~ — closed by hud.md E1 / E4 (pips + hat glyph)—done 2026-08-31
~~Interact prompt~~ — added as #24 (from hud.md E11, 2026-08-31)—done
~~Slider / Toggle / Option cycler~~ — added as #25 / #26 / #27 (2026-08-31, from design/ux/settings.md; the ten MVP settings controls all have a pattern)—done
~~Equipped-gear wear indicator~~ — closed by hud.md E3 (frayed-corner accent on the hotbar slot; HUD-owned, no separate pattern)—done 2026-08-31
Crack-stage feedback — node depletion read on the node itself (harvesting UI Requirements: never a HUD bar); today only a #19 rowfirst harvesting presenter storyadd as pattern #28 (world-space state read; states = swingsTotal stages + husk)
Dashed-outline segment:gap ratio (#8) and the ghost strip-to-black testart-bible fix-passart-director
Deadzone / aim-sensitivity sliders in settingsTier 1ADR-0014 / settings screen spec
Character stepper — a ~32-value wrapping glyph stepper (title-screen.md's six join-code steppers). Runs well outside #27's "2–6 discrete named options … no wrap" envelope: it wraps (a character ring has no end), Submit does not step it, and six-in-a-panel is a different geometry from #27's single 260 px controlif a second screen ever needs code / serial entrycandidate; today a title-screen-local deviation from #27, declared in that spec
Text input field — no pattern exists; the library's own standard-control list names one. Needed by: world renaming (Tier 1, title-screen.md OQ 3). Not needed by the join panel — that was deliberately built from #27 steppers (a join code) so it stays gamepad-operableTier 1/ux-design when renaming lands; if any screen ever needs free text, this must be authored first
Screen-level notice slot — a persistent-until-next-input, latest-wins fact line owned by a screen rather than a control (title-screen.md Z3). #6 governs tone and per-cause content but its placements are all control-adjacent (ghost / rows / storage / revive)if a second screen needs onecandidate; today a title-screen-local slot
Invisible timed hold — a hold with no progress feedback by design, because it must work when nothing renders (the ADR-0007 §4 reset floor). #10 assumes a visible filling readonly if a second one appearsdocumented in title-screen.md; #10 explicitly does not cover it
Two-step in-place arm (label-swap confirm — pause.md's End session: press → armed label → press again; deliberate-move disarm + 5 s revert)only if a second screen ever needs onecandidate #32; today a pause.md-local mechanism borrowing #9's principle (preview the consequence in place, never a dialog)

Open Questions