@dxos/plugin-markdown 0.8.4-staging.60fe92afc8 → 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.
- package/dist/lib/neutral/{MarkdownArticle-LWT5RFFJ.mjs → MarkdownArticle-I4UMD7AA.mjs} +3 -3
- package/dist/lib/neutral/MarkdownArticle-I4UMD7AA.mjs.map +7 -0
- package/dist/lib/neutral/{MarkdownCard-TBLIRDBO.mjs → MarkdownCard-OYO2HYZF.mjs} +2 -2
- package/dist/lib/neutral/MarkdownCard-OYO2HYZF.mjs.map +7 -0
- package/dist/lib/neutral/MarkdownPlugin.mjs +6 -9
- package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
- package/dist/lib/neutral/{MarkdownSettings-YCTZJL5V.mjs → MarkdownSettings-F5AWRDT3.mjs} +2 -2
- package/dist/lib/neutral/{MarkdownSettings-YCTZJL5V.mjs.map → MarkdownSettings-F5AWRDT3.mjs.map} +3 -3
- package/dist/lib/neutral/{app-graph-builder-BWBA23FF.mjs → app-graph-builder-6Y5NHTNR.mjs} +3 -4
- package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +6 -8
- package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
- package/dist/lib/neutral/capabilities/node.mjs +1 -1
- package/dist/lib/neutral/{chunk-67DKWOKF.mjs → chunk-4ULSRZRL.mjs} +3 -3
- package/dist/lib/neutral/chunk-4ULSRZRL.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BL46CERY.mjs +8 -0
- package/dist/lib/neutral/{chunk-Y2LQRUU7.mjs → chunk-CRKAIDRD.mjs} +11 -11
- package/dist/lib/neutral/chunk-CRKAIDRD.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GUXWFDD4.mjs +43 -0
- package/dist/lib/neutral/chunk-GUXWFDD4.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +9 -8
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +2 -2
- package/dist/lib/neutral/{create-JK35XC4R.mjs → create-XW2FQNLK.mjs} +2 -2
- package/dist/lib/neutral/{create-markdown-7MLE625M.mjs → create-markdown-KLSVQCT7.mjs} +2 -2
- package/dist/lib/neutral/{create-object-MU2LGXG6.mjs → create-object-3WMEQJ2C.mjs} +2 -2
- package/dist/lib/neutral/hooks/index.mjs +16 -12
- package/dist/lib/neutral/hooks/index.mjs.map +3 -3
- package/dist/lib/neutral/index.mjs +4 -4
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/{navigation-resolver-3KBOMN4U.mjs → navigation-resolver-3WEM7SSC.mjs} +3 -3
- package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs.map +7 -0
- package/dist/lib/neutral/{open-5YC77C4O.mjs → open-F7KLNKVN.mjs} +2 -2
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/{react-surface-XYZJBKHZ.mjs → react-surface-6LX4ZQ2H.mjs} +7 -12
- package/dist/lib/neutral/react-surface-6LX4ZQ2H.mjs.map +7 -0
- package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs → scroll-to-anchor-ACND3WJU.mjs} +2 -2
- package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs → set-view-mode-WDC7CAEC.mjs} +2 -2
- package/dist/lib/neutral/{settings-TDGDLCUR.mjs → settings-O6O6HT3I.mjs} +3 -3
- package/dist/lib/neutral/settings-O6O6HT3I.mjs.map +7 -0
- package/dist/lib/neutral/state-ZYT3JRWT.mjs +69 -0
- package/dist/lib/neutral/state-ZYT3JRWT.mjs.map +7 -0
- package/dist/lib/neutral/testing.mjs +2 -2
- package/dist/lib/neutral/testing.mjs.map +3 -3
- package/dist/lib/neutral/translations.mjs +1 -1
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/lib/neutral/{update-markdown-NNINDDV5.mjs → update-markdown-FGVN3LD4.mjs} +2 -2
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/editor-view-state.d.ts +7 -0
- package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +9 -16
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/node.d.ts +1 -6
- package/dist/types/src/capabilities/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +1 -1
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +2 -2
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +2 -2
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +4 -4
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/useExtensions.d.ts +3 -3
- package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +28 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/paths.d.ts.map +1 -1
- package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +31 -0
- package/package.json +41 -40
- package/src/MarkdownPlugin.test.ts +1 -1
- package/src/MarkdownPlugin.tsx +5 -10
- package/src/capabilities/app-graph-builder.ts +1 -3
- package/src/capabilities/editor-view-state.ts +28 -0
- package/src/capabilities/index.ts +2 -14
- package/src/capabilities/navigation-resolver.ts +2 -2
- package/src/capabilities/react-surface.tsx +20 -10
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/state.ts +8 -4
- package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +4 -4
- package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +4 -3
- package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +2 -2
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +1 -1
- package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +3 -4
- package/src/containers/MarkdownArticle/MarkdownArticle.tsx +3 -3
- package/src/containers/MarkdownCard/MarkdownCard.tsx +1 -1
- package/src/hooks/useEditorMenuOptions.ts +1 -1
- package/src/hooks/useExtensions.tsx +11 -11
- package/src/meta.ts +2 -22
- package/src/operations/create.conversations.json +1 -1
- package/src/operations/update.conversations.json +1 -1
- package/src/paths.ts +4 -2
- package/src/testing.ts +2 -2
- package/src/translations.ts +1 -1
- package/src/types/Markdown.ts +3 -3
- package/src/types/MarkdownCapabilities.ts +7 -5
- package/src/types/MarkdownEvents.ts +1 -1
- package/src/types/MarkdownOperation.ts +1 -1
- package/dist/lib/neutral/MarkdownArticle-LWT5RFFJ.mjs.map +0 -7
- package/dist/lib/neutral/MarkdownCard-TBLIRDBO.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs +0 -56
- package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-36QFEVOZ.mjs +0 -30
- package/dist/lib/neutral/chunk-36QFEVOZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-67DKWOKF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CIJD7P6X.mjs +0 -8
- package/dist/lib/neutral/chunk-Y2LQRUU7.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-XYZJBKHZ.mjs.map +0 -7
- package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +0 -7
- package/dist/lib/neutral/state-5COCF5PN.mjs +0 -44
- package/dist/lib/neutral/state-5COCF5PN.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -5
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
- package/src/capabilities/app-graph-serializer.ts +0 -64
- /package/dist/lib/neutral/{chunk-CIJD7P6X.mjs.map → chunk-BL46CERY.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-JK35XC4R.mjs.map → create-XW2FQNLK.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-markdown-7MLE625M.mjs.map → create-markdown-KLSVQCT7.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-object-MU2LGXG6.mjs.map → create-object-3WMEQJ2C.mjs.map} +0 -0
- /package/dist/lib/neutral/{open-5YC77C4O.mjs.map → open-F7KLNKVN.mjs.map} +0 -0
- /package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs.map → scroll-to-anchor-ACND3WJU.mjs.map} +0 -0
- /package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs.map → set-view-mode-WDC7CAEC.mjs.map} +0 -0
- /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": ";;;AAIA,SAA6BA,YAAY;;;ACGzC,SAASC,qBAAqB;AAC9B,OAAOC,UAAyBC,eAAAA,cAAaC,WAAAA,UAASC,YAAAA,iBAAgB;AACtE,SAASC,gBAAAA,qBAAoB;AAE7B,SAASC,eAAe;AACxB,SAASC,
|
|
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", "
|
|
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-
|
|
5
|
+
var MarkdownCard = lazy(() => import("../MarkdownCard-OYO2HYZF.mjs"));
|
|
6
6
|
var EditableMarkdownCard = lazy(() => import("../EditableMarkdownCard-AW7MD35U.mjs"));
|
|
7
|
-
var MarkdownArticle = lazy(() => import("../MarkdownArticle-
|
|
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-
|
|
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-
|
|
29
|
+
//# sourceMappingURL=create-XW2FQNLK.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MarkdownOperation_exports,
|
|
3
3
|
Markdown_exports
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
20
|
+
//# sourceMappingURL=create-markdown-KLSVQCT7.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getDocumentsPath
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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.
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
141
|
+
var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, viewState, previewOptions, platform }) => {
|
|
141
142
|
const extensions = [
|
|
142
|
-
|
|
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 = (
|
|
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
|
-
|
|
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:
|
|
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": ";;;;;;;;;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,
|
|
6
|
-
"names": ["useCallback", "useMemo", "useRef", "toLocalizedString", "useTranslation", "filterMenuGroups", "formattingCommands", "linkSlashCommands", "Domino", "meta", "useEditorMenuOptions", "editorView", "slashCommandGroups", "onLinkQuery", "t", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type UseEditorMenuProps,\n filterMenuGroups,\n formattingCommands,\n linkSlashCommands,\n} from '@dxos/react-ui-editor';\nimport { Domino } from '@dxos/ui';\n\nimport { meta } from '#meta';\n\nexport type UseEditorMenuOptionsProps = {\n editorView?: EditorView;\n slashCommandGroups?: EditorMenuGroup[];\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n};\n\nexport const useEditorMenuOptions = ({\n editorView,\n slashCommandGroups,\n onLinkQuery,\n}: UseEditorMenuOptionsProps): UseEditorMenuProps => {\n const { t } = useTranslation(meta.profile.key);\n\n const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(\n ({ text, trigger }) => {\n switch (trigger) {\n case '@': {\n return onLinkQuery?.(text) ?? [];\n }\n\n case '/':\n default: {\n return filterMenuGroups([formattingCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>\n text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,\n );\n }\n }\n },\n [slashCommandGroups, onLinkQuery],\n );\n\n const viewRef = useRef(editorView);\n return useMemo<UseEditorMenuProps>(() => {\n const trigger = onLinkQuery ? ['/', '@'] : ['/'];\n const placeholder = {\n delay: 3_000,\n content: () => {\n const pressEl = Domino.of('span').text('Press');\n const triggerEls = trigger.map((text) =>\n Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),\n );\n const forCommandsEl = Domino.of('span').text('for commands.');\n return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;\n },\n };\n\n return { viewRef, getMenu, trigger, placeholder };\n }, [getMenu, onLinkQuery]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ViewUpdate } from '@codemirror/view';\nimport { useMemo } from 'react';\n\nimport { Paths } from '@dxos/app-toolkit';\nimport { debounceAndThrottle } from '@dxos/async';\nimport { Obj } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-client';\nimport { invariant } from '@dxos/invariant';\nimport { getSpace, useObject } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { selectionAspect, type ViewStateManager } from '@dxos/react-ui-attention';\nimport { Text } from '@dxos/schema';\nimport { Domino } from '@dxos/ui';\nimport {\n Cursor,\n type EditorStateStore,\n EditorView,\n type Extension,\n InputModeExtensions,\n type PreviewOptions,\n createDataExtensions,\n decorateMarkdown,\n documentId,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n preview,\n replacer,\n selectionState,\n snippets,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';\nimport { isTruthy, safeUrl } from '@dxos/util';\n\nimport { Markdown } from '#types';\n\nimport { setFallbackName } from '../util';\n\nexport type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };\n\nexport type ExtensionsOptions = {\n id: string;\n object?: DocumentType;\n settings?: Markdown.Settings;\n compact?: boolean;\n viewMode?: EditorViewMode;\n editable?: boolean;\n viewState?: ViewStateManager;\n editorStateStore?: EditorStateStore;\n previewOptions?: PreviewOptions;\n platform?: 'mobile' | 'desktop';\n /** Callback when an internal link is clicked. */\n onSelectObject?: (objectId: string) => void;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n previewOptions,\n onSelectObject,\n}: ExtensionsOptions): Extension[] => {\n const { platform } = useThemeContext();\n const identity = useIdentity();\n const space = getSpace(object);\n\n // Get the content reference from Document objects.\n const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;\n // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).\n useObject(contentRef);\n // Get the actual live object target via .target (needed for createDocAccessor).\n const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);\n\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // TODO(burdon): Unsubscribe.\n // const query = space?.db.query(Filter.type(DocumentType));\n // query?.subscribe();\n\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n id,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n previewOptions,\n platform,\n onSelectObject,\n }),\n [\n id,\n object,\n compact,\n viewMode,\n viewState,\n previewOptions,\n settings,\n settings?.debug,\n settings?.editorInputMode,\n settings?.folding,\n settings?.numberedHeadings,\n platform,\n onSelectObject,\n ],\n );\n\n return useMemo<Extension[]>(\n () =>\n [\n // TODO(burdon): Pass this in?\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n target &&\n createDataExtensions({\n id,\n text: createDocAccessor(target, ['content']),\n messenger: space,\n identity,\n }),\n\n // TODO(burdon): Reconcile with effect in parent.\n Obj.instanceOf(Markdown.Document, object) &&\n listener({\n onChange: ({ text }) => {\n setFallbackName(object as Markdown.Document, text);\n },\n }),\n\n baseExtensions,\n selectionState(editorStateStore),\n ].filter(isTruthy),\n [identity, space, id, object, target, baseExtensions],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({\n id,\n object,\n onSelectObject,\n settings,\n compact,\n viewMode,\n viewState,\n previewOptions,\n platform,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n viewState && selectionChange(viewState),\n settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings?.folding && !compact && platform !== 'mobile' && folding(),\n ].filter(isTruthy);\n\n //\n // Markdown\n //\n if (viewMode !== 'source') {\n extensions.push(\n ...[\n formattingKeymap(),\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links render the label of the object.\n renderLinkButton: onSelectObject && createRenderLink(onSelectObject),\n }),\n linkTooltip(renderLinkTooltip),\n preview(previewOptions),\n replacer(),\n ],\n );\n }\n\n if (settings?.debug) {\n const items = settings.snippets?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(snippets({ items }));\n }\n }\n\n return extensions;\n};\n\nconst selectionChange = (viewState: ViewStateManager) => {\n const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {\n const id = update.state.facet(documentId);\n const cursorConverter = update.state.facet(Cursor.converter);\n const selection = update.state.selection;\n // NOTE: Filter on numeric offsets BEFORE converting to cursor strings.\n // Cursors are opaque (Automerge-encoded), so a lexicographic `to > from`\n // comparison is nondeterministic — it would let some cursor-placements\n // (where from === to numerically) through and reject genuine selections\n // depending on encoding, which made the comment button's enabled state\n // appear random across different lines.\n const ranges = selection.ranges\n .filter((range) => range.to > range.from)\n .map((range) => ({\n from: cursorConverter.toCursor(range.from),\n to: cursorConverter.toCursor(range.to),\n }));\n\n viewState.set(selectionAspect, id, { mode: 'multi-range', ranges });\n }, 100);\n\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.selectionSet) {\n debouncedHandler(update);\n }\n });\n};\n\nconst createRenderLink =\n (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>\n (el, { url }) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);\n const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;\n const icon = Domino.of('span')\n .classNames('dx-link ms-1 inline-block align-[-0.125em]')\n .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));\n\n if (isInternal) {\n invariant(qualifiedId, 'Invalid link format.');\n icon\n .attributes({ role: 'button', tabindex: '0' })\n .on('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onSelectObject(qualifiedId);\n })\n .on('keydown', (event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {\n return;\n }\n\n keyboardEvent.preventDefault();\n keyboardEvent.stopPropagation();\n onSelectObject(qualifiedId);\n });\n }\n\n el.appendChild(icon.root);\n };\n\nconst renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {\n el.appendChild(\n Domino.of('a')\n .attributes({ href: url, target: '_blank', rel: 'noreferrer' })\n .classNames('dx-link flex items-center gap-2')\n .text(safeUrl(url)?.toString() ?? url)\n .append(Domino.svg('ph--arrow-square-out--regular')).root,\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport { useCallback, useMemo } from 'react';\n\nimport { Annotation, type Database, Filter, Obj, Query, Type } from '@dxos/echo';\nimport { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';\nimport { Kind as EntityKind } from '@dxos/echo/Entity';\nimport { type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';\nimport { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';\n\nimport { Markdown } from '../types';\n\nexport const useLinkQuery = (db: Database.Database | undefined) => {\n const { t } = useTranslation();\n\n const filter = useMemo(\n () =>\n Filter.or(\n ...(db ? db.graph.registry.list().filter(Type.isType) : [])\n .filter((schema) => getTypeAnnotation(Type.getSchema(schema))?.kind !== EntityKind.Relation)\n .filter((schema) => !HiddenAnnotation.get(Type.getSchema(schema)).pipe(Option.getOrElse(() => false)))\n .map((schema) => Filter.type(Type.getURI(schema))),\n ),\n [db],\n );\n\n const handleLinkQuery = useCallback(\n async (query?: string): Promise<EditorMenuGroup[]> => {\n // A second \"@\" switches the link query into block-embed mode, so \"@@foo\" searches for \"foo\".\n const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');\n const results = await db?.query(Query.select(filter)).run();\n\n const getLabel = (object: Obj.Unknown): Label => {\n const type = Obj.getTypename(object)!;\n return Obj.getLabel(object) ?? ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];\n };\n\n const items =\n results\n ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))\n .map((object: Obj.Unknown): EditorMenuItem => {\n const type = Obj.getType(object);\n const icon = type\n ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(type)))?.icon\n : undefined;\n const label = toLocalizedString(getLabel(object), t);\n return {\n id: object.id,\n label,\n icon,\n onSelect: ({ view, head }) => {\n const link = `[${label}](${Obj.getURI(object)})`;\n // \"@@\" inserts a block embed on its own line instead of an inline link.\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n }) ?? [];\n\n // Add \"Create new document\" option at the end.\n const createItem: EditorMenuItem = {\n id: 'create-document',\n label: ['add-object.label', { ns: Type.getTypename(Markdown.Document) }],\n icon: 'ph--plus--regular',\n onSelect: ({ view, head }) => {\n const doc = Markdown.make({ name: name || undefined });\n db?.add(doc);\n const label = name || t('object-name.placeholder', { ns: Type.getTypename(Markdown.Document) });\n const link = `[${label}](${Obj.getURI(doc)})`;\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n\n return [\n { id: 'echo', items },\n { id: 'create', items: [createItem] },\n ];\n },\n [db, filter, t],\n );\n\n return handleLinkQuery;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useMemo", "useRef", "toLocalizedString", "useTranslation", "filterMenuGroups", "formattingCommands", "linkSlashCommands", "Domino", "meta", "useEditorMenuOptions", "editorView", "slashCommandGroups", "onLinkQuery", "t", "profile", "key", "getMenu", "text", "trigger", "item", "label", "toLowerCase", "includes", "viewRef", "placeholder", "delay", "content", "pressEl", "of", "triggerEls", "map", "classNames", "forCommandsEl", "append", "root", "useMemo", "Paths", "debounceAndThrottle", "Obj", "createDocAccessor", "invariant", "getSpace", "useObject", "useIdentity", "useThemeContext", "selectionAspect", "Text", "Domino", "Cursor", "EditorView", "InputModeExtensions", "createDataExtensions", "decorateMarkdown", "documentId", "folding", "formattingKeymap", "linkTooltip", "listener", "preview", "replacer", "selectionState", "snippets", "isTruthy", "safeUrl", "Markdown", "identity", "useIdentity", "space", "getSpace", "object", "contentRef", "instanceOf", "useObject", "target", "settings", "compact", "viewMode", "viewState", "previewOptions", "platform", "onSelectObject", "id", "folding", "numberedHeadings", "createDocAccessor", "messenger", "Obj", "setFallbackName", "text", "baseExtensions", "selectionState", "filter", "selectionChange", "editorInputMode", "isTruthy", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "undefined", "renderLinkButton", "linkTooltip", "renderLinkTooltip", "preview", "replacer", "items", "extensions", "snippets", "update", "cursorConverter", "facet", "converter", "selection", "toCursor", "range", "set", "selectionAspect", "mode", "ranges", "debouncedHandler", "isInternal", "url", "startsWith", "icon", "Domino", "classNames", "invariant", "qualifiedId", "attributes", "tabindex", "on", "event", "preventDefault", "stopPropagation", "keyboardEvent", "appendChild", "el", "rel", "Option", "useCallback", "useMemo", "Annotation", "Filter", "Obj", "Query", "Type", "HiddenAnnotation", "getTypeAnnotation", "Kind", "EntityKind", "toLocalizedString", "useTranslation", "insertAtCursor", "insertAtLineStart", "useLinkQuery", "db", "t", "useTranslation", "filter", "useMemo", "Filter", "or", "graph", "registry", "list", "Type", "isType", "schema", "getTypeAnnotation", "getSchema", "kind", "EntityKind", "Relation", "HiddenAnnotation", "get", "pipe", "getOrElse", "map", "type", "getURI", "handleLinkQuery", "useCallback", "query", "name", "startsWith", "slice", "toLowerCase", "results", "Query", "select", "run", "getLabel", "object", "Obj", "getTypename", "ns", "defaultValue", "items", "toLocalizedString", "includes", "getType", "icon", "getOrUndefined", "Annotation", "IconAnnotation", "undefined", "label", "id", "onSelect", "view", "head", "link", "insertAtLineStart", "insertAtCursor", "createItem", "Markdown", "Document", "doc", "make", "add"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getDocumentPath,
|
|
3
3
|
getDocumentsPath
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
15
|
+
} from "./chunk-GUXWFDD4.mjs";
|
|
16
16
|
import {
|
|
17
17
|
MarkdownOperationHandlerSet
|
|
18
|
-
} from "./chunk-
|
|
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-
|
|
25
|
+
} from "./chunk-CRKAIDRD.mjs";
|
|
26
26
|
import {
|
|
27
27
|
markdown_blueprint_default
|
|
28
28
|
} from "./chunk-LXNSKCPD.mjs";
|