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

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 (137) hide show
  1. package/dist/lib/neutral/{MarkdownArticle-LWT5RFFJ.mjs → MarkdownArticle-I4UMD7AA.mjs} +3 -3
  2. package/dist/lib/neutral/MarkdownArticle-I4UMD7AA.mjs.map +7 -0
  3. package/dist/lib/neutral/{MarkdownCard-TBLIRDBO.mjs → MarkdownCard-OYO2HYZF.mjs} +2 -2
  4. package/dist/lib/neutral/MarkdownCard-OYO2HYZF.mjs.map +7 -0
  5. package/dist/lib/neutral/MarkdownPlugin.mjs +6 -9
  6. package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
  7. package/dist/lib/neutral/{MarkdownSettings-YCTZJL5V.mjs → MarkdownSettings-F5AWRDT3.mjs} +2 -2
  8. package/dist/lib/neutral/{MarkdownSettings-YCTZJL5V.mjs.map → MarkdownSettings-F5AWRDT3.mjs.map} +3 -3
  9. package/dist/lib/neutral/{app-graph-builder-BWBA23FF.mjs → app-graph-builder-6Y5NHTNR.mjs} +3 -4
  10. package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs.map +7 -0
  11. package/dist/lib/neutral/capabilities/index.mjs +6 -8
  12. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  13. package/dist/lib/neutral/capabilities/node.mjs +1 -1
  14. package/dist/lib/neutral/{chunk-67DKWOKF.mjs → chunk-4ULSRZRL.mjs} +3 -3
  15. package/dist/lib/neutral/chunk-4ULSRZRL.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-BL46CERY.mjs +8 -0
  17. package/dist/lib/neutral/{chunk-Y2LQRUU7.mjs → chunk-CRKAIDRD.mjs} +11 -11
  18. package/dist/lib/neutral/chunk-CRKAIDRD.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-GUXWFDD4.mjs +43 -0
  20. package/dist/lib/neutral/chunk-GUXWFDD4.mjs.map +7 -0
  21. package/dist/lib/neutral/components/index.mjs +9 -8
  22. package/dist/lib/neutral/components/index.mjs.map +3 -3
  23. package/dist/lib/neutral/containers/index.mjs +2 -2
  24. package/dist/lib/neutral/{create-JK35XC4R.mjs → create-XW2FQNLK.mjs} +2 -2
  25. package/dist/lib/neutral/{create-markdown-7MLE625M.mjs → create-markdown-KLSVQCT7.mjs} +2 -2
  26. package/dist/lib/neutral/{create-object-MU2LGXG6.mjs → create-object-3WMEQJ2C.mjs} +2 -2
  27. package/dist/lib/neutral/hooks/index.mjs +16 -12
  28. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  29. package/dist/lib/neutral/index.mjs +4 -4
  30. package/dist/lib/neutral/meta.json +1 -1
  31. package/dist/lib/neutral/meta.mjs +1 -1
  32. package/dist/lib/neutral/{navigation-resolver-3KBOMN4U.mjs → navigation-resolver-3WEM7SSC.mjs} +3 -3
  33. package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs.map +7 -0
  34. package/dist/lib/neutral/{open-5YC77C4O.mjs → open-F7KLNKVN.mjs} +2 -2
  35. package/dist/lib/neutral/operations/index.mjs +1 -1
  36. package/dist/lib/neutral/plugin.mjs +2 -2
  37. package/dist/lib/neutral/{react-surface-XYZJBKHZ.mjs → react-surface-6LX4ZQ2H.mjs} +7 -12
  38. package/dist/lib/neutral/react-surface-6LX4ZQ2H.mjs.map +7 -0
  39. package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs → scroll-to-anchor-ACND3WJU.mjs} +2 -2
  40. package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs → set-view-mode-WDC7CAEC.mjs} +2 -2
  41. package/dist/lib/neutral/{settings-TDGDLCUR.mjs → settings-O6O6HT3I.mjs} +3 -3
  42. package/dist/lib/neutral/settings-O6O6HT3I.mjs.map +7 -0
  43. package/dist/lib/neutral/state-ZYT3JRWT.mjs +69 -0
  44. package/dist/lib/neutral/state-ZYT3JRWT.mjs.map +7 -0
  45. package/dist/lib/neutral/testing.mjs +2 -2
  46. package/dist/lib/neutral/testing.mjs.map +3 -3
  47. package/dist/lib/neutral/translations.mjs +1 -1
  48. package/dist/lib/neutral/translations.mjs.map +3 -3
  49. package/dist/lib/neutral/types/index.mjs +1 -1
  50. package/dist/lib/neutral/{update-markdown-NNINDDV5.mjs → update-markdown-FGVN3LD4.mjs} +2 -2
  51. package/dist/types/dx.config.d.ts +28 -0
  52. package/dist/types/dx.config.d.ts.map +1 -0
  53. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  54. package/dist/types/src/capabilities/editor-view-state.d.ts +7 -0
  55. package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -0
  56. package/dist/types/src/capabilities/index.d.ts +9 -16
  57. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  58. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -1
  59. package/dist/types/src/capabilities/node.d.ts +1 -6
  60. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  61. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  62. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/state.d.ts +1 -1
  64. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
  65. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  66. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +2 -2
  67. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  68. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  69. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +2 -2
  70. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  71. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +4 -4
  72. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
  73. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -1
  74. package/dist/types/src/hooks/useExtensions.d.ts +3 -3
  75. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  76. package/dist/types/src/meta.d.ts +28 -2
  77. package/dist/types/src/meta.d.ts.map +1 -1
  78. package/dist/types/src/paths.d.ts.map +1 -1
  79. package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -1
  80. package/dist/types/tsconfig.tsbuildinfo +1 -1
  81. package/dx.config.ts +31 -0
  82. package/package.json +41 -40
  83. package/src/MarkdownPlugin.test.ts +1 -1
  84. package/src/MarkdownPlugin.tsx +5 -10
  85. package/src/capabilities/app-graph-builder.ts +1 -3
  86. package/src/capabilities/editor-view-state.ts +28 -0
  87. package/src/capabilities/index.ts +2 -14
  88. package/src/capabilities/navigation-resolver.ts +2 -2
  89. package/src/capabilities/react-surface.tsx +20 -10
  90. package/src/capabilities/settings.ts +2 -2
  91. package/src/capabilities/state.ts +8 -4
  92. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  93. package/src/components/MarkdownEditor/MarkdownEditor.tsx +4 -4
  94. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +4 -3
  95. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +2 -2
  96. package/src/components/MarkdownSettings/MarkdownSettings.tsx +1 -1
  97. package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +3 -4
  98. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +3 -3
  99. package/src/containers/MarkdownCard/MarkdownCard.tsx +1 -1
  100. package/src/hooks/useEditorMenuOptions.ts +1 -1
  101. package/src/hooks/useExtensions.tsx +11 -11
  102. package/src/meta.ts +2 -22
  103. package/src/operations/create.conversations.json +1 -1
  104. package/src/operations/update.conversations.json +1 -1
  105. package/src/paths.ts +4 -2
  106. package/src/testing.ts +2 -2
  107. package/src/translations.ts +1 -1
  108. package/src/types/Markdown.ts +3 -3
  109. package/src/types/MarkdownCapabilities.ts +7 -5
  110. package/src/types/MarkdownEvents.ts +1 -1
  111. package/src/types/MarkdownOperation.ts +1 -1
  112. package/dist/lib/neutral/MarkdownArticle-LWT5RFFJ.mjs.map +0 -7
  113. package/dist/lib/neutral/MarkdownCard-TBLIRDBO.mjs.map +0 -7
  114. package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs.map +0 -7
  115. package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs +0 -56
  116. package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs.map +0 -7
  117. package/dist/lib/neutral/chunk-36QFEVOZ.mjs +0 -30
  118. package/dist/lib/neutral/chunk-36QFEVOZ.mjs.map +0 -7
  119. package/dist/lib/neutral/chunk-67DKWOKF.mjs.map +0 -7
  120. package/dist/lib/neutral/chunk-CIJD7P6X.mjs +0 -8
  121. package/dist/lib/neutral/chunk-Y2LQRUU7.mjs.map +0 -7
  122. package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs.map +0 -7
  123. package/dist/lib/neutral/react-surface-XYZJBKHZ.mjs.map +0 -7
  124. package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +0 -7
  125. package/dist/lib/neutral/state-5COCF5PN.mjs +0 -44
  126. package/dist/lib/neutral/state-5COCF5PN.mjs.map +0 -7
  127. package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -5
  128. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
  129. package/src/capabilities/app-graph-serializer.ts +0 -64
  130. /package/dist/lib/neutral/{chunk-CIJD7P6X.mjs.map → chunk-BL46CERY.mjs.map} +0 -0
  131. /package/dist/lib/neutral/{create-JK35XC4R.mjs.map → create-XW2FQNLK.mjs.map} +0 -0
  132. /package/dist/lib/neutral/{create-markdown-7MLE625M.mjs.map → create-markdown-KLSVQCT7.mjs.map} +0 -0
  133. /package/dist/lib/neutral/{create-object-MU2LGXG6.mjs.map → create-object-3WMEQJ2C.mjs.map} +0 -0
  134. /package/dist/lib/neutral/{open-5YC77C4O.mjs.map → open-F7KLNKVN.mjs.map} +0 -0
  135. /package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs.map → scroll-to-anchor-ACND3WJU.mjs.map} +0 -0
  136. /package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs.map → set-view-mode-WDC7CAEC.mjs.map} +0 -0
  137. /package/dist/lib/neutral/{update-markdown-NNINDDV5.mjs.map → update-markdown-FGVN3LD4.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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' | 'selectionManager' | 'settings' | 'onSelectObject'>;\n\nexport const MarkdownEditorProvider = ({\n children,\n id,\n attendableId,\n object,\n settings,\n compact,\n viewMode,\n selectionManager,\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 selectionManager,\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.Card} 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 { 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.id);\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 !== 'section' && {\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 !== 'section' &&\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 { type FileInfo } 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<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 { type FileInfo } 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<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", "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", "themeMode", "registry", "updateToolbarState", "formatting", "set", "get", "scrollTo", "selection", "getState", "parentRef", "view", "editorView", "focusAttributes", "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", "selectionManager", "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", "Card", "limit", "MarkdownEditor", "Content", "Toolbar", "Blocks", "MarkdownSettings", "lazy"]
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"]
7
7
  }
@@ -2,9 +2,9 @@ import "../chunk-J5LGTIGS.mjs";
2
2
 
3
3
  // src/containers/index.ts
4
4
  import { lazy } from "react";
5
- var MarkdownCard = lazy(() => import("../MarkdownCard-TBLIRDBO.mjs"));
5
+ var MarkdownCard = lazy(() => import("../MarkdownCard-OYO2HYZF.mjs"));
6
6
  var EditableMarkdownCard = lazy(() => import("../EditableMarkdownCard-AW7MD35U.mjs"));
7
- var MarkdownArticle = lazy(() => import("../MarkdownArticle-LWT5RFFJ.mjs"));
7
+ var MarkdownArticle = lazy(() => import("../MarkdownArticle-I4UMD7AA.mjs"));
8
8
  export {
9
9
  EditableMarkdownCard,
10
10
  MarkdownArticle,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MarkdownOperation_exports,
3
3
  Markdown_exports
4
- } from "./chunk-Y2LQRUU7.mjs";
4
+ } from "./chunk-CRKAIDRD.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-JK35XC4R.mjs.map
29
+ //# sourceMappingURL=create-XW2FQNLK.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MarkdownOperation_exports,
3
3
  Markdown_exports
4
- } from "./chunk-Y2LQRUU7.mjs";
4
+ } from "./chunk-CRKAIDRD.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-7MLE625M.mjs.map
20
+ //# sourceMappingURL=create-markdown-KLSVQCT7.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getDocumentsPath
3
- } from "./chunk-67DKWOKF.mjs";
3
+ } from "./chunk-4ULSRZRL.mjs";
4
4
  import "./chunk-J5LGTIGS.mjs";
5
5
 
6
6
  // src/capabilities/create-object.ts
@@ -28,4 +28,4 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
28
28
  export {
29
29
  create_object_default as default
30
30
  };
31
- //# sourceMappingURL=create-object-MU2LGXG6.mjs.map
31
+ //# sourceMappingURL=create-object-3WMEQJ2C.mjs.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "../chunk-KDN4GKG2.mjs";
4
4
  import {
5
5
  Markdown_exports
6
- } from "../chunk-Y2LQRUU7.mjs";
6
+ } from "../chunk-CRKAIDRD.mjs";
7
7
  import "../chunk-J5LGTIGS.mjs";
8
8
 
9
9
  // src/hooks/useEditorMenuOptions.ts
@@ -13,7 +13,7 @@ import { filterMenuGroups, formattingCommands, linkSlashCommands } from "@dxos/r
13
13
  import { Domino } from "@dxos/ui";
14
14
  import { meta } from "#meta";
15
15
  var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) => {
16
- const { t } = useTranslation(meta.id);
16
+ const { t } = useTranslation(meta.profile.key);
17
17
  const getMenu = useCallback(({ text, trigger }) => {
18
18
  switch (trigger) {
19
19
  case "@": {
@@ -63,7 +63,7 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
63
63
 
64
64
  // src/hooks/useExtensions.tsx
65
65
  import { useMemo as useMemo2 } from "react";
66
- import { fromUrlPath } from "@dxos/app-toolkit";
66
+ import { Paths } from "@dxos/app-toolkit";
67
67
  import { debounceAndThrottle } from "@dxos/async";
68
68
  import { Obj } from "@dxos/echo";
69
69
  import { createDocAccessor } from "@dxos/echo-client";
@@ -71,13 +71,14 @@ import { invariant } from "@dxos/invariant";
71
71
  import { getSpace, useObject } from "@dxos/react-client/echo";
72
72
  import { useIdentity } from "@dxos/react-client/halo";
73
73
  import { useThemeContext } from "@dxos/react-ui";
74
+ import { selectionAspect } from "@dxos/react-ui-attention";
74
75
  import { Text } from "@dxos/schema";
75
76
  import { Domino as Domino2 } from "@dxos/ui";
76
77
  import { Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, replacer, selectionState, snippets } from "@dxos/ui-editor";
77
78
  import { isTruthy, safeUrl } from "@dxos/util";
78
79
  import { Markdown } from "#types";
79
80
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx";
80
- var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager, editorStateStore, previewOptions, onSelectObject }) => {
81
+ var useExtensions = ({ id, object, settings, compact, viewMode, viewState, editorStateStore, previewOptions, onSelectObject }) => {
81
82
  const { platform } = useThemeContext();
82
83
  const identity = useIdentity();
83
84
  const space = getSpace(object);
@@ -90,7 +91,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
90
91
  settings,
91
92
  compact,
92
93
  viewMode,
93
- selectionManager,
94
+ viewState,
94
95
  previewOptions,
95
96
  platform,
96
97
  onSelectObject
@@ -99,7 +100,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
99
100
  object,
100
101
  compact,
101
102
  viewMode,
102
- selectionManager,
103
+ viewState,
103
104
  previewOptions,
104
105
  settings,
105
106
  settings?.debug,
@@ -137,9 +138,9 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
137
138
  baseExtensions
138
139
  ]);
139
140
  };
140
- var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, selectionManager, previewOptions, platform }) => {
141
+ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, viewState, previewOptions, platform }) => {
141
142
  const extensions = [
142
- selectionManager && selectionChange(selectionManager),
143
+ viewState && selectionChange(viewState),
143
144
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
144
145
  settings?.folding && !compact && platform !== "mobile" && folding()
145
146
  ].filter(isTruthy);
@@ -169,7 +170,7 @@ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, vie
169
170
  }
170
171
  return extensions;
171
172
  };
172
- var selectionChange = (selectionManager) => {
173
+ var selectionChange = (viewState) => {
173
174
  const debouncedHandler = debounceAndThrottle((update) => {
174
175
  const id = update.state.facet(documentId);
175
176
  const cursorConverter = update.state.facet(Cursor.converter);
@@ -178,7 +179,10 @@ var selectionChange = (selectionManager) => {
178
179
  from: cursorConverter.toCursor(range.from),
179
180
  to: cursorConverter.toCursor(range.to)
180
181
  }));
181
- selectionManager.updateMultiRange(id, ranges);
182
+ viewState.set(selectionAspect, id, {
183
+ mode: "multi-range",
184
+ ranges
185
+ });
182
186
  }, 100);
183
187
  return EditorView.updateListener.of((update) => {
184
188
  if (update.selectionSet) {
@@ -188,10 +192,10 @@ var selectionChange = (selectionManager) => {
188
192
  };
189
193
  var createRenderLink = (onSelectObject) => (el, { url }) => {
190
194
  const isInternal = url.startsWith("/") || url.startsWith(window.location.origin);
191
- const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : void 0;
195
+ const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : void 0;
192
196
  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"));
193
197
  if (isInternal) {
194
- invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 153, S: void 0, A: ["qualifiedId", "'Invalid link format.'"] });
198
+ invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 157, S: void 0, A: ["qualifiedId", "'Invalid link format.'"] });
195
199
  icon.attributes({
196
200
  role: "button",
197
201
  tabindex: "0"
@@ -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.id);\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 { fromUrlPath } 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 { type SelectionManager } 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 selectionManager?: SelectionManager;\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 selectionManager,\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 selectionManager,\n previewOptions,\n platform,\n onSelectObject,\n }),\n [\n id,\n object,\n compact,\n viewMode,\n selectionManager,\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 selectionManager,\n previewOptions,\n platform,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n selectionManager && selectionChange(selectionManager),\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 = (selectionManager: SelectionManager) => {\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 selectionManager.updateMultiRange(id, 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 ? 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", "id", "getMenu", "text", "trigger", "item", "label", "toLowerCase", "includes", "viewRef", "placeholder", "delay", "content", "pressEl", "of", "triggerEls", "map", "classNames", "forCommandsEl", "append", "root", "useMemo", "fromUrlPath", "debounceAndThrottle", "Obj", "createDocAccessor", "invariant", "getSpace", "useObject", "useIdentity", "useThemeContext", "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", "selectionManager", "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", "documentId", "cursorConverter", "facet", "converter", "selection", "toCursor", "range", "updateMultiRange", "ranges", "updateListener", "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([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": ";;;;;;;;;AAKA,SAASA,aAAaC,SAASC,cAAc;AAE7C,SAASC,mBAAmBC,sBAAsB;AAClD,SAGEC,kBACAC,oBACAC,yBACK;AACP,SAASC,cAAc;AAEvB,SAASC,YAAY;AAQd,IAAMC,uBAAuB,CAAC,EACnCC,YACAC,oBACAC,YAAW,MACe;AAC1B,QAAM,EAAEC,EAAC,IAAKV,eAAeK,KAAKM,QAAQC,GAAG;AAE7C,QAAMC,UAAUjB,YACd,CAAC,EAAEkB,MAAMC,QAAO,MAAE;AAChB,YAAQA,SAAAA;MACN,KAAK,KAAK;AACR,eAAON,cAAcK,IAAAA,KAAS,CAAA;MAChC;MAEA,KAAK;MACL,SAAS;AACP,eAAOb,iBAAiB;UAACC;UAAoBC;aAAuBK,sBAAsB,CAAA;WAAM,CAACQ,SAC/FF,OAAOf,kBAAkBiB,KAAKC,OAAOP,CAAAA,EAAGQ,YAAW,EAAGC,SAASL,KAAKI,YAAW,CAAA,IAAM,IAAA;MAEzF;IACF;EACF,GACA;IAACV;IAAoBC;GAAY;AAGnC,QAAMW,UAAUtB,OAAOS,UAAAA;AACvB,SAAOV,QAA4B,MAAA;AACjC,UAAMkB,UAAUN,cAAc;MAAC;MAAK;QAAO;MAAC;;AAC5C,UAAMY,cAAc;MAClBC,OAAO;MACPC,SAAS,MAAA;AACP,cAAMC,UAAUpB,OAAOqB,GAAG,MAAA,EAAQX,KAAK,OAAA;AACvC,cAAMY,aAAaX,QAAQY,IAAI,CAACb,SAC9BV,OAAOqB,GAAG,MAAA,EAAQG,WAAW,kEAAA,EAAoEd,KAAKA,IAAAA,CAAAA;AAExG,cAAMe,gBAAgBzB,OAAOqB,GAAG,MAAA,EAAQX,KAAK,eAAA;AAC7C,eAAOV,OAAOqB,GAAG,KAAA,EAAOK,OAAON,SAAAA,GAAYE,YAAYG,aAAAA,EAAeE;MACxE;IACF;AAEA,WAAO;MAAEX;MAASP;MAASE;MAASM;IAAY;EAClD,GAAG;IAACR;IAASJ;GAAY;AAC3B;;;AC9DA,SAASuB,WAAAA,gBAAe;AAExB,SAASC,aAAa;AACtB,SAASC,2BAA2B;AACpC,SAASC,WAAW;AACpB,SAASC,yBAAyB;AAClC,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,iBAAiB;AACpC,SAASC,mBAAmB;AAC5B,SAASC,uBAAuB;AAChC,SAASC,uBAA8C;AACvD,SAASC,YAAY;AACrB,SAASC,UAAAA,eAAc;AACvB,SACEC,QAEAC,YAEAC,qBAEAC,sBACAC,kBACAC,YACAC,SACAC,kBACAC,aACAC,UACAC,SACAC,UACAC,gBACAC,gBACK;AAEP,SAASC,UAAUC,eAAe;AAElC,SAASC,gBAAgB;AAqBzB,IAAA,eAAA;AAaE,IAAMC,gBAAWC,CAAAA,EAAAA,IAAAA,QAAAA,UAAAA,SAAAA,UAAAA,WAAAA,kBAAAA,gBAAAA,eAAAA,MAAAA;AACjB,QAAMC,EAAAA,SAAQC,IAAAA,gBAASC;AAEvB,QAAA,WAAA,YAAA;AACA,QAAMC,QAAAA,SAAiBC,MAAAA;AAEvBC,QAAAA,aAAUF,IAAAA,WAAAA,SAAAA,UAAAA,MAAAA,IAAAA,OAAAA,UAAAA;AAEV,YAAMG,UAASH;AAGf,QAAA,SAAA,YAAA,WAA6B,IAAA,WAAA,KAAA,MAAA,MAAA,IAAA,SAAA;yBAQvBD,SAAAA,MAAAA,qBAAAA;IACAK;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IAEJ;IACEC;EACAZ,CAAAA,GAAAA;IACAM;IACAC;IACAC;IACAC;IACAJ;IACAA;IACAA;IACAA,UAAUQ;IACVR,UAAUS;IACVJ,UAAAA;IACAC,UAAAA;IACD;IAGH;;kBAIM,MAAA;;;cAIUI,qBAAkBX;;YAAmB,kBAAA,QAAA;QAC3CY;MACApB,CAAAA;MACF,WAAA;MAEF;IACAqB,CAAAA;;mBAGMC,SAAgBlB,UAA6BmB,MAAAA,KAAAA,SAAAA;MAC/C,UAAA,CAAA,EAAA,KAAA,MAAA;AACF,wBAAA,QAAA,IAAA;MAEFC;IACAC,CAAAA;IACAC;IACH1B,eAAAA,gBAAAA;EAAUE,EAAAA,OAAAA,QAAAA,GAAAA;IAAOc;IAAIZ;IAAQI;IAAQgB;IAAe;IAEvD;EAEF,CAAA;;IAeIZ,uBAAae,CAAAA,EAAAA,IAAgBf,QAAAA,gBAAAA,UAAAA,SAAAA,UAAAA,WAAAA,gBAAAA,SAAAA,MAAAA;QAC7BH,aAAUmB;IACVnB,aAAUQ,gBAAYP,SAAWI;IACjCY,UAAOG,mBAAAA,oBAAAA,SAAAA,eAAAA;IAEP,UAAA,WAAA,CAAA,WAAA,aAAA,YAAA,QAAA;EACF,EAAA,OAAA,QAAW;mBAKLC,UAAAA;eACAC,KAAAA,GAAAA;uBACEC;uBACAd;8BAAuD;QAAE,kBAAIe,UAAAA,mBAAAA;UAC7D,MAAA;QACAC,IAAAA;;QAEFC,kBAAYC,kBAAAA,iBAAAA,cAAAA;MACZC,CAAAA;MACAC,YAAAA,iBAAAA;MACD,QAAA,cAAA;MAEL,SAAA;IAEI7B,CAAAA;;MAEF,UAAI8B,OAAO;UACTC,QAAAA,SAAgBC,UAAS,MAAA,OAAA,KAAA;eAAEF;AAAM,iBAAA,KAAA,SAAA;QACnC;MACF,CAAA,CAAA;IAEA;EACF;AAEA,SAAMZ;;sBAESe,CAAAA,cAAkB;QAC7B,mBAAMC,oBAA+BC,CAAK,WAAQC;AAClD,UAAMC,KAAAA,OAAYJ,MAAAA,MAAY,UAAU;AACxC,UAAA,kBAAA,OAAA,MAAA,MAAA,OAAA,SAAA;AACA,UAAA,YAAA,OAAA,MAAA;mBASQC,UAAAA,OAAgBI,OAASC,CAAAA,UAAQ,MAAA,KAAA,MAAA,IAAA,EAAA,IAAA,CAAA,WAAA;MACvC,MAAA,gBAAA,SAAA,MAAA,IAAA;MAEFpC,IAAUqC,gBAAIC,SAAqB,MAAA,EAAA;IAAEC,EAAAA;cAAqBC,IAAAA,iBAAAA,IAAAA;MAAO,MAAA;MAChE;IAEH,CAAA;QACE;oBACEC,eAAiBX,GAAAA,CAAAA,WAAAA;AACnB,QAAA,OAAA,cAAA;AACF,uBAAA,MAAA;IACF;EAEA,CAAA;;uBAIUY,CAAAA,mBAA4B,CAAA,IAAA,EAAQC,IAAIC,MAAAA;AAE9C,QAAMC,aAAOC,IAAU,WACpBC,GAAAA,KAAW,IAAA,WAAA,OAAA,SAAA,MAAA;AAGd,QAAIL,cAAY,aAAA,MAAA,YAAA,IAAA,IAAA,KAAA,OAAA,SAAA,MAAA,EAAA,QAAA,IAAA;QACdM,OAAAA,QAAUC,GAAAA,MAAa,EAAA,WAAA,4CAAA,EAAA,OAAAH,QAAA,IAAA,aAAA,mCAAA,+BAAA,CAAA;MACvBD,YACGK;cAAmB,aAAA,wBAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,KAAA,GAAA,QAAA,GAAA,CAAA,eAAA,wBAAA,EAAA,CAAA;SAAUC,WAAU;MACvCC,MAAG;MACFC,UAAMC;UACND,SAAME,CAAAA,UAAAA;AACNpD,YAAAA,eAAe8C;AAEhBG,YAAG,gBAAYC;AACd,qBAAMG,WAAgBH;UACtB,WAAIG,CAAAA,UAAiB;YACnB,gBAAA;AACF,UAAA,cAAA,QAAA,WAAA,cAAA,QAAA,KAAA;AAEAA;MACAA;AACArD,oBAAAA,eAAe8C;AACjB,oBAAA,gBAAA;AACJ,qBAAA,WAAA;IAEGQ,CAAAA;EACL;AAEIjC,KAAAA,YAAAA,KAAsDkC,IAAI;AAC9DA;wBAEwBf,CAAAA,IAAAA,EAAAA,IAAAA,MAAAA;iBAAaG,QAAA,GAAA,GAAA,EAAA,WAAA;IAAUa,MAAK;IAC/CZ,QAAAA;IAIP,KAAA;;;;;ACvQA,YAAYa,YAAY;AACxB,SAASC,eAAAA,cAAaC,WAAAA,gBAAe;AAErC,SAASC,YAA2BC,QAAQC,OAAAA,MAAKC,OAAOC,YAAY;AACpE,SAASC,kBAAkBC,yBAAyB;AACpD,SAASC,QAAQC,kBAAkB;AACnC,SAAqBC,qBAAAA,oBAAmBC,kBAAAA,uBAAsB;AAE9D,SAASC,gBAAgBC,yBAAyB;AAI3C,IAAMC,eAAe,CAACC,OAAAA;AAC3B,QAAM,EAAEC,EAAC,IAAKC,gBAAAA;AAEd,QAAMC,SAASC,SACb,MACEC,OAAOC,GAAE,IACHN,KAAKA,GAAGO,MAAMC,SAASC,KAAI,EAAGN,OAAOO,KAAKC,MAAM,IAAI,CAAA,GACrDR,OAAO,CAACS,WAAWC,kBAAkBH,KAAKI,UAAUF,MAAAA,CAAAA,GAAUG,SAASC,WAAWC,QAAQ,EAC1Fd,OAAO,CAACS,WAAW,CAACM,iBAAiBC,IAAIT,KAAKI,UAAUF,MAAAA,CAAAA,EAASQ,KAAYC,iBAAU,MAAM,KAAA,CAAA,CAAA,EAC7FC,IAAI,CAACV,WAAWP,OAAOkB,KAAKb,KAAKc,OAAOZ,MAAAA,CAAAA,CAAAA,CAAAA,GAE/C;IAACZ;GAAG;AAGN,QAAMyB,kBAAkBC,aACtB,OAAOC,UAAAA;AAEL,UAAMC,OAAOD,OAAOE,WAAW,GAAA,IAAOF,MAAMG,MAAM,CAAA,EAAGC,YAAW,IAAMJ,OAAOI,YAAAA,KAAiB;AAC9F,UAAMC,UAAU,MAAMhC,IAAI2B,MAAMM,MAAMC,OAAO/B,MAAAA,CAAAA,EAASgC,IAAAA;AAEtD,UAAMC,WAAW,CAACC,WAAAA;AAChB,YAAMd,OAAOe,KAAIC,YAAYF,MAAAA;AAC7B,aAAOC,KAAIF,SAASC,MAAAA,KAAW;QAAC;QAA2B;UAAEG,IAAIjB;UAAMkB,cAAc;QAAa;;IACpG;AAEA,UAAMC,QACJV,SACI7B,OAAO,CAACkC,WAAWM,mBAAkBP,SAASC,MAAAA,GAASpC,CAAAA,EAAG8B,YAAW,EAAGa,SAAShB,IAAAA,CAAAA,EAClFN,IAAI,CAACe,WAAAA;AACJ,YAAMd,OAAOe,KAAIO,QAAQR,MAAAA;AACzB,YAAMS,OAAOvB,OACFwB,sBAAeC,WAAWC,eAAe9B,IAAIT,KAAKI,UAAUS,IAAAA,CAAAA,CAAAA,GAASuB,OAC5EI;AACJ,YAAMC,QAAQR,mBAAkBP,SAASC,MAAAA,GAASpC,CAAAA;AAClD,aAAO;QACLmD,IAAIf,OAAOe;QACXD;QACAL;QACAO,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAE;AACvB,gBAAMC,OAAO,IAAIL,KAAAA,KAAUb,KAAId,OAAOa,MAAAA,CAAAA;AAEtC,cAAIV,OAAOE,WAAW,GAAA,GAAM;AAC1B4B,8BAAkBH,MAAMC,MAAM,IAAIC,IAAAA;CAAQ;UAC5C,OAAO;AACLE,2BAAeJ,MAAMC,MAAM,GAAGC,IAAAA,GAAO;UACvC;QACF;MACF;IACF,CAAA,KAAM,CAAA;AAGV,UAAMG,aAA6B;MACjCP,IAAI;MACJD,OAAO;QAAC;QAAoB;UAAEX,IAAI9B,KAAK6B,YAAYqB,iBAASC,QAAQ;QAAE;;MACtEf,MAAM;MACNO,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAE;AACvB,cAAMO,MAAMF,iBAASG,KAAK;UAAEnC,MAAMA,QAAQsB;QAAU,CAAA;AACpDlD,YAAIgE,IAAIF,GAAAA;AACR,cAAMX,QAAQvB,QAAQ3B,EAAE,2BAA2B;UAAEuC,IAAI9B,KAAK6B,YAAYqB,iBAASC,QAAQ;QAAE,CAAA;AAC7F,cAAML,OAAO,IAAIL,KAAAA,KAAUb,KAAId,OAAOsC,GAAAA,CAAAA;AACtC,YAAInC,OAAOE,WAAW,GAAA,GAAM;AAC1B4B,4BAAkBH,MAAMC,MAAM,IAAIC,IAAAA;CAAQ;QAC5C,OAAO;AACLE,yBAAeJ,MAAMC,MAAM,GAAGC,IAAAA,GAAO;QACvC;MACF;IACF;AAEA,WAAO;MACL;QAAEJ,IAAI;QAAQV;MAAM;MACpB;QAAEU,IAAI;QAAUV,OAAO;UAACiB;;MAAY;;EAExC,GACA;IAAC3D;IAAIG;IAAQF;GAAE;AAGjB,SAAOwB;AACT;",
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"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getDocumentPath,
3
3
  getDocumentsPath
4
- } from "./chunk-67DKWOKF.mjs";
4
+ } from "./chunk-4ULSRZRL.mjs";
5
5
  import {
6
6
  getContentSnippet,
7
7
  getFallbackName,
@@ -12,17 +12,17 @@ import {
12
12
  } from "./chunk-KDN4GKG2.mjs";
13
13
  import {
14
14
  meta
15
- } from "./chunk-36QFEVOZ.mjs";
15
+ } from "./chunk-GUXWFDD4.mjs";
16
16
  import {
17
17
  MarkdownOperationHandlerSet
18
- } from "./chunk-CIJD7P6X.mjs";
18
+ } from "./chunk-BL46CERY.mjs";
19
19
  import {
20
20
  MarkdownCapabilities_exports,
21
21
  MarkdownEvents_exports,
22
22
  MarkdownOperation_exports,
23
23
  Markdown_exports,
24
24
  Settings_exports
25
- } from "./chunk-Y2LQRUU7.mjs";
25
+ } from "./chunk-CRKAIDRD.mjs";
26
26
  import {
27
27
  markdown_blueprint_default
28
28
  } from "./chunk-LXNSKCPD.mjs";