@arbidocs/blocks 0.5.62 → 0.5.63
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.
- package/README.md +7 -0
- package/dist/{ConnectedCallDock-CRECGH7K.js → ConnectedCallDock-DEAEFUUD.js} +5 -5
- package/dist/{ConnectedCallDock-CRECGH7K.js.map → ConnectedCallDock-DEAEFUUD.js.map} +1 -1
- package/dist/{ConnectedCallDock-RGDNX76B.cjs → ConnectedCallDock-GJAGY75U.cjs} +14 -14
- package/dist/{ConnectedCallDock-RGDNX76B.cjs.map → ConnectedCallDock-GJAGY75U.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-Z2M6QRJJ.js → ConnectedCallRoom-DI7UYRHE.js} +5 -5
- package/dist/{ConnectedCallRoom-Z2M6QRJJ.js.map → ConnectedCallRoom-DI7UYRHE.js.map} +1 -1
- package/dist/{ConnectedCallRoom-LM7UNH34.cjs → ConnectedCallRoom-KLE2PCMQ.cjs} +6 -6
- package/dist/{ConnectedCallRoom-LM7UNH34.cjs.map → ConnectedCallRoom-KLE2PCMQ.cjs.map} +1 -1
- package/dist/{ConnectedDocumentViewer-ELA7R4RJ.js → ConnectedDocumentViewer-7VKAM6KD.js} +8 -8
- package/dist/{ConnectedDocumentViewer-ELA7R4RJ.js.map → ConnectedDocumentViewer-7VKAM6KD.js.map} +1 -1
- package/dist/{ConnectedDocumentViewer-6SFJWKXN.cjs → ConnectedDocumentViewer-FGQ27H4B.cjs} +9 -9
- package/dist/{ConnectedDocumentViewer-6SFJWKXN.cjs.map → ConnectedDocumentViewer-FGQ27H4B.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-3MCCETF5.js → ConnectedNativeDocxComparison-FPW3BNBN.js} +8 -8
- package/dist/ConnectedNativeDocxComparison-FPW3BNBN.js.map +1 -0
- package/dist/{ConnectedNativeDocxComparison-XZIRCESL.cjs → ConnectedNativeDocxComparison-HJ4FTVH6.cjs} +9 -9
- package/dist/ConnectedNativeDocxComparison-HJ4FTVH6.cjs.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-YE6KA53Q.cjs → ConnectedNativeDocxEditor-PF46MU5H.cjs} +9 -9
- package/dist/ConnectedNativeDocxEditor-PF46MU5H.cjs.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-FGW35PIL.js → ConnectedNativeDocxEditor-S7NJMDSU.js} +7 -7
- package/dist/ConnectedNativeDocxEditor-S7NJMDSU.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-N6YRKWDH.js → ConnectedStreamedWordArtifact-5MHLV24V.js} +8 -8
- package/dist/ConnectedStreamedWordArtifact-5MHLV24V.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-ROPYU3LE.cjs → ConnectedStreamedWordArtifact-LNGW7YGV.cjs} +9 -9
- package/dist/ConnectedStreamedWordArtifact-LNGW7YGV.cjs.map +1 -0
- package/dist/{DocumentReviewCard-SYBCU7NL.js → DocumentReviewCard-5U3TGJZA.js} +7 -7
- package/dist/{DocumentReviewCard-SYBCU7NL.js.map → DocumentReviewCard-5U3TGJZA.js.map} +1 -1
- package/dist/{DocumentReviewCard-YOZMWE33.cjs → DocumentReviewCard-VFNMJSK7.cjs} +7 -7
- package/dist/{DocumentReviewCard-YOZMWE33.cjs.map → DocumentReviewCard-VFNMJSK7.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-4DGONK5A.cjs → WorkspaceTableView-DHMCJRC6.cjs} +7 -7
- package/dist/{WorkspaceTableView-4DGONK5A.cjs.map → WorkspaceTableView-DHMCJRC6.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-ZCUYOMSL.js → WorkspaceTableView-EH5CEB44.js} +5 -5
- package/dist/{WorkspaceTableView-ZCUYOMSL.js.map → WorkspaceTableView-EH5CEB44.js.map} +1 -1
- package/dist/agents/index.cjs +283 -283
- package/dist/agents/index.js +5 -5
- package/dist/agents/tasks/WorkflowsTable.d.ts +2 -1
- package/dist/calls/index.cjs +132 -132
- package/dist/calls/index.js +8 -8
- package/dist/{chunk-57FBBWU2.cjs → chunk-23ACBETH.cjs} +4 -4
- package/dist/{chunk-57FBBWU2.cjs.map → chunk-23ACBETH.cjs.map} +1 -1
- package/dist/{chunk-D34YIJGE.js → chunk-2SLDVFOZ.js} +4 -4
- package/dist/{chunk-D34YIJGE.js.map → chunk-2SLDVFOZ.js.map} +1 -1
- package/dist/{chunk-6SWK5QCT.cjs → chunk-33PWCTND.cjs} +21 -21
- package/dist/{chunk-6SWK5QCT.cjs.map → chunk-33PWCTND.cjs.map} +1 -1
- package/dist/{chunk-LZROSRGK.cjs → chunk-3X37I6QE.cjs} +10 -10
- package/dist/{chunk-LZROSRGK.cjs.map → chunk-3X37I6QE.cjs.map} +1 -1
- package/dist/{chunk-3VCVMW5X.cjs → chunk-4RJPTXUQ.cjs} +5 -5
- package/dist/{chunk-3VCVMW5X.cjs.map → chunk-4RJPTXUQ.cjs.map} +1 -1
- package/dist/{chunk-GWTKLPBJ.js → chunk-5CWBAINB.js} +3 -3
- package/dist/{chunk-GWTKLPBJ.js.map → chunk-5CWBAINB.js.map} +1 -1
- package/dist/{chunk-X5GO56JN.js → chunk-64DMXUYS.js} +3 -3
- package/dist/{chunk-X5GO56JN.js.map → chunk-64DMXUYS.js.map} +1 -1
- package/dist/{chunk-PBIFISDD.js → chunk-7P24MJQN.js} +3 -3
- package/dist/{chunk-PBIFISDD.js.map → chunk-7P24MJQN.js.map} +1 -1
- package/dist/{chunk-CLOYC6QG.cjs → chunk-7YHGLYRJ.cjs} +67 -67
- package/dist/{chunk-CLOYC6QG.cjs.map → chunk-7YHGLYRJ.cjs.map} +1 -1
- package/dist/{chunk-2CH22I7M.js → chunk-AMP7KX7F.js} +3 -3
- package/dist/{chunk-2CH22I7M.js.map → chunk-AMP7KX7F.js.map} +1 -1
- package/dist/{chunk-UQAHDGYH.cjs → chunk-CCSF7RI4.cjs} +5 -5
- package/dist/{chunk-UQAHDGYH.cjs.map → chunk-CCSF7RI4.cjs.map} +1 -1
- package/dist/{chunk-QK546T4C.cjs → chunk-CKNUL4LM.cjs} +3 -3
- package/dist/{chunk-QK546T4C.cjs.map → chunk-CKNUL4LM.cjs.map} +1 -1
- package/dist/{chunk-6USEJFPC.cjs → chunk-COZDIUG7.cjs} +24 -24
- package/dist/chunk-COZDIUG7.cjs.map +1 -0
- package/dist/{chunk-SLX2YIUA.cjs → chunk-EOIJ5JYP.cjs} +4 -4
- package/dist/{chunk-SLX2YIUA.cjs.map → chunk-EOIJ5JYP.cjs.map} +1 -1
- package/dist/{chunk-LMKEDVEB.cjs → chunk-F73EZQT4.cjs} +4 -4
- package/dist/{chunk-LMKEDVEB.cjs.map → chunk-F73EZQT4.cjs.map} +1 -1
- package/dist/{chunk-J55WDXIR.js → chunk-G4OZQFES.js} +3 -3
- package/dist/{chunk-J55WDXIR.js.map → chunk-G4OZQFES.js.map} +1 -1
- package/dist/{chunk-JHLIVEJI.js → chunk-GRDLCRNL.js} +5 -5
- package/dist/{chunk-JHLIVEJI.js.map → chunk-GRDLCRNL.js.map} +1 -1
- package/dist/{chunk-XPB6KMPY.cjs → chunk-HVOPUYAG.cjs} +19 -19
- package/dist/{chunk-XPB6KMPY.cjs.map → chunk-HVOPUYAG.cjs.map} +1 -1
- package/dist/{chunk-TL7SHXBN.js → chunk-IC6SBDYA.js} +3 -3
- package/dist/{chunk-TL7SHXBN.js.map → chunk-IC6SBDYA.js.map} +1 -1
- package/dist/{chunk-QTZ25F5G.js → chunk-IFLFLP4K.js} +5 -5
- package/dist/{chunk-QTZ25F5G.js.map → chunk-IFLFLP4K.js.map} +1 -1
- package/dist/{chunk-C3SLFANS.js → chunk-ITS3USZ3.js} +5 -5
- package/dist/{chunk-C3SLFANS.js.map → chunk-ITS3USZ3.js.map} +1 -1
- package/dist/{chunk-SEH4ZDN5.js → chunk-IUFS3AYQ.js} +7 -7
- package/dist/{chunk-SEH4ZDN5.js.map → chunk-IUFS3AYQ.js.map} +1 -1
- package/dist/{chunk-3IRJ4MTF.cjs → chunk-J25NN3XJ.cjs} +14 -14
- package/dist/{chunk-3IRJ4MTF.cjs.map → chunk-J25NN3XJ.cjs.map} +1 -1
- package/dist/{chunk-TX4CIWH5.cjs → chunk-JBL4PPEE.cjs} +6 -6
- package/dist/{chunk-TX4CIWH5.cjs.map → chunk-JBL4PPEE.cjs.map} +1 -1
- package/dist/{chunk-QUSDMOSF.js → chunk-JWRTUYLC.js} +3 -3
- package/dist/{chunk-QUSDMOSF.js.map → chunk-JWRTUYLC.js.map} +1 -1
- package/dist/{chunk-XGJU2Y5N.cjs → chunk-LBKTTQUR.cjs} +7 -7
- package/dist/{chunk-XGJU2Y5N.cjs.map → chunk-LBKTTQUR.cjs.map} +1 -1
- package/dist/{chunk-SMM32PL6.cjs → chunk-M42XWNS6.cjs} +4 -4
- package/dist/{chunk-SMM32PL6.cjs.map → chunk-M42XWNS6.cjs.map} +1 -1
- package/dist/{chunk-F3VIBHH2.cjs → chunk-MAKTAR7H.cjs} +18 -18
- package/dist/{chunk-F3VIBHH2.cjs.map → chunk-MAKTAR7H.cjs.map} +1 -1
- package/dist/{chunk-2TOM5FT5.js → chunk-NDVLCOWS.js} +12 -12
- package/dist/chunk-NDVLCOWS.js.map +1 -0
- package/dist/{chunk-UJI52BUA.js → chunk-OI4DL2DX.js} +3 -3
- package/dist/{chunk-UJI52BUA.js.map → chunk-OI4DL2DX.js.map} +1 -1
- package/dist/{chunk-7BH55CGS.js → chunk-OZL5ABLF.js} +4 -4
- package/dist/{chunk-7BH55CGS.js.map → chunk-OZL5ABLF.js.map} +1 -1
- package/dist/{chunk-7S3CTSF7.js → chunk-PKDPQS6Z.js} +3 -3
- package/dist/{chunk-7S3CTSF7.js.map → chunk-PKDPQS6Z.js.map} +1 -1
- package/dist/{chunk-LIOT6WLN.js → chunk-PVPGD6QR.js} +3 -3
- package/dist/{chunk-LIOT6WLN.js.map → chunk-PVPGD6QR.js.map} +1 -1
- package/dist/{chunk-HISU5HLW.js → chunk-QUZPQWPX.js} +3 -3
- package/dist/{chunk-HISU5HLW.js.map → chunk-QUZPQWPX.js.map} +1 -1
- package/dist/{chunk-RCBGX4IC.cjs → chunk-RGPKW6KQ.cjs} +4 -4
- package/dist/{chunk-RCBGX4IC.cjs.map → chunk-RGPKW6KQ.cjs.map} +1 -1
- package/dist/{chunk-VFBQBWZI.js → chunk-TAI23FCY.js} +46 -43
- package/dist/chunk-TAI23FCY.js.map +1 -0
- package/dist/{chunk-ONML6J5O.cjs → chunk-UDMII47W.cjs} +8 -8
- package/dist/{chunk-ONML6J5O.cjs.map → chunk-UDMII47W.cjs.map} +1 -1
- package/dist/{chunk-ABEKUV6L.js → chunk-VDXKB4WK.js} +82 -77
- package/dist/chunk-VDXKB4WK.js.map +1 -0
- package/dist/{chunk-MEMWZ72Y.cjs → chunk-WVEFRQSW.cjs} +81 -76
- package/dist/chunk-WVEFRQSW.cjs.map +1 -0
- package/dist/{chunk-PJW2IOPZ.cjs → chunk-X3JJTHQ4.cjs} +51 -51
- package/dist/{chunk-PJW2IOPZ.cjs.map → chunk-X3JJTHQ4.cjs.map} +1 -1
- package/dist/{chunk-4OJGFYB5.cjs → chunk-Y6ZNWC7E.cjs} +47 -44
- package/dist/chunk-Y6ZNWC7E.cjs.map +1 -0
- package/dist/{chunk-B63TSC3W.js → chunk-ZZTH27G7.js} +3 -3
- package/dist/{chunk-B63TSC3W.js.map → chunk-ZZTH27G7.js.map} +1 -1
- package/dist/connect/docx.cjs +13 -13
- package/dist/connect/docx.js +9 -9
- package/dist/connect/index.cjs +694 -694
- package/dist/connect/index.js +36 -36
- package/dist/connect/viewer.cjs +7 -7
- package/dist/connect/viewer.js +6 -6
- package/dist/connection/workflows/ConnectedWorkflowsPage.d.ts +7 -1
- package/dist/dashboards/index.cjs +1 -1
- package/dist/dashboards/index.js +1 -1
- package/dist/document-tools/index.cjs +17 -17
- package/dist/document-tools/index.js +2 -2
- package/dist/embed/index.cjs +13 -13
- package/dist/embed/index.js +10 -10
- package/dist/facts/index.cjs +40 -40
- package/dist/facts/index.js +4 -4
- package/dist/files/index.cjs +1 -1
- package/dist/files/index.js +1 -1
- package/dist/index.cjs +434 -434
- package/dist/index.js +13 -13
- package/dist/settings/index.cjs +156 -156
- package/dist/settings/index.js +2 -2
- package/dist/shell/TabHeader.d.ts +6 -1
- package/dist/shell/index.cjs +3 -3
- package/dist/shell/index.js +1 -1
- package/dist/site/index.cjs +22 -22
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +3 -3
- package/dist/studio/index.js +3 -3
- package/dist/workflow-canvas/index.cjs +64 -40
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +49 -25
- package/dist/workflow-canvas/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedNativeDocxComparison-3MCCETF5.js.map +0 -1
- package/dist/ConnectedNativeDocxComparison-XZIRCESL.cjs.map +0 -1
- package/dist/ConnectedNativeDocxEditor-FGW35PIL.js.map +0 -1
- package/dist/ConnectedNativeDocxEditor-YE6KA53Q.cjs.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-N6YRKWDH.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-ROPYU3LE.cjs.map +0 -1
- package/dist/chunk-2TOM5FT5.js.map +0 -1
- package/dist/chunk-4OJGFYB5.cjs.map +0 -1
- package/dist/chunk-6USEJFPC.cjs.map +0 -1
- package/dist/chunk-ABEKUV6L.js.map +0 -1
- package/dist/chunk-MEMWZ72Y.cjs.map +0 -1
- package/dist/chunk-VFBQBWZI.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/PasswordChangeDialog.tsx","../src/settings/LogoutDialog.tsx","../src/settings/FloatingPanel.tsx","../src/settings/DraggableHeader.tsx","../src/settings/PanelFrame.tsx","../src/settings/ConfigSwitcherBar.tsx","../src/settings/ConversationSettingsParts.tsx","../src/settings/ServerConnectionControls.tsx","../src/settings/SettingsSwitchRow.tsx","../src/settings/NotificationCategoryList.tsx","../src/settings/PremiumModelsFrame.tsx","../src/settings/ThreadPreviewDialog.tsx","../src/settings/JsonTree.tsx","../src/settings/message-schema-hints.ts","../src/settings/MessageJsonTree.tsx","../src/settings/TipsEditorDialog.tsx","../src/settings/SyncDialogParts.tsx","../src/settings/tri-state-filters.ts","../src/settings/FilterChip.tsx","../src/settings/PlanBadge.tsx","../src/settings/MoreInfo.tsx","../src/settings/QuotaMeter.tsx","../src/settings/PlanCard.tsx","../src/settings/ReferralReward.tsx","../src/settings/AccountDialogs.tsx","../src/settings/ConnectionCard.tsx","../src/settings/AvatarPicker.tsx","../src/settings/Projects.tsx","../src/settings/SupportPanel.tsx","../src/settings/WelcomeDialog.tsx","../src/settings/Usage.tsx","../src/settings/Billing.tsx","../src/settings/ProfileCard.tsx","../src/settings/EmailWorkspaceDialogView.tsx","../src/settings/SubscriptionParts.tsx","../src/settings/ErrorDialog.tsx","../src/settings/error-report.ts","../src/settings/account-views.ts","../src/settings/IdentityVerification.tsx","../src/settings/SettingsPage.tsx","../src/settings/AppearanceSettings.tsx","../src/settings/inverted-index-filter.ts","../src/settings/calls-switch.ts"],"names":["useId","useMemo","jsx","Dialog","jsxs","DialogContent","testIdOr","DialogHeader","DialogTitle","DialogDescription","CheckCircle2","Button","Input","PasswordStrengthInput","AlertCircle","Fragment","Loader2","formatCount","Badge","useState","useRestoreFocus","LogOut","DialogFooter","Collapsible","CollapsibleTrigger","ChevronDown","ChevronRight","Radio","CollapsibleContent","cn","TabHeader","Star","Undo2","History","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Trash2","ModalSection","ModalSectionTitle","Tooltip","TooltipTrigger","Users","TooltipContent","Sparkles","Brain","RefreshCw","Wifi","WifiOff","Switch","Checkbox","prefixedTestId","Crown","ModalHeader","formatValue","Check","Copy","Label","ModalScaffold","Textarea","Pencil","Plus","ScrollArea","X","cva","TONE_SURFACE","TONE_BORDER","Info","valueColor","Tag","Gift","AlertTriangle","PlugIcon","ToneBadge","ExternalLink","ShieldCheck","Plug","useRef","Avatar","AvatarImage","AvatarFallback","Camera","entityNoun","MessageCircleQuestionMark","BookOpen","UsageMeter","UserPlus","categoricalStyle","Chart","RadioGroupPrimitive","ChartNoAxesColumn","FileText","SettingsCard","VerifiedBadge","Mail","Send","Clock","InfinityIcon","getEntityLabel","Progress","useEffect","reactVersion","SettingsRow","SettingsDisclosure","section","Sun","Moon","getFontPairing","SettingsPanel","SettingsSection","RotateCcw","SegmentedControl"],"mappings":"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","file":"chunk-TX4CIWH5.cjs","sourcesContent":["import { useMemo, type FormEvent, type ReactNode, useId } from 'react'\nimport { AlertCircle, CheckCircle2, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n PasswordStrengthInput,\n type PasswordStrengthInputLabels,\n type PasswordStrengthInputTestIds,\n} from '../auth/PasswordStrengthInput'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the password-change dialog. */\nexport interface PasswordChangeDialogLabels {\n setNewPasswordTitle: string\n changeMasterPasswordTitle: string\n recoveryDescription: string\n changeDescription: string\n passwordChanged: string\n /** Success note: a password change keeps the account key, so the saved recovery key still works. */\n recoveryKeyUnchanged: string\n done: string\n recoverySuccessful: string\n currentPassword: string\n currentPasswordPlaceholder: string\n masterPassword: string\n newPassword: string\n confirmPassword: string\n confirmNewPassword: string\n cancel: string\n settingPassword: string\n changingPassword: string\n continue: string\n changePassword: string\n}\n\nexport const DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS: PasswordChangeDialogLabels = {\n setNewPasswordTitle: 'Set New Password',\n changeMasterPasswordTitle: 'Change Master Password',\n recoveryDescription: 'Set a new password for your recovered account',\n changeDescription: 'Change your master password dialog',\n passwordChanged: 'Password changed',\n recoveryKeyUnchanged:\n 'Your recovery key is unchanged: the one you saved still recovers this account.',\n done: 'Done',\n recoverySuccessful: 'Recovery successful. Set a new master password to continue.',\n currentPassword: 'Current Password',\n currentPasswordPlaceholder: 'Enter current password',\n masterPassword: 'Master Password',\n newPassword: 'New Password',\n confirmPassword: 'Confirm Password',\n confirmNewPassword: 'Confirm New Password',\n cancel: 'Cancel',\n settingPassword: 'Setting Password...',\n changingPassword: 'Changing Password...',\n continue: 'Continue',\n changePassword: 'Change Password',\n}\n\nexport interface PasswordChangeDialogProps {\n labels?: Partial<PasswordChangeDialogLabels>\n /** Labels forwarded to the embedded password input. */\n passwordInputLabels?: Partial<PasswordStrengthInputLabels>\n /** Dialog test id (default `change-password-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'done' | 'currentInput' | 'error' | 'cancel' | 'submit', string>>\n /** Ids forwarded to the embedded password input. */\n passwordInputTestIds?: PasswordStrengthInputTestIds\n open: boolean\n /** Dismiss (also fired by Cancel and the close button). */\n onClose: () => void\n /** After recovery with a key: no current password, no Cancel, full-width Continue. */\n recoveryMode: boolean\n currentPassword: string\n onCurrentPasswordChange: (value: string) => void\n newPassword: string\n onNewPasswordChange: (value: string) => void\n confirmPassword: string\n onConfirmPasswordChange: (value: string) => void\n /** The host's password policy (see `PasswordStrengthInput`). */\n getUnmetRequirement: (password: string) => string | null\n error: string | null\n isProcessing: boolean\n isSubmitDisabled: boolean\n onSubmit: () => void\n /** The password changed: the success state replaces the form. */\n isChanged: boolean\n /** Extra content under the success note. */\n success?: ReactNode\n onDone: () => void\n}\n\n/** Change (or set, after recovery) the master password. */\nexport function PasswordChangeDialog({\n open,\n onClose,\n recoveryMode,\n currentPassword,\n onCurrentPasswordChange,\n newPassword,\n onNewPasswordChange,\n confirmPassword,\n onConfirmPasswordChange,\n getUnmetRequirement,\n error,\n isProcessing,\n isSubmitDisabled,\n onSubmit,\n isChanged,\n success,\n onDone,\n labels,\n passwordInputLabels,\n testId,\n testIds,\n passwordInputTestIds,\n}: PasswordChangeDialogProps) {\n const currentPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit()\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'change-password-dialog' })}\n >\n <DialogHeader>\n <DialogTitle>\n {recoveryMode ? l.setNewPasswordTitle : l.changeMasterPasswordTitle}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {recoveryMode ? l.recoveryDescription : l.changeDescription}\n </DialogDescription>\n </DialogHeader>\n\n {isChanged ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-green-text\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <span className=\"font-medium\">{l.passwordChanged}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{l.recoveryKeyUnchanged}</p>\n {success}\n <div className=\"flex justify-end\">\n <Button\n onClick={onDone}\n data-testid={testIdOr(testIds?.done, { testId: 'change-password-done-button' })}\n >\n {l.done}\n </Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {recoveryMode && (\n <p className=\"text-sm font-medium text-green-text\">{l.recoverySuccessful}</p>\n )}\n\n {!recoveryMode && (\n <div className=\"space-y-1.5\">\n <label htmlFor={currentPasswordId} className=\"text-sm font-medium text-foreground\">\n {l.currentPassword} <span className=\"text-red-text\">*</span>\n </label>\n <Input\n id={currentPasswordId}\n type=\"password\"\n value={currentPassword}\n onChange={(e) => onCurrentPasswordChange(e.target.value)}\n disabled={isProcessing}\n placeholder={l.currentPasswordPlaceholder}\n autoComplete=\"current-password\"\n className=\"placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.currentInput, {\n testId: 'change-password-current-input',\n })}\n />\n </div>\n )}\n\n <PasswordStrengthInput\n password={newPassword}\n confirmPassword={confirmPassword}\n onPasswordChange={onNewPasswordChange}\n onConfirmPasswordChange={onConfirmPasswordChange}\n showConfirmation\n disabled={isProcessing}\n passwordLabel={recoveryMode ? l.masterPassword : l.newPassword}\n confirmLabel={recoveryMode ? l.confirmPassword : l.confirmNewPassword}\n labels={passwordInputLabels}\n testIds={passwordInputTestIds}\n layout={recoveryMode ? 'side-by-side' : 'stacked'}\n showStrengthIndicator\n getUnmetRequirement={getUnmetRequirement}\n />\n\n {error && (\n <div\n className=\"rounded-md bg-red-bg p-3\"\n data-testid={testIdOr(testIds?.error, { testId: 'change-password-error' })}\n >\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" />\n <p className=\"text-sm text-red-text\">{error}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3 pt-4\">\n {!recoveryMode && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, {\n testId: 'change-password-cancel-button',\n })}\n >\n {l.cancel}\n </Button>\n )}\n <Button\n type=\"submit\"\n disabled={isSubmitDisabled}\n className={recoveryMode ? 'w-full' : ''}\n data-testid={testIdOr(testIds?.submit, { testId: 'change-password-submit-button' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {recoveryMode ? l.settingPassword : l.changingPassword}\n </>\n ) : recoveryMode ? (\n l.continue\n ) : (\n l.changePassword\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the logout dialog. */\nexport interface LogoutDialogLabels {\n title: string\n descriptionAll: string\n descriptionThis: string\n cancel: string\n allSessions: string\n offlineTooltip: string\n thisSession: string\n offlineNote: string\n /** Disclosure trigger: \"3 active sessions\". */\n activeSessions: (count: number) => string\n /** Session row: \"2 workspaces\". */\n workspaces: (count: number) => string\n /** Session row: \"TTL 2h\". */\n ttl: (ttlLabel: string) => string\n}\n\nexport const DEFAULT_LOGOUT_DIALOG_LABELS: LogoutDialogLabels = {\n title: 'Logout',\n descriptionAll: 'End this session or all active sessions?',\n descriptionThis: 'End this session and return to the login page.',\n cancel: 'Cancel',\n allSessions: 'All sessions',\n offlineTooltip: 'Ending all sessions needs a connection — you can still log out of this device.',\n thisSession: 'This session',\n offlineNote:\n 'You’re offline — ending all sessions needs a connection. You can still log out of this device.',\n activeSessions: (count) =>\n formatCount(count, { one: 'active session', other: 'active sessions' }),\n workspaces: (count) => formatCount(count, { one: 'workspace', other: 'workspaces' }),\n ttl: (ttlLabel) => `TTL ${ttlLabel}`,\n}\n\nexport interface LogoutSessionView {\n id: string\n /** `agent` sessions are shown with the primary badge. */\n status: string\n ipAddress?: string | null\n /** Pre-formatted remaining lifetime, e.g. \"2h\". */\n ttlLabel: string\n workspaceCount: number\n}\n\nexport interface LogoutDialogProps {\n open: boolean\n onClose: () => void\n onLogoutThis: () => void\n onLogoutAll: () => void\n /** False for agent accounts: \"All sessions\" is not offered. */\n canLogoutAll: boolean\n isOnline: boolean\n sessions: LogoutSessionView[]\n /** Icon for a session row (monitor / bot). */\n renderSessionIcon?: (status: string) => ReactNode\n labels?: Partial<LogoutDialogLabels>\n /** Dialog test id (default `logout-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'all' | 'this' | 'offlineNote', string>>\n}\n\nfunction SessionRow({\n session,\n icon,\n labels,\n}: {\n session: LogoutSessionView\n icon?: ReactNode\n labels: LogoutDialogLabels\n}) {\n const { status } = session\n return (\n <div className=\"flex items-center gap-3 rounded-md bg-muted/50 px-3 py-2\">\n {icon && <div className=\"flex-shrink-0\">{icon}</div>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <code className=\"truncate font-mono text-sm\">{session.id.slice(0, 12)}</code>\n <Badge\n variant={status === 'agent' ? 'default' : 'secondary'}\n className=\"px-1 py-0 text-sm\"\n >\n {status}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {session.ipAddress && <span>{session.ipAddress}</span>}\n <span>{labels.ttl(session.ttlLabel)}</span>\n {session.workspaceCount > 0 && <span>{labels.workspaces(session.workspaceCount)}</span>}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Logout confirmation: end this session or all sessions, with the list of the\n * user's active sessions (including agent sessions) under a disclosure.\n * \"All sessions\" is disabled while offline because it must reach the server.\n */\nexport function LogoutDialog({\n open,\n onClose,\n onLogoutThis,\n onLogoutAll,\n canLogoutAll,\n isOnline,\n sessions,\n renderSessionIcon,\n labels,\n testId,\n testIds,\n}: LogoutDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_LOGOUT_DIALOG_LABELS, ...labels }), [labels])\n const [sessionsOpen, setSessionsOpen] = useState(false)\n const restoreFocus = useRestoreFocus()\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n {...restoreFocus}\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'logout-modal' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <LogOut className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription className=\"text-base\">\n {canLogoutAll ? l.descriptionAll : l.descriptionThis}\n </DialogDescription>\n </DialogHeader>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'logout-modal-cancel-button' })}\n >\n {l.cancel}\n </Button>\n {canLogoutAll && (\n <Button\n variant=\"secondary\"\n onClick={onLogoutAll}\n disabled={!isOnline}\n title={isOnline ? undefined : l.offlineTooltip}\n data-testid={testIdOr(testIds?.all, { testId: 'logout-modal-all-button' })}\n >\n {l.allSessions}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onLogoutThis}\n data-testid={testIdOr(testIds?.this, { testId: 'logout-modal-this-button' })}\n >\n {l.thisSession}\n </Button>\n </DialogFooter>\n\n {canLogoutAll && !isOnline && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.offlineNote, { testId: 'logout-offline-note' })}\n >\n {l.offlineNote}\n </p>\n )}\n\n {sessions.length > 0 && (\n <Collapsible open={sessionsOpen} onOpenChange={setSessionsOpen}>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 py-1 text-left transition-opacity hover:opacity-80 pointer-coarse:py-3\">\n {sessionsOpen ? (\n <ChevronDown className=\"h-4 w-4 flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n )}\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Radio className=\"h-3 w-3\" />\n <span>{l.activeSessions(sessions.length)}</span>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"max-h-48 space-y-1.5 overflow-auto pt-2\">\n {sessions.map((session) => (\n <SessionRow\n key={session.id}\n session={session}\n icon={renderSessionIcon?.(session.status)}\n labels={l}\n />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DialogContent>\n </Dialog>\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","/**\n * Wrapper that makes a header region draggable for FloatingPanel,\n * while ignoring clicks on interactive elements (buttons, inputs, tabs, etc.).\n */\n\nimport React from 'react'\n\nexport interface DraggableHeaderProps {\n onDragStart?: (e: React.MouseEvent) => void\n children: React.ReactNode\n}\n\nconst INTERACTIVE_SELECTOR = 'button, input, select, a, [role=\"tab\"], [role=\"radio\"]'\n\nexport function DraggableHeader({ onDragStart, children }: DraggableHeaderProps) {\n return (\n <div\n className=\"flex-shrink-0\"\n onMouseDown={\n onDragStart\n ? (e) => {\n const target = e.target as HTMLElement\n if (target.closest(INTERACTIVE_SELECTOR)) return\n onDragStart(e)\n }\n : undefined\n }\n style={onDragStart ? { cursor: 'move' } : undefined}\n >\n {children}\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 /** When set, the button is disabled and this explanation is its tooltip. */\n disabledReason?: string\n}\n\n/** \"+ New\" button that sits right after the tabs of a panel header. */\nexport function PanelAddButton({\n label,\n onClick,\n isCompact,\n icon,\n testId,\n disabledReason,\n}: PanelAddButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={!!disabledReason}\n title={disabledReason ?? 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 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent 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 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 const selectedTitle = hasUnsavedChanges\n ? unsavedTitle\n : options.find((o) => o.value === value)?.title\n return (\n <div\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 {/* The trigger names the selection on one line; the list shows each option's subtitle. */}\n <SelectValue placeholder={l.placeholder}>{selectedTitle}</SelectValue>\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 </div>\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\n/** The live server connection as a host knows it. */\nexport interface ServerConnectionStatus {\n /** The socket to the server. */\n status: 'connected' | 'connecting' | 'disconnected' | 'error'\n /** The user chose to work offline (`WorkOfflineToggle`). */\n forcedOffline?: boolean\n /** The device has no network at all: offline, and it comes back by itself. */\n deviceOffline?: boolean\n}\n\nexport interface ServerConnectionView {\n state: ServerConnectionState\n label: string\n description: string\n}\n\n/** What the server-connection row shows for a status, naming the deployment `domain`. */\nexport function serverConnectionView(\n { status, forcedOffline = false, deviceOffline = false }: ServerConnectionStatus,\n domain: string\n): ServerConnectionView {\n const state: ServerConnectionState =\n forcedOffline || deviceOffline ? 'offline' : status === 'error' ? 'disconnected' : status\n const label = forcedOffline\n ? 'Working offline'\n : deviceOffline\n ? 'Offline'\n : status === 'connected'\n ? 'Connected'\n : status === 'connecting'\n ? 'Connecting'\n : 'Disconnected'\n const description =\n deviceOffline && !forcedOffline\n ? \"You're offline. ARBI reconnects by itself when your connection returns.\"\n : `${\n status === 'connected'\n ? `Connected to ${domain}.`\n : status === 'connecting'\n ? `Connecting to ${domain}...`\n : `Disconnected from ${domain}.`\n } Click to refresh your session.`\n return { state, label, description }\n}\n","import type { ReactNode } from 'react'\nimport { Switch, cn } from '@arbidocs/react/ui'\n\nexport interface SettingsSwitchRowProps {\n /** Id of the switch; also the `htmlFor` of the label so clicking the label toggles it. */\n id: string\n title: ReactNode\n /** Leading glyph of the title. */\n icon?: ReactNode\n description?: ReactNode\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n testId?: string\n disabled?: boolean\n className?: string\n}\n\n/** One on/off setting: icon + title + help text at the start, the switch at the end. */\nexport function SettingsSwitchRow({\n id,\n title,\n icon,\n description,\n checked,\n onCheckedChange,\n testId,\n disabled,\n className,\n}: SettingsSwitchRowProps) {\n return (\n <div\n data-slot=\"settings-switch-row\"\n className={cn('flex items-center justify-between gap-4', className)}\n >\n <div className=\"min-w-0 flex-1\">\n <label htmlFor={id} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {icon}\n {title}\n </label>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n data-testid={testId}\n />\n </div>\n )\n}\n\n/** Indented group of rows that belong to the row above (e.g. the connectors of \"Connectors\"). */\nexport function SettingsSwitchGroup({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"settings-switch-group\"\n className={cn('ml-6 space-y-4 border-l border-border pl-4', className)}\n >\n {children}\n </div>\n )\n}\n","import { Checkbox, cn } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { SettingsSwitchRow } from './SettingsSwitchRow'\n\nexport interface NotificationCategory {\n key: string\n label: string\n description: string\n checked: boolean\n}\n\nexport interface NotificationCategoryListProps {\n /** Master switch: on while at least one category is on. */\n masterId: string\n masterTitle: string\n masterDescription: string\n masterChecked: boolean\n onMasterChange: (checked: boolean) => void\n masterTestId?: string\n categories: NotificationCategory[]\n onCategoryChange: (key: string, checked: boolean) => void\n /** Prefix of the checkbox ids (`<prefix>-<key>`); default the master id. */\n idPrefix?: string\n /** Prefix of the checkbox test ids (`<prefix>-<key>`); default `toggle-email`. */\n testIdPrefix?: string\n}\n\n/**\n * A master switch with per-category checkboxes under it. The checkboxes are greyed out and\n * disabled while the master is off.\n */\nexport function NotificationCategoryList({\n masterId,\n masterTitle,\n masterDescription,\n masterChecked,\n onMasterChange,\n masterTestId,\n categories,\n onCategoryChange,\n idPrefix = masterId,\n testIdPrefix,\n}: NotificationCategoryListProps) {\n return (\n <div data-slot=\"notification-category-list\">\n <SettingsSwitchRow\n id={masterId}\n title={masterTitle}\n description={masterDescription}\n checked={masterChecked}\n onCheckedChange={onMasterChange}\n testId={testIdOr(masterTestId, { testId: 'toggle-email-notifications' })}\n />\n <div className=\"ml-1 mt-3 space-y-3 border-l border-border pl-4 pointer-coarse:mt-5 pointer-coarse:space-y-5\">\n {categories.map((c) => (\n <label\n key={c.key}\n htmlFor={`${idPrefix}-${c.key}`}\n className={cn(\n 'flex items-start gap-3 pointer-coarse:min-h-11',\n masterChecked ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n )}\n >\n <Checkbox\n id={`${idPrefix}-${c.key}`}\n checked={c.checked}\n disabled={!masterChecked}\n onCheckedChange={(value) => onCategoryChange(c.key, value === true)}\n data-testid={prefixedTestId(testIdPrefix, c.key, { testId: `toggle-email-${c.key}` })}\n className=\"mt-0.5 size-5 shrink-0\"\n />\n <div className=\"min-w-0\">\n <span className=\"text-sm\">{c.label}</span>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{c.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\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-primary'\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-primary'\n case 'number':\n return 'text-primary'\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","/**\n * Schema Hints Utilities\n *\n * Provides formatting hints based on OpenAPI schema structure\n * Helps display JSON fields in a more user-friendly way\n */\n\nexport interface FieldHint {\n displayName?: string\n formatType?:\n 'timestamp' | 'id' | 'enum' | 'boolean' | 'long-string' | 'json' | 'string' | 'number'\n description?: string\n}\n\n// MessageResponse field hints from OpenAPI schema\nconst messageFieldHints: Record<string, FieldHint> = {\n role: {\n displayName: 'Role',\n formatType: 'enum',\n description: 'Message role (user, assistant, or system)',\n },\n content: {\n displayName: 'Content',\n formatType: 'long-string',\n description: 'Message content text',\n },\n created_at: {\n displayName: 'Created At',\n formatType: 'timestamp',\n description: 'Message creation timestamp',\n },\n external_id: {\n displayName: 'Message ID',\n formatType: 'id',\n description: 'External message identifier',\n },\n conversation_ext_id: {\n displayName: 'Conversation ID',\n formatType: 'id',\n description: 'Parent conversation identifier',\n },\n parent_message_ext_id: {\n displayName: 'Parent Message ID',\n formatType: 'id',\n description: 'Parent message identifier (null for first message)',\n },\n created_by_ext_id: {\n displayName: 'Created By',\n formatType: 'id',\n description: 'User who created this message',\n },\n config_ext_id: {\n displayName: 'Config ID',\n formatType: 'id',\n description: 'Configuration used for this message',\n },\n shared: {\n displayName: 'Shared',\n formatType: 'boolean',\n description: 'Whether message is shared',\n },\n tools: {\n displayName: 'Tools',\n formatType: 'json',\n description: 'Tool outputs (citations, retrieval, trace)',\n },\n meta: {\n displayName: 'Metadata',\n formatType: 'json',\n description: 'Additional metadata',\n },\n}\n\n// TraceTool field hints\nconst traceToolFieldHints: Record<string, FieldHint> = {\n name: {\n displayName: 'Tool Name',\n formatType: 'enum',\n description: 'Execution trace tool',\n },\n description: {\n displayName: 'Description',\n formatType: 'string',\n description: 'Tool description',\n },\n trace_id: {\n displayName: 'Trace ID',\n formatType: 'id',\n description: 'Unique trace identifier',\n },\n start_time: {\n displayName: 'Start Time',\n formatType: 'timestamp',\n description: 'When execution started',\n },\n duration_seconds: {\n displayName: 'Duration (seconds)',\n formatType: 'number',\n description: 'Total execution time',\n },\n steps: {\n displayName: 'Execution Steps',\n formatType: 'json',\n description: 'Full execution trace with all steps',\n },\n}\n\n// ModelCitationTool field hints\nconst citationToolFieldHints: Record<string, FieldHint> = {\n name: {\n displayName: 'Tool Name',\n formatType: 'enum',\n description: 'Model citation tool',\n },\n tool_responses: {\n displayName: 'Citations',\n formatType: 'json',\n description: 'Citation data mapped by citation number',\n },\n}\n\n/**\n * Get display hint for a field\n */\nexport function getFieldHint(path: string[], fieldName: string): FieldHint | null {\n // Top-level message fields\n if (path.length === 1 && path[0] === 'message') {\n return messageFieldHints[fieldName] || null\n }\n\n // Check if we're inside a trace tool: message > tools > trace\n if (path.length >= 3 && path[0] === 'message' && path[1] === 'tools' && path[2] === 'trace') {\n return traceToolFieldHints[fieldName] || null\n }\n\n // Check if we're inside model_citations tool\n if (\n path.length >= 3 &&\n path[0] === 'message' &&\n path[1] === 'tools' &&\n path[2] === 'model_citations'\n ) {\n return citationToolFieldHints[fieldName] || null\n }\n\n // Generic patterns for any level\n if (fieldName === 'external_id' || fieldName.endsWith('_ext_id')) {\n return { formatType: 'id', displayName: fieldName.replace(/_/g, ' ') }\n }\n\n if (fieldName === 'created_at' || fieldName === 'updated_at' || fieldName.endsWith('_at')) {\n return { formatType: 'timestamp', displayName: fieldName.replace(/_/g, ' ') }\n }\n\n if (fieldName.includes('time') && !fieldName.includes('duration')) {\n return { formatType: 'timestamp' }\n }\n\n if (fieldName.includes('duration')) {\n return { formatType: 'number', description: 'Duration in seconds' }\n }\n\n // Special handling for trace tool\n if (path.length >= 2 && path[path.length - 2] === 'tools' && fieldName === 'trace') {\n return {\n displayName: '🔍 Execution Trace',\n formatType: 'json',\n description: 'Complete execution trace with all steps and timing',\n }\n }\n\n return null\n}\n\n/**\n * Format a value based on its hint\n */\nexport function formatValue(value: unknown, hint: FieldHint | null): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n\n if (hint?.formatType === 'timestamp' && typeof value === 'string') {\n try {\n const date = new Date(value)\n if (!isNaN(date.getTime())) {\n return `${date.toLocaleString()} (${value})`\n }\n } catch {\n // Fall through to default\n }\n }\n\n if (hint?.formatType === 'timestamp' && typeof value === 'number') {\n // Unix timestamp\n const date = new Date(value * 1000)\n return `${date.toLocaleString()} (${value})`\n }\n\n if (hint?.formatType === 'id' && typeof value === 'string') {\n // Shorten long IDs for readability\n if (value.length > 20) {\n return `${value.substring(0, 16)}...${value.substring(value.length - 4)}`\n }\n }\n\n if (typeof value === 'string') {\n // Truncate very long strings\n if (value.length > 100) {\n return `\"${value.substring(0, 97)}...\" (${value.length} chars)`\n }\n return `\"${value}\"`\n }\n\n return String(value)\n}\n","/**\n * MessageJsonTree: the JsonTree with the ARBI message schema hints (field names, ids, timestamps\n * of a message and its tool outputs), for a \"message details\" view.\n */\n\nimport { JsonTree, type JsonTreeProps } from './JsonTree'\nimport { getFieldHint, formatValue } from './message-schema-hints'\n\nexport type MessageJsonTreeProps = Omit<JsonTreeProps, 'resolveHint' | 'formatValue'>\n\nexport function MessageJsonTree(props: MessageJsonTreeProps) {\n return <JsonTree {...props} resolveHint={getFieldHint} formatValue={formatValue} />\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: readonly TipOption[]\n actionOptions: readonly TipOption[]\n sequenceOptions: readonly 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: readonly 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","/**\n * Tri-state filtering: each filter is include (keep matches), exclude (drop matches, and it wins\n * over include) or null (indifferent); several includes are an OR.\n */\nimport type { TriState } from './TriStateFilterMenu'\n\n/**\n * Generic filter function that applies tri-state filters to items\n * @param items - Array of items to filter\n * @param filterStates - Map of filter states (include/exclude/null)\n * @param getAttributes - Function that returns attribute map for an item\n * @returns Filtered array of items\n */\nexport function applyTriStateFilters<T, K extends string>(\n items: T[],\n filterStates: ReadonlyMap<K, TriState>,\n getAttributes: (item: T) => Record<K, boolean>\n): T[] {\n // Pre-compute active filter lists once — avoids re-scanning the Map for every item.\n // With 100+ filter IDs (tags + folders) and 5000+ documents this is O(n_filters) done\n // once instead of O(n_filters × n_items).\n const includeKeys: K[] = []\n const excludeKeys: K[] = []\n for (const [key, state] of filterStates.entries()) {\n if (state === 'include') includeKeys.push(key)\n else if (state === 'exclude') excludeKeys.push(key)\n }\n\n if (includeKeys.length === 0 && excludeKeys.length === 0) {\n // No filters active, return all items\n return items\n }\n\n return items.filter((item) => {\n const attributes = getAttributes(item)\n\n // EXCLUDE overrides INCLUDE - check exclusions first\n for (const key of excludeKeys) {\n if (attributes[key]) return false\n }\n\n if (includeKeys.length === 0) {\n // No include filters, item passes (wasn't excluded)\n return true\n }\n\n // Item must match at least one include filter\n for (const key of includeKeys) {\n if (attributes[key]) return true\n }\n\n // Item doesn't match any include filter\n return false\n })\n}\n","import type { ReactNode } from 'react'\nimport { Check, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TriState } from './TriStateFilterMenu'\n\nexport interface FilterChipProps {\n label: string\n state: TriState\n icon?: ReactNode\n /** When provided, renders a colored pill identical to Labels column */\n color?: string\n onDismiss?: () => void\n /** The dismiss button's accessible name (default \"Remove <label>\"). */\n dismissLabel?: string\n className?: string\n testId?: string\n}\n\nexport function FilterChip({\n label,\n state,\n icon,\n color,\n onDismiss,\n dismissLabel,\n className,\n testId,\n}: FilterChipProps) {\n const isExclude = state === 'exclude'\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 text-xs font-medium rounded px-1.5 py-0.5 flex-shrink-0 border',\n isExclude\n ? 'bg-background text-red-text border-red-text'\n : 'bg-primary text-white border-primary',\n className\n )}\n data-state={state}\n data-testid={testId}\n >\n {color ? (\n /* Filled square for include; empty square for exclude */\n isExclude ? (\n <span\n className=\"w-3.5 h-3.5 rounded flex-shrink-0 border-2\"\n style={{ borderColor: color }}\n />\n ) : (\n <span\n className=\"w-3.5 h-3.5 rounded flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: color }}\n >\n <Check className=\"w-2.5 h-2.5 text-white\" strokeWidth={3} />\n </span>\n )\n ) : (\n icon && <span className=\"flex-none\">{icon}</span>\n )}\n\n <span className=\"truncate max-w-[80px]\" title={label}>\n {isExclude && <span className=\"opacity-70 mr-0.5\">Not</span>}\n {label}\n </span>\n\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label={dismissLabel ?? `Remove ${label}`}\n className=\"flex-none ml-0.5 opacity-70 hover:opacity-100\"\n data-testid={testId ? `${testId}-remove` : undefined}\n >\n <X className=\"h-3 w-3\" strokeWidth={2.5} />\n </button>\n )}\n </span>\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 /** Plan name, e.g. \"Free\", \"Pro\". */\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 { useState, type ReactNode } from 'react'\nimport { Info } from 'lucide-react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\n\nexport interface MoreInfoProps {\n /** The modal's title, e.g. \"Usage and top-ups\". */\n title: string\n /** The explanation: short paragraphs or a {@link MoreInfoList}. */\n children: ReactNode\n /** The link's text. */\n label?: string\n /** Test id of the link; the modal is `<testId>-dialog`. */\n testId?: string\n className?: string\n}\n\n/**\n * A small \"More info\" link that opens a modal with the longer explanation, so a screen can keep to\n * short labels and one-line facts. The one place billing surfaces put proration, caps, renewals\n * and refunds.\n */\nexport function MoreInfo({\n title,\n children,\n label = 'More info',\n testId = 'more-info',\n className,\n}: MoreInfoProps) {\n const [open, setOpen] = useState(false)\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-sm text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n className\n )}\n data-slot=\"more-info\"\n data-testid={testId}\n >\n <Info className=\"size-3.5\" aria-hidden />\n {label}\n </button>\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"sm:max-w-md\" data-testid={`${testId}-dialog`}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{title}</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3 text-sm leading-relaxed text-muted-foreground\">{children}</div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\n/** The explanation as a list of short points, each with an optional bold lead. */\nexport function MoreInfoList({ items }: { items: Array<{ term?: string; text: ReactNode }> }) {\n return (\n <ul className=\"space-y-2\" data-slot=\"more-info-list\">\n {items.map((item, i) => (\n <li key={item.term ?? i}>\n {item.term && <span className=\"font-medium text-foreground\">{item.term}. </span>}\n {item.text}\n </li>\n ))}\n </ul>\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-primary'\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/** AI usage / 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, Tag } from 'lucide-react'\nimport { cn, Input, Label } from '@arbidocs/react/ui'\nimport { MoreInfo, MoreInfoList } from './MoreInfo'\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 /** One short line per idea, shown as a list. */\n explainerTiers: string[]\n explainerAiUsage: string\n seeModelList: string\n}\n\nexport const DEFAULT_PLAN_CARD_LABELS: PlanCardLabels = {\n currentPlan: 'Current plan',\n popular: 'Popular',\n noMonthlyCost: '£0',\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: 'How pricing works',\n explainerTiers: [\n 'AI usage and storage are shared by everyone in the project. AI usage resets monthly.',\n 'Need more? Add £25 of AI usage or 25 GB at a time, at checkout or later. Add-ons renew with the plan until you reduce them.',\n 'Automatic top-ups add one more step when you run low, up to your monthly usage cap (£100 by default; £0 = none; or no limit). Adding by hand is never capped.',\n 'Add-ons start now: AI usage is charged in full, storage only for the rest of the period. Downgrades, billing switches and reductions start at the end of the period. No refunds.',\n 'Annual plans are 25% off, add-ons included.',\n 'Prices are shown + VAT; the total for your country is shown before you pay.',\n ],\n explainerAiUsage:\n 'About 1p of AI usage buys one moderately complex request, or reading ~25 documents, on a Standard model. Premium models can cost 10–100× more.',\n seeModelList: 'AI model prices →',\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 /** After the per-month price, e.g. \"+ VAT\" when the headline is ex VAT. */\n taxLabel?: string\n /** Small print under the price, e.g. \"£42/mo incl. UK VAT\". */\n note?: 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. \"£10 of AI usage / 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 flex flex-col justify-start 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-lg 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-2xl font-semibold leading-none tabular-nums text-foreground\">\n {l.noMonthlyCost}\n <span className=\"ml-0.5 text-sm font-medium text-muted-foreground\">{l.perMonth}</span>\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 {price.taxLabel && ` ${price.taxLabel}`}\n </span>\n </span>\n </div>\n {price.note && (\n <div className=\"text-xs text-muted-foreground\" data-slot=\"plan-card-price-note\">\n {price.note}\n </div>\n )}\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=\"@container 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 : plans.length === 2\n ? 'grid-cols-1 @xl:grid-cols-2'\n : 'grid-cols-1 @2xl: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/** \"How pricing works\": a link that opens the pricing explainer modal. `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 <MoreInfo title={l.pricingExplainer} label={l.pricingExplainer} testId=\"pricing-explainer\">\n <MoreInfoList items={l.explainerTiers.map((text) => ({ text }))} />\n <p>\n {l.explainerAiUsage}{' '}\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 </MoreInfo>\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-reward parts. `amount` is the formatted reward. */\nexport interface ReferralRewardLabels {\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_REWARD_LABELS: ReferralRewardLabels = {\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 ReferralRewardBadge({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralRewardLabels>\n /** Default `referral-reward-badge` / `referral-reward-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-badge' })}\n >\n <Gift className=\"h-3.5 w-3.5\" />\n {l.badge(amountLabel)}\n </span>\n )\n}\n\nexport interface ReferralRewardBreakdown {\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 ReferralRewardSummaryProps {\n /** The reward amount, formatted. */\n amountLabel: string\n /** When the exact charge is known; otherwise a one-line note is shown. */\n breakdown?: ReferralRewardBreakdown\n labels?: Partial<ReferralRewardLabels>\n /** Root test id (default `referral-reward-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 ReferralRewardSummary({\n amountLabel,\n breakdown,\n labels,\n testId,\n testIds,\n}: ReferralRewardSummaryProps) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-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-reward-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-reward-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 ReferralRewardNote({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralRewardLabels>\n /** Default `referral-reward-badge` / `referral-reward-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-note' })}\n >\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.note(amountLabel)}\n </p>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { AlertTriangle, Loader2, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the active-sessions dialog. */\nexport interface ActiveSessionsDialogLabels {\n title: string\n description: string\n noSessions: string\n thisDevice: string\n agent: string\n endSession: string\n}\n\nexport const DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS: ActiveSessionsDialogLabels = {\n title: 'Active sessions',\n description:\n 'Devices and agents currently signed in to your account. Ending a session signs it out immediately.',\n noSessions: 'No active sessions.',\n thisDevice: 'This device',\n agent: 'Agent',\n endSession: 'End this session',\n}\n\n/** Every fixed string of the delete-account dialog. */\nexport interface DeleteAccountDialogLabels {\n warningTitle: string\n /** Sentence start, before the emphasised part (keep the trailing space). */\n warningBefore: string\n /** Emphasised (bold) part of the warning. */\n warningEmphasis: string\n /** Sentence end, after the emphasised part. */\n warningAfter: string\n blockersHeading: string\n cancel: string\n continue: string\n confirmTitle: string\n confirmDescription: string\n yourEmail: string\n back: string\n deleting: string\n deleteAccount: string\n}\n\nexport const DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS: DeleteAccountDialogLabels = {\n warningTitle: 'Delete your account?',\n warningBefore: 'Once deleted, your account will be ',\n warningEmphasis: 'immediately closed and you will be logged out',\n warningAfter: '. This action cannot be undone.',\n blockersHeading: 'You must resolve these first:',\n cancel: 'Cancel',\n continue: 'Continue',\n confirmTitle: 'Confirm account deletion',\n confirmDescription:\n 'Type your email address to confirm. Your account will be closed immediately and you will be logged out.',\n yourEmail: 'Your email',\n back: 'Back',\n deleting: 'Deleting...',\n deleteAccount: 'Delete Account',\n}\n\nexport interface ActiveSessionView {\n id: string\n /** Display name, e.g. \"Browser session\". */\n name: string\n /** The session of this device: badged, and cannot be ended here. */\n isCurrent: boolean\n isAgent: boolean\n /** Secondary line, e.g. \"10.0.0.1 · expires in 2h · 3 workspaces\". */\n detail: string\n isTerminating: boolean\n /** Avatar glyph (monitor / bot). */\n icon?: ReactNode\n}\n\nexport interface ActiveSessionsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n isLoading: boolean\n sessions: ActiveSessionView[]\n onTerminate: (id: string) => void\n labels?: Partial<ActiveSessionsDialogLabels>\n /** Dialog test id (default `active-sessions-dialog`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `sessionItem` is a prefix (`<prefix>-<session id>`);\n * `terminateSession` is a prefix (`<prefix>-<session id>-button`).\n */\n testIds?: Partial<Record<'list' | 'sessionItem' | 'terminateSession', string>>\n}\n\nfunction SessionListRow({\n session,\n onTerminate,\n labels,\n testIds,\n}: {\n session: ActiveSessionView\n onTerminate: (id: string) => void\n labels: ActiveSessionsDialogLabels\n testIds?: ActiveSessionsDialogProps['testIds']\n}) {\n return (\n <div\n className=\"flex w-full items-center gap-3 border-b border-border/60 px-4 py-3 last:border-b-0\"\n data-testid={prefixedTestId(testIds?.sessionItem, session.id, {\n testId: `session-item-${session.id}`,\n })}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n {session.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{session.name}</span>\n {session.isCurrent && (\n <Badge className=\"border-transparent bg-accent px-1.5 py-0 text-xs text-accent-foreground shadow-none hover:bg-accent\">\n {labels.thisDevice}\n </Badge>\n )}\n {session.isAgent && (\n <Badge variant=\"default\" className=\"px-1 py-0 text-xs\">\n {labels.agent}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">{session.detail}</div>\n </div>\n {!session.isCurrent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={labels.endSession}\n onClick={() => onTerminate(session.id)}\n disabled={session.isTerminating}\n data-testid={prefixedTestId(\n testIds?.terminateSession,\n session.id,\n { testId: `terminate-session-${session.id}-button` },\n '-button'\n )}\n >\n {session.isTerminating ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <LogOut className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{labels.endSession}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/**\n * Every session signed in to the account (this device, other devices, agents). Any but the current\n * one can be ended; ending the current one belongs to the Logout flow.\n */\nexport function ActiveSessionsDialog({\n open,\n onOpenChange,\n isLoading,\n sessions,\n onTerminate,\n labels,\n testId,\n testIds,\n}: ActiveSessionsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-lg\"\n data-testid={testIdOr(testId, { testId: 'active-sessions-dialog' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <Radio className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noSessions}</p>\n ) : (\n <div\n className=\"-mx-2 max-h-96 overflow-auto rounded-lg bg-muted\"\n data-testid={testIdOr(testIds?.list, { testId: 'session-list' })}\n >\n {sessions.map((session) => (\n <SessionListRow\n key={session.id}\n session={session}\n onTerminate={onTerminate}\n labels={l}\n testIds={testIds}\n />\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DeleteAccountBlocker {\n key: string\n content: ReactNode\n}\n\nexport interface DeleteAccountDialogProps {\n open: boolean\n onClose: () => void\n step: 'warning' | 'confirm'\n /** Reasons the account cannot be deleted yet; Continue is disabled while any exist. */\n blockers: DeleteAccountBlocker[]\n onContinue: () => void\n onBack: () => void\n userEmail: string\n confirmEmail: string\n onConfirmEmailChange: (email: string) => void\n isDeleting: boolean\n onSubmit: () => void\n labels?: Partial<DeleteAccountDialogLabels>\n /** Dialog test id (default `delete-account-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'continue' | 'emailInput' | 'back' | 'submit', string>>\n}\n\n/** Two-step account deletion: a warning (with blockers), then type-your-email to confirm. */\nexport function DeleteAccountDialog({\n open,\n onClose,\n step,\n blockers,\n onContinue,\n onBack,\n userEmail,\n confirmEmail,\n onConfirmEmailChange,\n isDeleting,\n onSubmit,\n labels,\n testId,\n testIds,\n}: DeleteAccountDialogProps) {\n const confirmEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, ...labels }), [labels])\n const emailMatches = confirmEmail.toLowerCase() === userEmail.toLowerCase()\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'delete-account-dialog' })}\n >\n {step === 'warning' ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\n {l.warningTitle}\n </DialogTitle>\n <DialogDescription>\n {l.warningBefore}\n <strong>{l.warningEmphasis}</strong>\n {l.warningAfter}\n </DialogDescription>\n </DialogHeader>\n {blockers.length > 0 && (\n <div className=\"rounded-md bg-yellow-bg p-3 text-sm text-yellow-text\">\n <p className=\"mb-1 font-semibold\">{l.blockersHeading}</p>\n <ul className=\"list-inside list-disc space-y-1\">\n {blockers.map((blocker) => (\n <li key={blocker.key}>{blocker.content}</li>\n ))}\n </ul>\n </div>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'delete-account-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={blockers.length > 0}\n onClick={onContinue}\n data-testid={testIdOr(testIds?.continue, {\n testId: 'delete-account-continue-button',\n })}\n >\n {l.continue}\n </Button>\n </div>\n </>\n ) : (\n <>\n <DialogHeader>\n <DialogTitle>{l.confirmTitle}</DialogTitle>\n <DialogDescription>{l.confirmDescription}</DialogDescription>\n </DialogHeader>\n <div>\n <label htmlFor={confirmEmailId} className=\"mb-1 block text-sm font-medium\">\n {l.yourEmail}\n </label>\n <Input\n id={confirmEmailId}\n type=\"email\"\n placeholder={userEmail}\n value={confirmEmail}\n onChange={(e) => onConfirmEmailChange(e.target.value)}\n autoFocus\n data-testid={testIdOr(testIds?.emailInput, {\n testId: 'delete-account-email-input',\n })}\n />\n </div>\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onBack}\n data-testid={testIdOr(testIds?.back, { testId: 'delete-account-back-button' })}\n >\n {l.back}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!emailMatches || isDeleting}\n onClick={onSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'delete-account-submit-button' })}\n >\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.deleting}\n </>\n ) : (\n l.deleteAccount\n )}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\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, useRef, type ChangeEvent } from 'react'\nimport { Camera, Loader2 } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the avatar picker. */\nexport interface AvatarPickerLabels {\n uploadingPicture: string\n changeProfilePicture: string\n change: string\n}\n\nexport const DEFAULT_AVATAR_PICKER_LABELS: AvatarPickerLabels = {\n uploadingPicture: 'Uploading picture',\n changeProfilePicture: 'Change profile picture',\n change: 'Change',\n}\n\nexport interface AvatarPickerProps {\n labels?: Partial<AvatarPickerLabels>\n /** Image URL / data URL; the initials show when absent. */\n pictureUrl?: string | null\n initials: string\n /** Background class of the initials fallback (a stable per-user colour). */\n fallbackClassName?: string\n isUploading?: boolean\n disabled?: boolean\n /** A file was chosen; the host validates, crops and uploads it. */\n onFileChosen: (file: File) => void\n testId?: string\n}\n\n/**\n * Profile picture with a change affordance. A permanent camera mark says the picture is tappable on\n * touch screens; the overlay (revealed on hover/focus) is the actual control.\n */\nexport function AvatarPicker({\n pictureUrl,\n initials,\n fallbackClassName,\n isUploading,\n disabled,\n onFileChosen,\n testId = 'avatar-uploader-input',\n labels,\n}: AvatarPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_AVATAR_PICKER_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n // Reset so choosing the same file again still fires a change.\n e.target.value = ''\n if (file) onFileChosen(file)\n }\n\n return (\n <div data-slot=\"avatar-picker\" className=\"group/avatar relative shrink-0\">\n <Avatar className=\"h-20 w-20 ring-1 ring-border\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt={initials} />}\n <AvatarFallback\n className={cn('text-2xl font-semibold leading-none text-white', fallbackClassName)}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isUploading}\n className={cn(\n 'absolute inset-0 flex items-center justify-center rounded-full',\n 'bg-foreground/70 text-background',\n 'opacity-0 focus-visible:opacity-100 group-hover/avatar:opacity-100',\n // Touch has no hover: keep the change affordance visible (lighter scrim over the photo).\n 'pointer-coarse:opacity-100',\n 'transition-opacity duration-200',\n 'disabled:cursor-not-allowed disabled:opacity-100'\n )}\n aria-label={isUploading ? l.uploadingPicture : l.changeProfilePicture}\n >\n {isUploading ? (\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n ) : (\n <div className=\"flex flex-col items-center gap-0.5\">\n <Camera className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{l.change}</span>\n </div>\n )}\n </button>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-background text-muted-foreground ring-1 ring-border\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </span>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n onChange={handleChange}\n hidden\n className=\"hidden\"\n data-testid={testId}\n />\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 entityNoun,\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 get loading() {\n return `Loading ${entityNoun('PROJECT', 'PLURAL')}...`\n },\n get empty() {\n return `No ${entityNoun('PROJECT', 'PLURAL')} yet. Create one to get started.`\n },\n get filteredOut() {\n return `No ${entityNoun('PROJECT', 'PLURAL')} match the filter.`\n },\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 get renameProject() {\n return `Rename ${entityNoun('PROJECT')}`\n },\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 get title() {\n return `Rename ${entityNoun('PROJECT')}`\n },\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 border border-border bg-card shadow-xs 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 (AI usage is 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, type ReactNode } from 'react'\nimport { ChartNoAxesColumn, Loader2 } from 'lucide-react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\nimport { Chart, categoricalStyle } from '../components/Chart'\n\nconst styleAt = categoricalStyle\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 £: \"£12.40\". */\n gbp: (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 gbp: (formatted) => formatted,\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 /** The chart's accessible name. Default \"Daily usage\". */\n ariaLabel?: string\n}\n\n/** A y tick: whole thousands as \"3k\", smaller values to two decimals. */\nconst usageTick = (v: number) =>\n v >= 1000 ? `${Math.round(v / 1000)}k` : String(Math.round(v * 100) / 100)\n\n/**\n * Line chart of daily usage with a tap/hover/keyboard readout (a tap selects a day, so touch\n * works): the shared `Chart` in its `trend` layout and categorical palette.\n */\nexport function UsageLineChart({\n dates,\n series,\n formatDate,\n formatValue,\n emptyLabel,\n labels,\n ariaLabel = 'Daily usage',\n}: UsageLineChartProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_LINE_CHART_LABELS, ...labels }), [labels])\n return (\n <Chart\n type=\"line\"\n layout=\"trend\"\n palette=\"categorical\"\n slot=\"usage-line-chart\"\n labels={dates}\n series={series}\n ariaLabel={ariaLabel}\n formatValue={formatValue}\n formatTick={usageTick}\n formatLabel={formatDate}\n emptyLabel={emptyLabel ?? l.noDailyData}\n hideLegend\n />\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 = 'gbp' | 'tokens'\n\nexport interface UsageShare {\n label: string\n /** Raw amount in the active metric, for the bar width. */\n amount: number\n /** Formatted £ amount, e.g. \"£12.40\". */\n gbp: string\n /** Formatted tokens, e.g. \"3k\". */\n tokens: string\n}\n\n/** Stacked proportion bar plus a per-item list with £, 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.gbp(item.gbp)}`}\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 === 'gbp'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {item.gbp}\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 (£, 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\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) => `Receipts for ${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 AI usage limit per collaborator (£)',\n unit: '£ / user / day',\n save: 'Save',\n}\n\nexport interface InvoiceRowView {\n key: string\n date: string\n /** Formatted amount, e.g. \"$50.00\". */\n amount: string\n /** What the charge was for, e.g. \"Plan\", \"Plan change\", \"Add-on\". */\n kind?: string\n /** Secondary amount line, e.g. \"£35 ex VAT\". */\n amountNote?: 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 flex-wrap items-center gap-x-3 gap-y-0.5\">\n <span className=\"tabular-nums text-muted-foreground\">{invoice.date}</span>\n {invoice.kind && <span className=\"text-foreground\">{invoice.kind}</span>}\n <span className=\"font-medium tabular-nums\">{invoice.amount}</span>\n {invoice.amountNote && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {invoice.amountNote}\n </span>\n )}\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 AI usage 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 step={0.01}\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","import { useMemo, type ReactNode } from 'react'\nimport { Check, Loader2, Mail, Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n VerifiedBadge,\n} from '@arbidocs/react/ui'\nimport { SettingsCard } from './SettingsPanel'\n\n/** Every fixed string of the profile card. `ssoTooltip` prop wins over the label. */\nexport interface ProfileCardLabels {\n firstName: string\n lastName: string\n save: string\n cancel: string\n sso: string\n ssoTooltip: string\n change: string\n newEmailAddress: string\n emailPlaceholder: string\n /** Sentence under the new-email field. */\n codeWillBeSent: string\n sendCode: string\n /** Heading of the verify step: \"Verify new@example.com\". */\n verify: (email: string) => string\n codePlaceholder: string\n enterCodeHint: string\n confirm: string\n /** Resend button while cooling down: \"Resend in 30s\". */\n resendIn: (seconds: number) => string\n resendCode: string\n /** Shown while editing the name of a verified account. */\n verifiedNameLocked: string\n}\n\nexport const DEFAULT_PROFILE_CARD_LABELS: ProfileCardLabels = {\n firstName: 'First name',\n lastName: 'Last name',\n save: 'Save',\n cancel: 'Cancel',\n sso: 'SSO',\n ssoTooltip: 'This email comes from your sign-in provider.',\n change: 'Change',\n newEmailAddress: 'New email address',\n emailPlaceholder: 'you@example.com',\n codeWillBeSent: 'We\\u2019ll send a 3-word verification code to this address.',\n sendCode: 'Send code',\n verify: (email) => `Verify ${email}`,\n codePlaceholder: 'WORD-WORD-WORD',\n enterCodeHint: 'Enter the 3-word code from the email we just sent.',\n confirm: 'Confirm',\n resendIn: (seconds) => `Resend in ${seconds}s`,\n resendCode: 'Resend code',\n verifiedNameLocked: 'Verified name. Remove your identity verification to change it.',\n}\n\nexport interface ProfileNameView {\n /** Display name; \"Unnamed\" is the host's call. */\n display: string\n isEditing: boolean\n givenName: string\n familyName: string\n onGivenNameChange: (value: string) => void\n onFamilyNameChange: (value: string) => void\n onStartEdit: () => void\n onSave: () => void\n onCancel: () => void\n isSaving: boolean\n}\n\nexport interface ProfileEmailChangeView {\n step: 'enter' | 'verify'\n newEmail: string\n onNewEmailChange: (value: string) => void\n onSendCode: () => void\n isSending: boolean\n code: string\n onCodeChange: (value: string) => void\n onConfirm: () => void\n isConfirming: boolean\n /** Seconds until a new code may be requested; 0 when allowed. */\n cooldownSeconds: number\n onCancel: () => void\n}\n\nexport interface ProfileCardProps {\n /** The picture with its change control. */\n avatar: ReactNode\n name: ProfileNameView\n /** A compact status beside the display name. */\n nameBadge?: ReactNode\n email: string\n /** Email is managed by the sign-in provider: shows an \"SSO\" marker instead of \"Change\". */\n isSso: boolean\n /** Verified tick after the name. A verified name is locked (the server refuses a rename), so it is not editable. */\n isVerified?: boolean\n onStartEmailChange: () => void\n /** Open email-change flow; hides the plain email row. */\n emailChange?: ProfileEmailChangeView\n ssoTooltip?: string\n labels?: Partial<ProfileCardLabels>\n}\n\n/** Profile identity: avatar, editable name, email and the inline email-change flow. */\nexport function ProfileCard({\n avatar,\n name,\n nameBadge,\n email,\n isSso,\n isVerified = false,\n onStartEmailChange,\n emailChange,\n ssoTooltip,\n labels,\n}: ProfileCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROFILE_CARD_LABELS, ...labels }), [labels])\n return (\n <SettingsCard>\n <div className=\"flex items-start gap-5\">\n {avatar}\n\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">\n {name.isEditing ? (\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 @xl:flex-row\">\n <Input\n value={name.givenName}\n onChange={(e) => name.onGivenNameChange(e.target.value)}\n placeholder={l.firstName}\n className=\"flex-1\"\n autoFocus\n />\n <Input\n value={name.familyName}\n onChange={(e) => name.onFamilyNameChange(e.target.value)}\n placeholder={l.lastName}\n className=\"flex-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={name.onSave}\n size=\"sm\"\n disabled={!name.givenName.trim() || name.isSaving}\n >\n {name.isSaving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.save}\n </Button>\n <Button\n onClick={name.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={name.isSaving}\n >\n {l.cancel}\n </Button>\n </div>\n </div>\n ) : isVerified ? (\n <div className=\"-mx-2 w-full px-2 py-1\" data-testid=\"verified-name\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <VerifiedBadge className=\"h-4 w-4\" />\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{l.verifiedNameLocked}</p>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={name.onStartEdit}\n className=\"-mx-2 w-full rounded-md px-2 py-1 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <Pencil className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </div>\n </button>\n )}\n </div>\n {!name.isEditing && nameBadge}\n </div>\n\n {!emailChange && (\n <div className=\"-mx-2 flex min-w-0 items-center gap-2 px-2 py-1\">\n <Mail className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">{email}</span>\n {isSso ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"ml-1 shrink-0 cursor-help rounded bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\"\n tabIndex={0}\n >\n {l.sso}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{ssoTooltip ?? l.ssoTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <button\n type=\"button\"\n onClick={onStartEmailChange}\n className=\"ml-auto shrink-0 text-xs font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n >\n {l.change}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {emailChange && !isSso && (\n <div className=\"animate-accordion-down overflow-hidden\">\n <div className=\"space-y-3 rounded-lg bg-background p-4\">\n {emailChange.step === 'enter' ? (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.newEmailAddress}\n </div>\n <Input\n type=\"email\"\n value={emailChange.newEmail}\n onChange={(e) => emailChange.onNewEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.codeWillBeSent}</p>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onSendCode}\n size=\"sm\"\n disabled={!emailChange.newEmail.trim() || emailChange.isSending}\n >\n {emailChange.isSending ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Mail className=\"mr-1 h-4 w-4\" />\n )}\n {l.sendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isSending}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.verify(emailChange.newEmail)}\n </div>\n <Input\n value={emailChange.code}\n onChange={(e) =>\n emailChange.onCodeChange(e.target.value.toUpperCase().replace(/\\s+/g, '-'))\n }\n className={cn('text-center font-mono tracking-wider')}\n placeholder={l.codePlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.enterCodeHint}</p>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onConfirm}\n size=\"sm\"\n disabled={!emailChange.code.trim() || emailChange.isConfirming}\n >\n {emailChange.isConfirming ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.confirm}\n </Button>\n <Button\n onClick={() => {\n if (emailChange.cooldownSeconds > 0) return\n emailChange.onSendCode()\n }}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.cooldownSeconds > 0 || emailChange.isSending}\n >\n {emailChange.cooldownSeconds > 0\n ? l.resendIn(emailChange.cooldownSeconds)\n : l.resendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isConfirming}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n )}\n </div>\n </div>\n )}\n </SettingsCard>\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, ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Progress,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection } 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/** 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\n data-slot=\"plan-picker-card\"\n className=\"space-y-4 rounded-lg border border-border bg-card shadow-xs p-4\"\n >\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 aiUsageResets: (date: string) => string\n cancelsAtPeriodEnd: string\n cancelsAtEndOfBillingPeriod: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_STATUS_LABELS: SubscriptionStatusLabels = {\n aiUsageResets: (date) => `AI usage resets ${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.aiUsageResets(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 ?? `${getEntityLabel('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: 'Payment',\n description: 'Enter your card to start the plan',\n loading: 'Loading…',\n error: \"Checkout didn't load. 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 /** \"£7.60 of £10\". */\n readout: string\n projectId?: string | null\n }\n /** Replaces the Upgrade button (e.g. add-on actions for a project already on a paid plan). */\n actions?: ReactNode\n /** Extra content above the footer (e.g. a plan suggestion). */\n extra?: ReactNode\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 usage used up',\n get projectUsage() {\n return `${getEntityLabel('PROJECT')} usage`\n },\n progress: 'AI usage this month',\n get project() {\n return `${getEntityLabel('PROJECT')}:`\n },\n close: 'Not now',\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 actions,\n extra,\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 <Progress value={usage.percent} aria-label={l.progress} />\n <div\n className=\"flex flex-wrap items-center justify-between gap-x-3 text-sm text-muted-foreground\"\n data-testid=\"quota-usage-readout\"\n >\n <span className=\"tabular-nums\">{usage.readout}</span>\n {usage.projectId && <span className=\"truncate\">{usage.projectId}</span>}\n </div>\n </ModalSection>\n )}\n {extra}\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} data-testid=\"quota-close-button\">\n {l.close}\n </Button>\n {actions ?? (\n <Button onClick={onUpgrade} data-testid=\"quota-upgrade-button\">\n {l.upgrade}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Project list (subscription section) and usage section slots\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/** 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 AI usage 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 { useEffect, useRef, useState, 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 hideCloseButton\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\nexport interface ErrorDialogProps {\n /**\n * The error report a developer may read and copy (`formatErrorReport`). Leave it out for\n * everyone else: the dialog then shows no report at all.\n */\n detailsText?: string\n /** \"Report error\" control (it owns its own submit flow). */\n report: ReactNode\n onRefresh: () => void\n onLogout: () => void\n labels?: Partial<ErrorDialogLabels>\n /** How long \"Copied\" shows after a copy, in ms. Default 2000. */\n copiedMs?: number\n}\n\n/**\n * The crash dialog with its own state: the developer report opens and closes in place, and Copy\n * puts it on the clipboard (showing \"Copied\" for a moment). Render it as an `ErrorBoundary`\n * `fallback`.\n */\nexport function ErrorDialog({ detailsText, copiedMs = 2000, ...view }: ErrorDialogProps) {\n const [isShown, setShown] = useState(false)\n const [isCopied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n useEffect(() => () => clearTimeout(timer.current), [])\n\n const copy = async () => {\n if (detailsText === undefined) return\n try {\n await navigator.clipboard.writeText(detailsText)\n } catch (error) {\n console.error('Failed to copy error details', error)\n return\n }\n setCopied(true)\n clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), copiedMs)\n }\n\n return (\n <ErrorDialogView\n {...view}\n details={\n detailsText === undefined\n ? undefined\n : {\n text: detailsText,\n isShown,\n isCopied,\n onToggle: () => setShown((shown) => !shown),\n onCopy: () => void copy(),\n }\n }\n />\n )\n}\n","import { version as reactVersion } from 'react'\n\n/** One titled block of `label: value` lines in an error report (the host's own context). */\nexport interface ErrorReportSection {\n title: string\n rows: Array<[label: string, value: string]>\n /** Column the values start at. Default: the longest label plus its colon, plus three spaces. */\n labelWidth?: number\n}\n\nexport interface ErrorReportInput {\n error: Error | null\n /** React's component stack (`ErrorInfo.componentStack`), when known. */\n componentStack?: string | null\n /** Which boundary caught it. */\n componentName?: string\n /** The host's context between the error and the stack, e.g. navigation, ids, auth state. */\n sections?: ErrorReportSection[]\n /** Defaults to the current time, URL and user agent; tests pin them. */\n timestamp?: string\n url?: string\n userAgent?: string\n}\n\nconst RULE = '═══════════════════════════════════════════════════════════════'\nconst SUB_RULE = '─────────────────────────────────────────────────────────────'\nconst STACK_LINES = 5\nconst COMPONENT_LINES = 5\n/** Boundaries and router plumbing say nothing about where an error came from. */\nconst NOISE = ['ErrorBoundary', 'RenderedRoute', 'DataRoutes', '_renderMatches']\n\nfunction section({ title, rows, labelWidth }: ErrorReportSection): string {\n const width = labelWidth ?? Math.max(...rows.map(([label]) => label.length + 1)) + 3\n const lines = rows.map(([label, value]) => `${`${label}:`.padEnd(width)}${value}`)\n return [title, SUB_RULE, ...lines].join('\\n')\n}\n\n/**\n * A short plain-text error report for support: the error, the host's context, the first lines of\n * the stack and the nearest components, and the environment. It leaves out props, state and full\n * stacks on purpose, since they can hold the user's content.\n */\nexport function formatErrorReport({\n error,\n componentStack,\n componentName = 'Unknown Component',\n sections = [],\n timestamp = new Date().toISOString(),\n url = window.location.href,\n userAgent = navigator.userAgent,\n}: ErrorReportInput): string {\n const stack = (error?.stack || 'No stack trace available')\n .split('\\n')\n .slice(0, STACK_LINES)\n .join('\\n')\n const components = (componentStack || 'No component stack available')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !NOISE.some((noise) => line.includes(noise)))\n .slice(0, COMPONENT_LINES)\n\n const body = [\n section({\n title: 'ERROR DETAILS',\n rows: [\n ['Type', error?.name || 'Unknown'],\n ['Message', error?.message || 'Unknown error'],\n ['Component', componentName],\n ['URL', url],\n ],\n }),\n ...sections.map(section),\n ['STACK TRACE (First 5 Lines)', SUB_RULE, stack].join('\\n'),\n [\n 'COMPONENT HIERARCHY',\n SUB_RULE,\n components.length > 0 ? components.join('\\n') : 'No meaningful component stack available',\n ].join('\\n'),\n section({\n title: 'ENVIRONMENT',\n rows: [\n ['React Version', reactVersion],\n ['Browser', userAgent],\n ],\n }),\n ]\n\n return [\n RULE,\n 'ERROR REPORT',\n RULE,\n '',\n `TIMESTAMP: ${timestamp}`,\n '',\n body.join('\\n\\n'),\n '',\n RULE,\n 'END OF REPORT',\n RULE,\n ].join('\\n')\n}\n","/**\n * Pure mappers from the account data the hooks return to the props of the settings parts\n * (`ActiveSessionsDialog`, `LogoutDialog`, `DeleteAccountDialog`, `NotificationCategoryList`).\n * No React Query, no SDK: a host with its own data layer uses them too.\n */\n\nimport type { ReactNode } from 'react'\nimport type { ActiveSessionView, DeleteAccountBlocker } from './AccountDialogs'\nimport type { LogoutSessionView } from './LogoutDialog'\nimport type { NotificationCategory } from './NotificationCategoryList'\n\n/** A session as `GET /v1/user/sessions` reports it (the fields the views read). */\nexport interface SessionLike {\n session_id: string\n name?: string | null\n ip_address?: string | null\n workspaces: readonly string[]\n status?: string | null\n /** Seconds left. */\n ttl: number\n}\n\n/** Remaining seconds as `1d 2h 3m`; `expired` at or below zero. */\nexport function formatSessionTtl(totalSeconds: number): string {\n if (totalSeconds <= 0) return 'expired'\n const days = Math.floor(totalSeconds / 86400)\n const hours = Math.floor((totalSeconds % 86400) / 3600)\n const minutes = Math.floor((totalSeconds % 3600) / 60)\n const parts: string[] = []\n if (days > 0) parts.push(`${days}d`)\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0) parts.push(`${minutes}m`)\n return parts.length > 0 ? parts.join(' ') : '<1m'\n}\n\nexport interface ToActiveSessionViewsOptions {\n /** This device's session id (`useCurrentSessionId`); it is listed first and cannot be ended. */\n currentSessionId: string | null\n /** The session being ended right now, for its spinner. */\n terminatingId?: string | null\n /** Glyph per status (`user` / `agent`). */\n renderIcon?: (status: string) => ReactNode\n formatTtl?: (seconds: number) => string\n}\n\n/** Sessions as `ActiveSessionsDialog` rows: this device first, a detail line, agents marked. */\nexport function toActiveSessionViews(\n sessions: readonly SessionLike[],\n {\n currentSessionId,\n terminatingId,\n renderIcon,\n formatTtl = formatSessionTtl,\n }: ToActiveSessionViewsOptions\n): ActiveSessionView[] {\n return sessions\n .map((session) => {\n const status = session.status || 'user'\n const count = session.workspaces.length\n return {\n id: session.session_id,\n name: session.name || (status === 'agent' ? 'Agent session' : 'Browser session'),\n isCurrent: session.session_id === currentSessionId,\n isAgent: status === 'agent',\n detail: `${session.ip_address ?? 'Unknown IP'} · expires in ${formatTtl(session.ttl)}${\n count > 0 ? ` · ${count} workspace${count > 1 ? 's' : ''}` : ''\n }`,\n isTerminating: terminatingId === session.session_id,\n icon: renderIcon?.(status),\n }\n })\n .sort((a, b) => Number(b.isCurrent) - Number(a.isCurrent))\n}\n\n/** Sessions as `LogoutDialog` rows. */\nexport function toLogoutSessionViews(\n sessions: readonly SessionLike[],\n formatTtl: (seconds: number) => string = formatSessionTtl\n): LogoutSessionView[] {\n return sessions.map((session) => ({\n id: session.session_id,\n status: session.status || 'user',\n ipAddress: session.ip_address,\n ttlLabel: formatTtl(session.ttl),\n workspaceCount: session.workspaces.length,\n }))\n}\n\n/** A reason the account cannot be closed yet (see `parseDeleteAccountBlockers`). */\nexport type DeleteBlockerLike =\n { type: 'active_subscription' } | { type: 'workspace_members'; workspaces: readonly string[] }\n\n/** Blockers as `DeleteAccountDialog` rows. `renderSubscriptionLink` lets the host link its billing page. */\nexport function toDeleteBlockerViews(\n blockers: readonly DeleteBlockerLike[],\n renderSubscriptionLink?: () => ReactNode\n): DeleteAccountBlocker[] {\n return blockers.flatMap<DeleteAccountBlocker>((blocker) =>\n blocker.type === 'active_subscription'\n ? [\n {\n key: 'active_subscription',\n content: renderSubscriptionLink\n ? renderSubscriptionLink()\n : 'Active subscription: cancel it in your subscription settings first',\n },\n ]\n : blocker.workspaces.map((ws) => ({\n key: `workspace-${ws}`,\n content: `You are the sole admin of workspace \"${ws}\" — transfer admin rights or remove all other members first`,\n }))\n )\n}\n\n/** One email category the user can switch: its key in the settings record and its wording. */\nexport interface EmailNotificationCategoryDef {\n key: string\n label: string\n description: string\n}\n\n/** The categories ARBI sends email for today (add one when the backend adds it). */\nexport const EMAIL_NOTIFICATION_CATEGORIES: readonly EmailNotificationCategoryDef[] = [\n { key: 'messages', label: 'New messages', description: 'A direct message while you’re offline' },\n { key: 'workspace_added', label: 'Workspace access', description: 'You’re added to a workspace' },\n {\n key: 'contact_accepted',\n label: 'Invitation accepted',\n description: 'Someone accepts your invitation',\n },\n { key: 'referral_reward', label: 'Rewards', description: 'You earn a reward' },\n {\n key: 'product_updates',\n label: 'ARBI update',\n description: 'Weekly digest of new features and highlights',\n },\n]\n\n/** The category keys, in the order the list shows them. */\nexport const EMAIL_NOTIFICATION_KEYS: readonly string[] = EMAIL_NOTIFICATION_CATEGORIES.map(\n (c) => c.key\n)\n\n/** Category definitions plus their states as `NotificationCategoryList` rows. */\nexport function toNotificationCategories(\n checked: Readonly<Record<string, boolean>>,\n defs: readonly EmailNotificationCategoryDef[] = EMAIL_NOTIFICATION_CATEGORIES\n): NotificationCategory[] {\n return defs.map((def) => ({ ...def, checked: checked[def.key] ?? true }))\n}\n","/**\n * Identity verification blocks: the settings card, the dialog (pay → verify in Didit's frame →\n * result) and a gate for deployments that require it. All take the `IdentityVerificationFlow` from\n * `@arbidocs/react` (`useIdentityVerification` with a provider, or `useIdentityVerificationFlow`\n * bound to a host's own API), so they work the same inside ARBI and on a customer's site.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { ExternalLink, Loader2, ShieldCheck } from 'lucide-react'\nimport { Button, VerifiedBadge, type IdentityVerificationFlow } from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\nimport { SettingsCard, SettingsDisclosure, SettingsRow } from './SettingsPanel'\n\n/** Every fixed string of the identity verification blocks. */\nexport interface IdentityVerificationLabels {\n title: string\n intro: string\n /** \"£5.00 incl. VAT · 3 attempts\" (`price` comes formatted, VAT note included). */\n priceLine: (price: string, attempts: number) => string\n proOnly: string\n seePlans: string\n manageBilling: string\n verify: string\n continue: string\n attemptsLeft: (n: number) => string\n verified: string\n verifiedDetail: (country: string) => string\n inReview: string\n finishName: string\n finish: string\n remove: string\n payTitle: string\n payBody: (price: string, attempts: number) => string\n pay: string\n confirmPayment: string\n paymentConfirmed: string\n verifyTitle: string\n embedFailed: string\n openInNewTab: string\n checkResult: string\n resultVerified: string\n resultDeclined: (attemptsLeft: number) => string\n tryAgain: string\n resultInReview: string\n nameMismatchTitle: string\n nameMismatchBody: string\n documentName: string\n accountName: string\n useDocumentName: (name: string) => string\n keepName: string\n close: string\n requiredTitle: string\n requiredBody: string\n requiredProOnly: string\n}\n\nexport const DEFAULT_IDENTITY_VERIFICATION_LABELS: IdentityVerificationLabels = {\n title: 'Identity verification',\n intro: 'Check your ID once to get a verified tick next to your name.',\n priceLine: (price, attempts) => `${price} · ${attempts} attempts`,\n proOnly: 'Available on Pro plans.',\n seePlans: 'See plans',\n manageBilling: 'Manage billing',\n verify: 'Verify identity',\n continue: 'Continue',\n attemptsLeft: (n) => `${n} attempt${n === 1 ? '' : 's'} left`,\n verified: 'Verified',\n verifiedDetail: (country) => `ID issued in ${country}`,\n inReview: 'Your check is being reviewed. We’ll update this when it’s done.',\n finishName: 'Your ID was verified. Confirm your name to get the tick.',\n finish: 'Finish',\n remove: 'Remove',\n payTitle: 'Verify your identity',\n payBody: (price, attempts) =>\n `A one-time fee of ${price} is charged to the card on your Pro plan. It covers up to ${attempts} attempts. Your ID is checked by our provider, Didit; ARBI does not keep your document.`,\n pay: 'Pay and continue',\n confirmPayment: 'Confirm payment with your bank',\n paymentConfirmed: 'I’ve confirmed it',\n verifyTitle: 'Scan your ID',\n embedFailed: 'Your camera isn’t available here. Continue in a new tab, then come back.',\n openInNewTab: 'Open in a new tab',\n checkResult: 'I’ve finished',\n resultVerified: 'You’re verified. The tick now shows next to your name.',\n resultDeclined: (n) =>\n n > 0\n ? `We couldn’t verify your ID. You have ${n} attempt${n === 1 ? '' : 's'} left.`\n : 'We couldn’t verify your ID and no attempts are left.',\n tryAgain: 'Try again',\n resultInReview: 'Your check needs a manual review. We’ll show the result here when it’s done.',\n nameMismatchTitle: 'Your ID was verified',\n nameMismatchBody:\n 'The name on your ID differs from your account name. The tick shows only with the name on your ID.',\n documentName: 'Name on your ID',\n accountName: 'Account name',\n useDocumentName: (name) => `Change my name to ${name}`,\n keepName: 'Keep my name',\n close: 'Close',\n requiredTitle: 'Identity verification required',\n requiredBody: 'This workspace requires a verified identity before you continue.',\n requiredProOnly: 'Identity verification is available on Pro plans. Ask your administrator.',\n}\n\nfunction useLabels(labels?: Partial<IdentityVerificationLabels>) {\n return useMemo(() => ({ ...DEFAULT_IDENTITY_VERIFICATION_LABELS, ...labels }), [labels])\n}\n\n/** Refusals the user fixes in billing (plan, card, address). */\nconst BILLING_CODES = [\n 'PRO_REQUIRED',\n 'PAYMENT_METHOD_REQUIRED',\n 'BILLING_ADDRESS_REQUIRED',\n 'PAYMENT_DECLINED',\n]\n\nfunction Problem({\n flow,\n onManageBilling,\n label,\n}: {\n flow: IdentityVerificationFlow\n onManageBilling?: () => void\n label: string\n}) {\n if (!flow.problem) return null\n const billing = onManageBilling && BILLING_CODES.includes(flow.problem.code ?? '')\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"identity-problem\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {flow.problem.message}\n </p>\n {billing && (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {label}\n </Button>\n )}\n </div>\n )\n}\n\n// ── Card ────────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationCardProps {\n /** Secondary account settings start closed; payment and verification remain explicit actions. */\n collapsible?: boolean\n flow: IdentityVerificationFlow\n /** Open the host's plans / billing (upgrade to Pro, fix the card or address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** Settings row for the ID check: offer, progress, or the tick. Renders nothing when not offered. */\nexport function IdentityVerificationCard({\n collapsible = false,\n flow,\n onManageBilling,\n labels,\n}: IdentityVerificationCardProps) {\n const l = useLabels(labels)\n const { status } = flow\n if (!status?.enabled) return null\n const busy = flow.busy !== null\n\n let description: ReactNode\n let action: ReactNode = null\n if (status.verified) {\n description = (\n <span className=\"inline-flex items-center gap-1.5\">\n <VerifiedBadge />\n {l.verified}\n {status.document_country && (\n <span className=\"text-muted-foreground\">\n {' · '}\n {l.verifiedDetail(status.document_country)}\n </span>\n )}\n </span>\n )\n action = (\n <Button size=\"sm\" variant=\"ghost\" onClick={flow.remove} disabled={busy}>\n {l.remove}\n </Button>\n )\n } else if (!status.eligible) {\n description = `${l.intro} ${l.proOnly}`\n action = onManageBilling ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {l.seePlans}\n </Button>\n ) : null\n } else if (status.state === 'in_review') {\n description = l.inReview\n } else if (status.state === 'name_mismatch') {\n description = l.finishName\n action = (\n <Button size=\"sm\" onClick={flow.open}>\n {l.finish}\n </Button>\n )\n } else {\n const resuming = status.attempts_left > 0 || status.state === 'in_progress'\n description = (\n <>\n {l.intro}{' '}\n <span className=\"text-muted-foreground\">\n {resuming\n ? l.attemptsLeft(status.attempts_left)\n : l.priceLine(flow.price ?? '', status.attempts_per_fee)}\n </span>\n </>\n )\n action = (\n <Button size=\"sm\" onClick={flow.open} disabled={busy}>\n <ShieldCheck className=\"mr-1 h-4 w-4\" />\n {resuming ? l.continue : l.verify}\n </Button>\n )\n }\n\n const card = (\n <SettingsCard padding=\"sm\" data-testid=\"identity-verification-card\">\n <SettingsRow label={collapsible ? null : l.title} description={description}>\n {action}\n </SettingsRow>\n {!flow.isOpen && (\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n )}\n </SettingsCard>\n )\n return collapsible ? (\n <SettingsDisclosure title={l.title} testId=\"identity-verification-settings\">\n {card}\n </SettingsDisclosure>\n ) : (\n card\n )\n}\n\n// ── Dialog ──────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationDialogProps {\n flow: IdentityVerificationFlow\n /** The account name as shown, compared with the name on the document. */\n accountName: string\n /** Block closing (the `RequireVerified` gate). Default true. */\n dismissible?: boolean\n /** Open the host's billing to fix a refused payment (plan, card, address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The verification dialog: pay the fee, verify in Didit's embedded frame, then the result. */\nexport function IdentityVerificationDialog({\n flow,\n accountName,\n dismissible = true,\n onManageBilling,\n labels,\n}: IdentityVerificationDialogProps) {\n const l = useLabels(labels)\n const { status } = flow\n const attempts = status?.attempts_per_fee ?? 0\n const docName = [status?.document_given_name, status?.document_family_name]\n .filter(Boolean)\n .join(' ')\n const spinner = <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n\n let body: ReactNode\n let footer: ReactNode = null\n if (flow.step === 'pay') {\n body = flow.paymentUrl ? (\n <a\n href={flow.paymentUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {l.confirmPayment}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.payBody(flow.price ?? '', attempts)}</p>\n )\n footer = flow.paymentUrl ? (\n <Button onClick={flow.recheckPayment} disabled={flow.busy !== null}>\n {flow.busy === 'start' && spinner}\n {l.paymentConfirmed}\n </Button>\n ) : (\n <Button onClick={flow.pay} disabled={flow.busy !== null} data-testid=\"identity-pay\">\n {flow.busy === 'pay' && spinner}\n {l.pay}\n </Button>\n )\n } else if (flow.step === 'verify') {\n body = (\n <div className=\"space-y-3\">\n {flow.embedFailed ? (\n <p className=\"text-sm text-muted-foreground\">{l.embedFailed}</p>\n ) : (\n <div\n id={flow.verifyContainerId}\n ref={flow.verifyContainerRef}\n className=\"h-[560px] w-full overflow-hidden rounded-md bg-muted\"\n data-testid=\"identity-didit-frame\"\n >\n {flow.busy === 'start' && (\n <div className=\"flex h-full items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n </div>\n )\n footer = (\n <>\n {flow.embedFailed && (\n <Button variant=\"outline\" onClick={flow.openInNewTab}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n {l.openInNewTab}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={flow.checkResult} disabled={flow.busy !== null}>\n {flow.busy === 'refresh' && spinner}\n {l.checkResult}\n </Button>\n </>\n )\n } else if (status?.state === 'name_mismatch') {\n body = (\n <div className=\"space-y-3\" data-testid=\"identity-name-mismatch\">\n <p className=\"text-sm text-muted-foreground\">{l.nameMismatchBody}</p>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n <dt className=\"text-muted-foreground\">{l.documentName}</dt>\n <dd className=\"font-medium\">{docName}</dd>\n <dt className=\"text-muted-foreground\">{l.accountName}</dt>\n <dd>{accountName}</dd>\n </dl>\n </div>\n )\n footer = (\n <>\n <Button variant=\"ghost\" onClick={flow.keepName} disabled={flow.busy !== null}>\n {l.keepName}\n </Button>\n <Button onClick={flow.acceptName} disabled={flow.busy !== null || !docName}>\n {flow.busy === 'accept' && spinner}\n {l.useDocumentName(docName)}\n </Button>\n </>\n )\n } else if (status?.verified) {\n body = (\n <p className=\"flex items-center gap-2 text-sm\">\n <VerifiedBadge className=\"h-4 w-4\" />\n {l.resultVerified}\n </p>\n )\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else if (status?.state === 'in_review') {\n body = <p className=\"text-sm text-muted-foreground\">{l.resultInReview}</p>\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else {\n const left = status?.attempts_left ?? 0\n body = <p className=\"text-sm text-muted-foreground\">{l.resultDeclined(left)}</p>\n footer =\n left > 0 ? (\n <Button onClick={flow.retry} disabled={flow.busy !== null}>\n {l.tryAgain}\n </Button>\n ) : (\n <Button onClick={flow.close}>{l.close}</Button>\n )\n }\n\n const title =\n status?.state === 'name_mismatch' && flow.step === 'result'\n ? l.nameMismatchTitle\n : flow.step === 'verify'\n ? l.verifyTitle\n : l.payTitle\n return (\n <ModalScaffold\n open={flow.isOpen}\n onOpenChange={(open) => (open ? flow.open() : flow.close())}\n title={title}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n size={flow.step === 'verify' ? 'lg' : 'md'}\n dismissible={dismissible}\n testId=\"identity-verification-dialog\"\n >\n <ModalScaffold.Body>\n {body}\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>{footer}</ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n// ── Gate ────────────────────────────────────────────────────────────────────\n\nexport interface RequireVerifiedProps {\n flow: IdentityVerificationFlow\n accountName: string\n onManageBilling?: () => void\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/**\n * Children behind a verified identity when the deployment requires it (`status.required`): until\n * the user is verified a dialog that cannot be dismissed covers them. Passes through otherwise.\n */\nexport function RequireVerified({\n flow,\n accountName,\n onManageBilling,\n children,\n labels,\n}: RequireVerifiedProps) {\n const l = useLabels(labels)\n const { status } = flow\n const blocked = Boolean(status?.enabled && status.required && !status.verified)\n if (!blocked || !status) return <>{children}</>\n\n if (flow.isOpen) {\n return (\n <>\n {children}\n <IdentityVerificationDialog\n flow={flow}\n accountName={accountName}\n dismissible={false}\n onManageBilling={onManageBilling}\n labels={labels}\n />\n </>\n )\n }\n return (\n <>\n {children}\n <ModalScaffold\n open\n onOpenChange={() => {}}\n title={l.requiredTitle}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n dismissible={false}\n testId=\"identity-required-gate\"\n >\n <ModalScaffold.Body>\n <p className=\"text-sm text-muted-foreground\">\n {status.eligible ? l.requiredBody : l.requiredProOnly}\n </p>\n </ModalScaffold.Body>\n {status.eligible && (\n <ModalScaffold.Footer>\n <Button onClick={flow.open}>{l.verify}</Button>\n </ModalScaffold.Footer>\n )}\n </ModalScaffold>\n </>\n )\n}\n","/**\n * A settings page: a tab per section, the open section's body under a page title. Each section is\n * addressable by its id, so a host (or `openSettings(section)`) can open the page at one.\n */\nimport type { ReactNode } from 'react'\nimport { TabHeader } from '../shell/TabHeader'\nimport { DraggableHeader } from './DraggableHeader'\nimport { PanelFrame, PanelFrameBody } from './PanelFrame'\n\nexport interface SettingsPageSection {\n /** Addressable id, e.g. `account`; the tab's test id is `<id>-tab`. */\n id: string\n label: ReactNode\n icon?: ReactNode\n /** The section's body, rendered only while it is open. */\n render: () => ReactNode\n /** Controls at the right of the tab row while this section is open. */\n actions?: ReactNode\n}\n\nexport interface SettingsPageProps {\n sections: readonly SettingsPageSection[]\n /** The open section's id; an id with no section opens the first. */\n activeSectionId: string | undefined\n onSectionChange: (id: string) => void\n /** Page heading above the section body; default `Settings`. */\n title?: ReactNode\n /** Controls at the right of the tab row on every section (e.g. the panel's mode switcher). */\n headerActions?: ReactNode\n /** Dialogs and other content outside the frame. */\n children?: ReactNode\n testId?: string\n}\n\n/** The section a page opens at: the one asked for when it exists, else the first. */\nexport function resolveSettingsSection(\n sections: readonly SettingsPageSection[],\n id: string | undefined\n): SettingsPageSection | undefined {\n return sections.find((section) => section.id === id) ?? sections[0]\n}\n\nexport function SettingsPage({\n sections,\n activeSectionId,\n onSectionChange,\n title = 'Settings',\n headerActions,\n children,\n testId = 'settings-page',\n}: SettingsPageProps) {\n const active = resolveSettingsSection(sections, activeSectionId)\n return (\n <>\n <PanelFrame testId={testId}>\n <DraggableHeader>\n <TabHeader\n tabs={sections.map(({ id, label, icon }) => ({ id, label, icon }))}\n activeTabId={active?.id ?? ''}\n onTabChange={onSectionChange}\n variant=\"underline\"\n // Settings icons alone do not tell the sections apart on touch: keep the labels and\n // let the row scroll instead of collapsing to icons.\n compactBreakpoint={0}\n rightContent={() => (\n <div className=\"flex items-center gap-2\">\n {active?.actions}\n {headerActions}\n </div>\n )}\n />\n </DraggableHeader>\n <PanelFrameBody className=\"overflow-auto px-6 pb-6 pt-4\">\n <h1 className=\"mx-auto mb-4 w-full max-w-2xl text-xl font-semibold text-foreground\">\n {title}\n </h1>\n {active?.render()}\n </PanelFrameBody>\n </PanelFrame>\n {children}\n </>\n )\n}\n","/**\n * Appearance: the reader's colour scheme, text size and typeface. Every change applies at once;\n * there is no Save, because there is nothing to lose. The host keeps the choice (on the device).\n */\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@arbidocs/react/ui'\nimport { Moon, RotateCcw, Sun } from 'lucide-react'\nimport type { AppearanceColorScheme, AppearanceTextSize } from '../theme/appearance'\nimport { getFontPairing } from '../theme/fontPairings'\nimport { SegmentedControl, type SegmentedOption } from './SegmentedControl'\nimport { SettingsPanel, SettingsSection } from './SettingsPanel'\n\nconst SCHEME_OPTIONS: SegmentedOption<AppearanceColorScheme>[] = (\n [\n { value: 'light', label: 'Light', icon: <Sun className=\"h-4 w-4\" /> },\n { value: 'dark', label: 'Dark', icon: <Moon className=\"h-4 w-4\" /> },\n ] as const\n).map((option) => ({ ...option, testId: `appearance-scheme-${option.value}` }))\n\nconst TEXT_SIZE_OPTIONS: SegmentedOption<AppearanceTextSize>[] = (\n [\n { value: 'default', label: 'Default' },\n { value: 'large', label: 'Large' },\n { value: 'larger', label: 'Larger' },\n ] as const\n).map((option) => ({ ...option, testId: `appearance-text-size-${option.value}` }))\n\n/** The typefaces offered by default: a spread across `FONT_PAIRINGS`. */\nexport const DEFAULT_APPEARANCE_PAIRING_IDS = [\n 'office',\n 'inter',\n 'fraunces-inter',\n 'montserrat-nunito',\n] as const\n\nexport interface AppearanceSettingsProps {\n colorScheme: AppearanceColorScheme\n onColorSchemeChange: (scheme: AppearanceColorScheme) => void\n textSize: AppearanceTextSize\n onTextSizeChange: (size: AppearanceTextSize) => void\n /** The typeface (a `FONT_PAIRINGS` id). */\n pairingId: string\n onPairingChange: (pairingId: string) => void\n /** Typefaces to offer; default {@link DEFAULT_APPEARANCE_PAIRING_IDS}. */\n pairingIds?: readonly string[]\n /** Shown while the choice differs from the defaults. */\n onReset?: () => void\n}\n\nexport function AppearanceSettings({\n colorScheme,\n onColorSchemeChange,\n textSize,\n onTextSizeChange,\n pairingId,\n onPairingChange,\n pairingIds = DEFAULT_APPEARANCE_PAIRING_IDS,\n onReset,\n}: AppearanceSettingsProps) {\n const activePairing = getFontPairing(pairingId) ?? getFontPairing(pairingIds[0])\n return (\n <SettingsPanel testId=\"settings-appearance\">\n <SettingsSection\n title=\"Colour scheme\"\n action={\n onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"flex items-center gap-1.5 py-1 text-sm text-muted-foreground hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"appearance-reset\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Reset\n </button>\n )\n }\n >\n <SegmentedControl\n value={colorScheme}\n onChange={onColorSchemeChange}\n options={SCHEME_OPTIONS}\n ariaLabel=\"Colour scheme\"\n />\n </SettingsSection>\n\n <SettingsSection title=\"Text size\">\n <SegmentedControl\n value={textSize}\n onChange={onTextSizeChange}\n options={TEXT_SIZE_OPTIONS}\n ariaLabel=\"Text size\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Makes all text larger, including documents in the viewer and citations. Applied straight\n away and remembered on this device.\n </p>\n </SettingsSection>\n\n <SettingsSection title=\"Typeface\">\n <Select value={pairingId} onValueChange={onPairingChange}>\n <SelectTrigger className=\"w-full\" data-testid=\"appearance-typeface-select\">\n <SelectValue>\n {activePairing && (\n <span style={{ fontFamily: activePairing.display }}>{activePairing.label}</span>\n )}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {pairingIds.map((id) => {\n const pairing = getFontPairing(id)\n if (!pairing) return null\n return (\n <SelectItem key={id} value={id} data-testid={`appearance-typeface-${id}`}>\n <span style={{ fontFamily: pairing.display }}>{pairing.label}</span>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n <p className=\"text-sm text-muted-foreground\">\n Sets the headings and body text across the app. Applied straight away and remembered on\n this device.\n </p>\n </SettingsSection>\n </SettingsPanel>\n )\n}\n","/**\n * The tri-state filter's evaluator over an inverted index (`Map<key, Set<itemId>>`): include is OR\n * across keys, exclude drops a match and wins over include. What a `TriStateFilterMenu` selection\n * lets through a list (the Files list, the Tags page's tagged items).\n */\n\nimport type { TriState } from './TriStateFilterMenu'\n\n/**\n * Tri-state filter evaluator backed by an inverted index\n * (`Map<filterKey, Set<itemId>>`). Same semantics as\n * the tri-state filter menu — excluded wins, include is OR across keys —\n * but avoids the per-item attribute record lookup.\n *\n * Scales well when:\n * - many filter keys are active (no per-item M-key scan),\n * - or the selected filters are selective (union sets stay small).\n *\n * Complexity: O(sum of excluded+included set sizes) to build the\n * unions, plus O(N) over `items` to preserve order — every lookup in\n * the scan is O(1) hash.\n */\nexport function applyInvertedIndexFilter<T, K extends string>(\n items: T[],\n filterStates: ReadonlyMap<K, TriState>,\n invertedIndex: Map<K, Set<string>>,\n getId: (item: T) => string\n): T[] {\n const includeKeys: K[] = []\n const excludeKeys: K[] = []\n for (const [key, state] of filterStates) {\n if (state === 'include') includeKeys.push(key)\n else if (state === 'exclude') excludeKeys.push(key)\n }\n\n if (includeKeys.length === 0 && excludeKeys.length === 0) return items\n\n const excluded = new Set<string>()\n for (const key of excludeKeys) {\n const set = invertedIndex.get(key)\n if (set) for (const id of set) excluded.add(id)\n }\n\n let included: Set<string> | null = null\n if (includeKeys.length > 0) {\n included = new Set<string>()\n for (const key of includeKeys) {\n const set = invertedIndex.get(key)\n if (set) for (const id of set) included.add(id)\n }\n }\n\n return items.filter((item) => {\n const id = getId(item)\n if (excluded.has(id)) return false\n if (included && !included.has(id)) return false\n return true\n })\n}\n\n/**\n * The inverted index {@link applyInvertedIndexFilter} reads (`Map<key, Set<itemId>>`), built in\n * one pass from each item's keys.\n */\nexport function buildInvertedIndex<T>(\n items: T[],\n getId: (item: T) => string,\n getKeys: (item: T) => Iterable<string>\n): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>()\n for (const item of items) {\n const id = getId(item)\n for (const key of getKeys(item)) {\n let set = index.get(key)\n if (!set) index.set(key, (set = new Set()))\n set.add(id)\n }\n }\n return index\n}\n","/**\n * The Experimental \"Audio/video calls\" row: unavailable while the server has calls off, the\n * person's own opt-in while calls are experimental there, and simply on (nothing to switch) where\n * the deployment made them a regular feature (`experimental: false`).\n */\nexport function callsSwitchState(\n config: { enabled?: boolean; experimental?: boolean } | undefined,\n optedIn: boolean\n): { checked: boolean; disabled: boolean; description: string } {\n if (config?.enabled !== true) {\n return {\n checked: false,\n disabled: true,\n description:\n 'Not available on this server. Enable on the server with manage-deployment --calls.',\n }\n }\n if (config.experimental === false) {\n return { checked: true, disabled: true, description: 'On for everyone on this server.' }\n }\n return {\n checked: optedIn,\n disabled: false,\n description:\n 'End-to-end encrypted calls from threads and DMs, scheduled calls and incoming-call rings. Call links open either way.',\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/settings/PasswordChangeDialog.tsx","../src/settings/LogoutDialog.tsx","../src/settings/FloatingPanel.tsx","../src/settings/DraggableHeader.tsx","../src/settings/PanelFrame.tsx","../src/settings/ConfigSwitcherBar.tsx","../src/settings/ConversationSettingsParts.tsx","../src/settings/ServerConnectionControls.tsx","../src/settings/SettingsSwitchRow.tsx","../src/settings/NotificationCategoryList.tsx","../src/settings/PremiumModelsFrame.tsx","../src/settings/ThreadPreviewDialog.tsx","../src/settings/JsonTree.tsx","../src/settings/message-schema-hints.ts","../src/settings/MessageJsonTree.tsx","../src/settings/TipsEditorDialog.tsx","../src/settings/SyncDialogParts.tsx","../src/settings/tri-state-filters.ts","../src/settings/FilterChip.tsx","../src/settings/PlanBadge.tsx","../src/settings/MoreInfo.tsx","../src/settings/QuotaMeter.tsx","../src/settings/PlanCard.tsx","../src/settings/ReferralReward.tsx","../src/settings/AccountDialogs.tsx","../src/settings/ConnectionCard.tsx","../src/settings/AvatarPicker.tsx","../src/settings/Projects.tsx","../src/settings/SupportPanel.tsx","../src/settings/WelcomeDialog.tsx","../src/settings/Usage.tsx","../src/settings/Billing.tsx","../src/settings/ProfileCard.tsx","../src/settings/EmailWorkspaceDialogView.tsx","../src/settings/SubscriptionParts.tsx","../src/settings/ErrorDialog.tsx","../src/settings/error-report.ts","../src/settings/account-views.ts","../src/settings/IdentityVerification.tsx","../src/settings/SettingsPage.tsx","../src/settings/AppearanceSettings.tsx","../src/settings/inverted-index-filter.ts","../src/settings/calls-switch.ts"],"names":["useId","useMemo","jsx","Dialog","jsxs","DialogContent","testIdOr","DialogHeader","DialogTitle","DialogDescription","CheckCircle2","Button","Input","PasswordStrengthInput","AlertCircle","Fragment","Loader2","formatCount","Badge","useState","useRestoreFocus","LogOut","DialogFooter","Collapsible","CollapsibleTrigger","ChevronDown","ChevronRight","Radio","CollapsibleContent","cn","TabHeader","Star","Undo2","History","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Trash2","ModalSection","ModalSectionTitle","Tooltip","TooltipTrigger","Users","TooltipContent","Sparkles","Brain","RefreshCw","Wifi","WifiOff","Switch","Checkbox","prefixedTestId","Crown","ModalHeader","formatValue","Check","Copy","Label","ModalScaffold","Textarea","Pencil","Plus","ScrollArea","X","cva","TONE_SURFACE","TONE_BORDER","Info","valueColor","Tag","Gift","AlertTriangle","PlugIcon","ToneBadge","ExternalLink","ShieldCheck","Plug","useRef","Avatar","AvatarImage","AvatarFallback","Camera","entityNoun","MessageCircleQuestionMark","BookOpen","UsageMeter","UserPlus","categoricalStyle","Chart","RadioGroupPrimitive","ChartNoAxesColumn","FileText","SettingsCard","VerifiedBadge","Mail","Send","Clock","InfinityIcon","getEntityLabel","Progress","useEffect","reactVersion","SettingsRow","SettingsDisclosure","section","Sun","Moon","getFontPairing","SettingsPanel","SettingsSection","RotateCcw","SegmentedControl"],"mappings":"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","file":"chunk-JBL4PPEE.cjs","sourcesContent":["import { useMemo, type FormEvent, type ReactNode, useId } from 'react'\nimport { AlertCircle, CheckCircle2, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n PasswordStrengthInput,\n type PasswordStrengthInputLabels,\n type PasswordStrengthInputTestIds,\n} from '../auth/PasswordStrengthInput'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the password-change dialog. */\nexport interface PasswordChangeDialogLabels {\n setNewPasswordTitle: string\n changeMasterPasswordTitle: string\n recoveryDescription: string\n changeDescription: string\n passwordChanged: string\n /** Success note: a password change keeps the account key, so the saved recovery key still works. */\n recoveryKeyUnchanged: string\n done: string\n recoverySuccessful: string\n currentPassword: string\n currentPasswordPlaceholder: string\n masterPassword: string\n newPassword: string\n confirmPassword: string\n confirmNewPassword: string\n cancel: string\n settingPassword: string\n changingPassword: string\n continue: string\n changePassword: string\n}\n\nexport const DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS: PasswordChangeDialogLabels = {\n setNewPasswordTitle: 'Set New Password',\n changeMasterPasswordTitle: 'Change Master Password',\n recoveryDescription: 'Set a new password for your recovered account',\n changeDescription: 'Change your master password dialog',\n passwordChanged: 'Password changed',\n recoveryKeyUnchanged:\n 'Your recovery key is unchanged: the one you saved still recovers this account.',\n done: 'Done',\n recoverySuccessful: 'Recovery successful. Set a new master password to continue.',\n currentPassword: 'Current Password',\n currentPasswordPlaceholder: 'Enter current password',\n masterPassword: 'Master Password',\n newPassword: 'New Password',\n confirmPassword: 'Confirm Password',\n confirmNewPassword: 'Confirm New Password',\n cancel: 'Cancel',\n settingPassword: 'Setting Password...',\n changingPassword: 'Changing Password...',\n continue: 'Continue',\n changePassword: 'Change Password',\n}\n\nexport interface PasswordChangeDialogProps {\n labels?: Partial<PasswordChangeDialogLabels>\n /** Labels forwarded to the embedded password input. */\n passwordInputLabels?: Partial<PasswordStrengthInputLabels>\n /** Dialog test id (default `change-password-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'done' | 'currentInput' | 'error' | 'cancel' | 'submit', string>>\n /** Ids forwarded to the embedded password input. */\n passwordInputTestIds?: PasswordStrengthInputTestIds\n open: boolean\n /** Dismiss (also fired by Cancel and the close button). */\n onClose: () => void\n /** After recovery with a key: no current password, no Cancel, full-width Continue. */\n recoveryMode: boolean\n currentPassword: string\n onCurrentPasswordChange: (value: string) => void\n newPassword: string\n onNewPasswordChange: (value: string) => void\n confirmPassword: string\n onConfirmPasswordChange: (value: string) => void\n /** The host's password policy (see `PasswordStrengthInput`). */\n getUnmetRequirement: (password: string) => string | null\n error: string | null\n isProcessing: boolean\n isSubmitDisabled: boolean\n onSubmit: () => void\n /** The password changed: the success state replaces the form. */\n isChanged: boolean\n /** Extra content under the success note. */\n success?: ReactNode\n onDone: () => void\n}\n\n/** Change (or set, after recovery) the master password. */\nexport function PasswordChangeDialog({\n open,\n onClose,\n recoveryMode,\n currentPassword,\n onCurrentPasswordChange,\n newPassword,\n onNewPasswordChange,\n confirmPassword,\n onConfirmPasswordChange,\n getUnmetRequirement,\n error,\n isProcessing,\n isSubmitDisabled,\n onSubmit,\n isChanged,\n success,\n onDone,\n labels,\n passwordInputLabels,\n testId,\n testIds,\n passwordInputTestIds,\n}: PasswordChangeDialogProps) {\n const currentPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit()\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'change-password-dialog' })}\n >\n <DialogHeader>\n <DialogTitle>\n {recoveryMode ? l.setNewPasswordTitle : l.changeMasterPasswordTitle}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {recoveryMode ? l.recoveryDescription : l.changeDescription}\n </DialogDescription>\n </DialogHeader>\n\n {isChanged ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-green-text\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <span className=\"font-medium\">{l.passwordChanged}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{l.recoveryKeyUnchanged}</p>\n {success}\n <div className=\"flex justify-end\">\n <Button\n onClick={onDone}\n data-testid={testIdOr(testIds?.done, { testId: 'change-password-done-button' })}\n >\n {l.done}\n </Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {recoveryMode && (\n <p className=\"text-sm font-medium text-green-text\">{l.recoverySuccessful}</p>\n )}\n\n {!recoveryMode && (\n <div className=\"space-y-1.5\">\n <label htmlFor={currentPasswordId} className=\"text-sm font-medium text-foreground\">\n {l.currentPassword} <span className=\"text-red-text\">*</span>\n </label>\n <Input\n id={currentPasswordId}\n type=\"password\"\n value={currentPassword}\n onChange={(e) => onCurrentPasswordChange(e.target.value)}\n disabled={isProcessing}\n placeholder={l.currentPasswordPlaceholder}\n autoComplete=\"current-password\"\n className=\"placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.currentInput, {\n testId: 'change-password-current-input',\n })}\n />\n </div>\n )}\n\n <PasswordStrengthInput\n password={newPassword}\n confirmPassword={confirmPassword}\n onPasswordChange={onNewPasswordChange}\n onConfirmPasswordChange={onConfirmPasswordChange}\n showConfirmation\n disabled={isProcessing}\n passwordLabel={recoveryMode ? l.masterPassword : l.newPassword}\n confirmLabel={recoveryMode ? l.confirmPassword : l.confirmNewPassword}\n labels={passwordInputLabels}\n testIds={passwordInputTestIds}\n layout={recoveryMode ? 'side-by-side' : 'stacked'}\n showStrengthIndicator\n getUnmetRequirement={getUnmetRequirement}\n />\n\n {error && (\n <div\n className=\"rounded-md bg-red-bg p-3\"\n data-testid={testIdOr(testIds?.error, { testId: 'change-password-error' })}\n >\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" />\n <p className=\"text-sm text-red-text\">{error}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3 pt-4\">\n {!recoveryMode && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, {\n testId: 'change-password-cancel-button',\n })}\n >\n {l.cancel}\n </Button>\n )}\n <Button\n type=\"submit\"\n disabled={isSubmitDisabled}\n className={recoveryMode ? 'w-full' : ''}\n data-testid={testIdOr(testIds?.submit, { testId: 'change-password-submit-button' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {recoveryMode ? l.settingPassword : l.changingPassword}\n </>\n ) : recoveryMode ? (\n l.continue\n ) : (\n l.changePassword\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the logout dialog. */\nexport interface LogoutDialogLabels {\n title: string\n descriptionAll: string\n descriptionThis: string\n cancel: string\n allSessions: string\n offlineTooltip: string\n thisSession: string\n offlineNote: string\n /** Disclosure trigger: \"3 active sessions\". */\n activeSessions: (count: number) => string\n /** Session row: \"2 workspaces\". */\n workspaces: (count: number) => string\n /** Session row: \"TTL 2h\". */\n ttl: (ttlLabel: string) => string\n}\n\nexport const DEFAULT_LOGOUT_DIALOG_LABELS: LogoutDialogLabels = {\n title: 'Logout',\n descriptionAll: 'End this session or all active sessions?',\n descriptionThis: 'End this session and return to the login page.',\n cancel: 'Cancel',\n allSessions: 'All sessions',\n offlineTooltip: 'Ending all sessions needs a connection — you can still log out of this device.',\n thisSession: 'This session',\n offlineNote:\n 'You’re offline — ending all sessions needs a connection. You can still log out of this device.',\n activeSessions: (count) =>\n formatCount(count, { one: 'active session', other: 'active sessions' }),\n workspaces: (count) => formatCount(count, { one: 'workspace', other: 'workspaces' }),\n ttl: (ttlLabel) => `TTL ${ttlLabel}`,\n}\n\nexport interface LogoutSessionView {\n id: string\n /** `agent` sessions are shown with the primary badge. */\n status: string\n ipAddress?: string | null\n /** Pre-formatted remaining lifetime, e.g. \"2h\". */\n ttlLabel: string\n workspaceCount: number\n}\n\nexport interface LogoutDialogProps {\n open: boolean\n onClose: () => void\n onLogoutThis: () => void\n onLogoutAll: () => void\n /** False for agent accounts: \"All sessions\" is not offered. */\n canLogoutAll: boolean\n isOnline: boolean\n sessions: LogoutSessionView[]\n /** Icon for a session row (monitor / bot). */\n renderSessionIcon?: (status: string) => ReactNode\n labels?: Partial<LogoutDialogLabels>\n /** Dialog test id (default `logout-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'all' | 'this' | 'offlineNote', string>>\n}\n\nfunction SessionRow({\n session,\n icon,\n labels,\n}: {\n session: LogoutSessionView\n icon?: ReactNode\n labels: LogoutDialogLabels\n}) {\n const { status } = session\n return (\n <div className=\"flex items-center gap-3 rounded-md bg-muted/50 px-3 py-2\">\n {icon && <div className=\"flex-shrink-0\">{icon}</div>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <code className=\"truncate font-mono text-sm\">{session.id.slice(0, 12)}</code>\n <Badge\n variant={status === 'agent' ? 'default' : 'secondary'}\n className=\"px-1 py-0 text-sm\"\n >\n {status}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {session.ipAddress && <span>{session.ipAddress}</span>}\n <span>{labels.ttl(session.ttlLabel)}</span>\n {session.workspaceCount > 0 && <span>{labels.workspaces(session.workspaceCount)}</span>}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Logout confirmation: end this session or all sessions, with the list of the\n * user's active sessions (including agent sessions) under a disclosure.\n * \"All sessions\" is disabled while offline because it must reach the server.\n */\nexport function LogoutDialog({\n open,\n onClose,\n onLogoutThis,\n onLogoutAll,\n canLogoutAll,\n isOnline,\n sessions,\n renderSessionIcon,\n labels,\n testId,\n testIds,\n}: LogoutDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_LOGOUT_DIALOG_LABELS, ...labels }), [labels])\n const [sessionsOpen, setSessionsOpen] = useState(false)\n const restoreFocus = useRestoreFocus()\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n {...restoreFocus}\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'logout-modal' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <LogOut className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription className=\"text-base\">\n {canLogoutAll ? l.descriptionAll : l.descriptionThis}\n </DialogDescription>\n </DialogHeader>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'logout-modal-cancel-button' })}\n >\n {l.cancel}\n </Button>\n {canLogoutAll && (\n <Button\n variant=\"secondary\"\n onClick={onLogoutAll}\n disabled={!isOnline}\n title={isOnline ? undefined : l.offlineTooltip}\n data-testid={testIdOr(testIds?.all, { testId: 'logout-modal-all-button' })}\n >\n {l.allSessions}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onLogoutThis}\n data-testid={testIdOr(testIds?.this, { testId: 'logout-modal-this-button' })}\n >\n {l.thisSession}\n </Button>\n </DialogFooter>\n\n {canLogoutAll && !isOnline && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.offlineNote, { testId: 'logout-offline-note' })}\n >\n {l.offlineNote}\n </p>\n )}\n\n {sessions.length > 0 && (\n <Collapsible open={sessionsOpen} onOpenChange={setSessionsOpen}>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 py-1 text-left transition-opacity hover:opacity-80 pointer-coarse:py-3\">\n {sessionsOpen ? (\n <ChevronDown className=\"h-4 w-4 flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n )}\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Radio className=\"h-3 w-3\" />\n <span>{l.activeSessions(sessions.length)}</span>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"max-h-48 space-y-1.5 overflow-auto pt-2\">\n {sessions.map((session) => (\n <SessionRow\n key={session.id}\n session={session}\n icon={renderSessionIcon?.(session.status)}\n labels={l}\n />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DialogContent>\n </Dialog>\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","/**\n * Wrapper that makes a header region draggable for FloatingPanel,\n * while ignoring clicks on interactive elements (buttons, inputs, tabs, etc.).\n */\n\nimport React from 'react'\n\nexport interface DraggableHeaderProps {\n onDragStart?: (e: React.MouseEvent) => void\n children: React.ReactNode\n}\n\nconst INTERACTIVE_SELECTOR = 'button, input, select, a, [role=\"tab\"], [role=\"radio\"]'\n\nexport function DraggableHeader({ onDragStart, children }: DraggableHeaderProps) {\n return (\n <div\n className=\"flex-shrink-0\"\n onMouseDown={\n onDragStart\n ? (e) => {\n const target = e.target as HTMLElement\n if (target.closest(INTERACTIVE_SELECTOR)) return\n onDragStart(e)\n }\n : undefined\n }\n style={onDragStart ? { cursor: 'move' } : undefined}\n >\n {children}\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 /** When set, the button is disabled and this explanation is its tooltip. */\n disabledReason?: string\n}\n\n/** \"+ New\" button that sits right after the tabs of a panel header. */\nexport function PanelAddButton({\n label,\n onClick,\n isCompact,\n icon,\n testId,\n disabledReason,\n}: PanelAddButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={!!disabledReason}\n title={disabledReason ?? 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 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent 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 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 const selectedTitle = hasUnsavedChanges\n ? unsavedTitle\n : options.find((o) => o.value === value)?.title\n return (\n <div\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 {/* The trigger names the selection on one line; the list shows each option's subtitle. */}\n <SelectValue placeholder={l.placeholder}>{selectedTitle}</SelectValue>\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 </div>\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\n/** The live server connection as a host knows it. */\nexport interface ServerConnectionStatus {\n /** The socket to the server. */\n status: 'connected' | 'connecting' | 'disconnected' | 'error'\n /** The user chose to work offline (`WorkOfflineToggle`). */\n forcedOffline?: boolean\n /** The device has no network at all: offline, and it comes back by itself. */\n deviceOffline?: boolean\n}\n\nexport interface ServerConnectionView {\n state: ServerConnectionState\n label: string\n description: string\n}\n\n/** What the server-connection row shows for a status, naming the deployment `domain`. */\nexport function serverConnectionView(\n { status, forcedOffline = false, deviceOffline = false }: ServerConnectionStatus,\n domain: string\n): ServerConnectionView {\n const state: ServerConnectionState =\n forcedOffline || deviceOffline ? 'offline' : status === 'error' ? 'disconnected' : status\n const label = forcedOffline\n ? 'Working offline'\n : deviceOffline\n ? 'Offline'\n : status === 'connected'\n ? 'Connected'\n : status === 'connecting'\n ? 'Connecting'\n : 'Disconnected'\n const description =\n deviceOffline && !forcedOffline\n ? \"You're offline. ARBI reconnects by itself when your connection returns.\"\n : `${\n status === 'connected'\n ? `Connected to ${domain}.`\n : status === 'connecting'\n ? `Connecting to ${domain}...`\n : `Disconnected from ${domain}.`\n } Click to refresh your session.`\n return { state, label, description }\n}\n","import type { ReactNode } from 'react'\nimport { Switch, cn } from '@arbidocs/react/ui'\n\nexport interface SettingsSwitchRowProps {\n /** Id of the switch; also the `htmlFor` of the label so clicking the label toggles it. */\n id: string\n title: ReactNode\n /** Leading glyph of the title. */\n icon?: ReactNode\n description?: ReactNode\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n testId?: string\n disabled?: boolean\n className?: string\n}\n\n/** One on/off setting: icon + title + help text at the start, the switch at the end. */\nexport function SettingsSwitchRow({\n id,\n title,\n icon,\n description,\n checked,\n onCheckedChange,\n testId,\n disabled,\n className,\n}: SettingsSwitchRowProps) {\n return (\n <div\n data-slot=\"settings-switch-row\"\n className={cn('flex items-center justify-between gap-4', className)}\n >\n <div className=\"min-w-0 flex-1\">\n <label htmlFor={id} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {icon}\n {title}\n </label>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n data-testid={testId}\n />\n </div>\n )\n}\n\n/** Indented group of rows that belong to the row above (e.g. the connectors of \"Connectors\"). */\nexport function SettingsSwitchGroup({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"settings-switch-group\"\n className={cn('ml-6 space-y-4 border-l border-border pl-4', className)}\n >\n {children}\n </div>\n )\n}\n","import { Checkbox, cn } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { SettingsSwitchRow } from './SettingsSwitchRow'\n\nexport interface NotificationCategory {\n key: string\n label: string\n description: string\n checked: boolean\n}\n\nexport interface NotificationCategoryListProps {\n /** Master switch: on while at least one category is on. */\n masterId: string\n masterTitle: string\n masterDescription: string\n masterChecked: boolean\n onMasterChange: (checked: boolean) => void\n masterTestId?: string\n categories: NotificationCategory[]\n onCategoryChange: (key: string, checked: boolean) => void\n /** Prefix of the checkbox ids (`<prefix>-<key>`); default the master id. */\n idPrefix?: string\n /** Prefix of the checkbox test ids (`<prefix>-<key>`); default `toggle-email`. */\n testIdPrefix?: string\n}\n\n/**\n * A master switch with per-category checkboxes under it. The checkboxes are greyed out and\n * disabled while the master is off.\n */\nexport function NotificationCategoryList({\n masterId,\n masterTitle,\n masterDescription,\n masterChecked,\n onMasterChange,\n masterTestId,\n categories,\n onCategoryChange,\n idPrefix = masterId,\n testIdPrefix,\n}: NotificationCategoryListProps) {\n return (\n <div data-slot=\"notification-category-list\">\n <SettingsSwitchRow\n id={masterId}\n title={masterTitle}\n description={masterDescription}\n checked={masterChecked}\n onCheckedChange={onMasterChange}\n testId={testIdOr(masterTestId, { testId: 'toggle-email-notifications' })}\n />\n <div className=\"ml-1 mt-3 space-y-3 border-l border-border pl-4 pointer-coarse:mt-5 pointer-coarse:space-y-5\">\n {categories.map((c) => (\n <label\n key={c.key}\n htmlFor={`${idPrefix}-${c.key}`}\n className={cn(\n 'flex items-start gap-3 pointer-coarse:min-h-11',\n masterChecked ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n )}\n >\n <Checkbox\n id={`${idPrefix}-${c.key}`}\n checked={c.checked}\n disabled={!masterChecked}\n onCheckedChange={(value) => onCategoryChange(c.key, value === true)}\n data-testid={prefixedTestId(testIdPrefix, c.key, { testId: `toggle-email-${c.key}` })}\n className=\"mt-0.5 size-5 shrink-0\"\n />\n <div className=\"min-w-0\">\n <span className=\"text-sm\">{c.label}</span>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{c.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\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-primary'\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-primary'\n case 'number':\n return 'text-primary'\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","/**\n * Schema Hints Utilities\n *\n * Provides formatting hints based on OpenAPI schema structure\n * Helps display JSON fields in a more user-friendly way\n */\n\nexport interface FieldHint {\n displayName?: string\n formatType?:\n 'timestamp' | 'id' | 'enum' | 'boolean' | 'long-string' | 'json' | 'string' | 'number'\n description?: string\n}\n\n// MessageResponse field hints from OpenAPI schema\nconst messageFieldHints: Record<string, FieldHint> = {\n role: {\n displayName: 'Role',\n formatType: 'enum',\n description: 'Message role (user, assistant, or system)',\n },\n content: {\n displayName: 'Content',\n formatType: 'long-string',\n description: 'Message content text',\n },\n created_at: {\n displayName: 'Created At',\n formatType: 'timestamp',\n description: 'Message creation timestamp',\n },\n external_id: {\n displayName: 'Message ID',\n formatType: 'id',\n description: 'External message identifier',\n },\n conversation_ext_id: {\n displayName: 'Conversation ID',\n formatType: 'id',\n description: 'Parent conversation identifier',\n },\n parent_message_ext_id: {\n displayName: 'Parent Message ID',\n formatType: 'id',\n description: 'Parent message identifier (null for first message)',\n },\n created_by_ext_id: {\n displayName: 'Created By',\n formatType: 'id',\n description: 'User who created this message',\n },\n config_ext_id: {\n displayName: 'Config ID',\n formatType: 'id',\n description: 'Configuration used for this message',\n },\n shared: {\n displayName: 'Shared',\n formatType: 'boolean',\n description: 'Whether message is shared',\n },\n tools: {\n displayName: 'Tools',\n formatType: 'json',\n description: 'Tool outputs (citations, retrieval, trace)',\n },\n meta: {\n displayName: 'Metadata',\n formatType: 'json',\n description: 'Additional metadata',\n },\n}\n\n// TraceTool field hints\nconst traceToolFieldHints: Record<string, FieldHint> = {\n name: {\n displayName: 'Tool Name',\n formatType: 'enum',\n description: 'Execution trace tool',\n },\n description: {\n displayName: 'Description',\n formatType: 'string',\n description: 'Tool description',\n },\n trace_id: {\n displayName: 'Trace ID',\n formatType: 'id',\n description: 'Unique trace identifier',\n },\n start_time: {\n displayName: 'Start Time',\n formatType: 'timestamp',\n description: 'When execution started',\n },\n duration_seconds: {\n displayName: 'Duration (seconds)',\n formatType: 'number',\n description: 'Total execution time',\n },\n steps: {\n displayName: 'Execution Steps',\n formatType: 'json',\n description: 'Full execution trace with all steps',\n },\n}\n\n// ModelCitationTool field hints\nconst citationToolFieldHints: Record<string, FieldHint> = {\n name: {\n displayName: 'Tool Name',\n formatType: 'enum',\n description: 'Model citation tool',\n },\n tool_responses: {\n displayName: 'Citations',\n formatType: 'json',\n description: 'Citation data mapped by citation number',\n },\n}\n\n/**\n * Get display hint for a field\n */\nexport function getFieldHint(path: string[], fieldName: string): FieldHint | null {\n // Top-level message fields\n if (path.length === 1 && path[0] === 'message') {\n return messageFieldHints[fieldName] || null\n }\n\n // Check if we're inside a trace tool: message > tools > trace\n if (path.length >= 3 && path[0] === 'message' && path[1] === 'tools' && path[2] === 'trace') {\n return traceToolFieldHints[fieldName] || null\n }\n\n // Check if we're inside model_citations tool\n if (\n path.length >= 3 &&\n path[0] === 'message' &&\n path[1] === 'tools' &&\n path[2] === 'model_citations'\n ) {\n return citationToolFieldHints[fieldName] || null\n }\n\n // Generic patterns for any level\n if (fieldName === 'external_id' || fieldName.endsWith('_ext_id')) {\n return { formatType: 'id', displayName: fieldName.replace(/_/g, ' ') }\n }\n\n if (fieldName === 'created_at' || fieldName === 'updated_at' || fieldName.endsWith('_at')) {\n return { formatType: 'timestamp', displayName: fieldName.replace(/_/g, ' ') }\n }\n\n if (fieldName.includes('time') && !fieldName.includes('duration')) {\n return { formatType: 'timestamp' }\n }\n\n if (fieldName.includes('duration')) {\n return { formatType: 'number', description: 'Duration in seconds' }\n }\n\n // Special handling for trace tool\n if (path.length >= 2 && path[path.length - 2] === 'tools' && fieldName === 'trace') {\n return {\n displayName: '🔍 Execution Trace',\n formatType: 'json',\n description: 'Complete execution trace with all steps and timing',\n }\n }\n\n return null\n}\n\n/**\n * Format a value based on its hint\n */\nexport function formatValue(value: unknown, hint: FieldHint | null): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n\n if (hint?.formatType === 'timestamp' && typeof value === 'string') {\n try {\n const date = new Date(value)\n if (!isNaN(date.getTime())) {\n return `${date.toLocaleString()} (${value})`\n }\n } catch {\n // Fall through to default\n }\n }\n\n if (hint?.formatType === 'timestamp' && typeof value === 'number') {\n // Unix timestamp\n const date = new Date(value * 1000)\n return `${date.toLocaleString()} (${value})`\n }\n\n if (hint?.formatType === 'id' && typeof value === 'string') {\n // Shorten long IDs for readability\n if (value.length > 20) {\n return `${value.substring(0, 16)}...${value.substring(value.length - 4)}`\n }\n }\n\n if (typeof value === 'string') {\n // Truncate very long strings\n if (value.length > 100) {\n return `\"${value.substring(0, 97)}...\" (${value.length} chars)`\n }\n return `\"${value}\"`\n }\n\n return String(value)\n}\n","/**\n * MessageJsonTree: the JsonTree with the ARBI message schema hints (field names, ids, timestamps\n * of a message and its tool outputs), for a \"message details\" view.\n */\n\nimport { JsonTree, type JsonTreeProps } from './JsonTree'\nimport { getFieldHint, formatValue } from './message-schema-hints'\n\nexport type MessageJsonTreeProps = Omit<JsonTreeProps, 'resolveHint' | 'formatValue'>\n\nexport function MessageJsonTree(props: MessageJsonTreeProps) {\n return <JsonTree {...props} resolveHint={getFieldHint} formatValue={formatValue} />\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: readonly TipOption[]\n actionOptions: readonly TipOption[]\n sequenceOptions: readonly 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: readonly 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","/**\n * Tri-state filtering: each filter is include (keep matches), exclude (drop matches, and it wins\n * over include) or null (indifferent); several includes are an OR.\n */\nimport type { TriState } from './TriStateFilterMenu'\n\n/**\n * Generic filter function that applies tri-state filters to items\n * @param items - Array of items to filter\n * @param filterStates - Map of filter states (include/exclude/null)\n * @param getAttributes - Function that returns attribute map for an item\n * @returns Filtered array of items\n */\nexport function applyTriStateFilters<T, K extends string>(\n items: T[],\n filterStates: ReadonlyMap<K, TriState>,\n getAttributes: (item: T) => Record<K, boolean>\n): T[] {\n // Pre-compute active filter lists once — avoids re-scanning the Map for every item.\n // With 100+ filter IDs (tags + folders) and 5000+ documents this is O(n_filters) done\n // once instead of O(n_filters × n_items).\n const includeKeys: K[] = []\n const excludeKeys: K[] = []\n for (const [key, state] of filterStates.entries()) {\n if (state === 'include') includeKeys.push(key)\n else if (state === 'exclude') excludeKeys.push(key)\n }\n\n if (includeKeys.length === 0 && excludeKeys.length === 0) {\n // No filters active, return all items\n return items\n }\n\n return items.filter((item) => {\n const attributes = getAttributes(item)\n\n // EXCLUDE overrides INCLUDE - check exclusions first\n for (const key of excludeKeys) {\n if (attributes[key]) return false\n }\n\n if (includeKeys.length === 0) {\n // No include filters, item passes (wasn't excluded)\n return true\n }\n\n // Item must match at least one include filter\n for (const key of includeKeys) {\n if (attributes[key]) return true\n }\n\n // Item doesn't match any include filter\n return false\n })\n}\n","import type { ReactNode } from 'react'\nimport { Check, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TriState } from './TriStateFilterMenu'\n\nexport interface FilterChipProps {\n label: string\n state: TriState\n icon?: ReactNode\n /** When provided, renders a colored pill identical to Labels column */\n color?: string\n onDismiss?: () => void\n /** The dismiss button's accessible name (default \"Remove <label>\"). */\n dismissLabel?: string\n className?: string\n testId?: string\n}\n\nexport function FilterChip({\n label,\n state,\n icon,\n color,\n onDismiss,\n dismissLabel,\n className,\n testId,\n}: FilterChipProps) {\n const isExclude = state === 'exclude'\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 text-xs font-medium rounded px-1.5 py-0.5 flex-shrink-0 border',\n isExclude\n ? 'bg-background text-red-text border-red-text'\n : 'bg-primary text-white border-primary',\n className\n )}\n data-state={state}\n data-testid={testId}\n >\n {color ? (\n /* Filled square for include; empty square for exclude */\n isExclude ? (\n <span\n className=\"w-3.5 h-3.5 rounded flex-shrink-0 border-2\"\n style={{ borderColor: color }}\n />\n ) : (\n <span\n className=\"w-3.5 h-3.5 rounded flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: color }}\n >\n <Check className=\"w-2.5 h-2.5 text-white\" strokeWidth={3} />\n </span>\n )\n ) : (\n icon && <span className=\"flex-none\">{icon}</span>\n )}\n\n <span className=\"truncate max-w-[80px]\" title={label}>\n {isExclude && <span className=\"opacity-70 mr-0.5\">Not</span>}\n {label}\n </span>\n\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label={dismissLabel ?? `Remove ${label}`}\n className=\"flex-none ml-0.5 opacity-70 hover:opacity-100\"\n data-testid={testId ? `${testId}-remove` : undefined}\n >\n <X className=\"h-3 w-3\" strokeWidth={2.5} />\n </button>\n )}\n </span>\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 /** Plan name, e.g. \"Free\", \"Pro\". */\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 { useState, type ReactNode } from 'react'\nimport { Info } from 'lucide-react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\n\nexport interface MoreInfoProps {\n /** The modal's title, e.g. \"Usage and top-ups\". */\n title: string\n /** The explanation: short paragraphs or a {@link MoreInfoList}. */\n children: ReactNode\n /** The link's text. */\n label?: string\n /** Test id of the link; the modal is `<testId>-dialog`. */\n testId?: string\n className?: string\n}\n\n/**\n * A small \"More info\" link that opens a modal with the longer explanation, so a screen can keep to\n * short labels and one-line facts. The one place billing surfaces put proration, caps, renewals\n * and refunds.\n */\nexport function MoreInfo({\n title,\n children,\n label = 'More info',\n testId = 'more-info',\n className,\n}: MoreInfoProps) {\n const [open, setOpen] = useState(false)\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-sm text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n className\n )}\n data-slot=\"more-info\"\n data-testid={testId}\n >\n <Info className=\"size-3.5\" aria-hidden />\n {label}\n </button>\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"sm:max-w-md\" data-testid={`${testId}-dialog`}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{title}</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3 text-sm leading-relaxed text-muted-foreground\">{children}</div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\n/** The explanation as a list of short points, each with an optional bold lead. */\nexport function MoreInfoList({ items }: { items: Array<{ term?: string; text: ReactNode }> }) {\n return (\n <ul className=\"space-y-2\" data-slot=\"more-info-list\">\n {items.map((item, i) => (\n <li key={item.term ?? i}>\n {item.term && <span className=\"font-medium text-foreground\">{item.term}. </span>}\n {item.text}\n </li>\n ))}\n </ul>\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-primary'\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/** AI usage / 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, Tag } from 'lucide-react'\nimport { cn, Input, Label } from '@arbidocs/react/ui'\nimport { MoreInfo, MoreInfoList } from './MoreInfo'\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 /** One short line per idea, shown as a list. */\n explainerTiers: string[]\n explainerAiUsage: string\n seeModelList: string\n}\n\nexport const DEFAULT_PLAN_CARD_LABELS: PlanCardLabels = {\n currentPlan: 'Current plan',\n popular: 'Popular',\n noMonthlyCost: '£0',\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: 'How pricing works',\n explainerTiers: [\n 'AI usage and storage are shared by everyone in the project. AI usage resets monthly.',\n 'Need more? Add £25 of AI usage or 25 GB at a time, at checkout or later. Add-ons renew with the plan until you reduce them.',\n 'Automatic top-ups add one more step when you run low, up to your monthly usage cap (£100 by default; £0 = none; or no limit). Adding by hand is never capped.',\n 'Add-ons start now: AI usage is charged in full, storage only for the rest of the period. Downgrades, billing switches and reductions start at the end of the period. No refunds.',\n 'Annual plans are 25% off, add-ons included.',\n 'Prices are shown + VAT; the total for your country is shown before you pay.',\n ],\n explainerAiUsage:\n 'About 1p of AI usage buys one moderately complex request, or reading ~25 documents, on a Standard model. Premium models can cost 10–100× more.',\n seeModelList: 'AI model prices →',\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 /** After the per-month price, e.g. \"+ VAT\" when the headline is ex VAT. */\n taxLabel?: string\n /** Small print under the price, e.g. \"£42/mo incl. UK VAT\". */\n note?: 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. \"£10 of AI usage / 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 flex flex-col justify-start 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-lg 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-2xl font-semibold leading-none tabular-nums text-foreground\">\n {l.noMonthlyCost}\n <span className=\"ml-0.5 text-sm font-medium text-muted-foreground\">{l.perMonth}</span>\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 {price.taxLabel && ` ${price.taxLabel}`}\n </span>\n </span>\n </div>\n {price.note && (\n <div className=\"text-xs text-muted-foreground\" data-slot=\"plan-card-price-note\">\n {price.note}\n </div>\n )}\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=\"@container 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 : plans.length === 2\n ? 'grid-cols-1 @xl:grid-cols-2'\n : 'grid-cols-1 @2xl: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/** \"How pricing works\": a link that opens the pricing explainer modal. `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 <MoreInfo title={l.pricingExplainer} label={l.pricingExplainer} testId=\"pricing-explainer\">\n <MoreInfoList items={l.explainerTiers.map((text) => ({ text }))} />\n <p>\n {l.explainerAiUsage}{' '}\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 </MoreInfo>\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-reward parts. `amount` is the formatted reward. */\nexport interface ReferralRewardLabels {\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_REWARD_LABELS: ReferralRewardLabels = {\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 ReferralRewardBadge({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralRewardLabels>\n /** Default `referral-reward-badge` / `referral-reward-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-badge' })}\n >\n <Gift className=\"h-3.5 w-3.5\" />\n {l.badge(amountLabel)}\n </span>\n )\n}\n\nexport interface ReferralRewardBreakdown {\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 ReferralRewardSummaryProps {\n /** The reward amount, formatted. */\n amountLabel: string\n /** When the exact charge is known; otherwise a one-line note is shown. */\n breakdown?: ReferralRewardBreakdown\n labels?: Partial<ReferralRewardLabels>\n /** Root test id (default `referral-reward-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 ReferralRewardSummary({\n amountLabel,\n breakdown,\n labels,\n testId,\n testIds,\n}: ReferralRewardSummaryProps) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-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-reward-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-reward-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 ReferralRewardNote({\n amountLabel,\n labels,\n testId,\n}: {\n amountLabel: string\n labels?: Partial<ReferralRewardLabels>\n /** Default `referral-reward-badge` / `referral-reward-note` per part. */\n testId?: string\n}) {\n const l = useMemo(() => ({ ...DEFAULT_REFERRAL_REWARD_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-reward-note' })}\n >\n <Gift className=\"h-3.5 w-3.5 shrink-0\" />\n {l.note(amountLabel)}\n </p>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { AlertTriangle, Loader2, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the active-sessions dialog. */\nexport interface ActiveSessionsDialogLabels {\n title: string\n description: string\n noSessions: string\n thisDevice: string\n agent: string\n endSession: string\n}\n\nexport const DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS: ActiveSessionsDialogLabels = {\n title: 'Active sessions',\n description:\n 'Devices and agents currently signed in to your account. Ending a session signs it out immediately.',\n noSessions: 'No active sessions.',\n thisDevice: 'This device',\n agent: 'Agent',\n endSession: 'End this session',\n}\n\n/** Every fixed string of the delete-account dialog. */\nexport interface DeleteAccountDialogLabels {\n warningTitle: string\n /** Sentence start, before the emphasised part (keep the trailing space). */\n warningBefore: string\n /** Emphasised (bold) part of the warning. */\n warningEmphasis: string\n /** Sentence end, after the emphasised part. */\n warningAfter: string\n blockersHeading: string\n cancel: string\n continue: string\n confirmTitle: string\n confirmDescription: string\n yourEmail: string\n back: string\n deleting: string\n deleteAccount: string\n}\n\nexport const DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS: DeleteAccountDialogLabels = {\n warningTitle: 'Delete your account?',\n warningBefore: 'Once deleted, your account will be ',\n warningEmphasis: 'immediately closed and you will be logged out',\n warningAfter: '. This action cannot be undone.',\n blockersHeading: 'You must resolve these first:',\n cancel: 'Cancel',\n continue: 'Continue',\n confirmTitle: 'Confirm account deletion',\n confirmDescription:\n 'Type your email address to confirm. Your account will be closed immediately and you will be logged out.',\n yourEmail: 'Your email',\n back: 'Back',\n deleting: 'Deleting...',\n deleteAccount: 'Delete Account',\n}\n\nexport interface ActiveSessionView {\n id: string\n /** Display name, e.g. \"Browser session\". */\n name: string\n /** The session of this device: badged, and cannot be ended here. */\n isCurrent: boolean\n isAgent: boolean\n /** Secondary line, e.g. \"10.0.0.1 · expires in 2h · 3 workspaces\". */\n detail: string\n isTerminating: boolean\n /** Avatar glyph (monitor / bot). */\n icon?: ReactNode\n}\n\nexport interface ActiveSessionsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n isLoading: boolean\n sessions: ActiveSessionView[]\n onTerminate: (id: string) => void\n labels?: Partial<ActiveSessionsDialogLabels>\n /** Dialog test id (default `active-sessions-dialog`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `sessionItem` is a prefix (`<prefix>-<session id>`);\n * `terminateSession` is a prefix (`<prefix>-<session id>-button`).\n */\n testIds?: Partial<Record<'list' | 'sessionItem' | 'terminateSession', string>>\n}\n\nfunction SessionListRow({\n session,\n onTerminate,\n labels,\n testIds,\n}: {\n session: ActiveSessionView\n onTerminate: (id: string) => void\n labels: ActiveSessionsDialogLabels\n testIds?: ActiveSessionsDialogProps['testIds']\n}) {\n return (\n <div\n className=\"flex w-full items-center gap-3 border-b border-border/60 px-4 py-3 last:border-b-0\"\n data-testid={prefixedTestId(testIds?.sessionItem, session.id, {\n testId: `session-item-${session.id}`,\n })}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n {session.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{session.name}</span>\n {session.isCurrent && (\n <Badge className=\"border-transparent bg-accent px-1.5 py-0 text-xs text-accent-foreground shadow-none hover:bg-accent\">\n {labels.thisDevice}\n </Badge>\n )}\n {session.isAgent && (\n <Badge variant=\"default\" className=\"px-1 py-0 text-xs\">\n {labels.agent}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">{session.detail}</div>\n </div>\n {!session.isCurrent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={labels.endSession}\n onClick={() => onTerminate(session.id)}\n disabled={session.isTerminating}\n data-testid={prefixedTestId(\n testIds?.terminateSession,\n session.id,\n { testId: `terminate-session-${session.id}-button` },\n '-button'\n )}\n >\n {session.isTerminating ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <LogOut className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{labels.endSession}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/**\n * Every session signed in to the account (this device, other devices, agents). Any but the current\n * one can be ended; ending the current one belongs to the Logout flow.\n */\nexport function ActiveSessionsDialog({\n open,\n onOpenChange,\n isLoading,\n sessions,\n onTerminate,\n labels,\n testId,\n testIds,\n}: ActiveSessionsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-lg\"\n data-testid={testIdOr(testId, { testId: 'active-sessions-dialog' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <Radio className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noSessions}</p>\n ) : (\n <div\n className=\"-mx-2 max-h-96 overflow-auto rounded-lg bg-muted\"\n data-testid={testIdOr(testIds?.list, { testId: 'session-list' })}\n >\n {sessions.map((session) => (\n <SessionListRow\n key={session.id}\n session={session}\n onTerminate={onTerminate}\n labels={l}\n testIds={testIds}\n />\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DeleteAccountBlocker {\n key: string\n content: ReactNode\n}\n\nexport interface DeleteAccountDialogProps {\n open: boolean\n onClose: () => void\n step: 'warning' | 'confirm'\n /** Reasons the account cannot be deleted yet; Continue is disabled while any exist. */\n blockers: DeleteAccountBlocker[]\n onContinue: () => void\n onBack: () => void\n userEmail: string\n confirmEmail: string\n onConfirmEmailChange: (email: string) => void\n isDeleting: boolean\n onSubmit: () => void\n labels?: Partial<DeleteAccountDialogLabels>\n /** Dialog test id (default `delete-account-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'continue' | 'emailInput' | 'back' | 'submit', string>>\n}\n\n/** Two-step account deletion: a warning (with blockers), then type-your-email to confirm. */\nexport function DeleteAccountDialog({\n open,\n onClose,\n step,\n blockers,\n onContinue,\n onBack,\n userEmail,\n confirmEmail,\n onConfirmEmailChange,\n isDeleting,\n onSubmit,\n labels,\n testId,\n testIds,\n}: DeleteAccountDialogProps) {\n const confirmEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, ...labels }), [labels])\n const emailMatches = confirmEmail.toLowerCase() === userEmail.toLowerCase()\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'delete-account-dialog' })}\n >\n {step === 'warning' ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\n {l.warningTitle}\n </DialogTitle>\n <DialogDescription>\n {l.warningBefore}\n <strong>{l.warningEmphasis}</strong>\n {l.warningAfter}\n </DialogDescription>\n </DialogHeader>\n {blockers.length > 0 && (\n <div className=\"rounded-md bg-yellow-bg p-3 text-sm text-yellow-text\">\n <p className=\"mb-1 font-semibold\">{l.blockersHeading}</p>\n <ul className=\"list-inside list-disc space-y-1\">\n {blockers.map((blocker) => (\n <li key={blocker.key}>{blocker.content}</li>\n ))}\n </ul>\n </div>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'delete-account-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={blockers.length > 0}\n onClick={onContinue}\n data-testid={testIdOr(testIds?.continue, {\n testId: 'delete-account-continue-button',\n })}\n >\n {l.continue}\n </Button>\n </div>\n </>\n ) : (\n <>\n <DialogHeader>\n <DialogTitle>{l.confirmTitle}</DialogTitle>\n <DialogDescription>{l.confirmDescription}</DialogDescription>\n </DialogHeader>\n <div>\n <label htmlFor={confirmEmailId} className=\"mb-1 block text-sm font-medium\">\n {l.yourEmail}\n </label>\n <Input\n id={confirmEmailId}\n type=\"email\"\n placeholder={userEmail}\n value={confirmEmail}\n onChange={(e) => onConfirmEmailChange(e.target.value)}\n autoFocus\n data-testid={testIdOr(testIds?.emailInput, {\n testId: 'delete-account-email-input',\n })}\n />\n </div>\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onBack}\n data-testid={testIdOr(testIds?.back, { testId: 'delete-account-back-button' })}\n >\n {l.back}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!emailMatches || isDeleting}\n onClick={onSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'delete-account-submit-button' })}\n >\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.deleting}\n </>\n ) : (\n l.deleteAccount\n )}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\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, useRef, type ChangeEvent } from 'react'\nimport { Camera, Loader2 } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the avatar picker. */\nexport interface AvatarPickerLabels {\n uploadingPicture: string\n changeProfilePicture: string\n change: string\n}\n\nexport const DEFAULT_AVATAR_PICKER_LABELS: AvatarPickerLabels = {\n uploadingPicture: 'Uploading picture',\n changeProfilePicture: 'Change profile picture',\n change: 'Change',\n}\n\nexport interface AvatarPickerProps {\n labels?: Partial<AvatarPickerLabels>\n /** Image URL / data URL; the initials show when absent. */\n pictureUrl?: string | null\n initials: string\n /** Background class of the initials fallback (a stable per-user colour). */\n fallbackClassName?: string\n isUploading?: boolean\n disabled?: boolean\n /** A file was chosen; the host validates, crops and uploads it. */\n onFileChosen: (file: File) => void\n testId?: string\n}\n\n/**\n * Profile picture with a change affordance. A permanent camera mark says the picture is tappable on\n * touch screens; the overlay (revealed on hover/focus) is the actual control.\n */\nexport function AvatarPicker({\n pictureUrl,\n initials,\n fallbackClassName,\n isUploading,\n disabled,\n onFileChosen,\n testId = 'avatar-uploader-input',\n labels,\n}: AvatarPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_AVATAR_PICKER_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n // Reset so choosing the same file again still fires a change.\n e.target.value = ''\n if (file) onFileChosen(file)\n }\n\n return (\n <div data-slot=\"avatar-picker\" className=\"group/avatar relative shrink-0\">\n <Avatar className=\"h-20 w-20 ring-1 ring-border\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt={initials} />}\n <AvatarFallback\n className={cn('text-2xl font-semibold leading-none text-white', fallbackClassName)}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isUploading}\n className={cn(\n 'absolute inset-0 flex items-center justify-center rounded-full',\n 'bg-foreground/70 text-background',\n 'opacity-0 focus-visible:opacity-100 group-hover/avatar:opacity-100',\n // Touch has no hover: keep the change affordance visible (lighter scrim over the photo).\n 'pointer-coarse:opacity-100',\n 'transition-opacity duration-200',\n 'disabled:cursor-not-allowed disabled:opacity-100'\n )}\n aria-label={isUploading ? l.uploadingPicture : l.changeProfilePicture}\n >\n {isUploading ? (\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n ) : (\n <div className=\"flex flex-col items-center gap-0.5\">\n <Camera className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{l.change}</span>\n </div>\n )}\n </button>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-background text-muted-foreground ring-1 ring-border\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </span>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n onChange={handleChange}\n hidden\n className=\"hidden\"\n data-testid={testId}\n />\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 entityNoun,\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 get loading() {\n return `Loading ${entityNoun('PROJECT', 'PLURAL')}...`\n },\n get empty() {\n return `No ${entityNoun('PROJECT', 'PLURAL')} yet. Create one to get started.`\n },\n get filteredOut() {\n return `No ${entityNoun('PROJECT', 'PLURAL')} match the filter.`\n },\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 get renameProject() {\n return `Rename ${entityNoun('PROJECT')}`\n },\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 get title() {\n return `Rename ${entityNoun('PROJECT')}`\n },\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 border border-border bg-card shadow-xs 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 (AI usage is 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, type ReactNode } from 'react'\nimport { ChartNoAxesColumn, Loader2 } from 'lucide-react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { cn } from '@arbidocs/react/ui'\nimport { Chart, categoricalStyle } from '../components/Chart'\n\nconst styleAt = categoricalStyle\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 £: \"£12.40\". */\n gbp: (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 gbp: (formatted) => formatted,\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 /** The chart's accessible name. Default \"Daily usage\". */\n ariaLabel?: string\n}\n\n/** A y tick: whole thousands as \"3k\", smaller values to two decimals. */\nconst usageTick = (v: number) =>\n v >= 1000 ? `${Math.round(v / 1000)}k` : String(Math.round(v * 100) / 100)\n\n/**\n * Line chart of daily usage with a tap/hover/keyboard readout (a tap selects a day, so touch\n * works): the shared `Chart` in its `trend` layout and categorical palette.\n */\nexport function UsageLineChart({\n dates,\n series,\n formatDate,\n formatValue,\n emptyLabel,\n labels,\n ariaLabel = 'Daily usage',\n}: UsageLineChartProps) {\n const l = useMemo(() => ({ ...DEFAULT_USAGE_LINE_CHART_LABELS, ...labels }), [labels])\n return (\n <Chart\n type=\"line\"\n layout=\"trend\"\n palette=\"categorical\"\n slot=\"usage-line-chart\"\n labels={dates}\n series={series}\n ariaLabel={ariaLabel}\n formatValue={formatValue}\n formatTick={usageTick}\n formatLabel={formatDate}\n emptyLabel={emptyLabel ?? l.noDailyData}\n hideLegend\n />\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 = 'gbp' | 'tokens'\n\nexport interface UsageShare {\n label: string\n /** Raw amount in the active metric, for the bar width. */\n amount: number\n /** Formatted £ amount, e.g. \"£12.40\". */\n gbp: string\n /** Formatted tokens, e.g. \"3k\". */\n tokens: string\n}\n\n/** Stacked proportion bar plus a per-item list with £, 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.gbp(item.gbp)}`}\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 === 'gbp'\n ? 'font-medium text-muted-foreground'\n : 'text-muted-foreground/60'\n )}\n >\n {item.gbp}\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 (£, 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\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) => `Receipts for ${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 AI usage limit per collaborator (£)',\n unit: '£ / user / day',\n save: 'Save',\n}\n\nexport interface InvoiceRowView {\n key: string\n date: string\n /** Formatted amount, e.g. \"$50.00\". */\n amount: string\n /** What the charge was for, e.g. \"Plan\", \"Plan change\", \"Add-on\". */\n kind?: string\n /** Secondary amount line, e.g. \"£35 ex VAT\". */\n amountNote?: 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 flex-wrap items-center gap-x-3 gap-y-0.5\">\n <span className=\"tabular-nums text-muted-foreground\">{invoice.date}</span>\n {invoice.kind && <span className=\"text-foreground\">{invoice.kind}</span>}\n <span className=\"font-medium tabular-nums\">{invoice.amount}</span>\n {invoice.amountNote && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {invoice.amountNote}\n </span>\n )}\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 AI usage 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 step={0.01}\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","import { useMemo, type ReactNode } from 'react'\nimport { Check, Loader2, Mail, Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n VerifiedBadge,\n} from '@arbidocs/react/ui'\nimport { SettingsCard } from './SettingsPanel'\n\n/** Every fixed string of the profile card. `ssoTooltip` prop wins over the label. */\nexport interface ProfileCardLabels {\n firstName: string\n lastName: string\n save: string\n cancel: string\n sso: string\n ssoTooltip: string\n change: string\n newEmailAddress: string\n emailPlaceholder: string\n /** Sentence under the new-email field. */\n codeWillBeSent: string\n sendCode: string\n /** Heading of the verify step: \"Verify new@example.com\". */\n verify: (email: string) => string\n codePlaceholder: string\n enterCodeHint: string\n confirm: string\n /** Resend button while cooling down: \"Resend in 30s\". */\n resendIn: (seconds: number) => string\n resendCode: string\n /** Shown while editing the name of a verified account. */\n verifiedNameLocked: string\n}\n\nexport const DEFAULT_PROFILE_CARD_LABELS: ProfileCardLabels = {\n firstName: 'First name',\n lastName: 'Last name',\n save: 'Save',\n cancel: 'Cancel',\n sso: 'SSO',\n ssoTooltip: 'This email comes from your sign-in provider.',\n change: 'Change',\n newEmailAddress: 'New email address',\n emailPlaceholder: 'you@example.com',\n codeWillBeSent: 'We\\u2019ll send a 3-word verification code to this address.',\n sendCode: 'Send code',\n verify: (email) => `Verify ${email}`,\n codePlaceholder: 'WORD-WORD-WORD',\n enterCodeHint: 'Enter the 3-word code from the email we just sent.',\n confirm: 'Confirm',\n resendIn: (seconds) => `Resend in ${seconds}s`,\n resendCode: 'Resend code',\n verifiedNameLocked: 'Verified name. Remove your identity verification to change it.',\n}\n\nexport interface ProfileNameView {\n /** Display name; \"Unnamed\" is the host's call. */\n display: string\n isEditing: boolean\n givenName: string\n familyName: string\n onGivenNameChange: (value: string) => void\n onFamilyNameChange: (value: string) => void\n onStartEdit: () => void\n onSave: () => void\n onCancel: () => void\n isSaving: boolean\n}\n\nexport interface ProfileEmailChangeView {\n step: 'enter' | 'verify'\n newEmail: string\n onNewEmailChange: (value: string) => void\n onSendCode: () => void\n isSending: boolean\n code: string\n onCodeChange: (value: string) => void\n onConfirm: () => void\n isConfirming: boolean\n /** Seconds until a new code may be requested; 0 when allowed. */\n cooldownSeconds: number\n onCancel: () => void\n}\n\nexport interface ProfileCardProps {\n /** The picture with its change control. */\n avatar: ReactNode\n name: ProfileNameView\n /** A compact status beside the display name. */\n nameBadge?: ReactNode\n email: string\n /** Email is managed by the sign-in provider: shows an \"SSO\" marker instead of \"Change\". */\n isSso: boolean\n /** Verified tick after the name. A verified name is locked (the server refuses a rename), so it is not editable. */\n isVerified?: boolean\n onStartEmailChange: () => void\n /** Open email-change flow; hides the plain email row. */\n emailChange?: ProfileEmailChangeView\n ssoTooltip?: string\n labels?: Partial<ProfileCardLabels>\n}\n\n/** Profile identity: avatar, editable name, email and the inline email-change flow. */\nexport function ProfileCard({\n avatar,\n name,\n nameBadge,\n email,\n isSso,\n isVerified = false,\n onStartEmailChange,\n emailChange,\n ssoTooltip,\n labels,\n}: ProfileCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROFILE_CARD_LABELS, ...labels }), [labels])\n return (\n <SettingsCard>\n <div className=\"flex items-start gap-5\">\n {avatar}\n\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">\n {name.isEditing ? (\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 @xl:flex-row\">\n <Input\n value={name.givenName}\n onChange={(e) => name.onGivenNameChange(e.target.value)}\n placeholder={l.firstName}\n className=\"flex-1\"\n autoFocus\n />\n <Input\n value={name.familyName}\n onChange={(e) => name.onFamilyNameChange(e.target.value)}\n placeholder={l.lastName}\n className=\"flex-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={name.onSave}\n size=\"sm\"\n disabled={!name.givenName.trim() || name.isSaving}\n >\n {name.isSaving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.save}\n </Button>\n <Button\n onClick={name.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={name.isSaving}\n >\n {l.cancel}\n </Button>\n </div>\n </div>\n ) : isVerified ? (\n <div className=\"-mx-2 w-full px-2 py-1\" data-testid=\"verified-name\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <VerifiedBadge className=\"h-4 w-4\" />\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{l.verifiedNameLocked}</p>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={name.onStartEdit}\n className=\"-mx-2 w-full rounded-md px-2 py-1 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <Pencil className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </div>\n </button>\n )}\n </div>\n {!name.isEditing && nameBadge}\n </div>\n\n {!emailChange && (\n <div className=\"-mx-2 flex min-w-0 items-center gap-2 px-2 py-1\">\n <Mail className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">{email}</span>\n {isSso ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"ml-1 shrink-0 cursor-help rounded bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\"\n tabIndex={0}\n >\n {l.sso}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{ssoTooltip ?? l.ssoTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <button\n type=\"button\"\n onClick={onStartEmailChange}\n className=\"ml-auto shrink-0 text-xs font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n >\n {l.change}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {emailChange && !isSso && (\n <div className=\"animate-accordion-down overflow-hidden\">\n <div className=\"space-y-3 rounded-lg bg-background p-4\">\n {emailChange.step === 'enter' ? (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.newEmailAddress}\n </div>\n <Input\n type=\"email\"\n value={emailChange.newEmail}\n onChange={(e) => emailChange.onNewEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.codeWillBeSent}</p>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onSendCode}\n size=\"sm\"\n disabled={!emailChange.newEmail.trim() || emailChange.isSending}\n >\n {emailChange.isSending ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Mail className=\"mr-1 h-4 w-4\" />\n )}\n {l.sendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isSending}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.verify(emailChange.newEmail)}\n </div>\n <Input\n value={emailChange.code}\n onChange={(e) =>\n emailChange.onCodeChange(e.target.value.toUpperCase().replace(/\\s+/g, '-'))\n }\n className={cn('text-center font-mono tracking-wider')}\n placeholder={l.codePlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.enterCodeHint}</p>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onConfirm}\n size=\"sm\"\n disabled={!emailChange.code.trim() || emailChange.isConfirming}\n >\n {emailChange.isConfirming ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.confirm}\n </Button>\n <Button\n onClick={() => {\n if (emailChange.cooldownSeconds > 0) return\n emailChange.onSendCode()\n }}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.cooldownSeconds > 0 || emailChange.isSending}\n >\n {emailChange.cooldownSeconds > 0\n ? l.resendIn(emailChange.cooldownSeconds)\n : l.resendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isConfirming}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n )}\n </div>\n </div>\n )}\n </SettingsCard>\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, ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Progress,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport { UsageMeter } from '../components/UsageMeter'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { ModalSection } 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/** 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\n data-slot=\"plan-picker-card\"\n className=\"space-y-4 rounded-lg border border-border bg-card shadow-xs p-4\"\n >\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 aiUsageResets: (date: string) => string\n cancelsAtPeriodEnd: string\n cancelsAtEndOfBillingPeriod: string\n}\n\nexport const DEFAULT_SUBSCRIPTION_STATUS_LABELS: SubscriptionStatusLabels = {\n aiUsageResets: (date) => `AI usage resets ${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.aiUsageResets(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 ?? `${getEntityLabel('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: 'Payment',\n description: 'Enter your card to start the plan',\n loading: 'Loading…',\n error: \"Checkout didn't load. 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 /** \"£7.60 of £10\". */\n readout: string\n projectId?: string | null\n }\n /** Replaces the Upgrade button (e.g. add-on actions for a project already on a paid plan). */\n actions?: ReactNode\n /** Extra content above the footer (e.g. a plan suggestion). */\n extra?: ReactNode\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 usage used up',\n get projectUsage() {\n return `${getEntityLabel('PROJECT')} usage`\n },\n progress: 'AI usage this month',\n get project() {\n return `${getEntityLabel('PROJECT')}:`\n },\n close: 'Not now',\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 actions,\n extra,\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 <Progress value={usage.percent} aria-label={l.progress} />\n <div\n className=\"flex flex-wrap items-center justify-between gap-x-3 text-sm text-muted-foreground\"\n data-testid=\"quota-usage-readout\"\n >\n <span className=\"tabular-nums\">{usage.readout}</span>\n {usage.projectId && <span className=\"truncate\">{usage.projectId}</span>}\n </div>\n </ModalSection>\n )}\n {extra}\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose} data-testid=\"quota-close-button\">\n {l.close}\n </Button>\n {actions ?? (\n <Button onClick={onUpgrade} data-testid=\"quota-upgrade-button\">\n {l.upgrade}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Project list (subscription section) and usage section slots\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/** 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 AI usage 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 { useEffect, useRef, useState, 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 hideCloseButton\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\nexport interface ErrorDialogProps {\n /**\n * The error report a developer may read and copy (`formatErrorReport`). Leave it out for\n * everyone else: the dialog then shows no report at all.\n */\n detailsText?: string\n /** \"Report error\" control (it owns its own submit flow). */\n report: ReactNode\n onRefresh: () => void\n onLogout: () => void\n labels?: Partial<ErrorDialogLabels>\n /** How long \"Copied\" shows after a copy, in ms. Default 2000. */\n copiedMs?: number\n}\n\n/**\n * The crash dialog with its own state: the developer report opens and closes in place, and Copy\n * puts it on the clipboard (showing \"Copied\" for a moment). Render it as an `ErrorBoundary`\n * `fallback`.\n */\nexport function ErrorDialog({ detailsText, copiedMs = 2000, ...view }: ErrorDialogProps) {\n const [isShown, setShown] = useState(false)\n const [isCopied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n useEffect(() => () => clearTimeout(timer.current), [])\n\n const copy = async () => {\n if (detailsText === undefined) return\n try {\n await navigator.clipboard.writeText(detailsText)\n } catch (error) {\n console.error('Failed to copy error details', error)\n return\n }\n setCopied(true)\n clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), copiedMs)\n }\n\n return (\n <ErrorDialogView\n {...view}\n details={\n detailsText === undefined\n ? undefined\n : {\n text: detailsText,\n isShown,\n isCopied,\n onToggle: () => setShown((shown) => !shown),\n onCopy: () => void copy(),\n }\n }\n />\n )\n}\n","import { version as reactVersion } from 'react'\n\n/** One titled block of `label: value` lines in an error report (the host's own context). */\nexport interface ErrorReportSection {\n title: string\n rows: Array<[label: string, value: string]>\n /** Column the values start at. Default: the longest label plus its colon, plus three spaces. */\n labelWidth?: number\n}\n\nexport interface ErrorReportInput {\n error: Error | null\n /** React's component stack (`ErrorInfo.componentStack`), when known. */\n componentStack?: string | null\n /** Which boundary caught it. */\n componentName?: string\n /** The host's context between the error and the stack, e.g. navigation, ids, auth state. */\n sections?: ErrorReportSection[]\n /** Defaults to the current time, URL and user agent; tests pin them. */\n timestamp?: string\n url?: string\n userAgent?: string\n}\n\nconst RULE = '═══════════════════════════════════════════════════════════════'\nconst SUB_RULE = '─────────────────────────────────────────────────────────────'\nconst STACK_LINES = 5\nconst COMPONENT_LINES = 5\n/** Boundaries and router plumbing say nothing about where an error came from. */\nconst NOISE = ['ErrorBoundary', 'RenderedRoute', 'DataRoutes', '_renderMatches']\n\nfunction section({ title, rows, labelWidth }: ErrorReportSection): string {\n const width = labelWidth ?? Math.max(...rows.map(([label]) => label.length + 1)) + 3\n const lines = rows.map(([label, value]) => `${`${label}:`.padEnd(width)}${value}`)\n return [title, SUB_RULE, ...lines].join('\\n')\n}\n\n/**\n * A short plain-text error report for support: the error, the host's context, the first lines of\n * the stack and the nearest components, and the environment. It leaves out props, state and full\n * stacks on purpose, since they can hold the user's content.\n */\nexport function formatErrorReport({\n error,\n componentStack,\n componentName = 'Unknown Component',\n sections = [],\n timestamp = new Date().toISOString(),\n url = window.location.href,\n userAgent = navigator.userAgent,\n}: ErrorReportInput): string {\n const stack = (error?.stack || 'No stack trace available')\n .split('\\n')\n .slice(0, STACK_LINES)\n .join('\\n')\n const components = (componentStack || 'No component stack available')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !NOISE.some((noise) => line.includes(noise)))\n .slice(0, COMPONENT_LINES)\n\n const body = [\n section({\n title: 'ERROR DETAILS',\n rows: [\n ['Type', error?.name || 'Unknown'],\n ['Message', error?.message || 'Unknown error'],\n ['Component', componentName],\n ['URL', url],\n ],\n }),\n ...sections.map(section),\n ['STACK TRACE (First 5 Lines)', SUB_RULE, stack].join('\\n'),\n [\n 'COMPONENT HIERARCHY',\n SUB_RULE,\n components.length > 0 ? components.join('\\n') : 'No meaningful component stack available',\n ].join('\\n'),\n section({\n title: 'ENVIRONMENT',\n rows: [\n ['React Version', reactVersion],\n ['Browser', userAgent],\n ],\n }),\n ]\n\n return [\n RULE,\n 'ERROR REPORT',\n RULE,\n '',\n `TIMESTAMP: ${timestamp}`,\n '',\n body.join('\\n\\n'),\n '',\n RULE,\n 'END OF REPORT',\n RULE,\n ].join('\\n')\n}\n","/**\n * Pure mappers from the account data the hooks return to the props of the settings parts\n * (`ActiveSessionsDialog`, `LogoutDialog`, `DeleteAccountDialog`, `NotificationCategoryList`).\n * No React Query, no SDK: a host with its own data layer uses them too.\n */\n\nimport type { ReactNode } from 'react'\nimport type { ActiveSessionView, DeleteAccountBlocker } from './AccountDialogs'\nimport type { LogoutSessionView } from './LogoutDialog'\nimport type { NotificationCategory } from './NotificationCategoryList'\n\n/** A session as `GET /v1/user/sessions` reports it (the fields the views read). */\nexport interface SessionLike {\n session_id: string\n name?: string | null\n ip_address?: string | null\n workspaces: readonly string[]\n status?: string | null\n /** Seconds left. */\n ttl: number\n}\n\n/** Remaining seconds as `1d 2h 3m`; `expired` at or below zero. */\nexport function formatSessionTtl(totalSeconds: number): string {\n if (totalSeconds <= 0) return 'expired'\n const days = Math.floor(totalSeconds / 86400)\n const hours = Math.floor((totalSeconds % 86400) / 3600)\n const minutes = Math.floor((totalSeconds % 3600) / 60)\n const parts: string[] = []\n if (days > 0) parts.push(`${days}d`)\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0) parts.push(`${minutes}m`)\n return parts.length > 0 ? parts.join(' ') : '<1m'\n}\n\nexport interface ToActiveSessionViewsOptions {\n /** This device's session id (`useCurrentSessionId`); it is listed first and cannot be ended. */\n currentSessionId: string | null\n /** The session being ended right now, for its spinner. */\n terminatingId?: string | null\n /** Glyph per status (`user` / `agent`). */\n renderIcon?: (status: string) => ReactNode\n formatTtl?: (seconds: number) => string\n}\n\n/** Sessions as `ActiveSessionsDialog` rows: this device first, a detail line, agents marked. */\nexport function toActiveSessionViews(\n sessions: readonly SessionLike[],\n {\n currentSessionId,\n terminatingId,\n renderIcon,\n formatTtl = formatSessionTtl,\n }: ToActiveSessionViewsOptions\n): ActiveSessionView[] {\n return sessions\n .map((session) => {\n const status = session.status || 'user'\n const count = session.workspaces.length\n return {\n id: session.session_id,\n name: session.name || (status === 'agent' ? 'Agent session' : 'Browser session'),\n isCurrent: session.session_id === currentSessionId,\n isAgent: status === 'agent',\n detail: `${session.ip_address ?? 'Unknown IP'} · expires in ${formatTtl(session.ttl)}${\n count > 0 ? ` · ${count} workspace${count > 1 ? 's' : ''}` : ''\n }`,\n isTerminating: terminatingId === session.session_id,\n icon: renderIcon?.(status),\n }\n })\n .sort((a, b) => Number(b.isCurrent) - Number(a.isCurrent))\n}\n\n/** Sessions as `LogoutDialog` rows. */\nexport function toLogoutSessionViews(\n sessions: readonly SessionLike[],\n formatTtl: (seconds: number) => string = formatSessionTtl\n): LogoutSessionView[] {\n return sessions.map((session) => ({\n id: session.session_id,\n status: session.status || 'user',\n ipAddress: session.ip_address,\n ttlLabel: formatTtl(session.ttl),\n workspaceCount: session.workspaces.length,\n }))\n}\n\n/** A reason the account cannot be closed yet (see `parseDeleteAccountBlockers`). */\nexport type DeleteBlockerLike =\n { type: 'active_subscription' } | { type: 'workspace_members'; workspaces: readonly string[] }\n\n/** Blockers as `DeleteAccountDialog` rows. `renderSubscriptionLink` lets the host link its billing page. */\nexport function toDeleteBlockerViews(\n blockers: readonly DeleteBlockerLike[],\n renderSubscriptionLink?: () => ReactNode\n): DeleteAccountBlocker[] {\n return blockers.flatMap<DeleteAccountBlocker>((blocker) =>\n blocker.type === 'active_subscription'\n ? [\n {\n key: 'active_subscription',\n content: renderSubscriptionLink\n ? renderSubscriptionLink()\n : 'Active subscription: cancel it in your subscription settings first',\n },\n ]\n : blocker.workspaces.map((ws) => ({\n key: `workspace-${ws}`,\n content: `You are the sole admin of workspace \"${ws}\" — transfer admin rights or remove all other members first`,\n }))\n )\n}\n\n/** One email category the user can switch: its key in the settings record and its wording. */\nexport interface EmailNotificationCategoryDef {\n key: string\n label: string\n description: string\n}\n\n/** The categories ARBI sends email for today (add one when the backend adds it). */\nexport const EMAIL_NOTIFICATION_CATEGORIES: readonly EmailNotificationCategoryDef[] = [\n { key: 'messages', label: 'New messages', description: 'A direct message while you’re offline' },\n { key: 'workspace_added', label: 'Workspace access', description: 'You’re added to a workspace' },\n {\n key: 'contact_accepted',\n label: 'Invitation accepted',\n description: 'Someone accepts your invitation',\n },\n { key: 'referral_reward', label: 'Rewards', description: 'You earn a reward' },\n {\n key: 'product_updates',\n label: 'ARBI update',\n description: 'Weekly digest of new features and highlights',\n },\n]\n\n/** The category keys, in the order the list shows them. */\nexport const EMAIL_NOTIFICATION_KEYS: readonly string[] = EMAIL_NOTIFICATION_CATEGORIES.map(\n (c) => c.key\n)\n\n/** Category definitions plus their states as `NotificationCategoryList` rows. */\nexport function toNotificationCategories(\n checked: Readonly<Record<string, boolean>>,\n defs: readonly EmailNotificationCategoryDef[] = EMAIL_NOTIFICATION_CATEGORIES\n): NotificationCategory[] {\n return defs.map((def) => ({ ...def, checked: checked[def.key] ?? true }))\n}\n","/**\n * Identity verification blocks: the settings card, the dialog (pay → verify in Didit's frame →\n * result) and a gate for deployments that require it. All take the `IdentityVerificationFlow` from\n * `@arbidocs/react` (`useIdentityVerification` with a provider, or `useIdentityVerificationFlow`\n * bound to a host's own API), so they work the same inside ARBI and on a customer's site.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { ExternalLink, Loader2, ShieldCheck } from 'lucide-react'\nimport { Button, VerifiedBadge, type IdentityVerificationFlow } from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\nimport { SettingsCard, SettingsDisclosure, SettingsRow } from './SettingsPanel'\n\n/** Every fixed string of the identity verification blocks. */\nexport interface IdentityVerificationLabels {\n title: string\n intro: string\n /** \"£5.00 incl. VAT · 3 attempts\" (`price` comes formatted, VAT note included). */\n priceLine: (price: string, attempts: number) => string\n proOnly: string\n seePlans: string\n manageBilling: string\n verify: string\n continue: string\n attemptsLeft: (n: number) => string\n verified: string\n verifiedDetail: (country: string) => string\n inReview: string\n finishName: string\n finish: string\n remove: string\n payTitle: string\n payBody: (price: string, attempts: number) => string\n pay: string\n confirmPayment: string\n paymentConfirmed: string\n verifyTitle: string\n embedFailed: string\n openInNewTab: string\n checkResult: string\n resultVerified: string\n resultDeclined: (attemptsLeft: number) => string\n tryAgain: string\n resultInReview: string\n nameMismatchTitle: string\n nameMismatchBody: string\n documentName: string\n accountName: string\n useDocumentName: (name: string) => string\n keepName: string\n close: string\n requiredTitle: string\n requiredBody: string\n requiredProOnly: string\n}\n\nexport const DEFAULT_IDENTITY_VERIFICATION_LABELS: IdentityVerificationLabels = {\n title: 'Identity verification',\n intro: 'Check your ID once to get a verified tick next to your name.',\n priceLine: (price, attempts) => `${price} · ${attempts} attempts`,\n proOnly: 'Available on Pro plans.',\n seePlans: 'See plans',\n manageBilling: 'Manage billing',\n verify: 'Verify identity',\n continue: 'Continue',\n attemptsLeft: (n) => `${n} attempt${n === 1 ? '' : 's'} left`,\n verified: 'Verified',\n verifiedDetail: (country) => `ID issued in ${country}`,\n inReview: 'Your check is being reviewed. We’ll update this when it’s done.',\n finishName: 'Your ID was verified. Confirm your name to get the tick.',\n finish: 'Finish',\n remove: 'Remove',\n payTitle: 'Verify your identity',\n payBody: (price, attempts) =>\n `A one-time fee of ${price} is charged to the card on your Pro plan. It covers up to ${attempts} attempts. Your ID is checked by our provider, Didit; ARBI does not keep your document.`,\n pay: 'Pay and continue',\n confirmPayment: 'Confirm payment with your bank',\n paymentConfirmed: 'I’ve confirmed it',\n verifyTitle: 'Scan your ID',\n embedFailed: 'Your camera isn’t available here. Continue in a new tab, then come back.',\n openInNewTab: 'Open in a new tab',\n checkResult: 'I’ve finished',\n resultVerified: 'You’re verified. The tick now shows next to your name.',\n resultDeclined: (n) =>\n n > 0\n ? `We couldn’t verify your ID. You have ${n} attempt${n === 1 ? '' : 's'} left.`\n : 'We couldn’t verify your ID and no attempts are left.',\n tryAgain: 'Try again',\n resultInReview: 'Your check needs a manual review. We’ll show the result here when it’s done.',\n nameMismatchTitle: 'Your ID was verified',\n nameMismatchBody:\n 'The name on your ID differs from your account name. The tick shows only with the name on your ID.',\n documentName: 'Name on your ID',\n accountName: 'Account name',\n useDocumentName: (name) => `Change my name to ${name}`,\n keepName: 'Keep my name',\n close: 'Close',\n requiredTitle: 'Identity verification required',\n requiredBody: 'This workspace requires a verified identity before you continue.',\n requiredProOnly: 'Identity verification is available on Pro plans. Ask your administrator.',\n}\n\nfunction useLabels(labels?: Partial<IdentityVerificationLabels>) {\n return useMemo(() => ({ ...DEFAULT_IDENTITY_VERIFICATION_LABELS, ...labels }), [labels])\n}\n\n/** Refusals the user fixes in billing (plan, card, address). */\nconst BILLING_CODES = [\n 'PRO_REQUIRED',\n 'PAYMENT_METHOD_REQUIRED',\n 'BILLING_ADDRESS_REQUIRED',\n 'PAYMENT_DECLINED',\n]\n\nfunction Problem({\n flow,\n onManageBilling,\n label,\n}: {\n flow: IdentityVerificationFlow\n onManageBilling?: () => void\n label: string\n}) {\n if (!flow.problem) return null\n const billing = onManageBilling && BILLING_CODES.includes(flow.problem.code ?? '')\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"identity-problem\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {flow.problem.message}\n </p>\n {billing && (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {label}\n </Button>\n )}\n </div>\n )\n}\n\n// ── Card ────────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationCardProps {\n /** Secondary account settings start closed; payment and verification remain explicit actions. */\n collapsible?: boolean\n flow: IdentityVerificationFlow\n /** Open the host's plans / billing (upgrade to Pro, fix the card or address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** Settings row for the ID check: offer, progress, or the tick. Renders nothing when not offered. */\nexport function IdentityVerificationCard({\n collapsible = false,\n flow,\n onManageBilling,\n labels,\n}: IdentityVerificationCardProps) {\n const l = useLabels(labels)\n const { status } = flow\n if (!status?.enabled) return null\n const busy = flow.busy !== null\n\n let description: ReactNode\n let action: ReactNode = null\n if (status.verified) {\n description = (\n <span className=\"inline-flex items-center gap-1.5\">\n <VerifiedBadge />\n {l.verified}\n {status.document_country && (\n <span className=\"text-muted-foreground\">\n {' · '}\n {l.verifiedDetail(status.document_country)}\n </span>\n )}\n </span>\n )\n action = (\n <Button size=\"sm\" variant=\"ghost\" onClick={flow.remove} disabled={busy}>\n {l.remove}\n </Button>\n )\n } else if (!status.eligible) {\n description = `${l.intro} ${l.proOnly}`\n action = onManageBilling ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {l.seePlans}\n </Button>\n ) : null\n } else if (status.state === 'in_review') {\n description = l.inReview\n } else if (status.state === 'name_mismatch') {\n description = l.finishName\n action = (\n <Button size=\"sm\" onClick={flow.open}>\n {l.finish}\n </Button>\n )\n } else {\n const resuming = status.attempts_left > 0 || status.state === 'in_progress'\n description = (\n <>\n {l.intro}{' '}\n <span className=\"text-muted-foreground\">\n {resuming\n ? l.attemptsLeft(status.attempts_left)\n : l.priceLine(flow.price ?? '', status.attempts_per_fee)}\n </span>\n </>\n )\n action = (\n <Button size=\"sm\" onClick={flow.open} disabled={busy}>\n <ShieldCheck className=\"mr-1 h-4 w-4\" />\n {resuming ? l.continue : l.verify}\n </Button>\n )\n }\n\n const card = (\n <SettingsCard padding=\"sm\" data-testid=\"identity-verification-card\">\n <SettingsRow label={collapsible ? null : l.title} description={description}>\n {action}\n </SettingsRow>\n {!flow.isOpen && (\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n )}\n </SettingsCard>\n )\n return collapsible ? (\n <SettingsDisclosure title={l.title} testId=\"identity-verification-settings\">\n {card}\n </SettingsDisclosure>\n ) : (\n card\n )\n}\n\n// ── Dialog ──────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationDialogProps {\n flow: IdentityVerificationFlow\n /** The account name as shown, compared with the name on the document. */\n accountName: string\n /** Block closing (the `RequireVerified` gate). Default true. */\n dismissible?: boolean\n /** Open the host's billing to fix a refused payment (plan, card, address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The verification dialog: pay the fee, verify in Didit's embedded frame, then the result. */\nexport function IdentityVerificationDialog({\n flow,\n accountName,\n dismissible = true,\n onManageBilling,\n labels,\n}: IdentityVerificationDialogProps) {\n const l = useLabels(labels)\n const { status } = flow\n const attempts = status?.attempts_per_fee ?? 0\n const docName = [status?.document_given_name, status?.document_family_name]\n .filter(Boolean)\n .join(' ')\n const spinner = <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n\n let body: ReactNode\n let footer: ReactNode = null\n if (flow.step === 'pay') {\n body = flow.paymentUrl ? (\n <a\n href={flow.paymentUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {l.confirmPayment}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.payBody(flow.price ?? '', attempts)}</p>\n )\n footer = flow.paymentUrl ? (\n <Button onClick={flow.recheckPayment} disabled={flow.busy !== null}>\n {flow.busy === 'start' && spinner}\n {l.paymentConfirmed}\n </Button>\n ) : (\n <Button onClick={flow.pay} disabled={flow.busy !== null} data-testid=\"identity-pay\">\n {flow.busy === 'pay' && spinner}\n {l.pay}\n </Button>\n )\n } else if (flow.step === 'verify') {\n body = (\n <div className=\"space-y-3\">\n {flow.embedFailed ? (\n <p className=\"text-sm text-muted-foreground\">{l.embedFailed}</p>\n ) : (\n <div\n id={flow.verifyContainerId}\n ref={flow.verifyContainerRef}\n className=\"h-[560px] w-full overflow-hidden rounded-md bg-muted\"\n data-testid=\"identity-didit-frame\"\n >\n {flow.busy === 'start' && (\n <div className=\"flex h-full items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n </div>\n )\n footer = (\n <>\n {flow.embedFailed && (\n <Button variant=\"outline\" onClick={flow.openInNewTab}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n {l.openInNewTab}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={flow.checkResult} disabled={flow.busy !== null}>\n {flow.busy === 'refresh' && spinner}\n {l.checkResult}\n </Button>\n </>\n )\n } else if (status?.state === 'name_mismatch') {\n body = (\n <div className=\"space-y-3\" data-testid=\"identity-name-mismatch\">\n <p className=\"text-sm text-muted-foreground\">{l.nameMismatchBody}</p>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n <dt className=\"text-muted-foreground\">{l.documentName}</dt>\n <dd className=\"font-medium\">{docName}</dd>\n <dt className=\"text-muted-foreground\">{l.accountName}</dt>\n <dd>{accountName}</dd>\n </dl>\n </div>\n )\n footer = (\n <>\n <Button variant=\"ghost\" onClick={flow.keepName} disabled={flow.busy !== null}>\n {l.keepName}\n </Button>\n <Button onClick={flow.acceptName} disabled={flow.busy !== null || !docName}>\n {flow.busy === 'accept' && spinner}\n {l.useDocumentName(docName)}\n </Button>\n </>\n )\n } else if (status?.verified) {\n body = (\n <p className=\"flex items-center gap-2 text-sm\">\n <VerifiedBadge className=\"h-4 w-4\" />\n {l.resultVerified}\n </p>\n )\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else if (status?.state === 'in_review') {\n body = <p className=\"text-sm text-muted-foreground\">{l.resultInReview}</p>\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else {\n const left = status?.attempts_left ?? 0\n body = <p className=\"text-sm text-muted-foreground\">{l.resultDeclined(left)}</p>\n footer =\n left > 0 ? (\n <Button onClick={flow.retry} disabled={flow.busy !== null}>\n {l.tryAgain}\n </Button>\n ) : (\n <Button onClick={flow.close}>{l.close}</Button>\n )\n }\n\n const title =\n status?.state === 'name_mismatch' && flow.step === 'result'\n ? l.nameMismatchTitle\n : flow.step === 'verify'\n ? l.verifyTitle\n : l.payTitle\n return (\n <ModalScaffold\n open={flow.isOpen}\n onOpenChange={(open) => (open ? flow.open() : flow.close())}\n title={title}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n size={flow.step === 'verify' ? 'lg' : 'md'}\n dismissible={dismissible}\n testId=\"identity-verification-dialog\"\n >\n <ModalScaffold.Body>\n {body}\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>{footer}</ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n// ── Gate ────────────────────────────────────────────────────────────────────\n\nexport interface RequireVerifiedProps {\n flow: IdentityVerificationFlow\n accountName: string\n onManageBilling?: () => void\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/**\n * Children behind a verified identity when the deployment requires it (`status.required`): until\n * the user is verified a dialog that cannot be dismissed covers them. Passes through otherwise.\n */\nexport function RequireVerified({\n flow,\n accountName,\n onManageBilling,\n children,\n labels,\n}: RequireVerifiedProps) {\n const l = useLabels(labels)\n const { status } = flow\n const blocked = Boolean(status?.enabled && status.required && !status.verified)\n if (!blocked || !status) return <>{children}</>\n\n if (flow.isOpen) {\n return (\n <>\n {children}\n <IdentityVerificationDialog\n flow={flow}\n accountName={accountName}\n dismissible={false}\n onManageBilling={onManageBilling}\n labels={labels}\n />\n </>\n )\n }\n return (\n <>\n {children}\n <ModalScaffold\n open\n onOpenChange={() => {}}\n title={l.requiredTitle}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n dismissible={false}\n testId=\"identity-required-gate\"\n >\n <ModalScaffold.Body>\n <p className=\"text-sm text-muted-foreground\">\n {status.eligible ? l.requiredBody : l.requiredProOnly}\n </p>\n </ModalScaffold.Body>\n {status.eligible && (\n <ModalScaffold.Footer>\n <Button onClick={flow.open}>{l.verify}</Button>\n </ModalScaffold.Footer>\n )}\n </ModalScaffold>\n </>\n )\n}\n","/**\n * A settings page: a tab per section, the open section's body under a page title. Each section is\n * addressable by its id, so a host (or `openSettings(section)`) can open the page at one.\n */\nimport type { ReactNode } from 'react'\nimport { TabHeader } from '../shell/TabHeader'\nimport { DraggableHeader } from './DraggableHeader'\nimport { PanelFrame, PanelFrameBody } from './PanelFrame'\n\nexport interface SettingsPageSection {\n /** Addressable id, e.g. `account`; the tab's test id is `<id>-tab`. */\n id: string\n label: ReactNode\n icon?: ReactNode\n /** The section's body, rendered only while it is open. */\n render: () => ReactNode\n /** Controls at the right of the tab row while this section is open. */\n actions?: ReactNode\n}\n\nexport interface SettingsPageProps {\n sections: readonly SettingsPageSection[]\n /** The open section's id; an id with no section opens the first. */\n activeSectionId: string | undefined\n onSectionChange: (id: string) => void\n /** Page heading above the section body; default `Settings`. */\n title?: ReactNode\n /** Controls at the right of the tab row on every section (e.g. the panel's mode switcher). */\n headerActions?: ReactNode\n /** Dialogs and other content outside the frame. */\n children?: ReactNode\n testId?: string\n}\n\n/** The section a page opens at: the one asked for when it exists, else the first. */\nexport function resolveSettingsSection(\n sections: readonly SettingsPageSection[],\n id: string | undefined\n): SettingsPageSection | undefined {\n return sections.find((section) => section.id === id) ?? sections[0]\n}\n\nexport function SettingsPage({\n sections,\n activeSectionId,\n onSectionChange,\n title = 'Settings',\n headerActions,\n children,\n testId = 'settings-page',\n}: SettingsPageProps) {\n const active = resolveSettingsSection(sections, activeSectionId)\n return (\n <>\n <PanelFrame testId={testId}>\n <DraggableHeader>\n <TabHeader\n tabs={sections.map(({ id, label, icon }) => ({ id, label, icon }))}\n activeTabId={active?.id ?? ''}\n onTabChange={onSectionChange}\n variant=\"underline\"\n // Settings icons alone do not tell the sections apart on touch: keep the labels and\n // let the row scroll instead of collapsing to icons.\n compactBreakpoint={0}\n rightContent={() => (\n <div className=\"flex items-center gap-2\">\n {active?.actions}\n {headerActions}\n </div>\n )}\n />\n </DraggableHeader>\n <PanelFrameBody className=\"overflow-auto px-6 pb-6 pt-4\">\n <h1 className=\"mx-auto mb-4 w-full max-w-2xl text-xl font-semibold text-foreground\">\n {title}\n </h1>\n {active?.render()}\n </PanelFrameBody>\n </PanelFrame>\n {children}\n </>\n )\n}\n","/**\n * Appearance: the reader's colour scheme, text size and typeface. Every change applies at once;\n * there is no Save, because there is nothing to lose. The host keeps the choice (on the device).\n */\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@arbidocs/react/ui'\nimport { Moon, RotateCcw, Sun } from 'lucide-react'\nimport type { AppearanceColorScheme, AppearanceTextSize } from '../theme/appearance'\nimport { getFontPairing } from '../theme/fontPairings'\nimport { SegmentedControl, type SegmentedOption } from './SegmentedControl'\nimport { SettingsPanel, SettingsSection } from './SettingsPanel'\n\nconst SCHEME_OPTIONS: SegmentedOption<AppearanceColorScheme>[] = (\n [\n { value: 'light', label: 'Light', icon: <Sun className=\"h-4 w-4\" /> },\n { value: 'dark', label: 'Dark', icon: <Moon className=\"h-4 w-4\" /> },\n ] as const\n).map((option) => ({ ...option, testId: `appearance-scheme-${option.value}` }))\n\nconst TEXT_SIZE_OPTIONS: SegmentedOption<AppearanceTextSize>[] = (\n [\n { value: 'default', label: 'Default' },\n { value: 'large', label: 'Large' },\n { value: 'larger', label: 'Larger' },\n ] as const\n).map((option) => ({ ...option, testId: `appearance-text-size-${option.value}` }))\n\n/** The typefaces offered by default: a spread across `FONT_PAIRINGS`. */\nexport const DEFAULT_APPEARANCE_PAIRING_IDS = [\n 'office',\n 'inter',\n 'fraunces-inter',\n 'montserrat-nunito',\n] as const\n\nexport interface AppearanceSettingsProps {\n colorScheme: AppearanceColorScheme\n onColorSchemeChange: (scheme: AppearanceColorScheme) => void\n textSize: AppearanceTextSize\n onTextSizeChange: (size: AppearanceTextSize) => void\n /** The typeface (a `FONT_PAIRINGS` id). */\n pairingId: string\n onPairingChange: (pairingId: string) => void\n /** Typefaces to offer; default {@link DEFAULT_APPEARANCE_PAIRING_IDS}. */\n pairingIds?: readonly string[]\n /** Shown while the choice differs from the defaults. */\n onReset?: () => void\n}\n\nexport function AppearanceSettings({\n colorScheme,\n onColorSchemeChange,\n textSize,\n onTextSizeChange,\n pairingId,\n onPairingChange,\n pairingIds = DEFAULT_APPEARANCE_PAIRING_IDS,\n onReset,\n}: AppearanceSettingsProps) {\n const activePairing = getFontPairing(pairingId) ?? getFontPairing(pairingIds[0])\n return (\n <SettingsPanel testId=\"settings-appearance\">\n <SettingsSection\n title=\"Colour scheme\"\n action={\n onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"flex items-center gap-1.5 py-1 text-sm text-muted-foreground hover:text-foreground pointer-coarse:min-h-11\"\n data-testid=\"appearance-reset\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Reset\n </button>\n )\n }\n >\n <SegmentedControl\n value={colorScheme}\n onChange={onColorSchemeChange}\n options={SCHEME_OPTIONS}\n ariaLabel=\"Colour scheme\"\n />\n </SettingsSection>\n\n <SettingsSection title=\"Text size\">\n <SegmentedControl\n value={textSize}\n onChange={onTextSizeChange}\n options={TEXT_SIZE_OPTIONS}\n ariaLabel=\"Text size\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Makes all text larger, including documents in the viewer and citations. Applied straight\n away and remembered on this device.\n </p>\n </SettingsSection>\n\n <SettingsSection title=\"Typeface\">\n <Select value={pairingId} onValueChange={onPairingChange}>\n <SelectTrigger className=\"w-full\" data-testid=\"appearance-typeface-select\">\n <SelectValue>\n {activePairing && (\n <span style={{ fontFamily: activePairing.display }}>{activePairing.label}</span>\n )}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {pairingIds.map((id) => {\n const pairing = getFontPairing(id)\n if (!pairing) return null\n return (\n <SelectItem key={id} value={id} data-testid={`appearance-typeface-${id}`}>\n <span style={{ fontFamily: pairing.display }}>{pairing.label}</span>\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n <p className=\"text-sm text-muted-foreground\">\n Sets the headings and body text across the app. Applied straight away and remembered on\n this device.\n </p>\n </SettingsSection>\n </SettingsPanel>\n )\n}\n","/**\n * The tri-state filter's evaluator over an inverted index (`Map<key, Set<itemId>>`): include is OR\n * across keys, exclude drops a match and wins over include. What a `TriStateFilterMenu` selection\n * lets through a list (the Files list, the Tags page's tagged items).\n */\n\nimport type { TriState } from './TriStateFilterMenu'\n\n/**\n * Tri-state filter evaluator backed by an inverted index\n * (`Map<filterKey, Set<itemId>>`). Same semantics as\n * the tri-state filter menu — excluded wins, include is OR across keys —\n * but avoids the per-item attribute record lookup.\n *\n * Scales well when:\n * - many filter keys are active (no per-item M-key scan),\n * - or the selected filters are selective (union sets stay small).\n *\n * Complexity: O(sum of excluded+included set sizes) to build the\n * unions, plus O(N) over `items` to preserve order — every lookup in\n * the scan is O(1) hash.\n */\nexport function applyInvertedIndexFilter<T, K extends string>(\n items: T[],\n filterStates: ReadonlyMap<K, TriState>,\n invertedIndex: Map<K, Set<string>>,\n getId: (item: T) => string\n): T[] {\n const includeKeys: K[] = []\n const excludeKeys: K[] = []\n for (const [key, state] of filterStates) {\n if (state === 'include') includeKeys.push(key)\n else if (state === 'exclude') excludeKeys.push(key)\n }\n\n if (includeKeys.length === 0 && excludeKeys.length === 0) return items\n\n const excluded = new Set<string>()\n for (const key of excludeKeys) {\n const set = invertedIndex.get(key)\n if (set) for (const id of set) excluded.add(id)\n }\n\n let included: Set<string> | null = null\n if (includeKeys.length > 0) {\n included = new Set<string>()\n for (const key of includeKeys) {\n const set = invertedIndex.get(key)\n if (set) for (const id of set) included.add(id)\n }\n }\n\n return items.filter((item) => {\n const id = getId(item)\n if (excluded.has(id)) return false\n if (included && !included.has(id)) return false\n return true\n })\n}\n\n/**\n * The inverted index {@link applyInvertedIndexFilter} reads (`Map<key, Set<itemId>>`), built in\n * one pass from each item's keys.\n */\nexport function buildInvertedIndex<T>(\n items: T[],\n getId: (item: T) => string,\n getKeys: (item: T) => Iterable<string>\n): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>()\n for (const item of items) {\n const id = getId(item)\n for (const key of getKeys(item)) {\n let set = index.get(key)\n if (!set) index.set(key, (set = new Set()))\n set.add(id)\n }\n }\n return index\n}\n","/**\n * The Experimental \"Audio/video calls\" row: unavailable while the server has calls off, the\n * person's own opt-in while calls are experimental there, and simply on (nothing to switch) where\n * the deployment made them a regular feature (`experimental: false`).\n */\nexport function callsSwitchState(\n config: { enabled?: boolean; experimental?: boolean } | undefined,\n optedIn: boolean\n): { checked: boolean; disabled: boolean; description: string } {\n if (config?.enabled !== true) {\n return {\n checked: false,\n disabled: true,\n description:\n 'Not available on this server. Enable on the server with manage-deployment --calls.',\n }\n }\n if (config.experimental === false) {\n return { checked: true, disabled: true, description: 'On for everyone on this server.' }\n }\n return {\n checked: optedIn,\n disabled: false,\n description:\n 'End-to-end encrypted calls from threads and DMs, scheduled calls and incoming-call rings. Call links open either way.',\n }\n}\n"]}
|