@firecms/core 3.3.0 → 3.4.0-canary.1faa2a9

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 (220) hide show
  1. package/README.md +4 -0
  2. package/dist/app/useApp.d.ts +1 -0
  3. package/dist/components/EntityCollectionTable/column_utils.d.ts +4 -3
  4. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +6 -1
  5. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +3 -1
  6. package/dist/components/EntityCollectionView/EntityCollectionBoardView.d.ts +3 -1
  7. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +8 -0
  8. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +3 -1
  9. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +3 -1
  10. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +2 -1
  11. package/dist/components/EntityCollectionView/useBoardDataController.d.ts +3 -1
  12. package/dist/components/EntityPreview.d.ts +3 -1
  13. package/dist/components/ErrorBoundary.d.ts +1 -3
  14. package/dist/components/LicenseBanner.d.ts +23 -0
  15. package/dist/components/ReferenceTable/ReferenceSelectionTable.d.ts +10 -1
  16. package/dist/components/SelectableTable/filters/filter_text_input.d.ts +30 -0
  17. package/dist/components/SelectableTable/filters/filter_text_input.test.d.ts +1 -0
  18. package/dist/components/common/table_url_params.d.ts +24 -0
  19. package/dist/components/common/useDataSourceTableController.d.ts +9 -1
  20. package/dist/components/common/useTableSearchHelper.d.ts +9 -1
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/contexts/LicenseStatusContext.d.ts +16 -0
  23. package/dist/core/DefaultDrawer.d.ts +10 -3
  24. package/dist/core/EntityEditView.d.ts +9 -1
  25. package/dist/core/EntityEditViewFormActions.d.ts +1 -1
  26. package/dist/core/field_configs.d.ts +1 -1
  27. package/dist/core/index.d.ts +1 -0
  28. package/dist/core/plugin_translations.d.ts +38 -0
  29. package/dist/core/pro_plugins.d.ts +40 -0
  30. package/dist/de-KtBROUvS.js +700 -0
  31. package/dist/de-KtBROUvS.js.map +1 -0
  32. package/dist/editor/extensions/Image.d.ts +11 -0
  33. package/dist/editor/index.d.ts +2 -1
  34. package/dist/editor/lazy_editor.d.ts +6 -0
  35. package/dist/editor-BSo_aS1I.js +4563 -0
  36. package/dist/editor-BSo_aS1I.js.map +1 -0
  37. package/dist/form/EntityForm.d.ts +8 -1
  38. package/dist/form/EntityFormActions.d.ts +2 -0
  39. package/dist/form/field_bindings/GeopointFieldBinding.d.ts +5 -0
  40. package/dist/form/index.d.ts +1 -0
  41. package/dist/fr-BRFSBaVh.js +700 -0
  42. package/dist/fr-BRFSBaVh.js.map +1 -0
  43. package/dist/hi-DwCkga5X.js +700 -0
  44. package/dist/hi-DwCkga5X.js.map +1 -0
  45. package/dist/hooks/data/delete.d.ts +1 -1
  46. package/dist/hooks/data/save.d.ts +1 -1
  47. package/dist/hooks/data/useCollectionFetch.d.ts +7 -1
  48. package/dist/hooks/data/useEntityFetch.d.ts +9 -1
  49. package/dist/hooks/index.d.ts +2 -0
  50. package/dist/hooks/useLicenseStatus.d.ts +16 -0
  51. package/dist/hooks/useProjectLog.d.ts +11 -6
  52. package/dist/hooks/useTranslation.d.ts +1 -1
  53. package/dist/i18n/__tests__/FireCMSi18nProvider.test.d.ts +1 -0
  54. package/dist/i18n/__tests__/nested_provider_lifecycle.test.d.ts +1 -0
  55. package/dist/index.es.js +4509 -10665
  56. package/dist/index.es.js.map +1 -1
  57. package/dist/index.umd.js +9378 -6771
  58. package/dist/index.umd.js.map +1 -1
  59. package/dist/it-B2YGgDsx.js +700 -0
  60. package/dist/it-B2YGgDsx.js.map +1 -0
  61. package/dist/locales/pl.d.ts +2 -0
  62. package/dist/pl-BxHkywK8.js +702 -0
  63. package/dist/pl-BxHkywK8.js.map +1 -0
  64. package/dist/preview/index.d.ts +1 -0
  65. package/dist/preview/property_previews/GeopointPropertyPreview.d.ts +4 -0
  66. package/dist/pt-q6UV4diT.js +702 -0
  67. package/dist/pt-q6UV4diT.js.map +1 -0
  68. package/dist/types/analytics.d.ts +1 -1
  69. package/dist/types/collections.d.ts +31 -0
  70. package/dist/types/datasource.d.ts +67 -4
  71. package/dist/types/entities.d.ts +21 -1
  72. package/dist/types/entity_actions.d.ts +6 -0
  73. package/dist/types/entity_callbacks.d.ts +21 -0
  74. package/dist/types/firecms.d.ts +18 -1
  75. package/dist/types/firecms_context.d.ts +8 -0
  76. package/dist/types/index.d.ts +1 -0
  77. package/dist/types/license.d.ts +54 -0
  78. package/dist/types/navigation.d.ts +34 -5
  79. package/dist/types/plugins.d.ts +22 -1
  80. package/dist/types/properties.d.ts +17 -1
  81. package/dist/types/side_entity_controller.d.ts +7 -0
  82. package/dist/types/translations.d.ts +37 -2
  83. package/dist/util/__tests__/collections.test.d.ts +1 -0
  84. package/dist/util/__tests__/urls.test.d.ts +1 -0
  85. package/dist/util/collections.d.ts +1 -1
  86. package/dist/util/date_fns_locales.d.ts +18 -0
  87. package/dist/util/entities.d.ts +1 -0
  88. package/dist/util/entity_cache.d.ts +11 -0
  89. package/dist/util/geopoint.d.ts +22 -0
  90. package/dist/util/index.d.ts +3 -0
  91. package/dist/util/lazy_eager.d.ts +3 -3
  92. package/dist/util/navigation_blocking.d.ts +22 -0
  93. package/dist/util/navigation_from_path.d.ts +17 -0
  94. package/dist/util/navigation_utils.d.ts +107 -3
  95. package/dist/util/parent_references_from_path.d.ts +16 -0
  96. package/dist/util/paths.d.ts +28 -0
  97. package/dist/util/permissions.d.ts +10 -4
  98. package/dist/util/urls.d.ts +22 -0
  99. package/package.json +17 -10
  100. package/src/app/Scaffold.tsx +41 -44
  101. package/src/app/useApp.tsx +1 -0
  102. package/src/components/DeleteEntityDialog.tsx +2 -0
  103. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
  104. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +3 -1
  105. package/src/components/EntityCollectionTable/column_utils.tsx +11 -19
  106. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +1 -1
  107. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +7 -0
  108. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +5 -1
  109. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +12 -0
  110. package/src/components/EntityCollectionView/EntityCollectionView.tsx +66 -15
  111. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +6 -2
  112. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +8 -1
  113. package/src/components/EntityCollectionView/FiltersDialog.tsx +39 -28
  114. package/src/components/EntityCollectionView/useBoardDataController.tsx +17 -1
  115. package/src/components/EntityPreview.tsx +45 -41
  116. package/src/components/ErrorBoundary.tsx +12 -18
  117. package/src/components/LicenseBanner.tsx +209 -0
  118. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +19 -2
  119. package/src/components/ReferenceWidget.tsx +1 -1
  120. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  121. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +33 -7
  122. package/src/components/SelectableTable/filters/filter_text_input.test.ts +184 -0
  123. package/src/components/SelectableTable/filters/filter_text_input.ts +71 -0
  124. package/src/components/VirtualTable/VirtualTable.tsx +19 -8
  125. package/src/components/common/default_entity_actions.tsx +22 -2
  126. package/src/components/common/table_url_params.ts +172 -0
  127. package/src/components/common/useDataSourceTableController.tsx +126 -163
  128. package/src/components/common/useTableSearchHelper.ts +26 -2
  129. package/src/components/index.tsx +1 -0
  130. package/src/contexts/LicenseStatusContext.tsx +50 -0
  131. package/src/contexts/SnackbarProvider.tsx +14 -1
  132. package/src/core/DefaultAppBar.tsx +28 -16
  133. package/src/core/DefaultDrawer.tsx +150 -64
  134. package/src/core/DrawerNavigationGroup.tsx +27 -29
  135. package/src/core/DrawerNavigationItem.tsx +10 -12
  136. package/src/core/EntityEditView.tsx +77 -35
  137. package/src/core/EntityEditViewFormActions.tsx +3 -2
  138. package/src/core/EntitySidePanel.tsx +8 -4
  139. package/src/core/FireCMS.tsx +73 -47
  140. package/src/core/SideDialogs.tsx +44 -1
  141. package/src/core/field_configs.tsx +15 -0
  142. package/src/core/index.tsx +1 -0
  143. package/src/core/plugin_translations.ts +87 -0
  144. package/src/core/pro_plugins.ts +79 -0
  145. package/src/editor/components/SlashCommandMenu.tsx +4 -1
  146. package/src/editor/extensions/Image.ts +17 -1
  147. package/src/editor/hooks/useProseMirror.ts +5 -0
  148. package/src/editor/index.ts +11 -1
  149. package/src/editor/lazy_editor.tsx +33 -0
  150. package/src/form/EntityForm.tsx +31 -10
  151. package/src/form/EntityFormActions.tsx +2 -0
  152. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -1
  153. package/src/form/field_bindings/GeopointFieldBinding.tsx +139 -0
  154. package/src/form/index.tsx +1 -0
  155. package/src/hooks/data/delete.ts +8 -0
  156. package/src/hooks/data/save.ts +6 -1
  157. package/src/hooks/data/useCollectionFetch.tsx +21 -1
  158. package/src/hooks/data/useEntityFetch.tsx +35 -4
  159. package/src/hooks/index.tsx +2 -0
  160. package/src/hooks/useBuildNavigationController.tsx +70 -15
  161. package/src/hooks/useFireCMSContext.tsx +7 -3
  162. package/src/hooks/useLicenseStatus.tsx +32 -0
  163. package/src/hooks/useProjectLog.tsx +27 -9
  164. package/src/hooks/useResolvedNavigationFrom.tsx +3 -1
  165. package/src/hooks/useTranslation.ts +3 -1
  166. package/src/hooks/useValidateAuthenticator.tsx +4 -0
  167. package/src/i18n/FireCMSi18nProvider.tsx +199 -23
  168. package/src/i18n/__tests__/FireCMSi18nProvider.test.tsx +91 -0
  169. package/src/i18n/__tests__/nested_provider_lifecycle.test.tsx +67 -0
  170. package/src/internal/useBuildDataSource.ts +37 -15
  171. package/src/internal/useBuildSideEntityController.tsx +20 -5
  172. package/src/locales/de.ts +23 -4
  173. package/src/locales/en.ts +25 -4
  174. package/src/locales/es.ts +23 -4
  175. package/src/locales/fr.ts +23 -4
  176. package/src/locales/hi.ts +23 -4
  177. package/src/locales/it.ts +23 -4
  178. package/src/locales/pl.ts +749 -0
  179. package/src/locales/pt.ts +23 -4
  180. package/src/preview/PropertyPreview.tsx +12 -0
  181. package/src/preview/components/DatePreview.tsx +2 -4
  182. package/src/preview/components/ReferencePreview.tsx +7 -3
  183. package/src/preview/components/StorageThumbnail.tsx +24 -2
  184. package/src/preview/index.ts +1 -0
  185. package/src/preview/property_previews/GeopointPropertyPreview.tsx +23 -0
  186. package/src/routes/FireCMSRoute.tsx +54 -27
  187. package/src/types/analytics.ts +3 -0
  188. package/src/types/collections.ts +34 -0
  189. package/src/types/datasource.ts +67 -4
  190. package/src/types/entities.ts +24 -1
  191. package/src/types/entity_actions.tsx +6 -0
  192. package/src/types/entity_callbacks.ts +24 -0
  193. package/src/types/firecms.tsx +19 -1
  194. package/src/types/firecms_context.tsx +9 -0
  195. package/src/types/index.ts +1 -0
  196. package/src/types/license.ts +62 -0
  197. package/src/types/navigation.ts +35 -5
  198. package/src/types/plugins.tsx +23 -1
  199. package/src/types/properties.ts +17 -0
  200. package/src/types/side_entity_controller.tsx +7 -0
  201. package/src/types/translations.ts +37 -2
  202. package/src/util/__tests__/collections.test.ts +32 -0
  203. package/src/util/__tests__/urls.test.ts +131 -0
  204. package/src/util/collections.ts +1 -1
  205. package/src/util/date_fns_locales.ts +168 -0
  206. package/src/util/entities.ts +16 -1
  207. package/src/util/entity_cache.ts +18 -0
  208. package/src/util/geopoint.ts +81 -0
  209. package/src/util/index.ts +3 -0
  210. package/src/util/lazy_eager.tsx +30 -8
  211. package/src/util/navigation_blocking.ts +45 -0
  212. package/src/util/navigation_from_path.ts +47 -7
  213. package/src/util/navigation_utils.ts +244 -4
  214. package/src/util/parent_references_from_path.ts +45 -4
  215. package/src/util/paths.ts +40 -3
  216. package/src/util/permissions.ts +22 -10
  217. package/src/util/previews.ts +8 -1
  218. package/src/util/resolutions.ts +8 -0
  219. package/src/util/urls.ts +52 -0
  220. package/src/util/useStorageUploadController.tsx +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-BSo_aS1I.js","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/schema.ts","../src/editor/extensions/Image.ts","../src/editor/extensions/TextLoadingDecorationExtension.tsx","../src/editor/markdown.ts","../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 { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\n\nexport interface EditorBubbleProps {\n children: ReactNode;\n options?: any;\n className?: string;\n}\n\nexport const EditorBubble = forwardRef<HTMLDivElement, EditorBubbleProps>(\n ({ children, options, className }, ref) => {\n const { view, state } = 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 { from, to } = 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 any, 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 any, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), 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 }, [show, view, state, options]);\n\n if (!show) return null;\n\n return (\n <div\n ref={menuRef}\n className={className}\n style={{ position: \"fixed\", zIndex: 9999, visibility: \"hidden\" }}\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 \"@radix-ui/react-slot\";\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, dismissed: 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, range: { from, to }, query };\n },\n }\n });\n}\n","import { Schema, NodeSpec, MarkSpec } from \"prosemirror-model\";\nimport { tableNodes } from \"prosemirror-tables\";\n\nconst marks: { [key: string]: MarkSpec } = {\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: \"_blank\" },\n },\n inclusive: false,\n parseDOM: [\n {\n tag: \"a[href]\",\n getAttrs(dom: HTMLElement | string) {\n if (typeof dom === \"string\") return false;\n return {\n href: dom.getAttribute(\"href\"),\n title: dom.getAttribute(\"title\"),\n target: dom.getAttribute(\"target\") || \"_blank\",\n };\n },\n },\n ],\n toDOM(node) {\n let { href, title, target } = node.attrs;\n return [\"a\", { href, title, target, class: \"text-surface-700 dark:text-surface-accent-200 underline underline-offset-[3px] hover:text-primary transition-colors cursor-pointer\" }, 0];\n },\n },\n bold: {\n parseDOM: [\n { tag: \"strong\" },\n { tag: \"b\", getAttrs: (node: HTMLElement | string) => typeof node !== \"string\" && node.style.fontWeight !== \"normal\" && null },\n { style: \"font-weight=400\", clearMark: m => m.type.name === \"bold\" },\n { style: \"font-weight\", getAttrs: (value: string | HTMLElement) => typeof value === \"string\" && /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null },\n ],\n toDOM() { return [\"strong\", 0]; },\n },\n italic: {\n parseDOM: [{ tag: \"i\" }, { tag: \"em\" }, { style: \"font-style=italic\" }],\n toDOM() { return [\"em\", 0]; },\n },\n strike: {\n parseDOM: [{ tag: \"s\" }, { tag: \"del\" }, { tag: \"strike\" }, { style: \"text-decoration=line-through\" }],\n toDOM() { return [\"s\", 0]; },\n },\n underline: {\n parseDOM: [{ tag: \"u\" }, { style: \"text-decoration=underline\" }],\n toDOM() { return [\"u\", 0]; },\n },\n code: {\n parseDOM: [{ tag: \"code\" }],\n toDOM() { return [\"code\", { class: \"rounded-md bg-surface-accent-50 dark:bg-surface-700 px-1.5 py-1 font-mono font-medium\", spellcheck: \"false\" }, 0]; },\n },\n textStyle: {\n attrs: { color: { default: null } },\n parseDOM: [\n {\n style: \"color\",\n getAttrs: (value: string | HTMLElement) => {\n if (typeof value === \"string\") return { color: value };\n return false;\n },\n },\n ],\n toDOM(mark) {\n let style = \"\";\n if (mark.attrs.color) style += `color: ${mark.attrs.color};`;\n return [\"span\", { style }, 0];\n },\n },\n highlight: {\n attrs: { color: { default: null } },\n parseDOM: [\n {\n tag: \"mark\",\n getAttrs: (dom: HTMLElement | string) => {\n if (typeof dom === \"string\") return false;\n return { color: dom.style.backgroundColor || dom.getAttribute(\"data-color\") };\n }\n },\n ],\n toDOM(mark) {\n return [\"mark\", mark.attrs.color ? { style: `background-color: ${mark.attrs.color}; color: inherit;`, \"data-color\": mark.attrs.color } : {}, 0];\n },\n },\n};\n\nconst nodes: { [key: string]: NodeSpec } = {\n doc: {\n content: \"block+\",\n },\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{ tag: \"p\" }],\n toDOM() { return [\"p\", 0]; },\n },\n text: {\n group: \"inline\",\n },\n blockquote: {\n content: \"block+\",\n group: \"block\",\n defining: true,\n parseDOM: [{ tag: \"blockquote\" }],\n toDOM() { return [\"blockquote\", { class: \"border-l-4 border-primary\" }, 0]; },\n },\n heading: {\n attrs: { level: { default: 1 } },\n content: \"inline*\",\n group: \"block\",\n defining: true,\n parseDOM: [\n { tag: \"h1\", attrs: { level: 1 } },\n { tag: \"h2\", attrs: { level: 2 } },\n { tag: \"h3\", attrs: { level: 3 } },\n { tag: \"h4\", attrs: { level: 4 } },\n { tag: \"h5\", attrs: { level: 5 } },\n { tag: \"h6\", attrs: { level: 6 } },\n ],\n toDOM(node) { return [\"h\" + node.attrs.level, 0]; },\n },\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{ tag: \"hr\" }],\n toDOM() { return [\"hr\", { class: \"mt-4 mb-6 border-t border-solid border-gray-200 dark:border-gray-800\" }]; },\n },\n code_block: {\n content: \"text*\",\n marks: \"\",\n group: \"block\",\n code: true,\n defining: true,\n attrs: { language: { default: null } },\n parseDOM: [\n { tag: \"pre\", preserveWhitespace: \"full\" },\n ],\n toDOM(node) { return [\"pre\", { class: \"rounded bg-blue-50 dark:bg-surface-700 border border-solid border-gray-200 dark:border-gray-800 p-5 font-mono font-medium\" }, [\"code\", 0]]; },\n },\n image: {\n inline: false,\n group: \"block\",\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n },\n draggable: true,\n parseDOM: [\n {\n tag: \"img[src]\",\n getAttrs(dom: HTMLElement | string) {\n if (typeof dom === \"string\") return false;\n return {\n src: dom.getAttribute(\"src\"),\n title: dom.getAttribute(\"title\"),\n alt: dom.getAttribute(\"alt\"),\n };\n },\n },\n ],\n toDOM(node) {\n let { src, alt, title } = node.attrs;\n return [\"img\", { src, alt, title, class: \"rounded-lg max-w-full !m-0\" }];\n },\n },\n bullet_list: {\n content: \"list_item+\",\n group: \"block\",\n parseDOM: [{ tag: \"ul\" }],\n toDOM() { return [\"ul\", { class: \"list-disc list-outside leading-3 -mt-2\" }, 0]; },\n },\n ordered_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: { order: { default: 1 } },\n parseDOM: [\n {\n tag: \"ol\",\n getAttrs(dom: HTMLElement | string) {\n if (typeof dom === \"string\") return false;\n return { order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\")! : 1 };\n },\n },\n ],\n toDOM(node) {\n return node.attrs.order === 1 ? [\"ol\", { class: \"list-decimal list-outside leading-3 -mt-2\" }, 0] : [\"ol\", { start: node.attrs.order, class: \"list-decimal list-outside leading-3 -mt-2\" }, 0];\n },\n },\n list_item: {\n content: \"paragraph block*\",\n parseDOM: [{ tag: \"li\" }],\n toDOM() { return [\"li\", { class: \"leading-normal -mb-2\" }, 0]; },\n defining: true,\n },\n task_list: {\n group: \"block\",\n content: \"task_item+\",\n parseDOM: [{ tag: 'ul[data-type=\"taskList\"]' }],\n toDOM() { return [\"ul\", { \"data-type\": \"taskList\", class: \"not-prose\" }, 0]; },\n },\n task_item: {\n content: \"paragraph block*\",\n defining: true,\n attrs: { checked: { default: false } },\n parseDOM: [\n {\n tag: 'li[data-type=\"taskItem\"]',\n getAttrs(dom: HTMLElement | string) {\n if (typeof dom === \"string\") return false;\n return { checked: dom.getAttribute(\"data-checked\") === \"true\" };\n },\n },\n ],\n toDOM(node) {\n return [\"li\", { \"data-type\": \"taskItem\", \"data-checked\": node.attrs.checked ? \"true\" : \"false\", class: \"flex items-start my-4\" }, 0];\n },\n },\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{ tag: \"br\" }],\n toDOM() { return [\"br\"]; },\n },\n ...tableNodes({\n tableGroup: \"block\",\n cellContent: \"block+\",\n cellAttributes: {\n background: {\n default: null,\n getFromDOM(dom: HTMLElement) { return dom.style.backgroundColor || null },\n setDOMAttr(value: any, attrs: any) { if (value) attrs.style = (attrs.style || \"\") + `background-color: ${value};` }\n }\n }\n })\n};\n\nexport const schema = new Schema({ nodes, marks });\n","import { cls, defaultBorderMixin } from \"@firecms/ui\";\nimport { Decoration, DecorationSet, EditorView } from \"prosemirror-view\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\n\nexport type UploadFn = (image: File) => Promise<string>;\n\n/**\n * Shows the image as a placeholder at `pos`, uploads it, and swaps the\n * placeholder for the uploaded image once it has loaded.\n *\n * Every step after the first runs asynchronously — the FileReader callback that\n * calls this, the upload, and the preload of the uploaded image — and the editor\n * can be unmounted during any of them (the user closes the entity or navigates\n * away while an image is still uploading). Dispatching on a destroyed\n * `EditorView` throws inside ProseMirror (`docView` is null), so each step\n * checks the view is still alive before touching it.\n */\nexport async function onFileRead(view: EditorView, readerEvent: ProgressEvent<FileReader>, pos: number, upload: UploadFn, image: File) {\n\n if (view.isDestroyed) return;\n\n // @ts-ignore\n const plugin = view.state.plugins.find((p: Plugin) => p.key === ImagePluginKey.key);\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 // The upload is kept (the caller stored the file), but there is no longer\n // an editor to put it in.\n if (view.isDestroyed) return;\n\n const replacePlaceholder = () => {\n if (view.isDestroyed) return;\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.log(\"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 as any, readerEvent, position.pos, upload, image);\n };\n reader.readAsDataURL(image);\n });\n\n return true;\n }\n },\n handlePaste(view: EditorView, event: ClipboardEvent, slice: any) {\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 as any, 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","import {\n MarkdownParser,\n MarkdownSerializer,\n defaultMarkdownParser,\n defaultMarkdownSerializer\n} from \"prosemirror-markdown\";\nimport markdownIt from \"markdown-it\";\n// @ts-ignore\nimport markdownItTaskLists from \"markdown-it-task-lists\";\n// @ts-ignore\nimport markdownItMark from \"markdown-it-mark\";\n// @ts-ignore\nimport markdownItIns from \"markdown-it-ins\";\n\nimport { schema } from \"./schema\";\n\nconst parserTokens: any = {\n ...defaultMarkdownParser.tokens,\n em: { mark: \"italic\" },\n strong: { mark: \"bold\" },\n html_inline: { ignore: true, noCloseToken: true },\n html_block: { ignore: true, noCloseToken: true },\n s: {\n mark: \"strike\",\n },\n task_list: {\n block: \"task_list\",\n },\n task_item: {\n block: \"task_item\",\n getAttrs: (tok: any) => ({ checked: tok.attrGet(\"checked\") === \"true\" }),\n },\n mark: {\n mark: \"highlight\"\n },\n ins: {\n mark: \"underline\"\n },\n table: { block: \"table\" },\n thead: { ignore: true },\n tbody: { ignore: true },\n tr: { block: \"table_row\" },\n th: { block: \"table_header\" },\n td: { block: \"table_cell\" }\n};\n\nconst md = markdownIt({ html: false })\n .use(markdownItTaskLists)\n .use(markdownItMark)\n .use(markdownItIns);\n\n// Override the escape rule so that `\\` before a newline is kept as literal\n// text instead of being silently consumed as a hardbreak. The default\n// markdown-it behaviour strips the backslash and produces a <br>, which\n// causes users to lose visible `\\` characters in their content.\nmd.inline.ruler.at(\"escape\", function escapeOverride(state: any, silent: boolean): boolean {\n let pos = state.pos;\n const max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C /* \\ */) return false;\n pos++;\n\n if (pos >= max) return false;\n\n const ch1 = state.src.charCodeAt(pos);\n\n // KEY CHANGE: when `\\` is followed by a newline, output the backslash as\n // literal text and let the normal softbreak handling deal with the newline.\n if (ch1 === 0x0A) {\n if (!silent) {\n state.pending += \"\\\\\";\n }\n state.pos = pos; // leave the newline for softbreak to handle\n return true;\n }\n\n // For escaped ASCII punctuation, output the character without the backslash\n // (standard markdown escape behaviour: `\\*` → `*`).\n let escapedStr = state.src[pos];\n // Handle surrogate pairs\n if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n const ch2 = state.src.charCodeAt(pos + 1);\n if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n escapedStr += state.src[pos + 1];\n pos++;\n }\n }\n\n const origStr = \"\\\\\" + escapedStr;\n\n if (!silent) {\n // Check if the character is an ASCII punctuation that\n // markdown-it considers escapable (codes < 256 in its lookup table).\n const isEscapable = ch1 < 256 && /[\\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-]/.test(String.fromCharCode(ch1));\n const token = state.push(\"text_special\", \"\", 0);\n if (isEscapable) {\n token.content = escapedStr;\n } else {\n token.content = origStr;\n }\n token.markup = origStr;\n token.info = \"escape\";\n }\n state.pos = pos + 1;\n return true;\n});\n\n// Also disable the newline rule which redundantly converts `\\` + newline\n// to hardbreaks via a separate code path.\nmd.inline.ruler.disable([\"newline\"]);\n\n// Unwrap images from paragraphs so they can be parsed as block nodes by ProseMirror\nmd.core.ruler.after(\"inline\", \"image-to-block\", (state: any) => {\n const tokens = state.tokens;\n for (let i = tokens.length - 2; i >= 1; i--) {\n if (\n tokens[i - 1] && tokens[i - 1].type === \"paragraph_open\" &&\n tokens[i] && tokens[i].type === \"inline\" &&\n tokens[i + 1] && tokens[i + 1].type === \"paragraph_close\"\n ) {\n const inlineTokens = tokens[i].children || [];\n if (inlineTokens.length === 1 && inlineTokens[0].type === \"image\") {\n state.tokens.splice(i - 1, 3, inlineTokens[0]);\n // No need to adjust index when looping backward!\n }\n }\n }\n});\n\n// Wrap inline tokens inside table cells into paragraphs to satisfy ProseMirror table cell schema (block+)\nmd.core.ruler.after(\"inline\", \"tables-wrap-paragraphs\", (state: any) => {\n const tokens = state.tokens;\n for (let i = tokens.length - 1; i >= 0; i--) {\n if (tokens[i].type === \"td_open\" || tokens[i].type === \"th_open\") {\n let closeIndex = i + 1;\n while (closeIndex < tokens.length && tokens[closeIndex].type !== \"td_close\" && tokens[closeIndex].type !== \"th_close\") {\n closeIndex++;\n }\n if (closeIndex < tokens.length) {\n const pOpen = new state.Token(\"paragraph_open\", \"p\", 1);\n pOpen.block = true;\n const pClose = new state.Token(\"paragraph_close\", \"p\", -1);\n pClose.block = true;\n \n state.tokens.splice(closeIndex, 0, pClose);\n state.tokens.splice(i + 1, 0, pOpen);\n }\n }\n }\n});\n\nexport const markdownParser = new MarkdownParser(schema, md, parserTokens);\n\n\nexport const markdownSerializer = new MarkdownSerializer(\n {\n ...defaultMarkdownSerializer.nodes,\n // Add custom serialization for task lists\n task_list(state, node) {\n state.renderList(node, \" \", () => \"- \");\n },\n task_item(state, node) {\n state.write(`[${node.attrs.checked ? \"x\" : \" \"}] `);\n state.renderContent(node);\n },\n horizontal_rule(state, node) {\n state.write(node.attrs.markup || \"---\");\n state.closeBlock(node);\n },\n image(state, node) {\n const rawSrc = node.attrs.src || \"\";\n const src = rawSrc.replace(/ /g, \"%20\");\n state.write(\"![\" + state.esc(node.attrs.alt || \"\") + \"](\" + src.replace(/[\\(\\)]/g, \"\\\\$&\") +\n (node.attrs.title ? ' \"' + node.attrs.title.replace(/\"/g, '\\\\\"') + '\"' : \"\") + \")\");\n state.closeBlock(node);\n },\n table(state, node) {\n node.forEach((row, _, i) => {\n row.forEach((cell, _, j) => {\n state.write(j === 0 ? \"| \" : \" \");\n let cellContent = \"\";\n const oldWrite = state.write.bind(state);\n state.write = (s: string) => { cellContent += s; };\n \n let first = true;\n cell.forEach((block: any) => {\n if (!first) cellContent += \"<br>\";\n state.renderInline(block);\n first = false;\n });\n \n state.write = oldWrite;\n state.write(cellContent.replace(/\\|/g, \"\\\\|\"));\n state.write(\" |\");\n });\n state.write(\"\\n\");\n if (i === 0) {\n row.forEach((cell, _, j) => {\n state.write(j === 0 ? \"|---|\" : \"---|\");\n });\n state.write(\"\\n\");\n }\n });\n state.closeBlock(node);\n },\n table_row() {},\n table_cell() {},\n table_header() {},\n // Custom text serializer: since our parser override keeps `\\` as\n // literal text (instead of consuming it), we must avoid the default\n // esc() from double-escaping it. We escape all standard markdown\n // specials *except* the backslash itself.\n text(state: any, node: any) {\n const escaped = node.text.replace(/[`*~\\[\\]_]/g, (m: string, i: number) => {\n // Don't escape mid-word underscores (same logic as default esc)\n if (m === \"_\" && i > 0 && i + 1 < node.text.length\n && /\\w/.test(node.text[i - 1]) && /\\w/.test(node.text[i + 1])) {\n return m;\n }\n return \"\\\\\" + m;\n });\n // Handle start-of-line patterns that could be parsed as block syntax\n const lines = escaped.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n state.write();\n let line = lines[i];\n if (state.atBlockStart || i > 0) {\n line = line\n .replace(/^(\\+[ ]|[-*>])/, \"\\\\$&\")\n .replace(/^(\\s*)(#{1,6})(\\s|$)/, '$1\\\\$2$3')\n .replace(/^(\\s*\\d+)\\.\\s/, \"$1\\\\. \");\n }\n state.out += line;\n if (i !== lines.length - 1) state.out += \"\\n\";\n }\n }\n },\n {\n ...defaultMarkdownSerializer.marks,\n bold: defaultMarkdownSerializer.marks.strong,\n italic: defaultMarkdownSerializer.marks.em,\n strike: { open: \"~~\", close: \"~~\", mixable: true, expelEnclosingWhitespace: true },\n highlight: { open: \"==\", close: \"==\", mixable: true, expelEnclosingWhitespace: true },\n underline: { open: \"++\", close: \"++\", mixable: true, expelEnclosingWhitespace: true },\n link: {\n ...defaultMarkdownSerializer.marks.link,\n close(state: any, mark, parent, index) {\n const inAutolink = state.inAutolink;\n state.inAutolink = undefined;\n const href = mark.attrs.href.replace(/ /g, \"%20\");\n return inAutolink ? \">\"\n : \"](\" + href.replace(/[\\(\\)\"]/g, \"\\\\$&\") + (mark.attrs.title ? ` \"${mark.attrs.title.replace(/\"/g, '\\\\\"')}\"` : \"\") + \")\";\n }\n },\n // textStyle (colored text from HTML) has no markdown equivalent — emit content as-is\n textStyle: { open: \"\", close: \"\", mixable: true, expelEnclosingWhitespace: true },\n }\n);\nexport const parser = markdownParser;\nexport const serializer = markdownSerializer;\n","import React, { useEffect, useRef, useState, ReactNode } from \"react\";\nimport { Fragment, DOMParser } from \"prosemirror-model\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\nimport { SlashCommandPluginKey } from \"../plugins/slashCommandPlugin\";\nimport {\n cls,\n defaultBorderMixin,\n TextFieldsIcon,\n CheckBoxIcon,\n LooksOneIcon,\n LooksTwoIcon,\n Looks3Icon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n CodeIcon,\n ImageIcon,\n AutoFixHighIcon,\n TableChartIcon\n} from \"@firecms/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 { 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: <TextFieldsIcon size={18} />,\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: <CheckBoxIcon size={18} />,\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: <LooksOneIcon size={18} />,\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: <LooksTwoIcon size={18} />,\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: <Looks3Icon size={18} />,\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: <FormatListBulletedIcon size={18} />,\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: <FormatListNumberedIcon size={18} />,\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: <FormatQuoteIcon size={18} />,\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={18} />,\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={18} />,\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: <TableChartIcon size={18} />,\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: <AutoFixHighIcon size={18} />,\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 && !view.isDestroyed) {\n textLoadingCommands.toggleLoadingDecoration(view.state, view.dispatch, buffer);\n }\n });\n\n // The editor may have been unmounted while the completion streamed in.\n if (view.isDestroyed) return;\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, c: 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 any, menuRef.current, () => {\n if (!menuRef.current) return;\n computePosition(virtualEl as any, 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, c: 0 });\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.max(0, prev.r - 1), c: prev.c }));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: Math.min(4, prev.r + 1), c: prev.c }));\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r, c: Math.max(0, prev.c - 1) }));\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault(); e.stopPropagation();\n setTableGridCoords(prev => ({ r: prev.r, c: 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, c: 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, dismissed: 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, c: 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\", zIndex: 9999, visibility: \"hidden\" }}\n className={cls(\"text-surface-900 dark:text-white rounded-md border bg-white dark:bg-surface-900 p-2 shadow transition-none\", defaultBorderMixin)}\n >\n <TableGridPicker\n hoveredRow={tableGridCoords.r}\n hoveredCol={tableGridCoords.c}\n onHover={(r, c) => setTableGridCoords({ r, c })}\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\", zIndex: 9999, visibility: \"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-900 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-900\", 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: any, 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 } from \"@floating-ui/dom\";\nimport { NodeSelection } from \"prosemirror-state\";\nimport { TextField, defaultBorderMixin, Typography, cls } from \"@firecms/ui\";\n\nexport interface ImageBubbleProps {\n options?: any;\n className?: string;\n}\n\nexport const ImageBubble = forwardRef<HTMLDivElement, ImageBubbleProps>(\n ({ options, className }, ref) => {\n const { view, state } = useProseMirrorContext();\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({ left: e.clientX, top: e.clientY });\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 { from, to } = 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 any, 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\n computePosition(virtualEl as any, menuRef.current, {\n placement: options?.placement || \"bottom\",\n middleware: [offset(options?.offset || 8), 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 }, [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={{ visibility: \"hidden\", position: \"fixed\", zIndex: 50 }}\n className={cls(\"flex flex-col gap-1.5 p-2 w-56 max-w-[90vw] rounded-lg border bg-white dark:bg-surface-900 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=\"Alt text\"\n value={alt}\n onChange={(e: any) => {\n setAlt(e.target.value);\n handleSave(e.target.value, title);\n }}\n />\n <TextField\n size={\"small\"}\n placeholder=\"Title\"\n value={title}\n onChange={(e: any) => {\n setTitle(e.target.value);\n handleSave(alt, e.target.value);\n }}\n />\n </div>\n );\n }\n);\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useProseMirrorContext } from \"../hooks/useProseMirrorContext\";\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\nimport { IconButton, Tooltip, defaultBorderMixin, cls } from \"@firecms/ui\";\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\n\nexport interface TableBubbleProps {\n options?: any;\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 @firecms/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 @firecms/ui has them.\n\nexport const TableBubble = forwardRef<HTMLDivElement, TableBubbleProps>(\n ({ options, className }, ref) => {\n const { view, state } = useProseMirrorContext();\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 { from, to } = 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 any, 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 any, menuRef.current, {\n placement: options?.placement || \"top\",\n middleware: [offset(options?.offset || 8), 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 }, [show, view, state, options]);\n\n if (!show || !view || !state) return null;\n\n const executeCommand = (cmd: any) => {\n cmd(state, view.dispatch);\n view.focus();\n };\n\n return (\n <div\n ref={menuRef}\n style={{ visibility: \"hidden\", position: \"fixed\", zIndex: 50 }}\n className={cls(\"flex flex-row gap-1 p-1 rounded-lg border bg-white dark:bg-surface-900 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=\"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\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line></svg>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"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\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"20\"></line><line x1=\"8\" y1=\"16\" x2=\"16\" y2=\"16\"></line><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"></line></svg>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Delete row\">\n <IconButton size=\"small\" onClick={() => executeCommand(deleteRow)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line></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=\"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\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"></line></svg>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"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\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"12\" x2=\"20\" y2=\"12\"></line><line x1=\"16\" y1=\"8\" x2=\"16\" y2=\"16\"></line><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"></line></svg>\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Delete column\">\n <IconButton size=\"small\" onClick={() => executeCommand(deleteColumn)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\"></line><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line></svg>\n </IconButton>\n </Tooltip>\n </div>\n\n <Tooltip title=\"Delete table\">\n <IconButton size=\"small\" onClick={() => executeCommand(deleteTable)}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"></polyline><path 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><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line></svg>\n </IconButton>\n </Tooltip>\n </div>\n );\n }\n);\n","import { EditorState } from \"prosemirror-state\";\n\nexport function isMarkActive(state: EditorState, type: any) {\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: any, attrs: any = {}) {\n if (!state || !type) return false;\n const { $from, to, node } = state.selection as any;\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: any) {\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: any, attrs?: any) {\n return (state: EditorState, dispatch?: (tr: any) => void) => {\n const { empty, $cursor, ranges } = state.selection as any;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n if ($cursor) {\n dispatch(state.tr.addStoredMark(type.create(attrs)));\n } else {\n let tr = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n let { $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: any) {\n return (state: EditorState, dispatch?: (tr: any) => void) => {\n const { empty, $cursor, ranges } = state.selection as any;\n if ((empty && !$cursor) || !type) return false;\n if (dispatch) {\n let 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: any, 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 let { $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","import { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport { useTranslation } from \"../../hooks/useTranslation\";\n\nimport {\n Button,\n CheckBoxIcon,\n CheckIcon,\n CodeIcon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n KeyboardArrowDownIcon,\n Looks3Icon,\n LooksOneIcon,\n LooksTwoIcon,\n Popover,\n TextFieldsIcon\n} from \"@firecms/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: TextFieldsIcon,\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: LooksOneIcon,\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: LooksTwoIcon,\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: Looks3Icon,\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: CheckBoxIcon,\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: FormatListBulletedIcon,\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: FormatListNumberedIcon,\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: FormatQuoteIcon,\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 <KeyboardArrowDownIcon size={\"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=\"smallest\" />\n <span>{t(item.labelKey)}</span>\n </div>\n {activeItem.name === item.name && <CheckIcon size=\"smallest\" />}\n </EditorBubbleItem>\n ))}\n </Popover>\n );\n};\n","import { useEffect, useRef, } from \"react\";\nimport { Button, CheckIcon, cls, DeleteIcon, focusedDisabled, Popover } from \"@firecms/ui\";\nimport { useTranslation } from \"../../hooks/useTranslation\";\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: any) => {\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 <input\n ref={inputRef}\n autoFocus={open}\n placeholder={t(\"editor_paste_or_type_link\")}\n defaultValue={href}\n className={cls(\"text-surface-900 dark:text-white flex-grow bg-transparent p-1 text-sm outline-none\", focusedDisabled)} />\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 <DeleteIcon size=\"small\" />\n </Button>\n ) : (\n <Button size={\"small\"}\n type=\"submit\"\n variant={\"text\"}>\n <CheckIcon size=\"small\" />\n </Button>\n )}\n </form>\n </Popover>\n );\n};\n","import { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorBubbleItem } from \"../components\";\nimport type { SelectorItem } from \"./node-selector\";\nimport {\n Button,\n cls,\n CodeIcon,\n FormatBoldIcon,\n FormatItalicIcon,\n FormatStrikethroughIcon,\n FormatUnderlinedIcon\n} from \"@firecms/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: FormatBoldIcon,\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: FormatItalicIcon,\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: FormatUnderlinedIcon,\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: FormatStrikethroughIcon,\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: any): any {\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 // If the object has an `attrs` property and `class` field, delete the `class` field\n if (jsonObj.attrs && typeof jsonObj.attrs === \"object\" && \"class\" in jsonObj.attrs) {\n delete jsonObj.attrs.class;\n }\n\n // Apply the function recursively to object properties\n Object.keys(jsonObj).forEach(key => {\n jsonObj[key] = removeClassesFromJson(jsonObj[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 // @ts-ignore\n context.push(node.type.name, node.attrs != node.type.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\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 // 1. First probe exactly at the mouse coordinates\n let elem = document.elementFromPoint(coords.x, coords.y);\n let block = elem?.closest('li, p:not(:first-child), pre, blockquote, h1, h2, h3, h4, h5, h6, img, [data-type=\"taskList\"]');\n if (block && view.dom.contains(block)) {\n return block.closest('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 let probeElem = document.elementFromPoint(probeX, coords.y);\n let probeBlock = probeElem?.closest('li, p:not(:first-child), pre, blockquote, h1, h2, h3, h4, h5, h6, img, [data-type=\"taskList\"]');\n if (probeBlock) {\n // Ensure the found block is actually inside our editor\n if (view.dom.contains(probeBlock)) {\n return probeBlock.closest('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 any, 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 any).dragging = {\n slice,\n move: true,\n node: draggedNodeSelection\n } as { slice: Slice, move: boolean, node: NodeSelection };\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 }\n }\n\n function showDragHandle() {\n if (dragHandleElement) {\n dragHandleElement.classList.remove(\"hide\");\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 as any);\n });\n dragHandleElement.addEventListener(\"click\", (e) => {\n handleClick(e, view as any);\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, attributeFilter: [\"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, top: event.clientY });\n if (!pos) return null;\n\n let $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.dragging as any).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 let 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, right: nodeRect.right, top: top - 1, bottom: top + 1 };\n }\n }\n\n if (!rect) {\n const coords = editorView.coordsAtPos(target);\n rect = { left: editorRect.left + 50, right: editorRect.right - 50, top: coords.top - 1, bottom: 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.dragging as any).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 let targetPos = getBlockInsertionPoint(event, clampedX);\n if (targetPos === null) return;\n\n const dragging = (editorView as any).dragging as { slice: Slice, move: boolean, node?: NodeSelection };\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 let { node, slice } = dragging;\n\n if (node && node.node) {\n let nodeToInsert: any = 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 (nodeToInsert.type.name === \"list_item\" && !isTargetList) {\n nodeToInsert = nodeToInsert.content;\n } else if (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 = !nodeToInsert.type;\n const needsWrap = isFragment || (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 any).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\";\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: any, doc: any) {\n const decorations: [any?] = [];\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 corePlugins: 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: string = \"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: any) {\n if (!this.contentDOM) {\n return true;\n }\n return !this.contentDOM.contains(mutation.target);\n }\n}\n","import React from \"react\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\n\nexport const TaskItemComponent: React.FC<ReactNodeViewProps> = ({ node, view, getPos }) => {\n const checked = node.attrs.checked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\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: e.target.checked\n })\n );\n };\n\n return (\n <label contentEditable={false} className=\"flex items-start select-none px-1\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={handleChange}\n className=\"mt-1 flex-shrink-0 cursor-pointer\"\n />\n </label>\n );\n};\n","import React from \"react\";\nimport { ReactNodeViewProps } from \"./ReactNodeView\";\nimport { cls, defaultBorderMixin } from \"@firecms/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: string = \"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 { corePlugins } 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 ...corePlugins,\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 // Async work (image uploads and their preload, AI autocomplete\n // streams) can finish after the editor unmounted. Applying a\n // transaction to a destroyed view throws inside ProseMirror\n // (`docView` is null), so drop it: there is nothing to update.\n if (editorView.isDestroyed) return;\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 let 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, top: 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, top: 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 } from \"react\";\nimport { EditorState } from \"prosemirror-state\";\nimport { cls, defaultBorderMixin, Separator, useInjectStyles, TextareaAutosize } from \"@firecms/ui\";\nimport { useTranslation } from \"../hooks/useTranslation\";\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 FireCMSEditorTextSize = \"sm\" | \"base\" | \"lg\";\n\nexport type FireCMSEditorProps = {\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?: FireCMSEditorTextSize,\n highlight?: { from: number, to: number },\n aiController?: EditorAIController,\n customComponents?: CustomEditorComponent[];\n disabled?: boolean;\n markdownConfig?: MarkdownEditorConfig;\n};\n\nconst proseClasses = {\n \"sm\": \"prose-sm\",\n \"base\": \"prose-base\",\n \"lg\": \"prose-lg\"\n}\n\nexport const FireCMSEditor = ({\n content,\n onJsonContentChange,\n onHtmlContentChange,\n onMarkdownContentChange,\n version,\n textSize = \"base\",\n highlight,\n handleImageUpload,\n aiController,\n disabled,\n markdownConfig\n}: FireCMSEditorProps) => {\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, onJsonContentChange });\n useEffect(() => {\n callbacksRef.current = { onMarkdownContentChange, onJsonContentChange };\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(\"[FireCMSEditor] 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 const doc = state?.doc;\n const mountedRef = useRef(false);\n\n // Enable flushing after the initial render cycle completes.\n // ProseMirror initialization (including trailingNodePlugin and\n // appendTransaction) runs synchronously during mount, so any doc\n // change after the first effect cycle is from user interaction.\n useEffect(() => {\n const raf = requestAnimationFrame(() => {\n mountedRef.current = true;\n });\n return () => cancelAnimationFrame(raf);\n }, []);\n\n useEffect(() => {\n if (!state) return;\n // Skip flush until after mount — the round-trip through\n // parse → ProseMirror → serialize is not idempotent and would\n // produce subtly different markdown on init, making the form\n // dirty without user interaction.\n if (!mountedRef.current) return;\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 if (!mountedRef.current) return;\n flushChanges(view.state);\n };\n dom.addEventListener(\"blur\", handleBlur);\n return () => dom.removeEventListener(\"blur\", handleBlur);\n }, [view]);\n\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\n return (\n <div className=\"relative min-h-[300px] w-full\">\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={{ state, view }}>\n\n <div style={{ display: isMarkdownMode ? \"none\" : \"block\" }}>\n <div\n ref={editorRef}\n className={cls(proseClass, \"prose-headings:font-title font-default focus:outline-none max-w-full p-12\")}\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-900 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 as any}\n onBlur={handleMarkdownBlur as any}\n className={cls(\n \"w-full min-h-[300px] p-12 bg-transparent resize-none font-mono focus:ring-0 focus:outline-none outline-none\",\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\n\nconst cssStyles = `\n.ProseMirror {\n box-shadow: none !important;\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 &:hover {\n cursor: pointer;\n filter: brightness(90%);\n }\n &.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}\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\"] {\n ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"] {\n background-color: rgb(30 41 59);\n border: 2px solid #666;\n &:hover { background-color: rgb(51 65 85); }\n &:active { background-color: rgb(71 85 105); }\n }\n}\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 &:hover { background-color: rgb(241 245 249); }\n &:active { background-color: rgb(226 232 240); }\n &::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 }\n &:checked::before { transform: scale(1); }\n}\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 /* Create a hover area around the handle itself that doesn't overlap text */\n &::before {\n content: '';\n position: absolute;\n top: -10px;\n bottom: -10px;\n left: -20px; \n right: 0px;\n z-index: -1;\n }\n \n &:hover { background-color: rgb(241 245 249); transition: background-color 0.2s; }\n &:active { background-color: rgb(226 232 240); transition: background-color 0.2s; }\n &.hide { opacity: 0; pointer-events: none; }\n @media screen and (max-width: 600px) { display: none; pointer-events: none; }\n}\n[data-theme=\"dark\"] .drag-handle {\n &:hover { background-color: rgb(51 65 85); }\n &:active { background-color: rgb(51 65 85); }\n}\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 th {\n font-weight: 600;\n text-align: left;\n background-color: #f9fafb;\n}\n[data-theme=\"dark\"] .ProseMirror th {\n background-color: #1f2937;\n}\n`;\n"],"names":["ProseMirrorContext","createContext","state","view","useProseMirrorContext","useContext","EditorBubble","forwardRef","t0","ref","$","_c","children","options","className","menuRef","useRef","show","setShow","useState","t1","t2","timer","setTimeout","selection","empty","isImage","doc","nodesBetween","from","to","node","type","name","NodeSelection","clearTimeout","useEffect","t3","offset","placement","current","start","coordsAtPos","end","virtualEl","getBoundingClientRect","top","Math","min","bottom","max","left","right","width","height","x","y","cleanup","autoUpdate","t4","computePosition","middleware","flip","shift","strategy","then","t5","Object","assign","style","visibility","Symbol","for","position","zIndex","t6","_temp","displayName","e_0","e","preventDefault","EditorBubbleItem","asChild","onSelect","rest","Comp","Slot","SlashCommandPluginKey","PluginKey","slashCommandPlugin","Plugin","key","init","active","apply","tr","value","oldState","newState","meta","getMeta","undefined","TextSelection","$anchor","parent","textBefore","textBetween","parentOffset","match","dismissed","query","pos","length","range","marks","link","attrs","href","title","default","target","inclusive","parseDOM","tag","getAttrs","dom","getAttribute","toDOM","class","bold","fontWeight","clearMark","m","test","italic","strike","underline","code","spellcheck","textStyle","color","mark","highlight","backgroundColor","nodes","content","paragraph","group","text","blockquote","defining","heading","level","horizontal_rule","code_block","language","preserveWhitespace","image","inline","src","alt","draggable","bullet_list","ordered_list","order","hasAttribute","list_item","task_list","task_item","checked","hard_break","selectable","tableNodes","tableGroup","cellContent","cellAttributes","background","getFromDOM","setDOMAttr","schema","Schema","onFileRead","readerEvent","upload","isDestroyed","plugin","plugins","find","p","ImagePluginKey","console","error","decoId","random","toString","substring","placeholder","document","createElement","imageElement","setAttribute","defaultBorderMixin","result","appendChild","deco","Decoration","widget","id","decorationSet","getState","add","dispatch","setMeta","debug","replacePlaceholder","currentDecos","foundDecos","spec","warn","currentPos","imageNode","create","replaceWith","remove","preloader","Image","onload","onerror","createDropImagePlugin","DecorationSet","old","map","mapping","props","handleDOMEvents","dragover","event","dataTransfer","types","includes","drop","files","Array","images","filter","file","log","forEach","posAtCoords","clientX","clientY","reader","FileReader","readAsDataURL","handlePaste","slice","html","clipboardData","getData","items","anyImageFound","item","startsWith","getAsFile","decorations","loadingDecorationKey","textLoadingCommands","toggleLoadingDecoration","loadingHtml","removeLoadingDecoration","textLoadingDecorationPlugin","hasDecoration","action","decoration","container","innerHTML","span","innerText","parserTokens","defaultMarkdownParser","tokens","em","strong","html_inline","ignore","noCloseToken","html_block","s","block","tok","attrGet","ins","table","thead","tbody","th","td","md","markdownIt","use","markdownItTaskLists","markdownItMark","markdownItIns","ruler","at","escapeOverride","silent","posMax","charCodeAt","ch1","pending","escapedStr","ch2","origStr","isEscapable","String","fromCharCode","token","push","markup","info","disable","core","after","i","inlineTokens","splice","closeIndex","pOpen","Token","pClose","markdownParser","MarkdownParser","markdownSerializer","MarkdownSerializer","defaultMarkdownSerializer","renderList","write","renderContent","closeBlock","rawSrc","replace","esc","row","_","cell","j","oldWrite","bind","first","renderInline","table_row","table_cell","table_header","escaped","lines","split","line","atBlockStart","out","open","close","mixable","expelEnclosingWhitespace","index","inAutolink","parser","serializer","suggestionItems","description","searchTerms","icon","command","deleteRange","setBlockType","wrapInList","wrapIn","input","accept","onchange","f","click","aiController","setSubView","autocompleteSuggestionItem","Error","textBeforeCursor","textAfterCursor","size","buffer","autocomplete","delta","unescapedResult","isHTML","parsedDoc","div","DOMParser","fromSchema","parse","insertText","SlashCommandMenu","selectedIndex","setSelectedIndex","subView","tableGridCoords","setTableGridCoords","r","c","pluginState","isActive","filteredItems","React","useMemo","availableItems","inTitle","toLowerCase","some","term","handleKeyDown","stopPropagation","stopImmediatePropagation","prev","tableNode","createTableNode","setSelection","focus","window","addEventListener","capture","removeEventListener","itemRefs","scrollIntoView","cls","rows","cols","el","rowsCount","colsCount","cells","isHeader","cellType","createAndFill","Fragment","TableGridPicker","hoveredRow","hoveredCol","onHover","__0","ImageBubble","setAlt","setTitle","imagePos","setImagePos","handleContextMenu","posInfo","inside","nodeAt","handleMousedown","contains","button","newAlt","newTitle","node_0","tr_0","setNodeMarkup","handleSave","t7","t8","e_3","t9","t10","e_4","t11","t12","e_2","currentTarget","isSelectionInTable","$from","d","depth","TableBubble","cmd","executeCommand","addRowBefore","addRowAfter","t13","t14","t15","deleteRow","t16","t17","t18","t19","addColumnBefore","t20","t21","t22","addColumnAfter","t23","t24","t25","deleteColumn","t26","t27","t28","t29","deleteTable","t30","t31","t32","isMarkActive","isInSet","storedMarks","rangeHasMark","isNodeActive","keys","every","getMarkAttributes","found","setMark","$cursor","ranges","addStoredMark","$to","addMark","unsetMark","markStart","markEnd","currentMarkStart","child","childStart","childEnd","nodeSize","removeMark","removeStoredMark","labelKey","TextFieldsIcon","LooksOneIcon","LooksTwoIcon","Looks3Icon","CheckBoxIcon","FormatListBulletedIcon","FormatListNumberedIcon","FormatQuoteIcon","CodeIcon","NodeSelector","onOpenChange","portalContainer","t","useTranslation","T0","T1","activeItem","pop","Popover","Button","item_0","isValidUrl","url","URL","getUrlFromString","str","LinkSelector","inputRef","handleSubmit","handleRemoveLink","focusedDisabled","TextButtons","_temp2","FormatBoldIcon","_temp3","_temp4","FormatItalicIcon","_temp5","_temp6","FormatUnderlinedIcon","_temp7","_temp8","FormatStrikethroughIcon","_temp9","_temp0","s_0","toggleMark","s_1","s_2","dispatch_0","s_3","s_4","dispatch_1","s_5","s_6","dispatch_2","s_7","s_8","dispatch_3","removeClassesFromJson","jsonObj","isArray","serializeForClipboard","someProp","context","openStart","openEnd","childCount","firstChild","defaultAttrs","DOMSerializer","detachedDoc","wrap","serializeFragment","needsWrap","wrappers","nodeType","wrapMap","nodeName","wrapper","JSON","stringify","tfoot","caption","colgroup","col","_detachedDoc","implementation","createHTMLDocument","absoluteRect","element","data","ancestor","parentElement","getComputedStyle","ancestorRect","nodeDOMAtCoords","coords","editorRect","elem","elementFromPoint","closest","probeX","probeElem","probeBlock","nodePosAtDOM","posAtDOM","$pos","resolve","before","dragHandlePlugin","dragHandleWidth","handleDragStart","Element","nodePos","draggedNodeSelection","clearData","setData","effectAllowed","setDragImage","dragging","move","handleClick","classList","dragHandleElement","hideDragHandle","showDragHandle","dataset","dragHandle","onMouseMove","editable","compStyle","lineHeight","parseInt","paddingTop","rect","matches","destroy","keydown","mousewheel","dragstart","dragend","globalDragDropPlugin","dropCursorElement","updateDropCursorColor","isDark","documentElement","varName","getPropertyValue","trim","editorView","cssText","observer","MutationObserver","observe","attributes","attributeFilter","removeCursor","parentNode","removeChild","getBlockInsertionPoint","clampedX","blockDepth","isBlock","nodeBeforePos","nodeAfterPos","domNode","nodeDOM","HTMLElement","isTopHalf","handleDragOver","nodeBefore","nodeAfter","nodeRect","afterDOM","offsetParent","parentLeft","parentTop","body","parentRect","scrollLeft","scrollTop","handleDrop","targetPos","deleteSelection","mappedTarget","beforeInsert","nodeToInsert","$mapped","parentName","isTargetList","isTargetTaskList","isFragment","listItemType","taskItemType","taskItem","insert","point","dropPoint","finalTarget","eq","handleDragEnd","disconnect","highlightDecorationKey","buildDecorationSet","highlightCommands","toggleAutocompleteHighlight","removeAutocompleteHighlight","highlightDecorationPlugin","initialHighlight","transaction","autocompleteState","blockQuoteRule","wrappingInputRule","orderedListRule","bulletListRule","taskListRule","codeBlockRule","textblockTypeInputRule","headingRule","RegExp","horizontalRuleInputRule","InputRule","markInputRule","regexp","markType","Function","textStart","indexOf","textEnd","delete","strongRule","emRule","codeRule","strikeRule","markdownInputRules","inputRules","rules","smartQuotes","ellipsis","emDash","placeholderPluginKey","isNodeEmpty","defaultContent","placeholderPlugin","isEmptyDoc","isTextblock","anchor","descendants","isEmpty","isLeaf","nodeEnd","hasCursor","classes","join","customKeymap","goToNextCell","undo","redo","splitListItem","liftListItem","sinkListItem","corePlugins","history","keymap","baseKeymap","gapCursor","ReactNodeView","getPos","contentDOM","root","Component","constructor","as","contentDOMElement","createRoot","render","update","unmount","ignoreMutation","mutation","TaskItemComponent","handleChange","ImageComponent","selected","createReactNodeView","createContentDOM","nodeViews","trailingNodePlugin","appendTransaction","lastChild","useProseMirror","initialContent","handleImageUpload","columnResizing","tableEditing","EditorState","nodeFromJSON","defaultState","setState","setView","editorRef","viewRef","EditorView","dispatchTransaction","updateState","transformPastedHTML","querySelectorAll","originalPosAtCoords","res","probeX_0","useLayoutEffect","setProps","removeAttribute","proseClasses","FireCMSEditor","onJsonContentChange","onMarkdownContentChange","textSize","disabled","openNode","setOpenNode","openLink","setOpenLink","isMarkdownMode","setIsMarkdownMode","internalMarkdown","setInternalMarkdown","timeout","callbacksRef","handleToggleMarkdown","serialize","newDoc","handleMarkdownChange","handleMarkdownBlur","onMarkdownContentChange_0","onJsonContentChange_0","newDoc_0","toJSON","useInjectStyles","cssStyles","currentState","onMarkdownContentChange_1","onJsonContentChange_1","markdown","jsonContent","flushChanges","mountedRef","raf","requestAnimationFrame","cancelAnimationFrame","timeout_0","handleBlur","proseClass","display","t33","tabSize","outline","border","boxShadow","t34","t35"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}