@arbidocs/blocks 0.4.137 → 0.4.139

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/agents/definitions/AgentConnectInstructions.d.ts +12 -0
  2. package/dist/agents/definitions/defaults.d.ts +12 -0
  3. package/dist/agents/definitions/index.d.ts +2 -0
  4. package/dist/agents/index.cjs +457 -418
  5. package/dist/agents/index.js +12 -13
  6. package/dist/agents/skills/SkillLibraryDetail.d.ts +26 -0
  7. package/dist/agents/skills/index.d.ts +2 -0
  8. package/dist/agents/skills/skillLibrary.d.ts +46 -0
  9. package/dist/calendar/CalendarFormDialog.d.ts +13 -0
  10. package/dist/calendar/ProposeTimeDialog.d.ts +22 -0
  11. package/dist/calendar/WeeklyHoursEditor.d.ts +7 -0
  12. package/dist/calendar/access-setup.d.ts +8 -0
  13. package/dist/calendar/api-mapping.d.ts +22 -0
  14. package/dist/calendar/booking-form.d.ts +46 -0
  15. package/dist/calendar/conference.d.ts +11 -0
  16. package/dist/calendar/errors.d.ts +7 -0
  17. package/dist/calendar/feeds.d.ts +2 -0
  18. package/dist/calendar/freebusy.d.ts +22 -0
  19. package/dist/calendar/ics.d.ts +33 -0
  20. package/dist/calendar/index.cjs +472 -4293
  21. package/dist/calendar/index.cjs.map +1 -1
  22. package/dist/calendar/index.d.ts +17 -1
  23. package/dist/calendar/index.js +1 -4227
  24. package/dist/calendar/index.js.map +1 -1
  25. package/dist/calendar/requests.d.ts +42 -0
  26. package/dist/calendar/room-window.d.ts +6 -0
  27. package/dist/calendar/settings-value.d.ts +4 -0
  28. package/dist/calls/index.cjs +4 -4
  29. package/dist/calls/index.js +3 -3
  30. package/dist/chat/index.cjs +141 -141
  31. package/dist/chat/index.js +6 -6
  32. package/dist/{chunk-M33QUNFH.js → chunk-22WFGXG2.js} +3 -3
  33. package/dist/{chunk-M33QUNFH.js.map → chunk-22WFGXG2.js.map} +1 -1
  34. package/dist/{chunk-VMESMX7N.js → chunk-453PNNNW.js} +3 -3
  35. package/dist/{chunk-VMESMX7N.js.map → chunk-453PNNNW.js.map} +1 -1
  36. package/dist/{chunk-2KUCVSFF.js → chunk-45LRMW54.js} +3 -3
  37. package/dist/{chunk-2KUCVSFF.js.map → chunk-45LRMW54.js.map} +1 -1
  38. package/dist/chunk-5FTIHRZH.cjs +177 -0
  39. package/dist/chunk-5FTIHRZH.cjs.map +1 -0
  40. package/dist/{chunk-FUTMU4FR.js → chunk-5HFPRI3W.js} +3 -3
  41. package/dist/{chunk-FUTMU4FR.js.map → chunk-5HFPRI3W.js.map} +1 -1
  42. package/dist/{chunk-JY73DJOS.cjs → chunk-5UXDUOOB.cjs} +84 -1211
  43. package/dist/chunk-5UXDUOOB.cjs.map +1 -0
  44. package/dist/{chunk-ATJUVHVB.js → chunk-6QMWP5IU.js} +1445 -11
  45. package/dist/chunk-6QMWP5IU.js.map +1 -0
  46. package/dist/chunk-6YTHQ73P.cjs +5334 -0
  47. package/dist/chunk-6YTHQ73P.cjs.map +1 -0
  48. package/dist/{chunk-KMNZ2RVO.js → chunk-7QUUZBQZ.js} +15 -1109
  49. package/dist/chunk-7QUUZBQZ.js.map +1 -0
  50. package/dist/{chunk-C3ZRLULA.cjs → chunk-7X255TOM.cjs} +5 -5
  51. package/dist/{chunk-C3ZRLULA.cjs.map → chunk-7X255TOM.cjs.map} +1 -1
  52. package/dist/chunk-A3XPS2EU.js +245 -0
  53. package/dist/chunk-A3XPS2EU.js.map +1 -0
  54. package/dist/chunk-B3AHCIV5.js +5206 -0
  55. package/dist/chunk-B3AHCIV5.js.map +1 -0
  56. package/dist/{chunk-2Q7FDZAY.js → chunk-BPBSSMRB.js} +5 -163
  57. package/dist/chunk-BPBSSMRB.js.map +1 -0
  58. package/dist/{chunk-KSHKTOY2.js → chunk-CKCBBYTA.js} +205 -5
  59. package/dist/chunk-CKCBBYTA.js.map +1 -0
  60. package/dist/chunk-CYNF5PZI.js +170 -0
  61. package/dist/chunk-CYNF5PZI.js.map +1 -0
  62. package/dist/{chunk-OPTBQSCV.cjs → chunk-DJM7DLCT.cjs} +3 -3
  63. package/dist/{chunk-OPTBQSCV.cjs.map → chunk-DJM7DLCT.cjs.map} +1 -1
  64. package/dist/{chunk-E5OYHJMU.js → chunk-DN55PRGS.js} +4 -4
  65. package/dist/{chunk-E5OYHJMU.js.map → chunk-DN55PRGS.js.map} +1 -1
  66. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  67. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  68. package/dist/{chunk-KDUGTKVI.cjs → chunk-GFNELPDP.cjs} +17 -6
  69. package/dist/chunk-GFNELPDP.cjs.map +1 -0
  70. package/dist/{chunk-OGBXV326.cjs → chunk-GFRQG36Y.cjs} +2 -243
  71. package/dist/chunk-GFRQG36Y.cjs.map +1 -0
  72. package/dist/{chunk-WXYQ66KC.cjs → chunk-HEMU73OP.cjs} +2 -166
  73. package/dist/chunk-HEMU73OP.cjs.map +1 -0
  74. package/dist/{chunk-UUHUQHXR.cjs → chunk-JZNXRMLH.cjs} +6 -6
  75. package/dist/{chunk-UUHUQHXR.cjs.map → chunk-JZNXRMLH.cjs.map} +1 -1
  76. package/dist/{chunk-HDYWXEQU.cjs → chunk-K3HNLWZZ.cjs} +8 -8
  77. package/dist/{chunk-HDYWXEQU.cjs.map → chunk-K3HNLWZZ.cjs.map} +1 -1
  78. package/dist/{chunk-7M4C6CK7.js → chunk-KTFDUSON.js} +4 -4
  79. package/dist/{chunk-7M4C6CK7.js.map → chunk-KTFDUSON.js.map} +1 -1
  80. package/dist/{chunk-HLB4DIYV.cjs → chunk-MABUMUCA.cjs} +6 -6
  81. package/dist/{chunk-HLB4DIYV.cjs.map → chunk-MABUMUCA.cjs.map} +1 -1
  82. package/dist/{chunk-RQ2Y7USX.cjs → chunk-MIDXCYZB.cjs} +235 -15
  83. package/dist/chunk-MIDXCYZB.cjs.map +1 -0
  84. package/dist/{chunk-L3T7OJRX.js → chunk-MTPWZQTL.js} +4 -4
  85. package/dist/{chunk-L3T7OJRX.js.map → chunk-MTPWZQTL.js.map} +1 -1
  86. package/dist/{chunk-BUNZWOPX.cjs → chunk-O4ZIQDUT.cjs} +5 -5
  87. package/dist/{chunk-BUNZWOPX.cjs.map → chunk-O4ZIQDUT.cjs.map} +1 -1
  88. package/dist/{chunk-W3VYZXNS.js → chunk-O6W6RW3B.js} +5 -240
  89. package/dist/chunk-O6W6RW3B.js.map +1 -0
  90. package/dist/{chunk-WS5EX7DN.cjs → chunk-OGP6MQXQ.cjs} +3 -3
  91. package/dist/{chunk-WS5EX7DN.cjs.map → chunk-OGP6MQXQ.cjs.map} +1 -1
  92. package/dist/{chunk-6F7SZCVL.cjs → chunk-OWCEQKAR.cjs} +3 -3
  93. package/dist/{chunk-6F7SZCVL.cjs.map → chunk-OWCEQKAR.cjs.map} +1 -1
  94. package/dist/{chunk-OQ7RUNOC.js → chunk-PC5KVHX3.js} +22 -6
  95. package/dist/chunk-PC5KVHX3.js.map +1 -0
  96. package/dist/{chunk-CHVCTKF4.cjs → chunk-ULEDHANM.cjs} +1543 -66
  97. package/dist/chunk-ULEDHANM.cjs.map +1 -0
  98. package/dist/{chunk-L2PAPOZ5.js → chunk-US3S4DCB.js} +17 -6
  99. package/dist/chunk-US3S4DCB.js.map +1 -0
  100. package/dist/chunk-V46W7YLI.cjs +252 -0
  101. package/dist/chunk-V46W7YLI.cjs.map +1 -0
  102. package/dist/{chunk-3RJN2VTL.js → chunk-XDQXDWE7.js} +3 -3
  103. package/dist/{chunk-3RJN2VTL.js.map → chunk-XDQXDWE7.js.map} +1 -1
  104. package/dist/{chunk-EHOPZBAX.cjs → chunk-XOC44HQY.cjs} +12 -12
  105. package/dist/{chunk-EHOPZBAX.cjs.map → chunk-XOC44HQY.cjs.map} +1 -1
  106. package/dist/{chunk-YOMPLCP6.js → chunk-Y5KTM3V5.js} +3 -3
  107. package/dist/{chunk-YOMPLCP6.js.map → chunk-Y5KTM3V5.js.map} +1 -1
  108. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  109. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  110. package/dist/{chunk-AAFX64WD.cjs → chunk-ZXAWOLBQ.cjs} +22 -5
  111. package/dist/chunk-ZXAWOLBQ.cjs.map +1 -0
  112. package/dist/citations/QuietMarks.d.ts +5 -2
  113. package/dist/citations/index.cjs +15 -14
  114. package/dist/citations/index.js +3 -2
  115. package/dist/collaboration/index.cjs +51 -51
  116. package/dist/collaboration/index.js +3 -3
  117. package/dist/connect/docx.cjs +6 -6
  118. package/dist/connect/docx.js +5 -5
  119. package/dist/connect/index.cjs +6595 -1600
  120. package/dist/connect/index.cjs.map +1 -1
  121. package/dist/connect/index.d.ts +5 -0
  122. package/dist/connect/index.js +5064 -90
  123. package/dist/connect/index.js.map +1 -1
  124. package/dist/connection/ConnectedAgentCreator.d.ts +37 -0
  125. package/dist/connection/ConnectedSkillsLibrary.d.ts +26 -0
  126. package/dist/connection/ConnectedWorkflowHistory.d.ts +45 -0
  127. package/dist/connection/ConnectionProvider.d.ts +3 -1
  128. package/dist/connection/calendar/AddCalendarDialogs.d.ts +9 -0
  129. package/dist/connection/calendar/BookingPagesPanel.d.ts +13 -0
  130. package/dist/connection/calendar/CalendarAccountsPanel.d.ts +5 -0
  131. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +12 -0
  132. package/dist/connection/calendar/ConnectedCalendar.d.ts +13 -0
  133. package/dist/connection/calendar/ConnectedMailInviteCard.d.ts +12 -0
  134. package/dist/connection/calendar/ConnectedPublicBooking.d.ts +9 -0
  135. package/dist/connection/calendar/ConnectedUpcomingEvents.d.ts +12 -0
  136. package/dist/connection/calendar/CopyField.d.ts +9 -0
  137. package/dist/connection/calendar/EventEditorDialog.d.ts +29 -0
  138. package/dist/connection/calendar/EventScheduling.d.ts +8 -0
  139. package/dist/connection/calendar/InvitationsPanel.d.ts +5 -0
  140. package/dist/connection/calendar/OpenAccessPanel.d.ts +7 -0
  141. package/dist/connection/calendar/PublishCalendarDialog.d.ts +8 -0
  142. package/dist/connection/calendar/RoomsDirectoryPanel.d.ts +8 -0
  143. package/dist/connection/calendar/ShareCalendarDialog.d.ts +6 -0
  144. package/dist/connection/calendar/copy.d.ts +2 -0
  145. package/dist/connection/calendar/index.d.ts +6 -0
  146. package/dist/connection/calendar/store.d.ts +47 -0
  147. package/dist/connection/calendar/types.d.ts +36 -0
  148. package/dist/connection/calendar/useWebinarAttendee.d.ts +3 -0
  149. package/dist/connection/notification-center/ConnectedNotificationCenter.d.ts +15 -0
  150. package/dist/connection/notification-center/NotificationCenter.d.ts +37 -0
  151. package/dist/connection/notification-center/NotificationEvent.d.ts +33 -0
  152. package/dist/connection/notification-center/index.d.ts +4 -0
  153. package/dist/connection/notification-center/items.d.ts +44 -0
  154. package/dist/document-tools/index.cjs +1 -1
  155. package/dist/document-tools/index.js +1 -1
  156. package/dist/facts/index.cjs +6 -6
  157. package/dist/facts/index.js +6 -6
  158. package/dist/files/index.cjs +6 -6
  159. package/dist/files/index.js +6 -6
  160. package/dist/home/index.cjs +20 -20
  161. package/dist/home/index.js +5 -5
  162. package/dist/index.cjs +969 -928
  163. package/dist/index.cjs.map +1 -1
  164. package/dist/index.js +26 -25
  165. package/dist/index.js.map +1 -1
  166. package/dist/retrieval/index.cjs +1 -1
  167. package/dist/retrieval/index.js +1 -1
  168. package/dist/settings/index.cjs +58 -72
  169. package/dist/settings/index.cjs.map +1 -1
  170. package/dist/settings/index.js +6 -23
  171. package/dist/settings/index.js.map +1 -1
  172. package/dist/shell/index.cjs +61 -60
  173. package/dist/shell/index.js +5 -4
  174. package/dist/site/index.cjs +5 -5
  175. package/dist/site/index.js +1 -1
  176. package/dist/studio/index.cjs +11 -11
  177. package/dist/studio/index.js +9 -9
  178. package/dist/workflow-canvas/index.cjs +69 -70
  179. package/dist/workflow-canvas/index.cjs.map +1 -1
  180. package/dist/workflow-canvas/index.js +14 -15
  181. package/dist/workflow-canvas/index.js.map +1 -1
  182. package/dist/workspaces/index.cjs +2 -2
  183. package/dist/workspaces/index.js +2 -2
  184. package/node_modules/@arbidocs/coedit/package.json +1 -1
  185. package/package.json +4 -4
  186. package/dist/chunk-2Q7FDZAY.js.map +0 -1
  187. package/dist/chunk-AAFX64WD.cjs.map +0 -1
  188. package/dist/chunk-ATJUVHVB.js.map +0 -1
  189. package/dist/chunk-CHVCTKF4.cjs.map +0 -1
  190. package/dist/chunk-CQCC7LE7.js +0 -210
  191. package/dist/chunk-CQCC7LE7.js.map +0 -1
  192. package/dist/chunk-JY73DJOS.cjs.map +0 -1
  193. package/dist/chunk-KDUGTKVI.cjs.map +0 -1
  194. package/dist/chunk-KMNZ2RVO.js.map +0 -1
  195. package/dist/chunk-KSHKTOY2.js.map +0 -1
  196. package/dist/chunk-L2PAPOZ5.js.map +0 -1
  197. package/dist/chunk-OGBXV326.cjs.map +0 -1
  198. package/dist/chunk-OQ7RUNOC.js.map +0 -1
  199. package/dist/chunk-RFIBUWLF.cjs +0 -232
  200. package/dist/chunk-RFIBUWLF.cjs.map +0 -1
  201. package/dist/chunk-RQ2Y7USX.cjs.map +0 -1
  202. package/dist/chunk-W3VYZXNS.js.map +0 -1
  203. package/dist/chunk-WXYQ66KC.cjs.map +0 -1
@@ -1,13 +1,29 @@
1
1
  "use client";
2
2
  import { PasswordStrengthInput } from './chunk-VILAPTCB.js';
3
- import { testIdOr, prefixedTestId } from './chunk-7F6CBP3Z.js';
4
- import { ModalScaffold, useRestoreFocus } from './chunk-TX2ZICS7.js';
5
3
  import { formatCount } from './chunk-OXF2IFXG.js';
4
+ import { ModalScaffold, useRestoreFocus } from './chunk-TX2ZICS7.js';
5
+ import { testIdOr, prefixedTestId } from './chunk-7F6CBP3Z.js';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
7
  import { useMemo, useRef, useId, useState } from 'react';
7
8
  import { Loader2, Camera, ChevronRight, ChevronDown, Check, Pencil, Mail, ShieldCheck, ExternalLink, CheckCircle2, AlertCircle, Radio, AlertTriangle, LogOut } from 'lucide-react';
8
9
  import { Avatar, AvatarImage, AvatarFallback, cn, Input, Button, VerifiedBadge, Tooltip, TooltipTrigger, TooltipContent, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, Collapsible, CollapsibleTrigger, CollapsibleContent, Switch, Checkbox, Badge } from '@arbidocs/react/ui';
9
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
10
10
 
11
+ var INTERACTIVE_SELECTOR = 'button, input, select, a, [role="tab"], [role="radio"]';
12
+ function DraggableHeader({ onDragStart, children }) {
13
+ return /* @__PURE__ */ jsx(
14
+ "div",
15
+ {
16
+ className: "flex-shrink-0",
17
+ onMouseDown: onDragStart ? (e) => {
18
+ const target = e.target;
19
+ if (target.closest(INTERACTIVE_SELECTOR)) return;
20
+ onDragStart(e);
21
+ } : void 0,
22
+ style: onDragStart ? { cursor: "move" } : void 0,
23
+ children
24
+ }
25
+ );
26
+ }
11
27
  var DEFAULT_AVATAR_PICKER_LABELS = {
12
28
  uploadingPicture: "Uploading picture",
13
29
  changeProfilePicture: "Change profile picture",
@@ -1408,6 +1424,6 @@ function toNotificationCategories(checked, defs = EMAIL_NOTIFICATION_CATEGORIES)
1408
1424
  return defs.map((def) => ({ ...def, checked: checked[def.key] ?? true }));
1409
1425
  }
1410
1426
 
1411
- export { ActiveSessionsDialog, AvatarPicker, DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, DEFAULT_AVATAR_PICKER_LABELS, DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, DEFAULT_IDENTITY_VERIFICATION_LABELS, DEFAULT_LOGOUT_DIALOG_LABELS, DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, DEFAULT_PROFILE_CARD_LABELS, DEFAULT_SETTINGS_DANGER_ZONE_LABELS, DeleteAccountDialog, EMAIL_NOTIFICATION_CATEGORIES, EMAIL_NOTIFICATION_KEYS, IdentityVerificationCard, IdentityVerificationDialog, LogoutDialog, NotificationCategoryList, PasswordChangeDialog, ProfileCard, RequireVerified, SettingsActionRow, SettingsCard, SettingsDangerZone, SettingsPanel, SettingsRow, SettingsSection, SettingsSwitchGroup, SettingsSwitchRow, formatSessionTtl, toActiveSessionViews, toDeleteBlockerViews, toLogoutSessionViews, toNotificationCategories };
1412
- //# sourceMappingURL=chunk-OQ7RUNOC.js.map
1413
- //# sourceMappingURL=chunk-OQ7RUNOC.js.map
1427
+ export { ActiveSessionsDialog, AvatarPicker, DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, DEFAULT_AVATAR_PICKER_LABELS, DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, DEFAULT_IDENTITY_VERIFICATION_LABELS, DEFAULT_LOGOUT_DIALOG_LABELS, DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, DEFAULT_PROFILE_CARD_LABELS, DEFAULT_SETTINGS_DANGER_ZONE_LABELS, DeleteAccountDialog, DraggableHeader, EMAIL_NOTIFICATION_CATEGORIES, EMAIL_NOTIFICATION_KEYS, IdentityVerificationCard, IdentityVerificationDialog, LogoutDialog, NotificationCategoryList, PasswordChangeDialog, ProfileCard, RequireVerified, SettingsActionRow, SettingsCard, SettingsDangerZone, SettingsPanel, SettingsRow, SettingsSection, SettingsSwitchGroup, SettingsSwitchRow, formatSessionTtl, toActiveSessionViews, toDeleteBlockerViews, toLogoutSessionViews, toNotificationCategories };
1428
+ //# sourceMappingURL=chunk-PC5KVHX3.js.map
1429
+ //# sourceMappingURL=chunk-PC5KVHX3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/DraggableHeader.tsx","../src/settings/AvatarPicker.tsx","../src/settings/SettingsPanel.tsx","../src/settings/ProfileCard.tsx","../src/settings/IdentityVerification.tsx","../src/settings/PasswordChangeDialog.tsx","../src/settings/AccountDialogs.tsx","../src/settings/LogoutDialog.tsx","../src/settings/SettingsSwitchRow.tsx","../src/settings/NotificationCategoryList.tsx","../src/settings/account-views.ts"],"names":["jsx","cn","jsxs","useMemo","Loader2","Button","VerifiedBadge","Fragment","Input","Tooltip","TooltipTrigger","TooltipContent","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","useId","Badge","LogOut","ChevronDown","ChevronRight","Radio"],"mappings":"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","file":"chunk-PC5KVHX3.js","sourcesContent":["/**\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 { 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 ComponentProps, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the danger zone. `label` prop wins. */\nexport interface SettingsDangerZoneLabels {\n dangerZone: string\n}\n\nexport const DEFAULT_SETTINGS_DANGER_ZONE_LABELS: SettingsDangerZoneLabels = {\n dangerZone: 'Danger Zone',\n}\n\nexport interface SettingsPanelProps extends ComponentProps<'div'> {\n /** Stable test id of the panel. */\n testId?: string\n}\n\n/** Centred column of {@link SettingsSection}s with a readable measure. */\nexport function SettingsPanel({ className, testId, ...props }: SettingsPanelProps) {\n return (\n <div\n data-slot=\"settings-panel\"\n data-testid={testId}\n className={cn('mx-auto w-full max-w-xl space-y-6', className)}\n {...props}\n />\n )\n}\n\nexport interface SettingsSectionProps extends Omit<ComponentProps<'section'>, 'title'> {\n /** Small muted icon before the title. */\n icon?: ReactNode\n title?: ReactNode\n description?: ReactNode\n /** Right-aligned control in the heading row (e.g. a Reset button). */\n action?: ReactNode\n testId?: string\n}\n\n/** Titled group of settings: heading row, optional description, then the controls. */\nexport function SettingsSection({\n icon,\n title,\n description,\n action,\n testId,\n className,\n children,\n ...props\n}: SettingsSectionProps) {\n return (\n <section\n data-slot=\"settings-section\"\n data-testid={testId}\n className={cn('space-y-3', className)}\n {...props}\n >\n {(title || action) && (\n <div className=\"flex items-center justify-between gap-3\">\n {title && (\n <div className=\"flex items-center gap-2\">\n {icon && (\n <span className=\"text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\">{icon}</span>\n )}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n </div>\n )}\n {action}\n </div>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n {children}\n </section>\n )\n}\n\nexport interface SettingsRowProps extends Omit<ComponentProps<'div'>, 'title'> {\n label: ReactNode\n /** Id of the control: renders the label as a `<label htmlFor>` so it toggles the control. */\n labelFor?: string\n description?: ReactNode\n /** The control: switch, select, button. Sits at the end of the row. */\n children?: ReactNode\n testId?: string\n}\n\n/** One setting: label + help text on the left, its control on the right (stacks on phones). */\nexport function SettingsRow({\n label,\n labelFor,\n description,\n children,\n testId,\n className,\n ...props\n}: SettingsRowProps) {\n return (\n <div\n data-slot=\"settings-row\"\n data-testid={testId}\n className={cn(\n 'flex flex-col gap-2 py-2 @xl:flex-row @xl:items-center @xl:justify-between @xl:gap-6',\n className\n )}\n {...props}\n >\n <div className=\"min-w-0\">\n {labelFor ? (\n <label htmlFor={labelFor} className=\"text-sm font-medium text-foreground\">\n {label}\n </label>\n ) : (\n <div className=\"text-sm font-medium text-foreground\">{label}</div>\n )}\n {description && <div className=\"text-sm text-muted-foreground\">{description}</div>}\n </div>\n {children && <div className=\"flex shrink-0 items-center gap-2\">{children}</div>}\n </div>\n )\n}\n\nexport interface SettingsCardProps extends ComponentProps<'div'> {\n /** `md` for form-like content, `sm` when the card holds a list of full-bleed action rows. */\n padding?: 'md' | 'sm'\n}\n\n/** Bordered card that groups related settings, the same surface as the dashboard cards. */\nexport function SettingsCard({ padding = 'md', className, ...props }: SettingsCardProps) {\n return (\n <div\n data-slot=\"settings-card\"\n className={cn(\n 'rounded-lg border border-border bg-card shadow-xs',\n padding === 'md' ? 'space-y-5 p-5' : 'divide-y divide-border p-2',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface SettingsActionRowProps {\n title: ReactNode\n description?: ReactNode\n onClick: () => void\n testId?: string\n}\n\n/** Full-width row that opens a dialog or sub-page: title, help text and a chevron. */\nexport function SettingsActionRow({ title, description, onClick, testId }: SettingsActionRowProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-slot=\"settings-action-row\"\n data-testid={testId}\n className=\"flex w-full items-center gap-3 rounded-md px-3 py-3 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=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold text-foreground\">{title}</div>\n {description && (\n <div className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{description}</div>\n )}\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n )\n}\n\nexport interface SettingsDangerZoneProps {\n isOpen: boolean\n onToggle: () => void\n /** Heading of the collapsed zone. */\n label?: string\n title: ReactNode\n description: ReactNode\n /** The destructive control (a Button). */\n action: ReactNode\n labels?: Partial<SettingsDangerZoneLabels>\n}\n\n/** Collapsed-by-default zone for irreversible actions. */\nexport function SettingsDangerZone({\n isOpen,\n onToggle,\n label,\n title,\n description,\n action,\n labels,\n}: SettingsDangerZoneProps) {\n const l = useMemo(() => ({ ...DEFAULT_SETTINGS_DANGER_ZONE_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"settings-danger-zone\" className=\"mt-8 pt-2\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n className=\"flex w-full items-center gap-1.5 text-left pointer-coarse:min-h-11\"\n >\n {isOpen ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <p className=\"text-sm font-medium text-muted-foreground\">{label ?? l.dangerZone}</p>\n </button>\n {isOpen && (\n <div className=\"mt-3 flex items-center justify-between gap-4 rounded-lg bg-destructive/5 p-4\">\n <div>\n <p className=\"font-medium\">{title}</p>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n <div className=\"shrink-0\">{action}</div>\n </div>\n )}\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:\n 'Your email is managed by your sign-in provider. Change it there and it will sync here automatically on your next sign-in.',\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 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 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 {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 onClick={name.onCancel} size=\"sm\" variant=\"ghost\" disabled={name.isSaving}>\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\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","/**\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, 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 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 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 return (\n <SettingsCard padding=\"sm\" data-testid=\"identity-verification-card\">\n <SettingsRow label={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}\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","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, 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, 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 { 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","/**\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"]}