19 KiB
Tables Frontend Overhaul Implementation Plan
Purpose
This document turns the vision in tables_ux_bible.md into an execution plan for the current Blazor Web App frontend in src/RolemasterDb.App.
It is intentionally implementation-focused:
- clear task breakdown
- explicit acceptance criteria
- concrete definition of done
- reasonable implementation order
- minimal churn to the existing backend and API contracts
Source Inputs
- tables_ux_bible.md
- current Blazor app shell and routes in
src/RolemasterDb.App/Components - current API and view models in
src/RolemasterDb.App/Features
Constraints
- keep the current tech stack
- keep the current backend and API contracts
- keep the current critical-table data model and curation workflow as the domain foundation
- treat route and UI changes as frontend/presentation refactors unless an additive backend endpoint is explicitly approved later
- keep changes incremental and shippable by phase
Target Outcomes
The overhaul is complete when the app behaves as one coherent product with four clear destination families:
Playfor live lookup and fast resolutionTablesfor reference and inspectionCurationfor queue-based repair workToolsfor diagnostics and API documentation
The new shell, navigation, spacing, theming, and interaction grammar must be reusable for future pages.
Overall Definition Of Done
The frontend overhaul is done when all of the following are true:
- the app uses a shared design system with explicit light, dark, and system themes
- the primary navigation matches the UX bible and no longer reflects implementation buckets
/tablesis browse-first, selection-driven, and free of resting-state cell action clutterCurationis a dedicated queue-first workflow rather than ambient clutter insideTables- diagnostics and API docs are grouped under
Tools PlayandTablesshare the same shell and interaction model- deep links preserve object context for key user journeys
- keyboard, focus, contrast, responsive behavior, and sticky layout behavior meet the UX bible rules
- the solution is maintainable, with the current monolithic
Tablespage split into reusable components and services
Delivery Strategy
Implement in vertical slices, not by page-wide rewrites. Each phase should leave the app in a buildable, reviewable, and partially usable state.
Recommended order:
- foundation and shell
- shared state and deep-link infrastructure
Tablesreference experienceCurationworkflowToolsconsolidationPlayalignment- hardening, QA, and rollout cleanup
Phase 0: Discovery And Technical Baseline
Goal
Create the implementation foundation so the visual overhaul does not start with uncontrolled edits in page files.
Tasks
P0.1Audit current component ownership inComponents/Layout,Components/Pages, andComponents/Shared.P0.2Identify which behaviors already exist and should be preserved:- selected table persistence
- cell editor and curation dialogs
- diagnostics selection model
- lookup forms and result cards
P0.3Define the target frontend structure for the overhaul.P0.4Decide the new route map and compatibility redirects.P0.5Define a shared frontend state strategy for:- theme
- recent tables
- pinned tables
- selected table context
- deep-link parsing and serialization
P0.6Define component boundaries for shared primitives before major page work starts.
Deliverables
- agreed route map
- agreed component and state boundaries
- agreed migration path from current shell and pages
Acceptance Criteria
- every planned frontend surface has an explicit owner component or service area
- route compatibility is defined before navigation work begins
- there is a clear plan for what stays in page components versus what moves to shared services/components
Definition Of Done
- no unresolved structural ambiguity remains around shell, routes, state ownership, or shared primitives
Phase 1: Design System And Application Shell
Goal
Establish the shared shell, tokens, typography, and theme system that every destination will inherit.
Tasks
P1.1Replace the current token set inwwwroot/app.csswith a semantic token system aligned to the UX bible:--bg-*--surface-*--text-*--border-*--focus-*--shadow-*- accent ramp
- success ramp
- warning ramp
- danger ramp
- info ramp
P1.2Update typography to:Frauncesfor display and section titlesIBM Plex Sansfor body and UI labelsIBM Plex Monofor diagnostics and code
P1.3Implement theme modes:LightDarkSystem
P1.4Persist theme preference in browser storage.P1.5Replace the current sidebar-first layout with a responsive shell:- top app bar on desktop
- mobile top bar
- mobile bottom nav
P1.6Add global shell slots for:- app mark
- primary destination nav
- omnibox trigger or field
- recent/pinned shortcut slot
- theme/settings/help utilities
P1.7Add a skip link and ensure main-content landmarks are valid.P1.8Keep tools visually separated from play-facing surfaces through styling and labeling, not a separate app.
Deliverables
- global shell component(s)
- theme service or equivalent state holder
- revised design token layer
- updated app typography
Acceptance Criteria
- the app no longer depends on the old permanent navigation rail for primary navigation
- theme selection survives reload
- light and dark themes are intentionally designed, not simple inversion
- sticky top navigation does not obscure page content
- the shell works at 375px, 768px, 1024px, and 1440px without horizontal overflow
Definition Of Done
- all pages render inside the new shell
- primary navigation shows
Play,Tables,Curation, andTools - the app has a stable theme system and global spacing/typography rules
Phase 2: Shared Navigation, Search, And State Infrastructure
Goal
Build the shared interaction infrastructure needed by multiple destinations before page-specific UI work deepens.
Tasks
P2.1Implement the frontend route structure:- keep
/ - keep
/tables - add
/curation - add
/tools - move diagnostics and API docs under
/tools/...
- keep
P2.2Add compatibility redirects or navigation helpers for old/diagnosticsand/apilinks.P2.3Implement a shared recent-items model for critical tables.P2.4Implement pinned tables state and persistence.P2.5Implement deep-link parsing and URL serialization for table context:- table slug
- group key
- column key
- roll band or roll jump
- selected cell result id
- mode
P2.6Build an omnibox foundation that can support:- table search
- recent items
- pinned items
- slash commands
P2.7Create shared primitives for:- chips
- tabs
- app-bar actions
- drawers or sheets
- inspector sections
- status indicators
P2.8Create a shared table-selection service or helper soTables,Curation, andToolsdo not each reinvent selection logic.
Deliverables
- route updates
- local storage persistence helpers
- omnibox/search primitives
- shared state services/helpers
Acceptance Criteria
- direct links into a selected table context can be opened and restored reliably
- recent and pinned tables are available to any page that needs them
- diagnostics and API docs remain reachable via new tools routes
- shared controls exist before page-specific implementations duplicate them
Definition Of Done
- common navigation and state concerns are implemented once and consumed from shared code
Phase 3: Tables Reference Experience
Goal
Turn /tables into the canonical reference surface for reading and inspecting critical tables quickly.
Tasks
P3.1Split the currentTables.razorinto smaller components:- page header
- table index rail
- sticky context bar
- table canvas
- inspector
- filter and mode controls
P3.2Replace the current dropdown table picker with a searchable left rail.P3.3Add table index behavior:- search-as-you-type
- keyboard arrow navigation
- enter to open
- pinned group
- recent group
- all tables list
- status chip showing curated percentage
- optional family filters
P3.4Build the sticky context bar with:- current table title
- variant selector when applicable
- roll jump input
- optional severity focus
- mode tabs
- filter chips
P3.5Rework the table canvas for reference reading:- sticky top headers
- sticky left roll-band column
- active row emphasis
- active column emphasis
- selected cell focus treatment
- optional roll-jump marker
- density toggle
P3.6Remove resting-state button clutter from cells.P3.7Move cell actions to a selection-driven inspector and optional compact selected-cell affordances.P3.8Build the right inspector on desktop and bottom-sheet inspector on mobile.P3.9Rework legend/help so it is on-demand and secondary to the canvas.P3.10Hide maintenance and developer noise in defaultReferencemode.P3.11Preserve the current full editor and curation entry points, but expose them from the inspector instead of per-cell button stacks.P3.12Ensure one-tap or one-click selection works the same on desktop and touch.
Deliverables
- new
Tablespage composition - left rail selector
- sticky context bar
- selection-driven inspector
- deep-link-aware table state
Acceptance Criteria
- a user can open a table in one search action from the index rail or omnibox
- a user can jump to a roll using a dedicated roll field
- the selected row, column, and cell are visually obvious
- a result can be read without opening a modal
- no action in
Tablesdepends on hover-only discovery - non-selected cells remain visually quiet
- mobile keeps the same task model using sheets instead of a persistent inspector
Definition Of Done
/tablesis browse-first, not edit-first- the grid is visually dominant and the inspector is secondary
- resting cells contain state hints, not visible action stacks
Phase 4: Curation Workflow Surface
Goal
Create a dedicated queue-first curation workflow so repair work is fast and does not pollute the reference experience.
Tasks
P4.1Create the new/curationpage and route.P4.2Reuse shared table/context selection patterns from Phase 2 and Phase 3.P4.3Define queue scopes:- all tables
- selected table
- pinned set
P4.4Build a stable queue-first layout with:- current queue item summary
- source image
- parsed preview
- quick parse area
- save-and-advance actions
P4.5Move the current “next uncurated” logic into the dedicated workflow surface.P4.6Keep full editor access available, but make quick parse and mark curated the fast path.P4.7Ensure save-and-advance keeps the user in the same workflow lane without reopening context.P4.8Use warning styling only for disruptive repair actions, not for normal save flow.P4.9Hide developer-only diagnostics from the normal curation workflow.
Deliverables
/curationpage- queue-first layout
- integrated save-and-advance flow
- quick parse in-context workflow
Acceptance Criteria
- a curator can move from one uncurated cell to the next with one primary action after save
- source and parsed result are visible side by side on wide screens
- quick parse can be completed without opening the full editor for common cases
Tablesno longer carries the primary queue-work burden
Definition Of Done
- curation is a dedicated workflow page with a stable repeated interaction loop
Phase 5: Tools Consolidation
Goal
Separate diagnostic and developer tooling from player-facing flows without losing deep-link usefulness.
Tasks
P5.1Create aToolslanding page.P5.2Move diagnostics to/tools/diagnostics.P5.3Move API documentation to/tools/api.P5.4Reuse shared selection and table-context patterns so tooling feels related but distinct.P5.5Add cross-links back toTablesandCurationpreserving object context where possible.P5.6Keep raw JSON, parser provenance, and deep inspection limited to tooling surfaces.P5.7Style tooling surfaces with the shared system but with the subdued “cool slate” tooling emphasis defined by the UX bible.
Deliverables
Toolshub- migrated diagnostics page
- migrated API docs page
- context-preserving navigation back into reference and curation views
Acceptance Criteria
- diagnostics and API docs remain bookmarkable
- player-facing pages no longer expose raw payload inspection
- a developer can inspect a cell in tools and jump back to its reference or curation context
Definition Of Done
- developer-facing tools are clearly separated in both navigation and presentation
Phase 6: Play Alignment
Goal
Make the default landing experience feel like part of the same product and connect it to the new reference surfaces.
Tasks
P6.1Reframe the current home page asPlay.P6.2Apply the new shell, typography, spacing, token, and action hierarchy to lookup forms and results.P6.3Reorganize the page to prioritize fast resolution over dashboard-like symmetry.P6.4Add deep links from lookup outcomes intoTableswhere the user wants to inspect the underlying critical result.P6.5Ensure player-facing copy avoids maintenance terminology.P6.6Preserve current lookup behavior and contracts while improving layout, clarity, and action priority.
Deliverables
- updated
/page within the new shell - unified visual and interaction system
- result-to-table deep-link paths
Acceptance Criteria
- a lookup result can lead directly into the relevant table context
Playshares the same design language asTablesandCuration- the primary action on the page is always obvious
Definition Of Done
PlayandTablesfeel connected, not like separate demos
Phase 7: Hardening, Accessibility, Performance, And Rollout Cleanup
Goal
Stabilize the overhaul and ensure the final UX matches the bible under real usage conditions.
Tasks
P7.1Review keyboard reachability for all app-bar actions, chips, tabs, table index items, table cells, inspector actions, and drawers.P7.2Verify visible focus states across light and dark themes.P7.3Verify contrast and accent-vs-semantic color distinction in both themes.P7.4Test sticky headers, sticky context bars, inspectors, and sheets across target breakpoints.P7.5Verify no page content is obscured by fixed or sticky shell elements.P7.6Verify deep links round-trip correctly acrossPlay,Tables,Curation, andTools.P7.7Verify last-used context persistence per destination.P7.8Measure table-switch and inspector-open performance and optimize obvious hotspots.P7.9Introduce virtualization only if profiling shows it is required and sticky behavior remains intact.P7.10Remove obsolete CSS and component paths left behind by the old shell or old/tablesflow.P7.11Update documentation to reflect the final route map and shell model.
Deliverables
- accessibility review pass
- responsive review pass
- performance review pass
- cleaned-up documentation and obsolete styles/components removed
Acceptance Criteria
- keyboard-only usage is viable for the major reference and curation flows
- the app has no hover-only critical actions
- mobile hit targets are at least 44x44 px on primary controls
- there is no horizontal page overflow except intentional table-canvas panning
- table switching feels fast after initial load
Definition Of Done
- the overhaul is stable, accessible, responsive, and cleaned up for future extension
Cross-Cutting Technical Tasks
These tasks should be scheduled alongside the phases above rather than saved for the end.
Component Architecture
- extract new classes and services into their own files
- keep page components thin and move reusable logic into helpers/services
- favor shared components over repeated markup in page files
State Management
- centralize local storage keys
- avoid duplicating route parsing logic across pages
- keep selection state deterministic and serializable
Visual Consistency
- use shared button hierarchy and chip patterns
- reserve warning and danger styles for true risk states
- ensure tools, curation, and reference surfaces differ through emphasis, not through unrelated styling systems
Accessibility
- use semantic headings in order
- use true button and link elements for interactions
- only use grid semantics if keyboard behavior matches the semantics
Documentation
- update related docs when route names, page responsibilities, or user flows materially change
Proposed Task Sequencing Within The Repo
This is the recommended execution order at file and module level.
- create shared theme, shell, and app-bar primitives
- update root app layout and route structure
- add shared state helpers for theme, recents, pins, and deep links
- migrate diagnostics and API routes into the
Toolsshape with compatibility handling - split
Tables.razorinto focused components and land the new reference mode - add the dedicated
Curationpage reusing shared selectors and editor flows - align
Home.razorintoPlay - remove obsolete shell and
/tablesimplementation fragments - complete accessibility, responsive, and performance hardening
Milestone-Based Acceptance Summary
Milestone A
Foundation is accepted when the new shell, theme system, and route structure are in place without breaking basic navigation.
Milestone B
Tables is accepted when a gamemaster can locate a table, jump to a result, and read it without modal friction or cell-level chrome clutter.
Milestone C
Curation is accepted when a curator can save and advance through a stable queue flow without using Tables as the primary repair surface.
Milestone D
Tools is accepted when diagnostics and API documentation are grouped under tooling routes and do not pollute player-facing flows.
Milestone E
The overhaul is fully accepted when Play, Tables, Curation, and Tools all share the same shell, theme, navigation grammar, and deep-link model.
Non-Goals For This Plan
- changing the backend data model
- redesigning API contracts
- adding speculative admin surfaces not described in the UX bible
- introducing a new frontend framework
- forcing virtualization before actual profiling justifies it
Recommended First Implementation Slice
Start with a narrow but high-leverage slice:
- semantic tokens and theme persistence
- top app bar and mobile bottom nav
- route restructuring for
Tools - shared state helpers for recents, pins, and deep links
- extraction of
/tablesshell pieces without yet rewriting every detail of the canvas
This sequence reduces risk because it establishes the shared infrastructure before the most complex page rewrite.