@dxos/plugin-markdown 0.6.12-main.f9d0246 → 0.6.12-staging.0b4bb48

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 (102) hide show
  1. package/dist/lib/browser/{DocumentCard-RKENHCNE.mjs → DocumentCard-2P4EICBA.mjs} +3 -3
  2. package/dist/lib/browser/DocumentEditor-GPWV3VN3.mjs +11 -0
  3. package/dist/lib/browser/{MarkdownEditor-5EUT7P66.mjs → MarkdownEditor-EKJJQEFL.mjs} +3 -3
  4. package/dist/lib/browser/{chunk-2SJN46PA.mjs → chunk-4GGD6YJO.mjs} +5 -2
  5. package/dist/lib/browser/chunk-4GGD6YJO.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-QIO7ZONH.mjs → chunk-7AF2JLK4.mjs} +18 -18
  7. package/dist/lib/browser/chunk-7AF2JLK4.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-N7FS4CK2.mjs → chunk-CQJL4G4X.mjs} +2 -2
  9. package/dist/lib/browser/chunk-CQJL4G4X.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-AFWT6Z7B.mjs → chunk-RL7QY322.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-AVGUYNPR.mjs → chunk-VUN4QKTT.mjs} +53 -65
  12. package/dist/lib/browser/chunk-VUN4QKTT.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +22 -29
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/types/index.mjs +2 -2
  18. package/dist/lib/node/{DocumentCard-ECPKHJT7.cjs → DocumentCard-EHJDDSRY.cjs} +8 -8
  19. package/dist/lib/node/{DocumentCard-ECPKHJT7.cjs.map → DocumentCard-EHJDDSRY.cjs.map} +2 -2
  20. package/dist/lib/node/{DocumentEditor-QPH26VQZ.cjs → DocumentEditor-I5GCRBKU.cjs} +9 -9
  21. package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs.map +7 -0
  22. package/dist/lib/node/{MarkdownEditor-ZD4W4UJ6.cjs → MarkdownEditor-UE23H75V.cjs} +8 -8
  23. package/dist/lib/node/MarkdownEditor-UE23H75V.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-2T7LIVPT.cjs → chunk-7XIBNEI7.cjs} +51 -59
  25. package/dist/lib/node/chunk-7XIBNEI7.cjs.map +7 -0
  26. package/dist/lib/node/{chunk-5ZWOR7JF.cjs → chunk-Q4ZSCBQE.cjs} +6 -6
  27. package/dist/lib/node/{chunk-KDXONMFH.cjs → chunk-RVGN72IX.cjs} +24 -24
  28. package/dist/lib/node/chunk-RVGN72IX.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-LPD4NOTH.cjs → chunk-TGMR2CKU.cjs} +18 -5
  30. package/dist/lib/node/chunk-TGMR2CKU.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-RVNU7MRZ.cjs → chunk-VWQH4WC2.cjs} +6 -6
  32. package/dist/lib/node/chunk-VWQH4WC2.cjs.map +7 -0
  33. package/dist/lib/node/index.cjs +63 -70
  34. package/dist/lib/node/index.cjs.map +3 -3
  35. package/dist/lib/node/meta.cjs +3 -3
  36. package/dist/lib/node/meta.cjs.map +1 -1
  37. package/dist/lib/node/meta.json +1 -1
  38. package/dist/lib/node/types/index.cjs +5 -5
  39. package/dist/lib/node/types/index.cjs.map +1 -1
  40. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  41. package/dist/types/src/components/DocumentEditor.d.ts.map +1 -1
  42. package/dist/types/src/components/MarkdownEditor.d.ts +1 -1
  43. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  44. package/dist/types/src/meta.d.ts +4 -1
  45. package/dist/types/src/meta.d.ts.map +1 -1
  46. package/dist/types/src/types/document.d.ts +0 -2
  47. package/dist/types/src/types/document.d.ts.map +1 -1
  48. package/dist/types/src/types/types.d.ts +9 -8
  49. package/dist/types/src/types/types.d.ts.map +1 -1
  50. package/package.json +34 -38
  51. package/src/MarkdownPlugin.tsx +10 -17
  52. package/src/components/DocumentEditor.tsx +18 -23
  53. package/src/components/MarkdownEditor.tsx +43 -15
  54. package/src/meta.tsx +5 -1
  55. package/src/types/types.ts +7 -9
  56. package/dist/lib/browser/DocumentEditor-JZI4663Q.mjs +0 -11
  57. package/dist/lib/browser/chunk-2SJN46PA.mjs.map +0 -7
  58. package/dist/lib/browser/chunk-AVGUYNPR.mjs.map +0 -7
  59. package/dist/lib/browser/chunk-N7FS4CK2.mjs.map +0 -7
  60. package/dist/lib/browser/chunk-QIO7ZONH.mjs.map +0 -7
  61. package/dist/lib/node/DocumentEditor-QPH26VQZ.cjs.map +0 -7
  62. package/dist/lib/node/MarkdownEditor-ZD4W4UJ6.cjs.map +0 -7
  63. package/dist/lib/node/chunk-2T7LIVPT.cjs.map +0 -7
  64. package/dist/lib/node/chunk-KDXONMFH.cjs.map +0 -7
  65. package/dist/lib/node/chunk-LPD4NOTH.cjs.map +0 -7
  66. package/dist/lib/node/chunk-RVNU7MRZ.cjs.map +0 -7
  67. package/dist/lib/node-esm/DocumentCard-RHVY4Z6L.mjs +0 -12
  68. package/dist/lib/node-esm/DocumentCard-RHVY4Z6L.mjs.map +0 -7
  69. package/dist/lib/node-esm/DocumentEditor-6F5ONTIO.mjs +0 -12
  70. package/dist/lib/node-esm/DocumentEditor-6F5ONTIO.mjs.map +0 -7
  71. package/dist/lib/node-esm/MarkdownEditor-OS7YG6MA.mjs +0 -11
  72. package/dist/lib/node-esm/MarkdownEditor-OS7YG6MA.mjs.map +0 -7
  73. package/dist/lib/node-esm/chunk-2BGTVWHN.mjs +0 -18
  74. package/dist/lib/node-esm/chunk-2BGTVWHN.mjs.map +0 -7
  75. package/dist/lib/node-esm/chunk-3CHPA7Y7.mjs +0 -40
  76. package/dist/lib/node-esm/chunk-3CHPA7Y7.mjs.map +0 -7
  77. package/dist/lib/node-esm/chunk-NZ4H6J5H.mjs +0 -165
  78. package/dist/lib/node-esm/chunk-NZ4H6J5H.mjs.map +0 -7
  79. package/dist/lib/node-esm/chunk-OE3CMI5X.mjs +0 -87
  80. package/dist/lib/node-esm/chunk-OE3CMI5X.mjs.map +0 -7
  81. package/dist/lib/node-esm/chunk-QARGBUBS.mjs +0 -221
  82. package/dist/lib/node-esm/chunk-QARGBUBS.mjs.map +0 -7
  83. package/dist/lib/node-esm/chunk-RO5FEVW6.mjs +0 -119
  84. package/dist/lib/node-esm/chunk-RO5FEVW6.mjs.map +0 -7
  85. package/dist/lib/node-esm/index.mjs +0 -540
  86. package/dist/lib/node-esm/index.mjs.map +0 -7
  87. package/dist/lib/node-esm/meta.json +0 -1
  88. package/dist/lib/node-esm/meta.mjs +0 -10
  89. package/dist/lib/node-esm/meta.mjs.map +0 -7
  90. package/dist/lib/node-esm/types/index.mjs +0 -13
  91. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  92. package/dist/types/src/hooks/index.d.ts +0 -2
  93. package/dist/types/src/hooks/index.d.ts.map +0 -1
  94. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  95. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  96. package/src/hooks/index.ts +0 -5
  97. package/src/hooks/useSelectCurrentThread.tsx +0 -46
  98. /package/dist/lib/browser/{DocumentCard-RKENHCNE.mjs.map → DocumentCard-2P4EICBA.mjs.map} +0 -0
  99. /package/dist/lib/browser/{DocumentEditor-JZI4663Q.mjs.map → DocumentEditor-GPWV3VN3.mjs.map} +0 -0
  100. /package/dist/lib/browser/{MarkdownEditor-5EUT7P66.mjs.map → MarkdownEditor-EKJJQEFL.mjs.map} +0 -0
  101. /package/dist/lib/browser/{chunk-AFWT6Z7B.mjs.map → chunk-RL7QY322.mjs.map} +0 -0
  102. /package/dist/lib/node/{chunk-5ZWOR7JF.cjs.map → chunk-Q4ZSCBQE.cjs.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  DocumentCard,
3
3
  DocumentCard_default
4
- } from "./chunk-AFWT6Z7B.mjs";
4
+ } from "./chunk-RL7QY322.mjs";
5
5
  import "./chunk-354DCID5.mjs";
6
- import "./chunk-2SJN46PA.mjs";
6
+ import "./chunk-4GGD6YJO.mjs";
7
7
  export {
8
8
  DocumentCard,
9
9
  DocumentCard_default as default
10
10
  };
11
- //# sourceMappingURL=DocumentCard-RKENHCNE.mjs.map
11
+ //# sourceMappingURL=DocumentCard-2P4EICBA.mjs.map
@@ -0,0 +1,11 @@
1
+ import {
2
+ DocumentEditor_default
3
+ } from "./chunk-7AF2JLK4.mjs";
4
+ import "./chunk-CQJL4G4X.mjs";
5
+ import "./chunk-354DCID5.mjs";
6
+ import "./chunk-VUN4QKTT.mjs";
7
+ import "./chunk-4GGD6YJO.mjs";
8
+ export {
9
+ DocumentEditor_default as default
10
+ };
11
+ //# sourceMappingURL=DocumentEditor-GPWV3VN3.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  MarkdownEditor,
3
3
  MarkdownEditor_default
4
- } from "./chunk-AVGUYNPR.mjs";
5
- import "./chunk-2SJN46PA.mjs";
4
+ } from "./chunk-VUN4QKTT.mjs";
5
+ import "./chunk-4GGD6YJO.mjs";
6
6
  export {
7
7
  MarkdownEditor,
8
8
  MarkdownEditor_default as default
9
9
  };
10
- //# sourceMappingURL=MarkdownEditor-5EUT7P66.mjs.map
10
+ //# sourceMappingURL=MarkdownEditor-EKJJQEFL.mjs.map
@@ -1,4 +1,6 @@
1
1
  // packages/plugins/plugin-markdown/src/meta.tsx
2
+ import { TextAa } from "@phosphor-icons/react";
3
+ import React from "react";
2
4
  import { pluginMeta } from "@dxos/app-framework";
3
5
  var MARKDOWN_PLUGIN = "dxos.org/plugin/markdown";
4
6
  var meta_default = pluginMeta({
@@ -6,11 +8,12 @@ var meta_default = pluginMeta({
6
8
  name: "Editor",
7
9
  description: "Markdown text editor.",
8
10
  homePage: "https://github.com/dxos/dxos/tree/main/packages/apps/plugins/plugin-markdown",
9
- icon: "ph--text-aa--regular"
11
+ iconComponent: (props) => /* @__PURE__ */ React.createElement(TextAa, props),
12
+ iconSymbol: "ph--text-aa--regular"
10
13
  });
11
14
 
12
15
  export {
13
16
  MARKDOWN_PLUGIN,
14
17
  meta_default
15
18
  };
16
- //# sourceMappingURL=chunk-2SJN46PA.mjs.map
19
+ //# sourceMappingURL=chunk-4GGD6YJO.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IconProps, TextAa } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport { pluginMeta } from '@dxos/app-framework';\n\nexport const MARKDOWN_PLUGIN = 'dxos.org/plugin/markdown';\n\nexport default pluginMeta({\n id: MARKDOWN_PLUGIN,\n name: 'Editor',\n description: 'Markdown text editor.',\n homePage: 'https://github.com/dxos/dxos/tree/main/packages/apps/plugins/plugin-markdown',\n iconComponent: (props: IconProps) => <TextAa {...props} />,\n iconSymbol: 'ph--text-aa--regular',\n});\n"],
5
+ "mappings": ";AAIA,SAAyBA,cAAc;AACvC,OAAOC,WAAW;AAElB,SAASC,kBAAkB;AAEpB,IAAMC,kBAAkB;AAE/B,IAAA,eAAeC,WAAW;EACxBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,UAAU;EACVC,eAAe,CAACC,UAAqB,sBAAA,cAACC,QAAWD,KAAAA;EACjDE,YAAY;AACd,CAAA;",
6
+ "names": ["TextAa", "React", "pluginMeta", "MARKDOWN_PLUGIN", "pluginMeta", "id", "name", "description", "homePage", "iconComponent", "props", "TextAa", "iconSymbol"]
7
+ }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  DocumentType,
3
3
  TextType
4
- } from "./chunk-N7FS4CK2.mjs";
4
+ } from "./chunk-CQJL4G4X.mjs";
5
5
  import {
6
6
  createBaseExtensions
7
7
  } from "./chunk-354DCID5.mjs";
8
8
  import {
9
9
  MarkdownEditor_default
10
- } from "./chunk-AVGUYNPR.mjs";
10
+ } from "./chunk-VUN4QKTT.mjs";
11
11
 
12
12
  // packages/plugins/plugin-markdown/src/components/DocumentEditor.tsx
13
13
  import React, { useEffect, useMemo } from "react";
@@ -58,12 +58,14 @@ var DocumentEditor = ({ document: doc, extensionProviders = [], viewMode, settin
58
58
  const space = getSpace(doc);
59
59
  const identity = useIdentity();
60
60
  const dispatch = useIntentDispatcher();
61
- const baseExtensions = useMemo(() => createBaseExtensions({
62
- viewMode,
63
- settings,
64
- document: doc,
65
- dispatch
66
- }), [
61
+ const baseExtensions = useMemo(() => {
62
+ return createBaseExtensions({
63
+ viewMode,
64
+ settings,
65
+ document: doc,
66
+ dispatch
67
+ });
68
+ }, [
67
69
  doc,
68
70
  viewMode,
69
71
  dispatch,
@@ -71,13 +73,11 @@ var DocumentEditor = ({ document: doc, extensionProviders = [], viewMode, settin
71
73
  settings.folding,
72
74
  settings.numberedHeadings
73
75
  ]);
74
- const pluginExtensions = useMemo(() => extensionProviders.reduce((acc, provider) => {
75
- const extension = typeof provider === "function" ? provider({
76
+ const providerExtensions = useMemo(() => extensionProviders.reduce((acc, provider) => {
77
+ const provided = typeof provider === "function" ? provider({
76
78
  document: doc
77
79
  }) : provider;
78
- if (extension) {
79
- acc.push(extension);
80
- }
80
+ acc.push(...provided);
81
81
  return acc;
82
82
  }, []), [
83
83
  extensionProviders
@@ -98,14 +98,14 @@ var DocumentEditor = ({ document: doc, extensionProviders = [], viewMode, settin
98
98
  setFallbackName(doc, text);
99
99
  }
100
100
  }),
101
- baseExtensions,
102
- pluginExtensions
101
+ providerExtensions,
102
+ baseExtensions
103
103
  ], [
104
- baseExtensions,
105
- pluginExtensions,
106
104
  doc,
107
105
  doc.content,
108
106
  space,
107
+ baseExtensions,
108
+ providerExtensions,
109
109
  identity
110
110
  ]);
111
111
  const initialValue = useMemo(() => doc.content?.content, [
@@ -161,4 +161,4 @@ export {
161
161
  serializer,
162
162
  DocumentEditor_default
163
163
  };
164
- //# sourceMappingURL=chunk-QIO7ZONH.mjs.map
164
+ //# sourceMappingURL=chunk-7AF2JLK4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/DocumentEditor.tsx", "../../../src/util.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useResolvePlugin, parseFileManagerPlugin, useIntentDispatcher } from '@dxos/app-framework';\nimport { createDocAccessor, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport {\n createDataExtensions,\n listener,\n localStorageStateStoreAdapter,\n state,\n type Extension,\n type EditorSelectionState,\n} from '@dxos/react-ui-editor';\n\nimport MarkdownEditor, { type MarkdownEditorProps } from './MarkdownEditor';\nimport { createBaseExtensions } from '../extensions';\nimport { type DocumentType, type MarkdownPluginState, type MarkdownSettingsProps } from '../types';\nimport { getFallbackName, setFallbackName } from '../util';\n\ntype DocumentEditorProps = {\n document: DocumentType;\n settings: MarkdownSettingsProps;\n} & Omit<MarkdownEditorProps, 'id' | 'inputMode' | 'toolbar' | 'extensions'> &\n Pick<MarkdownPluginState, 'extensionProviders'>;\n\n/**\n * Editor for a `DocumentType`.\n */\nconst DocumentEditor = ({\n document: doc,\n extensionProviders = [],\n viewMode,\n settings,\n ...props\n}: DocumentEditorProps) => {\n const space = getSpace(doc);\n const identity = useIdentity();\n const dispatch = useIntentDispatcher();\n\n const baseExtensions = useMemo(() => {\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // const query = space?.db.query(Filter.schema(DocumentType));\n // query?.subscribe();\n return createBaseExtensions({\n viewMode,\n settings,\n document: doc,\n dispatch,\n // query,\n });\n }, [doc, viewMode, dispatch, settings, settings.folding, settings.numberedHeadings]);\n\n const providerExtensions = useMemo(\n () =>\n extensionProviders.reduce((acc: Extension[], provider) => {\n const provided = typeof provider === 'function' ? provider({ document: doc }) : provider;\n acc.push(...provided);\n return acc;\n }, []),\n [extensionProviders],\n );\n\n const extensions = useMemo(\n () => [\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n createDataExtensions({\n id: doc.id,\n text: doc.content && createDocAccessor(doc.content, ['content']),\n space,\n identity,\n }),\n state(localStorageStateStoreAdapter),\n listener({\n onChange: (text) => {\n setFallbackName(doc, text);\n },\n }),\n providerExtensions,\n baseExtensions,\n ],\n [doc, doc.content, space, baseExtensions, providerExtensions, identity],\n );\n\n const initialValue = useMemo(() => doc.content?.content, [doc.content]);\n\n // Migrate gradually to `fallbackName`.\n useEffect(() => {\n if (!doc.fallbackName && doc.content?.content) {\n doc.fallbackName = getFallbackName(doc.content.content);\n }\n }, [doc, doc.content]);\n\n // Restore last selection and scroll point.\n const id = fullyQualifiedId(doc);\n const { scrollTo, selection } = useMemo<EditorSelectionState>(\n () => localStorageStateStoreAdapter.getState(id) ?? {},\n [doc],\n );\n\n const fileManagerPlugin = useResolvePlugin(parseFileManagerPlugin);\n const handleFileUpload = useMemo(() => {\n if (space === undefined) {\n return undefined;\n }\n\n if (fileManagerPlugin?.provides.file.upload === undefined) {\n return undefined;\n }\n\n return async (file: File) => {\n return fileManagerPlugin?.provides?.file?.upload?.(file, space);\n };\n }, [fileManagerPlugin, space]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={initialValue}\n extensions={extensions}\n scrollTo={scrollTo}\n selection={selection}\n onFileUpload={handleFileUpload}\n inputMode={settings.editorInputMode}\n toolbar={settings.toolbar}\n viewMode={viewMode}\n {...props}\n />\n );\n};\n\nexport default DocumentEditor;\n\nexport type DocumentEditor = typeof DocumentEditor;\n", "//\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, createEchoObject, isEchoObject, loadObjectReferences } 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, content: content.content });\n },\n\n deserialize: async ({ content: serialized }) => {\n const { name, content } = JSON.parse(serialized);\n return createEchoObject(create(DocumentType, { name, content: create(TextType, { content }), threads: [] }));\n },\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useEffect", "useMemo", "useResolvePlugin", "parseFileManagerPlugin", "useIntentDispatcher", "createDocAccessor", "fullyQualifiedId", "getSpace", "useIdentity", "createDataExtensions", "listener", "localStorageStateStoreAdapter", "state", "debounce", "create", "createEchoObject", "isEchoObject", "loadObjectReferences", "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", "deserialize", "serialized", "parse", "createEchoObject", "create", "DocumentType", "TextType", "threads", "DocumentEditor", "document", "doc", "extensionProviders", "viewMode", "settings", "props", "space", "getSpace", "identity", "useIdentity", "dispatch", "useIntentDispatcher", "baseExtensions", "useMemo", "createBaseExtensions", "folding", "numberedHeadings", "providerExtensions", "reduce", "acc", "provider", "provided", "push", "extensions", "createDataExtensions", "id", "text", "content", "createDocAccessor", "state", "localStorageStateStoreAdapter", "listener", "onChange", "setFallbackName", "initialValue", "useEffect", "fallbackName", "getFallbackName", "fullyQualifiedId", "scrollTo", "selection", "getState", "fileManagerPlugin", "useResolvePlugin", "parseFileManagerPlugin", "handleFileUpload", "undefined", "provides", "file", "upload", "MarkdownEditor", "onFileUpload", "inputMode", "editorInputMode", "toolbar"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MARKDOWN_PLUGIN
3
- } from "./chunk-2SJN46PA.mjs";
3
+ } from "./chunk-4GGD6YJO.mjs";
4
4
 
5
5
  // packages/plugins/plugin-markdown/src/types/document.ts
6
6
  import { ref, S, TypedObject } from "@dxos/echo-schema";
@@ -36,4 +36,4 @@ export {
36
36
  DocumentType,
37
37
  MarkdownAction
38
38
  };
39
- //# sourceMappingURL=chunk-N7FS4CK2.mjs.map
39
+ //# sourceMappingURL=chunk-CQJL4G4X.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/document.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\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// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n GraphSerializerProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SettingsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type Extension, type EditorInputMode, type EditorViewMode } from '@dxos/react-ui-editor';\n\nimport { type DocumentType } from './document';\nimport { MARKDOWN_PLUGIN } from '../meta';\n\nconst MARKDOWN_ACTION = `${MARKDOWN_PLUGIN}/action`;\n\nexport enum MarkdownAction {\n CREATE = `${MARKDOWN_ACTION}/create`,\n SET_VIEW_MODE = `${MARKDOWN_ACTION}/set-view-mode`,\n}\n\nexport type MarkdownProperties = Record<string, any>;\n\nexport type ExtensionsProvider = (props: { document?: DocumentType }) => Extension[];\n\nexport type OnChange = (text: string) => void;\n\nexport type MarkdownExtensionProvides = {\n markdown: {\n extensions: ExtensionsProvider;\n };\n};\n\n// TODO(wittjosiah): Factor out to graph plugin?\ntype StackProvides = {\n stack: {\n creators?: Record<string, any>[];\n };\n};\n\nexport type MarkdownPluginState = {\n // Codemirror extensions provided by other plugins.\n extensionProviders: NonNullable<ExtensionsProvider>[];\n\n // TODO(burdon): Extend view mode per document to include scroll position, etc.\n // View mode per document.\n viewMode: { [key: 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\n// when we implement comments in sheets.\ntype ThreadProvides<T> = {\n thread: {\n predicate: (obj: any) => obj is T;\n createSort: (obj: T) => (anchorA: string, anchorB: string) => number;\n };\n};\n\nexport type MarkdownPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n GraphSerializerProvides &\n MetadataRecordsProvides &\n SettingsProvides<MarkdownSettingsProps> &\n TranslationsProvides &\n SchemaProvides &\n StackProvides &\n ThreadProvides<DocumentType>;\n"],
5
+ "mappings": ";;;;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;AACpC,SAASC,kBAAkB;AAEpB,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;;;ACGJ,IAAMC,kBAAkB,GAAGC,eAAAA;;UAEfC,iBAAAA;8CACD,GAAGF,eAAAA,SAAwB,IAAA;qDACpB,GAAGA,eAAAA,gBAA+B,IAAA;GAFxCE,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", "MARKDOWN_ACTION", "MARKDOWN_PLUGIN", "MarkdownAction"]
7
+ }
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-354DCID5.mjs";
4
4
  import {
5
5
  MARKDOWN_PLUGIN
6
- } from "./chunk-2SJN46PA.mjs";
6
+ } from "./chunk-4GGD6YJO.mjs";
7
7
 
8
8
  // packages/plugins/plugin-markdown/src/components/DocumentCard.tsx
9
9
  import React, { forwardRef } from "react";
@@ -83,4 +83,4 @@ export {
83
83
  DocumentCard,
84
84
  DocumentCard_default
85
85
  };
86
- //# sourceMappingURL=chunk-AFWT6Z7B.mjs.map
86
+ //# sourceMappingURL=chunk-RL7QY322.mjs.map
@@ -1,81 +1,36 @@
1
1
  import {
2
2
  MARKDOWN_PLUGIN
3
- } from "./chunk-2SJN46PA.mjs";
3
+ } from "./chunk-4GGD6YJO.mjs";
4
4
 
5
5
  // packages/plugins/plugin-markdown/src/components/MarkdownEditor.tsx
6
6
  import { openSearchPanel } from "@codemirror/search";
7
- import React, { useMemo, useEffect, useCallback as useCallback2 } from "react";
8
- import { LayoutAction as LayoutAction2, useResolvePlugin, parseLayoutPlugin, useIntentDispatcher } from "@dxos/app-framework";
7
+ import { EditorView } from "@codemirror/view";
8
+ import React, { useMemo, useEffect, useCallback } from "react";
9
+ import { LayoutAction, useResolvePlugin, useIntentResolver, parseLayoutPlugin, useIntentDispatcher } from "@dxos/app-framework";
10
+ import { parseAttentionPlugin } from "@dxos/plugin-attention";
9
11
  import { useThemeContext, useTranslation } from "@dxos/react-ui";
10
- import { useIsDirectlyAttended } from "@dxos/react-ui-attention";
11
- import { Toolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, processAction, useActionHandler, useCommentState, useCommentClickListener, useFormattingState, useTextEditor, editorContent, editorGutter } from "@dxos/react-ui-editor";
12
+ import { Toolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, processAction, useActionHandler, useCommentState, useCommentClickListener, useFormattingState, useTextEditor, editorContent, editorGutter, Cursor, setSelection } from "@dxos/react-ui-editor";
12
13
  import { sectionToolbarLayout } from "@dxos/react-ui-stack";
13
14
  import { textBlockWidth, focusRing, mx } from "@dxos/react-ui-theme";
14
- import { isNotFalsy, nonNullable } from "@dxos/util";
15
-
16
- // packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx
17
- import { EditorView } from "@codemirror/view";
18
- import { useCallback } from "react";
19
- import { LayoutAction, useIntentResolver } from "@dxos/app-framework";
20
- import { Cursor, setSelection } from "@dxos/react-ui-editor";
21
- var useSelectCurrentThread = (editorView, documentId) => {
22
- const handleScrollIntoView = useCallback(({ action, data }) => {
23
- if (action === LayoutAction.SCROLL_INTO_VIEW) {
24
- if (editorView && data?.id === documentId && data?.cursor) {
25
- const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);
26
- if (range) {
27
- const selection = editorView.state.selection.main.from !== range.from ? {
28
- anchor: range.from
29
- } : void 0;
30
- const effects = [
31
- // NOTE: This does not use the DOM scrollIntoView function.
32
- EditorView.scrollIntoView(range.from, {
33
- y: "start",
34
- yMargin: 96
35
- })
36
- ];
37
- if (selection) {
38
- effects.push(setSelection.of({
39
- current: documentId
40
- }));
41
- }
42
- editorView.dispatch({
43
- effects,
44
- selection: selection ? {
45
- anchor: range.from
46
- } : void 0
47
- });
48
- }
49
- }
50
- }
51
- }, [
52
- documentId,
53
- editorView
54
- ]);
55
- useIntentResolver(MARKDOWN_PLUGIN, handleScrollIntoView);
56
- };
57
-
58
- // packages/plugins/plugin-markdown/src/components/MarkdownEditor.tsx
15
+ import { nonNullable } from "@dxos/util";
59
16
  var attentionFragment = mx("group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface", "group-focus-within/editor:border-separator");
60
17
  var DEFAULT_VIEW_MODE = "preview";
61
18
  var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, scrollTo, selection, toolbar, viewMode, onFileUpload, onViewModeChange }) => {
62
19
  const { t } = useTranslation(MARKDOWN_PLUGIN);
63
20
  const { themeMode } = useThemeContext();
64
21
  const dispatch = useIntentDispatcher();
22
+ const attentionPlugin = useResolvePlugin(parseAttentionPlugin);
65
23
  const layoutPlugin = useResolvePlugin(parseLayoutPlugin);
24
+ const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);
25
+ const isDirectlyAttended = attended.length === 1 && attended[0] === id;
66
26
  const [formattingState, formattingObserver] = useFormattingState();
67
- const isDirectlyAttended = useIsDirectlyAttended(id);
68
- const providerExtensions = useMemo(
69
- // TODO(burdon): Must pass object to provider.
70
- () => extensionProviders?.flatMap((provider) => provider({})).filter(nonNullable),
71
- [
72
- extensionProviders
73
- ]
74
- );
27
+ const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [
28
+ extensionProviders
29
+ ]);
75
30
  const [commentsState, commentObserver] = useCommentState();
76
- const onCommentClick = useCallback2(() => {
31
+ const onCommentClick = useCallback(() => {
77
32
  void dispatch({
78
- action: LayoutAction2.SET_LAYOUT,
33
+ action: LayoutAction.SET_LAYOUT,
79
34
  data: {
80
35
  element: "complementary",
81
36
  state: true
@@ -85,6 +40,40 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
85
40
  dispatch
86
41
  ]);
87
42
  const commentClickObserver = useCommentClickListener(onCommentClick);
43
+ useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {
44
+ switch (action) {
45
+ // TODO(burdon): Use fully qualified ids everywhere.
46
+ case LayoutAction.SCROLL_INTO_VIEW: {
47
+ if (editorView && data?.id === id && data?.cursor) {
48
+ const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);
49
+ if (range) {
50
+ const selection2 = editorView.state.selection.main.from !== range.from ? {
51
+ anchor: range.from
52
+ } : void 0;
53
+ const effects = [
54
+ // NOTE: This does not use the DOM scrollIntoView function.
55
+ EditorView.scrollIntoView(range.from, {
56
+ y: "start",
57
+ yMargin: 96
58
+ })
59
+ ];
60
+ if (selection2) {
61
+ effects.push(setSelection.of({
62
+ current: id
63
+ }));
64
+ }
65
+ editorView.dispatch({
66
+ effects,
67
+ selection: selection2 ? {
68
+ anchor: range.from
69
+ } : void 0
70
+ });
71
+ }
72
+ }
73
+ break;
74
+ }
75
+ }
76
+ });
88
77
  const handleDrop = async (view, { files }) => {
89
78
  const file = files[0];
90
79
  const info = file && onFileUpload ? await onFileUpload(file) : void 0;
@@ -119,12 +108,12 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
119
108
  }
120
109
  }),
121
110
  editorGutter,
122
- role !== "section" && onFileUpload && dropFile({
111
+ role !== "section" && onFileUpload ? dropFile({
123
112
  onDrop: handleDrop
124
- }),
113
+ }) : [],
125
114
  providerExtensions,
126
115
  extensions
127
- ].filter(isNotFalsy),
116
+ ].filter(nonNullable),
128
117
  ...role !== "section" && {
129
118
  id,
130
119
  scrollTo,
@@ -143,7 +132,6 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
143
132
  providerExtensions
144
133
  ]);
145
134
  useTest(editorView);
146
- useSelectCurrentThread(editorView, id);
147
135
  const handleToolbarAction = useActionHandler(editorView);
148
136
  const handleAction = (action) => {
149
137
  switch (action.type) {
@@ -217,4 +205,4 @@ export {
217
205
  MarkdownEditor,
218
206
  MarkdownEditor_default
219
207
  };
220
- //# sourceMappingURL=chunk-AVGUYNPR.mjs.map
208
+ //# sourceMappingURL=chunk-VUN4QKTT.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport {\n type FileInfo,\n LayoutAction,\n type LayoutCoordinate,\n useResolvePlugin,\n useIntentResolver,\n parseLayoutPlugin,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type UseTextEditorProps,\n Toolbar,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n editorContent,\n editorGutter,\n Cursor,\n setSelection,\n} from '@dxos/react-ui-editor';\nimport { sectionToolbarLayout } from '@dxos/react-ui-stack';\nimport { textBlockWidth, focusRing, mx } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport type { MarkdownPluginState } from '../types';\n\nconst attentionFragment = mx(\n 'group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface',\n 'group-focus-within/editor:border-separator',\n);\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n coordinate?: LayoutCoordinate;\n inputMode?: EditorInputMode;\n role?: string;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'scrollTo' | 'selection' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n scrollTo,\n selection,\n toolbar,\n viewMode,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const dispatch = useIntentDispatcher();\n const attentionPlugin = useResolvePlugin(parseAttentionPlugin);\n const layoutPlugin = useResolvePlugin(parseLayoutPlugin);\n const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);\n const isDirectlyAttended = attended.length === 1 && attended[0] === id;\n const [formattingState, formattingObserver] = useFormattingState();\n\n // Extensions from other plugins.\n const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [extensionProviders]);\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(() => {\n void dispatch({ action: LayoutAction.SET_LAYOUT, data: { element: 'complementary', state: true } });\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Focus the space that references the comment.\n useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {\n switch (action) {\n // TODO(burdon): Use fully qualified ids everywhere.\n case LayoutAction.SCROLL_INTO_VIEW: {\n if (editorView && data?.id === id && data?.cursor) {\n // TODO(burdon): We need typed intents.\n const range = Cursor.getRangeFromCursor(editorView.state, data.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: id }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n }\n break;\n }\n }\n });\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(nonNullable),\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, initialValue, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\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 <div\n role='none'\n // TODO(burdon): Move role logic out of here (see sheet, table, sketch, etc.)\n {...(role === 'section'\n ? { className: 'flex flex-col' }\n : {\n className: 'contents group/editor',\n ...(isDirectlyAttended && { 'aria-current': 'location' }),\n })}\n >\n {toolbar && (\n <div role='none' className={mx('flex shrink-0 justify-center overflow-x-auto', attentionFragment)}>\n <Toolbar.Root\n classNames={\n role === 'section'\n ? [\n textBlockWidth,\n 'z-[2] group-focus-within/section:visible',\n !isDirectlyAttended && 'invisible',\n sectionToolbarLayout,\n ]\n : [\n textBlockWidth,\n 'group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator',\n ]\n }\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={\n role === 'section'\n ? mx('flex flex-col flex-1 min-bs-[12rem]', focusRing)\n : mx(\n 'flex is-full bs-full overflow-hidden',\n focusRing,\n attentionFragment,\n 'focus-visible:ring-inset',\n 'data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2',\n )\n }\n {...focusAttributes}\n />\n </div>\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\nexport default MarkdownEditor;\n"],
5
+ "mappings": "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",
6
+ "names": ["openSearchPanel", "EditorView", "React", "useMemo", "useEffect", "useCallback", "LayoutAction", "useResolvePlugin", "useIntentResolver", "parseLayoutPlugin", "useIntentDispatcher", "parseAttentionPlugin", "useThemeContext", "useTranslation", "Toolbar", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "processAction", "useActionHandler", "useCommentState", "useCommentClickListener", "useFormattingState", "useTextEditor", "editorContent", "editorGutter", "Cursor", "setSelection", "sectionToolbarLayout", "textBlockWidth", "focusRing", "mx", "nonNullable", "attentionFragment", "mx", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "scrollTo", "selection", "toolbar", "viewMode", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatch", "useIntentDispatcher", "attentionPlugin", "useResolvePlugin", "parseAttentionPlugin", "layoutPlugin", "parseLayoutPlugin", "attended", "Array", "from", "provides", "attention", "isDirectlyAttended", "length", "formattingState", "formattingObserver", "useFormattingState", "providerExtensions", "useMemo", "map", "provider", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "commentClickObserver", "useCommentClickListener", "useIntentResolver", "SCROLL_INTO_VIEW", "editorView", "cursor", "range", "Cursor", "getRangeFromCursor", "main", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "handleDrop", "view", "files", "file", "info", "processAction", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "filter", "nonNullable", "autoFocus", "layout", "moveToEndOfLine", "useTest", "handleToolbarAction", "useActionHandler", "handleAction", "openSearchPanel", "div", "Toolbar", "Root", "classNames", "textBlockWidth", "sectionToolbarLayout", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "focusRing", "useEffect", "composer", "window"]
7
+ }
@@ -1,22 +1,22 @@
1
- import "./chunk-AFWT6Z7B.mjs";
1
+ import "./chunk-RL7QY322.mjs";
2
2
  import {
3
3
  getFallbackName,
4
4
  isMarkdownProperties,
5
5
  markdownExtensionPlugins,
6
6
  serializer,
7
7
  setFallbackName
8
- } from "./chunk-QIO7ZONH.mjs";
8
+ } from "./chunk-7AF2JLK4.mjs";
9
9
  import {
10
10
  DocumentType,
11
11
  MarkdownAction,
12
12
  TextType
13
- } from "./chunk-N7FS4CK2.mjs";
13
+ } from "./chunk-CQJL4G4X.mjs";
14
14
  import "./chunk-354DCID5.mjs";
15
- import "./chunk-AVGUYNPR.mjs";
15
+ import "./chunk-VUN4QKTT.mjs";
16
16
  import {
17
17
  MARKDOWN_PLUGIN,
18
18
  meta_default
19
- } from "./chunk-2SJN46PA.mjs";
19
+ } from "./chunk-4GGD6YJO.mjs";
20
20
 
21
21
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
22
22
  import { TextAa } from "@phosphor-icons/react";
@@ -24,6 +24,7 @@ import React5 from "react";
24
24
  import { isObject, parseIntentPlugin, resolvePlugin, LayoutAction, NavigationAction } from "@dxos/app-framework";
25
25
  import { create } from "@dxos/echo-schema";
26
26
  import { LocalStorageStore } from "@dxos/local-storage";
27
+ import { log } from "@dxos/log";
27
28
  import { parseClientPlugin } from "@dxos/plugin-client";
28
29
  import { createExtension, isActionGroup } from "@dxos/plugin-graph";
29
30
  import { SpaceAction } from "@dxos/plugin-space";
@@ -114,9 +115,9 @@ var MarkdownSettings = ({ settings }) => {
114
115
  };
115
116
 
116
117
  // packages/plugins/plugin-markdown/src/components/index.ts
117
- var DocumentCard = React4.lazy(() => import("./DocumentCard-RKENHCNE.mjs"));
118
- var DocumentEditor = React4.lazy(() => import("./DocumentEditor-JZI4663Q.mjs"));
119
- var MarkdownEditor = React4.lazy(() => import("./MarkdownEditor-5EUT7P66.mjs"));
118
+ var DocumentCard = React4.lazy(() => import("./DocumentCard-2P4EICBA.mjs"));
119
+ var DocumentEditor = React4.lazy(() => import("./DocumentEditor-GPWV3VN3.mjs"));
120
+ var MarkdownEditor = React4.lazy(() => import("./MarkdownEditor-EKJJQEFL.mjs"));
120
121
 
121
122
  // packages/plugins/plugin-markdown/src/translations.ts
122
123
  var translations_default = [
@@ -151,6 +152,7 @@ var translations_default = [
151
152
  ];
152
153
 
153
154
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
155
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx";
154
156
  var isEditorModel = (data) => {
155
157
  return data && typeof data === "object" && "id" in data && typeof data.id === "string" && "text" in data && typeof data.text === "string";
156
158
  };
@@ -237,7 +239,8 @@ var MarkdownPlugin = () => {
237
239
  ns: MARKDOWN_PLUGIN
238
240
  }
239
241
  ],
240
- icon: "ph--text-aa--regular",
242
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
243
+ iconSymbol: "ph--text-aa--regular",
241
244
  graphProps: {
242
245
  managesAutofocus: true
243
246
  },
@@ -260,17 +263,6 @@ var MarkdownPlugin = () => {
260
263
  TextType
261
264
  ]
262
265
  },
263
- space: {
264
- onSpaceCreate: {
265
- label: [
266
- "create document label",
267
- {
268
- ns: MARKDOWN_PLUGIN
269
- }
270
- ],
271
- action: MarkdownAction.CREATE
272
- }
273
- },
274
266
  graph: {
275
267
  builder: (plugins) => {
276
268
  const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
@@ -317,7 +309,8 @@ var MarkdownPlugin = () => {
317
309
  ns: MARKDOWN_PLUGIN
318
310
  }
319
311
  ],
320
- icon: "ph--text-aa--regular",
312
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
313
+ iconSymbol: "ph--text-aa--regular",
321
314
  testId: "markdownPlugin.createObject"
322
315
  }
323
316
  }
@@ -398,26 +391,26 @@ var MarkdownPlugin = () => {
398
391
  ]
399
392
  },
400
393
  thread: {
394
+ // TODO(Zan): How to better handle the type predicate?
401
395
  predicate: (obj) => obj instanceof DocumentType,
402
396
  createSort: (doc) => {
403
397
  const accessor = doc.content ? createDocAccessor(doc.content, [
404
398
  "content"
405
399
  ]) : void 0;
406
400
  if (!accessor) {
401
+ log.warn("No accessor found for document content.", void 0, {
402
+ F: __dxlog_file,
403
+ L: 250,
404
+ S: void 0,
405
+ C: (f, a) => f(...a)
406
+ });
407
407
  return (_) => 0;
408
408
  }
409
409
  const getStartPosition = (cursor) => {
410
410
  const range = cursor ? getRangeFromCursor(accessor, cursor) : void 0;
411
411
  return range?.start ?? Number.MAX_SAFE_INTEGER;
412
412
  };
413
- return (anchorA, anchorB) => {
414
- if (anchorA === void 0 || anchorB === void 0) {
415
- return 0;
416
- }
417
- const posA = getStartPosition(anchorA);
418
- const posB = getStartPosition(anchorB);
419
- return posA - posB;
420
- };
413
+ return (anchorA, anchorB) => getStartPosition(anchorA) - getStartPosition(anchorB);
421
414
  }
422
415
  },
423
416
  surface: {