@arbidocs/react 0.5.111 → 0.5.112

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 (983) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,215 @@
1
+ import { Fragment, jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { cn } from "../lib/utils.js";
5
+ const TooltipContext = React.createContext(null);
6
+ const DEFAULT_DELAY = 300;
7
+ const TooltipConfigContext = React.createContext({
8
+ delayDuration: DEFAULT_DELAY
9
+ });
10
+ const TooltipProvider = ({ children, delayDuration = DEFAULT_DELAY }) => {
11
+ const value = React.useMemo(() => ({ delayDuration }), [delayDuration]);
12
+ return /* @__PURE__ */ jsx(TooltipConfigContext.Provider, { value, children });
13
+ };
14
+ function Tooltip({ children, delayDuration }) {
15
+ const config = React.useContext(TooltipConfigContext);
16
+ const delay = delayDuration ?? config.delayDuration;
17
+ const [open, setOpen] = React.useState(false);
18
+ const triggerRef = React.useRef(null);
19
+ const timer = React.useRef(null);
20
+ const contentId = React.useId();
21
+ const clearTimer = () => {
22
+ if (timer.current) {
23
+ clearTimeout(timer.current);
24
+ timer.current = null;
25
+ }
26
+ };
27
+ const suppressed = React.useRef(false);
28
+ const show = React.useCallback(() => {
29
+ clearTimer();
30
+ if (suppressed.current) return;
31
+ timer.current = setTimeout(() => setOpen(true), delay);
32
+ }, [delay]);
33
+ const hide = React.useCallback(() => {
34
+ clearTimer();
35
+ setOpen(false);
36
+ }, []);
37
+ const suppress = React.useCallback(() => {
38
+ suppressed.current = true;
39
+ clearTimer();
40
+ setOpen(false);
41
+ }, []);
42
+ const release = React.useCallback(() => {
43
+ suppressed.current = false;
44
+ }, []);
45
+ const setTrigger = React.useCallback((el) => {
46
+ triggerRef.current = el;
47
+ }, []);
48
+ React.useEffect(() => () => clearTimer(), []);
49
+ const value = React.useMemo(
50
+ () => ({ open, show, hide, suppress, release, setTrigger, triggerRef, contentId }),
51
+ [open, show, hide, suppress, release, setTrigger, contentId]
52
+ );
53
+ return /* @__PURE__ */ jsx(TooltipContext.Provider, { value, children });
54
+ }
55
+ function isKeyboardFocus(target) {
56
+ try {
57
+ return target.matches(":focus-visible");
58
+ } catch {
59
+ return true;
60
+ }
61
+ }
62
+ function showsOwnText(el) {
63
+ if (!el) return false;
64
+ const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);
65
+ let visible = "";
66
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
67
+ if (node.parentElement?.closest(".sr-only")) continue;
68
+ visible += node.textContent ?? "";
69
+ }
70
+ return /\p{L}{2,}/u.test(visible);
71
+ }
72
+ function TooltipTrigger({
73
+ asChild,
74
+ showWithText = false,
75
+ children,
76
+ ...props
77
+ }) {
78
+ const ctx = React.useContext(TooltipContext);
79
+ if (!ctx) return /* @__PURE__ */ jsx(Fragment, { children });
80
+ const triggerHandlers = {
81
+ onPointerEnter: (e) => {
82
+ ;
83
+ props.onPointerEnter?.(e);
84
+ if (e.pointerType === "touch") return;
85
+ if (!showWithText && showsOwnText(e.currentTarget)) return;
86
+ ctx.show();
87
+ },
88
+ onPointerLeave: (e) => {
89
+ ;
90
+ props.onPointerLeave?.(e);
91
+ ctx.release();
92
+ ctx.hide();
93
+ },
94
+ onPointerDown: (e) => {
95
+ ;
96
+ props.onPointerDown?.(e);
97
+ (asChild && React.isValidElement(children) ? children.props.onPointerDown : void 0)?.(e);
98
+ ctx.suppress();
99
+ },
100
+ onFocus: (e) => {
101
+ ;
102
+ props.onFocus?.(e);
103
+ if (isKeyboardFocus(e.target) && (showWithText || !showsOwnText(e.currentTarget))) ctx.show();
104
+ },
105
+ onBlur: (e) => {
106
+ ;
107
+ props.onBlur?.(e);
108
+ ctx.hide();
109
+ },
110
+ "aria-describedby": ctx.open ? ctx.contentId : void 0,
111
+ "data-state": ctx.open ? "open" : "closed"
112
+ };
113
+ if (asChild && React.isValidElement(children)) {
114
+ const child = children;
115
+ return React.cloneElement(child, {
116
+ ...props,
117
+ ...triggerHandlers,
118
+ ref: ctx.setTrigger
119
+ });
120
+ }
121
+ return /* @__PURE__ */ jsx(
122
+ "button",
123
+ {
124
+ type: "button",
125
+ ...props,
126
+ ...triggerHandlers,
127
+ ref: ctx.setTrigger,
128
+ children
129
+ }
130
+ );
131
+ }
132
+ const TRANSFORM_BY_SIDE = {
133
+ top: "translate(-50%, -100%)",
134
+ bottom: "translate(-50%, 0)",
135
+ left: "translate(-100%, -50%)",
136
+ right: "translate(0, -50%)"
137
+ };
138
+ const TooltipContent = React.forwardRef(
139
+ ({ className, side = "top", sideOffset = 4, collisionPadding = 8, style, ...props }, ref) => {
140
+ const ctx = React.useContext(TooltipContext);
141
+ const innerRef = React.useRef(null);
142
+ const [coords, setCoords] = React.useState(null);
143
+ React.useLayoutEffect(() => {
144
+ if (!ctx?.open || !ctx.triggerRef.current) {
145
+ setCoords(null);
146
+ return;
147
+ }
148
+ const r = ctx.triggerRef.current.getBoundingClientRect();
149
+ const c = innerRef.current?.getBoundingClientRect();
150
+ const ch = c?.height ?? 0;
151
+ const cw = c?.width ?? 0;
152
+ const vh = window.innerHeight;
153
+ const vw = window.innerWidth;
154
+ let s = side;
155
+ if (s === "top" && r.top - sideOffset - ch < 0) s = "bottom";
156
+ else if (s === "bottom" && r.bottom + sideOffset + ch > vh) s = "top";
157
+ else if (s === "left" && r.left - sideOffset - cw < 0) s = "right";
158
+ else if (s === "right" && r.right + sideOffset + cw > vw) s = "left";
159
+ const PAD = collisionPadding;
160
+ const clamp = (value, half, max) => Math.min(Math.max(value, PAD + half), Math.max(PAD + half, max - PAD - half));
161
+ const rawTop = s === "top" ? r.top - sideOffset : s === "bottom" ? r.bottom + sideOffset : r.top + r.height / 2;
162
+ const rawLeft = s === "left" ? r.left - sideOffset : s === "right" ? r.right + sideOffset : r.left + r.width / 2;
163
+ setCoords({
164
+ top: s === "left" || s === "right" ? clamp(rawTop, ch / 2, vh) : rawTop,
165
+ left: s === "top" || s === "bottom" ? clamp(rawLeft, cw / 2, vw) : rawLeft,
166
+ transform: TRANSFORM_BY_SIDE[s]
167
+ });
168
+ }, [ctx?.open, side, sideOffset, collisionPadding, ctx?.triggerRef]);
169
+ if (!ctx?.open) return null;
170
+ const setRefs = (node) => {
171
+ innerRef.current = node;
172
+ if (typeof ref === "function") ref(node);
173
+ else if (ref) ref.current = node;
174
+ };
175
+ return createPortal(
176
+ /* @__PURE__ */ jsx(
177
+ "div",
178
+ {
179
+ ref: setRefs,
180
+ id: ctx.contentId,
181
+ role: "tooltip",
182
+ className: cn(
183
+ // The kit owns the tooltip's look: semantic tokens only, so it is
184
+ // legible in every app without one of them defining a global class.
185
+ // The `tooltip-content` hook is kept last-but-one so a host stylesheet
186
+ // can still restyle every tooltip in one place (the ARBI app does, with
187
+ // `!important` rules that win over these defaults).
188
+ "pointer-events-none w-max max-w-[300px] break-words rounded-md border border-border bg-popover px-3 py-2 text-sm font-normal text-popover-foreground shadow-lg",
189
+ "tooltip-content",
190
+ className
191
+ ),
192
+ style: {
193
+ position: "fixed",
194
+ top: coords?.top ?? -9999,
195
+ left: coords?.left ?? -9999,
196
+ transform: coords?.transform ?? TRANSFORM_BY_SIDE[side],
197
+ opacity: coords ? void 0 : 0,
198
+ zIndex: 9999,
199
+ ...style
200
+ },
201
+ ...props
202
+ }
203
+ ),
204
+ document.body
205
+ );
206
+ }
207
+ );
208
+ TooltipContent.displayName = "TooltipContent";
209
+ export {
210
+ Tooltip,
211
+ TooltipContent,
212
+ TooltipProvider,
213
+ TooltipTrigger
214
+ };
215
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ui/tooltip.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Minimal, dependency-free tooltip \u2014 a drop-in API replacement for a Radix\n * wrapper (same exports/props: Tooltip, TooltipTrigger, TooltipContent,\n * TooltipProvider). Promoted verbatim from the ARBI app.\n *\n * It attaches the trigger via a STABLE `useCallback` ref (never setStates,\n * identity never changes), so React 19 never detach/attach-thrashes.\n */\n\ntype Side = 'top' | 'bottom' | 'left' | 'right'\n\ninterface TooltipContextValue {\n open: boolean\n show: () => void\n hide: () => void\n setTrigger: (el: HTMLElement | null) => void\n /** A pointer click dismisses the tip and keeps it away until the pointer leaves. */\n suppress: () => void\n release: () => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\n/** App-wide tooltip defaults, set once by `TooltipProvider`. */\nconst DEFAULT_DELAY = 300\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: DEFAULT_DELAY,\n})\n\ninterface TooltipProviderProps {\n children?: React.ReactNode\n /** Hover delay, in ms, inherited by every Tooltip below. Default 300. */\n delayDuration?: number\n skipDelayDuration?: number\n disableHoverableContent?: boolean\n}\n\n/**\n * Sets tooltip defaults for the whole tree. Mount it once, at the app root \u2014\n * `AppShell` in @arbidocs/blocks does this so every app gets it for free.\n * Tooltips still render without it, at the default delay.\n */\nconst TooltipProvider = ({ children, delayDuration = DEFAULT_DELAY }: TooltipProviderProps) => {\n const value = React.useMemo(() => ({ delayDuration }), [delayDuration])\n return <TooltipConfigContext.Provider value={value}>{children}</TooltipConfigContext.Provider>\n}\n\ninterface TooltipProps {\n children: React.ReactNode\n /** Overrides the provider's delay for this one tooltip. */\n delayDuration?: number\n}\n\nfunction Tooltip({ children, delayDuration }: TooltipProps) {\n const config = React.useContext(TooltipConfigContext)\n const delay = delayDuration ?? config.delayDuration\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const contentId = React.useId()\n\n const clearTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current)\n timer.current = null\n }\n }\n\n const suppressed = React.useRef(false)\n\n const show = React.useCallback(() => {\n clearTimer()\n if (suppressed.current) return\n timer.current = setTimeout(() => setOpen(true), delay)\n }, [delay])\n\n const hide = React.useCallback(() => {\n clearTimer()\n setOpen(false)\n }, [])\n\n const suppress = React.useCallback(() => {\n suppressed.current = true\n clearTimer()\n setOpen(false)\n }, [])\n\n const release = React.useCallback(() => {\n suppressed.current = false\n }, [])\n\n const setTrigger = React.useCallback((el: HTMLElement | null) => {\n triggerRef.current = el\n }, [])\n\n React.useEffect(() => () => clearTimer(), [])\n\n const value = React.useMemo<TooltipContextValue>(\n () => ({ open, show, hide, suppress, release, setTrigger, triggerRef, contentId }),\n [open, show, hide, suppress, release, setTrigger, contentId]\n )\n\n return <TooltipContext.Provider value={value}>{children}</TooltipContext.Provider>\n}\n\n/**\n * Keyboard focus only: a tap focuses the control without `:focus-visible`, and a tooltip opened by\n * that tap would stay stuck on screen (touch has no pointer-leave). Falls back to true where the\n * selector is unsupported.\n */\nfunction isKeyboardFocus(target: EventTarget): boolean {\n try {\n return (target as Element).matches(':focus-visible')\n } catch {\n return true\n }\n}\n\n/**\n * True when the control already shows its own words (a labelled button): repeating them in a\n * tooltip is noise. Text hidden with `sr-only` and bare counts (\"12\", \"999+\") do not count.\n */\nfunction showsOwnText(el: Element | null): boolean {\n if (!el) return false\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\n let visible = ''\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.parentElement?.closest('.sr-only')) continue\n visible += node.textContent ?? ''\n }\n return /\\p{L}{2,}/u.test(visible)\n}\n\ninterface TooltipTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n /** Allow explanatory tooltips on controls that already have a visible label. */\n showWithText?: boolean\n}\n\nfunction TooltipTrigger({\n asChild,\n showWithText = false,\n children,\n ...props\n}: TooltipTriggerProps) {\n const ctx = React.useContext(TooltipContext)\n if (!ctx) return <>{children}</>\n\n const triggerHandlers = {\n onPointerEnter: (e: React.PointerEvent) => {\n ;(props.onPointerEnter as ((e: React.PointerEvent) => void) | undefined)?.(e)\n // Touch has no hover: the tap itself is the action, and nothing would ever close the tip.\n if (e.pointerType === 'touch') return\n if (!showWithText && showsOwnText(e.currentTarget)) return\n ctx.show()\n },\n onPointerLeave: (e: React.PointerEvent) => {\n ;(props.onPointerLeave as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ctx.release()\n ctx.hide()\n },\n onPointerDown: (e: React.PointerEvent) => {\n ;(props.onPointerDown as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ;(asChild && React.isValidElement(children)\n ? ((children.props as Record<string, unknown>).onPointerDown as\n ((e: React.PointerEvent) => void) | undefined)\n : undefined)?.(e)\n ctx.suppress()\n },\n onFocus: (e: React.FocusEvent) => {\n ;(props.onFocus as ((e: React.FocusEvent) => void) | undefined)?.(e)\n if (isKeyboardFocus(e.target) && (showWithText || !showsOwnText(e.currentTarget))) ctx.show()\n },\n onBlur: (e: React.FocusEvent) => {\n ;(props.onBlur as ((e: React.FocusEvent) => void) | undefined)?.(e)\n ctx.hide()\n },\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\n 'data-state': ctx.open ? 'open' : 'closed',\n }\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<Record<string, unknown>>\n return React.cloneElement(child, {\n ...props,\n ...triggerHandlers,\n ref: ctx.setTrigger,\n })\n }\n\n return (\n <button\n type=\"button\"\n {...props}\n {...triggerHandlers}\n ref={ctx.setTrigger as unknown as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n}\n\ninterface TooltipContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side\n sideOffset?: number\n /** Minimum gap, in px, kept between the tip and the viewport edges. Default 8. */\n collisionPadding?: number\n}\n\nconst TRANSFORM_BY_SIDE: Record<Side, string> = {\n top: 'translate(-50%, -100%)',\n bottom: 'translate(-50%, 0)',\n left: 'translate(-100%, -50%)',\n right: 'translate(0, -50%)',\n}\n\nconst TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(\n ({ className, side = 'top', sideOffset = 4, collisionPadding = 8, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const innerRef = React.useRef<HTMLDivElement | null>(null)\n const [coords, setCoords] = React.useState<{\n top: number\n left: number\n transform: string\n } | null>(null)\n\n React.useLayoutEffect(() => {\n if (!ctx?.open || !ctx.triggerRef.current) {\n setCoords(null)\n return\n }\n const r = ctx.triggerRef.current.getBoundingClientRect()\n const c = innerRef.current?.getBoundingClientRect()\n const ch = c?.height ?? 0\n const cw = c?.width ?? 0\n const vh = window.innerHeight\n const vw = window.innerWidth\n\n let s: Side = side\n if (s === 'top' && r.top - sideOffset - ch < 0) s = 'bottom'\n else if (s === 'bottom' && r.bottom + sideOffset + ch > vh) s = 'top'\n else if (s === 'left' && r.left - sideOffset - cw < 0) s = 'right'\n else if (s === 'right' && r.right + sideOffset + cw > vw) s = 'left'\n\n // Keep the whole tip inside the viewport (8px padding): the anchor point is the centre of\n // the cross axis, so clamp it by half the tip's size.\n const PAD = collisionPadding\n const clamp = (value: number, half: number, max: number) =>\n Math.min(Math.max(value, PAD + half), Math.max(PAD + half, max - PAD - half))\n const rawTop =\n s === 'top'\n ? r.top - sideOffset\n : s === 'bottom'\n ? r.bottom + sideOffset\n : r.top + r.height / 2\n const rawLeft =\n s === 'left'\n ? r.left - sideOffset\n : s === 'right'\n ? r.right + sideOffset\n : r.left + r.width / 2\n setCoords({\n top: s === 'left' || s === 'right' ? clamp(rawTop, ch / 2, vh) : rawTop,\n left: s === 'top' || s === 'bottom' ? clamp(rawLeft, cw / 2, vw) : rawLeft,\n transform: TRANSFORM_BY_SIDE[s],\n })\n }, [ctx?.open, side, sideOffset, collisionPadding, ctx?.triggerRef])\n\n if (!ctx?.open) return null\n\n const setRefs = (node: HTMLDivElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }\n\n return createPortal(\n <div\n ref={setRefs}\n id={ctx.contentId}\n role=\"tooltip\"\n className={cn(\n // The kit owns the tooltip's look: semantic tokens only, so it is\n // legible in every app without one of them defining a global class.\n // The `tooltip-content` hook is kept last-but-one so a host stylesheet\n // can still restyle every tooltip in one place (the ARBI app does, with\n // `!important` rules that win over these defaults).\n 'pointer-events-none w-max max-w-[300px] break-words rounded-md border border-border bg-popover px-3 py-2 text-sm font-normal text-popover-foreground shadow-lg',\n 'tooltip-content',\n className\n )}\n style={{\n position: 'fixed',\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n transform: coords?.transform ?? TRANSFORM_BY_SIDE[side],\n opacity: coords ? undefined : 0,\n zIndex: 9999,\n ...style,\n }}\n {...props}\n />,\n document.body\n )\n }\n)\nTooltipContent.displayName = 'TooltipContent'\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ function isUsageMetered(usage, subscription) {
2
+ const empty = usage.total_spend === 0 && usage.total_tokens === 0 && usage.total_requests === 0;
3
+ return !(empty && subscription === "dev");
4
+ }
5
+ export {
6
+ isUsageMetered
7
+ };
8
+ //# sourceMappingURL=usage-metered.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/usage-metered.ts"],
4
+ "sourcesContent": ["/**\n * AI usage is reported in pounds (ex VAT).\n *\n * The usage endpoints (`/v1/user/projects/{id}/usage`, `/me/usage/today`) convert the metered\n * LiteLLM USD spend into \u00A3 at the API boundary (fractional, rounded to 2 decimals). The fields are\n * still named `spend` / `total_spend` in the schema, but they hold \u00A3, never dollars. Format them\n * with `formatGbp` (re-exported from `@arbidocs/sdk`).\n */\n\n/** The slice of a usage response that tells whether anything was recorded. */\nexport interface UsageTotals {\n total_spend: number\n total_tokens: number\n total_requests: number\n}\n\n/**\n * Was this usage actually metered? A `dev`-plan project with an all-zero response (no spend, no\n * tokens, no requests) is treated as \"not metered\", so the UI shows a note instead of silent\n * zeros. Any recorded tokens or requests mean usage was metered, even when the spend rounds to 0\n * (the backend records usage when billing is off, and a tiny spend can be \u00A30.00).\n */\nexport function isUsageMetered(\n usage: UsageTotals,\n subscription: string | null | undefined\n): boolean {\n const empty = usage.total_spend === 0 && usage.total_tokens === 0 && usage.total_requests === 0\n return !(empty && subscription === 'dev')\n}\n"],
5
+ "mappings": "AAsBO,SAAS,eACd,OACA,cACS;AACT,QAAM,QAAQ,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,KAAK,MAAM,mBAAmB;AAC9F,SAAO,EAAE,SAAS,iBAAiB;AACrC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ import { useArbiHost } from "./host/config.js";
2
+ function useArbi() {
3
+ const { arbi } = useArbiHost();
4
+ if (!arbi) {
5
+ throw new Error("useArbi() needs an <ArbiHost> whose config has an `arbi`");
6
+ }
7
+ return arbi;
8
+ }
9
+ function useDeploymentDomain() {
10
+ return useArbiHost().arbi?.getDeploymentDomain();
11
+ }
12
+ export {
13
+ useArbi,
14
+ useDeploymentDomain
15
+ };
16
+ //# sourceMappingURL=useArbi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/useArbi.ts"],
4
+ "sourcesContent": ["/**\n * The `Arbi` of the host configuration (`<ArbiHost config={{ arbi }}>`).\n */\n\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { useArbiHost } from './host/config'\n\nexport function useArbi(): Arbi {\n const { arbi } = useArbiHost()\n if (!arbi) {\n throw new Error('useArbi() needs an <ArbiHost> whose config has an `arbi`')\n }\n return arbi\n}\n\n/**\n * The deployment domain the user's keys are derived for, as the host's `Arbi` computes it\n * (`deploymentDomain`, else the API URL's hostname). `undefined` without one. The document tools\n * default their `deploymentDomain` (needed for e-signing) to it.\n */\nexport function useDeploymentDomain(): string | undefined {\n return useArbiHost().arbi?.getDeploymentDomain()\n}\n"],
5
+ "mappings": "AAKA,SAAS,mBAAmB;AAErB,SAAS,UAAgB;AAC9B,QAAM,EAAE,KAAK,IAAI,YAAY;AAC7B,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAOO,SAAS,sBAA0C;AACxD,SAAO,YAAY,EAAE,MAAM,oBAAoB;AACjD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ import { useMutation } from "@tanstack/react-query";
2
+ import { useArbi } from "./useArbi.js";
3
+ import { useUploadSkillFiles } from "./workforce.js";
4
+ function hashText(text) {
5
+ let h = 5381;
6
+ for (let i = 0; i < text.length; i++) h = h * 33 ^ text.charCodeAt(i);
7
+ return (h >>> 0).toString(36);
8
+ }
9
+ function createSkillPack({ id, skills, marker }) {
10
+ const version = hashText(skills.map((skill) => skill.markdown).join("\n"));
11
+ const slug = marker?.slug ?? `${id}-version`;
12
+ const note = marker?.note ?? "The version of the skills installed here. Not for use.";
13
+ return {
14
+ id,
15
+ version,
16
+ marker: {
17
+ slug,
18
+ markdown: `---
19
+ name: ${slug}
20
+ description: ${version}
21
+ user-invocable: false
22
+ ---
23
+
24
+ ${note}
25
+ `
26
+ },
27
+ skills
28
+ };
29
+ }
30
+ const installs = /* @__PURE__ */ new WeakMap();
31
+ function useInstallSkillPack(pack) {
32
+ const arbi = useArbi();
33
+ const upload = useUploadSkillFiles();
34
+ return useMutation({
35
+ mutationFn: ({ workspaceId }) => {
36
+ const signal = arbi.getConnectionInfo()?.signal;
37
+ if (!signal) return Promise.reject(new Error("Skill installation needs a signed-in session."));
38
+ const checkContext = () => {
39
+ if (signal.aborted || arbi.getConnectionInfo()?.signal !== signal || arbi.getWorkspaceId() !== workspaceId)
40
+ throw new DOMException(
41
+ "The skill installation session or workspace changed.",
42
+ "AbortError"
43
+ );
44
+ };
45
+ checkContext();
46
+ let sessions = installs.get(arbi);
47
+ if (!sessions) installs.set(arbi, sessions = /* @__PURE__ */ new WeakMap());
48
+ let pending = sessions.get(signal);
49
+ if (!pending) sessions.set(signal, pending = /* @__PURE__ */ new Map());
50
+ const key = JSON.stringify([workspaceId, pack.id, pack.version]);
51
+ const running = pending.get(key);
52
+ if (running) return running;
53
+ const install = (async () => {
54
+ const listed = await arbi.assistant.listSkills({ includeHidden: true });
55
+ checkContext();
56
+ const present = new Set(listed.map((skill) => skill.slug));
57
+ const current = listed.find((skill) => skill.slug === pack.marker.slug)?.description === pack.version;
58
+ const due = pack.skills.filter((skill) => !current || !present.has(skill.slug));
59
+ for (const skill of [...due, ...!current ? [pack.marker] : []]) {
60
+ checkContext();
61
+ await upload.mutateAsync([
62
+ {
63
+ folder: `skills/${skill.slug}`,
64
+ workspaceId,
65
+ fileName: "SKILL.md",
66
+ content: new Blob([skill.markdown], { type: "text/markdown" }),
67
+ shared: skill.shared ?? true
68
+ }
69
+ ]);
70
+ }
71
+ })().finally(() => pending.delete(key));
72
+ pending.set(key, install);
73
+ return install;
74
+ }
75
+ });
76
+ }
77
+ export {
78
+ createSkillPack,
79
+ useInstallSkillPack
80
+ };
81
+ //# sourceMappingURL=useInstallSkillPack.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/useInstallSkillPack.ts"],
4
+ "sourcesContent": ["import { useMutation } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { useArbi } from './useArbi'\nimport { useUploadSkillFiles } from './workforce'\n\nexport interface SkillPackEntry {\n slug: string\n markdown: string\n /** Shared with the workspace by default, matching document-upload installation. */\n shared?: boolean\n}\n\nexport interface SkillPack {\n /** Stable host-owned pack identity; content and its version remain host data. */\n id: string\n version: string\n /** A hidden marker skill whose description is the pack version. Uploaded last. */\n marker: SkillPackEntry\n skills: readonly SkillPackEntry[]\n}\n\nexport interface InstallSkillPackVariables {\n /** Must already be open on this client; the hook never switches workspaces. */\n workspaceId: string\n}\n\nexport interface CreateSkillPackOptions {\n id: string\n skills: readonly SkillPackEntry[]\n /** The hidden marker skill's slug (default `<id>-version`) and its one-line body. */\n marker?: { slug?: string; note?: string }\n}\n\n/** A stable short hash of text (djb2, xor variant), base 36. */\nfunction hashText(text: string): string {\n let h = 5381\n for (let i = 0; i < text.length; i++) h = (h * 33) ^ text.charCodeAt(i)\n return (h >>> 0).toString(36)\n}\n\n/**\n * A skill pack from the host's skills: its version is a hash of all their SKILL.md texts (so any\n * change reinstalls the set), carried by a hidden marker skill that no one can invoke.\n */\nexport function createSkillPack({ id, skills, marker }: CreateSkillPackOptions): SkillPack {\n const version = hashText(skills.map((skill) => skill.markdown).join('\\n'))\n const slug = marker?.slug ?? `${id}-version`\n const note = marker?.note ?? 'The version of the skills installed here. Not for use.'\n return {\n id,\n version,\n marker: {\n slug,\n markdown: `---\\nname: ${slug}\\ndescription: ${version}\\nuser-invocable: false\\n---\\n\\n${note}\\n`,\n },\n skills,\n }\n}\n\n// A signed-out/replaced session and a different client never join another install.\nconst installs = new WeakMap<Arbi, WeakMap<AbortSignal, Map<string, Promise<void>>>>()\n\n/**\n * Install missing skills, or the complete pack when its version marker is stale. The marker is\n * written only after every skill succeeds, so a partial failure can be retried by relisting.\n * Hosts own the content, workspace-opening policy, when to install and error presentation.\n */\nexport function useInstallSkillPack(pack: SkillPack) {\n const arbi = useArbi()\n const upload = useUploadSkillFiles()\n return useMutation({\n mutationFn: ({ workspaceId }: InstallSkillPackVariables): Promise<void> => {\n const signal = arbi.getConnectionInfo()?.signal\n if (!signal) return Promise.reject(new Error('Skill installation needs a signed-in session.'))\n const checkContext = () => {\n if (\n signal.aborted ||\n arbi.getConnectionInfo()?.signal !== signal ||\n arbi.getWorkspaceId() !== workspaceId\n )\n throw new DOMException(\n 'The skill installation session or workspace changed.',\n 'AbortError'\n )\n }\n checkContext()\n let sessions = installs.get(arbi)\n if (!sessions) installs.set(arbi, (sessions = new WeakMap()))\n let pending = sessions.get(signal)\n if (!pending) sessions.set(signal, (pending = new Map()))\n const key = JSON.stringify([workspaceId, pack.id, pack.version])\n const running = pending.get(key)\n if (running) return running\n const install = (async () => {\n const listed = await arbi.assistant.listSkills({ includeHidden: true })\n checkContext()\n const present = new Set(listed.map((skill) => skill.slug))\n const current =\n listed.find((skill) => skill.slug === pack.marker.slug)?.description === pack.version\n const due = pack.skills.filter((skill) => !current || !present.has(skill.slug))\n for (const skill of [...due, ...(!current ? [pack.marker] : [])]) {\n checkContext()\n await upload.mutateAsync([\n {\n folder: `skills/${skill.slug}`,\n workspaceId,\n fileName: 'SKILL.md',\n content: new Blob([skill.markdown], { type: 'text/markdown' }),\n shared: skill.shared ?? true,\n },\n ])\n }\n })().finally(() => pending.delete(key))\n pending.set(key, install)\n return install\n },\n })\n}\n"],
5
+ "mappings": "AAAA,SAAS,mBAAmB;AAE5B,SAAS,eAAe;AACxB,SAAS,2BAA2B;AA+BpC,SAAS,SAAS,MAAsB;AACtC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAM,KAAK,WAAW,CAAC;AACtE,UAAQ,MAAM,GAAG,SAAS,EAAE;AAC9B;AAMO,SAAS,gBAAgB,EAAE,IAAI,QAAQ,OAAO,GAAsC;AACzF,QAAM,UAAU,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,QAAQ,EAAE,KAAK,IAAI,CAAC;AACzE,QAAM,OAAO,QAAQ,QAAQ,GAAG,EAAE;AAClC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA,UAAU;AAAA,QAAc,IAAI;AAAA,eAAkB,OAAO;AAAA;AAAA;AAAA;AAAA,EAAmC,IAAI;AAAA;AAAA,IAC9F;AAAA,IACA;AAAA,EACF;AACF;AAGA,MAAM,WAAW,oBAAI,QAAgE;AAO9E,SAAS,oBAAoB,MAAiB;AACnD,QAAM,OAAO,QAAQ;AACrB,QAAM,SAAS,oBAAoB;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,EAAE,YAAY,MAAgD;AACzE,YAAM,SAAS,KAAK,kBAAkB,GAAG;AACzC,UAAI,CAAC,OAAQ,QAAO,QAAQ,OAAO,IAAI,MAAM,+CAA+C,CAAC;AAC7F,YAAM,eAAe,MAAM;AACzB,YACE,OAAO,WACP,KAAK,kBAAkB,GAAG,WAAW,UACrC,KAAK,eAAe,MAAM;AAE1B,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,MACJ;AACA,mBAAa;AACb,UAAI,WAAW,SAAS,IAAI,IAAI;AAChC,UAAI,CAAC,SAAU,UAAS,IAAI,MAAO,WAAW,oBAAI,QAAQ,CAAE;AAC5D,UAAI,UAAU,SAAS,IAAI,MAAM;AACjC,UAAI,CAAC,QAAS,UAAS,IAAI,QAAS,UAAU,oBAAI,IAAI,CAAE;AACxD,YAAM,MAAM,KAAK,UAAU,CAAC,aAAa,KAAK,IAAI,KAAK,OAAO,CAAC;AAC/D,YAAM,UAAU,QAAQ,IAAI,GAAG;AAC/B,UAAI,QAAS,QAAO;AACpB,YAAM,WAAW,YAAY;AAC3B,cAAM,SAAS,MAAM,KAAK,UAAU,WAAW,EAAE,eAAe,KAAK,CAAC;AACtE,qBAAa;AACb,cAAM,UAAU,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACzD,cAAM,UACJ,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,KAAK,OAAO,IAAI,GAAG,gBAAgB,KAAK;AAChF,cAAM,MAAM,KAAK,OAAO,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,IAAI,MAAM,IAAI,CAAC;AAC9E,mBAAW,SAAS,CAAC,GAAG,KAAK,GAAI,CAAC,UAAU,CAAC,KAAK,MAAM,IAAI,CAAC,CAAE,GAAG;AAChE,uBAAa;AACb,gBAAM,OAAO,YAAY;AAAA,YACvB;AAAA,cACE,QAAQ,UAAU,MAAM,IAAI;AAAA,cAC5B;AAAA,cACA,UAAU;AAAA,cACV,SAAS,IAAI,KAAK,CAAC,MAAM,QAAQ,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAAA,cAC7D,QAAQ,MAAM,UAAU;AAAA,YAC1B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,GAAG,EAAE,QAAQ,MAAM,QAAQ,OAAO,GAAG,CAAC;AACtC,cAAQ,IAAI,KAAK,OAAO;AACxB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,188 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment as Fragment2 } from "react";
3
+ import { ChevronDown, ChevronsUpDown, LogOut, X } from "lucide-react";
4
+ import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar.js";
5
+ import {
6
+ DropdownMenu,
7
+ DropdownMenuTrigger,
8
+ DropdownMenuContent,
9
+ DropdownMenuItem,
10
+ DropdownMenuLabel,
11
+ DropdownMenuSeparator
12
+ } from "../ui/dropdown-menu.js";
13
+ import { cn } from "../lib/utils.js";
14
+ function nameInitials(name) {
15
+ const parts = name.trim().split(/\s+/).filter(Boolean);
16
+ if (!parts.length) return "?";
17
+ return parts.slice(0, 2).map((p) => p[0]?.toUpperCase() ?? "").join("");
18
+ }
19
+ const STATUS_DOT = {
20
+ online: "bg-emerald-500",
21
+ busy: "bg-amber-500",
22
+ offline: "bg-destructive"
23
+ };
24
+ function UserMenu({
25
+ user,
26
+ status,
27
+ items = [],
28
+ onLogout,
29
+ logoutLabel = "Sign out",
30
+ align = "end",
31
+ side = "bottom",
32
+ variant = "avatar",
33
+ showChevron = true,
34
+ classNames,
35
+ testId = "user-menu",
36
+ logoutTestId
37
+ }) {
38
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
39
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
40
+ "button",
41
+ {
42
+ type: "button",
43
+ className: cn(
44
+ "flex items-center gap-2 rounded-md transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
45
+ variant === "account" ? "w-full min-w-0 p-1 text-left pointer-coarse:min-h-11" : "px-1.5 py-1 pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center",
46
+ classNames?.trigger
47
+ ),
48
+ "data-testid": testId,
49
+ "data-variant": variant,
50
+ "aria-label": variant === "avatar" ? "Account menu" : void 0,
51
+ title: variant === "avatar" ? user.name : void 0,
52
+ children: [
53
+ /* @__PURE__ */ jsxs("span", { className: "relative", children: [
54
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-8", children: [
55
+ user.picture ? /* @__PURE__ */ jsx(AvatarImage, { src: user.picture, alt: user.name }) : null,
56
+ /* @__PURE__ */ jsx(
57
+ AvatarFallback,
58
+ {
59
+ className: cn("bg-primary text-primary-foreground", classNames?.fallback),
60
+ children: nameInitials(user.name)
61
+ }
62
+ )
63
+ ] }),
64
+ status && /* @__PURE__ */ jsx(
65
+ "span",
66
+ {
67
+ className: cn(
68
+ "absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-background",
69
+ STATUS_DOT[status.tone]
70
+ ),
71
+ title: status.detail ? `${status.label} \xB7 ${status.detail}` : status.label,
72
+ "data-testid": status.testId ? `${status.testId}-dot` : void 0
73
+ }
74
+ )
75
+ ] }),
76
+ variant === "account" ? /* @__PURE__ */ jsxs(Fragment, { children: [
77
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium text-foreground", children: user.name }),
78
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "mr-1 size-4 shrink-0 text-muted-foreground" })
79
+ ] }) : showChevron && /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 text-muted-foreground" })
80
+ ]
81
+ }
82
+ ) }),
83
+ /* @__PURE__ */ jsxs(
84
+ DropdownMenuContent,
85
+ {
86
+ align,
87
+ side,
88
+ sideOffset: 8,
89
+ collisionPadding: 12,
90
+ className: "w-60 rounded-lg border-border/60 shadow-lg",
91
+ "data-testid": "user-menu-panel",
92
+ "data-topbar-popover": "",
93
+ children: [
94
+ /* @__PURE__ */ jsxs(DropdownMenuLabel, { className: "relative pr-8 pointer-coarse:pr-12", children: [
95
+ /* @__PURE__ */ jsx(
96
+ DropdownMenuItem,
97
+ {
98
+ className: "absolute right-1 top-1 flex size-6 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:right-0 pointer-coarse:top-0 pointer-coarse:size-11",
99
+ "aria-label": "Close account menu",
100
+ "data-testid": "user-menu-close",
101
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx("div", { className: "truncate font-medium text-foreground", title: user.name, children: user.name }),
105
+ user.email && /* @__PURE__ */ jsx("div", { className: "truncate text-xs font-normal text-muted-foreground", title: user.email, children: user.email }),
106
+ status && /* @__PURE__ */ jsxs(
107
+ "div",
108
+ {
109
+ className: "mt-1 text-xs font-normal text-muted-foreground",
110
+ "data-testid": status.testId,
111
+ children: [
112
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
113
+ /* @__PURE__ */ jsx("span", { className: cn("size-2 shrink-0 rounded-full", STATUS_DOT[status.tone]) }),
114
+ status.label
115
+ ] }),
116
+ status.detail && /* @__PURE__ */ jsx("div", { className: "mt-0.5 truncate pl-3.5 text-xs leading-tight text-muted-foreground/70", children: status.detail })
117
+ ]
118
+ }
119
+ )
120
+ ] }),
121
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
122
+ items.map((item) => /* @__PURE__ */ jsxs(Fragment2, { children: [
123
+ item.separatorBefore && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
124
+ /* @__PURE__ */ jsxs(
125
+ DropdownMenuItem,
126
+ {
127
+ onClick: item.onSelect,
128
+ "data-testid": item.testId,
129
+ className: "pointer-coarse:min-h-11",
130
+ ...item.checked !== void 0 ? { role: "menuitemcheckbox", "aria-checked": item.checked } : {},
131
+ children: [
132
+ item.icon && /* @__PURE__ */ jsxs("span", { className: "relative flex shrink-0", children: [
133
+ /* @__PURE__ */ jsx(item.icon, { className: "size-4" }),
134
+ item.dot && /* @__PURE__ */ jsx(
135
+ "span",
136
+ {
137
+ className: "absolute -right-0.5 -top-0.5 size-2 rounded-full bg-primary ring-2 ring-popover",
138
+ "aria-hidden": true
139
+ }
140
+ )
141
+ ] }),
142
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
143
+ item.badge !== void 0 && /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5 text-xs font-medium tabular-nums text-muted-foreground", children: item.badge }),
144
+ item.checked !== void 0 && /* @__PURE__ */ jsx(
145
+ "span",
146
+ {
147
+ "aria-hidden": true,
148
+ className: cn(
149
+ "flex h-4 w-7 shrink-0 items-center rounded-full p-0.5 transition-colors",
150
+ item.checked ? "bg-primary" : "bg-border"
151
+ ),
152
+ children: /* @__PURE__ */ jsx(
153
+ "span",
154
+ {
155
+ className: cn(
156
+ "size-3 rounded-full bg-background transition-transform",
157
+ item.checked && "translate-x-3"
158
+ )
159
+ }
160
+ )
161
+ }
162
+ )
163
+ ]
164
+ }
165
+ )
166
+ ] }, item.label)),
167
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
168
+ /* @__PURE__ */ jsxs(
169
+ DropdownMenuItem,
170
+ {
171
+ onClick: onLogout,
172
+ "data-testid": logoutTestId ?? `${testId}-logout`,
173
+ className: "pointer-coarse:min-h-11",
174
+ children: [
175
+ /* @__PURE__ */ jsx(LogOut, { className: "size-4" }),
176
+ logoutLabel
177
+ ]
178
+ }
179
+ )
180
+ ]
181
+ }
182
+ )
183
+ ] });
184
+ }
185
+ export {
186
+ UserMenu
187
+ };
188
+ //# sourceMappingURL=UserMenu.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/usermenu/UserMenu.tsx"],
4
+ "sourcesContent": ["/**\n * UserMenu \u2014 the topbar account dropdown: an avatar (picture or initials) with a\n * chevron that opens a menu of account actions and a sign-out. Firm-agnostic \u2014\n * the user, the menu items and logout are all supplied by the host; styling\n * tracks semantic tokens.\n */\nimport { Fragment, type ComponentType } from 'react'\nimport { ChevronDown, ChevronsUpDown, LogOut, X } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '../ui/dropdown-menu'\nimport { cn } from '../lib/utils'\n\n/** Initials from a display name (falls back to \"?\"). */\nfunction nameInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (!parts.length) return '?'\n return parts\n .slice(0, 2)\n .map((p) => p[0]?.toUpperCase() ?? '')\n .join('')\n}\n\nexport interface UserMenuItem {\n label: string\n icon?: ComponentType<{ className?: string }>\n onSelect: () => void\n testId?: string\n /** A count or short state on the right (e.g. the number of files processing). */\n badge?: string | number\n /** A small unread dot on the icon (e.g. new messages). */\n dot?: boolean\n /** Makes the row a labelled on/off switch (role menuitemcheckbox); selecting it flips the state. */\n checked?: boolean\n /** Draw a divider above this row to start a new group. */\n separatorBefore?: boolean\n}\n\n/** Connection/presence state shown as a dot on the avatar and a line under the\n * email \u2014 the account menu is where \"am I connected\" belongs. */\nexport interface UserMenuStatus {\n /** Short state word \u2014 \"Connected\", \"Working offline\". */\n label: string\n tone: 'online' | 'busy' | 'offline'\n /** Fine print under the label (e.g. the server domain). */\n detail?: string\n testId?: string\n}\n\nconst STATUS_DOT: Record<UserMenuStatus['tone'], string> = {\n online: 'bg-emerald-500',\n busy: 'bg-amber-500',\n offline: 'bg-destructive',\n}\n\nexport interface UserMenuProps {\n user: { name: string; email?: string | null; picture?: string | null }\n /** Optional connection status: avatar dot + a line in the dropdown header. */\n status?: UserMenuStatus\n /** Account actions above the sign-out divider (e.g. Settings). */\n items?: UserMenuItem[]\n onLogout: () => void\n logoutLabel?: string\n align?: 'start' | 'center' | 'end'\n /** Which side of the trigger the menu opens on (a footer trigger opens upward or sideways). */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /**\n * `avatar` (default): avatar + chevron. `account`: a full-width account bar, avatar + display\n * name + chevron, for a sidebar footer.\n */\n variant?: 'avatar' | 'account'\n /** `avatar` only: draw the chevron (the icon-only rail hides it). */\n showChevron?: boolean\n classNames?: { trigger?: string; fallback?: string }\n testId?: string\n logoutTestId?: string\n}\n\nexport function UserMenu({\n user,\n status,\n items = [],\n onLogout,\n logoutLabel = 'Sign out',\n align = 'end',\n side = 'bottom',\n variant = 'avatar',\n showChevron = true,\n classNames,\n testId = 'user-menu',\n logoutTestId,\n}: UserMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 rounded-md transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n variant === 'account'\n ? 'w-full min-w-0 p-1 text-left pointer-coarse:min-h-11'\n : 'px-1.5 py-1 pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center',\n classNames?.trigger\n )}\n data-testid={testId}\n data-variant={variant}\n aria-label={variant === 'avatar' ? 'Account menu' : undefined}\n title={variant === 'avatar' ? user.name : undefined}\n >\n <span className=\"relative\">\n <Avatar className=\"size-8\">\n {user.picture ? <AvatarImage src={user.picture} alt={user.name} /> : null}\n <AvatarFallback\n className={cn('bg-primary text-primary-foreground', classNames?.fallback)}\n >\n {nameInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n {status && (\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-background',\n STATUS_DOT[status.tone]\n )}\n title={status.detail ? `${status.label} \u00B7 ${status.detail}` : status.label}\n data-testid={status.testId ? `${status.testId}-dot` : undefined}\n />\n )}\n </span>\n {variant === 'account' ? (\n <>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {user.name}\n </span>\n <ChevronsUpDown className=\"mr-1 size-4 shrink-0 text-muted-foreground\" />\n </>\n ) : (\n showChevron && <ChevronDown className=\"size-4 text-muted-foreground\" />\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className=\"w-60 rounded-lg border-border/60 shadow-lg\"\n data-testid=\"user-menu-panel\"\n data-topbar-popover=\"\"\n >\n <DropdownMenuLabel className=\"relative pr-8 pointer-coarse:pr-12\">\n {/* Explicit close \u2014 on a phone (see blocks.css, which pins\n this panel full-width under the topbar) tap-outside is easy to\n miss since the panel covers most of the screen. Radix closes a\n DropdownMenu on any item select by default, so a plain item\n with no other effect doubles as a close button. */}\n <DropdownMenuItem\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:right-0 pointer-coarse:top-0 pointer-coarse:size-11\"\n aria-label=\"Close account menu\"\n data-testid=\"user-menu-close\"\n >\n <X className=\"size-3.5\" />\n </DropdownMenuItem>\n <div className=\"truncate font-medium text-foreground\" title={user.name}>\n {user.name}\n </div>\n {user.email && (\n <div className=\"truncate text-xs font-normal text-muted-foreground\" title={user.email}>\n {user.email}\n </div>\n )}\n {status && (\n <div\n className=\"mt-1 text-xs font-normal text-muted-foreground\"\n data-testid={status.testId}\n >\n <span className=\"flex items-center gap-1.5\">\n <span className={cn('size-2 shrink-0 rounded-full', STATUS_DOT[status.tone])} />\n {status.label}\n </span>\n {status.detail && (\n <div className=\"mt-0.5 truncate pl-3.5 text-xs leading-tight text-muted-foreground/70\">\n {status.detail}\n </div>\n )}\n </div>\n )}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items.map((item) => (\n <Fragment key={item.label}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem\n onClick={item.onSelect}\n data-testid={item.testId}\n className=\"pointer-coarse:min-h-11\"\n {...(item.checked !== undefined\n ? { role: 'menuitemcheckbox', 'aria-checked': item.checked }\n : {})}\n >\n {item.icon && (\n <span className=\"relative flex shrink-0\">\n <item.icon className=\"size-4\" />\n {item.dot && (\n <span\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full bg-primary ring-2 ring-popover\"\n aria-hidden\n />\n )}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"rounded-full bg-muted px-1.5 text-xs font-medium tabular-nums text-muted-foreground\">\n {item.badge}\n </span>\n )}\n {item.checked !== undefined && (\n <span\n aria-hidden\n className={cn(\n 'flex h-4 w-7 shrink-0 items-center rounded-full p-0.5 transition-colors',\n item.checked ? 'bg-primary' : 'bg-border'\n )}\n >\n <span\n className={cn(\n 'size-3 rounded-full bg-background transition-transform',\n item.checked && 'translate-x-3'\n )}\n />\n </span>\n )}\n </DropdownMenuItem>\n </Fragment>\n ))}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onLogout}\n data-testid={logoutTestId ?? `${testId}-logout`}\n className=\"pointer-coarse:min-h-11\"\n >\n <LogOut className=\"size-4\" />\n {logoutLabel}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Fragment"]
7
+ }
@@ -0,0 +1,5 @@
1
+ import { UserMenu } from "./UserMenu.js";
2
+ export {
3
+ UserMenu
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/usermenu/index.ts"],
4
+ "sourcesContent": ["/** User menu kit \u2014 the topbar account avatar dropdown (sign-out + actions). */\nexport { UserMenu, type UserMenuProps, type UserMenuItem, type UserMenuStatus } from './UserMenu'\n"],
5
+ "mappings": "AACA,SAAS,gBAA4E;",
6
+ "names": []
7
+ }