\n\n {/* Sheet wrapper -- bottom sheet on mobile, centered dialog on desktop.\n Carries the layout, open/close transition, and the swipe-down drag\n transform; the card inside is the scroll container and the custom\n scroll indicator sits beside it (outside the scroller, so it stays\n pinned while content scrolls). */}\n
0\n ? { transform: `translateY(${dragY}px)`, transition: \"none\" }\n : undefined\n }\n // When closed: hidden from AT and not reachable by keyboard. `inert` is\n // an HTML boolean attribute enabled by its presence; pass the empty\n // string (not `true`) so React 18 emits `inert` without warning.\n {...(!open ? { inert: \"\", \"aria-hidden\": \"true\" } : {})}\n className={cn(\n \"relative z-10\",\n \"flex flex-col max-h-[85dvh]\",\n \"w-full\",\n cls.wrapperWidth,\n \"transition-all duration-300 ease-out\",\n open ? cls.wrapperOpen : cls.wrapperClosed\n )}\n >\n {/* Drawer card -- the scroll container; the sticky header/footer pin\n within it and content scrolls behind them. Its native scrollbar is\n hidden in favour of the bounded indicator. */}\n
\n {/* Sticky frosted header: drag handle (mobile) + optional title.\n Frosted only -- no divider; content passes behind it. */}\n
\n
\n {title && (\n
\n
\n {title}\n
\n \n )}\n
\n\n {/* Scrollable content -- extra bottom padding when a footer pill floats\n over it so the last item clears the pill. */}\n
\n {children}\n
\n\n {/* Sticky frosted footer bar: full-width with a top divider, content\n scrolls behind it. The actions row matches the app's bottom-nav\n height; safe-area padding sits below the row. */}\n {footer && (\n
\n )}\n
\n\n {/* Custom scroll indicator, bounded between the sticky header and\n footer. Shown at every size: the card hides its native scrollbar\n everywhere, unlike page scrollers which keep the platform overlay\n scrollbar on mobile. */}\n
\n