@dxos/plugin-markdown 0.7.4 → 0.7.5-main.9cb18ac

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 (65) hide show
  1. package/dist/lib/browser/{MarkdownContainer-6OPC5MKP.mjs → MarkdownContainer-XY6NEUOA.mjs} +86 -86
  2. package/dist/lib/browser/MarkdownContainer-XY6NEUOA.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-CMSUKMPM.mjs → chunk-6FIHBJRV.mjs} +27 -7
  4. package/dist/lib/browser/chunk-6FIHBJRV.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-TZN5FGB2.mjs → chunk-R4MG2DP2.mjs} +6 -6
  6. package/dist/lib/browser/chunk-R4MG2DP2.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +88 -174
  8. package/dist/lib/browser/index.mjs.map +3 -3
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/types/index.mjs +1 -1
  11. package/dist/lib/node/{MarkdownContainer-6OKJOHTZ.cjs → MarkdownContainer-EX6YDF6J.cjs} +78 -78
  12. package/dist/lib/node/MarkdownContainer-EX6YDF6J.cjs.map +7 -0
  13. package/dist/lib/node/{chunk-YGMWZIIJ.cjs → chunk-CQMXZ54Z.cjs} +28 -8
  14. package/dist/lib/node/chunk-CQMXZ54Z.cjs.map +7 -0
  15. package/dist/lib/node/{chunk-KEPAM4JP.cjs → chunk-SXQAPZZU.cjs} +9 -9
  16. package/dist/lib/node/chunk-SXQAPZZU.cjs.map +7 -0
  17. package/dist/lib/node/index.cjs +123 -209
  18. package/dist/lib/node/index.cjs.map +3 -3
  19. package/dist/lib/node/meta.json +1 -1
  20. package/dist/lib/node/types/index.cjs +5 -5
  21. package/dist/lib/node/types/index.cjs.map +1 -1
  22. package/dist/lib/node-esm/{MarkdownContainer-GBNSGROQ.mjs → MarkdownContainer-E7W623A7.mjs} +86 -86
  23. package/dist/lib/node-esm/MarkdownContainer-E7W623A7.mjs.map +7 -0
  24. package/dist/lib/node-esm/{chunk-NUMUUCYF.mjs → chunk-Y76MM22C.mjs} +6 -6
  25. package/dist/lib/node-esm/chunk-Y76MM22C.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-ERJ52KN2.mjs → chunk-ZVFBKBSA.mjs} +27 -7
  27. package/dist/lib/node-esm/chunk-ZVFBKBSA.mjs.map +7 -0
  28. package/dist/lib/node-esm/index.mjs +88 -174
  29. package/dist/lib/node-esm/index.mjs.map +3 -3
  30. package/dist/lib/node-esm/meta.json +1 -1
  31. package/dist/lib/node-esm/types/index.mjs +1 -1
  32. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  33. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  34. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  35. package/dist/types/src/extensions.d.ts +2 -2
  36. package/dist/types/src/extensions.d.ts.map +1 -1
  37. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  38. package/dist/types/src/types/index.d.ts +1 -1
  39. package/dist/types/src/types/index.d.ts.map +1 -1
  40. package/dist/types/src/types/schema.d.ts +82 -0
  41. package/dist/types/src/types/schema.d.ts.map +1 -0
  42. package/dist/types/src/types/types.d.ts +31 -12
  43. package/dist/types/src/types/types.d.ts.map +1 -1
  44. package/dist/types/tsconfig.tsbuildinfo +1 -0
  45. package/package.json +30 -29
  46. package/src/MarkdownPlugin.tsx +84 -149
  47. package/src/components/MarkdownContainer.tsx +8 -3
  48. package/src/components/MarkdownEditor.tsx +5 -13
  49. package/src/extensions.tsx +9 -10
  50. package/src/hooks/useSelectCurrentThread.tsx +17 -14
  51. package/src/types/index.ts +1 -1
  52. package/src/types/{document.ts → schema.ts} +4 -3
  53. package/src/types/types.ts +21 -15
  54. package/src/util.tsx +3 -3
  55. package/dist/lib/browser/MarkdownContainer-6OPC5MKP.mjs.map +0 -7
  56. package/dist/lib/browser/chunk-CMSUKMPM.mjs.map +0 -7
  57. package/dist/lib/browser/chunk-TZN5FGB2.mjs.map +0 -7
  58. package/dist/lib/node/MarkdownContainer-6OKJOHTZ.cjs.map +0 -7
  59. package/dist/lib/node/chunk-KEPAM4JP.cjs.map +0 -7
  60. package/dist/lib/node/chunk-YGMWZIIJ.cjs.map +0 -7
  61. package/dist/lib/node-esm/MarkdownContainer-GBNSGROQ.mjs.map +0 -7
  62. package/dist/lib/node-esm/chunk-ERJ52KN2.mjs.map +0 -7
  63. package/dist/lib/node-esm/chunk-NUMUUCYF.mjs.map +0 -7
  64. package/dist/types/src/types/document.d.ts +0 -106
  65. package/dist/types/src/types/document.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownContainer.tsx", "../../../src/components/MarkdownEditor.tsx", "../../../src/hooks/useSelectCurrentThread.tsx", "../../../src/extensions.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useResolvePlugin, parseFileManagerPlugin } from '@dxos/app-framework';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\n\nimport { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';\nimport { useExtensions } from '../extensions';\nimport { DocumentType, type MarkdownSettingsProps } from '../types';\nimport { getFallbackName } from '../util';\n\nexport type MarkdownContainerProps = Pick<\n MarkdownEditorProps,\n 'role' | 'extensionProviders' | 'viewMode' | 'editorStateStore' | 'onViewModeChange'\n> & {\n id: string;\n object: DocumentType | any;\n settings: MarkdownSettingsProps;\n};\n\n// TODO(burdon): Move toolbar here.\n// TODO(burdon): Factor out difference for ECHO and non-ECHO objects; i.e., single component.\nconst MarkdownContainer = ({\n id,\n role,\n object,\n extensionProviders,\n settings,\n viewMode,\n editorStateStore,\n onViewModeChange,\n}: MarkdownContainerProps) => {\n const scrollPastEnd = role === 'article';\n const doc = object instanceof DocumentType ? object : undefined;\n const extensions = useExtensions({ extensionProviders, document: doc, settings, viewMode, editorStateStore });\n\n if (doc) {\n return (\n <DocumentEditor\n id={fullyQualifiedId(object)}\n role={role}\n document={doc}\n extensions={extensions}\n viewMode={viewMode}\n settings={settings}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n } else {\n return (\n <MarkdownEditor\n id={id}\n role={role}\n initialValue={object.text}\n extensions={extensions}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n }\n};\n\ntype DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &\n Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions'> & {\n document: DocumentType;\n };\n\nexport const DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }: DocumentEditorProps) => {\n const space = getSpace(doc);\n\n // Migrate gradually to `fallbackName`.\n useEffect(() => {\n if (typeof doc.fallbackName === 'string') {\n return;\n }\n\n const fallbackName = doc.content?.target?.content ? getFallbackName(doc.content.target.content) : undefined;\n if (fallbackName) {\n doc.fallbackName = fallbackName;\n }\n }, [doc, doc.content]);\n\n // File dragging.\n const fileManagerPlugin = useResolvePlugin(parseFileManagerPlugin);\n const handleFileUpload = useMemo(() => {\n if (space === undefined || fileManagerPlugin?.provides.file.upload === undefined) {\n return undefined;\n }\n\n // TODO(burdon): Re-order props: space, file.\n return async (file: File) => fileManagerPlugin?.provides?.file?.upload?.(file, space);\n }, [space, fileManagerPlugin]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={doc.content?.target?.content}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n onFileUpload={handleFileUpload}\n {...props}\n />\n );\n};\n\nexport default MarkdownContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { type EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport { createIntent, type FileInfo, LayoutAction, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type EditorSelectionState,\n type EditorStateStore,\n Toolbar,\n type UseTextEditorProps,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n editorContent,\n editorGutter,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx, textBlockWidth } from '@dxos/react-ui-theme';\nimport { isNotFalsy, nonNullable } from '@dxos/util';\n\nimport { useSelectCurrentThread } from '../hooks';\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport { type MarkdownPluginState } from '../types';\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n role?: string;\n inputMode?: EditorInputMode;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\n/**\n * Base markdown editor component.\n *\n * This component provides all the features of the markdown editor that do no depend on ECHO.\n * This allows it to be used as a common editor for markdown content on arbitrary backends (e.g. files).\n */\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n toolbar,\n viewMode,\n editorStateStore,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const [formattingState, formattingObserver] = useFormattingState();\n const { hasAttention } = useAttention(id);\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n // Extensions from other plugins.\n // TODO(burdon): Reconcile with DocumentEditor.useExtensions.\n const providerExtensions = useMemo(\n () => extensionProviders?.flatMap((provider) => provider({})).filter(nonNullable),\n [extensionProviders],\n );\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(async () => {\n await dispatch(createIntent(NavigationAction.Open, { activeParts: { complementary: 'comments' } }));\n await dispatch(createIntent(LayoutAction.SetLayout, { element: 'complementary', state: true }));\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processAction(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n commentObserver,\n commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: { content: { className: editorContent } },\n }),\n editorGutter,\n role !== 'section' && onFileUpload && dropFile({ onDrop: handleDrop }),\n providerExtensions,\n extensions,\n ].filter(isNotFalsy),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racy.\n // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n useSelectCurrentThread(editorView, id);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = (action: Action) => {\n switch (action.type) {\n case 'search': {\n if (editorView) {\n openSearchPanel(editorView);\n }\n return;\n }\n case 'view-mode': {\n onViewModeChange?.(id, action.data);\n return;\n }\n }\n\n handleToolbarAction?.(action);\n };\n\n return (\n <StackItem.Content toolbar={toolbar}>\n {toolbar && (\n <div\n role='none'\n className={mx(\n 'attention-surface is-full border-be !border-separator',\n role === 'section' && 'sticky block-start-0 z-[1] -mbe-px min-is-0',\n )}\n >\n <Toolbar.Root\n classNames={[textBlockWidth, !hasAttention && 'opacity-20']}\n state={formattingState && { ...formattingState, ...commentsState }}\n onAction={handleAction}\n >\n <Toolbar.Markdown />\n {onFileUpload && <Toolbar.Custom onUpload={onFileUpload} />}\n <Toolbar.Separator />\n <Toolbar.View mode={viewMode ?? DEFAULT_VIEW_MODE} />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={mx(\n 'ch-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface',\n role === 'article' ? 'min-bs-0' : '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24',\n )}\n {...focusAttributes}\n />\n </StackItem.Content>\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) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { useMemo } from 'react';\n\nimport { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { Cursor, setSelection } from '@dxos/react-ui-editor';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\n\n/**\n * Handle scrolling and selection of the current thread in a markdown editor.\n */\nexport const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver(\n LayoutAction.ScrollIntoView,\n ({ cursor }) => {\n invariant(editorView, 'Editor view is not defined.');\n const range = Cursor.getRangeFromCursor(editorView.state, cursor!);\n if (range) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: documentId }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n },\n {\n disposition: 'hoist',\n filter: (data) => !!editorView && data.id === documentId && !!data.cursor,\n },\n ),\n [documentId, editorView],\n );\n\n useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { createIntent, NavigationAction, type PromiseIntentDispatcher, useIntentDispatcher } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { createDocAccessor, fullyQualifiedId, getSpace, type Query } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ThemeProvider } from '@dxos/react-ui';\nimport {\n type AutocompleteResult,\n type EditorStateStore,\n type EditorViewMode,\n type Extension,\n InputModeExtensions,\n createDataExtensions,\n autocomplete,\n decorateMarkdown,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n selectionState,\n typewriter,\n} from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type DocumentType, type MarkdownPluginState, type MarkdownSettingsProps } from './types';\nimport { setFallbackName } from './util';\n\ntype ExtensionsOptions = {\n document?: DocumentType;\n dispatch?: PromiseIntentDispatcher;\n query?: Query<DocumentType>;\n settings: MarkdownSettingsProps;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n document,\n settings,\n viewMode,\n editorStateStore,\n extensionProviders,\n}: ExtensionsOptions & Pick<MarkdownPluginState, 'extensionProviders'>): Extension[] => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const space = getSpace(document);\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.schema(DocumentType));\n // query?.subscribe();\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n document,\n settings,\n viewMode,\n dispatch,\n // query,\n }),\n [\n document,\n viewMode,\n dispatch,\n settings,\n settings.editorInputMode,\n settings.folding,\n settings.numberedHeadings,\n settings.debug,\n settings.typewriter,\n ],\n );\n\n //\n // External extensions from other plugins.\n //\n const pluginExtensions = useMemo<Extension[] | undefined>(\n () =>\n extensionProviders?.reduce((acc: Extension[], provider) => {\n const extension = typeof provider === 'function' ? provider({ document }) : provider;\n if (extension) {\n acc.push(extension);\n }\n\n return acc;\n }, []),\n [extensionProviders, document],\n );\n\n //\n // Basic plugins.\n //\n return useMemo<Extension[]>(\n () =>\n [\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n document &&\n createDataExtensions({\n id: document.id,\n text: document.content.target && createDocAccessor(document.content.target, ['content']),\n space,\n identity,\n }),\n selectionState(editorStateStore),\n document &&\n listener({\n onChange: (text) => setFallbackName(document, text),\n }),\n baseExtensions,\n pluginExtensions,\n ].filter(isNotFalsy),\n [baseExtensions, pluginExtensions, document, document?.content?.target, space, identity],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({ document, dispatch, settings, query, viewMode }: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n settings.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings.folding && folding(),\n ].filter(isNotFalsy);\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, consider ignoring the link text and rendering the label of the object being linked to.\n renderLinkButton:\n dispatch && document\n ? onRenderLink((id: string) => {\n void dispatch(\n createIntent(NavigationAction.AddToActive, {\n id,\n part: 'main',\n pivotId: fullyQualifiedId(document),\n scrollIntoView: true,\n }),\n );\n })\n : undefined,\n }),\n linkTooltip(renderLinkTooltip),\n ],\n );\n }\n\n //\n // Autocomplete object links.\n //\n if (query) {\n extensions.push(\n autocomplete({\n onSearch: (text: string) => {\n // TODO(burdon): Specify filter (e.g., stack).\n return query.objects\n .map<AutocompleteResult | undefined>((object) =>\n object.name?.length && object.id !== document?.id\n ? {\n label: object.name,\n // TODO(burdon): Factor out URL builder.\n apply: `[${object.name}](/${fullyQualifiedId(object)})`,\n }\n : undefined,\n )\n .filter(isNotFalsy);\n },\n }),\n );\n }\n\n if (settings.debug) {\n const items = settings.typewriter?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(typewriter({ items }));\n }\n }\n\n return extensions;\n};\n\n// TODO(burdon): Factor out styles.\nconst style = {\n hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',\n icon: 'inline-block leading-none mis-1 cursor-pointer',\n};\n\nconst onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal =\n url.startsWith('/') ||\n // TODO(wittjosiah): This should probably be parsed out on paste?\n url.startsWith(window.location.origin);\n\n const options: AnchorHTMLAttributes<any> = isInternal\n ? {\n onClick: () => {\n const qualifiedId = url.split('/').at(-1);\n invariant(qualifiedId, 'Invalid link format.');\n onSelectObject(qualifiedId);\n },\n }\n : {\n href: url,\n rel: 'noreferrer',\n target: '_blank',\n };\n\n renderRoot(\n el,\n <a {...options} className={style.hover}>\n <Icon\n icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}\n size={4}\n classNames={style.icon}\n />\n </a>,\n );\n};\n\nconst renderLinkTooltip = (el: Element, url: string) => {\n const web = new URL(url);\n renderRoot(\n el,\n <a href={url} rel='noreferrer' target='_blank' className={style.hover}>\n {web.origin}\n <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />\n </a>,\n );\n};\n\n// TODO(burdon): Remove react rendering; use DOM directly.\nexport const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {\n createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);\n return root;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useEffect", "useMemo", "useResolvePlugin", "parseFileManagerPlugin", "fullyQualifiedId", "getSpace", "openSearchPanel", "React", "useMemo", "useEffect", "useCallback", "createIntent", "LayoutAction", "NavigationAction", "useIntentDispatcher", "useThemeContext", "useTranslation", "useAttention", "Toolbar", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "editorContent", "editorGutter", "processAction", "useActionHandler", "useCommentState", "useCommentClickListener", "useFormattingState", "useTextEditor", "StackItem", "mx", "textBlockWidth", "isNotFalsy", "nonNullable", "EditorView", "useMemo", "createResolver", "LayoutAction", "useIntentResolver", "invariant", "Cursor", "setSelection", "useSelectCurrentThread", "editorView", "documentId", "scrollIntoViewResolver", "useMemo", "createResolver", "LayoutAction", "ScrollIntoView", "cursor", "invariant", "range", "Cursor", "getRangeFromCursor", "state", "selection", "main", "from", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "dispatch", "disposition", "filter", "data", "id", "useIntentResolver", "MARKDOWN_PLUGIN", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "toolbar", "viewMode", "editorStateStore", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatchPromise", "dispatch", "useIntentDispatcher", "formattingState", "formattingObserver", "useFormattingState", "hasAttention", "useAttention", "scrollTo", "selection", "useMemo", "getState", "providerExtensions", "flatMap", "provider", "filter", "nonNullable", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "createIntent", "NavigationAction", "Open", "activeParts", "complementary", "LayoutAction", "SetLayout", "element", "state", "commentClickObserver", "useCommentClickListener", "handleDrop", "view", "files", "file", "info", "undefined", "processAction", "type", "data", "url", "parentRef", "editorView", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "isNotFalsy", "moveToEndOfLine", "useTest", "useSelectCurrentThread", "handleToolbarAction", "useActionHandler", "handleAction", "action", "openSearchPanel", "StackItem", "Content", "div", "mx", "Toolbar", "Root", "classNames", "textBlockWidth", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "useEffect", "composer", "window", "React", "useMemo", "createRoot", "createIntent", "NavigationAction", "useIntentDispatcher", "invariant", "createDocAccessor", "fullyQualifiedId", "getSpace", "useIdentity", "Icon", "ThemeProvider", "InputModeExtensions", "createDataExtensions", "autocomplete", "decorateMarkdown", "folding", "formattingKeymap", "linkTooltip", "listener", "selectionState", "typewriter", "defaultTx", "isNotFalsy", "useExtensions", "document", "settings", "viewMode", "editorStateStore", "extensionProviders", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "space", "getSpace", "baseExtensions", "useMemo", "createBaseExtensions", "editorInputMode", "folding", "numberedHeadings", "debug", "typewriter", "pluginExtensions", "reduce", "acc", "provider", "extension", "push", "createDataExtensions", "id", "text", "content", "target", "createDocAccessor", "selectionState", "listener", "onChange", "setFallbackName", "filter", "isNotFalsy", "query", "extensions", "InputModeExtensions", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "from", "undefined", "renderLinkButton", "onRenderLink", "createIntent", "NavigationAction", "AddToActive", "part", "pivotId", "fullyQualifiedId", "scrollIntoView", "linkTooltip", "renderLinkTooltip", "autocomplete", "onSearch", "objects", "map", "object", "name", "length", "label", "apply", "items", "split", "style", "hover", "icon", "onSelectObject", "el", "url", "isInternal", "startsWith", "window", "location", "origin", "options", "onClick", "qualifiedId", "at", "invariant", "href", "rel", "renderRoot", "React", "a", "className", "Icon", "size", "classNames", "web", "URL", "root", "node", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "MarkdownContainer", "id", "role", "object", "extensionProviders", "settings", "viewMode", "editorStateStore", "onViewModeChange", "scrollPastEnd", "doc", "DocumentType", "undefined", "extensions", "useExtensions", "document", "React", "DocumentEditor", "fullyQualifiedId", "MarkdownEditor", "initialValue", "text", "toolbar", "inputMode", "editorInputMode", "props", "space", "getSpace", "useEffect", "fallbackName", "content", "target", "getFallbackName", "fileManagerPlugin", "useResolvePlugin", "parseFileManagerPlugin", "handleFileUpload", "useMemo", "provides", "file", "upload", "onFileUpload"]
7
+ }
@@ -2,11 +2,11 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  DocumentType,
4
4
  TextType
5
- } from "./chunk-ERJ52KN2.mjs";
5
+ } from "./chunk-ZVFBKBSA.mjs";
6
6
 
7
7
  // packages/plugins/plugin-markdown/src/util.tsx
8
8
  import { debounce } from "@dxos/async";
9
- import { create, createObject, isEchoObject, loadObjectReferences } from "@dxos/react-client/echo";
9
+ import { create, createObject, isEchoObject, loadObjectReferences, makeRef } from "@dxos/react-client/echo";
10
10
  var isMarkdownProperties = (data) => isEchoObject(data) ? true : data && typeof data === "object" ? "title" in data && typeof data.title === "string" : false;
11
11
  var markdownExtensionPlugins = (plugins) => {
12
12
  return plugins.filter((plugin) => Boolean(plugin.provides?.markdown));
@@ -27,7 +27,7 @@ var serializer = {
27
27
  return JSON.stringify({
28
28
  name: object.name,
29
29
  fallbackName: object.fallbackName,
30
- content: content.content
30
+ content: content.target?.content
31
31
  });
32
32
  },
33
33
  deserialize: async ({ content: serialized }) => {
@@ -35,9 +35,9 @@ var serializer = {
35
35
  return createObject(create(DocumentType, {
36
36
  name,
37
37
  fallbackName,
38
- content: create(TextType, {
38
+ content: makeRef(create(TextType, {
39
39
  content
40
- }),
40
+ })),
41
41
  threads: []
42
42
  }));
43
43
  }
@@ -50,4 +50,4 @@ export {
50
50
  setFallbackName,
51
51
  serializer
52
52
  };
53
- //# sourceMappingURL=chunk-NUMUUCYF.mjs.map
53
+ //# sourceMappingURL=chunk-Y76MM22C.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { type TypedObjectSerializer } from '@dxos/plugin-space/types';\nimport { create, createObject, isEchoObject, loadObjectReferences, makeRef } from '@dxos/react-client/echo';\n\nimport { DocumentType, type MarkdownProperties, type MarkdownExtensionProvides, TextType } from './types';\n\nexport const isMarkdownProperties = (data: unknown): data is MarkdownProperties =>\n isEchoObject(data)\n ? true\n : data && typeof data === 'object'\n ? 'title' in data && typeof data.title === 'string'\n : false;\n\ntype MarkdownExtensionPlugin = Plugin<MarkdownExtensionProvides>;\n\nexport const markdownExtensionPlugins = (plugins: Plugin[]): MarkdownExtensionPlugin[] => {\n return (plugins as MarkdownExtensionPlugin[]).filter((plugin) => Boolean(plugin.provides?.markdown));\n};\n\nconst nonTitleChars = /[^\\w ]/g;\n\nexport const getFallbackName = (content: string) => {\n return content.substring(0, 31).split('\\n')[0].replaceAll(nonTitleChars, '').trim();\n};\n\nexport const setFallbackName = debounce((doc: DocumentType, content: string) => {\n const name = getFallbackName(content);\n if (doc.fallbackName !== name) {\n doc.fallbackName = name;\n }\n}, 200);\n\nexport const serializer: TypedObjectSerializer<DocumentType> = {\n serialize: async ({ object }): Promise<string> => {\n const content = await loadObjectReferences(object, (doc) => doc.content);\n return JSON.stringify({ name: object.name, fallbackName: object.fallbackName, content: content.target?.content });\n },\n\n deserialize: async ({ content: serialized }) => {\n const { name, fallbackName, content } = JSON.parse(serialized);\n return createObject(\n create(DocumentType, { name, fallbackName, content: makeRef(create(TextType, { content })), threads: [] }),\n );\n },\n};\n"],
5
+ "mappings": ";;;;;;;AAKA,SAASA,gBAAgB;AAEzB,SAASC,QAAQC,cAAcC,cAAcC,sBAAsBC,eAAe;AAI3E,IAAMC,uBAAuB,CAACC,SACnCC,aAAaD,IAAAA,IACT,OACAA,QAAQ,OAAOA,SAAS,WACtB,WAAWA,QAAQ,OAAOA,KAAKE,UAAU,WACzC;AAID,IAAMC,2BAA2B,CAACC,YAAAA;AACvC,SAAQA,QAAsCC,OAAO,CAACC,WAAWC,QAAQD,OAAOE,UAAUC,QAAAA,CAAAA;AAC5F;AAEA,IAAMC,gBAAgB;AAEf,IAAMC,kBAAkB,CAACC,YAAAA;AAC9B,SAAOA,QAAQC,UAAU,GAAG,EAAA,EAAIC,MAAM,IAAA,EAAM,CAAA,EAAGC,WAAWL,eAAe,EAAA,EAAIM,KAAI;AACnF;AAEO,IAAMC,kBAAkBC,SAAS,CAACC,KAAmBP,YAAAA;AAC1D,QAAMQ,OAAOT,gBAAgBC,OAAAA;AAC7B,MAAIO,IAAIE,iBAAiBD,MAAM;AAC7BD,QAAIE,eAAeD;EACrB;AACF,GAAG,GAAA;AAEI,IAAME,aAAkD;EAC7DC,WAAW,OAAO,EAAEC,OAAM,MAAE;AAC1B,UAAMZ,UAAU,MAAMa,qBAAqBD,QAAQ,CAACL,QAAQA,IAAIP,OAAO;AACvE,WAAOc,KAAKC,UAAU;MAAEP,MAAMI,OAAOJ;MAAMC,cAAcG,OAAOH;MAAcT,SAASA,QAAQgB,QAAQhB;IAAQ,CAAA;EACjH;EAEAiB,aAAa,OAAO,EAAEjB,SAASkB,WAAU,MAAE;AACzC,UAAM,EAAEV,MAAMC,cAAcT,QAAO,IAAKc,KAAKK,MAAMD,UAAAA;AACnD,WAAOE,aACLC,OAAOC,cAAc;MAAEd;MAAMC;MAAcT,SAASuB,QAAQF,OAAOG,UAAU;QAAExB;MAAQ,CAAA,CAAA;MAAKyB,SAAS,CAAA;IAAG,CAAA,CAAA;EAE5G;AACF;",
6
+ "names": ["debounce", "create", "createObject", "isEchoObject", "loadObjectReferences", "makeRef", "isMarkdownProperties", "data", "isEchoObject", "title", "markdownExtensionPlugins", "plugins", "filter", "plugin", "Boolean", "provides", "markdown", "nonTitleChars", "getFallbackName", "content", "substring", "split", "replaceAll", "trim", "setFallbackName", "debounce", "doc", "name", "fallbackName", "serializer", "serialize", "object", "loadObjectReferences", "JSON", "stringify", "target", "deserialize", "serialized", "parse", "createObject", "create", "DocumentType", "makeRef", "TextType", "threads"]
7
+ }
@@ -3,8 +3,8 @@ import {
3
3
  MARKDOWN_PLUGIN
4
4
  } from "./chunk-BABK7FMW.mjs";
5
5
 
6
- // packages/plugins/plugin-markdown/src/types/document.ts
7
- import { ref, S, TypedObject } from "@dxos/echo-schema";
6
+ // packages/plugins/plugin-markdown/src/types/schema.ts
7
+ import { Ref, S, TypedObject } from "@dxos/echo-schema";
8
8
  import { ThreadType } from "@dxos/plugin-space/types";
9
9
  var TextType = class extends TypedObject({
10
10
  typename: "dxos.org/type/Text",
@@ -19,18 +19,38 @@ var DocumentType = class extends TypedObject({
19
19
  })({
20
20
  name: S.optional(S.String),
21
21
  fallbackName: S.optional(S.String),
22
- content: ref(TextType),
23
- threads: S.mutable(S.Array(ref(ThreadType)))
22
+ content: Ref(TextType),
23
+ threads: S.mutable(S.Array(Ref(ThreadType)))
24
24
  }) {
25
25
  };
26
26
  var isEditorModel = (data) => data && typeof data === "object" && "id" in data && typeof data.id === "string" && "text" in data && typeof data.text === "string";
27
27
 
28
28
  // packages/plugins/plugin-markdown/src/types/types.ts
29
+ import { S as S2 } from "@dxos/echo-schema";
30
+ import { EditorViewMode } from "@dxos/react-ui-editor";
29
31
  var MARKDOWN_ACTION = `${MARKDOWN_PLUGIN}/action`;
30
32
  var MarkdownAction;
31
33
  (function(MarkdownAction2) {
32
- MarkdownAction2[MarkdownAction2["CREATE"] = `${MARKDOWN_ACTION}/create`] = "CREATE";
33
- MarkdownAction2[MarkdownAction2["SET_VIEW_MODE"] = `${MARKDOWN_ACTION}/set-view-mode`] = "SET_VIEW_MODE";
34
+ class Create extends S2.TaggedClass()(MARKDOWN_ACTION, {
35
+ input: S2.Struct({
36
+ name: S2.optional(S2.String),
37
+ content: S2.optional(S2.String)
38
+ }),
39
+ output: S2.Struct({
40
+ object: DocumentType
41
+ })
42
+ }) {
43
+ }
44
+ MarkdownAction2.Create = Create;
45
+ class SetViewMode extends S2.TaggedClass()(`${MARKDOWN_ACTION}/set-view-mode`, {
46
+ input: S2.Struct({
47
+ id: S2.String,
48
+ viewMode: EditorViewMode
49
+ }),
50
+ output: S2.Void
51
+ }) {
52
+ }
53
+ MarkdownAction2.SetViewMode = SetViewMode;
34
54
  })(MarkdownAction || (MarkdownAction = {}));
35
55
 
36
56
  export {
@@ -39,4 +59,4 @@ export {
39
59
  isEditorModel,
40
60
  MarkdownAction
41
61
  };
42
- //# sourceMappingURL=chunk-ERJ52KN2.mjs.map
62
+ //# sourceMappingURL=chunk-ZVFBKBSA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Ref, S, TypedObject } from '@dxos/echo-schema';\nimport { ThreadType } from '@dxos/plugin-space/types';\n\n// TODO(burdon): Factor out.\nexport class TextType extends TypedObject({ typename: 'dxos.org/type/Text', version: '0.1.0' })({\n content: S.String,\n}) {}\n\nexport class DocumentType extends TypedObject({ typename: 'dxos.org/type/Document', version: '0.1.0' })({\n name: S.optional(S.String),\n fallbackName: S.optional(S.String),\n content: Ref(TextType),\n threads: S.mutable(S.Array(Ref(ThreadType))),\n}) {}\n\n/**\n * Checks if an object conforms to the interface needed to render an editor.\n */\n// TODO(burdon): Normalize types (from FilesPlugin).\nexport const isEditorModel = (data: any): data is { id: string; text: string } =>\n data &&\n typeof data === 'object' &&\n 'id' in data &&\n typeof data.id === 'string' &&\n 'text' in data &&\n typeof data.text === 'string';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphSerializerProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SettingsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { S } from '@dxos/echo-schema';\nimport { type SchemaProvides } from '@dxos/plugin-space';\nimport { type Extension, type EditorInputMode, EditorViewMode } from '@dxos/react-ui-editor';\n\nimport { DocumentType } from './schema';\nimport { MARKDOWN_PLUGIN } from '../meta';\n\nconst MARKDOWN_ACTION = `${MARKDOWN_PLUGIN}/action`;\n\nexport namespace MarkdownAction {\n export class Create extends S.TaggedClass<Create>()(MARKDOWN_ACTION, {\n input: S.Struct({\n name: S.optional(S.String),\n content: S.optional(S.String),\n }),\n output: S.Struct({\n object: DocumentType,\n }),\n }) {}\n\n export class SetViewMode extends S.TaggedClass<SetViewMode>()(`${MARKDOWN_ACTION}/set-view-mode`, {\n input: S.Struct({\n id: S.String,\n viewMode: EditorViewMode,\n }),\n output: S.Void,\n }) {}\n}\n\nexport type MarkdownProperties = Record<string, any>;\n\n// TODO(burdon): Async.\nexport type MarkdownExtensionProvider = (props: { document?: DocumentType }) => Extension | undefined;\n\nexport type OnChange = (text: string) => void;\n\nexport type MarkdownExtensionProvides = {\n // TODO(burdon): Rename.\n markdown: {\n extensions: MarkdownExtensionProvider;\n };\n};\n\nexport type MarkdownPluginState = {\n // Codemirror extensions provided by other plugins.\n extensionProviders?: MarkdownExtensionProvider[];\n\n // TODO(burdon): Extend view mode per document to include scroll position, etc.\n // View mode per document.\n viewMode: Record<string, EditorViewMode>;\n};\n\nexport type MarkdownSettingsProps = {\n defaultViewMode: EditorViewMode;\n editorInputMode?: EditorInputMode;\n experimental?: boolean;\n debug?: boolean;\n toolbar?: boolean;\n typewriter?: string;\n // TODO(burdon): Per document settings.\n numberedHeadings?: boolean;\n folding?: boolean;\n};\n\n// TODO(Zan): Move this to the plugin-space plugin or another common location when we implement comments in sheets.\ntype ThreadProvides<T> = {\n thread: {\n predicate: (obj: any) => obj is T;\n createSort: (obj: T) => (anchorA: string | undefined, anchorB: string | undefined) => number;\n };\n};\n\nexport type MarkdownPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphSerializerProvides &\n MetadataRecordsProvides &\n SettingsProvides<MarkdownSettingsProps> &\n TranslationsProvides &\n SchemaProvides &\n ThreadProvides<DocumentType>;\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;AACpC,SAASC,kBAAkB;AAGpB,IAAMC,WAAN,cAAuBC,YAAY;EAAEC,UAAU;EAAsBC,SAAS;AAAQ,CAAA,EAAG;EAC9FC,SAASC,EAAEC;AACb,CAAA,EAAA;AAAI;AAEG,IAAMC,eAAN,cAA2BN,YAAY;EAAEC,UAAU;EAA0BC,SAAS;AAAQ,CAAA,EAAG;EACtGK,MAAMH,EAAEI,SAASJ,EAAEC,MAAM;EACzBI,cAAcL,EAAEI,SAASJ,EAAEC,MAAM;EACjCF,SAASO,IAAIX,QAAAA;EACbY,SAASP,EAAEQ,QAAQR,EAAES,MAAMH,IAAII,UAAAA,CAAAA,CAAAA;AACjC,CAAA,EAAA;AAAI;AAMG,IAAMC,gBAAgB,CAACC,SAC5BA,QACA,OAAOA,SAAS,YAChB,QAAQA,QACR,OAAOA,KAAKC,OAAO,YACnB,UAAUD,QACV,OAAOA,KAAKE,SAAS;;;ACjBvB,SAASC,KAAAA,UAAS;AAElB,SAA+CC,sBAAsB;AAKrE,IAAMC,kBAAkB,GAAGC,eAAAA;;UAEVC,iBAAAA;EACR,MAAMC,eAAeC,GAAEC,YAAW,EAAWL,iBAAiB;IACnEM,OAAOF,GAAEG,OAAO;MACdC,MAAMJ,GAAEK,SAASL,GAAEM,MAAM;MACzBC,SAASP,GAAEK,SAASL,GAAEM,MAAM;IAC9B,CAAA;IACAE,QAAQR,GAAEG,OAAO;MACfM,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;kBARSX,SAAAA;EAUN,MAAMY,oBAAoBX,GAAEC,YAAW,EAAgB,GAAGL,eAAAA,kBAAiC;IAChGM,OAAOF,GAAEG,OAAO;MACdS,IAAIZ,GAAEM;MACNO,UAAUC;IACZ,CAAA;IACAN,QAAQR,GAAEe;EACZ,CAAA,EAAA;EAAI;kBANSJ,cAAAA;AAOf,GAlBiBb,mBAAAA,iBAAAA,CAAAA,EAAAA;",
6
+ "names": ["Ref", "S", "TypedObject", "ThreadType", "TextType", "TypedObject", "typename", "version", "content", "S", "String", "DocumentType", "name", "optional", "fallbackName", "Ref", "threads", "mutable", "Array", "ThreadType", "isEditorModel", "data", "id", "text", "S", "EditorViewMode", "MARKDOWN_ACTION", "MARKDOWN_PLUGIN", "MarkdownAction", "Create", "S", "TaggedClass", "input", "Struct", "name", "optional", "String", "content", "output", "object", "DocumentType", "SetViewMode", "id", "viewMode", "EditorViewMode", "Void"]
7
+ }
@@ -5,30 +5,28 @@ import {
5
5
  markdownExtensionPlugins,
6
6
  serializer,
7
7
  setFallbackName
8
- } from "./chunk-NUMUUCYF.mjs";
8
+ } from "./chunk-Y76MM22C.mjs";
9
9
  import {
10
10
  DocumentType,
11
11
  MarkdownAction,
12
12
  TextType,
13
13
  isEditorModel
14
- } from "./chunk-ERJ52KN2.mjs";
14
+ } from "./chunk-ZVFBKBSA.mjs";
15
15
  import {
16
16
  MARKDOWN_PLUGIN,
17
17
  meta_default
18
18
  } from "./chunk-BABK7FMW.mjs";
19
19
 
20
20
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
21
- import { TextAa } from "@phosphor-icons/react";
21
+ import { pipe } from "effect";
22
22
  import React2 from "react";
23
- import { parseIntentPlugin, resolvePlugin, NavigationAction } from "@dxos/app-framework";
24
- import { create } from "@dxos/live-object";
23
+ import { parseIntentPlugin, resolvePlugin, createSurface, createResolver, createIntent, chain } from "@dxos/app-framework";
24
+ import { create, makeRef, RefArray } from "@dxos/live-object";
25
25
  import { LocalStorageStore } from "@dxos/local-storage";
26
- import { parseClientPlugin } from "@dxos/plugin-client";
27
- import { createExtension, isActionGroup } from "@dxos/plugin-graph";
28
26
  import { SpaceAction } from "@dxos/plugin-space";
29
27
  import { CollectionType } from "@dxos/plugin-space/types";
30
- import { createDocAccessor, fullyQualifiedId, getRangeFromCursor, isSpace, loadObjectReferences } from "@dxos/react-client/echo";
31
- import { EditorViewModes as EditorViewModes2, translations as editorTranslations, createEditorStateStore } from "@dxos/react-ui-editor";
28
+ import { createDocAccessor, fullyQualifiedId, getRangeFromCursor, isSpace } from "@dxos/react-client/echo";
29
+ import { translations as editorTranslations, createEditorStateStore } from "@dxos/react-ui-editor";
32
30
 
33
31
  // packages/plugins/plugin-markdown/src/components/index.ts
34
32
  import { lazy } from "react";
@@ -99,7 +97,7 @@ var MarkdownSettings = ({ settings }) => {
99
97
  };
100
98
 
101
99
  // packages/plugins/plugin-markdown/src/components/index.ts
102
- var MarkdownContainer = lazy(() => import("./MarkdownContainer-GBNSGROQ.mjs"));
100
+ var MarkdownContainer = lazy(() => import("./MarkdownContainer-E7W623A7.mjs"));
103
101
 
104
102
  // packages/plugins/plugin-markdown/src/translations.ts
105
103
  var translations_default = [
@@ -137,7 +135,6 @@ var translations_default = [
137
135
  ];
138
136
 
139
137
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
140
- var getDoc = (object) => object instanceof DocumentType ? object : void 0;
141
138
  var MarkdownPlugin = () => {
142
139
  const settings = new LocalStorageStore(MARKDOWN_PLUGIN, {
143
140
  defaultViewMode: "preview",
@@ -155,7 +152,7 @@ var MarkdownPlugin = () => {
155
152
  const setViewMode = (id, viewMode) => state.values.viewMode[id] = viewMode;
156
153
  return {
157
154
  meta: meta_default,
158
- ready: async (plugins) => {
155
+ ready: async ({ plugins }) => {
159
156
  settings.prop({
160
157
  key: "defaultViewMode",
161
158
  type: LocalStorageStore.enum()
@@ -209,7 +206,7 @@ var MarkdownPlugin = () => {
209
206
  metadata: {
210
207
  records: {
211
208
  [DocumentType.typename]: {
212
- createObject: MarkdownAction.CREATE,
209
+ createObject: (props) => createIntent(MarkdownAction.Create, props),
213
210
  label: (object) => object instanceof DocumentType ? object.name || object.fallbackName : void 0,
214
211
  placeholder: [
215
212
  "document title placeholder",
@@ -222,9 +219,9 @@ var MarkdownPlugin = () => {
222
219
  managesAutofocus: true
223
220
  },
224
221
  // TODO(wittjosiah): Move out of metadata.
225
- loadReferences: (doc) => loadObjectReferences(doc, (doc2) => [
226
- doc2.content,
227
- ...doc2.threads
222
+ loadReferences: async (doc) => await RefArray.loadAll([
223
+ doc.content,
224
+ ...doc.threads
228
225
  ]),
229
226
  serializer
230
227
  }
@@ -243,61 +240,8 @@ var MarkdownPlugin = () => {
243
240
  ]
244
241
  },
245
242
  graph: {
246
- builder: (plugins) => {
247
- const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
248
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;
249
- if (!client || !dispatch) {
250
- return [];
251
- }
252
- return createExtension({
253
- id: MarkdownAction.CREATE,
254
- filter: (node) => isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),
255
- actions: ({ node }) => {
256
- const id = node.id.split("/").at(-1);
257
- const [spaceId, objectId] = id?.split(":") ?? [];
258
- const space = client.spaces.get().find((space2) => space2.id === spaceId);
259
- const object = objectId && space?.db.getObjectById(objectId);
260
- const target = objectId ? object : space;
261
- if (!target) {
262
- return;
263
- }
264
- return [
265
- {
266
- id: `${MARKDOWN_PLUGIN}/create/${node.id}`,
267
- data: async () => {
268
- await dispatch([
269
- {
270
- plugin: MARKDOWN_PLUGIN,
271
- action: MarkdownAction.CREATE
272
- },
273
- {
274
- action: SpaceAction.ADD_OBJECT,
275
- data: {
276
- target
277
- }
278
- },
279
- {
280
- action: NavigationAction.OPEN
281
- }
282
- ]);
283
- },
284
- properties: {
285
- label: [
286
- "create document label",
287
- {
288
- ns: MARKDOWN_PLUGIN
289
- }
290
- ],
291
- icon: "ph--text-aa--regular",
292
- testId: "markdownPlugin.createObject"
293
- }
294
- }
295
- ];
296
- }
297
- });
298
- },
299
243
  serializer: (plugins) => {
300
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;
244
+ const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
301
245
  if (!dispatch) {
302
246
  return [];
303
247
  }
@@ -308,7 +252,7 @@ var MarkdownPlugin = () => {
308
252
  // Reconcile with metadata serializers.
309
253
  serialize: async (node) => {
310
254
  const doc = node.data;
311
- const content = await loadObjectReferences(doc, (doc2) => doc2.content);
255
+ const content = await doc.content.load();
312
256
  return {
313
257
  name: doc.name || doc.fallbackName || translations_default[0]["en-US"][MARKDOWN_PLUGIN]["document title placeholder"],
314
258
  data: content.content,
@@ -317,61 +261,26 @@ var MarkdownPlugin = () => {
317
261
  },
318
262
  deserialize: async (data, ancestors) => {
319
263
  const space = ancestors.find(isSpace);
320
- const target = ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ?? space?.properties[CollectionType.typename];
264
+ const target = ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ?? space?.properties[CollectionType.typename]?.target;
321
265
  if (!space || !target) {
322
266
  return;
323
267
  }
324
- const result = await dispatch([
325
- {
326
- plugin: MARKDOWN_PLUGIN,
327
- action: MarkdownAction.CREATE,
328
- data: {
329
- name: data.name,
330
- content: data.data
331
- }
332
- },
333
- {
334
- action: SpaceAction.ADD_OBJECT,
335
- data: {
336
- target
337
- }
338
- }
339
- ]);
340
- return result?.data.object;
268
+ const result = await dispatch(pipe(createIntent(MarkdownAction.Create, {
269
+ name: data.name,
270
+ content: data.data
271
+ }), chain(SpaceAction.AddObject, {
272
+ target
273
+ })));
274
+ return result.data?.object;
341
275
  }
342
276
  }
343
277
  ];
344
278
  }
345
279
  },
346
- stack: {
347
- creators: [
348
- {
349
- id: "create-stack-section-doc",
350
- testId: "markdownPlugin.createSection",
351
- type: [
352
- "plugin name",
353
- {
354
- ns: MARKDOWN_PLUGIN
355
- }
356
- ],
357
- label: [
358
- "create stack section label",
359
- {
360
- ns: MARKDOWN_PLUGIN
361
- }
362
- ],
363
- icon: (props) => /* @__PURE__ */ React2.createElement(TextAa, props),
364
- intent: {
365
- plugin: MARKDOWN_PLUGIN,
366
- action: MarkdownAction.CREATE
367
- }
368
- }
369
- ]
370
- },
371
280
  thread: {
372
281
  predicate: (obj) => obj instanceof DocumentType,
373
282
  createSort: (doc) => {
374
- const accessor = doc.content ? createDocAccessor(doc.content, [
283
+ const accessor = doc.content.target ? createDocAccessor(doc.content.target, [
375
284
  "content"
376
285
  ]) : void 0;
377
286
  if (!accessor) {
@@ -392,68 +301,73 @@ var MarkdownPlugin = () => {
392
301
  }
393
302
  },
394
303
  surface: {
395
- component: ({ data, role }) => {
396
- switch (role) {
397
- case "section":
398
- case "article": {
399
- const doc = getDoc(data.object);
400
- const { id, object } = isEditorModel(data.object) ? {
401
- id: data.object.id,
402
- object: data.object
403
- } : doc ? {
404
- id: fullyQualifiedId(doc),
405
- object: doc
406
- } : {};
407
- if (!id || !object) {
408
- return null;
409
- }
410
- return /* @__PURE__ */ React2.createElement(MarkdownContainer, {
411
- id,
412
- object,
413
- role,
414
- settings: settings.values,
415
- extensionProviders: state.values.extensionProviders,
416
- viewMode: getViewMode(id),
417
- editorStateStore,
418
- onViewModeChange: setViewMode
419
- });
420
- }
421
- case "settings": {
422
- return data.plugin === meta_default.id ? /* @__PURE__ */ React2.createElement(MarkdownSettings, {
423
- settings: settings.values
424
- }) : null;
425
- }
426
- }
427
- return null;
428
- }
304
+ definitions: () => [
305
+ createSurface({
306
+ id: `${MARKDOWN_PLUGIN}/document`,
307
+ role: [
308
+ "article",
309
+ "section"
310
+ ],
311
+ filter: (data) => data.subject instanceof DocumentType,
312
+ component: ({ data, role }) => /* @__PURE__ */ React2.createElement(MarkdownContainer, {
313
+ id: fullyQualifiedId(data.subject),
314
+ object: data.subject,
315
+ role,
316
+ settings: settings.values,
317
+ extensionProviders: state.values.extensionProviders,
318
+ viewMode: getViewMode(fullyQualifiedId(data.subject)),
319
+ editorStateStore,
320
+ onViewModeChange: setViewMode
321
+ })
322
+ }),
323
+ createSurface({
324
+ id: `${MARKDOWN_PLUGIN}/editor`,
325
+ role: [
326
+ "article",
327
+ "section"
328
+ ],
329
+ filter: (data) => isEditorModel(data.subject),
330
+ component: ({ data, role }) => /* @__PURE__ */ React2.createElement(MarkdownContainer, {
331
+ id: data.subject.id,
332
+ object: data.subject,
333
+ role,
334
+ settings: settings.values,
335
+ extensionProviders: state.values.extensionProviders,
336
+ viewMode: getViewMode(data.subject.id),
337
+ editorStateStore,
338
+ onViewModeChange: setViewMode
339
+ })
340
+ }),
341
+ createSurface({
342
+ id: `${MARKDOWN_PLUGIN}/settings`,
343
+ role: "settings",
344
+ filter: (data) => data.subject === MARKDOWN_PLUGIN,
345
+ component: () => /* @__PURE__ */ React2.createElement(MarkdownSettings, {
346
+ settings: settings.values
347
+ })
348
+ })
349
+ ]
429
350
  },
430
351
  intent: {
431
- resolver: ({ action, data }) => {
432
- switch (action) {
433
- case MarkdownAction.CREATE: {
434
- const doc = create(DocumentType, {
435
- name: data?.name,
436
- content: create(TextType, {
437
- content: data?.content ?? ""
438
- }),
439
- threads: []
440
- });
441
- return {
442
- data: doc
443
- };
444
- }
445
- case MarkdownAction.SET_VIEW_MODE: {
446
- const { id, viewMode } = data ?? {};
447
- if (typeof id === "string" && EditorViewModes2.includes(viewMode)) {
448
- state.values.viewMode[id] = viewMode;
449
- return {
450
- data: true
451
- };
352
+ resolvers: () => [
353
+ createResolver(MarkdownAction.Create, ({ name, content }) => {
354
+ const doc = create(DocumentType, {
355
+ name,
356
+ content: makeRef(create(TextType, {
357
+ content: content ?? ""
358
+ })),
359
+ threads: []
360
+ });
361
+ return {
362
+ data: {
363
+ object: doc
452
364
  }
453
- break;
454
- }
455
- }
456
- }
365
+ };
366
+ }),
367
+ createResolver(MarkdownAction.SetViewMode, ({ id, viewMode }) => {
368
+ state.values.viewMode[id] = viewMode;
369
+ })
370
+ ]
457
371
  }
458
372
  }
459
373
  };