diff --git a/docs/tables_frontend_overhaul_implementation_plan.md b/docs/tables_frontend_overhaul_implementation_plan.md
index 3e6ea11..727d86d 100644
--- a/docs/tables_frontend_overhaul_implementation_plan.md
+++ b/docs/tables_frontend_overhaul_implementation_plan.md
@@ -59,6 +59,7 @@ It is intentionally implementation-focused:
| 2026-03-21 | P2.7 | Completed | Added shared frontend primitives for app-bar actions, chips, segmented tabs, drawers, inspector sections, and status indicators, wired the shell omnibox trigger onto the new app-bar action primitive, and switched the new pinned-table labels in `Tables` to the shared status-chip primitive so later page work can build on reusable building blocks instead of fresh ad hoc markup. |
| 2026-03-21 | P2.8 | Completed | Added a shared `TableContextState` service on top of browser storage and the URL serializer, moved the `Tables` page off page-local table selection persistence, and switched diagnostics to the same restore/persist/build-URI flow so table context logic now lives in shared frontend state instead of being reinvented per page. |
| 2026-03-21 | Post-P2 fix 1 | Completed | Fixed the shell omnibox drawer regression by adding explicit shell offset variables, constraining drawer/body scrolling, and giving the omnibox its own backdrop geometry so the flyout opens within the visible viewport instead of collapsing into invalid top/bottom positioning. |
+| 2026-03-21 | Post-P2 fix 2 | Completed | Rebuilt the shell omnibox as a dedicated command palette instead of a repurposed drawer, with shell-owned overlay markup, explicit viewport-safe geometry, autofocus, Escape and navigation close behavior, and a stable scrollable result body. |
### Lessons Learned
@@ -87,6 +88,7 @@ It is intentionally implementation-focused:
- Primitive extraction lands best when one or two live consumers adopt the new components immediately. That keeps the foundation honest without forcing a broad page rewrite just to validate the abstraction.
- The omnibox foundation does not need the full final interaction model to be useful. A drawer with real table search, real pinned/recent data, and a small slash-command set is enough to validate the shell surface before Phase 3 builds deeper index and inspector flows on top of it.
- Shared overlay primitives should not depend on undeclared layout variables. If a drawer needs shell offsets, the shell must define them explicitly and overlay-specific backdrops should be adjustable instead of assuming full-screen dimming is always correct.
+- A command palette is not just a styled drawer. It needs shell-owned geometry, predictable focus behavior, and a bounded scroll region; treating it as a generic side panel led directly to the layout regressions found in Phase 2.
## Target Outcomes
diff --git a/src/RolemasterDb.App/Components/Primitives/SurfaceDrawer.razor b/src/RolemasterDb.App/Components/Primitives/SurfaceDrawer.razor
index a303184..b9d7268 100644
--- a/src/RolemasterDb.App/Components/Primitives/SurfaceDrawer.razor
+++ b/src/RolemasterDb.App/Components/Primitives/SurfaceDrawer.razor
@@ -2,7 +2,7 @@
{
@@ -61,9 +61,6 @@
[Parameter]
public string? CssClass { get; set; }
- [Parameter]
- public string? BackdropCssClass { get; set; }
-
private string BuildCssClass()
{
var classes = new List { "surface-drawer", $"is-{Placement.Trim().ToLowerInvariant()}" };
@@ -75,17 +72,6 @@
return string.Join(' ', classes);
}
- private string BuildBackdropCssClass()
- {
- var classes = new List { "surface-drawer-backdrop" };
- if (!string.IsNullOrWhiteSpace(BackdropCssClass))
- {
- classes.Add(BackdropCssClass);
- }
-
- return string.Join(' ', classes);
- }
-
private Task HandleCloseAsync() =>
OnClose.InvokeAsync();
}
diff --git a/src/RolemasterDb.App/Components/Shell/ShellOmniboxTrigger.razor b/src/RolemasterDb.App/Components/Shell/ShellOmniboxTrigger.razor
index cd03b91..ee1106a 100644
--- a/src/RolemasterDb.App/Components/Shell/ShellOmniboxTrigger.razor
+++ b/src/RolemasterDb.App/Components/Shell/ShellOmniboxTrigger.razor
@@ -1,3 +1,4 @@
+@implements IDisposable
@using System.Linq
@using RolemasterDb.App.Frontend.AppState
@inject NavigationManager NavigationManager
@@ -6,127 +7,145 @@
@inject RolemasterDb.App.Frontend.AppState.RecentTablesState RecentTablesState
@inject RolemasterDb.App.Frontend.AppState.TableContextState TableContextState
-
- Search tables or commands
-
+