PrompterOne.Shared contains the routed Razor UI, shipped runtime CSS assets, thin browser interop, and browser-side service wiring.
AppShell/Routes.razorAppShell/Layout/MainLayout.razorAppShell/Services/PrompterOneServiceCollectionExtensions.csEditor/*Library/*Learn/*Teleprompter/*GoLive/*Settings/*Diagnostics/*Media/*wwwroot/design/*Diagnostics/Services/BrowserConnectivityService.csDiagnostics/Components/ConnectivityOverlay.razorwwwroot/media/browser-media.js
- Keep markup aligned with the shipped routed UI patterns and shared runtime CSS assets.
- Do not add or depend on the deleted root
design/prototype folder. Final routed UI must be authored as Blazor components and C#-owned state in this project. - For parity work, fix the whole routed screen structure and intended interactions in Blazor instead of approximating only selected sections.
- Keep routed pages, feature components, renderers, and feature-local services inside their owning slice folders.
- Keep app-specific UI logic here, but keep business rules in
PrompterOne.Core. - User-facing library, editor, learn, and reader summaries must come from real TPS-derived metrics, never from
display_*metadata or other presentation-only hardcoded overrides. - Keep feature styles owned by their routed screen;
LearnandTelepromptermust not share one feature stylesheet manifest. - Preserve dedicated test selectors used by Playwright. Prefer
data-test-idfor new markup, allowdata-test, and do not churn existingdata-testidcontracts unless the task is an intentional migration. - Do not add server-only dependencies.
- Keep keyboard shortcuts, screen ids/selectors, and reusable UI constants in Blazor/C# contracts when possible; leave JS only with unavoidable browser API interop and direct DOM work that Blazor cannot replace cleanly.
- Prefer removing JS files that only orchestrate UI behavior, reader state, or shell interactions; keep those flows in Razor components or C# services and let JS expose only the minimal browser or SDK call surface.
- TPS 1.1.0 removed legacy inline color tags, so editor, reader, menus, examples, and tests in this project must not expose or insert
[red],[green], or other deprecated color-tag authoring paths. - Editor dropdowns and tooltips must read as structured surfaces: item rows need a consistent visual rhythm with aligned columns or spacing, and overlay surfaces need border contrast strong enough to separate them clearly from the editor background.
- Editor dropdown rows must stay compact menu rows, not stacks of tall rounded mini-cards; overlays may feel premium, but menu items still need fast scannable list rhythm.
- Dropdown item content across
PrompterOne.Sharedmust align from the left edge as one readable cluster; do not push tags, shortcuts, or meta copy to a fake right column inside menu rows. - Tooltip surfaces across the app must feel intentional and premium: compact, aligned, clearly separated from the background, and positioned so they do not clip, overlap, or awkwardly fight the control that owns them.
- Editor header toolbar tooltips must reveal more slowly than dropdown intent so quick menu interactions open the dropdown without competing hover tooltip paint.
- Repeated menus, dropdowns, tooltips, badges, icon rows, image wrappers, and similar visual chrome must be standardized as reusable Blazor components with owning styles; routed pages and catalog files must compose those components instead of embedding bespoke markup or inline visual logic.
- Shared shell chrome such as the global
Go Liveentry must live behind one reusable Blazor component; routed pages must not fork their own spacing, icon color, or idle/active variants. - Editor TPS menus in
PrompterOne.Sharedmust use one spec-driven grouping and command inventory across top toolbar, floating toolbar, and Monaco authoring help; if a TPS tag or header pattern is supported, every relevant editor command surface must expose it coherently. PrompterOne.Sharedmust provide a localized first-run onboarding flow that walks new users through PrompterOne, TPS, RSVP, Editor, Learn, Teleprompter, and Go Live, and it must persist completion or dismissal in browser-owned settings.PrompterOne.Sharedonboarding must give TPS its own dedicated explainer step or page, separate from the editor overview, so new users understand what TPS is and why PrompterOne centers it.- The TPS onboarding content in
PrompterOne.Sharedmust speak to beginners directly: define TPS, explain why plain-text teleprompter markup matters, show how PrompterOne carries that source into rehearsal/reading/live flows, and point users to official TPS documentation or glossary paths for deeper orientation. - Library and editor routed surfaces in
PrompterOne.Sharedmust expose real search affordances for script names and script content instead of relying only on manual browsing. - Teleprompter routed surfaces in
PrompterOne.Sharedmust expose a direct in-reader text-size control, owned by the reader UI itself, so operators can tune readability during playback without leaving the route. - Teleprompter width controls in
PrompterOne.Sharedmust scale relative to the active viewport or screen size and persist that adaptive ratio; do not clamp the readable lane around a fixed pixel-only desktop maximum. - Editor gutter line numbers must read as editor chrome, not as part of the script content; their color and emphasis must stay clearly separated from source text.
- Editor wrap/format commands must not partially capture TPS tag syntax or create accidental nested wrappers by spanning across existing tag boundaries; if the selection touches tag markup, normalize or reject it instead of producing broken mixed-tag output.
- File-creating editor actions such as document split must show explicit in-app feedback about what was created and where to find it; silent success states behind generic buttons are not user-friendly enough.
dotnet build ./src/PrompterOne.Shared/PrompterOne.Shared.csprojdotnet test ./tests/PrompterOne.Web.Tests/PrompterOne.Web.Tests.csprojdotnet test ./tests/PrompterOne.Web.UITests/PrompterOne.Web.UITests.csproj
playwrightfor routed UI verification and interaction debugging
- Small class-name changes can break visual fidelity badly because the shared runtime CSS is cross-cutting.
AppShell,Contracts,Localization, andwwwrootare cross-cutting; do not turn them back into dumping grounds for feature code.- Routed shell and page navigation belong in Blazor; keep remaining
wwwrootJavaScript limited to browser/runtime interop. - JS interop and saved browser state are part of the real runtime contract; do not treat them as decorative.