@dxos/plugin-markdown 0.6.14-staging.e15392e → 0.7.1-staging.599df14

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 (64) hide show
  1. package/dist/lib/browser/{MarkdownContainer-HRGXWEA4.mjs → MarkdownContainer-BXEW4NEC.mjs} +43 -54
  2. package/dist/lib/browser/MarkdownContainer-BXEW4NEC.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-DRJ3FPYF.mjs → chunk-4X6YX3KU.mjs} +3 -3
  4. package/dist/lib/browser/chunk-4X6YX3KU.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-VGIHBUXB.mjs → chunk-PV4AWYWK.mjs} +2 -2
  6. package/dist/lib/browser/{chunk-US5O2P3R.mjs → chunk-VZAGHNHU.mjs} +2 -2
  7. package/dist/lib/browser/index.mjs +13 -14
  8. package/dist/lib/browser/index.mjs.map +3 -3
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/meta.mjs +1 -1
  11. package/dist/lib/browser/types/index.mjs +2 -2
  12. package/dist/lib/node/{MarkdownContainer-QZ4YLO7M.cjs → MarkdownContainer-VJJQVYFM.cjs} +47 -58
  13. package/dist/lib/node/MarkdownContainer-VJJQVYFM.cjs.map +7 -0
  14. package/dist/lib/node/{chunk-6HPTH2F5.cjs → chunk-2A5P424C.cjs} +7 -7
  15. package/dist/lib/node/{chunk-UJMOZCIA.cjs → chunk-BHPFK7YI.cjs} +6 -6
  16. package/dist/lib/node/{chunk-P7YU53RP.cjs → chunk-PHHIPRJC.cjs} +6 -6
  17. package/dist/lib/node/chunk-PHHIPRJC.cjs.map +7 -0
  18. package/dist/lib/node/index.cjs +58 -59
  19. package/dist/lib/node/index.cjs.map +3 -3
  20. package/dist/lib/node/meta.cjs +3 -3
  21. package/dist/lib/node/meta.cjs.map +1 -1
  22. package/dist/lib/node/meta.json +1 -1
  23. package/dist/lib/node/types/index.cjs +6 -6
  24. package/dist/lib/node/types/index.cjs.map +1 -1
  25. package/dist/lib/node-esm/{MarkdownContainer-FSWQL76V.mjs → MarkdownContainer-R4GNGXJZ.mjs} +43 -54
  26. package/dist/lib/node-esm/MarkdownContainer-R4GNGXJZ.mjs.map +7 -0
  27. package/dist/lib/node-esm/{chunk-NEVN5WR6.mjs → chunk-BABK7FMW.mjs} +3 -3
  28. package/dist/lib/node-esm/chunk-BABK7FMW.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-HPOTHJC4.mjs → chunk-EREAR7QS.mjs} +2 -2
  30. package/dist/lib/node-esm/{chunk-MIDCCMIX.mjs → chunk-OEMU3XY7.mjs} +2 -2
  31. package/dist/lib/node-esm/index.mjs +13 -14
  32. package/dist/lib/node-esm/index.mjs.map +3 -3
  33. package/dist/lib/node-esm/meta.json +1 -1
  34. package/dist/lib/node-esm/meta.mjs +1 -1
  35. package/dist/lib/node-esm/types/index.mjs +2 -2
  36. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  37. package/dist/types/src/components/MarkdownContainer.d.ts +5 -5
  38. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  39. package/dist/types/src/components/MarkdownEditor.d.ts +1 -2
  40. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  41. package/dist/types/src/components/index.d.ts +1 -1
  42. package/dist/types/src/components/index.d.ts.map +1 -1
  43. package/dist/types/src/extensions.d.ts +1 -1
  44. package/dist/types/src/extensions.d.ts.map +1 -1
  45. package/dist/types/src/meta.d.ts +1 -1
  46. package/package.json +29 -30
  47. package/src/MarkdownPlugin.tsx +1 -4
  48. package/src/components/MarkdownContainer.tsx +29 -24
  49. package/src/components/MarkdownEditor.tsx +19 -41
  50. package/src/components/MarkdownSettings.tsx +15 -15
  51. package/src/extensions.tsx +25 -13
  52. package/src/meta.ts +2 -2
  53. package/dist/lib/browser/MarkdownContainer-HRGXWEA4.mjs.map +0 -7
  54. package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
  55. package/dist/lib/node/MarkdownContainer-QZ4YLO7M.cjs.map +0 -7
  56. package/dist/lib/node/chunk-P7YU53RP.cjs.map +0 -7
  57. package/dist/lib/node-esm/MarkdownContainer-FSWQL76V.mjs.map +0 -7
  58. package/dist/lib/node-esm/chunk-NEVN5WR6.mjs.map +0 -7
  59. /package/dist/lib/browser/{chunk-VGIHBUXB.mjs.map → chunk-PV4AWYWK.mjs.map} +0 -0
  60. /package/dist/lib/browser/{chunk-US5O2P3R.mjs.map → chunk-VZAGHNHU.mjs.map} +0 -0
  61. /package/dist/lib/node/{chunk-6HPTH2F5.cjs.map → chunk-2A5P424C.cjs.map} +0 -0
  62. /package/dist/lib/node/{chunk-UJMOZCIA.cjs.map → chunk-BHPFK7YI.cjs.map} +0 -0
  63. /package/dist/lib/node-esm/{chunk-HPOTHJC4.mjs.map → chunk-EREAR7QS.mjs.map} +0 -0
  64. /package/dist/lib/node-esm/{chunk-MIDCCMIX.mjs.map → chunk-OEMU3XY7.mjs.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  getFallbackName,
3
3
  setFallbackName
4
- } from "./chunk-VGIHBUXB.mjs";
4
+ } from "./chunk-PV4AWYWK.mjs";
5
5
  import {
6
6
  DocumentType
7
- } from "./chunk-US5O2P3R.mjs";
7
+ } from "./chunk-VZAGHNHU.mjs";
8
8
  import {
9
9
  MARKDOWN_PLUGIN
10
- } from "./chunk-DRJ3FPYF.mjs";
10
+ } from "./chunk-4X6YX3KU.mjs";
11
11
 
12
12
  // packages/plugins/plugin-markdown/src/components/MarkdownContainer.tsx
13
13
  import React3, { useEffect as useEffect2, useMemo as useMemo3 } from "react";
@@ -19,10 +19,10 @@ import { openSearchPanel } from "@codemirror/search";
19
19
  import React, { useMemo, useEffect, useCallback as useCallback2 } from "react";
20
20
  import { LayoutAction as LayoutAction2, useIntentDispatcher } from "@dxos/app-framework";
21
21
  import { useThemeContext, useTranslation } from "@dxos/react-ui";
22
- import { useAttendableAttributes, useAttention } from "@dxos/react-ui-attention";
22
+ import { useAttention } from "@dxos/react-ui-attention";
23
23
  import { Toolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorContent, editorGutter, processAction, useActionHandler, useCommentState, useCommentClickListener, useFormattingState, useTextEditor } from "@dxos/react-ui-editor";
24
- import { sectionToolbarLayout } from "@dxos/react-ui-stack";
25
- import { textBlockWidth, focusRing, mx } from "@dxos/react-ui-theme";
24
+ import { StackItem } from "@dxos/react-ui-stack";
25
+ import { mx, textBlockWidth } from "@dxos/react-ui-theme";
26
26
  import { isNotFalsy, nonNullable } from "@dxos/util";
27
27
 
28
28
  // packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx
@@ -74,7 +74,6 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
74
74
  const { themeMode } = useThemeContext();
75
75
  const dispatch = useIntentDispatcher();
76
76
  const [formattingState, formattingObserver] = useFormattingState();
77
- const attendableAttributes = useAttendableAttributes(id);
78
77
  const { hasAttention } = useAttention(id);
79
78
  const { scrollTo, selection } = useMemo(() => editorStateStore?.getState(id) ?? {}, [
80
79
  id
@@ -145,7 +144,6 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
145
144
  }
146
145
  }), [
147
146
  id,
148
- initialValue,
149
147
  formattingObserver,
150
148
  viewMode,
151
149
  themeMode,
@@ -170,29 +168,15 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
170
168
  }
171
169
  handleToolbarAction?.(action);
172
170
  };
173
- return /* @__PURE__ */ React.createElement("div", {
174
- role: "none",
175
- ...role === "section" ? {
176
- className: "flex flex-col"
177
- } : {
178
- className: "contents",
179
- // TODO(wittjosiah): Factor out to `useAttendableAttributes`?
180
- ...hasAttention && {
181
- "aria-current": "location"
182
- },
183
- ...attendableAttributes
184
- }
171
+ return /* @__PURE__ */ React.createElement(StackItem.Content, {
172
+ toolbar
185
173
  }, toolbar && /* @__PURE__ */ React.createElement("div", {
186
174
  role: "none",
187
- className: "flex shrink-0 justify-center overflow-x-auto attention-surface"
175
+ className: mx("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0")
188
176
  }, /* @__PURE__ */ React.createElement(Toolbar.Root, {
189
- classNames: role === "section" ? [
177
+ classNames: [
190
178
  textBlockWidth,
191
- "z-[2] group-focus-within/section:visible",
192
- !hasAttention && "invisible",
193
- sectionToolbarLayout
194
- ] : [
195
- textBlockWidth
179
+ !hasAttention && "opacity-20"
196
180
  ],
197
181
  state: formattingState && {
198
182
  ...formattingState,
@@ -208,7 +192,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
208
192
  ref: parentRef,
209
193
  "data-testid": "composer.markdownRoot",
210
194
  "data-toolbar": toolbar ? "enabled" : "disabled",
211
- className: role === "section" ? mx("flex flex-col flex-1 min-bs-[12rem]", focusRing) : mx("flex is-full bs-full overflow-hidden", focusRing, "focus-visible:ring-inset attention-surface", "p-0.5", "data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2"),
195
+ className: mx("ch-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface", role === "article" ? "min-bs-0" : "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24"),
212
196
  ...focusAttributes
213
197
  }));
214
198
  };
@@ -249,8 +233,11 @@ var useExtensions = ({ document, settings, viewMode, editorStateStore, extension
249
233
  viewMode,
250
234
  dispatch,
251
235
  settings,
236
+ settings.editorInputMode,
252
237
  settings.folding,
253
- settings.numberedHeadings
238
+ settings.numberedHeadings,
239
+ settings.debug,
240
+ settings.typewriter
254
241
  ]);
255
242
  const pluginExtensions = useMemo2(() => extensionProviders?.reduce((acc, provider) => {
256
243
  const extension = typeof provider === "function" ? provider({
@@ -261,11 +248,12 @@ var useExtensions = ({ document, settings, viewMode, editorStateStore, extension
261
248
  }
262
249
  return acc;
263
250
  }, []), [
264
- extensionProviders
251
+ extensionProviders,
252
+ document
265
253
  ]);
266
254
  return useMemo2(() => [
267
255
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
268
- createDataExtensions({
256
+ document && createDataExtensions({
269
257
  id: document.id,
270
258
  text: document.content && createDocAccessor(document.content, [
271
259
  "content"
@@ -274,7 +262,7 @@ var useExtensions = ({ document, settings, viewMode, editorStateStore, extension
274
262
  identity
275
263
  }),
276
264
  selectionState(editorStateStore),
277
- listener({
265
+ document && listener({
278
266
  onChange: (text) => setFallbackName(document, text)
279
267
  }),
280
268
  baseExtensions,
@@ -283,7 +271,7 @@ var useExtensions = ({ document, settings, viewMode, editorStateStore, extension
283
271
  baseExtensions,
284
272
  pluginExtensions,
285
273
  document,
286
- document.content,
274
+ document?.content,
287
275
  space,
288
276
  identity
289
277
  ]);
@@ -350,7 +338,7 @@ var onRenderLink = (onSelectObject) => (el, url) => {
350
338
  const qualifiedId = url.split("/").at(-1);
351
339
  invariant(qualifiedId, "Invalid link format.", {
352
340
  F: __dxlog_file,
353
- L: 203,
341
+ L: 215,
354
342
  S: void 0,
355
343
  A: [
356
344
  "qualifiedId",
@@ -394,40 +382,42 @@ var renderRoot = (root, node) => {
394
382
  };
395
383
 
396
384
  // packages/plugins/plugin-markdown/src/components/MarkdownContainer.tsx
397
- var MarkdownContainer = ({ id, role, object, settings, ...props }) => {
385
+ var MarkdownContainer = ({ id, role, object, extensionProviders, settings, viewMode, editorStateStore, onViewModeChange }) => {
398
386
  const scrollPastEnd = role === "article";
399
- if (object instanceof DocumentType) {
387
+ const doc = object instanceof DocumentType ? object : void 0;
388
+ const extensions = useExtensions({
389
+ extensionProviders,
390
+ document: doc,
391
+ settings,
392
+ viewMode,
393
+ editorStateStore
394
+ });
395
+ if (doc) {
400
396
  return /* @__PURE__ */ React3.createElement(DocumentEditor, {
401
397
  id: fullyQualifiedId2(object),
402
398
  role,
403
- document: object,
399
+ document: doc,
400
+ extensions,
404
401
  settings,
405
402
  scrollPastEnd,
406
- ...props
403
+ onViewModeChange
407
404
  });
408
405
  } else {
409
406
  return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
410
407
  id,
411
408
  role,
412
409
  initialValue: object.text,
410
+ extensions,
411
+ viewMode,
413
412
  toolbar: settings.toolbar,
413
+ inputMode: settings.editorInputMode,
414
414
  scrollPastEnd,
415
- ...props
415
+ onViewModeChange
416
416
  });
417
417
  }
418
418
  };
419
- var DocumentEditor = ({ id, document: doc, extensionProviders, settings, viewMode, editorStateStore, ...props }) => {
419
+ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
420
420
  const space = getSpace2(doc);
421
- const initialValue = useMemo3(() => doc.content?.content, [
422
- doc.content
423
- ]);
424
- const extensions = useExtensions({
425
- extensionProviders,
426
- document: doc,
427
- settings,
428
- viewMode,
429
- editorStateStore
430
- });
431
421
  useEffect2(() => {
432
422
  if (!doc.fallbackName && doc.content?.content) {
433
423
  doc.fallbackName = getFallbackName(doc.content.content);
@@ -448,11 +438,10 @@ var DocumentEditor = ({ id, document: doc, extensionProviders, settings, viewMod
448
438
  ]);
449
439
  return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
450
440
  id,
451
- initialValue,
452
- extensions,
441
+ initialValue: doc.content?.content,
442
+ viewMode,
453
443
  toolbar: settings.toolbar,
454
444
  inputMode: settings.editorInputMode,
455
- viewMode,
456
445
  onFileUpload: handleFileUpload,
457
446
  ...props
458
447
  });
@@ -462,4 +451,4 @@ export {
462
451
  DocumentEditor,
463
452
  MarkdownContainer_default as default
464
453
  };
465
- //# sourceMappingURL=MarkdownContainer-HRGXWEA4.mjs.map
454
+ //# sourceMappingURL=MarkdownContainer-BXEW4NEC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownContainer.tsx", "../../../src/components/MarkdownEditor.tsx", "../../../src/hooks/useSelectCurrentThread.tsx", "../../../src/extensions.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useResolvePlugin, parseFileManagerPlugin } from '@dxos/app-framework';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\n\nimport { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';\nimport { useExtensions } from '../extensions';\nimport { DocumentType, type MarkdownSettingsProps } from '../types';\nimport { getFallbackName } from '../util';\n\nexport type MarkdownContainerProps = Pick<\n MarkdownEditorProps,\n 'role' | 'extensionProviders' | 'viewMode' | 'editorStateStore' | 'onViewModeChange'\n> & {\n id: string;\n object: DocumentType | any;\n settings: MarkdownSettingsProps;\n};\n\n// TODO(burdon): Move toolbar here.\n// TODO(burdon): Factor out difference for ECHO and non-ECHO objects; i.e., single component.\nconst MarkdownContainer = ({\n id,\n role,\n object,\n extensionProviders,\n settings,\n viewMode,\n editorStateStore,\n onViewModeChange,\n}: MarkdownContainerProps) => {\n const scrollPastEnd = role === 'article';\n const doc = object instanceof DocumentType ? object : undefined;\n const extensions = useExtensions({ extensionProviders, document: doc, settings, viewMode, editorStateStore });\n\n if (doc) {\n return (\n <DocumentEditor\n id={fullyQualifiedId(object)}\n role={role}\n document={doc}\n extensions={extensions}\n settings={settings}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n } else {\n return (\n <MarkdownEditor\n id={id}\n role={role}\n initialValue={object.text}\n extensions={extensions}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n }\n};\n\ntype DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &\n Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions'> & {\n document: DocumentType;\n };\n\nexport const DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }: DocumentEditorProps) => {\n const space = getSpace(doc);\n\n // Migrate gradually to `fallbackName`.\n useEffect(() => {\n if (!doc.fallbackName && doc.content?.content) {\n doc.fallbackName = getFallbackName(doc.content.content);\n }\n }, [doc, doc.content]);\n\n // File dragging.\n const fileManagerPlugin = useResolvePlugin(parseFileManagerPlugin);\n const handleFileUpload = useMemo(() => {\n if (space === undefined || fileManagerPlugin?.provides.file.upload === undefined) {\n return undefined;\n }\n\n // TODO(burdon): Re-order props: space, file.\n return async (file: File) => fileManagerPlugin?.provides?.file?.upload?.(file, space);\n }, [space, fileManagerPlugin]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={doc.content?.content}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n onFileUpload={handleFileUpload}\n {...props}\n />\n );\n};\n\nexport default MarkdownContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { type EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport { type FileInfo, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type EditorSelectionState,\n type EditorStateStore,\n Toolbar,\n type UseTextEditorProps,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n editorContent,\n editorGutter,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx, textBlockWidth } from '@dxos/react-ui-theme';\nimport { isNotFalsy, nonNullable } from '@dxos/util';\n\nimport { useSelectCurrentThread } from '../hooks';\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport { type MarkdownPluginState } from '../types';\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n role?: string;\n inputMode?: EditorInputMode;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\n/**\n * Base markdown editor component.\n *\n * This component provides all the features of the markdown editor that do no depend on ECHO.\n * This allows it to be used as a common editor for markdown content on arbitrary backends (e.g. files).\n */\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n toolbar,\n viewMode,\n editorStateStore,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const dispatch = useIntentDispatcher();\n const [formattingState, formattingObserver] = useFormattingState();\n const { hasAttention } = useAttention(id);\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n // Extensions from other plugins.\n // TODO(burdon): Reconcile with DocumentEditor.useExtensions.\n const providerExtensions = useMemo(\n () => extensionProviders?.flatMap((provider) => provider({})).filter(nonNullable),\n [extensionProviders],\n );\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(() => {\n void dispatch({\n action: LayoutAction.SET_LAYOUT,\n data: { element: 'complementary', state: true },\n });\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processAction(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n commentObserver,\n commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: { content: { className: editorContent } },\n }),\n editorGutter,\n role !== 'section' && onFileUpload && dropFile({ onDrop: handleDrop }),\n providerExtensions,\n extensions,\n ].filter(isNotFalsy),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racy.\n // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n useSelectCurrentThread(editorView, id);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = (action: Action) => {\n switch (action.type) {\n case 'search': {\n if (editorView) {\n openSearchPanel(editorView);\n }\n return;\n }\n case 'view-mode': {\n onViewModeChange?.(id, action.data);\n return;\n }\n }\n\n handleToolbarAction?.(action);\n };\n\n return (\n <StackItem.Content toolbar={toolbar}>\n {toolbar && (\n <div\n role='none'\n className={mx(\n 'attention-surface is-full border-be !border-separator',\n role === 'section' && 'sticky block-start-0 z-[1] -mbe-px min-is-0',\n )}\n >\n <Toolbar.Root\n classNames={[textBlockWidth, !hasAttention && 'opacity-20']}\n state={formattingState && { ...formattingState, ...commentsState }}\n onAction={handleAction}\n >\n <Toolbar.Markdown />\n {onFileUpload && <Toolbar.Custom onUpload={onFileUpload} />}\n <Toolbar.Separator />\n <Toolbar.View mode={viewMode ?? DEFAULT_VIEW_MODE} />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={mx(\n 'ch-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface',\n role === 'article' ? 'min-bs-0' : '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24',\n )}\n {...focusAttributes}\n />\n </StackItem.Content>\n );\n};\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view?: EditorView) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { useCallback } from 'react';\n\nimport { LayoutAction, useIntentResolver } from '@dxos/app-framework';\nimport { Cursor, setSelection } from '@dxos/react-ui-editor';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\n\n/**\n * Handle scrolling and selection of the current thread in a markdown editor.\n */\nexport const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {\n const handleScrollIntoView = useCallback(\n ({ action, data }: { action: string; data?: any }) => {\n if (action === LayoutAction.SCROLL_INTO_VIEW) {\n if (editorView && data?.id === documentId && 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: documentId }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n }\n }\n },\n [documentId, editorView],\n );\n\n useIntentResolver(MARKDOWN_PLUGIN, handleScrollIntoView);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { type IntentDispatcher, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { createDocAccessor, fullyQualifiedId, getSpace, type Query } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ThemeProvider } from '@dxos/react-ui';\nimport {\n type AutocompleteResult,\n type EditorStateStore,\n type EditorViewMode,\n type Extension,\n InputModeExtensions,\n createDataExtensions,\n autocomplete,\n decorateMarkdown,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n selectionState,\n typewriter,\n} from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type DocumentType, type MarkdownPluginState, type MarkdownSettingsProps } from './types';\nimport { setFallbackName } from './util';\n\ntype ExtensionsOptions = {\n document?: DocumentType;\n dispatch?: IntentDispatcher;\n query?: Query<DocumentType>;\n settings: MarkdownSettingsProps;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n document,\n settings,\n viewMode,\n editorStateStore,\n extensionProviders,\n}: ExtensionsOptions & Pick<MarkdownPluginState, 'extensionProviders'>): Extension[] => {\n const dispatch = useIntentDispatcher();\n const identity = useIdentity();\n const space = getSpace(document);\n\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // TODO(burdon): Unsubscribe.\n // const query = space?.db.query(Filter.schema(DocumentType));\n // query?.subscribe();\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n document,\n settings,\n viewMode,\n dispatch,\n // query,\n }),\n [\n document,\n viewMode,\n dispatch,\n settings,\n settings.editorInputMode,\n settings.folding,\n settings.numberedHeadings,\n settings.debug,\n settings.typewriter,\n ],\n );\n\n //\n // External extensions from other plugins.\n //\n const pluginExtensions = useMemo<Extension[] | undefined>(\n () =>\n extensionProviders?.reduce((acc: Extension[], provider) => {\n const extension = typeof provider === 'function' ? provider({ document }) : provider;\n if (extension) {\n acc.push(extension);\n }\n\n return acc;\n }, []),\n [extensionProviders, document],\n );\n\n //\n // Basic plugins.\n //\n return useMemo<Extension[]>(\n () =>\n [\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n document &&\n createDataExtensions({\n id: document.id,\n text: document.content && createDocAccessor(document.content, ['content']),\n space,\n identity,\n }),\n selectionState(editorStateStore),\n document &&\n listener({\n onChange: (text) => setFallbackName(document, text),\n }),\n baseExtensions,\n pluginExtensions,\n ].filter(isNotFalsy),\n [baseExtensions, pluginExtensions, document, document?.content, space, identity],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({ document, dispatch, settings, query, viewMode }: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n settings.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings.folding && folding(),\n ].filter(isNotFalsy);\n\n //\n // Markdown\n //\n if (viewMode !== 'source') {\n extensions.push(\n ...[\n formattingKeymap(),\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.\n renderLinkButton:\n dispatch && document\n ? onRenderLink((id: string) => {\n void dispatch({\n action: NavigationAction.ADD_TO_ACTIVE,\n data: {\n id,\n part: 'main',\n pivotId: fullyQualifiedId(document),\n scrollIntoView: true,\n },\n });\n })\n : undefined,\n }),\n linkTooltip(renderLinkTooltip),\n ],\n );\n }\n\n //\n // Autocomplete object links.\n //\n if (query) {\n extensions.push(\n autocomplete({\n onSearch: (text: string) => {\n // TODO(burdon): Specify filter (e.g., stack).\n return query.objects\n .map<AutocompleteResult | undefined>((object) =>\n object.name?.length && object.id !== document?.id\n ? {\n label: object.name,\n // TODO(burdon): Factor out URL builder.\n apply: `[${object.name}](/${fullyQualifiedId(object)})`,\n }\n : undefined,\n )\n .filter(isNotFalsy);\n },\n }),\n );\n }\n\n if (settings.debug) {\n const items = settings.typewriter?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(typewriter({ items }));\n }\n }\n\n return extensions;\n};\n\n// TODO(burdon): Factor out styles.\nconst style = {\n hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',\n icon: 'inline-block leading-none mis-1 cursor-pointer',\n};\n\nconst onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal =\n url.startsWith('/') ||\n // TODO(wittjosiah): This should probably be parsed out on paste?\n url.startsWith(window.location.origin);\n\n const options: AnchorHTMLAttributes<any> = isInternal\n ? {\n onClick: () => {\n const qualifiedId = url.split('/').at(-1);\n invariant(qualifiedId, 'Invalid link format.');\n onSelectObject(qualifiedId);\n },\n }\n : {\n href: url,\n rel: 'noreferrer',\n target: '_blank',\n };\n\n renderRoot(\n el,\n <a {...options} className={style.hover}>\n <Icon\n icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}\n size={4}\n classNames={style.icon}\n />\n </a>,\n );\n};\n\nconst renderLinkTooltip = (el: Element, url: string) => {\n const web = new URL(url);\n renderRoot(\n el,\n <a href={url} rel='noreferrer' target='_blank' className={style.hover}>\n {web.origin}\n <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />\n </a>,\n );\n};\n\n// TODO(burdon): Remove react rendering; use DOM directly.\nexport const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {\n createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);\n return root;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useEffect", "useMemo", "useResolvePlugin", "parseFileManagerPlugin", "fullyQualifiedId", "getSpace", "openSearchPanel", "React", "useMemo", "useEffect", "useCallback", "LayoutAction", "useIntentDispatcher", "useThemeContext", "useTranslation", "useAttention", "Toolbar", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "editorContent", "editorGutter", "processAction", "useActionHandler", "useCommentState", "useCommentClickListener", "useFormattingState", "useTextEditor", "StackItem", "mx", "textBlockWidth", "isNotFalsy", "nonNullable", "EditorView", "useCallback", "LayoutAction", "useIntentResolver", "Cursor", "setSelection", "useSelectCurrentThread", "editorView", "documentId", "handleScrollIntoView", "useCallback", "action", "data", "LayoutAction", "SCROLL_INTO_VIEW", "id", "cursor", "range", "Cursor", "getRangeFromCursor", "state", "selection", "main", "from", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "dispatch", "useIntentResolver", "MARKDOWN_PLUGIN", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "toolbar", "viewMode", "editorStateStore", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatch", "useIntentDispatcher", "formattingState", "formattingObserver", "useFormattingState", "hasAttention", "useAttention", "scrollTo", "selection", "useMemo", "getState", "providerExtensions", "flatMap", "provider", "filter", "nonNullable", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "commentClickObserver", "useCommentClickListener", "handleDrop", "view", "files", "file", "info", "undefined", "processAction", "type", "url", "parentRef", "editorView", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "isNotFalsy", "moveToEndOfLine", "useTest", "useSelectCurrentThread", "handleToolbarAction", "useActionHandler", "handleAction", "openSearchPanel", "StackItem", "Content", "div", "mx", "Toolbar", "Root", "classNames", "textBlockWidth", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "useEffect", "composer", "window", "React", "useMemo", "createRoot", "NavigationAction", "useIntentDispatcher", "invariant", "createDocAccessor", "fullyQualifiedId", "getSpace", "useIdentity", "Icon", "ThemeProvider", "InputModeExtensions", "createDataExtensions", "autocomplete", "decorateMarkdown", "folding", "formattingKeymap", "linkTooltip", "listener", "selectionState", "typewriter", "defaultTx", "isNotFalsy", "useExtensions", "document", "settings", "viewMode", "editorStateStore", "extensionProviders", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "space", "getSpace", "baseExtensions", "useMemo", "createBaseExtensions", "editorInputMode", "folding", "numberedHeadings", "debug", "typewriter", "pluginExtensions", "reduce", "acc", "provider", "extension", "push", "createDataExtensions", "id", "text", "content", "createDocAccessor", "selectionState", "listener", "onChange", "setFallbackName", "filter", "isNotFalsy", "query", "extensions", "InputModeExtensions", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "from", "undefined", "renderLinkButton", "onRenderLink", "action", "NavigationAction", "ADD_TO_ACTIVE", "data", "part", "pivotId", "fullyQualifiedId", "scrollIntoView", "linkTooltip", "renderLinkTooltip", "autocomplete", "onSearch", "objects", "map", "object", "name", "length", "label", "apply", "items", "split", "style", "hover", "icon", "onSelectObject", "el", "url", "isInternal", "startsWith", "window", "location", "origin", "options", "onClick", "qualifiedId", "at", "invariant", "href", "rel", "target", "renderRoot", "React", "a", "className", "Icon", "size", "classNames", "web", "URL", "root", "node", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "MarkdownContainer", "id", "role", "object", "extensionProviders", "settings", "viewMode", "editorStateStore", "onViewModeChange", "scrollPastEnd", "doc", "DocumentType", "undefined", "extensions", "useExtensions", "document", "React", "DocumentEditor", "fullyQualifiedId", "MarkdownEditor", "initialValue", "text", "toolbar", "inputMode", "editorInputMode", "props", "space", "getSpace", "useEffect", "fallbackName", "content", "getFallbackName", "fileManagerPlugin", "useResolvePlugin", "parseFileManagerPlugin", "handleFileUpload", "useMemo", "provides", "file", "upload", "onFileUpload"]
7
+ }
@@ -2,9 +2,9 @@
2
2
  var MARKDOWN_PLUGIN = "dxos.org/plugin/markdown";
3
3
  var meta_default = {
4
4
  id: MARKDOWN_PLUGIN,
5
- name: "Markdown Editor",
5
+ name: "Markdown",
6
6
  description: "Text editor supporting extended Markdown.",
7
- homePage: "https://github.com/dxos/dxos/tree/main/packages/apps/plugins/plugin-markdown",
7
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown",
8
8
  icon: "ph--text-aa--regular"
9
9
  };
10
10
 
@@ -12,4 +12,4 @@ export {
12
12
  MARKDOWN_PLUGIN,
13
13
  meta_default
14
14
  };
15
- //# sourceMappingURL=chunk-DRJ3FPYF.mjs.map
15
+ //# sourceMappingURL=chunk-4X6YX3KU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const MARKDOWN_PLUGIN = 'dxos.org/plugin/markdown';\n\nexport default {\n id: MARKDOWN_PLUGIN,\n name: 'Markdown',\n description: 'Text editor supporting extended Markdown.',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',\n icon: 'ph--text-aa--regular',\n} satisfies PluginMeta;\n"],
5
+ "mappings": ";AAMO,IAAMA,kBAAkB;AAE/B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;EACNC,aAAa;EACbC,QAAQ;EACRC,MAAM;AACR;",
6
+ "names": ["MARKDOWN_PLUGIN", "id", "name", "description", "source", "icon"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DocumentType,
3
3
  TextType
4
- } from "./chunk-US5O2P3R.mjs";
4
+ } from "./chunk-VZAGHNHU.mjs";
5
5
 
6
6
  // packages/plugins/plugin-markdown/src/util.tsx
7
7
  import { debounce } from "@dxos/async";
@@ -49,4 +49,4 @@ export {
49
49
  setFallbackName,
50
50
  serializer
51
51
  };
52
- //# sourceMappingURL=chunk-VGIHBUXB.mjs.map
52
+ //# sourceMappingURL=chunk-PV4AWYWK.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MARKDOWN_PLUGIN
3
- } from "./chunk-DRJ3FPYF.mjs";
3
+ } from "./chunk-4X6YX3KU.mjs";
4
4
 
5
5
  // packages/plugins/plugin-markdown/src/types/document.ts
6
6
  import { ref, S, TypedObject } from "@dxos/echo-schema";
@@ -38,4 +38,4 @@ export {
38
38
  isEditorModel,
39
39
  MarkdownAction
40
40
  };
41
- //# sourceMappingURL=chunk-US5O2P3R.mjs.map
41
+ //# sourceMappingURL=chunk-VZAGHNHU.mjs.map
@@ -4,17 +4,17 @@ import {
4
4
  markdownExtensionPlugins,
5
5
  serializer,
6
6
  setFallbackName
7
- } from "./chunk-VGIHBUXB.mjs";
7
+ } from "./chunk-PV4AWYWK.mjs";
8
8
  import {
9
9
  DocumentType,
10
10
  MarkdownAction,
11
11
  TextType,
12
12
  isEditorModel
13
- } from "./chunk-US5O2P3R.mjs";
13
+ } from "./chunk-VZAGHNHU.mjs";
14
14
  import {
15
15
  MARKDOWN_PLUGIN,
16
16
  meta_default
17
- } from "./chunk-DRJ3FPYF.mjs";
17
+ } from "./chunk-4X6YX3KU.mjs";
18
18
 
19
19
  // packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
20
20
  import { TextAa } from "@phosphor-icons/react";
@@ -35,11 +35,11 @@ import { lazy } from "react";
35
35
  // packages/plugins/plugin-markdown/src/components/MarkdownSettings.tsx
36
36
  import React from "react";
37
37
  import { Input, Select, useTranslation } from "@dxos/react-ui";
38
- import { FormInput } from "@dxos/react-ui-data";
39
38
  import { EditorInputModes, EditorViewModes } from "@dxos/react-ui-editor";
39
+ import { DeprecatedFormInput } from "@dxos/react-ui-form";
40
40
  var MarkdownSettings = ({ settings }) => {
41
41
  const { t } = useTranslation(MARKDOWN_PLUGIN);
42
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(FormInput, {
42
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
43
43
  label: t("default view mode label")
44
44
  }, /* @__PURE__ */ React.createElement(Select.Root, {
45
45
  value: settings.defaultViewMode,
@@ -51,7 +51,7 @@ var MarkdownSettings = ({ settings }) => {
51
51
  value: mode
52
52
  }, t(`${mode} mode label`, {
53
53
  ns: "react-ui-editor"
54
- })))))))), /* @__PURE__ */ React.createElement(FormInput, {
54
+ })))))))), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
55
55
  label: t("editor input mode label")
56
56
  }, /* @__PURE__ */ React.createElement(Select.Root, {
57
57
  value: settings.editorInputMode ?? "default",
@@ -63,27 +63,27 @@ var MarkdownSettings = ({ settings }) => {
63
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, {
64
64
  key: mode,
65
65
  value: mode
66
- }, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */ React.createElement(FormInput, {
66
+ }, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
67
67
  label: t("settings toolbar label")
68
68
  }, /* @__PURE__ */ React.createElement(Input.Switch, {
69
69
  checked: settings.toolbar,
70
70
  onCheckedChange: (checked) => settings.toolbar = !!checked
71
- })), /* @__PURE__ */ React.createElement(FormInput, {
71
+ })), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
72
72
  label: t("settings numbered headings label")
73
73
  }, /* @__PURE__ */ React.createElement(Input.Switch, {
74
74
  checked: settings.numberedHeadings,
75
75
  onCheckedChange: (checked) => settings.numberedHeadings = !!checked
76
- })), /* @__PURE__ */ React.createElement(FormInput, {
76
+ })), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
77
77
  label: t("settings folding label")
78
78
  }, /* @__PURE__ */ React.createElement(Input.Switch, {
79
79
  checked: settings.folding,
80
80
  onCheckedChange: (checked) => settings.folding = !!checked
81
- })), /* @__PURE__ */ React.createElement(FormInput, {
81
+ })), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
82
82
  label: t("settings experimental label")
83
83
  }, /* @__PURE__ */ React.createElement(Input.Switch, {
84
84
  checked: settings.experimental,
85
85
  onCheckedChange: (checked) => settings.experimental = !!checked
86
- })), /* @__PURE__ */ React.createElement(FormInput, {
86
+ })), /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
87
87
  label: t("settings debug label"),
88
88
  secondary: settings.debug ? /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextArea, {
89
89
  rows: 5,
@@ -98,7 +98,7 @@ var MarkdownSettings = ({ settings }) => {
98
98
  };
99
99
 
100
100
  // packages/plugins/plugin-markdown/src/components/index.ts
101
- var MarkdownContainer = lazy(() => import("./MarkdownContainer-HRGXWEA4.mjs"));
101
+ var MarkdownContainer = lazy(() => import("./MarkdownContainer-BXEW4NEC.mjs"));
102
102
 
103
103
  // packages/plugins/plugin-markdown/src/translations.ts
104
104
  var translations_default = [
@@ -400,7 +400,7 @@ var MarkdownPlugin = () => {
400
400
  switch (role) {
401
401
  case "section":
402
402
  case "article": {
403
- const doc = getDoc(data.active) ?? getDoc(data.object);
403
+ const doc = getDoc(data.object);
404
404
  const { id, object } = isEditorModel(data.object) ? {
405
405
  id: data.object.id,
406
406
  object: data.object
@@ -415,7 +415,6 @@ var MarkdownPlugin = () => {
415
415
  id,
416
416
  object,
417
417
  role,
418
- coordinate: data.coordinate,
419
418
  settings: settings.values,
420
419
  extensionProviders: state.values.extensionProviders,
421
420
  viewMode: getViewMode(id),