@arbidocs/blocks 0.4.159 → 0.4.160

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 (334) hide show
  1. package/README.md +48 -9
  2. package/dist/{ConnectedNativeDocxComparison-R6RU5TZE.cjs → ConnectedNativeDocxComparison-GLHOGUP6.cjs} +12 -11
  3. package/dist/{ConnectedNativeDocxComparison-R6RU5TZE.cjs.map → ConnectedNativeDocxComparison-GLHOGUP6.cjs.map} +1 -1
  4. package/dist/{ConnectedNativeDocxComparison-XMZ5KLD4.js → ConnectedNativeDocxComparison-LKIMKOTA.js} +11 -10
  5. package/dist/{ConnectedStreamedWordArtifact-IXRJ7MUE.js.map → ConnectedNativeDocxComparison-LKIMKOTA.js.map} +1 -1
  6. package/dist/{ConnectedNativeDocxEditor-NGUK2AX6.js → ConnectedNativeDocxEditor-6LNYWZ3P.js} +10 -9
  7. package/dist/{ConnectedNativeDocxEditor-NGUK2AX6.js.map → ConnectedNativeDocxEditor-6LNYWZ3P.js.map} +1 -1
  8. package/dist/{ConnectedNativeDocxEditor-LBATSM3M.cjs → ConnectedNativeDocxEditor-M3UGWL6K.cjs} +12 -11
  9. package/dist/{ConnectedNativeDocxEditor-LBATSM3M.cjs.map → ConnectedNativeDocxEditor-M3UGWL6K.cjs.map} +1 -1
  10. package/dist/{ConnectedStreamedWordArtifact-IXRJ7MUE.js → ConnectedStreamedWordArtifact-432HT7DK.js} +11 -10
  11. package/dist/{ConnectedNativeDocxComparison-XMZ5KLD4.js.map → ConnectedStreamedWordArtifact-432HT7DK.js.map} +1 -1
  12. package/dist/{ConnectedStreamedWordArtifact-CWFR6A37.cjs → ConnectedStreamedWordArtifact-COEXL5IT.cjs} +12 -11
  13. package/dist/ConnectedStreamedWordArtifact-COEXL5IT.cjs.map +1 -0
  14. package/dist/{FactTextEditor-YESAU2IJ.js → FactTextEditor-ABKKJOCY.js} +2 -2
  15. package/dist/FactTextEditor-ABKKJOCY.js.map +1 -0
  16. package/dist/{FactTextEditor-YUPBCTXK.cjs → FactTextEditor-GYN5RHJT.cjs} +2 -2
  17. package/dist/FactTextEditor-GYN5RHJT.cjs.map +1 -0
  18. package/dist/{WorkspaceTableView-EYLEUZZT.cjs → WorkspaceTableView-AQTF5F6T.cjs} +6 -5
  19. package/dist/WorkspaceTableView-AQTF5F6T.cjs.map +1 -0
  20. package/dist/{WorkspaceTableView-DWUE4VQF.js → WorkspaceTableView-PTB5BPVA.js} +4 -3
  21. package/dist/WorkspaceTableView-PTB5BPVA.js.map +1 -0
  22. package/dist/agents/index.cjs +263 -263
  23. package/dist/agents/index.js +6 -6
  24. package/dist/agents/skills/skillLibrary.d.ts +1 -1
  25. package/dist/{chunk-FPHTSNOE.js → chunk-2AKIMCDD.js} +3 -3
  26. package/dist/{chunk-FPHTSNOE.js.map → chunk-2AKIMCDD.js.map} +1 -1
  27. package/dist/{chunk-YNMO3DSR.js → chunk-2AMYT2HQ.js} +3 -3
  28. package/dist/{chunk-YNMO3DSR.js.map → chunk-2AMYT2HQ.js.map} +1 -1
  29. package/dist/{chunk-MSFQDELO.cjs → chunk-3CUORKDL.cjs} +4 -4
  30. package/dist/{chunk-MSFQDELO.cjs.map → chunk-3CUORKDL.cjs.map} +1 -1
  31. package/dist/{chunk-MNG7N6M2.js → chunk-3PQIWOTZ.js} +122 -57
  32. package/dist/chunk-3PQIWOTZ.js.map +1 -0
  33. package/dist/chunk-5C7DRQQE.cjs +1891 -0
  34. package/dist/chunk-5C7DRQQE.cjs.map +1 -0
  35. package/dist/{chunk-F57LNUSZ.js → chunk-5NWY3FXQ.js} +24 -57
  36. package/dist/chunk-5NWY3FXQ.js.map +1 -0
  37. package/dist/{chunk-ISHFVKVU.js → chunk-5WLORPGX.js} +4 -4
  38. package/dist/{chunk-ISHFVKVU.js.map → chunk-5WLORPGX.js.map} +1 -1
  39. package/dist/{chunk-FAXXN7KI.cjs → chunk-5Y6V7F6W.cjs} +53 -4
  40. package/dist/chunk-5Y6V7F6W.cjs.map +1 -0
  41. package/dist/{chunk-6QAAIDQQ.cjs → chunk-6UTIAHQG.cjs} +60 -60
  42. package/dist/{chunk-6QAAIDQQ.cjs.map → chunk-6UTIAHQG.cjs.map} +1 -1
  43. package/dist/{chunk-KCSIX7CY.js → chunk-6XIXNH26.js} +3 -3
  44. package/dist/{chunk-KCSIX7CY.js.map → chunk-6XIXNH26.js.map} +1 -1
  45. package/dist/{chunk-YBJ4QGNH.cjs → chunk-ANLTECZ6.cjs} +8 -8
  46. package/dist/{chunk-YBJ4QGNH.cjs.map → chunk-ANLTECZ6.cjs.map} +1 -1
  47. package/dist/{chunk-Q2XGM372.cjs → chunk-AR6A2PMV.cjs} +4 -4
  48. package/dist/{chunk-Q2XGM372.cjs.map → chunk-AR6A2PMV.cjs.map} +1 -1
  49. package/dist/{chunk-KBO75NLM.cjs → chunk-AYJZRBHG.cjs} +7 -7
  50. package/dist/{chunk-KBO75NLM.cjs.map → chunk-AYJZRBHG.cjs.map} +1 -1
  51. package/dist/{chunk-FM3IRQJW.cjs → chunk-AYKE6USO.cjs} +12 -12
  52. package/dist/chunk-AYKE6USO.cjs.map +1 -0
  53. package/dist/chunk-BGJZVJJM.cjs +63 -0
  54. package/dist/chunk-BGJZVJJM.cjs.map +1 -0
  55. package/dist/{chunk-ECW2R2KF.cjs → chunk-BPL5RLNN.cjs} +27 -27
  56. package/dist/{chunk-ECW2R2KF.cjs.map → chunk-BPL5RLNN.cjs.map} +1 -1
  57. package/dist/{chunk-CNHUJRQ4.cjs → chunk-EFEFLBRM.cjs} +21 -55
  58. package/dist/chunk-EFEFLBRM.cjs.map +1 -0
  59. package/dist/{chunk-ETZ5A3GU.js → chunk-EVO2UNX3.js} +3 -3
  60. package/dist/chunk-EVO2UNX3.js.map +1 -0
  61. package/dist/{chunk-P6RIBIVN.js → chunk-FMJGVAWX.js} +8 -9
  62. package/dist/chunk-FMJGVAWX.js.map +1 -0
  63. package/dist/chunk-H5542IOD.cjs +108 -0
  64. package/dist/chunk-H5542IOD.cjs.map +1 -0
  65. package/dist/{chunk-VF5EUAIV.js → chunk-H7PHANI4.js} +3 -3
  66. package/dist/chunk-H7PHANI4.js.map +1 -0
  67. package/dist/chunk-HQJL7FSY.js +58 -0
  68. package/dist/chunk-HQJL7FSY.js.map +1 -0
  69. package/dist/{chunk-OFV3PRF2.cjs → chunk-HRDVQERS.cjs} +7 -7
  70. package/dist/{chunk-OFV3PRF2.cjs.map → chunk-HRDVQERS.cjs.map} +1 -1
  71. package/dist/{chunk-3VULDTNL.cjs → chunk-HUNX4CQG.cjs} +4 -4
  72. package/dist/chunk-HUNX4CQG.cjs.map +1 -0
  73. package/dist/{chunk-2BHDRVVL.cjs → chunk-I6I34FDU.cjs} +38 -37
  74. package/dist/chunk-I6I34FDU.cjs.map +1 -0
  75. package/dist/chunk-IWVOZREF.js +12 -0
  76. package/dist/chunk-IWVOZREF.js.map +1 -0
  77. package/dist/chunk-J7YHBMBB.js +1834 -0
  78. package/dist/chunk-J7YHBMBB.js.map +1 -0
  79. package/dist/{chunk-SDOEHEJP.js → chunk-JMQLTMJ7.js} +53 -5
  80. package/dist/chunk-JMQLTMJ7.js.map +1 -0
  81. package/dist/{chunk-TF7HN5EU.js → chunk-JNE2XEXD.js} +12 -12
  82. package/dist/chunk-JNE2XEXD.js.map +1 -0
  83. package/dist/{chunk-QKR5LWDO.js → chunk-K7CZFNJ2.js} +7 -7
  84. package/dist/{chunk-QKR5LWDO.js.map → chunk-K7CZFNJ2.js.map} +1 -1
  85. package/dist/{chunk-4RPBUMHB.cjs → chunk-KMZO5W6D.cjs} +4 -4
  86. package/dist/chunk-KMZO5W6D.cjs.map +1 -0
  87. package/dist/{chunk-FTZ45WHY.js → chunk-KNCJSPXV.js} +5020 -4014
  88. package/dist/chunk-KNCJSPXV.js.map +1 -0
  89. package/dist/{chunk-3OCNUKGX.js → chunk-KQWC4YBX.js} +3 -3
  90. package/dist/{chunk-3OCNUKGX.js.map → chunk-KQWC4YBX.js.map} +1 -1
  91. package/dist/{chunk-TC3RQNEX.cjs → chunk-L4KWTDFE.cjs} +5 -5
  92. package/dist/chunk-L4KWTDFE.cjs.map +1 -0
  93. package/dist/{chunk-VTTZZ4FN.js → chunk-LH3JAZ33.js} +5 -5
  94. package/dist/chunk-LH3JAZ33.js.map +1 -0
  95. package/dist/{chunk-P2YM67Y5.cjs → chunk-LQYPOWKN.cjs} +14 -21
  96. package/dist/chunk-LQYPOWKN.cjs.map +1 -0
  97. package/dist/{chunk-RATEAOKT.js → chunk-NOXGEQQR.js} +7 -13
  98. package/dist/chunk-NOXGEQQR.js.map +1 -0
  99. package/dist/{chunk-NPLGB4LI.cjs → chunk-NUAC5GTQ.cjs} +5115 -4077
  100. package/dist/chunk-NUAC5GTQ.cjs.map +1 -0
  101. package/dist/chunk-NYECCTB3.js +101 -0
  102. package/dist/chunk-NYECCTB3.js.map +1 -0
  103. package/dist/{chunk-GC2FSPSQ.cjs → chunk-O5E3NKPI.cjs} +128 -58
  104. package/dist/chunk-O5E3NKPI.cjs.map +1 -0
  105. package/dist/{chunk-SZOFGU7W.js → chunk-O5XREO7H.js} +3 -3
  106. package/dist/{chunk-SZOFGU7W.js.map → chunk-O5XREO7H.js.map} +1 -1
  107. package/dist/{chunk-OOU4QLRK.cjs → chunk-OHCYJFV2.cjs} +9 -9
  108. package/dist/{chunk-OOU4QLRK.cjs.map → chunk-OHCYJFV2.cjs.map} +1 -1
  109. package/dist/{chunk-DEPF5LQI.js → chunk-OKRYNQPH.js} +3 -3
  110. package/dist/chunk-OKRYNQPH.js.map +1 -0
  111. package/dist/{chunk-KFMRBZQK.js → chunk-PCL7IEZO.js} +21 -20
  112. package/dist/chunk-PCL7IEZO.js.map +1 -0
  113. package/dist/chunk-RFB7B6XG.cjs +169 -0
  114. package/dist/chunk-RFB7B6XG.cjs.map +1 -0
  115. package/dist/{chunk-SZSJGZSO.js → chunk-SQQU3WRB.js} +714 -5
  116. package/dist/chunk-SQQU3WRB.js.map +1 -0
  117. package/dist/{chunk-OALEDG67.cjs → chunk-TNESYDBR.cjs} +5 -5
  118. package/dist/{chunk-OALEDG67.cjs.map → chunk-TNESYDBR.cjs.map} +1 -1
  119. package/dist/chunk-TTS353W2.js +163 -0
  120. package/dist/chunk-TTS353W2.js.map +1 -0
  121. package/dist/{chunk-CROGFB46.cjs → chunk-U7OUZHBH.cjs} +753 -2
  122. package/dist/chunk-U7OUZHBH.cjs.map +1 -0
  123. package/dist/{chunk-BQ77KSXU.js → chunk-UORU5S7Y.js} +3 -3
  124. package/dist/{chunk-BQ77KSXU.js.map → chunk-UORU5S7Y.js.map} +1 -1
  125. package/dist/{chunk-FYZXDZM7.js → chunk-VFF76GTB.js} +4 -4
  126. package/dist/{chunk-FYZXDZM7.js.map → chunk-VFF76GTB.js.map} +1 -1
  127. package/dist/{chunk-E4H5H2C3.cjs → chunk-VYTK2WJB.cjs} +4 -4
  128. package/dist/{chunk-E4H5H2C3.cjs.map → chunk-VYTK2WJB.cjs.map} +1 -1
  129. package/dist/{chunk-XI37A7HH.js → chunk-WKSP73RU.js} +3 -3
  130. package/dist/{chunk-XI37A7HH.js.map → chunk-WKSP73RU.js.map} +1 -1
  131. package/dist/chunk-WP4VIOOA.cjs +15 -0
  132. package/dist/chunk-WP4VIOOA.cjs.map +1 -0
  133. package/dist/{chunk-YF3QUHKN.cjs → chunk-X3XPXEIM.cjs} +14 -15
  134. package/dist/chunk-X3XPXEIM.cjs.map +1 -0
  135. package/dist/{chunk-VZPFYZZU.cjs → chunk-Z2HEBOA3.cjs} +8 -8
  136. package/dist/{chunk-VZPFYZZU.cjs.map → chunk-Z2HEBOA3.cjs.map} +1 -1
  137. package/dist/{chunk-Q7CQYYZW.cjs → chunk-ZMYW5M75.cjs} +5 -5
  138. package/dist/chunk-ZMYW5M75.cjs.map +1 -0
  139. package/dist/{chunk-7UENVUA6.js → chunk-ZW2AWACP.js} +3 -3
  140. package/dist/{chunk-7UENVUA6.js.map → chunk-ZW2AWACP.js.map} +1 -1
  141. package/dist/citations/index.cjs +10 -10
  142. package/dist/citations/index.js +2 -2
  143. package/dist/collaboration/contacts/contact-form.d.ts +47 -0
  144. package/dist/collaboration/contacts/index.d.ts +3 -1
  145. package/dist/collaboration/contacts/invite-plan.d.ts +46 -0
  146. package/dist/collaboration/contacts/parseEmails.d.ts +7 -0
  147. package/dist/collaboration/index.cjs +163 -83
  148. package/dist/collaboration/index.js +2 -2
  149. package/dist/components/ActionLink.d.ts +1 -1
  150. package/dist/components/TeamGrid.d.ts +1 -1
  151. package/dist/components/editorial/{ProfileCard.d.ts → EditorialProfileCard.d.ts} +2 -2
  152. package/dist/components/editorial/index.d.ts +1 -1
  153. package/dist/connect/docx.cjs +14 -13
  154. package/dist/connect/docx.d.ts +1 -1
  155. package/dist/connect/docx.js +10 -9
  156. package/dist/connect/index.cjs +22053 -14708
  157. package/dist/connect/index.cjs.map +1 -1
  158. package/dist/connect/index.d.ts +11 -7
  159. package/dist/connect/index.js +15193 -7911
  160. package/dist/connect/index.js.map +1 -1
  161. package/dist/connect/viewer.cjs +86 -141
  162. package/dist/connect/viewer.cjs.map +1 -1
  163. package/dist/connect/viewer.d.ts +3 -2
  164. package/dist/connect/viewer.js +28 -85
  165. package/dist/connect/viewer.js.map +1 -1
  166. package/dist/connection/ConnectedSettings.d.ts +3 -2
  167. package/dist/connection/ConnectionProvider.d.ts +5 -4
  168. package/dist/connection/StreamedArtifact.d.ts +1 -1
  169. package/dist/connection/billing/index.d.ts +3 -3
  170. package/dist/connection/billing/support.d.ts +4 -7
  171. package/dist/connection/contacts/ConnectedAddContacts.d.ts +9 -0
  172. package/dist/connection/contacts/ConnectedContactCardForm.d.ts +11 -0
  173. package/dist/connection/contacts/ConnectedContactToggle.d.ts +16 -0
  174. package/dist/connection/contacts/ConnectedContactsDirectory.d.ts +10 -0
  175. package/dist/connection/contacts/ImportVcf.d.ts +29 -0
  176. package/dist/connection/contacts/index.d.ts +5 -0
  177. package/dist/connection/defaultHost.d.ts +9 -0
  178. package/dist/connection/docx/ConnectedNativeDocxEditor.d.ts +3 -3
  179. package/dist/connection/docx/support.d.ts +10 -9
  180. package/dist/connection/files/bulk/ConnectedFilesBulkActions.d.ts +22 -0
  181. package/dist/connection/files/bulk/useDocumentBulkActions.d.ts +19 -0
  182. package/dist/connection/files/explorer/FileTiles.d.ts +6 -3
  183. package/dist/connection/files/fields/ConnectedBulkTagEditor.d.ts +16 -0
  184. package/dist/connection/files/fields/ConnectedFieldsEditor.d.ts +40 -0
  185. package/dist/connection/files/fields/ConnectedFieldsManager.d.ts +33 -0
  186. package/dist/connection/files/fields/ConnectedTagEditorDialog.d.ts +20 -0
  187. package/dist/connection/files/fields/ConnectedTagForm.d.ts +54 -0
  188. package/dist/connection/files/fields/DocumentFieldParts.d.ts +33 -0
  189. package/dist/connection/files/fields/DocumentUser.d.ts +11 -0
  190. package/dist/connection/files/fields/documentField.d.ts +48 -0
  191. package/dist/connection/files/fields/useFieldWrites.d.ts +20 -0
  192. package/dist/connection/files/fields/useFieldsApply.d.ts +49 -0
  193. package/dist/connection/files/fields/useMemberLookup.d.ts +3 -0
  194. package/dist/connection/files/grid/ConnectedTagEntity.d.ts +19 -0
  195. package/dist/connection/files/grid/cells.d.ts +85 -0
  196. package/dist/connection/files/grid/documentColumns.d.ts +66 -0
  197. package/dist/connection/files/grid/documentGridBus.d.ts +48 -0
  198. package/dist/connection/files/grid/documentStatus.d.ts +43 -0
  199. package/dist/connection/files/grid/familyMeta.d.ts +21 -0
  200. package/dist/connection/files/grid/tagColumn.d.ts +23 -0
  201. package/dist/connection/files/grid/useDocumentGridSync.d.ts +48 -0
  202. package/dist/connection/files/grid/useDocumentTable.d.ts +30 -0
  203. package/dist/connection/files/index.d.ts +36 -2
  204. package/dist/connection/files/move/ConnectedMoveToFolder.d.ts +31 -0
  205. package/dist/connection/files/page/ConnectedFilesPage.d.ts +86 -0
  206. package/dist/connection/files/page/DocumentsFilterBarActions.d.ts +39 -0
  207. package/dist/connection/files/page/DocumentsUploadButton.d.ts +25 -0
  208. package/dist/connection/files/page/PersistedGridView.d.ts +6 -0
  209. package/dist/connection/files/page/ProgressiveLoadingChip.d.ts +12 -0
  210. package/dist/connection/files/page/useDocumentNavigation.d.ts +20 -0
  211. package/dist/connection/files/review/ConnectedAiReview.d.ts +40 -0
  212. package/dist/connection/files/review/reviewProgress.d.ts +2 -0
  213. package/dist/connection/files/store.d.ts +96 -0
  214. package/dist/connection/files/useDocumentFilters.d.ts +54 -0
  215. package/dist/connection/files/views/ViewSelector.d.ts +33 -0
  216. package/dist/connection/files/views/tableViews.d.ts +22 -0
  217. package/dist/connection/files/views/useTableViews.d.ts +22 -0
  218. package/dist/connection/mail/ConnectedMailbox.d.ts +2 -2
  219. package/dist/connection/messenger/ChatAttachments.d.ts +15 -0
  220. package/dist/connection/messenger/ConnectedChatThread.d.ts +21 -0
  221. package/dist/connection/messenger/ConnectedGroupMembers.d.ts +20 -0
  222. package/dist/connection/messenger/ConnectedMessenger.d.ts +52 -0
  223. package/dist/connection/messenger/index.d.ts +6 -0
  224. package/dist/connection/messenger/types.d.ts +103 -0
  225. package/dist/connection/messenger/useMessengerRows.d.ts +19 -0
  226. package/dist/connection/tags/ConnectedTagsPage.d.ts +2 -35
  227. package/dist/connection/viewer/ConnectedDocumentToolsProvider.d.ts +19 -2
  228. package/dist/connection/viewer/ConnectedDocumentViewer.d.ts +1 -1
  229. package/dist/connection/viewer/support.d.ts +21 -15
  230. package/dist/connection/workspaceData.d.ts +134 -8
  231. package/dist/facts/index.cjs +3 -3
  232. package/dist/facts/index.js +2 -2
  233. package/dist/files/bulk/BulkActionsBar.d.ts +9 -5
  234. package/dist/files/cells/DocumentNameCell.d.ts +4 -2
  235. package/dist/files/cells/MultiSelectCellEditor.d.ts +13 -0
  236. package/dist/files/cells/RelatedDocsCell.d.ts +2 -1
  237. package/dist/files/cells/index.d.ts +1 -0
  238. package/dist/files/documentColumns.d.ts +15 -0
  239. package/dist/files/folders/DocumentsFolderButton.d.ts +26 -0
  240. package/dist/files/folders/FolderTreePicker.d.ts +16 -0
  241. package/dist/files/folders/index.d.ts +2 -0
  242. package/dist/files/index.cjs +430 -434
  243. package/dist/files/index.d.ts +4 -1
  244. package/dist/files/index.js +5 -5
  245. package/dist/files/navigator/DocumentSearchList.d.ts +19 -0
  246. package/dist/files/navigator/ExplorerFileNavigator.d.ts +23 -0
  247. package/dist/files/navigator/NavDocumentPicker.d.ts +15 -0
  248. package/dist/files/navigator/NavigatorPickerBar.d.ts +26 -0
  249. package/dist/files/navigator/index.d.ts +5 -0
  250. package/dist/files/navigator/types.d.ts +7 -0
  251. package/dist/files/tags/BulkTagEditor.d.ts +2 -1
  252. package/dist/files/tags/index.d.ts +0 -2
  253. package/dist/files/visibility.d.ts +6 -5
  254. package/dist/home/StartTiles.d.ts +1 -1
  255. package/dist/home/index.cjs +30 -30
  256. package/dist/home/index.js +5 -5
  257. package/dist/index.cjs +684 -694
  258. package/dist/index.cjs.map +1 -1
  259. package/dist/index.d.ts +2 -1
  260. package/dist/index.js +22 -134
  261. package/dist/index.js.map +1 -1
  262. package/dist/provider/{BlocksProvider.d.ts → environment.d.ts} +8 -10
  263. package/dist/provider/host.d.ts +44 -0
  264. package/dist/retrieval/index.cjs +4 -4
  265. package/dist/retrieval/index.js +2 -2
  266. package/dist/shell/index.cjs +44 -44
  267. package/dist/shell/index.js +3 -3
  268. package/dist/shell/types.d.ts +1 -1
  269. package/dist/site/index.cjs +61 -61
  270. package/dist/site/index.js +2 -2
  271. package/dist/studio/index.cjs +86 -87
  272. package/dist/studio/index.cjs.map +1 -1
  273. package/dist/studio/index.js +15 -16
  274. package/dist/studio/index.js.map +1 -1
  275. package/dist/workflow-canvas/index.cjs +28 -27
  276. package/dist/workflow-canvas/index.cjs.map +1 -1
  277. package/dist/workflow-canvas/index.js +11 -10
  278. package/dist/workflow-canvas/index.js.map +1 -1
  279. package/dist/workspaces/WorkspaceCard.d.ts +1 -1
  280. package/dist/workspaces/index.cjs +20 -20
  281. package/dist/workspaces/index.js +4 -4
  282. package/node_modules/@arbidocs/coedit/package.json +1 -1
  283. package/package.json +5 -5
  284. package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +0 -1
  285. package/dist/FactTextEditor-YESAU2IJ.js.map +0 -1
  286. package/dist/FactTextEditor-YUPBCTXK.cjs.map +0 -1
  287. package/dist/WorkspaceTableView-DWUE4VQF.js.map +0 -1
  288. package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +0 -1
  289. package/dist/chunk-2BHDRVVL.cjs.map +0 -1
  290. package/dist/chunk-3VULDTNL.cjs.map +0 -1
  291. package/dist/chunk-4RPBUMHB.cjs.map +0 -1
  292. package/dist/chunk-5ZIYPZYE.js +0 -2748
  293. package/dist/chunk-5ZIYPZYE.js.map +0 -1
  294. package/dist/chunk-6I6CVX5G.cjs +0 -22
  295. package/dist/chunk-6I6CVX5G.cjs.map +0 -1
  296. package/dist/chunk-7NL6WJER.cjs +0 -682
  297. package/dist/chunk-7NL6WJER.cjs.map +0 -1
  298. package/dist/chunk-CB4TIDEX.cjs +0 -54
  299. package/dist/chunk-CB4TIDEX.cjs.map +0 -1
  300. package/dist/chunk-CNHUJRQ4.cjs.map +0 -1
  301. package/dist/chunk-CROGFB46.cjs.map +0 -1
  302. package/dist/chunk-DEPF5LQI.js.map +0 -1
  303. package/dist/chunk-ETZ5A3GU.js.map +0 -1
  304. package/dist/chunk-EYJMMGXF.js +0 -19
  305. package/dist/chunk-EYJMMGXF.js.map +0 -1
  306. package/dist/chunk-F57LNUSZ.js.map +0 -1
  307. package/dist/chunk-FAXXN7KI.cjs.map +0 -1
  308. package/dist/chunk-FM3IRQJW.cjs.map +0 -1
  309. package/dist/chunk-FTZ45WHY.js.map +0 -1
  310. package/dist/chunk-GC2FSPSQ.cjs.map +0 -1
  311. package/dist/chunk-KDLX5AA7.js +0 -49
  312. package/dist/chunk-KDLX5AA7.js.map +0 -1
  313. package/dist/chunk-KFMRBZQK.js.map +0 -1
  314. package/dist/chunk-MNG7N6M2.js.map +0 -1
  315. package/dist/chunk-NPLGB4LI.cjs.map +0 -1
  316. package/dist/chunk-P2YM67Y5.cjs.map +0 -1
  317. package/dist/chunk-P6RIBIVN.js.map +0 -1
  318. package/dist/chunk-Q7CQYYZW.cjs.map +0 -1
  319. package/dist/chunk-QJFJ5JBF.cjs +0 -2838
  320. package/dist/chunk-QJFJ5JBF.cjs.map +0 -1
  321. package/dist/chunk-RATEAOKT.js.map +0 -1
  322. package/dist/chunk-SDOEHEJP.js.map +0 -1
  323. package/dist/chunk-SZSJGZSO.js.map +0 -1
  324. package/dist/chunk-TC3RQNEX.cjs.map +0 -1
  325. package/dist/chunk-TF7HN5EU.js.map +0 -1
  326. package/dist/chunk-VF5EUAIV.js.map +0 -1
  327. package/dist/chunk-VTTZZ4FN.js.map +0 -1
  328. package/dist/chunk-WK6FVIF7.js +0 -654
  329. package/dist/chunk-WK6FVIF7.js.map +0 -1
  330. package/dist/chunk-YF3QUHKN.cjs.map +0 -1
  331. package/dist/connection/ArbiAppProvider.d.ts +0 -16
  332. package/dist/connection/files/support.d.ts +0 -40
  333. package/dist/files/tags/DocTagPopover.d.ts +0 -113
  334. package/dist/files/tags/TagManager.d.ts +0 -54
@@ -4,6 +4,7 @@
4
4
  var chunk7G2LJMUG_cjs = require('./chunk-7G2LJMUG.cjs');
5
5
  var chunkC2CWWEHO_cjs = require('./chunk-C2CWWEHO.cjs');
6
6
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
7
+ var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
7
8
  var lucideReact = require('lucide-react');
8
9
  var ui = require('@arbidocs/react/ui');
9
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -163,6 +164,714 @@ function RoleSelect({ value, roles, onChange, description }) {
163
164
  ] });
164
165
  }
165
166
 
167
+ // src/collaboration/contacts/parseEmails.ts
168
+ var MAX_INVITE_EMAILS = 100;
169
+ var EMAIL = /^[^\s@,;]+@[^\s@,;]+\.[^\s@,;]+$/;
170
+ function parseEmails(text) {
171
+ const parts = text.split(/[\s,;]+/).map((e) => e.trim().toLowerCase());
172
+ return [...new Set(parts.filter((e) => EMAIL.test(e)))];
173
+ }
174
+ var DEFAULT_CONTACT_OUTCOME_LABELS = {
175
+ contact_added: "Added to contacts (existing user)",
176
+ already_contact: "Already in your contacts",
177
+ invited: "Invitation sent",
178
+ reinvited: "Previous invitation expired, new one sent",
179
+ not_resent_still_pending: "Invitation already pending, not resent",
180
+ failed: "Could not be invited",
181
+ added: "Added successfully"
182
+ };
183
+ function contactOutcomeMessage(row, labels = {}) {
184
+ const l = { ...DEFAULT_CONTACT_OUTCOME_LABELS, ...labels };
185
+ const base = row.outcome ? l[row.outcome] : row.status === "registered" ? l.contact_added : l.added;
186
+ return row.outcome_detail ? `${base} \u2014 ${row.outcome_detail}` : base;
187
+ }
188
+ function toAddContactsRow(row, labels = {}) {
189
+ return {
190
+ email: row.email ?? "",
191
+ status: row.outcome === "failed" ? "failed" : "success",
192
+ message: contactOutcomeMessage(row, labels)
193
+ };
194
+ }
195
+ var toAddContactsRows = (rows, labels) => rows.map((r) => toAddContactsRow(r, labels));
196
+ var DEFAULT_ADD_CONTACTS_LABELS = {
197
+ placeholder: "name@example.com",
198
+ hint: "Paste one or multiple emails \u2014 separated by commas, spaces, or new lines.",
199
+ add: (count) => `Add${count > 0 ? ` (${count})` : ""}`,
200
+ addOverMax: (count, max) => `Add (${count}) - Max ${max}`,
201
+ adding: "Adding...",
202
+ cancel: "Cancel",
203
+ results: "Results",
204
+ email: "Email",
205
+ status: "Status",
206
+ done: "Done",
207
+ addMore: "Add More",
208
+ reward: (amount) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
209
+ "Get ",
210
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold text-foreground", children: [
211
+ amount,
212
+ " off your next invoice"
213
+ ] }),
214
+ " for every invited contact who goes Pro. They get ",
215
+ amount,
216
+ " off theirs."
217
+ ] })
218
+ };
219
+ function AddContactsForm({
220
+ value,
221
+ onChange,
222
+ emailCount: emailCountProp,
223
+ maxEmails = MAX_INVITE_EMAILS,
224
+ isPending,
225
+ onSubmit,
226
+ onCancel,
227
+ rewardAmount,
228
+ labels
229
+ }) {
230
+ const l = react.useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels]);
231
+ const emails = react.useMemo(() => parseEmails(value), [value]);
232
+ const emailCount = emailCountProp ?? emails.length;
233
+ const overMax = emailCount > maxEmails;
234
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-slot": "add-contacts-form", children: [
235
+ rewardAmount && /* @__PURE__ */ jsxRuntime.jsxs(
236
+ "div",
237
+ {
238
+ className: "flex items-start gap-2 rounded-md bg-green-bg p-3 text-sm",
239
+ "data-testid": "invite-reward-banner",
240
+ children: [
241
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gift, { className: "mt-0.5 size-4 shrink-0 text-green-text" }),
242
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: l.reward(rewardAmount) })
243
+ ]
244
+ }
245
+ ),
246
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
247
+ /* @__PURE__ */ jsxRuntime.jsx(
248
+ ui.Textarea,
249
+ {
250
+ id: "invite-emails",
251
+ value,
252
+ onChange: (e) => onChange(e.target.value),
253
+ disabled: isPending,
254
+ placeholder: l.placeholder,
255
+ rows: 2,
256
+ autoFocus: true,
257
+ "data-testid": "invite-emails-input"
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground", children: l.hint })
261
+ ] }),
262
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 pt-2", children: [
263
+ /* @__PURE__ */ jsxRuntime.jsx(
264
+ ui.Button,
265
+ {
266
+ onClick: () => onSubmit(emails),
267
+ disabled: emailCount === 0 || overMax || isPending,
268
+ className: "w-full",
269
+ "data-testid": "invite-send-button",
270
+ children: isPending ? l.adding : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
271
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AtSign, { className: "mr-2 size-4" }),
272
+ overMax ? l.addOverMax(emailCount, maxEmails) : l.add(emailCount)
273
+ ] })
274
+ }
275
+ ),
276
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", onClick: onCancel, disabled: isPending, className: "w-full", children: l.cancel })
277
+ ] })
278
+ ] });
279
+ }
280
+ var STATUS_ICON = {
281
+ success: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle, { className: "size-4 shrink-0 text-green-text" }),
282
+ failed: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XCircle, { className: "size-4 shrink-0 text-red-text" }),
283
+ pending: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "size-4 shrink-0 text-yellow-text" })
284
+ };
285
+ function AddContactsResults({ rows, onDone, onAddMore, labels }) {
286
+ const l = react.useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels]);
287
+ return /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { children: [
288
+ /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { children: l.results }),
289
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto rounded-md border", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full", children: [
290
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "sticky top-0 bg-muted/50", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
291
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2 text-left font-medium", children: l.email }),
292
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2 text-left font-medium", children: l.status })
293
+ ] }) }),
294
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxRuntime.jsxs(
295
+ "tr",
296
+ {
297
+ className: "border-t hover:bg-muted/30",
298
+ "data-testid": `email-status-row-${index}`,
299
+ children: [
300
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2", children: row.email }),
301
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
302
+ STATUS_ICON[row.status],
303
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: row.message })
304
+ ] }) })
305
+ ]
306
+ },
307
+ index
308
+ )) })
309
+ ] }) }),
310
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 pt-4", children: [
311
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onDone, className: "w-full", "data-testid": "close-results-button", children: l.done }),
312
+ /* @__PURE__ */ jsxRuntime.jsx(
313
+ ui.Button,
314
+ {
315
+ variant: "outline",
316
+ onClick: onAddMore,
317
+ className: "w-full",
318
+ "data-testid": "start-over-button",
319
+ children: l.addMore
320
+ }
321
+ )
322
+ ] })
323
+ ] });
324
+ }
325
+
326
+ // src/collaboration/contacts/invite-plan.ts
327
+ function emailTokens(text) {
328
+ return [
329
+ ...new Set(
330
+ text.split(/[,;\s]+/).map((e) => e.trim().toLowerCase()).filter(Boolean)
331
+ )
332
+ ];
333
+ }
334
+ var EMAIL2 = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
335
+ var isInvitableEmail = (email) => EMAIL2.test(email) && !email.includes("..");
336
+ var DEFAULT_CONTACT_INVITE_LABELS = {
337
+ invalid: "Invalid email format (excluded)",
338
+ self: "Can't add yourself as a contact",
339
+ resending: "Resending invitation...",
340
+ sending: "Sending...",
341
+ alreadyInvited: "User already in contacts (invitation pending)",
342
+ alreadyRegistered: "User already in contacts (registered)",
343
+ notProcessed: "Not processed by server (may be rate limited or invalid)"
344
+ };
345
+ function planContactInvites(text, contacts, selfEmail, labels = {}) {
346
+ const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels };
347
+ const me = selfEmail?.toLowerCase();
348
+ const tokens = emailTokens(text);
349
+ const invalid = tokens.filter((e) => !isInvitableEmail(e));
350
+ const valid = tokens.filter((e) => isInvitableEmail(e));
351
+ const rows = invalid.map((email) => ({
352
+ email,
353
+ status: "failed",
354
+ message: l.invalid
355
+ }));
356
+ const self = valid.filter((e) => me && e === me);
357
+ rows.push(...self.map((email) => ({ email, status: "failed", message: l.self })));
358
+ const send = [];
359
+ for (const email of valid) {
360
+ if (me && email === me) continue;
361
+ const existing = contacts.find((c) => c.email?.toLowerCase() === email);
362
+ if (!existing) {
363
+ send.push(email);
364
+ rows.push({ email, status: "pending", message: l.sending });
365
+ } else if (existing.status === "expired") {
366
+ send.push(email);
367
+ rows.push({ email, status: "pending", message: l.resending });
368
+ } else
369
+ rows.push({
370
+ email,
371
+ status: "success",
372
+ message: existing.status === "invited" ? l.alreadyInvited : l.alreadyRegistered
373
+ });
374
+ }
375
+ return { rows, send };
376
+ }
377
+ function applyContactInviteResults(plan, response, labels = {}) {
378
+ const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels };
379
+ return plan.rows.map((row) => {
380
+ if (!plan.send.includes(row.email)) return row;
381
+ const answer = response.find((c) => c.email?.toLowerCase() === row.email);
382
+ return answer ? { ...toAddContactsRow(answer, labels), email: row.email } : { email: row.email, status: "failed", message: l.notProcessed };
383
+ });
384
+ }
385
+ function failContactInvites(plan, message) {
386
+ return plan.rows.map(
387
+ (row) => plan.send.includes(row.email) ? { ...row, status: "failed", message } : row
388
+ );
389
+ }
390
+ function summarizeContactInvites(response) {
391
+ const count = (...outcomes) => response.filter((c) => outcomes.includes(c.outcome)).length;
392
+ const added = count("contact_added");
393
+ const sent = count("invited", "reinvited");
394
+ const failed = count("failed");
395
+ const notResent = count("not_resent_still_pending");
396
+ const parts = [];
397
+ if (added) parts.push(`${added} contact${added !== 1 ? "s" : ""} added`);
398
+ if (sent) parts.push(`${sent} invitation email${sent !== 1 ? "s" : ""} sent`);
399
+ if (notResent) parts.push(`${notResent} already pending`);
400
+ if (failed) parts.push(`${failed} failed`);
401
+ return { message: parts.length ? parts.join(", ") : "No changes", failed: failed > 0 };
402
+ }
403
+ function summarizeUnsentInvites(rows, labels = {}) {
404
+ const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels };
405
+ const already = rows.filter(
406
+ (r) => r.message === l.alreadyInvited || r.message === l.alreadyRegistered
407
+ ).length;
408
+ const excluded = rows.filter((r) => r.message === l.invalid).length;
409
+ if (already && excluded) return `${already} already in contacts, ${excluded} excluded`;
410
+ if (already) return `All ${already} email${already !== 1 ? "s are" : " is"} already in contacts`;
411
+ return "All emails excluded (invalid or duplicate)";
412
+ }
413
+
414
+ // src/collaboration/contacts/contact-form.ts
415
+ var EMPTY_CONTACT_FORM = {
416
+ name: "",
417
+ emails: [{ value: "", type: "" }],
418
+ phones: [{ value: "", type: "" }],
419
+ addresses: [],
420
+ organization: "",
421
+ title: "",
422
+ birthday: "",
423
+ anniversary: "",
424
+ note: "",
425
+ nickname: "",
426
+ urls: []
427
+ };
428
+ function str(v) {
429
+ return typeof v === "string" ? v : "";
430
+ }
431
+ function contactToForm(c) {
432
+ const pick = (rows, key) => (rows ?? []).map((row) => {
433
+ const r = row;
434
+ return { value: str(r[key]), type: str(r.type) };
435
+ });
436
+ const emails = pick(c.emails, "email");
437
+ const phones = pick(c.phones, "number");
438
+ return {
439
+ name: c.name ?? "",
440
+ emails: emails.length ? emails : [{ value: "", type: "" }],
441
+ phones: phones.length ? phones : [{ value: "", type: "" }],
442
+ addresses: pick(c.addresses, "value"),
443
+ organization: c.organization ?? "",
444
+ title: c.title ?? "",
445
+ birthday: c.birthday ?? "",
446
+ anniversary: c.anniversary ?? "",
447
+ note: c.note ?? "",
448
+ nickname: c.nickname ?? "",
449
+ urls: c.urls ?? []
450
+ };
451
+ }
452
+ var FULL_DATE = /^\d{4}-\d{2}-\d{2}$/;
453
+ var NO_YEAR = /^--\d{2}-\d{2}$/;
454
+ var MONTH_DAY = /^\d{2}-\d{2}$/;
455
+ function normalizeVCardDate(input) {
456
+ const v = input.trim();
457
+ if (!v) return null;
458
+ const candidate = MONTH_DAY.test(v) ? `--${v}` : v;
459
+ if (!FULL_DATE.test(candidate) && !NO_YEAR.test(candidate)) return void 0;
460
+ const [m, d] = candidate.slice(-5).split("-").map(Number);
461
+ if (m < 1 || m > 12 || d < 1 || d > 31) return void 0;
462
+ if (FULL_DATE.test(candidate)) {
463
+ const y = Number(candidate.slice(0, 4));
464
+ const t = new Date(Date.UTC(y, m - 1, d));
465
+ if (t.getUTCMonth() !== m - 1) return void 0;
466
+ } else {
467
+ const max = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1];
468
+ if (d > max) return void 0;
469
+ }
470
+ return candidate;
471
+ }
472
+ var EMAIL3 = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
473
+ function validateContactForm(f) {
474
+ const errors = {};
475
+ if (!f.name.trim()) errors.name = "Enter a name";
476
+ if (f.emails.some((e) => e.value.trim() && !EMAIL3.test(e.value.trim())))
477
+ errors.emails = "Check the e-mail address";
478
+ if (normalizeVCardDate(f.birthday) === void 0)
479
+ errors.birthday = "Use YYYY-MM-DD, or --MM-DD without a year";
480
+ if (normalizeVCardDate(f.anniversary) === void 0)
481
+ errors.anniversary = "Use YYYY-MM-DD, or --MM-DD without a year";
482
+ return errors;
483
+ }
484
+ function formToContactCard(f) {
485
+ const rows = (list) => list.map((r) => ({ value: r.value.trim(), type: r.type.trim() || null })).filter((r) => r.value);
486
+ const opt = (v) => v.trim() || null;
487
+ return {
488
+ name: f.name.trim(),
489
+ emails: rows(f.emails).map((r) => ({ email: r.value, type: r.type })),
490
+ phones: rows(f.phones).map((r) => ({ number: r.value, type: r.type })),
491
+ addresses: rows(f.addresses).map((r) => ({ value: r.value, type: r.type })),
492
+ organization: opt(f.organization),
493
+ title: opt(f.title),
494
+ birthday: normalizeVCardDate(f.birthday) ?? null,
495
+ anniversary: normalizeVCardDate(f.anniversary) ?? null,
496
+ note: opt(f.note),
497
+ nickname: opt(f.nickname),
498
+ urls: f.urls.map((u) => u.trim()).filter(Boolean)
499
+ };
500
+ }
501
+ function inviteEmail(f) {
502
+ const first = f.emails.map((e) => e.value.trim()).find((e) => EMAIL3.test(e));
503
+ return first ? first.toLowerCase() : null;
504
+ }
505
+ function contactName(c) {
506
+ const user = c.user ? [c.user.given_name, c.user.family_name].filter(Boolean).join(" ") : "";
507
+ return c.card?.name || user || c.email || "";
508
+ }
509
+ function primaryEmail(c) {
510
+ return c.email || c.card?.emails?.[0]?.email || null;
511
+ }
512
+ function matchesContact(c, q) {
513
+ const term = q.trim().toLowerCase();
514
+ if (!term) return true;
515
+ const card = c.card;
516
+ const hay = [
517
+ contactName(c),
518
+ c.email,
519
+ card?.organization,
520
+ card?.title,
521
+ card?.nickname,
522
+ ...(card?.emails ?? []).map((e) => e.email),
523
+ ...(card?.phones ?? []).map((p) => p.number)
524
+ ];
525
+ return hay.some((h) => h && h.toLowerCase().includes(term));
526
+ }
527
+ function contactStatusLabel(status) {
528
+ switch (status) {
529
+ case "registered":
530
+ return "On ARBI";
531
+ case "invited":
532
+ return "Invited";
533
+ case "expired":
534
+ return "Invite expired";
535
+ case "failed":
536
+ return "Invite failed";
537
+ default:
538
+ return null;
539
+ }
540
+ }
541
+ function summarizeImport(r) {
542
+ const parts = [`${r.added} added`];
543
+ if (r.matched) parts.push(`${r.matched} matched existing contact${r.matched === 1 ? "" : "s"}`);
544
+ if (r.skipped.length) parts.push(`${r.skipped.length} skipped`);
545
+ return parts.join(", ");
546
+ }
547
+ var DEFAULT_DM_INVITE_CHIP_LABELS = {
548
+ title: "Add a contact by email",
549
+ description: "Send an invitation to join you on ARBI"
550
+ };
551
+ function DmInviteChip({
552
+ onClick,
553
+ title,
554
+ description,
555
+ testId = "dm-invite-chip",
556
+ labels
557
+ }) {
558
+ const l = react.useMemo(() => ({ ...DEFAULT_DM_INVITE_CHIP_LABELS, ...labels }), [labels]);
559
+ return /* @__PURE__ */ jsxRuntime.jsxs(
560
+ "button",
561
+ {
562
+ type: "button",
563
+ onClick,
564
+ "data-testid": testId,
565
+ className: "flex w-full items-center gap-3 border-b border-border px-4 py-3 text-left transition-colors hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11",
566
+ children: [
567
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-ai-accent-soft", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserPlus, { className: "size-4 text-ai-accent" }) }),
568
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
569
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm font-semibold text-foreground", children: title ?? l.title }),
570
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: description ?? l.description })
571
+ ] })
572
+ ]
573
+ }
574
+ );
575
+ }
576
+ function DmThreadHeader({
577
+ avatar,
578
+ name,
579
+ badge,
580
+ presence,
581
+ email,
582
+ menu,
583
+ testId = "dm-active-chip"
584
+ }) {
585
+ return /* @__PURE__ */ jsxRuntime.jsxs(
586
+ "div",
587
+ {
588
+ className: "flex items-center gap-1 border-b border-border pr-2",
589
+ "data-slot": "dm-thread-header",
590
+ children: [
591
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": testId, className: "flex min-w-0 flex-1 items-center gap-3 px-4 py-2.5", children: [
592
+ avatar,
593
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
594
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
595
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-sm font-semibold text-foreground", children: name }),
596
+ badge
597
+ ] }),
598
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
599
+ presence,
600
+ presence && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "\xB7" }),
601
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate text-xs text-muted-foreground", children: email ?? "" })
602
+ ] })
603
+ ] })
604
+ ] }),
605
+ menu
606
+ ]
607
+ }
608
+ );
609
+ }
610
+ var DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS = {
611
+ requestedAccess: " requested workspace access",
612
+ review: "Review"
613
+ };
614
+ var DEFAULT_DM_THREAD_FRAME_LABELS = {
615
+ noMessages: "No messages yet \u2014 say hi \u{1F44B}"
616
+ };
617
+ var DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS = {
618
+ title: "Grant workspace access",
619
+ description: (peerName) => `Give ${peerName} access to one of your workspaces. Access is permanent until you remove it.`,
620
+ noWorkspace: "Open the workspace you want to share, as its owner, and you can grant access to it from here.",
621
+ workspace: "Workspace",
622
+ role: "Role",
623
+ cancel: "Cancel",
624
+ grantAccess: "Grant access"
625
+ };
626
+ var DEFAULT_RECIPIENT_PICKER_LABELS = {
627
+ to: "To",
628
+ unmuteNotifications: "Unmute notifications",
629
+ muteNotifications: "Mute notifications",
630
+ removeRecipient: "Remove recipient",
631
+ selectRecipient: "Select recipient...",
632
+ addRecipient: "Add recipient",
633
+ searchUsers: "Search users...",
634
+ noKnownUsers: "No known users",
635
+ noMatchingUsers: "No matching users",
636
+ addContactsHint: "Add contacts or join workspaces to send private messages"
637
+ };
638
+ function ActionMenu({ label, testId, entries, contentClassName = "w-56" }) {
639
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
640
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
641
+ ui.Button,
642
+ {
643
+ variant: "ghost",
644
+ size: "icon",
645
+ className: "size-7 shrink-0 text-muted-foreground hover:text-foreground pointer-coarse:size-11",
646
+ "aria-label": label,
647
+ "data-testid": testId,
648
+ onClick: (e) => e.stopPropagation(),
649
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreVertical, { className: "size-4" })
650
+ }
651
+ ) }),
652
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuContent, { align: "end", className: contentClassName, children: entries.map(
653
+ (entry) => "separator" in entry ? /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSeparator, {}, entry.id) : /* @__PURE__ */ jsxRuntime.jsxs(
654
+ ui.DropdownMenuItem,
655
+ {
656
+ onClick: entry.onSelect,
657
+ className: entry.destructive ? "text-destructive focus:text-destructive" : void 0,
658
+ "data-testid": entry.testId,
659
+ children: [
660
+ entry.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-2 inline-flex size-4 items-center", children: entry.icon }),
661
+ entry.label
662
+ ]
663
+ },
664
+ entry.id
665
+ )
666
+ ) })
667
+ ] });
668
+ }
669
+ function DmInviteAvatar() {
670
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AtSign, { className: "size-4" }) });
671
+ }
672
+ function DmNewTabIcon() {
673
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-5 w-5 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "h-3 w-3 text-primary" }) });
674
+ }
675
+ function DmAccessRequestBanner({
676
+ name,
677
+ onReview,
678
+ labels
679
+ }) {
680
+ const l = react.useMemo(() => ({ ...DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS, ...labels }), [labels]);
681
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-4 mt-3 flex items-center gap-3 rounded-lg bg-muted px-3 py-2.5", children: [
682
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.KeyRound, { className: "h-4 w-4 shrink-0 text-primary" }),
683
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1 text-sm text-foreground", children: [
684
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: name }),
685
+ l.requestedAccess
686
+ ] }),
687
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "sm", onClick: onReview, "data-testid": "dm-review-access-button", children: l.review })
688
+ ] });
689
+ }
690
+ function DmThreadFrame({
691
+ recipientPicker,
692
+ accessBanner,
693
+ hasRecipient,
694
+ isLoading,
695
+ history,
696
+ isEmpty,
697
+ noRecipientPrompt,
698
+ historyRef,
699
+ composer,
700
+ labels
701
+ }) {
702
+ const l = react.useMemo(() => ({ ...DEFAULT_DM_THREAD_FRAME_LABELS, ...labels }), [labels]);
703
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col bg-background", children: [
704
+ recipientPicker,
705
+ accessBanner,
706
+ hasRecipient && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-hidden bg-background", ref: historyRef, children: /* @__PURE__ */ jsxRuntime.jsx(ui.ScrollArea, { className: "h-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3", children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-32 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }) }) : !isEmpty ? history : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: l.noMessages }) }) }) }),
707
+ !hasRecipient && noRecipientPrompt && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center bg-background p-4", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-center text-sm text-muted-foreground", children: noRecipientPrompt }) }),
708
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: composer })
709
+ ] });
710
+ }
711
+ function DmGrantAccessDialogView({
712
+ open,
713
+ onOpenChange,
714
+ peerName,
715
+ workspaceName,
716
+ role,
717
+ onRoleChange,
718
+ roles,
719
+ isGranting,
720
+ onGrant,
721
+ labels
722
+ }) {
723
+ const l = react.useMemo(() => ({ ...DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS, ...labels }), [labels]);
724
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { presentation: "sheet", "data-testid": "dm-grant-access-modal", children: [
725
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
726
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: l.title }),
727
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: l.description(peerName) })
728
+ ] }),
729
+ workspaceName === null ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", "data-testid": "dm-grant-none", children: l.noWorkspace }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
730
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
731
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium", children: l.workspace }),
732
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "rounded-lg bg-muted px-3 py-2 text-sm", "data-testid": "dm-grant-workspace", children: workspaceName })
733
+ ] }),
734
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
735
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium", children: l.role }),
736
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value: role, onValueChange: onRoleChange, children: [
737
+ /* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { "data-testid": "dm-grant-role", children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, {}) }),
738
+ /* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { children: roles.map((r) => /* @__PURE__ */ jsxRuntime.jsxs(ui.SelectItem, { value: r.value, children: [
739
+ r.label,
740
+ " \u2014 ",
741
+ r.hint
742
+ ] }, r.value)) })
743
+ ] })
744
+ ] })
745
+ ] }),
746
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogFooter, { children: [
747
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "ghost", onClick: () => onOpenChange(false), disabled: isGranting, children: l.cancel }),
748
+ /* @__PURE__ */ jsxRuntime.jsxs(
749
+ ui.Button,
750
+ {
751
+ onClick: onGrant,
752
+ disabled: isGranting || workspaceName === null,
753
+ "data-testid": "dm-grant-submit",
754
+ children: [
755
+ isGranting && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-2 size-4 animate-spin" }),
756
+ l.grantAccess
757
+ ]
758
+ }
759
+ )
760
+ ] })
761
+ ] }) });
762
+ }
763
+ function RecipientPicker({
764
+ selected,
765
+ onRemove,
766
+ candidates,
767
+ onPick,
768
+ canAdd,
769
+ isOpen,
770
+ onOpenChange,
771
+ search,
772
+ onSearchChange,
773
+ hasNoKnownUsers,
774
+ labels
775
+ }) {
776
+ const l = react.useMemo(() => ({ ...DEFAULT_RECIPIENT_PICKER_LABELS, ...labels }), [labels]);
777
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 border-b px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
778
+ /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { className: "mb-0 shrink-0 py-1.5", children: l.to }),
779
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-1.5", children: [
780
+ selected.map((recipient) => /* @__PURE__ */ jsxRuntime.jsxs(
781
+ "div",
782
+ {
783
+ className: "flex items-center justify-between gap-2 rounded-md bg-muted/50 px-3 py-1.5",
784
+ children: [
785
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
786
+ recipient.identity,
787
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
788
+ /* @__PURE__ */ jsxRuntime.jsx(
789
+ ui.TooltipTrigger,
790
+ {
791
+ onClick: recipient.onToggleMute,
792
+ "aria-label": recipient.isMuted ? l.unmuteNotifications : l.muteNotifications,
793
+ "aria-pressed": recipient.isMuted,
794
+ className: `rounded p-1 transition-colors hover:bg-muted pointer-coarse:p-3 ${recipient.isMuted ? "text-muted-foreground" : "text-muted-foreground/40 hover:text-muted-foreground"}`,
795
+ disabled: recipient.isMuteBusy,
796
+ children: recipient.isMuted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BellOff, { size: 14, fill: "currentColor" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bell, { size: 14 })
797
+ }
798
+ ),
799
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { className: "max-w-[250px]", children: recipient.muteTooltip })
800
+ ] })
801
+ ] }),
802
+ /* @__PURE__ */ jsxRuntime.jsx(
803
+ "button",
804
+ {
805
+ type: "button",
806
+ onClick: () => onRemove(recipient.id),
807
+ className: "p-1 text-muted-foreground hover:text-destructive pointer-coarse:p-3",
808
+ title: l.removeRecipient,
809
+ "aria-label": l.removeRecipient,
810
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
811
+ }
812
+ )
813
+ ]
814
+ },
815
+ recipient.id
816
+ )),
817
+ canAdd && /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open: isOpen, onOpenChange, children: [
818
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: selected.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
819
+ ui.Button,
820
+ {
821
+ variant: "outline",
822
+ size: "sm",
823
+ disabled: hasNoKnownUsers,
824
+ className: "w-full justify-start text-muted-foreground",
825
+ children: [
826
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "mr-2 h-4 w-4" }),
827
+ l.selectRecipient
828
+ ]
829
+ }
830
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
831
+ ui.Button,
832
+ {
833
+ variant: "ghost",
834
+ size: "icon",
835
+ disabled: hasNoKnownUsers,
836
+ className: "h-7 w-7 rounded-full",
837
+ title: l.addRecipient,
838
+ "aria-label": l.addRecipient,
839
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "h-4 w-4" })
840
+ }
841
+ ) }),
842
+ /* @__PURE__ */ jsxRuntime.jsx(
843
+ ui.PopoverContent,
844
+ {
845
+ className: "w-72 p-0",
846
+ align: "start",
847
+ onPointerDownOutside: (e) => e.preventDefault(),
848
+ children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: false, children: [
849
+ /* @__PURE__ */ jsxRuntime.jsx(
850
+ ui.CommandInput,
851
+ {
852
+ placeholder: l.searchUsers,
853
+ value: search,
854
+ onValueChange: onSearchChange
855
+ }
856
+ ),
857
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandList, { children: candidates.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: hasNoKnownUsers ? l.noKnownUsers : l.noMatchingUsers }) : /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: candidates.map((candidate) => /* @__PURE__ */ jsxRuntime.jsx(
858
+ ui.CommandItem,
859
+ {
860
+ onSelect: () => onPick(candidate.id),
861
+ className: "cursor-pointer justify-start",
862
+ children: candidate.identity
863
+ },
864
+ candidate.id
865
+ )) }) })
866
+ ] })
867
+ }
868
+ )
869
+ ] }),
870
+ hasNoKnownUsers && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.addContactsHint })
871
+ ] })
872
+ ] }) });
873
+ }
874
+
166
875
  // src/collaboration/mail/mailFolders.ts
167
876
  var isInboxFolder = (f) => f.id === "INBOX" || /^inbox$/i.test(f.name);
168
877
  function buildMailFolderTree(folders) {
@@ -921,7 +1630,27 @@ function PlainMailBodyEditor({ text, disabled, onChange }) {
921
1630
  );
922
1631
  }
923
1632
 
1633
+ exports.ActionMenu = ActionMenu;
1634
+ exports.AddContactsForm = AddContactsForm;
1635
+ exports.AddContactsResults = AddContactsResults;
1636
+ exports.DEFAULT_ADD_CONTACTS_LABELS = DEFAULT_ADD_CONTACTS_LABELS;
1637
+ exports.DEFAULT_CONTACT_INVITE_LABELS = DEFAULT_CONTACT_INVITE_LABELS;
1638
+ exports.DEFAULT_CONTACT_OUTCOME_LABELS = DEFAULT_CONTACT_OUTCOME_LABELS;
1639
+ exports.DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS = DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS;
1640
+ exports.DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS = DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS;
1641
+ exports.DEFAULT_DM_INVITE_CHIP_LABELS = DEFAULT_DM_INVITE_CHIP_LABELS;
1642
+ exports.DEFAULT_DM_THREAD_FRAME_LABELS = DEFAULT_DM_THREAD_FRAME_LABELS;
924
1643
  exports.DEFAULT_MAIL_FOLDER_TREE_LABELS = DEFAULT_MAIL_FOLDER_TREE_LABELS;
1644
+ exports.DEFAULT_RECIPIENT_PICKER_LABELS = DEFAULT_RECIPIENT_PICKER_LABELS;
1645
+ exports.DmAccessRequestBanner = DmAccessRequestBanner;
1646
+ exports.DmGrantAccessDialogView = DmGrantAccessDialogView;
1647
+ exports.DmInviteAvatar = DmInviteAvatar;
1648
+ exports.DmInviteChip = DmInviteChip;
1649
+ exports.DmNewTabIcon = DmNewTabIcon;
1650
+ exports.DmThreadFrame = DmThreadFrame;
1651
+ exports.DmThreadHeader = DmThreadHeader;
1652
+ exports.EMPTY_CONTACT_FORM = EMPTY_CONTACT_FORM;
1653
+ exports.MAX_INVITE_EMAILS = MAX_INVITE_EMAILS;
925
1654
  exports.MailDeliveryBadge = MailDeliveryBadge;
926
1655
  exports.MailDeliveryList = MailDeliveryList;
927
1656
  exports.MailDocumentPicker = MailDocumentPicker;
@@ -936,17 +1665,39 @@ exports.MemberNameCell = MemberNameCell;
936
1665
  exports.MemberRoleCell = MemberRoleCell;
937
1666
  exports.NEEDS_CONNECTION = NEEDS_CONNECTION;
938
1667
  exports.PlainMailBodyEditor = PlainMailBodyEditor;
1668
+ exports.RecipientPicker = RecipientPicker;
939
1669
  exports.RoleSelect = RoleSelect;
940
1670
  exports.WorkspaceDeleteButton = WorkspaceDeleteButton;
1671
+ exports.applyContactInviteResults = applyContactInviteResults;
941
1672
  exports.buildMailFolderTree = buildMailFolderTree;
1673
+ exports.contactName = contactName;
1674
+ exports.contactOutcomeMessage = contactOutcomeMessage;
1675
+ exports.contactStatusLabel = contactStatusLabel;
1676
+ exports.contactToForm = contactToForm;
942
1677
  exports.descendantFolderIds = descendantFolderIds;
943
1678
  exports.draftMailCompose = draftMailCompose;
1679
+ exports.emailTokens = emailTokens;
944
1680
  exports.emptyMailCompose = emptyMailCompose;
1681
+ exports.failContactInvites = failContactInvites;
1682
+ exports.formToContactCard = formToContactCard;
945
1683
  exports.hasCalendarPart = hasCalendarPart;
1684
+ exports.inviteEmail = inviteEmail;
946
1685
  exports.isInboxFolder = isInboxFolder;
1686
+ exports.isInvitableEmail = isInvitableEmail;
947
1687
  exports.mailAddressLabel = mailAddressLabel;
1688
+ exports.matchesContact = matchesContact;
1689
+ exports.normalizeVCardDate = normalizeVCardDate;
1690
+ exports.parseEmails = parseEmails;
948
1691
  exports.parseMailRecipients = parseMailRecipients;
1692
+ exports.planContactInvites = planContactInvites;
1693
+ exports.primaryEmail = primaryEmail;
949
1694
  exports.replyMailCompose = replyMailCompose;
1695
+ exports.summarizeContactInvites = summarizeContactInvites;
1696
+ exports.summarizeImport = summarizeImport;
1697
+ exports.summarizeUnsentInvites = summarizeUnsentInvites;
1698
+ exports.toAddContactsRow = toAddContactsRow;
1699
+ exports.toAddContactsRows = toAddContactsRows;
950
1700
  exports.toggleMailFolder = toggleMailFolder;
951
- //# sourceMappingURL=chunk-CROGFB46.cjs.map
952
- //# sourceMappingURL=chunk-CROGFB46.cjs.map
1701
+ exports.validateContactForm = validateContactForm;
1702
+ //# sourceMappingURL=chunk-U7OUZHBH.cjs.map
1703
+ //# sourceMappingURL=chunk-U7OUZHBH.cjs.map