Cross-cutting Major enrichment from the 2026-05-29 audit pass. Rolls into and extends #174 (icon registry).
Symptom
The OpenWorldsIcon registry (the window.OpenWorldsIcon?.has?.(kind) + <window.OpenWorldsIcon id={kind} size={n} /> pattern in chrome.jsx:62-63) is used inconsistently. Many screens fall back to raw unicode glyphs or <Placeholder label={glyph_name}> even when an icon would render.
File:line — known usages where Icon should replace Placeholder/raw glyph
| File:line |
Current |
Should be |
screen-character.jsx:595 |
<Placeholder label={a.glyph}> |
<IconPlate glyph={a.icon}> (AbilityCard) |
screen-character.jsx:616 |
<Placeholder label={f.glyph}> |
<IconPlate glyph={f.icon}> (FeatRow) |
screen-character.jsx:753 |
<Placeholder label={sp.glyph}> |
<IconPlate glyph={sp.icon}> (Spell tile) |
screen-character.jsx:427 |
<Placeholder label={sp.glyph}> |
same (RestPrepareModal) |
screen-combat.jsx:194-200 |
mixed fallback icons "◈ ✺ ⊘" |
OpenWorldsIcon ids if registered |
screen-combat.jsx:597-599 |
iconNode = registry ? <Icon> : icon (string) |
use Icon when registered (already conditional) — ensure registry has the IDs |
screen-table.jsx:289-292 |
raw text "d20 d12 d8 d6" + optional icon |
guarantee dice.d20 dice.d12 dice.d8 dice.d6 in registry |
screen-map.jsx:625 |
conditional atlas.travel |
ensure registered |
camp-sidebar.jsx:418 |
<span style="...{icon}">{icon}</span> (one-char) |
use OpenWorldsIcon if available |
Acceptance criteria
- Audit the
OpenWorldsIcon registry (referenced by chrome.jsx) and confirm coverage for: dice.d20, dice.d12, dice.d8, dice.d6, dice.roll, atlas.travel, camp.rest, combat.attack, inventory.potion, inventory.locked, quest.scroll, codex.book, settlement.tavern, plus all 14 SRD conditions, all 5 damage types, all 5e classes (sigil), all 5e schools of magic.
- Replace
<Placeholder label={…glyph string…}> with <IconPlate glyph={…}> (or <OpenWorldsIcon id={…}>) in each of the rows above.
- Falls back to single-letter glyph or Placeholder ONLY when the icon is genuinely missing.
- Verified: Character → Abilities tab shows real glyphs (not "lay on hands" text placeholder).
Why it matters
Icons-as-text strings undermine the prestige-CRPG framing. The registry exists; it just isn't used consistently. Closing this lifts visual polish on 5+ screens at once.
Parent: #174 (icon registry). Per-screen epics: #246 #247 #250.
Umbrella: #242.
Cross-cutting Major enrichment from the 2026-05-29 audit pass. Rolls into and extends #174 (icon registry).
Symptom
The
OpenWorldsIconregistry (thewindow.OpenWorldsIcon?.has?.(kind)+<window.OpenWorldsIcon id={kind} size={n} />pattern inchrome.jsx:62-63) is used inconsistently. Many screens fall back to raw unicode glyphs or<Placeholder label={glyph_name}>even when an icon would render.File:line — known usages where Icon should replace Placeholder/raw glyph
screen-character.jsx:595<Placeholder label={a.glyph}><IconPlate glyph={a.icon}>(AbilityCard)screen-character.jsx:616<Placeholder label={f.glyph}><IconPlate glyph={f.icon}>(FeatRow)screen-character.jsx:753<Placeholder label={sp.glyph}><IconPlate glyph={sp.icon}>(Spell tile)screen-character.jsx:427<Placeholder label={sp.glyph}>screen-combat.jsx:194-200screen-combat.jsx:597-599iconNode = registry ? <Icon> : icon(string)screen-table.jsx:289-292dice.d20dice.d12dice.d8dice.d6in registryscreen-map.jsx:625atlas.travelcamp-sidebar.jsx:418<span style="...{icon}">{icon}</span>(one-char)Acceptance criteria
OpenWorldsIconregistry (referenced bychrome.jsx) and confirm coverage for:dice.d20,dice.d12,dice.d8,dice.d6,dice.roll,atlas.travel,camp.rest,combat.attack,inventory.potion,inventory.locked,quest.scroll,codex.book,settlement.tavern, plus all 14 SRD conditions, all 5 damage types, all 5e classes (sigil), all 5e schools of magic.<Placeholder label={…glyph string…}>with<IconPlate glyph={…}>(or<OpenWorldsIcon id={…}>) in each of the rows above.Why it matters
Icons-as-text strings undermine the prestige-CRPG framing. The registry exists; it just isn't used consistently. Closing this lifts visual polish on 5+ screens at once.
Parent: #174 (icon registry). Per-screen epics: #246 #247 #250.
Umbrella: #242.