@arbidocs/react 0.5.110 → 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 (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. package/dist/viewers/index.d.cts +0 -260
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/annotations/state.ts","../src/annotations/store.ts","../src/annotations/merge.ts","../src/annotations/redaction-log.ts","../src/annotations/geometry.ts","../src/annotations/controller.ts","../src/annotations/useAnnotationLayer.ts","../src/annotations/selection-marks.ts","../src/annotations/useTextSelectionMarks.ts","../src/annotations/overlay-geometry.ts","../src/annotations/AnnotationPageOverlay.tsx","../src/annotations/useAnnotationShortcuts.ts","../src/annotations/AnnotationToolbar.tsx","../src/annotations/FreezeDialog.tsx","../src/annotations/ProductionDialog.tsx"],"names":["top","useRef","useEffect","left","useState","useCallback","size","jsx","MessageSquare","jsxs","Fragment","ChevronDown"],"mappings":"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","file":"chunk-T4CLW3DN.js","sourcesContent":["/**\n * Pure state for an annotation layer: actions, a reducer and undo/redo history.\n *\n * No clock and no randomness in here. Callers pass ids and timestamps in, so the reducer is\n * deterministic, trivially testable, and an agent can replay the same actions a person makes.\n */\n\nimport {\n parseAnnotation,\n type Annotation,\n type AnnotationLayer,\n type CommentReply,\n type RedactionAnnotation,\n type RedactionStatus,\n} from './model'\n\n/** Fields a caller may change on any mark. Identity (`id`, `kind`, `page`) is fixed. */\ntype PatchOf<A> = A extends Annotation\n ? Partial<Omit<A, 'id' | 'kind' | 'page' | 'createdAt'>>\n : never\nexport type AnnotationPatch = PatchOf<Annotation>\n\nexport type AnnotationAction =\n | { type: 'add'; annotation: Annotation }\n | { type: 'addMany'; annotations: Annotation[] }\n | { type: 'update'; id: string; patch: AnnotationPatch; now: string }\n | { type: 'remove'; id: string; now: string }\n | {\n type: 'setRedactionStatus'\n ids: string[]\n status: RedactionStatus\n now: string\n /** Who reviewed it; recorded with the time for approve/reject, cleared for pending. */\n by?: string\n }\n | { type: 'reply'; id: string; reply: CommentReply; now: string }\n | { type: 'resolve'; id: string; resolved: boolean; now: string }\n | { type: 'replaceAll'; layer: AnnotationLayer }\n\nexport interface LayerHistory {\n present: AnnotationLayer\n past: AnnotationLayer[]\n future: AnnotationLayer[]\n}\n\nexport const HISTORY_LIMIT = 200\n\nexport function createHistory(layer: AnnotationLayer): LayerHistory {\n return { present: layer, past: [], future: [] }\n}\n\n/** Apply one action to a layer. Returns the same object when nothing changed. */\nexport function reduceLayer(layer: AnnotationLayer, action: AnnotationAction): AnnotationLayer {\n switch (action.type) {\n case 'replaceAll':\n return action.layer\n case 'add': {\n // Validate on the way in: a bad mark must never reach storage or a frozen document.\n const annotation = parseAnnotation(action.annotation)\n if (layer.annotations.some((a) => a.id === annotation.id)) {\n throw new Error(`annotation ${annotation.id} already exists`)\n }\n return {\n ...layer,\n annotations: [...layer.annotations, annotation],\n updatedAt: annotation.updatedAt,\n }\n }\n case 'addMany': {\n // All or nothing: one bad mark rejects the batch, so history never holds half of it.\n let next = layer\n for (const annotation of action.annotations)\n next = reduceLayer(next, { type: 'add', annotation })\n return next\n }\n case 'update': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found) return layer\n // The patch type forbids identity fields, but patches also arrive from JSON (an agent, a\n // network message), so enforce it here rather than trusting the type.\n const next = parseAnnotation({\n ...found,\n ...action.patch,\n id: found.id,\n kind: found.kind,\n page: found.page,\n createdAt: found.createdAt,\n updatedAt: action.now,\n })\n return replace(layer, next, action.now)\n }\n case 'remove': {\n if (!layer.annotations.some((a) => a.id === action.id)) return layer\n return {\n ...layer,\n annotations: layer.annotations.filter((a) => a.id !== action.id),\n updatedAt: action.now,\n }\n }\n case 'setRedactionStatus': {\n const ids = new Set(action.ids)\n let changed = false\n const annotations = layer.annotations.map((a) => {\n if (a.kind !== 'redaction' || !ids.has(a.id) || a.status === action.status) return a\n changed = true\n const next: RedactionAnnotation = { ...a, status: action.status, updatedAt: action.now }\n delete next.reviewedBy\n delete next.reviewedAt\n if (action.status !== 'pending' && action.by) {\n next.reviewedBy = action.by\n next.reviewedAt = action.now\n }\n return next\n })\n return changed ? { ...layer, annotations, updatedAt: action.now } : layer\n }\n case 'reply': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found || found.kind !== 'comment') return layer\n const next = parseAnnotation({\n ...found,\n replies: [...found.replies, action.reply],\n updatedAt: action.now,\n })\n return replace(layer, next, action.now)\n }\n case 'resolve': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found || found.kind !== 'comment' || found.resolved === action.resolved) return layer\n return replace(\n layer,\n { ...found, resolved: action.resolved, updatedAt: action.now },\n action.now\n )\n }\n }\n}\n\nfunction replace(layer: AnnotationLayer, next: Annotation, now: string): AnnotationLayer {\n return {\n ...layer,\n annotations: layer.annotations.map((a) => (a.id === next.id ? next : a)),\n updatedAt: now,\n }\n}\n\n/** Apply an action and record it for undo. A no-op action leaves history untouched. */\nexport function applyAction(history: LayerHistory, action: AnnotationAction): LayerHistory {\n const present = reduceLayer(history.present, action)\n if (present === history.present) return history\n const past = [...history.past, history.present]\n return {\n present,\n past: past.length > HISTORY_LIMIT ? past.slice(past.length - HISTORY_LIMIT) : past,\n future: [],\n }\n}\n\nexport function undo(history: LayerHistory): LayerHistory {\n const previous = history.past[history.past.length - 1]\n if (!previous) return history\n return {\n present: previous,\n past: history.past.slice(0, -1),\n future: [history.present, ...history.future],\n }\n}\n\nexport function redo(history: LayerHistory): LayerHistory {\n const [next, ...rest] = history.future\n if (!next) return history\n return { present: next, past: [...history.past, history.present], future: rest }\n}\n\nexport const canUndo = (h: LayerHistory) => h.past.length > 0\nexport const canRedo = (h: LayerHistory) => h.future.length > 0\n\nexport function annotationsOnPage(layer: AnnotationLayer, page: number): Annotation[] {\n return layer.annotations.filter((a) => a.page === page)\n}\n\nexport function pendingRedactions(layer: AnnotationLayer) {\n return layer.annotations.filter((a) => a.kind === 'redaction' && a.status === 'pending')\n}\n","/**\n * Where a layer is kept. The layer is data about a document, not part of it, so the host decides\n * (backend API, IndexedDB, a file). This package ships an in-memory store and a localStorage\n * store; both validate on load because stored JSON is untrusted. A store shared by several\n * writers (ARBI's server-side markup) also implements the optional members: it may merge on save,\n * pull others' changes, and say whether this user may write at all.\n */\n\nimport { emptyLayer, parseLayer, type AnnotationLayer } from './model'\n\nexport interface AnnotationStore {\n /** The saved layer, or an empty one for a document that has none yet. */\n load(documentId: string): Promise<AnnotationLayer>\n /**\n * Write a layer. A store with other writers may resolve to what it actually saved — this layer\n * merged with theirs (see `mergeLayers`); the caller then rebases its newer edits onto it.\n */\n save(layer: AnnotationLayer): Promise<AnnotationLayer | void>\n /** Others' changes since the last load or save, or null when there are none. */\n pull?(documentId: string): Promise<AnnotationLayer | null>\n /** Whether this user may change the layer; false makes it view-only. Known after `load`. */\n canEdit?(documentId: string): boolean\n}\n\n/** Thrown by a store whose backend cannot be reached: the layer is kept and saved when back. */\nexport class AnnotationStoreOfflineError extends Error {\n constructor(message = 'You are offline') {\n super(message)\n this.name = 'AnnotationStoreOfflineError'\n }\n}\n\nexport function createMemoryStore(\n now: () => string = () => new Date().toISOString()\n): AnnotationStore {\n const layers = new Map<string, string>()\n return {\n async load(documentId) {\n const raw = layers.get(documentId)\n return raw ? parseLayer(JSON.parse(raw)) : emptyLayer(documentId, now())\n },\n async save(layer) {\n layers.set(layer.documentId, JSON.stringify(parseLayer(layer)))\n },\n }\n}\n\nconst STORAGE_PREFIX = 'arbi:annotations:'\n\n/**\n * Per-browser store. Storage can be absent, full or blocked (private windows), so every access is\n * guarded. A saved layer that no longer validates is ignored rather than crashing the viewer.\n */\nexport function createLocalStorageStore(\n storage: Pick<Storage, 'getItem' | 'setItem'> | undefined = safeLocalStorage(),\n now: () => string = () => new Date().toISOString()\n): AnnotationStore {\n return {\n async load(documentId) {\n try {\n const raw = storage?.getItem(STORAGE_PREFIX + documentId)\n if (raw) return parseLayer(JSON.parse(raw))\n } catch {\n // unreadable or invalid: start from an empty layer\n }\n return emptyLayer(documentId, now())\n },\n async save(layer) {\n if (!storage) throw new Error('storage is not available')\n storage.setItem(STORAGE_PREFIX + layer.documentId, JSON.stringify(parseLayer(layer)))\n },\n }\n}\n\nfunction safeLocalStorage(): Storage | undefined {\n try {\n return typeof localStorage === 'undefined' ? undefined : localStorage\n } catch {\n return undefined\n }\n}\n","/**\n * Merging two writers' versions of one layer, by annotation id (a PDF annotation's `/NM`).\n *\n * Used when a save is refused because someone saved first (HTTP 409): the client re-reads the\n * latest layer (\"theirs\") and merges it with its own (\"mine\"), relative to the layer both started\n * from (\"base\"). Nobody's marks are lost:\n *\n * - a mark only one side has is kept, unless that side never had it and the other deleted it:\n * a mark in `base` that `mine` no longer has was deleted here and stays deleted, and one that\n * `theirs` no longer has was deleted there and stays deleted unless it was edited here since;\n * - a mark both sides have: the later edit (`updatedAt`) wins as a whole; a comment additionally\n * keeps every reply either side added;\n * - `deleted` (the ids this session removed, its tombstones) always wins: a concurrent edit\n * elsewhere does not resurrect a mark deleted here, even one `base` never saw.\n */\n\nimport type { Annotation, AnnotationLayer, CommentAnnotation, CommentReply } from './model'\n\nexport interface MergeInput {\n /** The layer both sides started from (the last one this client saved or loaded). */\n base: AnnotationLayer | null\n mine: AnnotationLayer\n theirs: AnnotationLayer\n /** Ids this session deleted. */\n deleted?: ReadonlySet<string>\n}\n\nconst time = (iso: string) => {\n const t = Date.parse(iso)\n return Number.isNaN(t) ? 0 : t\n}\n\nfunction mergeReplies(a: CommentReply[], b: CommentReply[]): CommentReply[] {\n const byId = new Map<string, CommentReply>()\n for (const r of [...a, ...b]) if (!byId.has(r.id)) byId.set(r.id, r)\n return [...byId.values()].sort((x, y) => time(x.createdAt) - time(y.createdAt))\n}\n\n/** The newer of two versions of one mark (ties go to `mine`); comments keep both sides' replies. */\nfunction newer(mine: Annotation, theirs: Annotation): Annotation {\n const winner = time(theirs.updatedAt) > time(mine.updatedAt) ? theirs : mine\n if (mine.kind === 'comment' && theirs.kind === 'comment' && winner.kind === 'comment') {\n const replies = mergeReplies(mine.replies, theirs.replies)\n if (replies.length !== winner.replies.length) return { ...winner, replies } as CommentAnnotation\n }\n return winner\n}\n\n/** Merge two versions of a layer; the result keeps `mine`'s order, then marks only `theirs` has. */\nexport function mergeLayers({ base, mine, theirs, deleted }: MergeInput): AnnotationLayer {\n const baseById = new Map((base?.annotations ?? []).map((a) => [a.id, a]))\n const theirsById = new Map(theirs.annotations.map((a) => [a.id, a]))\n const mineIds = new Set(mine.annotations.map((a) => a.id))\n const out: Annotation[] = []\n\n for (const m of mine.annotations) {\n if (deleted?.has(m.id)) continue\n const t = theirsById.get(m.id)\n if (t) {\n out.push(newer(m, t))\n continue\n }\n const b = baseById.get(m.id)\n // They deleted it. Keep it only if it was edited here after the version they deleted.\n if (b && time(m.updatedAt) <= time(b.updatedAt)) continue\n out.push(m)\n }\n for (const t of theirs.annotations) {\n if (mineIds.has(t.id) || deleted?.has(t.id)) continue\n // Deleted here (it was in the base and is gone from mine): stays deleted.\n if (baseById.has(t.id)) continue\n out.push(t)\n }\n\n const updatedAt =\n time(theirs.updatedAt) > time(mine.updatedAt) ? theirs.updatedAt : mine.updatedAt\n return { ...mine, annotations: out, updatedAt }\n}\n\n/** True when two layers hold the same marks (by id and last edit), whatever their order. */\nexport function sameMarks(a: AnnotationLayer, b: AnnotationLayer): boolean {\n if (a.annotations.length !== b.annotations.length) return false\n const byId = new Map(a.annotations.map((m) => [m.id, m.updatedAt]))\n return b.annotations.every(\n (m) =>\n byId.get(m.id) === m.updatedAt &&\n (m.kind !== 'comment' ||\n (a.annotations.find((x) => x.id === m.id) as CommentAnnotation).replies.length ===\n m.replies.length)\n )\n}\n","/**\n * The redaction log of a layer: one CSV row per redaction mark (page, reason, status, who approved\n * it and when), the record a privilege or redaction log is built from.\n *\n * It never carries the redacted text: the log travels with the redacted copy, so it must not undo\n * it. Rows are in reading order (page, then top to bottom, then left to right).\n */\n\nimport type { AnnotationLayer, RedactionAnnotation } from './model'\n\nexport const REDACTION_LOG_COLUMNS = ['page', 'reason', 'status', 'approved_by', 'time'] as const\n\nexport interface RedactionLogRow {\n page: number\n reason: string\n /** What the frozen copy shows for this mark. */\n status: 'redacted (approved)' | 'redacted (not reviewed)' | 'not redacted (rejected)'\n /** Who approved it; empty when it was not approved. */\n approvedBy: string\n /** When it was reviewed, or when it was made if nobody reviewed it (ISO). */\n time: string\n}\n\nconst STATUS: Record<RedactionAnnotation['status'], RedactionLogRow['status']> = {\n approved: 'redacted (approved)',\n pending: 'redacted (not reviewed)',\n rejected: 'not redacted (rejected)',\n}\n\nconst top = (a: RedactionAnnotation) => Math.min(...a.rects.map((r) => r.y))\nconst left = (a: RedactionAnnotation) => Math.min(...a.rects.map((r) => r.x))\n\nexport function redactionLogRows(layer: AnnotationLayer): RedactionLogRow[] {\n return layer.annotations\n .filter((a): a is RedactionAnnotation => a.kind === 'redaction')\n .sort((a, b) => a.page - b.page || top(a) - top(b) || left(a) - left(b))\n .map((a) => ({\n page: a.page,\n reason: a.reason,\n status: STATUS[a.status],\n approvedBy: a.status === 'approved' ? (a.reviewedBy ?? '') : '',\n time: a.reviewedAt ?? a.createdAt,\n }))\n}\n\n// Quote every cell; a leading =, +, - or @ would run as a formula in a spreadsheet.\nconst cell = (value: string | number) => {\n const text = String(value)\n return `\"${(/^[=+\\-@]/.test(text) ? `'${text}` : text).replace(/\"/g, '\"\"')}\"`\n}\n\n/** The log as CSV text (header row first, CRLF line ends as RFC 4180 has them). */\nexport function redactionLogCsv(layer: AnnotationLayer): string {\n const rows = redactionLogRows(layer).map((r) =>\n [r.page, r.reason, r.status, r.approvedBy, r.time].map(cell).join(',')\n )\n return [REDACTION_LOG_COLUMNS.join(','), ...rows].join('\\r\\n') + '\\r\\n'\n}\n","/**\n * Geometry helpers: pixels <-> fractions of the displayed page, and turning a text selection's\n * many client rects into tidy line boxes.\n */\n\nimport { clampRect, type NormRect } from './model'\n\nexport interface PixelRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface PixelSize {\n width: number\n height: number\n}\n\n/** Rectangles smaller than this (as a fraction of the page) are treated as accidental clicks. */\nconst MIN_MARK_FRACTION = 0.004\n\nexport function toNorm(r: PixelRect, page: PixelSize): NormRect {\n if (!(page.width > 0) || !(page.height > 0)) throw new RangeError('page size must be positive')\n const x1 = Math.min(r.x, r.x + r.width)\n const y1 = Math.min(r.y, r.y + r.height)\n const x2 = Math.max(r.x, r.x + r.width)\n const y2 = Math.max(r.y, r.y + r.height)\n const cx1 = Math.min(Math.max(x1, 0), page.width)\n const cy1 = Math.min(Math.max(y1, 0), page.height)\n const cx2 = Math.min(Math.max(x2, 0), page.width)\n const cy2 = Math.min(Math.max(y2, 0), page.height)\n return clampRect({\n x: cx1 / page.width,\n y: cy1 / page.height,\n w: (cx2 - cx1) / page.width,\n h: (cy2 - cy1) / page.height,\n })\n}\n\nexport function toPixels(r: NormRect, page: PixelSize): PixelRect {\n return {\n x: r.x * page.width,\n y: r.y * page.height,\n width: r.w * page.width,\n height: r.h * page.height,\n }\n}\n\n/** A drag from `a` to `b` (any direction), as a normalised rectangle. */\nexport function dragToNorm(\n a: { x: number; y: number },\n b: { x: number; y: number },\n page: PixelSize\n): NormRect {\n return toNorm({ x: a.x, y: a.y, width: b.x - a.x, height: b.y - a.y }, page)\n}\n\nexport function isTooSmall(r: NormRect): boolean {\n return r.w < MIN_MARK_FRACTION || r.h < MIN_MARK_FRACTION\n}\n\nexport function containsPoint(r: NormRect, x: number, y: number): boolean {\n return x >= r.x && x <= r.x + r.w && y >= r.y && y <= r.y + r.h\n}\n\n/** Rects that only share an edge do not intersect; `EPS` absorbs float noise at that edge. */\nconst EPS = 1e-9\n\nexport function intersects(a: NormRect, b: NormRect): boolean {\n return (\n a.x + EPS < b.x + b.w && b.x + EPS < a.x + a.w && a.y + EPS < b.y + b.h && b.y + EPS < a.y + a.h\n )\n}\n\n/**\n * Collapse a selection's client rects into one box per text line. Browsers return a rect per\n * text node or span, often overlapping and with sub-pixel gaps; merging rects that share a line\n * and touch (or nearly touch) horizontally gives a clean, even highlight. Rects that sit on\n * different lines are left alone. Input is in the page's pixel space.\n */\nexport function mergeLineRects(input: PixelRect[], gap = 2): PixelRect[] {\n const rects = input\n .filter((r) => r.width > 0 && r.height > 0)\n .map((r) => ({ ...r }))\n .sort((a, b) => a.y - b.y || a.x - b.x)\n\n const lines: PixelRect[][] = []\n for (const r of rects) {\n const mid = r.y + r.height / 2\n const line = lines.find((l) => {\n const ref = l[0]\n return mid >= ref.y && mid <= ref.y + ref.height\n })\n if (line) line.push(r)\n else lines.push([r])\n }\n\n const out: PixelRect[] = []\n for (const line of lines) {\n line.sort((a, b) => a.x - b.x)\n let cur = { ...line[0] }\n for (const r of line.slice(1)) {\n if (r.x <= cur.x + cur.width + gap) {\n const right = Math.max(cur.x + cur.width, r.x + r.width)\n const top = Math.min(cur.y, r.y)\n const bottom = Math.max(cur.y + cur.height, r.y + r.height)\n cur = { x: cur.x, y: top, width: right - cur.x, height: bottom - top }\n } else {\n out.push(cur)\n cur = { ...r }\n }\n }\n out.push(cur)\n }\n return out.sort((a, b) => a.y - b.y || a.x - b.x)\n}\n","/**\n * The contract between the annotation state (`useAnnotationLayer`) and the UI that draws it\n * (`AnnotationPageOverlay`, `AnnotationToolbar`). Components take a controller as a prop and hold\n * no annotation state of their own beyond transient drags.\n */\n\nimport type { Annotation, AnnotationLayer, RedactionStatus } from './model'\nimport type { AnnotationPatch } from './state'\n\nexport type AnnotationTool =\n 'select' | 'highlight' | 'box' | 'comment' | 'stamp' | 'redact-area' | 'redact-text'\n\nexport const DRAW_TOOLS: readonly AnnotationTool[] = ['box', 'comment', 'stamp', 'redact-area']\nexport const TEXT_TOOLS: readonly AnnotationTool[] = ['highlight', 'redact-text']\n\n/** Tools that colour what they make. */\nexport type ColoredTool = 'highlight' | 'box' | 'stamp'\n\nexport interface ToolSettings {\n colors: Record<ColoredTool, string>\n stampLabel: string\n /** The stamp tool places this picture (one's saved signature or initials) instead of a label. */\n stampImage: { image: string; label: string } | null\n redactionReason: string\n /** Box outline width in points. */\n strokeWidth: number\n}\n\nexport const DEFAULT_SETTINGS: ToolSettings = {\n colors: { highlight: '#ffe066', box: '#e03131', stamp: '#c92a2a' },\n stampLabel: '[REDACTED]',\n stampImage: null,\n redactionReason: 'Privileged',\n strokeWidth: 2,\n}\n\nexport const HIGHLIGHT_COLORS = ['#ffe066', '#8ce99a', '#74c0fc', '#ffa8a8', '#eebefa']\nexport const MARK_COLORS = ['#e03131', '#1c7ed6', '#2f9e44', '#f08c00', '#000000']\nexport const STAMP_PRESETS = [\n '[REDACTED]',\n 'CONFIDENTIAL',\n 'DRAFT',\n 'APPROVED',\n 'FILED',\n 'PRIVILEGED',\n 'COPY',\n]\nexport const REDACTION_REASONS = [\n 'Privileged',\n 'Confidential',\n 'Personal data',\n 'Commercial',\n 'Irrelevant',\n]\n\n/** A mark as the UI describes it: identity, author and timestamps are added by the controller. */\nexport type NewMark = Annotation extends infer A\n ? A extends Annotation\n ? Omit<A, 'id' | 'author' | 'createdAt' | 'updatedAt'>\n : never\n : never\n\nexport type LayerStatus = 'loading' | 'ready' | 'error'\n\nexport interface AnnotationController {\n layer: AnnotationLayer\n status: LayerStatus\n /** The last load, save or validation failure, for the UI to show. */\n error: string | null\n saving: boolean\n /** True when edits have not reached the store yet. */\n dirty: boolean\n /** The device is offline (or the store unreachable): edits are kept and saved when it is back. */\n offline: boolean\n /** View only (e.g. a guest on a shared document): marks show, nothing can be changed. */\n readOnly: boolean\n author: string\n\n tool: AnnotationTool\n setTool(tool: AnnotationTool): void\n settings: ToolSettings\n setSettings(patch: Partial<ToolSettings>): void\n selectedId: string | null\n select(id: string | null): void\n\n add(mark: NewMark): string | null\n /** Add several marks as ONE undo step (e.g. a selection spanning pages). */\n addMany(marks: NewMark[]): string[]\n update(id: string, patch: AnnotationPatch): void\n remove(id: string): void\n setRedactionStatus(ids: string[], status: RedactionStatus): void\n reply(id: string, body: string): void\n resolve(id: string, resolved: boolean): void\n\n undo(): void\n redo(): void\n canUndo: boolean\n canRedo: boolean\n /** Write to the store now (before leaving the page). */\n flush(): Promise<void>\n}\n\n/** The save state in words, as the toolbar shows it. */\nexport function layerStatusText(controller: AnnotationController): string {\n if (controller.status === 'error') return 'Could not be loaded'\n if (controller.readOnly) return 'View only'\n if (controller.offline) {\n return controller.dirty ? 'Offline — will save when back online' : 'Offline'\n }\n if (controller.error) return 'Not saved — retrying'\n if (controller.saving) return 'Saving…'\n if (controller.dirty) return 'Unsaved changes'\n return 'Saved'\n}\n","/**\n * Annotation state for one document: loads its layer from a store, applies edits through the pure\n * reducer (so undo/redo is exact), and saves back after a short pause.\n *\n * Edits are applied from a ref, not inside a React state updater, so a mark that fails validation\n * is reported through `error` instead of throwing during render.\n *\n * With a shared store (other people edit the same layer) a save may come back merged with their\n * marks, and `pull` brings in their changes while this user is idle. Either way the remote layer is\n * REBASED in: the edits made here since are replayed on top of it with `mergeLayers`, and so is\n * every undo/redo step, so undoing never removes a colleague's mark or brings back one they deleted.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n DEFAULT_SETTINGS,\n type AnnotationController,\n type AnnotationTool,\n type LayerStatus,\n type NewMark,\n type ToolSettings,\n} from './controller'\nimport { mergeLayers } from './merge'\nimport { emptyLayer, type Annotation, type AnnotationLayer } from './model'\nimport {\n applyAction,\n canRedo as historyCanRedo,\n canUndo as historyCanUndo,\n createHistory,\n redo as historyRedo,\n undo as historyUndo,\n type AnnotationAction,\n type LayerHistory,\n} from './state'\nimport { AnnotationStoreOfflineError, type AnnotationStore } from './store'\n\nexport const AUTOSAVE_MS = 600\n/** After a failed save, try again this much later (while edits are still unsaved). */\nexport const RETRY_MS = 10_000\n\nexport interface UseAnnotationLayerOptions {\n documentId: string\n store: AnnotationStore\n /** Display name recorded as the author of new marks. */\n author: string\n autosaveMs?: number\n /** View only: marks are shown and comments can be read, nothing can be changed. */\n readOnly?: boolean\n /** False while the device is offline: edits are kept and saved when it comes back. */\n online?: boolean\n /** Ask the store for others' changes this often while idle (0 = never). Needs `store.pull`. */\n pullMs?: number\n now?: () => string\n makeId?: () => string\n}\n\nconst defaultNow = () => new Date().toISOString()\nconst defaultId = () => globalThis.crypto.randomUUID()\n\n/** Replay a history onto a remote layer: `sent` is what the remote layer was made from. */\nfunction rebaseHistory(\n history: LayerHistory,\n sent: AnnotationLayer,\n remote: AnnotationLayer\n): LayerHistory {\n const onto = (layer: AnnotationLayer) =>\n layer === sent ? remote : mergeLayers({ base: sent, mine: layer, theirs: remote })\n return {\n present: onto(history.present),\n past: history.past.map(onto),\n future: history.future.map(onto),\n }\n}\n\nexport function useAnnotationLayer({\n documentId,\n store,\n author,\n autosaveMs = AUTOSAVE_MS,\n readOnly: readOnlyProp = false,\n online = true,\n pullMs = 0,\n now = defaultNow,\n makeId = defaultId,\n}: UseAnnotationLayerOptions): AnnotationController {\n const [history, setHistory] = useState<LayerHistory>(() =>\n createHistory(emptyLayer(documentId, now()))\n )\n const [savedLayer, setSavedLayer] = useState<AnnotationLayer | null>(null)\n const [status, setStatus] = useState<LayerStatus>('loading')\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [offlineFailure, setOfflineFailure] = useState(false)\n const [storeReadOnly, setStoreReadOnly] = useState(false)\n const [tool, setToolState] = useState<AnnotationTool>('select')\n const [settings, setSettingsState] = useState<ToolSettings>(DEFAULT_SETTINGS)\n const [selectedId, setSelectedId] = useState<string | null>(null)\n const readOnly = readOnlyProp || storeReadOnly\n\n const historyRef = useRef(history)\n const savedRef = useRef<AnnotationLayer | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const retryRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const savingRef = useRef(false)\n const docRef = useRef(documentId)\n const storeRef = useRef(store)\n storeRef.current = store\n const nowRef = useRef(now)\n nowRef.current = now\n const idRef = useRef(makeId)\n idRef.current = makeId\n const readOnlyRef = useRef(readOnly)\n readOnlyRef.current = readOnly\n const onlineRef = useRef(online)\n onlineRef.current = online\n const autosaveMsRef = useRef(autosaveMs)\n autosaveMsRef.current = autosaveMs\n\n const commit = useCallback((next: LayerHistory) => {\n historyRef.current = next\n setHistory(next)\n }, [])\n\n /** Take in a layer the store produced from `sent` (a merged save, or others' changes). */\n const adoptRemote = useCallback(\n (sent: AnnotationLayer, remote: AnnotationLayer) => {\n commit(rebaseHistory(historyRef.current, sent, remote))\n savedRef.current = remote\n setSavedLayer(remote)\n },\n [commit]\n )\n\n // Load when the document changes.\n useEffect(() => {\n docRef.current = documentId\n let cancelled = false\n setStatus('loading')\n setError(null)\n setSelectedId(null)\n setSavedLayer(null)\n setStoreReadOnly(false)\n savedRef.current = null\n commit(createHistory(emptyLayer(documentId, nowRef.current())))\n storeRef.current\n .load(documentId)\n .then((layer) => {\n if (cancelled) return\n savedRef.current = layer\n setSavedLayer(layer)\n setStoreReadOnly(storeRef.current.canEdit?.(documentId) === false)\n commit(createHistory(layer))\n setStatus('ready')\n })\n .catch((e: unknown) => {\n if (cancelled) return\n setError(e instanceof Error ? e.message : 'The annotations could not be loaded')\n setStatus('error')\n })\n return () => {\n cancelled = true\n // Leaving this document (switching to another, or unmounting): write the edits still waiting\n // on the autosave timer. Without this they would be silently dropped.\n clearTimeout(timerRef.current)\n clearTimeout(retryRef.current)\n const layer = historyRef.current.present\n if (\n savedRef.current !== null &&\n layer !== savedRef.current &&\n layer.documentId === documentId &&\n !readOnlyRef.current\n ) {\n storeRef.current\n .save(layer)\n .catch((e: unknown) => console.error('Annotations could not be saved', e))\n }\n }\n }, [documentId, commit])\n\n const save = useCallback(async () => {\n clearTimeout(timerRef.current)\n clearTimeout(retryRef.current)\n const layer = historyRef.current.present\n // Nothing to write, not loaded yet (never overwrite a layer with the empty placeholder), view\n // only, or a write already in flight (its completion schedules the next one).\n if (layer === savedRef.current || savedRef.current === null) return\n if (readOnlyRef.current || savingRef.current) return\n if (!onlineRef.current) return // kept; the online effect saves it when the device is back\n savingRef.current = true\n setSaving(true)\n let failed = false\n try {\n const stored = await storeRef.current.save(layer)\n if (layer.documentId === docRef.current) {\n setError(null)\n setOfflineFailure(false)\n if (stored && stored !== layer) {\n adoptRemote(layer, stored)\n } else {\n savedRef.current = layer\n setSavedLayer(layer)\n }\n }\n } catch (e) {\n failed = true\n if (e instanceof AnnotationStoreOfflineError) {\n setOfflineFailure(true)\n } else {\n setError(e instanceof Error ? e.message : 'The annotations could not be saved')\n }\n // Try again later; any new edit also tries again.\n retryRef.current = setTimeout(() => void saveRef.current(), RETRY_MS)\n } finally {\n savingRef.current = false\n setSaving(false)\n // Edits made while this write was in flight go out next (their own timer found it busy).\n if (!failed && historyRef.current.present !== savedRef.current) {\n timerRef.current = setTimeout(() => void saveRef.current(), autosaveMsRef.current)\n }\n }\n }, [adoptRemote])\n const saveRef = useRef(save)\n saveRef.current = save\n\n const present = history.present\n const dirty = status === 'ready' && present !== savedLayer\n\n useEffect(() => {\n if (!dirty || !online || readOnly) return\n timerRef.current = setTimeout(() => void save(), autosaveMs)\n return () => clearTimeout(timerRef.current)\n }, [dirty, present, autosaveMs, save, online, readOnly])\n\n // Back online: the unsaved edits go out at once.\n useEffect(() => {\n if (online) setOfflineFailure(false)\n if (online && savedRef.current !== null && historyRef.current.present !== savedRef.current) {\n void save()\n }\n }, [online, save])\n\n // Others' changes, while this user is idle (nothing unsaved, nothing in flight).\n const pull = useCallback(async () => {\n const s = storeRef.current\n const base = savedRef.current\n if (!s.pull || !base || savingRef.current || !onlineRef.current) return\n if (historyRef.current.present !== base) return\n try {\n const remote = await s.pull(docRef.current)\n if (!remote || remote.documentId !== docRef.current || savedRef.current !== base) return\n adoptRemote(base, remote)\n } catch {\n // A failed pull changes nothing; the next one (or a save) catches up.\n }\n }, [adoptRemote])\n\n useEffect(() => {\n if (!pullMs || status !== 'ready') return\n const timer = setInterval(() => void pull(), pullMs)\n const onFocus = () => void pull()\n window.addEventListener('focus', onFocus)\n return () => {\n clearInterval(timer)\n window.removeEventListener('focus', onFocus)\n }\n }, [pullMs, status, pull])\n\n // The tab can close or reload with edits still waiting on the autosave timer, and React's own\n // cleanup does not run then. Write when the page is being left or hidden (mobile browsers often\n // fire only the latter). `save` starts the store write synchronously, which is what unload needs.\n useEffect(() => {\n const flush = () => void save()\n const onVisibility = () => {\n if (document.visibilityState === 'hidden') flush()\n }\n window.addEventListener('pagehide', flush)\n document.addEventListener('visibilitychange', onVisibility)\n return () => {\n window.removeEventListener('pagehide', flush)\n document.removeEventListener('visibilitychange', onVisibility)\n }\n }, [save])\n\n const dispatch = useCallback(\n (action: AnnotationAction): boolean => {\n if (readOnlyRef.current) return false\n try {\n commit(applyAction(historyRef.current, action))\n setError(null)\n return true\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The change was rejected')\n return false\n }\n },\n [commit]\n )\n\n const stamp = useCallback(\n (mark: NewMark): Annotation => {\n const t = nowRef.current()\n return { ...mark, id: idRef.current(), author, createdAt: t, updatedAt: t } as Annotation\n },\n [author]\n )\n\n const offline = !online || offlineFailure\n\n const controller = useMemo<AnnotationController>(() => {\n const exists = (id: string | null) =>\n id !== null && present.annotations.some((a) => a.id === id) ? id : null\n return {\n layer: present,\n status,\n error,\n saving,\n dirty,\n offline,\n readOnly,\n author,\n tool: readOnly ? 'select' : tool,\n setTool: (next) => {\n if (readOnly && next !== 'select') return\n setToolState(next)\n if (next !== 'select') setSelectedId(null)\n },\n settings,\n setSettings: (patch) =>\n setSettingsState((s) => ({ ...s, ...patch, colors: { ...s.colors, ...patch.colors } })),\n selectedId: exists(selectedId),\n select: setSelectedId,\n add: (mark) => {\n const annotation = stamp(mark)\n return dispatch({ type: 'add', annotation }) ? annotation.id : null\n },\n addMany: (marks) => {\n const annotations = marks.map(stamp)\n return dispatch({ type: 'addMany', annotations }) ? annotations.map((a) => a.id) : []\n },\n update: (id, patch) => void dispatch({ type: 'update', id, patch, now: nowRef.current() }),\n remove: (id) => void dispatch({ type: 'remove', id, now: nowRef.current() }),\n setRedactionStatus: (ids, next) =>\n void dispatch({\n type: 'setRedactionStatus',\n ids,\n status: next,\n now: nowRef.current(),\n by: author,\n }),\n reply: (id, body) => {\n const t = nowRef.current()\n void dispatch({\n type: 'reply',\n id,\n reply: { id: idRef.current(), author, createdAt: t, body },\n now: t,\n })\n },\n resolve: (id, resolved) =>\n void dispatch({ type: 'resolve', id, resolved, now: nowRef.current() }),\n undo: () => {\n if (!readOnly) commit(historyUndo(historyRef.current))\n },\n redo: () => {\n if (!readOnly) commit(historyRedo(historyRef.current))\n },\n canUndo: !readOnly && historyCanUndo(history),\n canRedo: !readOnly && historyCanRedo(history),\n flush: save,\n }\n }, [\n present,\n history,\n status,\n error,\n saving,\n dirty,\n offline,\n readOnly,\n author,\n tool,\n settings,\n selectedId,\n stamp,\n dispatch,\n commit,\n save,\n ])\n\n return controller\n}\n","/**\n * Turn a text selection into marks. The browser selects over pdf.js's text layer; each page's\n * share of the selection becomes one mark of normalised line boxes (page-relative, zoom-proof).\n *\n * `selectionToPageMarks` is pure so it can be tested without a layout engine; `readSelection`\n * is the thin DOM side that measures a real selection.\n */\n\nimport { mergeLineRects, toNorm, type PixelRect } from './geometry'\nimport type { NormRect } from './model'\n\n/** One page's slice of a selection, in client (viewport) coordinates. */\nexport interface PageSelection {\n page: number\n /** The page's box on screen. */\n box: PixelRect\n /** Client rects of the selected text on this page. */\n rects: PixelRect[]\n text: string\n}\n\nexport interface PageTextMark {\n page: number\n rects: NormRect[]\n text: string\n}\n\n/** Rects smaller than this many CSS pixels (either side) are layout noise, not selected text. */\nconst MIN_RECT_PX = 1\n\nexport function selectionToPageMarks(pages: PageSelection[]): PageTextMark[] {\n const out: PageTextMark[] = []\n for (const p of pages) {\n if (!(p.box.width > 0) || !(p.box.height > 0)) continue\n const local = p.rects\n .filter((r) => r.width >= MIN_RECT_PX && r.height >= MIN_RECT_PX)\n .map((r) => ({ x: r.x - p.box.x, y: r.y - p.box.y, width: r.width, height: r.height }))\n // keep only what overlaps the page area (a selection can brush a neighbouring page)\n .filter(\n (r) => r.x + r.width > 0 && r.y + r.height > 0 && r.x < p.box.width && r.y < p.box.height\n )\n const lines = mergeLineRects(local)\n if (lines.length === 0) continue\n out.push({\n page: p.page,\n rects: lines.map((r) => toNorm(r, { width: p.box.width, height: p.box.height })),\n text: p.text.replace(/\\s+/g, ' ').trim(),\n })\n }\n return out\n}\n\nexport const PAGE_ATTRIBUTE = 'data-annotation-page'\n\n/** The document a node lives in: the page's own, which is not the opener's when popped out. */\nconst ownerDocument = (node: Node): Document => node.ownerDocument ?? document\n\nconst toPixelRect = (r: DOMRect): PixelRect => ({\n x: r.left,\n y: r.top,\n width: r.width,\n height: r.height,\n})\n\n/** Narrow `range` to the part inside `container`, or null if it does not reach it. */\nexport function clipRange(range: Range, container: Node): Range | null {\n if (!range.intersectsNode(container)) return null\n const bounds = ownerDocument(container).createRange()\n bounds.selectNodeContents(container)\n const clipped = range.cloneRange()\n if (clipped.compareBoundaryPoints(Range.START_TO_START, bounds) < 0) {\n clipped.setStart(bounds.startContainer, bounds.startOffset)\n }\n if (clipped.compareBoundaryPoints(Range.END_TO_END, bounds) > 0) {\n clipped.setEnd(bounds.endContainer, bounds.endOffset)\n }\n return clipped\n}\n\n/**\n * The client rects of the TEXT in `range`, one text node at a time. `range.getClientRects()` also\n * returns the box of every element the range covers completely, and a range clipped to a page\n * starts or ends at that page's container, so on a selection that crosses pages it returns\n * page-sized boxes (the text layer, the canvas wrapper). Measuring only text nodes gives the\n * glyph lines the user actually selected.\n */\nfunction textClientRects(range: Range, container: Node): DOMRect[] {\n const doc = ownerDocument(container)\n const walker = doc.createTreeWalker(container, NodeFilter.SHOW_TEXT)\n const rects: DOMRect[] = []\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (!node.textContent?.trim() || !range.intersectsNode(node)) continue\n const part = doc.createRange()\n part.selectNodeContents(node)\n if (node === range.startContainer) part.setStart(node, range.startOffset)\n if (node === range.endContainer) part.setEnd(node, range.endOffset)\n rects.push(...Array.from(part.getClientRects()))\n }\n return rects\n}\n\n/**\n * The text position a boundary point stands for: a text node is itself, and an element boundary\n * means the first text node after it. Null when there is no text there.\n */\nfunction firstTextAt(container: Node, offset: number): { node: Node; offset: number } | null {\n if (container.nodeType === Node.TEXT_NODE) return { node: container, offset }\n const child = container.childNodes[offset]\n if (!child) return null\n if (child.nodeType === Node.TEXT_NODE) return { node: child, offset: 0 }\n const first = ownerDocument(child).createTreeWalker(child, NodeFilter.SHOW_TEXT).nextNode()\n return first ? { node: first, offset: 0 } : null\n}\n\n/**\n * A mouse drag released just past a line's last glyph can end one character short, or on another\n * line: pdf.js's text layer has an end-of-content element under the text, and the browser puts the\n * caret for a point beyond the glyphs in the wrong place. This moves the focus of a forward\n * selection to the last glyph that lies left of the release point on the release line. It only\n * ever extends the selection, and does nothing when the focus is already where the pointer is.\n */\nexport function extendFocusToPointer(selection: Selection, point: { x: number; y: number }): void {\n if (selection.rangeCount === 0 || selection.isCollapsed) return\n const range = selection.getRangeAt(0)\n // Only a forward selection has its focus at the end of the range.\n if (selection.focusNode !== range.endContainer || selection.focusOffset !== range.endOffset)\n return\n const start = firstTextAt(range.endContainer, range.endOffset)\n if (!start) return\n\n const doc = ownerDocument(start.node)\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT)\n walker.currentNode = start.node\n const glyph = doc.createRange()\n let end: { node: Node; offset: number } | null = null\n let node: Node | null = start.node\n let offset = start.offset\n let passed = false\n while (node && !passed) {\n const text = node.textContent ?? ''\n for (let i = offset; i < text.length && !passed; i++) {\n glyph.setStart(node, i)\n glyph.setEnd(node, i + 1)\n const r = glyph.getBoundingClientRect()\n if (r.height === 0) continue\n const mid = r.top + r.height / 2\n if (mid > point.y + r.height / 2) passed = true\n else if (Math.abs(mid - point.y) > r.height / 2) continue\n else if (r.right > point.x + 0.5) passed = true\n else end = { node, offset: i + 1 }\n }\n node = walker.nextNode()\n offset = 0\n }\n if (end) selection.extend(end.node, end.offset)\n}\n\n/** Read the live selection as per-page slices, using the overlays in `root` to find the pages. */\nexport function readSelection(selection: Selection, root: ParentNode = document): PageSelection[] {\n if (selection.rangeCount === 0 || selection.isCollapsed) return []\n const range = selection.getRangeAt(0)\n const pages: PageSelection[] = []\n root.querySelectorAll<HTMLElement>(`[${PAGE_ATTRIBUTE}]`).forEach((overlay) => {\n const page = Number(overlay.getAttribute(PAGE_ATTRIBUTE))\n const container = overlay.parentElement\n if (!container || !Number.isInteger(page)) return\n const clipped = clipRange(range, container)\n if (!clipped) return\n pages.push({\n page,\n box: toPixelRect(overlay.getBoundingClientRect()),\n rects: textClientRects(clipped, container).map(toPixelRect),\n text: clipped.toString(),\n })\n })\n return pages\n}\n","/**\n * Turns a text selection made on the page into marks while the highlight or redact-text tool is\n * active. Only a selection that STARTED on a page counts: otherwise text left selected from an\n * earlier gesture would be marked the moment the user clicked a toolbar button.\n *\n * With a mouse the gesture is press, drag, release, so the release marks the selection. A touch\n * selection is different: the user long-presses a word, then drags the handles, and the browser\n * may cancel the pointer instead of releasing it. So for touch the selection is marked once it has\n * stopped changing for a moment. The marks are undoable, and redactions stay pending until reviewed.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { usePortalContainer } from '../ui/portal-container'\nimport { TEXT_TOOLS, type AnnotationController, type NewMark } from './controller'\nimport { extendFocusToPointer, readSelection, selectionToPageMarks } from './selection-marks'\n\nconst PAGE_SELECTOR = '[data-page-number]'\n\n/** How long a touch selection must stay unchanged before it is turned into marks. */\nexport const TOUCH_SETTLE_MS = 700\n\n/**\n * After a mouse release the browser may still be extending the selection (WebKit does, under\n * load), so reading it at once can capture only part of what the user selected: a redaction that\n * under-covers. The release therefore waits until the selection has read the same on\n * STABLE_CHECKS consecutive checks, MOUSE_SETTLE_MS apart, and gives up waiting after\n * MAX_SETTLE_ROUNDS checks so a selection that never stops changing cannot hang the tool.\n */\nexport const MOUSE_SETTLE_MS = 80\nexport const STABLE_CHECKS = 3\nexport const MAX_SETTLE_ROUNDS = 12\n\nexport function useTextSelectionMarks(controller: AnnotationController) {\n const latest = useRef(controller)\n latest.current = controller\n // A viewer popped out to another window renders into that window's document, which has its own\n // selection and events. Listen to the document the pages are actually in.\n const pagesDoc = usePortalContainer()?.ownerDocument ?? document\n\n useEffect(() => {\n let startedOnPage = false\n let touchSelecting = false\n let settleTimer: ReturnType<typeof setTimeout> | undefined\n const settleTimers = new Set<ReturnType<typeof setTimeout>>()\n\n /** Mark whatever is selected on the pages. Returns true when marks were made. */\n const markSelection = (): boolean => {\n const c = latest.current\n const selection = pagesDoc.getSelection()\n if (!selection || !TEXT_TOOLS.includes(c.tool)) return false\n const pages = selectionToPageMarks(readSelection(selection, pagesDoc))\n if (pages.length === 0) return false\n const marks: NewMark[] = pages.map((p) =>\n c.tool === 'highlight'\n ? {\n kind: 'highlight',\n page: p.page,\n rects: p.rects,\n color: c.settings.colors.highlight,\n text: p.text,\n }\n : {\n kind: 'redaction',\n page: p.page,\n rects: p.rects,\n reason: c.settings.redactionReason,\n text: p.text,\n status: 'pending',\n }\n )\n if (c.addMany(marks).length === 0) return false\n selection.removeAllRanges()\n return true\n }\n\n const onDown = (e: PointerEvent) => {\n startedOnPage = e.target instanceof Element && e.target.closest(PAGE_SELECTOR) !== null\n touchSelecting = startedOnPage && e.pointerType === 'touch'\n }\n\n const onUp = (e: PointerEvent) => {\n if (!startedOnPage || !TEXT_TOOLS.includes(latest.current.tool)) return\n startedOnPage = false\n const selection = pagesDoc.getSelection()\n if (selection && e.pointerType === 'mouse') {\n extendFocusToPointer(selection, { x: e.clientX, y: e.clientY })\n }\n // Let the browser finish updating the selection for this gesture first.\n let last = selection?.toString() ?? ''\n let stable = 0\n let rounds = 0\n const check = () => {\n const now = pagesDoc.getSelection()?.toString() ?? ''\n if (now === last) stable++\n else {\n last = now\n stable = 0\n }\n if (stable >= STABLE_CHECKS || ++rounds >= MAX_SETTLE_ROUNDS) {\n if (markSelection()) touchSelecting = false\n return\n }\n settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS))\n }\n settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS))\n }\n\n const onSelectionChange = () => {\n if (!touchSelecting || !TEXT_TOOLS.includes(latest.current.tool)) return\n clearTimeout(settleTimer)\n settleTimer = setTimeout(() => {\n if (markSelection()) touchSelecting = false\n }, TOUCH_SETTLE_MS)\n }\n\n pagesDoc.addEventListener('pointerdown', onDown, true)\n pagesDoc.addEventListener('pointerup', onUp, true)\n pagesDoc.addEventListener('selectionchange', onSelectionChange)\n return () => {\n clearTimeout(settleTimer)\n settleTimers.forEach(clearTimeout)\n pagesDoc.removeEventListener('pointerdown', onDown, true)\n pagesDoc.removeEventListener('pointerup', onUp, true)\n pagesDoc.removeEventListener('selectionchange', onSelectionChange)\n }\n }, [pagesDoc])\n}\n","/**\n * Pure geometry for moving and resizing a single-rectangle mark. Kept out of the component file so\n * it can be tested and reused without a renderer.\n */\n\nimport { clampRect, type Annotation, type NormRect } from './model'\n\nconst MIN_MARK = 0.01\n\nexport type DragMode = 'move' | 'nw' | 'ne' | 'sw' | 'se'\n\n/** The single rectangle of a mark that can be moved and resized, or null for multi-rect marks. */\nexport function singleRect(a: Annotation): NormRect | null {\n if (a.kind === 'box' || a.kind === 'stamp' || a.kind === 'comment') return a.rect\n if (a.kind === 'redaction' && a.rects.length === 1) return a.rects[0]\n return null\n}\n\nexport const patchForRect = (a: Annotation, rect: NormRect) =>\n a.kind === 'redaction' ? { rects: [rect] } : { rect }\n\n/** Move or resize `origin` by a pointer delta given as fractions of the page. */\nexport function dragRect(origin: NormRect, mode: DragMode, dx: number, dy: number): NormRect {\n if (mode === 'move') {\n return {\n ...origin,\n x: Math.min(Math.max(origin.x + dx, 0), 1 - origin.w),\n y: Math.min(Math.max(origin.y + dy, 0), 1 - origin.h),\n }\n }\n let left = origin.x\n let right = origin.x + origin.w\n let top = origin.y\n let bottom = origin.y + origin.h\n if (mode.includes('w')) left += dx\n else right += dx\n if (mode.includes('n')) top += dy\n else bottom += dy\n const x1 = Math.min(Math.max(Math.min(left, right), 0), 1)\n const x2 = Math.min(Math.max(Math.max(left, right), 0), 1)\n const y1 = Math.min(Math.max(Math.min(top, bottom), 0), 1)\n const y2 = Math.min(Math.max(Math.max(top, bottom), 0), 1)\n return clampRect({\n x: x1,\n y: y1,\n w: Math.max(x2 - x1, MIN_MARK),\n h: Math.max(y2 - y1, MIN_MARK),\n })\n}\n","/**\n * The annotation layer for ONE page: draws its marks and handles the tools.\n *\n * It fills the page area (absolute, inset 0) and positions everything in percentages of it, so\n * marks follow zoom for free. Pointer maths uses the overlay's live box at event time.\n *\n * Event routing: in the text tools (highlight, redact text) the overlay lets pointer events fall\n * through to pdf.js's text layer so the browser can select text; `useTextSelectionMarks` turns\n * that selection into marks. In the draw tools the overlay captures the pointer. In select mode\n * only the marks themselves are interactive.\n */\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { Check, MessageSquare, RotateCcw, Send, Trash2, X } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { DRAW_TOOLS, TEXT_TOOLS, type AnnotationController } from './controller'\nimport { dragToNorm, isTooSmall } from './geometry'\nimport {\n clampRect,\n type Annotation,\n type CommentAnnotation,\n type NormRect,\n type RedactionAnnotation,\n} from './model'\nimport { dragRect, patchForRect, singleRect, type DragMode } from './overlay-geometry'\nimport { PAGE_ATTRIBUTE } from './selection-marks'\n\nconst FALLBACK_PAGE_WIDTH_PT = 612\nconst COMMENT_ICON_PX = 24\nconst DEFAULT_STAMP = { w: 0.32, h: 0.06 }\nconst MOVE_THRESHOLD_PX = 3\n\ninterface DragState {\n id: string\n mode: DragMode\n startX: number\n startY: number\n origin: NormRect\n rect: NormRect\n moved: boolean\n}\ninterface Point {\n x: number\n y: number\n}\n\nfunction useElementSize(ref: React.RefObject<HTMLElement | null>) {\n const [size, setSize] = useState({ width: 0, height: 0 })\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const measure = () => {\n const r = el.getBoundingClientRect()\n setSize((prev) =>\n prev.width === r.width && prev.height === r.height\n ? prev\n : { width: r.width, height: r.height }\n )\n }\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [ref])\n return size\n}\n\n/**\n * Whether the page this overlay sits on has selectable text. A scanned page has none (the parser\n * keeps OCR separately, not in the PDF), so the text tools cannot select anything there.\n */\nfunction useHasTextLayer(ref: React.RefObject<HTMLElement | null>) {\n const [hasText, setHasText] = useState(false)\n useLayoutEffect(() => {\n const container = ref.current?.parentElement\n if (!container) return\n const check = () => setHasText(container.querySelector('.textLayer span') !== null)\n check()\n const observer = new MutationObserver(check)\n observer.observe(container, { childList: true, subtree: true })\n return () => observer.disconnect()\n }, [ref])\n return hasText\n}\n\nconst pct = (n: number) => `${n * 100}%`\nconst rectStyle = (r: NormRect): CSSProperties => ({\n left: pct(r.x),\n top: pct(r.y),\n width: pct(r.w),\n height: pct(r.h),\n})\n\nexport interface AnnotationPageOverlayProps {\n controller: AnnotationController\n pageNumber: number\n /** Page width in PDF points, to size strokes like an export. Defaults to US Letter. */\n pageWidthPt?: number\n}\n\nexport function AnnotationPageOverlay({\n controller,\n pageNumber,\n pageWidthPt,\n}: AnnotationPageOverlayProps) {\n const rootRef = useRef<HTMLDivElement>(null)\n const size = useElementSize(rootRef)\n const pxPerPt = size.width / (pageWidthPt ?? FALLBACK_PAGE_WIDTH_PT)\n const { tool, selectedId, settings } = controller\n\n const [draft, setDraft] = useState<{ a: Point; b: Point } | null>(null)\n const [drag, setDrag] = useState<DragState | null>(null)\n const [openComment, setOpenComment] = useState<string | null>(null)\n\n const marks = controller.layer.annotations.filter((a) => a.page === pageNumber)\n const hasText = useHasTextLayer(rootRef)\n const readOnly = controller.readOnly\n // On a page with no selectable text (a scan) the text tools draw an area instead.\n const drawing =\n !readOnly && (DRAW_TOOLS.includes(tool) || (TEXT_TOOLS.includes(tool) && !hasText))\n\n // A comment opened by the tool or from elsewhere shows its popover only while it is selected.\n useEffect(() => {\n if (openComment && selectedId !== openComment) setOpenComment(null)\n }, [selectedId, openComment])\n\n const local = useCallback((e: { clientX: number; clientY: number }): Point => {\n const r = rootRef.current!.getBoundingClientRect()\n return { x: e.clientX - r.left, y: e.clientY - r.top }\n }, [])\n const pageSize = () => {\n const r = rootRef.current!.getBoundingClientRect()\n return { width: r.width, height: r.height }\n }\n\n const finishDraft = useCallback(\n (a: Point, b: Point) => {\n const page = pageSize()\n const rect = dragToNorm(a, b, page)\n if (tool === 'box') {\n if (isTooSmall(rect)) return\n controller.add({\n kind: 'box',\n page: pageNumber,\n rect,\n color: settings.colors.box,\n strokeWidth: settings.strokeWidth,\n })\n } else if (tool === 'highlight') {\n if (isTooSmall(rect)) return\n controller.add({\n kind: 'highlight',\n page: pageNumber,\n rects: [rect],\n color: settings.colors.highlight,\n })\n } else if (tool === 'redact-area' || tool === 'redact-text') {\n if (isTooSmall(rect)) return\n controller.add({\n kind: 'redaction',\n page: pageNumber,\n rects: [rect],\n reason: settings.redactionReason,\n status: 'pending',\n })\n } else if (tool === 'stamp' && settings.stampImage) {\n // One's saved signature: about 6% of the page high, in the picture's proportions.\n const { image, label } = settings.stampImage\n const size = pngPixelSize(image)\n const h = 0.06\n const w = Math.min(\n 0.5,\n (h * page.height * (size.width / Math.max(1, size.height))) / page.width\n )\n const id = controller.add({\n kind: 'stamp',\n page: pageNumber,\n rect: clampRect({ x: a.x / page.width - w / 2, y: a.y / page.height - h / 2, w, h }),\n label,\n color: '#0d1a59',\n image,\n })\n controller.setSettings({ stampImage: null })\n controller.setTool('select')\n if (id) controller.select(id)\n } else if (tool === 'stamp') {\n const placed = isTooSmall(rect)\n ? clampRect({\n x: a.x / page.width - DEFAULT_STAMP.w / 2,\n y: a.y / page.height - DEFAULT_STAMP.h / 2,\n ...DEFAULT_STAMP,\n })\n : rect\n controller.add({\n kind: 'stamp',\n page: pageNumber,\n rect: placed,\n label: settings.stampLabel,\n color: settings.colors.stamp,\n })\n } else if (tool === 'comment') {\n const anchor = clampRect({\n x: a.x / page.width,\n y: a.y / page.height,\n w: COMMENT_ICON_PX / page.width,\n h: COMMENT_ICON_PX / page.height,\n })\n const id = controller.add({\n kind: 'comment',\n page: pageNumber,\n rect: anchor,\n body: '',\n replies: [],\n resolved: false,\n })\n if (id) {\n controller.setTool('select')\n controller.select(id)\n setOpenComment(id)\n }\n }\n },\n [controller, tool, settings, pageNumber]\n )\n\n const onRootPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!drawing || e.button !== 0 || e.target !== e.currentTarget) return\n e.currentTarget.setPointerCapture(e.pointerId)\n const p = local(e)\n setDraft({ a: p, b: p })\n }\n const onRootPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (draft) setDraft({ a: draft.a, b: local(e) })\n }\n const onRootPointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draft) return\n const b = local(e)\n const a = draft.a\n setDraft(null)\n finishDraft(a, b)\n }\n\n const beginDrag = (e: ReactPointerEvent<HTMLElement>, a: Annotation, mode: DragMode) => {\n const origin = singleRect(a)\n if (!origin || e.button !== 0 || readOnly) return\n e.stopPropagation()\n e.currentTarget.setPointerCapture(e.pointerId)\n setDrag({\n id: a.id,\n mode,\n startX: e.clientX,\n startY: e.clientY,\n origin,\n rect: origin,\n moved: false,\n })\n }\n const moveDrag = (e: ReactPointerEvent<HTMLElement>) => {\n if (!drag) return\n const page = pageSize()\n const dxPx = e.clientX - drag.startX\n const dyPx = e.clientY - drag.startY\n const moved = drag.moved || Math.hypot(dxPx, dyPx) > MOVE_THRESHOLD_PX\n if (!moved) return\n setDrag({\n ...drag,\n moved: true,\n rect: dragRect(drag.origin, drag.mode, dxPx / page.width, dyPx / page.height),\n })\n }\n const endDrag = (a: Annotation) => {\n if (!drag) return\n if (drag.moved) controller.update(a.id, patchForRect(a, drag.rect))\n setDrag(null)\n }\n\n // View only: comments still open (to be read); nothing else reacts to the pointer.\n const interactive = (a: Annotation) =>\n readOnly\n ? a.kind === 'comment'\n : tool === 'select' || (tool === 'comment' && a.kind === 'comment')\n\n const selected = marks.find((a) => a.id === selectedId)\n\n return (\n <div\n ref={rootRef}\n {...{ [PAGE_ATTRIBUTE]: pageNumber }}\n data-testid={`annotation-overlay-${pageNumber}`}\n className={cn(\n 'absolute inset-0 z-10 select-none overflow-hidden',\n drawing && 'cursor-crosshair'\n )}\n style={{\n pointerEvents: drawing ? 'auto' : 'none',\n touchAction: drawing ? 'none' : undefined,\n }}\n onPointerDown={onRootPointerDown}\n onPointerMove={onRootPointerMove}\n onPointerUp={onRootPointerUp}\n onPointerCancel={() => setDraft(null)}\n >\n {marks.map((a) => (\n <MarkView\n key={a.id}\n annotation={a}\n rectOverride={drag?.id === a.id ? drag.rect : undefined}\n pxPerPt={pxPerPt}\n width={size.width}\n height={size.height}\n selected={a.id === selectedId}\n interactive={interactive(a)}\n onPointerDown={(e) => {\n if (!interactive(a)) return\n e.stopPropagation()\n controller.select(a.id)\n if (a.kind === 'comment') setOpenComment(a.id)\n beginDrag(e, a, 'move')\n }}\n onPointerMove={moveDrag}\n onPointerUp={() => endDrag(a)}\n onActivate={() => {\n controller.select(a.id)\n if (a.kind === 'comment') setOpenComment(a.id)\n }}\n onDelete={() => controller.remove(a.id)}\n />\n ))}\n\n {selected && tool === 'select' && !readOnly && singleRect(selected) && (\n <Handles\n rect={drag?.id === selected.id ? drag.rect : singleRect(selected)!}\n onPointerDown={(e, mode) => beginDrag(e, selected, mode)}\n onPointerMove={moveDrag}\n onPointerUp={() => endDrag(selected)}\n />\n )}\n\n {selected && tool === 'select' && !readOnly && (\n <ActionBar\n annotation={selected}\n controller={controller}\n rect={drag?.id === selected.id ? drag.rect : firstRect(selected)}\n />\n )}\n\n {draft && <Draft draft={draft} tool={tool} />}\n\n {openComment && selected?.kind === 'comment' && selected.id === openComment && (\n <CommentPopover\n key={selected.id}\n annotation={selected}\n controller={controller}\n pageHeight={size.height}\n onClose={() => {\n setOpenComment(null)\n controller.select(null)\n }}\n />\n )}\n </div>\n )\n}\n\nconst firstRect = (a: Annotation): NormRect =>\n a.kind === 'highlight' || a.kind === 'redaction' ? a.rects[0] : a.rect\n\ninterface MarkViewProps {\n annotation: Annotation\n rectOverride?: NormRect\n pxPerPt: number\n width: number\n height: number\n selected: boolean\n interactive: boolean\n onPointerDown: (e: ReactPointerEvent<HTMLElement>) => void\n onPointerMove: (e: ReactPointerEvent<HTMLElement>) => void\n onPointerUp: () => void\n onActivate: () => void\n onDelete: () => void\n}\n\nfunction MarkView(props: MarkViewProps) {\n const { annotation: a, rectOverride, pxPerPt, width, height, selected, interactive } = props\n const handlers = {\n onPointerDown: props.onPointerDown,\n onPointerMove: props.onPointerMove,\n onPointerUp: props.onPointerUp,\n onPointerCancel: props.onPointerUp,\n onKeyDown: (e: KeyboardEvent<HTMLElement>) => {\n if (e.key === 'Enter') props.onActivate()\n if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault()\n props.onDelete()\n }\n },\n }\n const base = (label: string): Record<string, unknown> => ({\n 'data-testid': `annotation-mark-${a.id}`,\n 'data-kind': a.kind,\n 'data-selected': selected ? 'true' : undefined,\n role: 'button',\n tabIndex: interactive ? 0 : -1,\n 'aria-label': label,\n ...handlers,\n })\n const ring = selected ? 'outline outline-2 outline-offset-2 outline-primary' : ''\n const events = interactive ? 'auto' : 'none'\n // A selected mark that can be moved must not be taken as a page pan by a finger.\n const dragsByTouch = selected && singleRect(a) !== null\n const cursor = interactive ? (singleRect(a) ? 'move' : 'pointer') : undefined\n\n if (a.kind === 'highlight') {\n return (\n <>\n {a.rects.map((r, i) => (\n <div\n key={i}\n {...(i === 0 ? base(`Highlight: ${a.text ?? ''}`) : {})}\n className={cn('absolute rounded-sm', i === 0 && ring)}\n style={{\n ...rectStyle(r),\n background: a.color,\n mixBlendMode: 'multiply',\n opacity: 0.7,\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n }}\n />\n ))}\n </>\n )\n }\n\n if (a.kind === 'box') {\n const r = rectOverride ?? a.rect\n return (\n <div\n {...base('Box')}\n className={cn('absolute', ring)}\n style={{\n ...rectStyle(r),\n border: `${a.strokeWidth * pxPerPt}px solid ${a.color}`,\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n boxSizing: 'border-box',\n }}\n />\n )\n }\n\n if (a.kind === 'stamp' && a.image) {\n const r = rectOverride ?? a.rect\n return (\n <div\n {...base(`Stamp: ${a.label}`)}\n className={cn('absolute', ring)}\n style={{\n ...rectStyle(r),\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n }}\n >\n <img\n src={`data:image/png;base64,${a.image}`}\n alt={a.label}\n draggable={false}\n className=\"pointer-events-none h-full w-full object-contain select-none\"\n />\n </div>\n )\n }\n\n if (a.kind === 'stamp') {\n const r = rectOverride ?? a.rect\n const fontPx = Math.max(\n 6,\n Math.min(r.h * height * 0.6, (r.w * width * 0.9) / Math.max(1, a.label.length * 0.7))\n )\n return (\n <div\n {...base(`Stamp: ${a.label}`)}\n className={cn('absolute flex items-center justify-center font-bold uppercase', ring)}\n style={{\n ...rectStyle(r),\n border: `${2 * pxPerPt}px solid ${a.color}`,\n color: a.color,\n fontSize: fontPx,\n lineHeight: 1,\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n boxSizing: 'border-box',\n fontFamily: 'Helvetica, Arial, sans-serif',\n }}\n >\n {a.label}\n </div>\n )\n }\n\n if (a.kind === 'comment') {\n const r = rectOverride ?? a.rect\n return (\n <button\n type=\"button\"\n {...base(`Comment: ${a.body || 'empty'}`)}\n // Clicking a marker must not take focus from the text box it opens (see CommentPopover).\n onMouseDown={(e) => e.preventDefault()}\n className={cn(\n 'absolute flex items-center justify-center rounded-md border border-amber-700/60 bg-amber-300 text-amber-900 shadow-sm',\n a.resolved && 'opacity-50',\n ring\n )}\n style={{\n left: pct(r.x),\n top: pct(r.y),\n width: COMMENT_ICON_PX,\n height: COMMENT_ICON_PX,\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n }}\n >\n <MessageSquare size={14} />\n {a.replies.length > 0 && (\n <span className=\"absolute -right-1 -top-1 rounded-full bg-amber-900 px-1 text-[9px] leading-3 text-white\">\n {a.replies.length}\n </span>\n )}\n </button>\n )\n }\n\n return <RedactionView {...props} annotation={a} ring={ring} cursor={cursor} base={base} />\n}\n\nfunction RedactionView({\n annotation: a,\n rectOverride,\n interactive,\n selected,\n ring,\n cursor,\n base,\n}: MarkViewProps & {\n annotation: RedactionAnnotation\n ring: string\n cursor: string | undefined\n base: (label: string) => Record<string, unknown>\n}) {\n const events = interactive ? 'auto' : 'none'\n const dragsByTouch = selected && singleRect(a) !== null\n const rects = rectOverride ? [rectOverride] : a.rects\n const approved = a.status === 'approved'\n const rejected = a.status === 'rejected'\n // The reason is what a reviewer approves or rejects against: hover and screen readers get it whole.\n const label = `Redaction (${a.status}, not applied): ${a.reason}`\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n {...(i === 0 ? { ...base(label), title: label } : {})}\n data-status={i === 0 ? a.status : undefined}\n className={cn(\n 'absolute flex items-center justify-center overflow-hidden text-[10px] leading-none',\n i === 0 && ring\n )}\n style={{\n ...rectStyle(r),\n pointerEvents: events,\n touchAction: dragsByTouch ? 'none' : undefined,\n cursor,\n boxSizing: 'border-box',\n ...(approved\n ? { background: '#000', color: '#fff' }\n : rejected\n ? { border: '1px dotted #868e96', opacity: 0.6 }\n : {\n background: 'rgba(224,49,49,0.18)',\n border: '2px dashed #e03131',\n color: '#c92a2a',\n }),\n }}\n >\n {i === 0 && !rejected && <span className=\"truncate px-1\">[REDACTED]</span>}\n </div>\n ))}\n </>\n )\n}\n\nfunction Draft({ draft, tool }: { draft: { a: Point; b: Point }; tool: string }) {\n const x = Math.min(draft.a.x, draft.b.x)\n const y = Math.min(draft.a.y, draft.b.y)\n const w = Math.abs(draft.b.x - draft.a.x)\n const h = Math.abs(draft.b.y - draft.a.y)\n const redact = tool === 'redact-area' || tool === 'redact-text'\n return (\n <div\n data-testid=\"annotation-draft\"\n className=\"pointer-events-none absolute\"\n style={{\n left: x,\n top: y,\n width: w,\n height: h,\n border: redact ? '2px dashed #e03131' : '2px solid #1c7ed6',\n background: redact ? 'rgba(224,49,49,0.18)' : 'rgba(28,126,214,0.08)',\n }}\n />\n )\n}\n\nconst HANDLES: Array<{ mode: DragMode; style: CSSProperties; cursor: string }> = [\n { mode: 'nw', style: { left: 0, top: 0 }, cursor: 'nwse-resize' },\n { mode: 'ne', style: { left: '100%', top: 0 }, cursor: 'nesw-resize' },\n { mode: 'sw', style: { left: 0, top: '100%' }, cursor: 'nesw-resize' },\n { mode: 'se', style: { left: '100%', top: '100%' }, cursor: 'nwse-resize' },\n]\n\nfunction Handles({\n rect,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n}: {\n rect: NormRect\n onPointerDown: (e: ReactPointerEvent<HTMLElement>, mode: DragMode) => void\n onPointerMove: (e: ReactPointerEvent<HTMLElement>) => void\n onPointerUp: () => void\n}) {\n return (\n <div className=\"pointer-events-none absolute\" style={rectStyle(rect)}>\n {HANDLES.map((h) => (\n // The visible dot is small; the element a finger or pointer hits is a larger transparent\n // square around it (44px on touch screens, the usual minimum target).\n <div\n key={h.mode}\n data-testid={`annotation-handle-${h.mode}`}\n className=\"pointer-events-auto absolute flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center pointer-coarse:h-11 pointer-coarse:w-11\"\n style={{ ...h.style, cursor: h.cursor, touchAction: 'none' }}\n onPointerDown={(e) => onPointerDown(e, h.mode)}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n >\n <span className=\"pointer-events-none h-3 w-3 rounded-full border-2 border-primary bg-background\" />\n </div>\n ))}\n </div>\n )\n}\n\nconst ACTION =\n 'inline-flex h-7 w-7 items-center justify-center rounded text-foreground hover:bg-muted'\n\nfunction ActionBar({\n annotation: a,\n controller,\n rect,\n}: {\n annotation: Annotation\n controller: AnnotationController\n rect: NormRect\n}) {\n // Sit above the mark; flip below when it is too close to the top of the page.\n const above = rect.y > 0.05\n return (\n <div\n data-testid=\"annotation-actions\"\n className=\"pointer-events-auto absolute z-20 flex gap-0.5 rounded-md border border-border bg-background p-0.5 shadow-md\"\n style={{\n left: pct(rect.x),\n top: above ? `calc(${pct(rect.y)} - 36px)` : `calc(${pct(rect.y + rect.h)} + 6px)`,\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {a.kind === 'redaction' && (\n <span\n className=\"max-w-44 truncate self-center px-1.5 text-xs text-muted-foreground\"\n title={a.reason}\n data-testid=\"annotation-action-reason\"\n >\n {a.reason}\n </span>\n )}\n {a.kind === 'redaction' && a.status !== 'approved' && (\n <button\n type=\"button\"\n className={ACTION}\n title=\"Approve redaction\"\n aria-label=\"Approve redaction\"\n data-testid=\"annotation-action-approve\"\n onClick={() => controller.setRedactionStatus([a.id], 'approved')}\n >\n <Check size={15} />\n </button>\n )}\n {a.kind === 'redaction' && a.status !== 'rejected' && (\n <button\n type=\"button\"\n className={ACTION}\n title=\"Reject redaction (leave visible)\"\n aria-label=\"Reject redaction\"\n data-testid=\"annotation-action-reject\"\n onClick={() => controller.setRedactionStatus([a.id], 'rejected')}\n >\n <X size={15} />\n </button>\n )}\n {a.kind === 'redaction' && a.status !== 'pending' && (\n <button\n type=\"button\"\n className={ACTION}\n title=\"Back to pending\"\n aria-label=\"Mark pending\"\n data-testid=\"annotation-action-pending\"\n onClick={() => controller.setRedactionStatus([a.id], 'pending')}\n >\n <RotateCcw size={15} />\n </button>\n )}\n <button\n type=\"button\"\n className={ACTION}\n title=\"Delete\"\n aria-label=\"Delete annotation\"\n data-testid=\"annotation-action-delete\"\n onClick={() => controller.remove(a.id)}\n >\n <Trash2 size={15} />\n </button>\n </div>\n )\n}\n\nfunction CommentPopover({\n annotation: a,\n controller,\n pageHeight,\n onClose,\n}: {\n annotation: CommentAnnotation\n controller: AnnotationController\n pageHeight: number\n onClose: () => void\n}) {\n const [body, setBody] = useState(a.body)\n const [reply, setReply] = useState('')\n const [lift, setLift] = useState(0)\n const popRef = useRef<HTMLDivElement>(null)\n // Text typed but not yet saved; kept in a ref so the unmount cleanup below sees the latest.\n const unsaved = useRef<string | null>(null)\n const readOnly = controller.readOnly\n const mine = a.author === controller.author && !readOnly\n useEffect(() => setBody(a.body), [a.body])\n // A comment low on the page would hang its reply box past the page edge, where the\n // overlay clips it; lift the popover just enough to keep it on the page, never past its top.\n useLayoutEffect(() => {\n const el = popRef.current\n if (!el) return\n const top = a.rect.y * pageHeight\n const fit = () => setLift(Math.min(top, Math.max(0, top + el.offsetHeight - pageHeight)))\n fit()\n const observer = new ResizeObserver(fit)\n observer.observe(el)\n return () => observer.disconnect()\n }, [a.rect.y, pageHeight])\n\n const commitBody = () => {\n if (mine && body !== a.body) controller.update(a.id, { body })\n unsaved.current = null\n }\n // Switching to another comment unmounts this box (its key is the comment id): save what was\n // typed here then, whether or not the text box got a blur first.\n useEffect(\n () => () => {\n if (unsaved.current !== null) controller.update(a.id, { body: unsaved.current })\n unsaved.current = null\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once, when this comment's box unmounts\n [a.id]\n )\n const close = () => {\n commitBody()\n // an empty comment with no replies is a stray click, not a note worth keeping\n if (!readOnly && body.trim() === '' && a.replies.length === 0) controller.remove(a.id)\n onClose()\n }\n const sendReply = () => {\n const text = reply.trim()\n if (!text) return\n commitBody()\n controller.reply(a.id, text)\n setReply('')\n }\n const onRight = a.rect.x > 0.6\n\n return (\n <div\n ref={popRef}\n data-testid=\"annotation-comment-popover\"\n className=\"pointer-events-auto absolute z-30 w-64 rounded-lg border border-border bg-background p-3 text-sm shadow-lg\"\n style={{\n top: pct(a.rect.y),\n marginTop: -lift,\n ...(onRight\n ? { right: `calc(${pct(1 - a.rect.x)} + 8px)` }\n : { left: `calc(${pct(a.rect.x)} + ${COMMENT_ICON_PX + 8}px)` }),\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span className=\"truncate\">\n {a.author} · {new Date(a.createdAt).toLocaleString()}\n </span>\n <button\n type=\"button\"\n aria-label=\"Close comment\"\n data-testid=\"annotation-comment-close\"\n className={ACTION}\n onClick={close}\n >\n <X size={14} />\n </button>\n </div>\n <textarea\n autoFocus={a.body === ''}\n data-testid=\"annotation-comment-body\"\n className=\"field-sizing-content max-h-60 min-h-24 w-full resize-y rounded-md border border-input bg-background p-2 text-sm\"\n placeholder=\"Add a comment\"\n value={body}\n readOnly={!mine}\n onChange={(e) => {\n setBody(e.target.value)\n unsaved.current = e.target.value\n }}\n onBlur={commitBody}\n onKeyDown={(e) => {\n if (e.key === 'Escape') close()\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n commitBody()\n onClose()\n }\n }}\n />\n {a.replies.length > 0 && (\n <ul\n className=\"mt-2 max-h-40 space-y-2 overflow-y-auto\"\n data-testid=\"annotation-comment-replies\"\n >\n {a.replies.map((r) => (\n <li key={r.id} className=\"rounded-md bg-muted p-2\">\n <div className=\"text-xs text-muted-foreground\">{r.author}</div>\n <div className=\"whitespace-pre-wrap break-words\">{r.body}</div>\n </li>\n ))}\n </ul>\n )}\n {!readOnly && (\n <div className=\"mt-2 flex gap-1\">\n <input\n data-testid=\"annotation-comment-reply\"\n className=\"h-8 min-w-0 flex-1 rounded-md border border-input bg-background px-2 text-sm\"\n placeholder=\"Reply\"\n value={reply}\n onChange={(e) => setReply(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n sendReply()\n }\n }}\n />\n <button\n type=\"button\"\n aria-label=\"Send reply\"\n data-testid=\"annotation-comment-send\"\n className={ACTION}\n onClick={sendReply}\n >\n <Send size={14} />\n </button>\n </div>\n )}\n {readOnly ? (\n <div className=\"mt-2 text-xs text-muted-foreground\" data-testid=\"annotation-comment-status\">\n {a.resolved ? 'Resolved' : 'Open'}\n </div>\n ) : (\n <div className=\"mt-2 flex items-center justify-between\">\n <button\n type=\"button\"\n data-testid=\"annotation-comment-resolve\"\n className=\"text-xs text-primary hover:underline\"\n onClick={() => controller.resolve(a.id, !a.resolved)}\n >\n {a.resolved ? 'Reopen' : 'Resolve'}\n </button>\n <button\n type=\"button\"\n data-testid=\"annotation-comment-delete\"\n className=\"text-xs text-destructive hover:underline\"\n onClick={() => {\n controller.remove(a.id)\n onClose()\n }}\n >\n Delete\n </button>\n </div>\n )}\n </div>\n )\n}\n\n/** A PNG's pixel size from its header (IHDR). */\nfunction pngPixelSize(base64: string): { width: number; height: number } {\n const raw = atob(base64.slice(0, 64))\n const at = (i: number) =>\n ((raw.charCodeAt(i) << 24) |\n (raw.charCodeAt(i + 1) << 16) |\n (raw.charCodeAt(i + 2) << 8) |\n raw.charCodeAt(i + 3)) >>>\n 0\n return { width: at(16), height: at(20) }\n}\n","/** Delete, Escape, undo and redo for the annotation layer. */\n\nimport { useEffect } from 'react'\nimport type { AnnotationController } from './controller'\n\nconst isEditable = (el: EventTarget | null) =>\n el instanceof HTMLElement &&\n (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName))\n\n/** Delete, Escape, undo and redo, ignoring keystrokes meant for a text field. */\nexport function useAnnotationShortcuts(controller: AnnotationController, enabled = true) {\n useEffect(() => {\n if (!enabled) return\n const onKey = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 'z') {\n e.preventDefault()\n if (e.shiftKey) controller.redo()\n else controller.undo()\n } else if (mod && e.key.toLowerCase() === 'y') {\n e.preventDefault()\n controller.redo()\n } else if ((e.key === 'Delete' || e.key === 'Backspace') && controller.selectedId) {\n e.preventDefault()\n controller.remove(controller.selectedId)\n } else if (e.key === 'Escape') {\n controller.select(null)\n controller.setTool('select')\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [controller, enabled])\n}\n","/**\n * Toolbar for the annotation layer: pick a tool, set its options, review redactions, undo/redo,\n * and hand off to freezing. Holds no annotation state: everything goes through the controller.\n */\n\nimport { useState, type ReactNode } from 'react'\nimport {\n ChevronDown,\n EyeOff,\n Highlighter,\n MessageSquare,\n MousePointer2,\n Redo2,\n ScanText,\n Square,\n Stamp,\n Undo2,\n} from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { Button } from '../ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/dropdown-menu'\nimport {\n HIGHLIGHT_COLORS,\n MARK_COLORS,\n REDACTION_REASONS,\n STAMP_PRESETS,\n type AnnotationController,\n type AnnotationTool,\n layerStatusText,\n type ColoredTool,\n} from './controller'\nimport { pendingRedactions } from './state'\nimport { useAnnotationShortcuts } from './useAnnotationShortcuts'\nimport { useTextSelectionMarks } from './useTextSelectionMarks'\n\nconst TOOLS: Array<{ tool: AnnotationTool; label: string; icon: ReactNode }> = [\n { tool: 'select', label: 'Select', icon: <MousePointer2 size={16} /> },\n { tool: 'highlight', label: 'Highlight', icon: <Highlighter size={16} /> },\n { tool: 'box', label: 'Box', icon: <Square size={16} /> },\n { tool: 'comment', label: 'Comment', icon: <MessageSquare size={16} /> },\n { tool: 'stamp', label: 'Stamp', icon: <Stamp size={16} /> },\n { tool: 'redact-text', label: 'Redact text', icon: <ScanText size={16} /> },\n { tool: 'redact-area', label: 'Redact area', icon: <EyeOff size={16} /> },\n]\n\nfunction Swatches({\n colors,\n value,\n onChange,\n label,\n}: {\n colors: string[]\n value: string\n onChange: (color: string) => void\n label: string\n}) {\n return (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label={label}>\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n aria-label={`${label} ${c}`}\n aria-pressed={c === value}\n data-testid={`annotation-color-${c.slice(1)}`}\n className={cn(\n 'h-5 w-5 rounded-full border border-border',\n c === value && 'ring-2 ring-primary ring-offset-1'\n )}\n style={{ background: c }}\n onClick={() => onChange(c)}\n />\n ))}\n </div>\n )\n}\n\n/**\n * A text field with its presets one click away. A native `<datalist>` hid them: its popup opens\n * only on some clicks and keys, shows no hint that a list exists, and lives outside the page.\n * The text is selected on focus, so typing (or a finger with no select-all) replaces it.\n */\nfunction PresetField({\n label,\n testId,\n value,\n presets,\n maxLength,\n className,\n onChange,\n}: {\n label: string\n testId: string\n value: string\n presets: string[]\n maxLength: number\n className: string\n onChange: (value: string) => void\n}) {\n return (\n <div className=\"flex items-center\">\n <input\n aria-label={label}\n data-testid={testId}\n className={cn('h-8 rounded-l-md border border-input bg-background px-2 text-sm', className)}\n value={value}\n maxLength={maxLength}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => onChange(e.target.value)}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Choose ${label.toLowerCase()}`}\n title={`Choose ${label.toLowerCase()}`}\n data-testid={`${testId}-presets`}\n className=\"flex h-8 items-center rounded-r-md border border-l-0 border-input bg-background px-1.5 text-muted-foreground hover:bg-accent\"\n >\n <ChevronDown size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {presets.map((p) => (\n <DropdownMenuItem key={p} onSelect={() => onChange(p)}>\n {p}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport interface AnnotationToolbarProps {\n controller: AnnotationController\n /** Apply the annotations and redactions to a new document copy. */\n onFreeze?: () => void\n /** Extra host actions at the end of the bar (e.g. \"Download with markup\"). */\n actions?: ReactNode\n className?: string\n}\n\nexport function AnnotationToolbar({\n controller,\n onFreeze,\n actions,\n className,\n}: AnnotationToolbarProps) {\n useTextSelectionMarks(controller)\n useAnnotationShortcuts(controller)\n\n const [reviewing, setReviewing] = useState(false)\n const { tool, settings } = controller\n const pending = pendingRedactions(controller.layer)\n const redactions = controller.layer.annotations.filter((a) => a.kind === 'redaction')\n const redactionCount = redactions.length\n const approved = redactions.filter((a) => a.status === 'approved').length\n const rejected = redactions.filter((a) => a.status === 'rejected').length\n const colored = tool === 'highlight' || tool === 'box' || tool === 'stamp'\n const redacting = tool === 'redact-text' || tool === 'redact-area'\n const status = layerStatusText(controller)\n const editable = !controller.readOnly\n\n // The redaction reason and the review row get a line of their own while they apply, so the\n // page below does not move when the first pending redaction appears.\n const redactionControls = (\n <>\n {editable && redacting && (\n <PresetField\n label=\"Redaction reason\"\n testId=\"annotation-redaction-reason\"\n className=\"w-44\"\n value={settings.redactionReason}\n presets={REDACTION_REASONS}\n maxLength={80}\n onChange={(redactionReason) => controller.setSettings({ redactionReason })}\n />\n )}\n\n {redactionCount > 0 && (\n <div className=\"flex items-center gap-2 text-sm\" data-testid=\"annotation-review\">\n <span className=\"rounded-md bg-muted px-2 py-1\" data-testid=\"annotation-pending-count\">\n {pending.length} pending · {approved} approved, not applied · {rejected} rejected\n </span>\n {editable && (\n <>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={pending.length === 0}\n data-testid=\"annotation-approve-all\"\n onClick={() =>\n controller.setRedactionStatus(\n pending.map((a) => a.id),\n 'approved'\n )\n }\n >\n Approve all\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={pending.length === 0}\n data-testid=\"annotation-reject-all\"\n onClick={() =>\n controller.setRedactionStatus(\n pending.map((a) => a.id),\n 'rejected'\n )\n }\n >\n Reject all\n </Button>\n </>\n )}\n </div>\n )}\n </>\n )\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Annotation tools\"\n data-testid=\"annotation-toolbar\"\n className={cn(\n 'flex flex-wrap items-center gap-x-3 gap-y-2 border-b border-border bg-background px-3 py-2',\n className\n )}\n >\n {editable && (\n <div\n className=\"flex items-center gap-1 border-r border-border pr-3\"\n role=\"group\"\n aria-label=\"History\"\n >\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n title=\"Undo\"\n aria-label=\"Undo\"\n data-testid=\"annotation-undo\"\n disabled={!controller.canUndo}\n onClick={controller.undo}\n >\n <Undo2 size={16} />\n </Button>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n title=\"Redo\"\n aria-label=\"Redo\"\n data-testid=\"annotation-redo\"\n disabled={!controller.canRedo}\n onClick={controller.redo}\n >\n <Redo2 size={16} />\n </Button>\n </div>\n )}\n\n {editable && (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Tool\">\n {TOOLS.map(({ tool: t, label, icon }) => (\n <Button\n key={t}\n type=\"button\"\n size=\"icon\"\n variant={tool === t ? 'default' : 'ghost'}\n title={label}\n aria-label={label}\n aria-pressed={tool === t}\n data-testid={`annotation-tool-${t}`}\n onClick={() => controller.setTool(t)}\n >\n {icon}\n </Button>\n ))}\n </div>\n )}\n\n {editable && colored && (\n <Swatches\n label=\"Colour\"\n colors={tool === 'highlight' ? HIGHLIGHT_COLORS : MARK_COLORS}\n value={settings.colors[tool as ColoredTool]}\n onChange={(c) => controller.setSettings({ colors: { ...settings.colors, [tool]: c } })}\n />\n )}\n\n {editable && tool === 'stamp' && settings.stampImage && (\n <span className=\"text-xs text-muted-foreground\" data-testid=\"annotation-place-signature\">\n Click where your {settings.stampImage.label.toLowerCase()} goes.\n </span>\n )}\n\n {editable && tool === 'stamp' && !settings.stampImage && (\n <PresetField\n label=\"Stamp text\"\n testId=\"annotation-stamp-label\"\n className=\"w-40\"\n value={settings.stampLabel}\n presets={STAMP_PRESETS}\n maxLength={40}\n onChange={(stampLabel) => controller.setSettings({ stampLabel })}\n />\n )}\n\n {(redacting || redactionCount > 0) && (\n <div\n className=\"flex w-full flex-wrap items-center gap-x-3 gap-y-2\"\n data-testid=\"annotation-redaction-row\"\n >\n {redactionControls}\n {redactionCount > 0 && (\n <>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setReviewing((on) => !on)}\n aria-expanded={reviewing}\n data-testid=\"annotation-review-toggle\"\n >\n Review redactions\n </Button>\n <p\n className=\"w-full text-xs text-amber-700 dark:text-amber-400\"\n role=\"status\"\n data-testid=\"annotation-preview-warning\"\n >\n Preview only: black boxes, including approved ones, have not removed the underlying\n content. Apply approved redactions to create a redacted copy.\n </p>\n </>\n )}\n </div>\n )}\n\n {reviewing && redactionCount > 0 && (\n <div\n className=\"max-h-64 w-full overflow-auto rounded border\"\n data-testid=\"annotation-redaction-review-list\"\n >\n <table className=\"w-full text-left text-sm\">\n <thead>\n <tr>\n <th className=\"p-2\">Page</th>\n <th>Reason</th>\n <th>Review status</th>\n <th>Decision</th>\n </tr>\n </thead>\n <tbody>\n {redactions.map((a) => (\n <tr key={a.id} className=\"border-t\" data-testid={`redaction-review-${a.id}`}>\n <td className=\"p-2\">\n <button type=\"button\" onClick={() => controller.select(a.id)}>\n Page {a.page}\n </button>\n </td>\n <td>\n <input\n aria-label={`Reason for redaction ${a.id}`}\n value={a.reason}\n disabled={!editable}\n className=\"rounded border bg-background px-2 py-1\"\n onChange={(e) =>\n controller.update(a.id, {\n reason: e.target.value,\n status: 'pending',\n reviewedBy: undefined,\n reviewedAt: undefined,\n })\n }\n />\n </td>\n <td>{a.status === 'approved' ? 'Approved · not applied' : a.status}</td>\n <td className=\"flex gap-1 p-2\">\n {editable && (\n <>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={a.status === 'approved'}\n onClick={() => controller.setRedactionStatus([a.id], 'approved')}\n >\n Approve\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={a.status === 'rejected'}\n onClick={() => controller.setRedactionStatus([a.id], 'rejected')}\n >\n Reject\n </Button>\n </>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Its own line, so the tools above never move when the status text or actions change. */}\n <div className=\"flex w-full items-center justify-end gap-3 text-xs text-muted-foreground\">\n <span\n data-testid=\"annotation-status\"\n role=\"status\"\n data-state={\n controller.readOnly\n ? 'readonly'\n : controller.offline\n ? 'offline'\n : controller.error\n ? 'error'\n : controller.saving\n ? 'saving'\n : controller.dirty\n ? 'dirty'\n : 'saved'\n }\n className={cn(controller.error && !controller.offline && 'text-destructive')}\n title={controller.error ?? undefined}\n >\n {status}\n </span>\n {actions}\n {onFreeze && (\n <Button\n type=\"button\"\n size=\"sm\"\n data-testid=\"annotation-freeze\"\n onClick={onFreeze}\n disabled={pending.length > 0}\n title={pending.length ? 'Approve or reject each proposed redaction first' : undefined}\n >\n <EyeOff size={14} />\n {redactionCount ? 'Apply approved redactions' : 'Create annotated copy'}\n </Button>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Asks how to freeze the annotated document into a new copy. It only collects choices; the host\n * runs `freezePdf` (see `@arbidocs/react/annotations/freeze`) and reports progress back.\n *\n * The rules that keep a redacted copy safe are enforced here as well as in `freezePdf`: redactions\n * force an image-only copy, and unreviewed redaction marks must be resolved before freezing.\n */\n\nimport { useState } from 'react'\nimport { Button } from '../ui/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport type { AnnotationController } from './controller'\nimport { isEffectiveRedaction, type AnnotationKind } from './model'\nimport { pendingRedactions } from './state'\n\nexport interface FreezeChoices {\n mode: 'vector' | 'image'\n comments: 'omit' | 'markers' | 'appendix'\n pendingRedactions: 'error' | 'burn'\n /** Also save the redaction log (CSV: page, reason, status, approver, time; never the text). */\n redactionLog: boolean\n}\n\nexport interface FreezeDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n controller: AnnotationController\n onConfirm: (choices: FreezeChoices) => void\n busy?: boolean\n progress?: { done: number; total: number } | null\n error?: string | null\n}\n\nconst KIND_LABELS: Record<AnnotationKind, string> = {\n highlight: 'highlights',\n box: 'boxes',\n comment: 'comments',\n stamp: 'stamps',\n redaction: 'redactions',\n}\n\nexport function FreezeDialog({\n open,\n onOpenChange,\n controller,\n onConfirm,\n busy,\n progress,\n error,\n}: FreezeDialogProps) {\n const [mode, setMode] = useState<FreezeChoices['mode']>('vector')\n const [comments, setComments] = useState<FreezeChoices['comments']>('omit')\n const [redactionLog, setRedactionLog] = useState(true)\n\n const marks = controller.layer.annotations\n const redactions = marks.filter(isEffectiveRedaction)\n const pending = pendingRedactions(controller.layer)\n const hasRedactionMarks = marks.some((a) => a.kind === 'redaction')\n const forced = redactions.length > 0\n const effectiveMode = forced ? 'image' : mode\n const blocked = pending.length > 0\n const counts = (Object.keys(KIND_LABELS) as AnnotationKind[])\n .map(\n (k) =>\n [\n k,\n marks.filter((a) => a.kind === k && (k !== 'redaction' || isEffectiveRedaction(a)))\n .length,\n ] as const\n )\n .filter(([, n]) => n > 0)\n\n return (\n <Dialog open={open} onOpenChange={(next) => !busy && onOpenChange(next)}>\n <DialogContent data-testid=\"freeze-dialog\">\n <DialogHeader>\n <DialogTitle>\n {hasRedactionMarks ? 'Apply approved redactions' : 'Create annotated copy'}\n </DialogTitle>\n <DialogDescription>\n Approval records your review decision. Applying permanently removes the covered content\n from a new redacted copy. The original remains in your files.\n </DialogDescription>\n </DialogHeader>\n\n <p className=\"text-sm text-muted-foreground\" data-testid=\"freeze-summary\">\n {counts.length === 0\n ? 'No annotations yet.'\n : counts.map(([k, n]) => `${n} ${KIND_LABELS[k]}`).join(', ')}\n </p>\n\n <fieldset className=\"space-y-2 text-sm\" disabled={busy}>\n <legend className=\"mb-1 font-medium\">Format</legend>\n <label className=\"flex items-start gap-2\">\n <input\n type=\"radio\"\n name=\"freeze-mode\"\n data-testid=\"freeze-mode-vector\"\n checked={effectiveMode === 'vector'}\n disabled={forced}\n onChange={() => setMode('vector')}\n />\n <span>\n Keep text\n <span className=\"block text-xs text-muted-foreground\">\n Searchable, smaller. Not available when there are redactions.\n </span>\n </span>\n </label>\n <label className=\"flex items-start gap-2\">\n <input\n type=\"radio\"\n name=\"freeze-mode\"\n data-testid=\"freeze-mode-image\"\n checked={effectiveMode === 'image'}\n onChange={() => setMode('image')}\n />\n <span>\n Image only\n <span className=\"block text-xs text-muted-foreground\">\n Every page becomes a picture. Nothing is left behind a redaction.\n </span>\n </span>\n </label>\n {forced && (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"freeze-forced-note\">\n Image only is required because this document has redactions.\n </p>\n )}\n </fieldset>\n\n <label className=\"flex items-center gap-2 text-sm\">\n Comments\n <select\n data-testid=\"freeze-comments\"\n className=\"h-8 rounded-md border border-input bg-background px-2\"\n value={comments}\n disabled={busy}\n onChange={(e) => setComments(e.target.value as FreezeChoices['comments'])}\n >\n <option value=\"omit\">Leave out</option>\n <option value=\"markers\">Numbered markers</option>\n <option value=\"appendix\">Markers and a listing</option>\n </select>\n </label>\n {forced && comments !== 'omit' && marks.some((a) => a.kind === 'comment') && (\n <p className=\"text-xs text-destructive\" data-testid=\"freeze-comment-warning\">\n Comments are copied as written and may repeat text you have redacted.\n </p>\n )}\n\n {pending.length > 0 && (\n <p className=\"rounded border p-2 text-sm\" data-testid=\"freeze-pending\">\n {pending.length} redaction{pending.length === 1 ? ' has' : 's have'} not been reviewed.\n Approve or reject each one before applying redactions.\n </p>\n )}\n\n {hasRedactionMarks && (\n <label className=\"flex items-start gap-2 text-sm\">\n <input\n type=\"checkbox\"\n data-testid=\"freeze-redaction-log\"\n checked={redactionLog}\n disabled={busy}\n onChange={(e) => setRedactionLog(e.target.checked)}\n />\n <span>\n Download a redaction log (CSV)\n <span className=\"block text-xs text-muted-foreground\">\n Page, reason, status, who approved it and when. Never the redacted text.\n </span>\n </span>\n </label>\n )}\n\n {busy && progress && (\n <p className=\"text-sm\" role=\"status\" data-testid=\"freeze-progress\">\n Page {progress.done} of {progress.total}…\n </p>\n )}\n {error && (\n <p className=\"text-sm text-destructive\" role=\"alert\" data-testid=\"freeze-error\">\n {error}\n </p>\n )}\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => onOpenChange(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n data-testid=\"freeze-confirm\"\n disabled={busy || blocked}\n onClick={() =>\n onConfirm({\n mode: effectiveMode,\n comments,\n pendingRedactions: 'error',\n redactionLog: hasRedactionMarks && redactionLog,\n })\n }\n >\n {busy\n ? 'Creating copy…'\n : hasRedactionMarks\n ? 'Apply redactions and create copy'\n : 'Create annotated copy'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Asks how to number and package a set of documents as a production. It only collects choices; the\n * host runs `buildBundle` (see `@arbidocs/react/annotations/freeze`) and saves the result.\n *\n * The documents can be put in order (drag a row, or its up/down buttons from the keyboard): that\n * order is the numbering order.\n */\n\nimport { useEffect, useRef, useState, type DragEvent } from 'react'\nimport { ChevronDown, ChevronUp, GripVertical } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\n\nexport type ProductionCorner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\nexport interface ProductionChoices {\n layout: 'merged' | 'per-document'\n prefix: string\n start: number\n digits: number\n /** Corner of the Bates label; the QR code, when on, takes the opposite bottom corner. */\n corner: ProductionCorner\n qr: boolean\n /** An index page first: every document with its Bates range. */\n indexPage: boolean\n /** Also save the result as a document in the workspace (it is downloaded either way). */\n saveToWorkspace: boolean\n /** Document ids in numbering order. */\n order: string[]\n}\n\nexport interface ProductionDocument {\n id: string\n name: string\n}\n\nexport interface ProductionDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The documents, in the order they are numbered until the user reorders them. */\n documents: ProductionDocument[]\n /** Selected documents that cannot be included, with the reason, e.g. \"photo.jpg (no PDF)\". */\n leftOut?: string[]\n onConfirm: (choices: ProductionChoices) => void\n busy?: boolean\n progress?: { done: number; total: number } | null\n error?: string | null\n}\n\nconst MAX_PREFIX = 24\n\nexport function previewLabel(choices: Pick<ProductionChoices, 'prefix' | 'start' | 'digits'>) {\n return `${choices.prefix}${String(choices.start).padStart(choices.digits, '0')}`\n}\n\n/** The QR code sits in the bottom corner the label is not in (the label may be top or bottom). */\nexport function qrCornerFor(corner: ProductionCorner): ProductionCorner {\n return corner.endsWith('left') ? 'bottom-right' : 'bottom-left'\n}\n\n/** `items` with the entry at `from` moved to `to`. */\nexport function moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n if (from === to || from < 0 || to < 0 || from >= items.length || to >= items.length)\n return [...items]\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n return next\n}\n\nexport function ProductionDialog({\n open,\n onOpenChange,\n documents,\n leftOut = [],\n onConfirm,\n busy,\n progress,\n error,\n}: ProductionDialogProps) {\n const [layout, setLayout] = useState<ProductionChoices['layout']>('merged')\n const [prefix, setPrefix] = useState('')\n const [start, setStart] = useState(1)\n const [digits, setDigits] = useState(6)\n const [corner, setCorner] = useState<ProductionCorner>('bottom-right')\n const [qr, setQr] = useState(false)\n const [indexPage, setIndexPage] = useState(false)\n const [saveToWorkspace, setSaveToWorkspace] = useState(true)\n\n // The numbering order; starts as given and follows a changed selection.\n const documentKey = documents.map((d) => d.id).join('|')\n const [ordered, setOrdered] = useState(documents)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => setOrdered(documents), [documentKey])\n const listRef = useRef<HTMLOListElement>(null)\n const [dragFrom, setDragFrom] = useState<number | null>(null)\n\n // Keep the keyboard on the row that moved, so it can move again: on the same arrow, or on the\n // other one once the row reaches the end of the list.\n const focusAfterMove = useRef<{ index: number; arrow: 'up' | 'down' } | null>(null)\n useEffect(() => {\n const pending = focusAfterMove.current\n focusAfterMove.current = null\n if (!pending || !listRef.current) return\n const button = (arrow: 'up' | 'down') =>\n listRef.current?.querySelector<HTMLButtonElement>(\n `[data-testid=\"production-move-${arrow}-${pending.index}\"]:not(:disabled)`\n )\n ;(button(pending.arrow) ?? button(pending.arrow === 'up' ? 'down' : 'up'))?.focus()\n }, [ordered])\n const move = (from: number, to: number, arrow?: 'up' | 'down') => {\n if (arrow) focusAfterMove.current = { index: to, arrow }\n setOrdered((items) => moveItem(items, from, to))\n }\n const onDrop = (to: number) => (e: DragEvent) => {\n e.preventDefault()\n if (dragFrom !== null) move(dragFrom, to)\n setDragFrom(null)\n }\n\n const valid =\n Number.isInteger(start) && start >= 0 && Number.isInteger(digits) && digits >= 1 && digits <= 12\n\n return (\n <Dialog open={open} onOpenChange={(next) => !busy && onOpenChange(next)}>\n <DialogContent data-testid=\"production-dialog\" className=\"max-h-[90dvh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>Production set</DialogTitle>\n <DialogDescription>\n Numbers every page with a Bates label, in the order shown. The originals are never\n changed; the result is downloaded and, if you choose, saved to the workspace.\n </DialogDescription>\n </DialogHeader>\n\n <p className=\"text-sm text-muted-foreground\" data-testid=\"production-summary\">\n {documents.length} document{documents.length === 1 ? '' : 's'}, numbered in this order.\n {ordered.length > 1 ? ' Drag a row or use its arrows to reorder.' : ''}\n </p>\n <ol\n ref={listRef}\n className=\"max-h-48 space-y-1 overflow-y-auto text-sm\"\n data-testid=\"production-order\"\n aria-label=\"Numbering order\"\n >\n {ordered.map((doc, i) => (\n <li\n key={doc.id}\n draggable={!busy}\n onDragStart={() => setDragFrom(i)}\n onDragOver={(e) => e.preventDefault()}\n onDrop={onDrop(i)}\n onDragEnd={() => setDragFrom(null)}\n className={`flex items-center gap-1 rounded-md border border-border px-2 py-1 ${\n dragFrom === i ? 'opacity-50' : ''\n }`}\n data-testid={`production-order-item-${i}`}\n data-document-id={doc.id}\n >\n <GripVertical\n className=\"size-4 shrink-0 cursor-grab text-muted-foreground\"\n aria-hidden\n />\n <span className=\"w-6 shrink-0 text-right tabular-nums text-muted-foreground\">\n {i + 1}.\n </span>\n <span className=\"min-w-0 flex-1 truncate\" title={doc.name}>\n {doc.name}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 pointer-coarse:size-11\"\n aria-label={`Move ${doc.name} up`}\n data-testid={`production-move-up-${i}`}\n disabled={busy || i === 0}\n onClick={() => move(i, i - 1, 'up')}\n >\n <ChevronUp className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 pointer-coarse:size-11\"\n aria-label={`Move ${doc.name} down`}\n data-testid={`production-move-down-${i}`}\n disabled={busy || i === ordered.length - 1}\n onClick={() => move(i, i + 1, 'down')}\n >\n <ChevronDown className=\"size-4\" />\n </Button>\n </li>\n ))}\n </ol>\n {leftOut.length > 0 && (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"production-left-out\">\n Left out, with no PDF version to number: {leftOut.join(', ')}\n </p>\n )}\n\n <fieldset className=\"space-y-2 text-sm\" disabled={busy}>\n <legend className=\"mb-1 font-medium\">Files</legend>\n <label className=\"flex items-start gap-2\">\n <input\n type=\"radio\"\n name=\"production-layout\"\n data-testid=\"production-layout-merged\"\n checked={layout === 'merged'}\n onChange={() => setLayout('merged')}\n />\n <span>\n One merged file\n <span className=\"block text-xs text-muted-foreground\">\n All documents joined, numbered consecutively.\n </span>\n </span>\n </label>\n <label className=\"flex items-start gap-2\">\n <input\n type=\"radio\"\n name=\"production-layout\"\n data-testid=\"production-layout-per-document\"\n checked={layout === 'per-document'}\n onChange={() => setLayout('per-document')}\n />\n <span>\n One file per document\n <span className=\"block text-xs text-muted-foreground\">\n Numbering carries on from one file to the next.\n </span>\n </span>\n </label>\n </fieldset>\n\n <div className=\"grid grid-cols-3 gap-2 text-sm\">\n <label className=\"space-y-1\">\n Prefix\n <input\n data-testid=\"production-prefix\"\n className=\"h-8 w-full rounded-md border border-input bg-background px-2\"\n value={prefix}\n maxLength={MAX_PREFIX}\n disabled={busy}\n onChange={(e) => setPrefix(e.target.value)}\n />\n </label>\n <label className=\"space-y-1\">\n Start at\n <input\n data-testid=\"production-start\"\n type=\"number\"\n min={0}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2\"\n value={start}\n disabled={busy}\n onChange={(e) => setStart(e.target.valueAsNumber)}\n />\n </label>\n <label className=\"space-y-1\">\n Digits\n <input\n data-testid=\"production-digits\"\n type=\"number\"\n min={1}\n max={12}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2\"\n value={digits}\n disabled={busy}\n onChange={(e) => setDigits(e.target.valueAsNumber)}\n />\n </label>\n </div>\n\n <label className=\"flex items-center gap-2 text-sm\">\n Label position\n <select\n data-testid=\"production-corner\"\n className=\"h-8 rounded-md border border-input bg-background px-2\"\n value={corner}\n disabled={busy}\n onChange={(e) => setCorner(e.target.value as ProductionCorner)}\n >\n <option value=\"bottom-right\">Bottom right</option>\n <option value=\"bottom-left\">Bottom left</option>\n <option value=\"top-right\">Top right</option>\n <option value=\"top-left\">Top left</option>\n </select>\n </label>\n\n <label className=\"flex items-start gap-2 text-sm\">\n <input\n type=\"checkbox\"\n data-testid=\"production-qr\"\n checked={qr}\n disabled={busy}\n onChange={(e) => setQr(e.target.checked)}\n />\n <span>\n QR code on every page\n <span className=\"block text-xs text-muted-foreground\">\n Opens the document in ARBI for anyone with access.\n </span>\n </span>\n </label>\n\n <label className=\"flex items-start gap-2 text-sm\">\n <input\n type=\"checkbox\"\n data-testid=\"production-index\"\n checked={indexPage}\n disabled={busy}\n onChange={(e) => setIndexPage(e.target.checked)}\n />\n <span>\n Index page at the start\n <span className=\"block text-xs text-muted-foreground\">\n Lists every document with its Bates range. The index itself is not numbered.\n </span>\n </span>\n </label>\n\n <label className=\"flex items-start gap-2 text-sm\">\n <input\n type=\"checkbox\"\n data-testid=\"production-save\"\n checked={saveToWorkspace}\n disabled={busy}\n onChange={(e) => setSaveToWorkspace(e.target.checked)}\n />\n <span>\n Save to workspace\n <span className=\"block text-xs text-muted-foreground\">\n {layout === 'merged'\n ? 'Adds the merged PDF to the Productions folder, so it can be shared or emailed.'\n : 'Adds each numbered file to a folder under Productions, so they can be shared or emailed.'}\n </span>\n </span>\n </label>\n\n {valid && (\n <p className=\"text-sm\" data-testid=\"production-preview\">\n First label:{' '}\n <span className=\"font-mono\">{previewLabel({ prefix, start, digits })}</span>\n </p>\n )}\n {busy && progress && (\n <p className=\"text-sm\" role=\"status\" data-testid=\"production-progress\">\n Document {progress.done} of {progress.total}…\n </p>\n )}\n {error && (\n <p className=\"text-sm text-destructive\" role=\"alert\" data-testid=\"production-error\">\n {error}\n </p>\n )}\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => onOpenChange(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n data-testid=\"production-confirm\"\n disabled={busy || !valid || ordered.length === 0}\n onClick={() =>\n onConfirm({\n layout,\n prefix,\n start,\n digits,\n corner,\n qr,\n indexPage,\n saveToWorkspace,\n order: ordered.map((d) => d.id),\n })\n }\n >\n {busy ? 'Working…' : 'Create production'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"]}