feat(mapgen-studio): token-driven chrome, a11y landmarks/live-regions/aria, and OptionSelect adapter#1613
Merged
Merged
Conversation
This was referenced Jun 12, 2026
refactor(studio): decompose App.tsx non-React corpus into feature modules and shared utilities
#1608
Merged
Merged
|
Railway preview (MapGen Studio): not provisioned for this PR. Policy (Graphite stacks): previews are created only for the top-of-stack PR by default.
Debug: |
Owner
Author
This was referenced Jun 12, 2026
Merged
This was referenced Jun 12, 2026
Merged
mateicanavra
force-pushed
the
design/craft-a11y
branch
from
June 12, 2026 20:44
6b6dd12 to
ffb68cf
Compare
Owner
Author
Merge activity
|
mateicanavra
changed the base branch from
design/test-harness-fix
to
graphite-base/1613
June 12, 2026 21:06
…, token selects) Presentation + accessibility only; no behavior, logic, or parity-critical flow changes. - AppFooter: restore operational diagnostics (run-in-game request id/phase/ failure/recovery, save/deploy status, live-sync + autoplay hints) onto the visible triggers as aria-label/title so they are present for assistive tech and in static markup, not hover-only TooltipContent. Footer carries its own TooltipProvider. Fixes the 8 red AppFooter static-markup assertions (token- align the stale border-orange-400 assertion to border-warning). - ErrorBanner: role=alert + aria-live=assertive; StudioShell adds a polite visually-hidden live region mirroring run/live status. - Landmarks: <main aria-label="Map preview">, docks as <aside>, skip-to-main link as first focusable element. - aria-expanded/aria-controls on ExplorePanel/RecipePanel/AppHeader collapsible headers; aria-current on active Stage/Step/Layer items; aria-pressed on render-mode/space toggles. - Migrate AppHeader + RecipePanel select call sites to the token-driven Radix Select via a new OptionSelect adapter; re-skin rjsf widgets onto src/ components/ui primitives (drops lightMode + off-token ring-gray-400). Remove dead legacy AlertDialog. - Adopt named type scale (text-data/text-label) over text-[Npx]; token- reference CanvasStage backdrop + intentional 'awaiting matter' graticule framing, drop the lightMode chrome ternary. OpenSpec: mapgen-studio-craft-a11y. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mateicanavra
force-pushed
the
design/craft-a11y
branch
from
June 12, 2026 21:08
ffb68cf to
84c1ea8
Compare
This was referenced Jun 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This PR delivers a presentation and accessibility pass over the Mapgen Studio chrome. No behavior, data contracts, or generation logic are changed.
Accessibility
AppFooter diagnostics restored for assistive tech and static markup. The prior Radix Tooltip migration moved operational diagnostics (Run-in-Game request id, failure reason, save/deploy status, live-sync hint, autoplay hint) into hover-only
TooltipContent, making them invisible to screen readers and absent from static markup. Each diagnostic is now mirrored onto its visible trigger viaaria-labeland an in-DOMtitle. The footer wraps its ownTooltipProviderso hints work in bare-mount test contexts without an ancestor provider, fixing the 8 previously-failing static-markup parity assertions.Landmark structure and skip link. The deck.gl canvas host is wrapped in
<main aria-label="Map preview">. The left and right docks are rendered as<aside>elements with descriptive labels. A visually-hidden skip-to-main link is the first focusable element in the shell.Live regions.
ErrorBannergainsrole="alert"andaria-live="assertive". A visually-hiddenaria-live="polite"region inStudioShellmirrors the volatile run/live/operation status without stealing focus.Disclosure and selection state.
aria-expandedandaria-controlsare added to the collapsible section headers inExplorePanel(Stage, Step, Layers),RecipePanel(Recipe, Config), andAppHeader(Setup). Active Stage, Step, and Layer items exposearia-current; render-mode and space toggle buttons exposearia-pressed.Token-driven controls
OptionSelectadapter. A thinOptionSelectcomponent wraps the token-driven RadixSelect(src/components/ui/select) behind the simplevalue/onValueChange/optionsshape the legacy native<select>used. Empty option values map to an internal sentinel so Radix's non-empty value requirement is satisfied while the visible placeholder and emitted values are unchanged.AppHeader and RecipePanel selects migrated. World Size, Players, Config, Resources, Leader, Civilization, Difficulty, and Game Speed dropdowns in
AppHeader, and the Recipe and Config dropdowns inRecipePanel, all move from the legacylightModenative select toOptionSelect. ThelightModeprop is dropped from these call sites.RJSF override widgets re-skinned.
TextWidget,TextareaWidget,NumberWidget,SelectWidget,CheckboxWidget,SwitchWidget, andTagSelectWidgetare rebuilt on thesrc/components/uiprimitives. ThelightModeprop and off-tokenring-gray-400are removed. TheSelectWidgetuses the same sentinel mapping asOptionSelect. Enum-to-typed-value mapping andemptyValuenormalization are preserved byte-for-byte.Stage craft and type scale
Token-referenced
CanvasStagebackdrop. The hard-codedlightModehex ternary for the backdrop is replaced withbg-background. The radial vignette and grid are drawn using--muted-foregroundat low alpha (luminance, not chroma).lightModeis still forwarded toDeckCanvasbecause it governs deck.gl scene rendering."Awaiting matter" empty state. The bare centered "Click Run to generate a map" text is replaced with a contour-framed panel over a coarse graticule field, so the empty stage reads as a ready survey console rather than dead space.
Named type scale. Ad-hoc
text-[10px]andtext-[11px]utilities inAppHeader,RecipePanel, andExplorePaneladopt thetext-labelandtext-datatokens.Dead code removed
The unused
src/ui/components/ui/AlertDialog.tsx(a hand-rolled re-implementation with no importers) and its barrel re-export are deleted.