diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx
index 70562ebe..c40b1eaa 100644
--- a/app/(dashboard)/layout.tsx
+++ b/app/(dashboard)/layout.tsx
@@ -515,7 +515,6 @@ export default async function DashboardLayout({
)}
-
{/* One-time expired-trial notice. Sandbox/anonymous demo users have
no billing (their companies carry trial grants too), so the gate
lives here where both flags are known. Acknowledgement persists
@@ -533,6 +532,10 @@ export default async function DashboardLayout({
{settingsModal}
+ {/* Outside #dash-shell on purpose: non-modal dialogs (booking,
+ invoice) set `inert` on the shell while open, and the assistant
+ entry point must stay clickable then, like the sheet itself. */}
+
{!isSandbox && (
(null)
+ // The picker renders non-modal (agent sheet stays usable); hand-restore
+ // page modality while it is open. See useDashShellInert in ui/dialog.tsx.
+ useDashShellInert(templatePickerOpen)
// Invoice picker dialog (manual match)
const [invoicePickerOpen, setInvoicePickerOpen] = useState(false)
@@ -4020,8 +4023,17 @@ export default function TransactionsPage() {
/>
)}
- {templatePickerOpen &&