@dxos/plugin-markdown 0.6.13-main.548ca8d → 0.6.13-staging.1e988a3

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 (120) hide show
  1. package/dist/lib/browser/DocumentCard-2P4EICBA.mjs +11 -0
  2. package/dist/lib/browser/DocumentEditor-GPWV3VN3.mjs +11 -0
  3. package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs +10 -0
  4. package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-354DCID5.mjs +117 -0
  6. package/dist/lib/browser/chunk-354DCID5.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-4GGD6YJO.mjs +19 -0
  8. package/dist/lib/browser/chunk-4GGD6YJO.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-7AF2JLK4.mjs +164 -0
  10. package/dist/lib/browser/chunk-7AF2JLK4.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-US5O2P3R.mjs → chunk-CQJL4G4X.mjs} +2 -4
  12. package/dist/lib/browser/chunk-CQJL4G4X.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RL7QY322.mjs +86 -0
  14. package/dist/lib/browser/chunk-RL7QY322.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-VUN4QKTT.mjs +208 -0
  16. package/dist/lib/browser/chunk-VUN4QKTT.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +117 -77
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/meta.mjs +1 -1
  21. package/dist/lib/browser/types/index.mjs +4 -6
  22. package/dist/lib/node/{chunk-P7YU53RP.cjs → DocumentCard-EHJDDSRY.cjs} +10 -16
  23. package/dist/lib/node/DocumentCard-EHJDDSRY.cjs.map +7 -0
  24. package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs +29 -0
  25. package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs.map +7 -0
  26. package/dist/lib/node/MarkdownEditor-UE23H75V.cjs +31 -0
  27. package/dist/lib/node/MarkdownEditor-UE23H75V.cjs.map +7 -0
  28. package/dist/lib/node/chunk-7XIBNEI7.cjs +238 -0
  29. package/dist/lib/node/chunk-7XIBNEI7.cjs.map +7 -0
  30. package/dist/lib/node/chunk-KTYIOXL5.cjs +149 -0
  31. package/dist/lib/node/chunk-KTYIOXL5.cjs.map +7 -0
  32. package/dist/lib/node/chunk-Q4ZSCBQE.cjs +114 -0
  33. package/dist/lib/node/chunk-Q4ZSCBQE.cjs.map +7 -0
  34. package/dist/lib/node/chunk-RVGN72IX.cjs +189 -0
  35. package/dist/lib/node/chunk-RVGN72IX.cjs.map +7 -0
  36. package/dist/lib/node/chunk-TGMR2CKU.cjs +52 -0
  37. package/dist/lib/node/chunk-TGMR2CKU.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-UJMOZCIA.cjs → chunk-VWQH4WC2.cjs} +8 -11
  39. package/dist/lib/node/chunk-VWQH4WC2.cjs.map +7 -0
  40. package/dist/lib/node/index.cjs +147 -111
  41. package/dist/lib/node/index.cjs.map +4 -4
  42. package/dist/lib/node/meta.cjs +3 -3
  43. package/dist/lib/node/meta.cjs.map +1 -1
  44. package/dist/lib/node/meta.json +1 -1
  45. package/dist/lib/node/types/index.cjs +6 -8
  46. package/dist/lib/node/types/index.cjs.map +2 -2
  47. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  48. package/dist/types/src/components/DocumentCard.d.ts +16 -0
  49. package/dist/types/src/components/DocumentCard.d.ts.map +1 -0
  50. package/dist/types/src/components/DocumentEditor.d.ts +14 -0
  51. package/dist/types/src/components/DocumentEditor.d.ts.map +1 -0
  52. package/dist/types/src/components/HeadingMenu.d.ts +13 -0
  53. package/dist/types/src/components/HeadingMenu.d.ts.map +1 -0
  54. package/dist/types/src/components/Layout.d.ts +6 -0
  55. package/dist/types/src/components/Layout.d.ts.map +1 -0
  56. package/dist/types/src/components/MarkdownEditor.d.ts +3 -8
  57. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  58. package/dist/types/src/components/MarkdownEditor.stories.d.ts +3 -3
  59. package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/index.d.ts +11 -2
  61. package/dist/types/src/components/index.d.ts.map +1 -1
  62. package/dist/types/src/extensions.d.ts +15 -11
  63. package/dist/types/src/extensions.d.ts.map +1 -1
  64. package/dist/types/src/meta.d.ts +9 -4
  65. package/dist/types/src/meta.d.ts.map +1 -1
  66. package/dist/types/src/types/document.d.ts +1 -10
  67. package/dist/types/src/types/document.d.ts.map +1 -1
  68. package/dist/types/src/types/types.d.ts +9 -8
  69. package/dist/types/src/types/types.d.ts.map +1 -1
  70. package/package.json +36 -41
  71. package/src/MarkdownPlugin.tsx +97 -49
  72. package/src/components/DocumentCard.tsx +107 -0
  73. package/src/components/DocumentEditor.tsx +137 -0
  74. package/src/components/HeadingMenu.tsx +46 -0
  75. package/src/components/Layout.tsx +27 -0
  76. package/src/components/MarkdownEditor.stories.tsx +5 -11
  77. package/src/components/MarkdownEditor.tsx +75 -40
  78. package/src/components/index.ts +14 -2
  79. package/src/extensions.tsx +67 -124
  80. package/src/meta.tsx +19 -0
  81. package/src/types/document.ts +0 -12
  82. package/src/types/types.ts +7 -10
  83. package/dist/lib/browser/MarkdownContainer-52FJDCTV.mjs +0 -467
  84. package/dist/lib/browser/MarkdownContainer-52FJDCTV.mjs.map +0 -7
  85. package/dist/lib/browser/chunk-4MPY6KRJ.mjs +0 -50
  86. package/dist/lib/browser/chunk-4MPY6KRJ.mjs.map +0 -7
  87. package/dist/lib/browser/chunk-DRJ3FPYF.mjs +0 -15
  88. package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-US5O2P3R.mjs.map +0 -7
  90. package/dist/lib/node/MarkdownContainer-5XPB5VP5.cjs +0 -482
  91. package/dist/lib/node/MarkdownContainer-5XPB5VP5.cjs.map +0 -7
  92. package/dist/lib/node/chunk-MOF6UCLA.cjs +0 -72
  93. package/dist/lib/node/chunk-MOF6UCLA.cjs.map +0 -7
  94. package/dist/lib/node/chunk-P7YU53RP.cjs.map +0 -7
  95. package/dist/lib/node/chunk-UJMOZCIA.cjs.map +0 -7
  96. package/dist/lib/node-esm/MarkdownContainer-ILCO3PDV.mjs +0 -468
  97. package/dist/lib/node-esm/MarkdownContainer-ILCO3PDV.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-CD634NG3.mjs +0 -51
  99. package/dist/lib/node-esm/chunk-CD634NG3.mjs.map +0 -7
  100. package/dist/lib/node-esm/chunk-MIDCCMIX.mjs +0 -42
  101. package/dist/lib/node-esm/chunk-MIDCCMIX.mjs.map +0 -7
  102. package/dist/lib/node-esm/chunk-NEVN5WR6.mjs +0 -17
  103. package/dist/lib/node-esm/chunk-NEVN5WR6.mjs.map +0 -7
  104. package/dist/lib/node-esm/index.mjs +0 -493
  105. package/dist/lib/node-esm/index.mjs.map +0 -7
  106. package/dist/lib/node-esm/meta.json +0 -1
  107. package/dist/lib/node-esm/meta.mjs +0 -10
  108. package/dist/lib/node-esm/types/index.mjs +0 -15
  109. package/dist/types/src/components/MarkdownContainer.d.ts +0 -15
  110. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  111. package/dist/types/src/hooks/index.d.ts +0 -2
  112. package/dist/types/src/hooks/index.d.ts.map +0 -1
  113. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  114. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  115. package/src/components/MarkdownContainer.tsx +0 -108
  116. package/src/hooks/index.ts +0 -5
  117. package/src/hooks/useSelectCurrentThread.tsx +0 -46
  118. package/src/meta.ts +0 -15
  119. /package/dist/lib/{node-esm/meta.mjs.map → browser/DocumentCard-2P4EICBA.mjs.map} +0 -0
  120. /package/dist/lib/{node-esm/types/index.mjs.map → browser/DocumentEditor-GPWV3VN3.mjs.map} +0 -0
@@ -0,0 +1,208 @@
1
+ import {
2
+ MARKDOWN_PLUGIN
3
+ } from "./chunk-4GGD6YJO.mjs";
4
+
5
+ // packages/plugins/plugin-markdown/src/components/MarkdownEditor.tsx
6
+ import { openSearchPanel } from "@codemirror/search";
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";
11
+ import { useThemeContext, useTranslation } from "@dxos/react-ui";
12
+ import { Toolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, processAction, useActionHandler, useCommentState, useCommentClickListener, useFormattingState, useTextEditor, editorContent, editorGutter, Cursor, setSelection } from "@dxos/react-ui-editor";
13
+ import { sectionToolbarLayout } from "@dxos/react-ui-stack";
14
+ import { textBlockWidth, focusRing, mx } from "@dxos/react-ui-theme";
15
+ import { nonNullable } from "@dxos/util";
16
+ var attentionFragment = mx("group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface", "group-focus-within/editor:border-separator");
17
+ var DEFAULT_VIEW_MODE = "preview";
18
+ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, scrollTo, selection, toolbar, viewMode, onFileUpload, onViewModeChange }) => {
19
+ const { t } = useTranslation(MARKDOWN_PLUGIN);
20
+ const { themeMode } = useThemeContext();
21
+ const dispatch = useIntentDispatcher();
22
+ const attentionPlugin = useResolvePlugin(parseAttentionPlugin);
23
+ const layoutPlugin = useResolvePlugin(parseLayoutPlugin);
24
+ const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);
25
+ const isDirectlyAttended = attended.length === 1 && attended[0] === id;
26
+ const [formattingState, formattingObserver] = useFormattingState();
27
+ const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [
28
+ extensionProviders
29
+ ]);
30
+ const [commentsState, commentObserver] = useCommentState();
31
+ const onCommentClick = useCallback(() => {
32
+ void dispatch({
33
+ action: LayoutAction.SET_LAYOUT,
34
+ data: {
35
+ element: "complementary",
36
+ state: true
37
+ }
38
+ });
39
+ }, [
40
+ dispatch
41
+ ]);
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
+ });
77
+ const handleDrop = async (view, { files }) => {
78
+ const file = files[0];
79
+ const info = file && onFileUpload ? await onFileUpload(file) : void 0;
80
+ if (info) {
81
+ processAction(view, {
82
+ type: "image",
83
+ data: info.url
84
+ });
85
+ }
86
+ };
87
+ const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
88
+ initialValue,
89
+ extensions: [
90
+ formattingObserver,
91
+ commentObserver,
92
+ commentClickObserver,
93
+ createBasicExtensions({
94
+ readonly: viewMode === "readonly",
95
+ placeholder: t("editor placeholder"),
96
+ scrollPastEnd: role === "section" ? false : scrollPastEnd
97
+ }),
98
+ createMarkdownExtensions({
99
+ themeMode
100
+ }),
101
+ createThemeExtensions({
102
+ themeMode,
103
+ syntaxHighlighting: true,
104
+ slots: {
105
+ content: {
106
+ className: editorContent
107
+ }
108
+ }
109
+ }),
110
+ editorGutter,
111
+ role !== "section" && onFileUpload ? dropFile({
112
+ onDrop: handleDrop
113
+ }) : [],
114
+ providerExtensions,
115
+ extensions
116
+ ].filter(nonNullable),
117
+ ...role !== "section" && {
118
+ id,
119
+ scrollTo,
120
+ selection,
121
+ // TODO(wittjosiah): Autofocus based on layout is racy.
122
+ autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
123
+ moveToEndOfLine: true
124
+ }
125
+ }), [
126
+ id,
127
+ initialValue,
128
+ formattingObserver,
129
+ viewMode,
130
+ themeMode,
131
+ extensions,
132
+ providerExtensions
133
+ ]);
134
+ useTest(editorView);
135
+ const handleToolbarAction = useActionHandler(editorView);
136
+ const handleAction = (action) => {
137
+ switch (action.type) {
138
+ case "search": {
139
+ if (editorView) {
140
+ openSearchPanel(editorView);
141
+ }
142
+ return;
143
+ }
144
+ case "view-mode": {
145
+ onViewModeChange?.(id, action.data);
146
+ return;
147
+ }
148
+ }
149
+ handleToolbarAction?.(action);
150
+ };
151
+ return /* @__PURE__ */ React.createElement("div", {
152
+ role: "none",
153
+ ...role === "section" ? {
154
+ className: "flex flex-col"
155
+ } : {
156
+ className: "contents group/editor",
157
+ ...isDirectlyAttended && {
158
+ "aria-current": "location"
159
+ }
160
+ }
161
+ }, toolbar && /* @__PURE__ */ React.createElement("div", {
162
+ role: "none",
163
+ className: mx("flex shrink-0 justify-center overflow-x-auto", attentionFragment)
164
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, {
165
+ classNames: role === "section" ? [
166
+ textBlockWidth,
167
+ "z-[2] group-focus-within/section:visible",
168
+ !isDirectlyAttended && "invisible",
169
+ sectionToolbarLayout
170
+ ] : [
171
+ textBlockWidth,
172
+ "group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator"
173
+ ],
174
+ state: formattingState && {
175
+ ...formattingState,
176
+ ...commentsState
177
+ },
178
+ onAction: handleAction
179
+ }, /* @__PURE__ */ React.createElement(Toolbar.Markdown, null), onFileUpload && /* @__PURE__ */ React.createElement(Toolbar.Custom, {
180
+ onUpload: onFileUpload
181
+ }), /* @__PURE__ */ React.createElement(Toolbar.Separator, null), /* @__PURE__ */ React.createElement(Toolbar.View, {
182
+ mode: viewMode ?? DEFAULT_VIEW_MODE
183
+ }), /* @__PURE__ */ React.createElement(Toolbar.Actions, null))), /* @__PURE__ */ React.createElement("div", {
184
+ role: "none",
185
+ ref: parentRef,
186
+ "data-testid": "composer.markdownRoot",
187
+ "data-toolbar": toolbar ? "enabled" : "disabled",
188
+ className: role === "section" ? mx("flex flex-col flex-1 min-bs-[12rem]", focusRing) : mx("flex is-full bs-full overflow-hidden", focusRing, attentionFragment, "focus-visible:ring-inset", "data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2"),
189
+ ...focusAttributes
190
+ }));
191
+ };
192
+ var useTest = (view) => {
193
+ useEffect(() => {
194
+ const composer = window.composer;
195
+ if (composer) {
196
+ composer.editorView = view;
197
+ }
198
+ }, [
199
+ view
200
+ ]);
201
+ };
202
+ var MarkdownEditor_default = MarkdownEditor;
203
+
204
+ export {
205
+ MarkdownEditor,
206
+ MarkdownEditor_default
207
+ };
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,104 +1,123 @@
1
+ import "./chunk-RL7QY322.mjs";
1
2
  import {
2
3
  getFallbackName,
3
4
  isMarkdownProperties,
4
5
  markdownExtensionPlugins,
5
6
  serializer,
6
7
  setFallbackName
7
- } from "./chunk-4MPY6KRJ.mjs";
8
+ } from "./chunk-7AF2JLK4.mjs";
8
9
  import {
9
10
  DocumentType,
10
11
  MarkdownAction,
11
- TextType,
12
- isEditorModel
13
- } from "./chunk-US5O2P3R.mjs";
12
+ TextType
13
+ } from "./chunk-CQJL4G4X.mjs";
14
+ import "./chunk-354DCID5.mjs";
15
+ import "./chunk-VUN4QKTT.mjs";
14
16
  import {
15
17
  MARKDOWN_PLUGIN,
16
18
  meta_default
17
- } from "./chunk-DRJ3FPYF.mjs";
19
+ } from "./chunk-4GGD6YJO.mjs";
18
20
 
19
21
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
20
22
  import { TextAa } from "@phosphor-icons/react";
21
- import React3 from "react";
22
- import { parseIntentPlugin, resolvePlugin, LayoutAction, NavigationAction } from "@dxos/app-framework";
23
+ import React5 from "react";
24
+ import { isObject, parseIntentPlugin, resolvePlugin, LayoutAction, NavigationAction } from "@dxos/app-framework";
23
25
  import { create } from "@dxos/echo-schema";
24
26
  import { LocalStorageStore } from "@dxos/local-storage";
27
+ import { log } from "@dxos/log";
25
28
  import { parseClientPlugin } from "@dxos/plugin-client";
26
29
  import { createExtension, isActionGroup } from "@dxos/plugin-graph";
27
30
  import { SpaceAction } from "@dxos/plugin-space";
28
31
  import { CollectionType } from "@dxos/plugin-space/types";
29
32
  import { createDocAccessor, fullyQualifiedId, getRangeFromCursor, isSpace, loadObjectReferences } from "@dxos/react-client/echo";
30
33
  import { EditorViewModes as EditorViewModes2, translations as editorTranslations } from "@dxos/react-ui-editor";
34
+ import { isTileComponentProps } from "@dxos/react-ui-mosaic";
31
35
 
32
36
  // packages/plugins/plugin-markdown/src/components/index.ts
37
+ import React4 from "react";
38
+
39
+ // packages/plugins/plugin-markdown/src/components/HeadingMenu.tsx
40
+ import { DotsThreeVertical } from "@phosphor-icons/react";
41
+ import React from "react";
42
+ import { Surface } from "@dxos/app-framework";
43
+ import { Button, DropdownMenu } from "@dxos/react-ui";
44
+ import { fineButtonDimensions, getSize } from "@dxos/react-ui-theme";
45
+
46
+ // packages/plugins/plugin-markdown/src/components/Layout.tsx
33
47
  import React2 from "react";
48
+ import { Main } from "@dxos/react-ui";
49
+ import { editorWithToolbarLayout } from "@dxos/react-ui-editor";
50
+ import { topbarBlockPaddingStart } from "@dxos/react-ui-theme";
34
51
 
35
52
  // packages/plugins/plugin-markdown/src/components/MarkdownSettings.tsx
36
- import React from "react";
53
+ import React3 from "react";
37
54
  import { SettingsValue } from "@dxos/plugin-settings";
38
55
  import { Input, Select, useTranslation } from "@dxos/react-ui";
39
56
  import { EditorInputModes, EditorViewModes } from "@dxos/react-ui-editor";
40
57
  var MarkdownSettings = ({ settings }) => {
41
58
  const { t } = useTranslation(MARKDOWN_PLUGIN);
42
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(SettingsValue, {
59
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(SettingsValue, {
43
60
  label: t("default view mode label")
44
- }, /* @__PURE__ */ React.createElement(Select.Root, {
61
+ }, /* @__PURE__ */ React3.createElement(Select.Root, {
45
62
  value: settings.defaultViewMode,
46
63
  onValueChange: (value) => {
47
64
  settings.defaultViewMode = value;
48
65
  }
49
- }, /* @__PURE__ */ React.createElement(Select.TriggerButton, null), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, EditorViewModes.map((mode) => /* @__PURE__ */ React.createElement(Select.Option, {
66
+ }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, null), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, EditorViewModes.map((mode) => /* @__PURE__ */ React3.createElement(Select.Option, {
50
67
  key: mode,
51
68
  value: mode
52
69
  }, t(`${mode} mode label`, {
53
70
  ns: "react-ui-editor"
54
- })))))))), /* @__PURE__ */ React.createElement(SettingsValue, {
71
+ })))))))), /* @__PURE__ */ React3.createElement(SettingsValue, {
55
72
  label: t("editor input mode label")
56
- }, /* @__PURE__ */ React.createElement(Select.Root, {
73
+ }, /* @__PURE__ */ React3.createElement(Select.Root, {
57
74
  value: settings.editorInputMode ?? "default",
58
75
  onValueChange: (value) => {
59
76
  settings.editorInputMode = value;
60
77
  }
61
- }, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
78
+ }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
62
79
  placeholder: t("select editor input mode placeholder")
63
- }), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, EditorInputModes.map((mode) => /* @__PURE__ */ React.createElement(Select.Option, {
80
+ }), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, EditorInputModes.map((mode) => /* @__PURE__ */ React3.createElement(Select.Option, {
64
81
  key: mode,
65
82
  value: mode
66
- }, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */ React.createElement(SettingsValue, {
83
+ }, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */ React3.createElement(SettingsValue, {
67
84
  label: t("settings toolbar label")
68
- }, /* @__PURE__ */ React.createElement(Input.Switch, {
85
+ }, /* @__PURE__ */ React3.createElement(Input.Switch, {
69
86
  checked: settings.toolbar,
70
87
  onCheckedChange: (checked) => settings.toolbar = !!checked
71
- })), /* @__PURE__ */ React.createElement(SettingsValue, {
88
+ })), /* @__PURE__ */ React3.createElement(SettingsValue, {
72
89
  label: t("settings numbered headings label")
73
- }, /* @__PURE__ */ React.createElement(Input.Switch, {
90
+ }, /* @__PURE__ */ React3.createElement(Input.Switch, {
74
91
  checked: settings.numberedHeadings,
75
92
  onCheckedChange: (checked) => settings.numberedHeadings = !!checked
76
- })), /* @__PURE__ */ React.createElement(SettingsValue, {
93
+ })), /* @__PURE__ */ React3.createElement(SettingsValue, {
77
94
  label: t("settings folding label")
78
- }, /* @__PURE__ */ React.createElement(Input.Switch, {
95
+ }, /* @__PURE__ */ React3.createElement(Input.Switch, {
79
96
  checked: settings.folding,
80
97
  onCheckedChange: (checked) => settings.folding = !!checked
81
- })), /* @__PURE__ */ React.createElement(SettingsValue, {
98
+ })), /* @__PURE__ */ React3.createElement(SettingsValue, {
82
99
  label: t("settings experimental label")
83
- }, /* @__PURE__ */ React.createElement(Input.Switch, {
100
+ }, /* @__PURE__ */ React3.createElement(Input.Switch, {
84
101
  checked: settings.experimental,
85
102
  onCheckedChange: (checked) => settings.experimental = !!checked
86
- })), /* @__PURE__ */ React.createElement(SettingsValue, {
103
+ })), /* @__PURE__ */ React3.createElement(SettingsValue, {
87
104
  label: t("settings debug label"),
88
- secondary: settings.debug ? /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextArea, {
105
+ secondary: settings.debug ? /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextArea, {
89
106
  rows: 5,
90
107
  value: settings.typewriter,
91
108
  onChange: ({ target: { value } }) => settings.typewriter = value,
92
109
  placeholder: t("settings debug placeholder")
93
110
  })) : void 0
94
- }, /* @__PURE__ */ React.createElement(Input.Switch, {
111
+ }, /* @__PURE__ */ React3.createElement(Input.Switch, {
95
112
  checked: settings.debug,
96
113
  onCheckedChange: (checked) => settings.debug = !!checked
97
114
  })));
98
115
  };
99
116
 
100
117
  // packages/plugins/plugin-markdown/src/components/index.ts
101
- var MarkdownContainer = React2.lazy(() => import("./MarkdownContainer-52FJDCTV.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"));
102
121
 
103
122
  // packages/plugins/plugin-markdown/src/translations.ts
104
123
  var translations_default = [
@@ -133,7 +152,10 @@ var translations_default = [
133
152
  ];
134
153
 
135
154
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
136
- var getDoc = (object) => object instanceof DocumentType ? object : void 0;
155
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx";
156
+ var isEditorModel = (data) => {
157
+ return data && typeof data === "object" && "id" in data && typeof data.id === "string" && "text" in data && typeof data.text === "string";
158
+ };
137
159
  var MarkdownPlugin = () => {
138
160
  const settings = new LocalStorageStore(MARKDOWN_PLUGIN, {
139
161
  defaultViewMode: "preview",
@@ -145,8 +167,12 @@ var MarkdownPlugin = () => {
145
167
  extensionProviders: [],
146
168
  viewMode: {}
147
169
  });
148
- const getViewMode = (id) => id && state.values.viewMode[id] || settings.values.defaultViewMode;
149
- const setViewMode = (id, viewMode) => state.values.viewMode[id] = viewMode;
170
+ const getViewMode = (id) => {
171
+ return id && state.values.viewMode[id] || settings.values.defaultViewMode;
172
+ };
173
+ const setViewMode = (id, nextViewMode) => {
174
+ state.values.viewMode[id] = nextViewMode;
175
+ };
150
176
  return {
151
177
  meta: meta_default,
152
178
  ready: async (plugins) => {
@@ -198,7 +224,7 @@ var MarkdownPlugin = () => {
198
224
  });
199
225
  markdownExtensionPlugins(plugins).forEach((plugin) => {
200
226
  const { extensions } = plugin.provides.markdown;
201
- state.values.extensionProviders?.push(extensions);
227
+ state.values.extensionProviders.push(extensions);
202
228
  });
203
229
  },
204
230
  provides: {
@@ -206,14 +232,15 @@ var MarkdownPlugin = () => {
206
232
  metadata: {
207
233
  records: {
208
234
  [DocumentType.typename]: {
209
- label: (object) => object instanceof DocumentType ? object.name || object.fallbackName : void 0,
235
+ label: (object) => object instanceof DocumentType ? object.name ?? object.fallbackName : void 0,
210
236
  placeholder: [
211
237
  "document title placeholder",
212
238
  {
213
239
  ns: MARKDOWN_PLUGIN
214
240
  }
215
241
  ],
216
- icon: "ph--text-aa--regular",
242
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
243
+ iconSymbol: "ph--text-aa--regular",
217
244
  graphProps: {
218
245
  managesAutofocus: true
219
246
  },
@@ -236,17 +263,6 @@ var MarkdownPlugin = () => {
236
263
  TextType
237
264
  ]
238
265
  },
239
- space: {
240
- onSpaceCreate: {
241
- label: [
242
- "create document label",
243
- {
244
- ns: MARKDOWN_PLUGIN
245
- }
246
- ],
247
- action: MarkdownAction.CREATE
248
- }
249
- },
250
266
  graph: {
251
267
  builder: (plugins) => {
252
268
  const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
@@ -293,7 +309,8 @@ var MarkdownPlugin = () => {
293
309
  ns: MARKDOWN_PLUGIN
294
310
  }
295
311
  ],
296
- icon: "ph--text-aa--regular",
312
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
313
+ iconSymbol: "ph--text-aa--regular",
297
314
  testId: "markdownPlugin.createObject"
298
315
  }
299
316
  }
@@ -365,7 +382,7 @@ var MarkdownPlugin = () => {
365
382
  ns: MARKDOWN_PLUGIN
366
383
  }
367
384
  ],
368
- icon: (props) => /* @__PURE__ */ React3.createElement(TextAa, props),
385
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
369
386
  intent: {
370
387
  plugin: MARKDOWN_PLUGIN,
371
388
  action: MarkdownAction.CREATE
@@ -374,57 +391,81 @@ var MarkdownPlugin = () => {
374
391
  ]
375
392
  },
376
393
  thread: {
394
+ // TODO(Zan): How to better handle the type predicate?
377
395
  predicate: (obj) => obj instanceof DocumentType,
378
396
  createSort: (doc) => {
379
397
  const accessor = doc.content ? createDocAccessor(doc.content, [
380
398
  "content"
381
399
  ]) : void 0;
382
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
+ });
383
407
  return (_) => 0;
384
408
  }
385
409
  const getStartPosition = (cursor) => {
386
410
  const range = cursor ? getRangeFromCursor(accessor, cursor) : void 0;
387
411
  return range?.start ?? Number.MAX_SAFE_INTEGER;
388
412
  };
389
- return (anchorA, anchorB) => {
390
- if (anchorA === void 0 || anchorB === void 0) {
391
- return 0;
392
- }
393
- const posA = getStartPosition(anchorA);
394
- const posB = getStartPosition(anchorB);
395
- return posA - posB;
396
- };
413
+ return (anchorA, anchorB) => getStartPosition(anchorA) - getStartPosition(anchorB);
397
414
  }
398
415
  },
399
416
  surface: {
400
- component: ({ data, role }) => {
417
+ component: ({ data, role, ...props }, forwardedRef) => {
418
+ const doc = data.active instanceof DocumentType ? data.active : data.object instanceof DocumentType ? data.object : void 0;
401
419
  switch (role) {
402
420
  case "section":
403
421
  case "article": {
404
- const doc = getDoc(data.active) ?? getDoc(data.object);
405
- const { id, object } = isEditorModel(data.object) ? {
406
- id: data.object.id,
407
- object: data.object
408
- } : doc ? {
409
- id: fullyQualifiedId(doc),
410
- object: doc
411
- } : {};
412
- if (!id || !object) {
413
- return null;
422
+ if (doc && doc.content) {
423
+ return /* @__PURE__ */ React5.createElement(DocumentEditor, {
424
+ role,
425
+ coordinate: data.coordinate,
426
+ document: doc,
427
+ extensionProviders: state.values.extensionProviders,
428
+ settings: settings.values,
429
+ scrollPastEnd: true,
430
+ viewMode: getViewMode(fullyQualifiedId(doc)),
431
+ onViewModeChange: setViewMode
432
+ });
433
+ } else if (isEditorModel(data.object)) {
434
+ return /* @__PURE__ */ React5.createElement(MarkdownEditor, {
435
+ id: data.object.id,
436
+ role,
437
+ coordinate: data.coordinate,
438
+ initialValue: data.object.text,
439
+ extensionProviders: state.values.extensionProviders,
440
+ inputMode: settings.values.editorInputMode,
441
+ toolbar: settings.values.toolbar,
442
+ scrollPastEnd: true,
443
+ viewMode: getViewMode(data.object.id),
444
+ onViewModeChange: setViewMode
445
+ });
414
446
  }
415
- return /* @__PURE__ */ React3.createElement(MarkdownContainer, {
416
- id,
417
- object,
418
- role,
419
- coordinate: data.coordinate,
420
- settings: settings.values,
421
- extensionProviders: state.values.extensionProviders,
422
- viewMode: getViewMode(id),
423
- onViewModeChange: setViewMode
424
- });
447
+ break;
448
+ }
449
+ case "card": {
450
+ if (isObject(data.content) && typeof data.content.id === "string" && data.content.object instanceof DocumentType) {
451
+ const cardProps = {
452
+ ...props,
453
+ item: {
454
+ id: data.content.id,
455
+ object: data.content.object,
456
+ color: typeof data.content.color === "string" ? data.content.color : void 0
457
+ }
458
+ };
459
+ return isTileComponentProps(cardProps) ? /* @__PURE__ */ React5.createElement(DocumentCard, {
460
+ ...cardProps,
461
+ settings: settings.values,
462
+ ref: forwardedRef
463
+ }) : null;
464
+ }
465
+ break;
425
466
  }
426
467
  case "settings": {
427
- return data.plugin === meta_default.id ? /* @__PURE__ */ React3.createElement(MarkdownSettings, {
468
+ return data.plugin === meta_default.id ? /* @__PURE__ */ React5.createElement(MarkdownSettings, {
428
469
  settings: settings.values
429
470
  }) : null;
430
471
  }
@@ -483,7 +524,6 @@ export {
483
524
  TextType,
484
525
  src_default as default,
485
526
  getFallbackName,
486
- isEditorModel,
487
527
  isMarkdownProperties,
488
528
  markdownExtensionPlugins,
489
529
  serializer,