@dxos/plugin-markdown 0.6.13-main.ed424a1 → 0.6.13

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 (122) 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 -78
  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 -112
  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 -50
  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 +7 -13
  77. package/src/components/MarkdownEditor.tsx +75 -40
  78. package/src/components/Toolbar.stories.tsx +2 -2
  79. package/src/components/index.ts +14 -2
  80. package/src/extensions.tsx +67 -124
  81. package/src/meta.tsx +19 -0
  82. package/src/types/document.ts +0 -12
  83. package/src/types/types.ts +7 -10
  84. package/src/util.tsx +2 -2
  85. package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs +0 -467
  86. package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs.map +0 -7
  87. package/dist/lib/browser/chunk-45N5MEOV.mjs +0 -50
  88. package/dist/lib/browser/chunk-45N5MEOV.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-DRJ3FPYF.mjs +0 -15
  90. package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-US5O2P3R.mjs.map +0 -7
  92. package/dist/lib/node/MarkdownContainer-IM3V72FY.cjs +0 -482
  93. package/dist/lib/node/MarkdownContainer-IM3V72FY.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/chunk-W2YJVZ3N.cjs +0 -72
  97. package/dist/lib/node/chunk-W2YJVZ3N.cjs.map +0 -7
  98. package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs +0 -468
  99. package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.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/chunk-UCNOGIBC.mjs +0 -51
  105. package/dist/lib/node-esm/chunk-UCNOGIBC.mjs.map +0 -7
  106. package/dist/lib/node-esm/index.mjs +0 -494
  107. package/dist/lib/node-esm/index.mjs.map +0 -7
  108. package/dist/lib/node-esm/meta.json +0 -1
  109. package/dist/lib/node-esm/meta.mjs +0 -10
  110. package/dist/lib/node-esm/types/index.mjs +0 -15
  111. package/dist/types/src/components/MarkdownContainer.d.ts +0 -15
  112. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  113. package/dist/types/src/hooks/index.d.ts +0 -2
  114. package/dist/types/src/hooks/index.d.ts.map +0 -1
  115. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  116. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  117. package/src/components/MarkdownContainer.tsx +0 -108
  118. package/src/hooks/index.ts +0 -5
  119. package/src/hooks/useSelectCurrentThread.tsx +0 -46
  120. package/src/meta.ts +0 -15
  121. /package/dist/lib/{node-esm/meta.mjs.map → browser/DocumentCard-2P4EICBA.mjs.map} +0 -0
  122. /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-45N5MEOV.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-AYBJNSXD.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,12 +152,14 @@ 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",
140
162
  toolbar: true,
141
- numberedHeadings: true,
142
163
  folding: false,
143
164
  experimental: false
144
165
  });
@@ -146,8 +167,12 @@ var MarkdownPlugin = () => {
146
167
  extensionProviders: [],
147
168
  viewMode: {}
148
169
  });
149
- const getViewMode = (id) => id && state.values.viewMode[id] || settings.values.defaultViewMode;
150
- 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
+ };
151
176
  return {
152
177
  meta: meta_default,
153
178
  ready: async (plugins) => {
@@ -199,7 +224,7 @@ var MarkdownPlugin = () => {
199
224
  });
200
225
  markdownExtensionPlugins(plugins).forEach((plugin) => {
201
226
  const { extensions } = plugin.provides.markdown;
202
- state.values.extensionProviders?.push(extensions);
227
+ state.values.extensionProviders.push(extensions);
203
228
  });
204
229
  },
205
230
  provides: {
@@ -207,14 +232,15 @@ var MarkdownPlugin = () => {
207
232
  metadata: {
208
233
  records: {
209
234
  [DocumentType.typename]: {
210
- label: (object) => object instanceof DocumentType ? object.name || object.fallbackName : void 0,
235
+ label: (object) => object instanceof DocumentType ? object.name ?? object.fallbackName : void 0,
211
236
  placeholder: [
212
237
  "document title placeholder",
213
238
  {
214
239
  ns: MARKDOWN_PLUGIN
215
240
  }
216
241
  ],
217
- icon: "ph--text-aa--regular",
242
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
243
+ iconSymbol: "ph--text-aa--regular",
218
244
  graphProps: {
219
245
  managesAutofocus: true
220
246
  },
@@ -237,17 +263,6 @@ var MarkdownPlugin = () => {
237
263
  TextType
238
264
  ]
239
265
  },
240
- space: {
241
- onSpaceCreate: {
242
- label: [
243
- "create document label",
244
- {
245
- ns: MARKDOWN_PLUGIN
246
- }
247
- ],
248
- action: MarkdownAction.CREATE
249
- }
250
- },
251
266
  graph: {
252
267
  builder: (plugins) => {
253
268
  const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
@@ -294,7 +309,8 @@ var MarkdownPlugin = () => {
294
309
  ns: MARKDOWN_PLUGIN
295
310
  }
296
311
  ],
297
- icon: "ph--text-aa--regular",
312
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
313
+ iconSymbol: "ph--text-aa--regular",
298
314
  testId: "markdownPlugin.createObject"
299
315
  }
300
316
  }
@@ -366,7 +382,7 @@ var MarkdownPlugin = () => {
366
382
  ns: MARKDOWN_PLUGIN
367
383
  }
368
384
  ],
369
- icon: (props) => /* @__PURE__ */ React3.createElement(TextAa, props),
385
+ icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
370
386
  intent: {
371
387
  plugin: MARKDOWN_PLUGIN,
372
388
  action: MarkdownAction.CREATE
@@ -375,57 +391,81 @@ var MarkdownPlugin = () => {
375
391
  ]
376
392
  },
377
393
  thread: {
394
+ // TODO(Zan): How to better handle the type predicate?
378
395
  predicate: (obj) => obj instanceof DocumentType,
379
396
  createSort: (doc) => {
380
397
  const accessor = doc.content ? createDocAccessor(doc.content, [
381
398
  "content"
382
399
  ]) : void 0;
383
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
+ });
384
407
  return (_) => 0;
385
408
  }
386
409
  const getStartPosition = (cursor) => {
387
410
  const range = cursor ? getRangeFromCursor(accessor, cursor) : void 0;
388
411
  return range?.start ?? Number.MAX_SAFE_INTEGER;
389
412
  };
390
- return (anchorA, anchorB) => {
391
- if (anchorA === void 0 || anchorB === void 0) {
392
- return 0;
393
- }
394
- const posA = getStartPosition(anchorA);
395
- const posB = getStartPosition(anchorB);
396
- return posA - posB;
397
- };
413
+ return (anchorA, anchorB) => getStartPosition(anchorA) - getStartPosition(anchorB);
398
414
  }
399
415
  },
400
416
  surface: {
401
- 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;
402
419
  switch (role) {
403
420
  case "section":
404
421
  case "article": {
405
- const doc = getDoc(data.active) ?? getDoc(data.object);
406
- const { id, object } = isEditorModel(data.object) ? {
407
- id: data.object.id,
408
- object: data.object
409
- } : doc ? {
410
- id: fullyQualifiedId(doc),
411
- object: doc
412
- } : {};
413
- if (!id || !object) {
414
- 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
+ });
415
446
  }
416
- return /* @__PURE__ */ React3.createElement(MarkdownContainer, {
417
- id,
418
- object,
419
- role,
420
- coordinate: data.coordinate,
421
- settings: settings.values,
422
- extensionProviders: state.values.extensionProviders,
423
- viewMode: getViewMode(id),
424
- onViewModeChange: setViewMode
425
- });
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;
426
466
  }
427
467
  case "settings": {
428
- return data.plugin === meta_default.id ? /* @__PURE__ */ React3.createElement(MarkdownSettings, {
468
+ return data.plugin === meta_default.id ? /* @__PURE__ */ React5.createElement(MarkdownSettings, {
429
469
  settings: settings.values
430
470
  }) : null;
431
471
  }
@@ -484,7 +524,6 @@ export {
484
524
  TextType,
485
525
  src_default as default,
486
526
  getFallbackName,
487
- isEditorModel,
488
527
  isMarkdownProperties,
489
528
  markdownExtensionPlugins,
490
529
  serializer,