@rebasepro/admin 0.7.0 → 0.9.0

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 (350) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -20
  3. package/dist/{CollectionEditorDialog-iGgS4rLX.js → CollectionEditorDialog-B-7uW3iJ.js} +15 -15
  4. package/dist/CollectionEditorDialog-B-7uW3iJ.js.map +1 -0
  5. package/dist/{PropertyEditView-C9yhLyja.js → PropertyEditView-7KMTcrqi.js} +140 -106
  6. package/dist/PropertyEditView-7KMTcrqi.js.map +1 -0
  7. package/dist/{RouterCollectionsStudioView-Dqx27GD8.js → RouterCollectionsStudioView-epqIbZrJ.js} +4 -4
  8. package/dist/{RouterCollectionsStudioView-Dqx27GD8.js.map → RouterCollectionsStudioView-epqIbZrJ.js.map} +1 -1
  9. package/dist/collection_editor/_cms_internals.d.ts +4 -4
  10. package/dist/collection_editor/api/generateCollectionApi.d.ts +7 -6
  11. package/dist/collection_editor/extensibility_types.d.ts +3 -3
  12. package/dist/collection_editor/index.d.ts +2 -2
  13. package/dist/collection_editor/pgColumnToProperty.d.ts +3 -3
  14. package/dist/collection_editor/serializable_types.d.ts +12 -16
  15. package/dist/collection_editor/serializable_utils.d.ts +8 -8
  16. package/dist/collection_editor/types/collection_editor_controller.d.ts +5 -5
  17. package/dist/collection_editor/types/collection_inference.d.ts +2 -2
  18. package/dist/collection_editor/types/config_controller.d.ts +7 -7
  19. package/dist/collection_editor/ui/AddKanbanColumnAction.d.ts +2 -2
  20. package/dist/collection_editor/ui/CollectionViewHeaderAction.d.ts +2 -2
  21. package/dist/collection_editor/ui/KanbanSetupAction.d.ts +2 -2
  22. package/dist/collection_editor/ui/PropertyAddColumnComponent.d.ts +2 -2
  23. package/dist/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.d.ts +3 -3
  24. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +2 -2
  25. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +4 -5
  26. package/dist/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.d.ts +2 -2
  27. package/dist/collection_editor/ui/collection_editor/CollectionJsonImportDialog.d.ts +2 -2
  28. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +4 -4
  29. package/dist/collection_editor/ui/collection_editor/CollectionStudioView.d.ts +2 -2
  30. package/dist/collection_editor/ui/collection_editor/CollectionsStudioView.d.ts +2 -2
  31. package/dist/collection_editor/ui/collection_editor/EntityActionsEditTab.d.ts +2 -2
  32. package/dist/collection_editor/ui/collection_editor/GeneralSettingsForm.d.ts +2 -2
  33. package/dist/collection_editor/ui/collection_editor/GetCodeDialog.d.ts +2 -2
  34. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +4 -4
  35. package/dist/collection_editor/ui/collection_editor/SubcollectionsEditTab.d.ts +3 -3
  36. package/dist/collection_editor/ui/collection_editor/templates/blog_template.d.ts +2 -2
  37. package/dist/collection_editor/ui/collection_editor/templates/pages_template.d.ts +2 -2
  38. package/dist/collection_editor/ui/collection_editor/templates/products_template.d.ts +2 -2
  39. package/dist/collection_editor/ui/collection_editor/templates/users_template.d.ts +2 -2
  40. package/dist/collection_editor/useLocalCollectionsConfigController.d.ts +2 -2
  41. package/dist/collection_editor/validateCollectionJson.d.ts +2 -2
  42. package/dist/collection_editor_ui.js +4 -4
  43. package/dist/components/CollectionPanel.d.ts +4 -4
  44. package/dist/components/{EntityCollectionTable/EntityCollectionRowActions.d.ts → CollectionTableBinding/CollectionRowActions.d.ts} +3 -3
  45. package/dist/components/CollectionTableBinding/CollectionTableBinding.d.ts +28 -0
  46. package/dist/components/{EntityCollectionTable/EntityCollectionTableProps.d.ts → CollectionTableBinding/CollectionTableBindingProps.d.ts} +1 -1
  47. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.d.ts +2 -2
  48. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.d.ts +2 -2
  49. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.d.ts +2 -2
  50. package/dist/components/CollectionTableBinding/index.d.ts +6 -0
  51. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.d.ts +2 -2
  52. package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.d.ts +2 -2
  53. package/dist/components/{EntityCollectionView/EntityBoardCard.d.ts → CollectionViewBinding/BoardCardBinding.d.ts} +8 -8
  54. package/dist/components/{EntityCollectionView/EntityCollectionBoardView.d.ts → CollectionViewBinding/CollectionBoardViewBinding.d.ts} +4 -4
  55. package/dist/components/{EntityCollectionView/EntityCollectionCardView.d.ts → CollectionViewBinding/CollectionCardViewBinding.d.ts} +5 -5
  56. package/dist/components/{EntityCollectionView/EntityCollectionListView.d.ts → CollectionViewBinding/CollectionListViewBinding.d.ts} +4 -4
  57. package/dist/components/{EntityCollectionView/EntityCollectionViewActions.d.ts → CollectionViewBinding/CollectionViewActions.d.ts} +4 -4
  58. package/dist/components/{EntityCollectionView/EntityCollectionView.d.ts → CollectionViewBinding/CollectionViewBinding.d.ts} +4 -4
  59. package/dist/components/{EntityCollectionView/EntityCollectionViewStartActions.d.ts → CollectionViewBinding/CollectionViewStartActions.d.ts} +4 -4
  60. package/dist/components/CollectionViewBinding/EntityCardBinding.d.ts +21 -0
  61. package/dist/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.d.ts +3 -3
  62. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.d.ts +2 -2
  63. package/dist/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.d.ts +2 -2
  64. package/dist/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.d.ts +2 -2
  65. package/dist/components/{EntityCollectionView/useEntityPreviewSlots.d.ts → CollectionViewBinding/usePreviewSlots.d.ts} +5 -5
  66. package/dist/components/DeleteEntityDialog.d.ts +4 -4
  67. package/dist/components/{EntityDetailView.d.ts → DetailViewBinding.d.ts} +5 -5
  68. package/dist/components/EditFormActions.d.ts +3 -0
  69. package/dist/components/{EntityEditView.d.ts → EditViewBinding.d.ts} +9 -9
  70. package/dist/components/{EntityPreview.d.ts → EntityPreviewBinding.d.ts} +13 -13
  71. package/dist/components/EntityViewBinding.d.ts +13 -0
  72. package/dist/components/{EntityJsonPreview.d.ts → JsonPreviewBinding.d.ts} +1 -1
  73. package/dist/components/RebaseCMS.d.ts +1 -1
  74. package/dist/components/RebaseNavigation.d.ts +1 -1
  75. package/dist/components/ReferenceTable/{EntitySelectionTable.d.ts → SelectionTableBinding.d.ts} +5 -5
  76. package/dist/components/SelectableTable/SelectableTable.d.ts +5 -5
  77. package/dist/components/SelectableTable/SelectableTableContext.d.ts +3 -3
  78. package/dist/components/SelectableTable/SelectionStore.d.ts +13 -22
  79. package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +6 -1
  80. package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +7 -1
  81. package/dist/components/SelectableTable/filters/FilterFieldBinding.d.ts +40 -0
  82. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +7 -1
  83. package/dist/components/SelectableTable/filters/RelationFilterField.d.ts +7 -1
  84. package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +7 -1
  85. package/dist/components/SideDialogs.d.ts +1 -1
  86. package/dist/components/SidePanelBinding.d.ts +11 -0
  87. package/dist/components/{SideEntityProvider.d.ts → SidePanelProvider.d.ts} +7 -7
  88. package/dist/components/field_configs.d.ts +1 -1
  89. package/dist/components/history/EntityHistoryEntry.d.ts +2 -2
  90. package/dist/components/history/LastEditedByIndicator.d.ts +2 -2
  91. package/dist/components/index.d.ts +14 -13
  92. package/dist/contexts/SidePanelControllerContext.d.ts +3 -0
  93. package/dist/data_export/export/ExportCollectionAction.d.ts +3 -3
  94. package/dist/data_import/components/ImportSaveInProgress.d.ts +2 -2
  95. package/dist/editor/editor.d.ts +0 -6
  96. package/dist/editor.js +1 -3
  97. package/dist/editor.js.map +1 -1
  98. package/dist/form/EntityForm.d.ts +1 -1
  99. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  100. package/dist/form/components/StorageUploadProgress.d.ts +6 -1
  101. package/dist/form/form_utils.d.ts +2 -2
  102. package/dist/form/index.d.ts +0 -1
  103. package/dist/{history-ChHgyyvM.js → history-7X5bON_n.js} +4 -4
  104. package/dist/history-7X5bON_n.js.map +1 -0
  105. package/dist/hooks/index.d.ts +4 -4
  106. package/dist/hooks/navigation/contexts/CollectionRegistryContext.d.ts +2 -2
  107. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +5 -5
  108. package/dist/hooks/navigation/useNavigationResolution.d.ts +4 -4
  109. package/dist/hooks/navigation/useResolvedCollections.d.ts +7 -7
  110. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +2 -2
  111. package/dist/hooks/navigation/utils.d.ts +5 -5
  112. package/dist/hooks/useBuildSidePanel.d.ts +6 -0
  113. package/dist/hooks/useCMSContext.d.ts +2 -2
  114. package/dist/hooks/{useEntityHistory.d.ts → useHistory.d.ts} +1 -1
  115. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  116. package/dist/hooks/{useEntitySelectionDialog.d.ts → useSelectionDialog.d.ts} +2 -2
  117. package/dist/hooks/useSideDialogsController.d.ts +1 -1
  118. package/dist/hooks/useSidePanel.d.ts +11 -0
  119. package/dist/index.d.ts +3 -3
  120. package/dist/index.js +2 -2
  121. package/dist/preview/components/StorageThumbnail.d.ts +3 -1
  122. package/dist/{src-DOX2nOyh.js → src-sUZfe29F.js} +904 -1096
  123. package/dist/src-sUZfe29F.js.map +1 -0
  124. package/dist/types/components/EntityFormActionsProps.d.ts +2 -2
  125. package/dist/types/components/EntityFormProps.d.ts +3 -3
  126. package/dist/types/components/PropertyPreviewProps.d.ts +2 -1
  127. package/dist/types/fields.d.ts +6 -8
  128. package/dist/util/dataControllerAdapter.d.ts +2 -5
  129. package/dist/util/navigation_utils.d.ts +6 -6
  130. package/dist/util/previews.d.ts +3 -3
  131. package/dist/util/property_utils.d.ts +2 -2
  132. package/dist/util/{entity_view_constants.d.ts → view_constants.d.ts} +1 -1
  133. package/package.json +18 -18
  134. package/src/collection_editor/ConfigControllerProvider.tsx +10 -10
  135. package/src/collection_editor/_cms_internals.ts +4 -4
  136. package/src/collection_editor/api/generateCollectionApi.ts +7 -6
  137. package/src/collection_editor/extensibility_types.ts +3 -3
  138. package/src/collection_editor/index.ts +3 -3
  139. package/src/collection_editor/pgColumnToProperty.ts +4 -4
  140. package/src/collection_editor/serializable_types.ts +22 -35
  141. package/src/collection_editor/serializable_utils.ts +40 -52
  142. package/src/collection_editor/types/collection_editor_controller.tsx +5 -5
  143. package/src/collection_editor/types/collection_inference.ts +2 -2
  144. package/src/collection_editor/types/config_controller.tsx +7 -7
  145. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +2 -2
  146. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +2 -2
  147. package/src/collection_editor/ui/EditorCollectionAction.tsx +2 -2
  148. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +2 -2
  149. package/src/collection_editor/ui/EditorEntityAction.tsx +2 -2
  150. package/src/collection_editor/ui/KanbanSetupAction.tsx +2 -2
  151. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +2 -2
  152. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +5 -5
  153. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -3
  154. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +63 -46
  155. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +3 -3
  156. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +2 -2
  157. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +8 -8
  158. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +2 -2
  159. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +2 -2
  160. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +2 -2
  161. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +2 -2
  162. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -2
  163. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +3 -3
  164. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +5 -5
  165. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +4 -4
  166. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +2 -2
  167. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +7 -16
  168. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +45 -36
  169. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +1 -1
  170. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +5 -5
  171. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +3 -3
  172. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +2 -2
  173. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +2 -2
  174. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +35 -1
  175. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +3 -3
  176. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +2 -2
  177. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +2 -2
  178. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +2 -2
  179. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -1
  180. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +7 -29
  181. package/src/collection_editor/useJsonCollectionsConfigController.tsx +14 -14
  182. package/src/collection_editor/useLocalCollectionsConfigController.tsx +4 -4
  183. package/src/collection_editor/validateCollectionJson.ts +3 -3
  184. package/src/components/CollectionPanel.tsx +14 -17
  185. package/src/components/{EntityCollectionTable/EntityCollectionRowActions.tsx → CollectionTableBinding/CollectionRowActions.tsx} +6 -6
  186. package/src/components/{EntityCollectionTable/EntityCollectionTable.tsx → CollectionTableBinding/CollectionTableBinding.tsx} +19 -17
  187. package/src/components/{EntityCollectionTable/EntityCollectionTableProps.tsx → CollectionTableBinding/CollectionTableBindingProps.tsx} +1 -1
  188. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableMultipleRelationField.tsx +7 -6
  189. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableReferenceField.tsx +10 -10
  190. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationField.tsx +7 -6
  191. package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.tsx +23 -20
  192. package/src/components/CollectionTableBinding/index.tsx +14 -0
  193. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/common.tsx +2 -2
  194. package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/PopupFormField.tsx +2 -2
  195. package/src/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.tsx +24 -44
  196. package/src/components/{EntityCollectionView/EntityBoardCard.tsx → CollectionViewBinding/BoardCardBinding.tsx} +15 -15
  197. package/src/components/{EntityCollectionView/EntityCollectionBoardView.tsx → CollectionViewBinding/CollectionBoardViewBinding.tsx} +15 -14
  198. package/src/components/{EntityCollectionView/EntityCollectionCardView.tsx → CollectionViewBinding/CollectionCardViewBinding.tsx} +8 -8
  199. package/src/components/{EntityCollectionView/EntityCollectionListView.tsx → CollectionViewBinding/CollectionListViewBinding.tsx} +24 -13
  200. package/src/components/{EntityCollectionView/EntityCollectionViewActions.tsx → CollectionViewBinding/CollectionViewActions.tsx} +5 -5
  201. package/src/components/{EntityCollectionView/EntityCollectionView.tsx → CollectionViewBinding/CollectionViewBinding.tsx} +112 -114
  202. package/src/components/{EntityCollectionView/EntityCollectionViewStartActions.tsx → CollectionViewBinding/CollectionViewStartActions.tsx} +5 -5
  203. package/src/components/{EntityCollectionView/EntityCard.tsx → CollectionViewBinding/EntityCardBinding.tsx} +9 -9
  204. package/src/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.tsx +31 -72
  205. package/src/components/{EntityCollectionView → CollectionViewBinding}/SplitListView.tsx +9 -9
  206. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useCollectionInlineEditor.ts +6 -6
  207. package/src/components/{EntityCollectionView → CollectionViewBinding}/hooks/useKanbanDragAndDrop.ts +4 -4
  208. package/src/components/{EntityCollectionView → CollectionViewBinding}/useBoardDataController.tsx +28 -50
  209. package/src/components/{EntityCollectionView/useEntityPreviewSlots.ts → CollectionViewBinding/usePreviewSlots.ts} +11 -11
  210. package/src/components/DefaultDrawer.tsx +1 -1
  211. package/src/components/DeleteEntityDialog.tsx +6 -6
  212. package/src/components/{EntityDetailView.tsx → DetailViewBinding.tsx} +28 -31
  213. package/src/components/{EntityEditViewFormActions.tsx → EditFormActions.tsx} +15 -15
  214. package/src/components/{EntityEditView.tsx → EditViewBinding.tsx} +31 -34
  215. package/src/components/{EntityPreview.tsx → EntityPreviewBinding.tsx} +27 -27
  216. package/src/components/{EntityView.tsx → EntityViewBinding.tsx} +5 -5
  217. package/src/components/HomePage/ContentHomePage.tsx +1 -1
  218. package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
  219. package/src/components/{EntityJsonPreview.tsx → JsonPreviewBinding.tsx} +1 -1
  220. package/src/components/RebaseCMS.tsx +4 -4
  221. package/src/components/RebaseNavigation.tsx +20 -10
  222. package/src/components/ReferenceTable/{EntitySelectionTable.tsx → SelectionTableBinding.tsx} +22 -19
  223. package/src/components/ReferenceWidget.tsx +4 -4
  224. package/src/components/RelationSelector.tsx +16 -14
  225. package/src/components/SelectableTable/SelectableTable.tsx +44 -89
  226. package/src/components/SelectableTable/SelectableTableContext.tsx +3 -3
  227. package/src/components/SelectableTable/SelectionStore.ts +22 -52
  228. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +9 -1
  229. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +33 -12
  230. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +187 -0
  231. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +21 -7
  232. package/src/components/SelectableTable/filters/RelationFilterField.tsx +17 -3
  233. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +66 -12
  234. package/src/components/SideDialogs.tsx +3 -3
  235. package/src/components/{EntitySidePanel.tsx → SidePanelBinding.tsx} +19 -19
  236. package/src/components/{SideEntityProvider.tsx → SidePanelProvider.tsx} +16 -16
  237. package/src/components/common/default_entity_actions.tsx +24 -13
  238. package/src/components/field_configs.tsx +0 -14
  239. package/src/components/history/EntityHistoryEntry.tsx +2 -2
  240. package/src/components/history/EntityHistoryView.tsx +3 -3
  241. package/src/components/history/LastEditedByIndicator.tsx +2 -2
  242. package/src/components/index.ts +15 -14
  243. package/src/contexts/SidePanelControllerContext.tsx +5 -0
  244. package/src/data_export/export/ExportCollectionAction.tsx +4 -4
  245. package/src/data_import/components/ImportSaveInProgress.tsx +3 -3
  246. package/src/data_import/import/ImportCollectionAction.tsx +4 -4
  247. package/src/data_import/utils/data.ts +2 -2
  248. package/src/editor/editor.tsx +4 -7
  249. package/src/form/EntityForm.tsx +2 -2
  250. package/src/form/EntityFormActions.tsx +4 -4
  251. package/src/form/EntityFormBinding.tsx +7 -7
  252. package/src/form/PropertyFieldBinding.tsx +4 -4
  253. package/src/form/components/StorageUploadProgress.tsx +9 -2
  254. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -4
  255. package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -19
  256. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +12 -1
  257. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +6 -6
  258. package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -5
  259. package/src/form/field_bindings/RelationFieldBinding.tsx +8 -10
  260. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +19 -15
  261. package/src/form/form_utils.ts +2 -2
  262. package/src/form/index.tsx +0 -1
  263. package/src/hooks/index.ts +4 -4
  264. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +2 -2
  265. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +11 -11
  266. package/src/hooks/navigation/useBuildNavigationStateController.tsx +5 -5
  267. package/src/hooks/navigation/useNavigationResolution.ts +10 -10
  268. package/src/hooks/navigation/useResolvedCollections.ts +8 -8
  269. package/src/hooks/navigation/useTopLevelNavigation.ts +2 -2
  270. package/src/hooks/navigation/utils.ts +5 -5
  271. package/src/hooks/{useBuildSideEntityController.tsx → useBuildSidePanel.tsx} +28 -28
  272. package/src/hooks/useCMSContext.tsx +6 -6
  273. package/src/hooks/{useEntityHistory.ts → useHistory.ts} +1 -1
  274. package/src/hooks/useResolvedNavigationFrom.tsx +8 -5
  275. package/src/hooks/{useEntitySelectionDialog.tsx → useSelectionDialog.tsx} +7 -7
  276. package/src/hooks/useSideDialogsController.tsx +1 -1
  277. package/src/hooks/useSidePanel.tsx +13 -0
  278. package/src/index.ts +13 -13
  279. package/src/preview/PropertyPreview.tsx +1 -16
  280. package/src/preview/components/ReferencePreview.tsx +10 -10
  281. package/src/preview/components/RelationPreview.tsx +13 -12
  282. package/src/preview/components/StorageThumbnail.tsx +24 -7
  283. package/src/routes/RebaseRoute.tsx +10 -10
  284. package/src/types/components/EntityFormActionsProps.tsx +2 -2
  285. package/src/types/components/EntityFormProps.tsx +3 -3
  286. package/src/types/components/PropertyPreviewProps.tsx +1 -1
  287. package/src/types/fields.tsx +4 -9
  288. package/src/util/dataControllerAdapter.ts +9 -15
  289. package/src/util/navigation_utils.ts +7 -7
  290. package/src/util/previews.ts +23 -3
  291. package/src/util/propertyConfigMapper.ts +3 -3
  292. package/src/util/property_utils.tsx +2 -3
  293. package/src/util/{entity_view_constants.ts → view_constants.ts} +1 -1
  294. package/dist/CollectionEditorDialog-iGgS4rLX.js.map +0 -1
  295. package/dist/PropertyEditView-C9yhLyja.js.map +0 -1
  296. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +0 -28
  297. package/dist/components/EntityCollectionTable/fields/VirtualTableDateField.d.ts +0 -12
  298. package/dist/components/EntityCollectionTable/fields/VirtualTableInput.d.ts +0 -10
  299. package/dist/components/EntityCollectionTable/fields/VirtualTableNumberInput.d.ts +0 -9
  300. package/dist/components/EntityCollectionTable/fields/VirtualTableSwitch.d.ts +0 -8
  301. package/dist/components/EntityCollectionTable/index.d.ts +0 -6
  302. package/dist/components/EntityCollectionView/EntityCard.d.ts +0 -21
  303. package/dist/components/EntityEditViewFormActions.d.ts +0 -3
  304. package/dist/components/EntitySidePanel.d.ts +0 -11
  305. package/dist/components/EntityView.d.ts +0 -13
  306. package/dist/contexts/SideEntityControllerContext.d.ts +0 -3
  307. package/dist/form/field_bindings/ReferenceAsStringFieldBinding.d.ts +0 -11
  308. package/dist/history-ChHgyyvM.js.map +0 -1
  309. package/dist/hooks/useBuildSideEntityController.d.ts +0 -6
  310. package/dist/hooks/useSideEntityController.d.ts +0 -11
  311. package/dist/src-DOX2nOyh.js.map +0 -1
  312. package/src/components/EntityCollectionTable/fields/VirtualTableDateField.tsx +0 -39
  313. package/src/components/EntityCollectionTable/fields/VirtualTableInput.tsx +0 -90
  314. package/src/components/EntityCollectionTable/fields/VirtualTableNumberInput.tsx +0 -83
  315. package/src/components/EntityCollectionTable/fields/VirtualTableSwitch.tsx +0 -32
  316. package/src/components/EntityCollectionTable/index.tsx +0 -14
  317. package/src/contexts/SideEntityControllerContext.tsx +0 -5
  318. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +0 -141
  319. package/src/hooks/useSideEntityController.tsx +0 -13
  320. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.d.ts +0 -0
  321. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.d.ts +0 -0
  322. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.d.ts +0 -0
  323. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableStorageUpload.d.ts +0 -0
  324. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.d.ts +0 -0
  325. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.d.ts +0 -0
  326. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.d.ts +0 -0
  327. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.d.ts +0 -0
  328. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.d.ts +0 -0
  329. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.d.ts +0 -0
  330. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.d.ts +0 -0
  331. /package/dist/components/{EntityCollectionTable → CollectionTableBinding}/table_bindings.d.ts +0 -0
  332. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.d.ts +0 -0
  333. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/FiltersDialog.d.ts +0 -0
  334. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.d.ts +0 -0
  335. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.d.ts +0 -0
  336. /package/dist/components/{EntityCollectionView → CollectionViewBinding}/utils.d.ts +0 -0
  337. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/PropertyTableCell.tsx +0 -0
  338. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/column_utils.tsx +0 -0
  339. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/TableRelationSelectorField.tsx +0 -0
  340. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableSelect.tsx +0 -0
  341. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/fields/VirtualTableUserSelect.tsx +0 -0
  342. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/CollectionTableToolbar.tsx +0 -0
  343. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCell.tsx +0 -0
  344. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/EntityTableCellActions.tsx +0 -0
  345. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useDraggable.tsx +0 -0
  346. /package/src/components/{EntityCollectionTable → CollectionTableBinding}/internal/popup_field/useWindowSize.tsx +0 -0
  347. /package/src/components/{EntityCollectionView → CollectionViewBinding}/FilterPresetsButton.tsx +0 -0
  348. /package/src/components/{EntityCollectionView → CollectionViewBinding}/ViewModeToggle.tsx +0 -0
  349. /package/src/components/{EntityCollectionView → CollectionViewBinding}/useSelectionController.tsx +0 -0
  350. /package/src/components/{EntityCollectionView → CollectionViewBinding}/utils.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","names":[],"sources":["../src/editor/hooks/useProseMirrorContext.ts","../src/editor/components/editor-bubble.tsx","../src/editor/components/editor-bubble-item.tsx","../src/editor/plugins/slashCommandPlugin.ts","../src/editor/extensions/Image.ts","../src/editor/extensions/TextLoadingDecorationExtension.tsx","../src/editor/components/SlashCommandMenu.tsx","../src/editor/components/image-bubble.tsx","../src/editor/components/table-bubble.tsx","../src/editor/utils/prosemirror-utils.ts","../src/editor/selectors/node-selector.tsx","../src/editor/selectors/link-selector.tsx","../src/editor/selectors/text-buttons.tsx","../src/editor/utils/remove_classes.ts","../src/editor/extensions/clipboard.ts","../src/editor/extensions/drag-and-drop.tsx","../src/editor/extensions/HighlightDecorationExtension.ts","../src/editor/plugins/inputrules.ts","../src/editor/plugins/placeholderPlugin.ts","../src/editor/plugins/index.ts","../src/editor/nodeViews/ReactNodeView.tsx","../src/editor/nodeViews/TaskItemComponent.tsx","../src/editor/nodeViews/ImageComponent.tsx","../src/editor/nodeViews/index.ts","../src/editor/hooks/useProseMirror.ts","../src/editor/editor.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { EditorState } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\n\nexport interface ProseMirrorContextType {\n state: EditorState | null;\n view: EditorView | null;\n}\n\nexport const ProseMirrorContext = createContext<ProseMirrorContextType>({\n state: null,\n view: null\n});\n\nexport const useProseMirrorContext = () => useContext(ProseMirrorContext);\n","import { forwardRef, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n type VirtualElement,\n type Placement\n} from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\n\nexport interface EditorBubbleProps {\n children: ReactNode;\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({\n children,\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!view || !state) return;\n\n // Delay evaluation slightly to let selection settle\n const timer = setTimeout(() => {\n const { selection } = state;\n const { empty } = selection;\n\n // check if image is selected\n let isImage = false;\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.type.name === \"image\") isImage = true;\n });\n\n if (isImage || empty || selection instanceof NodeSelection) {\n setShow(false);\n return;\n }\n\n setShow(true);\n }, 0);\n\n return () => clearTimeout(timer);\n }, [view, state]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n\n // Fallback for end selection coords\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n left,\n right,\n bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n\n // Recompute coords in case of scroll\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore error if selection is out of bounds\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n if (!show) return null;\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{\n position: \"fixed\",\n zIndex: 9999,\n visibility: \"hidden\"\n }}\n onMouseDown={(e) => {\n e.preventDefault(); // Don't lose focus inside ProseMirror\n }}\n >\n {children}\n </div>\n );\n }\n);\n\nEditorBubble.displayName = \"EditorBubble\";\n\nexport default EditorBubble;\n","import { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from \"react\";\nimport { Slot } from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\n\ninterface EditorBubbleItemProps {\n children: ReactNode;\n asChild?: boolean;\n onSelect?: () => void;\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { view } = useProseMirrorContext();\n const Comp = asChild ? Slot : \"div\";\n\n if (!view) return null;\n\n return (\n <Comp ref={ref} {...rest} onMouseDown={(e: React.MouseEvent) => {\n // Prevent default to avoid losing focus\n e.preventDefault();\n }} onClick={() => onSelect?.()}>\n {children}\n </Comp>\n );\n});\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\";\n\nexport default EditorBubbleItem;\n","import { Plugin, PluginKey, TextSelection } from \"prosemirror-state\";\n\nexport const SlashCommandPluginKey = new PluginKey(\"slash-command\");\n\nexport interface SlashCommandState {\n active: boolean;\n range?: { from: number; to: number };\n query?: string;\n dismissed?: boolean;\n}\n\nexport function slashCommandPlugin() {\n return new Plugin({\n key: SlashCommandPluginKey,\n state: {\n init(): SlashCommandState {\n return { active: false };\n },\n apply(tr, value, oldState, newState): SlashCommandState {\n const meta = tr.getMeta(SlashCommandPluginKey);\n if (meta !== undefined) {\n return meta;\n }\n\n const { selection } = newState;\n if (!(selection instanceof TextSelection) || !selection.empty) {\n return { active: false };\n }\n\n // Make sure we are in a paragraph or heading block, not a code_block for example\n const $anchor = selection.$anchor;\n if ($anchor.parent.type.name === \"code_block\") {\n return { active: false };\n }\n\n const textBefore = $anchor.parent.textBetween(\n Math.max(0, $anchor.parentOffset - 20),\n $anchor.parentOffset,\n undefined,\n \"\\ufffc\"\n );\n const match = textBefore.match(/(?:\\s|^)(\\/)([a-zA-Z0-9]*)$/);\n\n if (!match) {\n return { active: false };\n }\n\n // If the user previously dismissed this slash command, keep it dismissed\n if (value.dismissed) {\n return { active: false,\ndismissed: true };\n }\n\n // match[1] is the slash, match[2] is the query\n const query = match[2];\n const from = $anchor.pos - query.length - 1;\n const to = $anchor.pos;\n return { active: true,\nrange: { from,\nto },\nquery };\n }\n }\n });\n}\n","import { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"prosemirror-view\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\nexport async function onFileRead(view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n const { schema } = view.state;\n\n const state = view.state as typeof view.state & { plugins: Plugin[] };\n const plugin = state.plugins.find((p: Plugin) => p.spec.key === ImagePluginKey);\n if (!plugin) {\n console.error(\"Image plugin not found\");\n return;\n }\n\n const decoId = Math.random().toString(36).substring(7);\n const placeholder = document.createElement(\"div\");\n const imageElement = document.createElement(\"img\");\n imageElement.setAttribute(\"class\", \"opacity-40 rounded-lg border \" + defaultBorderMixin);\n imageElement.src = readerEvent.target?.result as string;\n placeholder.appendChild(imageElement);\n\n const deco = Decoration.widget(pos, placeholder, { id: decoId });\n let decorationSet = plugin.getState(view.state);\n decorationSet = decorationSet?.add(view.state.doc, [deco]);\n view.dispatch(view.state.tr.setMeta(plugin, { decorationSet }));\n\n // Image Upload Logic\n const src = await upload(image);\n console.debug(\"Uploaded image\", src);\n\n const replacePlaceholder = () => {\n // Retrieve the LATEST state after the async upload\n let currentDecos = plugin.getState(view.state) as DecorationSet;\n const foundDecos = currentDecos.find(undefined, undefined, spec => spec.id === decoId);\n\n if (foundDecos.length === 0) {\n console.warn(\"Image placeholder removed before upload completed.\");\n return;\n }\n\n // Get the mapped position of the decoration\n const currentPos = foundDecos[0].from;\n\n // Replace placeholder with actual image at the correct mapped position\n const imageNode = view.state.schema.nodes.image.create({ src });\n const tr = view.state.tr.replaceWith(currentPos, currentPos, imageNode);\n\n // Remove placeholder decoration using the LATEST decorationSet\n currentDecos = currentDecos.remove(foundDecos);\n tr.setMeta(plugin, { decorationSet: currentDecos });\n view.dispatch(tr);\n };\n\n // Preload the image so it doesn't cause a layout shift when replacing the placeholder\n const preloader = new Image();\n preloader.src = src;\n preloader.onload = replacePlaceholder;\n preloader.onerror = replacePlaceholder;\n}\n\nexport const ImagePluginKey = new PluginKey(\"imagePlugin\");\n\nexport const createDropImagePlugin = (upload: UploadFn): Plugin => {\n const plugin: Plugin = new Plugin({\n key: ImagePluginKey,\n state: {\n // Initialize the plugin state with an empty DecorationSet\n init: () => DecorationSet.empty,\n // Apply transactions to update the state\n apply: (tr, old) => {\n // Handle custom transaction steps that update decorations\n const meta = tr.getMeta(plugin);\n if (meta && meta.decorationSet) {\n return meta.decorationSet;\n }\n // Map decorations to the new document structure\n return old.map(tr.mapping, tr.doc);\n }\n },\n props: {\n handleDOMEvents: {\n dragover: (view: EditorView, event: DragEvent) => {\n if (event.dataTransfer?.types?.includes(\"Files\")) {\n event.preventDefault();\n return true;\n }\n return false;\n },\n drop: (view: EditorView, event: DragEvent) => {\n if (!event.dataTransfer?.files || event.dataTransfer?.files.length === 0) {\n return false;\n }\n event.preventDefault();\n\n const files = Array.from(event.dataTransfer.files);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.debug(\"No images found in dropped files\");\n return false;\n }\n\n images.forEach(image => {\n const position = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n return true;\n }\n },\n handlePaste(view: EditorView, event: ClipboardEvent) {\n const html = event.clipboardData?.getData(\"text/html\");\n if (html && html.includes(\"<img\")) {\n // Let ProseMirror handle the HTML paste natively (e.g. copy-pasted from the editor itself or a webpage)\n return false;\n }\n\n const items = Array.from(event.clipboardData?.items || []);\n const pos = view.state.selection.from;\n let anyImageFound = false;\n\n items\n .filter((item) => item.type.startsWith(\"image/\"))\n .forEach((item) => {\n const image = item.getAsFile();\n if (image) {\n anyImageFound = true;\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n }\n });\n\n return plugin;\n};\n\n\n","import { Plugin, PluginKey, Transaction, EditorState } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\n\n// Define and export the plugin key\nexport const loadingDecorationKey = new PluginKey<LoadingDecorationState>(\"loadingDecoration\");\n\ninterface LoadingDecorationState {\n decorationSet: DecorationSet;\n hasDecoration: boolean;\n}\n\nexport const textLoadingCommands = {\n toggleLoadingDecoration: (state: EditorState, dispatch: ((tr: Transaction) => void) | undefined, loadingHtml?: string): boolean => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(loadingDecorationKey, {\n pos,\n type: \"loadingDecoration\",\n remove: false,\n loadingHtml\n });\n\n dispatch(tr);\n return true;\n },\n\n removeLoadingDecoration: (state: EditorState, dispatch: ((tr: Transaction) => void) | undefined): boolean => {\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(loadingDecorationKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"loadingDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n};\n\n/**\n * This plugin is used to display streaming content from an LLM.\n */\nexport const textLoadingDecorationPlugin = () => {\n return new Plugin<LoadingDecorationState>({\n key: loadingDecorationKey,\n\n state: {\n init() {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n },\n\n apply(tr, oldState) {\n const action = tr.getMeta(loadingDecorationKey);\n\n if (action?.type === \"loadingDecoration\") {\n const { pos, remove, loadingHtml } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n }\n\n const decoration = Decoration.widget(pos, () => {\n const container = document.createElement(\"span\");\n container.className = \"loading-decoration\";\n\n // Sanitize and append HTML\n if (loadingHtml) {\n container.innerHTML = loadingHtml;\n } else {\n const span = document.createElement(\"span\");\n span.innerText = \"loading...\";\n container.appendChild(span);\n }\n\n return container;\n });\n\n return {\n decorationSet: DecorationSet.empty.add(tr.doc, [decoration]),\n hasDecoration: true\n };\n }\n\n return {\n decorationSet: oldState.decorationSet.map(tr.mapping, tr.doc),\n hasDecoration: oldState.hasDecoration\n };\n }\n },\n\n props: {\n decorations(state) {\n return this.getState(state)?.decorationSet || DecorationSet.empty;\n }\n }\n });\n};\n","\nimport React, { useEffect, useRef, useState, ReactNode } from \"react\";\nimport { Fragment, DOMParser } from \"prosemirror-model\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift, type VirtualElement } from \"@floating-ui/dom\";\nimport { SlashCommandPluginKey } from \"../plugins/slashCommandPlugin\";\nimport {\n CheckSquareIcon,\n cls,\n CodeIcon,\n defaultBorderMixin,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n iconSize,\n ImageIcon,\n ListIcon,\n ListOrderedIcon,\n QuoteIcon,\n TableIcon,\n TypeIcon,\n Wand2Icon\n} from \"@rebasepro/ui\";\nimport { setBlockType, wrapIn } from \"prosemirror-commands\";\nimport { wrapInList } from \"prosemirror-schema-list\";\nimport { schema } from \"../schema\";\nimport { EditorView } from \"prosemirror-view\";\nimport { TextSelection } from \"prosemirror-state\";\nimport type { EditorAIController } from \"../types\";\nimport { onFileRead, UploadFn } from \"../extensions/Image\";\nimport { textLoadingCommands } from \"../extensions/TextLoadingDecorationExtension\";\nimport { parser } from \"../markdown\";\n\ninterface SuggestionItem {\n title: string;\n description: string;\n icon: ReactNode;\n searchTerms?: string[];\n command: (\n view: EditorView,\n range: { from: number; to: number },\n upload: UploadFn,\n aiController?: EditorAIController,\n setSubView?: (viewId: string | null) => void\n ) => void;\n}\n\nconst suggestionItems: SuggestionItem[] = [\n {\n title: \"Text\",\n description: \"Just start typing with plain text.\",\n searchTerms: [\"p\", \"paragraph\"],\n icon: <TypeIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);\n }\n },\n {\n title: \"To-do List\",\n description: \"Track tasks with a to-do list.\",\n searchTerms: [\"todo\", \"task\", \"list\", \"check\", \"checkbox\"],\n icon: <CheckSquareIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.task_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 1\",\n description: \"Big section heading.\",\n searchTerms: [\"title\", \"big\", \"large\"],\n icon: <Heading1Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 1 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 2\",\n description: \"Medium section heading.\",\n searchTerms: [\"subtitle\", \"medium\"],\n icon: <Heading2Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 2 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 3\",\n description: \"Small section heading.\",\n searchTerms: [\"subtitle\", \"small\"],\n icon: <Heading3Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 3 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Bullet List\",\n description: \"Create a simple bullet list.\",\n searchTerms: [\"unordered\", \"point\"],\n icon: <ListIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.bullet_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Numbered List\",\n description: \"Create a list with numbering.\",\n searchTerms: [\"ordered\"],\n icon: <ListOrderedIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.ordered_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Quote\",\n description: \"Capture a quote.\",\n searchTerms: [\"blockquote\"],\n icon: <QuoteIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapIn(schema.nodes.blockquote)(view.state, view.dispatch);\n }\n },\n {\n title: \"Code\",\n description: \"Capture a code snippet.\",\n searchTerms: [\"codeblock\"],\n icon: <CodeIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.code_block)(view.state, view.dispatch);\n }\n },\n {\n title: \"Image\",\n description: \"Upload an image from your computer.\",\n searchTerms: [\"photo\", \"picture\", \"media\", \"upload\", \"file\"],\n icon: <ImageIcon size={iconSize.small}/>,\n command: (view, range, upload) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = async () => {\n if (input.files?.length) {\n const file = input.files[0];\n if (!file) return;\n const pos = view.state.selection.from;\n\n const images = Array.from(input.files).filter(f => /image/i.test(f.type));\n if (images.length === 0) return false;\n\n images.forEach(image => {\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n }\n return true;\n };\n input.click();\n }\n },\n {\n title: \"Table\",\n description: \"Insert a custom grid table.\",\n searchTerms: [\"table\", \"grid\", \"row\", \"col\"],\n icon: <TableIcon size={iconSize.small}/>,\n command: (view, range, upload, aiController, setSubView) => {\n if (setSubView) setSubView(\"table-grid\");\n }\n }\n];\n\nconst autocompleteSuggestionItem: SuggestionItem = {\n title: \"Autocomplete\",\n description: \"Add text based on the context.\",\n searchTerms: [\"ai\"],\n icon: <Wand2Icon size={iconSize.small}/>,\n command: async (view, range, upload, aiController) => {\n if (!aiController) throw Error(\"No AiController\");\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);\n\n const { state } = view;\n const { from, to } = state.selection;\n\n const textBeforeCursor = state.doc.textBetween(0, from, \"\\n\");\n const textAfterCursor = state.doc.textBetween(to, state.doc.content.size, \"\\n\");\n\n let buffer = \"\";\n const result = await aiController.autocomplete(textBeforeCursor, textAfterCursor, (delta) => {\n buffer += delta;\n if (delta.length !== 0) {\n textLoadingCommands.toggleLoadingDecoration(view.state, view.dispatch, buffer);\n }\n });\n\n // Insert parsed text result at cursor natively\n try {\n // The AI controller might stream literal \"\\n\" characters depending on its JSON decoding layer.\n // We need to un-escape these back to genuine newlines so MarkdownIt block-parsing works.\n const unescapedResult = result.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\");\n\n const isHTML = /<\\/?[a-z][\\s\\S]*>/i.test(unescapedResult);\n let parsedDoc;\n\n if (isHTML) {\n const div = document.createElement(\"div\");\n div.innerHTML = unescapedResult;\n parsedDoc = DOMParser.fromSchema(view.state.schema).parse(div);\n } else {\n parsedDoc = parser.parse(unescapedResult);\n }\n\n if (parsedDoc) {\n const tr = view.state.tr.replaceWith(view.state.selection.from, view.state.selection.from, parsedDoc.content);\n view.dispatch(tr);\n } else {\n view.dispatch(view.state.tr.insertText(unescapedResult));\n }\n } catch (e) {\n console.error(e);\n view.dispatch(view.state.tr.insertText(result));\n }\n }\n};\n\nexport const SlashCommandMenu = ({ upload, aiController }: { upload: UploadFn, aiController?: EditorAIController }) => {\n const { view, state } = useProseMirrorContext();\n const menuRef = useRef<HTMLDivElement>(null);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [subView, setSubView] = useState<string | null>(null);\n const [tableGridCoords, setTableGridCoords] = useState({ r: 0,\nc: 0 });\n\n const pluginState = state ? SlashCommandPluginKey.getState(state) : null;\n const isActive = pluginState?.active;\n const query = pluginState?.query || \"\";\n const range = pluginState?.range;\n\n const filteredItems = React.useMemo(() => {\n if (!isActive) return [];\n const availableItems = [...suggestionItems];\n if (aiController) availableItems.push(autocompleteSuggestionItem);\n\n return availableItems.filter(item => {\n const inTitle = item.title.toLowerCase().includes(query.toLowerCase());\n if (inTitle) return inTitle;\n return item.searchTerms?.some(term => term.toLowerCase().includes(query.toLowerCase()));\n });\n }, [query, isActive, aiController]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [query]);\n\n useEffect(() => {\n if (!isActive) setSubView(null);\n }, [isActive]);\n\n useEffect(() => {\n if (!view || !isActive || !range || !menuRef.current) return;\n\n const start = view.coordsAtPos(range.from);\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: 0,\n height: start.bottom - start.top,\n x: start.left,\n y: start.top,\n top: start.top,\n left: start.left,\n right: start.left,\n bottom: start.bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({ x, y }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [view, isActive, range]);\n\n useEffect(() => {\n if (!isActive || !view) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (subView === \"table-grid\") {\n if (e.key === \"Escape\") {\n e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation();\n setSubView(null);\n setTableGridCoords({ r: 0,\nc: 0 });\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.max(0, prev.r - 1),\nc: prev.c }));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.min(4, prev.r + 1),\nc: prev.c }));\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r,\nc: Math.max(0, prev.c - 1) }));\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r,\nc: Math.min(4, prev.c + 1) }));\n } else if (e.key === \"Enter\") {\n e.preventDefault(); e.stopPropagation();\n if (range) {\n const tableNode = createTableNode(view.state.schema, tableGridCoords.r + 1, tableGridCoords.c + 1);\n const tr = view.state.tr.replaceWith(range.from, range.to, tableNode);\n try {\n const selection = TextSelection.create(tr.doc, range.from + 4);\n tr.setSelection(selection);\n } catch (e) {\n console.warn(\"Could not select first cell\", e);\n }\n tr.setMeta(SlashCommandPluginKey, { active: false });\n view.dispatch(tr);\n view.focus();\n setSubView(null);\n setTableGridCoords({ r: 0,\nc: 0 });\n }\n }\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex(prev => (prev + filteredItems.length - 1) % filteredItems.length);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex(prev => (prev + 1) % filteredItems.length);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n if (filteredItems[selectedIndex] && range) {\n filteredItems[selectedIndex].command(view, range, upload, aiController, setSubView);\n // Do not focus view if a subview opened\n setTimeout(() => {\n // Focus is managed by the caller\n }, 0);\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n // Close menu gracefully and keep it dismissed\n view.dispatch(view.state.tr.setMeta(SlashCommandPluginKey, { active: false,\ndismissed: true }));\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => window.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n }, [isActive, selectedIndex, filteredItems, view, range, upload, aiController, subView, tableGridCoords]);\n\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n }, [selectedIndex]);\n\n useEffect(() => {\n if (!subView) {\n setTableGridCoords({ r: 0,\nc: 0 });\n }\n }, [subView]);\n\n if (!isActive || filteredItems.length === 0) return null;\n\n if (subView === \"table-grid\" && range && view) {\n return (\n <div\n ref={menuRef}\n onMouseDown={(e) => e.preventDefault()}\n style={{ position: \"fixed\",\nzIndex: 9999,\nvisibility: \"hidden\" }}\n className={cls(\"text-surface-900 dark:text-white rounded-md border bg-white dark:bg-surface-800 p-2 shadow transition-none\", defaultBorderMixin)}\n >\n <TableGridPicker\n hoveredRow={tableGridCoords.r}\n hoveredCol={tableGridCoords.c}\n onHover={(r, c) => setTableGridCoords({ r,\nc })}\n onSelect={(rows, cols) => {\n const tableNode = createTableNode(view.state.schema, rows, cols);\n const tr = view.state.tr.replaceWith(range.from, range.to, tableNode);\n try {\n const selection = TextSelection.create(tr.doc, range.from + 4);\n tr.setSelection(selection);\n } catch (e) {\n console.warn(\"Could not select first cell\", e);\n }\n tr.setMeta(SlashCommandPluginKey, { active: false });\n view.dispatch(tr);\n view.focus();\n setSubView(null);\n }}\n />\n </div>\n );\n }\n\n return (\n <div\n ref={menuRef}\n style={{ position: \"fixed\",\nzIndex: 9999,\nvisibility: \"hidden\" }}\n className={cls(\"text-surface-900 dark:text-white max-h-[280px] w-72 overflow-y-auto rounded-md border bg-white dark:bg-surface-800 px-1 py-2 shadow transition-none\", defaultBorderMixin)}\n >\n {filteredItems.map((item, index) => (\n <button\n key={item.title}\n ref={el => { itemRefs.current[index] = el; }}\n onClick={(e) => {\n e.preventDefault();\n if (range && view) {\n item.command(view, range, upload, aiController, setSubView);\n // Only focus back to editor if it didn't open a sub-view\n if (!subView) view.focus();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n className={cls(\"flex w-full items-center space-x-2 rounded-md px-2 py-1 text-left text-sm hover:bg-blue-50 hover:dark:bg-surface-700\",\n index === selectedIndex ? \"bg-blue-100 dark:bg-surface-accent-950\" : \"\")}\n >\n <div className={cls(\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md border bg-white dark:bg-surface-800\", defaultBorderMixin)}>\n {item.icon}\n </div>\n <div className=\"flex flex-col overflow-hidden\">\n <p className=\"font-medium truncate\">{item.title}</p>\n <p className=\"text-xs text-surface-700 dark:text-surface-accent-300 truncate\">\n {item.description}\n </p>\n </div>\n </button>\n ))}\n </div>\n );\n};\n\nconst createTableNode = (schema: import(\"prosemirror-model\").Schema, rowsCount: number, colsCount: number) => {\n const rows = [];\n for (let r = 0; r < rowsCount; r++) {\n const cells = [];\n for (let c = 0; c < colsCount; c++) {\n const isHeader = r === 0;\n const cellType = isHeader ? schema.nodes.table_header : schema.nodes.table_cell;\n const cell = cellType.createAndFill();\n if (cell) cells.push(cell);\n }\n const row = schema.nodes.table_row.create(null, Fragment.from(cells));\n rows.push(row);\n }\n return schema.nodes.table.create(null, Fragment.from(rows));\n};\n\nconst TableGridPicker = ({\n hoveredRow,\n hoveredCol,\n onHover,\n onSelect\n}: {\n hoveredRow: number;\n hoveredCol: number;\n onHover: (r: number, c: number) => void;\n onSelect: (r: number, c: number) => void;\n}) => {\n return (\n <div className=\"flex flex-col gap-1 items-center justify-center p-1 w-fit\">\n <span className=\"text-xs text-gray-500 font-medium mb-1\">\n {hoveredCol + 1} x {hoveredRow + 1} Table\n </span>\n <div className=\"flex flex-col gap-1\">\n {Array.from({ length: 5 }).map((_, r) => (\n <div key={r} className=\"flex gap-1\">\n {Array.from({ length: 5 }).map((_, c) => (\n <div\n key={c}\n className={cls(\n \"w-5 h-5 border rounded-sm cursor-pointer transition-colors duration-75\",\n r <= hoveredRow && c <= hoveredCol\n ? \"bg-blue-100 border-blue-400 dark:bg-blue-900 dark:border-blue-500\"\n : \"bg-white dark:bg-surface-800 border-gray-200 dark:border-gray-700 hover:border-blue-300\"\n )}\n onMouseEnter={() => onHover(r, c)}\n onClick={() => onSelect(hoveredRow + 1, hoveredCol + 1)}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift, type VirtualElement, type Placement } from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\nimport { TextField, defaultBorderMixin, Typography, cls } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\n\nexport interface ImageBubbleProps {\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nexport const ImageBubble = forwardRef<HTMLDivElement, ImageBubbleProps>(\n ({\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const { t } = useTranslation();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n const [alt, setAlt] = useState(\"\");\n const [title, setTitle] = useState(\"\");\n const [imagePos, setImagePos] = useState<number | null>(null);\n\n useEffect(() => {\n if (!view) return;\n const handleContextMenu = (e: MouseEvent) => {\n const posInfo = view.posAtCoords({\n left: e.clientX,\n top: e.clientY\n });\n if (posInfo && posInfo.inside >= 0) {\n const node = view.state.doc.nodeAt(posInfo.inside);\n if (node && node.type.name === \"image\") {\n e.preventDefault();\n const tr = view.state.tr.setSelection(NodeSelection.create(view.state.doc, posInfo.inside));\n view.dispatch(tr);\n setShow(true);\n setAlt(node.attrs.alt || \"\");\n setTitle(node.attrs.title || \"\");\n setImagePos(posInfo.inside);\n }\n }\n };\n view.dom.addEventListener(\"contextmenu\", handleContextMenu);\n\n const handleMousedown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node) && e.button !== 2) {\n setShow(false);\n }\n };\n document.addEventListener(\"mousedown\", handleMousedown);\n\n return () => {\n view.dom.removeEventListener(\"contextmenu\", handleContextMenu);\n document.removeEventListener(\"mousedown\", handleMousedown);\n };\n }, [view]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n left,\n right,\n bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore errors during fast remounts/updates\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"bottom\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n const handleSave = (newAlt: string, newTitle: string) => {\n if (imagePos !== null && view) {\n const node = view.state.doc.nodeAt(imagePos);\n if (node && node.type.name === \"image\") {\n const tr = view.state.tr.setNodeMarkup(imagePos, undefined, {\n ...node.attrs,\n alt: newAlt,\n title: newTitle\n });\n // Preserve the node selection so the bubble stays open!\n tr.setSelection(NodeSelection.create(tr.doc, imagePos));\n view.dispatch(tr);\n }\n }\n };\n\n if (!show) return null;\n\n return (\n <div\n ref={menuRef}\n style={{\n visibility: \"hidden\",\n position: \"fixed\",\n zIndex: 50\n }}\n className={cls(\"flex flex-col gap-1.5 p-2 w-56 max-w-[90vw] rounded-lg border bg-white dark:bg-surface-800 shadow-lg\", defaultBorderMixin, className)}\n onMouseDown={(e) => {\n // Prevent mousedown from stealing focus from inputs\n // but we don't want to prevent typing\n // Only prevent if clicking on the container background\n if (e.target === e.currentTarget) {\n e.preventDefault();\n }\n }}\n >\n <TextField\n size={\"small\"}\n placeholder={t(\"alt_text\")}\n value={alt}\n onChange={(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setAlt(e.target.value);\n handleSave(e.target.value, title);\n }}\n />\n <TextField\n size={\"small\"}\n placeholder={t(\"title\")}\n value={title}\n onChange={(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setTitle(e.target.value);\n handleSave(alt, e.target.value);\n }}\n />\n </div>\n );\n }\n);\n\nImageBubble.displayName = \"ImageBubble\";\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n type VirtualElement,\n type Placement\n} from \"@floating-ui/dom\";\nimport { IconButton, Tooltip, defaultBorderMixin, cls } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport {\n addColumnBefore,\n addColumnAfter,\n deleteColumn,\n addRowBefore,\n addRowAfter,\n deleteRow,\n deleteTable\n} from \"prosemirror-tables\";\nimport { EditorState } from \"prosemirror-state\";\n\nexport interface TableBubbleProps {\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nconst isSelectionInTable = (state: EditorState) => {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === \"table\") {\n return true;\n }\n }\n return false;\n};\n\n// We create separate icon components if they don't exist in @rebasepro/ui\n// using basic SVGs for now, or we can use existing ones if we know them.\n// Wait, I will use generic SVGs for these since I don't know if @rebasepro/ui has them.\n\nexport const TableBubble = forwardRef<HTMLDivElement, TableBubbleProps>(\n ({\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const { t } = useTranslation();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!state) return;\n setShow(isSelectionInTable(state));\n }, [state?.selection]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n\n // Safety measure: if view.docView is destroyed, coordsAtPos might crash\n if (view.isDestroyed) return;\n\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n bottom,\n left,\n right\n } as DOMRect;\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current || view.isDestroyed) return;\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore errors during fast remounts/updates\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n if (!show || !view || !state) return null;\n\n const executeCommand = (cmd: (state: EditorState, dispatch?: (tr: import(\"prosemirror-state\").Transaction) => void) => boolean) => {\n cmd(state, view.dispatch);\n view.focus();\n };\n\n return (\n <div\n ref={menuRef}\n style={{\n visibility: \"hidden\",\n position: \"fixed\",\n zIndex: 50\n }}\n className={cls(\"flex flex-row gap-1 p-1 rounded-lg border bg-white dark:bg-surface-800 shadow-lg\", defaultBorderMixin, className)}\n onMouseDown={(e) => {\n // Prevent mousedown from stealing focus from the editor\n e.preventDefault();\n }}\n >\n <div className=\"flex gap-1 border-r pr-1 mr-1 dark:border-gray-700\">\n <Tooltip title={t(\"add_row_before\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addRowBefore)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"add_row_after\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addRowAfter)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"20\"></line>\n <line x1=\"8\" y1=\"16\" x2=\"16\" y2=\"16\"></line>\n <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"delete_row\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteRow)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n\n <div className=\"flex gap-1 border-r pr-1 mr-1 dark:border-gray-700\">\n <Tooltip title={t(\"add_column_before\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addColumnBefore)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"add_column_after\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addColumnAfter)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"12\" x2=\"20\" y2=\"12\"></line>\n <line x1=\"16\" y1=\"8\" x2=\"16\" y2=\"16\"></line>\n <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"delete_column\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteColumn)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title={t(\"delete_table\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteTable)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path\n d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n );\n }\n);\n\nTableBubble.displayName = \"TableBubble\";\n","import { EditorState, TextSelection, Transaction } from \"prosemirror-state\";\nimport { MarkType, NodeType, Node as ProseMirrorNode } from \"prosemirror-model\";\n\nexport function isMarkActive(state: EditorState, type: MarkType) {\n if (!state || !type) return false;\n const { from, $from, to, empty } = state.selection;\n if (empty) return !!type.isInSet(state.storedMarks || $from.marks());\n return state.doc.rangeHasMark(from, to, type);\n}\n\nexport function isNodeActive(state: EditorState, type: NodeType, attrs: Record<string, unknown> = {}) {\n if (!state || !type) return false;\n const selection = state.selection;\n const { $from, to } = selection;\n const node = selection instanceof TextSelection ? undefined : (selection as { node?: ProseMirrorNode }).node;\n if (node) {\n return node.type === type && (!attrs || Object.keys(attrs).every((key) => node.attrs[key] === attrs[key]));\n }\n return to <= $from.end() && $from.parent.type === type && (!attrs || Object.keys(attrs).every((key) => $from.parent.attrs[key] === attrs[key]));\n}\n\nexport function getMarkAttributes(state: EditorState, type: MarkType) {\n if (!state || !type) return {};\n const { from, $from, to, empty } = state.selection;\n let mark;\n if (empty) {\n mark = type.isInSet(state.storedMarks || $from.marks());\n } else {\n let found = false;\n state.doc.nodesBetween(from, to, (node) => {\n if (found) return false;\n const m = type.isInSet(node.marks);\n if (m) {\n mark = m;\n found = true;\n }\n return true;\n });\n }\n return mark ? mark.attrs : {};\n}\n\nexport function setMark(type: MarkType, attrs?: Record<string, unknown>) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const selection = state.selection as TextSelection;\n const { empty, $cursor, ranges } = selection;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n if ($cursor) {\n dispatch(state.tr.addStoredMark(type.create(attrs)));\n } else {\n const tr = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i];\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\n\nexport function unsetMark(type: MarkType) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const selection = state.selection as TextSelection;\n const { empty, $cursor, ranges } = selection;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n const tr = state.tr;\n if ($cursor) {\n const parent = $cursor.parent;\n let markStart = -1;\n let markEnd = -1;\n let currentMarkStart = -1;\n\n parent.forEach((child: ProseMirrorNode, offset: number) => {\n const childStart = $cursor.start() + offset;\n const childEnd = childStart + child.nodeSize;\n\n if (type.isInSet(child.marks)) {\n if (currentMarkStart === -1) currentMarkStart = childStart;\n if ($cursor.pos >= childStart && $cursor.pos <= childEnd) {\n markStart = currentMarkStart;\n }\n } else {\n if (currentMarkStart !== -1) {\n if (markStart !== -1 && markEnd === -1) markEnd = childStart;\n currentMarkStart = -1;\n }\n }\n });\n\n if (markStart !== -1 && markEnd === -1) {\n markEnd = $cursor.end();\n }\n\n if (markStart !== -1 && markEnd !== -1) {\n tr.removeMark(markStart, markEnd, type);\n }\n tr.removeStoredMark(type);\n dispatch(tr.scrollIntoView());\n } else {\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i];\n tr.removeMark($from.pos, $to.pos, type);\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\n","\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport { useTranslation } from \"@rebasepro/core\";\n\nimport {\n Button,\n CheckIcon,\n CheckSquareIcon,\n ChevronDownIcon,\n CodeIcon,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n iconSize,\n ListIcon,\n ListOrderedIcon,\n Popover,\n QuoteIcon,\n TypeIcon\n} from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { isNodeActive } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\nimport { setBlockType, wrapIn } from \"prosemirror-commands\";\nimport { wrapInList } from \"prosemirror-schema-list\";\n\nexport type SelectorItem = {\n name: string;\n labelKey: string;\n icon: React.ElementType;\n command: (state: EditorState, dispatch: (tr: Transaction) => void) => void;\n isActive: (state: EditorState) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: \"Text\",\n labelKey: \"editor_text\",\n icon: TypeIcon,\n command: (state, dispatch) => setBlockType(schema.nodes.paragraph)(state, dispatch),\n isActive: (state) =>\n isNodeActive(state, schema.nodes.paragraph) &&\n !isNodeActive(state, schema.nodes.bullet_list) &&\n !isNodeActive(state, schema.nodes.ordered_list)\n },\n {\n name: \"Heading 1\",\n labelKey: \"editor_heading_1\",\n icon: Heading1Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 1 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 1 })\n },\n {\n name: \"Heading 2\",\n labelKey: \"editor_heading_2\",\n icon: Heading2Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 2 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 2 })\n },\n {\n name: \"Heading 3\",\n labelKey: \"editor_heading_3\",\n icon: Heading3Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 3 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 3 })\n },\n {\n name: \"To-do List\",\n labelKey: \"editor_todo_list\",\n icon: CheckSquareIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.task_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.task_item)\n },\n {\n name: \"Bullet List\",\n labelKey: \"editor_bullet_list\",\n icon: ListIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.bullet_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.bullet_list)\n },\n {\n name: \"Numbered List\",\n labelKey: \"editor_numbered_list\",\n icon: ListOrderedIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.ordered_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.ordered_list)\n },\n {\n name: \"Quote\",\n labelKey: \"editor_quote\",\n icon: QuoteIcon,\n command: (state, dispatch) => wrapIn(schema.nodes.blockquote)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.blockquote)\n },\n {\n name: \"Code\",\n labelKey: \"editor_code\",\n icon: CodeIcon,\n command: (state, dispatch) => setBlockType(schema.nodes.code_block)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.code_block)\n }\n];\n\ninterface NodeSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n portalContainer: HTMLElement | null;\n}\n\nexport const NodeSelector = ({\n open,\n onOpenChange,\n portalContainer\n}: NodeSelectorProps) => {\n const { state, view } = useProseMirrorContext();\n const { t } = useTranslation();\n if (!state || !view) return null;\n\n const activeItem = items.filter((item) => item.isActive(state)).pop() ?? {\n name: \"Multiple\",\n labelKey: \"editor_multiple\"\n };\n\n return (\n <Popover\n sideOffset={5}\n align=\"start\"\n portalContainer={portalContainer}\n className=\"w-48 p-1\"\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color=\"text\">\n <span className=\"whitespace-nowrap text-sm\">{t(activeItem.labelKey)}</span>\n <ChevronDownIcon size={iconSize.small}/>\n </Button>}\n modal={true}\n open={open}\n onOpenChange={onOpenChange}>\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={() => {\n item.command(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n }}\n className=\"flex cursor-pointer items-center justify-between rounded px-2 py-1 text-sm hover:bg-blue-50 hover:dark:bg-surface-700 text-surface-900 dark:text-white\"\n >\n <div className=\"flex items-center space-x-2\">\n <item.icon size={iconSize.smallest}/>\n <span>{t(item.labelKey)}</span>\n </div>\n {activeItem.name === item.name && <CheckIcon size={iconSize.smallest}/>}\n </EditorBubbleItem>\n ))}\n </Popover>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { Button, CheckIcon, cls, focusedDisabled, iconSize, Popover, TextField, Trash2Icon } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { getMarkAttributes, isMarkActive, setMark, unsetMark } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\n\nexport function isValidUrl(url: string) {\n try {\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function getUrlFromString(str: string) {\n if (isValidUrl(str)) return str;\n try {\n if (str.includes(\".\") && !str.includes(\" \")) {\n return new URL(`https://${str}`).toString();\n }\n return null;\n } catch (e) {\n return null;\n }\n}\n\ninterface LinkSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const LinkSelector = ({\n open,\n onOpenChange\n}: LinkSelectorProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { state, view } = useProseMirrorContext();\n const { t } = useTranslation();\n\n // Autofocus on input by default\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n if (!state || !view) return null;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const value = inputRef.current?.value;\n if (!value) return;\n const url = getUrlFromString(value);\n if (url) {\n setMark(schema.marks.link, { href: url })(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n }\n };\n\n const handleRemoveLink = () => {\n unsetMark(schema.marks.link)(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n };\n\n const isActive = isMarkActive(state, schema.marks.link);\n const href = getMarkAttributes(state, schema.marks.link).href || \"\";\n\n return (\n <Popover modal={true}\n open={open}\n onOpenChange={onOpenChange}\n trigger={<Button variant=\"text\"\n type=\"button\"\n className=\"gap-2 rounded-none\"\n color={\"text\"}>\n <p className={cls(\"underline decoration-stone-400 underline-offset-4\", {\n \"text-blue-500\": isActive\n })}>\n {t(\"editor_link\")}\n </p>\n </Button>}>\n <form\n onSubmit={handleSubmit}\n className=\"flex p-1 gap-1\"\n >\n <TextField\n inputRef={inputRef}\n autoFocus={open}\n placeholder={t(\"editor_paste_or_type_link\")}\n defaultValue={href}\n size=\"small\"\n className=\"flex-grow text-surface-900 dark:text-white\"\n inputClassName={cls(\"bg-transparent p-1 text-sm outline-none\", focusedDisabled)}\n />\n\n {href ? (\n <Button\n size={\"small\"}\n variant=\"text\"\n type=\"button\"\n color={\"text\"}\n className=\"flex items-center\"\n onClick={handleRemoveLink}\n >\n <Trash2Icon size={iconSize.small}/>\n </Button>\n ) : (\n <Button size={\"small\"}\n type=\"submit\"\n variant={\"text\"}>\n <CheckIcon size={iconSize.small}/>\n </Button>\n )}\n </form>\n </Popover>\n );\n};\n","\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport type { SelectorItem } from \"./node-selector\";\nimport { BoldIcon, Button, cls, CodeIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon } from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { isMarkActive } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\nimport { toggleMark } from \"prosemirror-commands\";\n\nexport const TextButtons = () => {\n const { state, view } = useProseMirrorContext();\n if (!state || !view) return null;\n\n // We pass state directly to isActive, and dispatch to command\n const items = [\n {\n name: \"bold\",\n labelKey: \"editor_bold\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.bold),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.bold)(s, dispatch),\n icon: BoldIcon\n },\n {\n name: \"italic\",\n labelKey: \"editor_italic\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.italic),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.italic)(s, dispatch),\n icon: ItalicIcon\n },\n {\n name: \"underline\",\n labelKey: \"editor_underline\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.underline),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.underline)(s, dispatch),\n icon: UnderlineIcon\n },\n {\n name: \"strike\",\n labelKey: \"editor_strikethrough\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.strike),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.strike)(s, dispatch),\n icon: StrikethroughIcon\n },\n {\n name: \"code\",\n labelKey: \"editor_code\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.code),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.code)(s, dispatch),\n icon: CodeIcon\n }\n ];\n\n return (\n <div className=\"flex\">\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={() => {\n item.command(view.state, view.dispatch);\n view.focus();\n }}\n >\n <Button size={\"small\"}\n color=\"text\"\n className=\"gap-2 rounded-none h-full\"\n variant=\"text\">\n <item.icon\n className={cls({\n \"text-inherit\": !item.isActive(state),\n \"text-blue-500\": item.isActive(state)\n })}\n />\n </Button>\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n","export function removeClassesFromJson(jsonObj: unknown): unknown {\n // If it's an array, apply the function to each element\n if (Array.isArray(jsonObj)) {\n return jsonObj.map(item => removeClassesFromJson(item));\n } else if (typeof jsonObj === \"object\" && jsonObj !== null) { // If it's an object, recurse through its properties\n const obj = jsonObj as Record<string, unknown>;\n // If the object has an `attrs` property and `class` field, delete the `class` field\n if (obj.attrs && typeof obj.attrs === \"object\" && obj.attrs !== null && \"class\" in (obj.attrs as Record<string, unknown>)) {\n delete (obj.attrs as Record<string, unknown>).class;\n }\n\n // Apply the function recursively to object properties\n Object.keys(obj).forEach(key => {\n obj[key] = removeClassesFromJson(obj[key]);\n });\n }\n return jsonObj;\n}\n","import { DOMSerializer, Slice } from \"prosemirror-model\"\nimport { EditorView } from \"prosemirror-view\";\n\nexport function serializeForClipboard(view: EditorView, slice: Slice) {\n view.someProp(\"transformCopied\", f => {\n slice = f(slice!, view)\n })\n\n const context = [];\n let {\n content,\n openStart,\n openEnd\n } = slice\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild!.childCount == 1) {\n openStart--\n openEnd--\n const node = content.firstChild!\n const nodeType = node.type as typeof node.type & { defaultAttrs?: unknown };\n context.push(node.type.name, node.attrs != nodeType.defaultAttrs ? node.attrs : null)\n content = node.content\n }\n\n const serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema)\n const doc = detachedDoc(), wrap = doc.createElement(\"div\")\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }))\n\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n const wrapper = doc.createElement(needsWrap[i])\n while (wrap.firstChild) wrapper.appendChild(wrap.firstChild)\n wrap.appendChild(wrapper)\n wrappers++\n }\n firstChild = wrap.firstChild\n }\n\n if (firstChild && firstChild.nodeType == 1)\n (firstChild as HTMLElement).setAttribute(\n \"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`)\n\n const text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\")\n\n return {\n dom: wrap,\n text,\n slice\n }\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap: { [node: string]: string[] } = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n}\n\nlet _detachedDoc: Document | null = null\n\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n","import { NodeSelection, Plugin } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { Slice } from \"prosemirror-model\";\nimport { serializeForClipboard } from \"./clipboard\";\n\n/** ProseMirror internal drag state — not exposed in type definitions */\ninterface ProseMirrorDragState {\n slice: Slice;\n move: boolean;\n node?: NodeSelection;\n}\n\n/** EditorView with access to the internal `dragging` property */\ninterface EditorViewWithDrag extends EditorView {\n dragging: ProseMirrorDragState | null;\n}\n\nexport interface DragHandleOptions {\n /**\n * The width of the drag handle\n */\n dragHandleWidth: number;\n}\n\nfunction absoluteRect(element: Element) {\n const data = element.getBoundingClientRect();\n\n let ancestor = element.parentElement;\n while (ancestor && window.getComputedStyle(ancestor).position === \"static\") {\n ancestor = ancestor.parentElement;\n }\n const ancestorRect = ancestor?.getBoundingClientRect();\n\n return {\n top: data.top - (ancestorRect?.top ?? 0),\n left: data.left - (ancestorRect?.left ?? 0),\n width: data.width\n };\n}\n\nfunction nodeDOMAtCoords(coords: { x: number; y: number }, view: EditorView) {\n const editorRect = view.dom.getBoundingClientRect();\n\n // 0. Give up if outside vertical bounds or too far horizontally\n if (coords.y < editorRect.top || coords.y > editorRect.bottom) return undefined;\n if (coords.x < editorRect.left - 100 || coords.x > editorRect.right + 50) return undefined;\n\n const blockSelector = 'li, p, pre, blockquote, h1, h2, h3, h4, h5, h6, img, [data-type=\"taskList\"]';\n\n // 1. First probe exactly at the mouse coordinates\n const elem = document.elementFromPoint(coords.x, coords.y);\n const block = elem?.closest(blockSelector);\n if (block && view.dom.contains(block) && block.textContent?.trim()) {\n const li = block.closest(\"li\");\n return (li && view.dom.contains(li)) ? li : block;\n }\n\n // 2. If mouse is in the left gutter, probe horizontally into the editor\n const probeX = editorRect.left + Math.min(60, editorRect.width / 4);\n if (coords.x > probeX) return undefined;\n\n const probeElem = document.elementFromPoint(probeX, coords.y);\n const probeBlock = probeElem?.closest(blockSelector);\n if (probeBlock && probeBlock.textContent?.trim()) {\n // Ensure the found block is actually inside our editor\n if (view.dom.contains(probeBlock)) {\n const li = probeBlock.closest(\"li\");\n return (li && view.dom.contains(li)) ? li : probeBlock;\n }\n }\n\n return undefined;\n}\n\nfunction nodePosAtDOM(node: Element, view: EditorView, options: DragHandleOptions) {\n try {\n if (!view.dom.contains(node)) return null;\n const pos = view.posAtDOM(node, 0);\n const $pos = view.state.doc.resolve(pos);\n // posAtDOM(node, 0) generally returns the position inside the node.\n // We want the position right before the node to create a NodeSelection.\n if ($pos.depth > 0) {\n return $pos.before();\n }\n return pos;\n } catch (e) {\n return null;\n }\n}\n\nexport function dragHandlePlugin(options: DragHandleOptions = { dragHandleWidth: 24 }) {\n function handleDragStart(event: DragEvent, view: EditorView) {\n view.focus();\n\n if (!event.dataTransfer) return;\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (nodePos == null || nodePos < 0) return;\n\n const draggedNodeSelection = NodeSelection.create(view.state.doc, nodePos);\n view.dispatch(view.state.tr.setSelection(draggedNodeSelection));\n\n const slice = view.state.selection.content();\n const {\n dom,\n text\n } = serializeForClipboard(view as EditorViewWithDrag, slice);\n\n event.dataTransfer.clearData();\n event.dataTransfer.setData(\"text/html\", dom.innerHTML);\n event.dataTransfer.setData(\"text/plain\", text);\n event.dataTransfer.effectAllowed = \"copyMove\";\n\n event.dataTransfer.setDragImage(node, 0, 0);\n\n (view as EditorViewWithDrag).dragging = {\n slice,\n move: true,\n node: draggedNodeSelection\n };\n }\n\n function handleClick(event: MouseEvent, view: EditorView) {\n view.focus();\n\n view.dom.classList.remove(\"dragging\");\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (!nodePos) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n }\n\n let dragHandleElement: HTMLElement | null = null;\n\n function hideDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.add(\"hide\");\n dragHandleElement.style.opacity = \"0\";\n dragHandleElement.style.pointerEvents = \"none\";\n }\n }\n\n function showDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.remove(\"hide\");\n dragHandleElement.style.opacity = \"1\";\n dragHandleElement.style.pointerEvents = \"auto\";\n }\n }\n\n return new Plugin({\n view: (view) => {\n dragHandleElement = document.createElement(\"div\");\n dragHandleElement.draggable = true;\n dragHandleElement.dataset.dragHandle = \"\";\n dragHandleElement.classList.add(\"drag-handle\");\n dragHandleElement.addEventListener(\"dragstart\", (e) => {\n handleDragStart(e, view);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view);\n });\n const onMouseMove = (event: MouseEvent) => {\n if (!view.editable) {\n return;\n }\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) {\n hideDragHandle();\n return;\n }\n\n const compStyle = window.getComputedStyle(node);\n const lineHeight = parseInt(compStyle.lineHeight, 10);\n const paddingTop = parseInt(compStyle.paddingTop, 10);\n\n const rect = absoluteRect(node);\n if (!rect) {\n hideDragHandle();\n return;\n }\n\n rect.top += (lineHeight - 24) / 2;\n rect.top += paddingTop;\n // Li markers\n if (node.matches(\"ul:not([data-type=taskList]) li, ol li\")) {\n rect.left -= options.dragHandleWidth;\n }\n rect.width = options.dragHandleWidth;\n\n if (!dragHandleElement) return;\n\n dragHandleElement.style.left = `${rect.left - rect.width}px`;\n dragHandleElement.style.top = `${rect.top}px`;\n showDragHandle();\n };\n\n window.addEventListener(\"mousemove\", onMouseMove);\n\n hideDragHandle();\n\n view?.dom?.parentElement?.appendChild(dragHandleElement);\n\n return {\n destroy: () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n dragHandleElement?.remove?.();\n dragHandleElement = null;\n }\n };\n },\n props: {\n handleDOMEvents: {\n keydown: () => {\n hideDragHandle();\n },\n mousewheel: () => {\n hideDragHandle();\n },\n // dragging class is used for CSS\n dragstart: (view) => {\n view.dom.classList.add(\"dragging\");\n },\n drop: (view) => {\n view.dom.classList.remove(\"dragging\");\n },\n dragend: (view) => {\n view.dom.classList.remove(\"dragging\");\n }\n }\n }\n });\n}\n\nimport { dropPoint } from \"prosemirror-transform\";\n\nexport function globalDragDropPlugin() {\n let dropCursorElement: HTMLElement | null = null;\n let cleanup: (() => void) | null = null;\n\n function updateDropCursorColor(el: HTMLElement) {\n const isDark = document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n const varName = isDark ? \"--color-surface-accent-300\" : \"--color-surface-accent-600\";\n const color = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n el.style.backgroundColor = color || (isDark ? \"#cbd5e1\" : \"#475569\");\n }\n\n return new Plugin({\n view(editorView) {\n dropCursorElement = document.createElement(\"div\");\n dropCursorElement.className = \"prosemirror-dropcursor-block\";\n dropCursorElement.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; height: 2px;\";\n updateDropCursorColor(dropCursorElement);\n\n // Watch for theme changes\n const observer = new MutationObserver(() => {\n if (dropCursorElement) updateDropCursorColor(dropCursorElement);\n });\n observer.observe(document.documentElement, { attributes: true,\nattributeFilter: [\"data-theme\"] });\n\n const removeCursor = () => {\n if (dropCursorElement && dropCursorElement.parentNode) {\n dropCursorElement.parentNode.removeChild(dropCursorElement);\n }\n };\n\n const getBlockInsertionPoint = (event: DragEvent, clampedX: number) => {\n const pos = editorView.posAtCoords({ left: clampedX,\ntop: event.clientY });\n if (!pos) return null;\n\n const $pos = editorView.state.doc.resolve(pos.pos);\n\n let blockDepth = 0;\n for (let i = $pos.depth; i > 0; i--) {\n const name = $pos.node(i).type.name;\n if (name === \"list_item\" || name === \"taskItem\") {\n blockDepth = i;\n break;\n }\n if ($pos.node(i).isBlock && name !== \"bullet_list\" && name !== \"ordered_list\" && name !== \"taskList\") {\n blockDepth = i;\n }\n }\n\n if (blockDepth === 0) return pos.pos;\n\n const nodeBeforePos = $pos.before(blockDepth);\n const nodeAfterPos = $pos.after(blockDepth);\n\n const domNode = editorView.nodeDOM(nodeBeforePos);\n if (domNode instanceof HTMLElement) {\n const rect = domNode.getBoundingClientRect();\n const isTopHalf = event.clientY < rect.top + rect.height / 2;\n return isTopHalf ? nodeBeforePos : nodeAfterPos;\n }\n return pos.pos;\n };\n\n const handleDragOver = (event: DragEvent) => {\n if (!editorView.editable || !editorView.dragging) return;\n\n // If it's a native slice drag (no explicitly captured node from our drag handle)\n // then we bail out here and let ProseMirror native drop logic and native dropcursor handle it\n if (!((editorView as EditorViewWithDrag).dragging as ProseMirrorDragState | null & { node?: unknown })?.node) {\n removeCursor();\n return;\n }\n\n event.preventDefault(); // browser requires this to allow drop\n\n const editorRect = editorView.dom.getBoundingClientRect();\n const clampedX = Math.max(editorRect.left + 10, Math.min(event.clientX, editorRect.right - 10));\n\n const target = getBlockInsertionPoint(event, clampedX);\n if (target === null) {\n removeCursor();\n return;\n }\n\n const $pos = editorView.state.doc.resolve(target);\n\n let rect;\n const before = $pos.nodeBefore;\n const after = $pos.nodeAfter;\n\n if (before || after) {\n const nodeDOM = editorView.nodeDOM(target - (before ? before.nodeSize : 0));\n if (nodeDOM && nodeDOM instanceof HTMLElement) {\n const nodeRect = nodeDOM.getBoundingClientRect();\n let top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after) {\n const afterDOM = editorView.nodeDOM(target);\n if (afterDOM && afterDOM instanceof HTMLElement) {\n top = (top + afterDOM.getBoundingClientRect().top) / 2;\n }\n }\n rect = { left: nodeRect.left,\nright: nodeRect.right,\ntop: top - 1,\nbottom: top + 1 };\n }\n }\n\n if (!rect) {\n const coords = editorView.coordsAtPos(target);\n rect = { left: editorRect.left + 50,\nright: editorRect.right - 50,\ntop: coords.top - 1,\nbottom: coords.top + 1 };\n }\n\n const parent = editorView.dom.offsetParent as HTMLElement;\n let parentLeft = 0;\n let parentTop = 0;\n if (parent && parent !== document.body && getComputedStyle(parent).position !== \"static\") {\n const parentRect = parent.getBoundingClientRect();\n parentLeft = parentRect.left - parent.scrollLeft;\n parentTop = parentRect.top - parent.scrollTop;\n }\n\n if (!dropCursorElement!.parentNode) {\n parent.appendChild(dropCursorElement!);\n }\n\n dropCursorElement!.style.left = `${rect.left - parentLeft}px`;\n dropCursorElement!.style.top = `${rect.top - parentTop}px`;\n dropCursorElement!.style.width = `${rect.right - rect.left}px`;\n };\n\n const handleDrop = (event: DragEvent) => {\n if (!editorView.editable || !editorView.dragging) return;\n\n if (!((editorView as EditorViewWithDrag).dragging as ProseMirrorDragState | null & { node?: unknown })?.node) {\n removeCursor();\n return;\n }\n\n event.preventDefault();\n removeCursor();\n editorView.dom.classList.remove(\"dragging\");\n\n const editorRect = editorView.dom.getBoundingClientRect();\n const clampedX = Math.max(editorRect.left + 10, Math.min(event.clientX, editorRect.right - 10));\n\n const targetPos = getBlockInsertionPoint(event, clampedX);\n if (targetPos === null) return;\n\n const dragging = (editorView as EditorViewWithDrag).dragging;\n if (dragging && dragging.slice) {\n let tr = editorView.state.tr;\n if (dragging.move) {\n const { node } = dragging;\n if (node) {\n node.replace(tr); // exact native ProseMirror delete\n } else {\n tr = tr.deleteSelection();\n }\n }\n\n const mappedTarget = tr.mapping.map(targetPos);\n const beforeInsert = tr.doc;\n\n const { node, slice } = dragging;\n\n if (node && node.node) {\n let nodeToInsert: import(\"prosemirror-model\").Node | import(\"prosemirror-model\").Fragment = node.node;\n const $mapped = tr.doc.resolve(mappedTarget);\n const parentName = $mapped.parent.type.name;\n\n const isTargetList = parentName === \"bullet_list\" || parentName === \"ordered_list\";\n const isTargetTaskList = parentName === \"taskList\";\n\n // 1. Unwrap incoming lists if they don't match the destination perfectly\n if (\"type\" in nodeToInsert && nodeToInsert.type.name === \"list_item\" && !isTargetList) {\n nodeToInsert = nodeToInsert.content;\n } else if (\"type\" in nodeToInsert && nodeToInsert.type.name === \"taskItem\" && !isTargetTaskList) {\n nodeToInsert = nodeToInsert.content;\n }\n\n // 2. Wrap incoming blocks/fragments into exactly the target list type\n const isFragment = !(\"type\" in nodeToInsert);\n const needsWrap = isFragment || (\"type\" in nodeToInsert && nodeToInsert.type.name !== \"list_item\" && nodeToInsert.type.name !== \"taskItem\");\n\n if (needsWrap) {\n if (isTargetList) {\n const listItemType = editorView.state.schema.nodes.list_item;\n if (listItemType) nodeToInsert = listItemType.create(null, nodeToInsert);\n } else if (isTargetTaskList) {\n const taskItemType = editorView.state.schema.nodes.taskItem;\n if (taskItemType) nodeToInsert = taskItemType.create({ checked: false }, nodeToInsert);\n }\n }\n\n // 3. Force insertion. tr.replace slices and splits lists. tr.insert preserves the explicit boundary.\n try {\n tr = tr.insert(mappedTarget, nodeToInsert);\n } catch (e) {\n console.warn(\"Could not insert dragged node exactly at target. Attempting fallback.\", e);\n const point = dropPoint(tr.doc, mappedTarget, slice);\n if (point !== null) {\n tr = tr.replace(point, point, slice);\n }\n }\n } else if (slice) {\n // For generic slices (e.g native image dragging), we MUST use dropPoint\n // so ProseMirror finds a schema-valid depth to insert the node structure natively.\n const point = dropPoint(tr.doc, mappedTarget, slice);\n const finalTarget = point !== null ? point : mappedTarget;\n tr = tr.replace(finalTarget, finalTarget, slice);\n }\n\n if (!tr.doc.eq(beforeInsert)) {\n editorView.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n editorView.focus();\n }\n }\n\n (editorView as EditorViewWithDrag).dragging = null;\n };\n\n const handleDragEnd = () => {\n removeCursor();\n };\n\n window.addEventListener(\"dragover\", handleDragOver, { capture: true });\n window.addEventListener(\"drop\", handleDrop, { capture: true });\n window.addEventListener(\"dragend\", handleDragEnd, { capture: true });\n\n cleanup = () => {\n removeCursor();\n observer.disconnect();\n window.removeEventListener(\"dragover\", handleDragOver, { capture: true });\n window.removeEventListener(\"drop\", handleDrop, { capture: true });\n window.removeEventListener(\"dragend\", handleDragEnd, { capture: true });\n };\n\n return {\n destroy() {\n if (cleanup) cleanup();\n }\n };\n }\n });\n}\n\n\n","import { Plugin, PluginKey, Transaction, EditorState } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\nimport { Node as ProseMirrorNode } from \"prosemirror-model\";\n\nexport interface HighlightRange {\n from: number\n to: number\n}\n\ninterface AutocompleteHighlightState {\n highlight?: HighlightRange\n decorationSet?: DecorationSet\n}\n\nexport const highlightDecorationKey = new PluginKey<AutocompleteHighlightState>(\"highlightDecoration\");\n\nfunction buildDecorationSet(highlight: HighlightRange | undefined, doc: ProseMirrorNode) {\n const decorations: Decoration[] = [];\n\n if (highlight) {\n decorations.push(\n Decoration.inline(highlight.from, highlight.to, {\n class: \"dark:bg-surface-accent-700 bg-surface-accent-300\"\n })\n );\n }\n const decorationSet = DecorationSet.create(doc, decorations);\n return decorationSet;\n}\n\n/**\n * Commands to toggle the highlight\n */\nexport const highlightCommands = {\n toggleAutocompleteHighlight: (range?: HighlightRange) => (state: EditorState, dispatch?: (tr: Transaction) => void): boolean => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(highlightDecorationKey, {\n pos,\n type: \"highlightDecoration\",\n remove: false,\n range\n });\n\n dispatch(tr);\n return true;\n },\n\n removeAutocompleteHighlight: () => (state: EditorState, dispatch?: (tr: Transaction) => void): boolean => {\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(highlightDecorationKey, {\n pos: 0,\n type: \"highlightDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n}\n\n/**\n * This plugin is used to highlight the current autocomplete suggestion.\n * It allows to set a range and remove it.\n */\nexport const highlightDecorationPlugin = (initialHighlight?: HighlightRange) => {\n return new Plugin<AutocompleteHighlightState>({\n key: highlightDecorationKey,\n state: {\n init: (_, { doc }) => {\n const decorationSet = initialHighlight && doc ? buildDecorationSet(initialHighlight, doc) : DecorationSet.empty;\n return {\n decorationSet,\n highlight: initialHighlight\n };\n },\n apply(transaction, oldState) {\n const action = transaction.getMeta(highlightDecorationKey);\n const highlight = action?.range;\n if (action?.type === \"highlightDecoration\") {\n\n const doc = transaction.doc;\n const { remove } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty\n };\n }\n const decorationSet = buildDecorationSet(highlight, doc);\n return {\n decorationSet: decorationSet,\n highlight\n }\n } else {\n return oldState\n }\n }\n },\n props: {\n decorations(state) {\n const autocompleteState = this.getState(state);\n if (autocompleteState?.decorationSet) {\n return autocompleteState.decorationSet\n } else {\n return DecorationSet.empty\n }\n }\n }\n });\n};\n","import {\n inputRules,\n wrappingInputRule,\n textblockTypeInputRule,\n smartQuotes,\n emDash,\n ellipsis,\n InputRule\n} from \"prosemirror-inputrules\";\nimport { schema } from \"../schema\";\nimport { MarkType } from \"prosemirror-model\";\n\nconst blockQuoteRule = wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote);\n\nconst orderedListRule = wrappingInputRule(\n /^(\\d+)\\.\\s$/,\n schema.nodes.ordered_list,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order === +match[1]\n);\n\nconst bulletListRule = wrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list);\n\nconst taskListRule = wrappingInputRule(/^\\s*(\\[ \\])\\s$/, schema.nodes.task_list);\n\nconst codeBlockRule = textblockTypeInputRule(/^```$/, schema.nodes.code_block);\n\nconst headingRule = textblockTypeInputRule(\n new RegExp(\"^(#{1,6})\\\\s$\"),\n schema.nodes.heading,\n (match) => ({ level: match[1].length })\n);\n\nconst horizontalRuleInputRule = new InputRule(\n /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n (state, match, start, end) => {\n const tr = state.tr;\n tr.replaceWith(start - 1, end, schema.nodes.horizontal_rule.create());\n return tr;\n }\n);\n\nfunction markInputRule(regexp: RegExp, markType: MarkType, getAttrs?: (match: RegExpMatchArray) => Record<string, any>) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const tr = state.tr;\n if (match[1]) {\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n if (textEnd < end) tr.delete(textEnd, end);\n if (textStart > start) tr.delete(start, textStart);\n end = start + match[1].length;\n }\n tr.addMark(start, end, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nconst strongRule = markInputRule(/(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/, schema.marks.bold);\nconst emRule = markInputRule(/(?:^|[^*_])(?:\\*|_)([^*_]+)(?:\\*|_)$/, schema.marks.italic);\nconst codeRule = markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code);\nconst strikeRule = markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike);\n\nexport const markdownInputRules = inputRules({\n rules: [\n ...smartQuotes,\n ellipsis,\n emDash,\n blockQuoteRule,\n orderedListRule,\n bulletListRule,\n codeBlockRule,\n headingRule,\n taskListRule,\n horizontalRuleInputRule,\n strongRule,\n emRule,\n codeRule,\n strikeRule\n ]\n});\n","import { Plugin, PluginKey } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\nimport { Node } from \"prosemirror-model\";\n\nexport const placeholderPluginKey = new PluginKey(\"placeholderPlugin\");\n\nfunction isNodeEmpty(node: Node) {\n const defaultContent = node.type.createAndFill()\n if (!defaultContent) return true\n return node.content.eq(defaultContent.content)\n}\n\nexport function placeholderPlugin(text: string) {\n return new Plugin({\n key: placeholderPluginKey,\n props: {\n decorations: (state) => {\n const doc = state.doc;\n const decorations: Decoration[] = [];\n const isEmptyDoc = doc.childCount === 1 && doc.firstChild?.isTextblock && doc.firstChild.content.size === 0;\n const { anchor } = state.selection;\n\n doc.descendants((node, pos) => {\n const isEmpty = !node.isLeaf && isNodeEmpty(node);\n\n if (isEmpty) {\n // Only show placeholder on the node that contains the cursor.\n // For a single-node empty doc, always show it (editor-empty state).\n const nodeEnd = pos + node.nodeSize;\n const hasCursor = anchor >= pos && anchor <= nodeEnd;\n\n if (!hasCursor && !isEmptyDoc) {\n return false;\n }\n\n const classes = [\"is-empty\"];\n if (isEmptyDoc) {\n classes.push(\"is-editor-empty\");\n }\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: classes.join(\" \"),\n \"data-placeholder\": text\n })\n );\n }\n return false; // Stop descending\n });\n\n return DecorationSet.create(doc, decorations);\n }\n }\n });\n}\n","import { keymap } from \"prosemirror-keymap\";\nimport { history, undo, redo } from \"prosemirror-history\";\nimport { slashCommandPlugin } from \"./slashCommandPlugin\";\nimport { dragHandlePlugin, globalDragDropPlugin } from \"../extensions/drag-and-drop\";\nimport { baseKeymap, setBlockType, toggleMark, chainCommands, exitCode, joinUp, joinDown, lift, selectParentNode } from \"prosemirror-commands\";\nimport { highlightDecorationPlugin } from \"../extensions/HighlightDecorationExtension\";\nimport { textLoadingDecorationPlugin } from \"../extensions/TextLoadingDecorationExtension\";\nimport { splitListItem, liftListItem, sinkListItem } from \"prosemirror-schema-list\";\nimport { schema } from \"../schema\";\nimport { Plugin } from \"prosemirror-state\";\nimport { gapCursor } from \"prosemirror-gapcursor\";\nimport { dropCursor } from \"prosemirror-dropcursor\";\nimport { markdownInputRules } from \"./inputrules\";\nimport { placeholderPlugin } from \"./placeholderPlugin\";\nimport { goToNextCell } from \"prosemirror-tables\";\n\nconst customKeymap = {\n \"Tab\": goToNextCell(1),\n \"Shift-Tab\": goToNextCell(-1),\n \"Mod-z\": undo,\n \"Mod-y\": redo,\n \"Shift-Mod-z\": redo,\n \"Mod-b\": toggleMark(schema.marks.bold),\n \"Mod-i\": toggleMark(schema.marks.italic),\n \"Mod-u\": toggleMark(schema.marks.underline),\n \"Mod-Shift-s\": toggleMark(schema.marks.strike),\n \"Mod-e\": toggleMark(schema.marks.code),\n \"Mod-Shift-h\": toggleMark(schema.marks.highlight),\n\n \"Enter\": splitListItem(schema.nodes.list_item),\n \"Shift-Enter\": splitListItem(schema.nodes.task_item),\n\n \"Mod-[\": liftListItem(schema.nodes.list_item),\n \"Mod-]\": sinkListItem(schema.nodes.list_item),\n\n \"Shift-Mod-8\": setBlockType(schema.nodes.bullet_list),\n \"Shift-Mod-9\": setBlockType(schema.nodes.ordered_list),\n\n \"Mod-Alt-1\": setBlockType(schema.nodes.heading, { level: 1 }),\n \"Mod-Alt-2\": setBlockType(schema.nodes.heading, { level: 2 }),\n \"Mod-Alt-3\": setBlockType(schema.nodes.heading, { level: 3 }),\n\n \"Mod-Alt-0\": setBlockType(schema.nodes.paragraph)\n};\n\nexport const getCorePlugins = (): Plugin[] => [\n history(),\n keymap(customKeymap),\n keymap(baseKeymap),\n globalDragDropPlugin(),\n gapCursor(),\n slashCommandPlugin(),\n dragHandlePlugin(),\n highlightDecorationPlugin(),\n textLoadingDecorationPlugin(),\n markdownInputRules,\n placeholderPlugin(\"Press '/' for commands\")\n];\n","import React, { ReactNode } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport { Node as ProseMirrorNode } from \"prosemirror-model\";\nimport { EditorView, NodeView } from \"prosemirror-view\";\n\nexport interface ReactNodeViewProps {\n node: ProseMirrorNode;\n view: EditorView;\n getPos: () => number | undefined;\n}\n\nexport type ReactNodeViewComponent = React.FC<ReactNodeViewProps>;\n\n/**\n * A utility class that implements the ProseMirror NodeView interface but delegates rendering\n * to a React component.\n * Note: This uses createRoot, so it does not automatically inherit React Contexts.\n * If contexts are needed, wrap them manually or use a portal-based approach instead.\n */\nexport class ReactNodeView implements NodeView {\n public node: ProseMirrorNode;\n public view: EditorView;\n public getPos: () => number | undefined;\n public dom: HTMLElement;\n public contentDOM?: HTMLElement;\n private root: Root;\n private Component: ReactNodeViewComponent;\n\n constructor(\n node: ProseMirrorNode,\n view: EditorView,\n getPos: () => number | undefined,\n Component: ReactNodeViewComponent,\n as = \"div\",\n className?: string,\n contentDOMElement?: HTMLElement\n ) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n this.Component = Component;\n\n this.dom = document.createElement(as);\n if (className) this.dom.className = className;\n if (contentDOMElement) {\n this.contentDOM = contentDOMElement;\n }\n\n const container = document.createElement(\"div\");\n // We render React next to contentDOM\n this.dom.appendChild(container);\n if (this.contentDOM) {\n this.dom.appendChild(this.contentDOM);\n }\n\n this.root = createRoot(container);\n this.render();\n }\n\n private render() {\n this.root.render(\n <this.Component\n node={this.node}\n view={this.view}\n getPos={this.getPos}\n />\n );\n }\n\n update(node: ProseMirrorNode): boolean {\n if (node.type !== this.node.type) {\n return false;\n }\n this.node = node;\n this.render();\n return true;\n }\n\n destroy() {\n this.root.unmount();\n }\n\n ignoreMutation(mutation: MutationRecord | { type: \"selection\"; target: Node }) {\n if (!this.contentDOM) {\n return true;\n }\n return !this.contentDOM.contains(mutation.target);\n }\n}\n","import React from \"react\";\nimport { Checkbox, Label } from \"@rebasepro/ui\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\n\nexport const TaskItemComponent: React.FC<ReactNodeViewProps> = ({ node, view, getPos }) => {\n const checked = node.attrs.checked;\n\n const handleCheckedChange = (isChecked: boolean) => {\n const pos = getPos();\n if (typeof pos !== \"number\") return;\n\n view.dispatch(\n view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n checked: isChecked\n })\n );\n };\n\n return (\n <Label contentEditable={false} className=\"flex items-start select-none px-1 cursor-pointer\">\n <Checkbox\n checked={checked}\n onCheckedChange={handleCheckedChange}\n padding={false}\n size=\"small\"\n />\n </Label>\n );\n};\n","import React from \"react\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\n\nexport const ImageComponent: React.FC<ReactNodeViewProps> = ({ node, view, getPos }) => {\n // If the node is selected\n const selected = view.state.selection.from === getPos();\n\n return (\n <img\n src={node.attrs.src}\n alt={node.attrs.alt || \"\"}\n title={node.attrs.title || \"\"}\n className={cls(\n \"rounded-lg max-w-full !m-0\",\n selected ? \"\" : \"\"\n )}\n />\n );\n};\n","import { Node as ProseMirrorNode } from \"prosemirror-model\";\nimport { EditorView, NodeView } from \"prosemirror-view\";\nimport { ReactNodeView, ReactNodeViewComponent } from \"./ReactNodeView\";\nimport { TaskItemComponent } from \"./TaskItemComponent\";\nimport { ImageComponent } from \"./ImageComponent\";\n\nfunction createReactNodeView(\n Component: ReactNodeViewComponent,\n as = \"div\",\n className?: string,\n createContentDOM?: () => HTMLElement\n) {\n return (node: ProseMirrorNode, view: EditorView, getPos: () => number | undefined): NodeView => {\n const contentDOM = createContentDOM ? createContentDOM() : undefined;\n return new ReactNodeView(node, view, getPos, Component, as, className, contentDOM);\n };\n}\n\nexport const nodeViews = {\n task_item: createReactNodeView(\n TaskItemComponent,\n \"li\",\n \"flex items-start\",\n () => {\n const dom = document.createElement(\"div\");\n dom.className = \"flex-grow min-w-0\";\n return dom;\n }\n ),\n image: createReactNodeView(\n ImageComponent,\n \"span\",\n \"inline-block w-full\"\n )\n};\n","import { useState, useEffect, useRef, useLayoutEffect } from \"react\";\nimport { EditorState, Transaction, Plugin } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { schema } from \"../schema\";\nimport { getCorePlugins } from \"../plugins\";\nimport { parser } from \"../markdown\";\nimport { nodeViews } from \"../nodeViews\";\nimport { createDropImagePlugin } from \"../extensions/Image\";\nimport { columnResizing, tableEditing } from \"prosemirror-tables\";\n\nconst trailingNodePlugin = new Plugin({\n appendTransaction: (_, oldState, newState) => {\n const doc = newState.doc;\n if (doc.lastChild && doc.lastChild.type.name !== \"paragraph\") {\n return newState.tr.insert(doc.content.size, newState.schema.nodes.paragraph.create());\n }\n return null;\n }\n});\n\ninterface UseProseMirrorProps {\n initialContent?: string | any;\n editable?: boolean;\n handleImageUpload?: (file: File) => Promise<string>;\n}\n\nexport function useProseMirror({ initialContent, editable = true, handleImageUpload }: UseProseMirrorProps) {\n const plugins = [\n ...getCorePlugins(),\n columnResizing(),\n tableEditing(),\n trailingNodePlugin\n ];\n if (handleImageUpload) {\n plugins.push(createDropImagePlugin(handleImageUpload));\n }\n\n const defaultState = EditorState.create({\n doc: typeof initialContent === \"string\"\n ? parser.parse(initialContent)\n : initialContent\n ? schema.nodeFromJSON(initialContent)\n : schema.node(\"doc\", null, [schema.node(\"paragraph\")]),\n schema,\n plugins\n });\n\n const [state, setState] = useState<EditorState>(defaultState);\n const [view, setView] = useState<EditorView | null>(null);\n\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n\n useLayoutEffect(() => {\n if (!editorRef.current) return;\n\n const editorView = new EditorView(editorRef.current, {\n state: defaultState,\n editable: () => editable,\n dispatchTransaction: (tr: Transaction) => {\n const newState = editorView.state.apply(tr);\n editorView.updateState(newState);\n setState(newState);\n },\n nodeViews: nodeViews,\n transformPastedHTML(html: string) {\n // Strip inline styles and classes from pasted HTML so we don't\n // get textStyle marks (color, font-size, etc.) that have no\n // markdown representation. This makes paste look consistent.\n const div = document.createElement(\"div\");\n div.innerHTML = html;\n div.querySelectorAll(\"*\").forEach((el) => {\n el.removeAttribute(\"style\");\n el.removeAttribute(\"class\");\n el.removeAttribute(\"color\");\n el.removeAttribute(\"bgcolor\");\n el.removeAttribute(\"face\");\n });\n return div.innerHTML;\n }\n });\n\n // Patch posAtCoords to allow dropping/interacting anywhere horizontally natively\n const originalPosAtCoords = editorView.posAtCoords.bind(editorView);\n editorView.posAtCoords = (coords: { left: number, top: number }) => {\n const res = originalPosAtCoords(coords);\n if (!res) {\n const editorRect = editorView.dom.getBoundingClientRect();\n // If it's literally anywhere to the left of the actual ProseMirror content block\n if (coords.left <= editorRect.left) {\n const probeX = editorRect.left + Math.min(60, editorRect.width / 4);\n return originalPosAtCoords({ left: probeX,\ntop: coords.top });\n }\n // Or if it's anywhere to the right\n if (coords.left >= editorRect.right) {\n const probeX = editorRect.right - Math.min(60, editorRect.width / 4);\n return originalPosAtCoords({ left: probeX,\ntop: coords.top });\n }\n }\n return res;\n };\n\n viewRef.current = editorView;\n setView(editorView);\n\n return () => {\n editorView.destroy();\n viewRef.current = null;\n };\n }, []);\n\n // Effect to update editable status without re-mounting\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.setProps({ editable: () => editable });\n }\n }, [editable]);\n\n return {\n state,\n view,\n editorRef\n };\n}\n","\"use client\";\nimport React, { useEffect, useState, useRef, useMemo } from \"react\";\nimport { EditorState, Selection } from \"prosemirror-state\";\nimport { cls, defaultBorderMixin, Separator, useInjectStyles, TextareaAutosize } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport { EditorBubble, ImageBubble, SlashCommandMenu, TableBubble, type JSONContent } from \"./components\";\nimport { NodeSelector } from \"./selectors/node-selector\";\nimport { LinkSelector } from \"./selectors/link-selector\";\nimport { TextButtons } from \"./selectors/text-buttons\";\nimport { removeClassesFromJson } from \"./utils/remove_classes\";\nimport { parser, serializer } from \"./markdown\";\nimport { EditorAIController } from \"./types\";\nimport { useProseMirror } from \"./hooks/useProseMirror\";\nimport { ProseMirrorContext } from \"./hooks/useProseMirrorContext\";\nimport { highlightCommands } from \"./extensions/HighlightDecorationExtension\";\nimport { schema } from \"./schema\";\n\nexport type CustomEditorComponent = {\n name: string,\n component: React.FC\n};\n\nexport interface MarkdownEditorConfig {\n html?: boolean;\n transformPastedText?: boolean;\n}\n\nexport type RichTextEditorTextSize = \"sm\" | \"base\" | \"lg\";\n/** @deprecated Use `RichTextEditorTextSize` instead. */\nexport type RebaseEditorTextSize = RichTextEditorTextSize;\n\nexport type RichTextEditorProps = {\n content?: JSONContent | string,\n onMarkdownContentChange?: (content: string) => void,\n onJsonContentChange?: (content: JSONContent | null) => void,\n onHtmlContentChange?: (content: string) => void,\n handleImageUpload: (file: File) => Promise<string>,\n version?: number,\n textSize?: RichTextEditorTextSize,\n highlight?: { from: number, to: number },\n aiController?: EditorAIController,\n customComponents?: CustomEditorComponent[];\n disabled?: boolean;\n markdownConfig?: MarkdownEditorConfig;\n};\n/** @deprecated Use `RichTextEditorProps` instead. */\nexport type RebaseEditorProps = RichTextEditorProps;\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\n}\n\nexport const RichTextEditor = ({\n content,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange,\n version,\n textSize = \"base\",\n highlight,\n handleImageUpload,\n aiController,\n disabled,\n markdownConfig\n}: RichTextEditorProps) => {\n\n const { t } = useTranslation();\n\n const [openNode, setOpenNode] = useState(false);\n const [openLink, setOpenLink] = useState(false);\n\n const [isMarkdownMode, setIsMarkdownMode] = useState(false);\n const [internalMarkdown, setInternalMarkdown] = useState<string>(\"\");\n\n useEffect(() => {\n if (!isMarkdownMode) return;\n const timeout = setTimeout(() => {\n if (callbacksRef.current.onMarkdownContentChange) {\n callbacksRef.current.onMarkdownContentChange(internalMarkdown);\n }\n }, 250);\n return () => clearTimeout(timeout);\n }, [internalMarkdown, isMarkdownMode]);\n\n const handleToggleMarkdown = () => {\n if (!isMarkdownMode) {\n if (view) {\n setInternalMarkdown(serializer.serialize(view.state.doc));\n }\n setIsMarkdownMode(true);\n } else {\n if (view) {\n const newDoc = parser.parse(internalMarkdown);\n if (newDoc) {\n const tr = view.state.tr.replaceWith(0, view.state.doc.content.size, newDoc.content);\n view.dispatch(tr);\n }\n }\n setIsMarkdownMode(false);\n }\n };\n\n const handleMarkdownChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInternalMarkdown(e.target.value);\n };\n\n const handleMarkdownBlur = () => {\n const { onMarkdownContentChange, onJsonContentChange } = callbacksRef.current;\n if (onMarkdownContentChange) {\n onMarkdownContentChange(internalMarkdown);\n }\n if (onJsonContentChange) {\n try {\n const newDoc = parser.parse(internalMarkdown);\n if (newDoc) {\n onJsonContentChange(removeClassesFromJson(newDoc.toJSON()) as JSONContent);\n }\n } catch (e) {\n console.warn(\"Could not parse markdown to JSON\", e);\n }\n }\n };\n\n useInjectStyles(\"Editor\", cssStyles);\n\n const callbacksRef = useRef({ onMarkdownContentChange,\nonJsonContentChange });\n useEffect(() => {\n callbacksRef.current = { onMarkdownContentChange,\nonJsonContentChange };\n }, [onMarkdownContentChange, onJsonContentChange]);\n\n const flushChanges = (currentState: EditorState) => {\n const { onMarkdownContentChange, onJsonContentChange } = callbacksRef.current;\n if (onMarkdownContentChange) {\n try {\n const markdown = serializer.serialize(currentState.doc);\n onMarkdownContentChange(markdown);\n } catch (e) {\n console.warn(\"[RichTextEditor] Could not serialize editor state to markdown:\", e);\n }\n }\n if (onJsonContentChange) {\n const jsonContent = removeClassesFromJson(currentState.doc.toJSON()) as JSONContent;\n onJsonContentChange(jsonContent);\n }\n };\n\n const { state, view, editorRef } = useProseMirror({\n initialContent: content,\n editable: !disabled,\n handleImageUpload\n });\n\n // When `version` changes externally (e.g. form discard/reset), re-parse the\n // `content` prop and replace the ProseMirror document so the editor reflects\n // the reverted value.\n const versionRef = useRef(version);\n useEffect(() => {\n if (versionRef.current === version) return; // skip initial render\n versionRef.current = version;\n if (!view) return;\n try {\n const newDoc = typeof content === \"string\"\n ? parser.parse(content ?? \"\")\n : content\n ? schema.nodeFromJSON(content)\n : schema.node(\"doc\", null, [schema.node(\"paragraph\")]);\n if (newDoc) {\n const tr = view.state.tr.replaceWith(0, view.state.doc.content.size, newDoc.content);\n view.dispatch(tr);\n }\n } catch (e) {\n console.warn(\"[RichTextEditor] Could not reset editor content:\", e);\n }\n // Also reset raw-markdown textarea if the user is in source mode\n if (isMarkdownMode) {\n setInternalMarkdown(typeof content === \"string\" ? content : \"\");\n }\n // Reset the settling window so the replacement dispatch above is NOT\n // treated as a user edit (which would fire onChange back to the form).\n mountTimeRef.current = Date.now();\n hasUserEditedRef.current = false;\n }, [version]);\n\n const doc = state?.doc;\n // Use a time-based settling window instead of a single-skip flag.\n // The trailingNodePlugin fires appendTransaction on mount (adding a trailing\n // paragraph), which creates a second doc change after the initial parse.\n // A single-skip flag misses that second change. Instead, we skip ALL doc\n // changes within the first 500ms after the view is created.\n const mountTimeRef = useRef(Date.now());\n const hasUserEditedRef = useRef(false);\n useEffect(() => {\n if (!state) return;\n // Skip all doc changes during the initial settling window (500ms).\n // This covers both the initial parse AND the trailingNodePlugin's\n // appendTransaction that adds a trailing paragraph.\n const elapsed = Date.now() - mountTimeRef.current;\n if (elapsed < 500 && !hasUserEditedRef.current) {\n return;\n }\n hasUserEditedRef.current = true;\n const timeout = setTimeout(() => {\n flushChanges(state);\n }, 250);\n return () => clearTimeout(timeout);\n }, [doc]);\n\n useEffect(() => {\n if (!view) return;\n const dom = view.dom;\n const handleBlur = () => {\n // Don't flush during the initial settling window — the editor\n // hasn't been interacted with yet, and the serialized output\n // may differ from the input due to parse→serialize normalization.\n if (!hasUserEditedRef.current) {\n const elapsed = Date.now() - mountTimeRef.current;\n if (elapsed < 500) return;\n }\n flushChanges(view.state);\n };\n dom.addEventListener(\"blur\", handleBlur);\n return () => dom.removeEventListener(\"blur\", handleBlur);\n }, [view]);\n\n\n useEffect(() => {\n if (view) {\n if (highlight) {\n highlightCommands.toggleAutocompleteHighlight(highlight)(view.state, view.dispatch);\n } else {\n highlightCommands.removeAutocompleteHighlight()(view.state, view.dispatch);\n }\n }\n }, [highlight?.from, highlight?.to]);\n\n const proseClass = proseClasses[textSize];\n\n\n return (\n <div className=\"relative min-h-[200px] w-full flex flex-col\">\n <button\n type=\"button\"\n onClick={handleToggleMarkdown}\n title={isMarkdownMode ? \"Switch to Visual Editor\" : \"Switch to Markdown\"}\n className=\"absolute top-2 right-2 z-10 px-2 py-1 text-xs font-medium text-surface-400 hover:text-surface-700 dark:text-surface-600 dark:hover:text-surface-300 transition-colors opacity-50 hover:opacity-100 bg-transparent rounded\"\n >\n {isMarkdownMode ? \"Visual\" : \"Markdown\"}\n </button>\n\n <ProseMirrorContext.Provider value={useMemo(() => ({ state,\nview }), [state, view])}>\n\n <div style={{ display: isMarkdownMode ? \"none\" : \"flex\" }} className=\"flex-1 flex flex-col\">\n <div\n ref={editorRef}\n onClick={(e) => {\n // If the click landed on the wrapper padding (not on the ProseMirror\n // content), focus the editor and place the cursor at the nearest position.\n if (view && e.target === e.currentTarget) {\n view.focus();\n // Place cursor at end of the document\n const end = view.state.doc.content.size;\n const tr = view.state.tr.setSelection(\n Selection.near(view.state.doc.resolve(end), -1)\n );\n view.dispatch(tr);\n }\n }}\n className={cls(\"relative prose dark:prose-invert cursor-text flex-1\", proseClass, \"prose-headings:font-title prose-headings:font-normal prose-strong:font-semibold prose-code:font-normal prose-blockquote:font-normal prose-a:font-normal font-default focus:outline-none max-w-full py-4\")}\n />\n\n {view && (\n <>\n <EditorBubble\n options={{\n placement: \"top\",\n offset: 6\n }}\n className={cls(\"flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-surface-800 shadow\", defaultBorderMixin)}\n >\n <NodeSelector portalContainer={editorRef.current} open={openNode} onOpenChange={setOpenNode}/>\n <Separator orientation=\"vertical\"/>\n <LinkSelector open={openLink} onOpenChange={setOpenLink}/>\n <Separator orientation=\"vertical\"/>\n <TextButtons/>\n </EditorBubble>\n\n <ImageBubble\n options={{\n placement: \"bottom\",\n offset: 6\n }}\n />\n <TableBubble/>\n </>\n )}\n\n <SlashCommandMenu upload={handleImageUpload} aiController={aiController}/>\n </div>\n\n {isMarkdownMode && (\n <TextareaAutosize\n value={internalMarkdown}\n onChange={handleMarkdownChange}\n onBlur={handleMarkdownBlur}\n className={cls(\n \"w-full h-full min-h-[200px] px-12 py-4 bg-transparent resize-none font-mono focus:ring-0\",\n proseClass\n )}\n style={{\n tabSize: 4,\n outline: \"none\",\n border: \"none\",\n boxShadow: \"none\"\n }}\n />\n )}\n\n </ProseMirrorContext.Provider>\n </div>\n );\n};\n/** @deprecated Use `RichTextEditor` instead. */\nexport const RebaseEditor = RichTextEditor;\n\nconst cssStyles = `\n.ProseMirror {\n box-shadow: none !important;\n padding-left: 2rem;\n padding-right: 2rem;\n min-height: 100%;\n}\n.ProseMirror .is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n.ProseMirror .is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n\n[data-theme=\"dark\"] {\n .ProseMirror .is-empty::before {\n color: rgb(100 116 139); //500\n }\n}\n\n.is-empty {\n cursor: text;\n color: rgb(100 116 139); //500\n}\n\n.ProseMirror img {\n transition: filter 0.1s ease-in-out;\n}\n.ProseMirror img:hover {\n cursor: pointer;\n filter: brightness(90%);\n}\n.ProseMirror img.ProseMirror-selectednode {\n filter: brightness(90%);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;\n}\n\nul[data-type=\"taskList\"] li > label {\n margin-right: 0.2rem;\n user-select: none;\n}\n@media screen and (max-width: 768px) {\n ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n }\n}\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n background-color: rgb(30 41 59);\n border: 2px solid #666;\n}\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:hover { background-color: rgb(51 65 85); }\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:active { background-color: rgb(71 85 105); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n -webkit-appearance: none;\n appearance: none;\n background-color: white;\n margin: 0;\n cursor: pointer;\n width: 1.2em;\n height: 1.2em;\n position: relative;\n top: 5px;\n border: 2px solid #777;\n border-radius: 0.25em;\n margin-right: 0.3rem;\n display: grid;\n place-content: center;\n}\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:hover { background-color: rgb(241 245 249); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:active { background-color: rgb(226 232 240); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]::before {\n content: \"\";\n width: 0.65em;\n height: 0.65em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em;\n transform-origin: center;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n}\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:checked::before { transform: scale(1); }\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(226 232 240);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n }\n}\nul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(51 65 85);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n}\n.tippy-box { max-width: 400px !important; }\n\n.ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(219 234 254);\n transition: background-color 0.2s;\n box-shadow: none;\n}\n[data-theme=\"dark\"] .ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(51 65 85);\n}\n.prose-base table p { margin: 0; }\n\n.drag-handle {\n position: absolute;\n opacity: 1;\n transition: opacity ease-in 0.2s;\n border-radius: 0.25rem;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7,8.44771525 7,9 7,9 C7,9.55228475 7,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);\n background-repeat: no-repeat;\n background-position: center;\n width: 1.2rem;\n height: 1.5rem;\n z-index: 100;\n cursor: grab;\n}\n.drag-handle::before {\n content: '';\n position: absolute;\n top: -10px;\n bottom: -10px;\n left: -20px; \n right: 0px;\n z-index: -1;\n}\n.drag-handle:hover { background-color: rgb(241 245 249); transition: background-color 0.2s; }\n.drag-handle:active { background-color: rgb(226 232 240); transition: background-color 0.2s; }\n.drag-handle.hide { opacity: 0; pointer-events: none; }\n@media screen and (max-width: 600px) { .drag-handle { display: none; pointer-events: none; } }\n[data-theme=\"dark\"] .drag-handle:hover { background-color: rgb(51 65 85); }\n[data-theme=\"dark\"] .drag-handle:active { background-color: rgb(51 65 85); }\n.prosemirror-dropcursor-block {\n background-color: var(--color-surface-accent-600);\n}\n[data-theme=\"dark\"] .prosemirror-dropcursor-block {\n background-color: var(--color-surface-accent-300);\n}\n\n.ProseMirror table {\n border-collapse: separate;\n border-spacing: 0;\n table-layout: fixed;\n width: 100%;\n margin: 1em 0;\n overflow: hidden;\n border-radius: 0.375rem;\n border: 1px solid #e5e7eb;\n}\n[data-theme=\"dark\"] .ProseMirror table {\n border-color: #374151;\n}\n\n.ProseMirror td, .ProseMirror th {\n min-width: 1em;\n padding: 8px 10px;\n vertical-align: top;\n box-sizing: border-box;\n position: relative;\n border-right: 1px solid #e5e7eb;\n border-bottom: 1px solid #e5e7eb;\n}\n[data-theme=\"dark\"] .ProseMirror td, [data-theme=\"dark\"] .ProseMirror th {\n border-right-color: #374151;\n border-bottom-color: #374151;\n}\n\n.ProseMirror tr:last-child td, .ProseMirror tr:last-child th {\n border-bottom: none;\n}\n.ProseMirror th:last-child, .ProseMirror td:last-child {\n border-right: none;\n}\n\n.ProseMirror td {\n background-color: transparent;\n}\n\n.ProseMirror th {\n font-weight: 600;\n text-align: left;\n background-color: #f3f4f6;\n color: #374151;\n}\n[data-theme=\"dark\"] .ProseMirror td {\n background-color: transparent;\n}\n[data-theme=\"dark\"] .ProseMirror th {\n background-color: rgba(255, 255, 255, 0.05);\n color: #d1d5db;\n}\n`;\n"],"mappings":"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"}
1
+ {"version":3,"file":"editor.js","names":[],"sources":["../src/editor/hooks/useProseMirrorContext.ts","../src/editor/components/editor-bubble.tsx","../src/editor/components/editor-bubble-item.tsx","../src/editor/plugins/slashCommandPlugin.ts","../src/editor/extensions/Image.ts","../src/editor/extensions/TextLoadingDecorationExtension.tsx","../src/editor/components/SlashCommandMenu.tsx","../src/editor/components/image-bubble.tsx","../src/editor/components/table-bubble.tsx","../src/editor/utils/prosemirror-utils.ts","../src/editor/selectors/node-selector.tsx","../src/editor/selectors/link-selector.tsx","../src/editor/selectors/text-buttons.tsx","../src/editor/utils/remove_classes.ts","../src/editor/extensions/clipboard.ts","../src/editor/extensions/drag-and-drop.tsx","../src/editor/extensions/HighlightDecorationExtension.ts","../src/editor/plugins/inputrules.ts","../src/editor/plugins/placeholderPlugin.ts","../src/editor/plugins/index.ts","../src/editor/nodeViews/ReactNodeView.tsx","../src/editor/nodeViews/TaskItemComponent.tsx","../src/editor/nodeViews/ImageComponent.tsx","../src/editor/nodeViews/index.ts","../src/editor/hooks/useProseMirror.ts","../src/editor/editor.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { EditorState } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\n\nexport interface ProseMirrorContextType {\n state: EditorState | null;\n view: EditorView | null;\n}\n\nexport const ProseMirrorContext = createContext<ProseMirrorContextType>({\n state: null,\n view: null\n});\n\nexport const useProseMirrorContext = () => useContext(ProseMirrorContext);\n","import { forwardRef, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n type VirtualElement,\n type Placement\n} from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\n\nexport interface EditorBubbleProps {\n children: ReactNode;\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({\n children,\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!view || !state) return;\n\n // Delay evaluation slightly to let selection settle\n const timer = setTimeout(() => {\n const { selection } = state;\n const { empty } = selection;\n\n // check if image is selected\n let isImage = false;\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.type.name === \"image\") isImage = true;\n });\n\n if (isImage || empty || selection instanceof NodeSelection) {\n setShow(false);\n return;\n }\n\n setShow(true);\n }, 0);\n\n return () => clearTimeout(timer);\n }, [view, state]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n\n // Fallback for end selection coords\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n left,\n right,\n bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n\n // Recompute coords in case of scroll\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore error if selection is out of bounds\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n if (!show) return null;\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{\n position: \"fixed\",\n zIndex: 9999,\n visibility: \"hidden\"\n }}\n onMouseDown={(e) => {\n e.preventDefault(); // Don't lose focus inside ProseMirror\n }}\n >\n {children}\n </div>\n );\n }\n);\n\nEditorBubble.displayName = \"EditorBubble\";\n\nexport default EditorBubble;\n","import { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from \"react\";\nimport { Slot } from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\n\ninterface EditorBubbleItemProps {\n children: ReactNode;\n asChild?: boolean;\n onSelect?: () => void;\n}\n\nexport const EditorBubbleItem = forwardRef<\n HTMLDivElement,\n EditorBubbleItemProps & Omit<ComponentPropsWithoutRef<\"div\">, \"onSelect\">\n>(({ children, asChild, onSelect, ...rest }, ref) => {\n const { view } = useProseMirrorContext();\n const Comp = asChild ? Slot : \"div\";\n\n if (!view) return null;\n\n return (\n <Comp ref={ref} {...rest} onMouseDown={(e: React.MouseEvent) => {\n // Prevent default to avoid losing focus\n e.preventDefault();\n }} onClick={() => onSelect?.()}>\n {children}\n </Comp>\n );\n});\n\nEditorBubbleItem.displayName = \"EditorBubbleItem\";\n\nexport default EditorBubbleItem;\n","import { Plugin, PluginKey, TextSelection } from \"prosemirror-state\";\n\nexport const SlashCommandPluginKey = new PluginKey(\"slash-command\");\n\nexport interface SlashCommandState {\n active: boolean;\n range?: { from: number; to: number };\n query?: string;\n dismissed?: boolean;\n}\n\nexport function slashCommandPlugin() {\n return new Plugin({\n key: SlashCommandPluginKey,\n state: {\n init(): SlashCommandState {\n return { active: false };\n },\n apply(tr, value, oldState, newState): SlashCommandState {\n const meta = tr.getMeta(SlashCommandPluginKey);\n if (meta !== undefined) {\n return meta;\n }\n\n const { selection } = newState;\n if (!(selection instanceof TextSelection) || !selection.empty) {\n return { active: false };\n }\n\n // Make sure we are in a paragraph or heading block, not a code_block for example\n const $anchor = selection.$anchor;\n if ($anchor.parent.type.name === \"code_block\") {\n return { active: false };\n }\n\n const textBefore = $anchor.parent.textBetween(\n Math.max(0, $anchor.parentOffset - 20),\n $anchor.parentOffset,\n undefined,\n \"\\ufffc\"\n );\n const match = textBefore.match(/(?:\\s|^)(\\/)([a-zA-Z0-9]*)$/);\n\n if (!match) {\n return { active: false };\n }\n\n // If the user previously dismissed this slash command, keep it dismissed\n if (value.dismissed) {\n return { active: false,\ndismissed: true };\n }\n\n // match[1] is the slash, match[2] is the query\n const query = match[2];\n const from = $anchor.pos - query.length - 1;\n const to = $anchor.pos;\n return { active: true,\nrange: { from,\nto },\nquery };\n }\n }\n });\n}\n","import { cls, defaultBorderMixin } from \"@rebasepro/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"prosemirror-view\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\nexport async function onFileRead(view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n const { schema } = view.state;\n\n const state = view.state as typeof view.state & { plugins: Plugin[] };\n const plugin = state.plugins.find((p: Plugin) => p.spec.key === ImagePluginKey);\n if (!plugin) {\n console.error(\"Image plugin not found\");\n return;\n }\n\n const decoId = Math.random().toString(36).substring(7);\n const placeholder = document.createElement(\"div\");\n const imageElement = document.createElement(\"img\");\n imageElement.setAttribute(\"class\", \"opacity-40 rounded-lg border \" + defaultBorderMixin);\n imageElement.src = readerEvent.target?.result as string;\n placeholder.appendChild(imageElement);\n\n const deco = Decoration.widget(pos, placeholder, { id: decoId });\n let decorationSet = plugin.getState(view.state);\n decorationSet = decorationSet?.add(view.state.doc, [deco]);\n view.dispatch(view.state.tr.setMeta(plugin, { decorationSet }));\n\n // Image Upload Logic\n const src = await upload(image);\n console.debug(\"Uploaded image\", src);\n\n const replacePlaceholder = () => {\n // Retrieve the LATEST state after the async upload\n let currentDecos = plugin.getState(view.state) as DecorationSet;\n const foundDecos = currentDecos.find(undefined, undefined, spec => spec.id === decoId);\n\n if (foundDecos.length === 0) {\n console.warn(\"Image placeholder removed before upload completed.\");\n return;\n }\n\n // Get the mapped position of the decoration\n const currentPos = foundDecos[0].from;\n\n // Replace placeholder with actual image at the correct mapped position\n const imageNode = view.state.schema.nodes.image.create({ src });\n const tr = view.state.tr.replaceWith(currentPos, currentPos, imageNode);\n\n // Remove placeholder decoration using the LATEST decorationSet\n currentDecos = currentDecos.remove(foundDecos);\n tr.setMeta(plugin, { decorationSet: currentDecos });\n view.dispatch(tr);\n };\n\n // Preload the image so it doesn't cause a layout shift when replacing the placeholder\n const preloader = new Image();\n preloader.src = src;\n preloader.onload = replacePlaceholder;\n preloader.onerror = replacePlaceholder;\n}\n\nexport const ImagePluginKey = new PluginKey(\"imagePlugin\");\n\nexport const createDropImagePlugin = (upload: UploadFn): Plugin => {\n const plugin: Plugin = new Plugin({\n key: ImagePluginKey,\n state: {\n // Initialize the plugin state with an empty DecorationSet\n init: () => DecorationSet.empty,\n // Apply transactions to update the state\n apply: (tr, old) => {\n // Handle custom transaction steps that update decorations\n const meta = tr.getMeta(plugin);\n if (meta && meta.decorationSet) {\n return meta.decorationSet;\n }\n // Map decorations to the new document structure\n return old.map(tr.mapping, tr.doc);\n }\n },\n props: {\n handleDOMEvents: {\n dragover: (view: EditorView, event: DragEvent) => {\n if (event.dataTransfer?.types?.includes(\"Files\")) {\n event.preventDefault();\n return true;\n }\n return false;\n },\n drop: (view: EditorView, event: DragEvent) => {\n if (!event.dataTransfer?.files || event.dataTransfer?.files.length === 0) {\n return false;\n }\n event.preventDefault();\n\n const files = Array.from(event.dataTransfer.files);\n const images = files.filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n console.debug(\"No images found in dropped files\");\n return false;\n }\n\n images.forEach(image => {\n const position = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n if (!position) return;\n\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n return true;\n }\n },\n handlePaste(view: EditorView, event: ClipboardEvent) {\n const html = event.clipboardData?.getData(\"text/html\");\n if (html && html.includes(\"<img\")) {\n // Let ProseMirror handle the HTML paste natively (e.g. copy-pasted from the editor itself or a webpage)\n return false;\n }\n\n const items = Array.from(event.clipboardData?.items || []);\n const pos = view.state.selection.from;\n let anyImageFound = false;\n\n items\n .filter((item) => item.type.startsWith(\"image/\"))\n .forEach((item) => {\n const image = item.getAsFile();\n if (image) {\n anyImageFound = true;\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n }\n });\n\n return anyImageFound;\n },\n decorations(state) {\n return plugin.getState(state);\n }\n }\n });\n\n return plugin;\n};\n\n\n","import { Plugin, PluginKey, Transaction, EditorState } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\n\n// Define and export the plugin key\nexport const loadingDecorationKey = new PluginKey<LoadingDecorationState>(\"loadingDecoration\");\n\ninterface LoadingDecorationState {\n decorationSet: DecorationSet;\n hasDecoration: boolean;\n}\n\nexport const textLoadingCommands = {\n toggleLoadingDecoration: (state: EditorState, dispatch: ((tr: Transaction) => void) | undefined, loadingHtml?: string): boolean => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(loadingDecorationKey, {\n pos,\n type: \"loadingDecoration\",\n remove: false,\n loadingHtml\n });\n\n dispatch(tr);\n return true;\n },\n\n removeLoadingDecoration: (state: EditorState, dispatch: ((tr: Transaction) => void) | undefined): boolean => {\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(loadingDecorationKey, {\n pos: 0, // We can pass any position as it will remove the entire decoration set\n type: \"loadingDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n};\n\n/**\n * This plugin is used to display streaming content from an LLM.\n */\nexport const textLoadingDecorationPlugin = () => {\n return new Plugin<LoadingDecorationState>({\n key: loadingDecorationKey,\n\n state: {\n init() {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n },\n\n apply(tr, oldState) {\n const action = tr.getMeta(loadingDecorationKey);\n\n if (action?.type === \"loadingDecoration\") {\n const { pos, remove, loadingHtml } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty,\n hasDecoration: false\n };\n }\n\n const decoration = Decoration.widget(pos, () => {\n const container = document.createElement(\"span\");\n container.className = \"loading-decoration\";\n\n // Sanitize and append HTML\n if (loadingHtml) {\n container.innerHTML = loadingHtml;\n } else {\n const span = document.createElement(\"span\");\n span.innerText = \"loading...\";\n container.appendChild(span);\n }\n\n return container;\n });\n\n return {\n decorationSet: DecorationSet.empty.add(tr.doc, [decoration]),\n hasDecoration: true\n };\n }\n\n return {\n decorationSet: oldState.decorationSet.map(tr.mapping, tr.doc),\n hasDecoration: oldState.hasDecoration\n };\n }\n },\n\n props: {\n decorations(state) {\n return this.getState(state)?.decorationSet || DecorationSet.empty;\n }\n }\n });\n};\n","\nimport React, { useEffect, useRef, useState, ReactNode } from \"react\";\nimport { Fragment, DOMParser } from \"prosemirror-model\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift, type VirtualElement } from \"@floating-ui/dom\";\nimport { SlashCommandPluginKey } from \"../plugins/slashCommandPlugin\";\nimport {\n CheckSquareIcon,\n cls,\n CodeIcon,\n defaultBorderMixin,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n iconSize,\n ImageIcon,\n ListIcon,\n ListOrderedIcon,\n QuoteIcon,\n TableIcon,\n TypeIcon,\n Wand2Icon\n} from \"@rebasepro/ui\";\nimport { setBlockType, wrapIn } from \"prosemirror-commands\";\nimport { wrapInList } from \"prosemirror-schema-list\";\nimport { schema } from \"../schema\";\nimport { EditorView } from \"prosemirror-view\";\nimport { TextSelection } from \"prosemirror-state\";\nimport type { EditorAIController } from \"../types\";\nimport { onFileRead, UploadFn } from \"../extensions/Image\";\nimport { textLoadingCommands } from \"../extensions/TextLoadingDecorationExtension\";\nimport { parser } from \"../markdown\";\n\ninterface SuggestionItem {\n title: string;\n description: string;\n icon: ReactNode;\n searchTerms?: string[];\n command: (\n view: EditorView,\n range: { from: number; to: number },\n upload: UploadFn,\n aiController?: EditorAIController,\n setSubView?: (viewId: string | null) => void\n ) => void;\n}\n\nconst suggestionItems: SuggestionItem[] = [\n {\n title: \"Text\",\n description: \"Just start typing with plain text.\",\n searchTerms: [\"p\", \"paragraph\"],\n icon: <TypeIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);\n }\n },\n {\n title: \"To-do List\",\n description: \"Track tasks with a to-do list.\",\n searchTerms: [\"todo\", \"task\", \"list\", \"check\", \"checkbox\"],\n icon: <CheckSquareIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.task_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 1\",\n description: \"Big section heading.\",\n searchTerms: [\"title\", \"big\", \"large\"],\n icon: <Heading1Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 1 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 2\",\n description: \"Medium section heading.\",\n searchTerms: [\"subtitle\", \"medium\"],\n icon: <Heading2Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 2 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Heading 3\",\n description: \"Small section heading.\",\n searchTerms: [\"subtitle\", \"small\"],\n icon: <Heading3Icon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.heading, { level: 3 })(view.state, view.dispatch);\n }\n },\n {\n title: \"Bullet List\",\n description: \"Create a simple bullet list.\",\n searchTerms: [\"unordered\", \"point\"],\n icon: <ListIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.bullet_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Numbered List\",\n description: \"Create a list with numbering.\",\n searchTerms: [\"ordered\"],\n icon: <ListOrderedIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapInList(schema.nodes.ordered_list)(view.state, view.dispatch);\n }\n },\n {\n title: \"Quote\",\n description: \"Capture a quote.\",\n searchTerms: [\"blockquote\"],\n icon: <QuoteIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n wrapIn(schema.nodes.blockquote)(view.state, view.dispatch);\n }\n },\n {\n title: \"Code\",\n description: \"Capture a code snippet.\",\n searchTerms: [\"codeblock\"],\n icon: <CodeIcon size={iconSize.small}/>,\n command: (view, range) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.code_block)(view.state, view.dispatch);\n }\n },\n {\n title: \"Image\",\n description: \"Upload an image from your computer.\",\n searchTerms: [\"photo\", \"picture\", \"media\", \"upload\", \"file\"],\n icon: <ImageIcon size={iconSize.small}/>,\n command: (view, range, upload) => {\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = async () => {\n if (input.files?.length) {\n const file = input.files[0];\n if (!file) return;\n const pos = view.state.selection.from;\n\n const images = Array.from(input.files).filter(f => /image/i.test(f.type));\n if (images.length === 0) return false;\n\n images.forEach(image => {\n const reader = new FileReader();\n reader.onload = async (readerEvent) => {\n await onFileRead(view, readerEvent, pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n }\n return true;\n };\n input.click();\n }\n },\n {\n title: \"Table\",\n description: \"Insert a custom grid table.\",\n searchTerms: [\"table\", \"grid\", \"row\", \"col\"],\n icon: <TableIcon size={iconSize.small}/>,\n command: (view, range, upload, aiController, setSubView) => {\n if (setSubView) setSubView(\"table-grid\");\n }\n }\n];\n\nconst autocompleteSuggestionItem: SuggestionItem = {\n title: \"Autocomplete\",\n description: \"Add text based on the context.\",\n searchTerms: [\"ai\"],\n icon: <Wand2Icon size={iconSize.small}/>,\n command: async (view, range, upload, aiController) => {\n if (!aiController) throw Error(\"No AiController\");\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to));\n setBlockType(schema.nodes.paragraph)(view.state, view.dispatch);\n\n const { state } = view;\n const { from, to } = state.selection;\n\n const textBeforeCursor = state.doc.textBetween(0, from, \"\\n\");\n const textAfterCursor = state.doc.textBetween(to, state.doc.content.size, \"\\n\");\n\n let buffer = \"\";\n const result = await aiController.autocomplete(textBeforeCursor, textAfterCursor, (delta) => {\n buffer += delta;\n if (delta.length !== 0) {\n textLoadingCommands.toggleLoadingDecoration(view.state, view.dispatch, buffer);\n }\n });\n\n // Insert parsed text result at cursor natively\n try {\n // The AI controller might stream literal \"\\n\" characters depending on its JSON decoding layer.\n // We need to un-escape these back to genuine newlines so MarkdownIt block-parsing works.\n const unescapedResult = result.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\");\n\n const isHTML = /<\\/?[a-z][\\s\\S]*>/i.test(unescapedResult);\n let parsedDoc;\n\n if (isHTML) {\n const div = document.createElement(\"div\");\n div.innerHTML = unescapedResult;\n parsedDoc = DOMParser.fromSchema(view.state.schema).parse(div);\n } else {\n parsedDoc = parser.parse(unescapedResult);\n }\n\n if (parsedDoc) {\n const tr = view.state.tr.replaceWith(view.state.selection.from, view.state.selection.from, parsedDoc.content);\n view.dispatch(tr);\n } else {\n view.dispatch(view.state.tr.insertText(unescapedResult));\n }\n } catch (e) {\n console.error(e);\n view.dispatch(view.state.tr.insertText(result));\n }\n }\n};\n\nexport const SlashCommandMenu = ({ upload, aiController }: { upload: UploadFn, aiController?: EditorAIController }) => {\n const { view, state } = useProseMirrorContext();\n const menuRef = useRef<HTMLDivElement>(null);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [subView, setSubView] = useState<string | null>(null);\n const [tableGridCoords, setTableGridCoords] = useState({ r: 0,\nc: 0 });\n\n const pluginState = state ? SlashCommandPluginKey.getState(state) : null;\n const isActive = pluginState?.active;\n const query = pluginState?.query || \"\";\n const range = pluginState?.range;\n\n const filteredItems = React.useMemo(() => {\n if (!isActive) return [];\n const availableItems = [...suggestionItems];\n if (aiController) availableItems.push(autocompleteSuggestionItem);\n\n return availableItems.filter(item => {\n const inTitle = item.title.toLowerCase().includes(query.toLowerCase());\n if (inTitle) return inTitle;\n return item.searchTerms?.some(term => term.toLowerCase().includes(query.toLowerCase()));\n });\n }, [query, isActive, aiController]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [query]);\n\n useEffect(() => {\n if (!isActive) setSubView(null);\n }, [isActive]);\n\n useEffect(() => {\n if (!view || !isActive || !range || !menuRef.current) return;\n\n const start = view.coordsAtPos(range.from);\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: 0,\n height: start.bottom - start.top,\n x: start.left,\n y: start.top,\n top: start.top,\n left: start.left,\n right: start.left,\n bottom: start.bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: \"bottom-start\",\n middleware: [offset(4), flip(), shift()],\n strategy: \"fixed\"\n }).then(({ x, y }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [view, isActive, range]);\n\n useEffect(() => {\n if (!isActive || !view) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (subView === \"table-grid\") {\n if (e.key === \"Escape\") {\n e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation();\n setSubView(null);\n setTableGridCoords({ r: 0,\nc: 0 });\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.max(0, prev.r - 1),\nc: prev.c }));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.min(4, prev.r + 1),\nc: prev.c }));\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r,\nc: Math.max(0, prev.c - 1) }));\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r,\nc: Math.min(4, prev.c + 1) }));\n } else if (e.key === \"Enter\") {\n e.preventDefault(); e.stopPropagation();\n if (range) {\n const tableNode = createTableNode(view.state.schema, tableGridCoords.r + 1, tableGridCoords.c + 1);\n const tr = view.state.tr.replaceWith(range.from, range.to, tableNode);\n try {\n const selection = TextSelection.create(tr.doc, range.from + 4);\n tr.setSelection(selection);\n } catch (e) {\n console.warn(\"Could not select first cell\", e);\n }\n tr.setMeta(SlashCommandPluginKey, { active: false });\n view.dispatch(tr);\n view.focus();\n setSubView(null);\n setTableGridCoords({ r: 0,\nc: 0 });\n }\n }\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex(prev => (prev + filteredItems.length - 1) % filteredItems.length);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex(prev => (prev + 1) % filteredItems.length);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n if (filteredItems[selectedIndex] && range) {\n filteredItems[selectedIndex].command(view, range, upload, aiController, setSubView);\n // Do not focus view if a subview opened\n setTimeout(() => {\n // Focus is managed by the caller\n }, 0);\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n // Close menu gracefully and keep it dismissed\n view.dispatch(view.state.tr.setMeta(SlashCommandPluginKey, { active: false,\ndismissed: true }));\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => window.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n }, [isActive, selectedIndex, filteredItems, view, range, upload, aiController, subView, tableGridCoords]);\n\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex]?.scrollIntoView({ block: \"nearest\" });\n }\n }, [selectedIndex]);\n\n useEffect(() => {\n if (!subView) {\n setTableGridCoords({ r: 0,\nc: 0 });\n }\n }, [subView]);\n\n if (!isActive || filteredItems.length === 0) return null;\n\n if (subView === \"table-grid\" && range && view) {\n return (\n <div\n ref={menuRef}\n onMouseDown={(e) => e.preventDefault()}\n style={{ position: \"fixed\",\nzIndex: 9999,\nvisibility: \"hidden\" }}\n className={cls(\"text-surface-900 dark:text-white rounded-md border bg-white dark:bg-surface-800 p-2 shadow transition-none\", defaultBorderMixin)}\n >\n <TableGridPicker\n hoveredRow={tableGridCoords.r}\n hoveredCol={tableGridCoords.c}\n onHover={(r, c) => setTableGridCoords({ r,\nc })}\n onSelect={(rows, cols) => {\n const tableNode = createTableNode(view.state.schema, rows, cols);\n const tr = view.state.tr.replaceWith(range.from, range.to, tableNode);\n try {\n const selection = TextSelection.create(tr.doc, range.from + 4);\n tr.setSelection(selection);\n } catch (e) {\n console.warn(\"Could not select first cell\", e);\n }\n tr.setMeta(SlashCommandPluginKey, { active: false });\n view.dispatch(tr);\n view.focus();\n setSubView(null);\n }}\n />\n </div>\n );\n }\n\n return (\n <div\n ref={menuRef}\n style={{ position: \"fixed\",\nzIndex: 9999,\nvisibility: \"hidden\" }}\n className={cls(\"text-surface-900 dark:text-white max-h-[280px] w-72 overflow-y-auto rounded-md border bg-white dark:bg-surface-800 px-1 py-2 shadow transition-none\", defaultBorderMixin)}\n >\n {filteredItems.map((item, index) => (\n <button\n key={item.title}\n ref={el => { itemRefs.current[index] = el; }}\n onClick={(e) => {\n e.preventDefault();\n if (range && view) {\n item.command(view, range, upload, aiController, setSubView);\n // Only focus back to editor if it didn't open a sub-view\n if (!subView) view.focus();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n className={cls(\"flex w-full items-center space-x-2 rounded-md px-2 py-1 text-left text-sm hover:bg-blue-50 hover:dark:bg-surface-700\",\n index === selectedIndex ? \"bg-blue-100 dark:bg-surface-accent-950\" : \"\")}\n >\n <div className={cls(\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md border bg-white dark:bg-surface-800\", defaultBorderMixin)}>\n {item.icon}\n </div>\n <div className=\"flex flex-col overflow-hidden\">\n <p className=\"font-medium truncate\">{item.title}</p>\n <p className=\"text-xs text-surface-700 dark:text-surface-accent-300 truncate\">\n {item.description}\n </p>\n </div>\n </button>\n ))}\n </div>\n );\n};\n\nconst createTableNode = (schema: import(\"prosemirror-model\").Schema, rowsCount: number, colsCount: number) => {\n const rows = [];\n for (let r = 0; r < rowsCount; r++) {\n const cells = [];\n for (let c = 0; c < colsCount; c++) {\n const isHeader = r === 0;\n const cellType = isHeader ? schema.nodes.table_header : schema.nodes.table_cell;\n const cell = cellType.createAndFill();\n if (cell) cells.push(cell);\n }\n const row = schema.nodes.table_row.create(null, Fragment.from(cells));\n rows.push(row);\n }\n return schema.nodes.table.create(null, Fragment.from(rows));\n};\n\nconst TableGridPicker = ({\n hoveredRow,\n hoveredCol,\n onHover,\n onSelect\n}: {\n hoveredRow: number;\n hoveredCol: number;\n onHover: (r: number, c: number) => void;\n onSelect: (r: number, c: number) => void;\n}) => {\n return (\n <div className=\"flex flex-col gap-1 items-center justify-center p-1 w-fit\">\n <span className=\"text-xs text-gray-500 font-medium mb-1\">\n {hoveredCol + 1} x {hoveredRow + 1} Table\n </span>\n <div className=\"flex flex-col gap-1\">\n {Array.from({ length: 5 }).map((_, r) => (\n <div key={r} className=\"flex gap-1\">\n {Array.from({ length: 5 }).map((_, c) => (\n <div\n key={c}\n className={cls(\n \"w-5 h-5 border rounded-sm cursor-pointer transition-colors duration-75\",\n r <= hoveredRow && c <= hoveredCol\n ? \"bg-blue-100 border-blue-400 dark:bg-blue-900 dark:border-blue-500\"\n : \"bg-white dark:bg-surface-800 border-gray-200 dark:border-gray-700 hover:border-blue-300\"\n )}\n onMouseEnter={() => onHover(r, c)}\n onClick={() => onSelect(hoveredRow + 1, hoveredCol + 1)}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift, type VirtualElement, type Placement } from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\nimport { TextField, defaultBorderMixin, Typography, cls } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\n\nexport interface ImageBubbleProps {\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nexport const ImageBubble = forwardRef<HTMLDivElement, ImageBubbleProps>(\n ({\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const { t } = useTranslation();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n const [alt, setAlt] = useState(\"\");\n const [title, setTitle] = useState(\"\");\n const [imagePos, setImagePos] = useState<number | null>(null);\n\n useEffect(() => {\n if (!view) return;\n const handleContextMenu = (e: MouseEvent) => {\n const posInfo = view.posAtCoords({\n left: e.clientX,\n top: e.clientY\n });\n if (posInfo && posInfo.inside >= 0) {\n const node = view.state.doc.nodeAt(posInfo.inside);\n if (node && node.type.name === \"image\") {\n e.preventDefault();\n const tr = view.state.tr.setSelection(NodeSelection.create(view.state.doc, posInfo.inside));\n view.dispatch(tr);\n setShow(true);\n setAlt(node.attrs.alt || \"\");\n setTitle(node.attrs.title || \"\");\n setImagePos(posInfo.inside);\n }\n }\n };\n view.dom.addEventListener(\"contextmenu\", handleContextMenu);\n\n const handleMousedown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node) && e.button !== 2) {\n setShow(false);\n }\n };\n document.addEventListener(\"mousedown\", handleMousedown);\n\n return () => {\n view.dom.removeEventListener(\"contextmenu\", handleContextMenu);\n document.removeEventListener(\"mousedown\", handleMousedown);\n };\n }, [view]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n left,\n right,\n bottom\n };\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current) return;\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore errors during fast remounts/updates\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"bottom\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n const handleSave = (newAlt: string, newTitle: string) => {\n if (imagePos !== null && view) {\n const node = view.state.doc.nodeAt(imagePos);\n if (node && node.type.name === \"image\") {\n const tr = view.state.tr.setNodeMarkup(imagePos, undefined, {\n ...node.attrs,\n alt: newAlt,\n title: newTitle\n });\n // Preserve the node selection so the bubble stays open!\n tr.setSelection(NodeSelection.create(tr.doc, imagePos));\n view.dispatch(tr);\n }\n }\n };\n\n if (!show) return null;\n\n return (\n <div\n ref={menuRef}\n style={{\n visibility: \"hidden\",\n position: \"fixed\",\n zIndex: 50\n }}\n className={cls(\"flex flex-col gap-1.5 p-2 w-56 max-w-[90vw] rounded-lg border bg-white dark:bg-surface-800 shadow-lg\", defaultBorderMixin, className)}\n onMouseDown={(e) => {\n // Prevent mousedown from stealing focus from inputs\n // but we don't want to prevent typing\n // Only prevent if clicking on the container background\n if (e.target === e.currentTarget) {\n e.preventDefault();\n }\n }}\n >\n <TextField\n size={\"small\"}\n placeholder={t(\"alt_text\")}\n value={alt}\n onChange={(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setAlt(e.target.value);\n handleSave(e.target.value, title);\n }}\n />\n <TextField\n size={\"small\"}\n placeholder={t(\"title\")}\n value={title}\n onChange={(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setTitle(e.target.value);\n handleSave(alt, e.target.value);\n }}\n />\n </div>\n );\n }\n);\n\nImageBubble.displayName = \"ImageBubble\";\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n type VirtualElement,\n type Placement\n} from \"@floating-ui/dom\";\nimport { IconButton, Tooltip, defaultBorderMixin, cls } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport {\n addColumnBefore,\n addColumnAfter,\n deleteColumn,\n addRowBefore,\n addRowAfter,\n deleteRow,\n deleteTable\n} from \"prosemirror-tables\";\nimport { EditorState } from \"prosemirror-state\";\n\nexport interface TableBubbleProps {\n options?: { placement?: Placement; offset?: number };\n className?: string;\n}\n\nconst isSelectionInTable = (state: EditorState) => {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name === \"table\") {\n return true;\n }\n }\n return false;\n};\n\n// We create separate icon components if they don't exist in @rebasepro/ui\n// using basic SVGs for now, or we can use existing ones if we know them.\n// Wait, I will use generic SVGs for these since I don't know if @rebasepro/ui has them.\n\nexport const TableBubble = forwardRef<HTMLDivElement, TableBubbleProps>(\n ({\n options,\n className\n }, ref) => {\n const {\n view,\n state\n } = useProseMirrorContext();\n const { t } = useTranslation();\n const menuRef = useRef<HTMLDivElement>(null);\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!state) return;\n setShow(isSelectionInTable(state));\n }, [state?.selection]);\n\n useEffect(() => {\n if (!show || !view || !state || !menuRef.current) return;\n\n const {\n from,\n to\n } = state.selection;\n\n // Safety measure: if view.docView is destroyed, coordsAtPos might crash\n if (view.isDestroyed) return;\n\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to);\n\n const virtualEl = {\n getBoundingClientRect() {\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top,\n top,\n bottom,\n left,\n right\n } as DOMRect;\n }\n };\n\n const cleanup = autoUpdate(virtualEl as VirtualElement, menuRef.current, () => {\n if (!menuRef.current || view.isDestroyed) return;\n try {\n start = view.coordsAtPos(state.selection.from);\n end = view.coordsAtPos(state.selection.to);\n } catch (e) {\n // Ignore errors during fast remounts/updates\n }\n\n computePosition(virtualEl as VirtualElement, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), flip(), shift()],\n strategy: \"fixed\"\n }).then(({\n x,\n y\n }) => {\n if (menuRef.current) {\n Object.assign(menuRef.current.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: \"visible\"\n });\n }\n });\n });\n return () => cleanup();\n }, [show, view, state, options]);\n\n if (!show || !view || !state) return null;\n\n const executeCommand = (cmd: (state: EditorState, dispatch?: (tr: import(\"prosemirror-state\").Transaction) => void) => boolean) => {\n cmd(state, view.dispatch);\n view.focus();\n };\n\n return (\n <div\n ref={menuRef}\n style={{\n visibility: \"hidden\",\n position: \"fixed\",\n zIndex: 50\n }}\n className={cls(\"flex flex-row gap-1 p-1 rounded-lg border bg-white dark:bg-surface-800 shadow-lg\", defaultBorderMixin, className)}\n onMouseDown={(e) => {\n // Prevent mousedown from stealing focus from the editor\n e.preventDefault();\n }}\n >\n <div className=\"flex gap-1 border-r pr-1 mr-1 dark:border-gray-700\">\n <Tooltip title={t(\"add_row_before\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addRowBefore)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"add_row_after\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addRowAfter)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"20\"></line>\n <line x1=\"8\" y1=\"16\" x2=\"16\" y2=\"16\"></line>\n <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"delete_row\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteRow)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n\n <div className=\"flex gap-1 border-r pr-1 mr-1 dark:border-gray-700\">\n <Tooltip title={t(\"add_column_before\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addColumnBefore)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"add_column_after\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(addColumnAfter)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"12\" x2=\"20\" y2=\"12\"></line>\n <line x1=\"16\" y1=\"8\" x2=\"16\" y2=\"16\"></line>\n <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n <Tooltip title={t(\"delete_column\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteColumn)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title={t(\"delete_table\")}>\n <IconButton size=\"small\" onClick={() => executeCommand(deleteTable)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path\n d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n </svg>\n </IconButton>\n </Tooltip>\n </div>\n );\n }\n);\n\nTableBubble.displayName = \"TableBubble\";\n","import { EditorState, TextSelection, Transaction } from \"prosemirror-state\";\nimport { MarkType, NodeType, Node as ProseMirrorNode } from \"prosemirror-model\";\n\nexport function isMarkActive(state: EditorState, type: MarkType) {\n if (!state || !type) return false;\n const { from, $from, to, empty } = state.selection;\n if (empty) return !!type.isInSet(state.storedMarks || $from.marks());\n return state.doc.rangeHasMark(from, to, type);\n}\n\nexport function isNodeActive(state: EditorState, type: NodeType, attrs: Record<string, unknown> = {}) {\n if (!state || !type) return false;\n const selection = state.selection;\n const { $from, to } = selection;\n const node = selection instanceof TextSelection ? undefined : (selection as { node?: ProseMirrorNode }).node;\n if (node) {\n return node.type === type && (!attrs || Object.keys(attrs).every((key) => node.attrs[key] === attrs[key]));\n }\n return to <= $from.end() && $from.parent.type === type && (!attrs || Object.keys(attrs).every((key) => $from.parent.attrs[key] === attrs[key]));\n}\n\nexport function getMarkAttributes(state: EditorState, type: MarkType) {\n if (!state || !type) return {};\n const { from, $from, to, empty } = state.selection;\n let mark;\n if (empty) {\n mark = type.isInSet(state.storedMarks || $from.marks());\n } else {\n let found = false;\n state.doc.nodesBetween(from, to, (node) => {\n if (found) return false;\n const m = type.isInSet(node.marks);\n if (m) {\n mark = m;\n found = true;\n }\n return true;\n });\n }\n return mark ? mark.attrs : {};\n}\n\nexport function setMark(type: MarkType, attrs?: Record<string, unknown>) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const selection = state.selection as TextSelection;\n const { empty, $cursor, ranges } = selection;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n if ($cursor) {\n dispatch(state.tr.addStoredMark(type.create(attrs)));\n } else {\n const tr = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i];\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\n\nexport function unsetMark(type: MarkType) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const selection = state.selection as TextSelection;\n const { empty, $cursor, ranges } = selection;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n const tr = state.tr;\n if ($cursor) {\n const parent = $cursor.parent;\n let markStart = -1;\n let markEnd = -1;\n let currentMarkStart = -1;\n\n parent.forEach((child: ProseMirrorNode, offset: number) => {\n const childStart = $cursor.start() + offset;\n const childEnd = childStart + child.nodeSize;\n\n if (type.isInSet(child.marks)) {\n if (currentMarkStart === -1) currentMarkStart = childStart;\n if ($cursor.pos >= childStart && $cursor.pos <= childEnd) {\n markStart = currentMarkStart;\n }\n } else {\n if (currentMarkStart !== -1) {\n if (markStart !== -1 && markEnd === -1) markEnd = childStart;\n currentMarkStart = -1;\n }\n }\n });\n\n if (markStart !== -1 && markEnd === -1) {\n markEnd = $cursor.end();\n }\n\n if (markStart !== -1 && markEnd !== -1) {\n tr.removeMark(markStart, markEnd, type);\n }\n tr.removeStoredMark(type);\n dispatch(tr.scrollIntoView());\n } else {\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i];\n tr.removeMark($from.pos, $to.pos, type);\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\n","\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport { useTranslation } from \"@rebasepro/core\";\n\nimport {\n Button,\n CheckIcon,\n CheckSquareIcon,\n ChevronDownIcon,\n CodeIcon,\n Heading1Icon,\n Heading2Icon,\n Heading3Icon,\n iconSize,\n ListIcon,\n ListOrderedIcon,\n Popover,\n QuoteIcon,\n TypeIcon\n} from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { isNodeActive } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\nimport { setBlockType, wrapIn } from \"prosemirror-commands\";\nimport { wrapInList } from \"prosemirror-schema-list\";\n\nexport type SelectorItem = {\n name: string;\n labelKey: string;\n icon: React.ElementType;\n command: (state: EditorState, dispatch: (tr: Transaction) => void) => void;\n isActive: (state: EditorState) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: \"Text\",\n labelKey: \"editor_text\",\n icon: TypeIcon,\n command: (state, dispatch) => setBlockType(schema.nodes.paragraph)(state, dispatch),\n isActive: (state) =>\n isNodeActive(state, schema.nodes.paragraph) &&\n !isNodeActive(state, schema.nodes.bullet_list) &&\n !isNodeActive(state, schema.nodes.ordered_list)\n },\n {\n name: \"Heading 1\",\n labelKey: \"editor_heading_1\",\n icon: Heading1Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 1 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 1 })\n },\n {\n name: \"Heading 2\",\n labelKey: \"editor_heading_2\",\n icon: Heading2Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 2 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 2 })\n },\n {\n name: \"Heading 3\",\n labelKey: \"editor_heading_3\",\n icon: Heading3Icon,\n command: (state, dispatch) => setBlockType(schema.nodes.heading, { level: 3 })(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.heading, { level: 3 })\n },\n {\n name: \"To-do List\",\n labelKey: \"editor_todo_list\",\n icon: CheckSquareIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.task_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.task_item)\n },\n {\n name: \"Bullet List\",\n labelKey: \"editor_bullet_list\",\n icon: ListIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.bullet_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.bullet_list)\n },\n {\n name: \"Numbered List\",\n labelKey: \"editor_numbered_list\",\n icon: ListOrderedIcon,\n command: (state, dispatch) => wrapInList(schema.nodes.ordered_list)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.ordered_list)\n },\n {\n name: \"Quote\",\n labelKey: \"editor_quote\",\n icon: QuoteIcon,\n command: (state, dispatch) => wrapIn(schema.nodes.blockquote)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.blockquote)\n },\n {\n name: \"Code\",\n labelKey: \"editor_code\",\n icon: CodeIcon,\n command: (state, dispatch) => setBlockType(schema.nodes.code_block)(state, dispatch),\n isActive: (state) => isNodeActive(state, schema.nodes.code_block)\n }\n];\n\ninterface NodeSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n portalContainer: HTMLElement | null;\n}\n\nexport const NodeSelector = ({\n open,\n onOpenChange,\n portalContainer\n}: NodeSelectorProps) => {\n const { state, view } = useProseMirrorContext();\n const { t } = useTranslation();\n if (!state || !view) return null;\n\n const activeItem = items.filter((item) => item.isActive(state)).pop() ?? {\n name: \"Multiple\",\n labelKey: \"editor_multiple\"\n };\n\n return (\n <Popover\n sideOffset={5}\n align=\"start\"\n portalContainer={portalContainer}\n className=\"w-48 p-1\"\n trigger={<Button variant=\"text\"\n className=\"gap-2 rounded-none\"\n color=\"text\">\n <span className=\"whitespace-nowrap text-sm\">{t(activeItem.labelKey)}</span>\n <ChevronDownIcon size={iconSize.small}/>\n </Button>}\n modal={true}\n open={open}\n onOpenChange={onOpenChange}>\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={() => {\n item.command(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n }}\n className=\"flex cursor-pointer items-center justify-between rounded px-2 py-1 text-sm hover:bg-blue-50 hover:dark:bg-surface-700 text-surface-900 dark:text-white\"\n >\n <div className=\"flex items-center space-x-2\">\n <item.icon size={iconSize.smallest}/>\n <span>{t(item.labelKey)}</span>\n </div>\n {activeItem.name === item.name && <CheckIcon size={iconSize.smallest}/>}\n </EditorBubbleItem>\n ))}\n </Popover>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { Button, CheckIcon, cls, focusedDisabled, iconSize, Popover, TextField, Trash2Icon } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { getMarkAttributes, isMarkActive, setMark, unsetMark } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\n\nexport function isValidUrl(url: string) {\n try {\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function getUrlFromString(str: string) {\n if (isValidUrl(str)) return str;\n try {\n if (str.includes(\".\") && !str.includes(\" \")) {\n return new URL(`https://${str}`).toString();\n }\n return null;\n } catch (e) {\n return null;\n }\n}\n\ninterface LinkSelectorProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const LinkSelector = ({\n open,\n onOpenChange\n}: LinkSelectorProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { state, view } = useProseMirrorContext();\n const { t } = useTranslation();\n\n // Autofocus on input by default\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n if (!state || !view) return null;\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const value = inputRef.current?.value;\n if (!value) return;\n const url = getUrlFromString(value);\n if (url) {\n setMark(schema.marks.link, { href: url })(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n }\n };\n\n const handleRemoveLink = () => {\n unsetMark(schema.marks.link)(view.state, view.dispatch);\n view.focus();\n onOpenChange(false);\n };\n\n const isActive = isMarkActive(state, schema.marks.link);\n const href = getMarkAttributes(state, schema.marks.link).href || \"\";\n\n return (\n <Popover modal={true}\n open={open}\n onOpenChange={onOpenChange}\n trigger={<Button variant=\"text\"\n type=\"button\"\n className=\"gap-2 rounded-none\"\n color={\"text\"}>\n <p className={cls(\"underline decoration-stone-400 underline-offset-4\", {\n \"text-blue-500\": isActive\n })}>\n {t(\"editor_link\")}\n </p>\n </Button>}>\n <form\n onSubmit={handleSubmit}\n className=\"flex p-1 gap-1\"\n >\n <TextField\n inputRef={inputRef}\n autoFocus={open}\n placeholder={t(\"editor_paste_or_type_link\")}\n defaultValue={href}\n size=\"small\"\n className=\"flex-grow text-surface-900 dark:text-white\"\n inputClassName={cls(\"bg-transparent p-1 text-sm outline-none\", focusedDisabled)}\n />\n\n {href ? (\n <Button\n size={\"small\"}\n variant=\"text\"\n type=\"button\"\n color={\"text\"}\n className=\"flex items-center\"\n onClick={handleRemoveLink}\n >\n <Trash2Icon size={iconSize.small}/>\n </Button>\n ) : (\n <Button size={\"small\"}\n type=\"submit\"\n variant={\"text\"}>\n <CheckIcon size={iconSize.small}/>\n </Button>\n )}\n </form>\n </Popover>\n );\n};\n","\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport type { SelectorItem } from \"./node-selector\";\nimport { BoldIcon, Button, cls, CodeIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon } from \"@rebasepro/ui\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { isMarkActive } from \"../utils/prosemirror-utils\";\nimport { schema } from \"../schema\";\nimport { toggleMark } from \"prosemirror-commands\";\n\nexport const TextButtons = () => {\n const { state, view } = useProseMirrorContext();\n if (!state || !view) return null;\n\n // We pass state directly to isActive, and dispatch to command\n const items = [\n {\n name: \"bold\",\n labelKey: \"editor_bold\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.bold),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.bold)(s, dispatch),\n icon: BoldIcon\n },\n {\n name: \"italic\",\n labelKey: \"editor_italic\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.italic),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.italic)(s, dispatch),\n icon: ItalicIcon\n },\n {\n name: \"underline\",\n labelKey: \"editor_underline\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.underline),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.underline)(s, dispatch),\n icon: UnderlineIcon\n },\n {\n name: \"strike\",\n labelKey: \"editor_strikethrough\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.strike),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.strike)(s, dispatch),\n icon: StrikethroughIcon\n },\n {\n name: \"code\",\n labelKey: \"editor_code\",\n isActive: (s: EditorState) => isMarkActive(s, schema.marks.code),\n command: (s: EditorState, dispatch: (tr: Transaction) => void) => toggleMark(schema.marks.code)(s, dispatch),\n icon: CodeIcon\n }\n ];\n\n return (\n <div className=\"flex\">\n {items.map((item, index) => (\n <EditorBubbleItem\n key={index}\n onSelect={() => {\n item.command(view.state, view.dispatch);\n view.focus();\n }}\n >\n <Button size={\"small\"}\n color=\"text\"\n className=\"gap-2 rounded-none h-full\"\n variant=\"text\">\n <item.icon\n className={cls({\n \"text-inherit\": !item.isActive(state),\n \"text-blue-500\": item.isActive(state)\n })}\n />\n </Button>\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n","export function removeClassesFromJson(jsonObj: unknown): unknown {\n // If it's an array, apply the function to each element\n if (Array.isArray(jsonObj)) {\n return jsonObj.map(item => removeClassesFromJson(item));\n } else if (typeof jsonObj === \"object\" && jsonObj !== null) { // If it's an object, recurse through its properties\n const obj = jsonObj as Record<string, unknown>;\n // If the object has an `attrs` property and `class` field, delete the `class` field\n if (obj.attrs && typeof obj.attrs === \"object\" && obj.attrs !== null && \"class\" in (obj.attrs as Record<string, unknown>)) {\n delete (obj.attrs as Record<string, unknown>).class;\n }\n\n // Apply the function recursively to object properties\n Object.keys(obj).forEach(key => {\n obj[key] = removeClassesFromJson(obj[key]);\n });\n }\n return jsonObj;\n}\n","import { DOMSerializer, Slice } from \"prosemirror-model\"\nimport { EditorView } from \"prosemirror-view\";\n\nexport function serializeForClipboard(view: EditorView, slice: Slice) {\n view.someProp(\"transformCopied\", f => {\n slice = f(slice!, view)\n })\n\n const context = [];\n let {\n content,\n openStart,\n openEnd\n } = slice\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild!.childCount == 1) {\n openStart--\n openEnd--\n const node = content.firstChild!\n const nodeType = node.type as typeof node.type & { defaultAttrs?: unknown };\n context.push(node.type.name, node.attrs != nodeType.defaultAttrs ? node.attrs : null)\n content = node.content\n }\n\n const serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema)\n const doc = detachedDoc(), wrap = doc.createElement(\"div\")\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }))\n\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n const wrapper = doc.createElement(needsWrap[i])\n while (wrap.firstChild) wrapper.appendChild(wrap.firstChild)\n wrap.appendChild(wrapper)\n wrappers++\n }\n firstChild = wrap.firstChild\n }\n\n if (firstChild && firstChild.nodeType == 1)\n (firstChild as HTMLElement).setAttribute(\n \"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`)\n\n const text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\")\n\n return {\n dom: wrap,\n text,\n slice\n }\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap: { [node: string]: string[] } = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n}\n\nlet _detachedDoc: Document | null = null\n\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n","import { NodeSelection, Plugin } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { Slice } from \"prosemirror-model\";\nimport { serializeForClipboard } from \"./clipboard\";\n\n/** ProseMirror internal drag state — not exposed in type definitions */\ninterface ProseMirrorDragState {\n slice: Slice;\n move: boolean;\n node?: NodeSelection;\n}\n\n/** EditorView with access to the internal `dragging` property */\ninterface EditorViewWithDrag extends EditorView {\n dragging: ProseMirrorDragState | null;\n}\n\nexport interface DragHandleOptions {\n /**\n * The width of the drag handle\n */\n dragHandleWidth: number;\n}\n\nfunction absoluteRect(element: Element) {\n const data = element.getBoundingClientRect();\n\n let ancestor = element.parentElement;\n while (ancestor && window.getComputedStyle(ancestor).position === \"static\") {\n ancestor = ancestor.parentElement;\n }\n const ancestorRect = ancestor?.getBoundingClientRect();\n\n return {\n top: data.top - (ancestorRect?.top ?? 0),\n left: data.left - (ancestorRect?.left ?? 0),\n width: data.width\n };\n}\n\nfunction nodeDOMAtCoords(coords: { x: number; y: number }, view: EditorView) {\n const editorRect = view.dom.getBoundingClientRect();\n\n // 0. Give up if outside vertical bounds or too far horizontally\n if (coords.y < editorRect.top || coords.y > editorRect.bottom) return undefined;\n if (coords.x < editorRect.left - 100 || coords.x > editorRect.right + 50) return undefined;\n\n const blockSelector = 'li, p, pre, blockquote, h1, h2, h3, h4, h5, h6, img, [data-type=\"taskList\"]';\n\n // 1. First probe exactly at the mouse coordinates\n const elem = document.elementFromPoint(coords.x, coords.y);\n const block = elem?.closest(blockSelector);\n if (block && view.dom.contains(block) && block.textContent?.trim()) {\n const li = block.closest(\"li\");\n return (li && view.dom.contains(li)) ? li : block;\n }\n\n // 2. If mouse is in the left gutter, probe horizontally into the editor\n const probeX = editorRect.left + Math.min(60, editorRect.width / 4);\n if (coords.x > probeX) return undefined;\n\n const probeElem = document.elementFromPoint(probeX, coords.y);\n const probeBlock = probeElem?.closest(blockSelector);\n if (probeBlock && probeBlock.textContent?.trim()) {\n // Ensure the found block is actually inside our editor\n if (view.dom.contains(probeBlock)) {\n const li = probeBlock.closest(\"li\");\n return (li && view.dom.contains(li)) ? li : probeBlock;\n }\n }\n\n return undefined;\n}\n\nfunction nodePosAtDOM(node: Element, view: EditorView, options: DragHandleOptions) {\n try {\n if (!view.dom.contains(node)) return null;\n const pos = view.posAtDOM(node, 0);\n const $pos = view.state.doc.resolve(pos);\n // posAtDOM(node, 0) generally returns the position inside the node.\n // We want the position right before the node to create a NodeSelection.\n if ($pos.depth > 0) {\n return $pos.before();\n }\n return pos;\n } catch (e) {\n return null;\n }\n}\n\nexport function dragHandlePlugin(options: DragHandleOptions = { dragHandleWidth: 24 }) {\n function handleDragStart(event: DragEvent, view: EditorView) {\n view.focus();\n\n if (!event.dataTransfer) return;\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (nodePos == null || nodePos < 0) return;\n\n const draggedNodeSelection = NodeSelection.create(view.state.doc, nodePos);\n view.dispatch(view.state.tr.setSelection(draggedNodeSelection));\n\n const slice = view.state.selection.content();\n const {\n dom,\n text\n } = serializeForClipboard(view as EditorViewWithDrag, slice);\n\n event.dataTransfer.clearData();\n event.dataTransfer.setData(\"text/html\", dom.innerHTML);\n event.dataTransfer.setData(\"text/plain\", text);\n event.dataTransfer.effectAllowed = \"copyMove\";\n\n event.dataTransfer.setDragImage(node, 0, 0);\n\n (view as EditorViewWithDrag).dragging = {\n slice,\n move: true,\n node: draggedNodeSelection\n };\n }\n\n function handleClick(event: MouseEvent, view: EditorView) {\n view.focus();\n\n view.dom.classList.remove(\"dragging\");\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) return;\n\n const nodePos = nodePosAtDOM(node, view, options);\n if (!nodePos) return;\n\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos)));\n }\n\n let dragHandleElement: HTMLElement | null = null;\n\n function hideDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.add(\"hide\");\n dragHandleElement.style.opacity = \"0\";\n dragHandleElement.style.pointerEvents = \"none\";\n }\n }\n\n function showDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.remove(\"hide\");\n dragHandleElement.style.opacity = \"1\";\n dragHandleElement.style.pointerEvents = \"auto\";\n }\n }\n\n return new Plugin({\n view: (view) => {\n dragHandleElement = document.createElement(\"div\");\n dragHandleElement.draggable = true;\n dragHandleElement.dataset.dragHandle = \"\";\n dragHandleElement.classList.add(\"drag-handle\");\n dragHandleElement.addEventListener(\"dragstart\", (e) => {\n handleDragStart(e, view);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view);\n });\n const onMouseMove = (event: MouseEvent) => {\n if (!view.editable) {\n return;\n }\n\n const node = nodeDOMAtCoords({\n x: event.clientX,\n y: event.clientY\n }, view);\n\n if (!(node instanceof Element)) {\n hideDragHandle();\n return;\n }\n\n const compStyle = window.getComputedStyle(node);\n const lineHeight = parseInt(compStyle.lineHeight, 10);\n const paddingTop = parseInt(compStyle.paddingTop, 10);\n\n const rect = absoluteRect(node);\n if (!rect) {\n hideDragHandle();\n return;\n }\n\n rect.top += (lineHeight - 24) / 2;\n rect.top += paddingTop;\n // Li markers\n if (node.matches(\"ul:not([data-type=taskList]) li, ol li\")) {\n rect.left -= options.dragHandleWidth;\n }\n rect.width = options.dragHandleWidth;\n\n if (!dragHandleElement) return;\n\n dragHandleElement.style.left = `${rect.left - rect.width}px`;\n dragHandleElement.style.top = `${rect.top}px`;\n showDragHandle();\n };\n\n window.addEventListener(\"mousemove\", onMouseMove);\n\n hideDragHandle();\n\n view?.dom?.parentElement?.appendChild(dragHandleElement);\n\n return {\n destroy: () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n dragHandleElement?.remove?.();\n dragHandleElement = null;\n }\n };\n },\n props: {\n handleDOMEvents: {\n keydown: () => {\n hideDragHandle();\n },\n mousewheel: () => {\n hideDragHandle();\n },\n // dragging class is used for CSS\n dragstart: (view) => {\n view.dom.classList.add(\"dragging\");\n },\n drop: (view) => {\n view.dom.classList.remove(\"dragging\");\n },\n dragend: (view) => {\n view.dom.classList.remove(\"dragging\");\n }\n }\n }\n });\n}\n\nimport { dropPoint } from \"prosemirror-transform\";\n\nexport function globalDragDropPlugin() {\n let dropCursorElement: HTMLElement | null = null;\n let cleanup: (() => void) | null = null;\n\n function updateDropCursorColor(el: HTMLElement) {\n const isDark = document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n const varName = isDark ? \"--color-surface-accent-300\" : \"--color-surface-accent-600\";\n const color = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n el.style.backgroundColor = color || (isDark ? \"#cbd5e1\" : \"#475569\");\n }\n\n return new Plugin({\n view(editorView) {\n dropCursorElement = document.createElement(\"div\");\n dropCursorElement.className = \"prosemirror-dropcursor-block\";\n dropCursorElement.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; height: 2px;\";\n updateDropCursorColor(dropCursorElement);\n\n // Watch for theme changes\n const observer = new MutationObserver(() => {\n if (dropCursorElement) updateDropCursorColor(dropCursorElement);\n });\n observer.observe(document.documentElement, { attributes: true,\nattributeFilter: [\"data-theme\"] });\n\n const removeCursor = () => {\n if (dropCursorElement && dropCursorElement.parentNode) {\n dropCursorElement.parentNode.removeChild(dropCursorElement);\n }\n };\n\n const getBlockInsertionPoint = (event: DragEvent, clampedX: number) => {\n const pos = editorView.posAtCoords({ left: clampedX,\ntop: event.clientY });\n if (!pos) return null;\n\n const $pos = editorView.state.doc.resolve(pos.pos);\n\n let blockDepth = 0;\n for (let i = $pos.depth; i > 0; i--) {\n const name = $pos.node(i).type.name;\n if (name === \"list_item\" || name === \"taskItem\") {\n blockDepth = i;\n break;\n }\n if ($pos.node(i).isBlock && name !== \"bullet_list\" && name !== \"ordered_list\" && name !== \"taskList\") {\n blockDepth = i;\n }\n }\n\n if (blockDepth === 0) return pos.pos;\n\n const nodeBeforePos = $pos.before(blockDepth);\n const nodeAfterPos = $pos.after(blockDepth);\n\n const domNode = editorView.nodeDOM(nodeBeforePos);\n if (domNode instanceof HTMLElement) {\n const rect = domNode.getBoundingClientRect();\n const isTopHalf = event.clientY < rect.top + rect.height / 2;\n return isTopHalf ? nodeBeforePos : nodeAfterPos;\n }\n return pos.pos;\n };\n\n const handleDragOver = (event: DragEvent) => {\n if (!editorView.editable || !editorView.dragging) return;\n\n // If it's a native slice drag (no explicitly captured node from our drag handle)\n // then we bail out here and let ProseMirror native drop logic and native dropcursor handle it\n if (!((editorView as EditorViewWithDrag).dragging as ProseMirrorDragState | null & { node?: unknown })?.node) {\n removeCursor();\n return;\n }\n\n event.preventDefault(); // browser requires this to allow drop\n\n const editorRect = editorView.dom.getBoundingClientRect();\n const clampedX = Math.max(editorRect.left + 10, Math.min(event.clientX, editorRect.right - 10));\n\n const target = getBlockInsertionPoint(event, clampedX);\n if (target === null) {\n removeCursor();\n return;\n }\n\n const $pos = editorView.state.doc.resolve(target);\n\n let rect;\n const before = $pos.nodeBefore;\n const after = $pos.nodeAfter;\n\n if (before || after) {\n const nodeDOM = editorView.nodeDOM(target - (before ? before.nodeSize : 0));\n if (nodeDOM && nodeDOM instanceof HTMLElement) {\n const nodeRect = nodeDOM.getBoundingClientRect();\n let top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after) {\n const afterDOM = editorView.nodeDOM(target);\n if (afterDOM && afterDOM instanceof HTMLElement) {\n top = (top + afterDOM.getBoundingClientRect().top) / 2;\n }\n }\n rect = { left: nodeRect.left,\nright: nodeRect.right,\ntop: top - 1,\nbottom: top + 1 };\n }\n }\n\n if (!rect) {\n const coords = editorView.coordsAtPos(target);\n rect = { left: editorRect.left + 50,\nright: editorRect.right - 50,\ntop: coords.top - 1,\nbottom: coords.top + 1 };\n }\n\n const parent = editorView.dom.offsetParent as HTMLElement;\n let parentLeft = 0;\n let parentTop = 0;\n if (parent && parent !== document.body && getComputedStyle(parent).position !== \"static\") {\n const parentRect = parent.getBoundingClientRect();\n parentLeft = parentRect.left - parent.scrollLeft;\n parentTop = parentRect.top - parent.scrollTop;\n }\n\n if (!dropCursorElement!.parentNode) {\n parent.appendChild(dropCursorElement!);\n }\n\n dropCursorElement!.style.left = `${rect.left - parentLeft}px`;\n dropCursorElement!.style.top = `${rect.top - parentTop}px`;\n dropCursorElement!.style.width = `${rect.right - rect.left}px`;\n };\n\n const handleDrop = (event: DragEvent) => {\n if (!editorView.editable || !editorView.dragging) return;\n\n if (!((editorView as EditorViewWithDrag).dragging as ProseMirrorDragState | null & { node?: unknown })?.node) {\n removeCursor();\n return;\n }\n\n event.preventDefault();\n removeCursor();\n editorView.dom.classList.remove(\"dragging\");\n\n const editorRect = editorView.dom.getBoundingClientRect();\n const clampedX = Math.max(editorRect.left + 10, Math.min(event.clientX, editorRect.right - 10));\n\n const targetPos = getBlockInsertionPoint(event, clampedX);\n if (targetPos === null) return;\n\n const dragging = (editorView as EditorViewWithDrag).dragging;\n if (dragging && dragging.slice) {\n let tr = editorView.state.tr;\n if (dragging.move) {\n const { node } = dragging;\n if (node) {\n node.replace(tr); // exact native ProseMirror delete\n } else {\n tr = tr.deleteSelection();\n }\n }\n\n const mappedTarget = tr.mapping.map(targetPos);\n const beforeInsert = tr.doc;\n\n const { node, slice } = dragging;\n\n if (node && node.node) {\n let nodeToInsert: import(\"prosemirror-model\").Node | import(\"prosemirror-model\").Fragment = node.node;\n const $mapped = tr.doc.resolve(mappedTarget);\n const parentName = $mapped.parent.type.name;\n\n const isTargetList = parentName === \"bullet_list\" || parentName === \"ordered_list\";\n const isTargetTaskList = parentName === \"taskList\";\n\n // 1. Unwrap incoming lists if they don't match the destination perfectly\n if (\"type\" in nodeToInsert && nodeToInsert.type.name === \"list_item\" && !isTargetList) {\n nodeToInsert = nodeToInsert.content;\n } else if (\"type\" in nodeToInsert && nodeToInsert.type.name === \"taskItem\" && !isTargetTaskList) {\n nodeToInsert = nodeToInsert.content;\n }\n\n // 2. Wrap incoming blocks/fragments into exactly the target list type\n const isFragment = !(\"type\" in nodeToInsert);\n const needsWrap = isFragment || (\"type\" in nodeToInsert && nodeToInsert.type.name !== \"list_item\" && nodeToInsert.type.name !== \"taskItem\");\n\n if (needsWrap) {\n if (isTargetList) {\n const listItemType = editorView.state.schema.nodes.list_item;\n if (listItemType) nodeToInsert = listItemType.create(null, nodeToInsert);\n } else if (isTargetTaskList) {\n const taskItemType = editorView.state.schema.nodes.taskItem;\n if (taskItemType) nodeToInsert = taskItemType.create({ checked: false }, nodeToInsert);\n }\n }\n\n // 3. Force insertion. tr.replace slices and splits lists. tr.insert preserves the explicit boundary.\n try {\n tr = tr.insert(mappedTarget, nodeToInsert);\n } catch (e) {\n console.warn(\"Could not insert dragged node exactly at target. Attempting fallback.\", e);\n const point = dropPoint(tr.doc, mappedTarget, slice);\n if (point !== null) {\n tr = tr.replace(point, point, slice);\n }\n }\n } else if (slice) {\n // For generic slices (e.g native image dragging), we MUST use dropPoint\n // so ProseMirror finds a schema-valid depth to insert the node structure natively.\n const point = dropPoint(tr.doc, mappedTarget, slice);\n const finalTarget = point !== null ? point : mappedTarget;\n tr = tr.replace(finalTarget, finalTarget, slice);\n }\n\n if (!tr.doc.eq(beforeInsert)) {\n editorView.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n editorView.focus();\n }\n }\n\n (editorView as EditorViewWithDrag).dragging = null;\n };\n\n const handleDragEnd = () => {\n removeCursor();\n };\n\n window.addEventListener(\"dragover\", handleDragOver, { capture: true });\n window.addEventListener(\"drop\", handleDrop, { capture: true });\n window.addEventListener(\"dragend\", handleDragEnd, { capture: true });\n\n cleanup = () => {\n removeCursor();\n observer.disconnect();\n window.removeEventListener(\"dragover\", handleDragOver, { capture: true });\n window.removeEventListener(\"drop\", handleDrop, { capture: true });\n window.removeEventListener(\"dragend\", handleDragEnd, { capture: true });\n };\n\n return {\n destroy() {\n if (cleanup) cleanup();\n }\n };\n }\n });\n}\n\n\n","import { Plugin, PluginKey, Transaction, EditorState } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\nimport { Node as ProseMirrorNode } from \"prosemirror-model\";\n\nexport interface HighlightRange {\n from: number\n to: number\n}\n\ninterface AutocompleteHighlightState {\n highlight?: HighlightRange\n decorationSet?: DecorationSet\n}\n\nexport const highlightDecorationKey = new PluginKey<AutocompleteHighlightState>(\"highlightDecoration\");\n\nfunction buildDecorationSet(highlight: HighlightRange | undefined, doc: ProseMirrorNode) {\n const decorations: Decoration[] = [];\n\n if (highlight) {\n decorations.push(\n Decoration.inline(highlight.from, highlight.to, {\n class: \"dark:bg-surface-accent-700 bg-surface-accent-300\"\n })\n );\n }\n const decorationSet = DecorationSet.create(doc, decorations);\n return decorationSet;\n}\n\n/**\n * Commands to toggle the highlight\n */\nexport const highlightCommands = {\n toggleAutocompleteHighlight: (range?: HighlightRange) => (state: EditorState, dispatch?: (tr: Transaction) => void): boolean => {\n const { selection } = state;\n const pos = selection.from;\n\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(highlightDecorationKey, {\n pos,\n type: \"highlightDecoration\",\n remove: false,\n range\n });\n\n dispatch(tr);\n return true;\n },\n\n removeAutocompleteHighlight: () => (state: EditorState, dispatch?: (tr: Transaction) => void): boolean => {\n if (!dispatch) return false;\n\n const tr = state.tr.setMeta(highlightDecorationKey, {\n pos: 0,\n type: \"highlightDecoration\",\n remove: true\n });\n\n dispatch(tr);\n return true;\n }\n}\n\n/**\n * This plugin is used to highlight the current autocomplete suggestion.\n * It allows to set a range and remove it.\n */\nexport const highlightDecorationPlugin = (initialHighlight?: HighlightRange) => {\n return new Plugin<AutocompleteHighlightState>({\n key: highlightDecorationKey,\n state: {\n init: (_, { doc }) => {\n const decorationSet = initialHighlight && doc ? buildDecorationSet(initialHighlight, doc) : DecorationSet.empty;\n return {\n decorationSet,\n highlight: initialHighlight\n };\n },\n apply(transaction, oldState) {\n const action = transaction.getMeta(highlightDecorationKey);\n const highlight = action?.range;\n if (action?.type === \"highlightDecoration\") {\n\n const doc = transaction.doc;\n const { remove } = action;\n\n if (remove) {\n return {\n decorationSet: DecorationSet.empty\n };\n }\n const decorationSet = buildDecorationSet(highlight, doc);\n return {\n decorationSet: decorationSet,\n highlight\n }\n } else {\n return oldState\n }\n }\n },\n props: {\n decorations(state) {\n const autocompleteState = this.getState(state);\n if (autocompleteState?.decorationSet) {\n return autocompleteState.decorationSet\n } else {\n return DecorationSet.empty\n }\n }\n }\n });\n};\n","import {\n inputRules,\n wrappingInputRule,\n textblockTypeInputRule,\n smartQuotes,\n emDash,\n ellipsis,\n InputRule\n} from \"prosemirror-inputrules\";\nimport { schema } from \"../schema\";\nimport { MarkType } from \"prosemirror-model\";\n\nconst blockQuoteRule = wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote);\n\nconst orderedListRule = wrappingInputRule(\n /^(\\d+)\\.\\s$/,\n schema.nodes.ordered_list,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order === +match[1]\n);\n\nconst bulletListRule = wrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list);\n\nconst taskListRule = wrappingInputRule(/^\\s*(\\[ \\])\\s$/, schema.nodes.task_list);\n\nconst codeBlockRule = textblockTypeInputRule(/^```$/, schema.nodes.code_block);\n\nconst headingRule = textblockTypeInputRule(\n new RegExp(\"^(#{1,6})\\\\s$\"),\n schema.nodes.heading,\n (match) => ({ level: match[1].length })\n);\n\nconst horizontalRuleInputRule = new InputRule(\n /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n (state, match, start, end) => {\n const tr = state.tr;\n tr.replaceWith(start - 1, end, schema.nodes.horizontal_rule.create());\n return tr;\n }\n);\n\nfunction markInputRule(regexp: RegExp, markType: MarkType, getAttrs?: (match: RegExpMatchArray) => Record<string, any>) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const tr = state.tr;\n if (match[1]) {\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n if (textEnd < end) tr.delete(textEnd, end);\n if (textStart > start) tr.delete(start, textStart);\n end = start + match[1].length;\n }\n tr.addMark(start, end, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nconst strongRule = markInputRule(/(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/, schema.marks.bold);\nconst emRule = markInputRule(/(?:^|[^*_])(?:\\*|_)([^*_]+)(?:\\*|_)$/, schema.marks.italic);\nconst codeRule = markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code);\nconst strikeRule = markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike);\n\nexport const markdownInputRules = inputRules({\n rules: [\n ...smartQuotes,\n ellipsis,\n emDash,\n blockQuoteRule,\n orderedListRule,\n bulletListRule,\n codeBlockRule,\n headingRule,\n taskListRule,\n horizontalRuleInputRule,\n strongRule,\n emRule,\n codeRule,\n strikeRule\n ]\n});\n","import { Plugin, PluginKey } from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\nimport { Node } from \"prosemirror-model\";\n\nexport const placeholderPluginKey = new PluginKey(\"placeholderPlugin\");\n\nfunction isNodeEmpty(node: Node) {\n const defaultContent = node.type.createAndFill()\n if (!defaultContent) return true\n return node.content.eq(defaultContent.content)\n}\n\nexport function placeholderPlugin(text: string) {\n return new Plugin({\n key: placeholderPluginKey,\n props: {\n decorations: (state) => {\n const doc = state.doc;\n const decorations: Decoration[] = [];\n const isEmptyDoc = doc.childCount === 1 && doc.firstChild?.isTextblock && doc.firstChild.content.size === 0;\n const { anchor } = state.selection;\n\n doc.descendants((node, pos) => {\n const isEmpty = !node.isLeaf && isNodeEmpty(node);\n\n if (isEmpty) {\n // Only show placeholder on the node that contains the cursor.\n // For a single-node empty doc, always show it (editor-empty state).\n const nodeEnd = pos + node.nodeSize;\n const hasCursor = anchor >= pos && anchor <= nodeEnd;\n\n if (!hasCursor && !isEmptyDoc) {\n return false;\n }\n\n const classes = [\"is-empty\"];\n if (isEmptyDoc) {\n classes.push(\"is-editor-empty\");\n }\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: classes.join(\" \"),\n \"data-placeholder\": text\n })\n );\n }\n return false; // Stop descending\n });\n\n return DecorationSet.create(doc, decorations);\n }\n }\n });\n}\n","import { keymap } from \"prosemirror-keymap\";\nimport { history, undo, redo } from \"prosemirror-history\";\nimport { slashCommandPlugin } from \"./slashCommandPlugin\";\nimport { dragHandlePlugin, globalDragDropPlugin } from \"../extensions/drag-and-drop\";\nimport { baseKeymap, setBlockType, toggleMark, chainCommands, exitCode, joinUp, joinDown, lift, selectParentNode } from \"prosemirror-commands\";\nimport { highlightDecorationPlugin } from \"../extensions/HighlightDecorationExtension\";\nimport { textLoadingDecorationPlugin } from \"../extensions/TextLoadingDecorationExtension\";\nimport { splitListItem, liftListItem, sinkListItem } from \"prosemirror-schema-list\";\nimport { schema } from \"../schema\";\nimport { Plugin } from \"prosemirror-state\";\nimport { gapCursor } from \"prosemirror-gapcursor\";\nimport { dropCursor } from \"prosemirror-dropcursor\";\nimport { markdownInputRules } from \"./inputrules\";\nimport { placeholderPlugin } from \"./placeholderPlugin\";\nimport { goToNextCell } from \"prosemirror-tables\";\n\nconst customKeymap = {\n \"Tab\": goToNextCell(1),\n \"Shift-Tab\": goToNextCell(-1),\n \"Mod-z\": undo,\n \"Mod-y\": redo,\n \"Shift-Mod-z\": redo,\n \"Mod-b\": toggleMark(schema.marks.bold),\n \"Mod-i\": toggleMark(schema.marks.italic),\n \"Mod-u\": toggleMark(schema.marks.underline),\n \"Mod-Shift-s\": toggleMark(schema.marks.strike),\n \"Mod-e\": toggleMark(schema.marks.code),\n \"Mod-Shift-h\": toggleMark(schema.marks.highlight),\n\n \"Enter\": splitListItem(schema.nodes.list_item),\n \"Shift-Enter\": splitListItem(schema.nodes.task_item),\n\n \"Mod-[\": liftListItem(schema.nodes.list_item),\n \"Mod-]\": sinkListItem(schema.nodes.list_item),\n\n \"Shift-Mod-8\": setBlockType(schema.nodes.bullet_list),\n \"Shift-Mod-9\": setBlockType(schema.nodes.ordered_list),\n\n \"Mod-Alt-1\": setBlockType(schema.nodes.heading, { level: 1 }),\n \"Mod-Alt-2\": setBlockType(schema.nodes.heading, { level: 2 }),\n \"Mod-Alt-3\": setBlockType(schema.nodes.heading, { level: 3 }),\n\n \"Mod-Alt-0\": setBlockType(schema.nodes.paragraph)\n};\n\nexport const getCorePlugins = (): Plugin[] => [\n history(),\n keymap(customKeymap),\n keymap(baseKeymap),\n globalDragDropPlugin(),\n gapCursor(),\n slashCommandPlugin(),\n dragHandlePlugin(),\n highlightDecorationPlugin(),\n textLoadingDecorationPlugin(),\n markdownInputRules,\n placeholderPlugin(\"Press '/' for commands\")\n];\n","import React, { ReactNode } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport { Node as ProseMirrorNode } from \"prosemirror-model\";\nimport { EditorView, NodeView } from \"prosemirror-view\";\n\nexport interface ReactNodeViewProps {\n node: ProseMirrorNode;\n view: EditorView;\n getPos: () => number | undefined;\n}\n\nexport type ReactNodeViewComponent = React.FC<ReactNodeViewProps>;\n\n/**\n * A utility class that implements the ProseMirror NodeView interface but delegates rendering\n * to a React component.\n * Note: This uses createRoot, so it does not automatically inherit React Contexts.\n * If contexts are needed, wrap them manually or use a portal-based approach instead.\n */\nexport class ReactNodeView implements NodeView {\n public node: ProseMirrorNode;\n public view: EditorView;\n public getPos: () => number | undefined;\n public dom: HTMLElement;\n public contentDOM?: HTMLElement;\n private root: Root;\n private Component: ReactNodeViewComponent;\n\n constructor(\n node: ProseMirrorNode,\n view: EditorView,\n getPos: () => number | undefined,\n Component: ReactNodeViewComponent,\n as = \"div\",\n className?: string,\n contentDOMElement?: HTMLElement\n ) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n this.Component = Component;\n\n this.dom = document.createElement(as);\n if (className) this.dom.className = className;\n if (contentDOMElement) {\n this.contentDOM = contentDOMElement;\n }\n\n const container = document.createElement(\"div\");\n // We render React next to contentDOM\n this.dom.appendChild(container);\n if (this.contentDOM) {\n this.dom.appendChild(this.contentDOM);\n }\n\n this.root = createRoot(container);\n this.render();\n }\n\n private render() {\n this.root.render(\n <this.Component\n node={this.node}\n view={this.view}\n getPos={this.getPos}\n />\n );\n }\n\n update(node: ProseMirrorNode): boolean {\n if (node.type !== this.node.type) {\n return false;\n }\n this.node = node;\n this.render();\n return true;\n }\n\n destroy() {\n this.root.unmount();\n }\n\n ignoreMutation(mutation: MutationRecord | { type: \"selection\"; target: Node }) {\n if (!this.contentDOM) {\n return true;\n }\n return !this.contentDOM.contains(mutation.target);\n }\n}\n","import React from \"react\";\nimport { Checkbox, Label } from \"@rebasepro/ui\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\n\nexport const TaskItemComponent: React.FC<ReactNodeViewProps> = ({ node, view, getPos }) => {\n const checked = node.attrs.checked;\n\n const handleCheckedChange = (isChecked: boolean) => {\n const pos = getPos();\n if (typeof pos !== \"number\") return;\n\n view.dispatch(\n view.state.tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n checked: isChecked\n })\n );\n };\n\n return (\n <Label contentEditable={false} className=\"flex items-start select-none px-1 cursor-pointer\">\n <Checkbox\n checked={checked}\n onCheckedChange={handleCheckedChange}\n padding={false}\n size=\"small\"\n />\n </Label>\n );\n};\n","import React from \"react\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\nimport { cls, defaultBorderMixin } from \"@rebasepro/ui\";\n\nexport const ImageComponent: React.FC<ReactNodeViewProps> = ({ node, view, getPos }) => {\n // If the node is selected\n const selected = view.state.selection.from === getPos();\n\n return (\n <img\n src={node.attrs.src}\n alt={node.attrs.alt || \"\"}\n title={node.attrs.title || \"\"}\n className={cls(\n \"rounded-lg max-w-full !m-0\",\n selected ? \"\" : \"\"\n )}\n />\n );\n};\n","import { Node as ProseMirrorNode } from \"prosemirror-model\";\nimport { EditorView, NodeView } from \"prosemirror-view\";\nimport { ReactNodeView, ReactNodeViewComponent } from \"./ReactNodeView\";\nimport { TaskItemComponent } from \"./TaskItemComponent\";\nimport { ImageComponent } from \"./ImageComponent\";\n\nfunction createReactNodeView(\n Component: ReactNodeViewComponent,\n as = \"div\",\n className?: string,\n createContentDOM?: () => HTMLElement\n) {\n return (node: ProseMirrorNode, view: EditorView, getPos: () => number | undefined): NodeView => {\n const contentDOM = createContentDOM ? createContentDOM() : undefined;\n return new ReactNodeView(node, view, getPos, Component, as, className, contentDOM);\n };\n}\n\nexport const nodeViews = {\n task_item: createReactNodeView(\n TaskItemComponent,\n \"li\",\n \"flex items-start\",\n () => {\n const dom = document.createElement(\"div\");\n dom.className = \"flex-grow min-w-0\";\n return dom;\n }\n ),\n image: createReactNodeView(\n ImageComponent,\n \"span\",\n \"inline-block w-full\"\n )\n};\n","import { useState, useEffect, useRef, useLayoutEffect } from \"react\";\nimport { EditorState, Transaction, Plugin } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { schema } from \"../schema\";\nimport { getCorePlugins } from \"../plugins\";\nimport { parser } from \"../markdown\";\nimport { nodeViews } from \"../nodeViews\";\nimport { createDropImagePlugin } from \"../extensions/Image\";\nimport { columnResizing, tableEditing } from \"prosemirror-tables\";\n\nconst trailingNodePlugin = new Plugin({\n appendTransaction: (_, oldState, newState) => {\n const doc = newState.doc;\n if (doc.lastChild && doc.lastChild.type.name !== \"paragraph\") {\n return newState.tr.insert(doc.content.size, newState.schema.nodes.paragraph.create());\n }\n return null;\n }\n});\n\ninterface UseProseMirrorProps {\n initialContent?: string | any;\n editable?: boolean;\n handleImageUpload?: (file: File) => Promise<string>;\n}\n\nexport function useProseMirror({ initialContent, editable = true, handleImageUpload }: UseProseMirrorProps) {\n const plugins = [\n ...getCorePlugins(),\n columnResizing(),\n tableEditing(),\n trailingNodePlugin\n ];\n if (handleImageUpload) {\n plugins.push(createDropImagePlugin(handleImageUpload));\n }\n\n const defaultState = EditorState.create({\n doc: typeof initialContent === \"string\"\n ? parser.parse(initialContent)\n : initialContent\n ? schema.nodeFromJSON(initialContent)\n : schema.node(\"doc\", null, [schema.node(\"paragraph\")]),\n schema,\n plugins\n });\n\n const [state, setState] = useState<EditorState>(defaultState);\n const [view, setView] = useState<EditorView | null>(null);\n\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n\n useLayoutEffect(() => {\n if (!editorRef.current) return;\n\n const editorView = new EditorView(editorRef.current, {\n state: defaultState,\n editable: () => editable,\n dispatchTransaction: (tr: Transaction) => {\n const newState = editorView.state.apply(tr);\n editorView.updateState(newState);\n setState(newState);\n },\n nodeViews: nodeViews,\n transformPastedHTML(html: string) {\n // Strip inline styles and classes from pasted HTML so we don't\n // get textStyle marks (color, font-size, etc.) that have no\n // markdown representation. This makes paste look consistent.\n const div = document.createElement(\"div\");\n div.innerHTML = html;\n div.querySelectorAll(\"*\").forEach((el) => {\n el.removeAttribute(\"style\");\n el.removeAttribute(\"class\");\n el.removeAttribute(\"color\");\n el.removeAttribute(\"bgcolor\");\n el.removeAttribute(\"face\");\n });\n return div.innerHTML;\n }\n });\n\n // Patch posAtCoords to allow dropping/interacting anywhere horizontally natively\n const originalPosAtCoords = editorView.posAtCoords.bind(editorView);\n editorView.posAtCoords = (coords: { left: number, top: number }) => {\n const res = originalPosAtCoords(coords);\n if (!res) {\n const editorRect = editorView.dom.getBoundingClientRect();\n // If it's literally anywhere to the left of the actual ProseMirror content block\n if (coords.left <= editorRect.left) {\n const probeX = editorRect.left + Math.min(60, editorRect.width / 4);\n return originalPosAtCoords({ left: probeX,\ntop: coords.top });\n }\n // Or if it's anywhere to the right\n if (coords.left >= editorRect.right) {\n const probeX = editorRect.right - Math.min(60, editorRect.width / 4);\n return originalPosAtCoords({ left: probeX,\ntop: coords.top });\n }\n }\n return res;\n };\n\n viewRef.current = editorView;\n setView(editorView);\n\n return () => {\n editorView.destroy();\n viewRef.current = null;\n };\n }, []);\n\n // Effect to update editable status without re-mounting\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.setProps({ editable: () => editable });\n }\n }, [editable]);\n\n return {\n state,\n view,\n editorRef\n };\n}\n","\"use client\";\nimport React, { useEffect, useState, useRef, useMemo } from \"react\";\nimport { EditorState, Selection } from \"prosemirror-state\";\nimport { cls, defaultBorderMixin, Separator, TextareaAutosize, useInjectStyles } from \"@rebasepro/ui\";\nimport { useTranslation } from \"@rebasepro/core\";\nimport { EditorBubble, ImageBubble, SlashCommandMenu, TableBubble, type JSONContent } from \"./components\";\nimport { NodeSelector } from \"./selectors/node-selector\";\nimport { LinkSelector } from \"./selectors/link-selector\";\nimport { TextButtons } from \"./selectors/text-buttons\";\nimport { removeClassesFromJson } from \"./utils/remove_classes\";\nimport { parser, serializer } from \"./markdown\";\nimport { EditorAIController } from \"./types\";\nimport { useProseMirror } from \"./hooks/useProseMirror\";\nimport { ProseMirrorContext } from \"./hooks/useProseMirrorContext\";\nimport { highlightCommands } from \"./extensions/HighlightDecorationExtension\";\nimport { schema } from \"./schema\";\n\nexport type CustomEditorComponent = {\n name: string,\n component: React.FC\n};\n\nexport interface MarkdownEditorConfig {\n html?: boolean;\n transformPastedText?: boolean;\n}\n\nexport type RichTextEditorTextSize = \"sm\" | \"base\" | \"lg\";\n\n\nexport type RichTextEditorProps = {\n content?: JSONContent | string,\n onMarkdownContentChange?: (content: string) => void,\n onJsonContentChange?: (content: JSONContent | null) => void,\n onHtmlContentChange?: (content: string) => void,\n handleImageUpload: (file: File) => Promise<string>,\n version?: number,\n textSize?: RichTextEditorTextSize,\n highlight?: { from: number, to: number },\n aiController?: EditorAIController,\n customComponents?: CustomEditorComponent[];\n disabled?: boolean;\n markdownConfig?: MarkdownEditorConfig;\n};\n\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\n}\n\nexport const RichTextEditor = ({\n content,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange,\n version,\n textSize = \"base\",\n highlight,\n handleImageUpload,\n aiController,\n disabled,\n markdownConfig\n}: RichTextEditorProps) => {\n\n const { t } = useTranslation();\n\n const [openNode, setOpenNode] = useState(false);\n const [openLink, setOpenLink] = useState(false);\n\n const [isMarkdownMode, setIsMarkdownMode] = useState(false);\n const [internalMarkdown, setInternalMarkdown] = useState<string>(\"\");\n\n useEffect(() => {\n if (!isMarkdownMode) return;\n const timeout = setTimeout(() => {\n if (callbacksRef.current.onMarkdownContentChange) {\n callbacksRef.current.onMarkdownContentChange(internalMarkdown);\n }\n }, 250);\n return () => clearTimeout(timeout);\n }, [internalMarkdown, isMarkdownMode]);\n\n const handleToggleMarkdown = () => {\n if (!isMarkdownMode) {\n if (view) {\n setInternalMarkdown(serializer.serialize(view.state.doc));\n }\n setIsMarkdownMode(true);\n } else {\n if (view) {\n const newDoc = parser.parse(internalMarkdown);\n if (newDoc) {\n const tr = view.state.tr.replaceWith(0, view.state.doc.content.size, newDoc.content);\n view.dispatch(tr);\n }\n }\n setIsMarkdownMode(false);\n }\n };\n\n const handleMarkdownChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInternalMarkdown(e.target.value);\n };\n\n const handleMarkdownBlur = () => {\n const { onMarkdownContentChange, onJsonContentChange } = callbacksRef.current;\n if (onMarkdownContentChange) {\n onMarkdownContentChange(internalMarkdown);\n }\n if (onJsonContentChange) {\n try {\n const newDoc = parser.parse(internalMarkdown);\n if (newDoc) {\n onJsonContentChange(removeClassesFromJson(newDoc.toJSON()) as JSONContent);\n }\n } catch (e) {\n console.warn(\"Could not parse markdown to JSON\", e);\n }\n }\n };\n\n useInjectStyles(\"Editor\", cssStyles);\n\n const callbacksRef = useRef({ onMarkdownContentChange,\nonJsonContentChange });\n useEffect(() => {\n callbacksRef.current = { onMarkdownContentChange,\nonJsonContentChange };\n }, [onMarkdownContentChange, onJsonContentChange]);\n\n const flushChanges = (currentState: EditorState) => {\n const { onMarkdownContentChange, onJsonContentChange } = callbacksRef.current;\n if (onMarkdownContentChange) {\n try {\n const markdown = serializer.serialize(currentState.doc);\n onMarkdownContentChange(markdown);\n } catch (e) {\n console.warn(\"[RichTextEditor] Could not serialize editor state to markdown:\", e);\n }\n }\n if (onJsonContentChange) {\n const jsonContent = removeClassesFromJson(currentState.doc.toJSON()) as JSONContent;\n onJsonContentChange(jsonContent);\n }\n };\n\n const { state, view, editorRef } = useProseMirror({\n initialContent: content,\n editable: !disabled,\n handleImageUpload\n });\n\n // When `version` changes externally (e.g. form discard/reset), re-parse the\n // `content` prop and replace the ProseMirror document so the editor reflects\n // the reverted value.\n const versionRef = useRef(version);\n useEffect(() => {\n if (versionRef.current === version) return; // skip initial render\n versionRef.current = version;\n if (!view) return;\n try {\n const newDoc = typeof content === \"string\"\n ? parser.parse(content ?? \"\")\n : content\n ? schema.nodeFromJSON(content)\n : schema.node(\"doc\", null, [schema.node(\"paragraph\")]);\n if (newDoc) {\n const tr = view.state.tr.replaceWith(0, view.state.doc.content.size, newDoc.content);\n view.dispatch(tr);\n }\n } catch (e) {\n console.warn(\"[RichTextEditor] Could not reset editor content:\", e);\n }\n // Also reset raw-markdown textarea if the user is in source mode\n if (isMarkdownMode) {\n setInternalMarkdown(typeof content === \"string\" ? content : \"\");\n }\n // Reset the settling window so the replacement dispatch above is NOT\n // treated as a user edit (which would fire onChange back to the form).\n mountTimeRef.current = Date.now();\n hasUserEditedRef.current = false;\n }, [version]);\n\n const doc = state?.doc;\n // Use a time-based settling window instead of a single-skip flag.\n // The trailingNodePlugin fires appendTransaction on mount (adding a trailing\n // paragraph), which creates a second doc change after the initial parse.\n // A single-skip flag misses that second change. Instead, we skip ALL doc\n // changes within the first 500ms after the view is created.\n const mountTimeRef = useRef(Date.now());\n const hasUserEditedRef = useRef(false);\n useEffect(() => {\n if (!state) return;\n // Skip all doc changes during the initial settling window (500ms).\n // This covers both the initial parse AND the trailingNodePlugin's\n // appendTransaction that adds a trailing paragraph.\n const elapsed = Date.now() - mountTimeRef.current;\n if (elapsed < 500 && !hasUserEditedRef.current) {\n return;\n }\n hasUserEditedRef.current = true;\n const timeout = setTimeout(() => {\n flushChanges(state);\n }, 250);\n return () => clearTimeout(timeout);\n }, [doc]);\n\n useEffect(() => {\n if (!view) return;\n const dom = view.dom;\n const handleBlur = () => {\n // Don't flush during the initial settling window — the editor\n // hasn't been interacted with yet, and the serialized output\n // may differ from the input due to parse→serialize normalization.\n if (!hasUserEditedRef.current) {\n const elapsed = Date.now() - mountTimeRef.current;\n if (elapsed < 500) return;\n }\n flushChanges(view.state);\n };\n dom.addEventListener(\"blur\", handleBlur);\n return () => dom.removeEventListener(\"blur\", handleBlur);\n }, [view]);\n\n\n useEffect(() => {\n if (view) {\n if (highlight) {\n highlightCommands.toggleAutocompleteHighlight(highlight)(view.state, view.dispatch);\n } else {\n highlightCommands.removeAutocompleteHighlight()(view.state, view.dispatch);\n }\n }\n }, [highlight?.from, highlight?.to]);\n\n const proseClass = proseClasses[textSize];\n\n\n return (\n <div className=\"relative min-h-[200px] w-full flex flex-col\">\n <button\n type=\"button\"\n onClick={handleToggleMarkdown}\n title={isMarkdownMode ? \"Switch to Visual Editor\" : \"Switch to Markdown\"}\n className=\"absolute top-2 right-2 z-10 px-2 py-1 text-xs font-medium text-surface-400 hover:text-surface-700 dark:text-surface-600 dark:hover:text-surface-300 transition-colors opacity-50 hover:opacity-100 bg-transparent rounded\"\n >\n {isMarkdownMode ? \"Visual\" : \"Markdown\"}\n </button>\n\n <ProseMirrorContext.Provider value={useMemo(() => ({ state,\nview }), [state, view])}>\n\n <div style={{ display: isMarkdownMode ? \"none\" : \"flex\" }} className=\"flex-1 flex flex-col\">\n <div\n ref={editorRef}\n onClick={(e) => {\n // If the click landed on the wrapper padding (not on the ProseMirror\n // content), focus the editor and place the cursor at the nearest position.\n if (view && e.target === e.currentTarget) {\n view.focus();\n // Place cursor at end of the document\n const end = view.state.doc.content.size;\n const tr = view.state.tr.setSelection(\n Selection.near(view.state.doc.resolve(end), -1)\n );\n view.dispatch(tr);\n }\n }}\n className={cls(\"relative prose dark:prose-invert cursor-text flex-1\", proseClass, \"prose-headings:font-title prose-headings:font-normal prose-strong:font-semibold prose-code:font-normal prose-blockquote:font-normal prose-a:font-normal font-default focus:outline-none max-w-full py-4\")}\n />\n\n {view && (\n <>\n <EditorBubble\n options={{\n placement: \"top\",\n offset: 6\n }}\n className={cls(\"flex w-fit max-w-[90vw] h-10 overflow-hidden rounded border bg-white dark:bg-surface-800 shadow\", defaultBorderMixin)}\n >\n <NodeSelector portalContainer={editorRef.current} open={openNode} onOpenChange={setOpenNode}/>\n <Separator orientation=\"vertical\"/>\n <LinkSelector open={openLink} onOpenChange={setOpenLink}/>\n <Separator orientation=\"vertical\"/>\n <TextButtons/>\n </EditorBubble>\n\n <ImageBubble\n options={{\n placement: \"bottom\",\n offset: 6\n }}\n />\n <TableBubble/>\n </>\n )}\n\n <SlashCommandMenu upload={handleImageUpload} aiController={aiController}/>\n </div>\n\n {isMarkdownMode && (\n <TextareaAutosize\n value={internalMarkdown}\n onChange={handleMarkdownChange}\n onBlur={handleMarkdownBlur}\n className={cls(\n \"w-full h-full min-h-[200px] px-12 py-4 bg-transparent resize-none font-mono focus:ring-0\",\n proseClass\n )}\n style={{\n tabSize: 4,\n outline: \"none\",\n border: \"none\",\n boxShadow: \"none\"\n }}\n />\n )}\n\n </ProseMirrorContext.Provider>\n </div>\n );\n};\n\n\nconst cssStyles = `\n.ProseMirror {\n box-shadow: none !important;\n padding-left: 2rem;\n padding-right: 2rem;\n min-height: 100%;\n}\n.ProseMirror .is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n.ProseMirror .is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: rgb(100 116 139); //500\n pointer-events: none;\n height: 0;\n}\n\n[data-theme=\"dark\"] {\n .ProseMirror .is-empty::before {\n color: rgb(100 116 139); //500\n }\n}\n\n.is-empty {\n cursor: text;\n color: rgb(100 116 139); //500\n}\n\n.ProseMirror img {\n transition: filter 0.1s ease-in-out;\n}\n.ProseMirror img:hover {\n cursor: pointer;\n filter: brightness(90%);\n}\n.ProseMirror img.ProseMirror-selectednode {\n filter: brightness(90%);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;\n}\n\nul[data-type=\"taskList\"] li > label {\n margin-right: 0.2rem;\n user-select: none;\n}\n@media screen and (max-width: 768px) {\n ul[data-type=\"taskList\"] li > label {\n margin-right: 0.5rem;\n }\n}\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n background-color: rgb(30 41 59);\n border: 2px solid #666;\n}\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:hover { background-color: rgb(51 65 85); }\n[data-theme=\"dark\"] ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:active { background-color: rgb(71 85 105); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n -webkit-appearance: none;\n appearance: none;\n background-color: white;\n margin: 0;\n cursor: pointer;\n width: 1.2em;\n height: 1.2em;\n position: relative;\n top: 5px;\n border: 2px solid #777;\n border-radius: 0.25em;\n margin-right: 0.3rem;\n display: grid;\n place-content: center;\n}\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:hover { background-color: rgb(241 245 249); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:active { background-color: rgb(226 232 240); }\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]::before {\n content: \"\";\n width: 0.65em;\n height: 0.65em;\n transform: scale(0);\n transition: 120ms transform ease-in-out;\n box-shadow: inset 1em 1em;\n transform-origin: center;\n clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n}\nul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]:checked::before { transform: scale(1); }\n\n[data-theme=\"dark\"] {\n ul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(226 232 240);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n }\n}\nul[data-type=\"taskList\"] li[data-checked=\"true\"] > div > p {\n color: rgb(51 65 85);\n text-decoration: line-through;\n text-decoration-thickness: 2px;\n}\n.tippy-box { max-width: 400px !important; }\n\n.ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(219 234 254);\n transition: background-color 0.2s;\n box-shadow: none;\n}\n[data-theme=\"dark\"] .ProseMirror:not(.dragging) .ProseMirror-selectednode {\n background-color: rgb(51 65 85);\n}\n.prose-base table p { margin: 0; }\n\n.drag-handle {\n position: absolute;\n opacity: 1;\n transition: opacity ease-in 0.2s;\n border-radius: 0.25rem;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(128, 128, 128, 0.9)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7,8.44771525 7,9 7,9 C7,9.55228475 7,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E\");\n background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);\n background-repeat: no-repeat;\n background-position: center;\n width: 1.2rem;\n height: 1.5rem;\n z-index: 100;\n cursor: grab;\n}\n.drag-handle::before {\n content: '';\n position: absolute;\n top: -10px;\n bottom: -10px;\n left: -20px; \n right: 0px;\n z-index: -1;\n}\n.drag-handle:hover { background-color: rgb(241 245 249); transition: background-color 0.2s; }\n.drag-handle:active { background-color: rgb(226 232 240); transition: background-color 0.2s; }\n.drag-handle.hide { opacity: 0; pointer-events: none; }\n@media screen and (max-width: 600px) { .drag-handle { display: none; pointer-events: none; } }\n[data-theme=\"dark\"] .drag-handle:hover { background-color: rgb(51 65 85); }\n[data-theme=\"dark\"] .drag-handle:active { background-color: rgb(51 65 85); }\n.prosemirror-dropcursor-block {\n background-color: var(--color-surface-accent-600);\n}\n[data-theme=\"dark\"] .prosemirror-dropcursor-block {\n background-color: var(--color-surface-accent-300);\n}\n\n.ProseMirror table {\n border-collapse: separate;\n border-spacing: 0;\n table-layout: fixed;\n width: 100%;\n margin: 1em 0;\n overflow: hidden;\n border-radius: 0.375rem;\n border: 1px solid #e5e7eb;\n}\n[data-theme=\"dark\"] .ProseMirror table {\n border-color: #374151;\n}\n\n.ProseMirror td, .ProseMirror th {\n min-width: 1em;\n padding: 8px 10px;\n vertical-align: top;\n box-sizing: border-box;\n position: relative;\n border-right: 1px solid #e5e7eb;\n border-bottom: 1px solid #e5e7eb;\n}\n[data-theme=\"dark\"] .ProseMirror td, [data-theme=\"dark\"] .ProseMirror th {\n border-right-color: #374151;\n border-bottom-color: #374151;\n}\n\n.ProseMirror tr:last-child td, .ProseMirror tr:last-child th {\n border-bottom: none;\n}\n.ProseMirror th:last-child, .ProseMirror td:last-child {\n border-right: none;\n}\n\n.ProseMirror td {\n background-color: transparent;\n}\n\n.ProseMirror th {\n font-weight: 600;\n text-align: left;\n background-color: #f3f4f6;\n color: #374151;\n}\n[data-theme=\"dark\"] .ProseMirror td {\n background-color: transparent;\n}\n[data-theme=\"dark\"] .ProseMirror th {\n background-color: rgba(255, 255, 255, 0.05);\n color: #d1d5db;\n}\n`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AASA,IAAa,qBAAqB,cAAsC;CACpE,OAAO;CACP,MAAM;AACV,CAAC;AAED,IAAa,8BAA8B,WAAW,kBAAkB;;;ACKxE,IAAa,eAAe,YACvB,EACI,UACA,SACA,aACD,QAAQ;CACR,MAAM,EACF,MACA,UACA,sBAAsB;CAC1B,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CAEtC,gBAAgB;EACZ,IAAI,CAAC,QAAQ,CAAC,OAAO;EAGrB,MAAM,QAAQ,iBAAiB;GAC3B,MAAM,EAAE,cAAc;GACtB,MAAM,EAAE,UAAU;GAGlB,IAAI,UAAU;GACd,MAAM,IAAI,aAAa,UAAU,MAAM,UAAU,KAAK,SAAS;IAC3D,IAAI,KAAK,KAAK,SAAS,SAAS,UAAU;GAC9C,CAAC;GAED,IAAI,WAAW,SAAS,qBAAqB,eAAe;IACxD,QAAQ,KAAK;IACb;GACJ;GAEA,QAAQ,IAAI;EAChB,GAAG,CAAC;EAEJ,aAAa,aAAa,KAAK;CACnC,GAAG,CAAC,MAAM,KAAK,CAAC;CAEhB,gBAAgB;EACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,SAAS;EAElD,MAAM,EACF,MACA,OACA,MAAM;EAGV,IAAI,QAAQ,KAAK,YAAY,IAAI;EACjC,IAAI,MAAM,KAAK,YAAY,EAAE;EAE7B,MAAM,YAAY,EACd,wBAAwB;GACpB,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG;GACvC,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM;GAChD,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM,IAAI,IAAI;GAC1C,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK;GAC7C,OAAO;IACH,OAAO,QAAQ;IACf,QAAQ,SAAS;IACjB,GAAG;IACH,GAAG;IACH;IACA;IACA;IACA;GACJ;EACJ,EACJ;EAEA,MAAM,UAAU,WAAW,WAA6B,QAAQ,eAAe;GAC3E,IAAI,CAAC,QAAQ,SAAS;GAGtB,IAAI;IACA,QAAQ,KAAK,YAAY,MAAM,UAAU,IAAI;IAC7C,MAAM,KAAK,YAAY,MAAM,UAAU,EAAE;GAC7C,SAAS,GAAG,CAEZ;GAEA,gBAAgB,WAA6B,QAAQ,SAAS;IAC1D,WAAW,SAAS,aAAa;IACjC,YAAY;KAAC,OAAO,SAAS,UAAU,CAAC;KAAG,KAAK;KAAG,MAAM;IAAC;IAC1D,UAAU;GACd,CAAC,EAAE,MAAM,EACI,GACA,QACE;IACX,IAAI,QAAQ,SACR,OAAO,OAAO,QAAQ,QAAQ,OAAO;KACjC,MAAM,GAAG,EAAE;KACX,KAAK,GAAG,EAAE;KACV,YAAY;IAChB,CAAC;GAET,CAAC;EACL,CAAC;EACD,aAAa,QAAQ;CACzB,GAAG;EAAC;EAAM;EAAM;EAAO;CAAO,CAAC;CAE/B,IAAI,CAAC,MAAM,OAAO;CAElB,OACI,oBAAC,OAAD;EACI,KAAK;EACM;EACX,OAAO;GACH,UAAU;GACV,QAAQ;GACR,YAAY;EAChB;EACA,cAAc,MAAM;GAChB,EAAE,eAAe;EACrB;EAEC;CACA,CAAA;AAEb,CACJ;AAEA,aAAa,cAAc;;;AClI3B,IAAa,mBAAmB,YAG7B,EAAE,UAAU,SAAS,UAAU,GAAG,QAAQ,QAAQ;CACnD,MAAM,EAAE,SAAS,sBAAsB;CACvC,MAAM,OAAO,UAAU,OAAO;CAE9B,IAAI,CAAC,MAAM,OAAO;CAElB,OACE,oBAAC,MAAD;EAAW;EAAK,GAAI;EAAM,cAAc,MAAwB;GAE9D,EAAE,eAAe;EACnB;EAAG,eAAe,WAAW;EAC1B;CACG,CAAA;AAEV,CAAC;AAED,iBAAiB,cAAc;;;AC3B/B,IAAa,wBAAwB,IAAI,UAAU,eAAe;AASlE,SAAgB,qBAAqB;CACjC,OAAO,IAAI,OAAO;EACd,KAAK;EACL,OAAO;GACH,OAA0B;IACtB,OAAO,EAAE,QAAQ,MAAM;GAC3B;GACA,MAAM,IAAI,OAAO,UAAU,UAA6B;IACpD,MAAM,OAAO,GAAG,QAAQ,qBAAqB;IAC7C,IAAI,SAAS,KAAA,GACT,OAAO;IAGX,MAAM,EAAE,cAAc;IACtB,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,UAAU,OACpD,OAAO,EAAE,QAAQ,MAAM;IAI3B,MAAM,UAAU,UAAU;IAC1B,IAAI,QAAQ,OAAO,KAAK,SAAS,cAC7B,OAAO,EAAE,QAAQ,MAAM;IAS3B,MAAM,QANa,QAAQ,OAAO,YAC9B,KAAK,IAAI,GAAG,QAAQ,eAAe,EAAE,GACrC,QAAQ,cACR,KAAA,GACA,GAEU,EAAW,MAAM,6BAA6B;IAE5D,IAAI,CAAC,OACD,OAAO,EAAE,QAAQ,MAAM;IAI3B,IAAI,MAAM,WACN,OAAO;KAAE,QAAQ;KACrC,WAAW;IAAK;IAIA,MAAM,QAAQ,MAAM;IAGpB,OAAO;KAAE,QAAQ;KACjC,OAAO;MAAE,MAHoB,QAAQ,MAAM,MAAM,SAAS;MAI1D,IAH2B,QAAQ;KAGhC;KACH;IAAM;GACM;EACJ;CACJ,CAAC;AACL;;;AC1DA,eAAsB,WAAW,MAAkB,aAAwC,KAAa,QAAkB,OAAa;CAEnI,MAAM,EAAE,WAAW,KAAK;CAGxB,MAAM,SADQ,KAAK,MACE,QAAQ,MAAM,MAAc,EAAE,KAAK,QAAQ,cAAc;CAC9E,IAAI,CAAC,QAAQ;EACT,QAAQ,MAAM,wBAAwB;EACtC;CACJ;CAEA,MAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;CACrD,MAAM,cAAc,SAAS,cAAc,KAAK;CAChD,MAAM,eAAe,SAAS,cAAc,KAAK;CACjD,aAAa,aAAa,SAAS,kCAAkC,kBAAkB;CACvF,aAAa,MAAM,YAAY,QAAQ;CACvC,YAAY,YAAY,YAAY;CAEpC,MAAM,OAAO,WAAW,OAAO,KAAK,aAAa,EAAE,IAAI,OAAO,CAAC;CAC/D,IAAI,gBAAgB,OAAO,SAAS,KAAK,KAAK;CAC9C,gBAAgB,eAAe,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,CAAC;CACzD,KAAK,SAAS,KAAK,MAAM,GAAG,QAAQ,QAAQ,EAAE,cAAc,CAAC,CAAC;CAG9D,MAAM,MAAM,MAAM,OAAO,KAAK;CAC9B,QAAQ,MAAM,kBAAkB,GAAG;CAEnC,MAAM,2BAA2B;EAE7B,IAAI,eAAe,OAAO,SAAS,KAAK,KAAK;EAC7C,MAAM,aAAa,aAAa,KAAK,KAAA,GAAW,KAAA,IAAW,SAAQ,KAAK,OAAO,MAAM;EAErF,IAAI,WAAW,WAAW,GAAG;GACzB,QAAQ,KAAK,oDAAoD;GACjE;EACJ;EAGA,MAAM,aAAa,WAAW,GAAG;EAGjC,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC;EAC9D,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,YAAY,YAAY,SAAS;EAGtE,eAAe,aAAa,OAAO,UAAU;EAC7C,GAAG,QAAQ,QAAQ,EAAE,eAAe,aAAa,CAAC;EAClD,KAAK,SAAS,EAAE;CACpB;CAGA,MAAM,YAAY,IAAI,MAAM;CAC5B,UAAU,MAAM;CAChB,UAAU,SAAS;CACnB,UAAU,UAAU;AACxB;AAEA,IAAa,iBAAiB,IAAI,UAAU,aAAa;AAEzD,IAAa,yBAAyB,WAA6B;CAC/D,MAAM,SAAiB,IAAI,OAAO;EAC9B,KAAK;EACL,OAAO;GAEH,YAAY,cAAc;GAE1B,QAAQ,IAAI,QAAQ;IAEhB,MAAM,OAAO,GAAG,QAAQ,MAAM;IAC9B,IAAI,QAAQ,KAAK,eACb,OAAO,KAAK;IAGhB,OAAO,IAAI,IAAI,GAAG,SAAS,GAAG,GAAG;GACrC;EACJ;EACA,OAAO;GACH,iBAAiB;IACb,WAAW,MAAkB,UAAqB;KAC9C,IAAI,MAAM,cAAc,OAAO,SAAS,OAAO,GAAG;MAC9C,MAAM,eAAe;MACrB,OAAO;KACX;KACA,OAAO;IACX;IACA,OAAO,MAAkB,UAAqB;KAC1C,IAAI,CAAC,MAAM,cAAc,SAAS,MAAM,cAAc,MAAM,WAAW,GACnE,OAAO;KAEX,MAAM,eAAe;KAGrB,MAAM,SADQ,MAAM,KAAK,MAAM,aAAa,KAC7B,EAAM,QAAO,SAAQ,SAAS,KAAK,KAAK,IAAI,CAAC;KAE5D,IAAI,OAAO,WAAW,GAAG;MACrB,QAAQ,MAAM,kCAAkC;MAChD,OAAO;KACX;KAEA,OAAO,SAAQ,UAAS;MACpB,MAAM,WAAW,KAAK,YAAY;OAC9B,MAAM,MAAM;OACZ,KAAK,MAAM;MACf,CAAC;MACD,IAAI,CAAC,UAAU;MAEf,MAAM,SAAS,IAAI,WAAW;MAC9B,OAAO,SAAS,OAAO,gBAAgB;OACnC,MAAM,WAAW,MAAM,aAAa,SAAS,KAAK,QAAQ,KAAK;MACnE;MACA,OAAO,cAAc,KAAK;KAC9B,CAAC;KAED,OAAO;IACX;GACJ;GACA,YAAY,MAAkB,OAAuB;IACjD,MAAM,OAAO,MAAM,eAAe,QAAQ,WAAW;IACrD,IAAI,QAAQ,KAAK,SAAS,MAAM,GAE5B,OAAO;IAGX,MAAM,QAAQ,MAAM,KAAK,MAAM,eAAe,SAAS,CAAC,CAAC;IACzD,MAAM,MAAM,KAAK,MAAM,UAAU;IACjC,IAAI,gBAAgB;IAEpB,MACK,QAAQ,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC,EAC/C,SAAS,SAAS;KACf,MAAM,QAAQ,KAAK,UAAU;KAC7B,IAAI,OAAO;MACP,gBAAgB;MAChB,MAAM,SAAS,IAAI,WAAW;MAC9B,OAAO,SAAS,OAAO,gBAAgB;OACnC,MAAM,WAAW,MAAM,aAAa,KAAK,QAAQ,KAAK;MAC1D;MACA,OAAO,cAAc,KAAK;KAC9B;IACJ,CAAC;IAEL,OAAO;GACX;GACA,YAAY,OAAO;IACf,OAAO,OAAO,SAAS,KAAK;GAChC;EACJ;CACJ,CAAC;CAED,OAAO;AACX;;;ACxJA,IAAa,uBAAuB,IAAI,UAAkC,mBAAmB;AAO7F,IAAa,sBAAsB;CAC/B,0BAA0B,OAAoB,UAAmD,gBAAkC;EAC/H,MAAM,EAAE,cAAc;EACtB,MAAM,MAAM,UAAU;EAEtB,IAAI,CAAC,UAAU,OAAO;EAStB,SAPW,MAAM,GAAG,QAAQ,sBAAsB;GAC9C;GACA,MAAM;GACN,QAAQ;GACR;EACJ,CAES,CAAE;EACX,OAAO;CACX;CAEA,0BAA0B,OAAoB,aAA+D;EACzG,IAAI,CAAC,UAAU,OAAO;EAQtB,SANW,MAAM,GAAG,QAAQ,sBAAsB;GAC9C,KAAK;GACL,MAAM;GACN,QAAQ;EACZ,CAES,CAAE;EACX,OAAO;CACX;AACJ;;;;AAKA,IAAa,oCAAoC;CAC7C,OAAO,IAAI,OAA+B;EACtC,KAAK;EAEL,OAAO;GACH,OAAO;IACH,OAAO;KACH,eAAe,cAAc;KAC7B,eAAe;IACnB;GACJ;GAEA,MAAM,IAAI,UAAU;IAChB,MAAM,SAAS,GAAG,QAAQ,oBAAoB;IAE9C,IAAI,QAAQ,SAAS,qBAAqB;KACtC,MAAM,EAAE,KAAK,QAAQ,gBAAgB;KAErC,IAAI,QACA,OAAO;MACH,eAAe,cAAc;MAC7B,eAAe;KACnB;KAGJ,MAAM,aAAa,WAAW,OAAO,WAAW;MAC5C,MAAM,YAAY,SAAS,cAAc,MAAM;MAC/C,UAAU,YAAY;MAGtB,IAAI,aACA,UAAU,YAAY;WACnB;OACH,MAAM,OAAO,SAAS,cAAc,MAAM;OAC1C,KAAK,YAAY;OACjB,UAAU,YAAY,IAAI;MAC9B;MAEA,OAAO;KACX,CAAC;KAED,OAAO;MACH,eAAe,cAAc,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;MAC3D,eAAe;KACnB;IACJ;IAEA,OAAO;KACH,eAAe,SAAS,cAAc,IAAI,GAAG,SAAS,GAAG,GAAG;KAC5D,eAAe,SAAS;IAC5B;GACJ;EACJ;EAEA,OAAO,EACH,YAAY,OAAO;GACf,OAAO,KAAK,SAAS,KAAK,GAAG,iBAAiB,cAAc;EAChE,EACJ;CACJ,CAAC;AACL;;;AC3DA,IAAM,kBAAoC;CACtC;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,KAAK,WAAW;EAC9B,MAAM,oBAAC,UAAD,EAAU,MAAM,SAAS,MAAO,CAAA;EACtC,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,aAAa,OAAO,MAAM,SAAS,EAAE,KAAK,OAAO,KAAK,QAAQ;EAClE;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa;GAAC;GAAQ;GAAQ;GAAQ;GAAS;EAAU;EACzD,MAAM,oBAAC,iBAAD,EAAiB,MAAM,SAAS,MAAO,CAAA;EAC7C,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,WAAW,OAAO,MAAM,SAAS,EAAE,KAAK,OAAO,KAAK,QAAQ;EAChE;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa;GAAC;GAAS;GAAO;EAAO;EACrC,MAAM,oBAAC,cAAD,EAAc,MAAM,SAAS,MAAO,CAAA;EAC1C,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,KAAK,QAAQ;EAC9E;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,YAAY,QAAQ;EAClC,MAAM,oBAAC,cAAD,EAAc,MAAM,SAAS,MAAO,CAAA;EAC1C,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,KAAK,QAAQ;EAC9E;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,YAAY,OAAO;EACjC,MAAM,oBAAC,cAAD,EAAc,MAAM,SAAS,MAAO,CAAA;EAC1C,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,KAAK,QAAQ;EAC9E;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,aAAa,OAAO;EAClC,MAAM,oBAAC,UAAD,EAAU,MAAM,SAAS,MAAO,CAAA;EACtC,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,WAAW,OAAO,MAAM,WAAW,EAAE,KAAK,OAAO,KAAK,QAAQ;EAClE;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,SAAS;EACvB,MAAM,oBAAC,iBAAD,EAAiB,MAAM,SAAS,MAAO,CAAA;EAC7C,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,WAAW,OAAO,MAAM,YAAY,EAAE,KAAK,OAAO,KAAK,QAAQ;EACnE;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,YAAY;EAC1B,MAAM,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;EACvC,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,OAAO,OAAO,MAAM,UAAU,EAAE,KAAK,OAAO,KAAK,QAAQ;EAC7D;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa,CAAC,WAAW;EACzB,MAAM,oBAAC,UAAD,EAAU,MAAM,SAAS,MAAO,CAAA;EACtC,UAAU,MAAM,UAAU;GACtB,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAC7D,aAAa,OAAO,MAAM,UAAU,EAAE,KAAK,OAAO,KAAK,QAAQ;EACnE;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa;GAAC;GAAS;GAAW;GAAS;GAAU;EAAM;EAC3D,MAAM,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;EACvC,UAAU,MAAM,OAAO,WAAW;GAC9B,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;GAE7D,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,OAAO;GACb,MAAM,SAAS;GACf,MAAM,WAAW,YAAY;IACzB,IAAI,MAAM,OAAO,QAAQ;KAErB,IAAI,CADS,MAAM,MAAM,IACd;KACX,MAAM,MAAM,KAAK,MAAM,UAAU;KAEjC,MAAM,SAAS,MAAM,KAAK,MAAM,KAAK,EAAE,QAAO,MAAK,SAAS,KAAK,EAAE,IAAI,CAAC;KACxE,IAAI,OAAO,WAAW,GAAG,OAAO;KAEhC,OAAO,SAAQ,UAAS;MACpB,MAAM,SAAS,IAAI,WAAW;MAC9B,OAAO,SAAS,OAAO,gBAAgB;OACnC,MAAM,WAAW,MAAM,aAAa,KAAK,QAAQ,KAAK;MAC1D;MACA,OAAO,cAAc,KAAK;KAC9B,CAAC;IACL;IACA,OAAO;GACX;GACA,MAAM,MAAM;EAChB;CACJ;CACA;EACI,OAAO;EACP,aAAa;EACb,aAAa;GAAC;GAAS;GAAQ;GAAO;EAAK;EAC3C,MAAM,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;EACvC,UAAU,MAAM,OAAO,QAAQ,cAAc,eAAe;GACxD,IAAI,YAAY,WAAW,YAAY;EAC3C;CACJ;AACJ;AAEA,IAAM,6BAA6C;CAC/C,OAAO;CACP,aAAa;CACb,aAAa,CAAC,IAAI;CAClB,MAAM,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;CACvC,SAAS,OAAO,MAAM,OAAO,QAAQ,iBAAiB;EAClD,IAAI,CAAC,cAAc,MAAM,MAAM,iBAAiB;EAEhD,KAAK,SAAS,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC;EAC7D,aAAa,OAAO,MAAM,SAAS,EAAE,KAAK,OAAO,KAAK,QAAQ;EAE9D,MAAM,EAAE,UAAU;EAClB,MAAM,EAAE,MAAM,OAAO,MAAM;EAE3B,MAAM,mBAAmB,MAAM,IAAI,YAAY,GAAG,MAAM,IAAI;EAC5D,MAAM,kBAAkB,MAAM,IAAI,YAAY,IAAI,MAAM,IAAI,QAAQ,MAAM,IAAI;EAE9E,IAAI,SAAS;EACb,MAAM,SAAS,MAAM,aAAa,aAAa,kBAAkB,kBAAkB,UAAU;GACzF,UAAU;GACV,IAAI,MAAM,WAAW,GACjB,oBAAoB,wBAAwB,KAAK,OAAO,KAAK,UAAU,MAAM;EAErF,CAAC;EAGD,IAAI;GAGA,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,IAAI,EAAE,QAAQ,QAAQ,GAAI;GAEzE,MAAM,SAAS,qBAAqB,KAAK,eAAe;GACxD,IAAI;GAEJ,IAAI,QAAQ;IACR,MAAM,MAAM,SAAS,cAAc,KAAK;IACxC,IAAI,YAAY;IAChB,YAAY,UAAU,WAAW,KAAK,MAAM,MAAM,EAAE,MAAM,GAAG;GACjE,OACI,YAAY,OAAO,MAAM,eAAe;GAG5C,IAAI,WAAW;IACX,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,KAAK,MAAM,UAAU,MAAM,KAAK,MAAM,UAAU,MAAM,UAAU,OAAO;IAC5G,KAAK,SAAS,EAAE;GACpB,OACI,KAAK,SAAS,KAAK,MAAM,GAAG,WAAW,eAAe,CAAC;EAE/D,SAAS,GAAG;GACR,QAAQ,MAAM,CAAC;GACf,KAAK,SAAS,KAAK,MAAM,GAAG,WAAW,MAAM,CAAC;EAClD;CACJ;AACJ;AAEA,IAAa,oBAAoB,EAAE,QAAQ,mBAA4E;CACnH,MAAM,EAAE,MAAM,UAAU,sBAAsB;CAC9C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,eAAe,oBAAoB,SAAS,CAAC;CACpD,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,CAAC,iBAAiB,sBAAsB,SAAS;EAAE,GAAG;EAChE,GAAG;CAAE,CAAC;CAEF,MAAM,cAAc,QAAQ,sBAAsB,SAAS,KAAK,IAAI;CACpE,MAAM,WAAW,aAAa;CAC9B,MAAM,QAAQ,aAAa,SAAS;CACpC,MAAM,QAAQ,aAAa;CAE3B,MAAM,gBAAgB,MAAM,cAAc;EACtC,IAAI,CAAC,UAAU,OAAO,CAAC;EACvB,MAAM,iBAAiB,CAAC,GAAG,eAAe;EAC1C,IAAI,cAAc,eAAe,KAAK,0BAA0B;EAEhE,OAAO,eAAe,QAAO,SAAQ;GACjC,MAAM,UAAU,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;GACrE,IAAI,SAAS,OAAO;GACpB,OAAO,KAAK,aAAa,MAAK,SAAQ,KAAK,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;EAC1F,CAAC;CACL,GAAG;EAAC;EAAO;EAAU;CAAY,CAAC;CAElC,gBAAgB;EACZ,iBAAiB,CAAC;CACtB,GAAG,CAAC,KAAK,CAAC;CAEV,gBAAgB;EACZ,IAAI,CAAC,UAAU,WAAW,IAAI;CAClC,GAAG,CAAC,QAAQ,CAAC;CAEb,gBAAgB;EACZ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,SAAS;EAEtD,MAAM,QAAQ,KAAK,YAAY,MAAM,IAAI;EACzC,MAAM,YAAY,EACd,wBAAwB;GACpB,OAAO;IACH,OAAO;IACP,QAAQ,MAAM,SAAS,MAAM;IAC7B,GAAG,MAAM;IACT,GAAG,MAAM;IACT,KAAK,MAAM;IACX,MAAM,MAAM;IACZ,OAAO,MAAM;IACb,QAAQ,MAAM;GAClB;EACJ,EACJ;EAEA,MAAM,UAAU,WAAW,WAA6B,QAAQ,eAAe;GAC3E,IAAI,CAAC,QAAQ,SAAS;GACtB,gBAAgB,WAA6B,QAAQ,SAAS;IAC1D,WAAW;IACX,YAAY;KAAC,OAAO,CAAC;KAAG,KAAK;KAAG,MAAM;IAAC;IACvC,UAAU;GACd,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ;IAClB,IAAI,QAAQ,SACR,OAAO,OAAO,QAAQ,QAAQ,OAAO;KACjC,MAAM,GAAG,EAAE;KACX,KAAK,GAAG,EAAE;KACV,YAAY;IAChB,CAAC;GAET,CAAC;EACL,CAAC;EACD,aAAa,QAAQ;CACzB,GAAG;EAAC;EAAM;EAAU;CAAK,CAAC;CAE1B,gBAAgB;EACZ,IAAI,CAAC,YAAY,CAAC,MAAM;EAExB,MAAM,iBAAiB,MAAqB;GACxC,IAAI,YAAY,cAAc;IAC1B,IAAI,EAAE,QAAQ,UAAU;KACpB,EAAE,eAAe;KAAG,EAAE,gBAAgB;KAAG,EAAE,yBAAyB;KACpE,WAAW,IAAI;KACf,mBAAmB;MAAE,GAAG;MAC5C,GAAG;KAAE,CAAC;IACU,OAAO,IAAI,EAAE,QAAQ,WAAW;KAC5B,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,oBAAmB,UAAS;MAAE,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;MAC3E,GAAG,KAAK;KAAE,EAAE;IACI,OAAO,IAAI,EAAE,QAAQ,aAAa;KAC9B,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,oBAAmB,UAAS;MAAE,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;MAC3E,GAAG,KAAK;KAAE,EAAE;IACI,OAAO,IAAI,EAAE,QAAQ,aAAa;KAC9B,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,oBAAmB,UAAS;MAAE,GAAG,KAAK;MAC1D,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;KAAE,EAAE;IACb,OAAO,IAAI,EAAE,QAAQ,cAAc;KAC/B,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,oBAAmB,UAAS;MAAE,GAAG,KAAK;MAC1D,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;KAAE,EAAE;IACb,OAAO,IAAI,EAAE,QAAQ,SAAS;KAC1B,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,IAAI,OAAO;MACP,MAAM,YAAY,gBAAgB,KAAK,MAAM,QAAQ,gBAAgB,IAAI,GAAG,gBAAgB,IAAI,CAAC;MACjG,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,IAAI,SAAS;MACpE,IAAI;OACA,MAAM,YAAY,cAAc,OAAO,GAAG,KAAK,MAAM,OAAO,CAAC;OAC7D,GAAG,aAAa,SAAS;MAC7B,SAAS,GAAG;OACR,QAAQ,KAAK,+BAA+B,CAAC;MACjD;MACA,GAAG,QAAQ,uBAAuB,EAAE,QAAQ,MAAM,CAAC;MACnD,KAAK,SAAS,EAAE;MAChB,KAAK,MAAM;MACX,WAAW,IAAI;MACf,mBAAmB;OAAE,GAAG;OAChD,GAAG;MAAE,CAAC;KACc;IACJ;IACA;GACJ;GAEA,IAAI,EAAE,QAAQ,WAAW;IACrB,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,kBAAiB,UAAS,OAAO,cAAc,SAAS,KAAK,cAAc,MAAM;GACrF,OAAO,IAAI,EAAE,QAAQ,aAAa;IAC9B,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,kBAAiB,UAAS,OAAO,KAAK,cAAc,MAAM;GAC9D,OAAO,IAAI,EAAE,QAAQ,SAAS;IAC1B,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,IAAI,cAAc,kBAAkB,OAAO;KACvC,cAAc,eAAe,QAAQ,MAAM,OAAO,QAAQ,cAAc,UAAU;KAElF,iBAAiB,CAEjB,GAAG,CAAC;IACR;GACJ,OAAO,IAAI,EAAE,QAAQ,UAAU;IAC3B,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,EAAE,yBAAyB;IAE3B,KAAK,SAAS,KAAK,MAAM,GAAG,QAAQ,uBAAuB;KAAE,QAAQ;KACrF,WAAW;IAAK,CAAC,CAAC;GACN;EACJ;EAEA,OAAO,iBAAiB,WAAW,eAAe,EAAE,SAAS,KAAK,CAAC;EACnE,aAAa,OAAO,oBAAoB,WAAW,eAAe,EAAE,SAAS,KAAK,CAAC;CACvF,GAAG;EAAC;EAAU;EAAe;EAAe;EAAM;EAAO;EAAQ;EAAc;EAAS;CAAe,CAAC;CAExG,MAAM,WAAW,OAAqC,CAAC,CAAC;CAExD,gBAAgB;EACZ,IAAI,SAAS,QAAQ,gBACjB,SAAS,QAAQ,gBAAgB,eAAe,EAAE,OAAO,UAAU,CAAC;CAE5E,GAAG,CAAC,aAAa,CAAC;CAElB,gBAAgB;EACZ,IAAI,CAAC,SACD,mBAAmB;GAAE,GAAG;GACpC,GAAG;EAAE,CAAC;CAEF,GAAG,CAAC,OAAO,CAAC;CAEZ,IAAI,CAAC,YAAY,cAAc,WAAW,GAAG,OAAO;CAEpD,IAAI,YAAY,gBAAgB,SAAS,MACrC,OACI,oBAAC,OAAD;EACI,KAAK;EACL,cAAc,MAAM,EAAE,eAAe;EACrC,OAAO;GAAE,UAAU;GACnC,QAAQ;GACR,YAAY;EAAS;EACL,WAAW,IAAI,8GAA8G,kBAAkB;YAE/I,oBAAC,iBAAD;GACI,YAAY,gBAAgB;GAC5B,YAAY,gBAAgB;GAC5B,UAAU,GAAG,MAAM,mBAAmB;IAAE;IAC5D;GAAE,CAAC;GACiB,WAAW,MAAM,SAAS;IACtB,MAAM,YAAY,gBAAgB,KAAK,MAAM,QAAQ,MAAM,IAAI;IAC/D,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,MAAM,MAAM,MAAM,IAAI,SAAS;IACpE,IAAI;KACA,MAAM,YAAY,cAAc,OAAO,GAAG,KAAK,MAAM,OAAO,CAAC;KAC7D,GAAG,aAAa,SAAS;IAC7B,SAAS,GAAG;KACR,QAAQ,KAAK,+BAA+B,CAAC;IACjD;IACA,GAAG,QAAQ,uBAAuB,EAAE,QAAQ,MAAM,CAAC;IACnD,KAAK,SAAS,EAAE;IAChB,KAAK,MAAM;IACX,WAAW,IAAI;GACnB;EACH,CAAA;CACA,CAAA;CAIb,OACI,oBAAC,OAAD;EACI,KAAK;EACL,OAAO;GAAE,UAAU;GAC/B,QAAQ;GACR,YAAY;EAAS;EACT,WAAW,IAAI,uJAAuJ,kBAAkB;YAEvL,cAAc,KAAK,MAAM,UACtB,qBAAC,UAAD;GAEI,MAAK,OAAM;IAAE,SAAS,QAAQ,SAAS;GAAI;GAC3C,UAAU,MAAM;IACZ,EAAE,eAAe;IACjB,IAAI,SAAS,MAAM;KACf,KAAK,QAAQ,MAAM,OAAO,QAAQ,cAAc,UAAU;KAE1D,IAAI,CAAC,SAAS,KAAK,MAAM;IAC7B;GACJ;GACA,cAAc,MAAM,EAAE,eAAe;GACrC,WAAW,IAAI,wHACX,UAAU,gBAAgB,2CAA2C,EAAE;aAb/E,CAeI,oBAAC,OAAD;IAAK,WAAW,IAAI,sGAAsG,kBAAkB;cACvI,KAAK;GACL,CAAA,GACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,KAAD;KAAG,WAAU;eAAwB,KAAK;IAAS,CAAA,GACnD,oBAAC,KAAD;KAAG,WAAU;eACR,KAAK;IACP,CAAA,CACF;KACD;KAvBC,KAAK,KAuBN,CACX;CACA,CAAA;AAEb;AAEA,IAAM,mBAAmB,QAA4C,WAAmB,cAAsB;CAC1G,MAAM,OAAO,CAAC;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EAChC,MAAM,QAAQ,CAAC;EACf,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;GAGhC,MAAM,QAFW,MAAM,IACK,OAAO,MAAM,eAAe,OAAO,MAAM,YAC/C,cAAc;GACpC,IAAI,MAAM,MAAM,KAAK,IAAI;EAC7B;EACA,MAAM,MAAM,OAAO,MAAM,UAAU,OAAO,MAAM,WAAS,KAAK,KAAK,CAAC;EACpE,KAAK,KAAK,GAAG;CACjB;CACA,OAAO,OAAO,MAAM,MAAM,OAAO,MAAM,WAAS,KAAK,IAAI,CAAC;AAC9D;AAEA,IAAM,mBAAmB,EACrB,YACA,YACA,SACA,eAME;CACF,OACI,qBAAC,OAAD;EAAK,WAAU;YAAf,CACI,qBAAC,QAAD;GAAM,WAAU;aAAhB;IACK,aAAa;IAAE;IAAI,aAAa;IAAE;GACjC;MACN,oBAAC,OAAD;GAAK,WAAU;aACV,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MAC/B,oBAAC,OAAD;IAAa,WAAU;cAClB,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MAC/B,oBAAC,OAAD;KAEI,WAAW,IACP,0EACA,KAAK,cAAc,KAAK,aAClB,sEACA,yFACV;KACA,oBAAoB,QAAQ,GAAG,CAAC;KAChC,eAAe,SAAS,aAAa,GAAG,aAAa,CAAC;IACzD,GATQ,CASR,CACJ;GACA,GAdK,CAcL,CACR;EACA,CAAA,CACJ;;AAEb;;;ACvgBA,IAAa,cAAc,YACtB,EACI,SACA,aACD,QAAQ;CACR,MAAM,EACF,MACA,UACA,sBAAsB;CAC1B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,KAAK,UAAU,SAAS,EAAE;CACjC,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAE5D,gBAAgB;EACZ,IAAI,CAAC,MAAM;EACX,MAAM,qBAAqB,MAAkB;GACzC,MAAM,UAAU,KAAK,YAAY;IAC7B,MAAM,EAAE;IACR,KAAK,EAAE;GACX,CAAC;GACD,IAAI,WAAW,QAAQ,UAAU,GAAG;IAChC,MAAM,OAAO,KAAK,MAAM,IAAI,OAAO,QAAQ,MAAM;IACjD,IAAI,QAAQ,KAAK,KAAK,SAAS,SAAS;KACpC,EAAE,eAAe;KACjB,MAAM,KAAK,KAAK,MAAM,GAAG,aAAa,cAAc,OAAO,KAAK,MAAM,KAAK,QAAQ,MAAM,CAAC;KAC1F,KAAK,SAAS,EAAE;KAChB,QAAQ,IAAI;KACZ,OAAO,KAAK,MAAM,OAAO,EAAE;KAC3B,SAAS,KAAK,MAAM,SAAS,EAAE;KAC/B,YAAY,QAAQ,MAAM;IAC9B;GACJ;EACJ;EACA,KAAK,IAAI,iBAAiB,eAAe,iBAAiB;EAE1D,MAAM,mBAAmB,MAAkB;GACvC,IAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,SAAS,EAAE,MAAc,KAAK,EAAE,WAAW,GAC/E,QAAQ,KAAK;EAErB;EACA,SAAS,iBAAiB,aAAa,eAAe;EAEtD,aAAa;GACT,KAAK,IAAI,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,aAAa,eAAe;EAC7D;CACJ,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,SAAS;EAElD,MAAM,EACF,MACA,OACA,MAAM;EACV,IAAI,QAAQ,KAAK,YAAY,IAAI;EACjC,IAAI,MAAM,KAAK,YAAY,EAAE;EAE7B,MAAM,YAAY,EACd,wBAAwB;GACpB,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG;GACvC,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM;GAChD,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM,IAAI,IAAI;GAC1C,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK;GAC7C,OAAO;IACH,OAAO,QAAQ;IACf,QAAQ,SAAS;IACjB,GAAG;IACH,GAAG;IACH;IACA;IACA;IACA;GACJ;EACJ,EACJ;EAEA,MAAM,UAAU,WAAW,WAA6B,QAAQ,eAAe;GAC3E,IAAI,CAAC,QAAQ,SAAS;GACtB,IAAI;IACA,QAAQ,KAAK,YAAY,MAAM,UAAU,IAAI;IAC7C,MAAM,KAAK,YAAY,MAAM,UAAU,EAAE;GAC7C,SAAS,GAAG,CAEZ;GAEA,gBAAgB,WAA6B,QAAQ,SAAS;IAC1D,WAAW,SAAS,aAAa;IACjC,YAAY;KAAC,OAAO,SAAS,UAAU,CAAC;KAAG,KAAK;KAAG,MAAM;IAAC;IAC1D,UAAU;GACd,CAAC,EAAE,MAAM,EACI,GACA,QACE;IACX,IAAI,QAAQ,SACR,OAAO,OAAO,QAAQ,QAAQ,OAAO;KACjC,MAAM,GAAG,EAAE;KACX,KAAK,GAAG,EAAE;KACV,YAAY;IAChB,CAAC;GAET,CAAC;EACL,CAAC;EACD,aAAa,QAAQ;CACzB,GAAG;EAAC;EAAM;EAAM;EAAO;CAAO,CAAC;CAE/B,MAAM,cAAc,QAAgB,aAAqB;EACrD,IAAI,aAAa,QAAQ,MAAM;GAC3B,MAAM,OAAO,KAAK,MAAM,IAAI,OAAO,QAAQ;GAC3C,IAAI,QAAQ,KAAK,KAAK,SAAS,SAAS;IACpC,MAAM,KAAK,KAAK,MAAM,GAAG,cAAc,UAAU,KAAA,GAAW;KACxD,GAAG,KAAK;KACR,KAAK;KACL,OAAO;IACX,CAAC;IAED,GAAG,aAAa,cAAc,OAAO,GAAG,KAAK,QAAQ,CAAC;IACtD,KAAK,SAAS,EAAE;GACpB;EACJ;CACJ;CAEA,IAAI,CAAC,MAAM,OAAO;CAElB,OACI,qBAAC,OAAD;EACI,KAAK;EACL,OAAO;GACH,YAAY;GACZ,UAAU;GACV,QAAQ;EACZ;EACA,WAAW,IAAI,wGAAwG,oBAAoB,SAAS;EACpJ,cAAc,MAAM;GAIhB,IAAI,EAAE,WAAW,EAAE,eACf,EAAE,eAAe;EAEzB;YAfJ,CAiBI,oBAAC,WAAD;GACI,MAAM;GACN,aAAa,EAAE,UAAU;GACzB,OAAO;GACP,WAAW,MAAiE;IACxE,OAAO,EAAE,OAAO,KAAK;IACrB,WAAW,EAAE,OAAO,OAAO,KAAK;GACpC;EACH,CAAA,GACD,oBAAC,WAAD;GACI,MAAM;GACN,aAAa,EAAE,OAAO;GACtB,OAAO;GACP,WAAW,MAAiE;IACxE,SAAS,EAAE,OAAO,KAAK;IACvB,WAAW,KAAK,EAAE,OAAO,KAAK;GAClC;EACH,CAAA,CACA;;AAEb,CACJ;AAEA,YAAY,cAAc;;;ACvJ1B,IAAM,sBAAsB,UAAuB;CAC/C,MAAM,EAAE,UAAU,MAAM;CACxB,KAAK,IAAI,IAAI,MAAM,OAAO,IAAI,GAAG,KAC7B,IAAI,MAAM,KAAK,CAAC,EAAE,KAAK,SAAS,SAC5B,OAAO;CAGf,OAAO;AACX;AAMA,IAAa,cAAc,YACtB,EACI,SACA,aACD,QAAQ;CACR,MAAM,EACF,MACA,UACA,sBAAsB;CAC1B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CAEtC,gBAAgB;EACZ,IAAI,CAAC,OAAO;EACZ,QAAQ,mBAAmB,KAAK,CAAC;CACrC,GAAG,CAAC,OAAO,SAAS,CAAC;CAErB,gBAAgB;EACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,SAAS;EAElD,MAAM,EACF,MACA,OACA,MAAM;EAGV,IAAI,KAAK,aAAa;EAEtB,IAAI,QAAQ,KAAK,YAAY,IAAI;EACjC,IAAI,MAAM,KAAK,YAAY,EAAE;EAE7B,MAAM,YAAY,EACd,wBAAwB;GACpB,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG;GACvC,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM;GAChD,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM,IAAI,IAAI;GAC1C,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK;GAE7C,OAAO;IACH,OAAO,QAAQ;IACf,QAAQ,SAAS;IACjB,GAAG;IACH,GAAG;IACH;IACA;IACA;IACA;GACJ;EACJ,EACJ;EAEA,MAAM,UAAU,WAAW,WAA6B,QAAQ,eAAe;GAC3E,IAAI,CAAC,QAAQ,WAAW,KAAK,aAAa;GAC1C,IAAI;IACA,QAAQ,KAAK,YAAY,MAAM,UAAU,IAAI;IAC7C,MAAM,KAAK,YAAY,MAAM,UAAU,EAAE;GAC7C,SAAS,GAAG,CAEZ;GAEA,gBAAgB,WAA6B,QAAQ,SAAS;IAC1D,WAAW,SAAS,aAAa;IACjC,YAAY;KAAC,OAAO,SAAS,UAAU,CAAC;KAAG,KAAK;KAAG,MAAM;IAAC;IAC1D,UAAU;GACd,CAAC,EAAE,MAAM,EACI,GACA,QACE;IACX,IAAI,QAAQ,SACR,OAAO,OAAO,QAAQ,QAAQ,OAAO;KACjC,MAAM,GAAG,EAAE;KACX,KAAK,GAAG,EAAE;KACV,YAAY;IAChB,CAAC;GAET,CAAC;EACL,CAAC;EACD,aAAa,QAAQ;CACzB,GAAG;EAAC;EAAM;EAAM;EAAO;CAAO,CAAC;CAE/B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,OAAO;CAErC,MAAM,kBAAkB,QAA2G;EAC/H,IAAI,OAAO,KAAK,QAAQ;EACxB,KAAK,MAAM;CACf;CAEA,OACI,qBAAC,OAAD;EACI,KAAK;EACL,OAAO;GACH,YAAY;GACZ,UAAU;GACV,QAAQ;EACZ;EACA,WAAW,IAAI,oFAAoF,oBAAoB,SAAS;EAChI,cAAc,MAAM;GAEhB,EAAE,eAAe;EACrB;YAXJ;GAaI,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,SAAD;MAAS,OAAO,EAAE,gBAAgB;gBAC9B,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,YAAY;iBAC/D,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAI,IAAG;UAAK,IAAG;SAAU,CAAA;QACxC;;MACG,CAAA;KACP,CAAA;KACT,oBAAC,SAAD;MAAS,OAAO,EAAE,eAAe;gBAC7B,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,WAAW;iBAC9D,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC5C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;QAC1C;;MACG,CAAA;KACP,CAAA;KACT,oBAAC,SAAD;MAAS,OAAO,EAAE,YAAY;gBAC1B,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,SAAS;iBAC5D,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;QAC1C;;MACG,CAAA;KACP,CAAA;IACR;;GAEL,qBAAC,OAAD;IAAK,WAAU;cAAf;KACI,oBAAC,SAAD;MAAS,OAAO,EAAE,mBAAmB;gBACjC,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,eAAe;iBAClE,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAI,IAAG;UAAI,IAAG;UAAI,IAAG;SAAW,CAAA;QACxC;;MACG,CAAA;KACP,CAAA;KACT,oBAAC,SAAD;MAAS,OAAO,EAAE,kBAAkB;gBAChC,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,cAAc;iBACjE,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAK,IAAG;UAAK,IAAG;SAAW,CAAA;SAC5C,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;QAC1C;;MACG,CAAA;KACP,CAAA;KACT,oBAAC,SAAD;MAAS,OAAO,EAAE,eAAe;gBAC7B,oBAAC,YAAD;OAAY,MAAK;OAAQ,eAAe,eAAe,YAAY;iBAC/D,qBAAC,OAAD;QAAK,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,QAAO;QAC9D,aAAY;QAAI,eAAc;QAAQ,gBAAe;kBAD1D;SAEI,oBAAC,QAAD;UAAM,GAAE;UAAI,GAAE;UAAI,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,IAAG;SAAU,CAAA;SAC7D,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;SAC3C,oBAAC,QAAD;UAAM,IAAG;UAAK,IAAG;UAAI,IAAG;UAAK,IAAG;SAAW,CAAA;QAC1C;;MACG,CAAA;KACP,CAAA;IACR;;GAEL,oBAAC,SAAD;IAAS,OAAO,EAAE,cAAc;cAC5B,oBAAC,YAAD;KAAY,MAAK;KAAQ,eAAe,eAAe,WAAW;eAC9D,qBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAC9D,aAAY;MAAI,eAAc;MAAQ,gBAAe;gBAD1D;OAEI,oBAAC,YAAD,EAAU,QAAO,eAAyB,CAAA;OAC1C,oBAAC,QAAD,EACI,GAAE,iFAAuF,CAAA;OAC7F,oBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAW,CAAA;OAC5C,oBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAW,CAAA;MAC3C;;IACG,CAAA;GACP,CAAA;EACR;;AAEb,CACJ;AAEA,YAAY,cAAc;;;ACrO1B,SAAgB,aAAa,OAAoB,MAAgB;CAC7D,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO;CAC5B,MAAM,EAAE,MAAM,OAAO,IAAI,UAAU,MAAM;CACzC,IAAI,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM,eAAe,MAAM,MAAM,CAAC;CACnE,OAAO,MAAM,IAAI,aAAa,MAAM,IAAI,IAAI;AAChD;AAEA,SAAgB,aAAa,OAAoB,MAAgB,QAAiC,CAAC,GAAG;CAClG,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO;CAC5B,MAAM,YAAY,MAAM;CACxB,MAAM,EAAE,OAAO,OAAO;CACtB,MAAM,OAAO,qBAAqB,gBAAgB,KAAA,IAAa,UAAyC;CACxG,IAAI,MACA,OAAO,KAAK,SAAS,SAAS,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,OAAO,QAAQ,KAAK,MAAM,SAAS,MAAM,IAAI;CAE5G,OAAO,MAAM,MAAM,IAAI,KAAK,MAAM,OAAO,SAAS,SAAS,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,OAAO,QAAQ,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI;AACjJ;AAEA,SAAgB,kBAAkB,OAAoB,MAAgB;CAClE,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC;CAC7B,MAAM,EAAE,MAAM,OAAO,IAAI,UAAU,MAAM;CACzC,IAAI;CACJ,IAAI,OACA,OAAO,KAAK,QAAQ,MAAM,eAAe,MAAM,MAAM,CAAC;MACnD;EACH,IAAI,QAAQ;EACZ,MAAM,IAAI,aAAa,MAAM,KAAK,SAAS;GACvC,IAAI,OAAO,OAAO;GAClB,MAAM,IAAI,KAAK,QAAQ,KAAK,KAAK;GACjC,IAAI,GAAG;IACH,OAAO;IACP,QAAQ;GACZ;GACA,OAAO;EACX,CAAC;CACL;CACA,OAAO,OAAO,KAAK,QAAQ,CAAC;AAChC;AAEA,SAAgB,QAAQ,MAAgB,OAAiC;CACrE,QAAQ,OAAoB,aAAyC;EAEjE,MAAM,EAAE,OAAO,SAAS,WADN,MAAM;EAExB,IAAK,SAAS,CAAC,WAAY,CAAC,MAAM,OAAO;EACzC,IAAI,UACA,IAAI,SACA,SAAS,MAAM,GAAG,cAAc,KAAK,OAAO,KAAK,CAAC,CAAC;OAChD;GACH,MAAM,KAAK,MAAM;GACjB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACpC,MAAM,EAAE,OAAO,QAAQ,OAAO;IAC9B,GAAG,QAAQ,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,CAAC;GACrD;GACA,SAAS,GAAG,eAAe,CAAC;EAChC;EAEJ,OAAO;CACX;AACJ;AAEA,SAAgB,UAAU,MAAgB;CACtC,QAAQ,OAAoB,aAAyC;EAEjE,MAAM,EAAE,OAAO,SAAS,WADN,MAAM;EAExB,IAAK,SAAS,CAAC,WAAY,CAAC,MAAM,OAAO;EACzC,IAAI,UAAU;GACV,MAAM,KAAK,MAAM;GACjB,IAAI,SAAS;IACT,MAAM,SAAS,QAAQ;IACvB,IAAI,YAAY;IAChB,IAAI,UAAU;IACd,IAAI,mBAAmB;IAEvB,OAAO,SAAS,OAAwB,WAAmB;KACvD,MAAM,aAAa,QAAQ,MAAM,IAAI;KACrC,MAAM,WAAW,aAAa,MAAM;KAEpC,IAAI,KAAK,QAAQ,MAAM,KAAK,GAAG;MAC3B,IAAI,qBAAqB,IAAI,mBAAmB;MAChD,IAAI,QAAQ,OAAO,cAAc,QAAQ,OAAO,UAC5C,YAAY;KAEpB,OACI,IAAI,qBAAqB,IAAI;MACzB,IAAI,cAAc,MAAM,YAAY,IAAI,UAAU;MAClD,mBAAmB;KACvB;IAER,CAAC;IAED,IAAI,cAAc,MAAM,YAAY,IAChC,UAAU,QAAQ,IAAI;IAG1B,IAAI,cAAc,MAAM,YAAY,IAChC,GAAG,WAAW,WAAW,SAAS,IAAI;IAE1C,GAAG,iBAAiB,IAAI;IACxB,SAAS,GAAG,eAAe,CAAC;GAChC,OAAO;IACH,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;KACpC,MAAM,EAAE,OAAO,QAAQ,OAAO;KAC9B,GAAG,WAAW,MAAM,KAAK,IAAI,KAAK,IAAI;IAC1C;IACA,SAAS,GAAG,eAAe,CAAC;GAChC;EACJ;EACA,OAAO;CACX;AACJ;;;AC7EA,IAAM,QAAwB;CAC1B;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,QAAQ;EAClF,WAAW,UACP,aAAa,OAAO,OAAO,MAAM,SAAS,KAC1C,CAAC,aAAa,OAAO,OAAO,MAAM,WAAW,KAC7C,CAAC,aAAa,OAAO,OAAO,MAAM,YAAY;CACtD;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,QAAQ;EAC9F,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAC/E;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,QAAQ;EAC9F,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAC/E;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,QAAQ;EAC9F,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAC/E;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,WAAW,OAAO,MAAM,SAAS,EAAE,OAAO,QAAQ;EAChF,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,SAAS;CACnE;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,WAAW,OAAO,MAAM,WAAW,EAAE,OAAO,QAAQ;EAClF,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,WAAW;CACrE;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,WAAW,OAAO,MAAM,YAAY,EAAE,OAAO,QAAQ;EACnF,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,YAAY;CACtE;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,OAAO,OAAO,MAAM,UAAU,EAAE,OAAO,QAAQ;EAC7E,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,UAAU;CACpE;CACA;EACI,MAAM;EACN,UAAU;EACV,MAAM;EACN,UAAU,OAAO,aAAa,aAAa,OAAO,MAAM,UAAU,EAAE,OAAO,QAAQ;EACnF,WAAW,UAAU,aAAa,OAAO,OAAO,MAAM,UAAU;CACpE;AACJ;AAQA,IAAa,gBAAgB,EACzB,MACA,cACA,sBACqB;CACrB,MAAM,EAAE,OAAO,SAAS,sBAAsB;CAC9C,MAAM,EAAE,MAAM,eAAe;CAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO;CAE5B,MAAM,aAAa,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE,IAAI,KAAK;EACrE,MAAM;EACN,UAAU;CACd;CAEA,OACI,oBAAC,SAAD;EACI,YAAY;EACZ,OAAM;EACW;EACjB,WAAU;EACV,SAAS,qBAAC,QAAD;GAAQ,SAAQ;GACrB,WAAU;GACV,OAAM;aAFD,CAGL,oBAAC,QAAD;IAAM,WAAU;cAA6B,EAAE,WAAW,QAAQ;GAAQ,CAAA,GAC1E,oBAAC,iBAAD,EAAiB,MAAM,SAAS,MAAO,CAAA,CACnC;;EACR,OAAO;EACD;EACQ;YACb,MAAM,KAAK,MAAM,UACd,qBAAC,kBAAD;GAEI,gBAAgB;IACZ,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ;IACtC,KAAK,MAAM;IACX,aAAa,KAAK;GACtB;GACA,WAAU;aAPd,CASI,qBAAC,OAAD;IAAK,WAAU;cAAf,CACI,oBAAC,KAAK,MAAN,EAAW,MAAM,SAAS,SAAU,CAAA,GACpC,oBAAC,QAAD,EAAA,UAAO,EAAE,KAAK,QAAQ,EAAQ,CAAA,CAC7B;OACJ,WAAW,SAAS,KAAK,QAAQ,oBAAC,WAAD,EAAW,MAAM,SAAS,SAAU,CAAA,CACxD;KAbT,KAaS,CACrB;CACI,CAAA;AAEjB;;;ACvJA,SAAgB,WAAW,KAAa;CACpC,IAAI;EACA,IAAI,IAAI,GAAG;EACX,OAAO;CACX,SAAS,GAAG;EACR,OAAO;CACX;AACJ;AAEA,SAAgB,iBAAiB,KAAa;CAC1C,IAAI,WAAW,GAAG,GAAG,OAAO;CAC5B,IAAI;EACA,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,GAAG,GACtC,OAAO,IAAI,IAAI,WAAW,KAAK,EAAE,SAAS;EAE9C,OAAO;CACX,SAAS,GAAG;EACR,OAAO;CACX;AACJ;AAOA,IAAa,gBAAgB,EACzB,MACA,mBACqB;CACrB,MAAM,WAAW,OAAyB,IAAI;CAC9C,MAAM,EAAE,OAAO,SAAS,sBAAsB;CAC9C,MAAM,EAAE,MAAM,eAAe;CAG7B,gBAAgB;EACZ,IAAI,QAAQ,SAAS,SACjB,SAAS,QAAQ,MAAM;CAE/B,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO;CAE5B,MAAM,gBAAgB,MAAwC;EAC1D,EAAE,eAAe;EACjB,MAAM,QAAQ,SAAS,SAAS;EAChC,IAAI,CAAC,OAAO;EACZ,MAAM,MAAM,iBAAiB,KAAK;EAClC,IAAI,KAAK;GACL,QAAQ,OAAO,MAAM,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,OAAO,KAAK,QAAQ;GACnE,KAAK,MAAM;GACX,aAAa,KAAK;EACtB;CACJ;CAEA,MAAM,yBAAyB;EAC3B,UAAU,OAAO,MAAM,IAAI,EAAE,KAAK,OAAO,KAAK,QAAQ;EACtD,KAAK,MAAM;EACX,aAAa,KAAK;CACtB;CAEA,MAAM,WAAW,aAAa,OAAO,OAAO,MAAM,IAAI;CACtD,MAAM,OAAO,kBAAkB,OAAO,OAAO,MAAM,IAAI,EAAE,QAAQ;CAEjE,OACI,oBAAC,SAAD;EAAS,OAAO;EACN;EACQ;EACd,SAAS,oBAAC,QAAD;GAAQ,SAAQ;GACrB,MAAK;GACL,WAAU;GACV,OAAO;aACP,oBAAC,KAAD;IAAG,WAAW,IAAI,qDAAqD,EACnE,iBAAiB,SACrB,CAAC;cACI,EAAE,aAAa;GACjB,CAAA;EACC,CAAA;YACR,qBAAC,QAAD;GACI,UAAU;GACV,WAAU;aAFd,CAII,oBAAC,WAAD;IACc;IACV,WAAW;IACX,aAAa,EAAE,2BAA2B;IAC1C,cAAc;IACd,MAAK;IACL,WAAU;IACV,gBAAgB,IAAI,2CAA2C,eAAe;GACjF,CAAA,GAEA,OACG,oBAAC,QAAD;IACI,MAAM;IACN,SAAQ;IACR,MAAK;IACL,OAAO;IACP,WAAU;IACV,SAAS;cAET,oBAAC,YAAD,EAAY,MAAM,SAAS,MAAO,CAAA;GAC9B,CAAA,IAER,oBAAC,QAAD;IAAQ,MAAM;IACV,MAAK;IACL,SAAS;cACT,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;GAC7B,CAAA,CAEV;;CACD,CAAA;AAEjB;;;AC9GA,IAAa,oBAAoB;CAC7B,MAAM,EAAE,OAAO,SAAS,sBAAsB;CAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO;CAyC5B,OACI,oBAAC,OAAD;EAAK,WAAU;YACV;GAvCL;IACI,MAAM;IACN,UAAU;IACV,WAAW,MAAmB,aAAa,GAAG,OAAO,MAAM,IAAI;IAC/D,UAAU,GAAgB,aAAwC,WAAW,OAAO,MAAM,IAAI,EAAE,GAAG,QAAQ;IAC3G,MAAM;GACV;GACA;IACI,MAAM;IACN,UAAU;IACV,WAAW,MAAmB,aAAa,GAAG,OAAO,MAAM,MAAM;IACjE,UAAU,GAAgB,aAAwC,WAAW,OAAO,MAAM,MAAM,EAAE,GAAG,QAAQ;IAC7G,MAAM;GACV;GACA;IACI,MAAM;IACN,UAAU;IACV,WAAW,MAAmB,aAAa,GAAG,OAAO,MAAM,SAAS;IACpE,UAAU,GAAgB,aAAwC,WAAW,OAAO,MAAM,SAAS,EAAE,GAAG,QAAQ;IAChH,MAAM;GACV;GACA;IACI,MAAM;IACN,UAAU;IACV,WAAW,MAAmB,aAAa,GAAG,OAAO,MAAM,MAAM;IACjE,UAAU,GAAgB,aAAwC,WAAW,OAAO,MAAM,MAAM,EAAE,GAAG,QAAQ;IAC7G,MAAM;GACV;GACA;IACI,MAAM;IACN,UAAU;IACV,WAAW,MAAmB,aAAa,GAAG,OAAO,MAAM,IAAI;IAC/D,UAAU,GAAgB,aAAwC,WAAW,OAAO,MAAM,IAAI,EAAE,GAAG,QAAQ;IAC3G,MAAM;GACV;EAKK,EAAM,KAAK,MAAM,UACd,oBAAC,kBAAD;GAEI,gBAAgB;IACZ,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ;IACtC,KAAK,MAAM;GACf;aAEA,oBAAC,QAAD;IAAQ,MAAM;IACV,OAAM;IACN,WAAU;IACV,SAAQ;cACR,oBAAC,KAAK,MAAN,EACI,WAAW,IAAI;KACX,gBAAgB,CAAC,KAAK,SAAS,KAAK;KACpC,iBAAiB,KAAK,SAAS,KAAK;IACxC,CAAC,EACJ,CAAA;GACG,CAAA;EACM,GAjBT,KAiBS,CACrB;CACA,CAAA;AAEb;;;AC9EA,SAAgB,sBAAsB,SAA2B;CAE7D,IAAI,MAAM,QAAQ,OAAO,GACrB,OAAO,QAAQ,KAAI,SAAQ,sBAAsB,IAAI,CAAC;MACnD,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM;EACxD,MAAM,MAAM;EAEZ,IAAI,IAAI,SAAS,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU,QAAQ,WAAY,IAAI,OACpF,OAAQ,IAAI,MAAkC;EAIlD,OAAO,KAAK,GAAG,EAAE,SAAQ,QAAO;GAC5B,IAAI,OAAO,sBAAsB,IAAI,IAAI;EAC7C,CAAC;CACL;CACA,OAAO;AACX;;;ACdA,SAAgB,sBAAsB,MAAkB,OAAc;CAClE,KAAK,SAAS,oBAAmB,MAAK;EAClC,QAAQ,EAAE,OAAQ,IAAI;CAC1B,CAAC;CAED,MAAM,UAAU,CAAC;CACjB,IAAI,EACA,SACA,WACA,YACA;CACJ,OAAO,YAAY,KAAK,UAAU,KAAK,QAAQ,cAAc,KAAK,QAAQ,WAAY,cAAc,GAAG;EACnG;EACA;EACA,MAAM,OAAO,QAAQ;EACrB,MAAM,WAAW,KAAK;EACtB,QAAQ,KAAK,KAAK,KAAK,MAAM,KAAK,SAAS,SAAS,eAAe,KAAK,QAAQ,IAAI;EACpF,UAAU,KAAK;CACnB;CAEA,MAAM,aAAa,KAAK,SAAS,qBAAqB,KAAK,cAAc,WAAW,KAAK,MAAM,MAAM;CACrG,MAAM,MAAM,YAAY,GAAG,OAAO,IAAI,cAAc,KAAK;CACzD,KAAK,YAAY,WAAW,kBAAkB,SAAS,EAAE,UAAU,IAAI,CAAC,CAAC;CAEzE,IAAI,aAAa,KAAK,YAAY,WAAW,WAAW;CACxD,OAAO,cAAc,WAAW,YAAY,MAAM,YAAY,QAAQ,WAAW,SAAS,YAAY,KAAK;EACvG,KAAK,IAAI,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;GAC5C,MAAM,UAAU,IAAI,cAAc,UAAU,EAAE;GAC9C,OAAO,KAAK,YAAY,QAAQ,YAAY,KAAK,UAAU;GAC3D,KAAK,YAAY,OAAO;GACxB;EACJ;EACA,aAAa,KAAK;CACtB;CAEA,IAAI,cAAc,WAAW,YAAY,GACrC,WAA4B,aACxB,iBAAiB,GAAG,UAAU,GAAG,UAAU,WAAW,KAAK,aAAa,GAAG,GAAG,KAAK,UAAU,OAAO,GAAG;CAK/G,OAAO;EACH,KAAK;EACL,MALS,KAAK,SAAS,4BAA2B,MAAK,EAAE,OAAO,IAAI,CAAC,KACrE,MAAM,QAAQ,YAAY,GAAG,MAAM,QAAQ,MAAM,MAAM;EAKvD;CACJ;AACJ;AAKA,IAAM,UAAwC;CAC1C,OAAO,CAAC,OAAO;CACf,OAAO,CAAC,OAAO;CACf,OAAO,CAAC,OAAO;CACf,SAAS,CAAC,OAAO;CACjB,UAAU,CAAC,OAAO;CAClB,KAAK,CAAC,SAAS,UAAU;CACzB,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI;EAAC;EAAS;EAAS;CAAI;CAC3B,IAAI;EAAC;EAAS;EAAS;CAAI;AAC/B;AAEA,IAAI,eAAgC;AAEpC,SAAS,cAAc;CACnB,OAAO,iBAAiB,eAAe,SAAS,eAAe,mBAAmB,OAAO;AAC7F;;;AC/CA,SAAS,aAAa,SAAkB;CACpC,MAAM,OAAO,QAAQ,sBAAsB;CAE3C,IAAI,WAAW,QAAQ;CACvB,OAAO,YAAY,OAAO,iBAAiB,QAAQ,EAAE,aAAa,UAC9D,WAAW,SAAS;CAExB,MAAM,eAAe,UAAU,sBAAsB;CAErD,OAAO;EACH,KAAK,KAAK,OAAO,cAAc,OAAO;EACtC,MAAM,KAAK,QAAQ,cAAc,QAAQ;EACzC,OAAO,KAAK;CAChB;AACJ;AAEA,SAAS,gBAAgB,QAAkC,MAAkB;CACzE,MAAM,aAAa,KAAK,IAAI,sBAAsB;CAGlD,IAAI,OAAO,IAAI,WAAW,OAAO,OAAO,IAAI,WAAW,QAAQ,OAAO,KAAA;CACtE,IAAI,OAAO,IAAI,WAAW,OAAO,OAAO,OAAO,IAAI,WAAW,QAAQ,IAAI,OAAO,KAAA;CAEjF,MAAM,gBAAgB;CAItB,MAAM,QADO,SAAS,iBAAiB,OAAO,GAAG,OAAO,CAC1C,GAAM,QAAQ,aAAa;CACzC,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,KAAK,MAAM,aAAa,KAAK,GAAG;EAChE,MAAM,KAAK,MAAM,QAAQ,IAAI;EAC7B,OAAQ,MAAM,KAAK,IAAI,SAAS,EAAE,IAAK,KAAK;CAChD;CAGA,MAAM,SAAS,WAAW,OAAO,KAAK,IAAI,IAAI,WAAW,QAAQ,CAAC;CAClE,IAAI,OAAO,IAAI,QAAQ,OAAO,KAAA;CAG9B,MAAM,aADY,SAAS,iBAAiB,QAAQ,OAAO,CACxC,GAAW,QAAQ,aAAa;CACnD,IAAI,cAAc,WAAW,aAAa,KAAK;MAEvC,KAAK,IAAI,SAAS,UAAU,GAAG;GAC/B,MAAM,KAAK,WAAW,QAAQ,IAAI;GAClC,OAAQ,MAAM,KAAK,IAAI,SAAS,EAAE,IAAK,KAAK;EAChD;;AAIR;AAEA,SAAS,aAAa,MAAe,MAAkB,SAA4B;CAC/E,IAAI;EACA,IAAI,CAAC,KAAK,IAAI,SAAS,IAAI,GAAG,OAAO;EACrC,MAAM,MAAM,KAAK,SAAS,MAAM,CAAC;EACjC,MAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,GAAG;EAGvC,IAAI,KAAK,QAAQ,GACb,OAAO,KAAK,OAAO;EAEvB,OAAO;CACX,SAAS,GAAG;EACR,OAAO;CACX;AACJ;AAEA,SAAgB,iBAAiB,UAA6B,EAAE,iBAAiB,GAAG,GAAG;CACnF,SAAS,gBAAgB,OAAkB,MAAkB;EACzD,KAAK,MAAM;EAEX,IAAI,CAAC,MAAM,cAAc;EAEzB,MAAM,OAAO,gBAAgB;GACzB,GAAG,MAAM;GACT,GAAG,MAAM;EACb,GAAG,IAAI;EAEP,IAAI,EAAE,gBAAgB,UAAU;EAEhC,MAAM,UAAU,aAAa,MAAM,MAAM,OAAO;EAChD,IAAI,WAAW,QAAQ,UAAU,GAAG;EAEpC,MAAM,uBAAuB,cAAc,OAAO,KAAK,MAAM,KAAK,OAAO;EACzE,KAAK,SAAS,KAAK,MAAM,GAAG,aAAa,oBAAoB,CAAC;EAE9D,MAAM,QAAQ,KAAK,MAAM,UAAU,QAAQ;EAC3C,MAAM,EACF,KACA,SACA,sBAAsB,MAA4B,KAAK;EAE3D,MAAM,aAAa,UAAU;EAC7B,MAAM,aAAa,QAAQ,aAAa,IAAI,SAAS;EACrD,MAAM,aAAa,QAAQ,cAAc,IAAI;EAC7C,MAAM,aAAa,gBAAgB;EAEnC,MAAM,aAAa,aAAa,MAAM,GAAG,CAAC;EAE1C,KAA6B,WAAW;GACpC;GACA,MAAM;GACN,MAAM;EACV;CACJ;CAEA,SAAS,YAAY,OAAmB,MAAkB;EACtD,KAAK,MAAM;EAEX,KAAK,IAAI,UAAU,OAAO,UAAU;EAEpC,MAAM,OAAO,gBAAgB;GACzB,GAAG,MAAM;GACT,GAAG,MAAM;EACb,GAAG,IAAI;EAEP,IAAI,EAAE,gBAAgB,UAAU;EAEhC,MAAM,UAAU,aAAa,MAAM,MAAM,OAAO;EAChD,IAAI,CAAC,SAAS;EAEd,KAAK,SAAS,KAAK,MAAM,GAAG,aAAa,cAAc,OAAO,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;CAC3F;CAEA,IAAI,oBAAwC;CAE5C,SAAS,iBAAiB;EACtB,IAAI,mBAAmB;GACnB,kBAAkB,UAAU,IAAI,MAAM;GACtC,kBAAkB,MAAM,UAAU;GAClC,kBAAkB,MAAM,gBAAgB;EAC5C;CACJ;CAEA,SAAS,iBAAiB;EACtB,IAAI,mBAAmB;GACnB,kBAAkB,UAAU,OAAO,MAAM;GACzC,kBAAkB,MAAM,UAAU;GAClC,kBAAkB,MAAM,gBAAgB;EAC5C;CACJ;CAEA,OAAO,IAAI,OAAO;EACd,OAAO,SAAS;GACZ,oBAAoB,SAAS,cAAc,KAAK;GAChD,kBAAkB,YAAY;GAC9B,kBAAkB,QAAQ,aAAa;GACvC,kBAAkB,UAAU,IAAI,aAAa;GAC7C,kBAAkB,iBAAiB,cAAc,MAAM;IACnD,gBAAgB,GAAG,IAAI;GAC3B,CAAC;GACD,kBAAkB,iBAAiB,UAAU,MAAM;IAC/C,YAAY,GAAG,IAAI;GACvB,CAAC;GACD,MAAM,eAAe,UAAsB;IACvC,IAAI,CAAC,KAAK,UACN;IAGJ,MAAM,OAAO,gBAAgB;KACzB,GAAG,MAAM;KACT,GAAG,MAAM;IACb,GAAG,IAAI;IAEP,IAAI,EAAE,gBAAgB,UAAU;KAC5B,eAAe;KACf;IACJ;IAEA,MAAM,YAAY,OAAO,iBAAiB,IAAI;IAC9C,MAAM,aAAa,SAAS,UAAU,YAAY,EAAE;IACpD,MAAM,aAAa,SAAS,UAAU,YAAY,EAAE;IAEpD,MAAM,OAAO,aAAa,IAAI;IAC9B,IAAI,CAAC,MAAM;KACP,eAAe;KACf;IACJ;IAEA,KAAK,QAAQ,aAAa,MAAM;IAChC,KAAK,OAAO;IAEZ,IAAI,KAAK,QAAQ,wCAAwC,GACrD,KAAK,QAAQ,QAAQ;IAEzB,KAAK,QAAQ,QAAQ;IAErB,IAAI,CAAC,mBAAmB;IAExB,kBAAkB,MAAM,OAAO,GAAG,KAAK,OAAO,KAAK,MAAM;IACzD,kBAAkB,MAAM,MAAM,GAAG,KAAK,IAAI;IAC1C,eAAe;GACnB;GAEA,OAAO,iBAAiB,aAAa,WAAW;GAEhD,eAAe;GAEf,MAAM,KAAK,eAAe,YAAY,iBAAiB;GAEvD,OAAO,EACH,eAAe;IACX,OAAO,oBAAoB,aAAa,WAAW;IACnD,mBAAmB,SAAS;IAC5B,oBAAoB;GACxB,EACJ;EACJ;EACA,OAAO,EACH,iBAAiB;GACb,eAAe;IACX,eAAe;GACnB;GACA,kBAAkB;IACd,eAAe;GACnB;GAEA,YAAY,SAAS;IACjB,KAAK,IAAI,UAAU,IAAI,UAAU;GACrC;GACA,OAAO,SAAS;IACZ,KAAK,IAAI,UAAU,OAAO,UAAU;GACxC;GACA,UAAU,SAAS;IACf,KAAK,IAAI,UAAU,OAAO,UAAU;GACxC;EACJ,EACJ;CACJ,CAAC;AACL;AAIA,SAAgB,uBAAuB;CACnC,IAAI,oBAAwC;CAC5C,IAAI,UAA+B;CAEnC,SAAS,sBAAsB,IAAiB;EAC5C,MAAM,SAAS,SAAS,gBAAgB,aAAa,YAAY,MAAM;EACvE,MAAM,UAAU,SAAS,+BAA+B;EACxD,MAAM,QAAQ,iBAAiB,SAAS,eAAe,EAAE,iBAAiB,OAAO,EAAE,KAAK;EACxF,GAAG,MAAM,kBAAkB,UAAU,SAAS,YAAY;CAC9D;CAEA,OAAO,IAAI,OAAO,EACd,KAAK,YAAY;EACb,oBAAoB,SAAS,cAAc,KAAK;EAChD,kBAAkB,YAAY;EAC9B,kBAAkB,MAAM,UAAU;EAClC,sBAAsB,iBAAiB;EAGvC,MAAM,WAAW,IAAI,uBAAuB;GACxC,IAAI,mBAAmB,sBAAsB,iBAAiB;EAClE,CAAC;EACD,SAAS,QAAQ,SAAS,iBAAiB;GAAE,YAAY;GACrE,iBAAiB,CAAC,YAAY;EAAE,CAAC;EAErB,MAAM,qBAAqB;GACvB,IAAI,qBAAqB,kBAAkB,YACvC,kBAAkB,WAAW,YAAY,iBAAiB;EAElE;EAEA,MAAM,0BAA0B,OAAkB,aAAqB;GACnE,MAAM,MAAM,WAAW,YAAY;IAAE,MAAM;IAC3D,KAAK,MAAM;GAAQ,CAAC;GACJ,IAAI,CAAC,KAAK,OAAO;GAEjB,MAAM,OAAO,WAAW,MAAM,IAAI,QAAQ,IAAI,GAAG;GAEjD,IAAI,aAAa;GACjB,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,KAAK;IACjC,MAAM,OAAO,KAAK,KAAK,CAAC,EAAE,KAAK;IAC/B,IAAI,SAAS,eAAe,SAAS,YAAY;KAC7C,aAAa;KACb;IACJ;IACA,IAAI,KAAK,KAAK,CAAC,EAAE,WAAW,SAAS,iBAAiB,SAAS,kBAAkB,SAAS,YACtF,aAAa;GAErB;GAEA,IAAI,eAAe,GAAG,OAAO,IAAI;GAEjC,MAAM,gBAAgB,KAAK,OAAO,UAAU;GAC5C,MAAM,eAAe,KAAK,MAAM,UAAU;GAE1C,MAAM,UAAU,WAAW,QAAQ,aAAa;GAChD,IAAI,mBAAmB,aAAa;IAChC,MAAM,OAAO,QAAQ,sBAAsB;IAE3C,OADkB,MAAM,UAAU,KAAK,MAAM,KAAK,SAAS,IACxC,gBAAgB;GACvC;GACA,OAAO,IAAI;EACf;EAEA,MAAM,kBAAkB,UAAqB;GACzC,IAAI,CAAC,WAAW,YAAY,CAAC,WAAW,UAAU;GAIlD,IAAI,CAAG,WAAkC,UAA+D,MAAM;IAC1G,aAAa;IACb;GACJ;GAEA,MAAM,eAAe;GAErB,MAAM,aAAa,WAAW,IAAI,sBAAsB;GAGxD,MAAM,SAAS,uBAAuB,OAFrB,KAAK,IAAI,WAAW,OAAO,IAAI,KAAK,IAAI,MAAM,SAAS,WAAW,QAAQ,EAAE,CAEhD,CAAQ;GACrD,IAAI,WAAW,MAAM;IACjB,aAAa;IACb;GACJ;GAEA,MAAM,OAAO,WAAW,MAAM,IAAI,QAAQ,MAAM;GAEhD,IAAI;GACJ,MAAM,SAAS,KAAK;GACpB,MAAM,QAAQ,KAAK;GAEnB,IAAI,UAAU,OAAO;IACjB,MAAM,UAAU,WAAW,QAAQ,UAAU,SAAS,OAAO,WAAW,EAAE;IAC1E,IAAI,WAAW,mBAAmB,aAAa;KAC3C,MAAM,WAAW,QAAQ,sBAAsB;KAC/C,IAAI,MAAM,SAAS,SAAS,SAAS,SAAS;KAC9C,IAAI,UAAU,OAAO;MACjB,MAAM,WAAW,WAAW,QAAQ,MAAM;MAC1C,IAAI,YAAY,oBAAoB,aAChC,OAAO,MAAM,SAAS,sBAAsB,EAAE,OAAO;KAE7D;KACA,OAAO;MAAE,MAAM,SAAS;MAChD,OAAO,SAAS;MAChB,KAAK,MAAM;MACX,QAAQ,MAAM;KAAE;IACI;GACJ;GAEA,IAAI,CAAC,MAAM;IACP,MAAM,SAAS,WAAW,YAAY,MAAM;IAC5C,OAAO;KAAE,MAAM,WAAW,OAAO;KACrD,OAAO,WAAW,QAAQ;KAC1B,KAAK,OAAO,MAAM;KAClB,QAAQ,OAAO,MAAM;IAAE;GACP;GAEA,MAAM,SAAS,WAAW,IAAI;GAC9B,IAAI,aAAa;GACjB,IAAI,YAAY;GAChB,IAAI,UAAU,WAAW,SAAS,QAAQ,iBAAiB,MAAM,EAAE,aAAa,UAAU;IACtF,MAAM,aAAa,OAAO,sBAAsB;IAChD,aAAa,WAAW,OAAO,OAAO;IACtC,YAAY,WAAW,MAAM,OAAO;GACxC;GAEA,IAAI,CAAC,kBAAmB,YACpB,OAAO,YAAY,iBAAkB;GAGzC,kBAAmB,MAAM,OAAO,GAAG,KAAK,OAAO,WAAW;GAC1D,kBAAmB,MAAM,MAAM,GAAG,KAAK,MAAM,UAAU;GACvD,kBAAmB,MAAM,QAAQ,GAAG,KAAK,QAAQ,KAAK,KAAK;EAC/D;EAEA,MAAM,cAAc,UAAqB;GACrC,IAAI,CAAC,WAAW,YAAY,CAAC,WAAW,UAAU;GAElD,IAAI,CAAG,WAAkC,UAA+D,MAAM;IAC1G,aAAa;IACb;GACJ;GAEA,MAAM,eAAe;GACrB,aAAa;GACb,WAAW,IAAI,UAAU,OAAO,UAAU;GAE1C,MAAM,aAAa,WAAW,IAAI,sBAAsB;GAGxD,MAAM,YAAY,uBAAuB,OAFxB,KAAK,IAAI,WAAW,OAAO,IAAI,KAAK,IAAI,MAAM,SAAS,WAAW,QAAQ,EAAE,CAE7C,CAAQ;GACxD,IAAI,cAAc,MAAM;GAExB,MAAM,WAAY,WAAkC;GACpD,IAAI,YAAY,SAAS,OAAO;IAC5B,IAAI,KAAK,WAAW,MAAM;IAC1B,IAAI,SAAS,MAAM;KACf,MAAM,EAAE,SAAS;KACjB,IAAI,MACA,KAAK,QAAQ,EAAE;UAEf,KAAK,GAAG,gBAAgB;IAEhC;IAEA,MAAM,eAAe,GAAG,QAAQ,IAAI,SAAS;IAC7C,MAAM,eAAe,GAAG;IAExB,MAAM,EAAE,MAAM,UAAU;IAExB,IAAI,QAAQ,KAAK,MAAM;KACnB,IAAI,eAAwF,KAAK;KAEjG,MAAM,aADU,GAAG,IAAI,QAAQ,YACZ,EAAQ,OAAO,KAAK;KAEvC,MAAM,eAAe,eAAe,iBAAiB,eAAe;KACpE,MAAM,mBAAmB,eAAe;KAGxC,IAAI,UAAU,gBAAgB,aAAa,KAAK,SAAS,eAAe,CAAC,cACrE,eAAe,aAAa;UACzB,IAAI,UAAU,gBAAgB,aAAa,KAAK,SAAS,cAAc,CAAC,kBAC3E,eAAe,aAAa;KAOhC,IAFkB,EADG,UAAU,iBACE,UAAU,gBAAgB,aAAa,KAAK,SAAS,eAAe,aAAa,KAAK,SAAS;UAGxH,cAAc;OACd,MAAM,eAAe,WAAW,MAAM,OAAO,MAAM;OACnD,IAAI,cAAc,eAAe,aAAa,OAAO,MAAM,YAAY;MAC3E,OAAO,IAAI,kBAAkB;OACzB,MAAM,eAAe,WAAW,MAAM,OAAO,MAAM;OACnD,IAAI,cAAc,eAAe,aAAa,OAAO,EAAE,SAAS,MAAM,GAAG,YAAY;MACzF;;KAIJ,IAAI;MACA,KAAK,GAAG,OAAO,cAAc,YAAY;KAC7C,SAAS,GAAG;MACR,QAAQ,KAAK,yEAAyE,CAAC;MACvF,MAAM,QAAQ,UAAU,GAAG,KAAK,cAAc,KAAK;MACnD,IAAI,UAAU,MACV,KAAK,GAAG,QAAQ,OAAO,OAAO,KAAK;KAE3C;IACJ,OAAO,IAAI,OAAO;KAGd,MAAM,QAAQ,UAAU,GAAG,KAAK,cAAc,KAAK;KACnD,MAAM,cAAc,UAAU,OAAO,QAAQ;KAC7C,KAAK,GAAG,QAAQ,aAAa,aAAa,KAAK;IACnD;IAEA,IAAI,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG;KAC1B,WAAW,SAAS,GAAG,QAAQ,WAAW,MAAM,CAAC;KACjD,WAAW,MAAM;IACrB;GACJ;GAEA,WAAmC,WAAW;EAClD;EAEA,MAAM,sBAAsB;GACxB,aAAa;EACjB;EAEA,OAAO,iBAAiB,YAAY,gBAAgB,EAAE,SAAS,KAAK,CAAC;EACrE,OAAO,iBAAiB,QAAQ,YAAY,EAAE,SAAS,KAAK,CAAC;EAC7D,OAAO,iBAAiB,WAAW,eAAe,EAAE,SAAS,KAAK,CAAC;EAEnE,gBAAgB;GACZ,aAAa;GACb,SAAS,WAAW;GACpB,OAAO,oBAAoB,YAAY,gBAAgB,EAAE,SAAS,KAAK,CAAC;GACxE,OAAO,oBAAoB,QAAQ,YAAY,EAAE,SAAS,KAAK,CAAC;GAChE,OAAO,oBAAoB,WAAW,eAAe,EAAE,SAAS,KAAK,CAAC;EAC1E;EAEA,OAAO,EACH,UAAU;GACN,IAAI,SAAS,QAAQ;EACzB,EACJ;CACJ,EACJ,CAAC;AACL;;;AC3eA,IAAa,yBAAyB,IAAI,UAAsC,qBAAqB;AAErG,SAAS,mBAAmB,WAAuC,KAAsB;CACrF,MAAM,cAA4B,CAAC;CAEnC,IAAI,WACA,YAAY,KACR,WAAW,OAAO,UAAU,MAAM,UAAU,IAAI,EAC5C,OAAO,mDACX,CAAC,CACL;CAGJ,OADsB,cAAc,OAAO,KAAK,WACzC;AACX;;;;AAKA,IAAa,oBAAoB;CAC7B,8BAA8B,WAA4B,OAAoB,aAAkD;EAC5H,MAAM,EAAE,cAAc;EACtB,MAAM,MAAM,UAAU;EAEtB,IAAI,CAAC,UAAU,OAAO;EAStB,SAPW,MAAM,GAAG,QAAQ,wBAAwB;GAChD;GACA,MAAM;GACN,QAAQ;GACR;EACJ,CAES,CAAE;EACX,OAAO;CACX;CAEA,oCAAoC,OAAoB,aAAkD;EACtG,IAAI,CAAC,UAAU,OAAO;EAQtB,SANW,MAAM,GAAG,QAAQ,wBAAwB;GAChD,KAAK;GACL,MAAM;GACN,QAAQ;EACZ,CAES,CAAE;EACX,OAAO;CACX;AACJ;;;;;AAMA,IAAa,6BAA6B,qBAAsC;CAC5E,OAAO,IAAI,OAAmC;EAC1C,KAAK;EACL,OAAO;GACH,OAAO,GAAG,EAAE,UAAU;IAElB,OAAO;KACH,eAFkB,oBAAoB,MAAM,mBAAmB,kBAAkB,GAAG,IAAI,cAAc;KAGtG,WAAW;IACf;GACJ;GACA,MAAM,aAAa,UAAU;IACzB,MAAM,SAAS,YAAY,QAAQ,sBAAsB;IACzD,MAAM,YAAY,QAAQ;IAC1B,IAAI,QAAQ,SAAS,uBAAuB;KAExC,MAAM,MAAM,YAAY;KACxB,MAAM,EAAE,WAAW;KAEnB,IAAI,QACA,OAAO,EACH,eAAe,cAAc,MACjC;KAGJ,OAAO;MACY,eAFG,mBAAmB,WAAW,GAEjC;MACf;KACJ;IACJ,OACI,OAAO;GAEf;EACJ;EACA,OAAO,EACH,YAAY,OAAO;GACf,MAAM,oBAAoB,KAAK,SAAS,KAAK;GAC7C,IAAI,mBAAmB,eACnB,OAAO,kBAAkB;QAEzB,OAAO,cAAc;EAE7B,EACJ;CACJ,CAAC;AACL;;;ACtGA,IAAM,iBAAiB,kBAAkB,YAAY,OAAO,MAAM,UAAU;AAE5E,IAAM,kBAAkB,kBACpB,eACA,OAAO,MAAM,eACZ,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,KAC9B,OAAO,SAAS,KAAK,aAAa,KAAK,MAAM,UAAU,CAAC,MAAM,EACnE;AAEA,IAAM,iBAAiB,kBAAkB,kBAAkB,OAAO,MAAM,WAAW;AAEnF,IAAM,eAAe,kBAAkB,kBAAkB,OAAO,MAAM,SAAS;AAE/E,IAAM,gBAAgB,uBAAuB,SAAS,OAAO,MAAM,UAAU;AAE7E,IAAM,cAAc,uCAChB,IAAI,OAAO,eAAe,GAC1B,OAAO,MAAM,UACZ,WAAW,EAAE,OAAO,MAAM,GAAG,OAAO,EACzC;AAEA,IAAM,0BAA0B,IAAI,UAChC,gCACC,OAAO,OAAO,OAAO,QAAQ;CAC1B,MAAM,KAAK,MAAM;CACjB,GAAG,YAAY,QAAQ,GAAG,KAAK,OAAO,MAAM,gBAAgB,OAAO,CAAC;CACpE,OAAO;AACX,CACJ;AAEA,SAAS,cAAc,QAAgB,UAAoB,UAA6D;CACpH,OAAO,IAAI,UAAU,SAAS,OAAO,OAAO,OAAO,QAAQ;EACvD,MAAM,QAAQ,oBAAoB,WAAW,SAAS,KAAK,IAAI;EAC/D,MAAM,KAAK,MAAM;EACjB,IAAI,MAAM,IAAI;GACV,MAAM,YAAY,QAAQ,MAAM,GAAG,QAAQ,MAAM,EAAE;GACnD,MAAM,UAAU,YAAY,MAAM,GAAG;GACrC,IAAI,UAAU,KAAK,GAAG,OAAO,SAAS,GAAG;GACzC,IAAI,YAAY,OAAO,GAAG,OAAO,OAAO,SAAS;GACjD,MAAM,QAAQ,MAAM,GAAG;EAC3B;EACA,GAAG,QAAQ,OAAO,KAAK,SAAS,OAAO,KAAK,CAAC;EAC7C,GAAG,iBAAiB,QAAQ;EAC5B,OAAO;CACX,CAAC;AACL;AAEA,IAAM,aAAa,cAAc,mCAAmC,OAAO,MAAM,IAAI;AACrF,IAAM,SAAS,cAAc,wCAAwC,OAAO,MAAM,MAAM;AACxF,IAAM,WAAW,cAAc,sBAAsB,OAAO,MAAM,IAAI;AACtE,IAAM,aAAa,cAAc,wBAAwB,OAAO,MAAM,MAAM;AAE5E,IAAa,qBAAqB,WAAW,EACzC,OAAO;CACH,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,EACJ,CAAC;;;AC7ED,IAAa,uBAAuB,IAAI,UAAU,mBAAmB;AAErE,SAAS,YAAY,MAAY;CAC7B,MAAM,iBAAiB,KAAK,KAAK,cAAc;CAC/C,IAAI,CAAC,gBAAgB,OAAO;CAC5B,OAAO,KAAK,QAAQ,GAAG,eAAe,OAAO;AACjD;AAEA,SAAgB,kBAAkB,MAAc;CAC5C,OAAO,IAAI,OAAO;EACd,KAAK;EACL,OAAO,EACH,cAAc,UAAU;GACpB,MAAM,MAAM,MAAM;GAClB,MAAM,cAA4B,CAAC;GACnC,MAAM,aAAa,IAAI,eAAe,KAAK,IAAI,YAAY,eAAe,IAAI,WAAW,QAAQ,SAAS;GAC1G,MAAM,EAAE,WAAW,MAAM;GAEzB,IAAI,aAAa,MAAM,QAAQ;IAG3B,IAFgB,CAAC,KAAK,UAAU,YAAY,IAAI,GAEnC;KAGT,MAAM,UAAU,MAAM,KAAK;KAG3B,IAAI,EAFc,UAAU,OAAO,UAAU,YAE3B,CAAC,YACf,OAAO;KAGX,MAAM,UAAU,CAAC,UAAU;KAC3B,IAAI,YACA,QAAQ,KAAK,iBAAiB;KAGlC,YAAY,KACR,WAAW,KAAK,KAAK,MAAM,KAAK,UAAU;MACtC,OAAO,QAAQ,KAAK,GAAG;MACvB,oBAAoB;KACxB,CAAC,CACL;IACJ;IACA,OAAO;GACX,CAAC;GAED,OAAO,cAAc,OAAO,KAAK,WAAW;EAChD,EACJ;CACJ,CAAC;AACL;;;ACtCA,IAAM,eAAe;CACjB,OAAO,aAAa,CAAC;CACrB,aAAa,aAAa,EAAE;CAC5B,SAAS;CACT,SAAS;CACT,eAAe;CACf,SAAS,WAAW,OAAO,MAAM,IAAI;CACrC,SAAS,WAAW,OAAO,MAAM,MAAM;CACvC,SAAS,WAAW,OAAO,MAAM,SAAS;CAC1C,eAAe,WAAW,OAAO,MAAM,MAAM;CAC7C,SAAS,WAAW,OAAO,MAAM,IAAI;CACrC,eAAe,WAAW,OAAO,MAAM,SAAS;CAEhD,SAAS,cAAc,OAAO,MAAM,SAAS;CAC7C,eAAe,cAAc,OAAO,MAAM,SAAS;CAEnD,SAAS,aAAa,OAAO,MAAM,SAAS;CAC5C,SAAS,aAAa,OAAO,MAAM,SAAS;CAE5C,eAAe,aAAa,OAAO,MAAM,WAAW;CACpD,eAAe,aAAa,OAAO,MAAM,YAAY;CAErD,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAC5D,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAC5D,aAAa,aAAa,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;CAE5D,aAAa,aAAa,OAAO,MAAM,SAAS;AACpD;AAEA,IAAa,uBAAiC;CAC1C,QAAQ;CACR,OAAO,YAAY;CACnB,OAAO,UAAU;CACjB,qBAAqB;CACrB,UAAU;CACV,mBAAmB;CACnB,iBAAiB;CACjB,0BAA0B;CAC1B,4BAA4B;CAC5B;CACA,kBAAkB,wBAAwB;AAC9C;;;;;;;;;ACtCA,IAAa,gBAAb,MAA+C;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YACI,MACA,MACA,QACA,WACA,KAAK,OACL,WACA,mBACF;EACE,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,YAAY;EAEjB,KAAK,MAAM,SAAS,cAAc,EAAE;EACpC,IAAI,WAAW,KAAK,IAAI,YAAY;EACpC,IAAI,mBACA,KAAK,aAAa;EAGtB,MAAM,YAAY,SAAS,cAAc,KAAK;EAE9C,KAAK,IAAI,YAAY,SAAS;EAC9B,IAAI,KAAK,YACL,KAAK,IAAI,YAAY,KAAK,UAAU;EAGxC,KAAK,OAAO,WAAW,SAAS;EAChC,KAAK,OAAO;CAChB;CAEA,SAAiB;EACb,KAAK,KAAK,OACN,oBAAC,KAAK,WAAN;GACI,MAAM,KAAK;GACX,MAAM,KAAK;GACX,QAAQ,KAAK;EAChB,CAAA,CACL;CACJ;CAEA,OAAO,MAAgC;EACnC,IAAI,KAAK,SAAS,KAAK,KAAK,MACxB,OAAO;EAEX,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,OAAO;CACX;CAEA,UAAU;EACN,KAAK,KAAK,QAAQ;CACtB;CAEA,eAAe,UAAgE;EAC3E,IAAI,CAAC,KAAK,YACN,OAAO;EAEX,OAAO,CAAC,KAAK,WAAW,SAAS,SAAS,MAAM;CACpD;AACJ;;;ACpFA,IAAa,qBAAmD,EAAE,MAAM,MAAM,aAAa;CACvF,MAAM,UAAU,KAAK,MAAM;CAE3B,MAAM,uBAAuB,cAAuB;EAChD,MAAM,MAAM,OAAO;EACnB,IAAI,OAAO,QAAQ,UAAU;EAE7B,KAAK,SACD,KAAK,MAAM,GAAG,cAAc,KAAK,KAAA,GAAW;GACxC,GAAG,KAAK;GACR,SAAS;EACb,CAAC,CACL;CACJ;CAEA,OACI,oBAAC,OAAD;EAAO,iBAAiB;EAAO,WAAU;YACrC,oBAAC,UAAD;GACa;GACT,iBAAiB;GACjB,SAAS;GACT,MAAK;EACR,CAAA;CACE,CAAA;AAEf;;;ACzBA,IAAa,kBAAgD,EAAE,MAAM,MAAM,aAAa;CAEpF,MAAM,WAAW,KAAK,MAAM,UAAU,SAAS,OAAO;CAEtD,OACI,oBAAC,OAAD;EACI,KAAK,KAAK,MAAM;EAChB,KAAK,KAAK,MAAM,OAAO;EACvB,OAAO,KAAK,MAAM,SAAS;EAC3B,WAAW,IACP,8BACA,WAAW,KAAK,EACpB;CACH,CAAA;AAET;;;ACbA,SAAS,oBACL,WACA,KAAK,OACL,WACA,kBACF;CACE,QAAQ,MAAuB,MAAkB,WAA+C;EAE5F,OAAO,IAAI,cAAc,MAAM,MAAM,QAAQ,WAAW,IAAI,WADzC,mBAAmB,iBAAiB,IAAI,KAAA,CACsB;CACrF;AACJ;AAEA,IAAa,YAAY;CACrB,WAAW,oBACP,mBACA,MACA,0BACM;EACF,MAAM,MAAM,SAAS,cAAc,KAAK;EACxC,IAAI,YAAY;EAChB,OAAO;CACX,CACJ;CACA,OAAO,oBACH,gBACA,QACA,qBACJ;AACJ;;;ACxBA,IAAM,qBAAqB,IAAI,OAAO,EAClC,oBAAoB,GAAG,UAAU,aAAa;CAC1C,MAAM,MAAM,SAAS;CACrB,IAAI,IAAI,aAAa,IAAI,UAAU,KAAK,SAAS,aAC7C,OAAO,SAAS,GAAG,OAAO,IAAI,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,OAAO,CAAC;CAExF,OAAO;AACX,EACJ,CAAC;AAQD,SAAgB,eAAe,EAAE,gBAAgB,WAAW,MAAM,qBAA0C;CACxG,MAAM,UAAU;EACZ,GAAG,eAAe;EAClB,eAAe;EACf,aAAa;EACb;CACJ;CACA,IAAI,mBACA,QAAQ,KAAK,sBAAsB,iBAAiB,CAAC;CAGzD,MAAM,eAAe,YAAY,OAAO;EACpC,KAAK,OAAO,mBAAmB,WACzB,OAAO,MAAM,cAAc,IAC3B,iBACI,OAAO,aAAa,cAAc,IAClC,OAAO,KAAK,OAAO,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;EAC7D;EACA;CACJ,CAAC;CAED,MAAM,CAAC,OAAO,YAAY,SAAsB,YAAY;CAC5D,MAAM,CAAC,MAAM,WAAW,SAA4B,IAAI;CAExD,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,UAAU,OAA0B,IAAI;CAE9C,sBAAsB;EAClB,IAAI,CAAC,UAAU,SAAS;EAExB,MAAM,aAAa,IAAI,WAAW,UAAU,SAAS;GACjD,OAAO;GACP,gBAAgB;GAChB,sBAAsB,OAAoB;IACtC,MAAM,WAAW,WAAW,MAAM,MAAM,EAAE;IAC1C,WAAW,YAAY,QAAQ;IAC/B,SAAS,QAAQ;GACrB;GACW;GACX,oBAAoB,MAAc;IAI9B,MAAM,MAAM,SAAS,cAAc,KAAK;IACxC,IAAI,YAAY;IAChB,IAAI,iBAAiB,GAAG,EAAE,SAAS,OAAO;KACtC,GAAG,gBAAgB,OAAO;KAC1B,GAAG,gBAAgB,OAAO;KAC1B,GAAG,gBAAgB,OAAO;KAC1B,GAAG,gBAAgB,SAAS;KAC5B,GAAG,gBAAgB,MAAM;IAC7B,CAAC;IACD,OAAO,IAAI;GACf;EACJ,CAAC;EAGD,MAAM,sBAAsB,WAAW,YAAY,KAAK,UAAU;EAClE,WAAW,eAAe,WAA0C;GAChE,MAAM,MAAM,oBAAoB,MAAM;GACtC,IAAI,CAAC,KAAK;IACN,MAAM,aAAa,WAAW,IAAI,sBAAsB;IAExD,IAAI,OAAO,QAAQ,WAAW,MAE1B,OAAO,oBAAoB;KAAE,MADd,WAAW,OAAO,KAAK,IAAI,IAAI,WAAW,QAAQ,CAAC;KAEtF,KAAK,OAAO;IAAI,CAAC;IAGD,IAAI,OAAO,QAAQ,WAAW,OAE1B,OAAO,oBAAoB;KAAE,MADd,WAAW,QAAQ,KAAK,IAAI,IAAI,WAAW,QAAQ,CAAC;KAEvF,KAAK,OAAO;IAAI,CAAC;GAEL;GACA,OAAO;EACX;EAEA,QAAQ,UAAU;EAClB,QAAQ,UAAU;EAElB,aAAa;GACT,WAAW,QAAQ;GACnB,QAAQ,UAAU;EACtB;CACJ,GAAG,CAAC,CAAC;CAGL,gBAAgB;EACZ,IAAI,QAAQ,SACR,QAAQ,QAAQ,SAAS,EAAE,gBAAgB,SAAS,CAAC;CAE7D,GAAG,CAAC,QAAQ,CAAC;CAEb,OAAO;EACH;EACA;EACA;CACJ;AACJ;;;AC/EA,IAAM,eAAe;CACnB,MAAM;CACN,QAAQ;CACR,MAAM;AACR;AAEA,IAAa,kBAAkB,EAC7B,SACA,qBACA,qBACA,yBACA,SACA,WAAW,QACX,WACA,mBACA,cACA,UACA,qBACyB;CAEzB,MAAM,EAAE,MAAM,eAAe;CAE7B,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAC1D,MAAM,CAAC,kBAAkB,uBAAuB,SAAiB,EAAE;CAEnE,gBAAgB;EACd,IAAI,CAAC,gBAAgB;EACrB,MAAM,UAAU,iBAAiB;GAC/B,IAAI,aAAa,QAAQ,yBACvB,aAAa,QAAQ,wBAAwB,gBAAgB;EAEjE,GAAG,GAAG;EACN,aAAa,aAAa,OAAO;CACnC,GAAG,CAAC,kBAAkB,cAAc,CAAC;CAErC,MAAM,6BAA6B;EACjC,IAAI,CAAC,gBAAgB;GACnB,IAAI,MACF,oBAAoB,WAAW,UAAU,KAAK,MAAM,GAAG,CAAC;GAE1D,kBAAkB,IAAI;EACxB,OAAO;GACL,IAAI,MAAM;IACR,MAAM,SAAS,OAAO,MAAM,gBAAgB;IAC5C,IAAI,QAAQ;KACV,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,GAAG,KAAK,MAAM,IAAI,QAAQ,MAAM,OAAO,OAAO;KACnF,KAAK,SAAS,EAAE;IAClB;GACF;GACA,kBAAkB,KAAK;EACzB;CACF;CAEA,MAAM,wBAAwB,MAA8C;EAC1E,oBAAoB,EAAE,OAAO,KAAK;CACpC;CAEA,MAAM,2BAA2B;EAC/B,MAAM,EAAE,yBAAyB,wBAAwB,aAAa;EACtE,IAAI,yBACF,wBAAwB,gBAAgB;EAE1C,IAAI,qBACF,IAAI;GACF,MAAM,SAAS,OAAO,MAAM,gBAAgB;GAC5C,IAAI,QACF,oBAAoB,sBAAsB,OAAO,OAAO,CAAC,CAAgB;EAE7E,SAAS,GAAG;GACV,QAAQ,KAAK,oCAAoC,CAAC;EACpD;CAEJ;CAEA,gBAAgB,UAAU,SAAS;CAEnC,MAAM,eAAe,OAAO;EAAE;EAChC;CAAoB,CAAC;CACnB,gBAAgB;EACd,aAAa,UAAU;GAAE;GAC7B;EAAoB;CAClB,GAAG,CAAC,yBAAyB,mBAAmB,CAAC;CAEjD,MAAM,gBAAgB,iBAA8B;EAClD,MAAM,EAAE,yBAAyB,wBAAwB,aAAa;EACtE,IAAI,yBACF,IAAI;GAEF,wBADiB,WAAW,UAAU,aAAa,GAC3B,CAAQ;EAClC,SAAS,GAAG;GACV,QAAQ,KAAK,kEAAkE,CAAC;EAClF;EAEF,IAAI,qBAEF,oBADoB,sBAAsB,aAAa,IAAI,OAAO,CAC9C,CAAW;CAEnC;CAEA,MAAM,EAAE,OAAO,MAAM,cAAc,eAAe;EAChD,gBAAgB;EAChB,UAAU,CAAC;EACX;CACF,CAAC;CAKD,MAAM,aAAa,OAAO,OAAO;CACjC,gBAAgB;EACd,IAAI,WAAW,YAAY,SAAS;EACpC,WAAW,UAAU;EACrB,IAAI,CAAC,MAAM;EACX,IAAI;GACF,MAAM,SAAS,OAAO,YAAY,WAC9B,OAAO,MAAM,WAAW,EAAE,IAC1B,UACE,OAAO,aAAa,OAAO,IAC3B,OAAO,KAAK,OAAO,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;GACzD,IAAI,QAAQ;IACV,MAAM,KAAK,KAAK,MAAM,GAAG,YAAY,GAAG,KAAK,MAAM,IAAI,QAAQ,MAAM,OAAO,OAAO;IACnF,KAAK,SAAS,EAAE;GAClB;EACF,SAAS,GAAG;GACV,QAAQ,KAAK,oDAAoD,CAAC;EACpE;EAEA,IAAI,gBACF,oBAAoB,OAAO,YAAY,WAAW,UAAU,EAAE;EAIhE,aAAa,UAAU,KAAK,IAAI;EAChC,iBAAiB,UAAU;CAC7B,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,MAAM,OAAO;CAMnB,MAAM,eAAe,OAAO,KAAK,IAAI,CAAC;CACtC,MAAM,mBAAmB,OAAO,KAAK;CACrC,gBAAgB;EACd,IAAI,CAAC,OAAO;EAKZ,IADgB,KAAK,IAAI,IAAI,aAAa,UAC5B,OAAO,CAAC,iBAAiB,SACrC;EAEF,iBAAiB,UAAU;EAC3B,MAAM,UAAU,iBAAiB;GAC/B,aAAa,KAAK;EACpB,GAAG,GAAG;EACN,aAAa,aAAa,OAAO;CACnC,GAAG,CAAC,GAAG,CAAC;CAER,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,MAAM,KAAK;EACjB,MAAM,mBAAmB;GAIvB,IAAI,CAAC,iBAAiB;QACJ,KAAK,IAAI,IAAI,aAAa,UAC5B,KAAK;GAAA;GAErB,aAAa,KAAK,KAAK;EACzB;EACA,IAAI,iBAAiB,QAAQ,UAAU;EACvC,aAAa,IAAI,oBAAoB,QAAQ,UAAU;CACzD,GAAG,CAAC,IAAI,CAAC;CAGT,gBAAgB;EACd,IAAI,MACF,IAAI,WACF,kBAAkB,4BAA4B,SAAS,EAAE,KAAK,OAAO,KAAK,QAAQ;OAElF,kBAAkB,4BAA4B,EAAE,KAAK,OAAO,KAAK,QAAQ;CAG/E,GAAG,CAAC,WAAW,MAAM,WAAW,EAAE,CAAC;CAEnC,MAAM,aAAa,aAAa;CAGhC,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,OAAO,iBAAiB,4BAA4B;GACpD,WAAU;aAET,iBAAiB,WAAW;EACvB,CAAA,GAER,qBAAC,mBAAmB,UAApB;GAA6B,OAAO,eAAe;IAAE;IAC3D;GAAK,IAAI,CAAC,OAAO,IAAI,CAAC;aADhB,CAGE,qBAAC,OAAD;IAAK,OAAO,EAAE,SAAS,iBAAiB,SAAS,OAAO;IAAG,WAAU;cAArE;KACE,oBAAC,OAAD;MACE,KAAK;MACL,UAAU,MAAM;OAGd,IAAI,QAAQ,EAAE,WAAW,EAAE,eAAe;QACxC,KAAK,MAAM;QAEX,MAAM,MAAM,KAAK,MAAM,IAAI,QAAQ;QACnC,MAAM,KAAK,KAAK,MAAM,GAAG,aACvB,UAAU,KAAK,KAAK,MAAM,IAAI,QAAQ,GAAG,GAAG,EAAE,CAChD;QACA,KAAK,SAAS,EAAE;OAClB;MACF;MACA,WAAW,IAAI,uDAAuD,YAAY,yMAAyM;KAC5R,CAAA;KAEA,QACD,qBAAA,UAAA,EAAA,UAAA;MACE,qBAAC,cAAD;OACE,SAAS;QACP,WAAW;QACX,QAAQ;OACV;OACA,WAAW,IAAI,mGAAmG,kBAAkB;iBALtI;QAOE,oBAAC,cAAD;SAAc,iBAAiB,UAAU;SAAS,MAAM;SAAU,cAAc;QAAa,CAAA;QAC7F,oBAAC,WAAD,EAAW,aAAY,WAAW,CAAA;QAClC,oBAAC,cAAD;SAAc,MAAM;SAAU,cAAc;QAAa,CAAA;QACzD,oBAAC,WAAD,EAAW,aAAY,WAAW,CAAA;QAClC,oBAAC,aAAD,CAAa,CAAA;OACD;;MAEd,oBAAC,aAAD,EACG,SAAS;OACR,WAAW;OACX,QAAQ;MACV,EACD,CAAA;MACD,oBAAC,aAAD,CAAa,CAAA;KACb,EAAA,CAAA;KAGJ,oBAAC,kBAAD;MAAkB,QAAQ;MAAiC;KAAc,CAAA;IACpE;OAEJ,kBACC,oBAAC,kBAAD;IACE,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW,IACT,4FACA,UACF;IACA,OAAO;KACL,SAAS;KACT,SAAS;KACT,QAAQ;KACR,WAAW;IACb;GACD,CAAA,CAGwB;IAC1B;;AAET;AAGA,IAAM,YAAY"}