@arbidocs/blocks 0.5.38 → 0.5.40

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.
Files changed (147) hide show
  1. package/README.md +10 -0
  2. package/dist/{ConnectedCallDock-V7DPSE6X.cjs → ConnectedCallDock-NGHSDLJS.cjs} +4 -4
  3. package/dist/{ConnectedCallDock-V7DPSE6X.cjs.map → ConnectedCallDock-NGHSDLJS.cjs.map} +1 -1
  4. package/dist/{ConnectedCallDock-CT3D6LLI.js → ConnectedCallDock-YJSO52N4.js} +4 -4
  5. package/dist/{ConnectedCallDock-CT3D6LLI.js.map → ConnectedCallDock-YJSO52N4.js.map} +1 -1
  6. package/dist/{ConnectedCallRoom-TNOCSTX2.cjs → ConnectedCallRoom-4XGFFYHE.cjs} +4 -4
  7. package/dist/{ConnectedCallRoom-TNOCSTX2.cjs.map → ConnectedCallRoom-4XGFFYHE.cjs.map} +1 -1
  8. package/dist/{ConnectedCallRoom-A27AM7IQ.js → ConnectedCallRoom-T6NS2MY4.js} +4 -4
  9. package/dist/{ConnectedCallRoom-A27AM7IQ.js.map → ConnectedCallRoom-T6NS2MY4.js.map} +1 -1
  10. package/dist/{ConnectedNativeDocxComparison-RWKFPJPJ.js → ConnectedNativeDocxComparison-52KQKJGY.js} +7 -7
  11. package/dist/{ConnectedNativeDocxComparison-RWKFPJPJ.js.map → ConnectedNativeDocxComparison-52KQKJGY.js.map} +1 -1
  12. package/dist/{ConnectedNativeDocxComparison-H2OZMWHT.cjs → ConnectedNativeDocxComparison-UVLZGS2V.cjs} +8 -8
  13. package/dist/{ConnectedNativeDocxComparison-H2OZMWHT.cjs.map → ConnectedNativeDocxComparison-UVLZGS2V.cjs.map} +1 -1
  14. package/dist/{ConnectedNativeDocxEditor-43BI5LN6.js → ConnectedNativeDocxEditor-BRBL3MOV.js} +6 -6
  15. package/dist/{ConnectedNativeDocxEditor-43BI5LN6.js.map → ConnectedNativeDocxEditor-BRBL3MOV.js.map} +1 -1
  16. package/dist/{ConnectedNativeDocxEditor-6DQEM6SD.cjs → ConnectedNativeDocxEditor-KHR5I7W6.cjs} +8 -8
  17. package/dist/{ConnectedNativeDocxEditor-6DQEM6SD.cjs.map → ConnectedNativeDocxEditor-KHR5I7W6.cjs.map} +1 -1
  18. package/dist/{ConnectedStreamedWordArtifact-3VKYIG6C.cjs → ConnectedStreamedWordArtifact-DSVFI7BX.cjs} +8 -8
  19. package/dist/ConnectedStreamedWordArtifact-DSVFI7BX.cjs.map +1 -0
  20. package/dist/{ConnectedStreamedWordArtifact-TEB332E3.js → ConnectedStreamedWordArtifact-EQUE6WT5.js} +7 -7
  21. package/dist/ConnectedStreamedWordArtifact-EQUE6WT5.js.map +1 -0
  22. package/dist/{WorkspaceTableView-KG546U7M.cjs → WorkspaceTableView-2CGEO5KK.cjs} +6 -6
  23. package/dist/{WorkspaceTableView-KG546U7M.cjs.map → WorkspaceTableView-2CGEO5KK.cjs.map} +1 -1
  24. package/dist/{WorkspaceTableView-OSFIWJ5C.js → WorkspaceTableView-3ARFQYNO.js} +4 -4
  25. package/dist/{WorkspaceTableView-OSFIWJ5C.js.map → WorkspaceTableView-3ARFQYNO.js.map} +1 -1
  26. package/dist/agents/index.cjs +376 -376
  27. package/dist/agents/index.js +2 -2
  28. package/dist/calls/index.cjs +35 -35
  29. package/dist/calls/index.js +7 -7
  30. package/dist/chat/index.cjs +89 -89
  31. package/dist/chat/index.js +2 -2
  32. package/dist/{chunk-BRYRZOS3.cjs → chunk-3YZ3RUSB.cjs} +4 -4
  33. package/dist/{chunk-BRYRZOS3.cjs.map → chunk-3YZ3RUSB.cjs.map} +1 -1
  34. package/dist/{chunk-VPWCARVO.js → chunk-4DDPMLGU.js} +4 -4
  35. package/dist/{chunk-VPWCARVO.js.map → chunk-4DDPMLGU.js.map} +1 -1
  36. package/dist/{chunk-24H5WTGM.js → chunk-4U4NXFV5.js} +4 -4
  37. package/dist/{chunk-24H5WTGM.js.map → chunk-4U4NXFV5.js.map} +1 -1
  38. package/dist/{chunk-6EQSP77K.cjs → chunk-5ZHAHJ4H.cjs} +5 -5
  39. package/dist/{chunk-6EQSP77K.cjs.map → chunk-5ZHAHJ4H.cjs.map} +1 -1
  40. package/dist/{chunk-BIWPXSGS.cjs → chunk-6AJJJ5HR.cjs} +7 -7
  41. package/dist/{chunk-BIWPXSGS.cjs.map → chunk-6AJJJ5HR.cjs.map} +1 -1
  42. package/dist/{chunk-2YCCCXYV.js → chunk-7LN3ISPG.js} +3 -3
  43. package/dist/{chunk-2YCCCXYV.js.map → chunk-7LN3ISPG.js.map} +1 -1
  44. package/dist/{chunk-5NTSJV5H.cjs → chunk-BY2EW2QU.cjs} +16 -91
  45. package/dist/chunk-BY2EW2QU.cjs.map +1 -0
  46. package/dist/{chunk-FHB4G77H.js → chunk-CEO7YI7I.js} +3 -3
  47. package/dist/{chunk-FHB4G77H.js.map → chunk-CEO7YI7I.js.map} +1 -1
  48. package/dist/{chunk-LTO4JYU3.cjs → chunk-DWWRLKEZ.cjs} +188 -2
  49. package/dist/chunk-DWWRLKEZ.cjs.map +1 -0
  50. package/dist/chunk-E3IEZMRK.cjs +507 -0
  51. package/dist/chunk-E3IEZMRK.cjs.map +1 -0
  52. package/dist/{chunk-MLHOG7YH.js → chunk-EFDZRAW6.js} +3 -3
  53. package/dist/{chunk-MLHOG7YH.js.map → chunk-EFDZRAW6.js.map} +1 -1
  54. package/dist/chunk-FOIDBAZB.js +497 -0
  55. package/dist/chunk-FOIDBAZB.js.map +1 -0
  56. package/dist/{chunk-MB3S2ETI.cjs → chunk-G2BKHCI2.cjs} +2 -2
  57. package/dist/chunk-G2BKHCI2.cjs.map +1 -0
  58. package/dist/{chunk-EFSL4O3B.cjs → chunk-GT5FCYV5.cjs} +7 -7
  59. package/dist/{chunk-EFSL4O3B.cjs.map → chunk-GT5FCYV5.cjs.map} +1 -1
  60. package/dist/{chunk-QWKT4DO6.cjs → chunk-GX5MKJ3F.cjs} +433 -2
  61. package/dist/chunk-GX5MKJ3F.cjs.map +1 -0
  62. package/dist/{chunk-C3YIVBTU.cjs → chunk-HDEOORSV.cjs} +9 -9
  63. package/dist/{chunk-C3YIVBTU.cjs.map → chunk-HDEOORSV.cjs.map} +1 -1
  64. package/dist/{chunk-T4P237N6.js → chunk-ILBBV2ZY.js} +2 -2
  65. package/dist/chunk-ILBBV2ZY.js.map +1 -0
  66. package/dist/{chunk-XFSEPGF7.cjs → chunk-K53QRFPJ.cjs} +4 -4
  67. package/dist/{chunk-XFSEPGF7.cjs.map → chunk-K53QRFPJ.cjs.map} +1 -1
  68. package/dist/{chunk-NOKTUWTN.cjs → chunk-K7S5BMAB.cjs} +7 -7
  69. package/dist/{chunk-NOKTUWTN.cjs.map → chunk-K7S5BMAB.cjs.map} +1 -1
  70. package/dist/{chunk-FY4C7HU5.cjs → chunk-O3MRE2HL.cjs} +2233 -8
  71. package/dist/chunk-O3MRE2HL.cjs.map +1 -0
  72. package/dist/{chunk-N3HVTMQK.js → chunk-OPZBIGW4.js} +3 -3
  73. package/dist/{chunk-N3HVTMQK.js.map → chunk-OPZBIGW4.js.map} +1 -1
  74. package/dist/{chunk-JVXHVFUA.cjs → chunk-P6HVJP6Z.cjs} +4 -4
  75. package/dist/{chunk-JVXHVFUA.cjs.map → chunk-P6HVJP6Z.cjs.map} +1 -1
  76. package/dist/{chunk-PXYP3DM5.js → chunk-PD4AKBYZ.js} +432 -6
  77. package/dist/chunk-PD4AKBYZ.js.map +1 -0
  78. package/dist/{chunk-VKY4SQMH.js → chunk-REHG7VRQ.js} +5 -5
  79. package/dist/{chunk-VKY4SQMH.js.map → chunk-REHG7VRQ.js.map} +1 -1
  80. package/dist/{chunk-M4MZPH2S.js → chunk-SEZEEHLU.js} +190 -6
  81. package/dist/chunk-SEZEEHLU.js.map +1 -0
  82. package/dist/{chunk-5JEM3BWT.js → chunk-SYP2A4GQ.js} +4 -4
  83. package/dist/{chunk-5JEM3BWT.js.map → chunk-SYP2A4GQ.js.map} +1 -1
  84. package/dist/{chunk-QFYRXQTD.js → chunk-TTPXMCJL.js} +6 -80
  85. package/dist/chunk-TTPXMCJL.js.map +1 -0
  86. package/dist/{chunk-VMLEISRZ.cjs → chunk-UZVXVTTB.cjs} +17 -17
  87. package/dist/{chunk-VMLEISRZ.cjs.map → chunk-UZVXVTTB.cjs.map} +1 -1
  88. package/dist/{chunk-YDY4GIC2.cjs → chunk-V7JDMKNQ.cjs} +4 -4
  89. package/dist/{chunk-YDY4GIC2.cjs.map → chunk-V7JDMKNQ.cjs.map} +1 -1
  90. package/dist/{chunk-YPR4FSDJ.js → chunk-VA3YYR7R.js} +8 -192
  91. package/dist/chunk-VA3YYR7R.js.map +1 -0
  92. package/dist/{chunk-NUV5F6MM.js → chunk-WAIHNFUH.js} +3 -3
  93. package/dist/{chunk-NUV5F6MM.js.map → chunk-WAIHNFUH.js.map} +1 -1
  94. package/dist/{chunk-H5BFOVVL.cjs → chunk-WRERJFEV.cjs} +2 -188
  95. package/dist/chunk-WRERJFEV.cjs.map +1 -0
  96. package/dist/{chunk-4DKI37QQ.js → chunk-YAGSGBVM.js} +2213 -13
  97. package/dist/chunk-YAGSGBVM.js.map +1 -0
  98. package/dist/{chunk-K6W2GWCN.js → chunk-ZAYUJFPI.js} +3 -3
  99. package/dist/{chunk-K6W2GWCN.js.map → chunk-ZAYUJFPI.js.map} +1 -1
  100. package/dist/connect/docx.cjs +10 -10
  101. package/dist/connect/docx.js +6 -6
  102. package/dist/connect/index.cjs +1237 -591
  103. package/dist/connect/index.cjs.map +1 -1
  104. package/dist/connect/index.d.ts +3 -0
  105. package/dist/connect/index.js +665 -23
  106. package/dist/connect/index.js.map +1 -1
  107. package/dist/connect/viewer.cjs +27 -27
  108. package/dist/connect/viewer.js +10 -10
  109. package/dist/connection/panels/ConnectedPanelHost.d.ts +48 -0
  110. package/dist/connection/panels/useSessionPanelMode.d.ts +18 -0
  111. package/dist/connection/threads-page/ConnectedThreadsPage.d.ts +14 -0
  112. package/dist/connection/threads-page/ThreadSearch.d.ts +24 -0
  113. package/dist/connection/workflows/index.d.ts +1 -0
  114. package/dist/connection/workflows/useWorkflowsPageState.d.ts +134 -0
  115. package/dist/index.cjs +610 -594
  116. package/dist/index.js +9 -9
  117. package/dist/provider/host.d.ts +3 -0
  118. package/dist/shell/PanelPortal.d.ts +30 -0
  119. package/dist/shell/index.cjs +78 -61
  120. package/dist/shell/index.d.ts +3 -0
  121. package/dist/shell/index.js +3 -2
  122. package/dist/shell/panel-host.d.ts +8 -0
  123. package/dist/shell/panel-windows.d.ts +33 -0
  124. package/dist/studio/index.cjs +5 -5
  125. package/dist/studio/index.js +3 -3
  126. package/dist/workflow-canvas/index.cjs +21 -21
  127. package/dist/workflow-canvas/index.js +5 -5
  128. package/node_modules/@arbidocs/coedit/package.json +1 -1
  129. package/package.json +5 -5
  130. package/dist/ConnectedStreamedWordArtifact-3VKYIG6C.cjs.map +0 -1
  131. package/dist/ConnectedStreamedWordArtifact-TEB332E3.js.map +0 -1
  132. package/dist/chunk-4DKI37QQ.js.map +0 -1
  133. package/dist/chunk-5NTSJV5H.cjs.map +0 -1
  134. package/dist/chunk-EZSYYENN.js +0 -2700
  135. package/dist/chunk-EZSYYENN.js.map +0 -1
  136. package/dist/chunk-FY4C7HU5.cjs.map +0 -1
  137. package/dist/chunk-H5BFOVVL.cjs.map +0 -1
  138. package/dist/chunk-LTO4JYU3.cjs.map +0 -1
  139. package/dist/chunk-M4MZPH2S.js.map +0 -1
  140. package/dist/chunk-MB3S2ETI.cjs.map +0 -1
  141. package/dist/chunk-PUX4M22Q.cjs +0 -2735
  142. package/dist/chunk-PUX4M22Q.cjs.map +0 -1
  143. package/dist/chunk-PXYP3DM5.js.map +0 -1
  144. package/dist/chunk-QFYRXQTD.js.map +0 -1
  145. package/dist/chunk-QWKT4DO6.cjs.map +0 -1
  146. package/dist/chunk-T4P237N6.js.map +0 -1
  147. package/dist/chunk-YPR4FSDJ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shell/sidebar-context.ts","../src/shell/SidebarBadgeRow.tsx","../src/shell/Workspace.tsx","../src/shell/reload-policy.ts","../src/shell/ActionCluster.tsx"],"names":["createContext","useContext","forwardRef","SidebarBadgeRow","jsxs","cn","jsx","Tooltip","TooltipTrigger","TooltipContent","Globe","Users","Lock","testIdOr","Fragment","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","LayoutGrid","Plus","DropdownMenuSeparator","DropdownMenuLabel","prefixedTestId","notify","useId"],"mappings":"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","file":"chunk-QWKT4DO6.cjs","sourcesContent":["import { createContext, useContext } from 'react'\n\n/** Fixed strings of the sidebar family. Set once on `Sidebar.Root`; parts read them from context. */\nexport interface SidebarLabels {\n /** The sidebar's accessible name (the Root `aria-label` prop wins). */\n mainNavigation: string\n hideSidebar: string\n showSidebar: string\n /** The drawer's close button (the `closeLabel` prop wins). */\n closeNavigationMenu: string\n}\n\nexport const DEFAULT_SIDEBAR_LABELS: SidebarLabels = {\n mainNavigation: 'Main navigation',\n hideSidebar: 'Hide sidebar',\n showSidebar: 'Show sidebar',\n closeNavigationMenu: 'Close navigation menu',\n}\n\nexport interface SidebarContextValue {\n /** Labels are visible (full width), as opposed to the icon-only rail. */\n expanded: boolean\n labels: SidebarLabels\n}\nexport const SidebarContext = createContext<SidebarContextValue>({\n expanded: true,\n labels: DEFAULT_SIDEBAR_LABELS,\n})\nexport const useSidebarContext = (): SidebarContextValue => useContext(SidebarContext)\n\n/** True while the surrounding row is hovered/focused; trailing controls may brighten on it. */\nexport const SidebarRowHoverContext = createContext(false)\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { useSidebarContext } from './sidebar-context'\n\nexport interface SidebarBadgeRowProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n /** Glyph (20px). */\n icon: ReactNode\n /** Visible label of the expanded row; the tooltip of the icon-only rail. */\n label: string\n /** Unread/pending number. Hidden at 0 or `undefined`; values above 9 read \"9+\". */\n count?: number\n /**\n * Accessible name including the count, for example \"Notifications, 2 unread\". Defaults to\n * `label` plus the count.\n */\n ariaLabel?: string\n /**\n * `row`: a labelled row styled like the module rows, badge at the right. `icon`: icon-only with\n * the badge on the corner. Default follows the sidebar (`row` expanded, `icon` on the rail).\n */\n variant?: 'row' | 'icon'\n /** Test id of the count badge. */\n badgeTestId?: string\n}\n\n/**\n * A sidebar row that carries a badge and may open something (a panel, a popover): the\n * notifications and contacts rows above the account bar. A real button that forwards its ref and\n * rest props, so it can be a popover trigger (`<DropdownMenuTrigger asChild>`). The badge is\n * visible in both the expanded row and the icon-only rail, and the accessible name carries the\n * count in both.\n */\nexport const SidebarBadgeRow = forwardRef<HTMLButtonElement, SidebarBadgeRowProps>(\n function SidebarBadgeRow(\n { icon, label, count, ariaLabel, variant, badgeTestId, className, type = 'button', ...rest },\n ref\n ) {\n const { expanded } = useSidebarContext()\n const resolved = variant ?? (expanded ? 'row' : 'icon')\n const hasCount = count !== undefined && count > 0\n const badgeText = hasCount ? (count > 9 ? '9+' : String(count)) : null\n const name = ariaLabel ?? (hasCount ? `${label}, ${count}` : label)\n\n if (resolved === 'row') {\n return (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"row\"\n className={cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-left text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 flex-shrink-0 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n <span className=\"ml-3 min-w-0 truncate\" aria-hidden>\n {label}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"ml-auto inline-flex min-w-5 flex-shrink-0 items-center justify-center rounded-full bg-primary px-1.5 text-xs font-semibold leading-5 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n }\n\n const iconButton = (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"icon\"\n title={variant === 'icon' ? label : undefined}\n className={cn(\n 'relative m-0 flex h-9 w-12 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"absolute right-1 top-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold leading-4 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n // A standalone icon button (the page header) keeps its native title; the rail uses a tooltip.\n if (variant === 'icon') return iconButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{iconButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n","import type { ComponentType } from 'react'\nimport { ChevronDown, Globe, LayoutGrid, Lock, Plus, Users } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport type { ShellRecentWorkspace, ShellWorkspace, ShellWorkspaceKind } from './types'\n\n/** The three workspace-kind names (badge title, type glyph name, subtitle). */\nexport interface WorkspaceKindLabels {\n common: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_WORKSPACE_KIND_LABELS: WorkspaceKindLabels = {\n common: 'Common',\n shared: 'Shared',\n private: 'Private',\n}\n\n/**\n * Workspace type drives the initial-badge fill and a quiet secondary glyph:\n * private (just you) -> navy, lock shared (several) -> selection tint, people\n * common (public) -> neutral, globe\n * Navy is identity and cyan is reserved for ARBI/AI, so \"shared\" is the selection tint.\n */\nexport function workspaceKindMeta(\n kind: ShellWorkspaceKind,\n labels?: Partial<WorkspaceKindLabels>\n): {\n Icon: ComponentType<{ className?: string; 'aria-label'?: string; 'data-testid'?: string }>\n label: string\n fill: string\n} {\n const l = { ...DEFAULT_WORKSPACE_KIND_LABELS, ...labels }\n if (kind === 'common')\n return { Icon: Globe, label: l.common, fill: 'bg-muted text-muted-foreground' }\n if (kind === 'shared')\n return { Icon: Users, label: l.shared, fill: 'bg-secondary text-secondary-foreground' }\n return { Icon: Lock, label: l.private, fill: 'bg-primary text-primary-foreground' }\n}\n\n/** The kind's hue as a CSS colour, for glyphs painted by SVG fill (the workspace shield). */\nexport function workspaceKindColor(kind: ShellWorkspaceKind): string {\n if (kind === 'common') return 'var(--color-muted-foreground)'\n if (kind === 'shared') return 'var(--color-secondary)'\n return 'var(--color-primary)'\n}\n\n/** Overridable ids of the workspace identity; defaults are the current ids. */\ntype WorkspaceIdentityTestIds = Partial<Record<'initial' | 'type' | 'projectName', string>>\n\nexport interface WorkspaceIdentityProps {\n workspace: ShellWorkspace\n /** Show name + type/project line beside the badge; otherwise the badge alone. */\n expanded: boolean\n /** Selected (nav-row) styling of the name. */\n isActive?: boolean\n /** Reword the kind names. */\n labels?: Partial<WorkspaceKindLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * Non-interactive guts of the workspace head: the initial badge (with a tiny type glyph) and,\n * when expanded, the name and the project/type line. Hosted by the switcher trigger and by the\n * workspace settings header, so it never nests a button.\n */\nexport function WorkspaceIdentity({\n workspace,\n expanded,\n isActive = false,\n labels,\n testIds,\n}: WorkspaceIdentityProps) {\n const kind = workspaceKindMeta(workspace.kind, labels)\n const badge = (\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n data-testid={testIdOr(testIds?.initial, { testId: 'sidebar-workspace-card-initial' })}\n className={cn(\n 'flex size-7 flex-shrink-0 items-center justify-center rounded-md text-sm font-semibold leading-none',\n kind.fill\n )}\n >\n {workspace.name.charAt(0).toUpperCase()}\n </span>\n {/* Type as a tiny overlay on the badge: status reads at the icon, not after the name. */}\n <span className=\"absolute -bottom-1 -right-1 flex size-3.5 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={testIdOr(testIds?.type, { testId: 'sidebar-workspace-card-type' })}\n className=\"size-2.5 text-muted-foreground\"\n />\n </span>\n </span>\n )\n\n if (!expanded)\n return <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n\n return (\n <>\n <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n <div className=\"ml-2.5 flex min-w-0 flex-1 flex-col text-left\">\n <span\n // 600: the name of the thing you are inside, above a lighter project line.\n className={cn(\n 'min-w-0 truncate text-left text-sm font-semibold capitalize leading-tight transition-colors duration-100',\n isActive ? 'text-accent-foreground' : 'text-foreground'\n )}\n >\n {workspace.name}\n </span>\n {!workspace.projectName && (\n <span className=\"mt-0.5 truncate text-xs text-muted-foreground\">{kind.label}</span>\n )}\n {workspace.projectName && (\n <span\n className=\"mt-0.5 flex min-w-0\"\n data-testid={testIdOr(testIds?.projectName, {\n testId: 'sidebar-workspace-card-project-name',\n })}\n >\n {workspace.projectLine ?? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {workspace.projectName}\n </span>\n )}\n </span>\n )}\n </div>\n </>\n )\n}\n\n/**\n * Entity nouns plus the switcher's strings. `plural` arrives lowercased and `singular`\n * capitalized in the functions below.\n */\nexport interface WorkspaceSwitcherLabels extends WorkspaceKindLabels {\n /** Entity nouns, e.g. { plural: 'workspaces', singular: 'workspace' }. */\n plural: string\n singular: string\n /** The trigger's accessible name. */\n switchWorkspace: (name: string, plural: string) => string\n allWorkspaces: (plural: string) => string\n newWorkspace: (singular: string) => string\n recentWorkspaces: (plural: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_SWITCHER_LABELS: WorkspaceSwitcherLabels = {\n ...DEFAULT_WORKSPACE_KIND_LABELS,\n plural: 'workspaces',\n singular: 'workspace',\n switchWorkspace: (name, plural) => `${name} — switch ${plural}`,\n allWorkspaces: (plural) => `All ${plural}`,\n newWorkspace: (singular) => `New ${singular}`,\n recentWorkspaces: (plural) => `Recent ${plural}`,\n}\n\nexport interface WorkspaceSwitcherProps {\n workspace: ShellWorkspace\n /** Other workspaces to jump to (the app orders and caps them). */\n recent?: ShellRecentWorkspace[]\n /** Icon-only trigger (the sidebar rail). */\n compact?: boolean\n /** `appbar`: the phone app bar's title, name + chevron on one line. */\n variant?: 'sidebar' | 'appbar'\n onSwitch: (workspace: ShellWorkspace) => void\n /** Return to the workspaces list; leaves the workspace open. */\n onGoToList: () => void\n onNewWorkspace: () => void\n /**\n * When set, \"New workspace\" is shown disabled with this explanation under it (e.g. the user may\n * not create workspaces on this deployment).\n */\n newWorkspaceDisabledReason?: string\n /** Entity nouns and menu strings; any subset (the nouns default to workspace(s)). */\n labels?: Partial<WorkspaceSwitcherLabels>\n className?: string\n /** Trigger id (default `workspace-switcher-trigger`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `switchItem`, `type` and `lastSeen` are prefixes\n * (`<prefix>-<workspace id>`).\n */\n testIds?: Partial<Record<'menu' | 'all' | 'new' | 'switchItem' | 'type' | 'lastSeen', string>>\n /** Ids forwarded to the trigger's workspace identity. */\n identityTestIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * The current-workspace control as a dropdown: \"All workspaces\", \"New workspace\", then the\n * recent workspaces to jump straight into.\n */\nexport function WorkspaceSwitcher({\n workspace,\n recent = [],\n compact = false,\n variant = 'sidebar',\n onSwitch,\n onGoToList,\n onNewWorkspace,\n newWorkspaceDisabledReason,\n labels,\n className,\n testId,\n testIds,\n identityTestIds,\n}: WorkspaceSwitcherProps) {\n const l = { ...DEFAULT_WORKSPACE_SWITCHER_LABELS, ...labels }\n const plural = l.plural.toLowerCase()\n const singular = l.singular.charAt(0).toUpperCase() + l.singular.slice(1)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"workspace-switcher\"\n data-testid={testIdOr(testId, { testId: 'workspace-switcher-trigger' })}\n aria-label={l.switchWorkspace(workspace.name, plural)}\n className={cn(\n 'group flex min-w-0 items-center rounded-md transition-colors duration-100 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant === 'appbar'\n ? 'h-11 max-w-full gap-1 px-2'\n : compact\n ? 'h-12 w-12 justify-center'\n : 'h-12 w-full px-2',\n className\n )}\n >\n {variant === 'appbar' ? (\n <span className=\"min-w-0 truncate text-base font-semibold text-foreground\">\n {workspace.name}\n </span>\n ) : (\n <WorkspaceIdentity\n workspace={workspace}\n expanded={!compact}\n labels={l}\n testIds={identityTestIds}\n />\n )}\n {!(compact && variant === 'sidebar') && (\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ml-auto size-4 flex-shrink-0 text-muted-foreground transition-transform duration-150 group-data-[state=open]:rotate-180\"\n />\n )}\n </button>\n </DropdownMenuTrigger>\n {/* Expanded menus follow the trigger width so they stay inside the sidebar. */}\n <DropdownMenuContent\n align=\"start\"\n className={cn(\n 'border-0 max-w-[calc(100vw-1.5rem)]',\n variant === 'sidebar' && !compact\n ? 'w-[var(--radix-dropdown-menu-trigger-width)]'\n : 'w-60'\n )}\n data-testid={testIdOr(testIds?.menu, { testId: 'workspace-switcher-menu' })}\n >\n <DropdownMenuItem\n onClick={onGoToList}\n data-testid={testIdOr(testIds?.all, { testId: 'workspace-switcher-all' })}\n className=\"gap-2\"\n >\n <LayoutGrid className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n {l.allWorkspaces(plural)}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={newWorkspaceDisabledReason ? undefined : onNewWorkspace}\n disabled={!!newWorkspaceDisabledReason}\n title={newWorkspaceDisabledReason}\n data-testid={testIdOr(testIds?.new, { testId: 'workspace-switcher-new' })}\n className=\"gap-2\"\n >\n <Plus className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n {l.newWorkspace(singular)}\n {newWorkspaceDisabledReason && (\n <span className=\"text-xs text-muted-foreground\">{newWorkspaceDisabledReason}</span>\n )}\n </span>\n </DropdownMenuItem>\n {recent.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {l.recentWorkspaces(plural)}\n </DropdownMenuLabel>\n {recent.map((w) => {\n const kind = workspaceKindMeta(w.kind, l)\n return (\n <DropdownMenuItem\n key={w.id}\n onClick={() => onSwitch(w)}\n data-testid={prefixedTestId(testIds?.switchItem, w.id, {\n testId: `workspace-switch-${w.id}`,\n })}\n className=\"gap-2\"\n >\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-6 flex-shrink-0 items-center justify-center rounded text-xs font-semibold leading-none',\n kind.fill\n )}\n >\n {w.name.charAt(0).toUpperCase()}\n </span>\n <span className=\"absolute -bottom-1 -right-1 flex size-3 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={prefixedTestId(testIds?.type, w.id, {\n testId: `workspace-type-${w.id}`,\n })}\n className=\"size-2 text-muted-foreground\"\n />\n </span>\n </span>\n <span className=\"min-w-0 flex-1 truncate capitalize\">{w.name}</span>\n {w.lastSeen && (\n <span\n className=\"ml-2 flex-shrink-0 text-xs tabular-nums text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.lastSeen, w.id, {\n testId: `workspace-last-seen-${w.id}`,\n })}\n >\n {w.lastSeen}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * One policy for every automatic reload: when the running build is out of date, pick a moment\n * that costs the user nothing.\n *\n * After a deploy (or mid-rollout, while old and new pods both serve) the previous build's hashed\n * chunks can 404. Vite reports that as `vite:preloadError`. Reloading fetches the current\n * index.html (served no-cache) and its chunks, but reloading at once throws away whatever the\n * user is typing, so:\n *\n * - A failed prefetch (`prefetchChunk`) never reloads. Nothing on screen depends on it.\n * - A failed chunk the user is waiting for reloads at once, unless the user is on a sign-in form\n * or has unsaved input (a focused or edited field, or a `[data-reload-guard]` region).\n * - Otherwise the reload waits: the next route navigation becomes a full page load of its target,\n * or the page reloads once the user is idle with nothing unsaved.\n * - Per tab, at most one policy reload a minute. A second failure right after one is not a stale\n * build (a genuinely missing chunk, say), so it surfaces to the error boundary instead of looping.\n */\n\nimport { notify } from '@arbidocs/react/shell'\n\nexport const CHUNK_RELOAD_KEY = 'arbi_chunk_reload_at'\n\n/** A second failure within this window after a reload is not a stale build: let it surface. */\nconst RELOAD_GUARD_MS = 60_000\n/** A deferred reload waits until the user has done nothing for this long. */\nconst IDLE_MS = 10_000\nconst IDLE_CHECK_MS = 2_000\n\n/** Sign-in pages, and regions a host marks as holding unsaved work. */\nconst GUARD_SELECTOR =\n '[data-slot=\"auth-layout\"], input[type=\"password\"], input[autocomplete=\"one-time-code\"], [data-reload-guard]'\nconst NON_TEXT_INPUTS = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'hidden',\n 'range',\n 'color',\n 'file',\n 'image',\n])\n\nexport interface ReloadPolicyDeps {\n /** Reload the current page. */\n reload: () => void\n /** Full page load of `url` (instead of a client-side navigation). */\n load: (url: string, replace: boolean) => void\n now: () => number\n}\n\nconst browserDeps: ReloadPolicyDeps = {\n reload: () => window.location.reload(),\n load: (url, replace) => (replace ? window.location.replace(url) : window.location.assign(url)),\n now: () => Date.now(),\n}\n\nlet deps = browserDeps\nlet installed = false\n/** The build is out of date: the next route navigation loads the page fresh. */\nlet stale = false\n/** A chunk the user needed failed: reload as soon as nothing would be lost. */\nlet reloadWanted = false\nlet lastActivity = 0\nlet idleTimer: ReturnType<typeof setInterval> | undefined\nlet restoreNavigation: (() => void) | null = null\n/** Fields the user typed into. */\nconst edited = new Set<Element>()\n/** Errors from `prefetchChunk` loads, so the preload-error handler can tell them apart. */\nconst prefetchFailures = new WeakSet<object>()\n\nfunction isTextField(el: Element): boolean {\n if (el instanceof HTMLInputElement) return !NON_TEXT_INPUTS.has(el.type)\n return el instanceof HTMLTextAreaElement || (el as HTMLElement).isContentEditable === true\n}\n\nfunction hasText(el: Element): boolean {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n return el.value.trim() !== ''\n }\n return (el.textContent ?? '').trim() !== ''\n}\n\n/**\n * Whether reloading now could cost the user something: a sign-in form, a `[data-reload-guard]`\n * region, a focused text field, or a field they typed into that still holds text.\n */\nexport function hasUnsavedInput(doc: Document = document): boolean {\n if (doc.querySelector(GUARD_SELECTOR)) return true\n const active = doc.activeElement\n if (active && active !== doc.body && isTextField(active)) return true\n for (const el of edited) {\n if (!el.isConnected) edited.delete(el)\n else if (hasText(el)) return true\n }\n return false\n}\n\n/** Take this tab's reload slot. False within the guard window, or when storage can't record it. */\nfunction claimReload(): boolean {\n const now = deps.now()\n let last = 0\n try {\n last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n } catch {\n // Unreadable: treat as never reloaded. Writing below decides.\n }\n if (last && now - last < RELOAD_GUARD_MS) return false\n try {\n sessionStorage.setItem(CHUNK_RELOAD_KEY, String(now))\n } catch {\n // Without the guard we can't tell a loop from a stale build: don't risk one.\n return false\n }\n return true\n}\n\nfunction guardHot(): boolean {\n try {\n const last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n return !!last && deps.now() - last < RELOAD_GUARD_MS\n } catch {\n return false\n }\n}\n\nfunction settle(): void {\n stale = false\n reloadWanted = false\n if (idleTimer !== undefined) clearInterval(idleTimer)\n idleTimer = undefined\n restoreNavigation?.()\n restoreNavigation = null\n}\n\nfunction reloadNow(): boolean {\n if (!claimReload()) {\n settle()\n return false\n }\n settle()\n deps.reload()\n return true\n}\n\n/** A client-side navigation to `url` becomes a full page load of it while the build is stale. */\nfunction loadsFresh(url: string | URL | null | undefined): string | null {\n if (!stale || url == null) return null\n const target = new URL(String(url), window.location.href)\n if (target.pathname === window.location.pathname) return null\n // Leaving a sign-in page establishes the session: a full load there races its persistence.\n if (document.querySelector(GUARD_SELECTOR)) return null\n return target.href\n}\n\nfunction interceptNavigation(): void {\n if (restoreNavigation) return\n const history = window.history\n const push = history.pushState\n const replace = history.replaceState\n let shownPath = window.location.pathname\n const wrap = (original: History['pushState'], replaceEntry: boolean): History['pushState'] =>\n function (this: History, data, unused, url) {\n const target = loadsFresh(url)\n if (target && claimReload()) {\n settle()\n deps.load(target, replaceEntry)\n return\n }\n original.call(this, data, unused, url)\n shownPath = window.location.pathname\n }\n history.pushState = wrap(push, false)\n history.replaceState = wrap(replace, true)\n // Back/forward already changed the address: reloading loads that target.\n const onPopState = () => {\n if (window.location.pathname === shownPath) return\n shownPath = window.location.pathname\n if (!document.querySelector(GUARD_SELECTOR)) reloadNow()\n }\n window.addEventListener('popstate', onPopState)\n restoreNavigation = () => {\n history.pushState = push\n history.replaceState = replace\n window.removeEventListener('popstate', onPopState)\n }\n}\n\nfunction watchForIdle(): void {\n if (idleTimer !== undefined) return\n idleTimer = setInterval(() => {\n if (!reloadWanted) return\n const idle = document.visibilityState === 'hidden' || deps.now() - lastActivity >= IDLE_MS\n if (idle && !hasUnsavedInput()) reloadNow()\n }, IDLE_CHECK_MS)\n}\n\n/**\n * The running build is out of date (a chunk 404'd, or a new service worker took over): the next\n * route navigation loads its target fresh instead of rendering it client-side.\n */\nexport function markBuildStale(): void {\n stale = true\n interceptNavigation()\n}\n\nexport type ReloadOutcome = 'reloaded' | 'deferred' | 'guarded'\n\n/**\n * Reload onto the current build when nothing would be lost; otherwise defer to the next route\n * navigation or to the moment the user is idle with nothing unsaved. `guarded` means a policy\n * reload just happened in this tab, so the failure should surface instead.\n */\nexport function requestReload(): ReloadOutcome {\n if (guardHot()) return 'guarded'\n if (!hasUnsavedInput()) return reloadNow() ? 'reloaded' : 'guarded'\n reloadWanted = true\n markBuildStale()\n watchForIdle()\n return 'deferred'\n}\n\n/**\n * Load a chunk ahead of need (warming a route the user may open next). Never rejects, and a\n * failure never reloads the page: it only marks the build stale so the next navigation loads\n * fresh.\n */\nexport function prefetchChunk(load: () => Promise<unknown>): Promise<void> {\n let loading: Promise<unknown>\n try {\n loading = load()\n } catch (error) {\n loading = Promise.reject(error)\n }\n return loading.then(\n () => undefined,\n (error: unknown) => {\n if (typeof error === 'object' && error !== null) prefetchFailures.add(error)\n }\n )\n}\n\nfunction decide(payload: unknown): void {\n const prefetch = typeof payload === 'object' && payload !== null && prefetchFailures.has(payload)\n // Offline the chunk simply couldn't be downloaded (it isn't cached yet). Reloading can't fix\n // that and would throw away what's on screen; say what happened instead, and let the failed\n // import reach the nearest error boundary as usual.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (!prefetch) {\n notify.warning(\"This part of ARBI isn't available offline yet\", {\n description: 'Reconnect to open it. Once you have, it will work offline too.',\n })\n }\n return\n }\n markBuildStale()\n if (prefetch) return\n const outcome = requestReload()\n console.warn(`[chunk] A code chunk failed to load (stale build?): ${outcome}`, payload)\n}\n\n/**\n * The `vite:preloadError` handler. Decides once the failed import's own handlers have run, so a\n * `prefetchChunk` failure is known as one. Never cancels the event: the import rejects as usual\n * and, if a reload follows, the page is replaced anyway.\n */\nexport function handleChunkLoadError(event: Event): void {\n const payload = (event as Event & { payload?: unknown }).payload\n setTimeout(() => decide(payload), 0)\n}\n\nfunction onActivity(event: Event): void {\n lastActivity = deps.now()\n if (event.type === 'input' && event.target instanceof Element && isTextField(event.target)) {\n edited.add(event.target)\n }\n}\n\nconst ACTIVITY_EVENTS = ['input', 'keydown', 'pointerdown', 'wheel', 'touchstart'] as const\n\n/** Install the reload policy. Call once at startup; later calls are no-ops. */\nexport function installReloadPolicy(overrides: Partial<ReloadPolicyDeps> = {}): void {\n deps = { ...browserDeps, ...overrides }\n if (installed || typeof window === 'undefined') return\n installed = true\n lastActivity = deps.now()\n window.addEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) {\n document.addEventListener(type, onActivity, { capture: true, passive: true })\n }\n}\n\n/** Undo `installReloadPolicy` and forget all state (tests). */\nexport function resetReloadPolicy(): void {\n settle()\n edited.clear()\n if (installed) {\n window.removeEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) document.removeEventListener(type, onActivity, true)\n }\n installed = false\n deps = browserDeps\n}\n","import { useId, type MouseEvent, type ReactNode } from 'react'\nimport type { ShellActionLayout } from './types'\n\nexport interface ActionClusterProps {\n /**\n * `bar`: one row for a page header or phone app bar (status, bell, contacts, account).\n * `sidebar`: the bottom of the expanded sidebar: the bell and contacts rows stacked above the\n * account row.\n * `rail`: the same stack on the icon-only rail (same order, icon-only rows).\n * `drawer`: the phone drawer's rows (bell and contacts only; the app bar carries the account).\n */\n layout?: ShellActionLayout\n /** Status pill (remote control); `bar` only. Other layouts show status in their own rows. */\n status?: ReactNode\n /** Report a problem (bug icon), first in the cluster. */\n report?: ReactNode\n /** Notification bell (the kit's NotificationBell, or a `Sidebar.BadgeRow`). */\n mail?: ReactNode\n /** Calendar entry (a `Sidebar.BadgeRow`), right after mail. */\n calendar?: ReactNode\n /** Databases entry (a `Sidebar.BadgeRow`), right after calendar. */\n databases?: ReactNode\n bell?: ReactNode\n /** Contacts / messages entry with its own badge (a `Sidebar.BadgeRow`). */\n contacts?: ReactNode\n /** Account menu (the kit's UserMenu). */\n account?: ReactNode\n /**\n * Names the cluster: the group's accessible name in every layout, and a visible heading above\n * the rows in the `drawer` layout (where phones otherwise get unlabelled rows).\n */\n label?: string\n 'data-testid'?: string\n}\n\n/**\n * The account area: notifications, contacts and the account menu, in one of four placements. In\n * the sidebar and on the rail the two badge rows are stacked above the account row in the same\n * order, so nothing moves when the rail expands; the account menu holds everything else (help,\n * settings, tips, processing).\n */\nexport function ActionCluster({\n layout = 'bar',\n status,\n report,\n mail,\n calendar,\n databases,\n bell,\n contacts,\n account,\n label,\n 'data-testid': testId = 'sidebar-actions',\n}: ActionClusterProps) {\n const labelId = useId()\n // Dashboard's content area resets focus on click, and Radix PORTALS bubble through the React\n // tree: stop clicks here or a dropdown item (e.g. \"View all\") would un-focus the panel it opened.\n const stop = (e: MouseEvent) => e.stopPropagation()\n\n if (layout === 'sidebar' || layout === 'rail' || layout === 'drawer') {\n const rail = layout === 'rail'\n return (\n <div\n className={rail ? 'flex flex-col items-center gap-0.5' : 'flex flex-col gap-0.5'}\n onClick={stop}\n role={label ? 'group' : undefined}\n aria-labelledby={label && layout === 'drawer' ? labelId : undefined}\n aria-label={label && layout !== 'drawer' ? label : undefined}\n data-slot=\"action-cluster\"\n data-layout={layout}\n data-testid={testId}\n >\n {label && layout === 'drawer' && (\n <p\n id={labelId}\n className=\"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\"\n data-slot=\"action-cluster-label\"\n >\n {label}\n </p>\n )}\n {report}\n {mail}\n {calendar}\n {databases}\n {bell}\n {contacts}\n {account && layout !== 'drawer' && (\n <div className={rail ? 'mt-1' : 'mt-1 min-w-0'}>{account}</div>\n )}\n </div>\n )\n }\n\n return (\n <div\n className=\"flex items-center gap-1\"\n onClick={stop}\n role={label ? 'group' : undefined}\n aria-label={label}\n data-slot=\"action-cluster\"\n >\n {status}\n {report}\n {mail}\n {calendar}\n {databases}\n {bell}\n {contacts}\n {account}\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/provider/host.ts"],"names":["GenericArbiHost"],"mappings":";;;AAkDO,IAAM,QAAA,GAAmEA;AAGzE,SAAS,OAAA,GAA0B;AACxC,EAAA,OAAO,mBAAA,EAAoB;AAC7B","file":"chunk-T4P237N6.js","sourcesContent":["/**\n * The host configuration of `@arbidocs/blocks`: the `@arbidocs/react` domains plus the blocks ones,\n * handed over once:\n *\n * <ArbiHost config={{ arbi, session, environment: { navigate, notify }, billing, viewer, … }}>\n * <App />\n * </ArbiHost>\n *\n * Every field is optional and has a default; each kit reads its domain (`useHost().billing`, or a\n * domain hook such as `useBlocksEnvironment()` that fills in the defaults). A blocks-only site gets\n * `arbi` and its sign-in layer from `defaultHost` (`@arbidocs/blocks/connect`); ARBI-frontend\n * passes its own (src/host/app-host.tsx), and is the reference for a site that looks like it.\n * A field whose value lives in the host's state is a hook (`use…`), so the configuration stays one\n * stable object. There is no other host provider: a new domain is a new optional field here.\n *\n * SDK-free: the provider is `@arbidocs/react/shell`'s, and the domain types are type-only.\n */\n\nimport type { ReactElement } from 'react'\nimport { ArbiHost as GenericArbiHost, useHostConfigRecord } from '@arbidocs/react/shell'\nimport type { ArbiHostProps } from '@arbidocs/react/shell'\nimport type { ArbiHostConfig as ArbiReactHostConfig } from '@arbidocs/react'\nimport type { BillingSupport } from '../connection/billing/support'\nimport type { NativeDocxSupport } from '../connection/docx/support'\nimport type { DocumentViewerSupport } from '../connection/viewer/support'\nimport type { DocumentToolsHost } from '../connection/viewer/ConnectedDocumentToolsProvider'\nimport type { ConnectedWorkspaceData } from '../connection/workspaceData'\nimport type { BlocksEnvironment } from './environment'\nimport type { AuthPagesSupport, SsoSupport } from '../connection/auth/support'\n\nexport interface ArbiHostConfig extends ArbiReactHostConfig {\n /** Router, notices, dialogs, runtime config and where documents, threads, … open. */\n environment?: Partial<BlocksEnvironment>\n /** Selling plans (Stripe). Absent: nothing is for sale; projects show limits and usage only. */\n billing?: BillingSupport\n /** The Word editor's host additions. Absent: no Defined term, no Generate image. */\n docx?: NativeDocxSupport\n /** The document viewer's host additions. Absent: no drafts, Translate, … */\n viewer?: DocumentViewerSupport\n /** The PDF document tools' host binding (its upload, its lists to refresh, Mail). */\n documentTools?: DocumentToolsHost\n /** Workspace lists the host already keeps live. Absent: the kits read their own. */\n workspaceData?: ConnectedWorkspaceData\n /** The auth pages' look, password rules and sign-in follow-ups. Absent: plain pages. */\n auth?: AuthPagesSupport\n /** The single sign-on provider. Absent: no SSO. */\n sso?: SsoSupport\n}\n\n/** `<ArbiHost config>` with the blocks domains. */\nexport const ArbiHost: (props: ArbiHostProps<ArbiHostConfig>) => ReactElement = GenericArbiHost\n\n/** The host configuration in scope (`{}` outside an `<ArbiHost>`). */\nexport function useHost(): ArbiHostConfig {\n return useHostConfigRecord() as ArbiHostConfig\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/chat/PinnedDocChip.tsx","../src/chat/ConversationSearchView.tsx","../src/chat/ContextPanel.tsx","../src/lib/useDismissibleCard.ts","../src/chat/LabelPinRow.tsx","../src/chat/AssistantToaster.tsx"],"names":["jsxs","jsx","X","ContextPanelContent","cn","Fragment","ContextSearchInput","Search","ContextActionButton","Button","TagIcon"],"mappings":"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","file":"chunk-YPR4FSDJ.js","sourcesContent":["import { Pin, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface PinnedDocChipLabels {\n unpin: string\n /** Accessible name; `title` is the pinned document's name. */\n unpinDocument: (title: string) => string\n}\n\nexport const DEFAULT_PINNED_DOC_CHIP_LABELS: PinnedDocChipLabels = {\n unpin: 'Unpin',\n unpinDocument: (title) => `Unpin ${title}`,\n}\n\nexport interface PinnedDocChipProps {\n title: string\n onUnpin: () => void\n className?: string\n labels?: Partial<PinnedDocChipLabels>\n testId?: string\n}\n\n/**\n * The pinned-document chip that lives inside a composer's attach button: shows which document\n * holds the full-context pin and unpins it in ONE tap (the X is always visible, so touch and\n * keyboard reach it). It is a span with button semantics because it sits inside the attach\n * `<button>`, where nested buttons are invalid; `stopPropagation` keeps the tap from also\n * triggering the parent.\n */\nexport function PinnedDocChip({\n title,\n onUnpin,\n className,\n labels,\n testId = 'unpin-document-button',\n}: PinnedDocChipProps) {\n const l = { ...DEFAULT_PINNED_DOC_CHIP_LABELS, ...labels }\n return (\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"pinned-doc-chip\"\n onClick={(e) => {\n e.stopPropagation()\n onUnpin()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation()\n onUnpin()\n }\n }}\n title={l.unpin}\n aria-label={l.unpinDocument(title)}\n className={cn(\n '-mx-0.5 flex min-w-0 items-center gap-1 rounded-sm px-1 text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n data-testid={testId}\n >\n <Pin className=\"h-3 w-3 shrink-0 fill-primary\" />\n <X className=\"order-last h-3 w-3 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm\">{title}</span>\n </span>\n )\n}\n","import { useMemo, type ComponentType, type ReactNode } from 'react'\nimport { Bot, Loader2, MessageSquare, Search, User, X } from 'lucide-react'\n\nimport { Button, PassageCard } from '@arbidocs/react/ui'\n\n/** One matching message of a conversation. */\nexport interface ConversationSearchMatch {\n id: string\n role: string\n score: number\n snippet: string\n}\n\n/** A conversation with the messages that matched the query. */\nexport interface ConversationSearchGroup {\n id: string\n title?: string | null\n matches: ConversationSearchMatch[]\n}\n\n/** Every fixed string of the conversation search. */\nexport interface ConversationSearchLabels {\n placeholder: string\n search: string\n searching: string\n matched: (count: number, query: string) => string\n matchCount: (count: number) => string\n untitled: string\n you: string\n assistant: string\n clear: string\n noResults: (query: string) => string\n reindexHint: ReactNode\n backToList: string\n}\n\nexport const DEFAULT_CONVERSATION_SEARCH_LABELS: ConversationSearchLabels = {\n placeholder: 'Search your conversations...',\n search: 'Search',\n searching: 'Searching conversations…',\n matched: (count, query) => `${count} conversation${count === 1 ? '' : 's'} matched “${query}”`,\n matchCount: (count) => `${count} match${count === 1 ? '' : 'es'}`,\n untitled: 'Untitled conversation',\n you: 'You',\n assistant: 'Assistant',\n clear: 'Clear',\n noResults: (query) => `No conversations matched “${query}”.`,\n reindexHint: (\n <>\n Older conversations may need indexing — try <span className=\"font-medium\">Re-index</span>.\n </>\n ),\n backToList: 'Back to list',\n}\n\nexport interface ConversationSearchViewProps {\n query: string\n onQueryChange: (query: string) => void\n /** Enter (without Shift) or the submit button. */\n onSubmit: () => void\n canSubmit: boolean\n isSearching: boolean\n /** The query the shown results answer; empty while no search has run. */\n submittedQuery: string\n /** Results of `submittedQuery`. */\n groups: ConversationSearchGroup[]\n onOpenConversation: (conversationId: string, messageId?: string) => void\n /** Back to the idle body. */\n onClear: () => void\n /** Shown beneath the bar until a search is run (e.g. the history list). */\n children?: ReactNode\n /** Wraps the results area (e.g. an error boundary). */\n ResultsBoundary?: ComponentType<{ children: ReactNode }>\n labels?: Partial<ConversationSearchLabels>\n}\n\nfunction RoleChip({ isUser, labels }: { isUser: boolean; labels: ConversationSearchLabels }) {\n const Icon = isUser ? User : Bot\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Icon className=\"size-3\" />\n {isUser ? labels.you : labels.assistant}\n </span>\n )\n}\n\nconst Passthrough = ({ children }: { children: ReactNode }) => <>{children}</>\n\n/**\n * Search across past conversations: a search bar, then either the idle body (history list) or\n * the matches grouped by conversation. Opening a group or a hit is the host's navigation.\n */\nexport function ConversationSearchView({\n query,\n onQueryChange,\n onSubmit,\n canSubmit,\n isSearching,\n submittedQuery,\n groups,\n onOpenConversation,\n onClear,\n children,\n ResultsBoundary = Passthrough,\n labels,\n}: ConversationSearchViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_SEARCH_LABELS, ...labels }), [labels])\n const hasResults = !!submittedQuery && !isSearching && groups.length > 0\n\n return (\n <div\n data-slot=\"conversation-search\"\n className=\"flex h-full flex-col\"\n data-testid=\"conversation-search-page\"\n >\n <div className=\"flex items-start gap-3 px-6 py-4\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"flex-1\"\n >\n <div className=\"flex items-start gap-2 rounded-md border border-input bg-muted px-3 py-1.5 focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={l.placeholder}\n aria-label={l.search}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid=\"conversation-search-input\"\n />\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!canSubmit}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid=\"conversation-search-submit-button\"\n title={l.search}\n aria-label={l.search}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n\n {!submittedQuery ? (\n <div className=\"flex-1 overflow-hidden\">{children}</div>\n ) : (\n <ResultsBoundary>\n <main className=\"flex-1 overflow-auto px-6 pb-6\">\n {isSearching ? (\n <div className=\"flex items-center justify-center gap-2 py-16 text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n {l.searching}\n </div>\n ) : hasResults ? (\n <div className=\"space-y-4\" data-testid=\"conversation-search-results\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.matched(groups.length, submittedQuery)}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n data-testid=\"conversation-search-clear\"\n >\n <X className=\"size-3.5\" />\n {l.clear}\n </Button>\n </div>\n {groups.map((group) => (\n <div\n key={group.id}\n className=\"rounded-lg border border-border bg-card\"\n data-testid=\"conversation-search-group\"\n >\n <button\n type=\"button\"\n onClick={() => onOpenConversation(group.id)}\n className=\"flex w-full items-center justify-between gap-3 rounded-t-lg px-4 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageSquare className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"truncate font-medium\">{group.title || l.untitled}</span>\n </span>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground\">\n {l.matchCount(group.matches.length)}\n </span>\n </button>\n <div className=\"space-y-2 border-t border-border p-3\">\n {group.matches.map((m) => (\n <PassageCard\n key={m.id}\n header={<RoleChip isUser={m.role === 'user'} labels={l} />}\n score={m.score}\n onClick={() => onOpenConversation(group.id, m.id)}\n data-testid=\"conversation-search-hit\"\n >\n <p className=\"line-clamp-3 text-sm text-foreground/90\">{m.snippet}</p>\n </PassageCard>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div\n className=\"py-16 text-center text-muted-foreground\"\n data-testid=\"conversation-search-no-results\"\n >\n <MessageSquare className=\"mx-auto mb-3 size-8 opacity-40\" />\n <p>{l.noResults(submittedQuery)}</p>\n <p className=\"mt-1 text-sm\">{l.reindexHint}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-3 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n >\n <X className=\"size-3.5\" />\n {l.backToList}\n </Button>\n </div>\n )}\n </main>\n </ResultsBoundary>\n )}\n </div>\n )\n}\n","import {\n forwardRef,\n Fragment,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\nimport { Check, CheckCircle, Search } from 'lucide-react'\nimport {\n Badge,\n Button,\n HoverCardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n cn,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\n/**\n * Parts of the composer's \"in this chat\" panels (files, facts): a card that opens upward from the\n * composer, a grouped pick list, and below it the labels, search and bulk actions.\n */\n\n/** The card itself: width follows the chat input (`--chat-input-width`), bounded on small screens. */\nexport const ContextPanelContent = forwardRef<\n ElementRef<typeof HoverCardContent>,\n ComponentPropsWithoutRef<typeof HoverCardContent>\n>(function ContextPanelContent({ className, onClick, ...props }, ref) {\n return (\n <HoverCardContent\n ref={ref}\n side=\"top\"\n align=\"start\"\n data-slot=\"context-panel\"\n // Clicks inside must not bubble (via the React portal) to a click-to-toggle wrapper.\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'w-[var(--chat-input-width,var(--radix-hover-card-content-available-width))] max-h-[var(--radix-hover-card-content-available-height)] max-w-[95vw] overflow-y-auto overscroll-contain rounded-md border border-border bg-muted p-3 shadow-lg',\n className\n )}\n {...props}\n />\n )\n})\n\nexport interface ContextPickerGroup {\n key: string\n heading: string\n /** Id of the heading element. */\n testId?: string\n /** Shown after the heading as `(n)`. */\n count: number\n children: ReactNode\n}\n\nexport interface ContextPickerListProps {\n groups: ContextPickerGroup[]\n /** Shown instead of the groups when every group is empty. */\n emptyText: string\n testId: string\n className?: string\n}\n\n/**\n * Two (or more) headed groups, e.g. \"In this conversation\" then \"In this workspace\". Each heading\n * pins to the top of the scroller and is pushed out by the next one; the second parks below the\n * first (32px = a heading's own height), so both stay visible however far down you scroll.\n */\nexport function ContextPickerList({\n groups,\n emptyText,\n testId,\n className,\n}: ContextPickerListProps) {\n const isEmpty = groups.every((g) => g.count === 0)\n return (\n <div\n className={cn('max-h-[400px] space-y-1 overflow-y-auto', className)}\n data-slot=\"context-picker-list\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n {isEmpty ? (\n <p className=\"p-2 text-sm text-muted-foreground\">{emptyText}</p>\n ) : (\n groups.map((g, index) => (\n <Fragment key={g.key}>\n <div\n className={cn(\n 'sticky z-10 bg-muted px-2 py-1.5 text-sm font-medium text-muted-foreground',\n index === 0 ? 'top-0' : 'top-8'\n )}\n data-testid={g.testId}\n >\n {g.heading} ({g.count})\n </div>\n {g.children}\n </Fragment>\n ))\n )}\n </div>\n )\n}\n\nfunction CheckGlyph({ isChecked, className }: { isChecked: boolean; className?: string }) {\n return (\n <span\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border',\n isChecked ? 'border-primary bg-primary text-primary-foreground' : 'border-input',\n className\n )}\n >\n {isChecked && <Check className=\"size-3\" />}\n </span>\n )\n}\n\nexport interface ContextPickerRowProps {\n isSelected: boolean\n onToggle: () => void\n testId?: string\n children: ReactNode\n}\n\n/** A whole-row toggle (e.g. a fact): check glyph then clamped text. */\nexport function ContextPickerRow({\n isSelected,\n onToggle,\n testId,\n children,\n}: ContextPickerRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggle()\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-start gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n <CheckGlyph isChecked={isSelected} className=\"mt-0.5\" />\n <span className=\"line-clamp-2 min-w-0 text-foreground\">{children}</span>\n </button>\n )\n}\n\nexport interface ContextCheckRowProps {\n isSelected: boolean\n /** The check toggle: accessible name (e.g. \"Add to conversation\"), handler and test id. */\n toggle: { label: string; onToggle: () => void; testId?: string }\n /** Status glyph between the toggle and the content. */\n status?: ReactNode\n testId?: string\n /** The row's content (e.g. a document pill that opens the document). */\n children: ReactNode\n}\n\n/** A row with its own check toggle plus a content slot (e.g. a document, which opens on click). */\nexport function ContextCheckRow({\n isSelected,\n toggle,\n status,\n testId,\n children,\n}: ContextCheckRowProps) {\n return (\n <div\n className=\"flex items-center gap-2 rounded px-1 py-0.5\"\n data-slot=\"context-check-row\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n aria-label={toggle.label}\n aria-pressed={isSelected}\n onClick={toggle.onToggle}\n data-testid={toggle.testId}\n className=\"flex shrink-0 items-center justify-center rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n >\n <CheckGlyph isChecked={isSelected} />\n </button>\n {status}\n {children}\n </div>\n )\n}\n\nexport interface ContextSelectListProps {\n children: ReactNode\n}\n\n/** Compact single-select list (e.g. choose the document to pin). */\nexport function ContextSelectList({ children }: ContextSelectListProps) {\n return <div className=\"max-h-[150px] space-y-2 overflow-y-auto\">{children}</div>\n}\n\nexport interface ContextSelectRowProps {\n isSelected: boolean\n onSelect: MouseEventHandler<HTMLButtonElement>\n status?: ReactNode\n title: string\n testId?: string\n}\n\nexport function ContextSelectRow({\n isSelected,\n onSelect,\n status,\n title,\n testId,\n}: ContextSelectRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelect(e)\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-center gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'border border-primary/30 bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n {status}\n <span className=\"min-w-0 flex-1 truncate text-foreground\" title={title}>\n {title}\n </span>\n {isSelected && <CheckCircle className=\"size-3.5 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ContextPanelFooterProps {\n /** Label shortcut chips (host-supplied row). */\n labels?: ReactNode\n /** The search box. */\n search: ReactNode\n /** Icon + title of the panel; omit when tabs already name it. */\n title?: ReactNode\n /** The action buttons, right aligned. */\n actions: ReactNode\n}\n\n/** Everything below the list: the panel opens upward, so its controls sit nearest the button. */\nexport function ContextPanelFooter({ labels, search, title, actions }: ContextPanelFooterProps) {\n return (\n <div className=\"mt-3 space-y-2 border-t border-border pt-3\" data-slot=\"context-panel-footer\">\n {labels}\n {search}\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1.5',\n title ? 'justify-between' : 'justify-end'\n )}\n >\n {title && (\n <div className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n {title}\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">{actions}</div>\n </div>\n </div>\n )\n}\n\nexport const ContextSearchInput = forwardRef<\n HTMLInputElement,\n ComponentPropsWithoutRef<typeof Input>\n>(function ContextSearchInput({ className, onClick, ...props }, ref) {\n return (\n <div className=\"relative\" onClick={(e) => e.stopPropagation()}>\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n ref={ref}\n className={cn('h-7 bg-background pl-7 text-sm', className)}\n onClick={onClick}\n {...props}\n />\n </div>\n )\n})\n\nexport interface ContextActionButtonProps extends Omit<ButtonProps, 'size'> {\n icon?: ReactNode\n /** Badge after the label; hidden at 0 / undefined. */\n count?: number\n /** Put the icon after the label (bulk Add / Remove) rather than before it. */\n isIconTrailing?: boolean\n}\n\n/** Compact action of the panel footer (stops click propagation so the card stays open). */\nexport const ContextActionButton = forwardRef<HTMLButtonElement, ContextActionButtonProps>(\n function ContextActionButton(\n { icon, count, isIconTrailing, onClick, children, className, variant = 'outline', ...props },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant={variant}\n size=\"sm\"\n className={cn('flex h-6 items-center gap-1 px-2 text-sm pointer-coarse:h-11', className)}\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n {...props}\n >\n {!isIconTrailing && icon}\n {children}\n {isIconTrailing && icon}\n {count != null && count > 0 && (\n <Badge variant=\"outline\" className=\"badge-count ml-1\">\n {count}\n </Badge>\n )}\n </Button>\n )\n }\n)\n\nexport interface ContextTab {\n value: string\n /** Visible tab name, e.g. \"Documents\". */\n label: string\n /** Count shown in the tab label. */\n count: number\n testId?: string\n content: ReactNode\n}\n\nexport interface ContextPanelTabsProps {\n tabs: ContextTab[]\n value: string\n onValueChange: (value: string) => void\n testId?: string\n /** Extra classes for the tab strip (e.g. leave room for a sheet's close button). */\n listClassName?: string\n}\n\n/** The panel's tab strip (Radix tabs: roving tabindex, arrow keys) and the active tab's content. */\nexport function ContextPanelTabs({\n tabs,\n value,\n onValueChange,\n testId,\n listClassName,\n}: ContextPanelTabsProps) {\n return (\n <Tabs value={value} onValueChange={onValueChange} data-testid={testId}>\n <TabsList\n className={cn('grid h-auto w-full grid-cols-2 pointer-coarse:h-auto', listClassName)}\n >\n {tabs.map((t) => (\n <TabsTrigger key={t.value} value={t.value} data-testid={t.testId} className=\"gap-1.5\">\n {t.label}\n <Badge variant=\"outline\" className=\"badge-count\">\n {t.count}\n </Badge>\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((t) => (\n <TabsContent key={t.value} value={t.value} className=\"mt-3\">\n {t.content}\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n","import { useEffect, type RefObject } from 'react'\n\nexport interface UseDismissibleCardOptions {\n isOpen: boolean\n onClose: () => void\n /** The card's content: clicks inside never dismiss. */\n contentRef: RefObject<HTMLElement | null>\n /** Focused when the card opens (the panel is opened to find something: typing just works). */\n focusRef?: RefObject<HTMLElement | null>\n}\n\n/**\n * Behaviour of a click-opened card: focus its search box on open, Escape closes it, and a press\n * outside it (or outside any portaled popper that belongs to it, e.g. a dropdown menu opened from\n * inside) closes it too. Bound only while open.\n */\nexport function useDismissibleCard({\n isOpen,\n onClose,\n contentRef,\n focusRef,\n}: UseDismissibleCardOptions): void {\n // rAF lets the portaled content mount before focusing.\n useEffect(() => {\n if (!isOpen) return\n const id = requestAnimationFrame(() => focusRef?.current?.focus())\n return () => cancelAnimationFrame(id)\n }, [isOpen, focusRef])\n\n useEffect(() => {\n if (!isOpen) return\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n e.stopPropagation()\n onClose()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [isOpen, onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (target.closest('[data-radix-popper-content-wrapper]')) return\n onClose()\n }\n document.addEventListener('mousedown', onPointerDown)\n return () => document.removeEventListener('mousedown', onPointerDown)\n }, [isOpen, onClose, contentRef])\n}\n","import { Tag as TagIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PinnableLabel {\n id: string\n name: string\n /** The label's own colour (any CSS colour): the same hue everywhere the label appears. */\n color: string\n /** Ids of the items carrying this label. */\n itemIds: string[]\n}\n\nexport interface LabelPinRowLabels {\n remove: (count: number, name: string) => string\n add: (count: number, name: string) => string\n}\n\nexport const DEFAULT_LABEL_PIN_ROW_LABELS: LabelPinRowLabels = {\n remove: (count, name) => `Remove the ${count} “${name}” item(s) from this chat`,\n add: (count, name) => `Add the ${count} “${name}” item(s) to this chat`,\n}\n\nexport interface LabelPinRowProps {\n labels: PinnableLabel[]\n /** Ids currently in the conversation. */\n selectedIds: string[]\n /** Add every id (already de-duplicated against the chat). */\n onAdd: (ids: string[]) => void\n /** Remove every id. */\n onRemove: (ids: string[]) => void\n testId?: string\n copy?: Partial<LabelPinRowLabels>\n}\n\n/**\n * Label shortcuts inside the in-chat panels: one chip per label in use; clicking it pins\n * everything carrying that label. A chip whose items are ALL in the chat reads as active and\n * clicking it takes them back out, so a label is a toggle rather than a one-way add.\n */\nexport function LabelPinRow({\n labels,\n selectedIds,\n onAdd,\n onRemove,\n testId = 'label-pin-row',\n copy,\n}: LabelPinRowProps) {\n const l = { ...DEFAULT_LABEL_PIN_ROW_LABELS, ...copy }\n const usable = labels.filter((label) => label.itemIds.length > 0)\n if (usable.length === 0) return null\n\n const selectedSet = new Set(selectedIds)\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1\"\n data-slot=\"label-pin-row\"\n data-testid={testId}\n >\n <TagIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n {usable.map((label) => {\n const allIn = label.itemIds.every((id) => selectedSet.has(id))\n return (\n <button\n key={label.id}\n type=\"button\"\n aria-pressed={allIn}\n title={\n allIn\n ? l.remove(label.itemIds.length, label.name)\n : l.add(label.itemIds.length, label.name)\n }\n onClick={() =>\n allIn\n ? onRemove(label.itemIds)\n : onAdd(label.itemIds.filter((id) => !selectedSet.has(id)))\n }\n className={cn(\n 'flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n allIn ? 'text-white' : 'bg-muted text-foreground hover:brightness-95'\n )}\n // Pinned reads as the label filled in with its own colour; at rest it's the muted\n // pill with the colour on the dot, matching the label pills on documents and facts.\n style={\n allIn\n ? { backgroundColor: label.color, borderColor: label.color }\n : { borderColor: `${label.color}66` }\n }\n data-testid={`${testId}-${label.id}`}\n >\n {!allIn && (\n <span\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ backgroundColor: label.color }}\n aria-hidden\n />\n )}\n <span className=\"max-w-[120px] truncate\">{label.name}</span>\n <span className=\"tabular-nums opacity-70\">{label.itemIds.length}</span>\n </button>\n )\n })}\n </div>\n )\n}\n","import { Toaster, type ShellToasterProps } from '../shell/Toaster'\nimport { useAssistantDock } from './AssistantDock'\nimport { useChatSurface } from './chat-surface'\n\nexport type AssistantToasterProps = Omit<ShellToasterProps, 'dockOpen'>\n\n/**\n * The shell `Toaster` wired to the assistant dock: while the dock is open (and offered: a mounted\n * page chat hides it) a right-aligned toast stack slides clear of it. Pass `dockWidth` when the\n * `AssistantDock` has a custom `width`.\n */\nexport function AssistantToaster(props: AssistantToasterProps) {\n const dock = useAssistantDock()\n const { isDockAvailable } = useChatSurface()\n return <Toaster {...props} dockOpen={dock.isOpen && isDockAvailable} />\n}\n"]}