@arbidocs/blocks 0.5.39 → 0.5.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/start-inset.ts","../src/shell/Sidebar.tsx","../src/shell/ShellSidebar.tsx","../src/shell/SidebarRowAction.tsx","../src/shell/AskField.tsx","../src/shell/MobileBars.tsx","../src/shell/install-instructions.ts","../src/shell/use-install-prompt.ts","../src/shell/InstallPrompt.tsx","../src/shell/status-row-styles.ts","../src/shell/StatusRow.tsx","../src/shell/OfflinePill.tsx","../src/shell/RemoteControlPill.tsx","../src/shell/TipCard.tsx","../src/shell/InfoBar.tsx","../src/shell/SplitLayout.tsx"],"names":["useEffect","useMemo","DEFAULT_SIDEBAR_LABELS","useRef","useDrawerBehavior","testIdOr","jsxs","jsx","cn","Fragment","SidebarContext","BlocksTooltipProvider","useSidebarContext","useState","ActionLink","Tooltip","TooltipTrigger","TooltipContent","SidebarRowHoverContext","PanelLeftClose","PanelLeftOpen","X","SidebarBadgeRow","useContext","Sparkles","Button","Search","ArrowUp","Menu","useShellBottomInset","prefixedTestId","useCallback","Download","Loader2","CheckCircle2","TriangleAlert","WifiOff","RefreshCw","MousePointerClick","Lightbulb","Pencil","ChevronLeft","ChevronRight","Info"],"mappings":"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","file":"chunk-YWGDZR6A.cjs","sourcesContent":["import { useEffect } from 'react'\n\n/**\n * The CSS custom property that carries how much of the screen's start (left) edge a docked sidebar\n * takes, set on `<html>`. A floating element pinned to the start corner (the install prompt)\n * positions itself `calc(var(--shell-start-inset, 0px) + 0.75rem)` so it never covers the\n * sidebar's footer (the account menu).\n */\nexport const SHELL_START_INSET_VAR = '--shell-start-inset'\n\nconst widths = new Map<symbol, number>()\n\nfunction apply(): void {\n if (typeof document === 'undefined') return\n const inset = Math.max(0, ...widths.values())\n const style = document.documentElement.style\n if (inset > 0) style.setProperty(SHELL_START_INSET_VAR, `${inset}px`)\n else style.removeProperty(SHELL_START_INSET_VAR)\n}\n\n/**\n * Report a sidebar docked at the start edge, `width` px wide (0 while it is collapsed or is an\n * overlay drawer), to {@link SHELL_START_INSET_VAR}. `Sidebar.Root` calls it; call it from your\n * own docked side panel.\n */\nexport function useShellStartInset(width: number): void {\n useEffect(() => {\n const key = Symbol('shell-start-inset')\n widths.set(key, width)\n apply()\n return () => {\n widths.delete(key)\n apply()\n }\n }, [width])\n}\n","import { useMemo, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { PanelLeftClose, PanelLeftOpen, X } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_SIDEBAR_LABELS,\n SidebarContext,\n SidebarRowHoverContext,\n useSidebarContext,\n type SidebarLabels,\n} from './sidebar-context'\nimport { SidebarBadgeRow } from './SidebarBadgeRow'\nimport { ActionLink } from '../components/ActionLink'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\nimport { useDrawerBehavior } from '../lib/use-drawer'\nimport { useShellStartInset } from '../lib/start-inset'\nimport type { SidebarMode } from '../lib/sidebar-mode'\nimport type { NavItem, NavItemIndicator, NavSection } from './types'\n\n/**\n * Sidebar: the one tinted column that carries the app frame. Compound parts:\n * Sidebar.Root positioning shell for the four modes (drawer / collapsed / pinned / rail)\n * Sidebar.Header top block (switcher, ask field, pin toggle)\n * Sidebar.Nav the rows: pass `items` (NavItem[]) or compose Sidebar.NavItem children\n * Sidebar.Group a labelled run of rows (heading when expanded, divider on the rail)\n * Sidebar.Footer pinned to the bottom (offline pill, tips card, action cluster)\n * Sidebar.PinToggle / Sidebar.DrawerHeader the header's two stock controls\n *\n * Presentational and controlled: the app resolves `mode`/`expanded` (see `resolveSidebarLayout`\n * and `useSidebarSettle`) and owns where hover/pin/drawer state lives.\n */\n\nconst noop = () => {}\n\nconst COLLAPSED_PX = 64\nconst EXPANDED_PX = 256\nconst COLLAPSED_WIDTH = `${COLLAPSED_PX}px`\nconst EXPANDED_WIDTH = `${EXPANDED_PX}px`\n\nexport interface SidebarRootProps {\n mode: SidebarMode\n /** Labels visible. Provided to every part through context. */\n expanded: boolean\n /** `rail` mode: floats open to full width. */\n isHovering?: boolean\n onBackdropClick?: () => void\n /** `rail` mode on touch: the floated-open rail dims the content behind it; tapping it closes. */\n hasRailBackdrop?: boolean\n onMouseEnter?: () => void\n onMouseLeave?: () => void\n children: ReactNode\n className?: string\n 'aria-label'?: string\n labels?: Partial<SidebarLabels>\n /** Root id (default `sidebar`). */\n 'data-testid'?: string\n /** Drawer backdrop id (default `sidebar-backdrop`). */\n backdropTestId?: string\n}\n\nfunction SidebarRoot({\n mode,\n expanded,\n isHovering = false,\n onBackdropClick,\n hasRailBackdrop = false,\n onMouseEnter,\n onMouseLeave,\n children,\n className,\n 'aria-label': ariaLabelProp,\n labels,\n 'data-testid': testId,\n backdropTestId,\n}: SidebarRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_SIDEBAR_LABELS, ...labels }), [labels])\n // The drawer is a modal: scroll lock, Escape, focus trap and focus return to the opener.\n const drawerRef = useRef<HTMLDivElement>(null)\n const isDrawer = mode === 'drawer'\n useDrawerBehavior(isDrawer, onBackdropClick ?? noop, drawerRef)\n // Floating start-corner elements (the install prompt) sit clear of the docked sidebar; a rail\n // expanding on hover floats over the page, so only its collapsed width counts.\n useShellStartInset(mode === 'pinned' ? EXPANDED_PX : mode === 'rail' ? COLLAPSED_PX : 0)\n const ariaLabel = ariaLabelProp ?? mergedLabels.mainNavigation\n const contextValue = useMemo(() => ({ expanded, labels: mergedLabels }), [expanded, mergedLabels])\n // `navBase` omits horizontal padding so each mode owns its own: the collapsed state must\n // reach a true 0 width, which an `!important` px would block.\n const navBase =\n 'group/sidebar bg-sidebar border-r border-border text-foreground scrollbar-themed flex flex-col h-full overflow-y-auto overflow-x-hidden pb-safe pt-3 transition-all duration-300 ease-in-out'\n const common = {\n 'aria-label': ariaLabel,\n 'data-testid': testIdOr(testId, { testId: 'sidebar' }),\n 'data-slot': 'sidebar',\n 'data-mode': mode,\n } as const\n const fixedWidth: CSSProperties = { width: EXPANDED_WIDTH, minWidth: EXPANDED_WIDTH }\n\n let body: ReactNode\n if (mode === 'drawer') {\n // Small-screen off-canvas panel + dismiss backdrop; bypasses the hover/collapse model. The\n // wrapper is the modal dialog; the nav landmark sits inside it.\n body = (\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n data-slot=\"sidebar-drawer\"\n className=\"fixed inset-0 z-50\"\n >\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n <nav\n {...common}\n className={cn(navBase, '!px-3 absolute left-0 top-0 pt-safe shadow-xl', className)}\n style={fixedWidth}\n >\n {children}\n </nav>\n </div>\n )\n } else if (mode === 'collapsed') {\n // Stays mounted at width 0 so the transition runs on both enter and leave. Horizontal padding\n // is dropped or overflow-hidden would reveal a clipped sliver of the icons.\n body = (\n <nav\n {...common}\n className={cn(navBase, 'absolute left-0 top-0 z-[45]', className)}\n style={{\n width: '0px',\n minWidth: 0,\n paddingLeft: 0,\n paddingRight: 0,\n borderRightWidth: 0,\n pointerEvents: 'none',\n }}\n // Width 0 hides the links visually; inert also takes them out of the tab order and the\n // accessibility tree.\n inert\n >\n {children}\n </nav>\n )\n } else if (mode === 'pinned') {\n body = (\n <nav\n {...common}\n className={cn(navBase, '!px-3 relative flex-shrink-0', className)}\n style={fixedWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n )\n } else {\n // Rail: a permanent spacer keeps the flex layout still; the nav is always absolute so only\n // its width animates on hover (no layout jump).\n body = (\n <>\n <div\n className=\"bg-sidebar border-r border-border flex flex-col h-full relative px-0 pb-safe flex-shrink-0\"\n style={{ width: COLLAPSED_WIDTH, minWidth: COLLAPSED_WIDTH }}\n aria-hidden=\"true\"\n />\n {isHovering && hasRailBackdrop && (\n <div\n className=\"fixed inset-0 z-[44] bg-black/40\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n )}\n <nav\n {...common}\n className={cn(\n navBase,\n isHovering ? '!px-3 shadow-xl' : '!px-2',\n 'absolute left-0 top-0 z-[45]',\n className\n )}\n style={{\n width: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n minWidth: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n </>\n )\n }\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <BlocksTooltipProvider>{body}</BlocksTooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nexport interface SidebarSectionProps {\n children: ReactNode\n className?: string\n 'data-testid'?: string\n}\n\nfunction SidebarHeader({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-3 pb-3', className)}\n >\n {children}\n </div>\n )\n}\n\nexport interface SidebarNavProps extends Omit<SidebarSectionProps, 'children'> {\n children?: ReactNode\n /** Rows as data. Children render after them. */\n items?: NavItem[]\n /** Labelled groups of rows as data (each a `Sidebar.Group`), after `items`. */\n sections?: NavSection[]\n}\n\nfunction SidebarNav({\n items,\n sections,\n children,\n className,\n 'data-testid': testId,\n}: SidebarNavProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-nav\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {items?.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n {sections?.map((section) => (\n <SidebarGroup\n key={section.id}\n label={section.label}\n ariaLabel={section.ariaLabel}\n data-testid={section.testId}\n >\n {section.items.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n </SidebarGroup>\n ))}\n {children}\n </div>\n )\n}\n\nexport interface SidebarGroupProps extends SidebarSectionProps {\n /** Group heading. Shown above the rows when expanded; a thin divider stands in on the rail. */\n label?: ReactNode\n /** Accessible name when `label` is not plain text. */\n ariaLabel?: string\n}\n\n/** A labelled run of rows inside the nav (for example \"Workspace\", \"Tools\"). */\nfunction SidebarGroup({\n label,\n ariaLabel,\n children,\n className,\n 'data-testid': testId,\n}: SidebarGroupProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\n data-slot=\"sidebar-group\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {label &&\n (expanded ? (\n <SidebarGroupLabel>{label}</SidebarGroupLabel>\n ) : (\n <div\n role=\"separator\"\n data-slot=\"sidebar-group-divider\"\n className=\"my-1 h-px w-6 bg-border\"\n />\n ))}\n {children}\n </div>\n )\n}\n\n/** The heading of a `Sidebar.Group` (exported for custom headings). Hidden by the group on the rail. */\nfunction SidebarGroupLabel({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n data-slot=\"sidebar-group-label\"\n className={cn(\n 'px-2 pb-0.5 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nfunction SidebarFooter({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-testid={testId}\n className={cn(\n 'mt-auto flex flex-shrink-0 flex-col gap-2 pt-3 pb-3',\n !expanded && 'items-center',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nconst INDICATOR_TONES: Record<NavItemIndicator, string> = {\n progress: 'bg-primary',\n error: 'bg-red-solid',\n attention: 'bg-yellow-solid',\n}\n\nexport type SidebarNavItemProps = Omit<NavItem, 'id'> & {\n id?: string\n className?: string\n /** Tooltip shown on the icon-only rail; defaults to the label. */\n tooltip?: string\n}\n\n/**\n * One row: [icon] [label] [count] [trailing]. 36px (44px on coarse pointers). The active row is\n * the selection tint, never a filled block; counts are quiet numbers, not pills.\n *\n * The expanded row is a div with role=\"button\" (not a native <button>) so an interactive\n * `trailing` control can be nested without producing button-in-button markup.\n */\nfunction SidebarNavItem({\n label,\n icon,\n active = false,\n onSelect,\n href,\n count,\n countIcon,\n testId,\n disabled = false,\n trailing,\n indicator,\n className,\n tooltip,\n}: SidebarNavItemProps) {\n const { expanded } = useSidebarContext()\n // Tracked as state (not CSS :hover) so a trailing control can read it via context.\n const [isRowActive, setIsRowActive] = useState(false)\n const tip = expanded ? undefined : (tooltip ?? label)\n\n if (!expanded) {\n const railButton = (\n <ActionLink\n href={href}\n onSelect={onSelect}\n disabled={disabled}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(\n 'm-0 flex h-9 w-12 items-center justify-center rounded-md transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )}\n >\n <div className=\"flex size-5 items-center justify-center\">\n {indicator ? (\n <div className=\"relative\">\n {icon}\n <div\n data-slot=\"sidebar-nav-indicator\"\n data-tone={indicator}\n className={cn(\n 'absolute -right-1 -top-1 size-2.5 rounded-full border border-sidebar',\n INDICATOR_TONES[indicator]\n )}\n />\n </div>\n ) : (\n icon\n )}\n </div>\n </ActionLink>\n )\n if (!tip) return railButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{railButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {tip}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n const rowClass = cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-sm transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent font-semibold text-accent-foreground'\n : 'font-medium text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )\n const countNode = count !== undefined && (\n <span\n // `ml-auto` lines the counts up on the right edge as one column of numbers.\n className={cn(\n 'ml-auto inline-flex flex-shrink-0 items-center gap-0.5 pl-2 text-xs font-normal tabular-nums',\n active ? 'text-accent-foreground' : 'text-muted-foreground'\n )}\n >\n {countIcon}\n {count}\n </span>\n )\n\n // A link row without a nested control is the anchor itself.\n if (href && !disabled && !trailing) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </ActionLink>\n )\n }\n\n // A link row with a nested control: a stretched anchor sits under the content, and the\n // trailing control rises above it, so there is never an interactive element inside an anchor.\n if (href && !disabled) {\n return (\n <div\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(rowClass, 'relative')}\n >\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n className=\"absolute inset-0 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <div className=\"pointer-events-none flex min-w-0 flex-1 items-center\">\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </div>\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"relative ml-2 flex flex-shrink-0 items-center\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n </div>\n )\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-current={active ? 'page' : undefined}\n onClick={disabled ? undefined : onSelect}\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n onKeyDown={\n disabled\n ? undefined\n : (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect()\n }\n }\n }\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n {trailing && (\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"ml-auto flex flex-shrink-0 items-center pl-2\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n )}\n </div>\n )\n}\n\nexport interface SidebarPinToggleProps {\n isPinned: boolean\n onToggle: () => void\n className?: string\n /** Default `sidebar-pin-button`. */\n 'data-testid'?: string\n}\n\n/**\n * Pin/unpin button, revealed while the pointer is over the sidebar. It is always visible on\n * coarse pointers (no hover on touch) and revealed by keyboard focus anywhere in the sidebar. It\n * is hidden with opacity and pointer-events, never display:none, so it keeps its accessible name\n * and stays in the tab order.\n */\nfunction SidebarPinToggle({\n isPinned,\n onToggle,\n className,\n 'data-testid': testId,\n}: SidebarPinToggleProps) {\n const { expanded, labels } = useSidebarContext()\n const label = isPinned ? labels.hideSidebar : labels.showSidebar\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n title={label}\n aria-label={label}\n aria-pressed={isPinned}\n data-testid={testIdOr(testId, { testId: 'sidebar-pin-button' })}\n className={cn(\n 'flex flex-shrink-0 items-center justify-center rounded-md text-muted-foreground transition-[opacity,colors] hover:bg-muted hover:text-foreground pointer-coarse:size-11',\n 'pointer-events-none opacity-0 group-hover/sidebar:pointer-events-auto group-hover/sidebar:opacity-100',\n 'group-focus-within/sidebar:pointer-events-auto group-focus-within/sidebar:opacity-100',\n 'pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 focus-visible:pointer-events-auto focus-visible:opacity-100',\n expanded ? 'size-9' : 'h-9 w-12',\n className\n )}\n >\n {isPinned ? <PanelLeftClose className=\"size-5\" /> : <PanelLeftOpen className=\"size-5\" />}\n </button>\n )\n}\n\nexport interface SidebarDrawerHeaderProps {\n /** Brand mark. */\n logo: ReactNode\n onClose: () => void\n closeLabel?: string\n /** Close button id (default `mobile-nav-close`). */\n 'data-testid'?: string\n}\n\n/** The phone drawer's header: brand mark and a 44px close button. */\nfunction SidebarDrawerHeader({\n logo,\n onClose,\n closeLabel: closeLabelProp,\n 'data-testid': testId,\n}: SidebarDrawerHeaderProps) {\n const { labels } = useSidebarContext()\n const closeLabel = closeLabelProp ?? labels.closeNavigationMenu\n return (\n <div\n data-slot=\"sidebar-drawer-header\"\n className=\"flex flex-shrink-0 items-center justify-between pb-2\"\n >\n {logo}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={closeLabel}\n data-testid={testIdOr(testId, { testId: 'mobile-nav-close' })}\n className=\"flex size-11 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-5\" />\n </button>\n </div>\n )\n}\n\nexport { DEFAULT_SIDEBAR_LABELS, SidebarRowHoverContext, useSidebarContext, type SidebarLabels }\n\nexport const Sidebar = {\n Root: SidebarRoot,\n Header: SidebarHeader,\n Nav: SidebarNav,\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n NavItem: SidebarNavItem,\n Footer: SidebarFooter,\n PinToggle: SidebarPinToggle,\n BadgeRow: SidebarBadgeRow,\n DrawerHeader: SidebarDrawerHeader,\n}\n","import type { ReactNode } from 'react'\nimport { Sidebar, type SidebarRootProps } from './Sidebar'\nimport type { SidebarController } from './use-sidebar-controller'\nimport type { NavItem, NavSection } from './types'\n\nexport interface ShellSidebarProps extends Pick<\n SidebarRootProps,\n 'className' | 'aria-label' | 'labels' | 'backdropTestId'\n> {\n /** From `useSidebarController`: layout, hover/pin/drawer behaviour. */\n controller: SidebarController\n /** Brand mark of the phone drawer's header (logo + close). Omit for no drawer header. */\n drawerLogo?: ReactNode\n /** `data-testid` of the drawer's close button. */\n drawerCloseTestId?: string\n /** Top block (workspace switcher, ask field, pin toggle). Read `controller.expanded` for the rail. */\n header?: ReactNode\n /** Rows as data. */\n items?: NavItem[]\n /** Labelled groups of rows as data, after `items`. */\n sections?: NavSection[]\n navClassName?: string\n /**\n * Width-bound cards at the top of the footer (smart tips, notices): shown only once the panel\n * has settled open, and gone the instant it starts to close.\n */\n tips?: ReactNode\n /** The rest of the footer (status rows, account rows). */\n footer?: ReactNode\n /** Root `data-testid` (default `sidebar`). */\n 'data-testid'?: string\n}\n\n/**\n * The whole sidebar from a controller and data: `Sidebar.Root` in the resolved mode, the phone\n * drawer header, the header slot, the nav rows/groups and the footer. Renders nothing while the\n * layout is hidden (a phone with the drawer closed), so no clipped rows carry duplicate test ids.\n *\n * const sidebar = useSidebarController({ isPinned, onPinnedChange: setPinned })\n * <ShellSidebar controller={sidebar} header={…} items={nav} footer={…} />\n */\nexport function ShellSidebar({\n controller,\n drawerLogo,\n drawerCloseTestId,\n header,\n items,\n sections,\n navClassName,\n tips,\n footer,\n ...rootProps\n}: ShellSidebarProps) {\n if (controller.layout.hidden) return null\n return (\n <Sidebar.Root {...controller.rootProps} {...rootProps}>\n {controller.isDrawer && drawerLogo && (\n <Sidebar.DrawerHeader\n logo={drawerLogo}\n onClose={controller.closeDrawer}\n data-testid={drawerCloseTestId}\n />\n )}\n {header && <Sidebar.Header>{header}</Sidebar.Header>}\n <Sidebar.Nav items={items} sections={sections} className={navClassName} />\n {(tips || footer) && (\n <Sidebar.Footer>\n {controller.tipsVisible && tips}\n {footer}\n </Sidebar.Footer>\n )}\n </Sidebar.Root>\n )\n}\n","import { useContext, type ReactNode } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\nimport { SidebarRowHoverContext } from './Sidebar'\n\nexport type SidebarRowActionPulse = 'active' | 'success' | 'error'\n\nexport interface SidebarRowActionProps {\n /** The row this control sits on is selected: the glyph takes the selection ink. */\n active?: boolean\n onClick?: () => void\n /** Tooltip text and accessible label. */\n label: string\n /** Reflected as aria-pressed for toggle controls. */\n pressed?: boolean\n /**\n * Demand attention while the row is idle: `active` pulses primary (work in progress),\n * `success` pulses green (just finished), `error` is a steady red alert. A selected row wins.\n */\n pulse?: SidebarRowActionPulse | null\n 'data-testid'?: string\n children: ReactNode\n}\n\nconst PULSE_STYLES: Record<SidebarRowActionPulse, string> = {\n active: 'animate-pulse-attention text-primary',\n success: 'animate-pulse-attention text-green-text',\n // Steady (not animated) so a failure stays put and reads as a standing alert.\n error: 'text-red-text opacity-100',\n}\n\n/**\n * The secondary control at the right edge of a sidebar row: a small muted glyph. Always visible\n * (touch has no hover); hovering or focusing the row only brightens it a tone, through\n * SidebarRowHoverContext. Stops propagation so it never triggers the row's own click.\n */\nexport function SidebarRowAction({\n active = false,\n onClick,\n label,\n pressed,\n pulse = null,\n 'data-testid': testId,\n children,\n}: SidebarRowActionProps) {\n const rowHovered = useContext(SidebarRowHoverContext)\n\n const tone = active\n ? 'text-accent-foreground hover:bg-background/60'\n : pulse\n ? `${PULSE_STYLES[pulse]} hover:bg-muted`\n : cn(\n 'text-muted-foreground hover:bg-muted hover:text-foreground',\n rowHovered ? 'opacity-100' : 'opacity-70'\n )\n\n return (\n <BlocksTooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick?.()\n }}\n aria-label={label}\n aria-pressed={pressed}\n data-slot=\"sidebar-row-action\"\n data-testid={testId}\n className={cn('rounded-md p-1 transition-colors pointer-coarse:p-2.5', tone)}\n >\n {children}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{label}</TooltipContent>\n </Tooltip>\n </BlocksTooltipProvider>\n )\n}\n","import type { InputHTMLAttributes, KeyboardEvent, ReactNode, Ref } from 'react'\nimport { ArrowUp, Search, Sparkles, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Fixed strings of the ask field, its trigger and the expanded row. */\nexport interface AskFieldLabels {\n /** Input placeholder (the `placeholder` prop wins). */\n placeholder: string\n /** The input's accessible name. */\n inputLabel: string\n search: string\n askAi: string\n /** The icon-only trigger. */\n askOrSearch: string\n closeSearch: string\n}\n\nexport const DEFAULT_ASK_FIELD_LABELS: AskFieldLabels = {\n placeholder: 'Ask or search…',\n inputLabel: 'Ask AI or search your documents',\n search: 'Search',\n askAi: 'Ask AI',\n askOrSearch: 'Ask AI or search',\n closeSearch: 'Close search',\n}\n\nexport interface AskFieldProps {\n value: string\n onValueChange: (value: string) => void\n /** Enter / the arrow button: ask AI. */\n onAsk: (text: string) => void\n /** The magnifier button: semantic search. */\n onSearch: (text: string) => void\n /** Intercept keys first (e.g. a slash menu); call `preventDefault` to stop the default Enter-asks. */\n onInputKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void\n /** Rendered just under the field at its width (a slash/autocomplete menu). */\n menu?: ReactNode\n inputRef?: Ref<HTMLInputElement>\n /** Extra attributes for the input, e.g. the combobox props of `useListKeyNav` for a slash menu. */\n inputProps?: InputHTMLAttributes<HTMLInputElement>\n placeholder?: string\n labels?: Partial<AskFieldLabels>\n autoFocus?: boolean\n className?: string\n /** Root id (default `workspace-ask-bar`); the input/search/submit ids are `<root>-input|search|submit`. */\n 'data-testid'?: string\n}\n\n/**\n * The compact one-line ask/search field: sparkle, input, then two icon doors (Search, Ask AI).\n * Text and the menu are controlled by the host, so the same field serves the sidebar, the phone\n * app bar and any custom shell.\n */\nexport function AskField({\n value,\n onValueChange,\n onAsk,\n onSearch,\n onInputKeyDown,\n menu,\n inputRef,\n inputProps,\n placeholder,\n labels,\n autoFocus = false,\n className,\n 'data-testid': testIdProp,\n}: AskFieldProps) {\n const testId = testIdOr(testIdProp, { testId: 'workspace-ask-bar' })\n const l = { ...DEFAULT_ASK_FIELD_LABELS, ...labels }\n const isEmpty = !value.trim()\n const submit = (handler: (text: string) => void) => {\n const text = value.trim()\n if (text) handler(text)\n }\n\n return (\n <div className={cn('relative', className)} data-slot=\"ask-field\" data-testid={testId}>\n {menu && <div className=\"absolute inset-x-0 top-9 z-30\">{menu}</div>}\n <div\n role=\"search\"\n className=\"flex h-9 items-center gap-0.5 rounded-md border border-border bg-background pl-2.5 pr-0.5 transition-colors focus-within:border-primary focus-within:ring-3 focus-within:ring-primary pointer-coarse:h-11\"\n >\n <Sparkles aria-hidden=\"true\" className=\"size-4 shrink-0 text-ai-ink\" />\n <input\n {...inputProps}\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={(e) => {\n onInputKeyDown?.(e)\n // Enter asks (not mid-IME-composition). A plain div, not a <form>.\n if (e.defaultPrevented) return\n if (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n e.preventDefault()\n submit(onAsk)\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n aria-label={l.inputLabel}\n autoFocus={autoFocus}\n className=\"ml-1.5 h-8 min-w-0 flex-1 bg-transparent pointer-coarse:h-11 text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={`${testId}-input`}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={isEmpty}\n onClick={() => submit(onSearch)}\n title={l.search}\n aria-label={l.search}\n className=\"size-7 shrink-0 text-muted-foreground hover:text-foreground pointer-coarse:size-10\"\n data-testid={`${testId}-search`}\n >\n <Search className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={isEmpty}\n onClick={() => submit(onAsk)}\n title={l.askAi}\n aria-label={l.askAi}\n className=\"!inline-flex size-7 shrink-0 text-ai-ink hover:bg-ai-soft hover:text-ai-ink pointer-coarse:size-10\"\n data-testid={`${testId}-submit`}\n >\n <ArrowUp className=\"size-4\" />\n </Button>\n </div>\n </div>\n )\n}\n\nexport interface AskTriggerProps {\n /** Opens the ask field (the single-action variants) or asks AI (`split`). */\n onClick: () => void\n /**\n * `rail`: the icon-only sidebar's bordered tile; `appbar`: the phone app bar's bare icon;\n * `split`: two icon buttons side by side, Search (`onSearch`) and Ask AI (`onClick`).\n */\n variant?: 'rail' | 'appbar' | 'split'\n /** The Search action of the `split` variant. */\n onSearch?: () => void\n labels?: Partial<Pick<AskFieldLabels, 'askOrSearch' | 'search' | 'askAi'>>\n /**\n * `split` only: show the Search and Ask AI texts beside the icons (from `sm` up; phones keep\n * icons, the texts stay as accessible names and tooltips) instead of icon-only buttons.\n */\n showLabels?: boolean\n /** Root id; the split buttons get `<root>-search` and `<root>-ask` unless overridden. */\n 'data-testid'?: string\n searchTestId?: string\n askTestId?: string\n}\n\n/** The icon that stands in for the field where there is no room for it. */\nexport function AskTrigger({\n onClick,\n variant = 'rail',\n onSearch,\n labels,\n showLabels = false,\n 'data-testid': testId,\n searchTestId,\n askTestId,\n}: AskTriggerProps) {\n const text = labels?.askOrSearch ?? DEFAULT_ASK_FIELD_LABELS.askOrSearch\n if (variant === 'split') {\n const searchText = labels?.search ?? DEFAULT_ASK_FIELD_LABELS.search\n const askText = labels?.askAi ?? DEFAULT_ASK_FIELD_LABELS.askAi\n return (\n <div\n role=\"group\"\n aria-label={text}\n data-slot=\"ask-trigger\"\n data-variant=\"split\"\n data-testid={testId}\n className=\"inline-flex items-center rounded-md border border-border bg-background\"\n >\n <button\n type=\"button\"\n onClick={onSearch}\n title={searchText}\n aria-label={searchText}\n data-testid={searchTestId ?? (testId ? `${testId}-search` : undefined)}\n className={cn(\n 'flex h-9 items-center justify-center gap-1.5 rounded-l-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground pointer-coarse:h-11',\n showLabels\n ? 'min-w-9 px-2.5 text-sm pointer-coarse:min-w-11'\n : 'w-9 pointer-coarse:w-11'\n )}\n >\n <Search className=\"size-4\" />\n {showLabels && <span className=\"hidden sm:inline\">{searchText}</span>}\n </button>\n <button\n type=\"button\"\n onClick={onClick}\n title={askText}\n aria-label={askText}\n data-testid={askTestId ?? (testId ? `${testId}-ask` : undefined)}\n className={cn(\n 'flex h-9 items-center justify-center gap-1.5 rounded-r-md border-l border-border text-ai-ink transition-colors hover:bg-ai-soft pointer-coarse:h-11',\n showLabels\n ? 'min-w-9 px-2.5 text-sm pointer-coarse:min-w-11'\n : 'w-9 pointer-coarse:w-11'\n )}\n >\n <Sparkles className=\"size-4\" />\n {showLabels && <span className=\"hidden sm:inline\">{askText}</span>}\n </button>\n </div>\n )\n }\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={text}\n aria-label={text}\n data-slot=\"ask-trigger\"\n data-testid={testId}\n className={cn(\n 'flex items-center justify-center rounded-md text-ai-ink transition-colors hover:bg-ai-soft',\n variant === 'rail'\n ? 'h-9 w-12 border border-border bg-background pointer-coarse:h-11'\n : 'size-11'\n )}\n >\n <Sparkles className={variant === 'rail' ? 'size-4' : 'size-5'} />\n </button>\n )\n}\n\nexport interface AskRowProps {\n /** The field (an AskField). */\n children: ReactNode\n onClose: () => void\n labels?: Partial<Pick<AskFieldLabels, 'closeSearch'>>\n /** Row id (default `workspace-ask-bar-expanded`). */\n 'data-testid'?: string\n /** Collapse button id (default `workspace-ask-bar-collapse`). */\n collapseTestId?: string\n}\n\n/** The phone's expanded ask row: takes over the app bar so there is room to type; Escape closes. */\nexport function AskRow({\n children,\n onClose,\n labels,\n 'data-testid': testId,\n collapseTestId,\n}: AskRowProps) {\n return (\n <div\n className=\"flex h-14 flex-shrink-0 items-center gap-1 bg-background px-3 pt-safe\"\n data-slot=\"ask-row\"\n data-testid={testIdOr(testId, { testId: 'workspace-ask-bar-expanded' })}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && !e.defaultPrevented) onClose()\n }}\n >\n <div className=\"min-w-0 flex-1\">{children}</div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={labels?.closeSearch ?? DEFAULT_ASK_FIELD_LABELS.closeSearch}\n data-testid={testIdOr(collapseTestId, { testId: 'workspace-ask-bar-collapse' })}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-5\" />\n </button>\n </div>\n )\n}\n","import { useRef, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { useShellBottomInset } from '../lib/bottom-inset'\nimport type { NavItem } from './types'\n\n/** Fixed strings of the phone bars. */\nexport interface MobileBarsLabels {\n /** The menu button (the `menuLabel` prop wins). */\n openNavigationMenu: string\n /** The tab bar's accessible name (the `label` prop wins). */\n workspaceSections: string\n}\n\nexport const DEFAULT_MOBILE_BARS_LABELS: MobileBarsLabels = {\n openNavigationMenu: 'Open navigation menu',\n workspaceSections: 'Workspace sections',\n}\n\nexport interface MobileAppBarProps {\n /** Show the menu button that opens the drawer (nothing to open on a list page with no sidebar). */\n showMenu?: boolean\n onMenu?: () => void\n /** Replaces the brand mark (e.g. the workspace switcher). */\n title?: ReactNode\n /** Brand mark shown when there is no `title`. */\n logo?: ReactNode\n /** Right-aligned controls that fit (ask, offline pill, bell, account). */\n actions?: ReactNode\n menuLabel?: string\n labels?: Partial<Pick<MobileBarsLabels, 'openNavigationMenu'>>\n className?: string\n 'data-testid'?: string\n /** Menu button id (default `mobile-nav-toggle`). */\n menuTestId?: string\n}\n\n/**\n * The slim phone app bar (56px): menu button, a title slot and an actions slot. The app mounts\n * it only on small screens; the controls that do not fit live in the drawer.\n */\nexport function MobileAppBar({\n showMenu = true,\n onMenu,\n title,\n logo,\n actions,\n menuLabel,\n labels,\n className,\n 'data-testid': testId,\n menuTestId,\n}: MobileAppBarProps) {\n return (\n <div\n data-slot=\"mobile-app-bar\"\n data-testid={testId}\n className={cn(\n 'sm:hidden flex h-14 flex-shrink-0 items-center gap-1 bg-background pl-1 pr-2 pt-safe',\n className\n )}\n >\n {showMenu && (\n <button\n type=\"button\"\n onClick={onMenu}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted\"\n aria-label={\n menuLabel ?? labels?.openNavigationMenu ?? DEFAULT_MOBILE_BARS_LABELS.openNavigationMenu\n }\n data-testid={testIdOr(menuTestId, { testId: 'mobile-nav-toggle' })}\n >\n <Menu className=\"size-5\" />\n </button>\n )}\n <div className={cn('flex min-w-0 flex-1 items-center', !showMenu && 'pl-3')}>\n {title ?? logo}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-0.5\">{actions}</div>}\n </div>\n )\n}\n\n/**\n * A tab's label. It wraps at word boundaries and is never clipped or cut with an ellipsis; a tab\n * narrower than 4.5rem sets it one size smaller so a long single word still fits, and an item with\n * a `shortLabel` shows that one while its tab is narrower than 5.5rem.\n */\nfunction TabLabel({ item }: { item: NavItem }) {\n const wrap =\n 'max-w-full text-balance px-0.5 text-center [overflow-wrap:normal] @max-[4.5rem]:text-[10px]'\n if (!item.shortLabel) return <span className={wrap}>{item.label}</span>\n return (\n <>\n <span data-slot=\"tab-short-label\" aria-hidden=\"true\" className={cn(wrap, '@[5.5rem]:hidden')}>\n {item.shortLabel}\n </span>\n <span className={cn(wrap, 'hidden @[5.5rem]:block')}>{item.label}</span>\n <span className=\"sr-only @[5.5rem]:hidden\">{item.label}</span>\n </>\n )\n}\n\nexport interface MobileTabBarProps {\n /** The workspace's main areas; test ids are `{testIdPrefix}-{id}` (prefix default `mobile-tab`). */\n items: NavItem[]\n label?: string\n labels?: Partial<Pick<MobileBarsLabels, 'workspaceSections'>>\n testIdPrefix?: string\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * Phone bottom navigation: a 64px tinted bar of the main areas. The drawer carries the same\n * destinations with counts, so nothing is reachable only here. The app mounts it on small\n * screens only.\n */\nexport function MobileTabBar({\n items,\n label,\n labels,\n testIdPrefix,\n className,\n 'data-testid': testId,\n}: MobileTabBarProps) {\n const navRef = useRef<HTMLElement>(null)\n // Floating elements (install prompt, toasts) read the bar's height from `--shell-bottom-inset`.\n useShellBottomInset(navRef)\n return (\n <nav\n ref={navRef}\n aria-label={\n label ?? labels?.workspaceSections ?? DEFAULT_MOBILE_BARS_LABELS.workspaceSections\n }\n data-slot=\"mobile-tab-bar\"\n data-testid={testIdOr(testId, { testId: 'mobile-tab-bar' })}\n className={cn(\n 'flex min-h-16 flex-shrink-0 items-stretch bg-sidebar px-2 pb-safe sm:hidden',\n className\n )}\n >\n {items.map((item) => (\n <ActionLink\n key={item.id}\n href={item.href}\n onSelect={item.onSelect}\n disabled={item.disabled}\n aria-current={item.active ? 'page' : undefined}\n className={cn(\n // Each tab is a size container: a `shortLabel` replaces the label when it is narrow.\n '@container flex min-h-12 min-w-0 flex-1 flex-col items-center justify-center gap-0.5 rounded-md text-[11px] leading-tight transition-colors',\n item.active\n ? 'font-semibold text-primary'\n : 'font-medium text-muted-foreground hover:text-foreground'\n )}\n data-testid={prefixedTestId(testIdPrefix, item.id, { testId: `mobile-tab-${item.id}` })}\n >\n {item.icon}\n <TabLabel item={item} />\n </ActionLink>\n ))}\n </nav>\n )\n}\n","/**\n * Per-browser PWA install instructions, for when the browser cannot open the install dialog\n * directly (iOS Safari, Safari on macOS, Firefox, or a Chromium browser that never fired\n * `beforeinstallprompt`). Only Chromium exposes a JS trigger, so off that path we tell the user\n * the right gesture for their browser.\n */\n\nexport interface InstallGuide {\n heading: string\n steps: string[]\n note?: string\n}\n\nexport interface InstallInstructionsOptions {\n /** Name shown in the steps. Default `this app`. */\n appName?: string\n}\n\n/** True on iPhone/iPad/iPod, including iPadOS reporting as a Mac. */\nexport function isIosDevice(): boolean {\n if (typeof navigator === 'undefined') return false\n return (\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n )\n}\n\n/** Pick install steps for the current browser/platform. */\nexport function getInstallInstructions({\n appName = 'this app',\n}: InstallInstructionsOptions = {}): InstallGuide {\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n return {\n heading: `Install ${appName}`,\n steps: [`Open ${appName} in Chrome, Edge, or Safari to install it.`],\n }\n }\n\n const ua = navigator.userAgent\n const isChromium = 'onbeforeinstallprompt' in window\n const isFirefox = /firefox|fxios/i.test(ua)\n const isMac = /Macintosh|Mac OS X/.test(ua)\n\n if (isIosDevice()) {\n return {\n heading: 'Install on iPhone or iPad',\n steps: [\n `Open ${appName} in Safari, then tap the Share button.`,\n 'Scroll down and tap “Add to Home Screen”.',\n `Tap “Add”: ${appName} appears on your home screen.`,\n ],\n }\n }\n\n if (isChromium) {\n return {\n heading: `Install ${appName}`,\n steps: [\n 'Click the install icon at the right of the address bar (a small monitor with a down arrow).',\n 'Choose “Install” in the dialog that appears.',\n ],\n note: `On a phone, open the browser menu and choose “Install app” / “Add to Home screen”. If you don’t see the option, ${appName} may already be installed.`,\n }\n }\n\n if (isMac && !isFirefox) {\n return {\n heading: 'Install on macOS Safari',\n steps: ['In the menu bar, open the File menu.', 'Choose “Add to Dock”.'],\n note: 'Requires Safari 17 or later (macOS Sonoma). On older Safari, use Chrome or Edge to install.',\n }\n }\n\n if (isFirefox) {\n return {\n heading: 'Firefox can’t install web apps',\n steps: [`Open ${appName} in Chrome, Edge, or Safari to install it as an app.`],\n }\n }\n\n return {\n heading: `Install ${appName}`,\n steps: [\n 'Look for an “Install” or “Add to Home Screen” option in your browser’s menu or address bar.',\n ],\n }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { getInstallInstructions, isIosDevice, type InstallGuide } from './install-instructions'\n\n/** Non-standard Chromium event, not in lib.dom types. */\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: string[]\n readonly userChoice: Promise<{ outcome: 'accepted' | 'dismissed'; platform: string }>\n prompt(): Promise<void>\n}\n\nlet deferredPrompt: BeforeInstallPromptEvent | null = null\nlet installed = false\nlet initialized = false\nlet autoPromptParam: string | null = null\n\nconst subscribers = new Set<() => void>()\nconst notify = () => subscribers.forEach((fn) => fn())\n\nfunction isStandalone(): boolean {\n if (typeof window === 'undefined') return false\n const iosStandalone = (navigator as Navigator & { standalone?: boolean }).standalone === true\n return window.matchMedia?.('(display-mode: standalone)').matches === true || iosStandalone\n}\n\nfunction wantsAutoPrompt(): boolean {\n if (!autoPromptParam) return false\n return new URLSearchParams(window.location.search).get(autoPromptParam) === 'true'\n}\n\nfunction onBeforeInstallPrompt(event: Event): void {\n event.preventDefault()\n deferredPrompt = event as BeforeInstallPromptEvent\n notify()\n if (wantsAutoPrompt()) void promptAppInstall()\n}\n\nfunction onAppInstalled(): void {\n installed = true\n deferredPrompt = null\n notify()\n}\n\n/**\n * Begin capturing install events. Idempotent. Chromium fires `beforeinstallprompt` once, early,\n * usually before a lazy route has mounted, so call this at app startup (before the first render);\n * `useInstallPrompt` also calls it, which is enough when the hook mounts at the root.\n *\n * `options.autoPromptParam`: a share link `/?{param}=true` opens the native dialog as soon as the\n * browser is ready (Chromium).\n */\nexport function initInstallPrompt(options: { autoPromptParam?: string } = {}): void {\n if (options.autoPromptParam) autoPromptParam = options.autoPromptParam\n if (initialized || typeof window === 'undefined') return\n initialized = true\n installed = isStandalone()\n\n window.addEventListener('beforeinstallprompt', onBeforeInstallPrompt)\n window.addEventListener('appinstalled', onAppInstalled)\n}\n\n/**\n * Open the browser's install dialog if one was captured. Returns false when there is none (the\n * caller then shows {@link getInstallInstructions}). A captured prompt works once.\n */\nexport async function promptAppInstall(): Promise<boolean> {\n if (!deferredPrompt) return false\n const prompt = deferredPrompt\n deferredPrompt = null\n notify()\n try {\n await prompt.prompt()\n } catch {\n // The user dismissed it or the browser rejected it: nothing actionable.\n }\n return true\n}\n\n/** Default storage key of the remembered dismissal. */\nexport const INSTALL_PROMPT_DISMISSED_KEY = 'arbi-blocks:install-prompt-dismissed'\nconst DAY_MS = 24 * 60 * 60 * 1000\n\nfunction readDismissedAt(key: string): number | null {\n try {\n const raw = window.localStorage.getItem(key)\n const at = raw ? Number(raw) : NaN\n return Number.isFinite(at) ? at : null\n } catch {\n return null\n }\n}\n\nexport interface UseInstallPromptOptions {\n /** localStorage key remembering a dismissal. */\n storageKey?: string\n /** Days a dismissal is remembered. Default 30. */\n dismissDays?: number\n /** Query param that turns a share link into a one-click install (`install` for `?install=true`). */\n autoPromptParam?: string\n /** App name used in the manual instructions. */\n appName?: string\n}\n\nexport interface UseInstallPromptResult {\n /** A native install dialog can be opened right now (Chromium, once the event fired). */\n canPrompt: boolean\n /** Running as an installed app, or `appinstalled` fired. */\n isInstalled: boolean\n /** iOS has no install API: offer manual instructions instead. */\n isIos: boolean\n /** The user dismissed the offer (remembered across visits). */\n isDismissed: boolean\n /** Open the native dialog; false when none is available. */\n promptInstall: () => Promise<boolean>\n /** Hide the offer and remember it. */\n dismiss: () => void\n /** Manual steps for this browser. */\n instructions: InstallGuide\n}\n\n/** The install state of the app, framework-neutral logic behind `InstallPrompt`. */\nexport function useInstallPrompt({\n storageKey = INSTALL_PROMPT_DISMISSED_KEY,\n dismissDays = 30,\n autoPromptParam: autoParam,\n appName,\n}: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const [, forceRender] = useState(0)\n const [dismissedAt, setDismissedAt] = useState<number | null>(() =>\n typeof window === 'undefined' ? null : readDismissedAt(storageKey)\n )\n\n useEffect(() => {\n initInstallPrompt({ autoPromptParam: autoParam })\n const onChange = () => forceRender((n) => n + 1)\n subscribers.add(onChange)\n // The singleton may have started before this mount: pick up the current state.\n onChange()\n return () => {\n subscribers.delete(onChange)\n }\n }, [autoParam])\n\n const dismiss = useCallback(() => {\n const now = Date.now()\n setDismissedAt(now)\n try {\n window.localStorage.setItem(storageKey, String(now))\n } catch {\n // Storage blocked: the dismissal lasts for this page view only.\n }\n }, [storageKey])\n\n const isDismissed = dismissedAt !== null && Date.now() - dismissedAt < dismissDays * DAY_MS\n const isInstalled = installed || isStandalone()\n return {\n canPrompt: !isInstalled && deferredPrompt !== null,\n isInstalled,\n isIos: isIosDevice(),\n isDismissed,\n promptInstall: promptAppInstall,\n dismiss,\n instructions: getInstallInstructions({ appName }),\n }\n}\n\n/** Test seam: forget captured state (the singleton lives for the page). */\nexport function resetInstallPromptForTests(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('beforeinstallprompt', onBeforeInstallPrompt)\n window.removeEventListener('appinstalled', onAppInstalled)\n }\n deferredPrompt = null\n installed = false\n initialized = false\n autoPromptParam = null\n subscribers.clear()\n}\n","import { useState } from 'react'\nimport { Download, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { useInstallPrompt, type UseInstallPromptOptions } from './use-install-prompt'\n\n/** Fixed strings of the install prompt. */\nexport interface InstallPromptLabels {\n /** The pill's text. */\n install: string\n /** The dismiss button's accessible name. */\n dismiss: string\n /** Accessible name of the pill (`{app}` is replaced by `appName`). */\n installAs: string\n}\n\nexport const DEFAULT_INSTALL_PROMPT_LABELS: InstallPromptLabels = {\n install: 'Install app',\n dismiss: 'Dismiss install prompt',\n installAs: 'Install {app} as an app',\n}\n\nexport interface InstallPromptProps extends UseInstallPromptOptions {\n /** Which bottom corner the pill sits in. Default `start` (clear of a bottom-right toaster). */\n placement?: 'start' | 'end'\n labels?: Partial<InstallPromptLabels>\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * A small floating \"Install app\" pill. Renders only while the app can be installed (the browser\n * fired `beforeinstallprompt`, or on iOS where it shows the Add to Home Screen steps), is not\n * already installed, and was not dismissed (the dismissal is remembered for `dismissDays`).\n *\n * It sits above whatever is pinned to the bottom of the screen: it reads `--shell-bottom-inset`\n * (set by `MobileTabBar` and the chat composer, see `useShellBottomInset`) plus the device\n * safe area, so it never covers the tab bar or the composer. In the start corner it also clears a\n * docked `Sidebar` (`--shell-start-inset`). Both controls are 44px tall on a phone.\n */\nexport function InstallPrompt({\n placement = 'start',\n labels,\n className,\n 'data-testid': testId,\n ...options\n}: InstallPromptProps) {\n const l = { ...DEFAULT_INSTALL_PROMPT_LABELS, ...labels }\n const install = useInstallPrompt(options)\n const [showSteps, setShowSteps] = useState(false)\n\n const isOffer = install.canPrompt || install.isIos\n if (install.isInstalled || install.isDismissed || !isOffer) return null\n\n const appName = options.appName ?? 'this app'\n const onInstall = async () => {\n if (install.canPrompt) await install.promptInstall()\n else setShowSteps((open) => !open)\n }\n\n return (\n <div\n data-slot=\"install-prompt\"\n data-testid={testIdOr(testId, { testId: 'install-app-prompt' })}\n className={cn(\n 'fixed z-30 flex max-w-[calc(100vw-1.5rem)] flex-col gap-2',\n // Above the bottom bars (tab bar / composer) and the home indicator on a phone, a plain\n // corner offset from `sm` up where the tab bar is gone.\n 'bottom-[calc(max(var(--shell-bottom-inset,0px),env(safe-area-inset-bottom,0px))+0.75rem)] sm:bottom-[calc(env(safe-area-inset-bottom,0px)+0.75rem)]',\n // From `sm` up, clear of a docked sidebar (its footer holds the account menu).\n placement === 'start'\n ? 'left-3 items-start sm:left-[calc(var(--shell-start-inset,0px)+0.75rem)]'\n : 'right-3 items-end',\n className\n )}\n >\n {showSteps && (\n <div\n data-slot=\"install-prompt-steps\"\n className=\"w-72 max-w-full rounded-lg border border-border bg-card p-3 text-sm text-card-foreground shadow-lg\"\n >\n <p className=\"font-medium\">{install.instructions.heading}</p>\n <ol className=\"mt-2 list-decimal space-y-1 pl-5 text-muted-foreground\">\n {install.instructions.steps.map((step) => (\n <li key={step}>{step}</li>\n ))}\n </ol>\n </div>\n )}\n <div className=\"inline-flex items-center rounded-full border border-border bg-card/95 text-foreground shadow-sm backdrop-blur\">\n <button\n type=\"button\"\n onClick={() => void onInstall()}\n aria-label={l.installAs.replace('{app}', appName)}\n aria-expanded={install.canPrompt ? undefined : showSteps}\n data-slot=\"install-prompt-action\"\n className=\"inline-flex min-h-11 items-center gap-1.5 rounded-full pl-4 pr-2 text-xs font-medium transition-colors hover:bg-accent sm:min-h-9 sm:pl-3\"\n >\n <Download className=\"size-3.5\" aria-hidden=\"true\" />\n {l.install}\n </button>\n <button\n type=\"button\"\n onClick={install.dismiss}\n aria-label={l.dismiss}\n data-slot=\"install-prompt-dismiss\"\n className=\"inline-flex size-11 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground sm:size-9\"\n >\n <X className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )\n}\n","import { CheckCircle2, Loader2, TriangleAlert } from 'lucide-react'\nimport type { StatusRowTone } from './StatusRow'\n\nexport const STATUS_ROW_BASE_CLASS =\n 'flex items-center gap-2 rounded-md text-sm font-medium transition-colors hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'\n\nexport const STATUS_ROW_TONES: Record<\n StatusRowTone,\n { className: string; Icon: typeof Loader2; spin?: boolean }\n> = {\n progress: { className: 'bg-muted text-foreground', Icon: Loader2, spin: true },\n success: { className: 'bg-green-bg text-green-text', Icon: CheckCircle2 },\n error: { className: 'bg-red-bg text-red-text', Icon: TriangleAlert },\n}\n","import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { STATUS_ROW_BASE_CLASS, STATUS_ROW_TONES } from './status-row-styles'\n\nexport type StatusRowTone = 'progress' | 'success' | 'error'\n\nexport interface StatusRowProps {\n tone: StatusRowTone\n /** e.g. \"Processing 3 files…\". Always the accessible name; hidden visually when `compact`. */\n label: string\n /** Opens the thing the status is about (the processing panel). */\n onClick: () => void\n /** Icon-only (the collapsed rail). */\n compact?: boolean\n /** Replaces the tone's default glyph. */\n icon?: ReactNode\n 'data-testid'?: string\n}\n\n/**\n * A live status line for the sidebar footer: a spinner and a short sentence that opens the\n * thing it reports on. The host renders it ONLY while the state is relevant (work running,\n * something failed), so a quiet app shows nothing. Announced politely to screen readers.\n */\nexport function StatusRow({\n tone,\n label,\n onClick,\n compact = false,\n icon,\n 'data-testid': testId,\n}: StatusRowProps) {\n const { className, Icon, spin } = STATUS_ROW_TONES[tone]\n return (\n <div role=\"status\" data-slot=\"status-row\" className={cn(compact && 'flex justify-center')}>\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n title={label}\n data-testid={testId}\n data-tone={tone}\n className={cn(\n STATUS_ROW_BASE_CLASS,\n compact ? 'size-9 justify-center pointer-coarse:size-11' : 'w-full px-2.5 py-1.5',\n className\n )}\n >\n {icon ?? (\n <Icon\n className={cn('size-4 shrink-0', spin && 'animate-spin motion-reduce:animate-none')}\n />\n )}\n {!compact && <span className=\"min-w-0 flex-1 truncate text-left\">{label}</span>}\n </button>\n </div>\n )\n}\n\n/** Short live state at a navigation row's right edge, replacing inventory counts. */\nexport function StatusBadge({\n tone,\n label,\n onClick,\n onDismiss,\n 'data-testid': testId,\n}: {\n tone: StatusRowTone\n label: string\n onClick?: () => void\n onDismiss?: () => void\n 'data-testid'?: string\n}) {\n const className = cn(\n 'rounded-md px-1.5 py-0.5 text-xs font-medium whitespace-nowrap',\n STATUS_ROW_TONES[tone].className\n )\n return (\n <span\n role=\"status\"\n className={cn(\n 'ml-auto inline-flex items-center rounded-md',\n STATUS_ROW_TONES[tone].className\n )}\n data-testid={testId}\n data-tone={tone}\n >\n {onClick ? (\n <button\n type=\"button\"\n title={label}\n className={className}\n onClick={(event) => {\n event.stopPropagation()\n onClick()\n }}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {label}\n </button>\n ) : (\n <span className={className}>{label}</span>\n )}\n {onDismiss && (\n <button\n type=\"button\"\n aria-label={`Dismiss ${label}`}\n title=\"Dismiss\"\n className=\"mr-1 rounded-sm p-0.5 opacity-60 hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={(event) => {\n event.stopPropagation()\n onDismiss()\n }}\n onKeyDown={(event) => event.stopPropagation()}\n >\n <X className=\"size-3\" />\n </button>\n )}\n </span>\n )\n}\n","import { RefreshCw, TriangleAlert, WifiOff } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { SidebarRowHoverContext } from './Sidebar'\nimport { SidebarRowAction } from './SidebarRowAction'\n\nexport type OfflinePillTone = 'offline' | 'failed' | 'syncing'\n\n/** Fixed strings of the offline pill. */\nexport interface OfflinePillLabels {\n reconnect: string\n}\n\nexport const DEFAULT_OFFLINE_PILL_LABELS: OfflinePillLabels = {\n reconnect: 'Reconnect',\n}\n\nexport interface OfflinePillProps {\n tone: OfflinePillTone\n /** e.g. \"Offline · 3 pending\", \"2 failed to sync\", \"Syncing 4…\". */\n label: string\n /** Icon-only (the collapsed rail / app bar). */\n compact?: boolean\n /** Opens the pending-changes list. */\n onOpen: () => void\n /** Offered beside the pill (only when not compact); pass it only while it can do something. */\n onReconnect?: () => void\n labels?: Partial<OfflinePillLabels>\n /** Pill button id (default `offline-sync-status`). */\n 'data-testid'?: string\n /** Reconnect button id (default `offline-reconnect-button`). */\n reconnectTestId?: string\n}\n\nconst TONES: Record<OfflinePillTone, { className: string; Icon: typeof WifiOff }> = {\n offline: { className: 'bg-yellow-bg text-yellow-text', Icon: WifiOff },\n failed: { className: 'bg-red-bg text-red-text', Icon: TriangleAlert },\n syncing: { className: 'bg-blue-bg text-blue-text', Icon: RefreshCw },\n}\n\n/**\n * Connection + sync indicator: a status pill that opens the pending-changes list, plus an\n * optional Reconnect button beside it. The app renders it only when there is something to say\n * (offline, or changes waiting/failing), so online-and-synced stays clean.\n */\nexport function OfflinePill({\n tone,\n label,\n compact = false,\n onOpen,\n onReconnect,\n labels,\n 'data-testid': testId,\n reconnectTestId,\n}: OfflinePillProps) {\n const { className, Icon } = TONES[tone]\n return (\n <div\n className={cn('flex items-center gap-1', compact && 'justify-center')}\n data-slot=\"offline-pill\"\n >\n <button\n type=\"button\"\n data-testid={testIdOr(testId, { testId: 'offline-sync-status' })}\n aria-label={label}\n title={label}\n onClick={onOpen}\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-md px-2.5 py-1.5 text-sm font-medium transition-colors hover:brightness-95 pointer-coarse:min-h-11',\n compact && 'flex-none justify-center',\n className\n )}\n >\n <Icon className={cn('size-4 shrink-0', tone === 'syncing' && 'animate-spin')} />\n {!compact && <span className=\"truncate\">{label}</span>}\n </button>\n {!compact && onReconnect && (\n // Forced visible (context true): there is no row to hover.\n <SidebarRowHoverContext.Provider value={true}>\n <SidebarRowAction\n label={labels?.reconnect ?? DEFAULT_OFFLINE_PILL_LABELS.reconnect}\n onClick={onReconnect}\n data-testid={testIdOr(reconnectTestId, { testId: 'offline-reconnect-button' })}\n >\n <RefreshCw className=\"size-5\" />\n </SidebarRowAction>\n </SidebarRowHoverContext.Provider>\n )}\n </div>\n )\n}\n","import { MousePointerClick, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Fixed strings of the remote-control pill. */\nexport interface RemoteControlPillLabels {\n /** The disable button (the `disableLabel` prop wins). */\n turnOffRemoteControl: string\n}\n\nexport const DEFAULT_REMOTE_CONTROL_PILL_LABELS: RemoteControlPillLabels = {\n turnOffRemoteControl: 'Turn off remote control',\n}\n\nexport interface RemoteControlPillProps {\n /** A run is actively driving the screen (tinted + pulsing). */\n isActive: boolean\n label: string\n onDisable: () => void\n disableLabel?: string\n labels?: Partial<RemoteControlPillLabels>\n /** Root id (default `remote-control-indicator`). */\n 'data-testid'?: string\n /** Disable button id (default `remote-control-indicator-disable`). */\n disableTestId?: string\n}\n\n/**\n * Persistent, unobtrusive status pill shown while remote control is on or a run is executing,\n * with a one-click disable. The app decides when to mount it.\n */\nexport function RemoteControlPill({\n isActive,\n label,\n onDisable,\n disableLabel: disableLabelProp,\n labels,\n 'data-testid': testId,\n disableTestId,\n}: RemoteControlPillProps) {\n const disableLabel =\n disableLabelProp ??\n labels?.turnOffRemoteControl ??\n DEFAULT_REMOTE_CONTROL_PILL_LABELS.turnOffRemoteControl\n return (\n <div\n data-slot=\"remote-control-pill\"\n data-testid={testIdOr(testId, { testId: 'remote-control-indicator' })}\n className={cn(\n 'flex min-w-0 max-w-full items-center gap-1.5 rounded-full py-1 pl-2.5 pr-1 text-xs font-medium',\n isActive ? 'bg-accent text-accent-foreground' : 'bg-muted text-muted-foreground'\n )}\n >\n <MousePointerClick className={cn('size-3.5 shrink-0', isActive && 'animate-pulse')} />\n <span className=\"min-w-0 max-w-[16rem] truncate\">{label}</span>\n <button\n type=\"button\"\n onClick={onDisable}\n title={disableLabel}\n aria-label={disableLabel}\n data-testid={testIdOr(disableTestId, { testId: 'remote-control-indicator-disable' })}\n className=\"flex size-5 shrink-0 items-center justify-center rounded-full transition-colors hover:bg-foreground/10 hover:text-foreground pointer-coarse:size-8\"\n >\n <X className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronLeft, ChevronRight, Lightbulb, Pencil, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Fixed strings of the tip card. */\nexport interface TipCardLabels {\n /** Default CTA text (the `ctaLabel` prop wins). */\n showMe: string\n previousTip: string\n nextTip: string\n editTip: string\n /** The card's heading and accessible name. */\n tip: string\n /** The dismiss button: it turns tips off (they come back from the account menu). */\n hideTips: string\n /** \"1 of 3\". */\n position: (index: number, count: number) => string\n}\n\nexport const DEFAULT_TIP_CARD_LABELS: TipCardLabels = {\n showMe: 'Show me',\n previousTip: 'Previous tip',\n nextTip: 'Next tip',\n editTip: 'Edit tip',\n tip: 'Tip',\n hideTips: 'Hide tips',\n position: (index, count) => `${index} of ${count}`,\n}\n\nexport interface TipCardProps {\n /** The tip text: one sentence. */\n message: ReactNode\n /** Which tip is showing (0-based) out of `count`; the pager appears when `count` > 1. */\n index?: number\n count?: number\n onPrev?: () => void\n onNext?: () => void\n /** The single primary action; omit when the tip has none. */\n ctaLabel?: string\n onCta?: () => void\n /** Turns tips off. The card is dismissible so it never becomes permanent furniture. */\n onDismiss?: () => void\n /** Dev-only edit affordance: the host passes it only in development builds. */\n onEdit?: () => void\n /** Hover pauses the host's tip rotation (desktop enhancement). */\n onHoverChange?: (hovered: boolean) => void\n labels?: Partial<TipCardLabels>\n className?: string\n /** Card id (default `tip-row`). */\n testId?: string\n /** Control ids; defaults are the current ids. */\n testIds?: Partial<Record<'prev' | 'next' | 'cta' | 'edit' | 'dismiss', string>>\n}\n\nconst ICON_BUTTON =\n 'flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11'\n\n/**\n * The Smart Tips card: a compact muted tile. Header (bulb, \"Tip\", dismiss), one sentence, then\n * ONE primary action with a quiet \"n of m\" pager. It is shown only while tips are on and a tip\n * applies; the host owns which tip is current, rotation and the on/off preference.\n */\nexport function TipCard({\n message,\n index = 0,\n count = 1,\n onPrev,\n onNext,\n ctaLabel,\n onCta,\n onDismiss,\n onEdit,\n onHoverChange,\n labels,\n className,\n testId,\n testIds,\n}: TipCardProps) {\n const l = { ...DEFAULT_TIP_CARD_LABELS, ...labels }\n const hasMany = count > 1\n\n return (\n <section\n data-slot=\"tip-card\"\n aria-label={l.tip}\n className={cn('min-w-0 rounded-lg bg-muted p-3 text-sm', className)}\n onMouseEnter={() => onHoverChange?.(true)}\n onMouseLeave={() => onHoverChange?.(false)}\n data-testid={testIdOr(testId, { testId: 'tip-row' })}\n >\n <div className=\"-my-1 flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Lightbulb className=\"size-4 shrink-0 text-primary\" aria-hidden />\n <span>{l.tip}</span>\n <span className=\"-mr-1.5 ml-auto flex items-center\">\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n aria-label={l.editTip}\n title={l.editTip}\n className={cn(ICON_BUTTON, 'text-red-text hover:bg-red-bg hover:text-red-text')}\n data-testid={testIdOr(testIds?.edit, { testId: 'tip-edit' })}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label={l.hideTips}\n title={l.hideTips}\n className={ICON_BUTTON}\n data-testid={testIdOr(testIds?.dismiss, { testId: 'tip-dismiss' })}\n >\n <X className=\"size-4\" />\n </button>\n )}\n </span>\n </div>\n <p className=\"mt-2 text-foreground\">{message}</p>\n {(onCta || hasMany) && (\n <div className=\"mt-3 flex items-center justify-between gap-2\">\n {onCta ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onCta}\n className=\"font-medium text-primary\"\n data-testid={testIdOr(testIds?.cta, { testId: 'page-header-info-cta' })}\n >\n {ctaLabel ?? l.showMe}\n </Button>\n ) : (\n <span />\n )}\n {hasMany && (\n <span className=\"-mr-1.5 flex items-center text-xs text-muted-foreground\">\n <button\n type=\"button\"\n onClick={onPrev}\n aria-label={l.previousTip}\n title={l.previousTip}\n className={ICON_BUTTON}\n data-testid={testIdOr(testIds?.prev, { testId: 'tip-prev' })}\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n <span className=\"min-w-10 text-center tabular-nums\" aria-live=\"polite\">\n {l.position(index + 1, count)}\n </span>\n <button\n type=\"button\"\n onClick={onNext}\n aria-label={l.nextTip}\n title={l.nextTip}\n className={ICON_BUTTON}\n data-testid={testIdOr(testIds?.next, { testId: 'tip-next' })}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </span>\n )}\n </div>\n )}\n </section>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Info, Lightbulb, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport type InfoBarVariant = 'info' | 'warning' | 'success' | 'hint'\n\nconst VARIANT_TONE: Record<InfoBarVariant, string> = {\n info: 'bg-blue-bg text-primary border-blue-border',\n warning: 'bg-yellow-bg text-yellow-text border-yellow-border',\n success: 'bg-green-bg text-green-text border-green-border',\n hint: 'bg-blue-bg text-foreground border-blue-border',\n}\n\nexport interface InfoBarProps {\n message: ReactNode\n variant?: InfoBarVariant\n /** Suppress the leading variant icon (e.g. tips render their own \"Tip:\" label). */\n hideIcon?: boolean\n /** Element pinned to the right of the bar (e.g. a reward balance). */\n rightSlot?: ReactNode\n cta?: { label: string; onClick: () => void; icon?: ReactNode }\n onDismiss?: () => void\n dismissLabel?: string\n className?: string\n}\n\n/** Full-width page banner: icon, message, optional right slot, CTA and dismiss. */\nexport function InfoBar({\n message,\n variant = 'info',\n hideIcon,\n rightSlot,\n cta,\n onDismiss,\n dismissLabel = 'Dismiss',\n className,\n}: InfoBarProps) {\n const VariantIcon = variant === 'hint' ? Lightbulb : Info\n return (\n <div\n className={cn('relative z-10 flex w-full items-center pt-1', className)}\n data-slot=\"info-bar\"\n >\n <div\n className={cn(\n 'flex w-full flex-wrap items-center gap-3 rounded-md border px-3 py-[7px]',\n VARIANT_TONE[variant]\n )}\n data-testid=\"page-header-info-box\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n {!hideIcon && <VariantIcon className=\"hidden size-4 shrink-0 sm:block\" />}\n <div className=\"min-w-0 flex-1 text-sm\">{message}</div>\n </div>\n <div className=\"flex w-full items-center gap-2 sm:ml-auto sm:w-auto\">\n {rightSlot}\n {cta && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={cta.onClick}\n className=\"h-8 flex-1 shrink-0 sm:flex-initial pointer-coarse:h-11\"\n data-testid=\"page-header-info-cta\"\n >\n {cta.icon && <span className=\"mr-1\">{cta.icon}</span>}\n {cta.label}\n </Button>\n )}\n {onDismiss && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDismiss}\n aria-label={dismissLabel}\n className=\"size-8 shrink-0 p-0 hover:bg-foreground/5 pointer-coarse:size-11\"\n data-testid=\"page-header-info-dismiss\"\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nconst SECONDARY_WIDTH = {\n sm: '@3xl:w-72',\n md: '@3xl:w-80',\n lg: '@3xl:w-96',\n xl: '@3xl:w-[28rem]',\n} as const\n\nexport interface SplitLayoutProps {\n /** The main pane (the detail, the form, the transcript): takes the remaining width. */\n primary: ReactNode\n /** The side pane (the list, the preview, the launcher): fixed width beside, full width below. */\n secondary: ReactNode\n /** Width of the side pane once beside the main one. Default `md` (20rem). */\n secondarySize?: keyof typeof SECONDARY_WIDTH\n /** Which side the secondary pane sits on once side by side. Default `end`. */\n secondaryPosition?: 'start' | 'end'\n /** When stacked, show the secondary pane first. Default false (primary first). */\n secondaryFirstWhenStacked?: boolean\n className?: string\n primaryClassName?: string\n secondaryClassName?: string\n testId?: string\n}\n\n/**\n * Two panes (list and detail, form and preview) that stack by the width of their CONTAINER,\n * not the viewport: side by side from 48rem of container width, stacked below. Inside\n * `Shell.Content` / `PageContainer` (both are containers) an open dock or a narrow window\n * therefore stacks the panes instead of squeezing the main one to a sliver. Every pane has\n * `min-w-0`, so long words and wide tables shrink instead of stretching the grid.\n */\nexport function SplitLayout({\n primary,\n secondary,\n secondarySize = 'md',\n secondaryPosition = 'end',\n secondaryFirstWhenStacked = false,\n className,\n primaryClassName,\n secondaryClassName,\n testId = 'split-layout',\n}: SplitLayoutProps) {\n const secondaryAtStart = secondaryPosition === 'start'\n return (\n <div\n data-slot=\"split-layout\"\n data-testid={testId}\n className={cn('flex flex-col gap-6 @3xl:flex-row @3xl:items-start', className)}\n >\n <div\n data-slot=\"split-primary\"\n className={cn(\n 'min-w-0 @3xl:flex-1',\n secondaryFirstWhenStacked && 'order-2',\n secondaryAtStart ? '@3xl:order-2' : '@3xl:order-1',\n primaryClassName\n )}\n >\n {primary}\n </div>\n <div\n data-slot=\"split-secondary\"\n className={cn(\n 'min-w-0 @3xl:shrink-0',\n SECONDARY_WIDTH[secondarySize],\n secondaryFirstWhenStacked && 'order-1',\n secondaryAtStart ? '@3xl:order-1' : '@3xl:order-2',\n secondaryClassName\n )}\n >\n {secondary}\n </div>\n </div>\n )\n}\n"]}
@@ -38,7 +38,7 @@ var chunk5V4HH7EH_cjs = require('../chunk-5V4HH7EH.cjs');
38
38
  require('../chunk-7G2LJMUG.cjs');
39
39
  var chunkTM2D4XT4_cjs = require('../chunk-TM2D4XT4.cjs');
40
40
  var chunk5Y6V7F6W_cjs = require('../chunk-5Y6V7F6W.cjs');
41
- var chunkGX5MKJ3F_cjs = require('../chunk-GX5MKJ3F.cjs');
41
+ var chunkHNEOW7F3_cjs = require('../chunk-HNEOW7F3.cjs');
42
42
  var chunkY42LJ4TF_cjs = require('../chunk-Y42LJ4TF.cjs');
43
43
  require('../chunk-VLCY46K6.cjs');
44
44
  require('../chunk-D54JXTPG.cjs');
@@ -73,7 +73,7 @@ var chunkZW6FPIFC_cjs = require('../chunk-ZW6FPIFC.cjs');
73
73
  var chunkDWWRLKEZ_cjs = require('../chunk-DWWRLKEZ.cjs');
74
74
  var chunkLNYEYR7W_cjs = require('../chunk-LNYEYR7W.cjs');
75
75
  var chunkZ2XZ2D4N_cjs = require('../chunk-Z2XZ2D4N.cjs');
76
- require('../chunk-B6MVQCXW.cjs');
76
+ var chunkB6MVQCXW_cjs = require('../chunk-B6MVQCXW.cjs');
77
77
  var chunkEZLZ3MDU_cjs = require('../chunk-EZLZ3MDU.cjs');
78
78
  var chunk76L6LOP3_cjs = require('../chunk-76L6LOP3.cjs');
79
79
  require('../chunk-32HW2Q33.cjs');
@@ -1221,7 +1221,7 @@ function WorkspaceBadge({ workspace }) {
1221
1221
  ui.ShieldIcon,
1222
1222
  {
1223
1223
  char: workspace.name.charAt(0),
1224
- workspaceColor: chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
1224
+ workspaceColor: chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
1225
1225
  size: 16
1226
1226
  }
1227
1227
  ),
@@ -7174,7 +7174,7 @@ function ConnectedExportPanel({
7174
7174
  ui.ShieldIcon,
7175
7175
  {
7176
7176
  char: w.name.charAt(0),
7177
- workspaceColor: chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(w)),
7177
+ workspaceColor: chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(w)),
7178
7178
  size: 32,
7179
7179
  isSelected: false
7180
7180
  }
@@ -7361,7 +7361,7 @@ function OpenExportDialog({
7361
7361
  ui.ShieldIcon,
7362
7362
  {
7363
7363
  char: workspace.name.charAt(0),
7364
- workspaceColor: chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
7364
+ workspaceColor: chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
7365
7365
  size: 20,
7366
7366
  isSelected: false
7367
7367
  }
@@ -10779,7 +10779,7 @@ function ConnectedWorkspaceSettings({
10779
10779
  testId: "workspace-home-title",
10780
10780
  hideLabel: true,
10781
10781
  leading: /* @__PURE__ */ jsxRuntime.jsx(
10782
- chunkGX5MKJ3F_cjs.WorkspaceIdentity,
10782
+ chunkHNEOW7F3_cjs.WorkspaceIdentity,
10783
10783
  {
10784
10784
  workspace: {
10785
10785
  ...react.toShellWorkspace(workspace),
@@ -11666,7 +11666,7 @@ function ConnectedWorkspaceEntity({
11666
11666
  ...shieldProps
11667
11667
  }) {
11668
11668
  const name = workspace.name;
11669
- const workspaceColor = chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(workspace));
11669
+ const workspaceColor = chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(workspace));
11670
11670
  const shield = /* @__PURE__ */ jsxRuntime.jsx(
11671
11671
  ui.ShieldIcon,
11672
11672
  {
@@ -15091,7 +15091,7 @@ function WorkspaceCardsView({
15091
15091
  ui.ShieldIcon,
15092
15092
  {
15093
15093
  char: workspace.name.charAt(0),
15094
- workspaceColor: chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
15094
+ workspaceColor: chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
15095
15095
  size: 28,
15096
15096
  isSelected: true
15097
15097
  }
@@ -23177,7 +23177,7 @@ function downloadIcs(ics, filename) {
23177
23177
  }
23178
23178
  var PAGE_DAYS = 14;
23179
23179
  var selectClass6 = "h-9 rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm";
23180
- function Shell({ children, wide = false }) {
23180
+ function Shell2({ children, wide = false }) {
23181
23181
  return /* @__PURE__ */ jsxRuntime.jsx("main", { className: "flex min-h-dvh items-start justify-center bg-background px-4 py-6 text-foreground sm:items-center sm:py-10", children: /* @__PURE__ */ jsxRuntime.jsxs(
23182
23182
  "div",
23183
23183
  {
@@ -23196,7 +23196,7 @@ function CancelView({ slug, token }) {
23196
23196
  const { apiBaseUrl } = chunkB3NYBMDR_cjs.useBlocksEnvironment().runtimeConfig;
23197
23197
  const [state, setState] = React9.useState("idle");
23198
23198
  const [error, setError] = React9.useState(null);
23199
- return /* @__PURE__ */ jsxRuntime.jsx(Shell, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4", "data-testid": "book-cancel", children: [
23199
+ return /* @__PURE__ */ jsxRuntime.jsx(Shell2, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4", "data-testid": "book-cancel", children: [
23200
23200
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
23201
23201
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarX, { className: "size-5 text-muted-foreground" }),
23202
23202
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-lg font-semibold", children: state === "done" ? "Booking cancelled" : "Cancel your booking?" })
@@ -23238,7 +23238,7 @@ function Confirmation({
23238
23238
  zone
23239
23239
  }) {
23240
23240
  const link = bookingCancelLink(confirmation.cancel_token);
23241
- return /* @__PURE__ */ jsxRuntime.jsx(Shell, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4", "data-testid": "book-confirmed", children: [
23241
+ return /* @__PURE__ */ jsxRuntime.jsx(Shell2, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4", "data-testid": "book-confirmed", children: [
23242
23242
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
23243
23243
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarCheck, { className: "size-5 text-emerald-600 dark:text-emerald-400" }),
23244
23244
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-lg font-semibold", children: "You're booked" })
@@ -23335,7 +23335,7 @@ function ConnectedPublicBooking({ slug, cancelToken }) {
23335
23335
  if (cancelToken) return /* @__PURE__ */ jsxRuntime.jsx(CancelView, { slug, token: cancelToken });
23336
23336
  if (confirmation) return /* @__PURE__ */ jsxRuntime.jsx(Confirmation, { slug, confirmation, zone });
23337
23337
  if (!page) {
23338
- return /* @__PURE__ */ jsxRuntime.jsx(Shell, { children: loading ? /* @__PURE__ */ jsxRuntime.jsxs(
23338
+ return /* @__PURE__ */ jsxRuntime.jsx(Shell2, { children: loading ? /* @__PURE__ */ jsxRuntime.jsxs(
23339
23339
  "div",
23340
23340
  {
23341
23341
  className: "flex items-center gap-2 text-sm text-muted-foreground",
@@ -23356,7 +23356,7 @@ function ConnectedPublicBooking({ slug, cancelToken }) {
23356
23356
  new Date(new Date(picked).getTime() + chosenDuration * 6e4).toISOString(),
23357
23357
  zone
23358
23358
  ) : "";
23359
- return /* @__PURE__ */ jsxRuntime.jsxs(Shell, { wide: true, children: [
23359
+ return /* @__PURE__ */ jsxRuntime.jsxs(Shell2, { wide: true, children: [
23360
23360
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "mb-5 grid gap-1", children: [
23361
23361
  page.owner_name && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", "data-testid": "book-owner", children: page.owner_name }),
23362
23362
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold", "data-testid": "book-title", children: page.title }),
@@ -31820,7 +31820,7 @@ function ConnectedAccountCluster({
31820
31820
  if (!open) return null;
31821
31821
  const current = activePage === page;
31822
31822
  return /* @__PURE__ */ jsxRuntime.jsx(
31823
- chunkGX5MKJ3F_cjs.SidebarBadgeRow,
31823
+ chunkHNEOW7F3_cjs.SidebarBadgeRow,
31824
31824
  {
31825
31825
  icon: icon2,
31826
31826
  label,
@@ -31837,7 +31837,7 @@ function ConnectedAccountCluster({
31837
31837
  );
31838
31838
  };
31839
31839
  const bell = layout === "drawer" ? /* @__PURE__ */ jsxRuntime.jsx(
31840
- chunkGX5MKJ3F_cjs.SidebarBadgeRow,
31840
+ chunkHNEOW7F3_cjs.SidebarBadgeRow,
31841
31841
  {
31842
31842
  icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bell, { className: "size-5" }),
31843
31843
  label: "Notifications",
@@ -31871,7 +31871,7 @@ function ConnectedAccountCluster({
31871
31871
  side,
31872
31872
  align,
31873
31873
  renderTrigger: layout === "bar" ? void 0 : ({ unread, ariaLabel, testId }) => /* @__PURE__ */ jsxRuntime.jsx(
31874
- chunkGX5MKJ3F_cjs.SidebarBadgeRow,
31874
+ chunkHNEOW7F3_cjs.SidebarBadgeRow,
31875
31875
  {
31876
31876
  icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bell, { className: "size-5" }),
31877
31877
  label: "Notifications",
@@ -31884,7 +31884,7 @@ function ConnectedAccountCluster({
31884
31884
  }
31885
31885
  );
31886
31886
  const contacts = showContacts && openContacts ? /* @__PURE__ */ jsxRuntime.jsx(
31887
- chunkGX5MKJ3F_cjs.SidebarBadgeRow,
31887
+ chunkHNEOW7F3_cjs.SidebarBadgeRow,
31888
31888
  {
31889
31889
  icon: /* @__PURE__ */ jsxRuntime.jsx(ContactIcon, { className: "size-5" }),
31890
31890
  label: "Contacts",
@@ -31921,7 +31921,7 @@ function ConnectedAccountCluster({
31921
31921
  layout
31922
31922
  );
31923
31923
  return /* @__PURE__ */ jsxRuntime.jsx(
31924
- chunkGX5MKJ3F_cjs.ActionCluster,
31924
+ chunkHNEOW7F3_cjs.ActionCluster,
31925
31925
  {
31926
31926
  layout,
31927
31927
  status: layout === "bar" ? status : null,
@@ -32649,7 +32649,7 @@ function ConnectedReportProblem({
32649
32649
  const bar = layout === "bar";
32650
32650
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32651
32651
  /* @__PURE__ */ jsxRuntime.jsx(
32652
- chunkGX5MKJ3F_cjs.SidebarBadgeRow,
32652
+ chunkHNEOW7F3_cjs.SidebarBadgeRow,
32653
32653
  {
32654
32654
  icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bug, { className: "size-5" }),
32655
32655
  label: "Report a problem",
@@ -36107,7 +36107,7 @@ function useOpenWorkspaceIcon() {
36107
36107
  ui.ShieldIcon,
36108
36108
  {
36109
36109
  char: workspace.name.charAt(0),
36110
- workspaceColor: chunkGX5MKJ3F_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
36110
+ workspaceColor: chunkHNEOW7F3_cjs.workspaceKindColor(react.getWorkspaceKind(workspace)),
36111
36111
  size
36112
36112
  }
36113
36113
  ) : void 0;
@@ -39403,7 +39403,7 @@ var sodiumWarmed = false;
39403
39403
  function warmSodium() {
39404
39404
  if (sodiumWarmed) return;
39405
39405
  sodiumWarmed = true;
39406
- const run = () => void chunkGX5MKJ3F_cjs.prefetchChunk(client.initSodium);
39406
+ const run = () => void chunkHNEOW7F3_cjs.prefetchChunk(client.initSodium);
39407
39407
  if (typeof window.requestIdleCallback === "function") window.requestIdleCallback(run);
39408
39408
  else window.setTimeout(run, 200);
39409
39409
  }
@@ -41557,7 +41557,7 @@ function ConnectedPanelHost({
41557
41557
  onClose();
41558
41558
  }, [onClose]);
41559
41559
  const setFocusedArea = react.useArbiSessionStore().setFocusedArea;
41560
- const { popoutTitle } = chunkGX5MKJ3F_cjs.usePanelHostSupport();
41560
+ const { popoutTitle } = chunkHNEOW7F3_cjs.usePanelHostSupport();
41561
41561
  const focusedArea = react.useArbiSessionState((s) => s.shell.focusedArea);
41562
41562
  const handlePanelFocus = React9.useCallback(() => {
41563
41563
  setFocusedArea(panelId);
@@ -41590,7 +41590,7 @@ function ConnectedPanelHost({
41590
41590
  }, [isExiting]);
41591
41591
  if (!isOpen && !isExiting) return null;
41592
41592
  const modeSwitcher = /* @__PURE__ */ jsxRuntime.jsx(
41593
- chunkGX5MKJ3F_cjs.PanelModeSwitcher,
41593
+ chunkHNEOW7F3_cjs.PanelModeSwitcher,
41594
41594
  {
41595
41595
  mode,
41596
41596
  onModeChange: setPanelMode,
@@ -41616,7 +41616,7 @@ function ConnectedPanelHost({
41616
41616
  }
41617
41617
  );
41618
41618
  return /* @__PURE__ */ jsxRuntime.jsx(
41619
- chunkGX5MKJ3F_cjs.PanelPortal,
41619
+ chunkHNEOW7F3_cjs.PanelPortal,
41620
41620
  {
41621
41621
  defaultWidth,
41622
41622
  panelId,
@@ -41630,6 +41630,76 @@ function ConnectedPanelHost({
41630
41630
  }
41631
41631
  );
41632
41632
  }
41633
+ var AppShellContext = React9.createContext(null);
41634
+ function useAppShell() {
41635
+ const value = React9.useContext(AppShellContext);
41636
+ if (!value) throw new Error("useAppShell requires ConnectedAppShell");
41637
+ return value;
41638
+ }
41639
+ function ConnectedAppShell({
41640
+ banner,
41641
+ topbar,
41642
+ sidebar: sidebarSlot,
41643
+ tabBar,
41644
+ aside,
41645
+ overlays,
41646
+ children,
41647
+ navigationKey,
41648
+ sidebarPolicy,
41649
+ content = { mode: "routed" },
41650
+ page,
41651
+ contentProps,
41652
+ focusMainOnClick = false,
41653
+ ...rootProps
41654
+ }) {
41655
+ const session = react.useArbiSessionStore();
41656
+ const dockedPanel = react.useArbiSessionState((state) => state.shell.panels.docked);
41657
+ const dockSqueezed = chunkFX3K6LNZ_cjs.useMediaQuery(sidebarPolicy?.dockedRailQuery ?? "(max-width: 0px)");
41658
+ const sidebar = chunkHNEOW7F3_cjs.useSidebarController({
41659
+ ...useSessionSidebar(),
41660
+ forceRail: !!sidebarPolicy?.dockedRailQuery && dockSqueezed && dockedPanel !== null,
41661
+ hoverExpansion: sidebarPolicy?.hoverExpansion
41662
+ });
41663
+ const { closeDrawer } = sidebar;
41664
+ React9.useEffect(() => {
41665
+ if (navigationKey !== void 0) closeDrawer();
41666
+ }, [navigationKey, closeDrawer]);
41667
+ const controller = { sidebar };
41668
+ const renderSlot = (slot) => typeof slot === "function" ? slot(controller) : slot;
41669
+ const pageContent = /* @__PURE__ */ jsxRuntime.jsx(chunkB6MVQCXW_cjs.PageContainer, { ...page, children });
41670
+ return /* @__PURE__ */ jsxRuntime.jsx(AppShellContext.Provider, { value: controller, children: /* @__PURE__ */ jsxRuntime.jsx(
41671
+ chunkB6MVQCXW_cjs.Shell.Root,
41672
+ {
41673
+ ...rootProps,
41674
+ banner: renderSlot(banner),
41675
+ topbar: renderSlot(topbar),
41676
+ sidebar: renderSlot(sidebarSlot),
41677
+ tabBar: renderSlot(tabBar),
41678
+ aside: renderSlot(aside),
41679
+ overlays: renderSlot(overlays),
41680
+ children: /* @__PURE__ */ jsxRuntime.jsx(
41681
+ chunkB6MVQCXW_cjs.Shell.Content,
41682
+ {
41683
+ ...contentProps,
41684
+ onClick: (event) => {
41685
+ if (focusMainOnClick) session.setFocusedArea("main");
41686
+ contentProps?.onClick?.(event);
41687
+ },
41688
+ children: content.mode === "docked" ? /* @__PURE__ */ jsxRuntime.jsxs(chunkHNEOW7F3_cjs.DockZone, { "data-testid": content.testId, children: [
41689
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: content.mainPanelVisible ? "hidden" : "h-full min-h-0", children: pageContent }),
41690
+ /* @__PURE__ */ jsxRuntime.jsx(
41691
+ "div",
41692
+ {
41693
+ id: content.mainZoneId ?? "main-zone",
41694
+ className: content.mainPanelVisible ? "h-full" : "hidden"
41695
+ }
41696
+ )
41697
+ ] }) : pageContent
41698
+ }
41699
+ )
41700
+ }
41701
+ ) });
41702
+ }
41633
41703
 
41634
41704
  Object.defineProperty(exports, "CAP_REACHED_MESSAGE", {
41635
41705
  enumerable: true,
@@ -41895,6 +41965,7 @@ exports.ConnectedAgentConfigForm = ConnectedAgentConfigForm;
41895
41965
  exports.ConnectedAgentCreator = ConnectedAgentCreator;
41896
41966
  exports.ConnectedAiReview = ConnectedAiReview;
41897
41967
  exports.ConnectedAppRuntime = ConnectedAppRuntime;
41968
+ exports.ConnectedAppShell = ConnectedAppShell;
41898
41969
  exports.ConnectedAppsSettings = ConnectedAppsSettings;
41899
41970
  exports.ConnectedAuthorizeAgent = ConnectedAuthorizeAgent;
41900
41971
  exports.ConnectedBranchControls = ConnectedBranchControls;
@@ -42161,6 +42232,7 @@ exports.useAccessRequestUnderReview = useAccessRequestUnderReview;
42161
42232
  exports.useAddFromUrls = useAddFromUrls;
42162
42233
  exports.useAiReviewLiveUpdates = useAiReviewLiveUpdates;
42163
42234
  exports.useAiReviewStore = useAiReviewStore;
42235
+ exports.useAppShell = useAppShell;
42164
42236
  exports.useAuthPages = useAuthPages;
42165
42237
  exports.useAutoRefreshPendingProjects = useAutoRefreshPendingProjects;
42166
42238
  exports.useBatchCompleteToasts = useBatchCompleteToasts;