@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
@@ -1,2838 +0,0 @@
1
- "use client";
2
- 'use strict';
3
-
4
- var chunkFAXXN7KI_cjs = require('./chunk-FAXXN7KI.cjs');
5
- var chunk3VULDTNL_cjs = require('./chunk-3VULDTNL.cjs');
6
- var chunk32HW2Q33_cjs = require('./chunk-32HW2Q33.cjs');
7
- var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
8
- var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
9
- var chunkKDG6FER6_cjs = require('./chunk-KDG6FER6.cjs');
10
- var lucideReact = require('lucide-react');
11
- var ui = require('@arbidocs/react/ui');
12
- var jsxRuntime = require('react/jsx-runtime');
13
- var react = require('react');
14
- var classVarianceAuthority = require('class-variance-authority');
15
-
16
- function FilesFilterBar({ className, ...props }) {
17
- return /* @__PURE__ */ jsxRuntime.jsx(
18
- "div",
19
- {
20
- "data-slot": "files-filter-bar",
21
- className: ui.cn("flex min-w-0 flex-1 flex-nowrap items-center gap-2", className),
22
- ...props
23
- }
24
- );
25
- }
26
- function FilesTagsButton({
27
- onClick,
28
- label = "Tags",
29
- className,
30
- testId
31
- }) {
32
- return /* @__PURE__ */ jsxRuntime.jsxs(
33
- ui.Button,
34
- {
35
- variant: "ghost",
36
- size: "sm",
37
- className: ui.cn("h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11", className),
38
- onClick,
39
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "filter-bar-tags-button" }),
40
- children: [
41
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookMarked, { className: "h-3.5 w-3.5" }),
42
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm max-[480px]:sr-only", children: label })
43
- ]
44
- }
45
- );
46
- }
47
- function FilesViewCenter({ className, ...props }) {
48
- return /* @__PURE__ */ jsxRuntime.jsx(
49
- "div",
50
- {
51
- "data-slot": "files-view-center",
52
- className: ui.cn("@container flex min-w-[9.5rem] flex-1 items-center gap-2", className),
53
- ...props
54
- }
55
- );
56
- }
57
- function FilesModalFooter({ children, className }) {
58
- return /* @__PURE__ */ jsxRuntime.jsx(
59
- "div",
60
- {
61
- "data-slot": "files-modal-footer",
62
- className: ui.cn(
63
- // Sticks to the bottom of the modal's scrolling body so Close is always reachable.
64
- "sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6",
65
- className
66
- ),
67
- children
68
- }
69
- );
70
- }
71
-
72
- // src/files/grid/row-density.ts
73
- var LINE_PX = 14 * 1.35;
74
- var CHROME = 18;
75
- var MIN_LINES = 1;
76
- var MAX_LINES = 10;
77
- var rowHeightForLines = (lines) => Math.ceil(lines * LINE_PX + CHROME);
78
- var linesForRowHeight = (height) => Math.max(MIN_LINES, Math.min(MAX_LINES, Math.floor((height - CHROME) / LINE_PX)));
79
- var ROW_MIN = rowHeightForLines(MIN_LINES);
80
- function RowDensityControl({
81
- rowHeight,
82
- onRowHeightChange,
83
- testId = "documents-density"
84
- }) {
85
- const lines = linesForRowHeight(rowHeight);
86
- const setLines = (next) => onRowHeightChange(rowHeightForLines(Math.max(MIN_LINES, Math.min(MAX_LINES, next))));
87
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { delayDuration: 300, children: [
88
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-7 items-center gap-1.5 rounded-md border border-input px-2 pointer-coarse:h-11", children: [
89
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden text-xs text-muted-foreground md:inline", children: "Rows" }),
90
- /* @__PURE__ */ jsxRuntime.jsx(
91
- "button",
92
- {
93
- type: "button",
94
- "aria-label": "Shorter rows",
95
- "data-testid": `${testId}-out`,
96
- onClick: () => setLines(lines - 1),
97
- disabled: lines <= MIN_LINES,
98
- className: "flex items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-40 pointer-coarse:size-11",
99
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListChevronsUpDown, { className: "h-4 w-4" })
100
- }
101
- ),
102
- /* @__PURE__ */ jsxRuntime.jsx(
103
- ui.Slider,
104
- {
105
- value: [lines],
106
- min: MIN_LINES,
107
- max: MAX_LINES,
108
- step: 1,
109
- onValueChange: ([value]) => setLines(value),
110
- "aria-label": "Row height",
111
- "data-testid": testId,
112
- className: "w-20"
113
- }
114
- )
115
- ] }) }),
116
- /* @__PURE__ */ jsxRuntime.jsxs(ui.TooltipContent, { children: [
117
- "Row height: ",
118
- lines,
119
- " line",
120
- lines === 1 ? "" : "s"
121
- ] })
122
- ] });
123
- }
124
- function FolderBreadcrumb({
125
- segments,
126
- size = "xs"
127
- }) {
128
- const text = size === "sm" ? "text-sm" : "text-xs";
129
- return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "folder-breadcrumb", className: "min-w-0 truncate", children: segments.map((part, i, arr) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-0.5", children: [
130
- i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `mx-0.5 ${text} text-muted-foreground/50`, children: "/" }),
131
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: i < arr.length - 1 ? `${text} text-muted-foreground` : "", children: part })
132
- ] }, i)) });
133
- }
134
- function FolderCell({
135
- folder,
136
- segments,
137
- icon,
138
- isEditable,
139
- picker,
140
- className
141
- }) {
142
- const display = folder ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
143
- icon ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "h-3.5 w-3.5 flex-none shrink-0 text-muted-foreground" }),
144
- /* @__PURE__ */ jsxRuntime.jsx(FolderBreadcrumb, { segments })
145
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "\u2014" });
146
- const title = folder || void 0;
147
- if (!isEditable) {
148
- return /* @__PURE__ */ jsxRuntime.jsx(
149
- "div",
150
- {
151
- "data-slot": "folder-cell",
152
- title,
153
- className: ui.cn("flex h-full w-full min-w-0 items-center gap-1.5 text-sm", className),
154
- children: display
155
- }
156
- );
157
- }
158
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
159
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
160
- "button",
161
- {
162
- type: "button",
163
- "data-slot": "folder-cell",
164
- title,
165
- className: ui.cn(
166
- "flex h-full w-full min-w-0 cursor-pointer items-center gap-1.5 text-left text-sm hover:text-primary",
167
- className
168
- ),
169
- children: display
170
- }
171
- ) }),
172
- /* @__PURE__ */ jsxRuntime.jsx(
173
- ui.PopoverContent,
174
- {
175
- className: "w-max min-w-[220px] max-w-[min(640px,92vw)] p-0",
176
- align: "start",
177
- side: "bottom",
178
- sideOffset: 4,
179
- children: picker
180
- }
181
- )
182
- ] });
183
- }
184
- var FIELD_SURFACE = "rounded-md border border-input bg-muted/40 text-sm transition-colors hover:bg-background";
185
- function FieldValue({ tone = "default", isMono, isTruncated, children }) {
186
- return /* @__PURE__ */ jsxRuntime.jsx(
187
- "span",
188
- {
189
- "data-slot": "field-value",
190
- className: ui.cn(
191
- "text-sm",
192
- tone === "strong" && "font-semibold",
193
- tone === "muted" && "text-muted-foreground",
194
- isMono && "font-mono",
195
- isTruncated && "truncate"
196
- ),
197
- children
198
- }
199
- );
200
- }
201
- function FieldFolderSelect({ folder, picker }) {
202
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
203
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
204
- "button",
205
- {
206
- type: "button",
207
- "data-slot": "field-folder-select",
208
- className: ui.cn(
209
- FIELD_SURFACE,
210
- "flex h-9 w-full min-w-0 items-center gap-1.5 px-3 text-left hover:text-primary pointer-coarse:h-11"
211
- ),
212
- children: [
213
- folder ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
214
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "size-3.5 flex-none shrink-0 text-yellow-600" }),
215
- /* @__PURE__ */ jsxRuntime.jsx(FolderBreadcrumb, { segments: folder.split("/"), size: "sm" })
216
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "\u2014" }),
217
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "ml-auto size-3.5 shrink-0 opacity-50" })
218
- ]
219
- }
220
- ) }),
221
- /* @__PURE__ */ jsxRuntime.jsx(
222
- ui.PopoverContent,
223
- {
224
- className: "w-max min-w-[var(--radix-popover-trigger-width)] max-w-[min(640px,92vw)] p-0",
225
- align: "start",
226
- side: "bottom",
227
- sideOffset: 4,
228
- children: picker
229
- }
230
- )
231
- ] });
232
- }
233
- function FieldFolderValue({ folder }) {
234
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1.5 text-sm", children: folder ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
235
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "size-3.5 shrink-0 text-yellow-600" }),
236
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: folder })
237
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "\u2014" }) });
238
- }
239
- function FieldLabelsSelect({
240
- options,
241
- appliedIds,
242
- displayedIds = appliedIds,
243
- onToggle,
244
- onCreate,
245
- emptyText = "Click to add",
246
- labels
247
- }) {
248
- const applied = react.useMemo(
249
- () => options.filter((o) => displayedIds.has(o.id)),
250
- [options, displayedIds]
251
- );
252
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
253
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
254
- "button",
255
- {
256
- type: "button",
257
- "data-slot": "field-labels-select",
258
- className: ui.cn(
259
- FIELD_SURFACE,
260
- "flex min-h-9 w-full cursor-pointer items-center px-3 py-1.5 text-left pointer-coarse:min-h-11"
261
- ),
262
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-[28px] flex-wrap items-center gap-1.5", children: [
263
- applied.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm italic text-muted-foreground", children: emptyText }),
264
- applied.map((o) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 text-sm font-medium", children: [
265
- /* @__PURE__ */ jsxRuntime.jsx(
266
- "span",
267
- {
268
- className: "flex size-4 shrink-0 items-center justify-center rounded border-2",
269
- style: { borderColor: o.color, backgroundColor: o.color },
270
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3 text-white", strokeWidth: 3 })
271
- }
272
- ),
273
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[280px] truncate", children: o.name })
274
- ] }, o.id))
275
- ] })
276
- }
277
- ) }),
278
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-[360px] p-0", align: "start", side: "bottom", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(
279
- chunkFAXXN7KI_cjs.LabelPickerList,
280
- {
281
- options,
282
- appliedIds,
283
- onToggle,
284
- onCreate,
285
- labels: { ...chunkFAXXN7KI_cjs.DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }
286
- }
287
- ) })
288
- ] });
289
- }
290
- function FieldNativeSelect({
291
- value,
292
- options,
293
- onChange,
294
- emptyLabel = "--",
295
- ariaLabel
296
- }) {
297
- return /* @__PURE__ */ jsxRuntime.jsxs(
298
- "select",
299
- {
300
- value,
301
- "aria-label": ariaLabel,
302
- onChange: (e) => onChange(e.target.value),
303
- className: "h-9 w-full rounded-md border border-input bg-muted/40 px-3 text-sm transition-colors focus:bg-background focus:outline-none focus:ring-1 focus:ring-ring pointer-coarse:h-11",
304
- children: [
305
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: emptyLabel }),
306
- options.map((opt) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: opt, children: opt }, opt))
307
- ]
308
- }
309
- );
310
- }
311
- function FieldAttribution({ avatar, date, lines }) {
312
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", "data-slot": "field-attribution", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
313
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
314
- avatar,
315
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: date })
316
- ] }) }),
317
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "bottom", children: lines.map((line, i) => /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: line }, i)) })
318
- ] }) });
319
- }
320
- function FieldWithAttribution({
321
- attribution,
322
- children
323
- }) {
324
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/doctag relative", "data-slot": "field-with-attribution", children: [
325
- children,
326
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-0 top-0 bg-background/90 pl-2 opacity-0 transition-opacity group-focus-within/doctag:opacity-100 group-hover/doctag:opacity-100 pointer-coarse:opacity-100", children: attribution })
327
- ] });
328
- }
329
- var FilterButton = ({ params, colId }) => {
330
- const [isFilterActive, setIsFilterActive] = react.useState(false);
331
- const btnRef = react.useRef(null);
332
- react.useEffect(() => {
333
- const check = () => setIsFilterActive(!!params.api.getFilterModel()[colId]);
334
- check();
335
- params.api.addEventListener("filterChanged", check);
336
- return () => {
337
- if (!params.api.isDestroyed()) params.api.removeEventListener("filterChanged", check);
338
- };
339
- }, [params.api, colId]);
340
- return /* @__PURE__ */ jsxRuntime.jsx(
341
- "span",
342
- {
343
- ref: btnRef,
344
- role: "button",
345
- "aria-label": "Filter",
346
- onClick: (e) => {
347
- e.stopPropagation();
348
- if (btnRef.current) params.showFilter(btnRef.current);
349
- },
350
- className: `ag-header-icon ag-header-cell-filter-button ag-header-label-icon ${isFilterActive ? "ag-filter-active" : ""}`,
351
- "aria-hidden": "false",
352
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ag-icon ag-icon-filter" })
353
- }
354
- );
355
- };
356
- var DEFAULT_FOLDER_PICKER_LABELS = {
357
- none: "None",
358
- removeFromFolder: "Remove from folder",
359
- searchOrCreate: "Search or create...",
360
- noFolders: "No folders yet",
361
- create: (name) => `Create \u201C${name}\u201D`
362
- };
363
- function FolderPickerRow({
364
- label,
365
- icon,
366
- count,
367
- depth,
368
- isActive,
369
- muted,
370
- checkbox,
371
- indeterminate,
372
- testId,
373
- onClick
374
- }) {
375
- return /* @__PURE__ */ jsxRuntime.jsxs(
376
- "button",
377
- {
378
- type: "button",
379
- "data-testid": testId,
380
- onClick,
381
- role: checkbox ? "checkbox" : void 0,
382
- "aria-checked": checkbox ? indeterminate ? "mixed" : isActive : void 0,
383
- style: { paddingLeft: `${4 + depth * 14}px` },
384
- className: ui.cn(
385
- // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a
386
- // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight
387
- // even with a real mouse attached. The arbitrary selector has no media gate.
388
- "flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11",
389
- isActive && "bg-primary/10",
390
- muted && !isActive && "text-muted-foreground"
391
- ),
392
- children: [
393
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex w-4 shrink-0 items-center justify-center", children: checkbox ? /* @__PURE__ */ jsxRuntime.jsx(
394
- "span",
395
- {
396
- className: ui.cn(
397
- "flex size-3.5 items-center justify-center rounded-[3px] border transition-colors",
398
- isActive || indeterminate ? "border-primary bg-primary text-primary-foreground" : "border-muted-foreground/40"
399
- ),
400
- children: indeterminate ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "size-2.5" }) : isActive && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-2.5" })
401
- }
402
- ) : isActive && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3.5 text-primary" }) }),
403
- icon,
404
- label !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("min-w-0 truncate", isActive && "font-semibold text-primary"), children: label }),
405
- count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto pl-2 text-sm font-semibold text-muted-foreground", children: count })
406
- ]
407
- }
408
- );
409
- }
410
- function FolderTree({
411
- nodes,
412
- unfiledCount,
413
- value,
414
- onChange,
415
- showUnfiledAlways,
416
- labels
417
- }) {
418
- const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels };
419
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-h-[240px] overflow-y-auto", children: [
420
- nodes.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
421
- FolderPickerRow,
422
- {
423
- label: node.label,
424
- icon: node.icon,
425
- count: node.count,
426
- depth: node.depth,
427
- isActive: value === node.path,
428
- onClick: () => onChange(node.path)
429
- },
430
- node.path
431
- )),
432
- (unfiledCount > 0 || showUnfiledAlways) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
433
- nodes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" }),
434
- /* @__PURE__ */ jsxRuntime.jsx(
435
- FolderPickerRow,
436
- {
437
- label: l.none,
438
- count: unfiledCount,
439
- depth: 0,
440
- isActive: value === null,
441
- muted: true,
442
- onClick: () => onChange(null)
443
- }
444
- )
445
- ] })
446
- ] });
447
- }
448
- function FolderBreadcrumb2({ folder }) {
449
- const parts = folder.split("/");
450
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: parts.map((part, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-0.5", children: [
451
- i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-0.5 text-sm text-muted-foreground/50", children: "/" }),
452
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: i < parts.length - 1 ? "text-sm text-muted-foreground" : "", children: part })
453
- ] }, i)) });
454
- }
455
- function FolderCommandList({
456
- folders,
457
- value,
458
- onSelect,
459
- showRemove = false,
460
- removeLabel,
461
- placeholder,
462
- autoFocus = true,
463
- labels,
464
- testIds
465
- }) {
466
- const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels };
467
- const [search, setSearch] = react.useState("");
468
- const trimmed = search.trim();
469
- const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase());
470
- const handleCreate = react.useCallback(
471
- (name) => {
472
- const next = name.trim();
473
- if (!next) return;
474
- onSelect(next);
475
- setSearch("");
476
- },
477
- [onSelect]
478
- );
479
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: true, children: [
480
- /* @__PURE__ */ jsxRuntime.jsx(
481
- ui.CommandInput,
482
- {
483
- placeholder: placeholder ?? l.searchOrCreate,
484
- value: search,
485
- onValueChange: setSearch,
486
- autoFocus,
487
- onKeyDown: (e) => {
488
- if (e.key === "Enter" && trimmed && !matchesExisting) {
489
- e.preventDefault();
490
- handleCreate(search);
491
- }
492
- }
493
- }
494
- ),
495
- /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { children: [
496
- /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: trimmed ? /* @__PURE__ */ jsxRuntime.jsxs(
497
- "button",
498
- {
499
- type: "button",
500
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.create, { testId: "folder-picker-create" }),
501
- onClick: () => handleCreate(search),
502
- onPointerDown: (e) => e.preventDefault(),
503
- className: "flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11",
504
- children: [
505
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-3.5 shrink-0" }),
506
- l.create(trimmed)
507
- ]
508
- }
509
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: l.noFolders }) }),
510
- /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: folders.map((folder) => /* @__PURE__ */ jsxRuntime.jsxs(
511
- ui.CommandItem,
512
- {
513
- value: folder,
514
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.option?.(folder), {
515
- testId: `folder-picker-option-${folder}`
516
- }),
517
- onSelect: () => onSelect(folder),
518
- onPointerDown: (e) => e.preventDefault(),
519
- className: "cursor-pointer text-sm",
520
- children: [
521
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text" }),
522
- /* @__PURE__ */ jsxRuntime.jsx(FolderBreadcrumb2, { folder }),
523
- value === folder && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex-none text-sm text-primary", children: "\u2713" })
524
- ]
525
- },
526
- folder
527
- )) }),
528
- trimmed && !matchesExisting && folders.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(
529
- ui.CommandItem,
530
- {
531
- value: `__create__${trimmed}`,
532
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.createOption, {
533
- testId: "folder-picker-create-option"
534
- }),
535
- onSelect: () => handleCreate(search),
536
- onPointerDown: (e) => e.preventDefault(),
537
- className: "cursor-pointer text-sm text-primary",
538
- children: [
539
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-1.5 size-3.5 shrink-0" }),
540
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.create(trimmed) })
541
- ]
542
- }
543
- ) }),
544
- showRemove && /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(
545
- ui.CommandItem,
546
- {
547
- value: "__none__",
548
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.remove, { testId: "folder-picker-remove" }),
549
- onSelect: () => onSelect(null),
550
- onPointerDown: (e) => e.preventDefault(),
551
- className: "cursor-pointer text-sm text-muted-foreground",
552
- children: [
553
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "mr-1 size-3.5 shrink-0" }),
554
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: removeLabel ?? l.removeFromFolder }),
555
- value === null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex-none text-sm text-primary", children: "\u2713" })
556
- ]
557
- }
558
- ) })
559
- ] })
560
- ] });
561
- }
562
- var DEFAULT_FOLDER_FILTER_LABELS = {
563
- all: "All",
564
- newFolder: "New folder"
565
- };
566
- function FolderFilterButton({
567
- label,
568
- icon,
569
- isActive,
570
- open,
571
- onOpenChange,
572
- allCount,
573
- onSelectAll,
574
- onNewFolder,
575
- children,
576
- className,
577
- labels,
578
- testId,
579
- newFolderTestId
580
- }) {
581
- const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels };
582
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange, children: [
583
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
584
- ui.Button,
585
- {
586
- variant: "ghost",
587
- size: "sm",
588
- "data-slot": "folder-filter-button",
589
- "data-testid": testId,
590
- className: ui.cn(
591
- "h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10",
592
- isActive && "bg-accent font-medium text-accent-foreground",
593
- className
594
- ),
595
- children: [
596
- icon ?? /* @__PURE__ */ jsxRuntime.jsx(
597
- lucideReact.FolderOpen,
598
- {
599
- className: ui.cn(
600
- "h-3.5 w-3.5 shrink-0 text-muted-foreground",
601
- isActive && "fill-muted-foreground/30"
602
- )
603
- }
604
- ),
605
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[280px] truncate", children: label }),
606
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 text-foreground", strokeWidth: 2.5 })
607
- ]
608
- }
609
- ) }),
610
- /* @__PURE__ */ jsxRuntime.jsxs(
611
- ui.PopoverContent,
612
- {
613
- className: "w-max min-w-56 max-w-[480px] p-1 shadow-lg",
614
- align: "start",
615
- sideOffset: 4,
616
- children: [
617
- onSelectAll && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
618
- /* @__PURE__ */ jsxRuntime.jsx(
619
- FolderPickerRow,
620
- {
621
- label: l.all,
622
- count: allCount,
623
- depth: 0,
624
- isActive: !isActive,
625
- onClick: onSelectAll
626
- }
627
- ),
628
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" })
629
- ] }),
630
- children,
631
- onNewFolder && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
632
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" }),
633
- /* @__PURE__ */ jsxRuntime.jsxs(
634
- "button",
635
- {
636
- type: "button",
637
- onClick: onNewFolder,
638
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(newFolderTestId, { testId: "explorer-new-folder" }),
639
- className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11",
640
- children: [
641
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { className: "h-3.5 w-3.5" }),
642
- l.newFolder
643
- ]
644
- }
645
- )
646
- ] })
647
- ]
648
- }
649
- )
650
- ] });
651
- }
652
- function ExplorerFrame({ className, ...props }) {
653
- return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "explorer-frame", className: ui.cn("flex h-full flex-col", className), ...props });
654
- }
655
- function ExplorerStage({ className, ...props }) {
656
- return /* @__PURE__ */ jsxRuntime.jsx(
657
- "div",
658
- {
659
- "data-slot": "explorer-stage",
660
- className: ui.cn("relative min-h-0 flex-1", className),
661
- ...props
662
- }
663
- );
664
- }
665
- var ExplorerScroller = react.forwardRef(
666
- function ExplorerScroller2({ className, ...props }, ref) {
667
- return /* @__PURE__ */ jsxRuntime.jsx(
668
- "div",
669
- {
670
- ref,
671
- "data-slot": "explorer-scroller",
672
- className: ui.cn(
673
- "h-full select-none overflow-auto px-4 py-4 [scrollbar-gutter:stable]",
674
- className
675
- ),
676
- ...props
677
- }
678
- );
679
- }
680
- );
681
- function ExplorerEmpty({ title, description }) {
682
- return /* @__PURE__ */ jsxRuntime.jsxs(
683
- "div",
684
- {
685
- "data-slot": "explorer-empty",
686
- className: "flex h-full flex-col items-center justify-center gap-1 text-center text-muted-foreground",
687
- children: [
688
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: title }),
689
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs", children: description })
690
- ]
691
- }
692
- );
693
- }
694
- var ExplorerMarquee = react.forwardRef(
695
- function ExplorerMarquee2({ className, style, ...props }, ref) {
696
- return /* @__PURE__ */ jsxRuntime.jsx(
697
- "div",
698
- {
699
- ref,
700
- "aria-hidden": true,
701
- "data-slot": "explorer-marquee",
702
- className: ui.cn(
703
- "pointer-events-none fixed z-30 border border-primary bg-primary/10",
704
- className
705
- ),
706
- style: { display: "none", ...style },
707
- ...props
708
- }
709
- );
710
- }
711
- );
712
- function ExplorerDropOverlay({ label }) {
713
- return /* @__PURE__ */ jsxRuntime.jsxs(
714
- "div",
715
- {
716
- "data-slot": "explorer-drop-overlay",
717
- className: "pointer-events-none absolute inset-2 z-20 flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-primary bg-accent/80 backdrop-blur-sm",
718
- children: [
719
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UploadCloud, { className: "size-8 text-primary" }),
720
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-primary", children: label })
721
- ]
722
- }
723
- );
724
- }
725
- function ExplorerDragPreview({ icon, title, count }) {
726
- const isMulti = count > 1;
727
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "explorer-drag-preview", className: "relative", children: [
728
- isMulti && /* @__PURE__ */ jsxRuntime.jsx(
729
- "div",
730
- {
731
- "aria-hidden": true,
732
- className: "absolute inset-0 translate-x-1.5 translate-y-1.5 rounded-lg border border-primary/30 bg-popover shadow-md"
733
- }
734
- ),
735
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center gap-2 rounded-lg border border-primary/40 bg-popover px-3 py-2 shadow-lg", children: [
736
- icon,
737
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[12rem] truncate text-sm font-medium", children: title }),
738
- isMulti && /* @__PURE__ */ jsxRuntime.jsxs(
739
- "span",
740
- {
741
- "data-slot": "explorer-drag-preview-count",
742
- className: "whitespace-nowrap rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-primary-foreground",
743
- children: [
744
- count,
745
- " items"
746
- ]
747
- }
748
- )
749
- ] })
750
- ] });
751
- }
752
- function ExplorerLoadingTiles({
753
- count = 18,
754
- label = "Loading files",
755
- testId,
756
- className,
757
- ...rest
758
- }) {
759
- return /* @__PURE__ */ jsxRuntime.jsx(
760
- "div",
761
- {
762
- className: ui.cn(
763
- "grid gap-3 [grid-template-columns:repeat(auto-fill,minmax(150px,1fr))]",
764
- className
765
- ),
766
- "aria-busy": "true",
767
- "aria-label": label,
768
- "data-slot": "explorer-loading-tiles",
769
- ...rest,
770
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "explorer-loading-skeleton" }),
771
- children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[4/5] animate-pulse rounded-lg bg-muted" }, i))
772
- }
773
- );
774
- }
775
- function getExplorerDisplayName(doc) {
776
- const title = ui.getDocumentTitle(doc, doc.file_name ?? "Untitled");
777
- if (ui.getFileExtension(title)) return title;
778
- const ext = ui.getFileExtension(doc.file_name) || ui.extensionFromMime(doc.file_type);
779
- return ext ? `${title}.${ext}` : title;
780
- }
781
- function parseFolderSegments(folder) {
782
- if (!folder) return [];
783
- return folder.split("/").map((segment) => segment.trim()).filter(Boolean);
784
- }
785
- function joinFolderPath(segments) {
786
- return segments.length > 0 ? segments.join("/") : null;
787
- }
788
- function startsWithPath(segments, prefix) {
789
- if (segments.length < prefix.length) return false;
790
- for (let i = 0; i < prefix.length; i++) {
791
- if (segments[i] !== prefix[i]) return false;
792
- }
793
- return true;
794
- }
795
- function isExplorerDocument(doc) {
796
- return !doc.parent_ext_id;
797
- }
798
- function collectFolderDocs(documents, path) {
799
- if (path.length === 0) return documents.filter(isExplorerDocument);
800
- return documents.filter(
801
- (doc) => isExplorerDocument(doc) && startsWithPath(parseFolderSegments(doc.folder), path)
802
- );
803
- }
804
- function compareFiles(a, b, sort) {
805
- switch (sort) {
806
- case "date": {
807
- const at = a.created_at ? Date.parse(a.created_at) : 0;
808
- const bt = b.created_at ? Date.parse(b.created_at) : 0;
809
- return bt - at;
810
- }
811
- case "size": {
812
- return (b.file_size ?? 0) - (a.file_size ?? 0);
813
- }
814
- case "name":
815
- default:
816
- return ui.getDocumentTitle(a, a.file_name ?? "").localeCompare(
817
- ui.getDocumentTitle(b, b.file_name ?? ""),
818
- void 0,
819
- { numeric: true, sensitivity: "base" }
820
- );
821
- }
822
- }
823
- function sortExplorerFiles(docs, sort, reversed = false) {
824
- const sorted = [...docs].sort((a, b) => compareFiles(a, b, sort));
825
- return reversed ? sorted.reverse() : sorted;
826
- }
827
- function buildExplorerEntries(documents, currentPath, sort = "name", pendingFolders = []) {
828
- const folderCounts = /* @__PURE__ */ new Map();
829
- const files = [];
830
- for (const doc of documents) {
831
- const segments = parseFolderSegments(doc.folder);
832
- if (!startsWithPath(segments, currentPath)) continue;
833
- if (segments.length === currentPath.length) {
834
- files.push(doc);
835
- } else {
836
- const childName = segments[currentPath.length];
837
- folderCounts.set(childName, (folderCounts.get(childName) ?? 0) + 1);
838
- }
839
- }
840
- const childNames = new Set(folderCounts.keys());
841
- for (const pending of pendingFolders) {
842
- const segments = parseFolderSegments(pending);
843
- if (!startsWithPath(segments, currentPath)) continue;
844
- if (segments.length > currentPath.length) childNames.add(segments[currentPath.length]);
845
- }
846
- const folders = Array.from(childNames).map((name) => ({
847
- kind: "folder",
848
- name,
849
- path: [...currentPath, name],
850
- count: folderCounts.get(name) ?? 0
851
- })).sort((a, b) => a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: "base" }));
852
- files.sort((a, b) => compareFiles(a, b, sort));
853
- return { folders, files };
854
- }
855
- function searchExplorerDocuments(documents, query, sort = "name") {
856
- const needle = query.trim().toLowerCase();
857
- if (!needle) return [];
858
- return documents.filter((doc) => {
859
- if (!isExplorerDocument(doc)) return false;
860
- const title = ui.getDocumentTitle(doc, doc.file_name ?? "").toLowerCase();
861
- const name = (doc.file_name ?? "").toLowerCase();
862
- return title.includes(needle) || name.includes(needle);
863
- }).sort((a, b) => compareFiles(a, b, sort));
864
- }
865
- function GmailMark({ className }) {
866
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 256 193", className, "aria-hidden": "true", focusable: "false", children: [
867
- /* @__PURE__ */ jsxRuntime.jsx(
868
- "path",
869
- {
870
- fill: "#4285F4",
871
- d: "M58.182 192.05V93.14L27.507 65.077 0 49.504v125.091c0 9.658 7.825 17.455 17.455 17.455z"
872
- }
873
- ),
874
- /* @__PURE__ */ jsxRuntime.jsx(
875
- "path",
876
- {
877
- fill: "#34A853",
878
- d: "M197.818 192.05h40.727c9.659 0 17.455-7.826 17.455-17.455V49.505l-31.156 17.837-27.026 25.798z"
879
- }
880
- ),
881
- /* @__PURE__ */ jsxRuntime.jsx(
882
- "path",
883
- {
884
- fill: "#EA4335",
885
- d: "m58.182 93.14-4.174-38.647 4.174-36.989L128 69.868l69.818-52.364 4.669 34.992-4.669 40.644L128 145.504z"
886
- }
887
- ),
888
- /* @__PURE__ */ jsxRuntime.jsx(
889
- "path",
890
- {
891
- fill: "#FBBC04",
892
- d: "M197.818 17.504V93.14L256 49.504V26.231c0-21.585-24.64-33.89-41.89-20.945z"
893
- }
894
- ),
895
- /* @__PURE__ */ jsxRuntime.jsx(
896
- "path",
897
- {
898
- fill: "#C5221F",
899
- d: "M0 49.504 26.759 69.574 58.182 93.14V17.504L41.89 5.286C24.61-7.66 0 4.646 0 26.231z"
900
- }
901
- )
902
- ] });
903
- }
904
- function OutlookMark({ className }) {
905
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: [
906
- /* @__PURE__ */ jsxRuntime.jsx("path", { fill: "#0F6CBD", d: "M44 13H24v22h18.5A1.5 1.5 0 0 0 44 33.5z" }),
907
- /* @__PURE__ */ jsxRuntime.jsx("path", { fill: "#28A8EA", d: "M24 15.5 44 13v3L24 27z" }),
908
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "4", y: "9", width: "21", height: "30", rx: "2.5", fill: "#0364B8" }),
909
- /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx: "14.5", cy: "24", rx: "6.2", ry: "7", fill: "none", stroke: "#fff", strokeWidth: "3.1" })
910
- ] });
911
- }
912
- function OneDriveMark({ className }) {
913
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 256 165", className, "aria-hidden": "true", focusable: "false", children: [
914
- /* @__PURE__ */ jsxRuntime.jsx(
915
- "path",
916
- {
917
- fill: "#0364B8",
918
- d: "M154.66056 110.681557 207.502052 60.1479482C196.525811 17.3487078 152.932256-8.44908883 110.132767 2.52715287 90.8589801 7.46999082 74.1187452 19.4179992 63.179535 36.0386895 63.9974594 36.0180612 154.66056 110.681557 154.66056 110.681557Z"
919
- }
920
- ),
921
- /* @__PURE__ */ jsxRuntime.jsx(
922
- "path",
923
- {
924
- fill: "#0078D4",
925
- d: "M97.6181022 45.5520619 97.6156169 45.5607606C87.5186874 39.307156 75.8741386 36.001658 63.9972108 36.0177537 63.7228296 36.0177537 63.4531706 36.03521 63.1792865 36.0384409 27.8517142 36.4761088-.432413365 65.4695515.00500592252 100.797124.163570414 113.612018 4.16769663 126.083687 11.4981977 136.595916L90.6631356 126.680913 151.357298 77.7409022 97.6181022 45.5520619Z"
926
- }
927
- ),
928
- /* @__PURE__ */ jsxRuntime.jsx(
929
- "path",
930
- {
931
- fill: "#1490DF",
932
- d: "M207.502052 60.1481967C206.340406 60.0706542 205.173043 60.016946 203.992011 60.016946 196.903085 60.010012 189.887973 61.4579693 183.381112 64.271122L183.379621 64.2656543 151.357547 77.7411507 186.65952 121.347877 249.770673 136.689364C263.390071 111.405536 253.93411 79.8683506 228.650281 66.2489531 222.117076 62.7297161 214.906119 60.6497377 207.502301 60.1484453L207.502301 60.1481967 207.502052 60.1481967Z"
933
- }
934
- ),
935
- /* @__PURE__ */ jsxRuntime.jsx(
936
- "path",
937
- {
938
- fill: "#28A8EA",
939
- d: "M11.4981977 136.595916C23.4514253 153.781772 43.063467 164.023845 63.9974594 164.012918L203.991762 164.012918C223.115435 164.018377 240.697951 153.524291 249.770425 136.689862L151.357298 77.7409022 11.4981977 136.595916Z"
940
- }
941
- )
942
- ] });
943
- }
944
- function SharePointMark({ className }) {
945
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: [
946
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "22", cy: "22", r: "20", fill: "#036C70" }),
947
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "16", cy: "20", r: "12", fill: "#1A9BA1" }),
948
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "26", cy: "30", r: "10", fill: "#37C6D0" }),
949
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "33", cy: "22", r: "8", fill: "#fff", opacity: "0.15" })
950
- ] });
951
- }
952
- function GoogleDriveMark({ className }) {
953
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 87.3 78", className, "aria-hidden": "true", focusable: "false", children: [
954
- /* @__PURE__ */ jsxRuntime.jsx(
955
- "path",
956
- {
957
- fill: "#0066da",
958
- d: "M6.6 66.85l3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8H0c0 1.55.4 3.1 1.2 4.5z"
959
- }
960
- ),
961
- /* @__PURE__ */ jsxRuntime.jsx(
962
- "path",
963
- {
964
- fill: "#00ac47",
965
- d: "M43.65 25L29.9 1.2c-1.35.8-2.5 1.9-3.3 3.3L1.2 48.5A9.06 9.06 0 0 0 0 53h27.5z"
966
- }
967
- ),
968
- /* @__PURE__ */ jsxRuntime.jsx(
969
- "path",
970
- {
971
- fill: "#ea4335",
972
- d: "M73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75L86.1 57.4c.8-1.4 1.2-2.95 1.2-4.5H59.798l5.85 11.5z"
973
- }
974
- ),
975
- /* @__PURE__ */ jsxRuntime.jsx(
976
- "path",
977
- {
978
- fill: "#00832d",
979
- d: "M43.65 25L57.4 1.2C56.05.4 54.5 0 52.9 0H34.4c-1.6 0-3.15.45-4.5 1.2z"
980
- }
981
- ),
982
- /* @__PURE__ */ jsxRuntime.jsx(
983
- "path",
984
- {
985
- fill: "#2684fc",
986
- d: "M59.8 53H27.5L13.75 76.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z"
987
- }
988
- ),
989
- /* @__PURE__ */ jsxRuntime.jsx(
990
- "path",
991
- {
992
- fill: "#ffba00",
993
- d: "M73.4 26.5L60.65 4.5c-.8-1.4-1.95-2.5-3.3-3.3L43.65 25l16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z"
994
- }
995
- )
996
- ] });
997
- }
998
- function BoxMark({ className }) {
999
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: [
1000
- /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "48", height: "48", rx: "10", fill: "#0061D5" }),
1001
- /* @__PURE__ */ jsxRuntime.jsx(
1002
- "path",
1003
- {
1004
- fill: "none",
1005
- stroke: "#fff",
1006
- strokeWidth: "2.5",
1007
- strokeLinejoin: "round",
1008
- strokeLinecap: "round",
1009
- d: "M24 13 36 19 36 29 24 35 12 29 12 19Z"
1010
- }
1011
- ),
1012
- /* @__PURE__ */ jsxRuntime.jsx(
1013
- "path",
1014
- {
1015
- fill: "none",
1016
- stroke: "#fff",
1017
- strokeWidth: "2.5",
1018
- strokeLinejoin: "round",
1019
- strokeLinecap: "round",
1020
- d: "M12 19 24 25 36 19 M24 25 24 35"
1021
- }
1022
- )
1023
- ] });
1024
- }
1025
- function DropboxMark({ className }) {
1026
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ jsxRuntime.jsxs("g", { fill: "#0061FF", children: [
1027
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 6 0 14l12 8 12-8z" }),
1028
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M36 6 24 14l12 8 12-8z" }),
1029
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0 30l12 8 12-8-12-8z" }),
1030
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M36 22 24 30l12 8 12-8z" }),
1031
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 40.5 24 33l12 7.5L24 48z" })
1032
- ] }) });
1033
- }
1034
- function OneNoteMark({ className }) {
1035
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: [
1036
- /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "48", height: "48", rx: "10", fill: "#7719AA" }),
1037
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "10", y: "10", width: "21", height: "28", rx: "2.5", fill: "#fff", opacity: "0.95" }),
1038
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "31", y: "15", width: "7", height: "5", rx: "1.5", fill: "#fff", opacity: "0.6" }),
1039
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "31", y: "22", width: "7", height: "5", rx: "1.5", fill: "#fff", opacity: "0.6" }),
1040
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "31", y: "29", width: "7", height: "5", rx: "1.5", fill: "#fff", opacity: "0.6" })
1041
- ] });
1042
- }
1043
- function ClioMark({ className }) {
1044
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 48 48", className, "aria-hidden": "true", focusable: "false", children: [
1045
- /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "48", height: "48", rx: "10", fill: "#00263E" }),
1046
- /* @__PURE__ */ jsxRuntime.jsx(
1047
- "path",
1048
- {
1049
- fill: "none",
1050
- stroke: "#4FC3F7",
1051
- strokeWidth: "4.5",
1052
- strokeLinecap: "round",
1053
- d: "M32 17a10 10 0 1 0 0 14"
1054
- }
1055
- )
1056
- ] });
1057
- }
1058
- function VendorLogo({
1059
- vendorKey,
1060
- className = "h-4 w-4",
1061
- product
1062
- }) {
1063
- if (product === "onedrive") return /* @__PURE__ */ jsxRuntime.jsx(OneDriveMark, { className });
1064
- if (product === "googledrive") return /* @__PURE__ */ jsxRuntime.jsx(GoogleDriveMark, { className });
1065
- if (product === "sharepoint") return /* @__PURE__ */ jsxRuntime.jsx(SharePointMark, { className });
1066
- if (product === "box") return /* @__PURE__ */ jsxRuntime.jsx(BoxMark, { className });
1067
- if (product === "dropbox") return /* @__PURE__ */ jsxRuntime.jsx(DropboxMark, { className });
1068
- if (product === "onenote") return /* @__PURE__ */ jsxRuntime.jsx(OneNoteMark, { className });
1069
- if (product === "clio") return /* @__PURE__ */ jsxRuntime.jsx(ClioMark, { className });
1070
- if (vendorKey === "gmail") return /* @__PURE__ */ jsxRuntime.jsx(GmailMark, { className });
1071
- if (vendorKey === "microsoft") return /* @__PURE__ */ jsxRuntime.jsx(OutlookMark, { className });
1072
- if (vendorKey === "microsoft_sharepoint") return /* @__PURE__ */ jsxRuntime.jsx(SharePointMark, { className });
1073
- if (vendorKey === "box") return /* @__PURE__ */ jsxRuntime.jsx(BoxMark, { className });
1074
- if (vendorKey === "dropbox") return /* @__PURE__ */ jsxRuntime.jsx(DropboxMark, { className });
1075
- if (vendorKey === "onenote") return /* @__PURE__ */ jsxRuntime.jsx(OneNoteMark, { className });
1076
- if (vendorKey === "clio") return /* @__PURE__ */ jsxRuntime.jsx(ClioMark, { className });
1077
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: `${className} text-muted-foreground`, "aria-hidden": "true" });
1078
- }
1079
- var PROVIDER_PREFIXES = [
1080
- ["Outlook", { vendorKey: "microsoft" }],
1081
- ["Gmail", { vendorKey: "gmail" }],
1082
- ["OneDrive", { vendorKey: "microsoft", product: "onedrive" }],
1083
- ["Google Drive", { vendorKey: "gmail", product: "googledrive" }]
1084
- ];
1085
- function providerForRoot(root) {
1086
- for (const [prefix, props] of PROVIDER_PREFIXES) {
1087
- if (root.startsWith(prefix)) return props;
1088
- }
1089
- return null;
1090
- }
1091
- function FolderProviderIcon({
1092
- folderPath,
1093
- className
1094
- }) {
1095
- const root = folderPath.split("/")[0];
1096
- const provider = providerForRoot(root);
1097
- if (!provider) return null;
1098
- return /* @__PURE__ */ jsxRuntime.jsx(VendorLogo, { vendorKey: provider.vendorKey, product: provider.product, className });
1099
- }
1100
- function hasFolderProviderIcon(folderPath) {
1101
- return providerForRoot(folderPath.split("/")[0]) !== null;
1102
- }
1103
- function formatFolderSegment(segment) {
1104
- if (!providerForRoot(segment)) return segment;
1105
- const account = segment.match(/\(([^)]*)\)/);
1106
- return account ? account[1].trim() : "";
1107
- }
1108
-
1109
- // src/files/permissions.ts
1110
- function canChangeVisibility(doc, currentUserExtId) {
1111
- if (!doc || !currentUserExtId) return false;
1112
- const isCurrentUserAgent = currentUserExtId.startsWith("agt-");
1113
- const isCreatedByAgent = doc.created_by_ext_id?.startsWith("agt-") ?? false;
1114
- return isCurrentUserAgent || isCreatedByAgent || doc.created_by_ext_id === currentUserExtId;
1115
- }
1116
- function canEditDocumentFields(doc, currentUserExtId, workspaceRole) {
1117
- if (!doc || !currentUserExtId) return false;
1118
- if (currentUserExtId.startsWith("agt-")) return true;
1119
- if (workspaceRole === "owner" || workspaceRole === "collaborator") return true;
1120
- return canChangeVisibility(doc, currentUserExtId);
1121
- }
1122
- function canDeleteDocument(doc, currentUserExtId, workspaceRole) {
1123
- if (!doc || !currentUserExtId) return false;
1124
- if (workspaceRole === "owner") return true;
1125
- if (workspaceRole === "collaborator") return doc.created_by_ext_id === currentUserExtId;
1126
- return false;
1127
- }
1128
-
1129
- // src/files/recently-deleted.ts
1130
- var RECENTLY_DELETED_HINT = "You can restore it from Recently deleted (Settings > Storage) for at least 30 days.";
1131
- var RECENTLY_DELETED_HINT_PLURAL = "You can restore them from Recently deleted (Settings > Storage) for at least 30 days.";
1132
- var DEFAULT_EXPLORER_LABELS = {
1133
- moreActions: "More actions",
1134
- name: "Name",
1135
- select: "Select",
1136
- deselect: "Deselect",
1137
- empty: "Empty",
1138
- itemCount: (count) => chunkKDG6FER6_cjs.formatCount(count, { one: "item", other: "items" }),
1139
- processing: (count) => `${count} processing`,
1140
- aiSummary: "AI Summary:",
1141
- noSummary: "No AI summary is available for this document yet.",
1142
- lastModifiedBy: "Last modified by",
1143
- shared: "Shared",
1144
- private: "Private"
1145
- };
1146
- function TileLink({
1147
- href,
1148
- label,
1149
- onSelect
1150
- }) {
1151
- return /* @__PURE__ */ jsxRuntime.jsx(
1152
- chunk3VULDTNL_cjs.ActionLink,
1153
- {
1154
- href,
1155
- onSelect,
1156
- "aria-label": label,
1157
- "data-slot": "explorer-tile-link",
1158
- className: "absolute inset-0 z-10 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
1159
- }
1160
- );
1161
- }
1162
- function isInsideTileLink(e) {
1163
- return e.target instanceof Element && !!e.target.closest('[data-slot="explorer-tile-link"]');
1164
- }
1165
- function ExplorerMenu({
1166
- items,
1167
- testId,
1168
- label,
1169
- align,
1170
- triggerClassName
1171
- }) {
1172
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
1173
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1174
- "button",
1175
- {
1176
- type: "button",
1177
- "aria-label": label,
1178
- "data-testid": testId,
1179
- onClick: (e) => e.stopPropagation(),
1180
- onPointerDown: (e) => e.stopPropagation(),
1181
- className: ui.cn(
1182
- "flex size-6 items-center justify-center rounded-md bg-background/90 text-muted-foreground backdrop-blur-sm transition hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-background data-[state=open]:text-foreground pointer-coarse:size-11",
1183
- triggerClassName
1184
- ),
1185
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "size-4" })
1186
- }
1187
- ) }),
1188
- /* @__PURE__ */ jsxRuntime.jsx(
1189
- ui.DropdownMenuContent,
1190
- {
1191
- align,
1192
- onClick: (e) => e.stopPropagation(),
1193
- onPointerDown: (e) => e.stopPropagation(),
1194
- className: "w-44",
1195
- children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1196
- item.separatorBefore && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSeparator, {}),
1197
- item.submenu ? /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuSub, { children: [
1198
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuSubTrigger, { "data-testid": item.testId, children: [
1199
- /* @__PURE__ */ jsxRuntime.jsx(item.icon, { className: "mr-2 size-4" }),
1200
- item.label
1201
- ] }),
1202
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSubContent, { className: "w-52", children: item.submenu.map((sub) => /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuItem, { onSelect: sub.onSelect, "data-testid": sub.testId, children: [
1203
- /* @__PURE__ */ jsxRuntime.jsx(sub.icon, { className: "mr-2 size-4" }),
1204
- sub.label
1205
- ] }, sub.id)) })
1206
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(
1207
- ui.DropdownMenuItem,
1208
- {
1209
- onSelect: item.onSelect,
1210
- "data-testid": item.testId,
1211
- className: ui.cn(item.destructive && "text-destructive focus:text-destructive"),
1212
- children: [
1213
- /* @__PURE__ */ jsxRuntime.jsx(item.icon, { className: "mr-2 size-4" }),
1214
- item.label
1215
- ]
1216
- }
1217
- )
1218
- ] }, item.id))
1219
- }
1220
- )
1221
- ] });
1222
- }
1223
- function RenameField({
1224
- seed,
1225
- testId,
1226
- label,
1227
- onCommit,
1228
- onCancel,
1229
- className
1230
- }) {
1231
- const doneRef = react.useRef(false);
1232
- const commit = (value) => {
1233
- if (doneRef.current) return;
1234
- doneRef.current = true;
1235
- const trimmed = value.trim();
1236
- if (trimmed && trimmed !== seed) onCommit(trimmed);
1237
- else onCancel();
1238
- };
1239
- return /* @__PURE__ */ jsxRuntime.jsx(
1240
- "input",
1241
- {
1242
- autoFocus: true,
1243
- defaultValue: seed,
1244
- "data-testid": testId,
1245
- "aria-label": label,
1246
- onFocus: (e) => e.currentTarget.select(),
1247
- onClick: (e) => e.stopPropagation(),
1248
- onPointerDown: (e) => e.stopPropagation(),
1249
- onDoubleClick: (e) => e.stopPropagation(),
1250
- onKeyDown: (e) => {
1251
- if (e.key === "Enter") {
1252
- e.preventDefault();
1253
- commit(e.currentTarget.value);
1254
- } else if (e.key === "Escape") {
1255
- e.preventDefault();
1256
- doneRef.current = true;
1257
- onCancel();
1258
- }
1259
- },
1260
- onBlur: (e) => commit(e.currentTarget.value),
1261
- className: ui.cn(
1262
- "w-full rounded-md border border-primary bg-background px-1 py-0.5 text-sm text-foreground outline-none",
1263
- className
1264
- )
1265
- }
1266
- );
1267
- }
1268
- function SelectCheckbox({
1269
- selected,
1270
- onToggle,
1271
- labels,
1272
- className
1273
- }) {
1274
- return /* @__PURE__ */ jsxRuntime.jsx(
1275
- ui.Checkbox,
1276
- {
1277
- checked: selected,
1278
- onPointerDown: (e) => e.stopPropagation(),
1279
- onClick: onToggle,
1280
- "aria-label": selected ? labels.deselect : labels.select,
1281
- className: ui.cn(
1282
- "size-6 rounded-md border-muted-foreground/60 bg-card transition data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground pointer-coarse:size-9",
1283
- selected ? "opacity-100" : "opacity-60 hover:opacity-100",
1284
- className
1285
- )
1286
- }
1287
- );
1288
- }
1289
- function ExplorerFileTile({
1290
- id,
1291
- title,
1292
- density,
1293
- selected,
1294
- dragging,
1295
- renaming,
1296
- thumbnailUrl,
1297
- renderFileIcon,
1298
- progress,
1299
- statusMarker,
1300
- offlineMarker,
1301
- entity,
1302
- tooltip,
1303
- menuItems,
1304
- rootRef,
1305
- rootProps,
1306
- onOpen,
1307
- href,
1308
- labels,
1309
- testIds,
1310
- onSelect,
1311
- onToggle,
1312
- onCommitRename,
1313
- onCancelRename
1314
- }) {
1315
- const l = { ...DEFAULT_EXPLORER_LABELS, ...labels };
1316
- const [thumbFailed, setThumbFailed] = react.useState(false);
1317
- const [thumbLandscape, setThumbLandscape] = react.useState(false);
1318
- const showThumbnail = !!thumbnailUrl && !thumbFailed && !progress;
1319
- const tile = /* @__PURE__ */ jsxRuntime.jsxs(
1320
- "div",
1321
- {
1322
- ref: rootRef,
1323
- ...rootProps,
1324
- onClick: (e) => {
1325
- if (href && isInsideTileLink(e)) {
1326
- if (e.shiftKey) {
1327
- e.preventDefault();
1328
- onSelect(e);
1329
- }
1330
- return;
1331
- }
1332
- if (e.shiftKey || e.metaKey || e.ctrlKey) onSelect(e);
1333
- else onOpen();
1334
- },
1335
- onDoubleClick: onOpen,
1336
- "data-slot": "explorer-file-tile",
1337
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "explorer-file" }),
1338
- "data-doc-id": id,
1339
- className: ui.cn(
1340
- "group relative h-full cursor-default select-none overflow-hidden rounded-lg border transition",
1341
- dragging && "opacity-40",
1342
- selected ? "border-primary/30 bg-accent" : "border-border bg-muted hover:bg-muted/70"
1343
- ),
1344
- children: [
1345
- href && /* @__PURE__ */ jsxRuntime.jsx(TileLink, { href, label: title, onSelect: onOpen }),
1346
- showThumbnail ? /* @__PURE__ */ jsxRuntime.jsx(
1347
- "img",
1348
- {
1349
- src: thumbnailUrl,
1350
- alt: "",
1351
- loading: "lazy",
1352
- draggable: false,
1353
- onError: () => setThumbFailed(true),
1354
- onLoad: (e) => setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight),
1355
- className: ui.cn(
1356
- "absolute inset-0 size-full bg-card",
1357
- thumbLandscape ? "object-contain" : "object-cover object-top"
1358
- )
1359
- }
1360
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: renderFileIcon(density === "list" ? 30 : 44) }),
1361
- progress && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3", children: [
1362
- /* @__PURE__ */ jsxRuntime.jsx(
1363
- "div",
1364
- {
1365
- className: ui.cn(
1366
- "h-1.5 w-full rounded-sm",
1367
- progress.queued ? "progress-bar-queued" : "progress-bar-processing"
1368
- )
1369
- }
1370
- ),
1371
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-primary", children: progress.label })
1372
- ] }),
1373
- /* @__PURE__ */ jsxRuntime.jsx(
1374
- SelectCheckbox,
1375
- {
1376
- selected,
1377
- onToggle,
1378
- labels: l,
1379
- className: "absolute left-1.5 top-1.5 z-20"
1380
- }
1381
- ),
1382
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-1.5 top-1.5 z-20", children: /* @__PURE__ */ jsxRuntime.jsx(
1383
- ExplorerMenu,
1384
- {
1385
- items: menuItems,
1386
- testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.menu, { testId: "explorer-file-menu" }),
1387
- label: l.moreActions,
1388
- align: "start"
1389
- }
1390
- ) }),
1391
- renaming ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-0 bottom-0 z-20 flex items-center gap-1 bg-background/90 px-1.5 py-1 backdrop-blur-sm", children: [
1392
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0", children: renderFileIcon(13) }),
1393
- /* @__PURE__ */ jsxRuntime.jsx(
1394
- RenameField,
1395
- {
1396
- seed: title,
1397
- testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.renameInput, { testId: "explorer-rename-input" }),
1398
- label: l.name,
1399
- onCommit: onCommitRename,
1400
- onCancel: onCancelRename,
1401
- className: "flex-1 text-left"
1402
- }
1403
- )
1404
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1", children: [
1405
- (offlineMarker || statusMarker) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
1406
- offlineMarker,
1407
- statusMarker && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex", children: statusMarker })
1408
- ] }),
1409
- entity
1410
- ] })
1411
- ]
1412
- }
1413
- );
1414
- if (!tooltip) return tile;
1415
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { delayDuration: 500, children: [
1416
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: tile }),
1417
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "bottom", sideOffset: 6, className: "p-2.5", children: tooltip })
1418
- ] });
1419
- }
1420
- function ExplorerFolderTile({
1421
- name,
1422
- displayName,
1423
- path,
1424
- count,
1425
- density,
1426
- editing,
1427
- selected,
1428
- partiallySelected,
1429
- processingCount = 0,
1430
- isOver,
1431
- icon,
1432
- menuItems = [],
1433
- rootRef,
1434
- rootProps,
1435
- onOpen,
1436
- href,
1437
- labels,
1438
- testIds,
1439
- onToggleSelect,
1440
- onCommitName,
1441
- onCancelName
1442
- }) {
1443
- const l = { ...DEFAULT_EXPLORER_LABELS, ...labels };
1444
- const iconSize = density === "list" ? 34 : 48;
1445
- const isEmpty = count === 0;
1446
- const countLabel = isEmpty ? l.empty : l.itemCount(count);
1447
- const joined = path.join("/");
1448
- return /* @__PURE__ */ jsxRuntime.jsxs(
1449
- "div",
1450
- {
1451
- ref: rootRef,
1452
- ...rootProps,
1453
- onClick: editing || href ? void 0 : onOpen,
1454
- "data-slot": "explorer-folder-tile",
1455
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "explorer-folder" }),
1456
- "data-folder-path": joined,
1457
- title: name,
1458
- className: ui.cn(
1459
- "group relative flex h-full cursor-pointer select-none flex-col items-center justify-center gap-1 rounded-lg p-2 text-center transition",
1460
- isOver ? "bg-accent ring-2 ring-primary/40" : selected ? "bg-accent ring-1 ring-primary/30" : "bg-muted hover:bg-muted/70",
1461
- isEmpty && !isOver && !selected && "opacity-70"
1462
- ),
1463
- children: [
1464
- href && !editing && /* @__PURE__ */ jsxRuntime.jsx(TileLink, { href, label: displayName || name, onSelect: onOpen }),
1465
- onToggleSelect && !isEmpty && /* @__PURE__ */ jsxRuntime.jsx(
1466
- SelectCheckbox,
1467
- {
1468
- selected: !!selected,
1469
- onToggle: onToggleSelect,
1470
- labels: l,
1471
- className: ui.cn(
1472
- "absolute left-1.5 top-1.5 z-20",
1473
- partiallySelected && !selected && "opacity-100"
1474
- )
1475
- }
1476
- ),
1477
- menuItems.length > 0 && !editing && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-1 top-1 z-20", children: /* @__PURE__ */ jsxRuntime.jsx(
1478
- ExplorerMenu,
1479
- {
1480
- items: menuItems,
1481
- testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.menu, { testId: "explorer-folder-menu" }),
1482
- label: l.moreActions,
1483
- align: "end"
1484
- }
1485
- ) }),
1486
- icon ?? /* @__PURE__ */ jsxRuntime.jsx(
1487
- lucideReact.Folder,
1488
- {
1489
- className: ui.cn(
1490
- "transition",
1491
- isEmpty ? "text-yellow-text/50" : "fill-yellow-text/30 text-yellow-text group-hover:fill-yellow-text/40"
1492
- ),
1493
- size: iconSize
1494
- }
1495
- ),
1496
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
1497
- RenameField,
1498
- {
1499
- seed: name,
1500
- testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.renameInput, { testId: "explorer-rename-input" }),
1501
- label: l.name,
1502
- onCommit: (next) => onCommitName?.(next),
1503
- onCancel: () => onCancelName?.(),
1504
- className: "text-center"
1505
- }
1506
- ) : displayName && /* @__PURE__ */ jsxRuntime.jsx(
1507
- "span",
1508
- {
1509
- className: ui.cn(
1510
- "line-clamp-2 w-full break-words text-xs font-semibold leading-tight",
1511
- isEmpty ? "text-foreground/60" : "text-foreground/90"
1512
- ),
1513
- children: displayName
1514
- }
1515
- ),
1516
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: countLabel }),
1517
- processingCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
1518
- "span",
1519
- {
1520
- className: "inline-flex items-center gap-1 text-xs font-semibold text-primary",
1521
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.processing, {
1522
- testId: `explorer-folder-processing-${joined}`
1523
- }),
1524
- children: [
1525
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LoaderCircle, { className: "size-3 animate-spin" }),
1526
- l.processing(processingCount)
1527
- ]
1528
- }
1529
- )
1530
- ]
1531
- }
1532
- );
1533
- }
1534
- function ExplorerFileTooltip({
1535
- title,
1536
- summary,
1537
- modifiedLabel,
1538
- modifiedByAvatar,
1539
- shared,
1540
- visibilityIcon,
1541
- labels,
1542
- uiLabels
1543
- }) {
1544
- const l = { ...DEFAULT_EXPLORER_LABELS, ...uiLabels };
1545
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-xs space-y-2", children: [
1546
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "break-words text-xs font-semibold leading-snug text-foreground", children: title }),
1547
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 border-t border-border pt-1.5", children: [
1548
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 text-xs font-semibold text-foreground", children: [
1549
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "size-3.5 shrink-0 text-yellow-text" }),
1550
- l.aiSummary
1551
- ] }),
1552
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "line-clamp-6 text-xs leading-snug text-foreground/90", children: summary?.trim() || l.noSummary })
1553
- ] }),
1554
- (modifiedLabel || labels.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 border-t border-border pt-1.5", children: [
1555
- modifiedLabel && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 text-xs text-muted-foreground", children: [
1556
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1", children: [
1557
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.lastModifiedBy }),
1558
- modifiedByAvatar,
1559
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: modifiedLabel })
1560
- ] }),
1561
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
1562
- visibilityIcon,
1563
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: shared ? l.shared : l.private })
1564
- ] })
1565
- ] }),
1566
- labels.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 pt-0.5", children: labels.map((label) => /* @__PURE__ */ jsxRuntime.jsx(
1567
- "span",
1568
- {
1569
- className: "rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-foreground/80",
1570
- children: label
1571
- },
1572
- label
1573
- )) })
1574
- ] })
1575
- ] });
1576
- }
1577
- var pill = classVarianceAuthority.cva(
1578
- "inline-flex max-w-full items-center justify-center gap-1 rounded-full text-xs font-medium leading-none",
1579
- {
1580
- variants: {
1581
- /** `icon` = glyph-only chip; `label` = text pill. */
1582
- shape: { icon: "size-6 p-0 pointer-coarse:size-8", label: "h-6 px-2 pointer-coarse:h-8" },
1583
- interactive: {
1584
- true: "relative cursor-pointer pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-[''] hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1585
- false: ""
1586
- }
1587
- },
1588
- defaultVariants: { shape: "label", interactive: false }
1589
- }
1590
- );
1591
- function StatusPill({
1592
- tone = "neutral",
1593
- icon,
1594
- label,
1595
- progress,
1596
- title,
1597
- onClick,
1598
- testId,
1599
- className
1600
- }) {
1601
- const hasLabel = label !== void 0 && label !== null && label !== "";
1602
- const classes = ui.cn(
1603
- pill({ shape: hasLabel ? "label" : "icon", interactive: !!onClick }),
1604
- chunk32HW2Q33_cjs.TONE_SURFACE[tone],
1605
- progress && "h-auto min-h-6 flex-col gap-0 px-2 py-1",
1606
- className
1607
- );
1608
- const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1609
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex max-w-full items-center gap-1", children: [
1610
- icon,
1611
- hasLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
1612
- ] }),
1613
- progress && /* @__PURE__ */ jsxRuntime.jsx(
1614
- "span",
1615
- {
1616
- "aria-hidden": true,
1617
- "data-slot": "status-pill-progress",
1618
- className: ui.cn(
1619
- "mt-0.5 block h-1 w-full min-w-10 shrink-0 rounded-sm",
1620
- progress === "queued" ? "progress-bar-queued" : "progress-bar-processing"
1621
- )
1622
- }
1623
- )
1624
- ] });
1625
- if (onClick) {
1626
- return /* @__PURE__ */ jsxRuntime.jsx(
1627
- "button",
1628
- {
1629
- type: "button",
1630
- title,
1631
- "aria-label": hasLabel ? void 0 : title,
1632
- "data-slot": "status-pill",
1633
- "data-testid": testId,
1634
- className: classes,
1635
- onClick: (e) => {
1636
- e.stopPropagation();
1637
- onClick();
1638
- },
1639
- onKeyDown: (e) => e.stopPropagation(),
1640
- children: body
1641
- }
1642
- );
1643
- }
1644
- return /* @__PURE__ */ jsxRuntime.jsx(
1645
- "span",
1646
- {
1647
- title,
1648
- role: hasLabel || !title ? void 0 : "img",
1649
- "aria-label": hasLabel ? void 0 : title,
1650
- "data-slot": "status-pill",
1651
- "data-testid": testId,
1652
- className: classes,
1653
- children: body
1654
- }
1655
- );
1656
- }
1657
- var STAGE_VARIANTS = {
1658
- parsing: { Icon: lucideReact.FileX, title: "Parsing failed" },
1659
- indexing: { Icon: lucideReact.DatabaseZap, title: "Indexing failed" },
1660
- encrypting: { Icon: lucideReact.LockKeyholeOpen, title: "Encryption failed" },
1661
- analysing: { Icon: lucideReact.BrainCircuit, title: "Analysis failed" },
1662
- queued: { Icon: lucideReact.CircleSlash, title: "Failed before processing" },
1663
- unknown: { Icon: lucideReact.AlertCircle, title: "Failed" }
1664
- };
1665
- var LEGACY_VARIANT = {
1666
- Icon: lucideReact.AlertCircle,
1667
- title: "Failed (stage unknown)"
1668
- };
1669
- function resolveVariant(stage) {
1670
- if (stage == null) return LEGACY_VARIANT;
1671
- return STAGE_VARIANTS[stage] ?? STAGE_VARIANTS.unknown;
1672
- }
1673
- var FailedStageIcon = react.memo(function FailedStageIcon2({
1674
- stage,
1675
- errorMessage,
1676
- className = "w-4 h-4 text-red-text cursor-pointer hover:text-red-text",
1677
- onClick
1678
- }) {
1679
- const { Icon, title } = resolveVariant(stage);
1680
- const fullTitle = errorMessage ? `${title}: ${errorMessage}` : title;
1681
- return /* @__PURE__ */ jsxRuntime.jsx("div", { title: fullTitle, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className, onClick }) });
1682
- });
1683
- var MAX_NAMES_IN_CONFIRM = 5;
1684
- function shareStateOf(items) {
1685
- if (items.length === 0) return "private";
1686
- const sharedCount = items.filter((item) => item.shared === true).length;
1687
- if (sharedCount === items.length) return "shared";
1688
- return sharedCount > 0 ? "mixed" : "private";
1689
- }
1690
- function shareTooltipFor(state, isSingle) {
1691
- const workspace = ui.getEntityLabel("WORKSPACE");
1692
- const subject = isSingle ? "" : " all";
1693
- if (state === "shared") return `Hide${subject} from ${workspace} members`;
1694
- if (state === "mixed") return `Make all visible to ${workspace} members (some already shared)`;
1695
- return `Make${subject} visible to ${workspace} members`;
1696
- }
1697
- function confirmHideFromMembers(confirm, count, members) {
1698
- const workspace = ui.getEntityLabel("WORKSPACE");
1699
- const documentLabel = ui.getEntityLabel("DOCUMENT", count === 1 ? "SINGULAR" : "PLURAL");
1700
- const pronoun = count === 1 ? "it" : "them";
1701
- const names = members.filter((member) => !ui.isAgent(member.user)).map((member) => ui.getUserDisplayName(member.user));
1702
- const shown = names.slice(0, MAX_NAMES_IN_CONFIRM);
1703
- const hiddenCount = names.length - shown.length;
1704
- const listed = hiddenCount > 0 ? [...shown, `${hiddenCount} more`] : shown;
1705
- const last = listed[listed.length - 1];
1706
- const audienceList = listed.length > 2 ? `${listed.slice(0, -1).join(", ")}, and ${last}` : listed.join(" and ");
1707
- const audience = names.length > 0 ? `Right now ${audienceList} can see ${pronoun}. ` : "";
1708
- return confirm({
1709
- message: `Hide ${count} ${documentLabel.toLowerCase()} from ${workspace} members? ${audience}They will no longer be able to see ${pronoun}.`,
1710
- title: "Hide from members"
1711
- });
1712
- }
1713
- function visibilityAudience(shared, workspaceLabel = ui.getEntityLabel("WORKSPACE")) {
1714
- return shared ? `Shared with ${workspaceLabel.toLowerCase()}` : "Private to you";
1715
- }
1716
- function visibilityToggleTooltip(shared) {
1717
- const workspace = ui.getEntityLabel("WORKSPACE").toLowerCase();
1718
- return shared ? `${visibilityAudience(true)}: everyone in it can see this file. Click to make it private to you.` : `${visibilityAudience(false)}: only you can see this file. Click to share it with the ${workspace}.`;
1719
- }
1720
- var DEFAULT_UPLOAD_PARTS_LABELS = {
1721
- rejectedReasons: {
1722
- too_large: "The following files exceed the 1 GB size limit:",
1723
- unsupported: "The following files are not in a supported format (PDF, DOC(X), PPT(X), XLS(X), RTF, TXT, MD, HTML, images, audio, video, email, Outlook archive (.pst/.ost), or ZIP):",
1724
- empty: "The following files are empty (0 bytes):",
1725
- no_extension: "The following files have no file extension:",
1726
- empty_zip: "The following ZIP archives contain no supported files:",
1727
- zip_error: "The following ZIP archives could not be processed:"
1728
- },
1729
- rejectedFallback: "The following files cannot be uploaded:",
1730
- clearRejected: "Clear rejected files",
1731
- selectedFiles: (count) => `Selected Files (${count})`,
1732
- total: (size) => `Total: ${size}`,
1733
- clearAll: "Clear All",
1734
- remove: (fileName) => `Remove ${fileName}`,
1735
- uploadComplete: (entity) => `Upload complete! Processing ${entity} in the background...`,
1736
- uploading: (count, entity) => `Uploading ${count} ${entity}...`,
1737
- uploadedIndexing: "Files uploaded successfully. ARBI is now indexing them in the background.",
1738
- afterUpload: "After upload completes, ARBI will index files in the background."
1739
- };
1740
- function mergeUploadLabels(labels) {
1741
- return {
1742
- ...DEFAULT_UPLOAD_PARTS_LABELS,
1743
- ...labels,
1744
- rejectedReasons: {
1745
- ...DEFAULT_UPLOAD_PARTS_LABELS.rejectedReasons,
1746
- ...labels?.rejectedReasons
1747
- }
1748
- };
1749
- }
1750
- function UploadErrorMessage({
1751
- message,
1752
- className,
1753
- testId
1754
- }) {
1755
- return /* @__PURE__ */ jsxRuntime.jsxs(
1756
- "div",
1757
- {
1758
- role: "alert",
1759
- className: ui.cn("mt-6 flex items-center gap-2 rounded-lg bg-red-bg p-3", className),
1760
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "error-message" }),
1761
- children: [
1762
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "size-5 shrink-0 text-red-text" }),
1763
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base text-red-text", children: message })
1764
- ]
1765
- }
1766
- );
1767
- }
1768
- function RejectedFilesList({ files, onClear, labels, testIds }) {
1769
- if (files.length === 0) return null;
1770
- const l = mergeUploadLabels(labels);
1771
- const byReason = /* @__PURE__ */ new Map();
1772
- for (const file of files) {
1773
- const reason = typeof file === "string" ? "unsupported" : file.reason || "unsupported";
1774
- const name = typeof file === "string" ? file : file.name;
1775
- byReason.set(reason, [...byReason.get(reason) ?? [], name]);
1776
- }
1777
- return /* @__PURE__ */ jsxRuntime.jsx(
1778
- "div",
1779
- {
1780
- className: "mt-4 rounded-lg bg-red-bg p-3",
1781
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "rejected-files-list" }),
1782
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2", children: [
1783
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { className: "mt-0.5 size-5 shrink-0 text-red-text" }),
1784
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: Array.from(byReason.entries()).map(([reason, names], groupIndex) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: groupIndex > 0 ? "mt-3" : "", children: [
1785
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-sm font-medium text-red-text", children: l.rejectedReasons[reason] ?? l.rejectedFallback }),
1786
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: names.map((name, index) => /* @__PURE__ */ jsxRuntime.jsx(
1787
- "div",
1788
- {
1789
- className: "rounded-md bg-background/60 p-2",
1790
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.item?.(groupIndex, index), {
1791
- testId: `rejected-file-item-${groupIndex}-${index}`
1792
- }),
1793
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-red-text", children: name })
1794
- },
1795
- index
1796
- )) })
1797
- ] }, reason)) }),
1798
- /* @__PURE__ */ jsxRuntime.jsx(
1799
- ui.Button,
1800
- {
1801
- variant: "ghost",
1802
- size: "icon",
1803
- onClick: onClear,
1804
- "aria-label": l.clearRejected,
1805
- className: "size-6 text-red-text hover:text-red-text pointer-coarse:size-11",
1806
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.clear, { testId: "clear-rejected-files-button" }),
1807
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-4" })
1808
- }
1809
- )
1810
- ] })
1811
- }
1812
- );
1813
- }
1814
- function folderPathOf(file) {
1815
- const rel = file.webkitRelativePath;
1816
- if (!rel) return null;
1817
- const slash = rel.lastIndexOf("/");
1818
- return slash > 0 ? rel.substring(0, slash) : null;
1819
- }
1820
- function SelectedFilesList({
1821
- files,
1822
- onRemoveFile,
1823
- onClearAll,
1824
- formatFileSize,
1825
- renderFileIcon,
1826
- labels,
1827
- testIds
1828
- }) {
1829
- if (files.length === 0) return null;
1830
- const l = mergeUploadLabels(labels);
1831
- const total = files.reduce((sum, f) => sum + f.size, 0);
1832
- return /* @__PURE__ */ jsxRuntime.jsxs(
1833
- "div",
1834
- {
1835
- className: "mt-2 sm:mt-6",
1836
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "selected-files-list" }),
1837
- children: [
1838
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between gap-3", children: [
1839
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col sm:flex-row sm:items-center sm:gap-4", children: [
1840
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-base font-medium", children: l.selectedFiles(files.length) }),
1841
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.total(formatFileSize(total)) })
1842
- ] }),
1843
- onClearAll && /* @__PURE__ */ jsxRuntime.jsxs(
1844
- ui.Button,
1845
- {
1846
- variant: "ghost",
1847
- size: "sm",
1848
- onClick: onClearAll,
1849
- className: "h-8 shrink-0 whitespace-nowrap text-muted-foreground hover:text-foreground pointer-coarse:h-11",
1850
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.clearAll, { testId: "clear-all-files-button" }),
1851
- children: [
1852
- l.clearAll,
1853
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "ml-1 hidden size-4 sm:block" })
1854
- ]
1855
- }
1856
- )
1857
- ] }),
1858
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1 overflow-y-auto overscroll-contain pr-1 sm:max-h-[300px]", children: files.map((file, index) => {
1859
- const folder = folderPathOf(file);
1860
- return /* @__PURE__ */ jsxRuntime.jsxs(
1861
- "div",
1862
- {
1863
- className: "flex min-w-0 items-center gap-2 rounded-lg bg-muted p-3",
1864
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.item?.(index), {
1865
- testId: `selected-file-item-${index}`
1866
- }),
1867
- children: [
1868
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: renderFileIcon(file.name) }),
1869
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
1870
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate text-base", title: file.name, children: file.name }),
1871
- folder && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
1872
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "size-3" }),
1873
- folder
1874
- ] })
1875
- ] }),
1876
- /* @__PURE__ */ jsxRuntime.jsx(
1877
- ui.Button,
1878
- {
1879
- variant: "ghost",
1880
- size: "icon",
1881
- onClick: () => onRemoveFile(index),
1882
- "aria-label": l.remove(file.name),
1883
- className: "size-6 shrink-0 pointer-coarse:size-11",
1884
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.remove?.(index), {
1885
- testId: `remove-file-button-${index}`
1886
- }),
1887
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-4" })
1888
- }
1889
- )
1890
- ]
1891
- },
1892
- index
1893
- );
1894
- }) })
1895
- ]
1896
- }
1897
- );
1898
- }
1899
- function UploadProgress({
1900
- fileCount,
1901
- entityLabel,
1902
- percentage,
1903
- batchInfo,
1904
- labels,
1905
- testId
1906
- }) {
1907
- const l = mergeUploadLabels(labels);
1908
- const isComplete = percentage >= 100;
1909
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "upload-progress" }), children: [
1910
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-2 text-lg font-medium", children: isComplete ? l.uploadComplete(entityLabel) : l.uploading(fileCount, entityLabel) }),
1911
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto mb-4 max-w-md", children: [
1912
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1913
- /* @__PURE__ */ jsxRuntime.jsx(ui.Progress, { value: percentage, className: "h-3" }),
1914
- batchInfo && batchInfo.total > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0", "aria-hidden": "true", children: Array.from({ length: batchInfo.total - 1 }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx(
1915
- "span",
1916
- {
1917
- className: "absolute top-0 h-full w-px bg-background/50",
1918
- style: { left: `${(i + 1) / batchInfo.total * 100}%` }
1919
- },
1920
- i
1921
- )) })
1922
- ] }),
1923
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex items-center justify-center text-sm text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1924
- Math.round(percentage),
1925
- "%"
1926
- ] }) })
1927
- ] }),
1928
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: isComplete ? l.uploadedIndexing : l.afterUpload })
1929
- ] });
1930
- }
1931
- var DEFAULT_UPLOAD_FOOTER_LABELS = {
1932
- skipDuplicates: "Skip duplicates",
1933
- skipDuplicatesActive: "Skip identical files already in the workspace",
1934
- skipDuplicatesInactive: "Allow uploading identical files",
1935
- autoRename: "Auto-rename",
1936
- autoRenameActive: "Generate a descriptive title via AI instead of using the filename",
1937
- autoRenameInactive: "Keep the original filename",
1938
- titleInstruction: "Title instruction",
1939
- titleInstructionPlaceholder: "Optional: how should AI name these documents?"
1940
- };
1941
- function UploadContainer({
1942
- children,
1943
- className = "p-4 sm:p-6",
1944
- testId
1945
- }) {
1946
- return /* @__PURE__ */ jsxRuntime.jsx(
1947
- "div",
1948
- {
1949
- className,
1950
- "data-slot": "upload-container",
1951
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "upload-container" }),
1952
- children
1953
- }
1954
- );
1955
- }
1956
- function UploadShareNote({
1957
- description,
1958
- children,
1959
- compact = false,
1960
- testId
1961
- }) {
1962
- const id = chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "share-toggle" });
1963
- if (compact) {
1964
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
1965
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": id, children }) }),
1966
- /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "top", className: "max-w-xs", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: description }) })
1967
- ] });
1968
- }
1969
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg bg-muted p-4", "data-testid": id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
1970
- children,
1971
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: description })
1972
- ] }) });
1973
- }
1974
- var TOGGLE_COLORS = { text: "text-primary", bg: "bg-primary" };
1975
- function UploadFooterBar({
1976
- skipDuplicates,
1977
- onSkipDuplicatesChange,
1978
- autoRename,
1979
- onAutoRenameChange,
1980
- autoRenameInstruction,
1981
- onAutoRenameInstructionChange,
1982
- shareToggle,
1983
- children,
1984
- className,
1985
- labels,
1986
- testIds
1987
- }) {
1988
- const l = { ...DEFAULT_UPLOAD_FOOTER_LABELS, ...labels };
1989
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1990
- /* @__PURE__ */ jsxRuntime.jsxs(
1991
- "div",
1992
- {
1993
- className: ui.cn(
1994
- "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-t border-border bg-background px-4 py-3 sm:px-6",
1995
- className
1996
- ),
1997
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.bar, { testId: "upload-footer-bar" }),
1998
- children: [
1999
- /* @__PURE__ */ jsxRuntime.jsx(
2000
- ui.IconToggle,
2001
- {
2002
- icon: lucideReact.CopyX,
2003
- isActive: skipDuplicates,
2004
- onToggle: onSkipDuplicatesChange,
2005
- colors: TOGGLE_COLORS,
2006
- showLabel: true,
2007
- label: l.skipDuplicates,
2008
- tooltipActive: l.skipDuplicatesActive,
2009
- tooltipInactive: l.skipDuplicatesInactive,
2010
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.skipDuplicates, { testId: "toggle-skip-duplicates" })
2011
- }
2012
- ),
2013
- /* @__PURE__ */ jsxRuntime.jsx(
2014
- ui.IconToggle,
2015
- {
2016
- icon: lucideReact.Sparkles,
2017
- isActive: autoRename,
2018
- onToggle: onAutoRenameChange,
2019
- colors: TOGGLE_COLORS,
2020
- showLabel: true,
2021
- label: l.autoRename,
2022
- tooltipActive: l.autoRenameActive,
2023
- tooltipInactive: l.autoRenameInactive,
2024
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.autoRename, { testId: "toggle-auto-rename" })
2025
- }
2026
- ),
2027
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden flex-1 sm:block" }),
2028
- shareToggle,
2029
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full sm:w-auto max-sm:[&>button]:w-full", children })
2030
- ]
2031
- }
2032
- ),
2033
- autoRename && /* @__PURE__ */ jsxRuntime.jsxs(
2034
- "div",
2035
- {
2036
- className: "shrink-0 border-t border-border bg-background px-4 py-3 sm:px-6",
2037
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.settingsPanel, { testId: "upload-settings-panel" }),
2038
- children: [
2039
- /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "auto-rename-instruction", className: "text-sm font-medium", children: l.titleInstruction }),
2040
- /* @__PURE__ */ jsxRuntime.jsx(
2041
- ui.Textarea,
2042
- {
2043
- id: "auto-rename-instruction",
2044
- value: autoRenameInstruction,
2045
- onChange: (e) => onAutoRenameInstructionChange(e.target.value),
2046
- placeholder: l.titleInstructionPlaceholder,
2047
- className: "mt-1 min-h-[60px] text-sm",
2048
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.instruction, { testId: "auto-rename-instruction" })
2049
- }
2050
- )
2051
- ]
2052
- }
2053
- )
2054
- ] });
2055
- }
2056
- function ShareToggle({
2057
- isVisible,
2058
- onToggle,
2059
- workspaceEntityLabel,
2060
- compact = false
2061
- }) {
2062
- const doc = ui.getEntityLabel("DOCUMENT", "PLURAL").toLowerCase();
2063
- const workspace = workspaceEntityLabel.toLowerCase();
2064
- const description = isVisible ? `Uploaded ${doc} will be shared with this ${workspace} \u2014 everyone in it, now and in the future.` : `Uploaded ${doc} stay private to you \u2014 not shared with this ${workspace}. You can change this later.`;
2065
- const audience = visibilityAudience(isVisible, workspaceEntityLabel);
2066
- const toggle = /* @__PURE__ */ jsxRuntime.jsx(
2067
- ui.VisibilityToggle,
2068
- {
2069
- items: { shared: isVisible },
2070
- onToggle,
2071
- showLabel: true,
2072
- label: audience,
2073
- showTooltip: false
2074
- }
2075
- );
2076
- if (compact) {
2077
- const summary = isVisible ? `Everyone in this ${workspace} can see uploaded ${doc}.` : `Only you can see uploaded ${doc}.`;
2078
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "share-toggle", className: "flex max-w-[15rem] flex-col items-end gap-1", children: [
2079
- toggle,
2080
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-right text-xs text-muted-foreground", children: summary })
2081
- ] });
2082
- }
2083
- return /* @__PURE__ */ jsxRuntime.jsx(UploadShareNote, { description, compact: false, children: toggle });
2084
- }
2085
- var DEFAULT_UPLOAD_SOURCES_LABELS = {
2086
- uploadFiles: "Choose files",
2087
- uploadFolder: "Choose a folder"
2088
- };
2089
- function UploadFrame({ isCompact, isDimmed, className, children }) {
2090
- return /* @__PURE__ */ jsxRuntime.jsx(
2091
- "div",
2092
- {
2093
- "data-slot": "upload-frame",
2094
- className: ui.cn(
2095
- "relative flex w-full flex-col items-center",
2096
- isCompact ? "gap-4" : "gap-6",
2097
- isDimmed && "opacity-50",
2098
- className
2099
- ),
2100
- children
2101
- }
2102
- );
2103
- }
2104
- function UploadDropArea({
2105
- isActive,
2106
- isDisabled,
2107
- isProcessing,
2108
- processingMessage,
2109
- isCompact,
2110
- title,
2111
- subtitle,
2112
- onDrag,
2113
- onDrop,
2114
- onClick,
2115
- actions,
2116
- testId = "upload-dropzone-area"
2117
- }) {
2118
- const active = isActive && !isDisabled;
2119
- return /* @__PURE__ */ jsxRuntime.jsxs(
2120
- "div",
2121
- {
2122
- "data-slot": "upload-drop-area",
2123
- "data-testid": testId,
2124
- onDragEnter: onDrag,
2125
- onDragLeave: onDrag,
2126
- onDragOver: onDrag,
2127
- onDrop,
2128
- onClick,
2129
- className: ui.cn(
2130
- "relative flex w-full flex-col items-center justify-center rounded-lg border text-center transition-colors",
2131
- active ? "border-dashed border-primary bg-accent" : "border-border bg-card shadow-xs hover:border-ring/50 hover:bg-accent/40",
2132
- isDisabled || isProcessing ? "cursor-not-allowed" : "cursor-pointer",
2133
- isCompact ? "min-h-[150px] p-4" : "min-h-[200px] p-5",
2134
- // Touch screens cannot drag files in: the area stays in the DOM (assistive tech, e2e) but
2135
- // the "Choose files / folder" buttons are the whole affordance.
2136
- "pointer-coarse:sr-only"
2137
- ),
2138
- children: [
2139
- isProcessing && /* @__PURE__ */ jsxRuntime.jsxs(
2140
- "div",
2141
- {
2142
- role: "status",
2143
- className: "absolute inset-0 z-10 flex flex-col items-center justify-center rounded-lg bg-background/80",
2144
- children: [
2145
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mb-3 size-8 animate-spin text-primary" }),
2146
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "progress-bar-processing mb-3 h-1.5 w-48 rounded-sm" }),
2147
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: processingMessage })
2148
- ]
2149
- }
2150
- ),
2151
- /* @__PURE__ */ jsxRuntime.jsx(
2152
- "div",
2153
- {
2154
- className: ui.cn(
2155
- "mb-2 flex items-center justify-center rounded-full bg-muted text-muted-foreground",
2156
- isCompact ? "size-11" : "size-10",
2157
- active && "bg-primary/10 text-primary"
2158
- ),
2159
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Upload, { className: "size-5" })
2160
- }
2161
- ),
2162
- /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-semibold text-foreground", children: title }),
2163
- subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: subtitle }),
2164
- actions
2165
- ]
2166
- }
2167
- );
2168
- }
2169
- function UploadBrowseButtons({
2170
- onFiles,
2171
- onFolder,
2172
- isDisabled,
2173
- layout = "inline",
2174
- labels
2175
- }) {
2176
- const l = { ...DEFAULT_UPLOAD_SOURCES_LABELS, ...labels };
2177
- const isInline = layout === "inline";
2178
- const size = isInline ? "sm" : "default";
2179
- const width = isInline ? void 0 : "w-full";
2180
- return /* @__PURE__ */ jsxRuntime.jsxs(
2181
- "div",
2182
- {
2183
- "data-slot": "upload-browse-buttons",
2184
- className: isInline ? "mt-3 flex flex-wrap items-center justify-center gap-2" : "grid grid-cols-1 gap-2 sm:grid-cols-2",
2185
- children: [
2186
- /* @__PURE__ */ jsxRuntime.jsxs(
2187
- ui.Button,
2188
- {
2189
- variant: isInline ? "outline" : "default",
2190
- size,
2191
- className: width,
2192
- onClick: onFiles,
2193
- disabled: isDisabled,
2194
- "data-testid": "upload-files-button",
2195
- children: [
2196
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "mr-2 size-4" }),
2197
- l.uploadFiles
2198
- ]
2199
- }
2200
- ),
2201
- /* @__PURE__ */ jsxRuntime.jsxs(
2202
- ui.Button,
2203
- {
2204
- variant: "outline",
2205
- size,
2206
- className: width,
2207
- onClick: onFolder,
2208
- disabled: isDisabled,
2209
- "data-testid": "upload-folder-button",
2210
- children: [
2211
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { className: "mr-2 size-4" }),
2212
- l.uploadFolder
2213
- ]
2214
- }
2215
- )
2216
- ]
2217
- }
2218
- );
2219
- }
2220
- function UploadSourcePicker({ options, isDisabled }) {
2221
- return /* @__PURE__ */ jsxRuntime.jsx(
2222
- "div",
2223
- {
2224
- "data-slot": "upload-source-picker",
2225
- className: "flex w-full flex-col gap-2",
2226
- "data-testid": "upload-source-picker",
2227
- children: options.map((o) => {
2228
- const button = /* @__PURE__ */ jsxRuntime.jsxs(
2229
- ui.Button,
2230
- {
2231
- variant: "outline",
2232
- onClick: o.onClick,
2233
- disabled: isDisabled,
2234
- "data-testid": `upload-source-pick-${o.key}`,
2235
- className: "h-auto w-full justify-start gap-3 px-4 py-3 text-left",
2236
- children: [
2237
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-muted-foreground [&_svg]:size-5", children: o.icon }),
2238
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex flex-col", children: [
2239
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: o.label }),
2240
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: o.description })
2241
- ] })
2242
- ]
2243
- }
2244
- );
2245
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "contents", children: o.wrap ? o.wrap(button) : button }, o.key);
2246
- })
2247
- }
2248
- );
2249
- }
2250
- function UploadUrlButton({
2251
- isCompact,
2252
- isDisabled,
2253
- label = "Add from URL",
2254
- onClick
2255
- }) {
2256
- return /* @__PURE__ */ jsxRuntime.jsxs(
2257
- ui.Button,
2258
- {
2259
- variant: "outline",
2260
- size: isCompact ? "sm" : "default",
2261
- disabled: isDisabled,
2262
- onClick,
2263
- "data-testid": "upload-url-button",
2264
- children: [
2265
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Globe, { className: "mr-2 size-4" }),
2266
- label
2267
- ]
2268
- }
2269
- );
2270
- }
2271
- function UploadSourceSection({
2272
- testId,
2273
- className,
2274
- isIsolated,
2275
- children
2276
- }) {
2277
- return /* @__PURE__ */ jsxRuntime.jsx(
2278
- "div",
2279
- {
2280
- "data-slot": "upload-source-section",
2281
- "data-testid": testId,
2282
- className,
2283
- onClick: isIsolated ? (e) => e.stopPropagation() : void 0,
2284
- children
2285
- }
2286
- );
2287
- }
2288
- var DEFAULT_URL_INPUT_DIALOG_LABELS = {
2289
- title: "Add from the internet",
2290
- description: "Enter one or more URLs to download documents \u2014 paste several separated by commas or new lines.",
2291
- supports: "Supports PDF, Word, PowerPoint, Excel, RTF, TXT, MD, HTML, ZIP, and audio/video links (YouTube et al.).",
2292
- url: (position) => position === null ? "URL " : `URL ${position}`,
2293
- placeholder: "https://example.com/document.pdf or a YouTube / audio / video link",
2294
- removeUrl: (position) => `Remove URL ${position}`,
2295
- addAnother: "Add Another URL",
2296
- adding: "Adding\u2026",
2297
- addDocuments: "Add Documents",
2298
- mediaPreview: "Media preview"
2299
- };
2300
- function UrlInputDialogView({
2301
- open,
2302
- onOpenChange,
2303
- trigger,
2304
- title,
2305
- urls,
2306
- errors,
2307
- onUrlChange,
2308
- onUrlPaste,
2309
- onAddUrl,
2310
- onRemoveUrl,
2311
- renderPreview,
2312
- submitError,
2313
- isSubmitting,
2314
- onSubmit,
2315
- labels,
2316
- testIds
2317
- }) {
2318
- const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels };
2319
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Dialog, { open, onOpenChange, children: [
2320
- trigger !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.DialogTrigger, { asChild: true, children: trigger }),
2321
- /* @__PURE__ */ jsxRuntime.jsxs(
2322
- ui.DialogContent,
2323
- {
2324
- presentation: "sheet",
2325
- className: "flex flex-col gap-0 overflow-hidden p-0 sm:max-w-[525px]",
2326
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.modal, { testId: "upload-modal-internet" }),
2327
- children: [
2328
- /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: title ?? l.title }) }),
2329
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-6 pb-6", children: [
2330
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogDescription, { className: "pt-4 text-sm text-muted-foreground", children: [
2331
- l.description,
2332
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1 block text-xs", children: l.supports })
2333
- ] }),
2334
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4 py-4", children: [
2335
- urls.map((url, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2336
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
2337
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
2338
- /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: `url-${index}`, className: "text-sm", children: l.url(urls.length > 1 ? index + 1 : null) }),
2339
- /* @__PURE__ */ jsxRuntime.jsx(
2340
- ui.Input,
2341
- {
2342
- id: `url-${index}`,
2343
- type: "text",
2344
- placeholder: l.placeholder,
2345
- value: url,
2346
- onChange: (e) => onUrlChange(index, e.target.value),
2347
- onPaste: (e) => {
2348
- e.preventDefault();
2349
- onUrlPaste(index, e.clipboardData.getData("text"));
2350
- },
2351
- className: ui.cn(errors[index] && "border-red-border")
2352
- }
2353
- ),
2354
- errors[index] && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-red-text", children: errors[index] })
2355
- ] }),
2356
- urls.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
2357
- ui.Button,
2358
- {
2359
- type: "button",
2360
- variant: "ghost",
2361
- size: "icon",
2362
- onClick: () => onRemoveUrl(index),
2363
- className: "mt-6",
2364
- "aria-label": l.removeUrl(index + 1),
2365
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
2366
- }
2367
- )
2368
- ] }),
2369
- renderPreview?.(url, index)
2370
- ] }, index)),
2371
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { type: "button", variant: "outline", size: "sm", onClick: onAddUrl, className: "w-full", children: [
2372
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-2 h-4 w-4" }),
2373
- l.addAnother
2374
- ] })
2375
- ] }),
2376
- submitError && /* @__PURE__ */ jsxRuntime.jsx(
2377
- "p",
2378
- {
2379
- className: "text-sm text-red-text",
2380
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.submitError, { testId: "url-submit-error" }),
2381
- children: submitError
2382
- }
2383
- ),
2384
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col-reverse sm:flex-row sm:justify-end gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(
2385
- ui.Button,
2386
- {
2387
- onClick: onSubmit,
2388
- disabled: isSubmitting,
2389
- "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.submit, { testId: "url-submit-button" }),
2390
- children: isSubmitting ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2391
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-2 h-4 w-4 animate-spin" }),
2392
- l.adding
2393
- ] }) : l.addDocuments
2394
- }
2395
- ) })
2396
- ] })
2397
- ]
2398
- }
2399
- )
2400
- ] });
2401
- }
2402
- function UrlDialogTitle({ icon, workspaceName, labels }) {
2403
- const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels };
2404
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("flex min-w-0 items-center", icon ? "gap-3" : "gap-2"), children: [
2405
- icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", children: icon }),
2406
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", title: workspaceName, children: workspaceName }),
2407
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-muted-foreground", children: "/" }),
2408
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", children: l.title })
2409
- ] });
2410
- }
2411
- function MediaPreviewView({ kind, src, testId, labels }) {
2412
- const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels };
2413
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 overflow-hidden rounded-md border", "data-testid": testId, children: [
2414
- kind === "youtube" && /* @__PURE__ */ jsxRuntime.jsx(
2415
- "iframe",
2416
- {
2417
- className: "aspect-video w-full",
2418
- src,
2419
- title: l.mediaPreview,
2420
- allow: "accelerometer; encrypted-media; picture-in-picture",
2421
- allowFullScreen: true
2422
- }
2423
- ),
2424
- kind === "video" && /* @__PURE__ */ jsxRuntime.jsx("video", { className: "max-h-56 w-full bg-black", src, controls: true, preload: "metadata" }),
2425
- kind === "audio" && /* @__PURE__ */ jsxRuntime.jsx("audio", { className: "w-full p-2", src, controls: true, preload: "metadata" })
2426
- ] });
2427
- }
2428
-
2429
- // src/files/media-preview.ts
2430
- var MEDIA_HOSTS = [
2431
- "youtube.com",
2432
- "youtu.be",
2433
- "vimeo.com",
2434
- "soundcloud.com",
2435
- "dailymotion.com",
2436
- "twitch.tv"
2437
- ];
2438
- var VIDEO_EXTENSIONS = [".mp4", ".mpeg", ".mpg", ".webm", ".mov", ".avi", ".mkv", ".ogv"];
2439
- var AUDIO_EXTENSIONS = [".mp3", ".wav", ".m4a", ".aac", ".flac", ".ogg", ".oga"];
2440
- function normalizeHost(hostname) {
2441
- return hostname.toLowerCase().replace(/^(www|m)\./, "");
2442
- }
2443
- function getYoutubeId(url) {
2444
- const host = normalizeHost(url.hostname);
2445
- if (host === "youtu.be") return url.pathname.slice(1).split("/")[0] || null;
2446
- if (host === "youtube.com" || host.endsWith(".youtube.com")) {
2447
- if (url.pathname === "/watch") return url.searchParams.get("v");
2448
- const segments = url.pathname.split("/").filter(Boolean);
2449
- if (segments[0] === "embed" || segments[0] === "shorts" || segments[0] === "v") {
2450
- return segments[1] ?? null;
2451
- }
2452
- }
2453
- return null;
2454
- }
2455
- function getExtension(pathname) {
2456
- const lower = pathname.toLowerCase();
2457
- const lastDot = lower.lastIndexOf(".");
2458
- const lastSlash = lower.lastIndexOf("/");
2459
- return lastDot > lastSlash ? lower.slice(lastDot) : "";
2460
- }
2461
- function getMediaPreview(rawUrl) {
2462
- let url;
2463
- try {
2464
- url = new URL(rawUrl);
2465
- } catch {
2466
- return null;
2467
- }
2468
- const youtubeId = getYoutubeId(url);
2469
- if (youtubeId) {
2470
- return { kind: "youtube", embedUrl: `https://www.youtube.com/embed/${youtubeId}` };
2471
- }
2472
- const extension = getExtension(url.pathname);
2473
- if (VIDEO_EXTENSIONS.includes(extension)) return { kind: "video", src: rawUrl };
2474
- if (AUDIO_EXTENSIONS.includes(extension)) return { kind: "audio", src: rawUrl };
2475
- return null;
2476
- }
2477
- function isMediaUrl(rawUrl) {
2478
- if (getMediaPreview(rawUrl)) return true;
2479
- try {
2480
- const host = normalizeHost(new URL(rawUrl).hostname);
2481
- return MEDIA_HOSTS.some((mediaHost) => host === mediaHost || host.endsWith(`.${mediaHost}`));
2482
- } catch {
2483
- return false;
2484
- }
2485
- }
2486
- function UrlInputDialog({
2487
- onUrlsSubmit,
2488
- trigger,
2489
- processing = false,
2490
- open: controlledOpen,
2491
- onOpenChange,
2492
- titleWorkspaceName,
2493
- titleIcon
2494
- }) {
2495
- const [uncontrolledOpen, setUncontrolledOpen] = react.useState(false);
2496
- const open = controlledOpen ?? uncontrolledOpen;
2497
- const setOpen = (next) => {
2498
- onOpenChange?.(next);
2499
- if (controlledOpen === void 0) setUncontrolledOpen(next);
2500
- };
2501
- const [urls, setUrls] = react.useState([""]);
2502
- const [errors, setErrors] = react.useState([]);
2503
- const [submitting, setSubmitting] = react.useState(false);
2504
- const [submitError, setSubmitError] = react.useState(null);
2505
- const preprocessUrl = (url) => {
2506
- let processedUrl = url.trim();
2507
- if (processedUrl && !processedUrl.match(/^https?:\/\//i)) {
2508
- processedUrl = "https://" + processedUrl;
2509
- }
2510
- try {
2511
- new URL(processedUrl);
2512
- processedUrl = processedUrl.replace(/ /g, "%20");
2513
- return processedUrl;
2514
- } catch {
2515
- return processedUrl.replace(/ /g, "%20");
2516
- }
2517
- };
2518
- const validateUrl = (url) => {
2519
- try {
2520
- const urlObj = new URL(url);
2521
- if (isMediaUrl(url)) {
2522
- return { valid: true };
2523
- }
2524
- const pathname = urlObj.pathname.toLowerCase();
2525
- const supportedExtensions = [
2526
- ".pdf",
2527
- ".txt",
2528
- ".md",
2529
- ".html",
2530
- ".doc",
2531
- ".docx",
2532
- ".rtf",
2533
- ".ppt",
2534
- ".pptx",
2535
- ".xls",
2536
- ".xlsx",
2537
- // .zip is fetched from the URL by the browser and extracted by the
2538
- // frontend zip worker; each entry is then uploaded as a normal file.
2539
- ".zip"
2540
- ];
2541
- const hasFileExtension = pathname.includes(".") && pathname.lastIndexOf(".") > pathname.lastIndexOf("/");
2542
- const hasValidExtension = !hasFileExtension || supportedExtensions.some((ext) => pathname.endsWith(ext));
2543
- if (!hasValidExtension) {
2544
- return {
2545
- valid: false,
2546
- error: "File type not supported. Supported formats: PDF, DOC(X), PPT(X), XLS(X), RTF, TXT, MD, HTML, ZIP."
2547
- };
2548
- }
2549
- return { valid: true };
2550
- } catch {
2551
- return { valid: false, error: "Invalid URL format" };
2552
- }
2553
- };
2554
- const addUrlField = () => {
2555
- setUrls([...urls, ""]);
2556
- setErrors([...errors, ""]);
2557
- };
2558
- const removeUrlField = (index) => {
2559
- setUrls(urls.filter((_, i) => i !== index));
2560
- setErrors(errors.filter((_, i) => i !== index));
2561
- };
2562
- const updateUrl = (index, value) => {
2563
- if (submitError) setSubmitError(null);
2564
- const delimiters = /[,\n]+/;
2565
- if (delimiters.test(value)) {
2566
- const urlList = value.split(delimiters).map((u) => u.trim()).filter((u) => u.length > 0);
2567
- if (urlList.length > 1) {
2568
- const newUrls2 = [...urls];
2569
- newUrls2.splice(index, 1, ...urlList);
2570
- if (index === urls.length - 1) {
2571
- newUrls2.push("");
2572
- }
2573
- setUrls(newUrls2);
2574
- const newErrors = [...errors];
2575
- urlList.forEach((_, i) => {
2576
- newErrors[index + i] = "";
2577
- });
2578
- setErrors(newErrors);
2579
- return;
2580
- }
2581
- }
2582
- const newUrls = [...urls];
2583
- newUrls[index] = value;
2584
- setUrls(newUrls);
2585
- if (errors[index]) {
2586
- const newErrors = [...errors];
2587
- newErrors[index] = "";
2588
- setErrors(newErrors);
2589
- }
2590
- };
2591
- const handleSubmit = async () => {
2592
- const newErrors = [];
2593
- const validUrls = [];
2594
- urls.forEach((url, index) => {
2595
- const trimmedUrl = url.trim();
2596
- if (!trimmedUrl) {
2597
- newErrors[index] = "URL is required";
2598
- } else {
2599
- const processedUrl = preprocessUrl(trimmedUrl);
2600
- const validation = validateUrl(processedUrl);
2601
- if (!validation.valid) {
2602
- newErrors[index] = validation.error || "Invalid URL";
2603
- } else {
2604
- newErrors[index] = "";
2605
- validUrls.push(processedUrl);
2606
- }
2607
- }
2608
- });
2609
- setErrors(newErrors);
2610
- if (validUrls.length > 0 && !newErrors.some((error) => error)) {
2611
- setSubmitError(null);
2612
- setSubmitting(true);
2613
- let ok;
2614
- try {
2615
- ok = await onUrlsSubmit(validUrls);
2616
- } catch {
2617
- ok = false;
2618
- }
2619
- setSubmitting(false);
2620
- if (ok === false) {
2621
- setSubmitError("Failed to upload documents from URLs. Please check the URLs and try again.");
2622
- return;
2623
- }
2624
- setOpen(false);
2625
- setUrls([""]);
2626
- setErrors([]);
2627
- }
2628
- };
2629
- const showTrigger = trigger !== void 0 || controlledOpen === void 0;
2630
- const title = titleWorkspaceName ? /* @__PURE__ */ jsxRuntime.jsx(UrlDialogTitle, { icon: titleIcon, workspaceName: titleWorkspaceName }) : void 0;
2631
- return /* @__PURE__ */ jsxRuntime.jsx(
2632
- UrlInputDialogView,
2633
- {
2634
- open,
2635
- onOpenChange: setOpen,
2636
- trigger: showTrigger ? trigger || /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "outline", size: "sm", disabled: processing, children: [
2637
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link, { className: "w-4 h-4 mr-2" }),
2638
- processing ? "Processing..." : "Add from URL"
2639
- ] }) : void 0,
2640
- title,
2641
- urls,
2642
- errors,
2643
- onUrlChange: updateUrl,
2644
- onUrlPaste: updateUrl,
2645
- onAddUrl: addUrlField,
2646
- onRemoveUrl: removeUrlField,
2647
- renderPreview: (url, index) => {
2648
- const trimmed = url.trim();
2649
- const preview = trimmed ? getMediaPreview(preprocessUrl(trimmed)) : null;
2650
- if (!preview) return null;
2651
- return /* @__PURE__ */ jsxRuntime.jsx(
2652
- MediaPreviewView,
2653
- {
2654
- kind: preview.kind,
2655
- src: preview.kind === "youtube" ? preview.embedUrl : preview.src,
2656
- testId: `url-media-preview-${index}`
2657
- }
2658
- );
2659
- },
2660
- submitError,
2661
- isSubmitting: submitting,
2662
- onSubmit: handleSubmit
2663
- }
2664
- );
2665
- }
2666
- var POINTS = [
2667
- {
2668
- icon: lucideReact.KeyRound,
2669
- heading: "Only you hold the key",
2670
- body: "You choose who to invite to a workspace and the role they hold. Each workspace is encrypted with its own key, held only by its members \u2014 so no one outside it, including ARBI administrators, can access its confidential data."
2671
- },
2672
- {
2673
- icon: lucideReact.Eye,
2674
- heading: "You decide what to share",
2675
- body: "Within a workspace, conversations are private by default and documents are shared with collaborators. Anything you keep private stays invisible to other members, even the owner."
2676
- },
2677
- {
2678
- icon: lucideReact.ShieldCheck,
2679
- heading: "Your data stays in the UK",
2680
- body: "By default, the AI that processes your files runs on ARBI's own infrastructure in the United Kingdom. Third-party models (OpenAI, Anthropic or Google) are optional; we select providers with the strongest data-protection terms, but recommend reviewing each provider's data-retention policy before enabling one."
2681
- },
2682
- {
2683
- icon: lucideReact.BrainCircuit,
2684
- heading: "We never train AI on your data",
2685
- body: "Your files and conversations are never used to train AI models."
2686
- }
2687
- ];
2688
- function PrivacyExplainerModal() {
2689
- const [open, setOpen] = react.useState(false);
2690
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2691
- /* @__PURE__ */ jsxRuntime.jsxs(
2692
- ui.Button,
2693
- {
2694
- type: "button",
2695
- variant: "ghost",
2696
- size: "sm",
2697
- onClick: () => setOpen(true),
2698
- className: "gap-1.5 text-primary hover:text-primary",
2699
- "data-testid": "privacy-explainer-button",
2700
- children: [
2701
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-4 h-4" }),
2702
- "Privacy Guarantee",
2703
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "w-3.5 h-3.5 opacity-70" })
2704
- ]
2705
- }
2706
- ),
2707
- /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogContent, { className: "sm:max-w-lg", "data-testid": "privacy-explainer-dialog", children: [
2708
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogHeader, { children: [
2709
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogTitle, { className: "flex items-center gap-2", children: [
2710
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ShieldCheck, { className: "h-5 w-5 text-primary" }),
2711
- "Your data, your keys"
2712
- ] }),
2713
- /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: "How ARBI protects confidentiality." })
2714
- ] }),
2715
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-5 py-1", children: POINTS.map(({ icon: Icon, heading, body }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3", children: [
2716
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "mt-0.5 h-5 w-5 shrink-0 text-primary" }),
2717
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0.5", children: [
2718
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold leading-none", children: heading }),
2719
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: body })
2720
- ] })
2721
- ] }, heading)) }),
2722
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 pt-1", children: [
2723
- /* @__PURE__ */ jsxRuntime.jsx(
2724
- "a",
2725
- {
2726
- href: "https://arbicity.com/ARBI-Security-Whitepaper.pdf",
2727
- target: "_blank",
2728
- rel: "noopener noreferrer",
2729
- className: "text-sm font-medium text-primary hover:underline",
2730
- "data-testid": "privacy-explainer-whitepaper-link",
2731
- children: "Full security details \u2192"
2732
- }
2733
- ),
2734
- /* @__PURE__ */ jsxRuntime.jsx(
2735
- ui.Button,
2736
- {
2737
- type: "button",
2738
- onClick: () => setOpen(false),
2739
- "data-testid": "privacy-explainer-dismiss",
2740
- children: "Got it"
2741
- }
2742
- )
2743
- ] })
2744
- ] }) })
2745
- ] });
2746
- }
2747
-
2748
- exports.CHROME = CHROME;
2749
- exports.DEFAULT_EXPLORER_LABELS = DEFAULT_EXPLORER_LABELS;
2750
- exports.DEFAULT_FOLDER_FILTER_LABELS = DEFAULT_FOLDER_FILTER_LABELS;
2751
- exports.DEFAULT_FOLDER_PICKER_LABELS = DEFAULT_FOLDER_PICKER_LABELS;
2752
- exports.DEFAULT_UPLOAD_FOOTER_LABELS = DEFAULT_UPLOAD_FOOTER_LABELS;
2753
- exports.DEFAULT_UPLOAD_PARTS_LABELS = DEFAULT_UPLOAD_PARTS_LABELS;
2754
- exports.DEFAULT_UPLOAD_SOURCES_LABELS = DEFAULT_UPLOAD_SOURCES_LABELS;
2755
- exports.DEFAULT_URL_INPUT_DIALOG_LABELS = DEFAULT_URL_INPUT_DIALOG_LABELS;
2756
- exports.ExplorerDragPreview = ExplorerDragPreview;
2757
- exports.ExplorerDropOverlay = ExplorerDropOverlay;
2758
- exports.ExplorerEmpty = ExplorerEmpty;
2759
- exports.ExplorerFileTile = ExplorerFileTile;
2760
- exports.ExplorerFileTooltip = ExplorerFileTooltip;
2761
- exports.ExplorerFolderTile = ExplorerFolderTile;
2762
- exports.ExplorerFrame = ExplorerFrame;
2763
- exports.ExplorerLoadingTiles = ExplorerLoadingTiles;
2764
- exports.ExplorerMarquee = ExplorerMarquee;
2765
- exports.ExplorerScroller = ExplorerScroller;
2766
- exports.ExplorerStage = ExplorerStage;
2767
- exports.FailedStageIcon = FailedStageIcon;
2768
- exports.FieldAttribution = FieldAttribution;
2769
- exports.FieldFolderSelect = FieldFolderSelect;
2770
- exports.FieldFolderValue = FieldFolderValue;
2771
- exports.FieldLabelsSelect = FieldLabelsSelect;
2772
- exports.FieldNativeSelect = FieldNativeSelect;
2773
- exports.FieldValue = FieldValue;
2774
- exports.FieldWithAttribution = FieldWithAttribution;
2775
- exports.FilesFilterBar = FilesFilterBar;
2776
- exports.FilesModalFooter = FilesModalFooter;
2777
- exports.FilesTagsButton = FilesTagsButton;
2778
- exports.FilesViewCenter = FilesViewCenter;
2779
- exports.FilterButton = FilterButton;
2780
- exports.FolderBreadcrumb = FolderBreadcrumb;
2781
- exports.FolderCell = FolderCell;
2782
- exports.FolderCommandList = FolderCommandList;
2783
- exports.FolderFilterButton = FolderFilterButton;
2784
- exports.FolderPickerRow = FolderPickerRow;
2785
- exports.FolderProviderIcon = FolderProviderIcon;
2786
- exports.FolderTree = FolderTree;
2787
- exports.LINE_PX = LINE_PX;
2788
- exports.MAX_LINES = MAX_LINES;
2789
- exports.MIN_LINES = MIN_LINES;
2790
- exports.MediaPreviewView = MediaPreviewView;
2791
- exports.PrivacyExplainerModal = PrivacyExplainerModal;
2792
- exports.RECENTLY_DELETED_HINT = RECENTLY_DELETED_HINT;
2793
- exports.RECENTLY_DELETED_HINT_PLURAL = RECENTLY_DELETED_HINT_PLURAL;
2794
- exports.ROW_MIN = ROW_MIN;
2795
- exports.RejectedFilesList = RejectedFilesList;
2796
- exports.RowDensityControl = RowDensityControl;
2797
- exports.SelectedFilesList = SelectedFilesList;
2798
- exports.ShareToggle = ShareToggle;
2799
- exports.StatusPill = StatusPill;
2800
- exports.UploadBrowseButtons = UploadBrowseButtons;
2801
- exports.UploadContainer = UploadContainer;
2802
- exports.UploadDropArea = UploadDropArea;
2803
- exports.UploadErrorMessage = UploadErrorMessage;
2804
- exports.UploadFooterBar = UploadFooterBar;
2805
- exports.UploadFrame = UploadFrame;
2806
- exports.UploadProgress = UploadProgress;
2807
- exports.UploadShareNote = UploadShareNote;
2808
- exports.UploadSourcePicker = UploadSourcePicker;
2809
- exports.UploadSourceSection = UploadSourceSection;
2810
- exports.UploadUrlButton = UploadUrlButton;
2811
- exports.UrlDialogTitle = UrlDialogTitle;
2812
- exports.UrlInputDialog = UrlInputDialog;
2813
- exports.UrlInputDialogView = UrlInputDialogView;
2814
- exports.VendorLogo = VendorLogo;
2815
- exports.buildExplorerEntries = buildExplorerEntries;
2816
- exports.canChangeVisibility = canChangeVisibility;
2817
- exports.canDeleteDocument = canDeleteDocument;
2818
- exports.canEditDocumentFields = canEditDocumentFields;
2819
- exports.collectFolderDocs = collectFolderDocs;
2820
- exports.confirmHideFromMembers = confirmHideFromMembers;
2821
- exports.formatFolderSegment = formatFolderSegment;
2822
- exports.getExplorerDisplayName = getExplorerDisplayName;
2823
- exports.getMediaPreview = getMediaPreview;
2824
- exports.hasFolderProviderIcon = hasFolderProviderIcon;
2825
- exports.isExplorerDocument = isExplorerDocument;
2826
- exports.isMediaUrl = isMediaUrl;
2827
- exports.joinFolderPath = joinFolderPath;
2828
- exports.linesForRowHeight = linesForRowHeight;
2829
- exports.parseFolderSegments = parseFolderSegments;
2830
- exports.rowHeightForLines = rowHeightForLines;
2831
- exports.searchExplorerDocuments = searchExplorerDocuments;
2832
- exports.shareStateOf = shareStateOf;
2833
- exports.shareTooltipFor = shareTooltipFor;
2834
- exports.sortExplorerFiles = sortExplorerFiles;
2835
- exports.visibilityAudience = visibilityAudience;
2836
- exports.visibilityToggleTooltip = visibilityToggleTooltip;
2837
- //# sourceMappingURL=chunk-QJFJ5JBF.cjs.map
2838
- //# sourceMappingURL=chunk-QJFJ5JBF.cjs.map