@dxos/plugin-markdown 0.9.1-main.c7dcc2e112 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/dist/lib/neutral/{MarkdownArticle-I4UMD7AA.mjs → MarkdownArticle-ZHBXH7YF.mjs} +3 -5
  2. package/dist/lib/neutral/{MarkdownArticle-I4UMD7AA.mjs.map → MarkdownArticle-ZHBXH7YF.mjs.map} +2 -2
  3. package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs → MarkdownCard-2HUXCGZP.mjs} +2 -2
  4. package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs.map → MarkdownCard-2HUXCGZP.mjs.map} +1 -1
  5. package/dist/lib/neutral/MarkdownPlugin.mjs +3 -7
  6. package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
  7. package/dist/lib/neutral/MarkdownPlugin.node.mjs +4 -2
  8. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +3 -3
  9. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs +6 -17
  10. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs.map +4 -4
  11. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs +43 -0
  12. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs.map +7 -0
  13. package/dist/lib/neutral/{anchor-sort-UXN4RHFX.mjs → anchor-sort-QF7UDG2A.mjs} +4 -3
  14. package/dist/lib/neutral/anchor-sort-QF7UDG2A.mjs.map +7 -0
  15. package/dist/lib/neutral/capabilities/index.mjs +9 -13
  16. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  17. package/dist/lib/neutral/capabilities/node.mjs +5 -3
  18. package/dist/lib/neutral/capabilities/node.mjs.map +3 -3
  19. package/dist/lib/neutral/chunk-2V6A5NDQ.mjs +8 -0
  20. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs → chunk-ANHHOTCD.mjs} +3 -4
  21. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs.map → chunk-ANHHOTCD.mjs.map} +1 -1
  22. package/dist/lib/neutral/chunk-CNYFGIDS.mjs +32 -0
  23. package/dist/lib/neutral/chunk-CNYFGIDS.mjs.map +7 -0
  24. package/dist/lib/neutral/{chunk-LXNSKCPD.mjs → chunk-EV4ZOL4P.mjs} +12 -11
  25. package/dist/lib/neutral/chunk-EV4ZOL4P.mjs.map +7 -0
  26. package/dist/lib/neutral/{chunk-GUXWFDD4.mjs → chunk-OC3JD73N.mjs} +2 -2
  27. package/dist/lib/neutral/{chunk-GUXWFDD4.mjs.map → chunk-OC3JD73N.mjs.map} +1 -1
  28. package/dist/lib/neutral/chunk-YJF6XOXX.mjs +175 -0
  29. package/dist/lib/neutral/chunk-YJF6XOXX.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-YMBC62S7.mjs +14 -0
  31. package/dist/lib/neutral/chunk-YMBC62S7.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-CRKAIDRD.mjs → chunk-ZJ3GWRUJ.mjs} +15 -14
  33. package/dist/lib/neutral/chunk-ZJ3GWRUJ.mjs.map +7 -0
  34. package/dist/lib/neutral/{comment-config-EGY7RPPW.mjs → comment-config-M5OGFULS.mjs} +6 -4
  35. package/dist/lib/neutral/comment-config-M5OGFULS.mjs.map +7 -0
  36. package/dist/lib/neutral/components/index.mjs +13 -52
  37. package/dist/lib/neutral/components/index.mjs.map +4 -4
  38. package/dist/lib/neutral/containers/index.mjs +5 -3
  39. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  40. package/dist/lib/neutral/{create-XW2FQNLK.mjs → create-OQUMKL5I.mjs} +2 -2
  41. package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs → create-markdown-4O5FDA77.mjs} +2 -2
  42. package/dist/lib/neutral/{create-object-3WMEQJ2C.mjs → create-object-RSEWTCMM.mjs} +2 -6
  43. package/dist/lib/neutral/create-object-RSEWTCMM.mjs.map +7 -0
  44. package/dist/lib/neutral/hooks/index.mjs +41 -15
  45. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  46. package/dist/lib/neutral/index.mjs +10 -16
  47. package/dist/lib/neutral/meta.json +1 -1
  48. package/dist/lib/neutral/meta.mjs +1 -1
  49. package/dist/lib/neutral/{open-F7KLNKVN.mjs → open-BAZIRXII.mjs} +2 -2
  50. package/dist/lib/neutral/operation-handler-SDCXGMGK.mjs +8 -0
  51. package/dist/lib/neutral/operations/index.mjs +1 -1
  52. package/dist/lib/neutral/plugin.mjs +2 -2
  53. package/dist/lib/neutral/plugin.workerd.mjs +12 -0
  54. package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
  55. package/dist/lib/neutral/{react-surface-6LX4ZQ2H.mjs → react-surface-37GL3UVG.mjs} +4 -4
  56. package/dist/lib/neutral/react-surface-37GL3UVG.mjs.map +7 -0
  57. package/dist/lib/neutral/{scroll-to-anchor-ACND3WJU.mjs → scroll-to-anchor-I6HFE5AH.mjs} +2 -2
  58. package/dist/lib/neutral/{set-view-mode-WDC7CAEC.mjs → set-view-mode-NY5OYYIM.mjs} +2 -2
  59. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs +8 -0
  60. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs.map +7 -0
  61. package/dist/lib/neutral/skills/index.mjs +8 -0
  62. package/dist/lib/neutral/skills/index.mjs.map +7 -0
  63. package/dist/lib/neutral/{state-ZYT3JRWT.mjs → state-3BR7L6CW.mjs} +1 -1
  64. package/dist/lib/neutral/{state-ZYT3JRWT.mjs.map → state-3BR7L6CW.mjs.map} +2 -2
  65. package/dist/lib/neutral/types/index.mjs +1 -1
  66. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs +24 -0
  67. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs.map +7 -0
  68. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  69. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -1
  70. package/dist/types/src/MarkdownPlugin.workerd.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/anchor-sort.d.ts +1 -2
  72. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/comment-config.d.ts +1 -2
  74. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/create-object.d.ts +1 -7
  76. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/index.d.ts +1 -3
  79. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/node.d.ts +1 -0
  81. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  83. package/dist/types/src/capabilities/settings.d.ts +1 -2
  84. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  86. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/state.d.ts +1 -2
  88. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  89. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +3 -4
  90. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -2
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts +17 -0
  94. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts.map +1 -0
  95. package/dist/types/src/components/PreviewComponent/index.d.ts +2 -0
  96. package/dist/types/src/components/PreviewComponent/index.d.ts.map +1 -0
  97. package/dist/types/src/components/index.d.ts +1 -2
  98. package/dist/types/src/components/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +2 -13
  100. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
  101. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts +1 -1
  102. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  103. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -1
  104. package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts.map +1 -1
  105. package/dist/types/src/containers/index.d.ts +1 -0
  106. package/dist/types/src/containers/index.d.ts.map +1 -1
  107. package/dist/types/src/hooks/useExtensions.d.ts +3 -3
  108. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  110. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  111. package/dist/types/src/index.d.ts +1 -2
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +4 -0
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/operations/update-markdown.d.ts.map +1 -1
  116. package/dist/types/src/plugin.workerd.d.ts +2 -0
  117. package/dist/types/src/plugin.workerd.d.ts.map +1 -0
  118. package/dist/types/src/skills/index.d.ts +2 -0
  119. package/dist/types/src/skills/index.d.ts.map +1 -0
  120. package/dist/types/src/skills/markdown-skill.d.ts +4 -0
  121. package/dist/types/src/skills/markdown-skill.d.ts.map +1 -0
  122. package/dist/types/src/types/Markdown.d.ts +12 -20
  123. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  124. package/dist/types/src/types/MarkdownOperation.d.ts +5 -28
  125. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -1
  126. package/dist/types/src/types/types.d.ts +2 -0
  127. package/dist/types/src/types/types.d.ts.map +1 -1
  128. package/dist/types/tsconfig.tsbuildinfo +1 -1
  129. package/dx.config.ts +1 -1
  130. package/package.json +66 -59
  131. package/src/MarkdownPlugin.node.ts +2 -1
  132. package/src/MarkdownPlugin.tsx +2 -6
  133. package/src/MarkdownPlugin.workerd.ts +5 -2
  134. package/src/capabilities/anchor-sort.ts +3 -2
  135. package/src/capabilities/comment-config.ts +6 -9
  136. package/src/capabilities/create-object.ts +1 -4
  137. package/src/capabilities/editor-view-state.ts +1 -1
  138. package/src/capabilities/index.ts +1 -3
  139. package/src/capabilities/node.ts +1 -0
  140. package/src/capabilities/react-surface.tsx +9 -3
  141. package/src/capabilities/skill-definition.ts +14 -0
  142. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +72 -30
  143. package/src/components/MarkdownEditor/MarkdownEditor.tsx +11 -37
  144. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +3 -3
  145. package/src/components/PreviewComponent/PreviewComponent.tsx +195 -0
  146. package/src/components/PreviewComponent/index.ts +5 -0
  147. package/src/components/index.ts +1 -4
  148. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +3 -3
  149. package/src/containers/MarkdownCard/MarkdownCard.tsx +1 -1
  150. package/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.tsx +1 -1
  151. package/src/containers/MarkdownSettings/MarkdownSettings.tsx +54 -0
  152. package/src/containers/index.ts +1 -0
  153. package/src/hooks/useEditorMenuOptions.ts +1 -1
  154. package/src/hooks/useExtensions.tsx +32 -12
  155. package/src/hooks/useLinkQuery.ts +5 -3
  156. package/src/index.ts +1 -2
  157. package/src/operations/create.conversations.json +1 -1
  158. package/src/operations/create.test.ts +5 -12
  159. package/src/operations/update-markdown.ts +7 -27
  160. package/src/operations/update.conversations.json +1 -1
  161. package/src/operations/update.test.ts +86 -16
  162. package/src/plugin.workerd.ts +5 -0
  163. package/src/skills/index.ts +5 -0
  164. package/src/{blueprints/markdown-blueprint.ts → skills/markdown-skill.ts} +8 -7
  165. package/src/types/Markdown.ts +19 -18
  166. package/src/types/MarkdownOperation.ts +11 -5
  167. package/src/types/types.ts +2 -7
  168. package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs +0 -32
  169. package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs.map +0 -7
  170. package/dist/lib/neutral/anchor-sort-UXN4RHFX.mjs.map +0 -7
  171. package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs +0 -66
  172. package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs.map +0 -7
  173. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs +0 -15
  174. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs.map +0 -7
  175. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  176. package/dist/lib/neutral/chunk-4ULSRZRL.mjs +0 -10
  177. package/dist/lib/neutral/chunk-4ULSRZRL.mjs.map +0 -7
  178. package/dist/lib/neutral/chunk-BL46CERY.mjs +0 -8
  179. package/dist/lib/neutral/chunk-CRKAIDRD.mjs.map +0 -7
  180. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +0 -7
  181. package/dist/lib/neutral/comment-config-EGY7RPPW.mjs.map +0 -7
  182. package/dist/lib/neutral/create-object-3WMEQJ2C.mjs.map +0 -7
  183. package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs +0 -14
  184. package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs.map +0 -7
  185. package/dist/lib/neutral/react-surface-6LX4ZQ2H.mjs.map +0 -7
  186. package/dist/lib/neutral/update-markdown-FGVN3LD4.mjs +0 -44
  187. package/dist/lib/neutral/update-markdown-FGVN3LD4.mjs.map +0 -7
  188. package/dist/types/src/blueprints/index.d.ts +0 -2
  189. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  190. package/dist/types/src/blueprints/markdown-blueprint.d.ts +0 -4
  191. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +0 -1
  192. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
  193. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  194. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
  195. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  196. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -6
  197. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  198. package/dist/types/src/paths.d.ts +0 -3
  199. package/dist/types/src/paths.d.ts.map +0 -1
  200. package/src/blueprints/index.ts +0 -5
  201. package/src/capabilities/app-graph-builder.ts +0 -61
  202. package/src/capabilities/blueprint-definition.ts +0 -19
  203. package/src/capabilities/navigation-resolver.ts +0 -19
  204. package/src/components/MarkdownSettings/MarkdownSettings.tsx +0 -35
  205. package/src/paths.ts +0 -13
  206. /package/dist/lib/neutral/{chunk-BL46CERY.mjs.map → chunk-2V6A5NDQ.mjs.map} +0 -0
  207. /package/dist/lib/neutral/{create-XW2FQNLK.mjs.map → create-OQUMKL5I.mjs.map} +0 -0
  208. /package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs.map → create-markdown-4O5FDA77.mjs.map} +0 -0
  209. /package/dist/lib/neutral/{open-F7KLNKVN.mjs.map → open-BAZIRXII.mjs.map} +0 -0
  210. /package/dist/lib/neutral/{blueprints/index.mjs.map → operation-handler-SDCXGMGK.mjs.map} +0 -0
  211. /package/dist/lib/neutral/{scroll-to-anchor-ACND3WJU.mjs.map → scroll-to-anchor-I6HFE5AH.mjs.map} +0 -0
  212. /package/dist/lib/neutral/{set-view-mode-WDC7CAEC.mjs.map → set-view-mode-NY5OYYIM.mjs.map} +0 -0
  213. /package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts +0 -0
  214. /package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts +0 -0
  215. /package/src/{components → containers}/MarkdownSettings/index.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/components/index.ts", "../../../../src/components/MarkdownEditor/MarkdownEditor.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorContent.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorToolbar.tsx", "../../../../src/components/MarkdownEditor/FileUpload.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './MarkdownEditor';\n\nexport const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { URI } from '@dxos/keys';\nimport { useClient } from '@dxos/react-client';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type EditorRootProps,\n type EditorToolbarState,\n createEditorController,\n useEditorContext,\n} from '@dxos/react-ui-editor';\nimport { type PreviewBlock, type PreviewOptions } from '@dxos/ui-editor';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type DocumentType,\n type ExtensionsOptions,\n type UseEditorMenuOptionsProps,\n useEditorMenuOptions,\n useExtensions,\n} from '#hooks';\n\nimport {\n MarkdownEditorContent as NaturalMarkdownEditorContent,\n type MarkdownEditorContentProps as NaturalMarkdownEditorContentProps,\n} from './MarkdownEditorContent';\nimport {\n MarkdownEditorToolbar as NaturalMarkdownToolbar,\n type MarkdownEditorToolbarProps as NaturalMarkdownToolbarProps,\n} from './MarkdownEditorToolbar';\n\n//\n// Context\n//\n\ntype MarkdownEditorContextValue = {\n id: string;\n attendableId?: string;\n previewBlocks: PreviewBlock[];\n} & Pick<ExtensionsOptions, 'compact' | 'viewMode'> &\n Pick<NaturalMarkdownToolbarProps, 'onAction' | 'onFileUpload' | 'onViewModeChange'>;\n\nconst [MarkdownEditorContextProvider, useMarkdownEditorContext] =\n createContext<MarkdownEditorContextValue>('MarkdownEditor.Context');\n\n/**\n * Props to spread onto `Editor.Root` from `MarkdownEditorProvider`'s render callback.\n */\nexport type MarkdownEditorEditorRootProps = Omit<EditorRootProps, 'children'>;\n\n//\n// MarkdownEditorProvider\n//\n\nexport type MarkdownEditorProviderProps = {\n object?: DocumentType;\n extensions?: Extension[];\n children: (editorRootProps: MarkdownEditorEditorRootProps) => ReactNode;\n} & Pick<\n MarkdownEditorContextValue,\n 'id' | 'attendableId' | 'viewMode' | 'compact' | 'onAction' | 'onFileUpload' | 'onViewModeChange'\n> &\n Pick<UseEditorMenuOptionsProps, 'slashCommandGroups' | 'onLinkQuery'> &\n Pick<ExtensionsOptions, 'editorStateStore' | 'viewState' | 'settings' | 'onSelectObject'>;\n\nexport const MarkdownEditorProvider = ({\n children,\n id,\n attendableId,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n extensions: extensionsProp,\n slashCommandGroups,\n onLinkQuery,\n onSelectObject,\n onAction,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProviderProps) => {\n // Preview blocks.\n const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);\n const previewOptions = useMemo<PreviewOptions>(\n () => ({\n db: Obj.isObject(object) ? Obj.getDatabase(object) : undefined,\n addBlockContainer: (block) => {\n setPreviewBlocks((prev) => [...prev, block]);\n },\n removeBlockContainer: ({ link }) => {\n setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== link.dxn));\n },\n }),\n [object],\n );\n\n // Context menu options (Editor.Root calls useEditorMenu with these props).\n const menuOptions = useEditorMenuOptions({ slashCommandGroups, onLinkQuery });\n\n // Core markdown extensions (popover/menu extension is added by Editor.Root).\n const coreExtensions = useExtensions({\n id,\n object,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n previewOptions,\n settings,\n onSelectObject,\n });\n\n const extensions = useMemo(\n () => [coreExtensions, extensionsProp].filter(isNonNullable).flat(),\n [coreExtensions, extensionsProp],\n );\n\n const editorRootProps = useMemo<MarkdownEditorEditorRootProps>(\n () => ({\n extensions,\n viewMode,\n getMenu: menuOptions.getMenu,\n trigger: menuOptions.trigger,\n placeholder: menuOptions.placeholder,\n ...(menuOptions.filter !== undefined ? { filter: menuOptions.filter } : {}),\n ...(menuOptions.triggerKey !== undefined ? { triggerKey: menuOptions.triggerKey } : {}),\n }),\n [extensions, viewMode, menuOptions],\n );\n\n const markdownContextValue = useMemo<MarkdownEditorContextValue>(\n () => ({\n id,\n attendableId,\n compact,\n viewMode,\n previewBlocks,\n onAction,\n onFileUpload,\n onViewModeChange,\n }),\n [id, attendableId, compact, viewMode, previewBlocks, onAction, onFileUpload, onViewModeChange],\n );\n\n return (\n <MarkdownEditorContextProvider {...markdownContextValue}>{children(editorRootProps)}</MarkdownEditorContextProvider>\n );\n};\n\nMarkdownEditorProvider.displayName = 'MarkdownEditor.Provider';\n\n//\n// MarkdownEditor.Content\n//\n\nconst MARKDOWN_EDITOR_CONTENT_NAME = 'MarkdownEditor.Content';\n\ntype MarkdownEditorContentProps = Omit<NaturalMarkdownEditorContentProps, 'id' | 'extensions' | 'toolbarState'>;\n\nconst MarkdownEditorContent = composable<HTMLDivElement, MarkdownEditorContentProps>(\n ({ compact: compactProp, ...props }, _forwardedRef) => {\n const {\n id,\n attendableId,\n compact = compactProp,\n viewMode,\n onFileUpload,\n } = useMarkdownEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n const { extensions, setController, state } = useEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n\n const handleRef = useCallback(\n (view: EditorView | null) => {\n setController(createEditorController(view));\n },\n [setController],\n );\n\n return (\n <NaturalMarkdownEditorContent\n {...composableProps(props)}\n id={id}\n attendableId={attendableId}\n compact={compact}\n viewMode={viewMode}\n toolbarState={state as Atom.Writable<EditorToolbarState>}\n extensions={extensions}\n onFileUpload={onFileUpload}\n ref={handleRef}\n />\n );\n },\n);\n\nMarkdownEditorContent.displayName = MARKDOWN_EDITOR_CONTENT_NAME;\n\n//\n// MarkdownEditor.Toolbar\n//\n\nconst MARKDOWN_EDITOR_TOOLBAR_NAME = 'MarkdownEditor.Toolbar';\n\ntype MarkdownEditorToolbarProps = ThemedClassName<\n Omit<NaturalMarkdownToolbarProps, 'getView' | 'onAction' | 'onFileUpload' | 'onViewModeChange' | 'id'>\n>;\n\nconst MarkdownEditorToolbar = (props: MarkdownEditorToolbarProps) => {\n const { id, attendableId, onAction, onFileUpload, onViewModeChange } =\n useMarkdownEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n const { controller } = useEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n // Stable getter identity (changes only when the controller does) so the FileUpload effect, whose\n // deps include `getView`, does not re-run every render and re-upload the same file.\n const getView = useCallback(() => controller?.view ?? null, [controller]);\n\n return (\n <NaturalMarkdownToolbar\n {...props}\n id={attendableId ?? id}\n getView={getView}\n onAction={onAction}\n onFileUpload={onFileUpload}\n onViewModeChange={onViewModeChange}\n />\n );\n};\n\nMarkdownEditorToolbar.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;\n\n//\n// MarkdownEditor.Blocks (embedded objects)\n//\n\nconst MARKDOWN_EDITOR_BLOCKS_NAME = 'MarkdownEditor.Blocks';\n\ntype MarkdownEditorBlocksProps = {};\n\nconst MarkdownEditorBlocks = (_props: MarkdownEditorBlocksProps) => {\n const { previewBlocks } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);\n\n return (\n <>\n {previewBlocks.map(({ link, el }) => (\n <PreviewBlock key={link.dxn} link={link} el={el} />\n ))}\n </>\n );\n};\n\nMarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;\n\nconst PreviewBlock = ({ el, link }: PreviewBlock) => {\n const client = useClient();\n const dxn = URI.make(link.dxn);\n const subject = client.graph.makeRef(dxn).target;\n const data = useMemo(() => ({ subject }), [subject]);\n\n return createPortal(<Surface.Surface type={AppSurface.CardContent} data={data} limit={1} />, el);\n};\n\n//\n// MarkdownEditor\n//\n\n/** @private */\nexport const MarkdownEditor = {\n Content: MarkdownEditorContent,\n Toolbar: MarkdownEditorToolbar,\n Blocks: MarkdownEditorBlocks,\n};\n\nexport type { MarkdownEditorContentProps, MarkdownEditorToolbarProps, MarkdownEditorBlocksProps };\n\n/** @deprecated Use `MarkdownEditorProviderProps`. */\nexport type MarkdownEditorRootProps = MarkdownEditorProviderProps;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type EditorToolbarState,\n type UseTextEditorProps,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport {\n type EditorSelectionState,\n type EditorStateStore,\n type ThemeExtensionsOptions,\n mobileSlots,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n documentSlots,\n formattingListener,\n processEditorPayload,\n editorClassNames,\n scrollbarAutohide,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\nimport { mx } from '@dxos/ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { MarkdownCapabilities } from '#types';\n\nimport { type MarkdownEditorToolbarProps } from './MarkdownEditorToolbar';\n\nexport type MarkdownEditorContentProps = ThemedClassName<{\n id: string;\n attendableId?: string;\n role?: string;\n compact?: boolean;\n viewMode?: EditorViewMode;\n slashCommandGroups?: EditorMenuGroup[];\n editorStateStore?: EditorStateStore;\n toolbarState?: Atom.Writable<EditorToolbarState>;\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n}> &\n Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Pick<MarkdownEditorToolbarProps, 'onFileUpload'> &\n Pick<ThemeExtensionsOptions, 'slots'>;\n\n// TODO(burdon): Move controller to Root.\nexport const MarkdownEditorContent = forwardRef<EditorView | null, MarkdownEditorContentProps>(\n (\n {\n classNames,\n id,\n attendableId,\n role,\n compact,\n viewMode,\n initialValue,\n editorStateStore,\n toolbarState,\n extensions,\n slots,\n onFileUpload,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.profile.key);\n const { themeMode } = useThemeContext();\n const registry = useContext(RegistryContext);\n\n // Callback to update toolbar state atom.\n const updateToolbarState = useCallback(\n (formatting: EditorToolbarState) => {\n if (toolbarState) {\n registry.set(toolbarState, { ...registry.get(toolbarState), ...formatting });\n }\n },\n [registry, toolbarState],\n );\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n ...(role !== AppSurface.Section.role && {\n id,\n scrollTo,\n selection,\n selectionEnd: true,\n }),\n initialValue,\n extensions: [\n createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor.placeholder'),\n scrollPastEnd: !compact,\n search: true,\n }),\n createThemeExtensions({\n themeMode,\n slots: slots ?? (compact ? mobileSlots : documentSlots),\n syntaxHighlighting: true,\n }),\n createMarkdownExtensions(),\n scrollbarAutohide(),\n toolbarState && formattingListener(updateToolbarState),\n role !== AppSurface.Section.role &&\n onFileUpload &&\n dropFile({\n // TODO(wittjosiah): Factor out to file uploader plugin.\n onDrop: async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processEditorPayload(view, { type: 'image', data: info.url });\n }\n },\n }),\n extensions,\n ].filter(isTruthy),\n }),\n [id, viewMode, themeMode, extensions, compact],\n );\n\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => editorView, [editorView]);\n\n const [editorViewRegistry] = useCapabilities(MarkdownCapabilities.EditorViews);\n useEffect(() => {\n if (editorView && editorViewRegistry) {\n editorViewRegistry.register(attendableId ?? id, editorView, id);\n return () => editorViewRegistry.unregister(attendableId ?? id);\n }\n }, [editorView, editorViewRegistry, attendableId, id]);\n\n useTest(editorView);\n\n return (\n <div\n {...focusAttributes}\n className={mx(editorClassNames(role), classNames)}\n data-testid='composer.markdownRoot'\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view: EditorView | null) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { useCallback, useState } from 'react';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Editor, type EditorToolbarProps } from '@dxos/react-ui-editor';\n\nimport { FileUpload, type FileUploadAction } from './FileUpload';\n\nexport type MarkdownEditorToolbarProps = {\n id: string;\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n} & Pick<EditorToolbarProps, 'role' | 'customActions' | 'onAction' | 'onViewModeChange'>;\n\nexport const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(\n ({ id, role, getView, customActions, onAction, onFileUpload, onViewModeChange, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n const [upload, setUpload] = useState<FileUploadAction | null>(null);\n const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);\n\n if (!getView?.()) {\n return <div className={className} {...rest} ref={forwardedRef} />;\n }\n\n return (\n <div className='contents' ref={forwardedRef}>\n <Editor.Toolbar\n {...rest}\n classNames={className}\n attendableId={id}\n role={role}\n customActions={customActions}\n onAction={onAction}\n onImageUpload={upload ?? undefined}\n onViewModeChange={onViewModeChange}\n />\n\n {onFileUpload && <FileUpload ref={uploadRef} getView={getView} onFileUpload={onFileUpload} />}\n </div>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDropzone } from 'react-dropzone';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { addLink } from '@dxos/ui-editor';\n\nexport const IMAGE_FILES = ['.jpg', '.jpeg', '.png', '.gif'];\n\nexport type FileUploadAction = () => void;\n\nexport type FileUploadProps = {\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n};\n\n// TODO(burdon): Factor out.\n// TODO(burdon): Move to root? (support drag into document via dropzone).\nexport const FileUpload = forwardRef<FileUploadAction, FileUploadProps>(({ getView, onFileUpload }, forwardedRef) => {\n // https://react-dropzone.js.org\n const { acceptedFiles, open, inputRef } = useDropzone({\n disabled: !onFileUpload,\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': IMAGE_FILES,\n },\n });\n\n useImperativeHandle(forwardedRef, () => open, []);\n\n useEffect(() => {\n if (acceptedFiles.length && onFileUpload) {\n requestAnimationFrame(async () => {\n const editorView = getView?.();\n if (!editorView) {\n return;\n }\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n // TODO(burdon): Factor out.\n const info = await onFileUpload(file);\n if (info) {\n addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [getView, acceptedFiles, onFileUpload]);\n\n if (!onFileUpload) {\n return null;\n }\n\n return <>{createPortal(<input ref={inputRef} />, document.body)} </>;\n});\n"],
5
- "mappings": "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",
6
- "names": ["lazy", "createContext", "React", "useCallback", "useMemo", "useState", "createPortal", "Surface", "AppSurface", "Obj", "URI", "useClient", "composable", "composableProps", "createEditorController", "useEditorContext", "isNonNullable", "useEditorMenuOptions", "useExtensions", "RegistryContext", "React", "forwardRef", "useCallback", "useContext", "useEffect", "useImperativeHandle", "useMemo", "useCapabilities", "AppSurface", "useThemeContext", "useTranslation", "useTextEditor", "mobileSlots", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "documentSlots", "formattingListener", "processEditorPayload", "editorClassNames", "scrollbarAutohide", "mx", "isTruthy", "meta", "MarkdownCapabilities", "MarkdownEditorContent", "classNames", "id", "attendableId", "role", "compact", "viewMode", "initialValue", "editorStateStore", "toolbarState", "extensions", "slots", "onFileUpload", "forwardedRef", "t", "profile", "key", "themeMode", "registry", "updateToolbarState", "formatting", "set", "get", "scrollTo", "selection", "getState", "parentRef", "view", "editorView", "focusAttributes", "Section", "selectionEnd", "readOnly", "placeholder", "scrollPastEnd", "search", "syntaxHighlighting", "onDrop", "files", "file", "info", "undefined", "type", "data", "url", "filter", "editorViewRegistry", "EditorViews", "register", "unregister", "useTest", "div", "className", "data-testid", "data-popover-collision-boundary", "ref", "composer", "window", "React", "useCallback", "useState", "composable", "composableProps", "Editor", "React", "forwardRef", "useEffect", "useImperativeHandle", "createPortal", "useDropzone", "addLink", "IMAGE_FILES", "FileUpload", "getView", "onFileUpload", "forwardedRef", "acceptedFiles", "open", "inputRef", "disabled", "multiple", "noDrag", "accept", "length", "requestAnimationFrame", "editorView", "f", "file", "File", "name", "type", "lastModified", "info", "url", "image", "input", "ref", "document", "body", "MarkdownEditorToolbar", "composable", "id", "role", "getView", "customActions", "onAction", "onFileUpload", "onViewModeChange", "props", "forwardedRef", "className", "rest", "composableProps", "upload", "setUpload", "useState", "uploadRef", "useCallback", "next", "React", "div", "ref", "Editor", "Toolbar", "classNames", "attendableId", "onImageUpload", "undefined", "FileUpload", "MarkdownEditorContextProvider", "useMarkdownEditorContext", "createContext", "MarkdownEditorProvider", "children", "id", "attendableId", "object", "settings", "compact", "viewMode", "viewState", "editorStateStore", "extensions", "extensionsProp", "slashCommandGroups", "onLinkQuery", "onSelectObject", "onAction", "onFileUpload", "onViewModeChange", "previewBlocks", "setPreviewBlocks", "useState", "previewOptions", "useMemo", "db", "Obj", "isObject", "getDatabase", "undefined", "addBlockContainer", "block", "prev", "removeBlockContainer", "link", "filter", "prevLink", "dxn", "menuOptions", "useEditorMenuOptions", "coreExtensions", "useExtensions", "isNonNullable", "flat", "editorRootProps", "getMenu", "trigger", "placeholder", "triggerKey", "markdownContextValue", "React", "displayName", "MARKDOWN_EDITOR_CONTENT_NAME", "MarkdownEditorContent", "composable", "compactProp", "props", "_forwardedRef", "setController", "state", "useEditorContext", "handleRef", "useCallback", "view", "createEditorController", "NaturalMarkdownEditorContent", "composableProps", "toolbarState", "ref", "MARKDOWN_EDITOR_TOOLBAR_NAME", "MarkdownEditorToolbar", "controller", "getView", "NaturalMarkdownToolbar", "MARKDOWN_EDITOR_BLOCKS_NAME", "MarkdownEditorBlocks", "_props", "map", "el", "PreviewBlock", "key", "client", "useClient", "URI", "make", "subject", "graph", "makeRef", "target", "data", "createPortal", "Surface", "type", "AppSurface", "CardContent", "limit", "MarkdownEditor", "Content", "Toolbar", "Blocks", "MarkdownSettings", "lazy"]
3
+ "sources": ["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorContent.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorToolbar.tsx", "../../../../src/components/MarkdownEditor/FileUpload.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type EditorRootProps,\n type EditorToolbarState,\n createEditorController,\n useEditorContext,\n} from '@dxos/react-ui-editor';\nimport { type XmlWidgetState } from '@dxos/ui-editor';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type DocumentType,\n type ExtensionsOptions,\n type UseEditorMenuOptionsProps,\n useEditorMenuOptions,\n useExtensions,\n} from '#hooks';\n\nimport {\n MarkdownEditorContent as NaturalMarkdownEditorContent,\n type MarkdownEditorContentProps as NaturalMarkdownEditorContentProps,\n} from './MarkdownEditorContent';\nimport {\n MarkdownEditorToolbar as NaturalMarkdownToolbar,\n type MarkdownEditorToolbarProps as NaturalMarkdownToolbarProps,\n} from './MarkdownEditorToolbar';\n\n//\n// Context\n//\n\ntype MarkdownEditorContextValue = {\n id: string;\n attendableId?: string;\n widgets: XmlWidgetState[];\n} & Pick<ExtensionsOptions, 'compact' | 'viewMode'> &\n Pick<NaturalMarkdownToolbarProps, 'onAction' | 'onFileUpload' | 'onViewModeChange'>;\n\nconst [MarkdownEditorContextProvider, useMarkdownEditorContext] =\n createContext<MarkdownEditorContextValue>('MarkdownEditor.Context');\n\n/**\n * Props to spread onto `Editor.Root` from `MarkdownEditorProvider`'s render callback.\n */\nexport type MarkdownEditorEditorRootProps = Omit<EditorRootProps, 'children'>;\n\n//\n// MarkdownEditorProvider\n//\n\nexport type MarkdownEditorProviderProps = {\n object?: DocumentType;\n extensions?: Extension[];\n children: (editorRootProps: MarkdownEditorEditorRootProps) => ReactNode;\n} & Pick<\n MarkdownEditorContextValue,\n 'id' | 'attendableId' | 'viewMode' | 'compact' | 'onAction' | 'onFileUpload' | 'onViewModeChange'\n> &\n Pick<UseEditorMenuOptionsProps, 'slashCommandGroups' | 'onLinkQuery'> &\n Pick<ExtensionsOptions, 'editorStateStore' | 'viewState' | 'settings' | 'onSelectObject'>;\n\nexport const MarkdownEditorProvider = ({\n children,\n id,\n attendableId,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n extensions: extensionsProp,\n slashCommandGroups,\n onLinkQuery,\n onSelectObject,\n onAction,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProviderProps) => {\n // Widget portals driven by xmlTags.\n const [widgets, setWidgets] = useState<XmlWidgetState[]>([]);\n\n // Context menu options (Editor.Root calls useEditorMenu with these props).\n const menuOptions = useEditorMenuOptions({ slashCommandGroups, onLinkQuery });\n\n // Core markdown extensions (popover/menu extension is added by Editor.Root).\n const coreExtensions = useExtensions({\n id,\n object,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n setWidgets,\n settings,\n onSelectObject,\n });\n\n const extensions = useMemo(\n () => [coreExtensions, extensionsProp].filter(isNonNullable).flat(),\n [coreExtensions, extensionsProp],\n );\n\n const editorRootProps = useMemo<MarkdownEditorEditorRootProps>(\n () => ({\n extensions,\n viewMode,\n getMenu: menuOptions.getMenu,\n trigger: menuOptions.trigger,\n placeholder: menuOptions.placeholder,\n ...(menuOptions.filter !== undefined ? { filter: menuOptions.filter } : {}),\n ...(menuOptions.triggerKey !== undefined ? { triggerKey: menuOptions.triggerKey } : {}),\n }),\n [extensions, viewMode, menuOptions],\n );\n\n const markdownContextValue = useMemo<MarkdownEditorContextValue>(\n () => ({\n id,\n attendableId,\n compact,\n viewMode,\n widgets,\n onAction,\n onFileUpload,\n onViewModeChange,\n }),\n [id, attendableId, compact, viewMode, widgets, onAction, onFileUpload, onViewModeChange],\n );\n\n return (\n <MarkdownEditorContextProvider {...markdownContextValue}>{children(editorRootProps)}</MarkdownEditorContextProvider>\n );\n};\n\nMarkdownEditorProvider.displayName = 'MarkdownEditor.Provider';\n\n//\n// MarkdownEditor.Content\n//\n\nconst MARKDOWN_EDITOR_CONTENT_NAME = 'MarkdownEditor.Content';\n\ntype MarkdownEditorContentProps = Omit<NaturalMarkdownEditorContentProps, 'id' | 'extensions' | 'toolbarState'>;\n\nconst MarkdownEditorContent = composable<HTMLDivElement, MarkdownEditorContentProps>(\n ({ compact: compactProp, ...props }, _forwardedRef) => {\n const {\n id,\n attendableId,\n compact = compactProp,\n viewMode,\n onFileUpload,\n } = useMarkdownEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n const { extensions, setController, state } = useEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n\n const handleRef = useCallback(\n (view: EditorView | null) => {\n setController(createEditorController(view));\n },\n [setController],\n );\n\n return (\n <NaturalMarkdownEditorContent\n {...composableProps(props)}\n id={id}\n attendableId={attendableId}\n compact={compact}\n viewMode={viewMode}\n toolbarState={state as Atom.Writable<EditorToolbarState>}\n extensions={extensions}\n onFileUpload={onFileUpload}\n ref={handleRef}\n />\n );\n },\n);\n\nMarkdownEditorContent.displayName = MARKDOWN_EDITOR_CONTENT_NAME;\n\n//\n// MarkdownEditor.Toolbar\n//\n\nconst MARKDOWN_EDITOR_TOOLBAR_NAME = 'MarkdownEditor.Toolbar';\n\ntype MarkdownEditorToolbarProps = ThemedClassName<\n Omit<NaturalMarkdownToolbarProps, 'getView' | 'onAction' | 'onFileUpload' | 'onViewModeChange' | 'id'>\n>;\n\nconst MarkdownEditorToolbar = (props: MarkdownEditorToolbarProps) => {\n const { id, attendableId, onAction, onFileUpload, onViewModeChange } =\n useMarkdownEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n const { controller } = useEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n // Stable getter identity (changes only when the controller does) so the FileUpload effect, whose\n // deps include `getView`, does not re-run every render and re-upload the same file.\n const getView = useCallback(() => controller?.view ?? null, [controller]);\n\n return (\n <NaturalMarkdownToolbar\n {...props}\n id={attendableId ?? id}\n getView={getView}\n onAction={onAction}\n onFileUpload={onFileUpload}\n onViewModeChange={onViewModeChange}\n />\n );\n};\n\nMarkdownEditorToolbar.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;\n\n//\n// MarkdownEditor.Blocks (embedded objects)\n//\n\nconst MARKDOWN_EDITOR_BLOCKS_NAME = 'MarkdownEditor.Blocks';\n\ntype MarkdownEditorBlocksProps = {};\n\nconst MarkdownEditorBlocks = (_props: MarkdownEditorBlocksProps) => {\n const { widgets } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);\n\n return (\n <>\n {widgets.map(({ id, root, Component, props }) => (\n <div key={id}>{createPortal(<Component {...props} />, root)}</div>\n ))}\n </>\n );\n};\n\nMarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;\n\n//\n// MarkdownEditor\n//\n\n/** @private */\nexport const MarkdownEditor = {\n Content: MarkdownEditorContent,\n Toolbar: MarkdownEditorToolbar,\n Blocks: MarkdownEditorBlocks,\n};\n\nexport type { MarkdownEditorBlocksProps, MarkdownEditorContentProps, MarkdownEditorToolbarProps };\n\n/** @deprecated Use `MarkdownEditorProviderProps`. */\nexport type MarkdownEditorRootProps = MarkdownEditorProviderProps;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type EditorToolbarState,\n type UseTextEditorProps,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport {\n type EditorSelectionState,\n type EditorStateStore,\n type ThemeExtensionsOptions,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n documentSlots,\n dropFile,\n editorClassNames,\n formattingListener,\n mobileSlots,\n processEditorPayload,\n scrollbarAutohide,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\nimport { mx } from '@dxos/ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { MarkdownCapabilities } from '#types';\n\nimport { type MarkdownEditorToolbarProps } from './MarkdownEditorToolbar';\n\nexport type MarkdownEditorContentProps = ThemedClassName<{\n id: string;\n attendableId?: string;\n role?: string;\n compact?: boolean;\n viewMode?: EditorViewMode;\n slashCommandGroups?: EditorMenuGroup[];\n editorStateStore?: EditorStateStore;\n toolbarState?: Atom.Writable<EditorToolbarState>;\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n}> &\n Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Pick<MarkdownEditorToolbarProps, 'onFileUpload'> &\n Pick<ThemeExtensionsOptions, 'slots'>;\n\n// TODO(burdon): Move controller to Root.\nexport const MarkdownEditorContent = forwardRef<EditorView | null, MarkdownEditorContentProps>(\n (\n {\n classNames,\n id,\n attendableId,\n role,\n compact,\n viewMode,\n initialValue,\n editorStateStore,\n toolbarState,\n extensions,\n slots,\n onFileUpload,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.profile.key);\n const { themeMode } = useThemeContext();\n const registry = useContext(RegistryContext);\n\n // Callback to update toolbar state atom.\n const updateToolbarState = useCallback(\n (formatting: EditorToolbarState) => {\n if (toolbarState) {\n registry.set(toolbarState, { ...registry.get(toolbarState), ...formatting });\n }\n },\n [registry, toolbarState],\n );\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n ...(role !== AppSurface.Section.role && {\n id,\n scrollTo,\n selection,\n selectionEnd: true,\n }),\n initialValue,\n extensions: [\n createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor.placeholder'),\n scrollPastEnd: !compact,\n search: true,\n }),\n createThemeExtensions({\n themeMode,\n slots: slots ?? (compact ? mobileSlots : documentSlots),\n syntaxHighlighting: true,\n }),\n createMarkdownExtensions(),\n scrollbarAutohide(),\n toolbarState && formattingListener(updateToolbarState),\n role !== AppSurface.Section.role &&\n onFileUpload &&\n dropFile({\n // TODO(wittjosiah): Factor out to file uploader plugin.\n onDrop: async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processEditorPayload(view, { type: 'image', data: info.url });\n }\n },\n }),\n extensions,\n ].filter(isTruthy),\n }),\n [id, viewMode, themeMode, extensions, compact],\n );\n\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => editorView, [editorView]);\n\n const [editorViewRegistry] = useCapabilities(MarkdownCapabilities.EditorViews);\n useEffect(() => {\n if (editorView && editorViewRegistry) {\n editorViewRegistry.register(attendableId ?? id, editorView, id);\n return () => editorViewRegistry.unregister(attendableId ?? id);\n }\n }, [editorView, editorViewRegistry, attendableId, id]);\n\n useTest(editorView);\n\n return (\n <div\n {...focusAttributes}\n className={mx(editorClassNames(role), classNames)}\n data-testid='composer.markdownRoot'\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view: EditorView | null) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { useCallback, useState } from 'react';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Editor, type EditorToolbarProps } from '@dxos/react-ui-editor';\n\nimport { FileUpload, type FileUploadAction } from './FileUpload';\n\nexport type MarkdownEditorToolbarProps = {\n id: string;\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n} & Pick<EditorToolbarProps, 'role' | 'customActions' | 'onAction' | 'onViewModeChange'>;\n\nexport const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(\n ({ id, role, getView, customActions, onAction, onFileUpload, onViewModeChange, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n const [upload, setUpload] = useState<FileUploadAction | null>(null);\n const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);\n\n if (!getView?.()) {\n return <div className={className} {...rest} ref={forwardedRef} />;\n }\n\n return (\n <div className='contents' ref={forwardedRef}>\n <Editor.Toolbar\n {...rest}\n classNames={className}\n attendableId={id}\n role={role}\n customActions={customActions}\n onAction={onAction}\n onImageUpload={upload ?? undefined}\n onViewModeChange={onViewModeChange}\n />\n\n {onFileUpload && <FileUpload ref={uploadRef} getView={getView} onFileUpload={onFileUpload} />}\n </div>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDropzone } from 'react-dropzone';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { addLink } from '@dxos/ui-editor';\n\nexport const IMAGE_FILES = ['.jpg', '.jpeg', '.png', '.gif'];\n\nexport type FileUploadAction = () => void;\n\nexport type FileUploadProps = {\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n};\n\n// TODO(burdon): Factor out.\n// TODO(burdon): Move to root? (support drag into document via dropzone).\nexport const FileUpload = forwardRef<FileUploadAction, FileUploadProps>(({ getView, onFileUpload }, forwardedRef) => {\n // https://react-dropzone.js.org\n const { acceptedFiles, open, inputRef } = useDropzone({\n disabled: !onFileUpload,\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': IMAGE_FILES,\n },\n });\n\n useImperativeHandle(forwardedRef, () => open, []);\n\n useEffect(() => {\n if (acceptedFiles.length && onFileUpload) {\n requestAnimationFrame(async () => {\n const editorView = getView?.();\n if (!editorView) {\n return;\n }\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n // TODO(burdon): Factor out.\n const info = await onFileUpload(file);\n if (info) {\n addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [getView, acceptedFiles, onFileUpload]);\n\n if (!onFileUpload) {\n return null;\n }\n\n return <>{createPortal(<input ref={inputRef} />, document.body)} </>;\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "React", "useCallback", "useMemo", "useState", "createPortal", "composable", "composableProps", "createEditorController", "useEditorContext", "isNonNullable", "useEditorMenuOptions", "useExtensions", "RegistryContext", "React", "forwardRef", "useCallback", "useContext", "useEffect", "useImperativeHandle", "useMemo", "useCapabilities", "AppSurface", "useThemeContext", "useTranslation", "useTextEditor", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "documentSlots", "dropFile", "editorClassNames", "formattingListener", "mobileSlots", "processEditorPayload", "scrollbarAutohide", "mx", "isTruthy", "meta", "MarkdownCapabilities", "MarkdownEditorContent", "classNames", "id", "attendableId", "role", "compact", "viewMode", "initialValue", "editorStateStore", "toolbarState", "extensions", "slots", "onFileUpload", "forwardedRef", "t", "profile", "key", "themeMode", "registry", "updateToolbarState", "formatting", "set", "get", "scrollTo", "selection", "getState", "parentRef", "view", "editorView", "focusAttributes", "Section", "selectionEnd", "readOnly", "placeholder", "scrollPastEnd", "search", "syntaxHighlighting", "onDrop", "files", "file", "info", "undefined", "type", "data", "url", "filter", "editorViewRegistry", "EditorViews", "register", "unregister", "useTest", "div", "className", "data-testid", "data-popover-collision-boundary", "ref", "composer", "window", "React", "useCallback", "useState", "composable", "composableProps", "Editor", "React", "forwardRef", "useEffect", "useImperativeHandle", "createPortal", "useDropzone", "addLink", "IMAGE_FILES", "FileUpload", "getView", "onFileUpload", "forwardedRef", "acceptedFiles", "open", "inputRef", "disabled", "multiple", "noDrag", "accept", "length", "requestAnimationFrame", "editorView", "f", "file", "File", "name", "type", "lastModified", "info", "url", "image", "input", "ref", "document", "body", "MarkdownEditorToolbar", "composable", "id", "role", "getView", "customActions", "onAction", "onFileUpload", "onViewModeChange", "props", "forwardedRef", "className", "rest", "composableProps", "upload", "setUpload", "useState", "uploadRef", "useCallback", "next", "React", "div", "ref", "Editor", "Toolbar", "classNames", "attendableId", "onImageUpload", "undefined", "FileUpload", "MarkdownEditorContextProvider", "useMarkdownEditorContext", "createContext", "MarkdownEditorProvider", "children", "id", "attendableId", "object", "settings", "compact", "viewMode", "viewState", "editorStateStore", "extensions", "extensionsProp", "slashCommandGroups", "onLinkQuery", "onSelectObject", "onAction", "onFileUpload", "onViewModeChange", "widgets", "setWidgets", "useState", "menuOptions", "useEditorMenuOptions", "coreExtensions", "useExtensions", "useMemo", "filter", "isNonNullable", "flat", "editorRootProps", "getMenu", "trigger", "placeholder", "undefined", "triggerKey", "markdownContextValue", "React", "displayName", "MARKDOWN_EDITOR_CONTENT_NAME", "MarkdownEditorContent", "composable", "compactProp", "props", "_forwardedRef", "setController", "state", "useEditorContext", "handleRef", "useCallback", "view", "createEditorController", "NaturalMarkdownEditorContent", "composableProps", "toolbarState", "ref", "MARKDOWN_EDITOR_TOOLBAR_NAME", "MarkdownEditorToolbar", "controller", "getView", "NaturalMarkdownToolbar", "MARKDOWN_EDITOR_BLOCKS_NAME", "MarkdownEditorBlocks", "_props", "map", "root", "Component", "div", "key", "createPortal", "MarkdownEditor", "Content", "Toolbar", "Blocks"]
7
7
  }
@@ -2,12 +2,14 @@ import "../chunk-J5LGTIGS.mjs";
2
2
 
3
3
  // src/containers/index.ts
4
4
  import { lazy } from "react";
5
- var MarkdownCard = lazy(() => import("../MarkdownCard-OYO2HYZF.mjs"));
5
+ var MarkdownCard = lazy(() => import("../MarkdownCard-2HUXCGZP.mjs"));
6
6
  var EditableMarkdownCard = lazy(() => import("../EditableMarkdownCard-AW7MD35U.mjs"));
7
- var MarkdownArticle = lazy(() => import("../MarkdownArticle-I4UMD7AA.mjs"));
7
+ var MarkdownArticle = lazy(() => import("../MarkdownArticle-ZHBXH7YF.mjs"));
8
+ var MarkdownSettings = lazy(() => import("../MarkdownSettings-5VMOYMND.mjs"));
8
9
  export {
9
10
  EditableMarkdownCard,
10
11
  MarkdownArticle,
11
- MarkdownCard
12
+ MarkdownCard,
13
+ MarkdownSettings
12
14
  };
13
15
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/containers/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport type { MarkdownArticleProps } from './MarkdownArticle';\n\nexport const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));\nexport const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));\nexport const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));\n"],
5
- "mappings": ";;;AAIA,SAA6BA,YAAY;AAIlC,IAAMC,eAAmCD,KAAK,MAAM,OAAO,8BAAA,CAAA;AAC3D,IAAME,uBAA2CF,KAAK,MAAM,OAAO,sCAAA,CAAA;AACnE,IAAMG,kBAAsCH,KAAK,MAAM,OAAO,iCAAA,CAAA;",
6
- "names": ["lazy", "MarkdownCard", "EditableMarkdownCard", "MarkdownArticle"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport type { MarkdownArticleProps } from './MarkdownArticle';\n\nexport const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));\nexport const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));\nexport const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));\nexport const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));\n"],
5
+ "mappings": ";;;AAIA,SAA6BA,YAAY;AAIlC,IAAMC,eAAmCD,KAAK,MAAM,OAAO,8BAAA,CAAA;AAC3D,IAAME,uBAA2CF,KAAK,MAAM,OAAO,sCAAA,CAAA;AACnE,IAAMG,kBAAsCH,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAMI,mBAAuCJ,KAAK,MAAM,OAAO,kCAAA,CAAA;",
6
+ "names": ["lazy", "MarkdownCard", "EditableMarkdownCard", "MarkdownArticle", "MarkdownSettings"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MarkdownOperation_exports,
3
3
  Markdown_exports
4
- } from "./chunk-CRKAIDRD.mjs";
4
+ } from "./chunk-ZJ3GWRUJ.mjs";
5
5
  import "./chunk-J5LGTIGS.mjs";
6
6
 
7
7
  // src/operations/create.ts
@@ -26,4 +26,4 @@ var create_default = handler;
26
26
  export {
27
27
  create_default as default
28
28
  };
29
- //# sourceMappingURL=create-XW2FQNLK.mjs.map
29
+ //# sourceMappingURL=create-OQUMKL5I.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MarkdownOperation_exports,
3
3
  Markdown_exports
4
- } from "./chunk-CRKAIDRD.mjs";
4
+ } from "./chunk-ZJ3GWRUJ.mjs";
5
5
  import "./chunk-J5LGTIGS.mjs";
6
6
 
7
7
  // src/operations/create-markdown.ts
@@ -17,4 +17,4 @@ var create_markdown_default = handler;
17
17
  export {
18
18
  create_markdown_default as default
19
19
  };
20
- //# sourceMappingURL=create-markdown-KLSVQCT7.mjs.map
20
+ //# sourceMappingURL=create-markdown-4O5FDA77.mjs.map
@@ -1,6 +1,3 @@
1
- import {
2
- getDocumentsPath
3
- } from "./chunk-4ULSRZRL.mjs";
4
1
  import "./chunk-J5LGTIGS.mjs";
5
2
 
6
3
  // src/capabilities/create-object.ts
@@ -19,8 +16,7 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
19
16
  return yield* Operation.invoke(SpaceOperation.AddObject, {
20
17
  object,
21
18
  target: options.target,
22
- hidden: true,
23
- targetNodeId: options.targetNodeId ?? getDocumentsPath(options.db.spaceId)
19
+ targetNodeId: options.targetNodeId
24
20
  });
25
21
  })
26
22
  });
@@ -28,4 +24,4 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
28
24
  export {
29
25
  create_object_default as default
30
26
  };
31
- //# sourceMappingURL=create-object-3WMEQJ2C.mjs.map
27
+ //# sourceMappingURL=create-object-RSEWTCMM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/create-object.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\n\nimport { Markdown } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Markdown.Document),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Markdown.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAElC,SAASC,gBAAgB;AAEzB,IAAA,wBAAeL,WAAWM,WACjBC,kBAAW,aAAA;AAChB,SAAOP,WAAWQ,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIR,KAAKS,YAAYN,SAASO,QAAQ;IACtCC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASZ,SAASa,KAAKJ,KAAAA;AAC7B,aAAO,OAAOb,UAAUkB,OAAOhB,eAAeiB,WAAW;QACvDH;QACAI,QAAQN,QAAQM;QAChBC,cAAcP,QAAQO;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Operation", "Type", "SpaceOperation", "SpaceCapabilities", "Markdown", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "Document", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "targetNodeId"]
7
+ }
@@ -3,7 +3,10 @@ import {
3
3
  } from "../chunk-KDN4GKG2.mjs";
4
4
  import {
5
5
  Markdown_exports
6
- } from "../chunk-CRKAIDRD.mjs";
6
+ } from "../chunk-ZJ3GWRUJ.mjs";
7
+ import {
8
+ PreviewComponent
9
+ } from "../chunk-YJF6XOXX.mjs";
7
10
  import "../chunk-J5LGTIGS.mjs";
8
11
 
9
12
  // src/hooks/useEditorMenuOptions.ts
@@ -22,8 +25,8 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
22
25
  case "/":
23
26
  default: {
24
27
  return filterMenuGroups([
25
- formattingCommands,
26
28
  linkSlashCommands,
29
+ formattingCommands,
27
30
  ...slashCommandGroups ?? []
28
31
  ], (item) => text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
29
32
  }
@@ -66,7 +69,7 @@ import { useMemo as useMemo2 } from "react";
66
69
  import { Paths } from "@dxos/app-toolkit";
67
70
  import { debounceAndThrottle } from "@dxos/async";
68
71
  import { Obj } from "@dxos/echo";
69
- import { createDocAccessor } from "@dxos/echo-client";
72
+ import { Doc } from "@dxos/echo-doc";
70
73
  import { invariant } from "@dxos/invariant";
71
74
  import { getSpace, useObject } from "@dxos/react-client/echo";
72
75
  import { useIdentity } from "@dxos/react-client/halo";
@@ -74,11 +77,11 @@ import { useThemeContext } from "@dxos/react-ui";
74
77
  import { selectionAspect } from "@dxos/react-ui-attention";
75
78
  import { Text } from "@dxos/schema";
76
79
  import { Domino as Domino2 } from "@dxos/ui";
77
- import { Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, replacer, selectionState, snippets } from "@dxos/ui-editor";
80
+ import { AnchorWidget, Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, replacer, selectionState, snippets, xmlTags } from "@dxos/ui-editor";
78
81
  import { isTruthy, safeUrl } from "@dxos/util";
79
82
  import { Markdown } from "#types";
80
83
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx";
81
- var useExtensions = ({ id, object, settings, compact, viewMode, viewState, editorStateStore, previewOptions, onSelectObject }) => {
84
+ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, editorStateStore, setWidgets, onSelectObject }) => {
82
85
  const { platform } = useThemeContext();
83
86
  const identity = useIdentity();
84
87
  const space = getSpace(object);
@@ -92,7 +95,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, edito
92
95
  compact,
93
96
  viewMode,
94
97
  viewState,
95
- previewOptions,
98
+ setWidgets,
96
99
  platform,
97
100
  onSelectObject
98
101
  }), [
@@ -101,7 +104,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, edito
101
104
  compact,
102
105
  viewMode,
103
106
  viewState,
104
- previewOptions,
107
+ setWidgets,
105
108
  settings,
106
109
  settings?.debug,
107
110
  settings?.editorInputMode,
@@ -115,7 +118,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, edito
115
118
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
116
119
  target && createDataExtensions({
117
120
  id,
118
- text: createDocAccessor(target, [
121
+ text: Doc.createAccessor(target, [
119
122
  "content"
120
123
  ]),
121
124
  messenger: space,
@@ -138,7 +141,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, edito
138
141
  baseExtensions
139
142
  ]);
140
143
  };
141
- var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, viewState, previewOptions, platform }) => {
144
+ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, viewState, setWidgets, platform }) => {
142
145
  const extensions = [
143
146
  viewState && selectionChange(viewState),
144
147
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
@@ -153,10 +156,32 @@ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, vie
153
156
  from: 2
154
157
  } : void 0,
155
158
  // TODO(wittjosiah): For internal links render the label of the object.
156
- renderLinkButton: onSelectObject && createRenderLink(onSelectObject)
159
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
160
+ // xmlTags() handles dxn:/echo: links via url-scheme widgets; skip here to avoid double-processing.
161
+ skip: ({ url }) => url.startsWith("dxn:") || url.startsWith("echo:")
157
162
  }),
158
163
  linkTooltip(renderLinkTooltip),
159
- preview(previewOptions),
164
+ xmlTags({
165
+ registry: {
166
+ "dxn-preview": {
167
+ block: true,
168
+ urlSchemes: [
169
+ "dxn:",
170
+ "echo:"
171
+ ],
172
+ Component: PreviewComponent
173
+ },
174
+ "link-preview": {
175
+ block: false,
176
+ urlSchemes: [
177
+ "dxn:",
178
+ "echo:"
179
+ ],
180
+ factory: ({ label, dxn }) => label && dxn ? new AnchorWidget(label, dxn) : null
181
+ }
182
+ },
183
+ setWidgets
184
+ }),
160
185
  replacer()
161
186
  ]);
162
187
  }
@@ -195,7 +220,7 @@ var createRenderLink = (onSelectObject) => (el, { url }) => {
195
220
  const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : void 0;
196
221
  const icon = Domino2.of("span").classNames("dx-link ms-1 inline-block align-[-0.125em]").append(Domino2.svg(isInternal ? "ph--arrow-square-down--regular" : "ph--arrow-square-out--regular"));
197
222
  if (isInternal) {
198
- invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 157, S: void 0, A: ["qualifiedId", "'Invalid link format.'"] });
223
+ invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 180, S: void 0, A: ["qualifiedId", "'Invalid link format.'"] });
199
224
  icon.attributes({
200
225
  role: "button",
201
226
  tabindex: "0"
@@ -231,7 +256,7 @@ import { HiddenAnnotation, getTypeAnnotation } from "@dxos/echo/Annotation";
231
256
  import { Kind as EntityKind } from "@dxos/echo/Entity";
232
257
  import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
233
258
  import { insertAtCursor, insertAtLineStart } from "@dxos/ui-editor";
234
- var useLinkQuery = (db) => {
259
+ var useLinkQuery = (db, current) => {
235
260
  const { t } = useTranslation2();
236
261
  const filter = useMemo3(() => Filter.or(...(db ? db.graph.registry.list().filter(Type.isType) : []).filter((schema) => getTypeAnnotation(Type.getSchema(schema))?.kind !== EntityKind.Relation).filter((schema) => !HiddenAnnotation.get(Type.getSchema(schema)).pipe(Option.getOrElse(() => false))).map((schema) => Filter.type(Type.getURI(schema)))), [
237
262
  db
@@ -249,7 +274,7 @@ var useLinkQuery = (db) => {
249
274
  }
250
275
  ];
251
276
  };
252
- const items = results?.filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
277
+ const items = results?.filter((object) => object.id !== current?.id).filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
253
278
  const type = Obj2.getType(object);
254
279
  const icon = type ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(type)))?.icon : void 0;
255
280
  const label = toLocalizedString2(getLabel(object), t);
@@ -309,7 +334,8 @@ var useLinkQuery = (db) => {
309
334
  }, [
310
335
  db,
311
336
  filter,
312
- t
337
+ t,
338
+ current
313
339
  ]);
314
340
  return handleLinkQuery;
315
341
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/hooks/useEditorMenuOptions.ts", "../../../../src/hooks/useExtensions.tsx", "../../../../src/hooks/useLinkQuery.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type UseEditorMenuProps,\n filterMenuGroups,\n formattingCommands,\n linkSlashCommands,\n} from '@dxos/react-ui-editor';\nimport { Domino } from '@dxos/ui';\n\nimport { meta } from '#meta';\n\nexport type UseEditorMenuOptionsProps = {\n editorView?: EditorView;\n slashCommandGroups?: EditorMenuGroup[];\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n};\n\nexport const useEditorMenuOptions = ({\n editorView,\n slashCommandGroups,\n onLinkQuery,\n}: UseEditorMenuOptionsProps): UseEditorMenuProps => {\n const { t } = useTranslation(meta.profile.key);\n\n const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(\n ({ text, trigger }) => {\n switch (trigger) {\n case '@': {\n return onLinkQuery?.(text) ?? [];\n }\n\n case '/':\n default: {\n return filterMenuGroups([formattingCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>\n text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,\n );\n }\n }\n },\n [slashCommandGroups, onLinkQuery],\n );\n\n const viewRef = useRef(editorView);\n return useMemo<UseEditorMenuProps>(() => {\n const trigger = onLinkQuery ? ['/', '@'] : ['/'];\n const placeholder = {\n delay: 3_000,\n content: () => {\n const pressEl = Domino.of('span').text('Press');\n const triggerEls = trigger.map((text) =>\n Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),\n );\n const forCommandsEl = Domino.of('span').text('for commands.');\n return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;\n },\n };\n\n return { viewRef, getMenu, trigger, placeholder };\n }, [getMenu, onLinkQuery]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ViewUpdate } from '@codemirror/view';\nimport { useMemo } from 'react';\n\nimport { Paths } from '@dxos/app-toolkit';\nimport { debounceAndThrottle } from '@dxos/async';\nimport { Obj } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-client';\nimport { invariant } from '@dxos/invariant';\nimport { getSpace, useObject } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { selectionAspect, type ViewStateManager } from '@dxos/react-ui-attention';\nimport { Text } from '@dxos/schema';\nimport { Domino } from '@dxos/ui';\nimport {\n Cursor,\n type EditorStateStore,\n EditorView,\n type Extension,\n InputModeExtensions,\n type PreviewOptions,\n createDataExtensions,\n decorateMarkdown,\n documentId,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n preview,\n replacer,\n selectionState,\n snippets,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';\nimport { isTruthy, safeUrl } from '@dxos/util';\n\nimport { Markdown } from '#types';\n\nimport { setFallbackName } from '../util';\n\nexport type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };\n\nexport type ExtensionsOptions = {\n id: string;\n object?: DocumentType;\n settings?: Markdown.Settings;\n compact?: boolean;\n viewMode?: EditorViewMode;\n editable?: boolean;\n viewState?: ViewStateManager;\n editorStateStore?: EditorStateStore;\n previewOptions?: PreviewOptions;\n platform?: 'mobile' | 'desktop';\n /** Callback when an internal link is clicked. */\n onSelectObject?: (objectId: string) => void;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n previewOptions,\n onSelectObject,\n}: ExtensionsOptions): Extension[] => {\n const { platform } = useThemeContext();\n const identity = useIdentity();\n const space = getSpace(object);\n\n // Get the content reference from Document objects.\n const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;\n // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).\n useObject(contentRef);\n // Get the actual live object target via .target (needed for createDocAccessor).\n const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);\n\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // TODO(burdon): Unsubscribe.\n // const query = space?.db.query(Filter.type(DocumentType));\n // query?.subscribe();\n\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n previewOptions,\n platform,\n onSelectObject,\n }),\n [\n id,\n object,\n compact,\n viewMode,\n viewState,\n previewOptions,\n settings,\n settings?.debug,\n settings?.editorInputMode,\n settings?.folding,\n settings?.numberedHeadings,\n platform,\n onSelectObject,\n ],\n );\n\n return useMemo<Extension[]>(\n () =>\n [\n // TODO(burdon): Pass this in?\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n target &&\n createDataExtensions({\n id,\n text: createDocAccessor(target, ['content']),\n messenger: space,\n identity,\n }),\n\n // TODO(burdon): Reconcile with effect in parent.\n Obj.instanceOf(Markdown.Document, object) &&\n listener({\n onChange: ({ text }) => {\n setFallbackName(object as Markdown.Document, text);\n },\n }),\n\n baseExtensions,\n selectionState(editorStateStore),\n ].filter(isTruthy),\n [identity, space, id, object, target, baseExtensions],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({\n id,\n object,\n onSelectObject,\n settings,\n compact,\n viewMode,\n viewState,\n previewOptions,\n platform,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n viewState && selectionChange(viewState),\n settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings?.folding && !compact && platform !== 'mobile' && folding(),\n ].filter(isTruthy);\n\n //\n // Markdown\n //\n if (viewMode !== 'source') {\n extensions.push(\n ...[\n formattingKeymap(),\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links render the label of the object.\n renderLinkButton: onSelectObject && createRenderLink(onSelectObject),\n }),\n linkTooltip(renderLinkTooltip),\n preview(previewOptions),\n replacer(),\n ],\n );\n }\n\n if (settings?.debug) {\n const items = settings.snippets?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(snippets({ items }));\n }\n }\n\n return extensions;\n};\n\nconst selectionChange = (viewState: ViewStateManager) => {\n const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {\n const id = update.state.facet(documentId);\n const cursorConverter = update.state.facet(Cursor.converter);\n const selection = update.state.selection;\n // NOTE: Filter on numeric offsets BEFORE converting to cursor strings.\n // Cursors are opaque (Automerge-encoded), so a lexicographic `to > from`\n // comparison is nondeterministic — it would let some cursor-placements\n // (where from === to numerically) through and reject genuine selections\n // depending on encoding, which made the comment button's enabled state\n // appear random across different lines.\n const ranges = selection.ranges\n .filter((range) => range.to > range.from)\n .map((range) => ({\n from: cursorConverter.toCursor(range.from),\n to: cursorConverter.toCursor(range.to),\n }));\n\n viewState.set(selectionAspect, id, { mode: 'multi-range', ranges });\n }, 100);\n\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.selectionSet) {\n debouncedHandler(update);\n }\n });\n};\n\nconst createRenderLink =\n (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>\n (el, { url }) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);\n const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;\n const icon = Domino.of('span')\n .classNames('dx-link ms-1 inline-block align-[-0.125em]')\n .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));\n\n if (isInternal) {\n invariant(qualifiedId, 'Invalid link format.');\n icon\n .attributes({ role: 'button', tabindex: '0' })\n .on('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onSelectObject(qualifiedId);\n })\n .on('keydown', (event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {\n return;\n }\n\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n onSelectObject(qualifiedId);\n });\n }\n\n el.appendChild(icon.root);\n };\n\nconst renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {\n el.appendChild(\n Domino.of('a')\n .attributes({ href: url, target: '_blank', rel: 'noreferrer' })\n .classNames('dx-link flex items-center gap-2')\n .text(safeUrl(url)?.toString() ?? url)\n .append(Domino.svg('ph--arrow-square-out--regular')).root,\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport { useCallback, useMemo } from 'react';\n\nimport { Annotation, type Database, Filter, Obj, Query, Type } from '@dxos/echo';\nimport { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';\nimport { Kind as EntityKind } from '@dxos/echo/Entity';\nimport { type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';\nimport { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';\n\nimport { Markdown } from '../types';\n\nexport const useLinkQuery = (db: Database.Database | undefined) => {\n const { t } = useTranslation();\n\n const filter = useMemo(\n () =>\n Filter.or(\n ...(db ? db.graph.registry.list().filter(Type.isType) : [])\n .filter((schema) => getTypeAnnotation(Type.getSchema(schema))?.kind !== EntityKind.Relation)\n .filter((schema) => !HiddenAnnotation.get(Type.getSchema(schema)).pipe(Option.getOrElse(() => false)))\n .map((schema) => Filter.type(Type.getURI(schema))),\n ),\n [db],\n );\n\n const handleLinkQuery = useCallback(\n async (query?: string): Promise<EditorMenuGroup[]> => {\n // A second \"@\" switches the link query into block-embed mode, so \"@@foo\" searches for \"foo\".\n const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');\n const results = await db?.query(Query.select(filter)).run();\n\n const getLabel = (object: Obj.Unknown): Label => {\n const type = Obj.getTypename(object)!;\n return Obj.getLabel(object) ?? ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];\n };\n\n const items =\n results\n ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))\n .map((object: Obj.Unknown): EditorMenuItem => {\n const type = Obj.getType(object);\n const icon = type\n ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(type)))?.icon\n : undefined;\n const label = toLocalizedString(getLabel(object), t);\n return {\n id: object.id,\n label,\n icon,\n onSelect: ({ view, head }) => {\n const link = `[${label}](${Obj.getURI(object)})`;\n // \"@@\" inserts a block embed on its own line instead of an inline link.\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n }) ?? [];\n\n // Add \"Create new document\" option at the end.\n const createItem: EditorMenuItem = {\n id: 'create-document',\n label: ['add-object.label', { ns: Type.getTypename(Markdown.Document) }],\n icon: 'ph--plus--regular',\n onSelect: ({ view, head }) => {\n const doc = Markdown.make({ name: name || undefined });\n db?.add(doc);\n const label = name || t('object-name.placeholder', { ns: Type.getTypename(Markdown.Document) });\n const link = `[${label}](${Obj.getURI(doc)})`;\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n\n return [\n { id: 'echo', items },\n { id: 'create', items: [createItem] },\n ];\n },\n [db, filter, t],\n );\n\n return handleLinkQuery;\n};\n"],
5
- "mappings": "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",
6
- "names": ["useCallback", "useMemo", "useRef", "toLocalizedString", "useTranslation", "filterMenuGroups", "formattingCommands", "linkSlashCommands", "Domino", "meta", "useEditorMenuOptions", "editorView", "slashCommandGroups", "onLinkQuery", "t", "profile", "key", "getMenu", "text", "trigger", "item", "label", "toLowerCase", "includes", "viewRef", "placeholder", "delay", "content", "pressEl", "of", "triggerEls", "map", "classNames", "forCommandsEl", "append", "root", "useMemo", "Paths", "debounceAndThrottle", "Obj", "createDocAccessor", "invariant", "getSpace", "useObject", "useIdentity", "useThemeContext", "selectionAspect", "Text", "Domino", "Cursor", "EditorView", "InputModeExtensions", "createDataExtensions", "decorateMarkdown", "documentId", "folding", "formattingKeymap", "linkTooltip", "listener", "preview", "replacer", "selectionState", "snippets", "isTruthy", "safeUrl", "Markdown", "identity", "useIdentity", "space", "getSpace", "object", "contentRef", "instanceOf", "useObject", "target", "settings", "compact", "viewMode", "viewState", "previewOptions", "platform", "onSelectObject", "id", "folding", "numberedHeadings", "createDocAccessor", "messenger", "Obj", "setFallbackName", "text", "baseExtensions", "selectionState", "filter", "selectionChange", "editorInputMode", "isTruthy", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "undefined", "renderLinkButton", "linkTooltip", "renderLinkTooltip", "preview", "replacer", "items", "extensions", "snippets", "update", "cursorConverter", "facet", "converter", "selection", "toCursor", "range", "set", "selectionAspect", "mode", "ranges", "debouncedHandler", "isInternal", "url", "startsWith", "icon", "Domino", "classNames", "invariant", "qualifiedId", "attributes", "tabindex", "on", "event", "preventDefault", "stopPropagation", "keyboardEvent", "appendChild", "el", "rel", "Option", "useCallback", "useMemo", "Annotation", "Filter", "Obj", "Query", "Type", "HiddenAnnotation", "getTypeAnnotation", "Kind", "EntityKind", "toLocalizedString", "useTranslation", "insertAtCursor", "insertAtLineStart", "useLinkQuery", "db", "t", "useTranslation", "filter", "useMemo", "Filter", "or", "graph", "registry", "list", "Type", "isType", "schema", "getTypeAnnotation", "getSchema", "kind", "EntityKind", "Relation", "HiddenAnnotation", "get", "pipe", "getOrElse", "map", "type", "getURI", "handleLinkQuery", "useCallback", "query", "name", "startsWith", "slice", "toLowerCase", "results", "Query", "select", "run", "getLabel", "object", "Obj", "getTypename", "ns", "defaultValue", "items", "toLocalizedString", "includes", "getType", "icon", "getOrUndefined", "Annotation", "IconAnnotation", "undefined", "label", "id", "onSelect", "view", "head", "link", "insertAtLineStart", "insertAtCursor", "createItem", "Markdown", "Document", "doc", "make", "add"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type UseEditorMenuProps,\n filterMenuGroups,\n formattingCommands,\n linkSlashCommands,\n} from '@dxos/react-ui-editor';\nimport { Domino } from '@dxos/ui';\n\nimport { meta } from '#meta';\n\nexport type UseEditorMenuOptionsProps = {\n editorView?: EditorView;\n slashCommandGroups?: EditorMenuGroup[];\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n};\n\nexport const useEditorMenuOptions = ({\n editorView,\n slashCommandGroups,\n onLinkQuery,\n}: UseEditorMenuOptionsProps): UseEditorMenuProps => {\n const { t } = useTranslation(meta.profile.key);\n\n const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(\n ({ text, trigger }) => {\n switch (trigger) {\n case '@': {\n return onLinkQuery?.(text) ?? [];\n }\n\n case '/':\n default: {\n return filterMenuGroups([linkSlashCommands, formattingCommands, ...(slashCommandGroups ?? [])], (item) =>\n text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,\n );\n }\n }\n },\n [slashCommandGroups, onLinkQuery],\n );\n\n const viewRef = useRef(editorView);\n return useMemo<UseEditorMenuProps>(() => {\n const trigger = onLinkQuery ? ['/', '@'] : ['/'];\n const placeholder = {\n delay: 3_000,\n content: () => {\n const pressEl = Domino.of('span').text('Press');\n const triggerEls = trigger.map((text) =>\n Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),\n );\n const forCommandsEl = Domino.of('span').text('for commands.');\n return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;\n },\n };\n\n return { viewRef, getMenu, trigger, placeholder };\n }, [getMenu, onLinkQuery]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ViewUpdate } from '@codemirror/view';\nimport { useMemo } from 'react';\n\nimport { Paths } from '@dxos/app-toolkit';\nimport { debounceAndThrottle } from '@dxos/async';\nimport { Obj } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { invariant } from '@dxos/invariant';\nimport { getSpace, useObject } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { type ViewStateManager, selectionAspect } from '@dxos/react-ui-attention';\nimport { Text } from '@dxos/schema';\nimport { Domino } from '@dxos/ui';\nimport {\n AnchorWidget,\n Cursor,\n type EditorStateStore,\n EditorView,\n type Extension,\n InputModeExtensions,\n type XmlWidgetProps,\n type XmlWidgetState,\n createDataExtensions,\n decorateMarkdown,\n documentId,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n replacer,\n selectionState,\n snippets,\n xmlTags,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';\nimport { isTruthy, safeUrl } from '@dxos/util';\n\nimport { Markdown } from '#types';\n\nimport { PreviewComponent } from '../components/PreviewComponent/PreviewComponent';\nimport { setFallbackName } from '../util';\n\nexport type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };\n\nexport type ExtensionsOptions = {\n id: string;\n object?: DocumentType;\n settings?: Markdown.Settings;\n compact?: boolean;\n viewMode?: EditorViewMode;\n editable?: boolean;\n viewState?: ViewStateManager;\n editorStateStore?: EditorStateStore;\n setWidgets?: (widgets: XmlWidgetState[]) => void;\n platform?: 'mobile' | 'desktop';\n /** Callback when an internal link is clicked. */\n onSelectObject?: (objectId: string) => void;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n setWidgets,\n onSelectObject,\n}: ExtensionsOptions): Extension[] => {\n const { platform } = useThemeContext();\n const identity = useIdentity();\n const space = getSpace(object);\n\n // Get the content reference from Document objects.\n const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;\n // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).\n useObject(contentRef);\n // Get the actual live object target via .target (needed for Doc.createAccessor).\n const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);\n\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // TODO(burdon): Unsubscribe.\n // const query = space?.db.query(Filter.type(DocumentType));\n // query?.subscribe();\n\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n setWidgets,\n platform,\n onSelectObject,\n }),\n [\n id,\n object,\n compact,\n viewMode,\n viewState,\n setWidgets,\n settings,\n settings?.debug,\n settings?.editorInputMode,\n settings?.folding,\n settings?.numberedHeadings,\n platform,\n onSelectObject,\n ],\n );\n\n return useMemo<Extension[]>(\n () =>\n [\n // TODO(burdon): Pass this in?\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n target &&\n createDataExtensions({\n id,\n text: Doc.createAccessor(target, ['content']),\n messenger: space,\n identity,\n }),\n\n // TODO(burdon): Reconcile with effect in parent.\n Obj.instanceOf(Markdown.Document, object) &&\n listener({\n onChange: ({ text }) => {\n setFallbackName(object as Markdown.Document, text);\n },\n }),\n\n baseExtensions,\n selectionState(editorStateStore),\n ].filter(isTruthy),\n [identity, space, id, object, target, baseExtensions],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({\n id,\n object,\n onSelectObject,\n settings,\n compact,\n viewMode,\n viewState,\n setWidgets,\n platform,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n viewState && selectionChange(viewState),\n settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings?.folding && !compact && platform !== 'mobile' && folding(),\n ].filter(isTruthy);\n\n //\n // Markdown\n //\n if (viewMode !== 'source') {\n extensions.push(\n ...[\n formattingKeymap(),\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links render the label of the object.\n renderLinkButton: onSelectObject && createRenderLink(onSelectObject),\n // xmlTags() handles dxn:/echo: links via url-scheme widgets; skip here to avoid double-processing.\n skip: ({ url }) => url.startsWith('dxn:') || url.startsWith('echo:'),\n }),\n linkTooltip(renderLinkTooltip),\n xmlTags({\n registry: {\n 'dxn-preview': {\n block: true,\n urlSchemes: ['dxn:', 'echo:'],\n Component: PreviewComponent,\n },\n 'link-preview': {\n block: false,\n urlSchemes: ['dxn:', 'echo:'],\n factory: ({ label, dxn }: XmlWidgetProps<{ label: string; dxn: string }>) =>\n label && dxn ? new AnchorWidget(label, dxn) : null,\n },\n },\n setWidgets,\n }),\n replacer(),\n ],\n );\n }\n\n if (settings?.debug) {\n const items = settings.snippets?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(snippets({ items }));\n }\n }\n\n return extensions;\n};\n\nconst selectionChange = (viewState: ViewStateManager) => {\n const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {\n const id = update.state.facet(documentId);\n const cursorConverter = update.state.facet(Cursor.converter);\n const selection = update.state.selection;\n // NOTE: Filter on numeric offsets BEFORE converting to cursor strings.\n // Cursors are opaque (Automerge-encoded), so a lexicographic `to > from`\n // comparison is nondeterministic — it would let some cursor-placements\n // (where from === to numerically) through and reject genuine selections\n // depending on encoding, which made the comment button's enabled state\n // appear random across different lines.\n const ranges = selection.ranges\n .filter((range) => range.to > range.from)\n .map((range) => ({\n from: cursorConverter.toCursor(range.from),\n to: cursorConverter.toCursor(range.to),\n }));\n\n viewState.set(selectionAspect, id, { mode: 'multi-range', ranges });\n }, 100);\n\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.selectionSet) {\n debouncedHandler(update);\n }\n });\n};\n\nconst createRenderLink =\n (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>\n (el, { url }) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);\n const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;\n const icon = Domino.of('span')\n .classNames('dx-link ms-1 inline-block align-[-0.125em]')\n .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));\n\n if (isInternal) {\n invariant(qualifiedId, 'Invalid link format.');\n icon\n .attributes({ role: 'button', tabindex: '0' })\n .on('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onSelectObject(qualifiedId);\n })\n .on('keydown', (event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {\n return;\n }\n\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n onSelectObject(qualifiedId);\n });\n }\n\n el.appendChild(icon.root);\n };\n\nconst renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {\n el.appendChild(\n Domino.of('a')\n .attributes({ href: url, target: '_blank', rel: 'noreferrer' })\n .classNames('dx-link flex items-center gap-2')\n .text(safeUrl(url)?.toString() ?? url)\n .append(Domino.svg('ph--arrow-square-out--regular')).root,\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport { useCallback, useMemo } from 'react';\n\nimport { Annotation, type Database, Filter, Obj, Query, Type } from '@dxos/echo';\nimport { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';\nimport { Kind as EntityKind } from '@dxos/echo/Entity';\nimport { type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';\nimport { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';\n\nimport { Markdown } from '../types';\n\nexport const useLinkQuery = (db: Database.Database | undefined, current?: Obj.Unknown) => {\n const { t } = useTranslation();\n\n const filter = useMemo(\n () =>\n Filter.or(\n ...(db ? db.graph.registry.list().filter(Type.isType) : [])\n .filter((schema) => getTypeAnnotation(Type.getSchema(schema))?.kind !== EntityKind.Relation)\n .filter((schema) => !HiddenAnnotation.get(Type.getSchema(schema)).pipe(Option.getOrElse(() => false)))\n .map((schema) => Filter.type(Type.getURI(schema))),\n ),\n [db],\n );\n\n const handleLinkQuery = useCallback(\n async (query?: string): Promise<EditorMenuGroup[]> => {\n // A second \"@\" switches the link query into block-embed mode, so \"@@foo\" searches for \"foo\".\n const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');\n const results = await db?.query(Query.select(filter)).run();\n\n const getLabel = (object: Obj.Unknown): Label => {\n const type = Obj.getTypename(object)!;\n return Obj.getLabel(object) ?? ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];\n };\n\n const items =\n results\n // Exclude the current document; it cannot link to itself.\n ?.filter((object) => object.id !== current?.id)\n .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))\n .map((object: Obj.Unknown): EditorMenuItem => {\n const type = Obj.getType(object);\n const icon = type\n ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(type)))?.icon\n : undefined;\n const label = toLocalizedString(getLabel(object), t);\n return {\n id: object.id,\n label,\n icon,\n onSelect: ({ view, head }) => {\n const link = `[${label}](${Obj.getURI(object)})`;\n // \"@@\" inserts a block embed on its own line instead of an inline link.\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n }) ?? [];\n\n // Add \"Create new document\" option at the end.\n const createItem: EditorMenuItem = {\n id: 'create-document',\n label: ['add-object.label', { ns: Type.getTypename(Markdown.Document) }],\n icon: 'ph--plus--regular',\n onSelect: ({ view, head }) => {\n const doc = Markdown.make({ name: name || undefined });\n db?.add(doc);\n const label = name || t('object-name.placeholder', { ns: Type.getTypename(Markdown.Document) });\n const link = `[${label}](${Obj.getURI(doc)})`;\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n\n return [\n { id: 'echo', items },\n { id: 'create', items: [createItem] },\n ];\n },\n [db, filter, t, current],\n );\n\n return handleLinkQuery;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useCallback", "useMemo", "useRef", "toLocalizedString", "useTranslation", "filterMenuGroups", "formattingCommands", "linkSlashCommands", "Domino", "meta", "useEditorMenuOptions", "editorView", "slashCommandGroups", "onLinkQuery", "t", "profile", "key", "getMenu", "text", "trigger", "item", "label", "toLowerCase", "includes", "viewRef", "placeholder", "delay", "content", "pressEl", "of", "triggerEls", "map", "classNames", "forCommandsEl", "append", "root", "useMemo", "Paths", "debounceAndThrottle", "Obj", "Doc", "invariant", "getSpace", "useObject", "useIdentity", "useThemeContext", "selectionAspect", "Text", "Domino", "AnchorWidget", "Cursor", "EditorView", "InputModeExtensions", "createDataExtensions", "decorateMarkdown", "documentId", "folding", "formattingKeymap", "linkTooltip", "listener", "replacer", "selectionState", "snippets", "xmlTags", "isTruthy", "safeUrl", "Markdown", "identity", "useIdentity", "space", "getSpace", "object", "contentRef", "instanceOf", "useObject", "target", "settings", "compact", "viewMode", "viewState", "setWidgets", "platform", "onSelectObject", "id", "folding", "numberedHeadings", "Doc", "messenger", "Obj", "setFallbackName", "text", "baseExtensions", "selectionState", "filter", "selectionChange", "editorInputMode", "isTruthy", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "undefined", "renderLinkButton", "skip", "url", "startsWith", "linkTooltip", "renderLinkTooltip", "xmlTags", "registry", "block", "urlSchemes", "Component", "factory", "replacer", "items", "extensions", "snippets", "update", "cursorConverter", "facet", "converter", "selection", "toCursor", "range", "set", "selectionAspect", "mode", "ranges", "debouncedHandler", "isInternal", "icon", "Domino", "classNames", "invariant", "qualifiedId", "attributes", "tabindex", "on", "event", "preventDefault", "stopPropagation", "keyboardEvent", "appendChild", "el", "rel", "Option", "useCallback", "useMemo", "Annotation", "Filter", "Obj", "Query", "Type", "HiddenAnnotation", "getTypeAnnotation", "Kind", "EntityKind", "toLocalizedString", "useTranslation", "insertAtCursor", "insertAtLineStart", "useLinkQuery", "db", "current", "t", "useTranslation", "filter", "useMemo", "Filter", "or", "graph", "registry", "list", "Type", "isType", "schema", "getTypeAnnotation", "getSchema", "kind", "EntityKind", "Relation", "HiddenAnnotation", "get", "pipe", "getOrElse", "map", "type", "getURI", "handleLinkQuery", "useCallback", "query", "name", "startsWith", "slice", "toLowerCase", "results", "Query", "select", "run", "getLabel", "object", "Obj", "getTypename", "ns", "defaultValue", "items", "id", "toLocalizedString", "includes", "getType", "icon", "getOrUndefined", "Annotation", "IconAnnotation", "undefined", "label", "onSelect", "view", "head", "link", "insertAtLineStart", "insertAtCursor", "createItem", "Markdown", "Document", "doc", "make", "add"]
7
7
  }
@@ -1,7 +1,3 @@
1
- import {
2
- getDocumentPath,
3
- getDocumentsPath
4
- } from "./chunk-4ULSRZRL.mjs";
5
1
  import {
6
2
  getContentSnippet,
7
3
  getFallbackName,
@@ -10,34 +6,32 @@ import {
10
6
  serializer,
11
7
  setFallbackName
12
8
  } from "./chunk-KDN4GKG2.mjs";
13
- import {
14
- meta
15
- } from "./chunk-GUXWFDD4.mjs";
16
- import {
17
- MarkdownOperationHandlerSet
18
- } from "./chunk-BL46CERY.mjs";
19
9
  import {
20
10
  MarkdownCapabilities_exports,
21
11
  MarkdownEvents_exports,
22
12
  MarkdownOperation_exports,
23
13
  Markdown_exports,
24
14
  Settings_exports
25
- } from "./chunk-CRKAIDRD.mjs";
15
+ } from "./chunk-ZJ3GWRUJ.mjs";
16
+ import {
17
+ meta
18
+ } from "./chunk-OC3JD73N.mjs";
19
+ import {
20
+ MarkdownOperationHandlerSet
21
+ } from "./chunk-2V6A5NDQ.mjs";
26
22
  import {
27
- markdown_blueprint_default
28
- } from "./chunk-LXNSKCPD.mjs";
23
+ markdown_skill_default
24
+ } from "./chunk-EV4ZOL4P.mjs";
29
25
  import "./chunk-J5LGTIGS.mjs";
30
26
  export {
31
27
  Markdown_exports as Markdown,
32
- markdown_blueprint_default as MarkdownBlueprint,
33
28
  MarkdownCapabilities_exports as MarkdownCapabilities,
34
29
  MarkdownEvents_exports as MarkdownEvents,
35
30
  MarkdownOperation_exports as MarkdownOperation,
36
31
  MarkdownOperationHandlerSet,
32
+ markdown_skill_default as MarkdownSkill,
37
33
  Settings_exports as Settings,
38
34
  getContentSnippet,
39
- getDocumentPath,
40
- getDocumentsPath,
41
35
  getFallbackName,
42
36
  isEditorModel,
43
37
  isMarkdownProperties,