@arbidocs/react 0.5.111 → 0.5.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/XlsxViewer.tsx"],
4
+ "sourcesContent": ["/**\n * XlsxViewer\n *\n * Renders spreadsheets natively using SheetJS, showing every sheet with a tab\n * bar. Preserves cell data and multiple sheets.\n *\n * `xlsx` is an OPTIONAL peer dependency, imported dynamically \u2014 a consumer that\n * never renders a spreadsheet does not need it installed. If it is missing the\n * viewer shows a load error rather than crashing the app.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { WorkSheet } from 'xlsx'\n\nexport interface XlsxViewerProps {\n blob: Blob\n}\n\ntype WorkbookRef = {\n SheetNames: string[]\n Sheets: Record<string, WorkSheet>\n}\n\nexport function XlsxViewer({ blob }: XlsxViewerProps) {\n const [sheets, setSheets] = useState<string[]>([])\n const [activeSheet, setActiveSheet] = useState<string>('')\n const [rows, setRows] = useState<unknown[][]>([])\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const workbookRef = useRef<WorkbookRef | null>(null)\n\n const renderSheet = async (sheetName: string, wb: WorkbookRef) => {\n const XLSX = await import('xlsx')\n const sheet = wb.Sheets[sheetName]\n const data = XLSX.utils.sheet_to_json<unknown[]>(sheet, { header: 1, defval: '' })\n setRows(data)\n setActiveSheet(sheetName)\n }\n\n useEffect(() => {\n let cancelled = false\n\n blob\n .arrayBuffer()\n .then(async (buffer) => {\n if (cancelled) return\n const XLSX = await import('xlsx')\n const wb = XLSX.read(buffer, { type: 'array' }) as WorkbookRef\n workbookRef.current = wb\n const sheetNames = wb.SheetNames\n setSheets(sheetNames)\n const data = XLSX.utils.sheet_to_json<unknown[]>(wb.Sheets[sheetNames[0]], {\n header: 1,\n defval: '',\n })\n if (!cancelled) {\n setRows(data)\n setActiveSheet(sheetNames[0])\n setIsLoading(false)\n }\n })\n .catch((err) => {\n if (!cancelled) {\n console.error('XlsxViewer error:', err)\n setError('Failed to render spreadsheet')\n setIsLoading(false)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [blob])\n\n const handleSheetChange = (sheetName: string) => {\n if (workbookRef.current) {\n renderSheet(sheetName, workbookRef.current)\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-sm text-muted-foreground\">Loading spreadsheet...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-destructive\">{error}</div>\n </div>\n )\n }\n\n // Find max columns across all rows for consistent table width\n const colCount = rows.reduce((max, row) => Math.max(max, (row as unknown[]).length), 0)\n\n return (\n <div\n className=\"w-full h-full flex flex-col overflow-hidden bg-background\"\n data-testid=\"xlsx-viewer\"\n >\n {/* Sheet tabs */}\n {sheets.length > 0 && (\n <div className=\"flex-shrink-0 flex items-center gap-0.5 px-2 pt-1 border-b bg-muted overflow-x-auto\">\n {sheets.map((sheet) => (\n <button\n key={sheet}\n onClick={() => handleSheetChange(sheet)}\n className={`px-3 py-1 text-sm font-medium whitespace-nowrap rounded-t transition-colors border-x border-t ${\n sheet === activeSheet\n ? 'bg-background text-primary border-border'\n : 'bg-muted text-muted-foreground border-transparent hover:bg-muted hover:text-foreground'\n }`}\n >\n {sheet}\n </button>\n ))}\n </div>\n )}\n\n {/* Spreadsheet table */}\n <div className=\"flex-1 overflow-auto\">\n <table className=\"text-sm border-collapse min-w-full\">\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr\n key={rowIdx}\n className={rowIdx === 0 ? 'bg-muted font-semibold sticky top-0' : 'hover:bg-accent'}\n >\n {/* Row number gutter */}\n <td className=\"border border-border px-1 text-center text-muted-foreground bg-muted select-none w-8 min-w-[2rem]\">\n {rowIdx + 1}\n </td>\n {Array.from({ length: colCount }).map((_, colIdx) => (\n <td\n key={colIdx}\n className=\"border border-border px-2 py-0.5 whitespace-nowrap max-w-[200px] overflow-hidden text-ellipsis\"\n title={String((row as unknown[])[colIdx] ?? '')}\n >\n {String((row as unknown[])[colIdx] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length === 0 && (\n <div className=\"flex items-center justify-center p-8 text-sm text-muted-foreground\">\n Empty sheet\n </div>\n )}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,272 +1,62 @@
1
- export { PdfViewer, pdfViewerChunk } from '../chunk-L2IPPTVC.js';
2
- export { INITIAL_LAZY_LOAD_BUFFER, LAZY_LOAD_BUFFER_AFTER, LAZY_LOAD_BUFFER_BEFORE, MAX_ZOOM, MIN_ZOOM, PAGE_SELECTOR, anchorDelta, anchoredScroll, clampZoom, cycleZoom, doubleTapZoom, pinchZoom, renderDpr, usePageIntersectionObserver, usePinchZoom, useScrollAnchor, zoomLabel } from '../chunk-6QNBSXCE.js';
3
- export { installPdfjsPolyfills } from '../chunk-PTOP7OHG.js';
4
- export { AudioViewer, ImageViewer, VideoViewer } from '../chunk-HDCRPPBW.js';
5
- import '../chunk-SSXFVWCT.js';
6
- import { useRef, useState, useEffect, useLayoutEffect, useMemo } from 'react';
7
- import { jsxs, jsx } from 'react/jsx-runtime';
8
-
9
- function measureContentWidth(container) {
10
- let pageWidth = 0;
11
- container.querySelectorAll("section.docx").forEach((section) => {
12
- pageWidth = Math.max(pageWidth, section.offsetWidth);
13
- });
14
- if (pageWidth === 0) return 0;
15
- const wrapper = container.querySelector(".docx-wrapper");
16
- if (wrapper) {
17
- const style = window.getComputedStyle(wrapper);
18
- pageWidth += (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
19
- }
20
- return pageWidth;
21
- }
22
- function DocxViewer({ blob }) {
23
- const outerRef = useRef(null);
24
- const containerRef = useRef(null);
25
- const [error, setError] = useState(null);
26
- const [isLoading, setIsLoading] = useState(true);
27
- const [containerWidth, setContainerWidth] = useState(0);
28
- const [contentWidth, setContentWidth] = useState(0);
29
- useEffect(() => {
30
- const outer = outerRef.current;
31
- if (!outer) return;
32
- const updateWidth = () => setContainerWidth(outer.clientWidth);
33
- updateWidth();
34
- const resizeObserver = new ResizeObserver(updateWidth);
35
- resizeObserver.observe(outer);
36
- return () => resizeObserver.disconnect();
37
- }, []);
38
- useEffect(() => {
39
- const container = containerRef.current;
40
- if (!container) return;
41
- let cancelled = false;
42
- setIsLoading(true);
43
- setError(null);
44
- setContentWidth(0);
45
- container.innerHTML = "";
46
- import('docx-preview').then(({ renderAsync }) => {
47
- if (cancelled) return;
48
- return renderAsync(blob, container, void 0, {
49
- ignoreLastRenderedPageBreak: false
50
- });
51
- }).then(() => {
52
- if (!cancelled) setIsLoading(false);
53
- }).catch((err) => {
54
- if (!cancelled) {
55
- console.error("DocxViewer render error:", err);
56
- setError("Failed to render document");
57
- setIsLoading(false);
58
- }
59
- });
60
- return () => {
61
- cancelled = true;
62
- };
63
- }, [blob]);
64
- useLayoutEffect(() => {
65
- const container = containerRef.current;
66
- if (isLoading || error || !container) return;
67
- setContentWidth(measureContentWidth(container));
68
- }, [isLoading, error]);
69
- const scale = containerWidth > 0 && contentWidth > 0 ? Math.min(1, containerWidth / contentWidth) : 1;
70
- return /* @__PURE__ */ jsxs("div", { ref: outerRef, className: "w-full h-full overflow-auto bg-muted", "data-testid": "docx-viewer", children: [
71
- isLoading && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading document..." }) }),
72
- error && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx("div", { className: "text-destructive", children: error }) }),
73
- /* @__PURE__ */ jsx(
74
- "div",
75
- {
76
- ref: containerRef,
77
- "data-testid": "docx-viewer-body",
78
- className: `docx-viewer-body${isLoading || error ? " hidden" : ""}`,
79
- style: { zoom: scale }
80
- }
81
- )
82
- ] });
83
- }
84
- function XlsxViewer({ blob }) {
85
- const [sheets, setSheets] = useState([]);
86
- const [activeSheet, setActiveSheet] = useState("");
87
- const [rows, setRows] = useState([]);
88
- const [error, setError] = useState(null);
89
- const [isLoading, setIsLoading] = useState(true);
90
- const workbookRef = useRef(null);
91
- const renderSheet = async (sheetName, wb) => {
92
- const XLSX = await import('xlsx');
93
- const sheet = wb.Sheets[sheetName];
94
- const data = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: "" });
95
- setRows(data);
96
- setActiveSheet(sheetName);
97
- };
98
- useEffect(() => {
99
- let cancelled = false;
100
- blob.arrayBuffer().then(async (buffer) => {
101
- if (cancelled) return;
102
- const XLSX = await import('xlsx');
103
- const wb = XLSX.read(buffer, { type: "array" });
104
- workbookRef.current = wb;
105
- const sheetNames = wb.SheetNames;
106
- setSheets(sheetNames);
107
- const data = XLSX.utils.sheet_to_json(wb.Sheets[sheetNames[0]], {
108
- header: 1,
109
- defval: ""
110
- });
111
- if (!cancelled) {
112
- setRows(data);
113
- setActiveSheet(sheetNames[0]);
114
- setIsLoading(false);
115
- }
116
- }).catch((err) => {
117
- if (!cancelled) {
118
- console.error("XlsxViewer error:", err);
119
- setError("Failed to render spreadsheet");
120
- setIsLoading(false);
121
- }
122
- });
123
- return () => {
124
- cancelled = true;
125
- };
126
- }, [blob]);
127
- const handleSheetChange = (sheetName) => {
128
- if (workbookRef.current) {
129
- renderSheet(sheetName, workbookRef.current);
130
- }
131
- };
132
- if (isLoading) {
133
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading spreadsheet..." }) });
134
- }
135
- if (error) {
136
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsx("div", { className: "text-destructive", children: error }) });
137
- }
138
- const colCount = rows.reduce((max, row) => Math.max(max, row.length), 0);
139
- return /* @__PURE__ */ jsxs(
140
- "div",
141
- {
142
- className: "w-full h-full flex flex-col overflow-hidden bg-background",
143
- "data-testid": "xlsx-viewer",
144
- children: [
145
- sheets.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 flex items-center gap-0.5 px-2 pt-1 border-b bg-muted overflow-x-auto", children: sheets.map((sheet) => /* @__PURE__ */ jsx(
146
- "button",
147
- {
148
- onClick: () => handleSheetChange(sheet),
149
- className: `px-3 py-1 text-sm font-medium whitespace-nowrap rounded-t transition-colors border-x border-t ${sheet === activeSheet ? "bg-background text-primary border-border" : "bg-muted text-muted-foreground border-transparent hover:bg-muted hover:text-foreground"}`,
150
- children: sheet
151
- },
152
- sheet
153
- )) }),
154
- /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-auto", children: [
155
- /* @__PURE__ */ jsx("table", { className: "text-sm border-collapse min-w-full", children: /* @__PURE__ */ jsx("tbody", { children: rows.map((row, rowIdx) => /* @__PURE__ */ jsxs(
156
- "tr",
157
- {
158
- className: rowIdx === 0 ? "bg-muted font-semibold sticky top-0" : "hover:bg-accent",
159
- children: [
160
- /* @__PURE__ */ jsx("td", { className: "border border-border px-1 text-center text-muted-foreground bg-muted select-none w-8 min-w-[2rem]", children: rowIdx + 1 }),
161
- Array.from({ length: colCount }).map((_, colIdx) => /* @__PURE__ */ jsx(
162
- "td",
163
- {
164
- className: "border border-border px-2 py-0.5 whitespace-nowrap max-w-[200px] overflow-hidden text-ellipsis",
165
- title: String(row[colIdx] ?? ""),
166
- children: String(row[colIdx] ?? "")
167
- },
168
- colIdx
169
- ))
170
- ]
171
- },
172
- rowIdx
173
- )) }) }),
174
- rows.length === 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-8 text-sm text-muted-foreground", children: "Empty sheet" })
175
- ] })
176
- ]
177
- }
178
- );
179
- }
180
- function inlineFootnotes(content, footnotes) {
181
- if (!footnotes || Object.keys(footnotes).length === 0) return content;
182
- let result = content;
183
- result = result.replace(/^\[\^[^\]]+\]:[ \t]+.*(?:\n(?:[ \t]+.+)?)*/gm, "");
184
- result = result.replace(/\[\^([^\]]+)\]/g, (_match, key) => {
185
- const fnContent = footnotes[key];
186
- if (!fnContent) return `<sup class="fn-ref">${key}</sup>`;
187
- const escaped = fnContent.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
188
- return `<sup class="fn-ref">${key}</sup><span class="fn-inline" title="${escaped}">[${escaped}]</span>`;
189
- });
190
- return result.trim();
191
- }
192
- function useProcessedChunks(chunks, footnotes) {
193
- return useMemo(() => {
194
- if (!chunks || chunks.length === 0) {
195
- return { processedChunks: [], maxPageNumber: 0 };
196
- }
197
- const hasFootnotes = footnotes && Object.keys(footnotes).length > 0;
198
- const chunksByPage = [];
199
- let currentPageNumber = -1;
200
- let currentPageChunks = [];
201
- let maxPageNumber = 0;
202
- chunks.forEach((chunk) => {
203
- const pageNum = chunk.metadata?.page_number;
204
- if (pageNum && pageNum > maxPageNumber) {
205
- maxPageNumber = pageNum;
206
- }
207
- if (pageNum !== currentPageNumber) {
208
- if (currentPageChunks.length > 0) {
209
- chunksByPage.push({
210
- pageNumber: currentPageNumber > 0 ? currentPageNumber : null,
211
- chunks: currentPageChunks
212
- });
213
- }
214
- currentPageNumber = pageNum ?? -1;
215
- currentPageChunks = [];
216
- }
217
- currentPageChunks.push({
218
- content: hasFootnotes ? inlineFootnotes(chunk.content, footnotes) : chunk.content,
219
- chunkIndex: chunk.metadata?.chunk_doc_idx,
220
- chunkExtId: chunk.metadata?.chunk_ext_id,
221
- docTitle: chunk.metadata?.doc_title ?? void 0
222
- });
223
- });
224
- if (currentPageChunks.length > 0) {
225
- chunksByPage.push({
226
- pageNumber: currentPageNumber > 0 ? currentPageNumber : null,
227
- chunks: currentPageChunks
228
- });
229
- }
230
- return { processedChunks: chunksByPage, maxPageNumber };
231
- }, [chunks, footnotes]);
232
- }
233
-
234
- // src/viewers/selection-runs.ts
235
- function computeSelectionRuns(pages, selectedChunks) {
236
- const runs = /* @__PURE__ */ new Map();
237
- if (selectedChunks.size === 0) return runs;
238
- const flat = pages.flatMap(
239
- (page) => page.chunks.map((c) => ({ ...c, pageNumber: page.pageNumber }))
240
- );
241
- let i = 0;
242
- while (i < flat.length) {
243
- const chunk = flat[i];
244
- if (!chunk.chunkExtId || !selectedChunks.has(chunk.chunkExtId)) {
245
- i += 1;
246
- continue;
247
- }
248
- let end = i;
249
- while (end + 1 < flat.length && flat[end + 1].chunkExtId && selectedChunks.has(flat[end + 1].chunkExtId)) {
250
- end += 1;
251
- }
252
- const last = flat[end];
253
- const endIndex = last.chunkIndex !== void 0 ? last.chunkIndex + 1 : void 0;
254
- for (let k = i; k <= end; k += 1) {
255
- const id = flat[k].chunkExtId;
256
- if (!id) continue;
257
- runs.set(id, {
258
- isStart: k === i,
259
- isEnd: k === end,
260
- // Only the run's first member carries the label bounds.
261
- endIndex: k === i ? endIndex : void 0,
262
- endPage: k === i ? last.pageNumber : void 0
263
- });
264
- }
265
- i = end + 1;
266
- }
267
- return runs;
268
- }
269
-
270
- export { DocxViewer, XlsxViewer, computeSelectionRuns, useProcessedChunks };
1
+ import { PdfViewer, pdfViewerChunk } from "./PdfViewer.js";
2
+ import { installPdfjsPolyfills } from "./pdfjs-polyfills.js";
3
+ import { DocxViewer } from "./DocxViewer.js";
4
+ import { XlsxViewer } from "./XlsxViewer.js";
5
+ import { ImageViewer } from "./ImageViewer.js";
6
+ import { AudioViewer } from "./AudioViewer.js";
7
+ import { VideoViewer } from "./VideoViewer.js";
8
+ import {
9
+ MIN_ZOOM,
10
+ MAX_ZOOM,
11
+ clampZoom,
12
+ cycleZoom,
13
+ doubleTapZoom,
14
+ zoomLabel,
15
+ pinchZoom,
16
+ anchoredScroll,
17
+ renderDpr,
18
+ usePinchZoom
19
+ } from "./viewer-zoom.js";
20
+ import { PAGE_SELECTOR, anchorDelta, useScrollAnchor } from "./page-scroll.js";
21
+ import { usePageIntersectionObserver } from "./usePageIntersectionObserver.js";
22
+ import {
23
+ LAZY_LOAD_BUFFER_BEFORE,
24
+ LAZY_LOAD_BUFFER_AFTER,
25
+ INITIAL_LAZY_LOAD_BUFFER
26
+ } from "./pdf-viewer-constants.js";
27
+ import {
28
+ useProcessedChunks
29
+ } from "./useProcessedChunks.js";
30
+ import {
31
+ computeSelectionRuns
32
+ } from "./selection-runs.js";
33
+ export {
34
+ AudioViewer,
35
+ DocxViewer,
36
+ INITIAL_LAZY_LOAD_BUFFER,
37
+ ImageViewer,
38
+ LAZY_LOAD_BUFFER_AFTER,
39
+ LAZY_LOAD_BUFFER_BEFORE,
40
+ MAX_ZOOM,
41
+ MIN_ZOOM,
42
+ PAGE_SELECTOR,
43
+ PdfViewer,
44
+ VideoViewer,
45
+ XlsxViewer,
46
+ anchorDelta,
47
+ anchoredScroll,
48
+ clampZoom,
49
+ computeSelectionRuns,
50
+ cycleZoom,
51
+ doubleTapZoom,
52
+ installPdfjsPolyfills,
53
+ pdfViewerChunk,
54
+ pinchZoom,
55
+ renderDpr,
56
+ usePageIntersectionObserver,
57
+ usePinchZoom,
58
+ useProcessedChunks,
59
+ useScrollAnchor,
60
+ zoomLabel
61
+ };
271
62
  //# sourceMappingURL=index.js.map
272
- //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/viewers/DocxViewer.tsx","../../src/viewers/XlsxViewer.tsx","../../src/viewers/useProcessedChunks.ts","../../src/viewers/selection-runs.ts"],"names":["useState","useRef","useEffect","jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * DocxViewer\n *\n * Renders DOCX files natively using docx-preview, preserving track changes\n * (shown as strikethrough deletions + inserted text) and inline comments.\n *\n * Pages render at their natural width and are scaled down to fit the\n * container, so the document resizes with the panel instead of clipping.\n *\n * `docx-preview` is an OPTIONAL peer dependency, imported dynamically — a\n * consumer that never renders a .docx does not need it installed. If it is\n * missing the viewer shows a load error rather than crashing the app.\n */\n\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nexport interface DocxViewerProps {\n blob: Blob\n}\n\n/** Natural width of the rendered document: widest page plus wrapper padding. */\nfunction measureContentWidth(container: HTMLElement): number {\n let pageWidth = 0\n container.querySelectorAll<HTMLElement>('section.docx').forEach((section) => {\n pageWidth = Math.max(pageWidth, section.offsetWidth)\n })\n if (pageWidth === 0) return 0\n\n const wrapper = container.querySelector<HTMLElement>('.docx-wrapper')\n if (wrapper) {\n const style = window.getComputedStyle(wrapper)\n pageWidth += (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n }\n return pageWidth\n}\n\nexport function DocxViewer({ blob }: DocxViewerProps) {\n const outerRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [containerWidth, setContainerWidth] = useState(0)\n const [contentWidth, setContentWidth] = useState(0)\n\n // Track container width so the document rescales when the panel is resized\n useEffect(() => {\n const outer = outerRef.current\n if (!outer) return\n\n const updateWidth = () => setContainerWidth(outer.clientWidth)\n updateWidth()\n\n const resizeObserver = new ResizeObserver(updateWidth)\n resizeObserver.observe(outer)\n return () => resizeObserver.disconnect()\n }, [])\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n let cancelled = false\n\n setIsLoading(true)\n setError(null)\n setContentWidth(0)\n container.innerHTML = ''\n\n import('docx-preview')\n .then(({ renderAsync }) => {\n if (cancelled) return\n return renderAsync(blob, container, undefined, {\n ignoreLastRenderedPageBreak: false,\n })\n })\n .then(() => {\n if (!cancelled) setIsLoading(false)\n })\n .catch((err) => {\n if (!cancelled) {\n console.error('DocxViewer render error:', err)\n setError('Failed to render document')\n setIsLoading(false)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [blob])\n\n // Measure after the body is unhidden — offsetWidth is 0 while `hidden` (display: none)\n useLayoutEffect(() => {\n const container = containerRef.current\n if (isLoading || error || !container) return\n setContentWidth(measureContentWidth(container))\n }, [isLoading, error])\n\n const scale =\n containerWidth > 0 && contentWidth > 0 ? Math.min(1, containerWidth / contentWidth) : 1\n\n return (\n <div ref={outerRef} className=\"w-full h-full overflow-auto bg-muted\" data-testid=\"docx-viewer\">\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-sm text-muted-foreground\">Loading document...</div>\n </div>\n )}\n {error && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-destructive\">{error}</div>\n </div>\n )}\n <div\n ref={containerRef}\n data-testid=\"docx-viewer-body\"\n className={`docx-viewer-body${isLoading || error ? ' hidden' : ''}`}\n style={{ zoom: scale }}\n />\n </div>\n )\n}\n","/**\n * XlsxViewer\n *\n * Renders spreadsheets natively using SheetJS, showing every sheet with a tab\n * bar. Preserves cell data and multiple sheets.\n *\n * `xlsx` is an OPTIONAL peer dependency, imported dynamically — a consumer that\n * never renders a spreadsheet does not need it installed. If it is missing the\n * viewer shows a load error rather than crashing the app.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { WorkSheet } from 'xlsx'\n\nexport interface XlsxViewerProps {\n blob: Blob\n}\n\ntype WorkbookRef = {\n SheetNames: string[]\n Sheets: Record<string, WorkSheet>\n}\n\nexport function XlsxViewer({ blob }: XlsxViewerProps) {\n const [sheets, setSheets] = useState<string[]>([])\n const [activeSheet, setActiveSheet] = useState<string>('')\n const [rows, setRows] = useState<unknown[][]>([])\n const [error, setError] = useState<string | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const workbookRef = useRef<WorkbookRef | null>(null)\n\n const renderSheet = async (sheetName: string, wb: WorkbookRef) => {\n const XLSX = await import('xlsx')\n const sheet = wb.Sheets[sheetName]\n const data = XLSX.utils.sheet_to_json<unknown[]>(sheet, { header: 1, defval: '' })\n setRows(data)\n setActiveSheet(sheetName)\n }\n\n useEffect(() => {\n let cancelled = false\n\n blob\n .arrayBuffer()\n .then(async (buffer) => {\n if (cancelled) return\n const XLSX = await import('xlsx')\n const wb = XLSX.read(buffer, { type: 'array' }) as WorkbookRef\n workbookRef.current = wb\n const sheetNames = wb.SheetNames\n setSheets(sheetNames)\n const data = XLSX.utils.sheet_to_json<unknown[]>(wb.Sheets[sheetNames[0]], {\n header: 1,\n defval: '',\n })\n if (!cancelled) {\n setRows(data)\n setActiveSheet(sheetNames[0])\n setIsLoading(false)\n }\n })\n .catch((err) => {\n if (!cancelled) {\n console.error('XlsxViewer error:', err)\n setError('Failed to render spreadsheet')\n setIsLoading(false)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [blob])\n\n const handleSheetChange = (sheetName: string) => {\n if (workbookRef.current) {\n renderSheet(sheetName, workbookRef.current)\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-sm text-muted-foreground\">Loading spreadsheet...</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-destructive\">{error}</div>\n </div>\n )\n }\n\n // Find max columns across all rows for consistent table width\n const colCount = rows.reduce((max, row) => Math.max(max, (row as unknown[]).length), 0)\n\n return (\n <div\n className=\"w-full h-full flex flex-col overflow-hidden bg-background\"\n data-testid=\"xlsx-viewer\"\n >\n {/* Sheet tabs */}\n {sheets.length > 0 && (\n <div className=\"flex-shrink-0 flex items-center gap-0.5 px-2 pt-1 border-b bg-muted overflow-x-auto\">\n {sheets.map((sheet) => (\n <button\n key={sheet}\n onClick={() => handleSheetChange(sheet)}\n className={`px-3 py-1 text-sm font-medium whitespace-nowrap rounded-t transition-colors border-x border-t ${\n sheet === activeSheet\n ? 'bg-background text-primary border-border'\n : 'bg-muted text-muted-foreground border-transparent hover:bg-muted hover:text-foreground'\n }`}\n >\n {sheet}\n </button>\n ))}\n </div>\n )}\n\n {/* Spreadsheet table */}\n <div className=\"flex-1 overflow-auto\">\n <table className=\"text-sm border-collapse min-w-full\">\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr\n key={rowIdx}\n className={rowIdx === 0 ? 'bg-muted font-semibold sticky top-0' : 'hover:bg-accent'}\n >\n {/* Row number gutter */}\n <td className=\"border border-border px-1 text-center text-muted-foreground bg-muted select-none w-8 min-w-[2rem]\">\n {rowIdx + 1}\n </td>\n {Array.from({ length: colCount }).map((_, colIdx) => (\n <td\n key={colIdx}\n className=\"border border-border px-2 py-0.5 whitespace-nowrap max-w-[200px] overflow-hidden text-ellipsis\"\n title={String((row as unknown[])[colIdx] ?? '')}\n >\n {String((row as unknown[])[colIdx] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length === 0 && (\n <div className=\"flex items-center justify-center p-8 text-sm text-muted-foreground\">\n Empty sheet\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Processed Chunks Hook\n *\n * Processes raw document chunks into page-grouped structure.\n * Pre-computes footnote inlining so it runs once during processing, not on every render.\n */\n\nimport { useMemo } from 'react'\n\nexport interface RawChunk {\n content: string\n metadata?: {\n page_number?: number\n chunk_doc_idx?: number\n chunk_ext_id?: string\n doc_title?: string | null\n }\n}\n\nexport interface ProcessedChunk {\n content: string\n chunkIndex: number | undefined\n chunkExtId: string | undefined\n docTitle: string | undefined\n}\n\nexport interface ProcessedPage {\n pageNumber: number | null\n chunks: ProcessedChunk[]\n}\n\nexport interface UseProcessedChunksResult {\n processedChunks: ProcessedPage[]\n maxPageNumber: number\n}\n\n/**\n * Replace GFM footnote references [^key] with inline footnote content\n * and strip footnote definition blocks from the chunk text.\n * Uses the pre-parsed footnotes map from the backend.\n */\nfunction inlineFootnotes(content: string, footnotes: Record<string, string>): string {\n if (!footnotes || Object.keys(footnotes).length === 0) return content\n\n let result = content\n\n // Strip GFM footnote definition blocks: [^key]: content (and continuation lines)\n result = result.replace(/^\\[\\^[^\\]]+\\]:[ \\t]+.*(?:\\n(?:[ \\t]+.+)?)*/gm, '')\n\n // Replace footnote references [^key] with superscript + inline content\n result = result.replace(/\\[\\^([^\\]]+)\\]/g, (_match, key) => {\n const fnContent = footnotes[key]\n if (!fnContent) return `<sup class=\"fn-ref\">${key}</sup>`\n const escaped = fnContent\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n return `<sup class=\"fn-ref\">${key}</sup><span class=\"fn-inline\" title=\"${escaped}\">[${escaped}]</span>`\n })\n\n return result.trim()\n}\n\nexport function useProcessedChunks(\n chunks: RawChunk[] | undefined,\n footnotes?: Record<string, string>\n): UseProcessedChunksResult {\n return useMemo(() => {\n if (!chunks || chunks.length === 0) {\n return { processedChunks: [], maxPageNumber: 0 }\n }\n\n const hasFootnotes = footnotes && Object.keys(footnotes).length > 0\n const chunksByPage: ProcessedPage[] = []\n let currentPageNumber = -1\n let currentPageChunks: ProcessedChunk[] = []\n let maxPageNumber = 0\n\n chunks.forEach((chunk) => {\n const pageNum = chunk.metadata?.page_number\n\n // Track max page number\n if (pageNum && pageNum > maxPageNumber) {\n maxPageNumber = pageNum\n }\n\n // If page changed, save previous page and start new one\n if (pageNum !== currentPageNumber) {\n if (currentPageChunks.length > 0) {\n chunksByPage.push({\n pageNumber: currentPageNumber > 0 ? currentPageNumber : null,\n chunks: currentPageChunks,\n })\n }\n currentPageNumber = pageNum ?? -1\n currentPageChunks = []\n }\n\n currentPageChunks.push({\n content: hasFootnotes ? inlineFootnotes(chunk.content, footnotes) : chunk.content,\n chunkIndex: chunk.metadata?.chunk_doc_idx,\n chunkExtId: chunk.metadata?.chunk_ext_id,\n docTitle: chunk.metadata?.doc_title ?? undefined,\n })\n })\n\n // Add the last page\n if (currentPageChunks.length > 0) {\n chunksByPage.push({\n pageNumber: currentPageNumber > 0 ? currentPageNumber : null,\n chunks: currentPageChunks,\n })\n }\n\n return { processedChunks: chunksByPage, maxPageNumber }\n }, [chunks, footnotes])\n}\n","/**\n * Contiguous-run grouping for selected passages.\n *\n * Selecting passages 4–9 is one citation, not six. This collapses a flat set of\n * selected chunk ids into the contiguous runs they form in document order, so\n * the viewer can draw each run as a single block with a single \"p.3(4–9)\" label\n * instead of stacking six identical pills.\n *\n * Purely positional: the pages arrive in document order (which is\n * `chunk_doc_idx` order), so adjacency is just \"next in the list\".\n */\n\nexport interface RunChunk {\n chunkExtId: string | undefined\n /** 0-based index within the document; displayed 1-based */\n chunkIndex: number | undefined\n}\n\nexport interface RunPage {\n pageNumber: number | null\n chunks: RunChunk[]\n}\n\n/** Where a selected chunk sits inside its contiguous run of selected chunks. */\nexport interface ChunkRunInfo {\n isStart: boolean\n isEnd: boolean\n /** Set only on the run's first member — the bounds its single label shows. */\n endIndex: number | undefined\n endPage: number | null | undefined\n}\n\nexport function computeSelectionRuns(\n pages: RunPage[],\n selectedChunks: Set<string>\n): Map<string, ChunkRunInfo> {\n const runs = new Map<string, ChunkRunInfo>()\n if (selectedChunks.size === 0) return runs\n\n const flat = pages.flatMap((page) =>\n page.chunks.map((c) => ({ ...c, pageNumber: page.pageNumber }))\n )\n\n let i = 0\n while (i < flat.length) {\n const chunk = flat[i]\n if (!chunk.chunkExtId || !selectedChunks.has(chunk.chunkExtId)) {\n i += 1\n continue\n }\n\n // Walk forward while the neighbours are also selected.\n let end = i\n while (\n end + 1 < flat.length &&\n flat[end + 1].chunkExtId &&\n selectedChunks.has(flat[end + 1].chunkExtId!)\n ) {\n end += 1\n }\n\n const last = flat[end]\n const endIndex = last.chunkIndex !== undefined ? last.chunkIndex + 1 : undefined\n for (let k = i; k <= end; k += 1) {\n const id = flat[k].chunkExtId\n if (!id) continue\n runs.set(id, {\n isStart: k === i,\n isEnd: k === end,\n // Only the run's first member carries the label bounds.\n endIndex: k === i ? endIndex : undefined,\n endPage: k === i ? last.pageNumber : undefined,\n })\n }\n i = end + 1\n }\n\n return runs\n}\n"]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/index.ts"],
4
+ "sourcesContent": ["/**\n * `@arbidocs/react/viewers` \u2014 native document rendering.\n *\n * A SEPARATE ENTRY POINT on purpose. These viewers depend on heavyweight\n * rendering libraries (`react-pdf` + `pdfjs-dist`, `xlsx`, `docx-preview`) that\n * are declared as OPTIONAL peer dependencies, so an app that never renders a\n * PDF or a spreadsheet neither installs nor bundles them. Importing from the\n * root `@arbidocs/react` entry gets you none of this weight.\n *\n * Pair these with `DocumentReview` (root entry) \u2014 that renders parsed chunks\n * with AI citation highlighting; these render the original file as it looks.\n */\n\nexport { PdfViewer, pdfViewerChunk, type PdfViewerProps, type PdfViewerAssets } from './PdfViewer'\nexport { installPdfjsPolyfills } from './pdfjs-polyfills'\nexport { DocxViewer, type DocxViewerProps } from './DocxViewer'\nexport { XlsxViewer, type XlsxViewerProps } from './XlsxViewer'\nexport { ImageViewer, type ImageViewerProps } from './ImageViewer'\nexport { AudioViewer, type AudioViewerProps } from './AudioViewer'\nexport { VideoViewer, type VideoViewerProps } from './VideoViewer'\n\nexport {\n MIN_ZOOM,\n MAX_ZOOM,\n clampZoom,\n cycleZoom,\n doubleTapZoom,\n zoomLabel,\n pinchZoom,\n anchoredScroll,\n renderDpr,\n usePinchZoom,\n} from './viewer-zoom'\nexport { PAGE_SELECTOR, anchorDelta, useScrollAnchor } from './page-scroll'\nexport { usePageIntersectionObserver } from './usePageIntersectionObserver'\nexport {\n LAZY_LOAD_BUFFER_BEFORE,\n LAZY_LOAD_BUFFER_AFTER,\n INITIAL_LAZY_LOAD_BUFFER,\n} from './pdf-viewer-constants'\n\n// Parsed-text viewer helpers: chunks grouped by page (footnotes inlined) and selected passages\n// collapsed into contiguous runs.\nexport {\n useProcessedChunks,\n type RawChunk,\n type ProcessedChunk,\n type ProcessedPage,\n type UseProcessedChunksResult,\n} from './useProcessedChunks'\nexport {\n computeSelectionRuns,\n type RunChunk,\n type RunPage,\n type ChunkRunInfo,\n} from './selection-runs'\n"],
5
+ "mappings": "AAaA,SAAS,WAAW,sBAAiE;AACrF,SAAS,6BAA6B;AACtC,SAAS,kBAAwC;AACjD,SAAS,kBAAwC;AACjD,SAAS,mBAA0C;AACnD,SAAS,mBAA0C;AACnD,SAAS,mBAA0C;AAEnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe,aAAa,uBAAuB;AAC5D,SAAS,mCAAmC;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP;AAAA,EACE;AAAA,OAKK;AACP;AAAA,EACE;AAAA,OAIK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,59 @@
1
+ import { useEffect } from "react";
2
+ const PAGE_SELECTOR = '[role="article"][data-page-number]';
3
+ function anchorDelta(previousHeight, nextHeight, pageTop, containerTop) {
4
+ const delta = nextHeight - previousHeight;
5
+ if (delta === 0) return 0;
6
+ return pageTop + previousHeight <= containerTop + 1 ? delta : 0;
7
+ }
8
+ function measureVisiblePages(pages, viewTop, viewBottom) {
9
+ const visibility = /* @__PURE__ */ new Map();
10
+ let page = null;
11
+ let bestPx = 0;
12
+ let score = 0;
13
+ const viewHeight = viewBottom - viewTop;
14
+ for (const p of pages) {
15
+ const height = p.bottom - p.top;
16
+ const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop);
17
+ if (px <= 0 || height <= 0) continue;
18
+ visibility.set(p.n, px / height);
19
+ if (px > bestPx) {
20
+ bestPx = px;
21
+ page = p.n;
22
+ score = px / Math.min(height, viewHeight);
23
+ }
24
+ }
25
+ return { page, score, visibility };
26
+ }
27
+ function useScrollAnchor(containerRef, key) {
28
+ useEffect(() => {
29
+ const container = containerRef.current;
30
+ if (!container || typeof ResizeObserver === "undefined") return;
31
+ container.style.overflowAnchor = "none";
32
+ const heights = /* @__PURE__ */ new Map();
33
+ const observer = new ResizeObserver((entries) => {
34
+ let shift = 0;
35
+ const containerTop = container.getBoundingClientRect().top;
36
+ for (const entry of entries) {
37
+ const el = entry.target;
38
+ const height = el.getBoundingClientRect().height;
39
+ const previous = heights.get(el);
40
+ heights.set(el, height);
41
+ if (previous === void 0) continue;
42
+ shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop);
43
+ }
44
+ if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift;
45
+ });
46
+ container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {
47
+ heights.set(el, el.getBoundingClientRect().height);
48
+ observer.observe(el);
49
+ });
50
+ return () => observer.disconnect();
51
+ }, [containerRef, key]);
52
+ }
53
+ export {
54
+ PAGE_SELECTOR,
55
+ anchorDelta,
56
+ measureVisiblePages,
57
+ useScrollAnchor
58
+ };
59
+ //# sourceMappingURL=page-scroll.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/page-scroll.ts"],
4
+ "sourcesContent": ["/**\n * Scroll stability for page-stacked viewers (PDF + parsed/HTML).\n *\n * Pages are lazy: their height can change after the user is already looking at something further\n * down (a placeholder replaced by the real page, a late canvas). Browsers that implement scroll\n * anchoring (Chromium) hide that; Safari/WebKit does not, so the content visibly jumps under the\n * finger and momentum scrolling is cut short. The viewers therefore do their own anchoring, the\n * same way on every engine: native anchoring is switched off and a page that changes height\n * entirely ABOVE the viewport shifts `scrollTop` by exactly that change.\n */\n\nimport { useEffect } from 'react'\nimport type { RefObject } from 'react'\n\n/** One page of a stacked viewer (both viewers mark pages like this). */\nexport const PAGE_SELECTOR = '[role=\"article\"][data-page-number]'\n\n/**\n * How far to move `scrollTop` after a page changed height from `previousHeight` to `nextHeight`.\n * Only a page that lay completely above the visible top edge (`containerTop`) pushes the content\n * the user is reading; anything at or below it just grows or shrinks away from the viewport.\n *\n * @param pageTop viewport-relative top of the page (unchanged by its own resize)\n */\nexport function anchorDelta(\n previousHeight: number,\n nextHeight: number,\n pageTop: number,\n containerTop: number\n): number {\n const delta = nextHeight - previousHeight\n if (delta === 0) return 0\n return pageTop + previousHeight <= containerTop + 1 ? delta : 0\n}\n\nexport interface PageBox {\n n: number\n top: number\n bottom: number\n}\n\n/**\n * Which page is being read: the one showing the most pixels inside [viewTop, viewBottom] (the\n * first on a tie). `score` is those pixels relative to the smaller of the page and the viewport,\n * so a page much taller than the screen can still count as \"mostly visible\". `visibility` maps\n * every page that shows any pixel to its visible fraction (for lazy loading).\n */\nexport function measureVisiblePages(\n pages: readonly PageBox[],\n viewTop: number,\n viewBottom: number\n): { page: number | null; score: number; visibility: Map<number, number> } {\n const visibility = new Map<number, number>()\n let page: number | null = null\n let bestPx = 0\n let score = 0\n const viewHeight = viewBottom - viewTop\n for (const p of pages) {\n const height = p.bottom - p.top\n const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop)\n if (px <= 0 || height <= 0) continue\n visibility.set(p.n, px / height)\n if (px > bestPx) {\n bestPx = px\n page = p.n\n score = px / Math.min(height, viewHeight)\n }\n }\n return { page, score, visibility }\n}\n\n/**\n * Keep the reading position when pages above it change height. `key` re-scans for pages when the\n * page set changes (page count, first layout).\n */\nexport function useScrollAnchor(containerRef: RefObject<HTMLElement | null>, key: unknown): void {\n useEffect(() => {\n const container = containerRef.current\n if (!container || typeof ResizeObserver === 'undefined') return\n container.style.overflowAnchor = 'none'\n\n const heights = new Map<Element, number>()\n const observer = new ResizeObserver((entries) => {\n let shift = 0\n const containerTop = container.getBoundingClientRect().top\n for (const entry of entries) {\n const el = entry.target\n const height = el.getBoundingClientRect().height\n const previous = heights.get(el)\n heights.set(el, height)\n if (previous === undefined) continue\n shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop)\n }\n // A zoom change re-anchors the scroll position itself (see usePinchZoom).\n if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift\n })\n container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {\n heights.set(el, el.getBoundingClientRect().height)\n observer.observe(el)\n })\n return () => observer.disconnect()\n }, [containerRef, key])\n}\n"],
5
+ "mappings": "AAWA,SAAS,iBAAiB;AAInB,MAAM,gBAAgB;AAStB,SAAS,YACd,gBACA,YACA,SACA,cACQ;AACR,QAAM,QAAQ,aAAa;AAC3B,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,UAAU,kBAAkB,eAAe,IAAI,QAAQ;AAChE;AAcO,SAAS,oBACd,OACA,SACA,YACyE;AACzE,QAAM,aAAa,oBAAI,IAAoB;AAC3C,MAAI,OAAsB;AAC1B,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,QAAM,aAAa,aAAa;AAChC,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,EAAE,SAAS,EAAE;AAC5B,UAAM,KAAK,KAAK,IAAI,EAAE,QAAQ,UAAU,IAAI,KAAK,IAAI,EAAE,KAAK,OAAO;AACnE,QAAI,MAAM,KAAK,UAAU,EAAG;AAC5B,eAAW,IAAI,EAAE,GAAG,KAAK,MAAM;AAC/B,QAAI,KAAK,QAAQ;AACf,eAAS;AACT,aAAO,EAAE;AACT,cAAQ,KAAK,KAAK,IAAI,QAAQ,UAAU;AAAA,IAC1C;AAAA,EACF;AACA,SAAO,EAAE,MAAM,OAAO,WAAW;AACnC;AAMO,SAAS,gBAAgB,cAA6C,KAAoB;AAC/F,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,aAAa,OAAO,mBAAmB,YAAa;AACzD,cAAU,MAAM,iBAAiB;AAEjC,UAAM,UAAU,oBAAI,IAAqB;AACzC,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,UAAI,QAAQ;AACZ,YAAM,eAAe,UAAU,sBAAsB,EAAE;AACvD,iBAAW,SAAS,SAAS;AAC3B,cAAM,KAAK,MAAM;AACjB,cAAM,SAAS,GAAG,sBAAsB,EAAE;AAC1C,cAAM,WAAW,QAAQ,IAAI,EAAE;AAC/B,gBAAQ,IAAI,IAAI,MAAM;AACtB,YAAI,aAAa,OAAW;AAC5B,iBAAS,YAAY,UAAU,QAAQ,GAAG,sBAAsB,EAAE,KAAK,YAAY;AAAA,MACrF;AAEA,UAAI,UAAU,KAAK,CAAC,UAAU,QAAQ,QAAS,WAAU,aAAa;AAAA,IACxE,CAAC;AACD,cAAU,iBAAiB,aAAa,EAAE,QAAQ,CAAC,OAAO;AACxD,cAAQ,IAAI,IAAI,GAAG,sBAAsB,EAAE,MAAM;AACjD,eAAS,QAAQ,EAAE;AAAA,IACrB,CAAC;AACD,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,cAAc,GAAG,CAAC;AACxB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,9 @@
1
+ const LAZY_LOAD_BUFFER_BEFORE = 2;
2
+ const LAZY_LOAD_BUFFER_AFTER = 5;
3
+ const INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 };
4
+ export {
5
+ INITIAL_LAZY_LOAD_BUFFER,
6
+ LAZY_LOAD_BUFFER_AFTER,
7
+ LAZY_LOAD_BUFFER_BEFORE
8
+ };
9
+ //# sourceMappingURL=pdf-viewer-constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/pdf-viewer-constants.ts"],
4
+ "sourcesContent": ["/** Pages to render before the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_BEFORE = 2\n\n/** Pages to render after the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_AFTER = 5\n\n/**\n * Smaller render window used on the very first paint so time-to-first-visible-page is\n * fast. Expanded to LAZY_LOAD_BUFFER_BEFORE / LAZY_LOAD_BUFFER_AFTER once the browser\n * is idle (via requestIdleCallback / setTimeout fallback).\n */\nexport const INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 }\n"],
5
+ "mappings": "AACO,MAAM,0BAA0B;AAGhC,MAAM,yBAAyB;AAO/B,MAAM,2BAA2B,EAAE,QAAQ,GAAG,OAAO,EAAE;",
6
+ "names": []
7
+ }
@@ -1,9 +1,8 @@
1
- // src/viewers/pdfjs-polyfills.ts
2
1
  function define(target, name, value) {
3
2
  if (typeof target[name] === "function") return;
4
3
  Object.defineProperty(target, name, { value, writable: true, configurable: true });
5
4
  }
6
- var B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
5
+ const B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
7
6
  function toBase64(options) {
8
7
  let out = "";
9
8
  for (let i = 0; i < this.length; i += 3) {
@@ -80,7 +79,7 @@ function installPdfjsPolyfills() {
80
79
  return new Promise((resolve) => resolve(fn(...args)));
81
80
  });
82
81
  }
83
-
84
- export { installPdfjsPolyfills };
85
- //# sourceMappingURL=chunk-PTOP7OHG.js.map
86
- //# sourceMappingURL=chunk-PTOP7OHG.js.map
82
+ export {
83
+ installPdfjsPolyfills
84
+ };
85
+ //# sourceMappingURL=pdfjs-polyfills.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/pdfjs-polyfills.ts"],
4
+ "sourcesContent": ["/**\n * Shims for the newer JS built-ins pdf.js 6 calls on the main thread, which browsers still in use\n * lack (Chrome 128, for one, has none of the first three):\n *\n * - `Map.prototype.getOrInsertComputed` / `getOrInsert`, and the `WeakMap` pair (Chrome 145).\n * Behind every page render: without it \"this[#t].getOrInsertComputed is not a function\" is\n * thrown and nothing draws.\n * - `Uint8Array.prototype.toHex` / `Uint8Array.fromHex` and `toBase64` / `fromBase64` (Chrome\n * 140): document fingerprints, embedded fonts, signatures.\n * - `Math.sumPrecise` (Chrome 147): float accumulation; missing, layout degrades to NaN.\n * - `Promise.try` (Chrome 128): the worker message handler.\n *\n * {@link installPdfjsPolyfills} is called by every code path here that runs pdf.js (the\n * `PdfViewer`, the browser Freeze rasteriser), so a host never has to load them itself. It is a\n * function rather than a side-effect import because this package is `sideEffects: false`: a\n * bundler may drop a bare import, never a call. Each shim steps aside where the runtime has the\n * real method. The pdf.js worker has its own global scope and gets the same set prepended by\n * `arbidocs-copy-pdf-assets` (@arbidocs/blocks).\n */\n\ntype Upsert = {\n getOrInsert(key: unknown, value: unknown): unknown\n getOrInsertComputed(key: unknown, callback: (key: unknown) => unknown): unknown\n}\n\nfunction define(target: object, name: string, value: unknown): void {\n if (typeof (target as Record<string, unknown>)[name] === 'function') return\n Object.defineProperty(target, name, { value, writable: true, configurable: true })\n}\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nfunction toBase64(\n this: Uint8Array,\n options?: { alphabet?: string; omitPadding?: boolean }\n): string {\n let out = ''\n for (let i = 0; i < this.length; i += 3) {\n const n = (this[i] << 16) | ((this[i + 1] ?? 0) << 8) | (this[i + 2] ?? 0)\n out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63]\n out += i + 1 < this.length ? B64[(n >> 6) & 63] : '='\n out += i + 2 < this.length ? B64[n & 63] : '='\n }\n if (options?.alphabet === 'base64url') out = out.replace(/\\+/g, '-').replace(/\\//g, '_')\n return options?.omitPadding ? out.replace(/=+$/, '') : out\n}\n\nfunction fromBase64(input: string, options?: { alphabet?: string }): Uint8Array {\n let s = input.replace(/[\\t\\n\\f\\r ]+/g, '')\n if (options?.alphabet === 'base64url') s = s.replace(/-/g, '+').replace(/_/g, '/')\n s = s.replace(/=+$/, '')\n if (s.length % 4 === 1 || /[^A-Za-z0-9+/]/.test(s)) {\n throw new SyntaxError('Uint8Array.fromBase64: invalid base64')\n }\n const out = new Uint8Array(Math.floor((s.length * 3) / 4))\n let bits = 0\n let acc = 0\n let j = 0\n for (const ch of s) {\n acc = (acc << 6) | B64.indexOf(ch)\n bits += 6\n if (bits >= 8) {\n bits -= 8\n out[j++] = (acc >> bits) & 0xff\n }\n }\n return out\n}\n\n/** Install the shims pdf.js needs on this thread. Idempotent and cheap: call it before using pdf.js. */\nexport function installPdfjsPolyfills(): void {\n for (const proto of [Map.prototype, WeakMap.prototype]) {\n define(proto, 'getOrInsert', function (\n this: Map<unknown, unknown>,\n key: unknown,\n value: unknown\n ) {\n if (!this.has(key)) this.set(key, value)\n return this.get(key)\n } satisfies Upsert['getOrInsert'])\n define(proto, 'getOrInsertComputed', function (\n this: Map<unknown, unknown>,\n key: unknown,\n callback: (key: unknown) => unknown\n ) {\n if (this.has(key)) return this.get(key)\n const value = callback(key)\n this.set(key, value)\n return value\n } satisfies Upsert['getOrInsertComputed'])\n }\n\n define(Uint8Array.prototype, 'toHex', function (this: Uint8Array): string {\n let out = ''\n for (let i = 0; i < this.length; i++) out += this[i].toString(16).padStart(2, '0')\n return out\n })\n define(Uint8Array, 'fromHex', function (hex: string): Uint8Array {\n if (hex.length % 2 !== 0) throw new SyntaxError('Uint8Array.fromHex: odd-length string')\n const out = new Uint8Array(hex.length / 2)\n for (let i = 0; i < out.length; i++) {\n const pair = hex.slice(i * 2, i * 2 + 2)\n if (!/^[0-9a-fA-F]{2}$/.test(pair)) throw new SyntaxError('Uint8Array.fromHex: non-hex digit')\n out[i] = parseInt(pair, 16)\n }\n return out\n })\n define(Uint8Array.prototype, 'toBase64', toBase64)\n define(Uint8Array, 'fromBase64', fromBase64)\n\n // Neumaier's compensated sum: within pdf.js's render tolerance of the spec's exact rounding.\n define(Math, 'sumPrecise', function (values: Iterable<number>): number {\n let sum = 0\n let c = 0\n for (const v of values) {\n const t = sum + v\n c += Math.abs(sum) >= Math.abs(v) ? sum - t + v : v - t + sum\n sum = t\n }\n return sum + c\n })\n\n define(Promise, 'try', function <T>(fn: (...args: unknown[]) => T, ...args: unknown[]) {\n return new Promise<T>((resolve) => resolve(fn(...args)))\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ function computeSelectionRuns(pages, selectedChunks) {
2
+ const runs = /* @__PURE__ */ new Map();
3
+ if (selectedChunks.size === 0) return runs;
4
+ const flat = pages.flatMap(
5
+ (page) => page.chunks.map((c) => ({ ...c, pageNumber: page.pageNumber }))
6
+ );
7
+ let i = 0;
8
+ while (i < flat.length) {
9
+ const chunk = flat[i];
10
+ if (!chunk.chunkExtId || !selectedChunks.has(chunk.chunkExtId)) {
11
+ i += 1;
12
+ continue;
13
+ }
14
+ let end = i;
15
+ while (end + 1 < flat.length && flat[end + 1].chunkExtId && selectedChunks.has(flat[end + 1].chunkExtId)) {
16
+ end += 1;
17
+ }
18
+ const last = flat[end];
19
+ const endIndex = last.chunkIndex !== void 0 ? last.chunkIndex + 1 : void 0;
20
+ for (let k = i; k <= end; k += 1) {
21
+ const id = flat[k].chunkExtId;
22
+ if (!id) continue;
23
+ runs.set(id, {
24
+ isStart: k === i,
25
+ isEnd: k === end,
26
+ // Only the run's first member carries the label bounds.
27
+ endIndex: k === i ? endIndex : void 0,
28
+ endPage: k === i ? last.pageNumber : void 0
29
+ });
30
+ }
31
+ i = end + 1;
32
+ }
33
+ return runs;
34
+ }
35
+ export {
36
+ computeSelectionRuns
37
+ };
38
+ //# sourceMappingURL=selection-runs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/selection-runs.ts"],
4
+ "sourcesContent": ["/**\n * Contiguous-run grouping for selected passages.\n *\n * Selecting passages 4\u20139 is one citation, not six. This collapses a flat set of\n * selected chunk ids into the contiguous runs they form in document order, so\n * the viewer can draw each run as a single block with a single \"p.3(4\u20139)\" label\n * instead of stacking six identical pills.\n *\n * Purely positional: the pages arrive in document order (which is\n * `chunk_doc_idx` order), so adjacency is just \"next in the list\".\n */\n\nexport interface RunChunk {\n chunkExtId: string | undefined\n /** 0-based index within the document; displayed 1-based */\n chunkIndex: number | undefined\n}\n\nexport interface RunPage {\n pageNumber: number | null\n chunks: RunChunk[]\n}\n\n/** Where a selected chunk sits inside its contiguous run of selected chunks. */\nexport interface ChunkRunInfo {\n isStart: boolean\n isEnd: boolean\n /** Set only on the run's first member \u2014 the bounds its single label shows. */\n endIndex: number | undefined\n endPage: number | null | undefined\n}\n\nexport function computeSelectionRuns(\n pages: RunPage[],\n selectedChunks: Set<string>\n): Map<string, ChunkRunInfo> {\n const runs = new Map<string, ChunkRunInfo>()\n if (selectedChunks.size === 0) return runs\n\n const flat = pages.flatMap((page) =>\n page.chunks.map((c) => ({ ...c, pageNumber: page.pageNumber }))\n )\n\n let i = 0\n while (i < flat.length) {\n const chunk = flat[i]\n if (!chunk.chunkExtId || !selectedChunks.has(chunk.chunkExtId)) {\n i += 1\n continue\n }\n\n // Walk forward while the neighbours are also selected.\n let end = i\n while (\n end + 1 < flat.length &&\n flat[end + 1].chunkExtId &&\n selectedChunks.has(flat[end + 1].chunkExtId!)\n ) {\n end += 1\n }\n\n const last = flat[end]\n const endIndex = last.chunkIndex !== undefined ? last.chunkIndex + 1 : undefined\n for (let k = i; k <= end; k += 1) {\n const id = flat[k].chunkExtId\n if (!id) continue\n runs.set(id, {\n isStart: k === i,\n isEnd: k === end,\n // Only the run's first member carries the label bounds.\n endIndex: k === i ? endIndex : undefined,\n endPage: k === i ? last.pageNumber : undefined,\n })\n }\n i = end + 1\n }\n\n return runs\n}\n"],
5
+ "mappings": "AAgCO,SAAS,qBACd,OACA,gBAC2B;AAC3B,QAAM,OAAO,oBAAI,IAA0B;AAC3C,MAAI,eAAe,SAAS,EAAG,QAAO;AAEtC,QAAM,OAAO,MAAM;AAAA,IAAQ,CAAC,SAC1B,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,YAAY,KAAK,WAAW,EAAE;AAAA,EAChE;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,CAAC,MAAM,cAAc,CAAC,eAAe,IAAI,MAAM,UAAU,GAAG;AAC9D,WAAK;AACL;AAAA,IACF;AAGA,QAAI,MAAM;AACV,WACE,MAAM,IAAI,KAAK,UACf,KAAK,MAAM,CAAC,EAAE,cACd,eAAe,IAAI,KAAK,MAAM,CAAC,EAAE,UAAW,GAC5C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,GAAG;AACrB,UAAM,WAAW,KAAK,eAAe,SAAY,KAAK,aAAa,IAAI;AACvE,aAAS,IAAI,GAAG,KAAK,KAAK,KAAK,GAAG;AAChC,YAAM,KAAK,KAAK,CAAC,EAAE;AACnB,UAAI,CAAC,GAAI;AACT,WAAK,IAAI,IAAI;AAAA,QACX,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA;AAAA,QAEb,UAAU,MAAM,IAAI,WAAW;AAAA,QAC/B,SAAS,MAAM,IAAI,KAAK,aAAa;AAAA,MACvC,CAAC;AAAA,IACH;AACA,QAAI,MAAM;AAAA,EACZ;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }