@arbidocs/blocks 0.4.147 → 0.4.150

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 (337) hide show
  1. package/dist/ConnectedNativeDocxComparison-3XQSINPQ.cjs +44 -0
  2. package/dist/ConnectedNativeDocxComparison-3XQSINPQ.cjs.map +1 -0
  3. package/dist/ConnectedNativeDocxComparison-XQSXVGHR.js +35 -0
  4. package/dist/ConnectedNativeDocxComparison-XQSXVGHR.js.map +1 -0
  5. package/dist/ConnectedNativeDocxEditor-IPEZDERL.js +33 -0
  6. package/dist/ConnectedNativeDocxEditor-IPEZDERL.js.map +1 -0
  7. package/dist/ConnectedNativeDocxEditor-OUWFMIPH.cjs +46 -0
  8. package/dist/ConnectedNativeDocxEditor-OUWFMIPH.cjs.map +1 -0
  9. package/dist/ConnectedStreamedWordArtifact-D5LSMDO4.cjs +44 -0
  10. package/dist/ConnectedStreamedWordArtifact-D5LSMDO4.cjs.map +1 -0
  11. package/dist/ConnectedStreamedWordArtifact-UZVNBKQB.js +35 -0
  12. package/dist/ConnectedStreamedWordArtifact-UZVNBKQB.js.map +1 -0
  13. package/dist/FactTextEditor-YESAU2IJ.js +25 -0
  14. package/dist/FactTextEditor-YESAU2IJ.js.map +1 -0
  15. package/dist/FactTextEditor-YUPBCTXK.cjs +27 -0
  16. package/dist/FactTextEditor-YUPBCTXK.cjs.map +1 -0
  17. package/dist/{NativeDocxEditor-BE2OEOTJ.cjs → NativeDocxEditor-5VBNM5I7.cjs} +8 -8
  18. package/dist/{NativeDocxEditor-BE2OEOTJ.cjs.map → NativeDocxEditor-5VBNM5I7.cjs.map} +1 -1
  19. package/dist/{NativeDocxEditor-KOPFMRYW.js → NativeDocxEditor-XT5ZLFGU.js} +4 -4
  20. package/dist/{NativeDocxEditor-KOPFMRYW.js.map → NativeDocxEditor-XT5ZLFGU.js.map} +1 -1
  21. package/dist/agents/index.cjs +265 -266
  22. package/dist/agents/index.js +8 -9
  23. package/dist/calendar/index.cjs +117 -125
  24. package/dist/calendar/index.d.ts +0 -1
  25. package/dist/calendar/index.js +1 -1
  26. package/dist/calls/index.cjs +3 -3
  27. package/dist/calls/index.js +2 -2
  28. package/dist/chat/index.cjs +78 -78
  29. package/dist/chat/index.js +3 -3
  30. package/dist/{chunk-2FL7QJKJ.js → chunk-265GOG4W.js} +3 -3
  31. package/dist/{chunk-2FL7QJKJ.js.map → chunk-265GOG4W.js.map} +1 -1
  32. package/dist/{chunk-VUR63NMQ.js → chunk-3E2F4AHD.js} +8 -8
  33. package/dist/{chunk-VUR63NMQ.js.map → chunk-3E2F4AHD.js.map} +1 -1
  34. package/dist/{chunk-U37AYUPI.cjs → chunk-3FSXWVHW.cjs} +47 -234
  35. package/dist/chunk-3FSXWVHW.cjs.map +1 -0
  36. package/dist/{chunk-IL3WB3YX.cjs → chunk-4JNKXOFZ.cjs} +3 -3
  37. package/dist/{chunk-IL3WB3YX.cjs.map → chunk-4JNKXOFZ.cjs.map} +1 -1
  38. package/dist/{chunk-ODRHHWHY.cjs → chunk-4KMLM3GY.cjs} +4 -4
  39. package/dist/chunk-4KMLM3GY.cjs.map +1 -0
  40. package/dist/{chunk-MHFF5N65.cjs → chunk-757OYF6G.cjs} +4 -38
  41. package/dist/chunk-757OYF6G.cjs.map +1 -0
  42. package/dist/chunk-AXTDDWMR.js +16 -0
  43. package/dist/chunk-AXTDDWMR.js.map +1 -0
  44. package/dist/{chunk-B3AHCIV5.js → chunk-BJ24VPOA.js} +4 -55
  45. package/dist/chunk-BJ24VPOA.js.map +1 -0
  46. package/dist/chunk-C7PTF6BQ.cjs +172 -0
  47. package/dist/chunk-C7PTF6BQ.cjs.map +1 -0
  48. package/dist/{chunk-LZRMXJIE.js → chunk-COA3S3CZ.js} +3 -3
  49. package/dist/{chunk-LZRMXJIE.js.map → chunk-COA3S3CZ.js.map} +1 -1
  50. package/dist/{chunk-SUUPR735.js → chunk-CQPFW64W.js} +5 -5
  51. package/dist/{chunk-SUUPR735.js.map → chunk-CQPFW64W.js.map} +1 -1
  52. package/dist/chunk-D3WFIFRY.cjs +659 -0
  53. package/dist/chunk-D3WFIFRY.cjs.map +1 -0
  54. package/dist/{chunk-QXMR5YHC.js → chunk-DIB4JYUY.js} +19 -3
  55. package/dist/chunk-DIB4JYUY.js.map +1 -0
  56. package/dist/chunk-DVB5ZKOF.js +22 -0
  57. package/dist/chunk-DVB5ZKOF.js.map +1 -0
  58. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  59. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  60. package/dist/chunk-EDV7CYG6.cjs +18 -0
  61. package/dist/chunk-EDV7CYG6.cjs.map +1 -0
  62. package/dist/chunk-FAXXN7KI.cjs +213 -0
  63. package/dist/chunk-FAXXN7KI.cjs.map +1 -0
  64. package/dist/{chunk-2MJWWPHY.js → chunk-G4IYES7G.js} +140 -15
  65. package/dist/chunk-G4IYES7G.js.map +1 -0
  66. package/dist/{chunk-AINU3EJ6.cjs → chunk-GGTUMLCT.cjs} +93 -91
  67. package/dist/chunk-GGTUMLCT.cjs.map +1 -0
  68. package/dist/{chunk-QI6AIHWP.cjs → chunk-GOWXP5KT.cjs} +145 -14
  69. package/dist/chunk-GOWXP5KT.cjs.map +1 -0
  70. package/dist/{chunk-H74HEPKT.js → chunk-HGLC566X.js} +598 -13
  71. package/dist/chunk-HGLC566X.js.map +1 -0
  72. package/dist/{chunk-AO7SK6WP.cjs → chunk-ILM42LE6.cjs} +33 -33
  73. package/dist/{chunk-AO7SK6WP.cjs.map → chunk-ILM42LE6.cjs.map} +1 -1
  74. package/dist/{chunk-LTU35TQN.cjs → chunk-IPQ5MJ4Z.cjs} +636 -31
  75. package/dist/chunk-IPQ5MJ4Z.cjs.map +1 -0
  76. package/dist/{chunk-NRFAWUVD.js → chunk-JAANWQGB.js} +157 -157
  77. package/dist/chunk-JAANWQGB.js.map +1 -0
  78. package/dist/{chunk-7RJTEWYM.js → chunk-JGOST4IL.js} +350 -64
  79. package/dist/chunk-JGOST4IL.js.map +1 -0
  80. package/dist/chunk-KHXEIEXN.js +41 -0
  81. package/dist/chunk-KHXEIEXN.js.map +1 -0
  82. package/dist/chunk-KLPRAQCE.cjs +22 -0
  83. package/dist/chunk-KLPRAQCE.cjs.map +1 -0
  84. package/dist/chunk-KQYPP72K.js +644 -0
  85. package/dist/chunk-KQYPP72K.js.map +1 -0
  86. package/dist/chunk-KUT2Y7JF.cjs +43 -0
  87. package/dist/chunk-KUT2Y7JF.cjs.map +1 -0
  88. package/dist/{chunk-6YTHQ73P.cjs → chunk-LLYZGH3L.cjs} +3 -56
  89. package/dist/chunk-LLYZGH3L.cjs.map +1 -0
  90. package/dist/{chunk-YSHIC4NJ.cjs → chunk-LXTOOUEN.cjs} +159 -154
  91. package/dist/chunk-LXTOOUEN.cjs.map +1 -0
  92. package/dist/{chunk-EVUEIBNU.js → chunk-M4S75AEJ.js} +44 -5
  93. package/dist/chunk-M4S75AEJ.js.map +1 -0
  94. package/dist/{chunk-V5OAXIBN.cjs → chunk-NPR5BGFF.cjs} +11 -11
  95. package/dist/{chunk-V5OAXIBN.cjs.map → chunk-NPR5BGFF.cjs.map} +1 -1
  96. package/dist/{chunk-PLJ7PHWU.cjs → chunk-NS7NVX4E.cjs} +3 -3
  97. package/dist/{chunk-PLJ7PHWU.cjs.map → chunk-NS7NVX4E.cjs.map} +1 -1
  98. package/dist/{chunk-T5I4NRFP.cjs → chunk-NWNAYXC7.cjs} +9 -9
  99. package/dist/{chunk-T5I4NRFP.cjs.map → chunk-NWNAYXC7.cjs.map} +1 -1
  100. package/dist/{chunk-WIZ7Z7FN.js → chunk-Q6N6MZKO.js} +47 -222
  101. package/dist/chunk-Q6N6MZKO.js.map +1 -0
  102. package/dist/{chunk-I2QSDQQV.cjs → chunk-QT3A4PFC.cjs} +21 -2
  103. package/dist/chunk-QT3A4PFC.cjs.map +1 -0
  104. package/dist/{chunk-ZM26YEOT.js → chunk-RY2SODRN.js} +3 -3
  105. package/dist/{chunk-ZM26YEOT.js.map → chunk-RY2SODRN.js.map} +1 -1
  106. package/dist/chunk-SDOEHEJP.js +208 -0
  107. package/dist/chunk-SDOEHEJP.js.map +1 -0
  108. package/dist/{chunk-DETZZBG2.cjs → chunk-SIB6C7P7.cjs} +43 -2
  109. package/dist/chunk-SIB6C7P7.cjs.map +1 -0
  110. package/dist/{chunk-MFY2ZNP6.cjs → chunk-SMN32BQ3.cjs} +4 -4
  111. package/dist/chunk-SMN32BQ3.cjs.map +1 -0
  112. package/dist/chunk-TAWPVD6C.cjs +1956 -0
  113. package/dist/chunk-TAWPVD6C.cjs.map +1 -0
  114. package/dist/chunk-TC25LGIM.js +6584 -0
  115. package/dist/chunk-TC25LGIM.js.map +1 -0
  116. package/dist/{chunk-DAHCRVPM.js → chunk-TL45OJQE.js} +85 -83
  117. package/dist/chunk-TL45OJQE.js.map +1 -0
  118. package/dist/{chunk-AOSUHWIL.js → chunk-TZOQKV64.js} +4 -37
  119. package/dist/chunk-TZOQKV64.js.map +1 -0
  120. package/dist/chunk-UTVY63DG.js +16 -0
  121. package/dist/chunk-UTVY63DG.js.map +1 -0
  122. package/dist/chunk-V4YZXGXR.cjs +6751 -0
  123. package/dist/chunk-V4YZXGXR.cjs.map +1 -0
  124. package/dist/chunk-XRWHFMHK.js +19 -0
  125. package/dist/chunk-XRWHFMHK.js.map +1 -0
  126. package/dist/{chunk-O4YPVYPO.cjs → chunk-YAEXSCUW.cjs} +364 -60
  127. package/dist/chunk-YAEXSCUW.cjs.map +1 -0
  128. package/dist/chunk-YIFCLNII.cjs +18 -0
  129. package/dist/chunk-YIFCLNII.cjs.map +1 -0
  130. package/dist/chunk-Z27QMJ6S.cjs +25 -0
  131. package/dist/chunk-Z27QMJ6S.cjs.map +1 -0
  132. package/dist/{chunk-CSI2B2H5.js → chunk-Z4NQ3TED.js} +4 -4
  133. package/dist/chunk-Z4NQ3TED.js.map +1 -0
  134. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  135. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  136. package/dist/{chunk-DGV7HQA7.js → chunk-ZLEYLCE4.js} +4 -4
  137. package/dist/chunk-ZLEYLCE4.js.map +1 -0
  138. package/dist/chunk-ZNLTEZEF.js +170 -0
  139. package/dist/chunk-ZNLTEZEF.js.map +1 -0
  140. package/dist/chunk-ZO7PJMCO.js +1907 -0
  141. package/dist/chunk-ZO7PJMCO.js.map +1 -0
  142. package/dist/citations/index.cjs +14 -14
  143. package/dist/citations/index.js +2 -2
  144. package/dist/collaboration/index.cjs +36 -36
  145. package/dist/collaboration/index.js +2 -2
  146. package/dist/connect/docx.cjs +23 -28
  147. package/dist/connect/docx.cjs.map +1 -1
  148. package/dist/connect/docx.js +12 -28
  149. package/dist/connect/docx.js.map +1 -1
  150. package/dist/connect/index.cjs +8661 -2823
  151. package/dist/connect/index.cjs.map +1 -1
  152. package/dist/connect/index.d.ts +10 -2
  153. package/dist/connect/index.js +8468 -2671
  154. package/dist/connect/index.js.map +1 -1
  155. package/dist/connect/viewer.cjs +1229 -0
  156. package/dist/connect/viewer.cjs.map +1 -0
  157. package/dist/connect/viewer.d.ts +8 -0
  158. package/dist/connect/viewer.js +1226 -0
  159. package/dist/connect/viewer.js.map +1 -0
  160. package/dist/connection/ConnectedWorkflowsTable.d.ts +2 -12
  161. package/dist/connection/ai.d.ts +2 -9
  162. package/dist/connection/billing/AddAddonDialog.d.ts +24 -0
  163. package/dist/connection/billing/BillingCard.d.ts +18 -0
  164. package/dist/connection/billing/BillingProjectEntity.d.ts +9 -0
  165. package/dist/connection/billing/ChangePlanDialog.d.ts +20 -0
  166. package/dist/connection/billing/ChangeProPlan.d.ts +20 -0
  167. package/dist/connection/billing/CheckoutTotal.d.ts +12 -0
  168. package/dist/connection/billing/DailyCapEditor.d.ts +4 -0
  169. package/dist/connection/billing/InvoicesModal.d.ts +6 -0
  170. package/dist/connection/billing/NewProjectFlow.d.ts +14 -0
  171. package/dist/connection/billing/PlanChangeLines.d.ts +13 -0
  172. package/dist/connection/billing/PlanSelector.d.ts +50 -0
  173. package/dist/connection/billing/ProjectBilling.d.ts +24 -0
  174. package/dist/connection/billing/ProjectDetail.d.ts +16 -0
  175. package/dist/connection/billing/ProjectUsageCard.d.ts +21 -0
  176. package/dist/connection/billing/ProjectUsageContent.d.ts +18 -0
  177. package/dist/connection/billing/ProjectsTable.d.ts +13 -0
  178. package/dist/connection/billing/ReduceAddonDialog.d.ts +18 -0
  179. package/dist/connection/billing/ReferralReward.d.ts +32 -0
  180. package/dist/connection/billing/SharedProjects.d.ts +13 -0
  181. package/dist/connection/billing/StripeCheckoutModal.d.ts +32 -0
  182. package/dist/connection/billing/SubscriptionPlans.d.ts +15 -0
  183. package/dist/connection/billing/SubscriptionStatus.d.ts +10 -0
  184. package/dist/connection/billing/addon-pricing.d.ts +97 -0
  185. package/dist/connection/billing/api-error.d.ts +6 -0
  186. package/dist/connection/billing/billing-country.d.ts +14 -0
  187. package/dist/connection/billing/billing-focus.d.ts +11 -0
  188. package/dist/connection/billing/index.d.ts +22 -0
  189. package/dist/connection/billing/plan-badge.d.ts +15 -0
  190. package/dist/connection/billing/plan-change-outcome.d.ts +15 -0
  191. package/dist/connection/billing/plan-constants.d.ts +29 -0
  192. package/dist/connection/billing/plan-pricing.d.ts +67 -0
  193. package/dist/connection/billing/quota-items.d.ts +33 -0
  194. package/dist/connection/billing/referral-reward.d.ts +28 -0
  195. package/dist/connection/billing/refusal-copy.d.ts +5 -0
  196. package/dist/connection/billing/reward-balance.d.ts +19 -0
  197. package/dist/connection/billing/support.d.ts +35 -0
  198. package/dist/connection/billing/tax-quote.d.ts +36 -0
  199. package/dist/connection/billing/useAddonPurchase.d.ts +32 -0
  200. package/dist/connection/billing/useAutoRefreshPendingProjects.d.ts +11 -0
  201. package/dist/connection/billing/useCheckoutQuote.d.ts +30 -0
  202. package/dist/connection/billing/useOpenBillingPortal.d.ts +12 -0
  203. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +1 -1
  204. package/dist/connection/facts/ConnectedFactsPage.d.ts +50 -0
  205. package/dist/connection/facts/FactMarkdownEditor.d.ts +57 -0
  206. package/dist/connection/facts/FactSourcesPopover.d.ts +38 -0
  207. package/dist/connection/facts/FactTextEditor.d.ts +2 -0
  208. package/dist/connection/facts/factNouns.d.ts +4 -0
  209. package/dist/connection/facts/factPageColumns.d.ts +37 -0
  210. package/dist/connection/facts/types.d.ts +127 -0
  211. package/dist/connection/facts/useFactActions.d.ts +10 -0
  212. package/dist/connection/facts/useFactComposer.d.ts +54 -0
  213. package/dist/connection/facts/useFactFilters.d.ts +101 -0
  214. package/dist/connection/facts/useFactSelection.d.ts +82 -0
  215. package/dist/connection/facts/useFactsGrid.d.ts +87 -0
  216. package/dist/connection/facts/useFactsPageView.d.ts +4 -0
  217. package/dist/connection/mail/ConnectedMailComposer.d.ts +3 -1
  218. package/dist/connection/mail/ConnectedMailbox.d.ts +4 -2
  219. package/dist/connection/mail/MailComposerForm.d.ts +4 -2
  220. package/dist/connection/mail/MailRecipientInput.d.ts +14 -0
  221. package/dist/connection/mail/index.d.ts +1 -1
  222. package/dist/connection/mail/types.d.ts +10 -0
  223. package/dist/connection/search/ConnectedSearchPage.d.ts +64 -0
  224. package/dist/connection/search/SearchResultRows.d.ts +38 -0
  225. package/dist/connection/search/index.d.ts +2 -0
  226. package/dist/connection/tags/ConnectedTagTable.d.ts +108 -0
  227. package/dist/connection/tags/ConnectedTagsPage.d.ts +55 -0
  228. package/dist/connection/tags/DocTagPassages.d.ts +25 -0
  229. package/dist/connection/tags/GlossaryExport.d.ts +7 -0
  230. package/dist/connection/tags/TagCombineFilter.d.ts +14 -0
  231. package/dist/connection/tags/TagPlacement.d.ts +16 -0
  232. package/dist/connection/tags/TagsPageSections.d.ts +36 -0
  233. package/dist/connection/tags/tagCombine.d.ts +55 -0
  234. package/dist/connection/useConnectedWorkNotifications.d.ts +7 -24
  235. package/dist/connection/viewer/ConnectedDocumentToolsProvider.d.ts +11 -0
  236. package/dist/connection/viewer/ConnectedDocumentViewer.d.ts +21 -0
  237. package/dist/connection/viewer/FinaliseTranslationButton.d.ts +15 -0
  238. package/dist/connection/viewer/ViewerPdfPane.d.ts +46 -0
  239. package/dist/connection/viewer/support.d.ts +79 -0
  240. package/dist/connection/viewer/useImageCrop.d.ts +13 -0
  241. package/dist/connection/viewer/useViewedDocument.d.ts +70 -0
  242. package/dist/connection/viewer/useViewerBlobs.d.ts +15 -0
  243. package/dist/connection/viewer/useViewerTabs.d.ts +18 -0
  244. package/dist/connection/viewer/useViewerVersions.d.ts +11 -0
  245. package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +6 -0
  246. package/dist/document-tools/index.cjs +59 -652
  247. package/dist/document-tools/index.cjs.map +1 -1
  248. package/dist/document-tools/index.js +2 -641
  249. package/dist/document-tools/index.js.map +1 -1
  250. package/dist/docx/index.cjs +48 -47
  251. package/dist/docx/index.js +4 -3
  252. package/dist/facts/FactsBulkBar.d.ts +6 -3
  253. package/dist/facts/cited-version-ref.d.ts +1 -0
  254. package/dist/facts/index.cjs +206 -1942
  255. package/dist/facts/index.cjs.map +1 -1
  256. package/dist/facts/index.d.ts +1 -0
  257. package/dist/facts/index.js +15 -1897
  258. package/dist/facts/index.js.map +1 -1
  259. package/dist/files/ViewerChrome.d.ts +5 -4
  260. package/dist/files/ViewerControlBar.d.ts +12 -0
  261. package/dist/files/doc-labels.d.ts +35 -0
  262. package/dist/files/grid/FilterButton.d.ts +12 -0
  263. package/dist/files/grid/RowDensityControl.d.ts +18 -0
  264. package/dist/files/grid/row-density.d.ts +27 -0
  265. package/dist/files/index.cjs +779 -7100
  266. package/dist/files/index.cjs.map +1 -1
  267. package/dist/files/index.d.ts +5 -0
  268. package/dist/files/index.js +14 -6919
  269. package/dist/files/index.js.map +1 -1
  270. package/dist/home/index.cjs +2 -2
  271. package/dist/home/index.js +2 -2
  272. package/dist/index.cjs +1041 -1257
  273. package/dist/index.cjs.map +1 -1
  274. package/dist/index.js +24 -357
  275. package/dist/index.js.map +1 -1
  276. package/dist/retrieval/SearchSnippet.d.ts +6 -0
  277. package/dist/retrieval/index.cjs +75 -42
  278. package/dist/retrieval/index.d.ts +2 -0
  279. package/dist/retrieval/index.js +3 -2
  280. package/dist/retrieval/search-results.d.ts +46 -0
  281. package/dist/settings/Billing.d.ts +0 -66
  282. package/dist/settings/SubscriptionParts.d.ts +1 -50
  283. package/dist/settings/index.cjs +170 -218
  284. package/dist/settings/index.d.ts +3 -2
  285. package/dist/settings/index.js +3 -3
  286. package/dist/settings/inverted-index-filter.d.ts +26 -0
  287. package/dist/shell/index.cjs +2 -2
  288. package/dist/shell/index.js +2 -2
  289. package/dist/studio/index.cjs +5 -5
  290. package/dist/studio/index.js +4 -4
  291. package/dist/tags/definitions.d.ts +10 -0
  292. package/dist/tags/index.d.ts +4 -1
  293. package/dist/tags/page/ExtractEntitiesDialog.d.ts +24 -0
  294. package/dist/tags/page/TagPicker.d.ts +16 -0
  295. package/dist/tags/page/tagsPageLabels.d.ts +36 -0
  296. package/dist/workflow-canvas/index.cjs +21 -22
  297. package/dist/workflow-canvas/index.cjs.map +1 -1
  298. package/dist/workflow-canvas/index.js +8 -9
  299. package/dist/workflow-canvas/index.js.map +1 -1
  300. package/node_modules/@arbidocs/coedit/package.json +1 -1
  301. package/package.json +13 -4
  302. package/dist/calendar/access-setup.d.ts +0 -8
  303. package/dist/chunk-2MJWWPHY.js.map +0 -1
  304. package/dist/chunk-3AFWGEDJ.cjs +0 -53
  305. package/dist/chunk-3AFWGEDJ.cjs.map +0 -1
  306. package/dist/chunk-6YTHQ73P.cjs.map +0 -1
  307. package/dist/chunk-7RJTEWYM.js.map +0 -1
  308. package/dist/chunk-AINU3EJ6.cjs.map +0 -1
  309. package/dist/chunk-AOSUHWIL.js.map +0 -1
  310. package/dist/chunk-B3AHCIV5.js.map +0 -1
  311. package/dist/chunk-CSI2B2H5.js.map +0 -1
  312. package/dist/chunk-DAHCRVPM.js.map +0 -1
  313. package/dist/chunk-DETZZBG2.cjs.map +0 -1
  314. package/dist/chunk-DGV7HQA7.js.map +0 -1
  315. package/dist/chunk-EVUEIBNU.js.map +0 -1
  316. package/dist/chunk-H74HEPKT.js.map +0 -1
  317. package/dist/chunk-I2QSDQQV.cjs.map +0 -1
  318. package/dist/chunk-J5CWKFSC.js +0 -170
  319. package/dist/chunk-J5CWKFSC.js.map +0 -1
  320. package/dist/chunk-LTU35TQN.cjs.map +0 -1
  321. package/dist/chunk-MFY2ZNP6.cjs.map +0 -1
  322. package/dist/chunk-MHFF5N65.cjs.map +0 -1
  323. package/dist/chunk-NRFAWUVD.js.map +0 -1
  324. package/dist/chunk-O4YPVYPO.cjs.map +0 -1
  325. package/dist/chunk-ODRHHWHY.cjs.map +0 -1
  326. package/dist/chunk-QI6AIHWP.cjs.map +0 -1
  327. package/dist/chunk-QXMR5YHC.js.map +0 -1
  328. package/dist/chunk-RFXJYIDV.js +0 -50
  329. package/dist/chunk-RFXJYIDV.js.map +0 -1
  330. package/dist/chunk-U37AYUPI.cjs.map +0 -1
  331. package/dist/chunk-WIZ7Z7FN.js.map +0 -1
  332. package/dist/chunk-XVUOMWMD.cjs +0 -177
  333. package/dist/chunk-XVUOMWMD.cjs.map +0 -1
  334. package/dist/chunk-YSHIC4NJ.cjs.map +0 -1
  335. package/dist/connection/ConnectedTagTable.d.ts +0 -32
  336. package/dist/connection/calendar/CopyField.d.ts +0 -9
  337. package/dist/connection/calendar/OpenAccessPanel.d.ts +0 -7
@@ -2,7 +2,6 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkKPZZ5FHE_cjs = require('./chunk-KPZZ5FHE.cjs');
5
- var chunkKDG6FER6_cjs = require('./chunk-KDG6FER6.cjs');
6
5
  var react = require('react');
7
6
  var lucideReact = require('lucide-react');
8
7
  var ui = require('@arbidocs/react/ui');
@@ -243,168 +242,174 @@ function PassagePill({
243
242
  }
244
243
  );
245
244
  }
246
- function CitationEditor({
247
- value,
248
- citations,
249
- onChange,
250
- activeCitationKey,
251
- onCiteDocument,
252
- citedDocs,
253
- renderDocumentPicker,
254
- autoFocus = false,
255
- "data-testid": dataTestId,
256
- placeholder = "Add a note...",
257
- readOnly = false,
245
+ var DEFAULT_QUIET_MARK_LABELS = {
246
+ openLink: "Open link",
247
+ copyLink: "Copy link",
248
+ linkCopied: "Link copied",
249
+ copyFailed: "Could not copy",
250
+ jumpHere: "Jump to here",
251
+ copyPlaceLink: "Copy link to this place",
252
+ openDocument: "Open document",
253
+ linkMenu: "Link actions",
254
+ bookmarkMenu: "Bookmark actions"
255
+ };
256
+ function useCopyText(labels) {
257
+ const { notify } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
258
+ const done = labels?.linkCopied ?? DEFAULT_QUIET_MARK_LABELS.linkCopied;
259
+ const failed = labels?.copyFailed ?? DEFAULT_QUIET_MARK_LABELS.copyFailed;
260
+ return react.useCallback(
261
+ async (text, message) => {
262
+ try {
263
+ await navigator.clipboard.writeText(text);
264
+ notify(message ?? done, "success");
265
+ return true;
266
+ } catch {
267
+ notify(failed, "error");
268
+ return false;
269
+ }
270
+ },
271
+ [notify, done, failed]
272
+ );
273
+ }
274
+ var LINK_STYLE = {
275
+ external: "text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary",
276
+ document: "text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary",
277
+ // A bookmark is nearly invisible until hovered or focused.
278
+ anchor: "text-inherit underline decoration-dotted decoration-1 decoration-foreground/25 underline-offset-[3px] transition-colors hover:decoration-foreground/70 focus-visible:decoration-foreground/70"
279
+ };
280
+ function scrollToHash(href) {
281
+ const id = href?.startsWith("#") ? decodeURIComponent(href.slice(1)) : "";
282
+ document.getElementById(id)?.scrollIntoView({ behavior: "smooth", block: "start" });
283
+ }
284
+ function QuietLink({
285
+ href,
286
+ kind = "external",
287
+ onOpen,
288
+ placeLink,
289
+ labels,
258
290
  className,
259
- defaultHeight,
260
- onHeightChange
291
+ testId,
292
+ children
261
293
  }) {
262
- const [localValue, setLocalValue] = react.useState(value);
263
- const [isEditing, setIsEditing] = react.useState(autoFocus);
264
- const textareaRef = react.useRef(null);
265
- const debounceRef = react.useRef(null);
266
- react.useEffect(() => {
267
- if (!isEditing) {
268
- setLocalValue(value);
294
+ const l = { ...DEFAULT_QUIET_MARK_LABELS, ...labels };
295
+ const copy = useCopyText(l);
296
+ const open = onOpen ?? (kind === "anchor" ? () => scrollToHash(href) : () => {
297
+ if (href) window.open(href, "_blank", "noopener,noreferrer");
298
+ });
299
+ const copyTarget = kind === "anchor" ? placeLink ?? `${window.location.href.split("#")[0]}${href ?? ""}` : placeLink ?? href ?? "";
300
+ const items = [
301
+ {
302
+ id: "open",
303
+ label: kind === "anchor" ? l.jumpHere : kind === "document" ? l.openDocument : l.openLink,
304
+ primary: true,
305
+ onSelect: open,
306
+ testId: "mark-open"
307
+ },
308
+ {
309
+ id: "copy",
310
+ label: kind === "anchor" ? l.copyPlaceLink : l.copyLink,
311
+ onSelect: () => void copy(copyTarget),
312
+ testId: "mark-copy"
269
313
  }
270
- }, [value, isEditing]);
271
- const sources = react.useMemo(() => citations ?? [], [citations]);
272
- const hasCitations = sources.length > 0;
273
- const byDoc = react.useMemo(() => {
274
- const groups = /* @__PURE__ */ new Map();
275
- for (const doc of sources) {
276
- const chunks = doc.chunks ?? [];
277
- const pages = [];
278
- for (const c of chunks) if (c.page != null && !pages.includes(c.page)) pages.push(c.page);
279
- groups.set(doc.doc_ext_id, { pages, count: chunks.length });
314
+ ];
315
+ return /* @__PURE__ */ jsxRuntime.jsx(
316
+ ui.MarkMenu,
317
+ {
318
+ as: "a",
319
+ href,
320
+ items,
321
+ menuLabel: kind === "anchor" ? l.bookmarkMenu : l.linkMenu,
322
+ preview: kind === "external" && href ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block break-all text-xs text-muted-foreground", children: href }) : void 0,
323
+ className: ui.cn(LINK_STYLE[kind], "cursor-pointer", className),
324
+ testId,
325
+ "data-mark-kind": kind,
326
+ children
280
327
  }
281
- return groups;
282
- }, [sources]);
283
- const docIds = Array.from(byDoc.keys());
284
- const handleRemoveDocument = react.useCallback(
285
- (docExtId) => {
286
- const remaining = sources.filter((d) => d.doc_ext_id !== docExtId);
287
- onChange(localValue, remaining.length ? remaining : null);
288
- },
289
- [sources, localValue, onChange]
290
328
  );
291
- const handleToggleDocument = react.useCallback(
292
- (docExtId) => {
293
- if (!docExtId) return;
294
- if (docIds.includes(docExtId)) {
295
- handleRemoveDocument(docExtId);
296
- return;
297
- }
298
- onCiteDocument?.(docExtId);
299
- },
300
- [docIds, onCiteDocument, handleRemoveDocument]
329
+ }
330
+ function PassageMark({ label, menuLabel, items, className, testId }) {
331
+ return /* @__PURE__ */ jsxRuntime.jsx(
332
+ ui.MarkMenu,
333
+ {
334
+ items,
335
+ menuLabel,
336
+ testId,
337
+ "data-mark-kind": "passage",
338
+ className: ui.cn(
339
+ "touch-hit cursor-pointer select-none rounded-sm px-1 text-xs tabular-nums text-muted-foreground/80 transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-2",
340
+ className
341
+ ),
342
+ children: label
343
+ }
301
344
  );
302
- const renderedContent = react.useMemo(
303
- () => localValue ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: localValue }) : null,
304
- [localValue]
345
+ }
346
+ function LabelMark({
347
+ colors,
348
+ menuLabel,
349
+ preview,
350
+ items,
351
+ name,
352
+ className,
353
+ testId
354
+ }) {
355
+ return /* @__PURE__ */ jsxRuntime.jsx(
356
+ ui.MarkMenu,
357
+ {
358
+ items,
359
+ preview,
360
+ menuLabel,
361
+ testId,
362
+ "aria-label": name,
363
+ "data-mark-kind": "label",
364
+ className: ui.cn(
365
+ "flex cursor-pointer flex-col gap-1 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-1",
366
+ className
367
+ ),
368
+ children: colors.slice(0, 4).map((c, i) => /* @__PURE__ */ jsxRuntime.jsx(
369
+ "span",
370
+ {
371
+ "aria-hidden": "true",
372
+ className: "h-2.5 w-1 rounded-full",
373
+ style: { backgroundColor: c }
374
+ },
375
+ i
376
+ ))
377
+ }
305
378
  );
306
- const handleChange = react.useCallback(
307
- (newValue) => {
308
- setLocalValue(newValue);
309
- if (debounceRef.current) clearTimeout(debounceRef.current);
310
- debounceRef.current = setTimeout(() => onChange(newValue, citations ?? null), 400);
311
- },
312
- [citations, onChange]
379
+ }
380
+ function NoteMark({
381
+ label,
382
+ title,
383
+ menuLabel = "Note actions",
384
+ items = [],
385
+ className,
386
+ testId
387
+ }) {
388
+ return /* @__PURE__ */ jsxRuntime.jsx(
389
+ ui.MarkMenu,
390
+ {
391
+ items,
392
+ preview: title ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: title }) : void 0,
393
+ menuLabel,
394
+ testId,
395
+ "data-slot": "note-mark",
396
+ "data-mark-kind": "note",
397
+ className: ui.cn(
398
+ "cursor-default select-none rounded-sm px-1 text-xs font-medium tabular-nums text-foreground/80 underline decoration-yellow-400 decoration-2 underline-offset-[3px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
399
+ className
400
+ ),
401
+ children: label
402
+ }
313
403
  );
314
- const flushPendingChange = react.useCallback(() => {
315
- if (!debounceRef.current) return;
316
- clearTimeout(debounceRef.current);
317
- debounceRef.current = null;
318
- onChange(localValue, citations ?? null);
319
- }, [localValue, citations, onChange]);
320
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("space-y-1", className), children: [
321
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: isEditing ? /* @__PURE__ */ jsxRuntime.jsx(
322
- ui.Textarea,
323
- {
324
- ref: textareaRef,
325
- dictate: true,
326
- value: localValue,
327
- onChange: (e) => handleChange(e.target.value),
328
- onBlur: () => {
329
- flushPendingChange();
330
- setIsEditing(false);
331
- },
332
- onMouseUp: () => {
333
- if (textareaRef.current && onHeightChange) {
334
- onHeightChange(textareaRef.current.offsetHeight);
335
- }
336
- },
337
- placeholder,
338
- readOnly,
339
- rows: 2,
340
- "data-testid": dataTestId,
341
- autoFocus: true,
342
- style: defaultHeight ? { height: defaultHeight } : void 0,
343
- className: "w-full text-sm p-2 pr-14 border border-border rounded-md resize-y bg-background focus:outline-none focus:ring-2 focus:ring-ring"
344
- }
345
- ) : /* @__PURE__ */ jsxRuntime.jsx(
346
- "div",
347
- {
348
- onClick: () => !readOnly && setIsEditing(true),
349
- style: defaultHeight ? { minHeight: defaultHeight } : void 0,
350
- "data-testid": dataTestId,
351
- className: ui.cn(
352
- "w-full text-sm p-2 pr-14 border border-border rounded-md min-h-[4rem] whitespace-pre-wrap bg-background",
353
- !readOnly && "cursor-text hover:border-ring",
354
- !localValue && "text-muted-foreground"
355
- ),
356
- children: renderedContent || placeholder
357
- }
358
- ) }),
359
- (hasCitations || !readOnly) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
360
- docIds.map((docId) => {
361
- const doc = citedDocs?.[docId];
362
- const group = byDoc.get(docId);
363
- const pages = (group?.pages ?? []).slice().sort((a, b) => a - b);
364
- return /* @__PURE__ */ jsxRuntime.jsxs(
365
- "div",
366
- {
367
- className: "flex items-center gap-1.5 text-sm",
368
- "data-testid": `citation-doc-${docId}`,
369
- children: [
370
- doc ? /* @__PURE__ */ jsxRuntime.jsx(
371
- "button",
372
- {
373
- type: "button",
374
- onClick: () => !readOnly && onCiteDocument?.(docId),
375
- className: "flex-1 min-w-0 text-left",
376
- title: "Open to tag more passages",
377
- children: /* @__PURE__ */ jsxRuntime.jsx(ui.DocumentEntity, { doc, fullWidth: true, labelMaxWidth: "max-w-full" })
378
- }
379
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: docId }),
380
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground shrink-0", children: chunkKDG6FER6_cjs.formatPageRefs(pages) }),
381
- !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
382
- "button",
383
- {
384
- type: "button",
385
- onClick: () => handleRemoveDocument(docId),
386
- "aria-label": "Remove this document",
387
- className: "p-0.5 hover:bg-destructive/20 hover:text-destructive rounded shrink-0",
388
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 12 })
389
- }
390
- )
391
- ]
392
- },
393
- docId
394
- );
395
- }),
396
- !readOnly && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-0", "data-testid": "citation-document-picker", children: renderDocumentPicker?.(handleToggleDocument, docIds) }) })
397
- ] }),
398
- activeCitationKey && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-blue-text", children: [
399
- "Click a passage in the document to add it \u2014 ",
400
- /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "shift-click" }),
401
- " to take a whole range. Add as many as you like, from as many documents as you like."
402
- ] })
403
- ] });
404
404
  }
405
405
 
406
- exports.CitationEditor = CitationEditor;
407
406
  exports.DEFAULT_PASSAGE_PILL_LABELS = DEFAULT_PASSAGE_PILL_LABELS;
407
+ exports.DEFAULT_QUIET_MARK_LABELS = DEFAULT_QUIET_MARK_LABELS;
408
+ exports.LabelMark = LabelMark;
409
+ exports.NoteMark = NoteMark;
410
+ exports.PassageMark = PassageMark;
408
411
  exports.PassagePill = PassagePill;
409
- //# sourceMappingURL=chunk-YSHIC4NJ.cjs.map
410
- //# sourceMappingURL=chunk-YSHIC4NJ.cjs.map
412
+ exports.QuietLink = QuietLink;
413
+ exports.useCopyText = useCopyText;
414
+ //# sourceMappingURL=chunk-LXTOOUEN.cjs.map
415
+ //# sourceMappingURL=chunk-LXTOOUEN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/citations/PassagePill.tsx","../src/citations/QuietMarks.tsx"],"names":["jsxs","Fragment","jsx","cn","Tooltip","TooltipTrigger","TooltipContent","useBlocksEnvironment","useState","useRef","useEffect","Check","Copy","useCallback","MarkMenu"],"mappings":"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","file":"chunk-LXTOOUEN.cjs","sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Every fixed string of the passage pill. */\nexport interface PassagePillLabels {\n copyLink: string\n /** Announced and notified after the link was copied. */\n copied: string\n /** Notified when the clipboard refused the write. */\n copyFailed: string\n viewPassage: string\n page: string\n pages: string\n passage: string\n passages: string\n /** Visible abbreviation of \"page\" in the pill (\"p.3\"). */\n pageAbbreviation: string\n}\n\nexport const DEFAULT_PASSAGE_PILL_LABELS: PassagePillLabels = {\n copyLink: 'Copy passage link',\n copied: 'Passage link copied',\n copyFailed: 'Could not copy the passage link',\n viewPassage: 'View passage',\n page: 'Page',\n pages: 'Pages',\n passage: 'Passage',\n passages: 'Passages',\n pageAbbreviation: 'p.',\n}\n\n/** Overridable `data-testid`s of the pill (defaults keep the app's existing ids). */\nexport interface PassagePillTestIds {\n root: string\n copy: string\n}\n\nexport interface PassagePillProps {\n /** Glyph of the cited document (host-supplied: file-type icon). */\n icon: ReactNode\n documentTitle: string\n /** `pill`: title + page; `icon`: glyph only; `compact`: page/passage ref + copy link. */\n variant?: 'icon' | 'pill' | 'compact'\n pageNumber?: number\n passageIndex?: number\n /** End of a contiguous passage run: the label collapses to \"4–9\" instead of a pill each. */\n passageIndexEnd?: number\n /** End page of a range: \"p.3–5(4–9)\". */\n pageNumberEnd?: number\n /** Makes the element a link. */\n href?: string\n /** Makes the element a button (ignored for the element role when `href` is set). */\n onClick?: (e: MouseEvent) => void\n showTooltip?: boolean\n labelMaxWidth?: string\n size?: 'sm' | 'base'\n className?: string\n labels?: Partial<PassagePillLabels>\n testIds?: Partial<PassagePillTestIds>\n /** Root test id (default `passage-entity`); the copy button gets `<id>-copy`. */\n testId?: string\n}\n\nconst COPIED_RESET_MS = 2000\n\n/** Plain-language name of a passage reference: \"Title, Page 3, Passage 4\". */\nfunction describePassage(\n documentTitle: string,\n l: PassagePillLabels,\n page: { text?: string; isRange: boolean },\n passage: { text?: string; isRange: boolean }\n): string {\n return [\n documentTitle,\n page.text !== undefined ? `${page.isRange ? l.pages : l.page} ${page.text}` : null,\n passage.text !== undefined\n ? `${passage.isRange ? l.passages : l.passage} ${passage.text}`\n : null,\n ]\n .filter(Boolean)\n .join(', ')\n}\n\ninterface PillSurfaceProps {\n href?: string\n onClick?: (e: MouseEvent) => void\n className: string\n testId: string\n /** What assistive tech reads; the visible content is hidden from it. */\n accessibleName: string\n children: ReactNode\n tooltip?: ReactNode\n tooltipSide?: 'top' | 'bottom'\n}\n\n/**\n * The ONE interactive element of a pill: a link, a button or (when there is no action) plain text.\n * Never nests another interactive element, so it is valid inside any host container.\n */\nfunction PillSurface({\n href,\n onClick,\n className,\n testId,\n accessibleName,\n children,\n tooltip,\n tooltipSide = 'bottom',\n}: PillSurfaceProps) {\n const content = (\n <>\n <span aria-hidden=\"true\" className=\"inline-flex min-w-0 items-center gap-1\">\n {children}\n </span>\n <span className=\"sr-only\">{accessibleName}</span>\n </>\n )\n const interactive = cn(\n 'relative cursor-pointer hover:bg-muted/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n \"pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n )\n\n let surface: ReactNode\n if (href) {\n surface = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(className, interactive)}\n onClick={onClick}\n data-testid={testId}\n >\n {content}\n </a>\n )\n } else if (onClick) {\n surface = (\n <button\n type=\"button\"\n className={cn(className, interactive)}\n onClick={onClick}\n data-testid={testId}\n >\n {content}\n </button>\n )\n } else {\n surface = (\n <span className={className} data-testid={testId}>\n {content}\n </span>\n )\n }\n\n if (!tooltip) return surface\n return (\n <Tooltip>\n <TooltipTrigger asChild>{surface as ReactElement}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{tooltip}</TooltipContent>\n </Tooltip>\n )\n}\n\nfunction CopyLinkButton({\n href,\n labels,\n testId,\n}: {\n href: string\n labels: PassagePillLabels\n testId: string\n}) {\n const { notify } = useBlocksEnvironment()\n const [copied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current)\n },\n []\n )\n\n const handleCopy = async (e: MouseEvent) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(href)\n } catch {\n // Say so instead of pretending: the host's notify surfaces the failure.\n notify(labels.copyFailed, 'error')\n return\n }\n setCopied(true)\n notify(labels.copied, 'success')\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), COPIED_RESET_MS)\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"relative inline-flex items-center text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-fine:min-h-6 pointer-fine:min-w-6 pointer-fine:justify-center pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n title={labels.copyLink}\n aria-label={labels.copyLink}\n data-testid={testId}\n >\n {copied ? (\n <Check className=\"size-3\" aria-hidden=\"true\" />\n ) : (\n <Copy className=\"size-3\" aria-hidden=\"true\" />\n )}\n </button>\n <span role=\"status\" className=\"sr-only\">\n {copied ? labels.copied : ''}\n </span>\n </>\n )\n}\n\n/** A citation to a passage of a document, as a pill, a bare icon or a compact page reference. */\nexport function PassagePill({\n icon,\n documentTitle,\n variant = 'pill',\n pageNumber,\n passageIndex,\n passageIndexEnd,\n pageNumberEnd,\n href,\n className,\n onClick,\n showTooltip = true,\n labelMaxWidth,\n size = 'sm',\n labels,\n testIds,\n testId = 'passage-entity',\n}: PassagePillProps) {\n const l = { ...DEFAULT_PASSAGE_PILL_LABELS, ...labels }\n const ids: PassagePillTestIds = {\n root: testIds?.root ?? testId,\n copy: testIds?.copy ?? `${testIds?.root ?? testId}-copy`,\n }\n // Ranges collapse to \"4–9\"; a range of one renders as a plain \"4\".\n const isPassageRange = passageIndexEnd !== undefined && passageIndexEnd > (passageIndex ?? 0)\n const isPageRange = pageNumberEnd !== undefined && pageNumberEnd > (pageNumber ?? 0)\n const passageText = isPassageRange ? `${passageIndex}–${passageIndexEnd}` : `${passageIndex}`\n const pageText = isPageRange ? `${pageNumber}–${pageNumberEnd}` : `${pageNumber}`\n const accessibleName = describePassage(\n documentTitle,\n l,\n { text: pageNumber !== undefined ? pageText : undefined, isRange: isPageRange },\n { text: passageIndex !== undefined ? passageText : undefined, isRange: isPassageRange }\n )\n const hasAction = Boolean(href || onClick)\n\n if (variant === 'icon') {\n return (\n <PillSurface\n href={href}\n onClick={onClick}\n className={cn('inline-flex items-center rounded-sm', className)}\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={\n showTooltip ? (\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"font-medium\">{documentTitle}</span>\n {(pageNumber !== undefined || passageIndex !== undefined) && (\n <span className=\"text-xs text-muted-foreground\">\n {pageNumber !== undefined && `${isPageRange ? l.pages : l.page} ${pageText}`}\n {pageNumber !== undefined && passageIndex !== undefined && ', '}\n {passageIndex !== undefined &&\n `${isPassageRange ? l.passages : l.passage} ${passageText}`}\n </span>\n )}\n </div>\n ) : undefined\n }\n >\n {icon}\n </PillSurface>\n )\n }\n\n if (variant === 'compact') {\n const label =\n [\n pageNumber !== undefined ? `${l.pageAbbreviation}${pageText}` : null,\n passageIndex !== undefined ? `(${passageText})` : null,\n ]\n .filter(Boolean)\n .join('') || '—'\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border border-transparent bg-muted px-1 text-sm font-medium',\n className\n )}\n >\n <PillSurface\n href={href}\n onClick={onClick}\n className=\"inline-flex items-center gap-1 rounded-sm\"\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={showTooltip ? documentTitle : undefined}\n >\n {icon}\n <span className=\"leading-tight\">{label}</span>\n </PillSurface>\n {href && <CopyLinkButton href={href} labels={l} testId={ids.copy} />}\n </span>\n )\n }\n\n return (\n <PillSurface\n href={href}\n onClick={onClick}\n className={cn(\n 'group/pill inline-flex items-center rounded-md border border-border bg-muted transition-all',\n size === 'base' ? 'gap-1.5 px-1.5 py-0.5 text-base' : 'gap-1 px-1 text-sm',\n className\n )}\n testId={ids.root}\n accessibleName={accessibleName}\n tooltip={showTooltip && hasAction ? l.viewPassage : undefined}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 truncate font-medium leading-tight',\n labelMaxWidth ?? 'max-w-[320px]'\n )}\n >\n {documentTitle}\n </span>\n {pageNumber ? (\n <span className=\"flex-shrink-0 text-xs leading-none text-muted-foreground\">\n {l.pageAbbreviation}\n {pageText}\n </span>\n ) : null}\n </PillSurface>\n )\n}\n","import { useCallback, type ReactNode } from 'react'\nimport { MarkMenu, cn, type MarkMenuItem } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/**\n * Quiet inline marks: links, bookmarks, passage references, label and note marks.\n *\n * Each is typographically distinct TEXT (no pill, no button chrome, no icon in the flow) and owns\n * exactly one contextual menu through the shared `MarkMenu`. Domain-neutral: hosts supply the\n * handlers that make a row mean something.\n */\n\n/** Every fixed string of the quiet marks. */\nexport interface QuietMarkLabels {\n openLink: string\n copyLink: string\n linkCopied: string\n copyFailed: string\n jumpHere: string\n copyPlaceLink: string\n openDocument: string\n linkMenu: string\n bookmarkMenu: string\n}\n\nexport const DEFAULT_QUIET_MARK_LABELS: QuietMarkLabels = {\n openLink: 'Open link',\n copyLink: 'Copy link',\n linkCopied: 'Link copied',\n copyFailed: 'Could not copy',\n jumpHere: 'Jump to here',\n copyPlaceLink: 'Copy link to this place',\n openDocument: 'Open document',\n linkMenu: 'Link actions',\n bookmarkMenu: 'Bookmark actions',\n}\n\n/**\n * Copy text to the clipboard and say so (or say it failed) through the host's `notify`. Resolves\n * whether it was copied.\n */\nexport function useCopyText(labels?: Partial<Pick<QuietMarkLabels, 'linkCopied' | 'copyFailed'>>) {\n const { notify } = useBlocksEnvironment()\n const done = labels?.linkCopied ?? DEFAULT_QUIET_MARK_LABELS.linkCopied\n const failed = labels?.copyFailed ?? DEFAULT_QUIET_MARK_LABELS.copyFailed\n return useCallback(\n async (text: string, message?: string): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text)\n notify(message ?? done, 'success')\n return true\n } catch {\n notify(failed, 'error')\n return false\n }\n },\n [notify, done, failed]\n )\n}\n\nexport type QuietLinkKind = 'external' | 'anchor' | 'document'\n\nexport interface QuietLinkProps {\n href?: string\n /** `external` (default) opens elsewhere, `anchor` jumps within the page, `document` is an in-app target. */\n kind?: QuietLinkKind\n /** The primary action. Defaults: external opens a new tab, anchor scrolls to the id. */\n onOpen?: () => void\n /** Absolute URL a copied anchor should carry; defaults to the current page plus the hash. */\n placeLink?: string\n labels?: Partial<QuietMarkLabels>\n className?: string\n testId?: string\n children: ReactNode\n}\n\nconst LINK_STYLE: Record<QuietLinkKind, string> = {\n external:\n 'text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary',\n document:\n 'text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary',\n // A bookmark is nearly invisible until hovered or focused.\n anchor:\n 'text-inherit underline decoration-dotted decoration-1 decoration-foreground/25 underline-offset-[3px] transition-colors hover:decoration-foreground/70 focus-visible:decoration-foreground/70',\n}\n\nfunction scrollToHash(href: string | undefined) {\n const id = href?.startsWith('#') ? decodeURIComponent(href.slice(1)) : ''\n document.getElementById(id)?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n}\n\n/** A hyperlink, bookmark or document link as quiet text with one menu (open / copy). */\nexport function QuietLink({\n href,\n kind = 'external',\n onOpen,\n placeLink,\n labels,\n className,\n testId,\n children,\n}: QuietLinkProps) {\n const l = { ...DEFAULT_QUIET_MARK_LABELS, ...labels }\n const copy = useCopyText(l)\n\n const open =\n onOpen ??\n (kind === 'anchor'\n ? () => scrollToHash(href)\n : () => {\n if (href) window.open(href, '_blank', 'noopener,noreferrer')\n })\n const copyTarget =\n kind === 'anchor'\n ? (placeLink ?? `${window.location.href.split('#')[0]}${href ?? ''}`)\n : (placeLink ?? href ?? '')\n\n const items: MarkMenuItem[] = [\n {\n id: 'open',\n label: kind === 'anchor' ? l.jumpHere : kind === 'document' ? l.openDocument : l.openLink,\n primary: true,\n onSelect: open,\n testId: 'mark-open',\n },\n {\n id: 'copy',\n label: kind === 'anchor' ? l.copyPlaceLink : l.copyLink,\n onSelect: () => void copy(copyTarget),\n testId: 'mark-copy',\n },\n ]\n\n return (\n <MarkMenu\n as=\"a\"\n href={href}\n items={items}\n menuLabel={kind === 'anchor' ? l.bookmarkMenu : l.linkMenu}\n preview={\n kind === 'external' && href ? (\n <span className=\"block break-all text-xs text-muted-foreground\">{href}</span>\n ) : undefined\n }\n className={cn(LINK_STYLE[kind], 'cursor-pointer', className)}\n testId={testId}\n data-mark-kind={kind}\n >\n {children}\n </MarkMenu>\n )\n}\n\nexport interface PassageMarkProps {\n /** The reference as plain text, e.g. \"¶4\" or \"¶4–9 · p.1\". */\n label: string\n menuLabel: string\n /** Menu rows: copy, link, label, open in navigator. */\n items: MarkMenuItem[]\n className?: string\n testId?: string\n}\n\n/** A passage's reference as a faint text mark in the margin; its menu carries the passage actions. */\nexport function PassageMark({ label, menuLabel, items, className, testId }: PassageMarkProps) {\n return (\n <MarkMenu\n items={items}\n menuLabel={menuLabel}\n testId={testId}\n data-mark-kind=\"passage\"\n className={cn(\n 'touch-hit cursor-pointer select-none rounded-sm px-1 text-xs tabular-nums text-muted-foreground/80 transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-2',\n className\n )}\n >\n {label}\n </MarkMenu>\n )\n}\n\nexport interface LabelMarkProps {\n /** Colours of every label marking the passage. */\n colors: string[]\n menuLabel: string\n /** Names of the labels, shown in the menu. */\n preview?: ReactNode\n items: MarkMenuItem[]\n /** Accessible name of the stripes. */\n name: string\n className?: string\n testId?: string\n}\n\n/** The labels on a passage as thin margin stripes (not a chip); the menu shows / removes them. */\nexport function LabelMark({\n colors,\n menuLabel,\n preview,\n items,\n name,\n className,\n testId,\n}: LabelMarkProps) {\n return (\n <MarkMenu\n items={items}\n preview={preview}\n menuLabel={menuLabel}\n testId={testId}\n aria-label={name}\n data-mark-kind=\"label\"\n className={cn(\n 'flex cursor-pointer flex-col gap-1 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-1',\n className\n )}\n >\n {colors.slice(0, 4).map((c, i) => (\n <span\n key={i}\n aria-hidden=\"true\"\n className=\"h-2.5 w-1 rounded-full\"\n style={{ backgroundColor: c }}\n />\n ))}\n </MarkMenu>\n )\n}\n\nexport interface NoteMarkProps {\n /** Short label, e.g. the passage range this run covers (\"¶4–9\"). */\n label: string\n /** Full note text, shown as the menu preview so the mark is self-explaining. */\n title?: string\n menuLabel?: string\n /** Rows such as \"Show note\" and \"Edit\". With none, the menu is a read-only preview. */\n items?: MarkMenuItem[]\n className?: string\n testId?: string\n}\n\n/**\n * Marks a passage as cited by a Note: small text with a soft yellow underline, drawn once on\n * each CONTIGUOUS run of cited passages (a run is one citation).\n */\nexport function NoteMark({\n label,\n title,\n menuLabel = 'Note actions',\n items = [],\n className,\n testId,\n}: NoteMarkProps) {\n return (\n <MarkMenu\n items={items}\n preview={\n title ? <span className=\"block text-xs text-muted-foreground\">{title}</span> : undefined\n }\n menuLabel={menuLabel}\n testId={testId}\n data-slot=\"note-mark\"\n data-mark-kind=\"note\"\n className={cn(\n 'cursor-default select-none rounded-sm px-1 text-xs font-medium tabular-nums text-foreground/80 underline decoration-yellow-400 decoration-2 underline-offset-[3px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n className\n )}\n >\n {label}\n </MarkMenu>\n )\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useRef, useState } from 'react';
3
- import { Loader2, UploadCloud } from 'lucide-react';
2
+ import { memo, useRef, useState } from 'react';
3
+ import { Ban, Plus, Pencil, Loader2, UploadCloud } from 'lucide-react';
4
4
  import { cn } from '@arbidocs/react/ui';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -83,7 +83,46 @@ function UploadDropzone({
83
83
  }
84
84
  );
85
85
  }
86
+ var ICONS = { pencil: Pencil, plus: Plus, blocked: Ban };
87
+ function CellHoverIcon({
88
+ kind = "pencil",
89
+ className
90
+ }) {
91
+ const Icon = ICONS[kind];
92
+ return /* @__PURE__ */ jsx(
93
+ "span",
94
+ {
95
+ "data-slot": "cell-hover-icon",
96
+ "data-kind": kind,
97
+ "aria-hidden": true,
98
+ className: cn(
99
+ "inline-flex shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-70 group-focus-within:opacity-70 pointer-coarse:opacity-70",
100
+ className
101
+ ),
102
+ children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5" })
103
+ }
104
+ );
105
+ }
106
+ var HoverIconCell = memo(function HoverIconCell2({
107
+ content,
108
+ isEditable,
109
+ showIcon = true,
110
+ icon = "pencil",
111
+ className
112
+ }) {
113
+ return /* @__PURE__ */ jsxs(
114
+ "div",
115
+ {
116
+ "data-slot": "hover-icon-cell",
117
+ className: cn("group flex h-full w-full items-center gap-2 pr-2", className),
118
+ children: [
119
+ content,
120
+ showIcon && /* @__PURE__ */ jsx(CellHoverIcon, { kind: isEditable ? icon : "blocked" })
121
+ ]
122
+ }
123
+ );
124
+ });
86
125
 
87
- export { UploadDropzone };
88
- //# sourceMappingURL=chunk-EVUEIBNU.js.map
89
- //# sourceMappingURL=chunk-EVUEIBNU.js.map
126
+ export { CellHoverIcon, HoverIconCell, UploadDropzone };
127
+ //# sourceMappingURL=chunk-M4S75AEJ.js.map
128
+ //# sourceMappingURL=chunk-M4S75AEJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/UploadDropzone.tsx","../src/files/cells/HoverIconCell.tsx"],"names":["jsx","cn","HoverIconCell","jsxs"],"mappings":"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","file":"chunk-M4S75AEJ.js","sourcesContent":["import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each host's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors',\n 'hover:bg-accent/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'bg-accent ring-2 ring-primary',\n inert && 'cursor-not-allowed opacity-60 hover:bg-muted',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\n )\n}\n","import { memo, type ReactNode } from 'react'\nimport { Ban, Pencil, Plus } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type CellHoverIconKind = 'pencil' | 'plus' | 'blocked'\n\nconst ICONS = { pencil: Pencil, plus: Plus, blocked: Ban } as const\n\n/**\n * Edit hint of a grid cell. It appears on pointer hover, on keyboard focus anywhere inside the\n * cell and always on touch devices (coarse pointer), where there is no hover to reveal it.\n * Place it inside an element carrying the `group` class.\n */\nexport function CellHoverIcon({\n kind = 'pencil',\n className,\n}: {\n kind?: CellHoverIconKind\n className?: string\n}) {\n const Icon = ICONS[kind]\n return (\n <span\n data-slot=\"cell-hover-icon\"\n data-kind={kind}\n aria-hidden\n className={cn(\n 'inline-flex shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-70 group-focus-within:opacity-70 pointer-coarse:opacity-70',\n className\n )}\n >\n <Icon className=\"size-3.5\" />\n </span>\n )\n}\n\nexport interface HoverIconCellProps {\n content: ReactNode\n /** Non-members get a \"blocked\" hint instead of the edit hint. */\n isEditable: boolean\n showIcon?: boolean\n icon?: Exclude<CellHoverIconKind, 'blocked'>\n className?: string\n}\n\n/** A cell's content with the edit hint after it (pure CSS reveal: no re-render on mouse move). */\nexport const HoverIconCell = memo(function HoverIconCell({\n content,\n isEditable,\n showIcon = true,\n icon = 'pencil',\n className,\n}: HoverIconCellProps) {\n return (\n <div\n data-slot=\"hover-icon-cell\"\n className={cn('group flex h-full w-full items-center gap-2 pr-2', className)}\n >\n {content}\n {showIcon && <CellHoverIcon kind={isEditable ? icon : 'blocked'} />}\n </div>\n )\n})\n"]}
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk5FYU7ZIU_cjs = require('./chunk-5FYU7ZIU.cjs');
5
- var chunkI2QSDQQV_cjs = require('./chunk-I2QSDQQV.cjs');
5
+ var chunkQT3A4PFC_cjs = require('./chunk-QT3A4PFC.cjs');
6
6
  var chunk7UTB4PHM_cjs = require('./chunk-7UTB4PHM.cjs');
7
7
  var fflate = require('fflate');
8
8
  var server = require('react-dom/server');
@@ -1761,14 +1761,14 @@ function DefinedTermsProvider({
1761
1761
  },
1762
1762
  [load, sources, notify]
1763
1763
  );
1764
- const all = React4.useMemo(() => chunkI2QSDQQV_cjs.groupDefinitions(sources ?? []).groups, [sources]);
1764
+ const all = React4.useMemo(() => chunkQT3A4PFC_cjs.groupDefinitions(sources ?? []).groups, [sources]);
1765
1765
  const byId = React4.useMemo(
1766
1766
  () => new Map(all.flatMap((g) => g.definitions).map((d) => [d.id, d])),
1767
1767
  [all]
1768
1768
  );
1769
- const agreements = React4.useMemo(() => chunkI2QSDQQV_cjs.definitionLabels(sources ?? []), [sources]);
1769
+ const agreements = React4.useMemo(() => chunkQT3A4PFC_cjs.definitionLabels(sources ?? []), [sources]);
1770
1770
  const groups = React4.useMemo(
1771
- () => picker ? chunkI2QSDQQV_cjs.filterTermGroups(chunkI2QSDQQV_cjs.groupDefinitions(sources ?? [], { labelId }).groups, picker.query).slice(
1771
+ () => picker ? chunkQT3A4PFC_cjs.filterTermGroups(chunkQT3A4PFC_cjs.groupDefinitions(sources ?? [], { labelId }).groups, picker.query).slice(
1772
1772
  0,
1773
1773
  MAX_GROUPS
1774
1774
  ) : [],
@@ -3809,7 +3809,7 @@ function TableButtons() {
3809
3809
  ] });
3810
3810
  }
3811
3811
  var CAPTION_LABELS = ["Figure", "Table", "Equation"];
3812
- var CAPTION_STYLES = chunkI2QSDQQV_cjs.stylesXml(
3812
+ var CAPTION_STYLES = chunkQT3A4PFC_cjs.stylesXml(
3813
3813
  "",
3814
3814
  '<w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:uiPriority w:val="35"/><w:unhideWhenUsed/><w:qFormat/><w:pPr><w:spacing w:after="200" w:line="240" w:lineRule="auto"/></w:pPr><w:rPr><w:i/><w:iCs/><w:color w:val="44546A"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:style>'
3815
3815
  );
@@ -3837,9 +3837,9 @@ function countSeqFields(root, label, throughId) {
3837
3837
  return count;
3838
3838
  }
3839
3839
  function captionParagraphXml(label, number, text) {
3840
- const run = (value) => `<w:r><w:t xml:space="preserve">${chunkI2QSDQQV_cjs.esc(value)}</w:t></w:r>`;
3840
+ const run = (value) => `<w:r><w:t xml:space="preserve">${chunkQT3A4PFC_cjs.esc(value)}</w:t></w:r>`;
3841
3841
  const rest = text.trim() ? `: ${text.trim()}` : "";
3842
- return `<w:p><w:pPr><w:pStyle w:val="Caption"/></w:pPr>${run(`${label} `)}<w:fldSimple w:instr=" SEQ ${chunkI2QSDQQV_cjs.esc(label)} \\* ARABIC "><w:r><w:t>${number}</w:t></w:r></w:fldSimple>${rest ? run(rest) : ""}</w:p>`;
3842
+ return `<w:p><w:pPr><w:pStyle w:val="Caption"/></w:pPr>${run(`${label} `)}<w:fldSimple w:instr=" SEQ ${chunkQT3A4PFC_cjs.esc(label)} \\* ARABIC "><w:r><w:t>${number}</w:t></w:r></w:fldSimple>${rest ? run(rest) : ""}</w:p>`;
3843
3843
  }
3844
3844
  function base642(bytes) {
3845
3845
  let binary = "";
@@ -3848,8 +3848,8 @@ function base642(bytes) {
3848
3848
  return btoa(binary);
3849
3849
  }
3850
3850
  function captionFragmentHtml(label, number, text, revision) {
3851
- const untracked = chunkI2QSDQQV_cjs.docxPackage({
3852
- document: chunkI2QSDQQV_cjs.documentXml(captionParagraphXml(label, number, text)),
3851
+ const untracked = chunkQT3A4PFC_cjs.docxPackage({
3852
+ document: chunkQT3A4PFC_cjs.documentXml(captionParagraphXml(label, number, text)),
3853
3853
  styles: CAPTION_STYLES,
3854
3854
  title: "Caption"
3855
3855
  });
@@ -5108,5 +5108,5 @@ exports.useReview = useReview;
5108
5108
  exports.useReviewItem = useReviewItem;
5109
5109
  exports.useTrackedOrNoted = useTrackedOrNoted;
5110
5110
  exports.withDirectEditing = withDirectEditing;
5111
- //# sourceMappingURL=chunk-V5OAXIBN.cjs.map
5112
- //# sourceMappingURL=chunk-V5OAXIBN.cjs.map
5111
+ //# sourceMappingURL=chunk-NPR5BGFF.cjs.map
5112
+ //# sourceMappingURL=chunk-NPR5BGFF.cjs.map