@open-mercato/documents 0.6.8-develop.7016.1.4ed7b1e49d

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 (602) hide show
  1. package/README.md +88 -0
  2. package/build.mjs +23 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +7 -0
  5. package/dist/modules/documents/acl.js +15 -0
  6. package/dist/modules/documents/acl.js.map +7 -0
  7. package/dist/modules/documents/api/[id]/archive/route.js +116 -0
  8. package/dist/modules/documents/api/[id]/archive/route.js.map +7 -0
  9. package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js +155 -0
  10. package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js.map +7 -0
  11. package/dist/modules/documents/api/[id]/attachments/route.js +153 -0
  12. package/dist/modules/documents/api/[id]/attachments/route.js.map +7 -0
  13. package/dist/modules/documents/api/[id]/collab-token/route.js +180 -0
  14. package/dist/modules/documents/api/[id]/collab-token/route.js.map +7 -0
  15. package/dist/modules/documents/api/[id]/comments/access-check/route.js +86 -0
  16. package/dist/modules/documents/api/[id]/comments/access-check/route.js.map +7 -0
  17. package/dist/modules/documents/api/[id]/comments/route.js +387 -0
  18. package/dist/modules/documents/api/[id]/comments/route.js.map +7 -0
  19. package/dist/modules/documents/api/[id]/content/route.js +143 -0
  20. package/dist/modules/documents/api/[id]/content/route.js.map +7 -0
  21. package/dist/modules/documents/api/[id]/duplicate/route.js +200 -0
  22. package/dist/modules/documents/api/[id]/duplicate/route.js.map +7 -0
  23. package/dist/modules/documents/api/[id]/export/route.js +421 -0
  24. package/dist/modules/documents/api/[id]/export/route.js.map +7 -0
  25. package/dist/modules/documents/api/[id]/favorite/route.js +96 -0
  26. package/dist/modules/documents/api/[id]/favorite/route.js.map +7 -0
  27. package/dist/modules/documents/api/[id]/links/[linkId]/route.js +85 -0
  28. package/dist/modules/documents/api/[id]/links/[linkId]/route.js.map +7 -0
  29. package/dist/modules/documents/api/[id]/links/route.js +257 -0
  30. package/dist/modules/documents/api/[id]/links/route.js.map +7 -0
  31. package/dist/modules/documents/api/[id]/principals/route.js +299 -0
  32. package/dist/modules/documents/api/[id]/principals/route.js.map +7 -0
  33. package/dist/modules/documents/api/[id]/route.js +246 -0
  34. package/dist/modules/documents/api/[id]/route.js.map +7 -0
  35. package/dist/modules/documents/api/[id]/shares/route.js +335 -0
  36. package/dist/modules/documents/api/[id]/shares/route.js.map +7 -0
  37. package/dist/modules/documents/api/[id]/unarchive/route.js +39 -0
  38. package/dist/modules/documents/api/[id]/unarchive/route.js.map +7 -0
  39. package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js +133 -0
  40. package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js.map +7 -0
  41. package/dist/modules/documents/api/[id]/versions/[versionId]/route.js +93 -0
  42. package/dist/modules/documents/api/[id]/versions/[versionId]/route.js.map +7 -0
  43. package/dist/modules/documents/api/[id]/versions/route.js +193 -0
  44. package/dist/modules/documents/api/[id]/versions/route.js.map +7 -0
  45. package/dist/modules/documents/api/[id]/watch/route.js +97 -0
  46. package/dist/modules/documents/api/[id]/watch/route.js.map +7 -0
  47. package/dist/modules/documents/api/_commands.js +34 -0
  48. package/dist/modules/documents/api/_commands.js.map +7 -0
  49. package/dist/modules/documents/api/_shared.js +490 -0
  50. package/dist/modules/documents/api/_shared.js.map +7 -0
  51. package/dist/modules/documents/api/folders/route.js +256 -0
  52. package/dist/modules/documents/api/folders/route.js.map +7 -0
  53. package/dist/modules/documents/api/instantiate/route.js +108 -0
  54. package/dist/modules/documents/api/instantiate/route.js.map +7 -0
  55. package/dist/modules/documents/api/route.js +322 -0
  56. package/dist/modules/documents/api/route.js.map +7 -0
  57. package/dist/modules/documents/api/templates/[templateId]/preview/route.js +94 -0
  58. package/dist/modules/documents/api/templates/[templateId]/preview/route.js.map +7 -0
  59. package/dist/modules/documents/api/templates/[templateId]/route.js +82 -0
  60. package/dist/modules/documents/api/templates/[templateId]/route.js.map +7 -0
  61. package/dist/modules/documents/api/templates/route.js +344 -0
  62. package/dist/modules/documents/api/templates/route.js.map +7 -0
  63. package/dist/modules/documents/backend/documents/DocumentsPageClient.js +160 -0
  64. package/dist/modules/documents/backend/documents/DocumentsPageClient.js.map +7 -0
  65. package/dist/modules/documents/backend/documents/DocumentsTable.js +143 -0
  66. package/dist/modules/documents/backend/documents/DocumentsTable.js.map +7 -0
  67. package/dist/modules/documents/backend/documents/FolderDialog.js +55 -0
  68. package/dist/modules/documents/backend/documents/FolderDialog.js.map +7 -0
  69. package/dist/modules/documents/backend/documents/FolderTree.js +40 -0
  70. package/dist/modules/documents/backend/documents/FolderTree.js.map +7 -0
  71. package/dist/modules/documents/backend/documents/MoveDocumentDialog.js +64 -0
  72. package/dist/modules/documents/backend/documents/MoveDocumentDialog.js.map +7 -0
  73. package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js +77 -0
  74. package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js.map +7 -0
  75. package/dist/modules/documents/backend/documents/[id]/CommentComposer.js +126 -0
  76. package/dist/modules/documents/backend/documents/[id]/CommentComposer.js.map +7 -0
  77. package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js +88 -0
  78. package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js.map +7 -0
  79. package/dist/modules/documents/backend/documents/[id]/CommentsRail.js +123 -0
  80. package/dist/modules/documents/backend/documents/[id]/CommentsRail.js.map +7 -0
  81. package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js +91 -0
  82. package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js.map +7 -0
  83. package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js +27 -0
  84. package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js.map +7 -0
  85. package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js +50 -0
  86. package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js.map +7 -0
  87. package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js +168 -0
  88. package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js.map +7 -0
  89. package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js +129 -0
  90. package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js.map +7 -0
  91. package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js +429 -0
  92. package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js.map +7 -0
  93. package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js +68 -0
  94. package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js.map +7 -0
  95. package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js +69 -0
  96. package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js.map +7 -0
  97. package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js +151 -0
  98. package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js.map +7 -0
  99. package/dist/modules/documents/backend/documents/[id]/ExportMenu.js +121 -0
  100. package/dist/modules/documents/backend/documents/[id]/ExportMenu.js.map +7 -0
  101. package/dist/modules/documents/backend/documents/[id]/MentionPicker.js +114 -0
  102. package/dist/modules/documents/backend/documents/[id]/MentionPicker.js.map +7 -0
  103. package/dist/modules/documents/backend/documents/[id]/OutlinePane.js +70 -0
  104. package/dist/modules/documents/backend/documents/[id]/OutlinePane.js.map +7 -0
  105. package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js +157 -0
  106. package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js.map +7 -0
  107. package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js +266 -0
  108. package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js.map +7 -0
  109. package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js +227 -0
  110. package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js.map +7 -0
  111. package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js +157 -0
  112. package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js.map +7 -0
  113. package/dist/modules/documents/backend/documents/[id]/commentTypes.js +150 -0
  114. package/dist/modules/documents/backend/documents/[id]/commentTypes.js.map +7 -0
  115. package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js +13 -0
  116. package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js.map +7 -0
  117. package/dist/modules/documents/backend/documents/[id]/documentPagination.js +295 -0
  118. package/dist/modules/documents/backend/documents/[id]/documentPagination.js.map +7 -0
  119. package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js +81 -0
  120. package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js.map +7 -0
  121. package/dist/modules/documents/backend/documents/[id]/editorTypes.js +52 -0
  122. package/dist/modules/documents/backend/documents/[id]/editorTypes.js.map +7 -0
  123. package/dist/modules/documents/backend/documents/[id]/page.js +10 -0
  124. package/dist/modules/documents/backend/documents/[id]/page.js.map +7 -0
  125. package/dist/modules/documents/backend/documents/[id]/page.meta.js +16 -0
  126. package/dist/modules/documents/backend/documents/[id]/page.meta.js.map +7 -0
  127. package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js +38 -0
  128. package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js.map +7 -0
  129. package/dist/modules/documents/backend/documents/[id]/restoreVersion.js +33 -0
  130. package/dist/modules/documents/backend/documents/[id]/restoreVersion.js.map +7 -0
  131. package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js +392 -0
  132. package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js.map +7 -0
  133. package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js +253 -0
  134. package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js.map +7 -0
  135. package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js +149 -0
  136. package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js.map +7 -0
  137. package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js +82 -0
  138. package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js.map +7 -0
  139. package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js +144 -0
  140. package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js.map +7 -0
  141. package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js +237 -0
  142. package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js.map +7 -0
  143. package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js +216 -0
  144. package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js.map +7 -0
  145. package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js +25 -0
  146. package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js.map +7 -0
  147. package/dist/modules/documents/backend/documents/components/EntityPicker.js +156 -0
  148. package/dist/modules/documents/backend/documents/components/EntityPicker.js.map +7 -0
  149. package/dist/modules/documents/backend/documents/components/EntityPickerResults.js +46 -0
  150. package/dist/modules/documents/backend/documents/components/EntityPickerResults.js.map +7 -0
  151. package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js +127 -0
  152. package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js.map +7 -0
  153. package/dist/modules/documents/backend/documents/components/PrincipalPicker.js +84 -0
  154. package/dist/modules/documents/backend/documents/components/PrincipalPicker.js.map +7 -0
  155. package/dist/modules/documents/backend/documents/components/ShareDialog.js +77 -0
  156. package/dist/modules/documents/backend/documents/components/ShareDialog.js.map +7 -0
  157. package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js +93 -0
  158. package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js.map +7 -0
  159. package/dist/modules/documents/backend/documents/components/ShareDialogList.js +82 -0
  160. package/dist/modules/documents/backend/documents/components/ShareDialogList.js.map +7 -0
  161. package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js +96 -0
  162. package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js.map +7 -0
  163. package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js +169 -0
  164. package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js.map +7 -0
  165. package/dist/modules/documents/backend/documents/components/TemplatePreview.js +38 -0
  166. package/dist/modules/documents/backend/documents/components/TemplatePreview.js.map +7 -0
  167. package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js +69 -0
  168. package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js.map +7 -0
  169. package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js +71 -0
  170. package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js.map +7 -0
  171. package/dist/modules/documents/backend/documents/components/principalPickerModel.js +63 -0
  172. package/dist/modules/documents/backend/documents/components/principalPickerModel.js.map +7 -0
  173. package/dist/modules/documents/backend/documents/components/shareDialogModel.js +68 -0
  174. package/dist/modules/documents/backend/documents/components/shareDialogModel.js.map +7 -0
  175. package/dist/modules/documents/backend/documents/components/templateUi.js +89 -0
  176. package/dist/modules/documents/backend/documents/components/templateUi.js.map +7 -0
  177. package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js +30 -0
  178. package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js.map +7 -0
  179. package/dist/modules/documents/backend/documents/components/useEntitySearch.js +191 -0
  180. package/dist/modules/documents/backend/documents/components/useEntitySearch.js.map +7 -0
  181. package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js +221 -0
  182. package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js.map +7 -0
  183. package/dist/modules/documents/backend/documents/components/useShareDialog.js +236 -0
  184. package/dist/modules/documents/backend/documents/components/useShareDialog.js.map +7 -0
  185. package/dist/modules/documents/backend/documents/components/useTemplateDetail.js +49 -0
  186. package/dist/modules/documents/backend/documents/components/useTemplateDetail.js.map +7 -0
  187. package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js +234 -0
  188. package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js.map +7 -0
  189. package/dist/modules/documents/backend/documents/documentUi.js +106 -0
  190. package/dist/modules/documents/backend/documents/documentUi.js.map +7 -0
  191. package/dist/modules/documents/backend/documents/documentsListTypes.js +132 -0
  192. package/dist/modules/documents/backend/documents/documentsListTypes.js.map +7 -0
  193. package/dist/modules/documents/backend/documents/page.js +9 -0
  194. package/dist/modules/documents/backend/documents/page.js.map +7 -0
  195. package/dist/modules/documents/backend/documents/page.meta.js +26 -0
  196. package/dist/modules/documents/backend/documents/page.meta.js.map +7 -0
  197. package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js +91 -0
  198. package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js.map +7 -0
  199. package/dist/modules/documents/backend/documents/templates/TemplatesTable.js +58 -0
  200. package/dist/modules/documents/backend/documents/templates/TemplatesTable.js.map +7 -0
  201. package/dist/modules/documents/backend/documents/templates/page.js +9 -0
  202. package/dist/modules/documents/backend/documents/templates/page.js.map +7 -0
  203. package/dist/modules/documents/backend/documents/templates/page.meta.js +34 -0
  204. package/dist/modules/documents/backend/documents/templates/page.meta.js.map +7 -0
  205. package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js +139 -0
  206. package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js.map +7 -0
  207. package/dist/modules/documents/backend/documents/useDocumentsList.js +314 -0
  208. package/dist/modules/documents/backend/documents/useDocumentsList.js.map +7 -0
  209. package/dist/modules/documents/ce.js +8 -0
  210. package/dist/modules/documents/ce.js.map +7 -0
  211. package/dist/modules/documents/commands/aggregate.js +99 -0
  212. package/dist/modules/documents/commands/aggregate.js.map +7 -0
  213. package/dist/modules/documents/commands/attachments.js +252 -0
  214. package/dist/modules/documents/commands/attachments.js.map +7 -0
  215. package/dist/modules/documents/commands/comments.js +782 -0
  216. package/dist/modules/documents/commands/comments.js.map +7 -0
  217. package/dist/modules/documents/commands/content.js +238 -0
  218. package/dist/modules/documents/commands/content.js.map +7 -0
  219. package/dist/modules/documents/commands/document-crud.js +505 -0
  220. package/dist/modules/documents/commands/document-crud.js.map +7 -0
  221. package/dist/modules/documents/commands/documents.js +473 -0
  222. package/dist/modules/documents/commands/documents.js.map +7 -0
  223. package/dist/modules/documents/commands/duplicate.js +640 -0
  224. package/dist/modules/documents/commands/duplicate.js.map +7 -0
  225. package/dist/modules/documents/commands/favorites.js +150 -0
  226. package/dist/modules/documents/commands/favorites.js.map +7 -0
  227. package/dist/modules/documents/commands/folders.js +420 -0
  228. package/dist/modules/documents/commands/folders.js.map +7 -0
  229. package/dist/modules/documents/commands/index.js +64 -0
  230. package/dist/modules/documents/commands/index.js.map +7 -0
  231. package/dist/modules/documents/commands/interceptors.js +300 -0
  232. package/dist/modules/documents/commands/interceptors.js.map +7 -0
  233. package/dist/modules/documents/commands/lifecycle.js +249 -0
  234. package/dist/modules/documents/commands/lifecycle.js.map +7 -0
  235. package/dist/modules/documents/commands/links.js +410 -0
  236. package/dist/modules/documents/commands/links.js.map +7 -0
  237. package/dist/modules/documents/commands/mutation-helpers.js +42 -0
  238. package/dist/modules/documents/commands/mutation-helpers.js.map +7 -0
  239. package/dist/modules/documents/commands/projection-types.js +1 -0
  240. package/dist/modules/documents/commands/projection-types.js.map +7 -0
  241. package/dist/modules/documents/commands/shared.js +143 -0
  242. package/dist/modules/documents/commands/shared.js.map +7 -0
  243. package/dist/modules/documents/commands/shares.js +527 -0
  244. package/dist/modules/documents/commands/shares.js.map +7 -0
  245. package/dist/modules/documents/commands/side-effects.js +103 -0
  246. package/dist/modules/documents/commands/side-effects.js.map +7 -0
  247. package/dist/modules/documents/commands/templates.js +461 -0
  248. package/dist/modules/documents/commands/templates.js.map +7 -0
  249. package/dist/modules/documents/commands/versions.js +432 -0
  250. package/dist/modules/documents/commands/versions.js.map +7 -0
  251. package/dist/modules/documents/commands/watchers.js +164 -0
  252. package/dist/modules/documents/commands/watchers.js.map +7 -0
  253. package/dist/modules/documents/data/entities.js +653 -0
  254. package/dist/modules/documents/data/entities.js.map +7 -0
  255. package/dist/modules/documents/data/extensions.js +44 -0
  256. package/dist/modules/documents/data/extensions.js.map +7 -0
  257. package/dist/modules/documents/data/validators.js +219 -0
  258. package/dist/modules/documents/data/validators.js.map +7 -0
  259. package/dist/modules/documents/di.js +35 -0
  260. package/dist/modules/documents/di.js.map +7 -0
  261. package/dist/modules/documents/encryption.js +12 -0
  262. package/dist/modules/documents/encryption.js.map +7 -0
  263. package/dist/modules/documents/events.js +27 -0
  264. package/dist/modules/documents/events.js.map +7 -0
  265. package/dist/modules/documents/index.js +19 -0
  266. package/dist/modules/documents/index.js.map +7 -0
  267. package/dist/modules/documents/lib/attachmentServicePort.js +30 -0
  268. package/dist/modules/documents/lib/attachmentServicePort.js.map +7 -0
  269. package/dist/modules/documents/lib/capabilities.js +32 -0
  270. package/dist/modules/documents/lib/capabilities.js.map +7 -0
  271. package/dist/modules/documents/lib/collabCloseEvents.js +17 -0
  272. package/dist/modules/documents/lib/collabCloseEvents.js.map +7 -0
  273. package/dist/modules/documents/lib/collabEndpoint.js +22 -0
  274. package/dist/modules/documents/lib/collabEndpoint.js.map +7 -0
  275. package/dist/modules/documents/lib/collabMaterializer.js +107 -0
  276. package/dist/modules/documents/lib/collabMaterializer.js.map +7 -0
  277. package/dist/modules/documents/lib/collabToken.js +120 -0
  278. package/dist/modules/documents/lib/collabToken.js.map +7 -0
  279. package/dist/modules/documents/lib/collaborationAwareness.js +68 -0
  280. package/dist/modules/documents/lib/collaborationAwareness.js.map +7 -0
  281. package/dist/modules/documents/lib/commentAnchors.js +15 -0
  282. package/dist/modules/documents/lib/commentAnchors.js.map +7 -0
  283. package/dist/modules/documents/lib/constants.js +25 -0
  284. package/dist/modules/documents/lib/constants.js.map +7 -0
  285. package/dist/modules/documents/lib/contentService.js +248 -0
  286. package/dist/modules/documents/lib/contentService.js.map +7 -0
  287. package/dist/modules/documents/lib/displayLabels.js +23 -0
  288. package/dist/modules/documents/lib/displayLabels.js.map +7 -0
  289. package/dist/modules/documents/lib/docxRenderer.js +601 -0
  290. package/dist/modules/documents/lib/docxRenderer.js.map +7 -0
  291. package/dist/modules/documents/lib/duplicateContent.js +22 -0
  292. package/dist/modules/documents/lib/duplicateContent.js.map +7 -0
  293. package/dist/modules/documents/lib/editorConfig.js +287 -0
  294. package/dist/modules/documents/lib/editorConfig.js.map +7 -0
  295. package/dist/modules/documents/lib/entityLinks.js +148 -0
  296. package/dist/modules/documents/lib/entityLinks.js.map +7 -0
  297. package/dist/modules/documents/lib/entityRegistry.js +258 -0
  298. package/dist/modules/documents/lib/entityRegistry.js.map +7 -0
  299. package/dist/modules/documents/lib/entityRegistry.server.js +189 -0
  300. package/dist/modules/documents/lib/entityRegistry.server.js.map +7 -0
  301. package/dist/modules/documents/lib/entityRegistryAvailability.server.js +9 -0
  302. package/dist/modules/documents/lib/entityRegistryAvailability.server.js.map +7 -0
  303. package/dist/modules/documents/lib/entitySuggestion.js +50 -0
  304. package/dist/modules/documents/lib/entitySuggestion.js.map +7 -0
  305. package/dist/modules/documents/lib/favorites.js +22 -0
  306. package/dist/modules/documents/lib/favorites.js.map +7 -0
  307. package/dist/modules/documents/lib/folderHierarchySerialization.js +19 -0
  308. package/dist/modules/documents/lib/folderHierarchySerialization.js.map +7 -0
  309. package/dist/modules/documents/lib/historyLimits.js +100 -0
  310. package/dist/modules/documents/lib/historyLimits.js.map +7 -0
  311. package/dist/modules/documents/lib/historyPolicy.js +14 -0
  312. package/dist/modules/documents/lib/historyPolicy.js.map +7 -0
  313. package/dist/modules/documents/lib/organizationAccess.js +17 -0
  314. package/dist/modules/documents/lib/organizationAccess.js.map +7 -0
  315. package/dist/modules/documents/lib/pdfHtml.js +62 -0
  316. package/dist/modules/documents/lib/pdfHtml.js.map +7 -0
  317. package/dist/modules/documents/lib/pdfRenderer.js +284 -0
  318. package/dist/modules/documents/lib/pdfRenderer.js.map +7 -0
  319. package/dist/modules/documents/lib/permissions.js +222 -0
  320. package/dist/modules/documents/lib/permissions.js.map +7 -0
  321. package/dist/modules/documents/lib/platformServices.js +35 -0
  322. package/dist/modules/documents/lib/platformServices.js.map +7 -0
  323. package/dist/modules/documents/lib/recordFieldInsertion.js +58 -0
  324. package/dist/modules/documents/lib/recordFieldInsertion.js.map +7 -0
  325. package/dist/modules/documents/lib/requestBody.js +80 -0
  326. package/dist/modules/documents/lib/requestBody.js.map +7 -0
  327. package/dist/modules/documents/lib/resourceLimits.js +62 -0
  328. package/dist/modules/documents/lib/resourceLimits.js.map +7 -0
  329. package/dist/modules/documents/lib/shareCounts.js +25 -0
  330. package/dist/modules/documents/lib/shareCounts.js.map +7 -0
  331. package/dist/modules/documents/lib/templateFill.js +84 -0
  332. package/dist/modules/documents/lib/templateFill.js.map +7 -0
  333. package/dist/modules/documents/lib/templateInstantiation.js +147 -0
  334. package/dist/modules/documents/lib/templateInstantiation.js.map +7 -0
  335. package/dist/modules/documents/lib/templatePreviewDigest.js +82 -0
  336. package/dist/modules/documents/lib/templatePreviewDigest.js.map +7 -0
  337. package/dist/modules/documents/lib/templateSeeds.js +201 -0
  338. package/dist/modules/documents/lib/templateSeeds.js.map +7 -0
  339. package/dist/modules/documents/lib/userLabels.js +37 -0
  340. package/dist/modules/documents/lib/userLabels.js.map +7 -0
  341. package/dist/modules/documents/lib/versionContent.js +131 -0
  342. package/dist/modules/documents/lib/versionContent.js.map +7 -0
  343. package/dist/modules/documents/lib/versionLabels.js +12 -0
  344. package/dist/modules/documents/lib/versionLabels.js.map +7 -0
  345. package/dist/modules/documents/lib/versioning.js +14 -0
  346. package/dist/modules/documents/lib/versioning.js.map +7 -0
  347. package/dist/modules/documents/lib/visibility.js +422 -0
  348. package/dist/modules/documents/lib/visibility.js.map +7 -0
  349. package/dist/modules/documents/lib/watchers.js +106 -0
  350. package/dist/modules/documents/lib/watchers.js.map +7 -0
  351. package/dist/modules/documents/migrations/Migration20260708163836_documents.js +44 -0
  352. package/dist/modules/documents/migrations/Migration20260708163836_documents.js.map +7 -0
  353. package/dist/modules/documents/migrations/Migration20260709164720_documents.js +17 -0
  354. package/dist/modules/documents/migrations/Migration20260709164720_documents.js.map +7 -0
  355. package/dist/modules/documents/migrations/Migration20260710002318_documents.js +32 -0
  356. package/dist/modules/documents/migrations/Migration20260710002318_documents.js.map +7 -0
  357. package/dist/modules/documents/migrations/Migration20260710071003_documents.js +13 -0
  358. package/dist/modules/documents/migrations/Migration20260710071003_documents.js.map +7 -0
  359. package/dist/modules/documents/migrations/Migration20260712120000_documents.js +13 -0
  360. package/dist/modules/documents/migrations/Migration20260712120000_documents.js.map +7 -0
  361. package/dist/modules/documents/migrations/Migration20260712183000_documents.js +14 -0
  362. package/dist/modules/documents/migrations/Migration20260712183000_documents.js.map +7 -0
  363. package/dist/modules/documents/migrations/Migration20260713092156_documents.js +29 -0
  364. package/dist/modules/documents/migrations/Migration20260713092156_documents.js.map +7 -0
  365. package/dist/modules/documents/migrations/Migration20260717000000_documents.js +37 -0
  366. package/dist/modules/documents/migrations/Migration20260717000000_documents.js.map +7 -0
  367. package/dist/modules/documents/notifications.js +47 -0
  368. package/dist/modules/documents/notifications.js.map +7 -0
  369. package/dist/modules/documents/search.js +101 -0
  370. package/dist/modules/documents/search.js.map +7 -0
  371. package/dist/modules/documents/setup.js +19 -0
  372. package/dist/modules/documents/setup.js.map +7 -0
  373. package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js +214 -0
  374. package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js.map +7 -0
  375. package/dist/modules/documents/widgets/injection/related-documents/context.js +84 -0
  376. package/dist/modules/documents/widgets/injection/related-documents/context.js.map +7 -0
  377. package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js +98 -0
  378. package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js.map +7 -0
  379. package/dist/modules/documents/widgets/injection/related-documents/widget.client.js +83 -0
  380. package/dist/modules/documents/widgets/injection/related-documents/widget.client.js.map +7 -0
  381. package/dist/modules/documents/widgets/injection/related-documents/widget.js +19 -0
  382. package/dist/modules/documents/widgets/injection/related-documents/widget.js.map +7 -0
  383. package/dist/modules/documents/widgets/injection-table.js +21 -0
  384. package/dist/modules/documents/widgets/injection-table.js.map +7 -0
  385. package/dist/server/documents-collab-server.js +2260 -0
  386. package/dist/server/documents-collab-server.js.map +7 -0
  387. package/generated/entities/document/index.ts +12 -0
  388. package/generated/entities/document_attachment/index.ts +9 -0
  389. package/generated/entities/document_comment/index.ts +14 -0
  390. package/generated/entities/document_content/index.ts +11 -0
  391. package/generated/entities/document_entity_link/index.ts +19 -0
  392. package/generated/entities/document_favorite/index.ts +7 -0
  393. package/generated/entities/document_folder/index.ts +9 -0
  394. package/generated/entities/document_share/index.ts +11 -0
  395. package/generated/entities/document_template/index.ts +13 -0
  396. package/generated/entities/document_version/index.ts +9 -0
  397. package/generated/entities/document_watcher/index.ts +7 -0
  398. package/generated/entities.ids.generated.ts +21 -0
  399. package/generated/entity-fields-registry.ts +151 -0
  400. package/jest.config.cjs +34 -0
  401. package/package.json +149 -0
  402. package/server/documents-collab-server.ts +3416 -0
  403. package/src/index.ts +1 -0
  404. package/src/modules/documents/acl.ts +11 -0
  405. package/src/modules/documents/api/[id]/archive/route.ts +132 -0
  406. package/src/modules/documents/api/[id]/attachments/[attachmentId]/route.ts +166 -0
  407. package/src/modules/documents/api/[id]/attachments/route.ts +173 -0
  408. package/src/modules/documents/api/[id]/collab-token/route.ts +203 -0
  409. package/src/modules/documents/api/[id]/comments/access-check/route.ts +96 -0
  410. package/src/modules/documents/api/[id]/comments/route.ts +442 -0
  411. package/src/modules/documents/api/[id]/content/route.ts +156 -0
  412. package/src/modules/documents/api/[id]/duplicate/route.ts +231 -0
  413. package/src/modules/documents/api/[id]/export/route.ts +535 -0
  414. package/src/modules/documents/api/[id]/favorite/route.ts +110 -0
  415. package/src/modules/documents/api/[id]/links/[linkId]/route.ts +92 -0
  416. package/src/modules/documents/api/[id]/links/route.ts +301 -0
  417. package/src/modules/documents/api/[id]/principals/route.ts +375 -0
  418. package/src/modules/documents/api/[id]/route.ts +267 -0
  419. package/src/modules/documents/api/[id]/shares/route.ts +372 -0
  420. package/src/modules/documents/api/[id]/unarchive/route.ts +42 -0
  421. package/src/modules/documents/api/[id]/versions/[versionId]/restore/route.ts +152 -0
  422. package/src/modules/documents/api/[id]/versions/[versionId]/route.ts +100 -0
  423. package/src/modules/documents/api/[id]/versions/route.ts +207 -0
  424. package/src/modules/documents/api/[id]/watch/route.ts +111 -0
  425. package/src/modules/documents/api/_commands.ts +53 -0
  426. package/src/modules/documents/api/_shared.ts +676 -0
  427. package/src/modules/documents/api/folders/route.ts +287 -0
  428. package/src/modules/documents/api/instantiate/route.ts +114 -0
  429. package/src/modules/documents/api/route.ts +362 -0
  430. package/src/modules/documents/api/templates/[templateId]/preview/route.ts +97 -0
  431. package/src/modules/documents/api/templates/[templateId]/route.ts +92 -0
  432. package/src/modules/documents/api/templates/route.ts +370 -0
  433. package/src/modules/documents/backend/documents/DocumentsPageClient.tsx +150 -0
  434. package/src/modules/documents/backend/documents/DocumentsTable.tsx +168 -0
  435. package/src/modules/documents/backend/documents/FolderDialog.tsx +62 -0
  436. package/src/modules/documents/backend/documents/FolderTree.tsx +72 -0
  437. package/src/modules/documents/backend/documents/MoveDocumentDialog.tsx +70 -0
  438. package/src/modules/documents/backend/documents/[id]/CommentAnchorNavigation.ts +88 -0
  439. package/src/modules/documents/backend/documents/[id]/CommentComposer.tsx +136 -0
  440. package/src/modules/documents/backend/documents/[id]/CommentThreadList.tsx +131 -0
  441. package/src/modules/documents/backend/documents/[id]/CommentsRail.tsx +138 -0
  442. package/src/modules/documents/backend/documents/[id]/DocumentCanvas.tsx +111 -0
  443. package/src/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.tsx +39 -0
  444. package/src/modules/documents/backend/documents/[id]/DocumentEditorIsland.tsx +50 -0
  445. package/src/modules/documents/backend/documents/[id]/DocumentEditorSurface.tsx +162 -0
  446. package/src/modules/documents/backend/documents/[id]/DocumentNavigator.tsx +129 -0
  447. package/src/modules/documents/backend/documents/[id]/DocumentPageClient.tsx +463 -0
  448. package/src/modules/documents/backend/documents/[id]/EditorColorTools.tsx +71 -0
  449. package/src/modules/documents/backend/documents/[id]/EditorStatusPresence.tsx +78 -0
  450. package/src/modules/documents/backend/documents/[id]/EditorToolbar.tsx +108 -0
  451. package/src/modules/documents/backend/documents/[id]/ExportMenu.tsx +144 -0
  452. package/src/modules/documents/backend/documents/[id]/MentionPicker.tsx +137 -0
  453. package/src/modules/documents/backend/documents/[id]/OutlinePane.tsx +98 -0
  454. package/src/modules/documents/backend/documents/[id]/RecordFieldsDialog.tsx +185 -0
  455. package/src/modules/documents/backend/documents/[id]/RelatedRecordsPanel.tsx +320 -0
  456. package/src/modules/documents/backend/documents/[id]/VersionHistoryPanel.tsx +244 -0
  457. package/src/modules/documents/backend/documents/[id]/VersionPreviewDialog.tsx +197 -0
  458. package/src/modules/documents/backend/documents/[id]/commentTypes.ts +192 -0
  459. package/src/modules/documents/backend/documents/[id]/componentCapabilities.ts +17 -0
  460. package/src/modules/documents/backend/documents/[id]/documentPagination.ts +352 -0
  461. package/src/modules/documents/backend/documents/[id]/editorPresenceStyles.ts +77 -0
  462. package/src/modules/documents/backend/documents/[id]/editorTypes.ts +84 -0
  463. package/src/modules/documents/backend/documents/[id]/page.meta.ts +12 -0
  464. package/src/modules/documents/backend/documents/[id]/page.tsx +6 -0
  465. package/src/modules/documents/backend/documents/[id]/relatedRecordModel.ts +49 -0
  466. package/src/modules/documents/backend/documents/[id]/restoreVersion.ts +49 -0
  467. package/src/modules/documents/backend/documents/[id]/useDocumentCollaboration.ts +458 -0
  468. package/src/modules/documents/backend/documents/[id]/useDocumentComments.ts +286 -0
  469. package/src/modules/documents/backend/documents/[id]/useDocumentEditor.ts +157 -0
  470. package/src/modules/documents/backend/documents/[id]/useDocumentTitle.ts +77 -0
  471. package/src/modules/documents/backend/documents/[id]/useEditorInsertions.ts +147 -0
  472. package/src/modules/documents/backend/documents/[id]/useFallbackContentPersistence.ts +277 -0
  473. package/src/modules/documents/backend/documents/[id]/useMentionPicker.ts +259 -0
  474. package/src/modules/documents/backend/documents/[id]/versionHistoryModel.ts +29 -0
  475. package/src/modules/documents/backend/documents/components/EntityPicker.tsx +171 -0
  476. package/src/modules/documents/backend/documents/components/EntityPickerResults.tsx +64 -0
  477. package/src/modules/documents/backend/documents/components/NewFromTemplateDialog.tsx +136 -0
  478. package/src/modules/documents/backend/documents/components/PrincipalPicker.tsx +90 -0
  479. package/src/modules/documents/backend/documents/components/ShareDialog.tsx +88 -0
  480. package/src/modules/documents/backend/documents/components/ShareDialogAddForm.tsx +113 -0
  481. package/src/modules/documents/backend/documents/components/ShareDialogList.tsx +117 -0
  482. package/src/modules/documents/backend/documents/components/TemplateBodyEditor.tsx +96 -0
  483. package/src/modules/documents/backend/documents/components/TemplateEditorDialog.tsx +171 -0
  484. package/src/modules/documents/backend/documents/components/TemplatePreview.tsx +43 -0
  485. package/src/modules/documents/backend/documents/components/TemplateSlotFields.tsx +72 -0
  486. package/src/modules/documents/backend/documents/components/TemplateSlotsEditor.tsx +72 -0
  487. package/src/modules/documents/backend/documents/components/principalPickerModel.ts +86 -0
  488. package/src/modules/documents/backend/documents/components/shareDialogModel.ts +94 -0
  489. package/src/modules/documents/backend/documents/components/templateUi.ts +128 -0
  490. package/src/modules/documents/backend/documents/components/useAvailableEntityRegistry.ts +43 -0
  491. package/src/modules/documents/backend/documents/components/useEntitySearch.ts +197 -0
  492. package/src/modules/documents/backend/documents/components/usePrincipalPicker.ts +165 -0
  493. package/src/modules/documents/backend/documents/components/useShareDialog.ts +267 -0
  494. package/src/modules/documents/backend/documents/components/useTemplateDetail.ts +54 -0
  495. package/src/modules/documents/backend/documents/components/useTemplateInstantiation.ts +252 -0
  496. package/src/modules/documents/backend/documents/documentUi.ts +134 -0
  497. package/src/modules/documents/backend/documents/documentsListTypes.ts +163 -0
  498. package/src/modules/documents/backend/documents/page.meta.ts +24 -0
  499. package/src/modules/documents/backend/documents/page.tsx +5 -0
  500. package/src/modules/documents/backend/documents/templates/TemplatesPageClient.tsx +93 -0
  501. package/src/modules/documents/backend/documents/templates/TemplatesTable.tsx +71 -0
  502. package/src/modules/documents/backend/documents/templates/page.meta.ts +32 -0
  503. package/src/modules/documents/backend/documents/templates/page.tsx +5 -0
  504. package/src/modules/documents/backend/documents/templates/useTemplatesPage.tsx +148 -0
  505. package/src/modules/documents/backend/documents/useDocumentsList.tsx +305 -0
  506. package/src/modules/documents/ce.ts +6 -0
  507. package/src/modules/documents/commands/aggregate.ts +128 -0
  508. package/src/modules/documents/commands/attachments.ts +309 -0
  509. package/src/modules/documents/commands/comments.ts +966 -0
  510. package/src/modules/documents/commands/content.ts +294 -0
  511. package/src/modules/documents/commands/document-crud.ts +609 -0
  512. package/src/modules/documents/commands/documents.ts +581 -0
  513. package/src/modules/documents/commands/duplicate.ts +772 -0
  514. package/src/modules/documents/commands/favorites.ts +171 -0
  515. package/src/modules/documents/commands/folders.ts +506 -0
  516. package/src/modules/documents/commands/index.ts +33 -0
  517. package/src/modules/documents/commands/interceptors.ts +402 -0
  518. package/src/modules/documents/commands/lifecycle.ts +333 -0
  519. package/src/modules/documents/commands/links.ts +486 -0
  520. package/src/modules/documents/commands/mutation-helpers.ts +48 -0
  521. package/src/modules/documents/commands/projection-types.ts +77 -0
  522. package/src/modules/documents/commands/shared.ts +219 -0
  523. package/src/modules/documents/commands/shares.ts +612 -0
  524. package/src/modules/documents/commands/side-effects.ts +130 -0
  525. package/src/modules/documents/commands/templates.ts +522 -0
  526. package/src/modules/documents/commands/versions.ts +537 -0
  527. package/src/modules/documents/commands/watchers.ts +181 -0
  528. package/src/modules/documents/data/entities.ts +631 -0
  529. package/src/modules/documents/data/extensions.ts +42 -0
  530. package/src/modules/documents/data/validators.ts +248 -0
  531. package/src/modules/documents/di.ts +33 -0
  532. package/src/modules/documents/encryption.ts +14 -0
  533. package/src/modules/documents/events.ts +23 -0
  534. package/src/modules/documents/i18n/.hardcoded-allowlist.json +9 -0
  535. package/src/modules/documents/i18n/de.json +522 -0
  536. package/src/modules/documents/i18n/en.json +522 -0
  537. package/src/modules/documents/i18n/es.json +522 -0
  538. package/src/modules/documents/i18n/ko.json +522 -0
  539. package/src/modules/documents/i18n/pl.json +522 -0
  540. package/src/modules/documents/index.ts +17 -0
  541. package/src/modules/documents/lib/attachmentServicePort.ts +94 -0
  542. package/src/modules/documents/lib/capabilities.ts +57 -0
  543. package/src/modules/documents/lib/collabCloseEvents.ts +26 -0
  544. package/src/modules/documents/lib/collabEndpoint.ts +43 -0
  545. package/src/modules/documents/lib/collabMaterializer.ts +140 -0
  546. package/src/modules/documents/lib/collabToken.ts +170 -0
  547. package/src/modules/documents/lib/collaborationAwareness.ts +102 -0
  548. package/src/modules/documents/lib/commentAnchors.ts +19 -0
  549. package/src/modules/documents/lib/constants.ts +39 -0
  550. package/src/modules/documents/lib/contentService.ts +340 -0
  551. package/src/modules/documents/lib/displayLabels.ts +31 -0
  552. package/src/modules/documents/lib/docxRenderer.ts +685 -0
  553. package/src/modules/documents/lib/duplicateContent.ts +32 -0
  554. package/src/modules/documents/lib/editorConfig.ts +371 -0
  555. package/src/modules/documents/lib/entityLinks.ts +250 -0
  556. package/src/modules/documents/lib/entityRegistry.server.ts +267 -0
  557. package/src/modules/documents/lib/entityRegistry.ts +345 -0
  558. package/src/modules/documents/lib/entityRegistryAvailability.server.ts +19 -0
  559. package/src/modules/documents/lib/entitySuggestion.ts +61 -0
  560. package/src/modules/documents/lib/favorites.ts +35 -0
  561. package/src/modules/documents/lib/folderHierarchySerialization.ts +34 -0
  562. package/src/modules/documents/lib/historyLimits.ts +154 -0
  563. package/src/modules/documents/lib/historyPolicy.ts +7 -0
  564. package/src/modules/documents/lib/organizationAccess.ts +44 -0
  565. package/src/modules/documents/lib/pdfHtml.ts +65 -0
  566. package/src/modules/documents/lib/pdfRenderer.ts +367 -0
  567. package/src/modules/documents/lib/permissions.ts +299 -0
  568. package/src/modules/documents/lib/platformServices.ts +70 -0
  569. package/src/modules/documents/lib/recordFieldInsertion.ts +72 -0
  570. package/src/modules/documents/lib/requestBody.ts +97 -0
  571. package/src/modules/documents/lib/resourceLimits.ts +94 -0
  572. package/src/modules/documents/lib/shareCounts.ts +44 -0
  573. package/src/modules/documents/lib/templateFill.ts +138 -0
  574. package/src/modules/documents/lib/templateInstantiation.ts +206 -0
  575. package/src/modules/documents/lib/templatePreviewDigest.ts +122 -0
  576. package/src/modules/documents/lib/templateSeeds.ts +248 -0
  577. package/src/modules/documents/lib/userLabels.ts +58 -0
  578. package/src/modules/documents/lib/versionContent.ts +163 -0
  579. package/src/modules/documents/lib/versionLabels.ts +9 -0
  580. package/src/modules/documents/lib/versioning.ts +29 -0
  581. package/src/modules/documents/lib/visibility.ts +610 -0
  582. package/src/modules/documents/lib/watchers.ts +129 -0
  583. package/src/modules/documents/migrations/.snapshot-open-mercato.json +2892 -0
  584. package/src/modules/documents/migrations/Migration20260708163836_documents.ts +50 -0
  585. package/src/modules/documents/migrations/Migration20260709164720_documents.ts +19 -0
  586. package/src/modules/documents/migrations/Migration20260710002318_documents.ts +35 -0
  587. package/src/modules/documents/migrations/Migration20260710071003_documents.ts +13 -0
  588. package/src/modules/documents/migrations/Migration20260712120000_documents.ts +13 -0
  589. package/src/modules/documents/migrations/Migration20260712183000_documents.ts +12 -0
  590. package/src/modules/documents/migrations/Migration20260713092156_documents.ts +43 -0
  591. package/src/modules/documents/migrations/Migration20260717000000_documents.ts +40 -0
  592. package/src/modules/documents/notifications.ts +45 -0
  593. package/src/modules/documents/search.ts +118 -0
  594. package/src/modules/documents/setup.ts +19 -0
  595. package/src/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.tsx +224 -0
  596. package/src/modules/documents/widgets/injection/related-documents/context.ts +101 -0
  597. package/src/modules/documents/widgets/injection/related-documents/useRelatedDocuments.ts +112 -0
  598. package/src/modules/documents/widgets/injection/related-documents/widget.client.tsx +76 -0
  599. package/src/modules/documents/widgets/injection/related-documents/widget.ts +19 -0
  600. package/src/modules/documents/widgets/injection-table.ts +20 -0
  601. package/tsconfig.json +9 -0
  602. package/watch.mjs +6 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/CommentComposer.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { AtSign, CornerDownRight, Send, X } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { MentionPicker } from './MentionPicker'\nimport {\n bodyContainsPendingMention,\n removePendingMentionOccurrences,\n type PendingMention,\n} from './commentTypes'\n\ntype CommentComposerProps = {\n documentId: string\n body: string\n pendingMentions: PendingMention[]\n replyToName: string | null\n isSubmitting: boolean\n onBodyChange: (body: string) => void\n onMentionsChange: React.Dispatch<React.SetStateAction<PendingMention[]>>\n onSubmit: () => void\n onCancel: () => void\n focusSignal?: number | string\n}\n\nexport const CommentComposer = React.forwardRef<HTMLFormElement, CommentComposerProps>(function CommentComposer({\n documentId,\n body,\n pendingMentions,\n replyToName,\n isSubmitting,\n onBodyChange,\n onMentionsChange,\n onSubmit,\n onCancel,\n focusSignal,\n}, forwardedRef) {\n const t = useT()\n const composerId = React.useId()\n const textareaRef = React.useRef<HTMLTextAreaElement | null>(null)\n const [mentionPickerOpen, setMentionPickerOpen] = React.useState(false)\n\n React.useEffect(() => {\n if (focusSignal === undefined) return\n window.setTimeout(() => textareaRef.current?.focus(), 0)\n }, [focusSignal])\n\n const handleMentionPick = React.useCallback((user: { id: string; name: string }) => {\n const userId = user.id.toLowerCase()\n onMentionsChange((current) => current.some((mention) => mention.userId === userId)\n ? current\n : [...current, { userId, name: user.name }])\n onBodyChange(`${body}${body.length > 0 && !/\\s$/.test(body) ? ' ' : ''}@${user.name} `)\n setMentionPickerOpen(false)\n window.setTimeout(() => textareaRef.current?.focus(), 0)\n }, [body, onBodyChange, onMentionsChange])\n\n const handleBodyChange = React.useCallback((nextBody: string) => {\n onBodyChange(nextBody)\n onMentionsChange((current) => current.filter((mention) => bodyContainsPendingMention(nextBody, mention)))\n }, [onBodyChange, onMentionsChange])\n\n const removeMention = React.useCallback((mention: PendingMention) => {\n onBodyChange(removePendingMentionOccurrences(body, mention, pendingMentions))\n onMentionsChange((current) => current.filter((candidate) => candidate.userId !== mention.userId))\n window.setTimeout(() => textareaRef.current?.focus(), 0)\n }, [body, onBodyChange, onMentionsChange, pendingMentions])\n\n return (\n <form\n ref={forwardedRef}\n className=\"space-y-3 rounded-lg border border-border bg-muted/20 p-3\"\n onSubmit={(event) => { event.preventDefault(); onSubmit() }}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n onSubmit()\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n setMentionPickerOpen(false)\n onCancel()\n }\n }}\n >\n <div className=\"space-y-2\">\n <Label htmlFor={composerId}>{t('documents.comments.title')}</Label>\n {replyToName ? (\n <p className=\"inline-flex items-center gap-2 rounded-full bg-muted px-2 py-1 text-xs text-muted-foreground\">\n <CornerDownRight className=\"size-3\" aria-hidden=\"true\" />\n {t('documents.comments.replyTo', { name: replyToName })}\n </p>\n ) : null}\n <Textarea\n ref={textareaRef}\n id={composerId}\n value={body}\n onChange={(event) => handleBodyChange(event.target.value)}\n placeholder={t('documents.comments.composer.placeholder')}\n maxLength={8000}\n showCount\n disabled={isSubmitting}\n />\n {pendingMentions.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label={t('documents.comments.mentions.selected')}>\n {pendingMentions.map((mention) => (\n <Button\n key={mention.userId}\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => removeMention(mention)}\n disabled={isSubmitting}\n aria-label={t('documents.comments.mentions.remove', { name: mention.name })}\n >\n @{mention.name}<X aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n {mentionPickerOpen ? <MentionPicker documentId={documentId} onPick={handleMentionPick} disabled={isSubmitting} /> : null}\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => setMentionPickerOpen((open) => !open)} disabled={isSubmitting}>\n <AtSign />{t('documents.comments.actions.mention')}\n </Button>\n <Button type=\"submit\" disabled={isSubmitting || body.trim().length === 0}>\n <Send />{t('documents.comments.actions.send')}\n </Button>\n </div>\n </form>\n )\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["CommentComposer"]
7
+ }
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { CheckCircle2, CornerDownRight, RotateCcw } from "lucide-react";
4
+ import { Button } from "@open-mercato/ui/primitives/button";
5
+ import { StatusBadge } from "@open-mercato/ui/primitives/status-badge";
6
+ const MENTION_TOKEN_PATTERN = /@\[([0-9a-f-]{36})\]/gi;
7
+ function formatDateTime(value) {
8
+ const timestamp = Date.parse(value);
9
+ return Number.isFinite(timestamp) ? new Intl.DateTimeFormat(void 0, { dateStyle: "medium", timeStyle: "short" }).format(new Date(timestamp)) : "";
10
+ }
11
+ function formatBody(body, labelFor) {
12
+ const parts = [];
13
+ let cursor = 0;
14
+ for (const match of body.matchAll(MENTION_TOKEN_PATTERN)) {
15
+ const userId = match[1];
16
+ const start = match.index ?? 0;
17
+ if (userId === void 0) continue;
18
+ if (start > cursor) parts.push(body.slice(cursor, start));
19
+ parts.push(
20
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex rounded-full bg-muted px-2 py-1 text-xs font-medium text-primary", children: [
21
+ "@",
22
+ labelFor(userId)
23
+ ] }, `mention:${start}`)
24
+ );
25
+ cursor = start + match[0].length;
26
+ }
27
+ if (cursor < body.length) parts.push(body.slice(cursor));
28
+ return parts;
29
+ }
30
+ function CommentItem({
31
+ comment,
32
+ canComment,
33
+ resolvingCommentId,
34
+ labelFor,
35
+ onJump,
36
+ onReply,
37
+ onResolve,
38
+ t
39
+ }) {
40
+ const resolved = comment.resolvedAt !== null;
41
+ const canJump = comment.anchor !== null && comment.anchor !== "changed";
42
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
45
+ /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-medium", children: labelFor(comment.authorUserId) }),
46
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: formatDateTime(comment.createdAt) })
47
+ ] }),
48
+ resolved ? /* @__PURE__ */ jsx(StatusBadge, { variant: "success", dot: true, children: t("documents.comments.resolved") }) : null
49
+ ] }),
50
+ /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap text-sm text-foreground", children: formatBody(comment.body, labelFor) }),
51
+ comment.anchor === "changed" ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("documents.comments.anchor.changed") }) : null
52
+ ] });
53
+ return /* @__PURE__ */ jsxs("article", { className: "space-y-3 rounded-lg border border-border bg-background p-3", children: [
54
+ canJump ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", className: "h-auto w-full flex-col items-stretch gap-2 p-0 text-left hover:bg-transparent", onClick: () => onJump(comment), children: content }) : /* @__PURE__ */ jsx("div", { className: "space-y-2", children: content }),
55
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
56
+ canComment && comment.parentCommentId === null ? /* @__PURE__ */ jsxs(Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onReply(comment), children: [
57
+ /* @__PURE__ */ jsx(CornerDownRight, {}),
58
+ t("documents.comments.actions.reply")
59
+ ] }) : null,
60
+ comment.canResolve ? /* @__PURE__ */ jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: () => onResolve(comment), disabled: resolvingCommentId === comment.id, children: [
61
+ resolved ? /* @__PURE__ */ jsx(RotateCcw, {}) : /* @__PURE__ */ jsx(CheckCircle2, {}),
62
+ resolved ? t("documents.comments.actions.reopen") : t("documents.comments.actions.resolve")
63
+ ] }) : null
64
+ ] }),
65
+ comment.replies.length > 0 ? /* @__PURE__ */ jsx("div", { className: "space-y-2 border-l border-border pl-3", children: comment.replies.map((reply) => /* @__PURE__ */ jsx(
66
+ CommentItem,
67
+ {
68
+ comment: reply,
69
+ comments: [],
70
+ canComment: false,
71
+ resolvingCommentId,
72
+ labelFor,
73
+ onJump,
74
+ onReply,
75
+ onResolve,
76
+ t
77
+ },
78
+ reply.id
79
+ )) }) : null
80
+ ] });
81
+ }
82
+ function CommentThreadList(props) {
83
+ return /* @__PURE__ */ jsx("div", { className: "space-y-3", children: props.comments.map((comment) => /* @__PURE__ */ jsx(CommentItem, { ...props, comment }, comment.id)) });
84
+ }
85
+ export {
86
+ CommentThreadList
87
+ };
88
+ //# sourceMappingURL=CommentThreadList.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/CommentThreadList.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CheckCircle2, CornerDownRight, RotateCcw } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { StatusBadge } from '@open-mercato/ui/primitives/status-badge'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport type { DocumentComment } from './commentTypes'\n\ntype LabelFor = (userId: string) => string\ntype CommentThreadListProps = {\n comments: DocumentComment[]\n canComment: boolean\n resolvingCommentId: string | null\n labelFor: LabelFor\n onJump: (comment: DocumentComment) => void\n onReply: (comment: DocumentComment) => void\n onResolve: (comment: DocumentComment) => void\n t: TranslateFn\n}\n\nconst MENTION_TOKEN_PATTERN = /@\\[([0-9a-f-]{36})\\]/gi\n\nfunction formatDateTime(value: string): string {\n const timestamp = Date.parse(value)\n return Number.isFinite(timestamp)\n ? new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(timestamp))\n : ''\n}\n\n/**\n * Chips are built from the mention tokens themselves. Rendering display\n * labels back into the text and re-matching them corrupted every label that\n * shares a prefix with another mention, and expanded the `$&`/`$1` sequences\n * a user-controlled label may carry into the replacement string.\n */\nfunction formatBody(body: string, labelFor: LabelFor): React.ReactNode[] {\n const parts: React.ReactNode[] = []\n let cursor = 0\n for (const match of body.matchAll(MENTION_TOKEN_PATTERN)) {\n const userId = match[1]\n const start = match.index ?? 0\n if (userId === undefined) continue\n if (start > cursor) parts.push(body.slice(cursor, start))\n parts.push(\n <span key={`mention:${start}`} className=\"inline-flex rounded-full bg-muted px-2 py-1 text-xs font-medium text-primary\">\n @{labelFor(userId)}\n </span>,\n )\n cursor = start + match[0].length\n }\n if (cursor < body.length) parts.push(body.slice(cursor))\n return parts\n}\n\nfunction CommentItem({\n comment,\n canComment,\n resolvingCommentId,\n labelFor,\n onJump,\n onReply,\n onResolve,\n t,\n}: CommentThreadListProps & { comment: DocumentComment }) {\n const resolved = comment.resolvedAt !== null\n const canJump = comment.anchor !== null && comment.anchor !== 'changed'\n const content = (\n <>\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium\">{labelFor(comment.authorUserId)}</p>\n <p className=\"text-xs text-muted-foreground\">{formatDateTime(comment.createdAt)}</p>\n </div>\n {resolved ? <StatusBadge variant=\"success\" dot>{t('documents.comments.resolved')}</StatusBadge> : null}\n </div>\n <p className=\"whitespace-pre-wrap text-sm text-foreground\">{formatBody(comment.body, labelFor)}</p>\n {comment.anchor === 'changed' ? (\n <p className=\"text-xs text-muted-foreground\">{t('documents.comments.anchor.changed')}</p>\n ) : null}\n </>\n )\n return (\n <article className=\"space-y-3 rounded-lg border border-border bg-background p-3\">\n {canJump ? (\n <Button type=\"button\" variant=\"ghost\" className=\"h-auto w-full flex-col items-stretch gap-2 p-0 text-left hover:bg-transparent\" onClick={() => onJump(comment)}>\n {content}\n </Button>\n ) : <div className=\"space-y-2\">{content}</div>}\n <div className=\"flex flex-wrap items-center gap-2\">\n {canComment && comment.parentCommentId === null ? (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onReply(comment)}>\n <CornerDownRight />{t('documents.comments.actions.reply')}\n </Button>\n ) : null}\n {comment.canResolve ? (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => onResolve(comment)} disabled={resolvingCommentId === comment.id}>\n {resolved ? <RotateCcw /> : <CheckCircle2 />}\n {resolved ? t('documents.comments.actions.reopen') : t('documents.comments.actions.resolve')}\n </Button>\n ) : null}\n </div>\n {comment.replies.length > 0 ? (\n <div className=\"space-y-2 border-l border-border pl-3\">\n {comment.replies.map((reply) => (\n <CommentItem\n key={reply.id}\n comment={reply}\n comments={[]}\n canComment={false}\n resolvingCommentId={resolvingCommentId}\n labelFor={labelFor}\n onJump={onJump}\n onReply={onReply}\n onResolve={onResolve}\n t={t}\n />\n ))}\n </div>\n ) : null}\n </article>\n )\n}\n\nexport function CommentThreadList(props: CommentThreadListProps) {\n return (\n <div className=\"space-y-3\">\n {props.comments.map((comment) => <CommentItem key={comment.id} {...props} comment={comment} />)}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,123 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { MessageSquare } from "lucide-react";
5
+ import { LoadingMessage, ErrorMessage } from "@open-mercato/ui/backend/detail";
6
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
7
+ import { Button } from "@open-mercato/ui/primitives/button";
8
+ import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
9
+ import {
10
+ Dialog,
11
+ DialogContent,
12
+ DialogDescription,
13
+ DialogFooter,
14
+ DialogHeader,
15
+ DialogTitle
16
+ } from "@open-mercato/ui/primitives/dialog";
17
+ import { useDialogKeyHandler } from "@open-mercato/ui/hooks/useDialogKeyHandler";
18
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
19
+ import { CommentComposer } from "./CommentComposer.js";
20
+ import { CommentThreadList } from "./CommentThreadList.js";
21
+ import { resolveCommentsCapability } from "./componentCapabilities.js";
22
+ import { useDocumentComments } from "./useDocumentComments.js";
23
+ import { resolveCommentsCapability as resolveCommentsCapability2 } from "./componentCapabilities.js";
24
+ function CommentsRail({
25
+ documentId,
26
+ editor,
27
+ commentFocusRequest,
28
+ tier,
29
+ canComment,
30
+ canShare = false
31
+ }) {
32
+ const t = useT();
33
+ const mayComment = resolveCommentsCapability(canComment, tier);
34
+ const composerRef = React.useRef(null);
35
+ const comments = useDocumentComments({ documentId, editor, canComment: mayComment, canShare });
36
+ React.useEffect(() => {
37
+ if (!commentFocusRequest || !mayComment) return;
38
+ comments.setPendingAnchor(commentFocusRequest.anchor);
39
+ window.setTimeout(() => composerRef.current?.scrollIntoView({ block: "nearest", behavior: "smooth" }), 0);
40
+ }, [commentFocusRequest, comments.setPendingAnchor, mayComment]);
41
+ const grantPromptKeyDown = useDialogKeyHandler({
42
+ onConfirm: () => comments.chooseGrantAccess(true),
43
+ onCancel: () => comments.chooseGrantAccess(false)
44
+ });
45
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
46
+ /* @__PURE__ */ jsxs("section", { className: "rounded-lg border border-border bg-card p-3 sm:p-4", children: [
47
+ /* @__PURE__ */ jsxs("div", { className: "mb-4 flex items-center gap-2", children: [
48
+ /* @__PURE__ */ jsx(MessageSquare, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }),
49
+ /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold", children: t("documents.comments.title") })
50
+ ] }),
51
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
52
+ comments.state.status === "loading" ? /* @__PURE__ */ jsx(LoadingMessage, { label: t("documents.comments.loading") }) : null,
53
+ comments.state.status === "error" ? /* @__PURE__ */ jsx(
54
+ ErrorMessage,
55
+ {
56
+ label: comments.state.message,
57
+ action: /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: () => void comments.reload(), children: t("documents.actions.retry") })
58
+ }
59
+ ) : null,
60
+ comments.state.status === "ready" && comments.comments.length === 0 ? /* @__PURE__ */ jsx(EmptyState, { size: "sm", variant: "subtle", title: t("documents.comments.empty"), icon: /* @__PURE__ */ jsx(MessageSquare, { className: "size-5" }) }) : null,
61
+ comments.state.status === "ready" && comments.comments.length > 0 ? /* @__PURE__ */ jsx(
62
+ CommentThreadList,
63
+ {
64
+ comments: comments.comments,
65
+ canComment: mayComment,
66
+ resolvingCommentId: comments.resolvingCommentId,
67
+ labelFor: comments.labelFor,
68
+ onJump: (comment) => {
69
+ void (async () => {
70
+ if (!editor || comment.anchor === null || comment.anchor === "changed") {
71
+ flash(t("documents.comments.anchor.changed"), "info");
72
+ return;
73
+ }
74
+ const { jumpToCommentAnchor } = await import("./CommentAnchorNavigation.js");
75
+ if (!jumpToCommentAnchor(editor, comment.anchor)) {
76
+ flash(t("documents.comments.anchor.changed"), "info");
77
+ }
78
+ })();
79
+ },
80
+ onReply: comments.startReply,
81
+ onResolve: (comment) => void comments.resolveComment(comment),
82
+ t
83
+ }
84
+ ) : null,
85
+ mayComment ? /* @__PURE__ */ jsx(
86
+ CommentComposer,
87
+ {
88
+ ref: composerRef,
89
+ documentId,
90
+ body: comments.body,
91
+ pendingMentions: comments.pendingMentions,
92
+ replyToName: comments.replyToName,
93
+ isSubmitting: comments.isSubmitting,
94
+ onBodyChange: comments.setBody,
95
+ onMentionsChange: comments.setPendingMentions,
96
+ onSubmit: () => void comments.submit(),
97
+ onCancel: comments.resetComposer,
98
+ focusSignal: commentFocusRequest?.requestId ?? comments.parentCommentId ?? void 0
99
+ }
100
+ ) : null
101
+ ] })
102
+ ] }),
103
+ /* @__PURE__ */ jsx(Dialog, { open: comments.grantAccessNames !== null, onOpenChange: (open) => {
104
+ if (!open) comments.chooseGrantAccess(false);
105
+ }, children: /* @__PURE__ */ jsxs(DialogContent, { onKeyDown: grantPromptKeyDown, children: [
106
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
107
+ /* @__PURE__ */ jsx(DialogTitle, { children: t("documents.comments.grant.title") }),
108
+ /* @__PURE__ */ jsx(DialogDescription, { children: t("documents.comments.grant.body", { names: comments.grantAccessNames?.join(", ") ?? "" }) })
109
+ ] }),
110
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
111
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => comments.chooseGrantAccess(false), children: t("documents.comments.grant.skip") }),
112
+ /* @__PURE__ */ jsx(Button, { type: "button", onClick: () => comments.chooseGrantAccess(true), children: t("documents.comments.grant.share") })
113
+ ] })
114
+ ] }) })
115
+ ] });
116
+ }
117
+ var CommentsRail_default = CommentsRail;
118
+ export {
119
+ CommentsRail,
120
+ CommentsRail_default as default,
121
+ resolveCommentsCapability2 as resolveCommentsCapability
122
+ };
123
+ //# sourceMappingURL=CommentsRail.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/CommentsRail.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport type { Editor } from '@tiptap/core'\nimport { MessageSquare } from 'lucide-react'\nimport { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { useDialogKeyHandler } from '@open-mercato/ui/hooks/useDialogKeyHandler'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { CommentAnchor } from './CommentAnchorNavigation'\nimport { CommentComposer } from './CommentComposer'\nimport { CommentThreadList } from './CommentThreadList'\nimport { resolveCommentsCapability, type DocumentTier } from './componentCapabilities'\nimport { useDocumentComments } from './useDocumentComments'\n\ntype CommentFocusRequest = { anchor: CommentAnchor; requestId: number }\nexport type { DocumentTier } from './componentCapabilities'\nexport { resolveCommentsCapability } from './componentCapabilities'\n\ntype CommentsRailProps = {\n documentId: string\n editor: Editor | null\n commentFocusRequest?: CommentFocusRequest | null\n /** Legacy compatibility; an explicit capability projection takes precedence. */\n tier?: DocumentTier\n canComment?: boolean\n canShare?: boolean\n}\n\nexport function CommentsRail({\n documentId,\n editor,\n commentFocusRequest,\n tier,\n canComment,\n canShare = false,\n}: CommentsRailProps) {\n const t = useT()\n const mayComment = resolveCommentsCapability(canComment, tier)\n const composerRef = React.useRef<HTMLFormElement | null>(null)\n const comments = useDocumentComments({ documentId, editor, canComment: mayComment, canShare })\n\n React.useEffect(() => {\n if (!commentFocusRequest || !mayComment) return\n comments.setPendingAnchor(commentFocusRequest.anchor)\n window.setTimeout(() => composerRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' }), 0)\n }, [commentFocusRequest, comments.setPendingAnchor, mayComment])\n\n const grantPromptKeyDown = useDialogKeyHandler({\n onConfirm: () => comments.chooseGrantAccess(true),\n onCancel: () => comments.chooseGrantAccess(false),\n })\n\n return (\n <>\n <section className=\"rounded-lg border border-border bg-card p-3 sm:p-4\">\n <div className=\"mb-4 flex items-center gap-2\">\n <MessageSquare className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <h2 className=\"text-sm font-semibold\">{t('documents.comments.title')}</h2>\n </div>\n <div className=\"space-y-4\">\n {comments.state.status === 'loading' ? <LoadingMessage label={t('documents.comments.loading')} /> : null}\n {comments.state.status === 'error' ? (\n <ErrorMessage\n label={comments.state.message}\n action={<Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => void comments.reload()}>{t('documents.actions.retry')}</Button>}\n />\n ) : null}\n {comments.state.status === 'ready' && comments.comments.length === 0 ? (\n <EmptyState size=\"sm\" variant=\"subtle\" title={t('documents.comments.empty')} icon={<MessageSquare className=\"size-5\" />} />\n ) : null}\n {comments.state.status === 'ready' && comments.comments.length > 0 ? (\n <CommentThreadList\n comments={comments.comments}\n canComment={mayComment}\n resolvingCommentId={comments.resolvingCommentId}\n labelFor={comments.labelFor}\n onJump={(comment) => {\n void (async () => {\n if (!editor || comment.anchor === null || comment.anchor === 'changed') {\n flash(t('documents.comments.anchor.changed'), 'info')\n return\n }\n const { jumpToCommentAnchor } = await import('./CommentAnchorNavigation')\n if (!jumpToCommentAnchor(editor, comment.anchor)) {\n flash(t('documents.comments.anchor.changed'), 'info')\n }\n })()\n }}\n onReply={comments.startReply}\n onResolve={(comment) => void comments.resolveComment(comment)}\n t={t}\n />\n ) : null}\n {mayComment ? (\n <CommentComposer\n ref={composerRef}\n documentId={documentId}\n body={comments.body}\n pendingMentions={comments.pendingMentions}\n replyToName={comments.replyToName}\n isSubmitting={comments.isSubmitting}\n onBodyChange={comments.setBody}\n onMentionsChange={comments.setPendingMentions}\n onSubmit={() => void comments.submit()}\n onCancel={comments.resetComposer}\n focusSignal={commentFocusRequest?.requestId ?? comments.parentCommentId ?? undefined}\n />\n ) : null}\n </div>\n </section>\n <Dialog open={comments.grantAccessNames !== null} onOpenChange={(open) => { if (!open) comments.chooseGrantAccess(false) }}>\n <DialogContent onKeyDown={grantPromptKeyDown}>\n <DialogHeader>\n <DialogTitle>{t('documents.comments.grant.title')}</DialogTitle>\n <DialogDescription>{t('documents.comments.grant.body', { names: comments.grantAccessNames?.join(', ') ?? '' })}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => comments.chooseGrantAccess(false)}>{t('documents.comments.grant.skip')}</Button>\n <Button type=\"button\" onClick={() => comments.chooseGrantAccess(true)}>{t('documents.comments.grant.share')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\nexport default CommentsRail\n"],
5
+ "mappings": "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",
6
+ "names": ["resolveCommentsCapability"]
7
+ }
@@ -0,0 +1,91 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { EditorContent, useEditorState } from "@tiptap/react";
5
+ import { BubbleMenu } from "@tiptap/react/menus";
6
+ import { Bold, Italic, Link2, MessageSquare, Underline } from "lucide-react";
7
+ import { Alert, AlertDescription } from "@open-mercato/ui/primitives/alert";
8
+ import { Button } from "@open-mercato/ui/primitives/button";
9
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
10
+ import { Input } from "@open-mercato/ui/primitives/input";
11
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
12
+ import { cn } from "@open-mercato/shared/lib/utils";
13
+ import { OutlinePane } from "./OutlinePane.js";
14
+ import { captureCommentAnchor } from "./CommentAnchorNavigation.js";
15
+ import { DOCUMENT_EDITOR_CONTENT_CLASS } from "./editorTypes.js";
16
+ import { DOCUMENT_PAGINATION_STYLES } from "./documentPagination.js";
17
+ const EMPTY_BUBBLE_MENU_STATE = {
18
+ bold: false,
19
+ italic: false,
20
+ underline: false,
21
+ link: false
22
+ };
23
+ function DocumentCanvas({
24
+ editor,
25
+ title,
26
+ readOnly,
27
+ outlineOpen,
28
+ notice,
29
+ onOpenLink,
30
+ onComment
31
+ }) {
32
+ const t = useT();
33
+ const editorState = useEditorState({
34
+ editor,
35
+ selector: ({ editor: current }) => current ? {
36
+ bold: current.isActive("bold"),
37
+ italic: current.isActive("italic"),
38
+ underline: current.isActive("underline"),
39
+ link: current.isActive("link")
40
+ } : EMPTY_BUBBLE_MENU_STATE
41
+ }) ?? EMPTY_BUBBLE_MENU_STATE;
42
+ const keepSelection = React.useCallback((event) => event.preventDefault(), []);
43
+ const comment = React.useCallback(() => {
44
+ if (!editor || !onComment) return;
45
+ const anchor = captureCommentAnchor(editor);
46
+ if (anchor) onComment(anchor);
47
+ }, [editor, onComment]);
48
+ const shouldShow = React.useCallback(
49
+ ({ from, to }) => from !== to && (!readOnly || Boolean(onComment)),
50
+ [onComment, readOnly]
51
+ );
52
+ return /* @__PURE__ */ jsxs("div", { className: "om-doc-canvas max-h-[calc(100dvh-var(--topbar-height,0px)-12rem)] min-h-96 overflow-auto bg-muted p-0 sm:px-4 sm:py-8 md:px-8 md:py-10", children: [
53
+ /* @__PURE__ */ jsx("style", { children: DOCUMENT_PAGINATION_STYLES }),
54
+ notice ? /* @__PURE__ */ jsx(Alert, { status: "information", style: "lighter", className: "mx-auto mb-4 max-w-3xl", children: /* @__PURE__ */ jsx(AlertDescription, { children: notice }) }) : null,
55
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-fit min-w-full flex-col gap-4 lg:flex-row lg:items-start", children: [
56
+ outlineOpen ? /* @__PURE__ */ jsx(OutlinePane, { editor }) : null,
57
+ /* @__PURE__ */ jsxs("article", { className: "om-doc-paper mx-auto flex-none bg-card sm:rounded-sm sm:shadow-lg", children: [
58
+ readOnly ? /* @__PURE__ */ jsx("h1", { className: "mb-6 text-xl font-semibold leading-tight text-foreground sm:mb-8 sm:text-3xl", children: title.value }) : /* @__PURE__ */ jsx(
59
+ Input,
60
+ {
61
+ value: title.value,
62
+ onChange: (event) => title.setValue(event.target.value),
63
+ onBlur: () => void title.commit(),
64
+ onKeyDown: title.onKeyDown,
65
+ maxLength: 512,
66
+ disabled: title.saving,
67
+ "aria-label": t("documents.editor.title.ariaLabel"),
68
+ className: "mb-6 h-auto border-0 bg-transparent px-0 py-0 text-xl font-semibold leading-tight text-foreground shadow-none focus-visible:shadow-focus sm:mb-8 sm:text-3xl"
69
+ }
70
+ ),
71
+ editor ? /* @__PURE__ */ jsxs(BubbleMenu, { editor, shouldShow, className: "z-popover flex items-center gap-1 rounded-md border border-border bg-card p-1 shadow-md", children: [
72
+ !readOnly ? /* @__PURE__ */ jsxs(Fragment, { children: [
73
+ /* @__PURE__ */ jsx(IconButton, { type: "button", size: "sm", variant: editorState.bold ? "outline" : "ghost", "aria-label": t("documents.editor.toolbar.bold"), "aria-pressed": editorState.bold, onMouseDown: keepSelection, onClick: () => editor.chain().focus().toggleBold().run(), children: /* @__PURE__ */ jsx(Bold, {}) }),
74
+ /* @__PURE__ */ jsx(IconButton, { type: "button", size: "sm", variant: editorState.italic ? "outline" : "ghost", "aria-label": t("documents.editor.toolbar.italic"), "aria-pressed": editorState.italic, onMouseDown: keepSelection, onClick: () => editor.chain().focus().toggleItalic().run(), children: /* @__PURE__ */ jsx(Italic, {}) }),
75
+ /* @__PURE__ */ jsx(IconButton, { type: "button", size: "sm", variant: editorState.underline ? "outline" : "ghost", "aria-label": t("documents.editor.toolbar.underline"), "aria-pressed": editorState.underline, onMouseDown: keepSelection, onClick: () => editor.chain().focus().toggleMark("underline").run(), children: /* @__PURE__ */ jsx(Underline, {}) }),
76
+ /* @__PURE__ */ jsx(IconButton, { type: "button", size: "sm", variant: editorState.link ? "outline" : "ghost", "aria-label": t("documents.editor.toolbar.link"), "aria-pressed": editorState.link, onMouseDown: keepSelection, onClick: onOpenLink, children: /* @__PURE__ */ jsx(Link2, {}) })
77
+ ] }) : null,
78
+ onComment ? /* @__PURE__ */ jsxs(Button, { type: "button", size: "sm", variant: "ghost", onMouseDown: keepSelection, onClick: comment, children: [
79
+ /* @__PURE__ */ jsx(MessageSquare, {}),
80
+ t("documents.editor.toolbar.comment")
81
+ ] }) : null
82
+ ] }) : null,
83
+ /* @__PURE__ */ jsx(EditorContent, { className: cn(DOCUMENT_EDITOR_CONTENT_CLASS, readOnly && "select-text"), editor })
84
+ ] })
85
+ ] })
86
+ ] });
87
+ }
88
+ export {
89
+ DocumentCanvas
90
+ };
91
+ //# sourceMappingURL=DocumentCanvas.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/DocumentCanvas.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport type { Editor } from '@tiptap/core'\nimport { EditorContent, useEditorState } from '@tiptap/react'\nimport { BubbleMenu } from '@tiptap/react/menus'\nimport { Bold, Italic, Link2, MessageSquare, Underline } from 'lucide-react'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { OutlinePane } from './OutlinePane'\nimport { captureCommentAnchor, type CommentAnchor } from './CommentAnchorNavigation'\nimport { DOCUMENT_EDITOR_CONTENT_CLASS } from './editorTypes'\nimport { DOCUMENT_PAGINATION_STYLES } from './documentPagination'\n\ntype TitleModel = {\n value: string\n setValue: (value: string) => void\n saving: boolean\n commit: () => Promise<void>\n onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void\n}\n\nconst EMPTY_BUBBLE_MENU_STATE = {\n bold: false,\n italic: false,\n underline: false,\n link: false,\n}\n\nexport function DocumentCanvas({\n editor,\n title,\n readOnly,\n outlineOpen,\n notice,\n onOpenLink,\n onComment,\n}: {\n editor: Editor | null\n title: TitleModel\n readOnly: boolean\n outlineOpen: boolean\n notice: string | null\n onOpenLink: () => void\n onComment?: (anchor: CommentAnchor) => void\n}) {\n const t = useT()\n const editorState = useEditorState({\n editor,\n selector: ({ editor: current }) => current ? {\n bold: current.isActive('bold'),\n italic: current.isActive('italic'),\n underline: current.isActive('underline'),\n link: current.isActive('link'),\n } : EMPTY_BUBBLE_MENU_STATE,\n }) ?? EMPTY_BUBBLE_MENU_STATE\n const keepSelection = React.useCallback((event: React.MouseEvent<HTMLButtonElement>) => event.preventDefault(), [])\n const comment = React.useCallback(() => {\n if (!editor || !onComment) return\n const anchor = captureCommentAnchor(editor)\n if (anchor) onComment(anchor)\n }, [editor, onComment])\n const shouldShow = React.useCallback(\n ({ from, to }: { from: number; to: number }) => from !== to && (!readOnly || Boolean(onComment)),\n [onComment, readOnly],\n )\n\n return (\n <div className=\"om-doc-canvas max-h-[calc(100dvh-var(--topbar-height,0px)-12rem)] min-h-96 overflow-auto bg-muted p-0 sm:px-4 sm:py-8 md:px-8 md:py-10\">\n <style>{DOCUMENT_PAGINATION_STYLES}</style>\n {notice ? <Alert status=\"information\" style=\"lighter\" className=\"mx-auto mb-4 max-w-3xl\"><AlertDescription>{notice}</AlertDescription></Alert> : null}\n <div className=\"mx-auto flex w-fit min-w-full flex-col gap-4 lg:flex-row lg:items-start\">\n {outlineOpen ? <OutlinePane editor={editor} /> : null}\n <article className=\"om-doc-paper mx-auto flex-none bg-card sm:rounded-sm sm:shadow-lg\">\n {readOnly ? (\n <h1 className=\"mb-6 text-xl font-semibold leading-tight text-foreground sm:mb-8 sm:text-3xl\">{title.value}</h1>\n ) : (\n <Input\n value={title.value}\n onChange={(event) => title.setValue(event.target.value)}\n onBlur={() => void title.commit()}\n onKeyDown={title.onKeyDown}\n maxLength={512}\n disabled={title.saving}\n aria-label={t('documents.editor.title.ariaLabel')}\n className=\"mb-6 h-auto border-0 bg-transparent px-0 py-0 text-xl font-semibold leading-tight text-foreground shadow-none focus-visible:shadow-focus sm:mb-8 sm:text-3xl\"\n />\n )}\n {editor ? (\n <BubbleMenu editor={editor} shouldShow={shouldShow} className=\"z-popover flex items-center gap-1 rounded-md border border-border bg-card p-1 shadow-md\">\n {!readOnly ? (\n <>\n <IconButton type=\"button\" size=\"sm\" variant={editorState.bold ? 'outline' : 'ghost'} aria-label={t('documents.editor.toolbar.bold')} aria-pressed={editorState.bold} onMouseDown={keepSelection} onClick={() => editor.chain().focus().toggleBold().run()}><Bold /></IconButton>\n <IconButton type=\"button\" size=\"sm\" variant={editorState.italic ? 'outline' : 'ghost'} aria-label={t('documents.editor.toolbar.italic')} aria-pressed={editorState.italic} onMouseDown={keepSelection} onClick={() => editor.chain().focus().toggleItalic().run()}><Italic /></IconButton>\n <IconButton type=\"button\" size=\"sm\" variant={editorState.underline ? 'outline' : 'ghost'} aria-label={t('documents.editor.toolbar.underline')} aria-pressed={editorState.underline} onMouseDown={keepSelection} onClick={() => editor.chain().focus().toggleMark('underline').run()}><Underline /></IconButton>\n <IconButton type=\"button\" size=\"sm\" variant={editorState.link ? 'outline' : 'ghost'} aria-label={t('documents.editor.toolbar.link')} aria-pressed={editorState.link} onMouseDown={keepSelection} onClick={onOpenLink}><Link2 /></IconButton>\n </>\n ) : null}\n {onComment ? <Button type=\"button\" size=\"sm\" variant=\"ghost\" onMouseDown={keepSelection} onClick={comment}><MessageSquare />{t('documents.editor.toolbar.comment')}</Button> : null}\n </BubbleMenu>\n ) : null}\n <EditorContent className={cn(DOCUMENT_EDITOR_CONTENT_CLASS, readOnly && 'select-text')} editor={editor} />\n </article>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ class DocumentEditorErrorBoundary extends React.Component {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.state = { failed: false };
7
+ this.retry = () => {
8
+ this.setState({ failed: false });
9
+ this.props.onRetry();
10
+ };
11
+ }
12
+ static getDerivedStateFromError() {
13
+ return { failed: true };
14
+ }
15
+ componentDidUpdate(previous) {
16
+ if (this.state.failed && previous.resetKey !== this.props.resetKey) {
17
+ this.setState({ failed: false });
18
+ }
19
+ }
20
+ render() {
21
+ return this.state.failed ? this.props.fallback(this.retry) : this.props.children;
22
+ }
23
+ }
24
+ export {
25
+ DocumentEditorErrorBoundary
26
+ };
27
+ //# sourceMappingURL=DocumentEditorErrorBoundary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/DocumentEditorErrorBoundary.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\n\ntype DocumentEditorErrorBoundaryProps = {\n children: React.ReactNode\n fallback: (retry: () => void) => React.ReactNode\n onRetry: () => void\n resetKey: string\n}\ntype DocumentEditorErrorBoundaryState = {\n failed: boolean\n}\n\nexport class DocumentEditorErrorBoundary extends React.Component<\n DocumentEditorErrorBoundaryProps,\n DocumentEditorErrorBoundaryState\n> {\n state: DocumentEditorErrorBoundaryState = { failed: false }\n\n static getDerivedStateFromError(): DocumentEditorErrorBoundaryState {\n return { failed: true }\n }\n\n componentDidUpdate(previous: DocumentEditorErrorBoundaryProps) {\n if (this.state.failed && previous.resetKey !== this.props.resetKey) {\n this.setState({ failed: false })\n }\n }\n\n private retry = () => {\n this.setState({ failed: false })\n this.props.onRetry()\n }\n\n render() {\n return this.state.failed ? this.props.fallback(this.retry) : this.props.children\n }\n}\n"],
5
+ "mappings": ";AAEA,YAAY,WAAW;AAYhB,MAAM,oCAAoC,MAAM,UAGrD;AAAA,EAHK;AAAA;AAIL,iBAA0C,EAAE,QAAQ,MAAM;AAY1D,SAAQ,QAAQ,MAAM;AACpB,WAAK,SAAS,EAAE,QAAQ,MAAM,CAAC;AAC/B,WAAK,MAAM,QAAQ;AAAA,IACrB;AAAA;AAAA,EAbA,OAAO,2BAA6D;AAClE,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EAEA,mBAAmB,UAA4C;AAC7D,QAAI,KAAK,MAAM,UAAU,SAAS,aAAa,KAAK,MAAM,UAAU;AAClE,WAAK,SAAS,EAAE,QAAQ,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAOA,SAAS;AACP,WAAO,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,KAAK,MAAM;AAAA,EAC1E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createElement } from "react";
4
+ import * as React from "react";
5
+ import { useRouter, useSearchParams } from "next/navigation";
6
+ import { LoadingMessage } from "@open-mercato/ui/backend/detail";
7
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
8
+ import { DocumentEditorSurface } from "./DocumentEditorSurface.js";
9
+ import { resolveEditorMode } from "./editorTypes.js";
10
+ import { useDocumentCollaboration } from "./useDocumentCollaboration.js";
11
+ function DocumentEditorIsland(props) {
12
+ const t = useT();
13
+ const router = useRouter();
14
+ const searchParams = useSearchParams();
15
+ const collaboration = useDocumentCollaboration(props.documentId);
16
+ const requestedMode = searchParams.get("mode") === "preview" ? "preview" : "edit";
17
+ const serverReadOnly = collaboration.mode === "collab" ? collaboration.serverReadOnly : collaboration.mode === "fallback" ? collaboration.readOnly : false;
18
+ const forcedReadOnly = props.readOnly || serverReadOnly;
19
+ const mode = resolveEditorMode(props.readOnly, serverReadOnly, requestedMode);
20
+ const changeMode = React.useCallback((nextMode) => {
21
+ if (forcedReadOnly) return;
22
+ const next = new URLSearchParams(searchParams.toString());
23
+ if (nextMode === "preview") next.set("mode", "preview");
24
+ else next.delete("mode");
25
+ const query = next.toString();
26
+ router.replace(query ? `?${query}` : "?", { scroll: false });
27
+ }, [forcedReadOnly, router, searchParams]);
28
+ if (collaboration.mode === "connecting") return /* @__PURE__ */ jsx(LoadingMessage, { label: t("documents.editor.loading") });
29
+ if (collaboration.mode === "fallback") {
30
+ return /* @__PURE__ */ createElement(DocumentEditorSurface, { ...props, readOnly: forcedReadOnly, key: `fallback:${props.documentId}`, transport: "fallback", connectionStatus: "offline", presenceUsers: [], mode, onModeChange: changeMode });
31
+ }
32
+ return /* @__PURE__ */ createElement(
33
+ DocumentEditorSurface,
34
+ {
35
+ ...props,
36
+ readOnly: forcedReadOnly,
37
+ key: `collab:${props.documentId}`,
38
+ transport: "collab",
39
+ collabResources: collaboration.resources,
40
+ connectionStatus: collaboration.connectionStatus,
41
+ presenceUsers: collaboration.presenceUsers,
42
+ mode,
43
+ onModeChange: changeMode
44
+ }
45
+ );
46
+ }
47
+ export {
48
+ DocumentEditorIsland as default
49
+ };
50
+ //# sourceMappingURL=DocumentEditorIsland.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/DocumentEditorIsland.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { DocumentEditorSurface } from './DocumentEditorSurface'\nimport { resolveEditorMode, type DocumentEditorIslandProps, type EditorMode } from './editorTypes'\nimport { useDocumentCollaboration } from './useDocumentCollaboration'\n\nexport default function DocumentEditorIsland(props: DocumentEditorIslandProps) {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const collaboration = useDocumentCollaboration(props.documentId)\n const requestedMode: EditorMode = searchParams.get('mode') === 'preview' ? 'preview' : 'edit'\n const serverReadOnly = collaboration.mode === 'collab'\n ? collaboration.serverReadOnly\n : collaboration.mode === 'fallback'\n ? collaboration.readOnly\n : false\n const forcedReadOnly = props.readOnly || serverReadOnly\n const mode = resolveEditorMode(props.readOnly, serverReadOnly, requestedMode)\n const changeMode = React.useCallback((nextMode: EditorMode) => {\n if (forcedReadOnly) return\n const next = new URLSearchParams(searchParams.toString())\n if (nextMode === 'preview') next.set('mode', 'preview')\n else next.delete('mode')\n const query = next.toString()\n router.replace(query ? `?${query}` : '?', { scroll: false })\n }, [forcedReadOnly, router, searchParams])\n\n if (collaboration.mode === 'connecting') return <LoadingMessage label={t('documents.editor.loading')} />\n if (collaboration.mode === 'fallback') {\n return <DocumentEditorSurface {...props} readOnly={forcedReadOnly} key={`fallback:${props.documentId}`} transport=\"fallback\" connectionStatus=\"offline\" presenceUsers={[]} mode={mode} onModeChange={changeMode} />\n }\n return (\n <DocumentEditorSurface\n {...props}\n readOnly={forcedReadOnly}\n key={`collab:${props.documentId}`}\n transport=\"collab\"\n collabResources={collaboration.resources}\n connectionStatus={collaboration.connectionStatus}\n presenceUsers={collaboration.presenceUsers}\n mode={mode}\n onModeChange={changeMode}\n />\n )\n}\n"],
5
+ "mappings": ";AAgCkD;AAEvC;AAhCX,YAAY,WAAW;AACvB,SAAS,WAAW,uBAAuB;AAC3C,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,6BAA6B;AACtC,SAAS,yBAA0E;AACnF,SAAS,gCAAgC;AAE1B,SAAR,qBAAsC,OAAkC;AAC7E,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,gBAAgB;AACrC,QAAM,gBAAgB,yBAAyB,MAAM,UAAU;AAC/D,QAAM,gBAA4B,aAAa,IAAI,MAAM,MAAM,YAAY,YAAY;AACvF,QAAM,iBAAiB,cAAc,SAAS,WAC1C,cAAc,iBACd,cAAc,SAAS,aACrB,cAAc,WACd;AACN,QAAM,iBAAiB,MAAM,YAAY;AACzC,QAAM,OAAO,kBAAkB,MAAM,UAAU,gBAAgB,aAAa;AAC5E,QAAM,aAAa,MAAM,YAAY,CAAC,aAAyB;AAC7D,QAAI,eAAgB;AACpB,UAAM,OAAO,IAAI,gBAAgB,aAAa,SAAS,CAAC;AACxD,QAAI,aAAa,UAAW,MAAK,IAAI,QAAQ,SAAS;AAAA,QACjD,MAAK,OAAO,MAAM;AACvB,UAAM,QAAQ,KAAK,SAAS;AAC5B,WAAO,QAAQ,QAAQ,IAAI,KAAK,KAAK,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,EAC7D,GAAG,CAAC,gBAAgB,QAAQ,YAAY,CAAC;AAEzC,MAAI,cAAc,SAAS,aAAc,QAAO,oBAAC,kBAAe,OAAO,EAAE,0BAA0B,GAAG;AACtG,MAAI,cAAc,SAAS,YAAY;AACrC,WAAO,8BAAC,yBAAuB,GAAG,OAAO,UAAU,gBAAgB,KAAK,YAAY,MAAM,UAAU,IAAI,WAAU,YAAW,kBAAiB,WAAU,eAAe,CAAC,GAAG,MAAY,cAAc,YAAY;AAAA,EACnN;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,UAAU;AAAA,MACV,KAAK,UAAU,MAAM,UAAU;AAAA,MAC/B,WAAU;AAAA,MACV,iBAAiB,cAAc;AAAA,MAC/B,kBAAkB,cAAc;AAAA,MAChC,eAAe,cAAc;AAAA,MAC7B;AAAA,MACA,cAAc;AAAA;AAAA,EAChB;AAEJ;",
6
+ "names": []
7
+ }