@arbidocs/blocks 0.4.27 → 0.4.29

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 (107) hide show
  1. package/README.md +17 -0
  2. package/dist/agents/index.cjs +224 -212
  3. package/dist/agents/index.js +6 -6
  4. package/dist/agents/tasks/TaskRowMenu.d.ts +4 -1
  5. package/dist/agents/tasks/TaskRunsDialog.d.ts +3 -1
  6. package/dist/agents/tasks/taskRows.d.ts +2 -0
  7. package/dist/agents/workflows/WorkflowDocumentsField.d.ts +12 -0
  8. package/dist/agents/workflows/index.d.ts +2 -0
  9. package/dist/agents/workflows/workspaceScope.d.ts +18 -0
  10. package/dist/chat/ChatPage.d.ts +1 -1
  11. package/dist/chat/chat-page-types.d.ts +12 -1
  12. package/dist/chat/index.cjs +129 -129
  13. package/dist/chat/index.js +2 -2
  14. package/dist/chunk-4XJZ6AAY.js +407 -0
  15. package/dist/chunk-4XJZ6AAY.js.map +1 -0
  16. package/dist/{chunk-UOLMFC5K.js → chunk-6YVI74BC.js} +498 -108
  17. package/dist/chunk-6YVI74BC.js.map +1 -0
  18. package/dist/{chunk-CQ6CYPV4.js → chunk-7FF473XB.js} +7 -119
  19. package/dist/chunk-7FF473XB.js.map +1 -0
  20. package/dist/{chunk-ZEIOREJY.js → chunk-EHXSBH6U.js} +37 -6
  21. package/dist/chunk-EHXSBH6U.js.map +1 -0
  22. package/dist/chunk-EYPPB5CY.cjs +85 -0
  23. package/dist/chunk-EYPPB5CY.cjs.map +1 -0
  24. package/dist/{chunk-ENY6XXKR.js → chunk-I7FJS7WG.js} +155 -39
  25. package/dist/chunk-I7FJS7WG.js.map +1 -0
  26. package/dist/{chunk-557EU3G4.js → chunk-JLOYWXRB.js} +3 -3
  27. package/dist/{chunk-557EU3G4.js.map → chunk-JLOYWXRB.js.map} +1 -1
  28. package/dist/chunk-KF4EC5XU.js +68 -0
  29. package/dist/chunk-KF4EC5XU.js.map +1 -0
  30. package/dist/{chunk-3ZXXHROK.cjs → chunk-L6YRTT5M.cjs} +158 -39
  31. package/dist/chunk-L6YRTT5M.cjs.map +1 -0
  32. package/dist/chunk-S5HZBXZA.cjs +430 -0
  33. package/dist/chunk-S5HZBXZA.cjs.map +1 -0
  34. package/dist/{chunk-JCVZKCXC.cjs → chunk-TLQQV7WW.cjs} +37 -6
  35. package/dist/chunk-TLQQV7WW.cjs.map +1 -0
  36. package/dist/{chunk-NNH7N62N.cjs → chunk-VMCOH3AY.cjs} +497 -105
  37. package/dist/chunk-VMCOH3AY.cjs.map +1 -0
  38. package/dist/{chunk-JLPYOPCX.js → chunk-WSJVHSGN.js} +225 -36
  39. package/dist/chunk-WSJVHSGN.js.map +1 -0
  40. package/dist/{chunk-DCEI37AX.cjs → chunk-YVIOCITQ.cjs} +3 -3
  41. package/dist/{chunk-DCEI37AX.cjs.map → chunk-YVIOCITQ.cjs.map} +1 -1
  42. package/dist/{chunk-J22DXUJY.cjs → chunk-ZHLMDJCO.cjs} +226 -34
  43. package/dist/chunk-ZHLMDJCO.cjs.map +1 -0
  44. package/dist/{chunk-TL2DHSC5.cjs → chunk-ZXGBUHES.cjs} +5 -120
  45. package/dist/chunk-ZXGBUHES.cjs.map +1 -0
  46. package/dist/connect/docx.cjs +26 -8
  47. package/dist/connect/docx.cjs.map +1 -1
  48. package/dist/connect/docx.d.ts +1 -0
  49. package/dist/connect/docx.js +24 -7
  50. package/dist/connect/docx.js.map +1 -1
  51. package/dist/connect/index.cjs +303 -61
  52. package/dist/connect/index.cjs.map +1 -1
  53. package/dist/connect/index.d.ts +4 -0
  54. package/dist/connect/index.js +263 -25
  55. package/dist/connect/index.js.map +1 -1
  56. package/dist/connection/ConnectedAgentChatPanel.d.ts +7 -0
  57. package/dist/connection/ConnectedNativeDocxEditor.d.ts +2 -1
  58. package/dist/connection/ConnectedSkillUpload.d.ts +2 -0
  59. package/dist/connection/ConnectedStreamedWordArtifact.d.ts +4 -0
  60. package/dist/connection/ConnectedTaskAccessRequest.d.ts +4 -0
  61. package/dist/connection/ai.d.ts +4 -1
  62. package/dist/connection/useConnectedWorkNotifications.d.ts +21 -0
  63. package/dist/docx/DocxMentions.d.ts +9 -2
  64. package/dist/docx/NativeDocxEditor.d.ts +11 -3
  65. package/dist/docx/StreamedWordArtifact.d.ts +15 -0
  66. package/dist/docx/index.cjs +16 -8
  67. package/dist/docx/index.d.ts +3 -2
  68. package/dist/docx/index.js +2 -2
  69. package/dist/docx/streamWordDocument.d.ts +12 -0
  70. package/dist/facts/index.cjs +1 -1
  71. package/dist/facts/index.js +1 -1
  72. package/dist/files/index.cjs +3 -3
  73. package/dist/files/index.js +3 -3
  74. package/dist/index.cjs +778 -766
  75. package/dist/index.js +15 -15
  76. package/dist/settings/index.cjs +42 -232
  77. package/dist/settings/index.cjs.map +1 -1
  78. package/dist/settings/index.js +7 -203
  79. package/dist/settings/index.js.map +1 -1
  80. package/dist/site/index.cjs +5 -5
  81. package/dist/site/index.js +1 -1
  82. package/dist/studio/index.cjs +7 -6
  83. package/dist/studio/index.cjs.map +1 -1
  84. package/dist/studio/index.js +5 -4
  85. package/dist/studio/index.js.map +1 -1
  86. package/dist/workspaces/index.cjs +2 -2
  87. package/dist/workspaces/index.js +2 -2
  88. package/package.json +3 -3
  89. package/src/docx/styles.css +13 -0
  90. package/dist/chunk-3ZXXHROK.cjs.map +0 -1
  91. package/dist/chunk-5TRALRWN.js +0 -42
  92. package/dist/chunk-5TRALRWN.js.map +0 -1
  93. package/dist/chunk-CQ6CYPV4.js.map +0 -1
  94. package/dist/chunk-CQCC7LE7.js +0 -210
  95. package/dist/chunk-CQCC7LE7.js.map +0 -1
  96. package/dist/chunk-ENY6XXKR.js.map +0 -1
  97. package/dist/chunk-EUOGPUMJ.cjs +0 -59
  98. package/dist/chunk-EUOGPUMJ.cjs.map +0 -1
  99. package/dist/chunk-J22DXUJY.cjs.map +0 -1
  100. package/dist/chunk-JCVZKCXC.cjs.map +0 -1
  101. package/dist/chunk-JLPYOPCX.js.map +0 -1
  102. package/dist/chunk-NNH7N62N.cjs.map +0 -1
  103. package/dist/chunk-RFIBUWLF.cjs +0 -232
  104. package/dist/chunk-RFIBUWLF.cjs.map +0 -1
  105. package/dist/chunk-TL2DHSC5.cjs.map +0 -1
  106. package/dist/chunk-UOLMFC5K.js.map +0 -1
  107. package/dist/chunk-ZEIOREJY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/settings/ConfirmDialog.tsx","../../src/settings/SegmentedControl.tsx","../../src/settings/FloatingPanel.tsx","../../src/settings/PanelFrame.tsx","../../src/settings/ConfigSwitcherBar.tsx","../../src/settings/ConversationSettingsParts.tsx","../../src/settings/ServerConnectionControls.tsx","../../src/settings/PremiumModelsFrame.tsx","../../src/settings/ThreadPreviewDialog.tsx","../../src/settings/JsonTree.tsx","../../src/settings/TipsEditorDialog.tsx","../../src/settings/SyncDialogParts.tsx","../../src/settings/DocumentPicker.tsx","../../src/settings/TriStateFilterMenu.tsx","../../src/settings/PlanBadge.tsx","../../src/settings/QuotaMeter.tsx","../../src/settings/PlanCard.tsx","../../src/settings/ReferralCredit.tsx","../../src/settings/ConnectionCard.tsx","../../src/settings/Projects.tsx","../../src/settings/SupportPanel.tsx","../../src/settings/WelcomeDialog.tsx","../../src/settings/Usage.tsx","../../src/settings/Billing.tsx","../../src/settings/EmailWorkspaceDialogView.tsx","../../src/settings/SubscriptionParts.tsx","../../src/settings/ErrorDialog.tsx"],"names":["useMemo","useRef","jsx","ModalScaffold","AlertTriangle","testIdOr","jsxs","Button","RadioGroupPrimitive","cn","Fragment","TabHeader","Star","Undo2","History","DialogFooter","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Trash2","ModalSection","ModalSectionTitle","Tooltip","TooltipTrigger","Users","TooltipContent","Sparkles","Brain","RefreshCw","Wifi","WifiOff","Switch","Crown","Dialog","DialogContent","ModalHeader","DialogTitle","DialogDescription","formatCount","useState","Check","Copy","ChevronDown","ChevronRight","Label","useId","Textarea","Pencil","Plus","Loader2","Checkbox","ScrollArea","useEffect","CommandEmpty","CommandGroup","CommandItem","getDocIcon","Command","Popover","PopoverAnchor","Search","CommandPrimitive","PopoverContent","CommandList","PopoverTrigger","ChevronsUpDown","CommandInput","TriangleAlert","FunnelX","Ban","DropdownMenuItem","Badge","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenu","DropdownMenuTrigger","Filter","MoreVertical","DropdownMenuContent","cva","TONE_SURFACE","TONE_BORDER","valueColor","prefixedTestId","Tag","Info","Gift","PlugIcon","ToneBadge","CheckCircle2","ExternalLink","ShieldCheck","Plug","AlertCircle","DialogHeader","MessageCircleQuestionMark","BookOpen","UsageMeter","UserPlus","BadgeCent","RadioGroupPrimitive2","ChartNoAxesColumn","FileText","barColor","X","Mail","Send","Clock","InfinityIcon","ArrowRight","Progress","LogOut"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useMemo, useRef } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n","import type { ReactNode } from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface SegmentedOption<T extends string> {\n value: T\n label: string\n icon?: ReactNode\n testId?: string\n}\n\nexport interface SegmentedControlProps<T extends string> {\n value: T\n onChange: (value: T) => void\n options: SegmentedOption<T>[]\n /** Accessible name of the radio group. */\n ariaLabel: string\n className?: string\n}\n\n/**\n * Single-choice radio group rendered as joined segments (selected = accent tone). Radix\n * RadioGroup: one tab stop, arrow keys move AND select, Space selects.\n */\nexport function SegmentedControl<T extends string>({\n value,\n onChange,\n options,\n ariaLabel,\n className,\n}: SegmentedControlProps<T>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"segmented-control\"\n aria-label={ariaLabel}\n value={value}\n onValueChange={(next) => onChange(next as T)}\n orientation=\"horizontal\"\n className={cn('inline-flex rounded-lg border border-border bg-background p-1', className)}\n >\n {options.map((option) => (\n <RadioGroupPrimitive.Item\n key={option.value}\n value={option.value}\n data-testid={option.testId}\n className={cn(\n 'flex items-center gap-2 rounded-md px-4 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:py-2.5',\n option.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {option.icon}\n {option.label}\n </RadioGroupPrimitive.Item>\n ))}\n </RadioGroupPrimitive.Root>\n )\n}\n","import type { MouseEventHandler, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { TabHeader } from '../shell/TabHeader'\n\n/** Where a panel is placed: pinned beside the page, full width, floating, or its own window. */\nexport type FloatingPanelMode = 'docked' | 'main' | 'overlay' | 'popout'\n\nexport interface FloatingPanelControls {\n /** The mode switcher + close button, for children that render their own header. */\n modeSwitcher: ReactNode\n}\n\nexport interface FloatingPanelProps {\n /** Stable id of the panel (also the id of its single header tab). */\n panelId: string\n mode: FloatingPanelMode\n title: string\n subtitle?: string\n headerIcon?: ReactNode\n headerActions?: ReactNode\n /** Label of the docked/main header tab (defaults to the title). */\n tabLabel?: ReactNode\n /** Mode switcher + close button, supplied by the host so it owns window management. */\n modeSwitcher: ReactNode\n /** Content, or a render function for children that embed `modeSwitcher` in their own header. */\n children: ReactNode | ((controls: FloatingPanelControls) => ReactNode)\n /** Sticky footer (e.g. Cancel / Apply). */\n footer?: ReactNode\n /** Click anywhere on the panel (the host tracks which panel is focused). */\n onPanelClick?: MouseEventHandler<HTMLDivElement>\n className?: string\n}\n\n/**\n * Presentational frame of a floating panel: header (title / tab + mode switcher), scrolling\n * body and optional footer. Placement and window management live in the host.\n */\nexport function FloatingPanel({\n panelId,\n mode,\n title,\n subtitle,\n headerIcon,\n headerActions,\n tabLabel,\n modeSwitcher,\n children,\n footer,\n onPanelClick,\n className,\n}: FloatingPanelProps) {\n const isRenderFunction = typeof children === 'function'\n const content = isRenderFunction ? children({ modeSwitcher }) : children\n\n const footerEl = footer && (\n <div className=\"relative z-10 flex-shrink-0 border-t border-border p-3\">{footer}</div>\n )\n\n const body = (\n <>\n <div className={cn('flex-1', isRenderFunction ? 'overflow-hidden' : 'overflow-auto p-3')}>\n {content}\n </div>\n {footerEl}\n </>\n )\n\n if (mode === 'popout') {\n return (\n <div\n data-slot=\"floating-panel\"\n className={cn('flex h-screen flex-col bg-background text-foreground', className)}\n >\n {!isRenderFunction && (\n <div className=\"flex flex-shrink-0 items-start justify-between border-b border-border px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {(title || headerIcon) && (\n <div className=\"flex items-center gap-2 text-base font-semibold text-primary\">\n {headerIcon}\n {title && <span>{title}</span>}\n </div>\n )}\n {subtitle && <span className=\"text-sm text-muted-foreground\">{subtitle}</span>}\n {headerActions && <div className={title ? 'mt-1.5' : ''}>{headerActions}</div>}\n </div>\n {modeSwitcher}\n </div>\n )}\n {body}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"floating-panel\"\n data-mode={mode}\n className={cn('flex h-full flex-col bg-background text-foreground', className)}\n onClick={onPanelClick}\n >\n {!isRenderFunction && (\n <TabHeader\n tabs={[{ id: panelId, label: tabLabel ?? title }]}\n activeTabId={panelId}\n onTabChange={() => {}}\n rightContent={modeSwitcher}\n />\n )}\n {body}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PanelFrameProps {\n testId?: string\n className?: string\n children: ReactNode\n}\n\n/** Column that fills a side/floating panel: a header slot above a body that takes the rest. */\nexport function PanelFrame({ testId, className, children }: PanelFrameProps) {\n return (\n <div\n data-slot=\"panel-frame\"\n data-testid={testId}\n className={cn('flex h-full min-h-0 flex-col bg-background', className)}\n >\n {children}\n </div>\n )\n}\n\nexport interface PanelFrameBodyProps {\n className?: string\n children: ReactNode\n}\n\n/** The panel's body: fills what the header leaves and clips; children scroll themselves. */\nexport function PanelFrameBody({ className, children }: PanelFrameBodyProps) {\n return (\n <div data-slot=\"panel-frame-body\" className={cn('min-h-0 flex-1 overflow-hidden', className)}>\n {children}\n </div>\n )\n}\n\nexport interface PanelScrollProps {\n /** `padded` is a list page (spaced sections); `flush` is a detail view that pads itself. */\n variant?: 'padded' | 'flush'\n className?: string\n children: ReactNode\n}\n\n/** Scrolling content of a panel body. */\nexport function PanelScroll({ variant = 'flush', className, children }: PanelScrollProps) {\n return (\n <div\n data-slot=\"panel-scroll\"\n className={cn('h-full overflow-auto', variant === 'padded' && 'space-y-4 p-3', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Right-aligned row of list-level actions. */\nexport function PanelActionsRow({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"panel-actions-row\" className={cn('flex justify-end', className)}>\n {children}\n </div>\n )\n}\n\nexport interface PanelAddButtonProps {\n label: string\n onClick: () => void\n /** Icon only (a narrow header); the label stays as title/aria-label. */\n isCompact?: boolean\n icon: ReactNode\n testId?: string\n}\n\n/** \"+ New\" button that sits right after the tabs of a panel header. */\nexport function PanelAddButton({ label, onClick, isCompact, icon, testId }: PanelAddButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n data-slot=\"panel-add-button\"\n data-testid={testId}\n className=\"flex h-8 items-center gap-1.5 rounded-md px-2 text-sm font-medium text-primary transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11 pointer-coarse:min-w-11\"\n >\n {icon}\n {isCompact ? <span className=\"sr-only\">{label}</span> : <span>New</span>}\n </button>\n )\n}\n\n/** Header of a single-purpose panel: icon + title at the start, the mode switcher at the end. */\nexport function PanelTitleBar({\n icon,\n title,\n end,\n}: {\n icon?: ReactNode\n title: string\n end?: ReactNode\n}) {\n return (\n <div data-slot=\"panel-title-bar\" className=\"flex w-full items-center justify-between px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n {icon}\n <span className=\"font-medium\">{title}</span>\n </div>\n {end}\n </div>\n )\n}\n\n/** Centred muted note in a panel body (\"Loading…\"). */\nexport function PanelNote({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"panel-note\" className=\"py-8 text-center text-muted-foreground\">\n {children}\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { History, Star, Trash2, Undo2 } from 'lucide-react'\nimport {\n Button,\n DialogFooter,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** What a saved configuration is, relative to the conversation: its origin, last used, or factory. */\nexport type ConfigOptionMarker = 'default' | 'original' | 'last-used'\n\nexport interface ConfigOption {\n value: string\n title: string\n subtitle?: string\n marker?: ConfigOptionMarker\n}\n\n/** Every fixed string of the bar. */\nexport interface ConfigSwitcherBarLabels {\n placeholder: string\n save: string\n saving: string\n delete: string\n}\n\nexport const DEFAULT_CONFIG_SWITCHER_BAR_LABELS: ConfigSwitcherBarLabels = {\n placeholder: 'Select configuration...',\n save: 'Save',\n saving: 'Saving...',\n delete: 'Delete',\n}\n\nexport interface ConfigSwitcherBarProps {\n options: ConfigOption[]\n /** Value of the selected option (`unsaved` is added by the bar while `hasUnsavedChanges`). */\n value: string\n onSelect: (value: string) => void\n /** Offers the transient \"Unsaved Changes\" entry on top. */\n hasUnsavedChanges: boolean\n unsavedTitle?: string\n unsavedSubtitle?: string\n /** Show the name input and the save button. */\n showNameField: boolean\n name: string\n onNameChange: (name: string) => void\n namePlaceholder: string\n /** `Save` for new, `Rename` for a loaded configuration. */\n saveLabel: string\n onSave: () => void\n isSaving: boolean\n /** Show the delete button (an existing configuration is loaded). */\n canDelete: boolean\n onDelete: () => void\n isDeleting: boolean\n nameTestId?: string\n saveTestId?: string\n deleteTestId?: string\n labels?: Partial<ConfigSwitcherBarLabels>\n className?: string\n}\n\nconst MARKERS = { default: Star, original: Undo2, 'last-used': History } as const\n\n/** Footer bar to pick, name, save and delete a saved configuration. */\nexport function ConfigSwitcherBar({\n options,\n value,\n onSelect,\n hasUnsavedChanges,\n unsavedTitle = 'Unsaved Changes',\n unsavedSubtitle = 'Changes will be lost if you switch',\n showNameField,\n name,\n onNameChange,\n namePlaceholder,\n saveLabel,\n onSave,\n isSaving,\n canDelete,\n onDelete,\n isDeleting,\n nameTestId,\n saveTestId,\n deleteTestId,\n labels,\n className,\n}: ConfigSwitcherBarProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIG_SWITCHER_BAR_LABELS, ...labels }), [labels])\n return (\n <DialogFooter\n data-slot=\"config-switcher-bar\"\n className={cn('flex-shrink-0 border-t bg-muted px-4 py-4', className)}\n >\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex min-h-[36px] items-center gap-3\">\n <Select\n value={hasUnsavedChanges ? 'unsaved' : value}\n onValueChange={(v) => {\n if (v !== 'unsaved') onSelect(v)\n }}\n >\n <SelectTrigger className=\"h-9 min-w-0 flex-1 border-0 bg-background\">\n <SelectValue placeholder={l.placeholder} />\n </SelectTrigger>\n <SelectContent position=\"popper\">\n {hasUnsavedChanges && (\n <SelectItem value=\"unsaved\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{unsavedTitle}</span>\n <span className=\"text-sm text-muted-foreground\">{unsavedSubtitle}</span>\n </div>\n </SelectItem>\n )}\n {options.map((o) => {\n const Marker = o.marker ? MARKERS[o.marker] : null\n return (\n <SelectItem key={o.value} value={o.value}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{o.title}</span>\n {o.subtitle && (\n <span className=\"text-sm text-muted-foreground\">{o.subtitle}</span>\n )}\n </div>\n {Marker && (\n <Marker className=\"mt-0.5 size-3 flex-shrink-0 text-muted-foreground\" />\n )}\n </div>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {showNameField && (\n <>\n <Input\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={namePlaceholder}\n className=\"h-9 min-w-0 flex-1 bg-background\"\n data-testid={testIdOr(nameTestId, { testId: 'config-name-input' })}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n onClick={onSave}\n disabled={isSaving || !name.trim()}\n data-testid={testIdOr(saveTestId, { testId: 'save-config-button' })}\n >\n {isSaving ? l.saving : saveLabel}\n </Button>\n </>\n )}\n\n {canDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9 border-destructive text-destructive hover:bg-destructive hover:text-destructive-foreground\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(deleteTestId, { testId: 'delete-config-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </Button>\n )}\n </div>\n </div>\n </DialogFooter>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Brain, History, Sparkles, Star, Users } from 'lucide-react'\nimport { Button, Input, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalSectionTitle } from './ModalScaffold'\n\n/** Longest title that can be saved. */\nexport const CONVERSATION_TITLE_MAX = 50\n\n/** Every fixed string of the conversation title section. */\nexport interface ConversationTitleSectionLabels {\n title: string\n placeholder: string\n share: string\n shared: string\n /** Tooltip on the share button for non-owners. */\n ownerOnlyShare: string\n /** Tooltip on the \"Shared\" button for the owner: pressing it makes the conversation private again. */\n makePrivate: string\n characters: (count: number, max: number) => string\n saving: string\n ownerOnlyEdit: string\n}\n\nexport const DEFAULT_CONVERSATION_TITLE_SECTION_LABELS: ConversationTitleSectionLabels = {\n title: 'Conversation Title',\n placeholder: 'New Conversation',\n share: 'Share',\n shared: 'Shared',\n ownerOnlyShare: 'Only available to conversation owner',\n makePrivate: 'Make private again',\n characters: (count, max) => `${count}/${max} characters`,\n saving: 'Saving...',\n ownerOnlyEdit: 'Only the conversation owner can edit the title',\n}\n\nexport interface ConversationTitleSectionProps {\n title: string\n onTitleChange: (title: string) => void\n /** Blur with a valid title: the host saves it. */\n onTitleCommit: () => void\n isOwner: boolean\n isShared: boolean\n isSharing: boolean\n isSavingTitle: boolean\n /** The share button was pressed (the host confirms, then shares). */\n onShare: () => void\n /** The \"Shared\" button was pressed by the owner: make the conversation private again. */\n onUnshare?: () => void\n inputTestId?: string\n shareTestId?: string\n labels?: Partial<ConversationTitleSectionLabels>\n}\n\nconst SECTION_CLASS = 'rounded-md border bg-muted/50 p-4'\n\n/** Title input with a share button and a character counter; read-only for non-owners. */\nexport function ConversationTitleSection({\n title,\n onTitleChange,\n onTitleCommit,\n isOwner,\n isShared,\n isSharing,\n isSavingTitle,\n onShare,\n onUnshare,\n inputTestId,\n shareTestId,\n labels,\n}: ConversationTitleSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_TITLE_SECTION_LABELS, ...labels }), [labels])\n const trimmed = title.trim()\n return (\n <ModalSection className={SECTION_CLASS}>\n <ModalSectionTitle>{l.title}</ModalSectionTitle>\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={title}\n onChange={(e) => {\n if (isOwner && e.target.value.length <= CONVERSATION_TITLE_MAX) {\n onTitleChange(e.target.value)\n }\n }}\n onBlur={() => {\n if (isOwner && trimmed && trimmed.length <= CONVERSATION_TITLE_MAX) onTitleCommit()\n }}\n placeholder={l.placeholder}\n maxLength={60}\n disabled={!isOwner}\n data-testid={testIdOr(inputTestId, { testId: 'conversation-title-input' })}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Button\n variant={isShared ? 'secondary' : 'outline'}\n size=\"sm\"\n className=\"h-9 px-3 pointer-coarse:h-11\"\n onClick={() => {\n if (!isOwner) return\n if (isShared) onUnshare?.()\n else onShare()\n }}\n disabled={!isOwner || (isShared && !onUnshare) || isSharing}\n title={isOwner && isShared && onUnshare ? l.makePrivate : undefined}\n data-testid={testIdOr(shareTestId, { testId: 'share-conversation-button' })}\n >\n <Users className=\"mr-1 size-3\" />\n {isShared ? l.shared : l.share}\n </Button>\n </span>\n </TooltipTrigger>\n {!isOwner && (\n <TooltipContent>\n <p>{l.ownerOnlyShare}</p>\n </TooltipContent>\n )}\n </Tooltip>\n </div>\n\n {isOwner ? (\n <p\n className={cn(\n 'text-sm',\n title.length > CONVERSATION_TITLE_MAX ? 'text-destructive' : 'text-muted-foreground'\n )}\n >\n {l.characters(title.length, CONVERSATION_TITLE_MAX)}\n {isSavingTitle && <span className=\"ml-2 text-primary\">{l.saving}</span>}\n </p>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.ownerOnlyEdit}</p>\n )}\n </div>\n </ModalSection>\n )\n}\n\n/** Every fixed string of the model selection section. */\nexport interface ModelSelectionSectionLabels {\n title: string\n description: string\n useDefaults: string\n auto: string\n default: string\n lastUsed: string\n deepThinking: string\n}\n\nexport const DEFAULT_MODEL_SELECTION_SECTION_LABELS: ModelSelectionSectionLabels = {\n title: 'AI Model Selection',\n description: 'Select the AI model to use for this conversation',\n useDefaults: 'Use defaults',\n auto: 'Auto',\n default: 'Default',\n lastUsed: 'Last used',\n deepThinking: 'Deep Thinking',\n}\n\nexport interface ModelSelectionSectionProps {\n /** The model picker (its logic stays in the host). */\n selector: ReactNode\n onUseDefaults: () => void\n defaultsTestId?: string\n labels?: Partial<ModelSelectionSectionLabels>\n}\n\n/** Model picker next to a \"Use defaults\" button, with the legend of the picker's icons. */\nexport function ModelSelectionSection({\n selector,\n onUseDefaults,\n defaultsTestId,\n labels,\n}: ModelSelectionSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_MODEL_SELECTION_SECTION_LABELS, ...labels }), [labels])\n const legend = [\n { icon: Sparkles, label: l.auto },\n { icon: Star, label: l.default },\n { icon: History, label: l.lastUsed },\n { icon: Brain, label: l.deepThinking },\n ]\n return (\n <ModalSection className={SECTION_CLASS}>\n <ModalSectionTitle>{l.title}</ModalSectionTitle>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n <div className=\"flex items-center gap-2\">\n {selector}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex h-8 items-center gap-1.5 px-3 pointer-coarse:h-11\"\n onClick={onUseDefaults}\n data-testid={testIdOr(defaultsTestId, { testId: 'use-defaults-button' })}\n >\n <Star className=\"size-4\" />\n <span className=\"text-sm\">{l.useDefaults}</span>\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-muted-foreground\">\n {legend.map(({ icon: Icon, label }) => (\n <span key={label} className=\"flex items-center gap-1\">\n <Icon className=\"size-3\" />\n <span>{label}</span>\n </span>\n ))}\n </div>\n </div>\n </ModalSection>\n )\n}\n","import { RefreshCw, Wifi, WifiOff } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\n\nexport type ServerConnectionState = 'connected' | 'connecting' | 'disconnected' | 'offline'\n\nconst DOT: Record<ServerConnectionState, string> = {\n connected: 'bg-green-solid',\n connecting: 'bg-yellow-solid',\n disconnected: 'bg-red-solid',\n offline: 'bg-yellow-solid',\n}\n\nexport interface ServerConnectionButtonProps {\n state: ServerConnectionState\n /** Visible text next to the dot (\"Connected\", \"Working offline\"...). */\n label: string\n isRefreshing: boolean\n onRefresh: () => void\n testId?: string\n}\n\n/** Status pill that doubles as the \"refresh session\" button. */\nexport function ServerConnectionButton({\n state,\n label,\n isRefreshing,\n onRefresh,\n testId = 'refresh-session-button',\n}: ServerConnectionButtonProps) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onRefresh}\n disabled={isRefreshing}\n className=\"flex items-center gap-2\"\n data-testid={testId}\n data-state={state}\n >\n <RefreshCw className={cn('size-4', isRefreshing && 'animate-spin')} />\n <span className={cn('size-2 rounded-full', DOT[state])} aria-hidden />\n {label}\n </Button>\n )\n}\n\nexport interface WorkOfflineToggleProps {\n isOffline: boolean\n onToggle: (offline: boolean) => void\n /** Accessible name and tooltip while online / offline. */\n labels?: { goOnline: string; workOffline: string; goOnlineHint: string; workOfflineHint: string }\n testId?: string\n}\n\nexport const DEFAULT_WORK_OFFLINE_LABELS = {\n goOnline: 'Go online',\n workOffline: 'Work offline',\n goOnlineHint: 'Reconnect and use ARBI online again',\n workOfflineHint:\n 'Work offline — read cached docs and queue edits, even though the server is reachable',\n}\n\n/** Icon toggle that forces the app offline even while the server is reachable. */\nexport function WorkOfflineToggle({\n isOffline,\n onToggle,\n labels,\n testId = 'work-offline-toggle',\n}: WorkOfflineToggleProps) {\n const l = { ...DEFAULT_WORK_OFFLINE_LABELS, ...labels }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isOffline ? 'secondary' : 'outline'}\n size=\"icon\"\n onClick={() => onToggle(!isOffline)}\n aria-label={isOffline ? l.goOnline : l.workOffline}\n aria-pressed={isOffline}\n data-testid={testId}\n >\n {isOffline ? <Wifi className=\"size-4\" /> : <WifiOff className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isOffline ? l.goOnlineHint : l.workOfflineHint}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { Crown } from 'lucide-react'\nimport { Switch, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface PremiumModelsFrameProps {\n enabled: boolean\n onEnabledChange: (enabled: boolean) => void\n title?: string\n description?: string\n /** The model table; greyed out and inert while premium models are off. */\n children: ReactNode\n toggleTestId?: string\n}\n\n// The checked checkbox (fill, border, tick) takes the primary colour and the selected row an\n// accent tint; the AG Grid theme variables alone are not enough.\nconst GRID_ACCENT_CLASSES = [\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!bg-primary',\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!border-primary',\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!text-primary-foreground',\n]\n\nconst GRID_ACCENT_VARS = {\n '--ag-checkbox-checked-color': 'hsl(var(--primary))',\n '--ag-selected-row-background-color': 'hsl(var(--accent))',\n} as CSSProperties\n\n/** Master switch for premium (third-party) models above the table of models to pick from. */\nexport function PremiumModelsFrame({\n enabled,\n onEnabledChange,\n title = 'Enable Premium Models',\n description = 'Third party AI models are priced on a pass-through basis.',\n children,\n toggleTestId,\n}: PremiumModelsFrameProps) {\n return (\n <div data-slot=\"premium-models-frame\">\n <div className=\"mb-2 flex items-center gap-3\">\n <Switch\n id=\"premiumModelToggle\"\n checked={enabled}\n onCheckedChange={onEnabledChange}\n data-testid={testIdOr(toggleTestId, { testId: 'toggle-premium-model' })}\n />\n <label\n className=\"flex cursor-pointer items-center gap-2 text-sm font-medium\"\n htmlFor=\"premiumModelToggle\"\n >\n <Crown className=\"size-4 text-muted-foreground\" />\n {title}\n </label>\n </div>\n <p className=\"mb-2 text-sm text-muted-foreground\">{description}</p>\n <div\n className={cn(\n 'transition-opacity',\n !enabled && 'pointer-events-none opacity-50',\n GRID_ACCENT_CLASSES\n )}\n style={GRID_ACCENT_VARS}\n aria-disabled={!enabled}\n >\n {children}\n </div>\n </div>\n )\n}\n\n/** Provider cell of the model table: an optional logo before the provider's name. */\nexport function ModelProviderLabel({ logo, children }: { logo?: ReactNode; children: ReactNode }) {\n return (\n <span data-slot=\"model-provider\" className=\"flex items-center gap-1.5\">\n {logo}\n {children}\n </span>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { ModalHeader } from './ModalScaffold'\n\nexport interface ThreadPreviewCrumb {\n icon?: ReactNode\n label: string\n}\n\nexport interface ThreadPreviewDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Breadcrumb in the header, e.g. workspace / conversation / \"Threads preview\". */\n crumbs: ThreadPreviewCrumb[]\n description?: string\n /** Width in px (the host measures what the visualisation needs); capped at 95vw. */\n width: number\n testId?: string\n children: ReactNode\n}\n\n/** Large dialog that hosts a visualisation under a breadcrumb header. */\nexport function ThreadPreviewDialog({\n open,\n onOpenChange,\n crumbs,\n description = 'Thread visualization',\n width,\n testId,\n children,\n}: ThreadPreviewDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col overflow-hidden p-0\"\n style={{ width: `${width}px`, maxWidth: '95vw', height: '80vh', maxHeight: '90vh' }}\n data-testid={testId}\n >\n <ModalHeader>\n <DialogTitle>\n <div className=\"flex items-center gap-3\">\n {crumbs.map((c, i) => (\n <span key={i} className=\"flex items-center gap-3\">\n {i > 0 && <span className=\"text-muted-foreground\">/</span>}\n {c.icon}\n <span>{c.label}</span>\n </span>\n ))}\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">{children}</div>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState } from 'react'\nimport { Check, ChevronDown, ChevronRight, Copy } from 'lucide-react'\nimport { formatCount } from '../lib/format'\n\nconst ITEMS = { one: 'item', other: 'items' }\n\n/** Display hint for one field (the host derives it from its schema). */\nexport interface JsonTreeHint {\n displayName?: string\n description?: string\n /** `id` hints show the full value next to a long id. */\n formatType?: string\n}\n\nexport interface JsonTreeProps<H extends JsonTreeHint = JsonTreeHint> {\n data: unknown\n name?: string\n defaultExpanded?: boolean\n level?: number\n /** Names of the ancestors, passed to `resolveHint`. */\n path?: string[]\n /** Schema-aware hint for a field; omit for a plain tree. */\n resolveHint?: (path: string[], name: string) => H | null\n /** Formats a primitive according to its hint. */\n formatValue?: (value: unknown, hint: H | null) => string\n}\n\n/** Small enough to render on one line. */\nfunction isInlineObject(data: unknown): boolean {\n if (data === null || data === undefined) return true\n if (typeof data !== 'object') return true\n if (Array.isArray(data)) return data.length === 0\n const keys = Object.keys(data as object)\n if (keys.length === 0) return true\n if (keys.length > 4) return false\n return Object.values(data as object).every(\n (v) => v === null || v === undefined || typeof v !== 'object'\n )\n}\n\nfunction inlineSummary(data: Record<string, unknown>): string {\n const parts = Object.entries(data).map(([k, v]) => {\n if (v === null) return `${k}: null`\n if (typeof v === 'string') return `${k}: \"${v.length > 40 ? v.slice(0, 40) + '…' : v}\"`\n return `${k}: ${String(v)}`\n })\n return `{ ${parts.join(', ')} }`\n}\n\n/** Preview of a collapsed array: the first item's identifying fields. */\nfunction arrayPreview(data: unknown[]): string {\n if (data.length === 0) return '[]'\n const first = data[0]\n if (typeof first !== 'object' || first === null) return `[${formatCount(data.length, ITEMS)}]`\n const obj = first as Record<string, unknown>\n const previewKeys = ['action', 'step', 'phase', 'tool', 'name', 'type', 'id']\n const parts = previewKeys\n .filter((k) => obj[k] !== undefined)\n .slice(0, 3)\n .map((k) => `${k}: ${JSON.stringify(obj[k])}`)\n if (parts.length === 0) return `[${formatCount(data.length, ITEMS)}]`\n return `[${formatCount(data.length, ITEMS)} — { ${parts.join(', ')} }, …]`\n}\n\nconst NAME_CLASS = 'font-medium text-blue-600 dark:text-blue-400'\nconst COPY_CLASS =\n 'rounded p-0.5 opacity-50 transition-opacity hover:bg-muted hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100'\n\nfunction valueColor(data: unknown): string {\n if (data === null || data === undefined) return 'text-muted-foreground'\n switch (typeof data) {\n case 'string':\n return 'text-green-700 dark:text-green-400'\n case 'number':\n return 'text-blue-700 dark:text-blue-400'\n case 'boolean':\n return 'text-purple-700 dark:text-purple-400'\n default:\n return 'text-foreground'\n }\n}\n\nfunction plainValue(data: unknown): string {\n if (data === null) return 'null'\n if (data === undefined) return 'undefined'\n return typeof data === 'string' ? `\"${data}\"` : String(data)\n}\n\n/**\n * Recursive JSON tree with collapse/expand, copy buttons (hover, keyboard focus and touch) and\n * optional schema-aware names/formatting. Like a console object inspector.\n */\nexport function JsonTree<H extends JsonTreeHint = JsonTreeHint>({\n data,\n name,\n defaultExpanded = false,\n level = 0,\n path = [],\n resolveHint,\n formatValue,\n}: JsonTreeProps<H>) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded || level < 2)\n const [copied, setCopied] = useState(false)\n\n const currentPath = name ? [...path, name] : path\n const hint = name && resolveHint ? resolveHint(currentPath, name) : null\n const displayName = hint?.displayName || name\n\n const handleCopy = (value: unknown) => {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n void navigator.clipboard.writeText(text).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }\n\n const copyButton = (title: string, value: unknown) => (\n <button\n type=\"button\"\n onClick={() => handleCopy(value)}\n className={COPY_CLASS}\n title={title}\n aria-label={title}\n >\n {copied ? <Check size={12} className=\"text-green-text\" /> : <Copy size={12} />}\n </button>\n )\n\n const isArray = Array.isArray(data)\n const isObject = typeof data === 'object' && data !== null && !isArray\n\n if (!isObject && !isArray) {\n const displayValue = hint && formatValue ? formatValue(data, hint) : plainValue(data)\n return (\n <div\n data-slot=\"json-tree-leaf\"\n className=\"group flex items-center gap-2 py-0.5 font-mono text-sm\"\n >\n {displayName && (\n <span className={NAME_CLASS} title={hint?.description}>\n {displayName}:\n </span>\n )}\n <span className={valueColor(data)}>{displayValue}</span>\n {hint?.formatType === 'id' && typeof data === 'string' && data.length > 20 && (\n <span className=\"text-sm text-muted-foreground\" title={data}>\n (full: {data})\n </span>\n )}\n {copyButton('Copy value', data)}\n </div>\n )\n }\n\n if (isObject && isInlineObject(data)) {\n return (\n <div\n data-slot=\"json-tree-leaf\"\n className=\"group flex items-center gap-2 py-0.5 font-mono text-sm\"\n >\n {displayName && <span className={NAME_CLASS}>{displayName}:</span>}\n <span className=\"text-muted-foreground\">\n {inlineSummary(data as Record<string, unknown>)}\n </span>\n {copyButton('Copy object', data)}\n </div>\n )\n }\n\n const Icon = isExpanded ? ChevronDown : ChevronRight\n // Arrays show items directly (no \"0:\", \"1:\" labels); objects show key: value pairs.\n const entries: [string, unknown][] = isArray\n ? (data as unknown[]).map((item, index) => [String(index), item])\n : Object.entries(data as Record<string, unknown>)\n const collapsedPreview = isArray\n ? arrayPreview(data as unknown[])\n : `{${Object.keys(data as object).length} fields}`\n\n return (\n <div data-slot=\"json-tree\" className=\"font-mono text-sm\">\n <div className=\"group flex items-center gap-1 py-0.5\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1 rounded p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n title={hint?.description}\n >\n <Icon size={14} className=\"shrink-0\" />\n {displayName && <span className={NAME_CLASS}>{displayName}:</span>}\n {!isExpanded && (\n <span className=\"max-w-[400px] truncate text-sm text-muted-foreground\">\n {collapsedPreview}\n </span>\n )}\n {isExpanded && isArray && (\n <span className=\"text-sm text-muted-foreground\">\n {(data as unknown[]).length} items\n </span>\n )}\n </button>\n {copyButton('Copy object', data)}\n </div>\n\n {isExpanded && (\n <div className=\"ml-4 border-l border-border/40 pl-2\">\n {entries.length === 0 ? (\n <div className=\"py-0.5 text-sm text-muted-foreground\">\n {isArray ? 'empty array' : 'empty object'}\n </div>\n ) : (\n entries.map(([key, value]) => {\n if (isArray && typeof value === 'object' && value !== null && isInlineObject(value)) {\n return (\n <div key={key} className=\"py-0.5 font-mono text-sm text-muted-foreground\">\n {inlineSummary(value as Record<string, unknown>)}\n </div>\n )\n }\n return (\n <JsonTree\n key={key}\n name={isArray ? undefined : key}\n data={value}\n level={level + 1}\n path={currentPath}\n resolveHint={resolveHint}\n formatValue={formatValue}\n />\n )\n })\n )}\n </div>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { Pencil, Plus, Trash2 } from 'lucide-react'\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the tips editor. */\nexport interface TipsEditorLabels {\n titleList: string\n titleNew: string\n titleEdit: string\n descriptionList: string\n descriptionNew: string\n descriptionEdit: string\n hiddenOff: string\n customSuffix: string\n editTip: string\n deleteTip: string\n addTip: string\n testerTitle: string\n run: string\n cancel: string\n newTipIdentity: string\n customTipIdentity: string\n builtInTipIdentity: (code: string) => string\n yourNewTip: string\n placement: string\n message: string\n button: string\n noButton: string\n platformAction: string\n actionSequence: string\n externalLink: string\n buttonLabel: string\n action: string\n sequence: string\n url: string\n back: string\n save: string\n saving: string\n}\n\nexport const DEFAULT_TIPS_EDITOR_LABELS: TipsEditorLabels = {\n titleList: 'Edit tips',\n titleNew: 'New tip',\n titleEdit: 'Edit tip',\n descriptionList:\n \"All tips across every page. Change a tip's placement to move it to a page, show it everywhere, or hide it. Changes save instantly.\",\n descriptionNew: 'Create a tip and choose where it shows.',\n descriptionEdit: 'Editing the tip below — change its copy, button, or placement.',\n hiddenOff: 'Hidden (off)',\n customSuffix: ' · custom',\n editTip: 'Edit tip',\n deleteTip: 'Delete tip',\n addTip: 'Add tip',\n testerTitle: 'Run a sequence (test)',\n run: 'Run',\n cancel: 'Cancel',\n newTipIdentity: 'New tip',\n customTipIdentity: 'Custom tip',\n builtInTipIdentity: (code) => `Built-in tip · ${code}`,\n yourNewTip: 'Your new tip',\n placement: 'Placement',\n message: 'Message',\n button: 'Button',\n noButton: 'No button',\n platformAction: 'Platform action',\n actionSequence: 'Action sequence',\n externalLink: 'External link (new window)',\n buttonLabel: 'Button label',\n action: 'Action',\n sequence: 'Sequence',\n url: 'URL',\n back: 'Back',\n save: 'Save',\n saving: 'Saving…',\n}\n\nexport interface TipOption {\n value: string\n label: string\n}\n\nexport interface TipListRow {\n code: string\n message: string\n /** Where it shows, already worded (\"Home\", \"All pages\"). */\n placementLabel: string\n isHidden: boolean\n isCustom: boolean\n}\n\nexport type TipTarget = 'none' | 'action' | 'sequence' | 'url'\n\n/** The edit form's values. */\nexport interface TipFormValues {\n /** null while creating a new custom tip. */\n code: string | null\n isCustom: boolean\n /** The tip's message at open time: the header identity. */\n original: string\n placement: string\n message: string\n target: TipTarget\n ctaLabel: string\n ctaAction: string\n ctaSequence: string\n ctaHref: string\n}\n\nexport interface TipsEditorDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** `null` shows the list. */\n form: TipFormValues | null\n onFormChange: (patch: Partial<TipFormValues>) => void\n onFormBack: () => void\n onFormSave: () => void\n rows: TipListRow[]\n onEditRow: (code: string) => void\n onDeleteRow: (code: string) => void\n onAdd: () => void\n busy: boolean\n error: string | null\n placementOptions: TipOption[]\n actionOptions: TipOption[]\n sequenceOptions: TipOption[]\n /** Sequence the shared runner is executing right now. */\n activeSequenceId: string | null\n onRunSequence: (id: string) => void\n onCancelSequence: () => void\n messageMaxChars: number\n ctaLabelMaxChars: number\n labels?: Partial<TipsEditorLabels>\n}\n\nfunction SelectField({\n label,\n value,\n onValueChange,\n options,\n}: {\n label: ReactNode\n value: string\n onValueChange: (v: string) => void\n options: TipOption[]\n}) {\n return (\n <div className=\"space-y-1\">\n <Label>{label}</Label>\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nconst ROW_BUTTON = 'size-7 flex-shrink-0 pointer-coarse:size-11'\n\n/**\n * Contextual-tips editor: every tip in a list (edit, delete, add) or one tip's form (placement,\n * message, optional button), plus a tester that runs action sequences. Persistence is the host's.\n */\nexport function TipsEditorDialog({\n open,\n onOpenChange,\n form,\n onFormChange,\n onFormBack,\n onFormSave,\n rows,\n onEditRow,\n onDeleteRow,\n onAdd,\n busy,\n error,\n placementOptions,\n actionOptions,\n sequenceOptions,\n activeSequenceId,\n onRunSequence,\n onCancelSequence,\n messageMaxChars,\n ctaLabelMaxChars,\n labels,\n}: TipsEditorDialogProps) {\n const tipCtaHrefId = useId()\n const tipCtaLabelId = useId()\n const tipMessageId = useId()\n const l = useMemo(() => ({ ...DEFAULT_TIPS_EDITOR_LABELS, ...labels }), [labels])\n const isNew = form?.code === null\n\n const title = form ? (isNew ? l.titleNew : l.titleEdit) : l.titleList\n const description = form ? (isNew ? l.descriptionNew : l.descriptionEdit) : l.descriptionList\n const targetOptions: TipOption[] = [\n { value: 'none', label: l.noButton },\n { value: 'action', label: l.platformAction },\n { value: 'sequence', label: l.actionSequence },\n { value: 'url', label: l.externalLink },\n ]\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n showDescription\n className=\"max-w-lg\"\n >\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n {form ? (\n <div className=\"space-y-3\">\n {/* Prominent identity of the tip being edited. */}\n <div className=\"rounded-md border border-l-4 border-l-red-500 bg-muted/40 px-3 py-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {isNew\n ? l.newTipIdentity\n : form.isCustom\n ? l.customTipIdentity\n : l.builtInTipIdentity(form.code ?? '')}\n </p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-foreground\">\n {form.original || l.yourNewTip}\n </p>\n </div>\n\n <SelectField\n label={l.placement}\n value={form.placement}\n onValueChange={(placement) => onFormChange({ placement })}\n options={placementOptions}\n />\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={tipMessageId}>{l.message}</Label>\n <span className=\"text-xs text-muted-foreground\">\n {form.message.length}/{messageMaxChars}\n </span>\n </div>\n <Textarea\n id={tipMessageId}\n value={form.message}\n onChange={(e) => onFormChange({ message: e.target.value.slice(0, messageMaxChars) })}\n maxLength={messageMaxChars}\n rows={2}\n />\n </div>\n\n <SelectField\n label={l.button}\n value={form.target}\n onValueChange={(v) => onFormChange({ target: v as TipTarget })}\n options={targetOptions}\n />\n\n {form.target !== 'none' && (\n <div className=\"space-y-1\">\n <Label htmlFor={tipCtaLabelId}>{l.buttonLabel}</Label>\n <Input\n id={tipCtaLabelId}\n value={form.ctaLabel}\n onChange={(e) =>\n onFormChange({ ctaLabel: e.target.value.slice(0, ctaLabelMaxChars) })\n }\n maxLength={ctaLabelMaxChars}\n />\n </div>\n )}\n\n {form.target === 'action' && (\n <SelectField\n label={l.action}\n value={form.ctaAction}\n onValueChange={(ctaAction) => onFormChange({ ctaAction })}\n options={actionOptions}\n />\n )}\n\n {form.target === 'sequence' && (\n <SelectField\n label={l.sequence}\n value={form.ctaSequence}\n onValueChange={(ctaSequence) => onFormChange({ ctaSequence })}\n options={sequenceOptions}\n />\n )}\n\n {form.target === 'url' && (\n <div className=\"space-y-1\">\n <Label htmlFor={tipCtaHrefId}>{l.url}</Label>\n <Input\n id={tipCtaHrefId}\n placeholder=\"https://…\"\n value={form.ctaHref}\n onChange={(e) => onFormChange({ ctaHref: e.target.value })}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onFormBack} disabled={busy}>\n {l.back}\n </Button>\n <Button onClick={onFormSave} disabled={busy || !form.message.trim()}>\n {busy ? l.saving : l.save}\n </Button>\n </DialogFooter>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <ul className=\"max-h-[55dvh] divide-y overflow-y-auto rounded border\">\n {rows.map((row) => (\n <li key={row.code} className=\"flex items-center gap-2 p-2 text-sm\">\n <div className=\"min-w-0 flex-1\">\n <p className={cn(row.isHidden && 'text-muted-foreground line-through')}>\n {row.message}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {row.isHidden ? l.hiddenOff : row.placementLabel}\n {row.isCustom && l.customSuffix}\n </p>\n </div>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={ROW_BUTTON}\n onClick={() => onEditRow(row.code)}\n aria-label={l.editTip}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n {row.isCustom && (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={ROW_BUTTON}\n disabled={busy}\n onClick={() => onDeleteRow(row.code)}\n aria-label={l.deleteTip}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n <Button variant=\"outline\" size=\"sm\" onClick={onAdd}>\n <Plus className=\"mr-1 size-4\" /> {l.addTip}\n </Button>\n\n {/* Dev tester: runs an action sequence end to end through the shared runner, the same\n path a tip button uses. */}\n <div className=\"space-y-2 rounded border border-dashed p-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {l.testerTitle}\n </p>\n <ul className=\"divide-y rounded border\">\n {sequenceOptions.map((s) => (\n <li key={s.value} className=\"flex items-center gap-2 p-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate\">{s.label}</span>\n {activeSequenceId === s.value ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 flex-shrink-0 pointer-coarse:h-11\"\n onClick={onCancelSequence}\n >\n {l.cancel}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 flex-shrink-0 pointer-coarse:h-11\"\n onClick={() => onRunSequence(s.value)}\n >\n {l.run}\n </Button>\n )}\n </li>\n ))}\n </ul>\n </div>\n </div>\n )}\n </ModalScaffold>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, Loader2 } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n DialogFooter,\n Label,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the sync dialog footer. */\nexport interface SyncDialogFooterLabels {\n cancel: string\n save: string\n}\n\nexport const DEFAULT_SYNC_DIALOG_FOOTER_LABELS: SyncDialogFooterLabels = {\n cancel: 'Cancel',\n save: 'Save',\n}\n\nexport interface SyncDialogFooterProps {\n onCancel: () => void\n onSave: () => void\n saveDisabled?: boolean\n isSaving?: boolean\n cancelButton?: { testId?: string }\n saveButton?: { testId?: string }\n labels?: Partial<SyncDialogFooterLabels>\n}\n\n/** Cancel / Save pair of a connector sync dialog; Save shows a spinner while saving. */\nexport function SyncDialogFooter({\n onCancel,\n onSave,\n saveDisabled,\n isSaving,\n cancelButton,\n saveButton,\n labels,\n}: SyncDialogFooterProps) {\n const l = { ...DEFAULT_SYNC_DIALOG_FOOTER_LABELS, ...labels }\n return (\n <DialogFooter data-slot=\"sync-dialog-footer\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} data-testid={cancelButton?.testId}>\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n onClick={onSave}\n disabled={saveDisabled || isSaving}\n data-testid={saveButton?.testId}\n >\n {isSaving && <Loader2 className=\"mr-1.5 size-3.5 animate-spin\" />}\n {l.save}\n </Button>\n </DialogFooter>\n )\n}\n\n/** Body of a sync dialog: the fields, spaced. */\nexport function SyncDialogBody({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"sync-dialog-body\" className=\"space-y-4 py-2\">\n {children}\n </div>\n )\n}\n\nexport interface SyncFieldProps {\n label?: ReactNode\n htmlFor?: string\n /** Right-aligned controls on the label row (e.g. expand all / collapse all). */\n actions?: ReactNode\n /** Muted explanation under the control. */\n hint?: ReactNode\n children: ReactNode\n}\n\n/** A labelled field of a sync dialog. */\nexport function SyncField({ label, htmlFor, actions, hint, children }: SyncFieldProps) {\n return (\n <div data-slot=\"sync-field\" className=\"space-y-1.5\">\n {(label || actions) && (\n <div className={cn(actions && 'flex items-center justify-between')}>\n {label && <Label htmlFor={htmlFor}>{label}</Label>}\n {actions}\n </div>\n )}\n {children}\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\n/** Small link-styled button (expand all, select all ...). */\nexport function SyncLinkButton({\n onClick,\n testId,\n children,\n}: {\n onClick: () => void\n testId?: string\n children: ReactNode\n}) {\n return (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:px-1\"\n onClick={onClick}\n data-testid={testId}\n >\n {children}\n </button>\n )\n}\n\n/** Row of {@link SyncLinkButton}s. */\nexport function SyncLinkRow({ children }: { children: ReactNode }) {\n return <div className=\"flex items-center gap-3\">{children}</div>\n}\n\nexport interface SyncSelectOption {\n value: string\n label: ReactNode\n}\n\nexport interface SyncSelectProps {\n id?: string\n testId?: string\n value: string\n onValueChange: (value: string) => void\n options: SyncSelectOption[]\n placeholder?: string\n}\n\n/** Select of a sync dialog (workspace, backfill window ...). */\nexport function SyncSelect({\n id,\n testId,\n value,\n onValueChange,\n options,\n placeholder,\n}: SyncSelectProps) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger id={id} data-testid={testId}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport interface SyncOptionToggleProps {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n title: ReactNode\n description?: ReactNode\n testId?: string\n}\n\n/** A checkbox option with a title and a muted explanation. */\nexport function SyncOptionToggle({\n checked,\n onCheckedChange,\n title,\n description,\n testId,\n}: SyncOptionToggleProps) {\n return (\n <label className=\"flex cursor-pointer items-start gap-2 text-sm\">\n <Checkbox\n className=\"mt-0.5\"\n checked={checked}\n onCheckedChange={(v) => onCheckedChange(v === true)}\n data-testid={testId}\n />\n <span>\n {title}\n {description && <span className=\"block text-xs text-muted-foreground\">{description}</span>}\n </span>\n </label>\n )\n}\n\n/** The import options of a dialog, spaced. */\nexport function SyncOptions({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"sync-options\" className=\"space-y-2.5\">\n {children}\n </div>\n )\n}\n\n/** Inline spinner + message while a list loads. */\nexport function SyncLoading({ children, compact }: { children: ReactNode; compact?: boolean }) {\n return (\n <div\n className={cn('flex items-center gap-2 text-sm text-muted-foreground', !compact && 'py-2')}\n >\n <Loader2 className=\"size-3.5 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** Muted one-liner (nothing found ...). */\nexport function SyncNote({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <p className=\"py-2 text-sm text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\n/** Muted small paragraph (the reconnect hint of calendars). */\nexport function SyncSmallNote({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <p className=\"text-xs text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\nexport interface SyncReconnectNoticeProps {\n message: ReactNode\n onReconnect: () => void\n isPending?: boolean\n testId?: string\n label?: string\n}\n\n/** A load failure the user fixes by re-authorizing the account. */\nexport function SyncReconnectNotice({\n message,\n onReconnect,\n isPending,\n testId,\n label = 'Reconnect',\n}: SyncReconnectNoticeProps) {\n return (\n <div className=\"space-y-2 py-2\">\n <p className=\"text-sm text-destructive\">{message}</p>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onReconnect}\n disabled={isPending}\n data-testid={testId}\n >\n {isPending && <Loader2 className=\"mr-1.5 size-3.5 animate-spin\" />}\n {label}\n </Button>\n </div>\n )\n}\n\n/** Scrolling frame of a folder tree. */\nexport function SyncTreeFrame({ children }: { children: ReactNode }) {\n return <ScrollArea className=\"h-72 rounded-md border p-2\">{children}</ScrollArea>\n}\n\nexport interface SyncCheckListItem {\n id: string\n label: string\n testId?: string\n}\n\nexport interface SyncCheckListProps {\n items: SyncCheckListItem[]\n selected: string[]\n onToggle: (id: string) => void\n}\n\n/** Flat, scrolling list of checkable items (a calendar has no folder tree). */\nexport function SyncCheckList({ items, selected, onToggle }: SyncCheckListProps) {\n return (\n <ScrollArea className=\"max-h-44 rounded-md border border-border\">\n <div className=\"space-y-1 p-2\">\n {items.map((c) => (\n <label\n key={c.id}\n className=\"flex cursor-pointer items-center gap-2 rounded px-1.5 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11\"\n >\n <Checkbox\n checked={selected.includes(c.id)}\n onCheckedChange={() => onToggle(c.id)}\n data-testid={c.testId}\n />\n <span className=\"truncate\">{c.label}</span>\n </label>\n ))}\n </div>\n </ScrollArea>\n )\n}\n\n/** Every fixed string of a lazy folder row. */\nexport interface SyncFolderRowLabels {\n collapse: string\n expand: string\n loading: string\n noSubfolders: string\n}\n\nexport const DEFAULT_SYNC_FOLDER_ROW_LABELS: SyncFolderRowLabels = {\n collapse: 'Collapse folder',\n expand: 'Expand folder',\n loading: 'Loading…',\n noSubfolders: 'No subfolders',\n}\n\nexport interface SyncFolderRowProps {\n id: string\n name: string\n depth: number\n /** Show the expand caret (false when nothing importable is beneath). */\n hasChildren: boolean\n isExpanded: boolean\n onToggleExpanded: () => void\n /** Grouping nodes (SharePoint sites) are shown but cannot be selected. */\n isSelectable: boolean\n checked: boolean\n /** An ancestor is selected: this folder is implicitly included. */\n disabled: boolean\n onCheckedChange: () => void\n /** Importable files beneath; undefined while unknown. */\n count?: number\n isCountLoading?: boolean\n /** Nested rows (the host renders them, lazily). */\n children?: ReactNode\n labels?: Partial<SyncFolderRowLabels>\n}\n\nconst INDENT = 18\n\n/**\n * One row of the lazy drive folder tree: caret, selection checkbox, name and file count. The\n * host fetches the children when expanded and renders them as `children` (or a status line).\n */\nexport function SyncFolderRow({\n id,\n name,\n depth,\n hasChildren,\n isExpanded,\n onToggleExpanded,\n isSelectable,\n checked,\n disabled,\n onCheckedChange,\n count,\n isCountLoading,\n children,\n labels,\n}: SyncFolderRowProps) {\n const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels }\n return (\n <div>\n <div\n className=\"flex items-center gap-1.5 rounded px-1 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11\"\n style={{ paddingLeft: depth * INDENT + 4 }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-8\"\n onClick={onToggleExpanded}\n aria-label={isExpanded ? l.collapse : l.expand}\n aria-expanded={isExpanded}\n >\n {isExpanded ? (\n <ChevronDown className=\"size-3.5\" />\n ) : (\n <ChevronRight className=\"size-3.5\" />\n )}\n </button>\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n {isSelectable ? (\n <label\n className=\"flex flex-1 cursor-pointer items-center gap-2 truncate\"\n data-testid={`drive-folder-row-${id}`}\n >\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n data-testid={`drive-folder-checkbox-${id}`}\n />\n <span className=\"truncate\" data-testid={`drive-folder-name-${id}`}>\n {name}\n </span>\n {isCountLoading ? (\n <Loader2 className=\"size-3 shrink-0 animate-spin text-muted-foreground\" />\n ) : typeof count === 'number' ? (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n ({count.toLocaleString()})\n </span>\n ) : null}\n </label>\n ) : (\n <span\n className=\"flex flex-1 items-center truncate font-medium text-muted-foreground\"\n data-testid={`drive-folder-row-${id}`}\n >\n <span className=\"truncate\" data-testid={`drive-folder-name-${id}`}>\n {name}\n </span>\n </span>\n )}\n </div>\n {isExpanded && <div>{children}</div>}\n </div>\n )\n}\n\n/** Status line under an expanded folder (loading / no subfolders), indented to its children. */\nexport function SyncFolderStatus({\n depth,\n kind,\n labels,\n}: {\n /** Depth of the folder the status belongs to. */\n depth: number\n kind: 'loading' | 'empty'\n labels?: Partial<SyncFolderRowLabels>\n}) {\n const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels }\n return (\n <div\n className=\"flex items-center gap-2 py-1 text-xs text-muted-foreground\"\n style={{ paddingLeft: (depth + 1) * INDENT + 4 }}\n >\n {kind === 'loading' ? (\n <>\n <Loader2 className=\"size-3 animate-spin\" /> {l.loading}\n </>\n ) : (\n l.noSubfolders\n )}\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Search, TriangleAlert } from 'lucide-react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport {\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n cn,\n getDocIcon,\n} from '@arbidocs/react/ui'\n\nconst TOKEN_WARNING_THRESHOLD = 150_000\nconst TOKEN_DANGER_THRESHOLD = 190_000\n\n/** A document the picker can offer. `pages`/`tokens` are null for images and unparsed files. */\nexport interface PickerDocument {\n id: string\n title: string\n fileName?: string | null\n pages?: number | null\n tokens?: number | null\n}\n\n/** A heading with its documents, already sorted. A group without heading is unlabeled. */\nexport interface PickerGroup {\n id: string\n heading?: string\n docs: PickerDocument[]\n}\n\n/** Every fixed string of the document picker. */\nexport interface DocumentPickerLabels {\n placeholder: string\n searchDocuments: string\n noDocuments: string\n selectedAsSource: string\n selectAsSource: string\n largeDocument: string\n tooLong: string\n pages: (n: number) => string\n tokens: (n: number) => string\n}\n\nexport const DEFAULT_DOCUMENT_PICKER_LABELS: DocumentPickerLabels = {\n placeholder: 'Select a document',\n searchDocuments: 'Search documents...',\n noDocuments: 'No documents found.',\n selectedAsSource: 'Selected as source',\n selectAsSource: 'Select as source',\n largeDocument: 'Large document — may take longer to process',\n tooLong: 'Document is too long to be read in its entirety',\n pages: (n) => `${n.toLocaleString()} pages`,\n tokens: (n) => `${n.toLocaleString()} tokens`,\n}\n\nexport interface DocumentPickerProps {\n groups: PickerGroup[]\n /** The picked document (single mode). */\n value: string\n onValueChange: (id: string) => void\n /** The picked document's details, shown under the picker (pages, tokens, size warnings). */\n selected?: PickerDocument\n /**\n * Ids already chosen. Supplying this switches to MULTI mode: the search box is inline, the\n * list stays open on select and ticks what is in.\n */\n selectedIds?: string[]\n /**\n * Splits each row in two: a click OPENS the document (this callback) and a leading checkbox\n * selects it as a source via `onValueChange`. Requires `selectedIds`.\n */\n onOpenDocument?: (id: string) => void\n /** The document open in the viewer: its row is inverted (multi mode). */\n viewingId?: string | null\n /** While true the list is shut (a neighbouring popup must not overlay it). */\n forceClosed?: boolean\n /** Extra classes of the results list, e.g. a taller `max-h-*` when the picker is the surface. */\n listClassName?: string\n labels?: Partial<DocumentPickerLabels>\n}\n\n/**\n * Searchable document picker. Single mode is a button that opens a searchable list; multi mode\n * puts the search inline. After a pick it shows page/token counts with size warnings.\n */\nexport function DocumentPicker({\n groups,\n value,\n onValueChange,\n selected,\n selectedIds,\n onOpenDocument,\n viewingId,\n forceClosed = false,\n listClassName,\n labels,\n}: DocumentPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels])\n const multi = selectedIds !== undefined\n const isChosen = (id: string) => (multi ? selectedIds.includes(id) : value === id)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n if (forceClosed) setOpen(false)\n }, [forceClosed])\n const anchorRef = useRef<HTMLDivElement>(null)\n\n // A real checkbox when rows open on click; otherwise the tick that mirrors the pick.\n const leadingControl = (id: string): ReactNode =>\n onOpenDocument ? (\n // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would\n // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.\n <span\n className=\"mr-2 flex items-center\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isChosen(id)}\n onCheckedChange={() => onValueChange(id)}\n aria-label={isChosen(id) ? l.selectedAsSource : l.selectAsSource}\n data-testid={`document-combobox-select-${id}`}\n />\n </span>\n ) : (\n <Check className={cn('mr-2 size-4', isChosen(id) ? 'opacity-100' : 'opacity-0')} />\n )\n\n const itemClass = (id: string) =>\n cn(\n onOpenDocument && 'cursor-pointer',\n onOpenDocument && isChosen(id) && 'bg-primary/10 aria-selected:bg-primary/15',\n // Inverted so the open one is unmistakable, over cmdk's own hover tint.\n viewingId === id &&\n 'bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background'\n )\n\n const renderGroups = () => (\n <>\n <CommandEmpty>{l.noDocuments}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup key={group.id} heading={group.heading}>\n {group.docs.map((doc) => (\n <CommandItem\n key={doc.id}\n // Identity is the id: two documents can share a name, and a title-valued item would\n // make cmdk treat them as one. The title stays searchable via keywords.\n value={doc.id}\n keywords={[doc.title]}\n className={itemClass(doc.id)}\n onSelect={() => {\n if (onOpenDocument) {\n onOpenDocument(doc.id)\n return\n }\n onValueChange(doc.id)\n if (!multi) setOpen(false)\n }}\n >\n {leadingControl(doc.id)}\n <span className=\"mr-2 flex shrink-0 items-center\">\n {getDocIcon(doc.fileName ?? undefined)}\n </span>\n <span className={cn('truncate', onOpenDocument && 'hover:underline')}>\n {doc.title}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )\n\n const contentClass = 'w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md'\n const tokens = selected?.tokens ?? null\n const pages = selected?.pages ?? null\n const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD\n const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger\n\n return (\n <div data-slot=\"document-picker\">\n {multi ? (\n // The input IS the anchor: the list opens beneath the row as soon as it is focused or\n // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.\n <Command>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n ref={anchorRef}\n className=\"flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11\"\n data-testid=\"document-combobox-trigger\"\n >\n <Search className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={l.placeholder}\n aria-expanded={open}\n className=\"h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n onFocus={() => setOpen(true)}\n onValueChange={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') setOpen(true)\n if (e.key === 'Escape') setOpen(false)\n }}\n data-testid=\"document-combobox-search\"\n />\n </div>\n </PopoverAnchor>\n <PopoverContent\n className={contentClass}\n align=\"start\"\n // Focus stays in the inline input, and opening a document hands focus to the viewer:\n // neither may count as an outside click. Pointer-downs in the viewer, dialogs and\n // poppers are ignored; Escape and any other outside click still close the list.\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => {\n const target = e.target as Element | null\n if (\n anchorRef.current?.contains(target) ||\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n >\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </PopoverContent>\n </Popover>\n </Command>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11',\n !value && 'text-muted-foreground'\n )}\n data-testid=\"document-combobox-trigger\"\n >\n <span className=\"truncate\">{selected?.title || l.placeholder}</span>\n <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className={contentClass} align=\"start\">\n <Command>\n <CommandInput placeholder={l.searchDocuments} />\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\n {selected && (\n <div className=\"mt-2 space-y-1\" data-testid=\"document-combobox-info\">\n <p className=\"text-sm text-muted-foreground\">\n {pages != null && <span>{l.pages(pages)}</span>}\n {pages != null && tokens != null && <span> · </span>}\n {tokens != null && <span>{l.tokens(tokens)}</span>}\n </p>\n {isWarning && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-yellow-text\"\n data-testid=\"document-combobox-warning\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.largeDocument}\n </p>\n )}\n {isDanger && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-red-text\"\n data-testid=\"document-combobox-danger\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.tooLong}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","import {\n Fragment,\n useEffect,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { Ban, Check, ChevronDown, ChevronRight, Filter, FunnelX, MoreVertical } from 'lucide-react'\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\n/** include keeps matches, exclude drops them, null is indifferent. */\nexport type TriState = 'include' | 'exclude' | null\n\nexport interface TriStateOption<T extends string = string> {\n id: T\n label: string\n icon?: ReactNode\n count: number\n disabled?: boolean\n /** Indent level (nested options such as folders). */\n depth?: number\n}\n\nexport interface TriStateGroup<T extends string = string> {\n label: string\n options: T[]\n collapsible?: boolean\n}\n\n/** Every fixed string of the filter menu. */\nexport interface TriStateFilterMenuLabels {\n clear: string\n}\n\nexport const DEFAULT_TRI_STATE_FILTER_MENU_LABELS: TriStateFilterMenuLabels = { clear: 'Clear' }\n\nexport interface HoverHandlers {\n onMouseEnter: () => void\n onMouseLeave: () => void\n}\n\nexport interface TriStateFilterMenuProps<T extends string> {\n /** Test id of the trigger. */\n testId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n title?: string\n filterStates: Map<T, TriState>\n onFiltersChange: (filters: Map<T, TriState>) => void\n options: TriStateOption<T>[]\n groups?: TriStateGroup<T>[]\n /** Between the header and the options (e.g. a toggle). */\n topContent?: ReactNode\n /** Before a group, keyed by the group's label. */\n groupTopContent?: Record<string, ReactNode>\n /** After `topContent` (e.g. a folder navigator). */\n folderContent?: ReactNode\n /** After every group (e.g. a source toggle). */\n bottomContent?: ReactNode\n /** Label next to the filter icon of the trigger. */\n triggerLabel?: string\n /** Shows the active styling even with no tri-state filter set. */\n hasExternalActiveState?: boolean\n /** Never show the active styling (chips carry the indication instead). */\n suppressTriggerActiveStyle?: boolean\n /** Replaces the default trigger styling (e.g. flush inside a unified widget). */\n triggerClassName?: string\n /** A chevron after the icon/label instead of the dots: the trigger reads as a dropdown segment. */\n renderChevron?: boolean\n /** Open only on an explicit click, never on hover (trigger embedded in another control). */\n disableHoverOpen?: boolean\n /** Exposes the hover handlers so a wider hover target (a tab header) can drive the menu. */\n onHoverHandlers?: (handlers: HoverHandlers) => void\n labels?: Partial<TriStateFilterMenuLabels>\n}\n\n/**\n * Tri-state filter dropdown. Opens on hover (pointer) or click (locks it open until clicked\n * away); the open state is controlled so a host can persist it. Options cycle\n * neutral, include, exclude.\n */\nexport function TriStateFilterMenu<T extends string>({\n testId,\n open,\n onOpenChange,\n title,\n filterStates,\n onFiltersChange,\n options,\n groups,\n topContent,\n groupTopContent,\n folderContent,\n bottomContent,\n triggerLabel,\n hasExternalActiveState = false,\n suppressTriggerActiveStyle = false,\n triggerClassName,\n renderChevron = false,\n disableHoverOpen = false,\n onHoverHandlers,\n labels,\n}: TriStateFilterMenuProps<T>) {\n const l = { ...DEFAULT_TRI_STATE_FILTER_MENU_LABELS, ...labels }\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(\n () => new Set((groups ?? []).filter((g) => g.collapsible).map((g) => g.label))\n )\n // Opened by click: stays open until clicked away.\n const [isClickOpen, setIsClickOpen] = useState(false)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelPendingClose = () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const handleMouseEnter = () => {\n if (disableHoverOpen) return\n cancelPendingClose()\n if (!isClickOpen) onOpenChange(true)\n }\n\n const handleMouseLeave = () => {\n if (disableHoverOpen || isClickOpen) return\n // Delay so the pointer can travel to the content.\n hoverTimeoutRef.current = setTimeout(() => {\n if (!isClickOpen) onOpenChange(false)\n }, 150)\n }\n\n const handleTriggerClick = () => {\n setIsClickOpen(!isClickOpen)\n onOpenChange(!isClickOpen)\n }\n\n useEffect(() => {\n onHoverHandlers?.({ onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave })\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => cancelPendingClose, [])\n\n const optionMap = useMemo(() => new Map(options.map((o) => [o.id, o])), [options])\n\n // neutral -> include -> exclude -> neutral\n const handleFilterToggle = (filterId: T) => {\n const next = new Map(filterStates)\n const current = next.get(filterId) ?? null\n next.set(filterId, current === null ? 'include' : current === 'include' ? 'exclude' : null)\n onFiltersChange(next)\n }\n\n const handleClearFilters = (e: MouseEvent) => {\n e.stopPropagation()\n // Only option ids: other keys (e.g. folder filters) stay.\n const cleared = new Map(filterStates)\n options.forEach((opt) => cleared.set(opt.id, null))\n onFiltersChange(cleared)\n }\n\n const clearButton = (\n <Button\n variant=\"ghost\"\n size=\"default\"\n onClick={handleClearFilters}\n className=\"ml-auto h-8 px-3 text-sm text-primary hover:text-primary pointer-coarse:h-11\"\n >\n <FunnelX className=\"mr-1.5 h-4 w-4 text-primary\" />\n {l.clear}\n </Button>\n )\n\n const hasActiveFilters = useMemo(() => {\n const ids = new Set(options.map((o) => o.id))\n return (\n hasExternalActiveState ||\n Array.from(filterStates.entries()).some(([k, v]) => ids.has(k) && v !== null)\n )\n }, [filterStates, options, hasExternalActiveState])\n const isActive = !suppressTriggerActiveStyle && hasActiveFilters\n\n // Without a title the Clear button rides on the first group's label row.\n const showInlineClear =\n !title &&\n hasActiveFilters &&\n !suppressTriggerActiveStyle &&\n !!groups &&\n groups.length > 0 &&\n !groups[0].collapsible\n\n const renderTriStateItem = (option: TriStateOption<T>) => {\n const state = filterStates.get(option.id) ?? null\n const badgeClass =\n state === null\n ? 'bg-card border-border text-foreground hover:bg-muted'\n : state === 'include'\n ? 'bg-primary text-primary-foreground border-primary hover:bg-primary'\n : 'bg-card text-red-text border-red-text hover:bg-red-bg'\n const stateIcon =\n state === null ? (\n <div className=\"size-3.5 rounded-sm border-2 border-border bg-transparent\" />\n ) : state === 'include' ? (\n <Check className=\"size-3\" strokeWidth={3} />\n ) : (\n <Ban className=\"size-3 text-red-text\" strokeWidth={3} />\n )\n const depthPadding = option.depth ? option.depth * 16 : 0\n\n return (\n <DropdownMenuItem\n key={option.id}\n onClick={() => handleFilterToggle(option.id)}\n onSelect={(e) => e.preventDefault()}\n disabled={option.disabled}\n className=\"cursor-pointer p-1\"\n style={depthPadding ? { paddingLeft: `${depthPadding + 4}px` } : undefined}\n >\n <Badge\n variant=\"outline\"\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11',\n badgeClass\n )}\n >\n {stateIcon}\n {option.icon && <span className=\"[&>svg]:size-3.5\">{option.icon}</span>}\n <span className=\"font-medium\">{option.label}</span>\n <span className=\"ml-auto font-semibold\">{option.count}</span>\n </Badge>\n </DropdownMenuItem>\n )\n }\n\n const toggleGroupCollapse = (label: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev)\n if (!next.delete(label)) next.add(label)\n return next\n })\n }\n\n const renderOptions = () => {\n if (!groups || groups.length === 0) return options.map(renderTriStateItem)\n\n return groups.map((group, groupIndex) => {\n const isCollapsed = !!group.collapsible && collapsedGroups.has(group.label)\n const activeCount = group.collapsible\n ? group.options.filter((id) => filterStates.get(id) !== null).length\n : 0\n\n return (\n <Fragment key={group.label}>\n {groupIndex > 0 && <DropdownMenuSeparator />}\n {groupTopContent?.[group.label] && (\n <>\n <div className=\"px-2 py-1.5\">{groupTopContent[group.label]}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {group.collapsible ? (\n <button\n type=\"button\"\n onClick={() => toggleGroupCollapse(group.label)}\n aria-expanded={!isCollapsed}\n className=\"flex w-full cursor-pointer items-center gap-1 rounded-sm px-2 py-1.5 text-sm font-semibold text-primary hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n {isCollapsed ? (\n <ChevronRight className=\"size-3.5\" />\n ) : (\n <ChevronDown className=\"size-3.5\" />\n )}\n <span>{group.label}</span>\n {isCollapsed && activeCount > 0 && (\n <Badge\n variant=\"outline\"\n className=\"ml-auto flex h-4 min-w-4 items-center justify-center rounded-md px-1 text-xs leading-none\"\n >\n {activeCount}\n </Badge>\n )}\n </button>\n ) : groupIndex === 0 && showInlineClear ? (\n <div className=\"flex items-center justify-between pr-1\">\n <DropdownMenuLabel className=\"text-primary\">{group.label}</DropdownMenuLabel>\n {clearButton}\n </div>\n ) : (\n <DropdownMenuLabel className=\"text-primary\">{group.label}</DropdownMenuLabel>\n )}\n {!isCollapsed &&\n group.options\n .map((id) => optionMap.get(id))\n .filter((opt): opt is TriStateOption<T> => opt !== undefined)\n .map(renderTriStateItem)}\n </Fragment>\n )\n })\n }\n\n const tone = isActive ? 'text-primary' : 'text-muted-foreground'\n\n return (\n <DropdownMenu modal={false} open={open} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"tri-state-filter-trigger\"\n className={\n triggerClassName ??\n 'inline-flex cursor-pointer items-center gap-1 rounded-sm px-1.5 py-0.5 text-sm font-medium transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center'\n }\n data-testid={testId}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleTriggerClick}\n >\n <Filter\n className={cn(\n 'size-3 transition-colors',\n isActive ? 'fill-primary text-primary' : tone\n )}\n />\n {triggerLabel && <span className={tone}>{triggerLabel}</span>}\n {renderChevron ? (\n <ChevronDown className={cn('size-3 transition-colors', tone)} />\n ) : (\n triggerLabel && <MoreVertical className={cn('size-3 transition-colors', tone)} />\n )}\n </span>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"center\"\n className=\"w-80 border-0 bg-muted\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={cancelPendingClose}\n onMouseLeave={() => {\n if (!isClickOpen) onOpenChange(false)\n }}\n onPointerDownOutside={(e) => {\n // Click-opened menus close only on a real outside click.\n if (!isClickOpen) return\n if (!(e.target as HTMLElement).closest('[role=\"menu\"]')) {\n setIsClickOpen(false)\n onOpenChange(false)\n } else {\n e.preventDefault()\n }\n }}\n >\n {(title || (hasActiveFilters && !suppressTriggerActiveStyle && !showInlineClear)) && (\n <>\n <div className=\"flex items-center justify-between px-2 py-1.5\">\n {title && <DropdownMenuLabel className=\"p-0 text-primary\">{title}</DropdownMenuLabel>}\n {hasActiveFilters && !showInlineClear && clearButton}\n </div>\n <DropdownMenuSeparator />\n </>\n )}\n {topContent && (\n <>\n <div className=\"px-2 py-1.5\">{topContent}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {folderContent && (\n <>\n <div className=\"px-1 py-0.5\">{folderContent}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {renderOptions()}\n {bottomContent && (\n <>\n <DropdownMenuSeparator />\n <div className=\"px-2 py-1.5\">{bottomContent}</div>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_BORDER, TONE_SURFACE } from '../components/tones'\n\nconst planBadgeVariants = cva(\n 'inline-flex flex-shrink-0 items-center rounded-full border font-semibold leading-none',\n {\n variants: {\n /** free/dev = neutral, paid = accent tint, pending = payment trouble or cancelling. */\n tone: {\n free: `border-transparent ${TONE_SURFACE.neutral}`,\n dev: `border-transparent ${TONE_SURFACE.neutral}`,\n paid: 'border-transparent bg-accent text-accent-foreground',\n pending: `${TONE_BORDER.warning} ${TONE_SURFACE.warning}`,\n },\n /** `sm` fits dense rows and tables; `md` holds its own beside body text. */\n size: {\n sm: 'h-5 px-2 text-xs',\n md: 'h-6 px-2.5 text-sm',\n },\n },\n defaultVariants: { tone: 'free', size: 'sm' },\n }\n)\n\nexport interface PlanBadgeProps extends VariantProps<typeof planBadgeVariants> {\n /** Tier name, e.g. \"Free\", \"Pro x2\". */\n label: string\n className?: string\n testId?: string\n}\n\n/** A project's plan tier as a small coloured pill. */\nexport function PlanBadge({\n label,\n tone,\n size,\n className,\n testId = 'project-plan-chip',\n}: PlanBadgeProps) {\n return (\n <span\n data-slot=\"plan-badge\"\n className={cn(planBadgeVariants({ tone, size }), className)}\n data-testid={testId}\n >\n {label}\n </span>\n )\n}\n","import { Fragment, type ElementType } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\n\nexport interface QuotaMeterItem {\n key: string\n icon: ElementType\n label: string\n /** Compact display: used only (the limit lives in the tooltip). */\n used: string\n /** Prominent display: \"used / limit\". */\n usedOfLimit: string\n /** 0-100+ percentage of the limit consumed. */\n pct: number\n}\n\n/** Fill colour escalating green -> yellow -> red with usage. */\nconst barColor = (pct: number) =>\n pct >= 100 ? 'bg-red-500' : pct >= 50 ? 'bg-yellow-500' : 'bg-green-500'\n\n/** Value tint of the compact row: neutral until usage deserves attention (warn, then limit). */\nconst valueColor = (pct: number) =>\n pct >= 100 ? 'text-red-text' : pct >= 80 ? 'text-yellow-text' : 'text-muted-foreground'\n\nexport interface QuotaMeterProps {\n items: QuotaMeterItem[]\n /** `sm`: icon + counter row. `lg`: stat tiles with progress bars. */\n size?: 'sm' | 'lg'\n /** Per-item tooltip with used / limit (sm only). Off when a parent owns the tooltip. */\n showTooltips?: boolean\n /** The usage tint and percentage (sm only). Off on deployments without limits. */\n showBars?: boolean\n /** The \"(pct%)\" after each number (sm only). */\n showPercent?: boolean\n className?: string\n /**\n * Ids; defaults are the current ids. `root` defaults per size (`quota-badges-lg` / `quota-badges-sm`);\n * `badge` is a prefix (`<prefix>-<key>`, `<prefix>-<key>-fill` for the lg bar).\n */\n testIds?: Partial<Record<'root' | 'badge', string>>\n}\n\n/** Credits / storage / collaborators readout, in a compact row or as stat tiles. */\nexport function QuotaMeter({\n items,\n size = 'sm',\n showTooltips = true,\n showBars = true,\n showPercent = true,\n className,\n testIds,\n}: QuotaMeterProps) {\n if (size === 'lg') {\n return (\n <div\n data-slot=\"quota-meter\"\n className={cn('flex flex-wrap gap-3', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'quota-badges-lg' })}\n >\n {items.map(({ key, icon: Icon, label, usedOfLimit, pct }) => (\n <div\n key={key}\n className=\"min-w-[8rem] flex-1 rounded-lg bg-muted p-3\"\n data-testid={prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` })}\n >\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span className=\"truncate\">{label}</span>\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {usedOfLimit}\n </div>\n <div className=\"mt-2 h-1.5 overflow-hidden rounded-full bg-background\">\n <div\n className={cn('h-full rounded-full', barColor(pct))}\n style={{ width: `${Math.min(pct, 100)}%` }}\n data-testid={prefixedTestId(\n testIds?.badge,\n key,\n { testId: `quota-badge-${key}-fill` },\n '-fill'\n )}\n />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"quota-meter\"\n className={cn('flex flex-shrink-0 items-center gap-3 text-sm tabular-nums', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'quota-badges-sm' })}\n >\n {items.map(({ key, icon: Icon, label, used, usedOfLimit, pct }) => {\n const badge = (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` })}\n >\n <Icon className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n {/* \"used (pct%)\" shows how full the quota is without a tooltip, which touch never opens. */}\n <span className={showBars ? valueColor(pct) : 'text-muted-foreground'}>\n {showBars && showPercent ? `${used} (${Math.round(pct)}%)` : used}\n </span>\n </span>\n )\n return showTooltips ? (\n <Tooltip key={key}>\n <TooltipTrigger asChild>{badge}</TooltipTrigger>\n <TooltipContent>{`${usedOfLimit} ${label}`}</TooltipContent>\n </Tooltip>\n ) : (\n <Fragment key={key}>{badge}</Fragment>\n )\n })}\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport { Check, Info, Tag } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the plan cards and their controls. */\nexport interface PlanCardLabels {\n currentPlan: string\n popular: string\n noMonthlyCost: string\n perMonth: string\n /** Short \"Current\" pill on a tier option. */\n current: string\n monthly: string\n annual: string\n annualBilling: string\n /** Savings pill: \"Save 20%\". */\n save: (percent: number) => string\n havePromoCode: string\n promoCode: string\n enterCode: string\n pricingExplainer: string\n explainerTiers: string\n explainerCredits: string\n seeModelList: string\n}\n\nexport const DEFAULT_PLAN_CARD_LABELS: PlanCardLabels = {\n currentPlan: 'Current plan',\n popular: 'Popular',\n noMonthlyCost: 'No monthly cost',\n perMonth: '/mo',\n current: 'Current',\n monthly: 'Monthly',\n annual: 'Annual',\n annualBilling: 'Annual billing',\n save: (percent) => `Save ${percent}%`,\n havePromoCode: 'Have a promo code?',\n promoCode: 'Promo Code',\n enterCode: 'Enter code',\n pricingExplainer: 'Pricing Explainer',\n explainerTiers:\n 'Pro tiers (Pro, Pro x2, Pro x10) are subscriptions linked to a pool of AI credits and document storage. This pool is shared with any project collaborators, subject to a per-user daily usage limit determined by the project owner. Project owners can move up to a higher tier any time, and can move down or cancel at the end of their existing billing period. It is recommended to have separate project subscriptions for different clients/matters to facilitate matter-based usage analysis and invoicing.',\n explainerCredits:\n 'AI credits are used in AI chat and AI-powered document processing. AI usage is metered based on the number of words (tokens) consumed and generated by the AI — including review of inputs and intermediate reasoning steps — and the published per-token price for the selected AI model. As a rule of thumb, one moderately complex request, or an upload involving around 25 source documents, will consume 1 credit when using our Standard AI models (hosted by ARBI CITY). Even though our pricing for Premium models matches the direct cost charged by third-party providers, using Premium models can easily cost 10× or even 100× more than Standard models.',\n seeModelList: 'See the AI model list →',\n}\n\n/** Pre-formatted price lines for a paid plan card. */\nexport interface PlanCardPrice {\n annual: boolean\n /** Struck-through no-discount yearly total (annual billing). */\n yearlyStrike?: string\n /** Yearly total (annual billing). */\n yearlyTotal?: string\n /** Interval suffix beside the yearly total, e.g. \"/yr\". */\n intervalLabel?: string\n /** Struck-through no-discount monthly price. */\n monthlyStrike?: string\n /** Effective monthly price. */\n monthly: string\n}\n\nexport interface PlanCardView {\n /** Pack count: the stable id of the tier. */\n id: number\n name: string\n /** Free plan: shows \"No monthly cost\" instead of a price. */\n isFree?: boolean\n isCurrent?: boolean\n isSelected?: boolean\n isPopular?: boolean\n price?: PlanCardPrice\n /** Entitlement lines, e.g. \"2,000 AI Credits / mo\". */\n features: string[]\n}\n\nexport interface PlanCardProps {\n plan: PlanCardView\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}\n\n/** Selectable plan tile. The current plan is marked and not selectable. */\nexport function PlanCard({ plan, onSelect, labels }: PlanCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n const { id, name, isFree, isCurrent, isSelected, isPopular, price, features } = plan\n return (\n <button\n type=\"button\"\n disabled={isCurrent}\n aria-pressed={!!isSelected}\n onClick={() => !isCurrent && onSelect(id)}\n data-slot=\"plan-card\"\n data-testid={`tier-card-${id}`}\n className={cn(\n 'relative rounded-lg p-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isCurrent\n ? 'cursor-default bg-blue-bg'\n : isSelected\n ? 'bg-accent ring-1 ring-primary/50'\n : 'bg-muted hover:bg-muted/70'\n )}\n >\n {isCurrent && (\n <span className=\"absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-blue-bg px-3 py-1 text-xs font-semibold leading-none text-blue-text\">\n {l.currentPlan}\n </span>\n )}\n {isPopular && !isCurrent && (\n <span className=\"absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-primary px-3 py-1 text-xs font-semibold leading-none text-primary-foreground\">\n {l.popular}\n </span>\n )}\n <div className=\"mb-3 flex items-baseline gap-2\">\n <span\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n isCurrent ? 'text-blue-text' : 'text-foreground'\n )}\n >\n {name}\n </span>\n </div>\n {isFree ? (\n <div className=\"text-sm font-medium leading-none text-muted-foreground\">\n {l.noMonthlyCost}\n </div>\n ) : (\n price && (\n <div className=\"flex flex-col gap-1\">\n {price.annual && price.yearlyTotal && (\n <div className=\"flex items-baseline gap-x-2 whitespace-nowrap text-base tabular-nums\">\n {price.yearlyStrike && (\n <span className=\"font-medium text-muted-foreground line-through decoration-muted-foreground/70 decoration-1\">\n {price.yearlyStrike}\n </span>\n )}\n <span className=\"text-lg font-semibold text-foreground\">\n {price.yearlyTotal}\n <span className=\"ml-0.5 text-xs font-semibold text-muted-foreground\">\n {price.intervalLabel}\n </span>\n </span>\n </div>\n )}\n <div className=\"flex items-baseline gap-x-1.5 whitespace-nowrap\">\n {price.annual && (\n <span className=\"text-xl font-semibold leading-none text-muted-foreground\">=</span>\n )}\n {price.monthlyStrike && (\n <span className=\"text-base font-medium tabular-nums text-muted-foreground line-through decoration-muted-foreground/70 decoration-1\">\n {price.monthlyStrike}\n </span>\n )}\n <span className=\"text-2xl font-semibold leading-none tabular-nums text-foreground\">\n {price.monthly}\n <span className=\"ml-0.5 text-sm font-medium text-muted-foreground\">\n {l.perMonth}\n </span>\n </span>\n </div>\n </div>\n )\n )}\n <ul className=\"mt-4 space-y-1 border-t border-border pt-4 text-sm text-foreground\">\n {features.map((feature) => (\n <li key={feature}>{feature}</li>\n ))}\n </ul>\n </button>\n )\n}\n\n/** Responsive grid of {@link PlanCard}s: one column on phones, stepping up with width. */\nexport function PlanCardGrid({\n plans,\n onSelect,\n labels,\n}: {\n plans: PlanCardView[]\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}) {\n return (\n <div className=\"space-y-2\" data-slot=\"plan-card-grid\">\n <div\n className={cn(\n 'grid gap-2',\n plans.length === 4\n ? 'grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-4'\n : 'grid-cols-1 @xl:grid-cols-3'\n )}\n >\n {plans.map((plan) => (\n <PlanCard key={plan.id} plan={plan} onSelect={onSelect} labels={labels} />\n ))}\n </div>\n </div>\n )\n}\n\nexport interface PlanTierOptionView {\n id: number\n name: string\n isCurrent: boolean\n isSelected: boolean\n /** Formatted total with its interval, split so the suffix can be muted. */\n total?: string\n intervalLabel?: string\n /** Entitlement summary line. */\n summary: string\n}\n\n/** Compact row to move an existing subscription between tiers. */\nexport function PlanTierOption({\n option,\n onSelect,\n labels,\n}: {\n option: PlanTierOptionView\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(option.id)}\n aria-pressed={option.isSelected}\n data-slot=\"plan-tier-option\"\n data-testid={`tier-option-${option.id}`}\n className={cn(\n 'flex w-full items-center justify-between rounded-lg p-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n option.isSelected ? 'bg-accent ring-1 ring-primary/50' : 'bg-muted hover:bg-muted/70'\n )}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">{option.name}</span>\n {option.isCurrent && (\n <span className=\"rounded-full bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\">\n {l.current}\n </span>\n )}\n {option.isSelected && <Check className=\"h-4 w-4 text-primary\" />}\n </div>\n <div className=\"text-right\">\n {option.total && (\n <div className=\"font-semibold tabular-nums\">\n {option.total}\n <span className=\"text-xs font-normal text-muted-foreground\">\n {option.intervalLabel}\n </span>\n </div>\n )}\n <div className=\"text-xs tabular-nums text-muted-foreground\">{option.summary}</div>\n </div>\n </button>\n )\n}\n\n/** Monthly / Annual switch with an optional \"Save N%\" pill. */\nexport function PricingToggle({\n isAnnual,\n onToggle,\n savingsPercent,\n labels,\n}: {\n isAnnual: boolean\n onToggle: () => void\n savingsPercent?: number | null\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex items-center gap-2 text-sm\">\n <span className={isAnnual ? 'text-muted-foreground' : 'font-medium'}>{l.monthly}</span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isAnnual}\n aria-label={l.annualBilling}\n onClick={onToggle}\n className={cn(\n 'relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isAnnual ? 'bg-primary' : 'bg-muted'\n )}\n >\n <span\n className={cn(\n 'inline-block h-3 w-3 transform rounded-full bg-card transition-transform',\n isAnnual ? 'translate-x-5' : 'translate-x-1'\n )}\n />\n </button>\n <span className={isAnnual ? 'font-medium' : 'text-muted-foreground'}>{l.annual}</span>\n {savingsPercent != null && savingsPercent > 0 && (\n <span className=\"rounded-full bg-green-bg px-1.5 py-0.5 text-sm font-semibold leading-none text-green-text\">\n {l.save(savingsPercent)}\n </span>\n )}\n </div>\n )\n}\n\n/** Collapsed \"Have a promo code?\" link that expands into an input. */\nexport function PromoCodeInput({\n value,\n onChange,\n labels,\n}: {\n value: string\n onChange: (value: string) => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n const [expanded, setExpanded] = useState(false)\n\n if (!expanded) {\n return (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground pointer-coarse:min-h-11\"\n >\n <Tag className=\"h-3 w-3\" />\n <span>{l.havePromoCode}</span>\n </button>\n )\n }\n\n return (\n <div className=\"space-y-1\">\n <Label className=\"text-sm text-muted-foreground\">{l.promoCode}</Label>\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.enterCode}\n className=\"h-8 text-sm\"\n autoFocus\n />\n </div>\n )\n}\n\n/** \"Pricing Explainer\" popover. `onOpenModelList` opens the AI model list. */\nexport function PlanInfoPopover({\n onOpenModelList,\n labels,\n}: {\n onOpenModelList: () => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"gap-1.5 text-sm\">\n <Info className=\"h-4 w-4\" />\n {l.pricingExplainer}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-screen-safe w-[420px] space-y-3 text-sm leading-relaxed\"\n >\n <div className=\"text-base font-semibold\">{l.pricingExplainer}</div>\n\n <p>{l.explainerTiers}</p>\n\n <p>\n {l.explainerCredits}{' '}\n <button\n type=\"button\"\n onClick={onOpenModelList}\n className=\"font-medium text-foreground underline underline-offset-2 hover:text-primary/80\"\n >\n {l.seeModelList}\n </button>\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useMemo } from 'react'\nimport { Gift } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the referral-credit parts. `amount` is the formatted reward. */\nexport interface ReferralCreditLabels {\n badgeTitle: string\n badge: (amount: string) => string\n subtotal: string\n reward: string\n youPayNow: string\n rollover: (amount: string) => string\n applied: (amount: string) => string\n note: (amount: string) => string\n}\n\nexport const DEFAULT_REFERRAL_CREDIT_LABELS: ReferralCreditLabels = {\n badgeTitle: 'Reward — automatically applied to your invoice period',\n badge: (amount) => `${amount} reward`,\n subtotal: 'Subtotal',\n reward: 'Reward',\n youPayNow: 'You pay now',\n rollover: (amount) => `${amount} reward rolls over to your next invoice.`,\n applied: (amount) => `${amount} reward applied automatically to your invoice period.`,\n note: (amount) => `Your ${amount} reward applies to your invoice period.`,\n}\n\n/** Standing pill: the user's available referral reward. */\nexport function ReferralCreditBadge({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralCreditLabels>\n /** Default `referral-credit-badge` / `referral-credit-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <span\n className=\"flex h-8 items-center gap-1.5 rounded-full bg-green-bg px-2.5 text-sm font-medium text-green-text\"\n title={l.badgeTitle}\n data-testid={testIdOr(testId, { testId: 'referral-credit-badge' })}\n >\n <Gift className=\"h-3.5 w-3.5\" />\n {l.badge(amountLabel)}\n </span>\n )\n}\n\nexport interface ReferralCreditBreakdown {\n subtotal: string\n reward: string\n youPay: string\n /** Set when part of the reward rolls over to the next invoice. */\n rollover?: string\n}\n\nexport interface ReferralCreditSummaryProps {\n /** The reward amount, formatted. */\n amountLabel: string\n /** When the exact charge is known; otherwise a one-line note is shown. */\n breakdown?: ReferralCreditBreakdown\n labels?: Partial<ReferralCreditLabels>\n /** Root test id (default `referral-credit-summary`). */\n testId?: string\n /** Breakdown rows; defaults are the current ids. */\n testIds?: Partial<Record<'applied' | 'youPay', string>>\n}\n\n/** Reward applied to a purchase: subtotal / reward / you pay now, or a one-line note. */\nexport function ReferralCreditSummary({\n amountLabel,\n breakdown,\n labels,\n testId,\n testIds,\n}: ReferralCreditSummaryProps) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <div\n className=\"rounded-lg bg-green-bg/60 p-3 text-sm\"\n data-testid={testIdOr(testId, { testId: 'referral-credit-summary' })}\n >\n {breakdown ? (\n <dl className=\"space-y-1 tabular-nums\">\n <div className=\"flex items-center justify-between text-muted-foreground\">\n <dt>{l.subtotal}</dt>\n <dd>{breakdown.subtotal}</dd>\n </div>\n <div className=\"flex items-center justify-between text-green-text\">\n <dt className=\"flex items-center gap-1.5\">\n <Gift className=\"h-3.5 w-3.5\" />\n {l.reward}\n </dt>\n <dd data-testid={testIdOr(testIds?.applied, { testId: 'referral-credit-applied' })}>\n −{breakdown.reward}\n </dd>\n </div>\n <div className=\"flex items-center justify-between border-t border-green-border pt-1 font-semibold text-foreground\">\n <dt>{l.youPayNow}</dt>\n <dd data-testid={testIdOr(testIds?.youPay, { testId: 'referral-credit-you-pay' })}>\n {breakdown.youPay}\n </dd>\n </div>\n {breakdown.rollover && (\n <p className=\"pt-0.5 text-xs font-normal text-muted-foreground\">\n {l.rollover(breakdown.rollover)}\n </p>\n )}\n </dl>\n ) : (\n <p className=\"flex items-center gap-1.5 font-medium text-green-text\">\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.applied(amountLabel)}\n </p>\n )}\n </div>\n )\n}\n\n/** One-line note for charges whose exact amount is a proration computed server-side. */\nexport function ReferralCreditNote({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralCreditLabels>\n /** Default `referral-credit-badge` / `referral-credit-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <p\n className=\"flex items-center gap-1.5 text-sm text-green-text\"\n data-testid={testIdOr(testId, { testId: 'referral-credit-note' })}\n >\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.note(amountLabel)}\n </p>\n )\n}\n","import { useMemo } from 'react'\nimport {\n AlertCircle,\n CheckCircle2,\n ExternalLink,\n Loader2,\n Plug,\n PlugIcon,\n ShieldCheck,\n} from 'lucide-react'\nimport { Badge, Button } from '@arbidocs/react/ui'\nimport { ToneBadge } from '../components/ToneBadge'\n\n/**\n * - `available`: not connected, the user can connect.\n * - `connected`: connected.\n * - `host`: provided by the host account, no personal login.\n */\nexport type ConnectionCardStatus = 'available' | 'connected' | 'organisation'\n\n/** Every fixed string of a connection card. */\nexport interface ConnectionCardLabels {\n connectedAs: (identity: string) => string\n justConnected: string\n connected: string\n disconnect: string\n connect: string\n organisationAccount: string\n readOnlyLead: string\n readOnlyBody: string\n}\n\nexport const DEFAULT_CONNECTION_CARD_LABELS: ConnectionCardLabels = {\n connectedAs: (identity) => `Connected as ${identity}`,\n justConnected: 'Just connected ✓',\n connected: 'Connected',\n disconnect: 'Disconnect',\n connect: 'Connect',\n organisationAccount: 'Organisation account',\n readOnlyLead: 'Read-only.',\n readOnlyBody:\n ' ARBI only imports a copy of your email and files. It can’t modify or delete anything in your account, and deleting an imported document here never affects the original.',\n}\n\nexport interface ConnectionCardView {\n /** Stable key (vendor key); drives the test ids. */\n id: string\n title: string\n description?: string\n iconUrl?: string | null\n iconAlt?: string\n status: ConnectionCardStatus\n /** Right after the OAuth return: shows \"Just connected\" until the list catches up. */\n justConnected?: boolean\n /** \"Connected as {identity}\". */\n identity?: string | null\n /** Amber warning line, e.g. a stale token scheme. */\n warning?: string\n /** Muted note line, e.g. \"Enabled for your organisation\". */\n note?: string\n /** Show the read-only reassurance (mailbox / file connectors). */\n showReadOnlyNotice?: boolean\n isDisconnecting?: boolean\n}\n\nexport interface ConnectionCardProps {\n connection: ConnectionCardView\n onConnect: (id: string) => void\n onDisconnect: (id: string) => void\n labels?: Partial<ConnectionCardLabels>\n}\n\n/** One external app: icon, name, description, status and a Connect / Disconnect action. */\nexport function ConnectionCard({\n connection,\n onConnect,\n onDisconnect,\n labels,\n}: ConnectionCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONNECTION_CARD_LABELS, ...labels }), [labels])\n const { id, status } = connection\n const isConnected = status === 'connected'\n\n return (\n <div\n data-slot=\"connection-card\"\n className=\"rounded-lg bg-background px-5 py-4\"\n data-testid={`connector-card-${id}`}\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n {connection.iconUrl ? (\n <img\n src={connection.iconUrl}\n alt={connection.iconAlt ?? connection.title}\n className=\"h-6 w-6 rounded object-contain\"\n />\n ) : (\n <PlugIcon className=\"h-5 w-5\" />\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <span className=\"font-heading text-sm font-semibold text-foreground\">\n {connection.title}\n </span>\n {connection.description && (\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{connection.description}</p>\n )}\n {isConnected && connection.identity && (\n <p\n className=\"mt-1 text-xs text-muted-foreground\"\n data-testid={`connector-identity-${id}`}\n >\n {l.connectedAs(connection.identity)}\n </p>\n )}\n {connection.warning && (\n <p className=\"mt-1 text-xs text-yellow-text\">{connection.warning}</p>\n )}\n {connection.note && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{connection.note}</p>\n )}\n </div>\n\n {/* Status stacked above the action */}\n <div className=\"flex shrink-0 flex-col items-end gap-2\">\n {(isConnected || connection.justConnected) && (\n <ToneBadge\n tone=\"success\"\n icon={<CheckCircle2 className=\"h-3 w-3\" aria-hidden=\"true\" />}\n >\n {connection.justConnected ? l.justConnected : l.connected}\n </ToneBadge>\n )}\n {isConnected ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDisconnect(id)}\n disabled={connection.isDisconnecting}\n className=\"text-destructive hover:bg-destructive/10 hover:text-destructive\"\n data-testid={`connector-disconnect-${id}`}\n >\n {connection.isDisconnecting && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n {l.disconnect}\n </Button>\n ) : status === 'available' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onConnect(id)}\n className=\"gap-1.5\"\n data-testid={`connector-connect-${id}`}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {l.connect}\n </Button>\n ) : (\n <Badge variant=\"outline\" className=\"text-muted-foreground\">\n {l.organisationAccount}\n </Badge>\n )}\n </div>\n </div>\n\n {connection.showReadOnlyNotice && isConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-md bg-blue-bg px-3 py-2 text-xs text-blue-text\">\n <ShieldCheck className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <span>\n <span className=\"font-medium\">{l.readOnlyLead}</span>\n {l.readOnlyBody}\n </span>\n </div>\n )}\n </div>\n )\n}\n\n/** Centred \"nothing here yet\" placeholder inside a settings card. */\nexport function ConnectionsEmpty({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <Plug className=\"h-8 w-8 text-muted-foreground/40\" />\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n )\n}\n\n/** Inline loading line. */\nexport function ConnectionsLoading({ message }: { message: string }) {\n return (\n <div className=\"flex items-center gap-2 py-12 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm\">{message}</span>\n </div>\n )\n}\n\n/** Inline destructive error line. */\nexport function ConnectionsError({ message }: { message: string }) {\n return (\n <div className=\"flex items-center gap-2 rounded-lg bg-destructive/10 px-4 py-3 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span>{message}</span>\n </div>\n )\n}\n","import { useMemo, type KeyboardEvent, type ReactNode, useId } from 'react'\nimport { Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the project list states. */\nexport interface ProjectListLabels {\n loading: string\n empty: string\n filteredOut: string\n}\n\nexport const DEFAULT_PROJECT_LIST_LABELS: ProjectListLabels = {\n loading: 'Loading projects...',\n empty: 'No projects yet. Create one to get started.',\n filteredOut: 'No projects match the filter.',\n}\n\n/** Every fixed string of the shared-projects section. `title` prop wins. */\nexport interface SharedProjectsSectionLabels {\n title: string\n}\n\nexport const DEFAULT_SHARED_PROJECTS_SECTION_LABELS: SharedProjectsSectionLabels = {\n title: 'Shared with you',\n}\n\n/** Every fixed string of the project detail header. */\nexport interface ProjectDetailHeaderLabels {\n renameProject: string\n}\n\nexport const DEFAULT_PROJECT_DETAIL_HEADER_LABELS: ProjectDetailHeaderLabels = {\n renameProject: 'Rename project',\n}\n\n/** Every fixed string of the rename dialog. `title` prop wins. */\nexport interface RenameDialogLabels {\n title: string\n description: string\n cancel: string\n save: string\n}\n\nexport const DEFAULT_RENAME_DIALOG_LABELS: RenameDialogLabels = {\n title: 'Rename project',\n description: 'Enter a new name.',\n cancel: 'Cancel',\n save: 'Save',\n}\n\nexport interface ProjectRowProps {\n testId?: string\n /** Opens the project (click, Enter or Space on the row). */\n onOpen: () => void\n /** Name + relation mark. */\n identity: ReactNode\n /** Plan badge beside the name; shown from the `md` breakpoint up. */\n summary?: ReactNode\n /** Full-width usage readout under the line (a `QuotaMeter size=\"lg\"`). */\n usage?: ReactNode\n /** Row actions (upgrade, invoices). */\n actions?: ReactNode\n}\n\n/** One project in the list: a single clickable line; its actions are always visible. */\nexport function ProjectRow({ testId, onOpen, identity, summary, usage, actions }: ProjectRowProps) {\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onOpen()\n }\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={handleKeyDown}\n data-slot=\"project-row\"\n data-testid={testId}\n className=\"group flex cursor-pointer flex-wrap items-center gap-x-3 gap-y-3 px-3 py-3 transition-colors hover:bg-muted/50 focus:bg-muted/50 focus:outline-none pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center\">{identity}</div>\n <div className=\"flex-1\" />\n {summary && <div className=\"hidden items-center gap-3 md:flex\">{summary}</div>}\n {actions && (\n <div className=\"flex items-center gap-0.5\" onClick={(e) => e.stopPropagation()}>\n {actions}\n </div>\n )}\n {usage && <div className=\"basis-full\">{usage}</div>}\n </div>\n )\n}\n\nexport interface ProjectListProps {\n isLoading: boolean\n /** The user owns no projects at all. */\n isEmpty: boolean\n /** Projects exist but none pass the active filter. */\n isFilteredOut: boolean\n children: ReactNode\n testId?: string\n labels?: Partial<ProjectListLabels>\n}\n\n/** The list of projects with its loading / empty / no-match states. */\nexport function ProjectList({\n isLoading,\n isEmpty,\n isFilteredOut,\n children,\n testId = 'projects-list',\n labels,\n}: ProjectListProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_LIST_LABELS, ...labels }), [labels])\n const message = isLoading ? l.loading : isEmpty ? l.empty : isFilteredOut ? l.filteredOut : null\n return (\n <div data-testid={testId}>\n {isLoading ? (\n <div className=\"space-y-3 px-3 py-4\" aria-busy=\"true\">\n <span className=\"sr-only\">{message}</span>\n {[0, 1].map((i) => (\n <div key={i} className=\"flex items-center gap-3\" aria-hidden=\"true\">\n <div className=\"h-5 w-40 animate-pulse rounded-md bg-muted\" />\n <div className=\"flex-1\" />\n <div className=\"h-5 w-48 animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </div>\n ) : message ? (\n <p className=\"px-3 py-6 text-sm text-muted-foreground\">{message}</p>\n ) : (\n <div className=\"divide-y divide-border\">{children}</div>\n )}\n </div>\n )\n}\n\nexport interface SharedProjectsSectionProps {\n title?: string\n footnote?: string\n children: ReactNode\n testId?: string\n labels?: Partial<SharedProjectsSectionLabels>\n}\n\n/** \"Shared with you\": projects other people run, with the caller's own allowance in each. */\nexport function SharedProjectsSection({\n title,\n footnote,\n children,\n testId = 'shared-projects',\n labels,\n}: SharedProjectsSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_SHARED_PROJECTS_SECTION_LABELS, ...labels }), [labels])\n return (\n <section className=\"space-y-2\" data-testid={testId}>\n <h3 className=\"px-1 text-sm font-semibold text-foreground\">{title ?? l.title}</h3>\n <div className=\"divide-y divide-border\">{children}</div>\n {footnote && <p className=\"px-1 text-xs text-muted-foreground\">{footnote}</p>}\n </section>\n )\n}\n\n/** One shared project: identity on the left, the caller's allowance on the right. */\nexport function SharedProjectRow({\n testId,\n identity,\n allowance,\n}: {\n testId?: string\n identity: ReactNode\n allowance: ReactNode\n}) {\n return (\n <div className=\"flex items-center gap-4 px-3 py-2.5\" data-testid={testId}>\n {identity}\n <div className=\"ml-auto w-44\">{allowance}</div>\n </div>\n )\n}\n\nexport interface ProjectDetailHeaderProps {\n /** Large entity icon. */\n icon: ReactNode\n name: string\n /** Plan badge beside the name. */\n badge?: ReactNode\n onRename: () => void\n /** The primary action on the right (e.g. \"Update Plan\"). */\n action?: ReactNode\n labels?: Partial<ProjectDetailHeaderLabels>\n}\n\n/** Header of an opened project: icon, name with a rename pencil, plan badge, primary action. */\nexport function ProjectDetailHeader({\n icon,\n name,\n badge,\n onRename,\n action,\n labels,\n}: ProjectDetailHeaderProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_DETAIL_HEADER_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"flex-shrink-0 text-primary [&>svg]:h-8 [&>svg]:w-8\">{icon}</span>\n <div className=\"min-w-0\">\n <div className=\"group flex items-center gap-2\">\n <h2 className=\"truncate text-xl font-semibold text-foreground\" title={name}>\n {name}\n </h2>\n {/* Revealed on hover of the name, but permanently visible where hovering is impossible. */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 shrink-0 text-muted-foreground opacity-0 transition-opacity hover:text-primary focus-visible:opacity-100 [.group:hover_&]:opacity-100 [@media(hover:none)]:opacity-100\"\n title={l.renameProject}\n aria-label={l.renameProject}\n data-testid=\"project-detail-rename\"\n onClick={onRename}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n {badge}\n </div>\n </div>\n </div>\n {action && <div className=\"flex-shrink-0\">{action}</div>}\n </div>\n )\n}\n\n/** Tonal tile with a heading inside a project's detail. */\nexport function ProjectDetailSection({\n title,\n className,\n children,\n}: {\n title: string\n className?: string\n children: ReactNode\n}) {\n return (\n <section className={cn('rounded-lg bg-muted p-5', className)}>\n <h3 className=\"mb-4 text-base font-semibold text-foreground\">{title}</h3>\n {children}\n </section>\n )\n}\n\nexport interface RenameDialogProps {\n open: boolean\n onClose: () => void\n title?: string\n value: string\n onChange: (value: string) => void\n onSave: () => void\n isSaving?: boolean\n /** Test id of the name input. */\n testId?: string\n /** Test id of the dialog itself. */\n dialogTestId?: string\n /** Caption above the input (omitted: the input stands alone). */\n fieldLabel?: string\n placeholder?: string\n /** Save is disabled while false (e.g. an empty name). Defaults to true. */\n canSave?: boolean\n labels?: Partial<RenameDialogLabels>\n}\n\n/** Single-field rename: Enter saves, Escape cancels. */\nexport function RenameDialog({\n open,\n onClose,\n title,\n value,\n onChange,\n onSave,\n isSaving,\n testId,\n dialogTestId,\n fieldLabel,\n placeholder,\n canSave = true,\n labels,\n}: RenameDialogProps) {\n const renameInputId = useId()\n const l = useMemo(() => ({ ...DEFAULT_RENAME_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent presentation=\"sheet\" data-testid={dialogTestId}>\n <DialogHeader>\n <DialogTitle>{title ?? l.title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n {fieldLabel && (\n <label htmlFor={renameInputId} className=\"block text-sm font-medium\">\n {fieldLabel}\n </label>\n )}\n <Input\n id={renameInputId}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n if (e.key === 'Escape') onClose()\n }}\n data-testid={testId}\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n {l.cancel}\n </Button>\n <Button onClick={onSave} disabled={isSaving || !canSave}>\n {l.save}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { BookOpen, MessageCircleQuestionMark } from 'lucide-react'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\n\nexport type SupportTab = 'feedback' | 'guide'\n\n/** Every fixed string of the support panel (tab names and their tooltips). */\nexport interface SupportPanelLabels {\n support: string\n userGuide: string\n}\n\nexport const DEFAULT_SUPPORT_PANEL_LABELS: SupportPanelLabels = {\n support: 'Support',\n userGuide: 'User Guide',\n}\n\nexport interface SupportPanelProps {\n activeTab: SupportTab\n onTabChange: (tab: SupportTab) => void\n /** Pinned build / version lines (right of the tabs), e.g. `frontend · date · hash`. */\n buildInfo?: string[]\n /** The mode switcher + close button, placed after the build info. */\n modeSwitcher?: ReactNode\n /** Support form (e.g. an embedded survey) or its \"not configured\" notice. */\n feedback: ReactNode\n /** Shown over the form while it loads. */\n isFeedbackLoading?: boolean\n loadingIndicator?: ReactNode\n /** The rendered user guide. */\n guide: ReactNode\n testId?: string\n labels?: Partial<SupportPanelLabels>\n}\n\n/** Support panel: a \"Support\" form tab and a \"User Guide\" tab, with build info in the header. */\nexport function SupportPanel({\n activeTab,\n onTabChange,\n buildInfo = [],\n modeSwitcher,\n feedback,\n isFeedbackLoading,\n loadingIndicator,\n guide,\n testId = 'feedback-modal',\n labels,\n}: SupportPanelProps) {\n const l = useMemo(() => ({ ...DEFAULT_SUPPORT_PANEL_LABELS, ...labels }), [labels])\n const tabs: Tab[] = useMemo(\n () => [\n {\n id: 'feedback',\n label: l.support,\n icon: <MessageCircleQuestionMark className=\"h-4 w-4\" />,\n tooltip: l.support,\n },\n {\n id: 'guide',\n label: l.userGuide,\n icon: <BookOpen className=\"h-4 w-4\" />,\n tooltip: l.userGuide,\n },\n ],\n [l]\n )\n return (\n <div\n className=\"@container flex h-full flex-col bg-background\"\n data-testid={testId}\n data-slot=\"support-panel\"\n >\n <div className=\"flex-shrink-0\">\n <TabHeader\n tabs={tabs}\n activeTabId={activeTab}\n onTabChange={(id) => onTabChange(id as SupportTab)}\n rightContent={\n <div className=\"flex items-center gap-2\">\n {buildInfo.length > 0 && (\n <div className=\"hidden text-right font-mono text-xs leading-tight text-muted-foreground/70 @2xl:block\">\n {buildInfo.map((line) => (\n <div key={line}>{line}</div>\n ))}\n </div>\n )}\n {modeSwitcher}\n </div>\n }\n // Two short tabs fit the docked panel width, so keep their labels until it is tiny.\n compactBreakpoint={360}\n />\n </div>\n\n {activeTab === 'feedback' && (\n <div className=\"relative min-h-0 flex-1\">\n {isFeedbackLoading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-background\">\n {loadingIndicator}\n </div>\n )}\n {feedback}\n </div>\n )}\n\n {activeTab === 'guide' && <div className=\"min-h-0 flex-1 overflow-auto p-4\">{guide}</div>}\n </div>\n )\n}\n\n/** Notice shown in place of the form when it is not configured. */\nexport function SupportUnavailable({ title, message }: { title: string; message: string }) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-center\">\n <div>\n <h3 className=\"mb-2 text-lg font-semibold\">{title}</h3>\n <p className=\"text-muted-foreground\">{message}</p>\n </div>\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Gift, Sparkles, UserPlus } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the welcome dialog. */\nexport interface WelcomeDialogLabels {\n /** Title: \"Welcome, Ada!\" (`firstName` is absent for anonymous). */\n welcome: (firstName?: string) => string\n description: string\n currentPlan: string\n seeUpgradeOptions: string\n /** Text before the bold referral offer. */\n referralBefore: string\n /** Text after the bold referral offer. */\n referralAfter: string\n inviteContact: string\n /** Text before the bold reward balance. */\n currentRewards: string\n continue: string\n}\n\nexport const DEFAULT_WELCOME_DIALOG_LABELS: WelcomeDialogLabels = {\n welcome: (firstName) => `Welcome${firstName ? `, ${firstName}` : ''}!`,\n description: 'Your plan, usage and rewards at a glance.',\n currentPlan: 'Current plan',\n seeUpgradeOptions: 'See upgrade options',\n referralBefore: 'Get ',\n referralAfter: ' for every invited contact who goes Pro.',\n inviteContact: 'Invite contact',\n currentRewards: 'Current rewards: ',\n continue: 'Continue',\n}\n\n/** Every fixed string of the invite-contacts dialog. */\nexport interface InviteContactsDialogLabels {\n title: string\n description: string\n}\n\nexport const DEFAULT_INVITE_CONTACTS_DIALOG_LABELS: InviteContactsDialogLabels = {\n title: 'Invite contacts',\n description: 'Invite contacts by email and earn the referral reward.',\n}\n\nexport interface WelcomeQuotaView {\n key: string\n icon?: LucideIcon\n label: string\n /** Formatted used-of-limit, e.g. \"40 / 500 MB\". */\n value: string\n pct: number\n /** Inline hint after the label, e.g. \"resets Aug 31, 2026\". */\n hint?: string\n}\n\nexport interface WelcomeDialogProps {\n open: boolean\n /** Closing the dialog (Continue is the single, deliberate exit; there is no close X). */\n onClose: () => void\n /** Greeting name; the title reads \"Welcome, {name}!\". */\n firstName?: string\n /** Show the gift icon (a reward balance exists) instead of the sparkles. */\n hasReward: boolean\n /**\n * Corner picker naming the project the numbers belong to (credits are per project). The host\n * supplies it, since the choice of control and its state are the host's.\n */\n projectPicker?: ReactNode\n /** Plan badge for the selected project. */\n planBadge: ReactNode\n quotas: WelcomeQuotaView[]\n onSeePlans: () => void\n /** The standing referral offer, e.g. \"£20 off your plan\". */\n referralOfferLabel: string\n onInvite: () => void\n /** Held reward balance, formatted. Hidden when absent. */\n rewardBalanceLabel?: string\n labels?: Partial<WelcomeDialogLabels>\n /** Dialog test id (default `welcome-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. `quota` is a prefix (`<prefix>-<quota key>`). */\n testIds?: Partial<Record<'copy' | 'quota' | 'showPlans' | 'earn' | 'dismiss', string>>\n}\n\n/**\n * The once-per-session snapshot for free users: where you stand (plan and quotas), the standing\n * referral offer, and any reward balance. Continue is the primary action; the upgrade and invite\n * doors are deliberately secondary.\n */\nexport function WelcomeDialog({\n open,\n onClose,\n firstName,\n hasReward,\n projectPicker,\n planBadge,\n quotas,\n onSeePlans,\n referralOfferLabel,\n onInvite,\n rewardBalanceLabel,\n labels,\n testId,\n testIds,\n}: WelcomeDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_WELCOME_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'welcome-modal' })}\n hideCloseButton\n >\n <DialogHeader>\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-2\">\n <DialogTitle className=\"flex items-center gap-2\">\n {hasReward ? (\n <Gift className=\"h-5 w-5 text-green-text\" />\n ) : (\n <Sparkles className=\"h-5 w-5 text-yellow-text\" />\n )}\n {l.welcome(firstName)}\n </DialogTitle>\n {projectPicker}\n </div>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n\n {/* Where you stand: plan + the quotas every usage surface shows. */}\n <ModalSection\n className=\"space-y-4\"\n data-testid={testIdOr(testIds?.copy, { testId: 'welcome-modal-copy' })}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{l.currentPlan}</span>\n {planBadge}\n </div>\n <div className=\"space-y-3\">\n {quotas.map((quota) => (\n <UsageMeter\n key={quota.key}\n icon={quota.icon}\n label={quota.label}\n value={quota.value}\n pct={quota.pct}\n hint={quota.hint}\n testId={prefixedTestId(testIds?.quota, quota.key, {\n testId: `welcome-modal-quota-${quota.key}`,\n })}\n />\n ))}\n </div>\n {/* The upgrade door sits right under the numbers it answers. */}\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onSeePlans}\n data-testid={testIdOr(testIds?.showPlans, { testId: 'welcome-modal-show-plans' })}\n >\n {l.seeUpgradeOptions}\n </Button>\n </ModalSection>\n\n {/* Rewards: the standing way to earn, then what you already hold. */}\n <ModalSection className=\"space-y-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.referralBefore}\n <span className=\"font-semibold text-foreground\">{referralOfferLabel}</span>\n {l.referralAfter}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 gap-1.5\"\n onClick={onInvite}\n data-testid={testIdOr(testIds?.earn, { testId: 'welcome-modal-earn' })}\n >\n <UserPlus className=\"h-3.5 w-3.5\" />\n {l.inviteContact}\n </Button>\n </div>\n {rewardBalanceLabel && (\n // A statement, not a door: the balance applies itself to the next invoice.\n <div className=\"flex items-center gap-1.5 rounded-md bg-green-bg px-3 py-2 text-sm text-green-text\">\n <Gift className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">\n {l.currentRewards}\n <span className=\"font-semibold\">{rewardBalanceLabel}</span>\n </span>\n </div>\n )}\n </ModalSection>\n\n {/* Continue is the 99% path — the doors above are reminders, not the point. */}\n <DialogFooter>\n <Button\n className=\"w-full\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.dismiss, { testId: 'welcome-modal-dismiss' })}\n >\n {l.continue}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface InviteContactsDialogProps {\n open: boolean\n onClose: () => void\n /** The invite form (it carries the referral pitch itself). */\n children: ReactNode\n testId?: string\n labels?: Partial<InviteContactsDialogLabels>\n}\n\n/** Dialog around the invite form, swapped in for the welcome dialog when inviting. */\nexport function InviteContactsDialog({\n open,\n onClose,\n children,\n testId = 'welcome-modal-invite',\n labels,\n}: InviteContactsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_INVITE_CONTACTS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !next && onClose()}\n title={l.title}\n description={l.description}\n icon={<UserPlus className=\"h-5 w-5 text-primary\" />}\n size=\"lg\"\n className=\"sm:max-w-lg\"\n testId={testId}\n >\n <ModalSection>{children}</ModalSection>\n </ModalScaffold>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { BadgeCent, ChartNoAxesColumn, Loader2 } from 'lucide-react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Categorical series palette: Tailwind classes so dark mode and tokens stay in control. */\nconst SERIES_STYLES = [\n { bg: 'bg-blue-500', stroke: 'stroke-blue-500' },\n { bg: 'bg-purple-500', stroke: 'stroke-purple-500' },\n { bg: 'bg-emerald-500', stroke: 'stroke-emerald-500' },\n { bg: 'bg-amber-500', stroke: 'stroke-amber-500' },\n { bg: 'bg-rose-500', stroke: 'stroke-rose-500' },\n { bg: 'bg-cyan-500', stroke: 'stroke-cyan-500' },\n { bg: 'bg-indigo-500', stroke: 'stroke-indigo-500' },\n { bg: 'bg-orange-500', stroke: 'stroke-orange-500' },\n] as const\n\nconst styleAt = (index: number) => SERIES_STYLES[index % SERIES_STYLES.length]\n\n/** Every fixed string of the usage line chart. `emptyLabel` prop wins. */\nexport interface UsageLineChartLabels {\n noDailyData: string\n}\n\nexport const DEFAULT_USAGE_LINE_CHART_LABELS: UsageLineChartLabels = {\n noDailyData: 'No daily data',\n}\n\n/** Every fixed string of the proportion bar. */\nexport interface UsageProportionBarLabels {\n /** Bar tooltip when the metric is tokens: \"3k tokens\". */\n tokens: (formatted: string) => string\n /** Bar tooltip when the metric is credits: \"1,200 credits\". */\n credits: (formatted: string) => string\n /** Row suffix: \"3k tok\". */\n tokensShort: (formatted: string) => string\n}\n\nexport const DEFAULT_USAGE_PROPORTION_BAR_LABELS: UsageProportionBarLabels = {\n tokens: (formatted) => `${formatted} tokens`,\n credits: (formatted) => `${formatted} credits`,\n tokensShort: (formatted) => `${formatted} tok`,\n}\n\n/** Every fixed string of the usage panel. `emptyMessage` / `errorMessage` props win. */\nexport interface UsagePanelLabels {\n empty: string\n error: string\n}\n\nexport const DEFAULT_USAGE_PANEL_LABELS: UsagePanelLabels = {\n empty: 'No usage yet.',\n error: 'Failed to load usage data',\n}\n\nexport interface UsageSeries {\n key: string\n values: number[]\n}\n\nexport interface UsageLineChartProps {\n /** ISO dates (`YYYY-MM-DD`), one per point. */\n dates: string[]\n series: UsageSeries[]\n /** Formats an axis-label date, e.g. \"Jun 12\". */\n formatDate: (date: string) => string\n /** Formats a value in the hover readout. */\n formatValue: (value: number) => string\n emptyLabel?: string\n labels?: Partial<UsageLineChartLabels>\n}\n\nconst CHART_W = 440\nconst CHART_H = 120\nconst PAD = { top: 8, right: 8, bottom: 20, left: 40 }\n\n/** SVG line chart with a tap/hover readout (a tap selects a day, so touch works). */\nexport function UsageLineChart({\n dates,\n series,\n formatDate,\n formatValue,\n emptyLabel,\n labels,\n}: UsageLineChartProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_LINE_CHART_LABELS, ...labels }), [labels])\n const [hoverIdx, setHoverIdx] = useState<number | null>(null)\n\n if (!dates.length || !series.length) {\n return <p className=\"text-sm text-muted-foreground\">{emptyLabel ?? l.noDailyData}</p>\n }\n\n const maxVal = Math.max(...series.flatMap((s) => s.values), 1)\n const plotW = CHART_W - PAD.left - PAD.right\n const plotH = CHART_H - PAD.top - PAD.bottom\n const xStep = dates.length > 1 ? plotW / (dates.length - 1) : plotW\n const yScale = (v: number) => PAD.top + plotH - (v / maxVal) * plotH\n\n const yTicks = [0, maxVal / 2, maxVal].map((v) => ({\n v,\n y: yScale(v),\n label: v >= 1000 ? `${Math.round(v / 1000)}k` : Math.round(v).toString(),\n }))\n\n const labelCount = Math.min(dates.length, 5)\n const labelStep = Math.max(1, Math.floor((dates.length - 1) / (labelCount - 1)))\n\n return (\n <div className=\"relative\" data-slot=\"usage-line-chart\">\n <svg\n viewBox={`0 0 ${CHART_W} ${CHART_H}`}\n className=\"h-auto w-full\"\n preserveAspectRatio=\"xMidYMid meet\"\n onMouseLeave={() => setHoverIdx(null)}\n >\n {yTicks.map((t) => (\n <g key={t.v}>\n <line\n x1={PAD.left}\n x2={CHART_W - PAD.right}\n y1={t.y}\n y2={t.y}\n className=\"stroke-border\"\n strokeDasharray=\"2,2\"\n />\n <text\n x={PAD.left - 4}\n y={t.y + 3}\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-xs\"\n >\n {t.label}\n </text>\n </g>\n ))}\n\n {series.map((s, si) => (\n <polyline\n key={s.key}\n points={s.values.map((v, i) => `${PAD.left + i * xStep},${yScale(v)}`).join(' ')}\n fill=\"none\"\n className={styleAt(si).stroke}\n strokeWidth={1.5}\n strokeLinejoin=\"round\"\n />\n ))}\n\n {dates.map((date, i) => (\n <rect\n key={date}\n x={PAD.left + i * xStep - xStep / 2}\n y={PAD.top}\n width={xStep}\n height={plotH}\n fill=\"transparent\"\n onMouseEnter={() => setHoverIdx(i)}\n onClick={() => setHoverIdx(i)}\n />\n ))}\n\n {hoverIdx !== null && (\n <line\n x1={PAD.left + hoverIdx * xStep}\n x2={PAD.left + hoverIdx * xStep}\n y1={PAD.top}\n y2={PAD.top + plotH}\n className=\"stroke-muted-foreground\"\n strokeDasharray=\"3,3\"\n />\n )}\n\n {dates.map((d, i) => {\n const isLast = i === dates.length - 1\n // Periodic ticks, dropping the one that would crowd the final label; edge labels anchor\n // inward so they never clip at the viewBox borders.\n if (!isLast && (i % labelStep !== 0 || dates.length - 1 - i < labelStep / 2)) return null\n return (\n <text\n key={d}\n x={PAD.left + i * xStep}\n y={CHART_H - 2}\n textAnchor={i === 0 ? 'start' : isLast ? 'end' : 'middle'}\n className=\"fill-muted-foreground text-xs\"\n >\n {formatDate(d)}\n </text>\n )\n })}\n </svg>\n\n {hoverIdx !== null && (\n <div className=\"pointer-events-none absolute right-0 top-0 rounded-md border bg-card/90 px-2 py-1 text-sm shadow-lg\">\n <div className=\"font-medium\">{dates[hoverIdx]}</div>\n {series.map((s, si) => (\n <div key={s.key} className=\"flex items-center gap-1\">\n <span className={cn('inline-block h-2 w-2 rounded-full', styleAt(si).bg)} />\n <span>{s.key}:</span>\n <span className=\"font-medium tabular-nums\">{formatValue(s.values[hoverIdx])}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Series legend; hidden for a single unnamed total. */\nexport function UsageLegend({ series }: { series: UsageSeries[] }) {\n if (series.length <= 1 && series[0]?.key === 'Total') return null\n return (\n <div className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {series.map((s, i) => (\n <div key={s.key} className=\"flex items-center gap-1 text-sm\">\n <span className={cn('inline-block h-2.5 w-2.5 rounded-full', styleAt(i).bg)} />\n <span className=\"text-muted-foreground\">{s.key}</span>\n </div>\n ))}\n </div>\n )\n}\n\nexport type UsageMetric = 'credits' | 'tokens'\n\nexport interface UsageShare {\n label: string\n /** Raw amount in the active metric, for the bar width. */\n amount: number\n /** Formatted credits, e.g. \"1,200\". */\n credits: string\n /** Formatted tokens, e.g. \"3k\". */\n tokens: string\n}\n\n/** Stacked proportion bar plus a per-item list with credits, tokens and share. */\nexport function UsageProportionBar({\n items,\n metric,\n labels,\n}: {\n items: UsageShare[]\n metric: UsageMetric\n labels?: Partial<UsageProportionBarLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_PROPORTION_BAR_LABELS, ...labels }), [labels])\n const total = items.reduce((sum, item) => sum + item.amount, 0)\n if (!items.length || total === 0) return null\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex h-3 w-full overflow-hidden rounded-full bg-muted\">\n {items.map((item, i) => {\n const pct = (item.amount / total) * 100\n if (pct < 0.5) return null\n return (\n <div\n key={item.label}\n className={cn('h-full first:rounded-l-full last:rounded-r-full', styleAt(i).bg)}\n style={{ width: `${pct}%` }}\n title={`${item.label}: ${metric === 'tokens' ? l.tokens(item.tokens) : l.credits(item.credits)}`}\n />\n )\n })}\n </div>\n <div className=\"space-y-1.5\">\n {items.map((item, i) => (\n <div key={item.label} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn('inline-block h-2.5 w-2.5 flex-shrink-0 rounded-full', styleAt(i).bg)}\n />\n <span className=\"truncate\">{item.label}</span>\n </div>\n <div className=\"ml-2 flex flex-shrink-0 items-center gap-2 tabular-nums\">\n <span\n className={cn(\n 'flex items-center gap-0.5',\n metric === 'credits'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {item.credits}\n <BadgeCent className=\"h-3 w-3 text-yellow-500\" />\n </span>\n <span\n className={\n metric === 'tokens'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n }\n >\n {l.tokensShort(item.tokens)}\n </span>\n <span className=\"w-8 text-right text-muted-foreground/40\">\n {((item.amount / total) * 100).toFixed(0)}%\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport interface UsageStat {\n key: string\n value: ReactNode\n label: ReactNode\n}\n\n/** Row of summary tiles (credits, requests, tokens). */\nexport function UsageSummary({ stats }: { stats: UsageStat[] }) {\n return (\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n {stats.map((stat) => (\n <div key={stat.key} className=\"rounded-lg bg-muted p-3\">\n <div className=\"flex items-center justify-center gap-1 text-base font-semibold tabular-nums\">\n {stat.value}\n </div>\n <div className=\"text-sm text-muted-foreground\">{stat.label}</div>\n </div>\n ))}\n </div>\n )\n}\n\n/** Credit coin glyph used beside credit amounts. */\nexport function CreditsGlyph({ className }: { className?: string }) {\n return <BadgeCent className={cn('h-4 w-4 text-yellow-500', className)} />\n}\n\nexport interface UsageToggleProps<T extends string> {\n value: T\n onChange: (value: T) => void\n options: { value: T; label: string }[]\n ariaLabel: string\n /** `fill`: options share the row (breakdown); `compact`: small pill (period, metric). */\n size?: 'compact' | 'fill'\n}\n\n/** Small single-choice toggle for the usage panel (hidden when printing). */\nexport function UsageToggle<T extends string>({\n value,\n onChange,\n options,\n ariaLabel,\n size = 'compact',\n}: UsageToggleProps<T>) {\n return (\n <RadioGroupPrimitive.Root\n aria-label={ariaLabel}\n value={value}\n onValueChange={(next) => onChange(next as T)}\n orientation=\"horizontal\"\n className=\"flex gap-1 rounded-md border border-border bg-background p-0.5 print:hidden\"\n >\n {options.map((option) => (\n <RadioGroupPrimitive.Item\n key={option.value}\n value={option.value}\n className={cn(\n 'rounded-md px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:py-2.5',\n size === 'fill' && 'flex-1 px-2 py-1.5',\n option.value === value\n ? 'bg-accent font-medium text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {option.label}\n </RadioGroupPrimitive.Item>\n ))}\n </RadioGroupPrimitive.Root>\n )\n}\n\nexport interface UsagePanelProps {\n state: 'loading' | 'error' | 'empty' | 'ready'\n /** Period toggle on the left of the top row. */\n period: ReactNode\n /** Icon buttons on the right of the top row (download, print). */\n actions?: ReactNode\n /** The period's date span, shown under the top row. */\n dateRange?: string | null\n /** Shown for `empty`, e.g. \"No usage yet this month.\" */\n emptyMessage?: string\n errorMessage?: string\n labels?: Partial<UsagePanelLabels>\n /** Rendered for `ready`. */\n children?: ReactNode\n}\n\n/** Frame of the usage breakdown: toolbar row, then loading / error / empty / content. */\nexport function UsagePanel({\n state,\n period,\n actions,\n dateRange,\n emptyMessage,\n errorMessage,\n labels,\n children,\n}: UsagePanelProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_PANEL_LABELS, ...labels }), [labels])\n return (\n <div className=\"space-y-4\" data-slot=\"usage-panel\">\n <div className=\"flex items-center justify-between gap-2\">\n {period}\n <div className=\"flex items-center gap-1\">{actions}</div>\n </div>\n {dateRange && <p className=\"text-xs text-muted-foreground\">{dateRange}</p>}\n\n {state === 'loading' && (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n {state === 'error' && (\n <p className=\"py-4 text-sm text-destructive\">{errorMessage ?? l.error}</p>\n )}\n {state === 'empty' && (\n <div className=\"flex flex-col items-center justify-center gap-2 py-10 text-center\">\n <ChartNoAxesColumn className=\"h-8 w-8 text-muted-foreground/40\" />\n <p className=\"text-sm text-muted-foreground\">{emptyMessage ?? l.empty}</p>\n </div>\n )}\n {state === 'ready' && <div className=\"space-y-4\">{children}</div>}\n </div>\n )\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport { Check, ChevronDown, ChevronRight, FileText, Loader2, X } from 'lucide-react'\nimport {\n Badge,\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the receipts dialog. */\nexport interface InvoicesDialogLabels {\n title: (projectName: string) => string\n description: (projectName: string) => string\n noReceipts: string\n paid: string\n}\n\nexport const DEFAULT_INVOICES_DIALOG_LABELS: InvoicesDialogLabels = {\n title: (projectName) => `Receipts — ${projectName}`,\n description: (projectName) => `List of receipts for project ${projectName}`,\n noReceipts: 'No receipts yet.',\n paid: 'paid',\n}\n\n/** Every fixed string of the daily-cap field. */\nexport interface DailyCapFieldLabels {\n noLimit: string\n ariaLabel: string\n unit: string\n save: string\n}\n\nexport const DEFAULT_DAILY_CAP_FIELD_LABELS: DailyCapFieldLabels = {\n noLimit: 'No limit',\n ariaLabel: 'Daily credit limit per collaborator',\n unit: 'credits / user / day',\n save: 'Save',\n}\n\n/** Every fixed string of the member project row. */\nexport interface MemberProjectRowLabels {\n noDailyLimit: string\n}\n\nexport const DEFAULT_MEMBER_PROJECT_ROW_LABELS: MemberProjectRowLabels = {\n noDailyLimit: 'No daily limit',\n}\n\n/** Every fixed string of the inline name editor. */\nexport interface InlineNameEditorLabels {\n saveName: string\n cancelRename: string\n}\n\nexport const DEFAULT_INLINE_NAME_EDITOR_LABELS: InlineNameEditorLabels = {\n saveName: 'Save name',\n cancelRename: 'Cancel rename',\n}\n\n/** Every fixed string of the project card. */\nexport interface ProjectCardViewLabels {\n collapseProject: string\n expandProject: string\n}\n\nexport const DEFAULT_PROJECT_CARD_VIEW_LABELS: ProjectCardViewLabels = {\n collapseProject: 'Collapse project',\n expandProject: 'Expand project',\n}\n\nexport interface InvoiceRowView {\n key: string\n date: string\n /** Formatted amount, e.g. \"$50.00\". */\n amount: string\n status: string\n isPaid: boolean\n /** Receipt (paid) or invoice (unpaid) link; omitted when none exists. */\n href?: string\n linkLabel?: string\n}\n\nexport interface InvoicesDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n projectName: string\n isLoading: boolean\n invoices: InvoiceRowView[]\n labels?: Partial<InvoicesDialogLabels>\n}\n\n/** Receipts of a project: date, amount, status and a link to each. */\nexport function InvoicesDialog({\n open,\n onOpenChange,\n projectName,\n isLoading,\n invoices,\n labels,\n}: InvoicesDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_INVOICES_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent presentation=\"sheet\" className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>{l.title(projectName)}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description(projectName)}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-1\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n {!isLoading && invoices.length === 0 && (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noReceipts}</p>\n )}\n {!isLoading &&\n invoices.map((invoice) => (\n <div\n key={invoice.key}\n className=\"flex items-center justify-between border-b py-2 text-sm last:border-0\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"tabular-nums text-muted-foreground\">{invoice.date}</span>\n <span className=\"font-medium tabular-nums\">{invoice.amount}</span>\n <Badge\n variant=\"outline\"\n className={cn(\n 'h-4 px-1.5 py-0 text-sm',\n invoice.isPaid && 'border-green-border text-green-text'\n )}\n >\n {invoice.isPaid ? l.paid : invoice.status}\n </Badge>\n </div>\n {invoice.href && (\n <a\n href={invoice.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\"\n >\n {invoice.linkLabel} <FileText className=\"h-3 w-3\" />\n </a>\n )}\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DailyCapFieldProps {\n value: string\n onChange: (value: string) => void\n onSave: () => void\n canSave: boolean\n isSaving?: boolean\n labels?: Partial<DailyCapFieldLabels>\n}\n\n/** Per-collaborator daily credit cap input; Enter or Save commits, empty means no limit. */\nexport function DailyCapField({\n value,\n onChange,\n onSave,\n canSave,\n isSaving,\n labels,\n}: DailyCapFieldProps) {\n const l = useMemo(() => ({ ...DEFAULT_DAILY_CAP_FIELD_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <Input\n type=\"number\"\n min={0}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n }}\n placeholder={l.noLimit}\n className=\"h-9 w-40\"\n aria-label={l.ariaLabel}\n />\n <span className=\"text-sm text-muted-foreground\">{l.unit}</span>\n <Button size=\"sm\" className=\"h-9 px-4\" disabled={!canSave || isSaving} onClick={onSave}>\n {l.save}\n </Button>\n </div>\n )\n}\n\nexport interface MemberProjectRowProps {\n icon: ReactNode\n name: string\n /** Owner avatar. */\n owner?: ReactNode\n /** The caller's daily allowance in this project; `null` means no limit. */\n allowance: { text: string; pct: number } | null\n labels?: Partial<MemberProjectRowLabels>\n}\n\n/** Slim row for a project the user belongs to but does not own. */\nexport function MemberProjectRow({ icon, name, owner, allowance, labels }: MemberProjectRowProps) {\n const l = useMemo(() => ({ ...DEFAULT_MEMBER_PROJECT_ROW_LABELS, ...labels }), [labels])\n const barColor =\n allowance && allowance.pct >= 100\n ? 'bg-red-500'\n : allowance && allowance.pct >= 90\n ? 'bg-yellow-500'\n : 'bg-green-500'\n return (\n <div className=\"flex items-center gap-3 rounded-lg bg-muted p-3\">\n <span className=\"flex-shrink-0 text-muted-foreground\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{name}</span>\n {owner}\n </div>\n </div>\n {allowance === null ? (\n <span className=\"flex-shrink-0 text-sm text-muted-foreground\">{l.noDailyLimit}</span>\n ) : (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-0.5 text-sm tabular-nums\">\n <span className=\"text-muted-foreground\">{allowance.text}</span>\n <span className=\"h-1 w-24 overflow-hidden rounded-full bg-background\">\n <span\n className={cn('block h-full rounded-full', barColor)}\n style={{ width: `${allowance.pct}%` }}\n />\n </span>\n </div>\n )}\n </div>\n )\n}\n\nexport interface InlineNameEditorProps {\n value: string\n onChange: (value: string) => void\n onSave: () => void\n onCancel: () => void\n labels?: Partial<InlineNameEditorLabels>\n}\n\n/** In-row rename: input with confirm and cancel buttons (Enter saves, Escape cancels). */\nexport function InlineNameEditor({\n value,\n onChange,\n onSave,\n onCancel,\n labels,\n}: InlineNameEditorProps) {\n const l = useMemo(() => ({ ...DEFAULT_INLINE_NAME_EDITOR_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-1\">\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-7 text-sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n if (e.key === 'Escape') onCancel()\n }}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={l.saveName}\n onClick={onSave}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={l.cancelRename}\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n )\n}\n\nexport interface ProjectCardViewProps {\n expanded: boolean\n onToggleExpanded: () => void\n /** Ref to the header row (for scroll-into-view). */\n rowRef?: Ref<HTMLDivElement>\n /** Project icon, tinted by billing state. */\n icon: ReactNode\n /** Name + owner, or the inline editor. */\n identity: ReactNode\n /** Rename / delete buttons. */\n actions?: ReactNode\n /** Plan badge. */\n badge?: ReactNode\n /** Upgrade / change plan / invoices buttons. */\n buttons?: ReactNode\n /** Inline quota summary. */\n summary?: ReactNode\n /** Shown when expanded. */\n children?: ReactNode\n /** Dialogs owned by the card (rendered after the content). */\n overlays?: ReactNode\n labels?: Partial<ProjectCardViewLabels>\n}\n\n/** Collapsible project card: header row of slots, expandable detail underneath. */\nexport function ProjectCardView({\n expanded,\n onToggleExpanded,\n rowRef,\n icon,\n identity,\n actions,\n badge,\n buttons,\n summary,\n children,\n overlays,\n labels,\n}: ProjectCardViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_CARD_VIEW_LABELS, ...labels }), [labels])\n return (\n <div\n data-slot=\"project-card\"\n className={cn('rounded-lg bg-muted transition-colors', expanded && 'ring-1 ring-primary/40')}\n >\n <div\n ref={rowRef}\n className={cn(\n 'flex items-center gap-2 p-3 transition-colors',\n expanded ? 'bg-blue-bg/60' : 'hover:bg-muted/50'\n )}\n >\n {icon}\n {identity}\n {actions}\n {badge}\n {buttons}\n <div className=\"flex-1\" />\n {summary}\n <button\n type=\"button\"\n onClick={onToggleExpanded}\n aria-expanded={expanded}\n aria-label={expanded ? l.collapseProject : l.expandProject}\n className=\"flex-shrink-0 rounded p-1 hover:bg-muted pointer-coarse:p-3\"\n >\n {expanded ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n {expanded && <div className=\"space-y-4 border-t px-4 py-3\">{children}</div>}\n {overlays}\n </div>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { Check, Clock, Infinity as InfinityIcon, Mail, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the email-this-workspace dialog. */\nexport interface EmailWorkspaceDialogLabels {\n title: string\n description: string\n compose: string\n paHintBefore: string\n paHintAfter: string\n checking: string\n noAssistant: string\n authorizedExpires: (ttl: string) => string\n end: string\n authorizePrompt: (ttl?: string) => string\n authorize: string\n authorizing: string\n advanced: string\n alreadyGranted: string\n standingWarning: string\n grant: string\n granting: string\n}\n\nexport const DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS: EmailWorkspaceDialogLabels = {\n title: 'Email this workspace',\n description:\n 'Send documents and questions here from your registered email address — your Assistant reads the email and replies.',\n compose: 'Compose email',\n paHintBefore: 'Don’t need this specific workspace? Send general questions to ',\n paHintAfter: ' instead.',\n checking: 'Checking your Assistant’s access…',\n noAssistant:\n 'You don’t have a default Assistant yet — one is created automatically the first time you email a workspace.',\n authorizedExpires: (ttl) => `Authorized — expires in ${ttl}`,\n end: 'End',\n authorizePrompt: (ttl) =>\n `Authorize your Assistant to act in this workspace${ttl ? ` for ${ttl}` : ''}, so it’s ready as soon as it wakes.`,\n authorize: 'Authorize',\n authorizing: 'Authorizing…',\n advanced: 'Advanced',\n alreadyGranted: 'Your Assistant already has standing access to this workspace.',\n standingWarning:\n 'Standing access never expires and doesn’t need re-authorizing — only use it if you trust the Assistant’s environment long-term.',\n grant: 'Grant standing access',\n granting: 'Granting…',\n}\n\n/** Where the member's Assistant stands for this workspace. */\nexport type EmailAssistantAccess =\n | { kind: 'loading' }\n | { kind: 'none' }\n | { kind: 'session'; expiresIn: string; isEnding: boolean; onEnd: () => void }\n | { kind: 'idle'; defaultTtl?: string; isAuthorizing: boolean; onAuthorize: () => void }\n\nexport interface EmailWorkspaceDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Reply address of the workspace. */\n email: string\n mailtoHref: string\n /** Deployment domain shown in the general-questions hint. */\n paDomain: string\n /** Copy-to-clipboard control, rendered beside the address. */\n copyButton: ReactNode\n /** Members only: the Assistant authorize / standing-access panel. Omit for non-members. */\n access?: EmailAssistantAccess\n /** Standing access (Advanced tier). Only offered once an Assistant exists. */\n standing?: { alreadyGranted: boolean; isGranting: boolean; onGrant: () => void }\n labels?: Partial<EmailWorkspaceDialogLabels>\n}\n\n/** Presentation of the \"Email this workspace\" dialog: address, compose, Assistant access. */\nexport function EmailWorkspaceDialogView({\n open,\n onOpenChange,\n email,\n mailtoHref,\n paDomain,\n copyButton,\n access,\n standing,\n labels,\n}: EmailWorkspaceDialogViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS, ...labels }), [labels])\n const [advancedOpen, setAdvancedOpen] = useState(false)\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"email-workspace-dialog\">\n <DialogHeader className=\"-m-6 mb-4 bg-muted p-6 pb-4\">\n <div className=\"flex items-center gap-3\">\n <Mail className=\"size-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-3 py-2\">\n <code className=\"flex-1 truncate font-mono text-sm\" data-testid=\"email-workspace-address\">\n {email}\n </code>\n {copyButton}\n </div>\n\n <Button asChild data-testid=\"email-workspace-compose-button\">\n <a href={mailtoHref}>\n <Send className=\"mr-1.5 size-4\" />\n {l.compose}\n </a>\n </Button>\n\n <p className=\"text-xs text-muted-foreground\" data-testid=\"email-workspace-pa-hint\">\n {l.paHintBefore}\n <code className=\"font-mono\">pa@{paDomain}</code>\n {l.paHintAfter}\n </p>\n\n {access && (\n <div className=\"space-y-2 rounded-md border border-border bg-muted/30 p-3\">\n {access.kind === 'loading' ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"email-workspace-authorize-loading\"\n >\n {l.checking}\n </p>\n ) : access.kind === 'none' ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"email-workspace-no-assistant\"\n >\n {l.noAssistant}\n </p>\n ) : access.kind === 'session' ? (\n <div\n className=\"flex items-center justify-between gap-3\"\n data-testid=\"email-workspace-active-session\"\n >\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"size-3.5\" />\n {l.authorizedExpires(access.expiresIn)}\n </p>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={access.onEnd}\n disabled={access.isEnding}\n className=\"h-7 shrink-0 gap-1 px-2 text-xs text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid=\"email-workspace-end-session-button\"\n >\n <X className=\"size-3\" />\n {l.end}\n </Button>\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-xs text-muted-foreground\">\n {l.authorizePrompt(access.defaultTtl)}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={access.onAuthorize}\n disabled={access.isAuthorizing}\n className=\"shrink-0 gap-1.5\"\n data-testid=\"email-workspace-authorize-button\"\n >\n <Clock className=\"size-3.5\" />\n {access.isAuthorizing ? l.authorizing : l.authorize}\n </Button>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((o) => !o)}\n aria-expanded={advancedOpen}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid=\"email-workspace-advanced-toggle\"\n >\n {l.advanced}\n </button>\n {advancedOpen &&\n standing &&\n (standing.alreadyGranted ? (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Check className=\"size-3.5 text-green-solid\" />\n {l.alreadyGranted}\n </p>\n ) : (\n <>\n <p className=\"text-xs text-muted-foreground\">{l.standingWarning}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={standing.onGrant}\n disabled={standing.isGranting}\n className=\"gap-1.5\"\n data-testid=\"email-workspace-grant-access-button\"\n >\n <InfinityIcon className=\"size-3.5\" />\n {standing.isGranting ? l.granting : l.grant}\n </Button>\n </>\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ComponentProps, MouseEvent, ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ArrowRight } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Progress,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalSectionTitle } from './ModalScaffold'\n\n// ---------------------------------------------------------------------------\n// One-line notices and small layout slots shared by the plan flows\n// ---------------------------------------------------------------------------\n\n/** A single line of status text (loading, empty, error) inside a plan flow. */\nexport function PlanNotice({\n tone = 'muted',\n className,\n testId,\n children,\n}: {\n tone?: 'muted' | 'error'\n className?: string\n testId?: string\n children: ReactNode\n}) {\n return (\n <p\n data-slot=\"plan-notice\"\n data-testid={testId}\n className={cn(\n 'text-sm',\n tone === 'error' ? 'text-destructive' : 'text-muted-foreground',\n className\n )}\n >\n {children}\n </p>\n )\n}\n\n/** Vertical rhythm of a plan flow's sections. */\nexport function PlanStack({\n gap = 3,\n testId,\n className,\n children,\n}: {\n gap?: 2 | 3 | 4 | 5\n testId?: string\n className?: string\n children: ReactNode\n}) {\n const GAP = { 2: 'space-y-2', 3: 'space-y-3', 4: 'space-y-4', 5: 'space-y-5 pt-2' } as const\n return (\n <div data-slot=\"plan-stack\" data-testid={testId} className={cn(GAP[gap], className)}>\n {children}\n </div>\n )\n}\n\n/** \"Free -> Pro x2\": the transition the plan picker is about to make. */\nexport function PlanTransition({ from, to }: { from: string; to: string }) {\n return (\n <div data-slot=\"plan-transition\" className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-xs font-semibold text-muted-foreground\">\n {from}\n </span>\n <ArrowRight className=\"size-4 text-muted-foreground\" aria-hidden />\n <span className=\"inline-flex items-center rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-white\">\n {to}\n </span>\n </div>\n )\n}\n\n/** Title + explainer on the left, billing toggle on the right; the toggle wraps when narrow. */\nexport function PlanPickerHeader({\n title,\n info,\n infoPlacement = 'title',\n toggle,\n className,\n}: {\n title: ReactNode\n info?: ReactNode\n /** `title`: the info trigger sits beside the title; `toggle`: grouped with the toggle. */\n infoPlacement?: 'title' | 'toggle'\n toggle?: ReactNode\n className?: string\n}) {\n return (\n <div\n data-slot=\"plan-picker-header\"\n className={cn('flex flex-wrap items-center justify-between gap-x-3 gap-y-2', className)}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-semibold\">{title}</span>\n {infoPlacement === 'title' && info}\n </div>\n {infoPlacement === 'toggle' ? (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n {info}\n {toggle}\n </div>\n ) : (\n toggle\n )}\n </div>\n )\n}\n\n/** Tinted card holding the tier picker (header + quantity grid). */\nexport function PlanPickerCard({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"plan-picker-card\" className=\"space-y-4 rounded-lg bg-muted p-4\">\n {children}\n </div>\n )\n}\n\n/** Decline on the left, commit on the right; stacked reversed so commit leads on narrow screens. */\nexport function PlanActionRow({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"plan-action-row\" className=\"flex flex-col-reverse gap-2 @xl:flex-row\">\n {children}\n </div>\n )\n}\n\n/** Full-width button of a plan flow (`fill` makes it share a row equally on wide screens). */\nexport function PlanActionButton({\n tone = 'primary',\n fill,\n ...props\n}: Omit<ComponentProps<typeof Button>, 'variant'> & {\n tone?: 'primary' | 'muted'\n fill?: boolean\n}) {\n return (\n <Button\n data-slot=\"plan-action-button\"\n variant={tone === 'muted' ? 'ghost' : 'default'}\n {...props}\n className={cn(\n 'w-full',\n fill && 'sm:flex-1',\n tone === 'muted' && 'text-muted-foreground',\n props.className\n )}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Subscription status\n// ---------------------------------------------------------------------------\n\nexport interface SubscriptionMeterView {\n key: string\n icon: LucideIcon\n label: string\n value: string\n pct: number\n}\n\nexport interface SubscriptionStatusViewProps {\n /** Formatted reset date (\"Aug 31\"); falsy when unknown. */\n resetDate?: string | null\n isCanceling: boolean\n meters: SubscriptionMeterView[]\n /** Prefix of each meter's test id (`<prefix>-<key>`); defaults to `project-quota`. */\n testIdPrefix?: string\n labels?: Partial<SubscriptionStatusLabels>\n}\n\nexport interface SubscriptionStatusLabels {\n creditsReset: (date: string) => string\n cancelsAtPeriodEnd: string\n cancelsAtEndOfBillingPeriod: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_STATUS_LABELS: SubscriptionStatusLabels = {\n creditsReset: (date) => `Credits reset ${date}`,\n cancelsAtPeriodEnd: '· Cancels at period end',\n cancelsAtEndOfBillingPeriod: 'Cancels at end of billing period',\n}\n\n/** Expanded project status: reset date, canceling notice, stacked quota meters. */\nexport function SubscriptionStatusView({\n resetDate,\n isCanceling,\n meters,\n testIdPrefix,\n labels,\n}: SubscriptionStatusViewProps) {\n const l = { ...DEFAULT_SUBSCRIPTION_STATUS_LABELS, ...labels }\n return (\n <div data-slot=\"subscription-status\" className=\"space-y-3\">\n {resetDate && (\n <p className=\"text-sm text-muted-foreground\">\n {l.creditsReset(resetDate)}\n {isCanceling && <span className=\"ml-2 text-yellow-text\">{l.cancelsAtPeriodEnd}</span>}\n </p>\n )}\n {!resetDate && isCanceling && (\n <p className=\"text-sm text-yellow-text\">{l.cancelsAtEndOfBillingPeriod}</p>\n )}\n <div className=\"space-y-3\">\n {meters.map((m) => (\n <UsageMeter\n key={m.key}\n icon={m.icon}\n label={m.label}\n value={m.value}\n pct={m.pct}\n testId={prefixedTestId(testIdPrefix, m.key, { testId: `project-quota-${m.key}` })}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Dialogs\n// ---------------------------------------------------------------------------\n\nexport interface PlanDialogFrameProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n description: ReactNode\n /** Keep the description for screen readers only. */\n isDescriptionHidden?: boolean\n /** Name of the project the plan applies to, right of the title. */\n projectName?: string\n /** Test id of the project name; defaults to `change-plan-project`. */\n projectTestId?: string\n children?: ReactNode\n labels?: Partial<{ project: string }>\n}\n\n/** The one plan-picker dialog: offer title + reason, the project it applies to, then the flow. */\nexport function PlanDialogFrame({\n open,\n onOpenChange,\n title,\n description,\n isDescriptionHidden,\n projectName,\n projectTestId,\n children,\n labels,\n}: PlanDialogFrameProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-5xl\">\n {/* pr-8 clears the close button. */}\n <DialogHeader className=\"flex-row items-start justify-between gap-3 space-y-0 pr-8\">\n <div className=\"space-y-1.5\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className={isDescriptionHidden ? 'sr-only' : undefined}>\n {description}\n </DialogDescription>\n </div>\n {projectName !== undefined && (\n <span\n className=\"shrink-0 text-sm text-muted-foreground\"\n data-testid={testIdOr(projectTestId, { testId: 'change-plan-project' })}\n >\n {labels?.project ?? 'Project:'}{' '}\n <span className=\"font-semibold text-foreground\">{projectName}</span>\n </span>\n )}\n </DialogHeader>\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface CheckoutDialogFrameProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Stripe is not available: show the explanation instead of the checkout. */\n isUnavailable?: boolean\n isLoading?: boolean\n hasError?: boolean\n /** The embedded payment form (host-owned: needs the payment provider). */\n children?: ReactNode\n labels?: Partial<CheckoutDialogLabels>\n}\n\nexport interface CheckoutDialogLabels {\n unavailableTitle: string\n unavailableDescription: string\n title: string\n description: string\n loading: string\n error: string\n}\n\nexport const DEFAULT_CHECKOUT_DIALOG_LABELS: CheckoutDialogLabels = {\n unavailableTitle: 'Stripe Not Configured',\n unavailableDescription: 'Stripe checkout is not available. Please contact support.',\n title: 'Complete Your Purchase',\n description: 'Enter your payment details to complete your Pro subscription',\n loading: 'Loading checkout...',\n error: 'Failed to load checkout. Please try again.',\n}\n\n/**\n * Checkout dialog chrome. Flex column capped at 90vh: the header is pinned and ONLY the checkout\n * region scrolls, so the embedded payment iframe (often taller than the viewport) never clips its\n * pay button. Outside click and Escape are blocked: a half-paid checkout must be closed on purpose.\n */\nexport function CheckoutDialogFrame({\n open,\n onOpenChange,\n isUnavailable,\n isLoading,\n hasError,\n children,\n labels,\n}: CheckoutDialogFrameProps) {\n const l = { ...DEFAULT_CHECKOUT_DIALOG_LABELS, ...labels }\n if (isUnavailable) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{l.unavailableTitle}</DialogTitle>\n <DialogDescription>{l.unavailableDescription}</DialogDescription>\n </DialogHeader>\n </DialogContent>\n </Dialog>\n )\n }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-[calc(100dvh-2rem)] max-w-2xl flex-col gap-0 overflow-hidden p-0\"\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => e.preventDefault()}\n >\n <DialogHeader className=\"flex-shrink-0 px-6 pb-3 pt-6\">\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-6 pb-6\">\n {isLoading && <div className=\"py-8 text-center text-muted-foreground\">{l.loading}</div>}\n {hasError && <div className=\"py-8 text-center text-destructive\">{l.error}</div>}\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface QuotaExceededDialogViewProps {\n open: boolean\n onClose: () => void\n onUpgrade: () => void\n message: string\n /** Absent while the dialog closes (no usage to show). */\n usage?: {\n percent: number\n /** \"1,200 credits of 2,000 credits\". */\n readout: string\n projectId?: string | null\n }\n labels?: Partial<QuotaExceededDialogLabels>\n}\n\nexport interface QuotaExceededDialogLabels {\n title: string\n projectUsage: string\n progress: string\n project: string\n close: string\n upgrade: string\n}\n\nexport const DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS: QuotaExceededDialogLabels = {\n title: 'AI quota exceeded',\n projectUsage: 'Project usage',\n progress: 'Project AI spend usage',\n project: 'Project:',\n close: 'Close',\n upgrade: 'Upgrade',\n}\n\n/** Shown when a project's AI budget is exhausted: how much was used, then close or upgrade. */\nexport function QuotaExceededDialogView({\n open,\n onClose,\n onUpgrade,\n message,\n usage,\n labels,\n}: QuotaExceededDialogViewProps) {\n const l = { ...DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"max-w-md\" data-testid=\"quota-exceeded-modal\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{message}</DialogDescription>\n </DialogHeader>\n {usage && (\n <ModalSection className=\"space-y-2\">\n <ModalSectionTitle>{l.projectUsage}</ModalSectionTitle>\n <Progress value={usage.percent} aria-label={l.progress} />\n <div\n className=\"flex items-center justify-between text-sm text-muted-foreground\"\n data-testid=\"quota-usage-readout\"\n >\n <span>{usage.readout}</span>\n <span>{usage.percent}%</span>\n </div>\n {usage.projectId && (\n <div className=\"text-sm text-muted-foreground\">\n {l.project} {usage.projectId}\n </div>\n )}\n </ModalSection>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} data-testid=\"quota-close-button\">\n {l.close}\n </Button>\n <Button onClick={onUpgrade} data-testid=\"quota-upgrade-button\">\n {l.upgrade}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Welcome project picker\n// ---------------------------------------------------------------------------\n\nexport interface WelcomeProjectPickerProps {\n value: string\n options: { id: string; name: string }[]\n onChange: (id: string) => void\n testId?: string\n}\n\n/** Compact project switcher in the welcome dialog's quota header. */\nexport function WelcomeProjectPicker({\n value,\n options,\n onChange,\n testId = 'welcome-modal-project-select',\n}: WelcomeProjectPickerProps) {\n return (\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger\n className=\"h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11\"\n data-testid={testId}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id}>\n {o.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Project list (subscription section) and usage section slots\n// ---------------------------------------------------------------------------\n\nexport interface SubscriptionSectionViewProps {\n intro: ReactNode\n isLoading?: boolean\n isEmpty?: boolean\n /** Project groups (use {@link ProjectGroup}). */\n children?: ReactNode\n labels?: Partial<SubscriptionSectionLabels>\n}\n\nexport interface SubscriptionSectionLabels {\n loading: string\n empty: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_SECTION_LABELS: SubscriptionSectionLabels = {\n loading: 'Loading projects...',\n empty: 'No projects yet — create one above.',\n}\n\n/** The projects list of settings: intro line, then groups, loading or empty state. */\nexport function SubscriptionSectionView({\n intro,\n isLoading,\n isEmpty,\n children,\n labels,\n}: SubscriptionSectionViewProps) {\n const l = { ...DEFAULT_SUBSCRIPTION_SECTION_LABELS, ...labels }\n if (isLoading) {\n return <div className=\"py-4 text-sm text-muted-foreground\">{l.loading}</div>\n }\n return (\n <div data-slot=\"subscription-section\" className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">{intro}</p>\n {isEmpty ? (\n <div className=\"rounded-lg bg-muted py-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">{l.empty}</p>\n </div>\n ) : (\n children\n )}\n </div>\n )\n}\n\n/** A stack of project cards. */\nexport function ProjectGroup({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-group\" className=\"space-y-2\">\n {children}\n </div>\n )\n}\n\n/** Plan picker area inside an expanded project card. */\nexport function ProjectPlanPicker({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-plan-picker\" className=\"border-b pb-3\">\n {children}\n </div>\n )\n}\n\n/** Project name in a card row. */\nexport function ProjectNameLabel({ children }: { children: ReactNode }) {\n return <span className=\"truncate text-sm font-medium\">{children}</span>\n}\n\n/** Row of icon actions on a project card. */\nexport function ProjectRowActions({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-row-actions\" className=\"flex flex-shrink-0 items-center gap-0.5\">\n {children}\n </div>\n )\n}\n\nexport interface RowIconActionProps {\n label: string\n /** Tooltip text; defaults to `label`. */\n tooltip?: string\n icon: ReactNode\n tone?: 'primary' | 'destructive'\n disabled?: boolean\n onClick?: () => void\n}\n\n/** Small icon action with a tooltip (rename, delete). 44px on touch. */\nexport function RowIconAction({\n label,\n tooltip,\n icon,\n tone = 'primary',\n disabled,\n onClick,\n}: RowIconActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'size-6 text-muted-foreground/50 pointer-coarse:size-11',\n tone === 'destructive' ? 'hover:text-destructive' : 'hover:text-primary'\n )}\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n >\n {icon}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{tooltip ?? label}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** Compact outline button with a leading icon on a project card row. */\nexport function RowButton({\n icon,\n children,\n onClick,\n}: {\n icon: ReactNode\n children: ReactNode\n onClick: (e: MouseEvent) => void\n}) {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1 px-2.5 text-sm pointer-coarse:h-11\"\n onClick={onClick}\n >\n {icon}\n {children}\n </Button>\n )\n}\n\n/** Icon-only tooltip button of the usage panel's action slot (download, print). */\nexport function UsageActionButton({\n label,\n icon,\n onClick,\n}: {\n label: string\n icon: ReactNode\n onClick: () => void\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n aria-label={label}\n onClick={onClick}\n >\n {icon}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** \"(12% of quota)\" after the credits stat label. */\nexport function UsageQuotaHint({ children }: { children: ReactNode }) {\n return <span className=\"ml-1 tabular-nums\">{children}</span>\n}\n\n/** Titled block of the usage panel (chart, breakdown) with an optional control on the right. */\nexport function UsageSection({\n title,\n action,\n children,\n footer,\n gap = 'sm',\n}: {\n title: ReactNode\n action?: ReactNode\n children: ReactNode\n /** Below the content, e.g. a chart legend. */\n footer?: ReactNode\n gap?: 'sm' | 'md'\n}) {\n return (\n <div data-slot=\"usage-section\" className={gap === 'md' ? 'space-y-3' : undefined}>\n <div className={cn('flex items-center justify-between', gap === 'sm' && 'mb-2')}>\n <div className=\"text-sm font-medium text-muted-foreground\">{title}</div>\n {action}\n </div>\n {children}\n {footer && <div className=\"mt-2\">{footer}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, Check, Copy, FileText, LogOut, RefreshCw } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { ModalHeader, ModalSection } from './ModalScaffold'\n\n/** Every fixed string of the crash dialog. */\nexport interface ErrorDialogLabels {\n title: string\n srDescription: string\n reportHint: string\n refreshHint: string\n hideDetails: string\n viewDetails: string\n toggleDetailsAria: string\n copyAria: string\n copy: string\n copied: string\n refreshSession: string\n logout: string\n}\n\nexport const DEFAULT_ERROR_DIALOG_LABELS: ErrorDialogLabels = {\n title: 'Something Went Wrong',\n srDescription: 'Error dialog',\n reportHint:\n 'Please click below to report the error to our support team if you have not done so already.',\n refreshHint:\n 'Clicking Refresh Session will attempt to refresh your session, which may help resolve the error.',\n hideDetails: 'Hide Details',\n viewDetails: 'View Details',\n toggleDetailsAria: 'Toggle error details',\n copyAria: 'Copy error details',\n copy: 'Copy error',\n copied: 'Copied',\n refreshSession: 'Refresh Session',\n logout: 'Logout',\n}\n\n/** Developer-only error report: collapsible text and a copy button. */\nexport interface ErrorDialogDetails {\n text: string\n isShown: boolean\n isCopied: boolean\n onToggle: () => void\n onCopy: () => void\n}\n\nexport interface ErrorDialogViewProps {\n /** Present only for developers; hides the report entirely otherwise. */\n details?: ErrorDialogDetails\n /** \"Report error\" control (it owns its own submit flow). */\n report: ReactNode\n onRefresh: () => void\n onLogout: () => void\n labels?: Partial<ErrorDialogLabels>\n}\n\n/** Non-dismissible crash dialog: explanation, optional report, report / refresh / logout. */\nexport function ErrorDialogView({\n details,\n report,\n onRefresh,\n onLogout,\n labels,\n}: ErrorDialogViewProps) {\n const l = { ...DEFAULT_ERROR_DIALOG_LABELS, ...labels }\n return (\n <Dialog open onOpenChange={() => {}}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0\"\n data-testid=\"error-boundary-modal\"\n >\n <ModalHeader>\n <DialogTitle>\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"text-red-text\" size={24} />\n <span>{l.title}</span>\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{l.srDescription}</DialogDescription>\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">\n <ModalSection data-testid=\"error-boundary\">\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.reportHint}</p>\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.refreshHint}</p>\n\n {details?.isShown && (\n <div className=\"mb-4 rounded border border-border bg-background p-3\">\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap font-mono text-sm\">\n {details.text}\n </pre>\n </div>\n )}\n\n <div className=\"flex w-full flex-col gap-2\">\n {details && (\n <div className=\"flex w-full gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={details.onToggle}\n aria-label={l.toggleDetailsAria}\n data-testid=\"error-boundary-view-details\"\n >\n <FileText className=\"mr-2 size-4\" />\n {details.isShown ? l.hideDetails : l.viewDetails}\n </Button>\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={details.onCopy}\n aria-label={l.copyAria}\n data-testid=\"error-boundary-copy-details\"\n >\n {details.isCopied ? (\n <Check className=\"mr-2 size-4 text-green-text\" />\n ) : (\n <Copy className=\"mr-2 size-4\" />\n )}\n {details.isCopied ? l.copied : l.copy}\n </Button>\n </div>\n )}\n {report}\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onRefresh}\n aria-label=\"Refresh session\"\n >\n <RefreshCw className=\"mr-2 size-4\" />\n {l.refreshSession}\n </Button>\n <Button variant=\"outline\" className=\"w-full\" onClick={onLogout} aria-label=\"Logout\">\n <LogOut className=\"mr-2 size-4\" />\n {l.logout}\n </Button>\n </div>\n </ModalSection>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/settings/ConfirmDialog.tsx","../../src/settings/SegmentedControl.tsx","../../src/settings/FloatingPanel.tsx","../../src/settings/PanelFrame.tsx","../../src/settings/ConfigSwitcherBar.tsx","../../src/settings/ConversationSettingsParts.tsx","../../src/settings/ServerConnectionControls.tsx","../../src/settings/PremiumModelsFrame.tsx","../../src/settings/ThreadPreviewDialog.tsx","../../src/settings/JsonTree.tsx","../../src/settings/TipsEditorDialog.tsx","../../src/settings/SyncDialogParts.tsx","../../src/settings/TriStateFilterMenu.tsx","../../src/settings/PlanBadge.tsx","../../src/settings/QuotaMeter.tsx","../../src/settings/PlanCard.tsx","../../src/settings/ReferralCredit.tsx","../../src/settings/ConnectionCard.tsx","../../src/settings/Projects.tsx","../../src/settings/SupportPanel.tsx","../../src/settings/WelcomeDialog.tsx","../../src/settings/Usage.tsx","../../src/settings/Billing.tsx","../../src/settings/EmailWorkspaceDialogView.tsx","../../src/settings/SubscriptionParts.tsx","../../src/settings/ErrorDialog.tsx"],"names":["useMemo","useRef","jsx","ModalScaffold","AlertTriangle","testIdOr","jsxs","Button","RadioGroupPrimitive","cn","Fragment","TabHeader","Star","Undo2","History","DialogFooter","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Trash2","ModalSection","ModalSectionTitle","Tooltip","TooltipTrigger","Users","TooltipContent","Sparkles","Brain","RefreshCw","Wifi","WifiOff","Switch","Crown","Dialog","DialogContent","ModalHeader","DialogTitle","DialogDescription","formatCount","useState","Check","Copy","ChevronDown","ChevronRight","Label","useId","Textarea","Pencil","Plus","Loader2","Checkbox","ScrollArea","useEffect","FunnelX","Ban","DropdownMenuItem","Badge","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenu","DropdownMenuTrigger","Filter","MoreVertical","DropdownMenuContent","cva","TONE_SURFACE","TONE_BORDER","valueColor","prefixedTestId","Tag","Popover","PopoverTrigger","Info","PopoverContent","Gift","PlugIcon","ToneBadge","CheckCircle2","ExternalLink","ShieldCheck","Plug","AlertCircle","DialogHeader","MessageCircleQuestionMark","BookOpen","UsageMeter","UserPlus","BadgeCent","RadioGroupPrimitive2","ChartNoAxesColumn","FileText","barColor","X","Mail","Send","Clock","InfinityIcon","ArrowRight","Progress","LogOut"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useMemo, useRef } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n","import type { ReactNode } from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface SegmentedOption<T extends string> {\n value: T\n label: string\n icon?: ReactNode\n testId?: string\n}\n\nexport interface SegmentedControlProps<T extends string> {\n value: T\n onChange: (value: T) => void\n options: SegmentedOption<T>[]\n /** Accessible name of the radio group. */\n ariaLabel: string\n className?: string\n}\n\n/**\n * Single-choice radio group rendered as joined segments (selected = accent tone). Radix\n * RadioGroup: one tab stop, arrow keys move AND select, Space selects.\n */\nexport function SegmentedControl<T extends string>({\n value,\n onChange,\n options,\n ariaLabel,\n className,\n}: SegmentedControlProps<T>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"segmented-control\"\n aria-label={ariaLabel}\n value={value}\n onValueChange={(next) => onChange(next as T)}\n orientation=\"horizontal\"\n className={cn('inline-flex rounded-lg border border-border bg-background p-1', className)}\n >\n {options.map((option) => (\n <RadioGroupPrimitive.Item\n key={option.value}\n value={option.value}\n data-testid={option.testId}\n className={cn(\n 'flex items-center gap-2 rounded-md px-4 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:py-2.5',\n option.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {option.icon}\n {option.label}\n </RadioGroupPrimitive.Item>\n ))}\n </RadioGroupPrimitive.Root>\n )\n}\n","import type { MouseEventHandler, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { TabHeader } from '../shell/TabHeader'\n\n/** Where a panel is placed: pinned beside the page, full width, floating, or its own window. */\nexport type FloatingPanelMode = 'docked' | 'main' | 'overlay' | 'popout'\n\nexport interface FloatingPanelControls {\n /** The mode switcher + close button, for children that render their own header. */\n modeSwitcher: ReactNode\n}\n\nexport interface FloatingPanelProps {\n /** Stable id of the panel (also the id of its single header tab). */\n panelId: string\n mode: FloatingPanelMode\n title: string\n subtitle?: string\n headerIcon?: ReactNode\n headerActions?: ReactNode\n /** Label of the docked/main header tab (defaults to the title). */\n tabLabel?: ReactNode\n /** Mode switcher + close button, supplied by the host so it owns window management. */\n modeSwitcher: ReactNode\n /** Content, or a render function for children that embed `modeSwitcher` in their own header. */\n children: ReactNode | ((controls: FloatingPanelControls) => ReactNode)\n /** Sticky footer (e.g. Cancel / Apply). */\n footer?: ReactNode\n /** Click anywhere on the panel (the host tracks which panel is focused). */\n onPanelClick?: MouseEventHandler<HTMLDivElement>\n className?: string\n}\n\n/**\n * Presentational frame of a floating panel: header (title / tab + mode switcher), scrolling\n * body and optional footer. Placement and window management live in the host.\n */\nexport function FloatingPanel({\n panelId,\n mode,\n title,\n subtitle,\n headerIcon,\n headerActions,\n tabLabel,\n modeSwitcher,\n children,\n footer,\n onPanelClick,\n className,\n}: FloatingPanelProps) {\n const isRenderFunction = typeof children === 'function'\n const content = isRenderFunction ? children({ modeSwitcher }) : children\n\n const footerEl = footer && (\n <div className=\"relative z-10 flex-shrink-0 border-t border-border p-3\">{footer}</div>\n )\n\n const body = (\n <>\n <div className={cn('flex-1', isRenderFunction ? 'overflow-hidden' : 'overflow-auto p-3')}>\n {content}\n </div>\n {footerEl}\n </>\n )\n\n if (mode === 'popout') {\n return (\n <div\n data-slot=\"floating-panel\"\n className={cn('flex h-screen flex-col bg-background text-foreground', className)}\n >\n {!isRenderFunction && (\n <div className=\"flex flex-shrink-0 items-start justify-between border-b border-border px-3 py-2\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {(title || headerIcon) && (\n <div className=\"flex items-center gap-2 text-base font-semibold text-primary\">\n {headerIcon}\n {title && <span>{title}</span>}\n </div>\n )}\n {subtitle && <span className=\"text-sm text-muted-foreground\">{subtitle}</span>}\n {headerActions && <div className={title ? 'mt-1.5' : ''}>{headerActions}</div>}\n </div>\n {modeSwitcher}\n </div>\n )}\n {body}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"floating-panel\"\n data-mode={mode}\n className={cn('flex h-full flex-col bg-background text-foreground', className)}\n onClick={onPanelClick}\n >\n {!isRenderFunction && (\n <TabHeader\n tabs={[{ id: panelId, label: tabLabel ?? title }]}\n activeTabId={panelId}\n onTabChange={() => {}}\n rightContent={modeSwitcher}\n />\n )}\n {body}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PanelFrameProps {\n testId?: string\n className?: string\n children: ReactNode\n}\n\n/** Column that fills a side/floating panel: a header slot above a body that takes the rest. */\nexport function PanelFrame({ testId, className, children }: PanelFrameProps) {\n return (\n <div\n data-slot=\"panel-frame\"\n data-testid={testId}\n className={cn('flex h-full min-h-0 flex-col bg-background', className)}\n >\n {children}\n </div>\n )\n}\n\nexport interface PanelFrameBodyProps {\n className?: string\n children: ReactNode\n}\n\n/** The panel's body: fills what the header leaves and clips; children scroll themselves. */\nexport function PanelFrameBody({ className, children }: PanelFrameBodyProps) {\n return (\n <div data-slot=\"panel-frame-body\" className={cn('min-h-0 flex-1 overflow-hidden', className)}>\n {children}\n </div>\n )\n}\n\nexport interface PanelScrollProps {\n /** `padded` is a list page (spaced sections); `flush` is a detail view that pads itself. */\n variant?: 'padded' | 'flush'\n className?: string\n children: ReactNode\n}\n\n/** Scrolling content of a panel body. */\nexport function PanelScroll({ variant = 'flush', className, children }: PanelScrollProps) {\n return (\n <div\n data-slot=\"panel-scroll\"\n className={cn('h-full overflow-auto', variant === 'padded' && 'space-y-4 p-3', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Right-aligned row of list-level actions. */\nexport function PanelActionsRow({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"panel-actions-row\" className={cn('flex justify-end', className)}>\n {children}\n </div>\n )\n}\n\nexport interface PanelAddButtonProps {\n label: string\n onClick: () => void\n /** Icon only (a narrow header); the label stays as title/aria-label. */\n isCompact?: boolean\n icon: ReactNode\n testId?: string\n}\n\n/** \"+ New\" button that sits right after the tabs of a panel header. */\nexport function PanelAddButton({ label, onClick, isCompact, icon, testId }: PanelAddButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n data-slot=\"panel-add-button\"\n data-testid={testId}\n className=\"flex h-8 items-center gap-1.5 rounded-md px-2 text-sm font-medium text-primary transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11 pointer-coarse:min-w-11\"\n >\n {icon}\n {isCompact ? <span className=\"sr-only\">{label}</span> : <span>New</span>}\n </button>\n )\n}\n\n/** Header of a single-purpose panel: icon + title at the start, the mode switcher at the end. */\nexport function PanelTitleBar({\n icon,\n title,\n end,\n}: {\n icon?: ReactNode\n title: string\n end?: ReactNode\n}) {\n return (\n <div data-slot=\"panel-title-bar\" className=\"flex w-full items-center justify-between px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n {icon}\n <span className=\"font-medium\">{title}</span>\n </div>\n {end}\n </div>\n )\n}\n\n/** Centred muted note in a panel body (\"Loading…\"). */\nexport function PanelNote({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"panel-note\" className=\"py-8 text-center text-muted-foreground\">\n {children}\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { History, Star, Trash2, Undo2 } from 'lucide-react'\nimport {\n Button,\n DialogFooter,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** What a saved configuration is, relative to the conversation: its origin, last used, or factory. */\nexport type ConfigOptionMarker = 'default' | 'original' | 'last-used'\n\nexport interface ConfigOption {\n value: string\n title: string\n subtitle?: string\n marker?: ConfigOptionMarker\n}\n\n/** Every fixed string of the bar. */\nexport interface ConfigSwitcherBarLabels {\n placeholder: string\n save: string\n saving: string\n delete: string\n}\n\nexport const DEFAULT_CONFIG_SWITCHER_BAR_LABELS: ConfigSwitcherBarLabels = {\n placeholder: 'Select configuration...',\n save: 'Save',\n saving: 'Saving...',\n delete: 'Delete',\n}\n\nexport interface ConfigSwitcherBarProps {\n options: ConfigOption[]\n /** Value of the selected option (`unsaved` is added by the bar while `hasUnsavedChanges`). */\n value: string\n onSelect: (value: string) => void\n /** Offers the transient \"Unsaved Changes\" entry on top. */\n hasUnsavedChanges: boolean\n unsavedTitle?: string\n unsavedSubtitle?: string\n /** Show the name input and the save button. */\n showNameField: boolean\n name: string\n onNameChange: (name: string) => void\n namePlaceholder: string\n /** `Save` for new, `Rename` for a loaded configuration. */\n saveLabel: string\n onSave: () => void\n isSaving: boolean\n /** Show the delete button (an existing configuration is loaded). */\n canDelete: boolean\n onDelete: () => void\n isDeleting: boolean\n nameTestId?: string\n saveTestId?: string\n deleteTestId?: string\n labels?: Partial<ConfigSwitcherBarLabels>\n className?: string\n}\n\nconst MARKERS = { default: Star, original: Undo2, 'last-used': History } as const\n\n/** Footer bar to pick, name, save and delete a saved configuration. */\nexport function ConfigSwitcherBar({\n options,\n value,\n onSelect,\n hasUnsavedChanges,\n unsavedTitle = 'Unsaved Changes',\n unsavedSubtitle = 'Changes will be lost if you switch',\n showNameField,\n name,\n onNameChange,\n namePlaceholder,\n saveLabel,\n onSave,\n isSaving,\n canDelete,\n onDelete,\n isDeleting,\n nameTestId,\n saveTestId,\n deleteTestId,\n labels,\n className,\n}: ConfigSwitcherBarProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIG_SWITCHER_BAR_LABELS, ...labels }), [labels])\n return (\n <DialogFooter\n data-slot=\"config-switcher-bar\"\n className={cn('flex-shrink-0 border-t bg-muted px-4 py-4', className)}\n >\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex min-h-[36px] items-center gap-3\">\n <Select\n value={hasUnsavedChanges ? 'unsaved' : value}\n onValueChange={(v) => {\n if (v !== 'unsaved') onSelect(v)\n }}\n >\n <SelectTrigger className=\"h-9 min-w-0 flex-1 border-0 bg-background\">\n <SelectValue placeholder={l.placeholder} />\n </SelectTrigger>\n <SelectContent position=\"popper\">\n {hasUnsavedChanges && (\n <SelectItem value=\"unsaved\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{unsavedTitle}</span>\n <span className=\"text-sm text-muted-foreground\">{unsavedSubtitle}</span>\n </div>\n </SelectItem>\n )}\n {options.map((o) => {\n const Marker = o.marker ? MARKERS[o.marker] : null\n return (\n <SelectItem key={o.value} value={o.value}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{o.title}</span>\n {o.subtitle && (\n <span className=\"text-sm text-muted-foreground\">{o.subtitle}</span>\n )}\n </div>\n {Marker && (\n <Marker className=\"mt-0.5 size-3 flex-shrink-0 text-muted-foreground\" />\n )}\n </div>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {showNameField && (\n <>\n <Input\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={namePlaceholder}\n className=\"h-9 min-w-0 flex-1 bg-background\"\n data-testid={testIdOr(nameTestId, { testId: 'config-name-input' })}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n onClick={onSave}\n disabled={isSaving || !name.trim()}\n data-testid={testIdOr(saveTestId, { testId: 'save-config-button' })}\n >\n {isSaving ? l.saving : saveLabel}\n </Button>\n </>\n )}\n\n {canDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9 border-destructive text-destructive hover:bg-destructive hover:text-destructive-foreground\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(deleteTestId, { testId: 'delete-config-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </Button>\n )}\n </div>\n </div>\n </DialogFooter>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Brain, History, Sparkles, Star, Users } from 'lucide-react'\nimport { Button, Input, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalSectionTitle } from './ModalScaffold'\n\n/** Longest title that can be saved. */\nexport const CONVERSATION_TITLE_MAX = 50\n\n/** Every fixed string of the conversation title section. */\nexport interface ConversationTitleSectionLabels {\n title: string\n placeholder: string\n share: string\n shared: string\n /** Tooltip on the share button for non-owners. */\n ownerOnlyShare: string\n /** Tooltip on the \"Shared\" button for the owner: pressing it makes the conversation private again. */\n makePrivate: string\n characters: (count: number, max: number) => string\n saving: string\n ownerOnlyEdit: string\n}\n\nexport const DEFAULT_CONVERSATION_TITLE_SECTION_LABELS: ConversationTitleSectionLabels = {\n title: 'Conversation Title',\n placeholder: 'New Conversation',\n share: 'Share',\n shared: 'Shared',\n ownerOnlyShare: 'Only available to conversation owner',\n makePrivate: 'Make private again',\n characters: (count, max) => `${count}/${max} characters`,\n saving: 'Saving...',\n ownerOnlyEdit: 'Only the conversation owner can edit the title',\n}\n\nexport interface ConversationTitleSectionProps {\n title: string\n onTitleChange: (title: string) => void\n /** Blur with a valid title: the host saves it. */\n onTitleCommit: () => void\n isOwner: boolean\n isShared: boolean\n isSharing: boolean\n isSavingTitle: boolean\n /** The share button was pressed (the host confirms, then shares). */\n onShare: () => void\n /** The \"Shared\" button was pressed by the owner: make the conversation private again. */\n onUnshare?: () => void\n inputTestId?: string\n shareTestId?: string\n labels?: Partial<ConversationTitleSectionLabels>\n}\n\nconst SECTION_CLASS = 'rounded-md border bg-muted/50 p-4'\n\n/** Title input with a share button and a character counter; read-only for non-owners. */\nexport function ConversationTitleSection({\n title,\n onTitleChange,\n onTitleCommit,\n isOwner,\n isShared,\n isSharing,\n isSavingTitle,\n onShare,\n onUnshare,\n inputTestId,\n shareTestId,\n labels,\n}: ConversationTitleSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_TITLE_SECTION_LABELS, ...labels }), [labels])\n const trimmed = title.trim()\n return (\n <ModalSection className={SECTION_CLASS}>\n <ModalSectionTitle>{l.title}</ModalSectionTitle>\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={title}\n onChange={(e) => {\n if (isOwner && e.target.value.length <= CONVERSATION_TITLE_MAX) {\n onTitleChange(e.target.value)\n }\n }}\n onBlur={() => {\n if (isOwner && trimmed && trimmed.length <= CONVERSATION_TITLE_MAX) onTitleCommit()\n }}\n placeholder={l.placeholder}\n maxLength={60}\n disabled={!isOwner}\n data-testid={testIdOr(inputTestId, { testId: 'conversation-title-input' })}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Button\n variant={isShared ? 'secondary' : 'outline'}\n size=\"sm\"\n className=\"h-9 px-3 pointer-coarse:h-11\"\n onClick={() => {\n if (!isOwner) return\n if (isShared) onUnshare?.()\n else onShare()\n }}\n disabled={!isOwner || (isShared && !onUnshare) || isSharing}\n title={isOwner && isShared && onUnshare ? l.makePrivate : undefined}\n data-testid={testIdOr(shareTestId, { testId: 'share-conversation-button' })}\n >\n <Users className=\"mr-1 size-3\" />\n {isShared ? l.shared : l.share}\n </Button>\n </span>\n </TooltipTrigger>\n {!isOwner && (\n <TooltipContent>\n <p>{l.ownerOnlyShare}</p>\n </TooltipContent>\n )}\n </Tooltip>\n </div>\n\n {isOwner ? (\n <p\n className={cn(\n 'text-sm',\n title.length > CONVERSATION_TITLE_MAX ? 'text-destructive' : 'text-muted-foreground'\n )}\n >\n {l.characters(title.length, CONVERSATION_TITLE_MAX)}\n {isSavingTitle && <span className=\"ml-2 text-primary\">{l.saving}</span>}\n </p>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.ownerOnlyEdit}</p>\n )}\n </div>\n </ModalSection>\n )\n}\n\n/** Every fixed string of the model selection section. */\nexport interface ModelSelectionSectionLabels {\n title: string\n description: string\n useDefaults: string\n auto: string\n default: string\n lastUsed: string\n deepThinking: string\n}\n\nexport const DEFAULT_MODEL_SELECTION_SECTION_LABELS: ModelSelectionSectionLabels = {\n title: 'AI Model Selection',\n description: 'Select the AI model to use for this conversation',\n useDefaults: 'Use defaults',\n auto: 'Auto',\n default: 'Default',\n lastUsed: 'Last used',\n deepThinking: 'Deep Thinking',\n}\n\nexport interface ModelSelectionSectionProps {\n /** The model picker (its logic stays in the host). */\n selector: ReactNode\n onUseDefaults: () => void\n defaultsTestId?: string\n labels?: Partial<ModelSelectionSectionLabels>\n}\n\n/** Model picker next to a \"Use defaults\" button, with the legend of the picker's icons. */\nexport function ModelSelectionSection({\n selector,\n onUseDefaults,\n defaultsTestId,\n labels,\n}: ModelSelectionSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_MODEL_SELECTION_SECTION_LABELS, ...labels }), [labels])\n const legend = [\n { icon: Sparkles, label: l.auto },\n { icon: Star, label: l.default },\n { icon: History, label: l.lastUsed },\n { icon: Brain, label: l.deepThinking },\n ]\n return (\n <ModalSection className={SECTION_CLASS}>\n <ModalSectionTitle>{l.title}</ModalSectionTitle>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n <div className=\"flex items-center gap-2\">\n {selector}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex h-8 items-center gap-1.5 px-3 pointer-coarse:h-11\"\n onClick={onUseDefaults}\n data-testid={testIdOr(defaultsTestId, { testId: 'use-defaults-button' })}\n >\n <Star className=\"size-4\" />\n <span className=\"text-sm\">{l.useDefaults}</span>\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-muted-foreground\">\n {legend.map(({ icon: Icon, label }) => (\n <span key={label} className=\"flex items-center gap-1\">\n <Icon className=\"size-3\" />\n <span>{label}</span>\n </span>\n ))}\n </div>\n </div>\n </ModalSection>\n )\n}\n","import { RefreshCw, Wifi, WifiOff } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\n\nexport type ServerConnectionState = 'connected' | 'connecting' | 'disconnected' | 'offline'\n\nconst DOT: Record<ServerConnectionState, string> = {\n connected: 'bg-green-solid',\n connecting: 'bg-yellow-solid',\n disconnected: 'bg-red-solid',\n offline: 'bg-yellow-solid',\n}\n\nexport interface ServerConnectionButtonProps {\n state: ServerConnectionState\n /** Visible text next to the dot (\"Connected\", \"Working offline\"...). */\n label: string\n isRefreshing: boolean\n onRefresh: () => void\n testId?: string\n}\n\n/** Status pill that doubles as the \"refresh session\" button. */\nexport function ServerConnectionButton({\n state,\n label,\n isRefreshing,\n onRefresh,\n testId = 'refresh-session-button',\n}: ServerConnectionButtonProps) {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onRefresh}\n disabled={isRefreshing}\n className=\"flex items-center gap-2\"\n data-testid={testId}\n data-state={state}\n >\n <RefreshCw className={cn('size-4', isRefreshing && 'animate-spin')} />\n <span className={cn('size-2 rounded-full', DOT[state])} aria-hidden />\n {label}\n </Button>\n )\n}\n\nexport interface WorkOfflineToggleProps {\n isOffline: boolean\n onToggle: (offline: boolean) => void\n /** Accessible name and tooltip while online / offline. */\n labels?: { goOnline: string; workOffline: string; goOnlineHint: string; workOfflineHint: string }\n testId?: string\n}\n\nexport const DEFAULT_WORK_OFFLINE_LABELS = {\n goOnline: 'Go online',\n workOffline: 'Work offline',\n goOnlineHint: 'Reconnect and use ARBI online again',\n workOfflineHint:\n 'Work offline — read cached docs and queue edits, even though the server is reachable',\n}\n\n/** Icon toggle that forces the app offline even while the server is reachable. */\nexport function WorkOfflineToggle({\n isOffline,\n onToggle,\n labels,\n testId = 'work-offline-toggle',\n}: WorkOfflineToggleProps) {\n const l = { ...DEFAULT_WORK_OFFLINE_LABELS, ...labels }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={isOffline ? 'secondary' : 'outline'}\n size=\"icon\"\n onClick={() => onToggle(!isOffline)}\n aria-label={isOffline ? l.goOnline : l.workOffline}\n aria-pressed={isOffline}\n data-testid={testId}\n >\n {isOffline ? <Wifi className=\"size-4\" /> : <WifiOff className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{isOffline ? l.goOnlineHint : l.workOfflineHint}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { Crown } from 'lucide-react'\nimport { Switch, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface PremiumModelsFrameProps {\n enabled: boolean\n onEnabledChange: (enabled: boolean) => void\n title?: string\n description?: string\n /** The model table; greyed out and inert while premium models are off. */\n children: ReactNode\n toggleTestId?: string\n}\n\n// The checked checkbox (fill, border, tick) takes the primary colour and the selected row an\n// accent tint; the AG Grid theme variables alone are not enough.\nconst GRID_ACCENT_CLASSES = [\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!bg-primary',\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!border-primary',\n '[&_.ag-checkbox-input-wrapper.ag-checked]:!text-primary-foreground',\n]\n\nconst GRID_ACCENT_VARS = {\n '--ag-checkbox-checked-color': 'hsl(var(--primary))',\n '--ag-selected-row-background-color': 'hsl(var(--accent))',\n} as CSSProperties\n\n/** Master switch for premium (third-party) models above the table of models to pick from. */\nexport function PremiumModelsFrame({\n enabled,\n onEnabledChange,\n title = 'Enable Premium Models',\n description = 'Third party AI models are priced on a pass-through basis.',\n children,\n toggleTestId,\n}: PremiumModelsFrameProps) {\n return (\n <div data-slot=\"premium-models-frame\">\n <div className=\"mb-2 flex items-center gap-3\">\n <Switch\n id=\"premiumModelToggle\"\n checked={enabled}\n onCheckedChange={onEnabledChange}\n data-testid={testIdOr(toggleTestId, { testId: 'toggle-premium-model' })}\n />\n <label\n className=\"flex cursor-pointer items-center gap-2 text-sm font-medium\"\n htmlFor=\"premiumModelToggle\"\n >\n <Crown className=\"size-4 text-muted-foreground\" />\n {title}\n </label>\n </div>\n <p className=\"mb-2 text-sm text-muted-foreground\">{description}</p>\n <div\n className={cn(\n 'transition-opacity',\n !enabled && 'pointer-events-none opacity-50',\n GRID_ACCENT_CLASSES\n )}\n style={GRID_ACCENT_VARS}\n aria-disabled={!enabled}\n >\n {children}\n </div>\n </div>\n )\n}\n\n/** Provider cell of the model table: an optional logo before the provider's name. */\nexport function ModelProviderLabel({ logo, children }: { logo?: ReactNode; children: ReactNode }) {\n return (\n <span data-slot=\"model-provider\" className=\"flex items-center gap-1.5\">\n {logo}\n {children}\n </span>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { ModalHeader } from './ModalScaffold'\n\nexport interface ThreadPreviewCrumb {\n icon?: ReactNode\n label: string\n}\n\nexport interface ThreadPreviewDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Breadcrumb in the header, e.g. workspace / conversation / \"Threads preview\". */\n crumbs: ThreadPreviewCrumb[]\n description?: string\n /** Width in px (the host measures what the visualisation needs); capped at 95vw. */\n width: number\n testId?: string\n children: ReactNode\n}\n\n/** Large dialog that hosts a visualisation under a breadcrumb header. */\nexport function ThreadPreviewDialog({\n open,\n onOpenChange,\n crumbs,\n description = 'Thread visualization',\n width,\n testId,\n children,\n}: ThreadPreviewDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col overflow-hidden p-0\"\n style={{ width: `${width}px`, maxWidth: '95vw', height: '80vh', maxHeight: '90vh' }}\n data-testid={testId}\n >\n <ModalHeader>\n <DialogTitle>\n <div className=\"flex items-center gap-3\">\n {crumbs.map((c, i) => (\n <span key={i} className=\"flex items-center gap-3\">\n {i > 0 && <span className=\"text-muted-foreground\">/</span>}\n {c.icon}\n <span>{c.label}</span>\n </span>\n ))}\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">{children}</div>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState } from 'react'\nimport { Check, ChevronDown, ChevronRight, Copy } from 'lucide-react'\nimport { formatCount } from '../lib/format'\n\nconst ITEMS = { one: 'item', other: 'items' }\n\n/** Display hint for one field (the host derives it from its schema). */\nexport interface JsonTreeHint {\n displayName?: string\n description?: string\n /** `id` hints show the full value next to a long id. */\n formatType?: string\n}\n\nexport interface JsonTreeProps<H extends JsonTreeHint = JsonTreeHint> {\n data: unknown\n name?: string\n defaultExpanded?: boolean\n level?: number\n /** Names of the ancestors, passed to `resolveHint`. */\n path?: string[]\n /** Schema-aware hint for a field; omit for a plain tree. */\n resolveHint?: (path: string[], name: string) => H | null\n /** Formats a primitive according to its hint. */\n formatValue?: (value: unknown, hint: H | null) => string\n}\n\n/** Small enough to render on one line. */\nfunction isInlineObject(data: unknown): boolean {\n if (data === null || data === undefined) return true\n if (typeof data !== 'object') return true\n if (Array.isArray(data)) return data.length === 0\n const keys = Object.keys(data as object)\n if (keys.length === 0) return true\n if (keys.length > 4) return false\n return Object.values(data as object).every(\n (v) => v === null || v === undefined || typeof v !== 'object'\n )\n}\n\nfunction inlineSummary(data: Record<string, unknown>): string {\n const parts = Object.entries(data).map(([k, v]) => {\n if (v === null) return `${k}: null`\n if (typeof v === 'string') return `${k}: \"${v.length > 40 ? v.slice(0, 40) + '…' : v}\"`\n return `${k}: ${String(v)}`\n })\n return `{ ${parts.join(', ')} }`\n}\n\n/** Preview of a collapsed array: the first item's identifying fields. */\nfunction arrayPreview(data: unknown[]): string {\n if (data.length === 0) return '[]'\n const first = data[0]\n if (typeof first !== 'object' || first === null) return `[${formatCount(data.length, ITEMS)}]`\n const obj = first as Record<string, unknown>\n const previewKeys = ['action', 'step', 'phase', 'tool', 'name', 'type', 'id']\n const parts = previewKeys\n .filter((k) => obj[k] !== undefined)\n .slice(0, 3)\n .map((k) => `${k}: ${JSON.stringify(obj[k])}`)\n if (parts.length === 0) return `[${formatCount(data.length, ITEMS)}]`\n return `[${formatCount(data.length, ITEMS)} — { ${parts.join(', ')} }, …]`\n}\n\nconst NAME_CLASS = 'font-medium text-blue-600 dark:text-blue-400'\nconst COPY_CLASS =\n 'rounded p-0.5 opacity-50 transition-opacity hover:bg-muted hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100'\n\nfunction valueColor(data: unknown): string {\n if (data === null || data === undefined) return 'text-muted-foreground'\n switch (typeof data) {\n case 'string':\n return 'text-green-700 dark:text-green-400'\n case 'number':\n return 'text-blue-700 dark:text-blue-400'\n case 'boolean':\n return 'text-purple-700 dark:text-purple-400'\n default:\n return 'text-foreground'\n }\n}\n\nfunction plainValue(data: unknown): string {\n if (data === null) return 'null'\n if (data === undefined) return 'undefined'\n return typeof data === 'string' ? `\"${data}\"` : String(data)\n}\n\n/**\n * Recursive JSON tree with collapse/expand, copy buttons (hover, keyboard focus and touch) and\n * optional schema-aware names/formatting. Like a console object inspector.\n */\nexport function JsonTree<H extends JsonTreeHint = JsonTreeHint>({\n data,\n name,\n defaultExpanded = false,\n level = 0,\n path = [],\n resolveHint,\n formatValue,\n}: JsonTreeProps<H>) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded || level < 2)\n const [copied, setCopied] = useState(false)\n\n const currentPath = name ? [...path, name] : path\n const hint = name && resolveHint ? resolveHint(currentPath, name) : null\n const displayName = hint?.displayName || name\n\n const handleCopy = (value: unknown) => {\n const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n void navigator.clipboard.writeText(text).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }\n\n const copyButton = (title: string, value: unknown) => (\n <button\n type=\"button\"\n onClick={() => handleCopy(value)}\n className={COPY_CLASS}\n title={title}\n aria-label={title}\n >\n {copied ? <Check size={12} className=\"text-green-text\" /> : <Copy size={12} />}\n </button>\n )\n\n const isArray = Array.isArray(data)\n const isObject = typeof data === 'object' && data !== null && !isArray\n\n if (!isObject && !isArray) {\n const displayValue = hint && formatValue ? formatValue(data, hint) : plainValue(data)\n return (\n <div\n data-slot=\"json-tree-leaf\"\n className=\"group flex items-center gap-2 py-0.5 font-mono text-sm\"\n >\n {displayName && (\n <span className={NAME_CLASS} title={hint?.description}>\n {displayName}:\n </span>\n )}\n <span className={valueColor(data)}>{displayValue}</span>\n {hint?.formatType === 'id' && typeof data === 'string' && data.length > 20 && (\n <span className=\"text-sm text-muted-foreground\" title={data}>\n (full: {data})\n </span>\n )}\n {copyButton('Copy value', data)}\n </div>\n )\n }\n\n if (isObject && isInlineObject(data)) {\n return (\n <div\n data-slot=\"json-tree-leaf\"\n className=\"group flex items-center gap-2 py-0.5 font-mono text-sm\"\n >\n {displayName && <span className={NAME_CLASS}>{displayName}:</span>}\n <span className=\"text-muted-foreground\">\n {inlineSummary(data as Record<string, unknown>)}\n </span>\n {copyButton('Copy object', data)}\n </div>\n )\n }\n\n const Icon = isExpanded ? ChevronDown : ChevronRight\n // Arrays show items directly (no \"0:\", \"1:\" labels); objects show key: value pairs.\n const entries: [string, unknown][] = isArray\n ? (data as unknown[]).map((item, index) => [String(index), item])\n : Object.entries(data as Record<string, unknown>)\n const collapsedPreview = isArray\n ? arrayPreview(data as unknown[])\n : `{${Object.keys(data as object).length} fields}`\n\n return (\n <div data-slot=\"json-tree\" className=\"font-mono text-sm\">\n <div className=\"group flex items-center gap-1 py-0.5\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n className=\"flex items-center gap-1 rounded p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n title={hint?.description}\n >\n <Icon size={14} className=\"shrink-0\" />\n {displayName && <span className={NAME_CLASS}>{displayName}:</span>}\n {!isExpanded && (\n <span className=\"max-w-[400px] truncate text-sm text-muted-foreground\">\n {collapsedPreview}\n </span>\n )}\n {isExpanded && isArray && (\n <span className=\"text-sm text-muted-foreground\">\n {(data as unknown[]).length} items\n </span>\n )}\n </button>\n {copyButton('Copy object', data)}\n </div>\n\n {isExpanded && (\n <div className=\"ml-4 border-l border-border/40 pl-2\">\n {entries.length === 0 ? (\n <div className=\"py-0.5 text-sm text-muted-foreground\">\n {isArray ? 'empty array' : 'empty object'}\n </div>\n ) : (\n entries.map(([key, value]) => {\n if (isArray && typeof value === 'object' && value !== null && isInlineObject(value)) {\n return (\n <div key={key} className=\"py-0.5 font-mono text-sm text-muted-foreground\">\n {inlineSummary(value as Record<string, unknown>)}\n </div>\n )\n }\n return (\n <JsonTree\n key={key}\n name={isArray ? undefined : key}\n data={value}\n level={level + 1}\n path={currentPath}\n resolveHint={resolveHint}\n formatValue={formatValue}\n />\n )\n })\n )}\n </div>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { Pencil, Plus, Trash2 } from 'lucide-react'\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the tips editor. */\nexport interface TipsEditorLabels {\n titleList: string\n titleNew: string\n titleEdit: string\n descriptionList: string\n descriptionNew: string\n descriptionEdit: string\n hiddenOff: string\n customSuffix: string\n editTip: string\n deleteTip: string\n addTip: string\n testerTitle: string\n run: string\n cancel: string\n newTipIdentity: string\n customTipIdentity: string\n builtInTipIdentity: (code: string) => string\n yourNewTip: string\n placement: string\n message: string\n button: string\n noButton: string\n platformAction: string\n actionSequence: string\n externalLink: string\n buttonLabel: string\n action: string\n sequence: string\n url: string\n back: string\n save: string\n saving: string\n}\n\nexport const DEFAULT_TIPS_EDITOR_LABELS: TipsEditorLabels = {\n titleList: 'Edit tips',\n titleNew: 'New tip',\n titleEdit: 'Edit tip',\n descriptionList:\n \"All tips across every page. Change a tip's placement to move it to a page, show it everywhere, or hide it. Changes save instantly.\",\n descriptionNew: 'Create a tip and choose where it shows.',\n descriptionEdit: 'Editing the tip below — change its copy, button, or placement.',\n hiddenOff: 'Hidden (off)',\n customSuffix: ' · custom',\n editTip: 'Edit tip',\n deleteTip: 'Delete tip',\n addTip: 'Add tip',\n testerTitle: 'Run a sequence (test)',\n run: 'Run',\n cancel: 'Cancel',\n newTipIdentity: 'New tip',\n customTipIdentity: 'Custom tip',\n builtInTipIdentity: (code) => `Built-in tip · ${code}`,\n yourNewTip: 'Your new tip',\n placement: 'Placement',\n message: 'Message',\n button: 'Button',\n noButton: 'No button',\n platformAction: 'Platform action',\n actionSequence: 'Action sequence',\n externalLink: 'External link (new window)',\n buttonLabel: 'Button label',\n action: 'Action',\n sequence: 'Sequence',\n url: 'URL',\n back: 'Back',\n save: 'Save',\n saving: 'Saving…',\n}\n\nexport interface TipOption {\n value: string\n label: string\n}\n\nexport interface TipListRow {\n code: string\n message: string\n /** Where it shows, already worded (\"Home\", \"All pages\"). */\n placementLabel: string\n isHidden: boolean\n isCustom: boolean\n}\n\nexport type TipTarget = 'none' | 'action' | 'sequence' | 'url'\n\n/** The edit form's values. */\nexport interface TipFormValues {\n /** null while creating a new custom tip. */\n code: string | null\n isCustom: boolean\n /** The tip's message at open time: the header identity. */\n original: string\n placement: string\n message: string\n target: TipTarget\n ctaLabel: string\n ctaAction: string\n ctaSequence: string\n ctaHref: string\n}\n\nexport interface TipsEditorDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** `null` shows the list. */\n form: TipFormValues | null\n onFormChange: (patch: Partial<TipFormValues>) => void\n onFormBack: () => void\n onFormSave: () => void\n rows: TipListRow[]\n onEditRow: (code: string) => void\n onDeleteRow: (code: string) => void\n onAdd: () => void\n busy: boolean\n error: string | null\n placementOptions: TipOption[]\n actionOptions: TipOption[]\n sequenceOptions: TipOption[]\n /** Sequence the shared runner is executing right now. */\n activeSequenceId: string | null\n onRunSequence: (id: string) => void\n onCancelSequence: () => void\n messageMaxChars: number\n ctaLabelMaxChars: number\n labels?: Partial<TipsEditorLabels>\n}\n\nfunction SelectField({\n label,\n value,\n onValueChange,\n options,\n}: {\n label: ReactNode\n value: string\n onValueChange: (v: string) => void\n options: TipOption[]\n}) {\n return (\n <div className=\"space-y-1\">\n <Label>{label}</Label>\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nconst ROW_BUTTON = 'size-7 flex-shrink-0 pointer-coarse:size-11'\n\n/**\n * Contextual-tips editor: every tip in a list (edit, delete, add) or one tip's form (placement,\n * message, optional button), plus a tester that runs action sequences. Persistence is the host's.\n */\nexport function TipsEditorDialog({\n open,\n onOpenChange,\n form,\n onFormChange,\n onFormBack,\n onFormSave,\n rows,\n onEditRow,\n onDeleteRow,\n onAdd,\n busy,\n error,\n placementOptions,\n actionOptions,\n sequenceOptions,\n activeSequenceId,\n onRunSequence,\n onCancelSequence,\n messageMaxChars,\n ctaLabelMaxChars,\n labels,\n}: TipsEditorDialogProps) {\n const tipCtaHrefId = useId()\n const tipCtaLabelId = useId()\n const tipMessageId = useId()\n const l = useMemo(() => ({ ...DEFAULT_TIPS_EDITOR_LABELS, ...labels }), [labels])\n const isNew = form?.code === null\n\n const title = form ? (isNew ? l.titleNew : l.titleEdit) : l.titleList\n const description = form ? (isNew ? l.descriptionNew : l.descriptionEdit) : l.descriptionList\n const targetOptions: TipOption[] = [\n { value: 'none', label: l.noButton },\n { value: 'action', label: l.platformAction },\n { value: 'sequence', label: l.actionSequence },\n { value: 'url', label: l.externalLink },\n ]\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n showDescription\n className=\"max-w-lg\"\n >\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n {form ? (\n <div className=\"space-y-3\">\n {/* Prominent identity of the tip being edited. */}\n <div className=\"rounded-md border border-l-4 border-l-red-500 bg-muted/40 px-3 py-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {isNew\n ? l.newTipIdentity\n : form.isCustom\n ? l.customTipIdentity\n : l.builtInTipIdentity(form.code ?? '')}\n </p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-foreground\">\n {form.original || l.yourNewTip}\n </p>\n </div>\n\n <SelectField\n label={l.placement}\n value={form.placement}\n onValueChange={(placement) => onFormChange({ placement })}\n options={placementOptions}\n />\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor={tipMessageId}>{l.message}</Label>\n <span className=\"text-xs text-muted-foreground\">\n {form.message.length}/{messageMaxChars}\n </span>\n </div>\n <Textarea\n id={tipMessageId}\n value={form.message}\n onChange={(e) => onFormChange({ message: e.target.value.slice(0, messageMaxChars) })}\n maxLength={messageMaxChars}\n rows={2}\n />\n </div>\n\n <SelectField\n label={l.button}\n value={form.target}\n onValueChange={(v) => onFormChange({ target: v as TipTarget })}\n options={targetOptions}\n />\n\n {form.target !== 'none' && (\n <div className=\"space-y-1\">\n <Label htmlFor={tipCtaLabelId}>{l.buttonLabel}</Label>\n <Input\n id={tipCtaLabelId}\n value={form.ctaLabel}\n onChange={(e) =>\n onFormChange({ ctaLabel: e.target.value.slice(0, ctaLabelMaxChars) })\n }\n maxLength={ctaLabelMaxChars}\n />\n </div>\n )}\n\n {form.target === 'action' && (\n <SelectField\n label={l.action}\n value={form.ctaAction}\n onValueChange={(ctaAction) => onFormChange({ ctaAction })}\n options={actionOptions}\n />\n )}\n\n {form.target === 'sequence' && (\n <SelectField\n label={l.sequence}\n value={form.ctaSequence}\n onValueChange={(ctaSequence) => onFormChange({ ctaSequence })}\n options={sequenceOptions}\n />\n )}\n\n {form.target === 'url' && (\n <div className=\"space-y-1\">\n <Label htmlFor={tipCtaHrefId}>{l.url}</Label>\n <Input\n id={tipCtaHrefId}\n placeholder=\"https://…\"\n value={form.ctaHref}\n onChange={(e) => onFormChange({ ctaHref: e.target.value })}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onFormBack} disabled={busy}>\n {l.back}\n </Button>\n <Button onClick={onFormSave} disabled={busy || !form.message.trim()}>\n {busy ? l.saving : l.save}\n </Button>\n </DialogFooter>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <ul className=\"max-h-[55dvh] divide-y overflow-y-auto rounded border\">\n {rows.map((row) => (\n <li key={row.code} className=\"flex items-center gap-2 p-2 text-sm\">\n <div className=\"min-w-0 flex-1\">\n <p className={cn(row.isHidden && 'text-muted-foreground line-through')}>\n {row.message}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {row.isHidden ? l.hiddenOff : row.placementLabel}\n {row.isCustom && l.customSuffix}\n </p>\n </div>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={ROW_BUTTON}\n onClick={() => onEditRow(row.code)}\n aria-label={l.editTip}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n {row.isCustom && (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={ROW_BUTTON}\n disabled={busy}\n onClick={() => onDeleteRow(row.code)}\n aria-label={l.deleteTip}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n <Button variant=\"outline\" size=\"sm\" onClick={onAdd}>\n <Plus className=\"mr-1 size-4\" /> {l.addTip}\n </Button>\n\n {/* Dev tester: runs an action sequence end to end through the shared runner, the same\n path a tip button uses. */}\n <div className=\"space-y-2 rounded border border-dashed p-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {l.testerTitle}\n </p>\n <ul className=\"divide-y rounded border\">\n {sequenceOptions.map((s) => (\n <li key={s.value} className=\"flex items-center gap-2 p-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate\">{s.label}</span>\n {activeSequenceId === s.value ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 flex-shrink-0 pointer-coarse:h-11\"\n onClick={onCancelSequence}\n >\n {l.cancel}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 flex-shrink-0 pointer-coarse:h-11\"\n onClick={() => onRunSequence(s.value)}\n >\n {l.run}\n </Button>\n )}\n </li>\n ))}\n </ul>\n </div>\n </div>\n )}\n </ModalScaffold>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, Loader2 } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n DialogFooter,\n Label,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the sync dialog footer. */\nexport interface SyncDialogFooterLabels {\n cancel: string\n save: string\n}\n\nexport const DEFAULT_SYNC_DIALOG_FOOTER_LABELS: SyncDialogFooterLabels = {\n cancel: 'Cancel',\n save: 'Save',\n}\n\nexport interface SyncDialogFooterProps {\n onCancel: () => void\n onSave: () => void\n saveDisabled?: boolean\n isSaving?: boolean\n cancelButton?: { testId?: string }\n saveButton?: { testId?: string }\n labels?: Partial<SyncDialogFooterLabels>\n}\n\n/** Cancel / Save pair of a connector sync dialog; Save shows a spinner while saving. */\nexport function SyncDialogFooter({\n onCancel,\n onSave,\n saveDisabled,\n isSaving,\n cancelButton,\n saveButton,\n labels,\n}: SyncDialogFooterProps) {\n const l = { ...DEFAULT_SYNC_DIALOG_FOOTER_LABELS, ...labels }\n return (\n <DialogFooter data-slot=\"sync-dialog-footer\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} data-testid={cancelButton?.testId}>\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n onClick={onSave}\n disabled={saveDisabled || isSaving}\n data-testid={saveButton?.testId}\n >\n {isSaving && <Loader2 className=\"mr-1.5 size-3.5 animate-spin\" />}\n {l.save}\n </Button>\n </DialogFooter>\n )\n}\n\n/** Body of a sync dialog: the fields, spaced. */\nexport function SyncDialogBody({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"sync-dialog-body\" className=\"space-y-4 py-2\">\n {children}\n </div>\n )\n}\n\nexport interface SyncFieldProps {\n label?: ReactNode\n htmlFor?: string\n /** Right-aligned controls on the label row (e.g. expand all / collapse all). */\n actions?: ReactNode\n /** Muted explanation under the control. */\n hint?: ReactNode\n children: ReactNode\n}\n\n/** A labelled field of a sync dialog. */\nexport function SyncField({ label, htmlFor, actions, hint, children }: SyncFieldProps) {\n return (\n <div data-slot=\"sync-field\" className=\"space-y-1.5\">\n {(label || actions) && (\n <div className={cn(actions && 'flex items-center justify-between')}>\n {label && <Label htmlFor={htmlFor}>{label}</Label>}\n {actions}\n </div>\n )}\n {children}\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\n/** Small link-styled button (expand all, select all ...). */\nexport function SyncLinkButton({\n onClick,\n testId,\n children,\n}: {\n onClick: () => void\n testId?: string\n children: ReactNode\n}) {\n return (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:px-1\"\n onClick={onClick}\n data-testid={testId}\n >\n {children}\n </button>\n )\n}\n\n/** Row of {@link SyncLinkButton}s. */\nexport function SyncLinkRow({ children }: { children: ReactNode }) {\n return <div className=\"flex items-center gap-3\">{children}</div>\n}\n\nexport interface SyncSelectOption {\n value: string\n label: ReactNode\n}\n\nexport interface SyncSelectProps {\n id?: string\n testId?: string\n value: string\n onValueChange: (value: string) => void\n options: SyncSelectOption[]\n placeholder?: string\n}\n\n/** Select of a sync dialog (workspace, backfill window ...). */\nexport function SyncSelect({\n id,\n testId,\n value,\n onValueChange,\n options,\n placeholder,\n}: SyncSelectProps) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger id={id} data-testid={testId}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport interface SyncOptionToggleProps {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n title: ReactNode\n description?: ReactNode\n testId?: string\n}\n\n/** A checkbox option with a title and a muted explanation. */\nexport function SyncOptionToggle({\n checked,\n onCheckedChange,\n title,\n description,\n testId,\n}: SyncOptionToggleProps) {\n return (\n <label className=\"flex cursor-pointer items-start gap-2 text-sm\">\n <Checkbox\n className=\"mt-0.5\"\n checked={checked}\n onCheckedChange={(v) => onCheckedChange(v === true)}\n data-testid={testId}\n />\n <span>\n {title}\n {description && <span className=\"block text-xs text-muted-foreground\">{description}</span>}\n </span>\n </label>\n )\n}\n\n/** The import options of a dialog, spaced. */\nexport function SyncOptions({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"sync-options\" className=\"space-y-2.5\">\n {children}\n </div>\n )\n}\n\n/** Inline spinner + message while a list loads. */\nexport function SyncLoading({ children, compact }: { children: ReactNode; compact?: boolean }) {\n return (\n <div\n className={cn('flex items-center gap-2 text-sm text-muted-foreground', !compact && 'py-2')}\n >\n <Loader2 className=\"size-3.5 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** Muted one-liner (nothing found ...). */\nexport function SyncNote({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <p className=\"py-2 text-sm text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\n/** Muted small paragraph (the reconnect hint of calendars). */\nexport function SyncSmallNote({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <p className=\"text-xs text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\nexport interface SyncReconnectNoticeProps {\n message: ReactNode\n onReconnect: () => void\n isPending?: boolean\n testId?: string\n label?: string\n}\n\n/** A load failure the user fixes by re-authorizing the account. */\nexport function SyncReconnectNotice({\n message,\n onReconnect,\n isPending,\n testId,\n label = 'Reconnect',\n}: SyncReconnectNoticeProps) {\n return (\n <div className=\"space-y-2 py-2\">\n <p className=\"text-sm text-destructive\">{message}</p>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onReconnect}\n disabled={isPending}\n data-testid={testId}\n >\n {isPending && <Loader2 className=\"mr-1.5 size-3.5 animate-spin\" />}\n {label}\n </Button>\n </div>\n )\n}\n\n/** Scrolling frame of a folder tree. */\nexport function SyncTreeFrame({ children }: { children: ReactNode }) {\n return <ScrollArea className=\"h-72 rounded-md border p-2\">{children}</ScrollArea>\n}\n\nexport interface SyncCheckListItem {\n id: string\n label: string\n testId?: string\n}\n\nexport interface SyncCheckListProps {\n items: SyncCheckListItem[]\n selected: string[]\n onToggle: (id: string) => void\n}\n\n/** Flat, scrolling list of checkable items (a calendar has no folder tree). */\nexport function SyncCheckList({ items, selected, onToggle }: SyncCheckListProps) {\n return (\n <ScrollArea className=\"max-h-44 rounded-md border border-border\">\n <div className=\"space-y-1 p-2\">\n {items.map((c) => (\n <label\n key={c.id}\n className=\"flex cursor-pointer items-center gap-2 rounded px-1.5 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11\"\n >\n <Checkbox\n checked={selected.includes(c.id)}\n onCheckedChange={() => onToggle(c.id)}\n data-testid={c.testId}\n />\n <span className=\"truncate\">{c.label}</span>\n </label>\n ))}\n </div>\n </ScrollArea>\n )\n}\n\n/** Every fixed string of a lazy folder row. */\nexport interface SyncFolderRowLabels {\n collapse: string\n expand: string\n loading: string\n noSubfolders: string\n}\n\nexport const DEFAULT_SYNC_FOLDER_ROW_LABELS: SyncFolderRowLabels = {\n collapse: 'Collapse folder',\n expand: 'Expand folder',\n loading: 'Loading…',\n noSubfolders: 'No subfolders',\n}\n\nexport interface SyncFolderRowProps {\n id: string\n name: string\n depth: number\n /** Show the expand caret (false when nothing importable is beneath). */\n hasChildren: boolean\n isExpanded: boolean\n onToggleExpanded: () => void\n /** Grouping nodes (SharePoint sites) are shown but cannot be selected. */\n isSelectable: boolean\n checked: boolean\n /** An ancestor is selected: this folder is implicitly included. */\n disabled: boolean\n onCheckedChange: () => void\n /** Importable files beneath; undefined while unknown. */\n count?: number\n isCountLoading?: boolean\n /** Nested rows (the host renders them, lazily). */\n children?: ReactNode\n labels?: Partial<SyncFolderRowLabels>\n}\n\nconst INDENT = 18\n\n/**\n * One row of the lazy drive folder tree: caret, selection checkbox, name and file count. The\n * host fetches the children when expanded and renders them as `children` (or a status line).\n */\nexport function SyncFolderRow({\n id,\n name,\n depth,\n hasChildren,\n isExpanded,\n onToggleExpanded,\n isSelectable,\n checked,\n disabled,\n onCheckedChange,\n count,\n isCountLoading,\n children,\n labels,\n}: SyncFolderRowProps) {\n const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels }\n return (\n <div>\n <div\n className=\"flex items-center gap-1.5 rounded px-1 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11\"\n style={{ paddingLeft: depth * INDENT + 4 }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-8\"\n onClick={onToggleExpanded}\n aria-label={isExpanded ? l.collapse : l.expand}\n aria-expanded={isExpanded}\n >\n {isExpanded ? (\n <ChevronDown className=\"size-3.5\" />\n ) : (\n <ChevronRight className=\"size-3.5\" />\n )}\n </button>\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n {isSelectable ? (\n <label\n className=\"flex flex-1 cursor-pointer items-center gap-2 truncate\"\n data-testid={`drive-folder-row-${id}`}\n >\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n data-testid={`drive-folder-checkbox-${id}`}\n />\n <span className=\"truncate\" data-testid={`drive-folder-name-${id}`}>\n {name}\n </span>\n {isCountLoading ? (\n <Loader2 className=\"size-3 shrink-0 animate-spin text-muted-foreground\" />\n ) : typeof count === 'number' ? (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n ({count.toLocaleString()})\n </span>\n ) : null}\n </label>\n ) : (\n <span\n className=\"flex flex-1 items-center truncate font-medium text-muted-foreground\"\n data-testid={`drive-folder-row-${id}`}\n >\n <span className=\"truncate\" data-testid={`drive-folder-name-${id}`}>\n {name}\n </span>\n </span>\n )}\n </div>\n {isExpanded && <div>{children}</div>}\n </div>\n )\n}\n\n/** Status line under an expanded folder (loading / no subfolders), indented to its children. */\nexport function SyncFolderStatus({\n depth,\n kind,\n labels,\n}: {\n /** Depth of the folder the status belongs to. */\n depth: number\n kind: 'loading' | 'empty'\n labels?: Partial<SyncFolderRowLabels>\n}) {\n const l = { ...DEFAULT_SYNC_FOLDER_ROW_LABELS, ...labels }\n return (\n <div\n className=\"flex items-center gap-2 py-1 text-xs text-muted-foreground\"\n style={{ paddingLeft: (depth + 1) * INDENT + 4 }}\n >\n {kind === 'loading' ? (\n <>\n <Loader2 className=\"size-3 animate-spin\" /> {l.loading}\n </>\n ) : (\n l.noSubfolders\n )}\n </div>\n )\n}\n","import {\n Fragment,\n useEffect,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { Ban, Check, ChevronDown, ChevronRight, Filter, FunnelX, MoreVertical } from 'lucide-react'\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\n/** include keeps matches, exclude drops them, null is indifferent. */\nexport type TriState = 'include' | 'exclude' | null\n\nexport interface TriStateOption<T extends string = string> {\n id: T\n label: string\n icon?: ReactNode\n count: number\n disabled?: boolean\n /** Indent level (nested options such as folders). */\n depth?: number\n}\n\nexport interface TriStateGroup<T extends string = string> {\n label: string\n options: T[]\n collapsible?: boolean\n}\n\n/** Every fixed string of the filter menu. */\nexport interface TriStateFilterMenuLabels {\n clear: string\n}\n\nexport const DEFAULT_TRI_STATE_FILTER_MENU_LABELS: TriStateFilterMenuLabels = { clear: 'Clear' }\n\nexport interface HoverHandlers {\n onMouseEnter: () => void\n onMouseLeave: () => void\n}\n\nexport interface TriStateFilterMenuProps<T extends string> {\n /** Test id of the trigger. */\n testId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n title?: string\n filterStates: Map<T, TriState>\n onFiltersChange: (filters: Map<T, TriState>) => void\n options: TriStateOption<T>[]\n groups?: TriStateGroup<T>[]\n /** Between the header and the options (e.g. a toggle). */\n topContent?: ReactNode\n /** Before a group, keyed by the group's label. */\n groupTopContent?: Record<string, ReactNode>\n /** After `topContent` (e.g. a folder navigator). */\n folderContent?: ReactNode\n /** After every group (e.g. a source toggle). */\n bottomContent?: ReactNode\n /** Label next to the filter icon of the trigger. */\n triggerLabel?: string\n /** Shows the active styling even with no tri-state filter set. */\n hasExternalActiveState?: boolean\n /** Never show the active styling (chips carry the indication instead). */\n suppressTriggerActiveStyle?: boolean\n /** Replaces the default trigger styling (e.g. flush inside a unified widget). */\n triggerClassName?: string\n /** A chevron after the icon/label instead of the dots: the trigger reads as a dropdown segment. */\n renderChevron?: boolean\n /** Open only on an explicit click, never on hover (trigger embedded in another control). */\n disableHoverOpen?: boolean\n /** Exposes the hover handlers so a wider hover target (a tab header) can drive the menu. */\n onHoverHandlers?: (handlers: HoverHandlers) => void\n labels?: Partial<TriStateFilterMenuLabels>\n}\n\n/**\n * Tri-state filter dropdown. Opens on hover (pointer) or click (locks it open until clicked\n * away); the open state is controlled so a host can persist it. Options cycle\n * neutral, include, exclude.\n */\nexport function TriStateFilterMenu<T extends string>({\n testId,\n open,\n onOpenChange,\n title,\n filterStates,\n onFiltersChange,\n options,\n groups,\n topContent,\n groupTopContent,\n folderContent,\n bottomContent,\n triggerLabel,\n hasExternalActiveState = false,\n suppressTriggerActiveStyle = false,\n triggerClassName,\n renderChevron = false,\n disableHoverOpen = false,\n onHoverHandlers,\n labels,\n}: TriStateFilterMenuProps<T>) {\n const l = { ...DEFAULT_TRI_STATE_FILTER_MENU_LABELS, ...labels }\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(\n () => new Set((groups ?? []).filter((g) => g.collapsible).map((g) => g.label))\n )\n // Opened by click: stays open until clicked away.\n const [isClickOpen, setIsClickOpen] = useState(false)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelPendingClose = () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const handleMouseEnter = () => {\n if (disableHoverOpen) return\n cancelPendingClose()\n if (!isClickOpen) onOpenChange(true)\n }\n\n const handleMouseLeave = () => {\n if (disableHoverOpen || isClickOpen) return\n // Delay so the pointer can travel to the content.\n hoverTimeoutRef.current = setTimeout(() => {\n if (!isClickOpen) onOpenChange(false)\n }, 150)\n }\n\n const handleTriggerClick = () => {\n setIsClickOpen(!isClickOpen)\n onOpenChange(!isClickOpen)\n }\n\n useEffect(() => {\n onHoverHandlers?.({ onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave })\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => cancelPendingClose, [])\n\n const optionMap = useMemo(() => new Map(options.map((o) => [o.id, o])), [options])\n\n // neutral -> include -> exclude -> neutral\n const handleFilterToggle = (filterId: T) => {\n const next = new Map(filterStates)\n const current = next.get(filterId) ?? null\n next.set(filterId, current === null ? 'include' : current === 'include' ? 'exclude' : null)\n onFiltersChange(next)\n }\n\n const handleClearFilters = (e: MouseEvent) => {\n e.stopPropagation()\n // Only option ids: other keys (e.g. folder filters) stay.\n const cleared = new Map(filterStates)\n options.forEach((opt) => cleared.set(opt.id, null))\n onFiltersChange(cleared)\n }\n\n const clearButton = (\n <Button\n variant=\"ghost\"\n size=\"default\"\n onClick={handleClearFilters}\n className=\"ml-auto h-8 px-3 text-sm text-primary hover:text-primary pointer-coarse:h-11\"\n >\n <FunnelX className=\"mr-1.5 h-4 w-4 text-primary\" />\n {l.clear}\n </Button>\n )\n\n const hasActiveFilters = useMemo(() => {\n const ids = new Set(options.map((o) => o.id))\n return (\n hasExternalActiveState ||\n Array.from(filterStates.entries()).some(([k, v]) => ids.has(k) && v !== null)\n )\n }, [filterStates, options, hasExternalActiveState])\n const isActive = !suppressTriggerActiveStyle && hasActiveFilters\n\n // Without a title the Clear button rides on the first group's label row.\n const showInlineClear =\n !title &&\n hasActiveFilters &&\n !suppressTriggerActiveStyle &&\n !!groups &&\n groups.length > 0 &&\n !groups[0].collapsible\n\n const renderTriStateItem = (option: TriStateOption<T>) => {\n const state = filterStates.get(option.id) ?? null\n const badgeClass =\n state === null\n ? 'bg-card border-border text-foreground hover:bg-muted'\n : state === 'include'\n ? 'bg-primary text-primary-foreground border-primary hover:bg-primary'\n : 'bg-card text-red-text border-red-text hover:bg-red-bg'\n const stateIcon =\n state === null ? (\n <div className=\"size-3.5 rounded-sm border-2 border-border bg-transparent\" />\n ) : state === 'include' ? (\n <Check className=\"size-3\" strokeWidth={3} />\n ) : (\n <Ban className=\"size-3 text-red-text\" strokeWidth={3} />\n )\n const depthPadding = option.depth ? option.depth * 16 : 0\n\n return (\n <DropdownMenuItem\n key={option.id}\n onClick={() => handleFilterToggle(option.id)}\n onSelect={(e) => e.preventDefault()}\n disabled={option.disabled}\n className=\"cursor-pointer p-1\"\n style={depthPadding ? { paddingLeft: `${depthPadding + 4}px` } : undefined}\n >\n <Badge\n variant=\"outline\"\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11',\n badgeClass\n )}\n >\n {stateIcon}\n {option.icon && <span className=\"[&>svg]:size-3.5\">{option.icon}</span>}\n <span className=\"font-medium\">{option.label}</span>\n <span className=\"ml-auto font-semibold\">{option.count}</span>\n </Badge>\n </DropdownMenuItem>\n )\n }\n\n const toggleGroupCollapse = (label: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev)\n if (!next.delete(label)) next.add(label)\n return next\n })\n }\n\n const renderOptions = () => {\n if (!groups || groups.length === 0) return options.map(renderTriStateItem)\n\n return groups.map((group, groupIndex) => {\n const isCollapsed = !!group.collapsible && collapsedGroups.has(group.label)\n const activeCount = group.collapsible\n ? group.options.filter((id) => filterStates.get(id) !== null).length\n : 0\n\n return (\n <Fragment key={group.label}>\n {groupIndex > 0 && <DropdownMenuSeparator />}\n {groupTopContent?.[group.label] && (\n <>\n <div className=\"px-2 py-1.5\">{groupTopContent[group.label]}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {group.collapsible ? (\n <button\n type=\"button\"\n onClick={() => toggleGroupCollapse(group.label)}\n aria-expanded={!isCollapsed}\n className=\"flex w-full cursor-pointer items-center gap-1 rounded-sm px-2 py-1.5 text-sm font-semibold text-primary hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n {isCollapsed ? (\n <ChevronRight className=\"size-3.5\" />\n ) : (\n <ChevronDown className=\"size-3.5\" />\n )}\n <span>{group.label}</span>\n {isCollapsed && activeCount > 0 && (\n <Badge\n variant=\"outline\"\n className=\"ml-auto flex h-4 min-w-4 items-center justify-center rounded-md px-1 text-xs leading-none\"\n >\n {activeCount}\n </Badge>\n )}\n </button>\n ) : groupIndex === 0 && showInlineClear ? (\n <div className=\"flex items-center justify-between pr-1\">\n <DropdownMenuLabel className=\"text-primary\">{group.label}</DropdownMenuLabel>\n {clearButton}\n </div>\n ) : (\n <DropdownMenuLabel className=\"text-primary\">{group.label}</DropdownMenuLabel>\n )}\n {!isCollapsed &&\n group.options\n .map((id) => optionMap.get(id))\n .filter((opt): opt is TriStateOption<T> => opt !== undefined)\n .map(renderTriStateItem)}\n </Fragment>\n )\n })\n }\n\n const tone = isActive ? 'text-primary' : 'text-muted-foreground'\n\n return (\n <DropdownMenu modal={false} open={open} onOpenChange={onOpenChange}>\n <DropdownMenuTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"tri-state-filter-trigger\"\n className={\n triggerClassName ??\n 'inline-flex cursor-pointer items-center gap-1 rounded-sm px-1.5 py-0.5 text-sm font-medium transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center'\n }\n data-testid={testId}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleTriggerClick}\n >\n <Filter\n className={cn(\n 'size-3 transition-colors',\n isActive ? 'fill-primary text-primary' : tone\n )}\n />\n {triggerLabel && <span className={tone}>{triggerLabel}</span>}\n {renderChevron ? (\n <ChevronDown className={cn('size-3 transition-colors', tone)} />\n ) : (\n triggerLabel && <MoreVertical className={cn('size-3 transition-colors', tone)} />\n )}\n </span>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"center\"\n className=\"w-80 border-0 bg-muted\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n onMouseEnter={cancelPendingClose}\n onMouseLeave={() => {\n if (!isClickOpen) onOpenChange(false)\n }}\n onPointerDownOutside={(e) => {\n // Click-opened menus close only on a real outside click.\n if (!isClickOpen) return\n if (!(e.target as HTMLElement).closest('[role=\"menu\"]')) {\n setIsClickOpen(false)\n onOpenChange(false)\n } else {\n e.preventDefault()\n }\n }}\n >\n {(title || (hasActiveFilters && !suppressTriggerActiveStyle && !showInlineClear)) && (\n <>\n <div className=\"flex items-center justify-between px-2 py-1.5\">\n {title && <DropdownMenuLabel className=\"p-0 text-primary\">{title}</DropdownMenuLabel>}\n {hasActiveFilters && !showInlineClear && clearButton}\n </div>\n <DropdownMenuSeparator />\n </>\n )}\n {topContent && (\n <>\n <div className=\"px-2 py-1.5\">{topContent}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {folderContent && (\n <>\n <div className=\"px-1 py-0.5\">{folderContent}</div>\n <DropdownMenuSeparator />\n </>\n )}\n {renderOptions()}\n {bottomContent && (\n <>\n <DropdownMenuSeparator />\n <div className=\"px-2 py-1.5\">{bottomContent}</div>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_BORDER, TONE_SURFACE } from '../components/tones'\n\nconst planBadgeVariants = cva(\n 'inline-flex flex-shrink-0 items-center rounded-full border font-semibold leading-none',\n {\n variants: {\n /** free/dev = neutral, paid = accent tint, pending = payment trouble or cancelling. */\n tone: {\n free: `border-transparent ${TONE_SURFACE.neutral}`,\n dev: `border-transparent ${TONE_SURFACE.neutral}`,\n paid: 'border-transparent bg-accent text-accent-foreground',\n pending: `${TONE_BORDER.warning} ${TONE_SURFACE.warning}`,\n },\n /** `sm` fits dense rows and tables; `md` holds its own beside body text. */\n size: {\n sm: 'h-5 px-2 text-xs',\n md: 'h-6 px-2.5 text-sm',\n },\n },\n defaultVariants: { tone: 'free', size: 'sm' },\n }\n)\n\nexport interface PlanBadgeProps extends VariantProps<typeof planBadgeVariants> {\n /** Tier name, e.g. \"Free\", \"Pro x2\". */\n label: string\n className?: string\n testId?: string\n}\n\n/** A project's plan tier as a small coloured pill. */\nexport function PlanBadge({\n label,\n tone,\n size,\n className,\n testId = 'project-plan-chip',\n}: PlanBadgeProps) {\n return (\n <span\n data-slot=\"plan-badge\"\n className={cn(planBadgeVariants({ tone, size }), className)}\n data-testid={testId}\n >\n {label}\n </span>\n )\n}\n","import { Fragment, type ElementType } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\n\nexport interface QuotaMeterItem {\n key: string\n icon: ElementType\n label: string\n /** Compact display: used only (the limit lives in the tooltip). */\n used: string\n /** Prominent display: \"used / limit\". */\n usedOfLimit: string\n /** 0-100+ percentage of the limit consumed. */\n pct: number\n}\n\n/** Fill colour escalating green -> yellow -> red with usage. */\nconst barColor = (pct: number) =>\n pct >= 100 ? 'bg-red-500' : pct >= 50 ? 'bg-yellow-500' : 'bg-green-500'\n\n/** Value tint of the compact row: neutral until usage deserves attention (warn, then limit). */\nconst valueColor = (pct: number) =>\n pct >= 100 ? 'text-red-text' : pct >= 80 ? 'text-yellow-text' : 'text-muted-foreground'\n\nexport interface QuotaMeterProps {\n items: QuotaMeterItem[]\n /** `sm`: icon + counter row. `lg`: stat tiles with progress bars. */\n size?: 'sm' | 'lg'\n /** Per-item tooltip with used / limit (sm only). Off when a parent owns the tooltip. */\n showTooltips?: boolean\n /** The usage tint and percentage (sm only). Off on deployments without limits. */\n showBars?: boolean\n /** The \"(pct%)\" after each number (sm only). */\n showPercent?: boolean\n className?: string\n /**\n * Ids; defaults are the current ids. `root` defaults per size (`quota-badges-lg` / `quota-badges-sm`);\n * `badge` is a prefix (`<prefix>-<key>`, `<prefix>-<key>-fill` for the lg bar).\n */\n testIds?: Partial<Record<'root' | 'badge', string>>\n}\n\n/** Credits / storage / collaborators readout, in a compact row or as stat tiles. */\nexport function QuotaMeter({\n items,\n size = 'sm',\n showTooltips = true,\n showBars = true,\n showPercent = true,\n className,\n testIds,\n}: QuotaMeterProps) {\n if (size === 'lg') {\n return (\n <div\n data-slot=\"quota-meter\"\n className={cn('flex flex-wrap gap-3', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'quota-badges-lg' })}\n >\n {items.map(({ key, icon: Icon, label, usedOfLimit, pct }) => (\n <div\n key={key}\n className=\"min-w-[8rem] flex-1 rounded-lg bg-muted p-3\"\n data-testid={prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` })}\n >\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span className=\"truncate\">{label}</span>\n </div>\n <div className=\"mt-1 text-lg font-semibold tabular-nums text-foreground\">\n {usedOfLimit}\n </div>\n <div className=\"mt-2 h-1.5 overflow-hidden rounded-full bg-background\">\n <div\n className={cn('h-full rounded-full', barColor(pct))}\n style={{ width: `${Math.min(pct, 100)}%` }}\n data-testid={prefixedTestId(\n testIds?.badge,\n key,\n { testId: `quota-badge-${key}-fill` },\n '-fill'\n )}\n />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"quota-meter\"\n className={cn('flex flex-shrink-0 items-center gap-3 text-sm tabular-nums', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'quota-badges-sm' })}\n >\n {items.map(({ key, icon: Icon, label, used, usedOfLimit, pct }) => {\n const badge = (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={prefixedTestId(testIds?.badge, key, { testId: `quota-badge-${key}` })}\n >\n <Icon className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n {/* \"used (pct%)\" shows how full the quota is without a tooltip, which touch never opens. */}\n <span className={showBars ? valueColor(pct) : 'text-muted-foreground'}>\n {showBars && showPercent ? `${used} (${Math.round(pct)}%)` : used}\n </span>\n </span>\n )\n return showTooltips ? (\n <Tooltip key={key}>\n <TooltipTrigger asChild>{badge}</TooltipTrigger>\n <TooltipContent>{`${usedOfLimit} ${label}`}</TooltipContent>\n </Tooltip>\n ) : (\n <Fragment key={key}>{badge}</Fragment>\n )\n })}\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport { Check, Info, Tag } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the plan cards and their controls. */\nexport interface PlanCardLabels {\n currentPlan: string\n popular: string\n noMonthlyCost: string\n perMonth: string\n /** Short \"Current\" pill on a tier option. */\n current: string\n monthly: string\n annual: string\n annualBilling: string\n /** Savings pill: \"Save 20%\". */\n save: (percent: number) => string\n havePromoCode: string\n promoCode: string\n enterCode: string\n pricingExplainer: string\n explainerTiers: string\n explainerCredits: string\n seeModelList: string\n}\n\nexport const DEFAULT_PLAN_CARD_LABELS: PlanCardLabels = {\n currentPlan: 'Current plan',\n popular: 'Popular',\n noMonthlyCost: 'No monthly cost',\n perMonth: '/mo',\n current: 'Current',\n monthly: 'Monthly',\n annual: 'Annual',\n annualBilling: 'Annual billing',\n save: (percent) => `Save ${percent}%`,\n havePromoCode: 'Have a promo code?',\n promoCode: 'Promo Code',\n enterCode: 'Enter code',\n pricingExplainer: 'Pricing Explainer',\n explainerTiers:\n 'Pro tiers (Pro, Pro x2, Pro x10) are subscriptions linked to a pool of AI credits and document storage. This pool is shared with any project collaborators, subject to a per-user daily usage limit determined by the project owner. Project owners can move up to a higher tier any time, and can move down or cancel at the end of their existing billing period. It is recommended to have separate project subscriptions for different clients/matters to facilitate matter-based usage analysis and invoicing.',\n explainerCredits:\n 'AI credits are used in AI chat and AI-powered document processing. AI usage is metered based on the number of words (tokens) consumed and generated by the AI — including review of inputs and intermediate reasoning steps — and the published per-token price for the selected AI model. As a rule of thumb, one moderately complex request, or an upload involving around 25 source documents, will consume 1 credit when using our Standard AI models (hosted by ARBI CITY). Even though our pricing for Premium models matches the direct cost charged by third-party providers, using Premium models can easily cost 10× or even 100× more than Standard models.',\n seeModelList: 'See the AI model list →',\n}\n\n/** Pre-formatted price lines for a paid plan card. */\nexport interface PlanCardPrice {\n annual: boolean\n /** Struck-through no-discount yearly total (annual billing). */\n yearlyStrike?: string\n /** Yearly total (annual billing). */\n yearlyTotal?: string\n /** Interval suffix beside the yearly total, e.g. \"/yr\". */\n intervalLabel?: string\n /** Struck-through no-discount monthly price. */\n monthlyStrike?: string\n /** Effective monthly price. */\n monthly: string\n}\n\nexport interface PlanCardView {\n /** Pack count: the stable id of the tier. */\n id: number\n name: string\n /** Free plan: shows \"No monthly cost\" instead of a price. */\n isFree?: boolean\n isCurrent?: boolean\n isSelected?: boolean\n isPopular?: boolean\n price?: PlanCardPrice\n /** Entitlement lines, e.g. \"2,000 AI Credits / mo\". */\n features: string[]\n}\n\nexport interface PlanCardProps {\n plan: PlanCardView\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}\n\n/** Selectable plan tile. The current plan is marked and not selectable. */\nexport function PlanCard({ plan, onSelect, labels }: PlanCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n const { id, name, isFree, isCurrent, isSelected, isPopular, price, features } = plan\n return (\n <button\n type=\"button\"\n disabled={isCurrent}\n aria-pressed={!!isSelected}\n onClick={() => !isCurrent && onSelect(id)}\n data-slot=\"plan-card\"\n data-testid={`tier-card-${id}`}\n className={cn(\n 'relative rounded-lg p-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isCurrent\n ? 'cursor-default bg-blue-bg'\n : isSelected\n ? 'bg-accent ring-1 ring-primary/50'\n : 'bg-muted hover:bg-muted/70'\n )}\n >\n {isCurrent && (\n <span className=\"absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-blue-bg px-3 py-1 text-xs font-semibold leading-none text-blue-text\">\n {l.currentPlan}\n </span>\n )}\n {isPopular && !isCurrent && (\n <span className=\"absolute -top-3 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-primary px-3 py-1 text-xs font-semibold leading-none text-primary-foreground\">\n {l.popular}\n </span>\n )}\n <div className=\"mb-3 flex items-baseline gap-2\">\n <span\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n isCurrent ? 'text-blue-text' : 'text-foreground'\n )}\n >\n {name}\n </span>\n </div>\n {isFree ? (\n <div className=\"text-sm font-medium leading-none text-muted-foreground\">\n {l.noMonthlyCost}\n </div>\n ) : (\n price && (\n <div className=\"flex flex-col gap-1\">\n {price.annual && price.yearlyTotal && (\n <div className=\"flex items-baseline gap-x-2 whitespace-nowrap text-base tabular-nums\">\n {price.yearlyStrike && (\n <span className=\"font-medium text-muted-foreground line-through decoration-muted-foreground/70 decoration-1\">\n {price.yearlyStrike}\n </span>\n )}\n <span className=\"text-lg font-semibold text-foreground\">\n {price.yearlyTotal}\n <span className=\"ml-0.5 text-xs font-semibold text-muted-foreground\">\n {price.intervalLabel}\n </span>\n </span>\n </div>\n )}\n <div className=\"flex items-baseline gap-x-1.5 whitespace-nowrap\">\n {price.annual && (\n <span className=\"text-xl font-semibold leading-none text-muted-foreground\">=</span>\n )}\n {price.monthlyStrike && (\n <span className=\"text-base font-medium tabular-nums text-muted-foreground line-through decoration-muted-foreground/70 decoration-1\">\n {price.monthlyStrike}\n </span>\n )}\n <span className=\"text-2xl font-semibold leading-none tabular-nums text-foreground\">\n {price.monthly}\n <span className=\"ml-0.5 text-sm font-medium text-muted-foreground\">\n {l.perMonth}\n </span>\n </span>\n </div>\n </div>\n )\n )}\n <ul className=\"mt-4 space-y-1 border-t border-border pt-4 text-sm text-foreground\">\n {features.map((feature) => (\n <li key={feature}>{feature}</li>\n ))}\n </ul>\n </button>\n )\n}\n\n/** Responsive grid of {@link PlanCard}s: one column on phones, stepping up with width. */\nexport function PlanCardGrid({\n plans,\n onSelect,\n labels,\n}: {\n plans: PlanCardView[]\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}) {\n return (\n <div className=\"space-y-2\" data-slot=\"plan-card-grid\">\n <div\n className={cn(\n 'grid gap-2',\n plans.length === 4\n ? 'grid-cols-1 @xl:grid-cols-2 @4xl:grid-cols-4'\n : 'grid-cols-1 @xl:grid-cols-3'\n )}\n >\n {plans.map((plan) => (\n <PlanCard key={plan.id} plan={plan} onSelect={onSelect} labels={labels} />\n ))}\n </div>\n </div>\n )\n}\n\nexport interface PlanTierOptionView {\n id: number\n name: string\n isCurrent: boolean\n isSelected: boolean\n /** Formatted total with its interval, split so the suffix can be muted. */\n total?: string\n intervalLabel?: string\n /** Entitlement summary line. */\n summary: string\n}\n\n/** Compact row to move an existing subscription between tiers. */\nexport function PlanTierOption({\n option,\n onSelect,\n labels,\n}: {\n option: PlanTierOptionView\n onSelect: (id: number) => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(option.id)}\n aria-pressed={option.isSelected}\n data-slot=\"plan-tier-option\"\n data-testid={`tier-option-${option.id}`}\n className={cn(\n 'flex w-full items-center justify-between rounded-lg p-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n option.isSelected ? 'bg-accent ring-1 ring-primary/50' : 'bg-muted hover:bg-muted/70'\n )}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">{option.name}</span>\n {option.isCurrent && (\n <span className=\"rounded-full bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\">\n {l.current}\n </span>\n )}\n {option.isSelected && <Check className=\"h-4 w-4 text-primary\" />}\n </div>\n <div className=\"text-right\">\n {option.total && (\n <div className=\"font-semibold tabular-nums\">\n {option.total}\n <span className=\"text-xs font-normal text-muted-foreground\">\n {option.intervalLabel}\n </span>\n </div>\n )}\n <div className=\"text-xs tabular-nums text-muted-foreground\">{option.summary}</div>\n </div>\n </button>\n )\n}\n\n/** Monthly / Annual switch with an optional \"Save N%\" pill. */\nexport function PricingToggle({\n isAnnual,\n onToggle,\n savingsPercent,\n labels,\n}: {\n isAnnual: boolean\n onToggle: () => void\n savingsPercent?: number | null\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex items-center gap-2 text-sm\">\n <span className={isAnnual ? 'text-muted-foreground' : 'font-medium'}>{l.monthly}</span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isAnnual}\n aria-label={l.annualBilling}\n onClick={onToggle}\n className={cn(\n 'relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isAnnual ? 'bg-primary' : 'bg-muted'\n )}\n >\n <span\n className={cn(\n 'inline-block h-3 w-3 transform rounded-full bg-card transition-transform',\n isAnnual ? 'translate-x-5' : 'translate-x-1'\n )}\n />\n </button>\n <span className={isAnnual ? 'font-medium' : 'text-muted-foreground'}>{l.annual}</span>\n {savingsPercent != null && savingsPercent > 0 && (\n <span className=\"rounded-full bg-green-bg px-1.5 py-0.5 text-sm font-semibold leading-none text-green-text\">\n {l.save(savingsPercent)}\n </span>\n )}\n </div>\n )\n}\n\n/** Collapsed \"Have a promo code?\" link that expands into an input. */\nexport function PromoCodeInput({\n value,\n onChange,\n labels,\n}: {\n value: string\n onChange: (value: string) => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n const [expanded, setExpanded] = useState(false)\n\n if (!expanded) {\n return (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground pointer-coarse:min-h-11\"\n >\n <Tag className=\"h-3 w-3\" />\n <span>{l.havePromoCode}</span>\n </button>\n )\n }\n\n return (\n <div className=\"space-y-1\">\n <Label className=\"text-sm text-muted-foreground\">{l.promoCode}</Label>\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.enterCode}\n className=\"h-8 text-sm\"\n autoFocus\n />\n </div>\n )\n}\n\n/** \"Pricing Explainer\" popover. `onOpenModelList` opens the AI model list. */\nexport function PlanInfoPopover({\n onOpenModelList,\n labels,\n}: {\n onOpenModelList: () => void\n labels?: Partial<PlanCardLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_PLAN_CARD_LABELS, ...labels }), [labels])\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"gap-1.5 text-sm\">\n <Info className=\"h-4 w-4\" />\n {l.pricingExplainer}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-screen-safe w-[420px] space-y-3 text-sm leading-relaxed\"\n >\n <div className=\"text-base font-semibold\">{l.pricingExplainer}</div>\n\n <p>{l.explainerTiers}</p>\n\n <p>\n {l.explainerCredits}{' '}\n <button\n type=\"button\"\n onClick={onOpenModelList}\n className=\"font-medium text-foreground underline underline-offset-2 hover:text-primary/80\"\n >\n {l.seeModelList}\n </button>\n </p>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useMemo } from 'react'\nimport { Gift } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the referral-credit parts. `amount` is the formatted reward. */\nexport interface ReferralCreditLabels {\n badgeTitle: string\n badge: (amount: string) => string\n subtotal: string\n reward: string\n youPayNow: string\n rollover: (amount: string) => string\n applied: (amount: string) => string\n note: (amount: string) => string\n}\n\nexport const DEFAULT_REFERRAL_CREDIT_LABELS: ReferralCreditLabels = {\n badgeTitle: 'Reward — automatically applied to your invoice period',\n badge: (amount) => `${amount} reward`,\n subtotal: 'Subtotal',\n reward: 'Reward',\n youPayNow: 'You pay now',\n rollover: (amount) => `${amount} reward rolls over to your next invoice.`,\n applied: (amount) => `${amount} reward applied automatically to your invoice period.`,\n note: (amount) => `Your ${amount} reward applies to your invoice period.`,\n}\n\n/** Standing pill: the user's available referral reward. */\nexport function ReferralCreditBadge({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralCreditLabels>\n /** Default `referral-credit-badge` / `referral-credit-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <span\n className=\"flex h-8 items-center gap-1.5 rounded-full bg-green-bg px-2.5 text-sm font-medium text-green-text\"\n title={l.badgeTitle}\n data-testid={testIdOr(testId, { testId: 'referral-credit-badge' })}\n >\n <Gift className=\"h-3.5 w-3.5\" />\n {l.badge(amountLabel)}\n </span>\n )\n}\n\nexport interface ReferralCreditBreakdown {\n subtotal: string\n reward: string\n youPay: string\n /** Set when part of the reward rolls over to the next invoice. */\n rollover?: string\n}\n\nexport interface ReferralCreditSummaryProps {\n /** The reward amount, formatted. */\n amountLabel: string\n /** When the exact charge is known; otherwise a one-line note is shown. */\n breakdown?: ReferralCreditBreakdown\n labels?: Partial<ReferralCreditLabels>\n /** Root test id (default `referral-credit-summary`). */\n testId?: string\n /** Breakdown rows; defaults are the current ids. */\n testIds?: Partial<Record<'applied' | 'youPay', string>>\n}\n\n/** Reward applied to a purchase: subtotal / reward / you pay now, or a one-line note. */\nexport function ReferralCreditSummary({\n amountLabel,\n breakdown,\n labels,\n testId,\n testIds,\n}: ReferralCreditSummaryProps) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <div\n className=\"rounded-lg bg-green-bg/60 p-3 text-sm\"\n data-testid={testIdOr(testId, { testId: 'referral-credit-summary' })}\n >\n {breakdown ? (\n <dl className=\"space-y-1 tabular-nums\">\n <div className=\"flex items-center justify-between text-muted-foreground\">\n <dt>{l.subtotal}</dt>\n <dd>{breakdown.subtotal}</dd>\n </div>\n <div className=\"flex items-center justify-between text-green-text\">\n <dt className=\"flex items-center gap-1.5\">\n <Gift className=\"h-3.5 w-3.5\" />\n {l.reward}\n </dt>\n <dd data-testid={testIdOr(testIds?.applied, { testId: 'referral-credit-applied' })}>\n −{breakdown.reward}\n </dd>\n </div>\n <div className=\"flex items-center justify-between border-t border-green-border pt-1 font-semibold text-foreground\">\n <dt>{l.youPayNow}</dt>\n <dd data-testid={testIdOr(testIds?.youPay, { testId: 'referral-credit-you-pay' })}>\n {breakdown.youPay}\n </dd>\n </div>\n {breakdown.rollover && (\n <p className=\"pt-0.5 text-xs font-normal text-muted-foreground\">\n {l.rollover(breakdown.rollover)}\n </p>\n )}\n </dl>\n ) : (\n <p className=\"flex items-center gap-1.5 font-medium text-green-text\">\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.applied(amountLabel)}\n </p>\n )}\n </div>\n )\n}\n\n/** One-line note for charges whose exact amount is a proration computed server-side. */\nexport function ReferralCreditNote({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralCreditLabels>\n /** Default `referral-credit-badge` / `referral-credit-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_CREDIT_LABELS, ...labels }), [labels])\n return (\n <p\n className=\"flex items-center gap-1.5 text-sm text-green-text\"\n data-testid={testIdOr(testId, { testId: 'referral-credit-note' })}\n >\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.note(amountLabel)}\n </p>\n )\n}\n","import { useMemo } from 'react'\nimport {\n AlertCircle,\n CheckCircle2,\n ExternalLink,\n Loader2,\n Plug,\n PlugIcon,\n ShieldCheck,\n} from 'lucide-react'\nimport { Badge, Button } from '@arbidocs/react/ui'\nimport { ToneBadge } from '../components/ToneBadge'\n\n/**\n * - `available`: not connected, the user can connect.\n * - `connected`: connected.\n * - `host`: provided by the host account, no personal login.\n */\nexport type ConnectionCardStatus = 'available' | 'connected' | 'organisation'\n\n/** Every fixed string of a connection card. */\nexport interface ConnectionCardLabels {\n connectedAs: (identity: string) => string\n justConnected: string\n connected: string\n disconnect: string\n connect: string\n organisationAccount: string\n readOnlyLead: string\n readOnlyBody: string\n}\n\nexport const DEFAULT_CONNECTION_CARD_LABELS: ConnectionCardLabels = {\n connectedAs: (identity) => `Connected as ${identity}`,\n justConnected: 'Just connected ✓',\n connected: 'Connected',\n disconnect: 'Disconnect',\n connect: 'Connect',\n organisationAccount: 'Organisation account',\n readOnlyLead: 'Read-only.',\n readOnlyBody:\n ' ARBI only imports a copy of your email and files. It can’t modify or delete anything in your account, and deleting an imported document here never affects the original.',\n}\n\nexport interface ConnectionCardView {\n /** Stable key (vendor key); drives the test ids. */\n id: string\n title: string\n description?: string\n iconUrl?: string | null\n iconAlt?: string\n status: ConnectionCardStatus\n /** Right after the OAuth return: shows \"Just connected\" until the list catches up. */\n justConnected?: boolean\n /** \"Connected as {identity}\". */\n identity?: string | null\n /** Amber warning line, e.g. a stale token scheme. */\n warning?: string\n /** Muted note line, e.g. \"Enabled for your organisation\". */\n note?: string\n /** Show the read-only reassurance (mailbox / file connectors). */\n showReadOnlyNotice?: boolean\n isDisconnecting?: boolean\n}\n\nexport interface ConnectionCardProps {\n connection: ConnectionCardView\n onConnect: (id: string) => void\n onDisconnect: (id: string) => void\n labels?: Partial<ConnectionCardLabels>\n}\n\n/** One external app: icon, name, description, status and a Connect / Disconnect action. */\nexport function ConnectionCard({\n connection,\n onConnect,\n onDisconnect,\n labels,\n}: ConnectionCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONNECTION_CARD_LABELS, ...labels }), [labels])\n const { id, status } = connection\n const isConnected = status === 'connected'\n\n return (\n <div\n data-slot=\"connection-card\"\n className=\"rounded-lg bg-background px-5 py-4\"\n data-testid={`connector-card-${id}`}\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n {connection.iconUrl ? (\n <img\n src={connection.iconUrl}\n alt={connection.iconAlt ?? connection.title}\n className=\"h-6 w-6 rounded object-contain\"\n />\n ) : (\n <PlugIcon className=\"h-5 w-5\" />\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <span className=\"font-heading text-sm font-semibold text-foreground\">\n {connection.title}\n </span>\n {connection.description && (\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{connection.description}</p>\n )}\n {isConnected && connection.identity && (\n <p\n className=\"mt-1 text-xs text-muted-foreground\"\n data-testid={`connector-identity-${id}`}\n >\n {l.connectedAs(connection.identity)}\n </p>\n )}\n {connection.warning && (\n <p className=\"mt-1 text-xs text-yellow-text\">{connection.warning}</p>\n )}\n {connection.note && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{connection.note}</p>\n )}\n </div>\n\n {/* Status stacked above the action */}\n <div className=\"flex shrink-0 flex-col items-end gap-2\">\n {(isConnected || connection.justConnected) && (\n <ToneBadge\n tone=\"success\"\n icon={<CheckCircle2 className=\"h-3 w-3\" aria-hidden=\"true\" />}\n >\n {connection.justConnected ? l.justConnected : l.connected}\n </ToneBadge>\n )}\n {isConnected ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDisconnect(id)}\n disabled={connection.isDisconnecting}\n className=\"text-destructive hover:bg-destructive/10 hover:text-destructive\"\n data-testid={`connector-disconnect-${id}`}\n >\n {connection.isDisconnecting && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n {l.disconnect}\n </Button>\n ) : status === 'available' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onConnect(id)}\n className=\"gap-1.5\"\n data-testid={`connector-connect-${id}`}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {l.connect}\n </Button>\n ) : (\n <Badge variant=\"outline\" className=\"text-muted-foreground\">\n {l.organisationAccount}\n </Badge>\n )}\n </div>\n </div>\n\n {connection.showReadOnlyNotice && isConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-md bg-blue-bg px-3 py-2 text-xs text-blue-text\">\n <ShieldCheck className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <span>\n <span className=\"font-medium\">{l.readOnlyLead}</span>\n {l.readOnlyBody}\n </span>\n </div>\n )}\n </div>\n )\n}\n\n/** Centred \"nothing here yet\" placeholder inside a settings card. */\nexport function ConnectionsEmpty({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <Plug className=\"h-8 w-8 text-muted-foreground/40\" />\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n )\n}\n\n/** Inline loading line. */\nexport function ConnectionsLoading({ message }: { message: string }) {\n return (\n <div className=\"flex items-center gap-2 py-12 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm\">{message}</span>\n </div>\n )\n}\n\n/** Inline destructive error line. */\nexport function ConnectionsError({ message }: { message: string }) {\n return (\n <div className=\"flex items-center gap-2 rounded-lg bg-destructive/10 px-4 py-3 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span>{message}</span>\n </div>\n )\n}\n","import { useMemo, type KeyboardEvent, type ReactNode, useId } from 'react'\nimport { Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the project list states. */\nexport interface ProjectListLabels {\n loading: string\n empty: string\n filteredOut: string\n}\n\nexport const DEFAULT_PROJECT_LIST_LABELS: ProjectListLabels = {\n loading: 'Loading projects...',\n empty: 'No projects yet. Create one to get started.',\n filteredOut: 'No projects match the filter.',\n}\n\n/** Every fixed string of the shared-projects section. `title` prop wins. */\nexport interface SharedProjectsSectionLabels {\n title: string\n}\n\nexport const DEFAULT_SHARED_PROJECTS_SECTION_LABELS: SharedProjectsSectionLabels = {\n title: 'Shared with you',\n}\n\n/** Every fixed string of the project detail header. */\nexport interface ProjectDetailHeaderLabels {\n renameProject: string\n}\n\nexport const DEFAULT_PROJECT_DETAIL_HEADER_LABELS: ProjectDetailHeaderLabels = {\n renameProject: 'Rename project',\n}\n\n/** Every fixed string of the rename dialog. `title` prop wins. */\nexport interface RenameDialogLabels {\n title: string\n description: string\n cancel: string\n save: string\n}\n\nexport const DEFAULT_RENAME_DIALOG_LABELS: RenameDialogLabels = {\n title: 'Rename project',\n description: 'Enter a new name.',\n cancel: 'Cancel',\n save: 'Save',\n}\n\nexport interface ProjectRowProps {\n testId?: string\n /** Opens the project (click, Enter or Space on the row). */\n onOpen: () => void\n /** Name + relation mark. */\n identity: ReactNode\n /** Plan badge beside the name; shown from the `md` breakpoint up. */\n summary?: ReactNode\n /** Full-width usage readout under the line (a `QuotaMeter size=\"lg\"`). */\n usage?: ReactNode\n /** Row actions (upgrade, invoices). */\n actions?: ReactNode\n}\n\n/** One project in the list: a single clickable line; its actions are always visible. */\nexport function ProjectRow({ testId, onOpen, identity, summary, usage, actions }: ProjectRowProps) {\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onOpen()\n }\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={handleKeyDown}\n data-slot=\"project-row\"\n data-testid={testId}\n className=\"group flex cursor-pointer flex-wrap items-center gap-x-3 gap-y-3 px-3 py-3 transition-colors hover:bg-muted/50 focus:bg-muted/50 focus:outline-none pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center\">{identity}</div>\n <div className=\"flex-1\" />\n {summary && <div className=\"hidden items-center gap-3 md:flex\">{summary}</div>}\n {actions && (\n <div className=\"flex items-center gap-0.5\" onClick={(e) => e.stopPropagation()}>\n {actions}\n </div>\n )}\n {usage && <div className=\"basis-full\">{usage}</div>}\n </div>\n )\n}\n\nexport interface ProjectListProps {\n isLoading: boolean\n /** The user owns no projects at all. */\n isEmpty: boolean\n /** Projects exist but none pass the active filter. */\n isFilteredOut: boolean\n children: ReactNode\n testId?: string\n labels?: Partial<ProjectListLabels>\n}\n\n/** The list of projects with its loading / empty / no-match states. */\nexport function ProjectList({\n isLoading,\n isEmpty,\n isFilteredOut,\n children,\n testId = 'projects-list',\n labels,\n}: ProjectListProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_LIST_LABELS, ...labels }), [labels])\n const message = isLoading ? l.loading : isEmpty ? l.empty : isFilteredOut ? l.filteredOut : null\n return (\n <div data-testid={testId}>\n {isLoading ? (\n <div className=\"space-y-3 px-3 py-4\" aria-busy=\"true\">\n <span className=\"sr-only\">{message}</span>\n {[0, 1].map((i) => (\n <div key={i} className=\"flex items-center gap-3\" aria-hidden=\"true\">\n <div className=\"h-5 w-40 animate-pulse rounded-md bg-muted\" />\n <div className=\"flex-1\" />\n <div className=\"h-5 w-48 animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </div>\n ) : message ? (\n <p className=\"px-3 py-6 text-sm text-muted-foreground\">{message}</p>\n ) : (\n <div className=\"divide-y divide-border\">{children}</div>\n )}\n </div>\n )\n}\n\nexport interface SharedProjectsSectionProps {\n title?: string\n footnote?: string\n children: ReactNode\n testId?: string\n labels?: Partial<SharedProjectsSectionLabels>\n}\n\n/** \"Shared with you\": projects other people run, with the caller's own allowance in each. */\nexport function SharedProjectsSection({\n title,\n footnote,\n children,\n testId = 'shared-projects',\n labels,\n}: SharedProjectsSectionProps) {\n const l = useMemo(() => ({ ...DEFAULT_SHARED_PROJECTS_SECTION_LABELS, ...labels }), [labels])\n return (\n <section className=\"space-y-2\" data-testid={testId}>\n <h3 className=\"px-1 text-sm font-semibold text-foreground\">{title ?? l.title}</h3>\n <div className=\"divide-y divide-border\">{children}</div>\n {footnote && <p className=\"px-1 text-xs text-muted-foreground\">{footnote}</p>}\n </section>\n )\n}\n\n/** One shared project: identity on the left, the caller's allowance on the right. */\nexport function SharedProjectRow({\n testId,\n identity,\n allowance,\n}: {\n testId?: string\n identity: ReactNode\n allowance: ReactNode\n}) {\n return (\n <div className=\"flex items-center gap-4 px-3 py-2.5\" data-testid={testId}>\n {identity}\n <div className=\"ml-auto w-44\">{allowance}</div>\n </div>\n )\n}\n\nexport interface ProjectDetailHeaderProps {\n /** Large entity icon. */\n icon: ReactNode\n name: string\n /** Plan badge beside the name. */\n badge?: ReactNode\n onRename: () => void\n /** The primary action on the right (e.g. \"Update Plan\"). */\n action?: ReactNode\n labels?: Partial<ProjectDetailHeaderLabels>\n}\n\n/** Header of an opened project: icon, name with a rename pencil, plan badge, primary action. */\nexport function ProjectDetailHeader({\n icon,\n name,\n badge,\n onRename,\n action,\n labels,\n}: ProjectDetailHeaderProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_DETAIL_HEADER_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"flex-shrink-0 text-primary [&>svg]:h-8 [&>svg]:w-8\">{icon}</span>\n <div className=\"min-w-0\">\n <div className=\"group flex items-center gap-2\">\n <h2 className=\"truncate text-xl font-semibold text-foreground\" title={name}>\n {name}\n </h2>\n {/* Revealed on hover of the name, but permanently visible where hovering is impossible. */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 shrink-0 text-muted-foreground opacity-0 transition-opacity hover:text-primary focus-visible:opacity-100 [.group:hover_&]:opacity-100 [@media(hover:none)]:opacity-100\"\n title={l.renameProject}\n aria-label={l.renameProject}\n data-testid=\"project-detail-rename\"\n onClick={onRename}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n {badge}\n </div>\n </div>\n </div>\n {action && <div className=\"flex-shrink-0\">{action}</div>}\n </div>\n )\n}\n\n/** Tonal tile with a heading inside a project's detail. */\nexport function ProjectDetailSection({\n title,\n className,\n children,\n}: {\n title: string\n className?: string\n children: ReactNode\n}) {\n return (\n <section className={cn('rounded-lg bg-muted p-5', className)}>\n <h3 className=\"mb-4 text-base font-semibold text-foreground\">{title}</h3>\n {children}\n </section>\n )\n}\n\nexport interface RenameDialogProps {\n open: boolean\n onClose: () => void\n title?: string\n value: string\n onChange: (value: string) => void\n onSave: () => void\n isSaving?: boolean\n /** Test id of the name input. */\n testId?: string\n /** Test id of the dialog itself. */\n dialogTestId?: string\n /** Caption above the input (omitted: the input stands alone). */\n fieldLabel?: string\n placeholder?: string\n /** Save is disabled while false (e.g. an empty name). Defaults to true. */\n canSave?: boolean\n labels?: Partial<RenameDialogLabels>\n}\n\n/** Single-field rename: Enter saves, Escape cancels. */\nexport function RenameDialog({\n open,\n onClose,\n title,\n value,\n onChange,\n onSave,\n isSaving,\n testId,\n dialogTestId,\n fieldLabel,\n placeholder,\n canSave = true,\n labels,\n}: RenameDialogProps) {\n const renameInputId = useId()\n const l = useMemo(() => ({ ...DEFAULT_RENAME_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent presentation=\"sheet\" data-testid={dialogTestId}>\n <DialogHeader>\n <DialogTitle>{title ?? l.title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n {fieldLabel && (\n <label htmlFor={renameInputId} className=\"block text-sm font-medium\">\n {fieldLabel}\n </label>\n )}\n <Input\n id={renameInputId}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n if (e.key === 'Escape') onClose()\n }}\n data-testid={testId}\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n {l.cancel}\n </Button>\n <Button onClick={onSave} disabled={isSaving || !canSave}>\n {l.save}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { BookOpen, MessageCircleQuestionMark } from 'lucide-react'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\n\nexport type SupportTab = 'feedback' | 'guide'\n\n/** Every fixed string of the support panel (tab names and their tooltips). */\nexport interface SupportPanelLabels {\n support: string\n userGuide: string\n}\n\nexport const DEFAULT_SUPPORT_PANEL_LABELS: SupportPanelLabels = {\n support: 'Support',\n userGuide: 'User Guide',\n}\n\nexport interface SupportPanelProps {\n activeTab: SupportTab\n onTabChange: (tab: SupportTab) => void\n /** Pinned build / version lines (right of the tabs), e.g. `frontend · date · hash`. */\n buildInfo?: string[]\n /** The mode switcher + close button, placed after the build info. */\n modeSwitcher?: ReactNode\n /** Support form (e.g. an embedded survey) or its \"not configured\" notice. */\n feedback: ReactNode\n /** Shown over the form while it loads. */\n isFeedbackLoading?: boolean\n loadingIndicator?: ReactNode\n /** The rendered user guide. */\n guide: ReactNode\n testId?: string\n labels?: Partial<SupportPanelLabels>\n}\n\n/** Support panel: a \"Support\" form tab and a \"User Guide\" tab, with build info in the header. */\nexport function SupportPanel({\n activeTab,\n onTabChange,\n buildInfo = [],\n modeSwitcher,\n feedback,\n isFeedbackLoading,\n loadingIndicator,\n guide,\n testId = 'feedback-modal',\n labels,\n}: SupportPanelProps) {\n const l = useMemo(() => ({ ...DEFAULT_SUPPORT_PANEL_LABELS, ...labels }), [labels])\n const tabs: Tab[] = useMemo(\n () => [\n {\n id: 'feedback',\n label: l.support,\n icon: <MessageCircleQuestionMark className=\"h-4 w-4\" />,\n tooltip: l.support,\n },\n {\n id: 'guide',\n label: l.userGuide,\n icon: <BookOpen className=\"h-4 w-4\" />,\n tooltip: l.userGuide,\n },\n ],\n [l]\n )\n return (\n <div\n className=\"@container flex h-full flex-col bg-background\"\n data-testid={testId}\n data-slot=\"support-panel\"\n >\n <div className=\"flex-shrink-0\">\n <TabHeader\n tabs={tabs}\n activeTabId={activeTab}\n onTabChange={(id) => onTabChange(id as SupportTab)}\n rightContent={\n <div className=\"flex items-center gap-2\">\n {buildInfo.length > 0 && (\n <div className=\"hidden text-right font-mono text-xs leading-tight text-muted-foreground/70 @2xl:block\">\n {buildInfo.map((line) => (\n <div key={line}>{line}</div>\n ))}\n </div>\n )}\n {modeSwitcher}\n </div>\n }\n // Two short tabs fit the docked panel width, so keep their labels until it is tiny.\n compactBreakpoint={360}\n />\n </div>\n\n {activeTab === 'feedback' && (\n <div className=\"relative min-h-0 flex-1\">\n {isFeedbackLoading && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-background\">\n {loadingIndicator}\n </div>\n )}\n {feedback}\n </div>\n )}\n\n {activeTab === 'guide' && <div className=\"min-h-0 flex-1 overflow-auto p-4\">{guide}</div>}\n </div>\n )\n}\n\n/** Notice shown in place of the form when it is not configured. */\nexport function SupportUnavailable({ title, message }: { title: string; message: string }) {\n return (\n <div className=\"flex h-full items-center justify-center p-8 text-center\">\n <div>\n <h3 className=\"mb-2 text-lg font-semibold\">{title}</h3>\n <p className=\"text-muted-foreground\">{message}</p>\n </div>\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Gift, Sparkles, UserPlus } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the welcome dialog. */\nexport interface WelcomeDialogLabels {\n /** Title: \"Welcome, Ada!\" (`firstName` is absent for anonymous). */\n welcome: (firstName?: string) => string\n description: string\n currentPlan: string\n seeUpgradeOptions: string\n /** Text before the bold referral offer. */\n referralBefore: string\n /** Text after the bold referral offer. */\n referralAfter: string\n inviteContact: string\n /** Text before the bold reward balance. */\n currentRewards: string\n continue: string\n}\n\nexport const DEFAULT_WELCOME_DIALOG_LABELS: WelcomeDialogLabels = {\n welcome: (firstName) => `Welcome${firstName ? `, ${firstName}` : ''}!`,\n description: 'Your plan, usage and rewards at a glance.',\n currentPlan: 'Current plan',\n seeUpgradeOptions: 'See upgrade options',\n referralBefore: 'Get ',\n referralAfter: ' for every invited contact who goes Pro.',\n inviteContact: 'Invite contact',\n currentRewards: 'Current rewards: ',\n continue: 'Continue',\n}\n\n/** Every fixed string of the invite-contacts dialog. */\nexport interface InviteContactsDialogLabels {\n title: string\n description: string\n}\n\nexport const DEFAULT_INVITE_CONTACTS_DIALOG_LABELS: InviteContactsDialogLabels = {\n title: 'Invite contacts',\n description: 'Invite contacts by email and earn the referral reward.',\n}\n\nexport interface WelcomeQuotaView {\n key: string\n icon?: LucideIcon\n label: string\n /** Formatted used-of-limit, e.g. \"40 / 500 MB\". */\n value: string\n pct: number\n /** Inline hint after the label, e.g. \"resets Aug 31, 2026\". */\n hint?: string\n}\n\nexport interface WelcomeDialogProps {\n open: boolean\n /** Closing the dialog (Continue is the single, deliberate exit; there is no close X). */\n onClose: () => void\n /** Greeting name; the title reads \"Welcome, {name}!\". */\n firstName?: string\n /** Show the gift icon (a reward balance exists) instead of the sparkles. */\n hasReward: boolean\n /**\n * Corner picker naming the project the numbers belong to (credits are per project). The host\n * supplies it, since the choice of control and its state are the host's.\n */\n projectPicker?: ReactNode\n /** Plan badge for the selected project. */\n planBadge: ReactNode\n quotas: WelcomeQuotaView[]\n onSeePlans: () => void\n /** The standing referral offer, e.g. \"£20 off your plan\". */\n referralOfferLabel: string\n onInvite: () => void\n /** Held reward balance, formatted. Hidden when absent. */\n rewardBalanceLabel?: string\n labels?: Partial<WelcomeDialogLabels>\n /** Dialog test id (default `welcome-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. `quota` is a prefix (`<prefix>-<quota key>`). */\n testIds?: Partial<Record<'copy' | 'quota' | 'showPlans' | 'earn' | 'dismiss', string>>\n}\n\n/**\n * The once-per-session snapshot for free users: where you stand (plan and quotas), the standing\n * referral offer, and any reward balance. Continue is the primary action; the upgrade and invite\n * doors are deliberately secondary.\n */\nexport function WelcomeDialog({\n open,\n onClose,\n firstName,\n hasReward,\n projectPicker,\n planBadge,\n quotas,\n onSeePlans,\n referralOfferLabel,\n onInvite,\n rewardBalanceLabel,\n labels,\n testId,\n testIds,\n}: WelcomeDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_WELCOME_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'welcome-modal' })}\n hideCloseButton\n >\n <DialogHeader>\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-2\">\n <DialogTitle className=\"flex items-center gap-2\">\n {hasReward ? (\n <Gift className=\"h-5 w-5 text-green-text\" />\n ) : (\n <Sparkles className=\"h-5 w-5 text-yellow-text\" />\n )}\n {l.welcome(firstName)}\n </DialogTitle>\n {projectPicker}\n </div>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n\n {/* Where you stand: plan + the quotas every usage surface shows. */}\n <ModalSection\n className=\"space-y-4\"\n data-testid={testIdOr(testIds?.copy, { testId: 'welcome-modal-copy' })}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{l.currentPlan}</span>\n {planBadge}\n </div>\n <div className=\"space-y-3\">\n {quotas.map((quota) => (\n <UsageMeter\n key={quota.key}\n icon={quota.icon}\n label={quota.label}\n value={quota.value}\n pct={quota.pct}\n hint={quota.hint}\n testId={prefixedTestId(testIds?.quota, quota.key, {\n testId: `welcome-modal-quota-${quota.key}`,\n })}\n />\n ))}\n </div>\n {/* The upgrade door sits right under the numbers it answers. */}\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onSeePlans}\n data-testid={testIdOr(testIds?.showPlans, { testId: 'welcome-modal-show-plans' })}\n >\n {l.seeUpgradeOptions}\n </Button>\n </ModalSection>\n\n {/* Rewards: the standing way to earn, then what you already hold. */}\n <ModalSection className=\"space-y-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.referralBefore}\n <span className=\"font-semibold text-foreground\">{referralOfferLabel}</span>\n {l.referralAfter}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 gap-1.5\"\n onClick={onInvite}\n data-testid={testIdOr(testIds?.earn, { testId: 'welcome-modal-earn' })}\n >\n <UserPlus className=\"h-3.5 w-3.5\" />\n {l.inviteContact}\n </Button>\n </div>\n {rewardBalanceLabel && (\n // A statement, not a door: the balance applies itself to the next invoice.\n <div className=\"flex items-center gap-1.5 rounded-md bg-green-bg px-3 py-2 text-sm text-green-text\">\n <Gift className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">\n {l.currentRewards}\n <span className=\"font-semibold\">{rewardBalanceLabel}</span>\n </span>\n </div>\n )}\n </ModalSection>\n\n {/* Continue is the 99% path — the doors above are reminders, not the point. */}\n <DialogFooter>\n <Button\n className=\"w-full\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.dismiss, { testId: 'welcome-modal-dismiss' })}\n >\n {l.continue}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface InviteContactsDialogProps {\n open: boolean\n onClose: () => void\n /** The invite form (it carries the referral pitch itself). */\n children: ReactNode\n testId?: string\n labels?: Partial<InviteContactsDialogLabels>\n}\n\n/** Dialog around the invite form, swapped in for the welcome dialog when inviting. */\nexport function InviteContactsDialog({\n open,\n onClose,\n children,\n testId = 'welcome-modal-invite',\n labels,\n}: InviteContactsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_INVITE_CONTACTS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => !next && onClose()}\n title={l.title}\n description={l.description}\n icon={<UserPlus className=\"h-5 w-5 text-primary\" />}\n size=\"lg\"\n className=\"sm:max-w-lg\"\n testId={testId}\n >\n <ModalSection>{children}</ModalSection>\n </ModalScaffold>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { BadgeCent, ChartNoAxesColumn, Loader2 } from 'lucide-react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Categorical series palette: Tailwind classes so dark mode and tokens stay in control. */\nconst SERIES_STYLES = [\n { bg: 'bg-blue-500', stroke: 'stroke-blue-500' },\n { bg: 'bg-purple-500', stroke: 'stroke-purple-500' },\n { bg: 'bg-emerald-500', stroke: 'stroke-emerald-500' },\n { bg: 'bg-amber-500', stroke: 'stroke-amber-500' },\n { bg: 'bg-rose-500', stroke: 'stroke-rose-500' },\n { bg: 'bg-cyan-500', stroke: 'stroke-cyan-500' },\n { bg: 'bg-indigo-500', stroke: 'stroke-indigo-500' },\n { bg: 'bg-orange-500', stroke: 'stroke-orange-500' },\n] as const\n\nconst styleAt = (index: number) => SERIES_STYLES[index % SERIES_STYLES.length]\n\n/** Every fixed string of the usage line chart. `emptyLabel` prop wins. */\nexport interface UsageLineChartLabels {\n noDailyData: string\n}\n\nexport const DEFAULT_USAGE_LINE_CHART_LABELS: UsageLineChartLabels = {\n noDailyData: 'No daily data',\n}\n\n/** Every fixed string of the proportion bar. */\nexport interface UsageProportionBarLabels {\n /** Bar tooltip when the metric is tokens: \"3k tokens\". */\n tokens: (formatted: string) => string\n /** Bar tooltip when the metric is credits: \"1,200 credits\". */\n credits: (formatted: string) => string\n /** Row suffix: \"3k tok\". */\n tokensShort: (formatted: string) => string\n}\n\nexport const DEFAULT_USAGE_PROPORTION_BAR_LABELS: UsageProportionBarLabels = {\n tokens: (formatted) => `${formatted} tokens`,\n credits: (formatted) => `${formatted} credits`,\n tokensShort: (formatted) => `${formatted} tok`,\n}\n\n/** Every fixed string of the usage panel. `emptyMessage` / `errorMessage` props win. */\nexport interface UsagePanelLabels {\n empty: string\n error: string\n}\n\nexport const DEFAULT_USAGE_PANEL_LABELS: UsagePanelLabels = {\n empty: 'No usage yet.',\n error: 'Failed to load usage data',\n}\n\nexport interface UsageSeries {\n key: string\n values: number[]\n}\n\nexport interface UsageLineChartProps {\n /** ISO dates (`YYYY-MM-DD`), one per point. */\n dates: string[]\n series: UsageSeries[]\n /** Formats an axis-label date, e.g. \"Jun 12\". */\n formatDate: (date: string) => string\n /** Formats a value in the hover readout. */\n formatValue: (value: number) => string\n emptyLabel?: string\n labels?: Partial<UsageLineChartLabels>\n}\n\nconst CHART_W = 440\nconst CHART_H = 120\nconst PAD = { top: 8, right: 8, bottom: 20, left: 40 }\n\n/** SVG line chart with a tap/hover readout (a tap selects a day, so touch works). */\nexport function UsageLineChart({\n dates,\n series,\n formatDate,\n formatValue,\n emptyLabel,\n labels,\n}: UsageLineChartProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_LINE_CHART_LABELS, ...labels }), [labels])\n const [hoverIdx, setHoverIdx] = useState<number | null>(null)\n\n if (!dates.length || !series.length) {\n return <p className=\"text-sm text-muted-foreground\">{emptyLabel ?? l.noDailyData}</p>\n }\n\n const maxVal = Math.max(...series.flatMap((s) => s.values), 1)\n const plotW = CHART_W - PAD.left - PAD.right\n const plotH = CHART_H - PAD.top - PAD.bottom\n const xStep = dates.length > 1 ? plotW / (dates.length - 1) : plotW\n const yScale = (v: number) => PAD.top + plotH - (v / maxVal) * plotH\n\n const yTicks = [0, maxVal / 2, maxVal].map((v) => ({\n v,\n y: yScale(v),\n label: v >= 1000 ? `${Math.round(v / 1000)}k` : Math.round(v).toString(),\n }))\n\n const labelCount = Math.min(dates.length, 5)\n const labelStep = Math.max(1, Math.floor((dates.length - 1) / (labelCount - 1)))\n\n return (\n <div className=\"relative\" data-slot=\"usage-line-chart\">\n <svg\n viewBox={`0 0 ${CHART_W} ${CHART_H}`}\n className=\"h-auto w-full\"\n preserveAspectRatio=\"xMidYMid meet\"\n onMouseLeave={() => setHoverIdx(null)}\n >\n {yTicks.map((t) => (\n <g key={t.v}>\n <line\n x1={PAD.left}\n x2={CHART_W - PAD.right}\n y1={t.y}\n y2={t.y}\n className=\"stroke-border\"\n strokeDasharray=\"2,2\"\n />\n <text\n x={PAD.left - 4}\n y={t.y + 3}\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-xs\"\n >\n {t.label}\n </text>\n </g>\n ))}\n\n {series.map((s, si) => (\n <polyline\n key={s.key}\n points={s.values.map((v, i) => `${PAD.left + i * xStep},${yScale(v)}`).join(' ')}\n fill=\"none\"\n className={styleAt(si).stroke}\n strokeWidth={1.5}\n strokeLinejoin=\"round\"\n />\n ))}\n\n {dates.map((date, i) => (\n <rect\n key={date}\n x={PAD.left + i * xStep - xStep / 2}\n y={PAD.top}\n width={xStep}\n height={plotH}\n fill=\"transparent\"\n onMouseEnter={() => setHoverIdx(i)}\n onClick={() => setHoverIdx(i)}\n />\n ))}\n\n {hoverIdx !== null && (\n <line\n x1={PAD.left + hoverIdx * xStep}\n x2={PAD.left + hoverIdx * xStep}\n y1={PAD.top}\n y2={PAD.top + plotH}\n className=\"stroke-muted-foreground\"\n strokeDasharray=\"3,3\"\n />\n )}\n\n {dates.map((d, i) => {\n const isLast = i === dates.length - 1\n // Periodic ticks, dropping the one that would crowd the final label; edge labels anchor\n // inward so they never clip at the viewBox borders.\n if (!isLast && (i % labelStep !== 0 || dates.length - 1 - i < labelStep / 2)) return null\n return (\n <text\n key={d}\n x={PAD.left + i * xStep}\n y={CHART_H - 2}\n textAnchor={i === 0 ? 'start' : isLast ? 'end' : 'middle'}\n className=\"fill-muted-foreground text-xs\"\n >\n {formatDate(d)}\n </text>\n )\n })}\n </svg>\n\n {hoverIdx !== null && (\n <div className=\"pointer-events-none absolute right-0 top-0 rounded-md border bg-card/90 px-2 py-1 text-sm shadow-lg\">\n <div className=\"font-medium\">{dates[hoverIdx]}</div>\n {series.map((s, si) => (\n <div key={s.key} className=\"flex items-center gap-1\">\n <span className={cn('inline-block h-2 w-2 rounded-full', styleAt(si).bg)} />\n <span>{s.key}:</span>\n <span className=\"font-medium tabular-nums\">{formatValue(s.values[hoverIdx])}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Series legend; hidden for a single unnamed total. */\nexport function UsageLegend({ series }: { series: UsageSeries[] }) {\n if (series.length <= 1 && series[0]?.key === 'Total') return null\n return (\n <div className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {series.map((s, i) => (\n <div key={s.key} className=\"flex items-center gap-1 text-sm\">\n <span className={cn('inline-block h-2.5 w-2.5 rounded-full', styleAt(i).bg)} />\n <span className=\"text-muted-foreground\">{s.key}</span>\n </div>\n ))}\n </div>\n )\n}\n\nexport type UsageMetric = 'credits' | 'tokens'\n\nexport interface UsageShare {\n label: string\n /** Raw amount in the active metric, for the bar width. */\n amount: number\n /** Formatted credits, e.g. \"1,200\". */\n credits: string\n /** Formatted tokens, e.g. \"3k\". */\n tokens: string\n}\n\n/** Stacked proportion bar plus a per-item list with credits, tokens and share. */\nexport function UsageProportionBar({\n items,\n metric,\n labels,\n}: {\n items: UsageShare[]\n metric: UsageMetric\n labels?: Partial<UsageProportionBarLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_PROPORTION_BAR_LABELS, ...labels }), [labels])\n const total = items.reduce((sum, item) => sum + item.amount, 0)\n if (!items.length || total === 0) return null\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex h-3 w-full overflow-hidden rounded-full bg-muted\">\n {items.map((item, i) => {\n const pct = (item.amount / total) * 100\n if (pct < 0.5) return null\n return (\n <div\n key={item.label}\n className={cn('h-full first:rounded-l-full last:rounded-r-full', styleAt(i).bg)}\n style={{ width: `${pct}%` }}\n title={`${item.label}: ${metric === 'tokens' ? l.tokens(item.tokens) : l.credits(item.credits)}`}\n />\n )\n })}\n </div>\n <div className=\"space-y-1.5\">\n {items.map((item, i) => (\n <div key={item.label} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn('inline-block h-2.5 w-2.5 flex-shrink-0 rounded-full', styleAt(i).bg)}\n />\n <span className=\"truncate\">{item.label}</span>\n </div>\n <div className=\"ml-2 flex flex-shrink-0 items-center gap-2 tabular-nums\">\n <span\n className={cn(\n 'flex items-center gap-0.5',\n metric === 'credits'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {item.credits}\n <BadgeCent className=\"h-3 w-3 text-yellow-500\" />\n </span>\n <span\n className={\n metric === 'tokens'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n }\n >\n {l.tokensShort(item.tokens)}\n </span>\n <span className=\"w-8 text-right text-muted-foreground/40\">\n {((item.amount / total) * 100).toFixed(0)}%\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport interface UsageStat {\n key: string\n value: ReactNode\n label: ReactNode\n}\n\n/** Row of summary tiles (credits, requests, tokens). */\nexport function UsageSummary({ stats }: { stats: UsageStat[] }) {\n return (\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n {stats.map((stat) => (\n <div key={stat.key} className=\"rounded-lg bg-muted p-3\">\n <div className=\"flex items-center justify-center gap-1 text-base font-semibold tabular-nums\">\n {stat.value}\n </div>\n <div className=\"text-sm text-muted-foreground\">{stat.label}</div>\n </div>\n ))}\n </div>\n )\n}\n\n/** Credit coin glyph used beside credit amounts. */\nexport function CreditsGlyph({ className }: { className?: string }) {\n return <BadgeCent className={cn('h-4 w-4 text-yellow-500', className)} />\n}\n\nexport interface UsageToggleProps<T extends string> {\n value: T\n onChange: (value: T) => void\n options: { value: T; label: string }[]\n ariaLabel: string\n /** `fill`: options share the row (breakdown); `compact`: small pill (period, metric). */\n size?: 'compact' | 'fill'\n}\n\n/** Small single-choice toggle for the usage panel (hidden when printing). */\nexport function UsageToggle<T extends string>({\n value,\n onChange,\n options,\n ariaLabel,\n size = 'compact',\n}: UsageToggleProps<T>) {\n return (\n <RadioGroupPrimitive.Root\n aria-label={ariaLabel}\n value={value}\n onValueChange={(next) => onChange(next as T)}\n orientation=\"horizontal\"\n className=\"flex gap-1 rounded-md border border-border bg-background p-0.5 print:hidden\"\n >\n {options.map((option) => (\n <RadioGroupPrimitive.Item\n key={option.value}\n value={option.value}\n className={cn(\n 'rounded-md px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:py-2.5',\n size === 'fill' && 'flex-1 px-2 py-1.5',\n option.value === value\n ? 'bg-accent font-medium text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {option.label}\n </RadioGroupPrimitive.Item>\n ))}\n </RadioGroupPrimitive.Root>\n )\n}\n\nexport interface UsagePanelProps {\n state: 'loading' | 'error' | 'empty' | 'ready'\n /** Period toggle on the left of the top row. */\n period: ReactNode\n /** Icon buttons on the right of the top row (download, print). */\n actions?: ReactNode\n /** The period's date span, shown under the top row. */\n dateRange?: string | null\n /** Shown for `empty`, e.g. \"No usage yet this month.\" */\n emptyMessage?: string\n errorMessage?: string\n labels?: Partial<UsagePanelLabels>\n /** Rendered for `ready`. */\n children?: ReactNode\n}\n\n/** Frame of the usage breakdown: toolbar row, then loading / error / empty / content. */\nexport function UsagePanel({\n state,\n period,\n actions,\n dateRange,\n emptyMessage,\n errorMessage,\n labels,\n children,\n}: UsagePanelProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_PANEL_LABELS, ...labels }), [labels])\n return (\n <div className=\"space-y-4\" data-slot=\"usage-panel\">\n <div className=\"flex items-center justify-between gap-2\">\n {period}\n <div className=\"flex items-center gap-1\">{actions}</div>\n </div>\n {dateRange && <p className=\"text-xs text-muted-foreground\">{dateRange}</p>}\n\n {state === 'loading' && (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n {state === 'error' && (\n <p className=\"py-4 text-sm text-destructive\">{errorMessage ?? l.error}</p>\n )}\n {state === 'empty' && (\n <div className=\"flex flex-col items-center justify-center gap-2 py-10 text-center\">\n <ChartNoAxesColumn className=\"h-8 w-8 text-muted-foreground/40\" />\n <p className=\"text-sm text-muted-foreground\">{emptyMessage ?? l.empty}</p>\n </div>\n )}\n {state === 'ready' && <div className=\"space-y-4\">{children}</div>}\n </div>\n )\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport { Check, ChevronDown, ChevronRight, FileText, Loader2, X } from 'lucide-react'\nimport {\n Badge,\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the receipts dialog. */\nexport interface InvoicesDialogLabels {\n title: (projectName: string) => string\n description: (projectName: string) => string\n noReceipts: string\n paid: string\n}\n\nexport const DEFAULT_INVOICES_DIALOG_LABELS: InvoicesDialogLabels = {\n title: (projectName) => `Receipts — ${projectName}`,\n description: (projectName) => `List of receipts for project ${projectName}`,\n noReceipts: 'No receipts yet.',\n paid: 'paid',\n}\n\n/** Every fixed string of the daily-cap field. */\nexport interface DailyCapFieldLabels {\n noLimit: string\n ariaLabel: string\n unit: string\n save: string\n}\n\nexport const DEFAULT_DAILY_CAP_FIELD_LABELS: DailyCapFieldLabels = {\n noLimit: 'No limit',\n ariaLabel: 'Daily credit limit per collaborator',\n unit: 'credits / user / day',\n save: 'Save',\n}\n\n/** Every fixed string of the member project row. */\nexport interface MemberProjectRowLabels {\n noDailyLimit: string\n}\n\nexport const DEFAULT_MEMBER_PROJECT_ROW_LABELS: MemberProjectRowLabels = {\n noDailyLimit: 'No daily limit',\n}\n\n/** Every fixed string of the inline name editor. */\nexport interface InlineNameEditorLabels {\n saveName: string\n cancelRename: string\n}\n\nexport const DEFAULT_INLINE_NAME_EDITOR_LABELS: InlineNameEditorLabels = {\n saveName: 'Save name',\n cancelRename: 'Cancel rename',\n}\n\n/** Every fixed string of the project card. */\nexport interface ProjectCardViewLabels {\n collapseProject: string\n expandProject: string\n}\n\nexport const DEFAULT_PROJECT_CARD_VIEW_LABELS: ProjectCardViewLabels = {\n collapseProject: 'Collapse project',\n expandProject: 'Expand project',\n}\n\nexport interface InvoiceRowView {\n key: string\n date: string\n /** Formatted amount, e.g. \"$50.00\". */\n amount: string\n status: string\n isPaid: boolean\n /** Receipt (paid) or invoice (unpaid) link; omitted when none exists. */\n href?: string\n linkLabel?: string\n}\n\nexport interface InvoicesDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n projectName: string\n isLoading: boolean\n invoices: InvoiceRowView[]\n labels?: Partial<InvoicesDialogLabels>\n}\n\n/** Receipts of a project: date, amount, status and a link to each. */\nexport function InvoicesDialog({\n open,\n onOpenChange,\n projectName,\n isLoading,\n invoices,\n labels,\n}: InvoicesDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_INVOICES_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent presentation=\"sheet\" className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>{l.title(projectName)}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description(projectName)}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-1\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n )}\n {!isLoading && invoices.length === 0 && (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noReceipts}</p>\n )}\n {!isLoading &&\n invoices.map((invoice) => (\n <div\n key={invoice.key}\n className=\"flex items-center justify-between border-b py-2 text-sm last:border-0\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"tabular-nums text-muted-foreground\">{invoice.date}</span>\n <span className=\"font-medium tabular-nums\">{invoice.amount}</span>\n <Badge\n variant=\"outline\"\n className={cn(\n 'h-4 px-1.5 py-0 text-sm',\n invoice.isPaid && 'border-green-border text-green-text'\n )}\n >\n {invoice.isPaid ? l.paid : invoice.status}\n </Badge>\n </div>\n {invoice.href && (\n <a\n href={invoice.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\"\n >\n {invoice.linkLabel} <FileText className=\"h-3 w-3\" />\n </a>\n )}\n </div>\n ))}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DailyCapFieldProps {\n value: string\n onChange: (value: string) => void\n onSave: () => void\n canSave: boolean\n isSaving?: boolean\n labels?: Partial<DailyCapFieldLabels>\n}\n\n/** Per-collaborator daily credit cap input; Enter or Save commits, empty means no limit. */\nexport function DailyCapField({\n value,\n onChange,\n onSave,\n canSave,\n isSaving,\n labels,\n}: DailyCapFieldProps) {\n const l = useMemo(() => ({ ...DEFAULT_DAILY_CAP_FIELD_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <Input\n type=\"number\"\n min={0}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n }}\n placeholder={l.noLimit}\n className=\"h-9 w-40\"\n aria-label={l.ariaLabel}\n />\n <span className=\"text-sm text-muted-foreground\">{l.unit}</span>\n <Button size=\"sm\" className=\"h-9 px-4\" disabled={!canSave || isSaving} onClick={onSave}>\n {l.save}\n </Button>\n </div>\n )\n}\n\nexport interface MemberProjectRowProps {\n icon: ReactNode\n name: string\n /** Owner avatar. */\n owner?: ReactNode\n /** The caller's daily allowance in this project; `null` means no limit. */\n allowance: { text: string; pct: number } | null\n labels?: Partial<MemberProjectRowLabels>\n}\n\n/** Slim row for a project the user belongs to but does not own. */\nexport function MemberProjectRow({ icon, name, owner, allowance, labels }: MemberProjectRowProps) {\n const l = useMemo(() => ({ ...DEFAULT_MEMBER_PROJECT_ROW_LABELS, ...labels }), [labels])\n const barColor =\n allowance && allowance.pct >= 100\n ? 'bg-red-500'\n : allowance && allowance.pct >= 90\n ? 'bg-yellow-500'\n : 'bg-green-500'\n return (\n <div className=\"flex items-center gap-3 rounded-lg bg-muted p-3\">\n <span className=\"flex-shrink-0 text-muted-foreground\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{name}</span>\n {owner}\n </div>\n </div>\n {allowance === null ? (\n <span className=\"flex-shrink-0 text-sm text-muted-foreground\">{l.noDailyLimit}</span>\n ) : (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-0.5 text-sm tabular-nums\">\n <span className=\"text-muted-foreground\">{allowance.text}</span>\n <span className=\"h-1 w-24 overflow-hidden rounded-full bg-background\">\n <span\n className={cn('block h-full rounded-full', barColor)}\n style={{ width: `${allowance.pct}%` }}\n />\n </span>\n </div>\n )}\n </div>\n )\n}\n\nexport interface InlineNameEditorProps {\n value: string\n onChange: (value: string) => void\n onSave: () => void\n onCancel: () => void\n labels?: Partial<InlineNameEditorLabels>\n}\n\n/** In-row rename: input with confirm and cancel buttons (Enter saves, Escape cancels). */\nexport function InlineNameEditor({\n value,\n onChange,\n onSave,\n onCancel,\n labels,\n}: InlineNameEditorProps) {\n const l = useMemo(() => ({ ...DEFAULT_INLINE_NAME_EDITOR_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-1\">\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-7 text-sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n if (e.key === 'Escape') onCancel()\n }}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={l.saveName}\n onClick={onSave}\n >\n <Check className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n aria-label={l.cancelRename}\n onClick={onCancel}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n )\n}\n\nexport interface ProjectCardViewProps {\n expanded: boolean\n onToggleExpanded: () => void\n /** Ref to the header row (for scroll-into-view). */\n rowRef?: Ref<HTMLDivElement>\n /** Project icon, tinted by billing state. */\n icon: ReactNode\n /** Name + owner, or the inline editor. */\n identity: ReactNode\n /** Rename / delete buttons. */\n actions?: ReactNode\n /** Plan badge. */\n badge?: ReactNode\n /** Upgrade / change plan / invoices buttons. */\n buttons?: ReactNode\n /** Inline quota summary. */\n summary?: ReactNode\n /** Shown when expanded. */\n children?: ReactNode\n /** Dialogs owned by the card (rendered after the content). */\n overlays?: ReactNode\n labels?: Partial<ProjectCardViewLabels>\n}\n\n/** Collapsible project card: header row of slots, expandable detail underneath. */\nexport function ProjectCardView({\n expanded,\n onToggleExpanded,\n rowRef,\n icon,\n identity,\n actions,\n badge,\n buttons,\n summary,\n children,\n overlays,\n labels,\n}: ProjectCardViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROJECT_CARD_VIEW_LABELS, ...labels }), [labels])\n return (\n <div\n data-slot=\"project-card\"\n className={cn('rounded-lg bg-muted transition-colors', expanded && 'ring-1 ring-primary/40')}\n >\n <div\n ref={rowRef}\n className={cn(\n 'flex items-center gap-2 p-3 transition-colors',\n expanded ? 'bg-blue-bg/60' : 'hover:bg-muted/50'\n )}\n >\n {icon}\n {identity}\n {actions}\n {badge}\n {buttons}\n <div className=\"flex-1\" />\n {summary}\n <button\n type=\"button\"\n onClick={onToggleExpanded}\n aria-expanded={expanded}\n aria-label={expanded ? l.collapseProject : l.expandProject}\n className=\"flex-shrink-0 rounded p-1 hover:bg-muted pointer-coarse:p-3\"\n >\n {expanded ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n {expanded && <div className=\"space-y-4 border-t px-4 py-3\">{children}</div>}\n {overlays}\n </div>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { Check, Clock, Infinity as InfinityIcon, Mail, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the email-this-workspace dialog. */\nexport interface EmailWorkspaceDialogLabels {\n title: string\n description: string\n compose: string\n paHintBefore: string\n paHintAfter: string\n checking: string\n noAssistant: string\n authorizedExpires: (ttl: string) => string\n end: string\n authorizePrompt: (ttl?: string) => string\n authorize: string\n authorizing: string\n advanced: string\n alreadyGranted: string\n standingWarning: string\n grant: string\n granting: string\n}\n\nexport const DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS: EmailWorkspaceDialogLabels = {\n title: 'Email this workspace',\n description:\n 'Send documents and questions here from your registered email address — your Assistant reads the email and replies.',\n compose: 'Compose email',\n paHintBefore: 'Don’t need this specific workspace? Send general questions to ',\n paHintAfter: ' instead.',\n checking: 'Checking your Assistant’s access…',\n noAssistant:\n 'You don’t have a default Assistant yet — one is created automatically the first time you email a workspace.',\n authorizedExpires: (ttl) => `Authorized — expires in ${ttl}`,\n end: 'End',\n authorizePrompt: (ttl) =>\n `Authorize your Assistant to act in this workspace${ttl ? ` for ${ttl}` : ''}, so it’s ready as soon as it wakes.`,\n authorize: 'Authorize',\n authorizing: 'Authorizing…',\n advanced: 'Advanced',\n alreadyGranted: 'Your Assistant already has standing access to this workspace.',\n standingWarning:\n 'Standing access never expires and doesn’t need re-authorizing — only use it if you trust the Assistant’s environment long-term.',\n grant: 'Grant standing access',\n granting: 'Granting…',\n}\n\n/** Where the member's Assistant stands for this workspace. */\nexport type EmailAssistantAccess =\n | { kind: 'loading' }\n | { kind: 'none' }\n | { kind: 'session'; expiresIn: string; isEnding: boolean; onEnd: () => void }\n | { kind: 'idle'; defaultTtl?: string; isAuthorizing: boolean; onAuthorize: () => void }\n\nexport interface EmailWorkspaceDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Reply address of the workspace. */\n email: string\n mailtoHref: string\n /** Deployment domain shown in the general-questions hint. */\n paDomain: string\n /** Copy-to-clipboard control, rendered beside the address. */\n copyButton: ReactNode\n /** Members only: the Assistant authorize / standing-access panel. Omit for non-members. */\n access?: EmailAssistantAccess\n /** Standing access (Advanced tier). Only offered once an Assistant exists. */\n standing?: { alreadyGranted: boolean; isGranting: boolean; onGrant: () => void }\n labels?: Partial<EmailWorkspaceDialogLabels>\n}\n\n/** Presentation of the \"Email this workspace\" dialog: address, compose, Assistant access. */\nexport function EmailWorkspaceDialogView({\n open,\n onOpenChange,\n email,\n mailtoHref,\n paDomain,\n copyButton,\n access,\n standing,\n labels,\n}: EmailWorkspaceDialogViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_EMAIL_WORKSPACE_DIALOG_LABELS, ...labels }), [labels])\n const [advancedOpen, setAdvancedOpen] = useState(false)\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"email-workspace-dialog\">\n <DialogHeader className=\"-m-6 mb-4 bg-muted p-6 pb-4\">\n <div className=\"flex items-center gap-3\">\n <Mail className=\"size-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-3 py-2\">\n <code className=\"flex-1 truncate font-mono text-sm\" data-testid=\"email-workspace-address\">\n {email}\n </code>\n {copyButton}\n </div>\n\n <Button asChild data-testid=\"email-workspace-compose-button\">\n <a href={mailtoHref}>\n <Send className=\"mr-1.5 size-4\" />\n {l.compose}\n </a>\n </Button>\n\n <p className=\"text-xs text-muted-foreground\" data-testid=\"email-workspace-pa-hint\">\n {l.paHintBefore}\n <code className=\"font-mono\">pa@{paDomain}</code>\n {l.paHintAfter}\n </p>\n\n {access && (\n <div className=\"space-y-2 rounded-md border border-border bg-muted/30 p-3\">\n {access.kind === 'loading' ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"email-workspace-authorize-loading\"\n >\n {l.checking}\n </p>\n ) : access.kind === 'none' ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"email-workspace-no-assistant\"\n >\n {l.noAssistant}\n </p>\n ) : access.kind === 'session' ? (\n <div\n className=\"flex items-center justify-between gap-3\"\n data-testid=\"email-workspace-active-session\"\n >\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"size-3.5\" />\n {l.authorizedExpires(access.expiresIn)}\n </p>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={access.onEnd}\n disabled={access.isEnding}\n className=\"h-7 shrink-0 gap-1 px-2 text-xs text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid=\"email-workspace-end-session-button\"\n >\n <X className=\"size-3\" />\n {l.end}\n </Button>\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-xs text-muted-foreground\">\n {l.authorizePrompt(access.defaultTtl)}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={access.onAuthorize}\n disabled={access.isAuthorizing}\n className=\"shrink-0 gap-1.5\"\n data-testid=\"email-workspace-authorize-button\"\n >\n <Clock className=\"size-3.5\" />\n {access.isAuthorizing ? l.authorizing : l.authorize}\n </Button>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((o) => !o)}\n aria-expanded={advancedOpen}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid=\"email-workspace-advanced-toggle\"\n >\n {l.advanced}\n </button>\n {advancedOpen &&\n standing &&\n (standing.alreadyGranted ? (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Check className=\"size-3.5 text-green-solid\" />\n {l.alreadyGranted}\n </p>\n ) : (\n <>\n <p className=\"text-xs text-muted-foreground\">{l.standingWarning}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={standing.onGrant}\n disabled={standing.isGranting}\n className=\"gap-1.5\"\n data-testid=\"email-workspace-grant-access-button\"\n >\n <InfinityIcon className=\"size-3.5\" />\n {standing.isGranting ? l.granting : l.grant}\n </Button>\n </>\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ComponentProps, MouseEvent, ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ArrowRight } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Progress,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection, ModalSectionTitle } from './ModalScaffold'\n\n// ---------------------------------------------------------------------------\n// One-line notices and small layout slots shared by the plan flows\n// ---------------------------------------------------------------------------\n\n/** A single line of status text (loading, empty, error) inside a plan flow. */\nexport function PlanNotice({\n tone = 'muted',\n className,\n testId,\n children,\n}: {\n tone?: 'muted' | 'error'\n className?: string\n testId?: string\n children: ReactNode\n}) {\n return (\n <p\n data-slot=\"plan-notice\"\n data-testid={testId}\n className={cn(\n 'text-sm',\n tone === 'error' ? 'text-destructive' : 'text-muted-foreground',\n className\n )}\n >\n {children}\n </p>\n )\n}\n\n/** Vertical rhythm of a plan flow's sections. */\nexport function PlanStack({\n gap = 3,\n testId,\n className,\n children,\n}: {\n gap?: 2 | 3 | 4 | 5\n testId?: string\n className?: string\n children: ReactNode\n}) {\n const GAP = { 2: 'space-y-2', 3: 'space-y-3', 4: 'space-y-4', 5: 'space-y-5 pt-2' } as const\n return (\n <div data-slot=\"plan-stack\" data-testid={testId} className={cn(GAP[gap], className)}>\n {children}\n </div>\n )\n}\n\n/** \"Free -> Pro x2\": the transition the plan picker is about to make. */\nexport function PlanTransition({ from, to }: { from: string; to: string }) {\n return (\n <div data-slot=\"plan-transition\" className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-xs font-semibold text-muted-foreground\">\n {from}\n </span>\n <ArrowRight className=\"size-4 text-muted-foreground\" aria-hidden />\n <span className=\"inline-flex items-center rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-white\">\n {to}\n </span>\n </div>\n )\n}\n\n/** Title + explainer on the left, billing toggle on the right; the toggle wraps when narrow. */\nexport function PlanPickerHeader({\n title,\n info,\n infoPlacement = 'title',\n toggle,\n className,\n}: {\n title: ReactNode\n info?: ReactNode\n /** `title`: the info trigger sits beside the title; `toggle`: grouped with the toggle. */\n infoPlacement?: 'title' | 'toggle'\n toggle?: ReactNode\n className?: string\n}) {\n return (\n <div\n data-slot=\"plan-picker-header\"\n className={cn('flex flex-wrap items-center justify-between gap-x-3 gap-y-2', className)}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-semibold\">{title}</span>\n {infoPlacement === 'title' && info}\n </div>\n {infoPlacement === 'toggle' ? (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n {info}\n {toggle}\n </div>\n ) : (\n toggle\n )}\n </div>\n )\n}\n\n/** Tinted card holding the tier picker (header + quantity grid). */\nexport function PlanPickerCard({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"plan-picker-card\" className=\"space-y-4 rounded-lg bg-muted p-4\">\n {children}\n </div>\n )\n}\n\n/** Decline on the left, commit on the right; stacked reversed so commit leads on narrow screens. */\nexport function PlanActionRow({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"plan-action-row\" className=\"flex flex-col-reverse gap-2 @xl:flex-row\">\n {children}\n </div>\n )\n}\n\n/** Full-width button of a plan flow (`fill` makes it share a row equally on wide screens). */\nexport function PlanActionButton({\n tone = 'primary',\n fill,\n ...props\n}: Omit<ComponentProps<typeof Button>, 'variant'> & {\n tone?: 'primary' | 'muted'\n fill?: boolean\n}) {\n return (\n <Button\n data-slot=\"plan-action-button\"\n variant={tone === 'muted' ? 'ghost' : 'default'}\n {...props}\n className={cn(\n 'w-full',\n fill && 'sm:flex-1',\n tone === 'muted' && 'text-muted-foreground',\n props.className\n )}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Subscription status\n// ---------------------------------------------------------------------------\n\nexport interface SubscriptionMeterView {\n key: string\n icon: LucideIcon\n label: string\n value: string\n pct: number\n}\n\nexport interface SubscriptionStatusViewProps {\n /** Formatted reset date (\"Aug 31\"); falsy when unknown. */\n resetDate?: string | null\n isCanceling: boolean\n meters: SubscriptionMeterView[]\n /** Prefix of each meter's test id (`<prefix>-<key>`); defaults to `project-quota`. */\n testIdPrefix?: string\n labels?: Partial<SubscriptionStatusLabels>\n}\n\nexport interface SubscriptionStatusLabels {\n creditsReset: (date: string) => string\n cancelsAtPeriodEnd: string\n cancelsAtEndOfBillingPeriod: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_STATUS_LABELS: SubscriptionStatusLabels = {\n creditsReset: (date) => `Credits reset ${date}`,\n cancelsAtPeriodEnd: '· Cancels at period end',\n cancelsAtEndOfBillingPeriod: 'Cancels at end of billing period',\n}\n\n/** Expanded project status: reset date, canceling notice, stacked quota meters. */\nexport function SubscriptionStatusView({\n resetDate,\n isCanceling,\n meters,\n testIdPrefix,\n labels,\n}: SubscriptionStatusViewProps) {\n const l = { ...DEFAULT_SUBSCRIPTION_STATUS_LABELS, ...labels }\n return (\n <div data-slot=\"subscription-status\" className=\"space-y-3\">\n {resetDate && (\n <p className=\"text-sm text-muted-foreground\">\n {l.creditsReset(resetDate)}\n {isCanceling && <span className=\"ml-2 text-yellow-text\">{l.cancelsAtPeriodEnd}</span>}\n </p>\n )}\n {!resetDate && isCanceling && (\n <p className=\"text-sm text-yellow-text\">{l.cancelsAtEndOfBillingPeriod}</p>\n )}\n <div className=\"space-y-3\">\n {meters.map((m) => (\n <UsageMeter\n key={m.key}\n icon={m.icon}\n label={m.label}\n value={m.value}\n pct={m.pct}\n testId={prefixedTestId(testIdPrefix, m.key, { testId: `project-quota-${m.key}` })}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Dialogs\n// ---------------------------------------------------------------------------\n\nexport interface PlanDialogFrameProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n description: ReactNode\n /** Keep the description for screen readers only. */\n isDescriptionHidden?: boolean\n /** Name of the project the plan applies to, right of the title. */\n projectName?: string\n /** Test id of the project name; defaults to `change-plan-project`. */\n projectTestId?: string\n children?: ReactNode\n labels?: Partial<{ project: string }>\n}\n\n/** The one plan-picker dialog: offer title + reason, the project it applies to, then the flow. */\nexport function PlanDialogFrame({\n open,\n onOpenChange,\n title,\n description,\n isDescriptionHidden,\n projectName,\n projectTestId,\n children,\n labels,\n}: PlanDialogFrameProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-5xl\">\n {/* pr-8 clears the close button. */}\n <DialogHeader className=\"flex-row items-start justify-between gap-3 space-y-0 pr-8\">\n <div className=\"space-y-1.5\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className={isDescriptionHidden ? 'sr-only' : undefined}>\n {description}\n </DialogDescription>\n </div>\n {projectName !== undefined && (\n <span\n className=\"shrink-0 text-sm text-muted-foreground\"\n data-testid={testIdOr(projectTestId, { testId: 'change-plan-project' })}\n >\n {labels?.project ?? 'Project:'}{' '}\n <span className=\"font-semibold text-foreground\">{projectName}</span>\n </span>\n )}\n </DialogHeader>\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface CheckoutDialogFrameProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Stripe is not available: show the explanation instead of the checkout. */\n isUnavailable?: boolean\n isLoading?: boolean\n hasError?: boolean\n /** The embedded payment form (host-owned: needs the payment provider). */\n children?: ReactNode\n labels?: Partial<CheckoutDialogLabels>\n}\n\nexport interface CheckoutDialogLabels {\n unavailableTitle: string\n unavailableDescription: string\n title: string\n description: string\n loading: string\n error: string\n}\n\nexport const DEFAULT_CHECKOUT_DIALOG_LABELS: CheckoutDialogLabels = {\n unavailableTitle: 'Stripe Not Configured',\n unavailableDescription: 'Stripe checkout is not available. Please contact support.',\n title: 'Complete Your Purchase',\n description: 'Enter your payment details to complete your Pro subscription',\n loading: 'Loading checkout...',\n error: 'Failed to load checkout. Please try again.',\n}\n\n/**\n * Checkout dialog chrome. Flex column capped at 90vh: the header is pinned and ONLY the checkout\n * region scrolls, so the embedded payment iframe (often taller than the viewport) never clips its\n * pay button. Outside click and Escape are blocked: a half-paid checkout must be closed on purpose.\n */\nexport function CheckoutDialogFrame({\n open,\n onOpenChange,\n isUnavailable,\n isLoading,\n hasError,\n children,\n labels,\n}: CheckoutDialogFrameProps) {\n const l = { ...DEFAULT_CHECKOUT_DIALOG_LABELS, ...labels }\n if (isUnavailable) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{l.unavailableTitle}</DialogTitle>\n <DialogDescription>{l.unavailableDescription}</DialogDescription>\n </DialogHeader>\n </DialogContent>\n </Dialog>\n )\n }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-[calc(100dvh-2rem)] max-w-2xl flex-col gap-0 overflow-hidden p-0\"\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => e.preventDefault()}\n >\n <DialogHeader className=\"flex-shrink-0 px-6 pb-3 pt-6\">\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{l.description}</DialogDescription>\n </DialogHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-6 pb-6\">\n {isLoading && <div className=\"py-8 text-center text-muted-foreground\">{l.loading}</div>}\n {hasError && <div className=\"py-8 text-center text-destructive\">{l.error}</div>}\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface QuotaExceededDialogViewProps {\n open: boolean\n onClose: () => void\n onUpgrade: () => void\n message: string\n /** Absent while the dialog closes (no usage to show). */\n usage?: {\n percent: number\n /** \"1,200 credits of 2,000 credits\". */\n readout: string\n projectId?: string | null\n }\n labels?: Partial<QuotaExceededDialogLabels>\n}\n\nexport interface QuotaExceededDialogLabels {\n title: string\n projectUsage: string\n progress: string\n project: string\n close: string\n upgrade: string\n}\n\nexport const DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS: QuotaExceededDialogLabels = {\n title: 'AI quota exceeded',\n projectUsage: 'Project usage',\n progress: 'Project AI spend usage',\n project: 'Project:',\n close: 'Close',\n upgrade: 'Upgrade',\n}\n\n/** Shown when a project's AI budget is exhausted: how much was used, then close or upgrade. */\nexport function QuotaExceededDialogView({\n open,\n onClose,\n onUpgrade,\n message,\n usage,\n labels,\n}: QuotaExceededDialogViewProps) {\n const l = { ...DEFAULT_QUOTA_EXCEEDED_DIALOG_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"max-w-md\" data-testid=\"quota-exceeded-modal\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{message}</DialogDescription>\n </DialogHeader>\n {usage && (\n <ModalSection className=\"space-y-2\">\n <ModalSectionTitle>{l.projectUsage}</ModalSectionTitle>\n <Progress value={usage.percent} aria-label={l.progress} />\n <div\n className=\"flex items-center justify-between text-sm text-muted-foreground\"\n data-testid=\"quota-usage-readout\"\n >\n <span>{usage.readout}</span>\n <span>{usage.percent}%</span>\n </div>\n {usage.projectId && (\n <div className=\"text-sm text-muted-foreground\">\n {l.project} {usage.projectId}\n </div>\n )}\n </ModalSection>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} data-testid=\"quota-close-button\">\n {l.close}\n </Button>\n <Button onClick={onUpgrade} data-testid=\"quota-upgrade-button\">\n {l.upgrade}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Welcome project picker\n// ---------------------------------------------------------------------------\n\nexport interface WelcomeProjectPickerProps {\n value: string\n options: { id: string; name: string }[]\n onChange: (id: string) => void\n testId?: string\n}\n\n/** Compact project switcher in the welcome dialog's quota header. */\nexport function WelcomeProjectPicker({\n value,\n options,\n onChange,\n testId = 'welcome-modal-project-select',\n}: WelcomeProjectPickerProps) {\n return (\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger\n className=\"h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11\"\n data-testid={testId}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id}>\n {o.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Project list (subscription section) and usage section slots\n// ---------------------------------------------------------------------------\n\nexport interface SubscriptionSectionViewProps {\n intro: ReactNode\n isLoading?: boolean\n isEmpty?: boolean\n /** Project groups (use {@link ProjectGroup}). */\n children?: ReactNode\n labels?: Partial<SubscriptionSectionLabels>\n}\n\nexport interface SubscriptionSectionLabels {\n loading: string\n empty: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_SECTION_LABELS: SubscriptionSectionLabels = {\n loading: 'Loading projects...',\n empty: 'No projects yet — create one above.',\n}\n\n/** The projects list of settings: intro line, then groups, loading or empty state. */\nexport function SubscriptionSectionView({\n intro,\n isLoading,\n isEmpty,\n children,\n labels,\n}: SubscriptionSectionViewProps) {\n const l = { ...DEFAULT_SUBSCRIPTION_SECTION_LABELS, ...labels }\n if (isLoading) {\n return <div className=\"py-4 text-sm text-muted-foreground\">{l.loading}</div>\n }\n return (\n <div data-slot=\"subscription-section\" className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">{intro}</p>\n {isEmpty ? (\n <div className=\"rounded-lg bg-muted py-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">{l.empty}</p>\n </div>\n ) : (\n children\n )}\n </div>\n )\n}\n\n/** A stack of project cards. */\nexport function ProjectGroup({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-group\" className=\"space-y-2\">\n {children}\n </div>\n )\n}\n\n/** Plan picker area inside an expanded project card. */\nexport function ProjectPlanPicker({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-plan-picker\" className=\"border-b pb-3\">\n {children}\n </div>\n )\n}\n\n/** Project name in a card row. */\nexport function ProjectNameLabel({ children }: { children: ReactNode }) {\n return <span className=\"truncate text-sm font-medium\">{children}</span>\n}\n\n/** Row of icon actions on a project card. */\nexport function ProjectRowActions({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"project-row-actions\" className=\"flex flex-shrink-0 items-center gap-0.5\">\n {children}\n </div>\n )\n}\n\nexport interface RowIconActionProps {\n label: string\n /** Tooltip text; defaults to `label`. */\n tooltip?: string\n icon: ReactNode\n tone?: 'primary' | 'destructive'\n disabled?: boolean\n onClick?: () => void\n}\n\n/** Small icon action with a tooltip (rename, delete). 44px on touch. */\nexport function RowIconAction({\n label,\n tooltip,\n icon,\n tone = 'primary',\n disabled,\n onClick,\n}: RowIconActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'size-6 text-muted-foreground/50 pointer-coarse:size-11',\n tone === 'destructive' ? 'hover:text-destructive' : 'hover:text-primary'\n )}\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n >\n {icon}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{tooltip ?? label}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** Compact outline button with a leading icon on a project card row. */\nexport function RowButton({\n icon,\n children,\n onClick,\n}: {\n icon: ReactNode\n children: ReactNode\n onClick: (e: MouseEvent) => void\n}) {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1 px-2.5 text-sm pointer-coarse:h-11\"\n onClick={onClick}\n >\n {icon}\n {children}\n </Button>\n )\n}\n\n/** Icon-only tooltip button of the usage panel's action slot (download, print). */\nexport function UsageActionButton({\n label,\n icon,\n onClick,\n}: {\n label: string\n icon: ReactNode\n onClick: () => void\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n aria-label={label}\n onClick={onClick}\n >\n {icon}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** \"(12% of quota)\" after the credits stat label. */\nexport function UsageQuotaHint({ children }: { children: ReactNode }) {\n return <span className=\"ml-1 tabular-nums\">{children}</span>\n}\n\n/** Titled block of the usage panel (chart, breakdown) with an optional control on the right. */\nexport function UsageSection({\n title,\n action,\n children,\n footer,\n gap = 'sm',\n}: {\n title: ReactNode\n action?: ReactNode\n children: ReactNode\n /** Below the content, e.g. a chart legend. */\n footer?: ReactNode\n gap?: 'sm' | 'md'\n}) {\n return (\n <div data-slot=\"usage-section\" className={gap === 'md' ? 'space-y-3' : undefined}>\n <div className={cn('flex items-center justify-between', gap === 'sm' && 'mb-2')}>\n <div className=\"text-sm font-medium text-muted-foreground\">{title}</div>\n {action}\n </div>\n {children}\n {footer && <div className=\"mt-2\">{footer}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, Check, Copy, FileText, LogOut, RefreshCw } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { ModalHeader, ModalSection } from './ModalScaffold'\n\n/** Every fixed string of the crash dialog. */\nexport interface ErrorDialogLabels {\n title: string\n srDescription: string\n reportHint: string\n refreshHint: string\n hideDetails: string\n viewDetails: string\n toggleDetailsAria: string\n copyAria: string\n copy: string\n copied: string\n refreshSession: string\n logout: string\n}\n\nexport const DEFAULT_ERROR_DIALOG_LABELS: ErrorDialogLabels = {\n title: 'Something Went Wrong',\n srDescription: 'Error dialog',\n reportHint:\n 'Please click below to report the error to our support team if you have not done so already.',\n refreshHint:\n 'Clicking Refresh Session will attempt to refresh your session, which may help resolve the error.',\n hideDetails: 'Hide Details',\n viewDetails: 'View Details',\n toggleDetailsAria: 'Toggle error details',\n copyAria: 'Copy error details',\n copy: 'Copy error',\n copied: 'Copied',\n refreshSession: 'Refresh Session',\n logout: 'Logout',\n}\n\n/** Developer-only error report: collapsible text and a copy button. */\nexport interface ErrorDialogDetails {\n text: string\n isShown: boolean\n isCopied: boolean\n onToggle: () => void\n onCopy: () => void\n}\n\nexport interface ErrorDialogViewProps {\n /** Present only for developers; hides the report entirely otherwise. */\n details?: ErrorDialogDetails\n /** \"Report error\" control (it owns its own submit flow). */\n report: ReactNode\n onRefresh: () => void\n onLogout: () => void\n labels?: Partial<ErrorDialogLabels>\n}\n\n/** Non-dismissible crash dialog: explanation, optional report, report / refresh / logout. */\nexport function ErrorDialogView({\n details,\n report,\n onRefresh,\n onLogout,\n labels,\n}: ErrorDialogViewProps) {\n const l = { ...DEFAULT_ERROR_DIALOG_LABELS, ...labels }\n return (\n <Dialog open onOpenChange={() => {}}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0\"\n data-testid=\"error-boundary-modal\"\n >\n <ModalHeader>\n <DialogTitle>\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"text-red-text\" size={24} />\n <span>{l.title}</span>\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{l.srDescription}</DialogDescription>\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">\n <ModalSection data-testid=\"error-boundary\">\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.reportHint}</p>\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.refreshHint}</p>\n\n {details?.isShown && (\n <div className=\"mb-4 rounded border border-border bg-background p-3\">\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap font-mono text-sm\">\n {details.text}\n </pre>\n </div>\n )}\n\n <div className=\"flex w-full flex-col gap-2\">\n {details && (\n <div className=\"flex w-full gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={details.onToggle}\n aria-label={l.toggleDetailsAria}\n data-testid=\"error-boundary-view-details\"\n >\n <FileText className=\"mr-2 size-4\" />\n {details.isShown ? l.hideDetails : l.viewDetails}\n </Button>\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={details.onCopy}\n aria-label={l.copyAria}\n data-testid=\"error-boundary-copy-details\"\n >\n {details.isCopied ? (\n <Check className=\"mr-2 size-4 text-green-text\" />\n ) : (\n <Copy className=\"mr-2 size-4\" />\n )}\n {details.isCopied ? l.copied : l.copy}\n </Button>\n </div>\n )}\n {report}\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={onRefresh}\n aria-label=\"Refresh session\"\n >\n <RefreshCw className=\"mr-2 size-4\" />\n {l.refreshSession}\n </Button>\n <Button variant=\"outline\" className=\"w-full\" onClick={onLogout} aria-label=\"Logout\">\n <LogOut className=\"mr-2 size-4\" />\n {l.logout}\n </Button>\n </div>\n </ModalSection>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"]}