HUD Design: Driftlands
Status: Reviewed — APPROVED (
/ux-reviewfinal pass 2026-08-31: 0 blocking, 1 cosmetic advisory — applied) · v0.4
Author: Jeroen + ux-designer
Last Updated: 2026-08-31
Template: HUD Design (project template.claude/docs/templates/hud-design.md)
Platform Target: PC 16:9 baseline (1080p / 1440p); KB/M primary, gamepad secondary; no touch
Requirements input: art bible §7.1 closed screen-space list (verbatim in ui-hud quick-spec Rule 1); combat, harvesting, crafting, base-building, tide UI Requirements; ui-hud quick-spec Rules 2–7; camera quick-spec forward ref (ultrawide/letterbox policy)
Patterns used: #7 Honest No-Op Cue · #14 Edge Indicator · #15 World Ping · #16 Compass Tide-Glint · #17 Carry Meter · #18 Confirmed Number Flyout · #19 Feedback Split — plus the HUD-owned gaps this spec closes: hotbar / equipped-tool row, dash-cooldown glyph, party HP row, equipped-gear wear indicator
Related specs:design/ux/inventory.md(APPROVED),design/ux/interaction-patterns.md,design/accessibility-requirements.md
HUD Philosophy
The world says it; the HUD says only what the world can't. Tide state is the palette, danger is a telegraph, base status is the base, richness is prop density (art bible §7.1). Screen space earns an element only by failing the two-part test — not visible from where the player stands, or needs precision the silhouette can't carry — and the resulting list is closed: own health, dash cooldown, equipped-tool/hotbar, party health, off-screen party status, carry capacity, compass tide-glint. Adding to it is an art-bible amendment, not a UI ticket.
"Minimal HUD" is never read literally in combat: the seven items are the combat floor, not a maximum to whittle down. Everything else (flyouts, the bag pulse, the Downed banner, a ping, the interact prompt, the revive ring) is a cue, not an element. The test is anchored to a world cause, not short-lived: a cue lives at the interactable, the hit point, or the screen edge nearest its cause — never at a screen anchor — so an interact prompt that persists while you stand at a chest is still outside the screen-space closed list. It leaves without a trace when its cause does. No element ever fades in or out with game state (§7.5: nothing animates that gates an input; nothing the player might need is hidden by a density rule). The HUD carries no numbers the GDDs keep hidden and no timers the tide forbids.
Information Architecture
Full Information Inventory
Every item the GDDs say must reach the player on screen, with its source:
| # | Information | Source |
|---|---|---|
| 1 | Own HP | combat UI Requirements |
| 2 | Dash cooldown — glanceable, never a number | combat UI Requirements |
| 3 | Equipped weapon / armor, incl. wear state | crafting UI Requirements; closed list "equipped-tool/hotbar" |
| 4 | Party HP (2–5 players) | combat UI Requirements |
| 5 | Off-screen ally direction + identity | art bible §7.2 |
| 6 | Carry capacity | harvesting UI Requirements; art bible §7.1 |
| 7 | Tide direction + temperature when the shore is off-screen | tide UI Requirements; §7.1 |
| 8 | Downed ally — where and who | combat UI Requirements |
| 9 | Damage dealt / taken; harvest yield | combat + harvesting UI Requirements |
| 10 | Bag-full no-op | harvesting OQ6 |
| 11 | Ping marker | art bible §7.2 |
| 12 | Enemy telegraph / threat | combat |
| 13 | Enemy HP / stagger | combat |
| 14 | Node richness / depletion / location | harvesting |
| 15 | Tide timer / countdown / progress | tide AC-27 |
| 16 | Base status / structure state | base building |
| 17 | Build-mode ghost, grid, reason strings, picker | base building |
| 18 | Recipe reasons, craft progress, maker's mark | crafting |
| 19 | Interact prompt ("E: open") | inventory / crafting / BB interactables |
| 20 | Input-scheme glyphs | ADR-0007 (InputFrame.Scheme) |
Categorization
| Category | Items | Rationale |
|---|---|---|
| Must Show (7 — exactly the closed list) | 1 own HP · 2 dash cooldown · 3 hotbar (weapon/armor + wear) · 4 party HP · 5 off-screen allies (#14, when off-screen) · 6 carry capacity (#17) · 7 tide-glint (#16, when the shore is off-screen) | art bible §7.1 inclusion list; no conflict with the philosophy |
| Contextual | 8 Downed ally (#14 variant + 3 s banner) · 9 flyouts (#18, world-space) · 10 bag-full pulse (#7 family a, on #17) · 11 ping (#15 world-space + edge glyph) · 17 build-mode overlay (owned by the build-mode spec, queue ③ — not this document) · 19 interact prompt (defined in this spec, pattern gap #24) · 20 scheme glyphs (inside prompts only) | event-driven cues; appear at their cause |
| On Demand | 18 recipe / craft / maker's-mark detail | panels (inventory.md, crafting spec) — never HUD |
| Hidden (diegetic or banned) | 12 telegraphs (pose + crimson) · 13 enemy HP (banned at MVP) · 14 node values / minimap (banned) · 15 tide timer (impossible by API) · 16 base status (the base itself) | art bible §7.1; GDD bans |
Conflict check: Must Show count = 7 = the closed list. Nothing on the HUD is uncategorised.
Layout Zones
Arrangement: corner clusters, centre clear (ruled 2026-08-31).
┌──────────────────────────────────────────────────────────────┐ safe margin 32 px @1080p
│ Z3 PARTY column Z7 BANNER (transient, top-centre) │
│ ◉ Jo ████░ Z5 ▲ ally │
│ ◉ Alex ██░░░ edge band │
│ ◉ Mara █████ (24–56 px band) │
│▓ Z6 TIDE GLINT band (edge glow, 0–24 px, outside Z5's band) │
│▓ │
│▓ CENTRE 60 % × 60 % — never occupied │
│ │
│ │
│ Z1 VITALS + Z2 HOTBAR Z4 CARRY │
│ ♥♥♥♥♡ ◔ [⚔ axe][🛡 cloth] 🎒 7/10 │
└──────────────────────────────────────────────────────────────┘
| Zone | Position (anchor) | Contents | Priority |
|---|---|---|---|
| Z1 Vitals | bottom-left, anchored to the safe margin | own HP (E1), dash glyph (E2) | 1 |
| Z2 Hotbar | right of Z1, same baseline | weapon slot, armor slot + wear accent (E3) | 2 |
| Z3 Party | top-left column | one row per other player: hat glyph + HP (E4) | 3 |
| Z4 Carry | bottom-right | carry meter (E6, #17) | 2 |
| Z5 Ally edge band | all four edges, 24–56 px from the 16:9 frame edge (glyphs centred at 40 px) | #14 ally / Downed glyphs (E5), #15 off-screen ping glyph | 3 |
| Z6 Tide band | all four edges, 0–24 px from the frame edge — strictly outside Z5, incl. at corners (a glint is an edge glow, a glyph is inset; they never share a pixel) | #16 glint (E7) | 4 |
| Z7 Banner | top-centre | "[Name] is down" (E8, 3 s) | transient |
| World | at the cause's position | flyouts (E9), ping marker (E10), interact prompt (E11), revive ring (E12) | transient |
Safe zone: 32 px at 1080p (scales with UI scale). The centre 60 % × 60 % box is a hard exclusion for Z1–Z7 at every UI scale and aspect — measured as box intersection, not x-extent: Z1 + Z2 sit in the bottom 20 % band and clear the box vertically, so their horizontal reach (≈ 420 px at 150 %, past the box's 384 px left edge) is expected and harmless; Z3 clears it from the top band; Z4 from the bottom-right corner. (Corrected 2026-08-31 — the earlier "fits left of the exclusion" sentence was wrong.)
Aspect / ultrawide policy (camera quick-spec forward-ref, ruled here): 21:9 and wider render the world at full width — no pillarboxing; more world is harmless for a top-down camera at integer zoom — but all HUD anchors (Z1–Z7) stay on a 16:9-equivalent frame centred on screen, so corners never drift into far periphery. 4:3 / 16:10 letterbox to 16:9 at the nearest integer zoom (camera Rule 1). Edge bands (Z5/Z6) clamp to the 16:9 frame, not the physical edge. More visible world on ultrawide is not a fairness concern: the game is co-op with no PvP and no per-player comparison (ui-hud Rule 5); the alternatives (pillarboxing or non-integer zoom) would break camera Rule 1's silhouette calibration — a readability regression for everyone.
HUD Elements
| # | Element | Category | Zone | Form | Update | Pattern |
|---|---|---|---|---|---|---|
| E1 | Own HP | Must Show | Z1 | segmented pips | host-confirmed Hp | — |
| E2 | Dash cooldown / bleed-out arc | Must Show | Z1 | sweep ring | local dash state / replicated BleedOutRemaining | — |
| E3 | Hotbar (weapon, armor + wear) | Must Show | Z2 | two 48 px slots | equip / wear-flip events | closes gap "wear indicator" |
| E4 | Party HP | Must Show | Z3 | hat glyph + pips | replicated Hp per player | — |
| E5 | Ally / Downed edge indicator | Must Show (off-screen) | Z5 | hat / prone glyph | per frame | #14 |
| E6 | Carry meter | Must Show | Z4 | slate fill + n/N | CARRY change | #17 |
| E7 | Compass tide-glint | Must Show (shore off-screen) | Z6 | edge glow | per frame TintFloats | #16 |
| E8 | Downed banner | Contextual | Z7 | one text line, 3 s | PlayerDowned | — |
| E9 | Flyouts | Contextual | world | rising digits | SwingLanded / DamageAbsorbed / HarvestResolved | #18 |
| E10 | Ping | Contextual | world + Z5 | diamond + hat | ping event | #15 |
| E11 | Interact prompt | Contextual | world | glyph + verb + noun | nearest interactable in range | #24 (new) |
| E12 | Revive prompt / ring | Contextual | world | ring fill + prompt | revive channel | #10 |
E1 Own HP — Segmented pips, one per maxHp / 20 (cloth-tier 100 HP → 5; the count follows maxHp, never a fixed number), filled slate-light, empty = outline only. Pips over a bar: they read at a glance and scale with tier HP bands without a number. Hard bound (ruled 2026-08-31): maxHp / hpPerPip ≤ 8 is a load-validation rule (ADR-0006 stage 9, reject) — the two knobs are constrained jointly, like combat's swingWindup + swingActive; a tier whose HP band would exceed 8 pips must raise hpPerPip, never grow the strip. Losing a pip = a Stagger White one-frame flash on the pip (the shared impact language) + settle; gaining (home heal / revive) = pips fill in sequence 100 ms apart. Never a number, never red. Downed: pips grey, the bleed-out arc appears on E2. Dead / respawning: Z1 hidden until spawn.
E2 Dash cooldown — A small ring (◔) sweeping empty → full over dashCooldown (0.45 s), popping to a solid ring when ready; no number, no bar (combat UI Requirements: glanceable without reading numbers). Reduced-motion: two-state (hollow = cooling, solid = ready). While Downed the same position shows the bleed-out arc draining over bleedOutTimer — one glyph, two meanings, never simultaneous (Downed cannot dash). The arc is a world timer (combat Rule 9; accessibility-requirements.md Motor → "Input timing adjustments" rules it outside the tier's timed-input clause), not a tide readout — tide AC-27's no-timer ban is tide-scoped; it is non-textual and non-actionable, so it is not an auto-dismiss inventory item.
E3 Hotbar / equipped slots — Two 48 px slots (weapon, armor) with the item's tier-shaped ink icon (art bible §7.4). Wear indicator (closes the pattern-library gap): a frayed-corner accent on the slot outline while the item is worn — shape, never hue. Empty slot = dashed outline (unarmed 14 / no armor). Updates on equip / unequip and on the host-confirmed wear flip. Not interactive from the HUD (equip happens in the bag, inventory.md).
E4 Party HP — One row per other connected player (0–4): the player's hat silhouette glyph (§5.1) + E1's pip strip at 75 % scale. Downed = pips grey + prone glyph; Dead / at home = row stays, pips refill on respawn; disconnected = row removed. Order = join order, stable for the session. No names on persistent rows at MVP (the hat is the name for a friend group); names appear only in event copy — the Downed banner (combat UI Requirements, binding), storage tags (#13), maker's marks (#12).
E5 Ally / Downed edge indicator — pattern #14 exactly. E6 Carry meter — pattern #17 exactly. E7 Compass tide-glint — pattern #16 exactly (Z6 sits outside Z5 so glints and glyphs never overlap).
E8 Downed banner — "[Name] is down", Medium size, 3 s, world-fact tone; if two players go down within 3 s the lines stack (max 2, oldest on top). Reduced-motion: no fade.
E9 Flyouts — pattern #18; cull rule: when more than flyoutCap are live, cull the oldest globally, but never one anchored to the local player's own sprite (own damage-taken is decision-relevant; ally damage-dealt is not); #18's 100 ms offset-stacking applies before culling. E10 Ping — pattern #15 — BLOCKED on the ADR-0007 Ping amendment; if it does not land for MVP the element simply does not render (no layout or budget change — Z5 scales with occupancy). E12 Revive — pattern #10.
E11 Interact prompt (new pattern #24) — World-space, anchored 24 px above the nearest interactable while within interaction range and not in build mode: "E open chest" / "West-button glyph use workbench" — the glyph is resolved from the live binding of Interact in InputFrame.Scheme (ADR-0007: E / West by default; rebinding changes it — never an authored character), verb + noun in world-fact tone, Small size with the ink outline; exactly one prompt at a time (nearest candidate; ties → lowest instanceId); gone the frame the target leaves range or a panel opens. Never for enemies or nodes (strike is aim-driven; a prompt would imply a separate interact verb). Reduced-motion: no fade.
HUD States by Gameplay Context
| Context | Z1 Vitals | Z2 Hotbar | Z3 Party | Z4 Carry | Z5 Edge | Z6 Glint | Z7 / cues |
|---|---|---|---|---|---|---|---|
| Home, calm | ✓ | ✓ | ✓ | ✓ | ✓ if any ally off-screen | ✓ if shore off-screen | interact prompts near chests / stations |
| Docked land, exploring | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | yield flyouts; bag pulse |
| Docked land, combat | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | damage flyouts; nothing added, nothing removed — the closed list is the combat HUD |
| Downed (self) | pips grey; E2 = bleed-out arc | ✓ (greyed) | ✓ | ✓ | ✓ | ✓ | own banner suppressed (you know); revive ring appears when an ally channels |
| Dead / respawning | Z1 hidden until spawn | hidden | ✓ | ✓ | ✓ | ✓ | — |
| Build mode | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | interact prompt suppressed; ghost / grid / picker are the build-mode spec's overlay |
| Panel open (bag / storage / pause) | ✓ never dimmed (ruled 2026-08-31; pattern #3 layering) | ✓ | ✓ | ✓ | ✓ | ✓ | flyouts continue (the world is live); interact prompt hidden |
| Tide soft-close deposit | unchanged | violet held | no cue beyond the world (tone rule); the deposit is a hard camera cut | ||||
| Late-join / spawning in | Z1–Z4 appear with the spawn; Z3 populates from the snapshot | no loading spinner — the HUD is absent until the player exists |
No context hides a Must Show element except death (no body → no vitals). Nothing fades with combat state.
Dynamic Behaviors
- Density never changes by rule. The only movement is E5 / E7 appearing and vanishing as allies / the shore cross the screen edge (100–150 ms slide, #14) and E4 rows appearing on join / disappearing on disconnect (instant).
- Pip count follows
maxHp— a future tier raising HP adds pips, never a longer bar. - Hotbar reacts to equip / unequip instantly (owner-predicted) and to the wear flip on host confirmation (frayed corner appears; never a gradient).
- Thresholds: carry ≥ 80 % shake / 100 % thick outline (#17). HP at the last pip — no extra alarm (no low-HP pulse, heartbeat, or vignette; crimson and urgency effects are banned; the single grey-outlined pip is the state).
- Priority when cues collide: Downed banner > interact prompt > flyouts. Z5 ordering when two glyphs clamp to the same edge point: Downed ally > ping > ally.
Information Hierarchy
Priority tiers for the persistent HUD — what must survive every setting, context and conflict, and what replaces an element if it is ever suppressed.
| Tier | Elements | May be suppressed by | If suppressed, what carries the information |
|---|---|---|---|
| MUST KEEP — never suppressible | E5 Downed / ally edge glyphs (Z5), E8 Downed banner (Z7), E7 tide glint (Z6), E1 own HP, E2 while it shows the bleed-out arc | nothing — not opacity, not build mode, not panels, not any future density rule | — (a downed friend, your own HP and your own bleed-out are the Fellowship and survival floors; the glint is the only off-screen tide read) |
| SHOULD KEEP — player-adjustable only | E2 dash ring (when not Downed), E3 hotbar, E4 party HP, E6 carry meter | the HUD-opacity slider (50 % floor, never 0 %) — element-scoped, not zone-scoped: within Z1, E1 is exempt (ruled 2026-08-31) | still visible at 50 %; the world carries nothing equivalent, so they never fully hide |
| CUES — cause-bound | E9 flyouts, E10 ping, E11 interact prompt, E12 revive ring, bag pulse | their own lifetime / cause; the flyout cap; E11 also by build mode and any open panel (States table) | the world event itself (impact flash, the chest, the downed ally) |
| HIDDEN — never on screen | telegraphs, enemy HP, node values, tide timer, base status | — | the world (pose, silhouette, palette, structures) |
Cue collision order: Downed banner > interact prompt > flyouts; Z5 same-point order: Downed ally > ping > ally. The HUD-opacity slider is scoped to the SHOULD-KEEP tier by construction — i.e. E2 (not Downed), E3, E4, E6; never E1, never the bleed-out arc, never Z5 / Z6 / Z7.
Visual Budget
- Persistent: max 7 zones populated, ≤ 12 % of screen area at 100 % scale (Z1 + Z2 ≈ 3 %, Z3 ≤ 3 % at 4 rows, Z4 ≈ 1 %, edge bands ≈ 5 % as a 24 px ring).
- Transient (ruled 2026-08-31): ≤ 8 flyouts on screen (oldest culled), 1 interact prompt, 1 banner (≤ 2 lines), ≤ 4 ally glyphs + ≤ 4 pings in Z5, 1–4 glints in Z6.
- Centre 60 % × 60 %: 0 persistent elements; world-space cues may cross it (they belong to the world).
- Draw calls: the HUD is one UI Toolkit panel — well within the project's < 100 budget; world-space cues are sprites / outlined text batched per atlas.
Feedback & Notification Systems
There are no notifications. The HUD has exactly four feedback channels, all governed by pattern #19's authority table:
- Predicted, local — dash ring sweep; hotbar swap; carry-meter change from own actions; bag pulse (#7 family a).
- Host-confirmed — HP pips (own + party); flyouts (#18); wear flip; Downed banner + prone glyph; carry-meter bag flash; revive completion.
- Presentation-clock reads — tide glint (#16); never a gameplay input.
- Peer cues — ping (#15). (Storage who-took-what tags #13 live in the panel, not the HUD.)
No queueing beyond the banner (max 2 lines) and the flyout cap; nothing persists past its lifetime; no log, history, or toast tray. The HUD owns zero sounds — every HUD change is the visual half of a world event that already carries its own sound (#19).
Platform & Input Variants
- PC only. 1080p reference; 1440p / 4K scale via the UI-scale option (100 / 125 / 150 %), never by resolution alone (pixel-perfect ink outlines at integer multiples, art bible §8).
- Aspect: see Layout Zones — anchors on a centred 16:9 frame; ultrawide shows more world; 4:3 / 16:10 letterbox at integer zoom.
- Input scheme: the only scheme-dependent content is the glyph inside the interact (E11) and revive (E12) prompts — follows
InputFrame.Scheme, updates within one frame of a device switch. Nothing else differs between KB/M and gamepad; there is no "controller HUD". - No touch, no console safe-area variants.
Accessibility
Tier: Standard (design/accessibility-requirements.md).
- Non-interactive: no focus order — nothing on the HUD takes focus; the only HUD-adjacent action is the ping (#15).
- Colour-independence (rows in the colour audit or resolved here): HP = pip count + fill vs outline (never red); dash = ring shape (hollow / solid / sweep); wear = frayed-corner shape; party identity = hat glyph; carry = fill +
n/N+ outline weight; tide = position (+ Tier 1 mist); ping = diamond + hat; Downed = prone glyph + pulse + text banner. - Text: banner Medium 16–18 px; carry count Medium; prompts Small 13–14 px with the ink outline; contrast ≥ 4.5:1 on slate, ≥ 3:1 for world-space outlined text against amber / violet tint — verified in all three tide states before theme lock.
- Scale: every px value at 100 %; 125 / 150 % scales Z1–Z7 and the safe margin together; the centre-clear rule holds at 150 % as box intersection: Z1 + Z2 (≈ 420 px wide at 150 %) extend past the box's left x-edge (384 px) but stay in the bottom 20 % band, so they never intersect the 60 % × 60 % box (Layout Zones).
- Reduced motion: dash sweep → two-state; pip fill sequence → instant; edge slides → snaps; Downed pulse → thick static outline; flyout rise → static; banner fade → cut. Nothing on the HUD is on the accessibility keep-list.
- Flash reduction: the pip-loss Stagger White flash counts toward the ≤ 3/s cap alongside sprite flashes.
- HUD opacity (new, ruled 2026-08-31): 50–100 % on the SHOULD-KEEP elements only — E2 (when not Downed), E3, E4, E6. Element-scoped: E1 own HP (in Z1) and the bleed-out arc are exempt, and Z5 / Z6 / Z7 stay at 100 % — an opacity slider must never dim your own HP, your own bleed-out, or a downed friend.
- Screen reader: out of scope (documented limitation). Hearing: every HUD change is the visual half of a sounded world event — nothing here is audio-only.
Tuning Knobs
| Knob | Default | Range | Player-facing? | Owner |
|---|---|---|---|---|
uiScale | 1.0 | 1.0 / 1.25 / 1.5 | Yes (Settings) | accessibility-requirements |
reducedMotion | off | on / off | Yes | accessibility-requirements |
flashReduction | off | on / off | Yes | accessibility-requirements |
hudOpacity (E2-not-Downed, E3, E4, E6 only) | 1.0 | 0.5–1.0 | Yes — ruled 2026-08-31; needs an accessibility-doc row + the Slider pattern | this spec |
hpPerPip | 20 | 10–25 | No | combat (pip count = maxHp / hpPerPip; load rule: quotient ≤ 8) |
safeMarginPx | 32 | 24–48 | No | this spec |
centreExclusionFrac | 0.60 | 0.5–0.7 | No | this spec |
flyoutCap | 8 | 4–12 | No | this spec |
bannerSecs | 3 | 2–5 | No | this spec |
glintBandPx / glyphBandPx | 0–24 / 24–56 | 16–32 wide / 24–40 wide | No | this spec (bands never overlap; validated: glyph band starts at glintBandPx) |
partyPipScale | 0.75 | 0.6–1.0 | No | this spec |
All values live in assets/data/ui.json — a new file for ADR-0006's manifest (stage 9 rows: the ranges above as warnings). Nothing is hardcoded.
Acceptance Criteria
- [ ] A gameplay screenshot at 1080p / 100 % shows exactly the seven closed-list elements (own HP pips, dash ring, weapon + armor slots, party rows, carry meter, plus an edge glyph / glint only when an ally / the shore is off-screen) and nothing else persistent; no element intersects the central 60 % × 60 %.
- [ ] Losing 20 HP removes exactly one pip with a one-frame white flash; at
maxHp100 five pips are shown; a test config withmaxHp140 shows seven; a config withmaxHp / hpPerPip> 8 is rejected at load with a named error. - [ ] After a dash the ring sweeps and becomes solid at 0.45 s ± 1 frame; no number is ever rendered.
- [ ] Equipping a worn weapon shows the frayed-corner accent on the weapon slot within one frame; a fresh one shows none; an empty slot shows a dashed outline.
- [ ] When an ally walks off-screen their hat glyph appears at the edge within 150 ms; when Downed it switches to the prone glyph pulsing at 1 Hz and "[Name] is down" shows top-centre for 3 s.
- [ ] Opening the bag leaves Z1–Z7 fully visible (no dim) and flyouts keep appearing behind the panel.
- [ ] Standing within reach of a chest shows exactly one prompt 24 px above it whose glyph equals the current
Interactbinding (E on KB/M; West on a default gamepad; the rebound key after a rebind) followed by "open chest"; it disappears the frame the player steps out of range or opens any panel. - [ ] On a 21:9 display the HUD anchors sit on a centred 16:9 frame (Z1's left edge = (W − 16H/9)/2 + 32 px); on 4:3 the image is letterboxed at integer zoom.
- [ ] Reduced-motion on: the dash ring is two-state, edge glyphs snap, the banner cuts; flash reduction on: ≥ 4 pip losses within one second produce ≤ 3 flashes.
- [ ] At 150 % UI scale nothing overlaps and no Z1–Z7 element intersects the centre 60 % × 60 % box (Z1 + Z2 may extend past the box's left x-edge while staying below it); at 50 % HUD opacity the hotbar, party rows, carry meter and (when not Downed) the dash ring are half-transparent while own HP pips, the bleed-out arc when Downed, and Z5 / Z6 / Z7 stay opaque.
- [ ] The HUD contains no tide timer, no enemy HP, no minimap, no per-player counters (reflection over the HUD view-model + screenshot).
- [ ] HUD update cost ≤ 0.2 ms / frame on the reference machine with 4 party rows, 8 flyouts, and 4 edge glyphs.
Open Questions
- Player journey map not yet created (
.claude/docs/templates/player-journey.md) — the contexts above are assumed; validate at the playtest. - ~~HUD opacity sync~~ Done 2026-08-31: row + test in
accessibility-requirements.md; Slider gap in the pattern library now lists it. Pingbinding — E10 is specified but unbindable until the ADR-0007 amendment (MMB / R3).- Party rows carry no names — fine for a friend group; if the playtest shows hat glyphs get confused, show the name as a 2 s label beside the row on join. Playtest item.
- ~~Pip count at Tier 1~~ Ruled 2026-08-31:
maxHp / hpPerPip ≤ 8is a load rule; Tier 1 tuneshpPerPip, never the strip. - ~~Pattern #24 lift~~ Done 2026-08-31: #24 in
interaction-patterns.mdv0.5; wear / dash / party / hotbar / composition gaps closed by reference to E3 / E2 / E4 / E1. - ~~
ui.jsonneeds adding to ADR-0006's file list~~ — DONE 2026-09-01: ADR-0014 §8 definesui.jsonand the amendment is applied to ADR-0006 (§1 file list,Configs.Ui, stage 9 with ranges as warnings). Original note: incl. the two new stage-9 rules (pip quotient ≤ 8; glyph band starts atglintBandPx). - Art bible §4.5 says UI accents may borrow Ember Crimson for low health; this HUD bans any low-HP alarm (the grey pip is the state) per §7.1's carry-meter precedent and the tone rule. §4.5 amended 2026-08-31 with a one-line note; art-director to confirm at the next art-bible pass.