fix(transactions): keep the assistant usable through the whole booking flow (#1975)
* fix(transactions): keep the assistant usable through the whole booking flow Three gaps around the agent sheet during booking on Transaktioner: - The AgentTrigger bubble lived inside #dash-shell, so the inert that non-modal dialogs set on the shell made the assistant impossible to OPEN once a booking dialog was up. Moved outside the shell (it is position: fixed) and raised to z-[45]: above the DialogVeil (z-40) so it stays clickable, below dialog content (z-50). Under true modal dialogs Radix's body pointer-events lock keeps it dead as before. - Wide dialogs centered on the full viewport while the docked sheet (z-60) covered their right edge, hiding e.g. the Granska button. DialogContent now centers in the space left of --agent-dock-w, and the wide booking/review variants cap their width against it. - Step 1 of the flow (template picker, QuickReviewDialog) was still fully modal, so the assistant was dead there. Both are now non-modal with DialogVeil + a shared ref-counted useDashShellInert hook (also replacing the duplicated inert effects in TransactionBookingDialog and NewInvoiceDialog). Their Esc/veil-click dismissal is kept: they hold no half-filled form. Clicks in the agent sheet or its trigger never dismiss any dialog: data-agent-ui counts as inside, same mechanism as data-dialog-companion. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(ui): dialog centering reads a docked-only sheet width variable Skeptic review refuted the first cut: globals.css seeds --agent-dock-w at the 10px frame gutter on :root by design, so the 0px fallback in the new dialog centering never applied and every dialog sat 5px left of center (full-bleed dialogs clipped 5px off-screen). Introduce --agent-sheet-w, set inline by AgentSheetProvider only while the sheet is docked and removed otherwise, so the 0px fallback is real: sheet closed or floating renders byte-identical to the old left-[50%] and old max widths. Also cap the template picker and QuickReview's narrow variant, which could clip off-screen left on narrow desktops with the sheet docked. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
99c94d467a
commit
c981384a0e
@@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useMemo, useState } from 'react'
|
||||
import { useTranslations } from 'next-intl'
|
||||
import { Dialog, DialogContent, DialogTitle, DialogVeil } from '@/components/ui/dialog'
|
||||
import { Dialog, DialogContent, DialogTitle, DialogVeil, useDashShellInert } from '@/components/ui/dialog'
|
||||
import { Skeleton } from '@/components/ui/skeleton'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { createClient } from '@/lib/supabase/client'
|
||||
@@ -112,21 +112,9 @@ export default function NewInvoiceDialog({ open, onOpenChange, copyFromId = null
|
||||
const copyInitial = copyLoad.sourceId === copyFromId ? copyLoad.initial : null
|
||||
const copyLoadFailed = copyLoad.sourceId === copyFromId && copyLoad.failed
|
||||
|
||||
// The dialog is non-modal so the agent sheet (a body-level sibling at
|
||||
// z-[60]) stays clickable and focusable above it: Radix modal mode sets
|
||||
// body pointer-events: none and traps focus, which left the visible chat
|
||||
// input dead. Page modality is restored by hand instead: `inert` on the
|
||||
// dash shell blocks pointer, keyboard, and AT access to the page behind,
|
||||
// while the agent sheet (outside the shell) stays live.
|
||||
useEffect(() => {
|
||||
if (!open) return
|
||||
const shell = document.getElementById('dash-shell')
|
||||
if (!shell) return
|
||||
shell.inert = true
|
||||
return () => {
|
||||
shell.inert = false
|
||||
}
|
||||
}, [open])
|
||||
// Non-modal dialog (see below): page modality is restored by hand so the
|
||||
// agent sheet stays live. See useDashShellInert in components/ui/dialog.tsx.
|
||||
useDashShellInert(open)
|
||||
|
||||
return (
|
||||
<Dialog open={open} onOpenChange={onOpenChange} modal={false}>
|
||||
|
||||
Reference in New Issue
Block a user