@dxos/plugin-markdown 0.8.3-main.7f5a14c → 0.8.3-staging.0fa589b

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 (70) hide show
  1. package/dist/lib/browser/{MarkdownContainer-3KTC7Q4C.mjs → MarkdownContainer-EFWQ6DHD.mjs} +119 -51
  2. package/dist/lib/browser/MarkdownContainer-EFWQ6DHD.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-FLQI6GFL.mjs → app-graph-serializer-EI6TEHRQ.mjs} +6 -4
  4. package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-LCMXUTQB.mjs → chunk-354IBM5X.mjs} +3 -3
  6. package/dist/lib/browser/{chunk-CX5GYZYO.mjs → chunk-D767LUGU.mjs} +6 -2
  7. package/dist/lib/browser/chunk-D767LUGU.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +2 -2
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs → react-surface-4B5ELMEW.mjs} +8 -3
  11. package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs.map → react-surface-4B5ELMEW.mjs.map} +2 -2
  12. package/dist/lib/node/{MarkdownContainer-NG4H6AZJ.cjs → MarkdownContainer-KYGUEZIL.cjs} +116 -48
  13. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +7 -0
  14. package/dist/lib/node/{app-graph-serializer-BZPM7HHJ.cjs → app-graph-serializer-E6BXEDEL.cjs} +11 -9
  15. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-4DYNEQG3.cjs → chunk-FU3XZZCO.cjs} +6 -6
  17. package/dist/lib/node/{chunk-SYEFGLXN.cjs → chunk-LQAC5HL7.cjs} +9 -5
  18. package/dist/lib/node/chunk-LQAC5HL7.cjs.map +7 -0
  19. package/dist/lib/node/index.cjs +10 -10
  20. package/dist/lib/node/meta.json +1 -1
  21. package/dist/lib/node/{react-surface-5RKEWAXS.cjs → react-surface-456HQ4KZ.cjs} +11 -6
  22. package/dist/lib/node/{react-surface-5RKEWAXS.cjs.map → react-surface-456HQ4KZ.cjs.map} +2 -2
  23. package/dist/lib/node-esm/{MarkdownContainer-DZPXCA6J.mjs → MarkdownContainer-O3SGMH4G.mjs} +119 -51
  24. package/dist/lib/node-esm/MarkdownContainer-O3SGMH4G.mjs.map +7 -0
  25. package/dist/lib/node-esm/{app-graph-serializer-EBH54X6Z.mjs → app-graph-serializer-F7DGNF3G.mjs} +6 -4
  26. package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +7 -0
  27. package/dist/lib/node-esm/{chunk-Q7WUBLL3.mjs → chunk-BWDDFDJY.mjs} +6 -2
  28. package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-WANCCPU7.mjs → chunk-YOABAQ7A.mjs} +3 -3
  30. package/dist/lib/node-esm/index.mjs +2 -2
  31. package/dist/lib/node-esm/meta.json +1 -1
  32. package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs → react-surface-YHFOQTVO.mjs} +8 -3
  33. package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs.map → react-surface-YHFOQTVO.mjs.map} +2 -2
  34. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  35. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  36. package/dist/types/src/components/MarkdownContainer.stories.d.ts +9 -0
  37. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -0
  38. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -2
  39. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  40. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +2 -4
  41. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  42. package/dist/types/src/extensions.d.ts +3 -2
  43. package/dist/types/src/extensions.d.ts.map +1 -1
  44. package/dist/types/src/translations.d.ts +52 -2
  45. package/dist/types/src/translations.d.ts.map +1 -1
  46. package/dist/types/src/types/schema.d.ts +11 -14
  47. package/dist/types/src/types/schema.d.ts.map +1 -1
  48. package/dist/types/src/types/types.d.ts +5 -6
  49. package/dist/types/src/types/types.d.ts.map +1 -1
  50. package/package.json +38 -38
  51. package/src/capabilities/app-graph-serializer.ts +5 -3
  52. package/src/capabilities/react-surface.tsx +1 -1
  53. package/src/components/MarkdownContainer.stories.tsx +103 -0
  54. package/src/components/MarkdownContainer.tsx +94 -51
  55. package/src/components/MarkdownEditor/MarkdownEditor.tsx +49 -25
  56. package/src/components/Suggestions.stories.tsx +1 -1
  57. package/src/extensions.tsx +7 -1
  58. package/src/translations.ts +6 -1
  59. package/dist/lib/browser/MarkdownContainer-3KTC7Q4C.mjs.map +0 -7
  60. package/dist/lib/browser/app-graph-serializer-FLQI6GFL.mjs.map +0 -7
  61. package/dist/lib/browser/chunk-CX5GYZYO.mjs.map +0 -7
  62. package/dist/lib/node/MarkdownContainer-NG4H6AZJ.cjs.map +0 -7
  63. package/dist/lib/node/app-graph-serializer-BZPM7HHJ.cjs.map +0 -7
  64. package/dist/lib/node/chunk-SYEFGLXN.cjs.map +0 -7
  65. package/dist/lib/node-esm/MarkdownContainer-DZPXCA6J.mjs.map +0 -7
  66. package/dist/lib/node-esm/app-graph-serializer-EBH54X6Z.mjs.map +0 -7
  67. package/dist/lib/node-esm/chunk-Q7WUBLL3.mjs.map +0 -7
  68. /package/dist/lib/browser/{chunk-LCMXUTQB.mjs.map → chunk-354IBM5X.mjs.map} +0 -0
  69. /package/dist/lib/node/{chunk-4DYNEQG3.cjs.map → chunk-FU3XZZCO.cjs.map} +0 -0
  70. /package/dist/lib/node-esm/{chunk-WANCCPU7.mjs.map → chunk-YOABAQ7A.mjs.map} +0 -0
@@ -26,13 +26,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var MarkdownContainer_NG4H6AZJ_exports = {};
30
- __export(MarkdownContainer_NG4H6AZJ_exports, {
29
+ var MarkdownContainer_KYGUEZIL_exports = {};
30
+ __export(MarkdownContainer_KYGUEZIL_exports, {
31
31
  DocumentEditor: () => DocumentEditor,
32
32
  default: () => MarkdownContainer_default
33
33
  });
34
- module.exports = __toCommonJS(MarkdownContainer_NG4H6AZJ_exports);
35
- var import_chunk_4DYNEQG3 = require("./chunk-4DYNEQG3.cjs");
34
+ module.exports = __toCommonJS(MarkdownContainer_KYGUEZIL_exports);
35
+ var import_chunk_FU3XZZCO = require("./chunk-FU3XZZCO.cjs");
36
36
  var import_chunk_IFYSBQE5 = require("./chunk-IFYSBQE5.cjs");
37
37
  var import_chunk_CJLYFGPI = require("./chunk-CJLYFGPI.cjs");
38
38
  var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
@@ -40,6 +40,7 @@ var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
40
40
  var import_tracking = require("@preact-signals/safe-react/tracking");
41
41
  var import_rx_react = require("@effect-rx/rx-react");
42
42
  var import_react = __toESM(require("react"));
43
+ var import_react_dom = require("react-dom");
43
44
  var import_app_framework = require("@dxos/app-framework");
44
45
  var import_echo = require("@dxos/echo");
45
46
  var import_plugin_space = require("@dxos/plugin-space");
@@ -129,7 +130,7 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
129
130
  try {
130
131
  const { t } = (0, import_react_ui2.useTranslation)();
131
132
  const viewRef = (0, import_react2.useRef)();
132
- const getGroups = (0, import_react2.useCallback)((trigger, query) => {
133
+ const getMenu = (0, import_react2.useCallback)((trigger, query) => {
133
134
  switch (trigger) {
134
135
  case "@":
135
136
  return onLinkQuery?.(query) ?? [];
@@ -145,14 +146,39 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
145
146
  onLinkQuery,
146
147
  slashCommandGroups
147
148
  ]);
148
- const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = (0, import_react_ui_editor2.useCommandMenu)({
149
- viewRef,
150
- getGroups,
151
- trigger: onLinkQuery ? [
149
+ const options = (0, import_react2.useMemo)(() => {
150
+ const trigger = onLinkQuery ? [
152
151
  "/",
153
152
  "@"
154
- ] : "/"
155
- });
153
+ ] : [
154
+ "/"
155
+ ];
156
+ return {
157
+ viewRef,
158
+ trigger,
159
+ placeholder: {
160
+ delay: 3e3,
161
+ content: () => {
162
+ return (0, import_react_ui_editor2.createElement)("div", void 0, [
163
+ (0, import_react_ui_editor2.createElement)("span", {
164
+ text: "Press"
165
+ }),
166
+ ...trigger.map((text) => (0, import_react_ui_editor2.createElement)("span", {
167
+ className: "border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]",
168
+ text
169
+ })),
170
+ (0, import_react_ui_editor2.createElement)("span", {
171
+ text: "for commands."
172
+ })
173
+ ]);
174
+ }
175
+ },
176
+ getMenu
177
+ };
178
+ }, [
179
+ getMenu
180
+ ]);
181
+ const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = (0, import_react_ui_editor2.useCommandMenu)(options);
156
182
  const extensions = (0, import_react2.useMemo)(() => [
157
183
  _extensions,
158
184
  commandMenu
@@ -176,7 +202,7 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
176
202
  _effect.f();
177
203
  }
178
204
  };
179
- var MarkdownEditorImpl = /* @__PURE__ */ (0, import_react2.forwardRef)(({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, customActions, viewMode, editorStateStore, onFileUpload, onViewModeChange }, forwardedRef) => {
205
+ var MarkdownEditorImpl = /* @__PURE__ */ (0, import_react2.forwardRef)(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
180
206
  var _effect = (0, import_tracking2.useSignals)();
181
207
  try {
182
208
  const { t } = (0, import_react_ui2.useTranslation)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN);
@@ -285,7 +311,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ (0, import_react2.forwardRef)(({ id, ro
285
311
  const getView = (0, import_react2.useCallback)(() => {
286
312
  (0, import_invariant.invariant)(editorView, void 0, {
287
313
  F: __dxlog_file2,
288
- L: 216,
314
+ L: 240,
289
315
  S: void 0,
290
316
  A: [
291
317
  "editorView",
@@ -341,7 +367,7 @@ var useTest = (view) => {
341
367
  ]);
342
368
  };
343
369
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
344
- var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore }) => {
370
+ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
345
371
  const { dispatchPromise: dispatch } = (0, import_app_framework3.useIntentDispatcher)();
346
372
  const identity = (0, import_halo.useIdentity)();
347
373
  const space = (0, import_echo3.getSpace)(document) ?? (0, import_echo3.getSpace)(text);
@@ -352,6 +378,7 @@ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode,
352
378
  settings,
353
379
  selectionManager,
354
380
  viewMode,
381
+ previewOptions,
355
382
  dispatch
356
383
  }), [
357
384
  document,
@@ -359,6 +386,7 @@ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode,
359
386
  text,
360
387
  viewMode,
361
388
  dispatch,
389
+ previewOptions,
362
390
  settings,
363
391
  settings.editorInputMode,
364
392
  settings.folding,
@@ -420,7 +448,7 @@ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode,
420
448
  identity
421
449
  ]);
422
450
  };
423
- var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode }) => {
451
+ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
424
452
  const extensions = [
425
453
  selectionManager && selectionChange(selectionManager),
426
454
  settings.editorInputMode && import_react_ui_editor4.InputModeExtensions[settings.editorInputMode],
@@ -448,7 +476,7 @@ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager
448
476
  }) : void 0
449
477
  }),
450
478
  (0, import_react_ui_editor4.linkTooltip)(renderLinkTooltip),
451
- (0, import_react_ui_editor4.preview)()
479
+ (0, import_react_ui_editor4.preview)(previewOptions)
452
480
  ]);
453
481
  }
454
482
  if (query) {
@@ -498,7 +526,7 @@ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
498
526
  const qualifiedId = url.split("/").at(-1);
499
527
  (0, import_invariant3.invariant)(qualifiedId, "Invalid link format.", {
500
528
  F: __dxlog_file3,
501
- L: 281,
529
+ L: 287,
502
530
  S: void 0,
503
531
  A: [
504
532
  "qualifiedId",
@@ -547,6 +575,21 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
547
575
  const scrollPastEnd = role === "article";
548
576
  const doc = import_echo.Obj.instanceOf(import_chunk_3HHV4MM6.DocumentType, object) ? object : void 0;
549
577
  const text = import_echo.Obj.instanceOf(import_schema.DataType.Text, object) ? object : void 0;
578
+ const [previewBlocks, setPreviewBlocks] = (0, import_react.useState)([]);
579
+ const previewOptions = (0, import_react.useMemo)(() => ({
580
+ addBlockContainer: (link, el) => {
581
+ setPreviewBlocks((prev) => [
582
+ ...prev,
583
+ {
584
+ link,
585
+ el
586
+ }
587
+ ]);
588
+ },
589
+ removeBlockContainer: (link) => {
590
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
591
+ }
592
+ }), []);
550
593
  const extensions = useExtensions({
551
594
  document: doc,
552
595
  text,
@@ -554,7 +597,8 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
554
597
  settings,
555
598
  selectionManager,
556
599
  viewMode,
557
- editorStateStore
600
+ editorStateStore,
601
+ previewOptions
558
602
  });
559
603
  const manager = (0, import_app_framework.usePluginManager)();
560
604
  const resolve = (0, import_react.useCallback)((typename) => manager.context.getCapabilities(import_app_framework.Capabilities.Metadata).find(({ id: id2 }) => id2 === typename)?.metadata ?? {}, [
@@ -608,33 +652,30 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
608
652
  resolve,
609
653
  space
610
654
  ]);
611
- if (doc) {
612
- return /* @__PURE__ */ import_react.default.createElement(DocumentEditor, {
613
- id: (0, import_echo2.fullyQualifiedId)(object),
614
- role,
615
- document: doc,
616
- extensions,
617
- viewMode,
618
- settings,
619
- scrollPastEnd,
620
- onViewModeChange,
621
- onLinkQuery: space ? onLinkQuery : void 0
622
- });
623
- } else if (text) {
624
- return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
625
- id,
626
- role,
627
- initialValue: text.content,
628
- extensions,
629
- viewMode,
630
- toolbar: settings.toolbar,
631
- inputMode: settings.editorInputMode,
632
- scrollPastEnd,
633
- onViewModeChange,
634
- onLinkQuery: space ? onLinkQuery : void 0
635
- });
636
- } else {
637
- return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
655
+ const editor = doc ? /* @__PURE__ */ import_react.default.createElement(DocumentEditor, {
656
+ id: (0, import_echo2.fullyQualifiedId)(object),
657
+ role,
658
+ document: doc,
659
+ extensions,
660
+ viewMode,
661
+ settings,
662
+ scrollPastEnd,
663
+ onViewModeChange,
664
+ onLinkQuery: space ? onLinkQuery : void 0
665
+ }) : text ? /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
666
+ id,
667
+ role,
668
+ initialValue: text.content,
669
+ extensions,
670
+ viewMode,
671
+ toolbar: settings.toolbar,
672
+ inputMode: settings.editorInputMode,
673
+ scrollPastEnd,
674
+ onViewModeChange,
675
+ onLinkQuery: space ? onLinkQuery : void 0
676
+ }) : (
677
+ // TODO(burdon): Normalize with above.
678
+ /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
638
679
  id,
639
680
  role,
640
681
  initialValue: object.text,
@@ -645,8 +686,35 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
645
686
  scrollPastEnd,
646
687
  onViewModeChange,
647
688
  onLinkQuery: space ? onLinkQuery : void 0
648
- });
649
- }
689
+ })
690
+ );
691
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, editor, previewBlocks.map(({ link, el }) => /* @__PURE__ */ import_react.default.createElement(PreviewBlock, {
692
+ key: link.ref,
693
+ link,
694
+ el
695
+ })));
696
+ } finally {
697
+ _effect.f();
698
+ }
699
+ };
700
+ var PreviewBlock = ({ link, el }) => {
701
+ var _effect = (0, import_tracking.useSignals)();
702
+ try {
703
+ const echoDXN = (0, import_react.useMemo)(() => import_echo.DXN.parse(link.ref).asEchoDXN(), [
704
+ link.ref
705
+ ]);
706
+ const space = (0, import_echo2.useSpace)(echoDXN?.spaceId);
707
+ const [subject] = (0, import_echo2.useQuery)(space, import_echo.Query.select(import_echo.Filter.ids(echoDXN?.echoId ?? "")));
708
+ const data = (0, import_react.useMemo)(() => ({
709
+ subject
710
+ }), [
711
+ subject
712
+ ]);
713
+ return /* @__PURE__ */ (0, import_react_dom.createPortal)(/* @__PURE__ */ import_react.default.createElement(import_app_framework.Surface, {
714
+ role: "card--document",
715
+ data,
716
+ limit: 1
717
+ }), el);
650
718
  } finally {
651
719
  _effect.f();
652
720
  }
@@ -712,4 +780,4 @@ var MarkdownContainer_default = MarkdownContainer;
712
780
  0 && (module.exports = {
713
781
  DocumentEditor
714
782
  });
715
- //# sourceMappingURL=MarkdownContainer-NG4H6AZJ.cjs.map
783
+ //# sourceMappingURL=MarkdownContainer-KYGUEZIL.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownContainer.tsx", "../../../src/components/MarkdownEditor/MarkdownEditor.tsx", "../../../src/hooks/useSelectCurrentThread.tsx", "../../../src/extensions.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Capabilities, Surface, useAppGraph, useCapabilities, usePluginManager } from '@dxos/app-framework';\nimport { DXN, Filter, Obj, Query } from '@dxos/echo';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { fullyQualifiedId, getSpace, useQuery, useSpace } from '@dxos/react-client/echo';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type SelectionManager } from '@dxos/react-ui-attention';\nimport {\n type CommandMenuGroup,\n type CommandMenuItem,\n insertAtCursor,\n insertAtLineStart,\n type PreviewLinkRef,\n type PreviewOptions,\n} from '@dxos/react-ui-editor';\nimport { DataType } from '@dxos/schema';\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 | DataType.Text | any;\n settings: MarkdownSettingsProps;\n selectionManager?: SelectionManager;\n};\n\nconst MarkdownContainer = ({\n id,\n role,\n object,\n settings,\n selectionManager,\n viewMode,\n editorStateStore,\n onViewModeChange,\n}: MarkdownContainerProps) => {\n const { t } = useTranslation();\n const scrollPastEnd = role === 'article';\n const doc = Obj.instanceOf(DocumentType, object) ? object : undefined;\n const text = Obj.instanceOf(DataType.Text, object) ? object : undefined;\n const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);\n const previewOptions = useMemo(\n (): PreviewOptions => ({\n addBlockContainer: (link, el) => {\n setPreviewBlocks((prev) => [...prev, { link, el }]);\n },\n removeBlockContainer: (link) => {\n setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));\n },\n }),\n [],\n );\n const extensions = useExtensions({\n document: doc,\n text,\n id,\n settings,\n selectionManager,\n viewMode,\n editorStateStore,\n previewOptions,\n });\n\n // TODO(wittjosiah): Factor out.\n const manager = usePluginManager();\n const resolve = useCallback(\n (typename: string) =>\n manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},\n [manager],\n );\n const space = getSpace(object);\n const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);\n const filter = useMemo(() => Filter.or(...objectForms.map((form) => Filter.type(form.objectSchema))), [objectForms]);\n const onLinkQuery = useCallback(\n async (query?: string): Promise<CommandMenuGroup[]> => {\n const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? '';\n const results = await space?.db.query(Query.select(filter)).run();\n // TODO(wittjosiah): Use `Obj.Any` type.\n const getLabel = (object: any) => {\n const type = Obj.getTypename(object)!;\n const metadata = resolve(type);\n return (\n metadata.label?.(object) || object.name || ['object name placeholder', { ns: type, default: 'New object' }]\n );\n };\n const items =\n results?.objects\n .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))\n // TODO(wittjosiah): Remove `any` type.\n .map((object: any): CommandMenuItem => {\n const metadata = resolve(Obj.getTypename(object)!);\n const label = toLocalizedString(getLabel(object), t);\n return {\n id: object.id,\n label,\n icon: metadata.icon,\n onSelect: (view, head) => {\n const link = `[${label}][${Obj.getDXN(object)}]`;\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n }) ?? [];\n return [{ id: 'echo', items }];\n },\n [filter, resolve, space],\n );\n\n const editor = doc ? (\n <DocumentEditor\n id={fullyQualifiedId(object)}\n role={role}\n document={doc}\n extensions={extensions}\n viewMode={viewMode}\n settings={settings}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n onLinkQuery={space ? onLinkQuery : undefined}\n />\n ) : text ? (\n <MarkdownEditor\n id={id}\n role={role}\n initialValue={text.content}\n extensions={extensions}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n onLinkQuery={space ? onLinkQuery : undefined}\n />\n ) : (\n // TODO(burdon): Normalize with above.\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 onLinkQuery={space ? onLinkQuery : undefined}\n />\n );\n\n return (\n <>\n {editor}\n {previewBlocks.map(({ link, el }) => (\n <PreviewBlock key={link.ref} link={link} el={el} />\n ))}\n </>\n );\n};\n\n// TODO(wittjosiah): This shouldn't be \"card\" but \"block\".\n// It's not a preview card but an interactive embedded object.\nconst PreviewBlock = ({ link, el }: { link: PreviewLinkRef; el: HTMLElement }) => {\n const echoDXN = useMemo(() => DXN.parse(link.ref).asEchoDXN(), [link.ref]);\n const space = useSpace(echoDXN?.spaceId);\n const [subject] = useQuery(space, Query.select(Filter.ids(echoDXN?.echoId ?? '')));\n const data = useMemo(() => ({ subject }), [subject]);\n\n return createPortal(<Surface role='card--document' data={data} limit={1} />, el);\n};\n\ntype DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &\n Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions' | 'onLinkQuery'> & {\n document: DocumentType;\n };\n\nexport const DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }: DocumentEditorProps) => {\n const space = getSpace(doc);\n\n // Migrate gradually to `fallbackName`.\n useEffect(() => {\n if (typeof doc.fallbackName === 'string') {\n return;\n }\n\n const fallbackName = doc.content?.target?.content ? getFallbackName(doc.content.target.content) : undefined;\n if (fallbackName) {\n doc.fallbackName = fallbackName;\n }\n }, [doc, doc.content]);\n\n // File dragging.\n const [upload] = useCapabilities(Capabilities.FileUploader);\n const handleFileUpload = useMemo(() => {\n if (space === undefined || upload === undefined) {\n return undefined;\n }\n\n // TODO(burdon): Re-order props: space, file.\n return async (file: File) => upload!(file, space);\n }, [space, upload]);\n\n const { graph } = useAppGraph();\n const customActions = useMemo(() => {\n return Rx.make((get) => {\n const actions = get(graph.actions(id));\n const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');\n return { nodes, edges: nodes.map((node) => ({ source: 'root', target: node.id })) };\n });\n }, [graph]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={doc.content?.target?.content}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n customActions={customActions}\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 { type EditorView } from '@codemirror/view';\nimport React, { forwardRef, useMemo, useEffect, useCallback, useImperativeHandle, useRef } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { type FileInfo } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { toLocalizedString, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n CommandMenu,\n type CommandMenuGroup,\n type DNDOptions,\n type EditorInputMode,\n type EditorSelectionState,\n type EditorStateStore,\n EditorToolbar,\n type EditorToolbarActionGraphProps,\n type EditorViewMode,\n RefPopover,\n type UseTextEditorProps,\n addLink,\n createElement,\n coreSlashCommands,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n editorGutter,\n editorSlots,\n filterItems,\n linkSlashCommands,\n processEditorPayload,\n stackItemContentEditorClassNames,\n useEditorToolbarState,\n useFormattingState,\n useTextEditor,\n useCommandMenu,\n type UseCommandMenuOptions,\n} from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { isNotFalsy, isNonNullable } from '@dxos/util';\n\nimport { useSelectCurrentThread } from '../../hooks';\nimport { MARKDOWN_PLUGIN } from '../../meta';\nimport { type MarkdownPluginState } from '../../types';\n\nexport type MarkdownEditorProps = {\n id: string;\n role?: string;\n inputMode?: EditorInputMode;\n scrollPastEnd?: boolean;\n slashCommandGroups?: CommandMenuGroup[];\n toolbar?: boolean;\n customActions?: EditorToolbarActionGraphProps['customActions'];\n // TODO(wittjosiah): Generalize custom toolbar actions (e.g. comment, upload, etc.)\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onLinkQuery?: (query?: string) => Promise<CommandMenuGroup[]>;\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 * 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 extensions: _extensions,\n slashCommandGroups,\n onLinkQuery,\n ...props\n}: MarkdownEditorProps) => {\n const { t } = useTranslation();\n const viewRef = useRef<EditorView>();\n\n const getMenu = useCallback(\n (trigger: string, query?: string) => {\n switch (trigger) {\n case '@':\n return onLinkQuery?.(query) ?? [];\n case '/':\n default:\n return filterItems([coreSlashCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>\n query ? toLocalizedString(item.label, t).toLowerCase().includes(query.toLowerCase()) : true,\n );\n }\n },\n [onLinkQuery, slashCommandGroups],\n );\n\n const options = useMemo<UseCommandMenuOptions>(() => {\n const trigger = onLinkQuery ? ['/', '@'] : ['/'];\n return {\n viewRef,\n trigger,\n placeholder: {\n delay: 3_000,\n content: () => {\n return createElement('div', undefined, [\n createElement('span', { text: 'Press' }),\n ...trigger.map((text) =>\n createElement('span', {\n className: 'border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]',\n text,\n }),\n ),\n createElement('span', { text: 'for commands.' }),\n ]);\n },\n },\n getMenu,\n };\n }, [getMenu]);\n\n const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu(options);\n\n const extensions = useMemo(() => [_extensions, commandMenu].filter(isNotFalsy), [_extensions, commandMenu]);\n\n return (\n <RefPopover modal={false} {...refPopoverProps}>\n <MarkdownEditorImpl ref={viewRef} {...props} extensions={extensions} />\n <CommandMenu groups={groupsRef.current} currentItem={currentItem} onSelect={onSelect} />\n </RefPopover>\n );\n};\n\nconst MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProps>(\n (\n {\n id,\n role = 'article',\n initialValue,\n customActions,\n editorStateStore,\n extensions,\n extensionProviders,\n scrollPastEnd,\n toolbar,\n viewMode,\n onFileUpload,\n onViewModeChange,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const toolbarState = useEditorToolbarState({ viewMode });\n const formattingObserver = useFormattingState(toolbarState);\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(isNonNullable),\n [extensionProviders],\n );\n\n // TODO(wittjosiah): Factor out to file uploader plugin.\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 processEditorPayload(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 createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),\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 useImperativeHandle(forwardedRef, () => editorView, [editorView]);\n useTest(editorView);\n useSelectCurrentThread(editorView, id);\n\n // https://react-dropzone.js.org/#src\n const { acceptedFiles, getInputProps, open } = useDropzone({\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': ['.jpg', '.jpeg', '.png', '.gif'],\n },\n });\n\n useEffect(() => {\n if (editorView && onFileUpload && acceptedFiles.length) {\n requestAnimationFrame(async () => {\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n const info = await onFileUpload(file);\n if (info) {\n addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [acceptedFiles, editorView, onFileUpload]);\n\n const getView = useCallback(() => {\n invariant(editorView);\n return editorView;\n }, [editorView]);\n\n const handleViewModeChange = useCallback(\n (mode: EditorViewMode) => onViewModeChange?.(id, mode),\n [id, onViewModeChange],\n );\n\n const handleImageUpload = useCallback(() => {\n if (onFileUpload) {\n open();\n }\n }, [onFileUpload]);\n\n return (\n <StackItem.Content toolbar={!!toolbar}>\n {toolbar && (\n <>\n <EditorToolbar\n attendableId={id}\n role={role}\n state={toolbarState}\n customActions={customActions}\n getView={getView}\n image={handleImageUpload}\n viewMode={handleViewModeChange}\n />\n <input {...getInputProps()} />\n </>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={stackItemContentEditorClassNames(role)}\n data-popover-collision-boundary={true}\n {...focusAttributes}\n />\n </StackItem.Content>\n );\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 { Schema } from 'effect';\nimport { useMemo } from 'react';\n\nimport { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { Cursor, setSelection } from '@dxos/react-ui-editor';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\n\n/**\n * Handle scrolling and selection of the current thread in a markdown editor.\n */\nexport const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver({\n intent: LayoutAction.UpdateLayout,\n position: 'hoist',\n filter: (data): data is { part: 'current'; subject: string; options: { cursor: string } } => {\n if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {\n return false;\n }\n\n return !!editorView && data.subject === documentId && !!data.options?.cursor;\n },\n resolve: ({ options: { cursor } }) => {\n invariant(editorView, 'Editor view is not defined.');\n const range = Cursor.getRangeFromCursor(editorView.state, cursor!);\n if (range) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: documentId }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n },\n }),\n [documentId, editorView],\n );\n\n useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport {\n createIntent,\n LayoutAction,\n type PromiseIntentDispatcher,\n useCapabilities,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { createDocAccessor, fullyQualifiedId, getSpace, type QueryResult } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ThemeProvider } from '@dxos/react-ui';\nimport { type SelectionManager } from '@dxos/react-ui-attention';\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 preview,\n selectionState,\n typewriter,\n type RenderCallback,\n EditorView,\n documentId,\n Cursor,\n type PreviewOptions,\n} from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { MarkdownCapabilities } from './capabilities';\nimport { type DocumentType, type MarkdownSettingsProps } from './types';\nimport { setFallbackName } from './util';\n\ntype ExtensionsOptions = {\n document?: DocumentType;\n id?: string;\n text?: DataType.Text;\n dispatch?: PromiseIntentDispatcher;\n query?: QueryResult<DocumentType>;\n settings: MarkdownSettingsProps;\n selectionManager?: SelectionManager;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n previewOptions?: PreviewOptions;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n document,\n id,\n text,\n settings,\n selectionManager,\n viewMode,\n editorStateStore,\n previewOptions,\n}: ExtensionsOptions): Extension[] => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const space = getSpace(document) ?? getSpace(text);\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.type(DocumentType));\n // query?.subscribe();\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n document,\n id,\n text,\n settings,\n selectionManager,\n viewMode,\n previewOptions,\n dispatch,\n // query,\n }),\n [\n document,\n id,\n text,\n viewMode,\n dispatch,\n previewOptions,\n settings,\n settings.editorInputMode,\n settings.folding,\n settings.numberedHeadings,\n settings.debug,\n settings.typewriter,\n selectionManager,\n ],\n );\n\n const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);\n\n //\n // External extensions from other plugins.\n //\n const pluginExtensions = useMemo<Extension[]>(() => {\n if (!document) {\n return [];\n }\n\n return extensionProviders.flat().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 // Basic plugins.\n //\n return useMemo<Extension[]>(\n () =>\n [\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n document &&\n createDataExtensions({\n id: document.id,\n text: document.content.target && createDocAccessor(document.content.target, ['content']),\n space,\n identity,\n }),\n text &&\n id &&\n createDataExtensions({\n id,\n text: createDocAccessor(text, ['content']),\n space,\n identity,\n }),\n selectionState(editorStateStore),\n document &&\n listener({\n onChange: (text) => setFallbackName(document, text),\n }),\n baseExtensions,\n pluginExtensions,\n ].filter(isNotFalsy),\n [baseExtensions, pluginExtensions, document, document?.content?.target, text, id, space, identity],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({\n document,\n id,\n dispatch,\n settings,\n selectionManager,\n query,\n viewMode,\n previewOptions,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n selectionManager && selectionChange(selectionManager),\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 || id)\n ? createLinkRenderer((id: string) => {\n void dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [id],\n options: {\n pivotId: document ? fullyQualifiedId(document) : id,\n },\n }),\n );\n })\n : undefined,\n }),\n linkTooltip(renderLinkTooltip),\n preview(previewOptions),\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\nexport const selectionChange = (selectionManager: SelectionManager) => {\n return EditorView.updateListener.of((update) => {\n if (update.selectionSet) {\n const id = update.state.facet(documentId);\n const cursorConverter = update.state.facet(Cursor.converter);\n const selection = update.state.selection;\n const ranges = selection.ranges\n .map((range) => ({\n from: cursorConverter.toCursor(range.from),\n to: cursorConverter.toCursor(range.to),\n }))\n .filter(({ from, to }) => to > from);\n selectionManager.updateMultiRange(id, ranges);\n }\n });\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 createLinkRenderer =\n (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>\n (el, { url }) => {\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: RenderCallback<{ url: string }> = (el, { url }) => {\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": ["import_echo", "import_react", "import_react_ui", "import_react_ui_editor", "import_app_framework", "import_invariant", "import_util", "useSelectCurrentThread", "editorView", "documentId", "scrollIntoViewResolver", "useMemo", "createResolver", "intent", "LayoutAction", "UpdateLayout", "position", "filter", "data", "Schema", "is", "ScrollIntoView", "fields", "input", "subject", "options", "cursor", "resolve", "invariant", "range", "Cursor", "getRangeFromCursor", "state", "selection", "main", "from", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "dispatch", "useIntentResolver", "MARKDOWN_PLUGIN", "MarkdownEditor", "extensions", "_extensions", "slashCommandGroups", "onLinkQuery", "props", "t", "useTranslation", "viewRef", "useRef", "getMenu", "useCallback", "trigger", "query", "filterItems", "coreSlashCommands", "linkSlashCommands", "item", "toLocalizedString", "label", "toLowerCase", "includes", "placeholder", "delay", "content", "createElement", "text", "map", "className", "commandMenu", "groupsRef", "currentItem", "onSelect", "refPopoverProps", "useCommandMenu", "isNotFalsy", "React", "RefPopover", "modal", "MarkdownEditorImpl", "ref", "CommandMenu", "groups", "forwardRef", "id", "role", "initialValue", "customActions", "editorStateStore", "extensionProviders", "scrollPastEnd", "toolbar", "viewMode", "onFileUpload", "onViewModeChange", "forwardedRef", "themeMode", "useThemeContext", "toolbarState", "useEditorToolbarState", "formattingObserver", "useFormattingState", "scrollTo", "getState", "providerExtensions", "flatMap", "provider", "isNonNullable", "handleDrop", "view", "files", "file", "info", "processEditorPayload", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readOnly", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "editorSlots", "editorGutter", "dropFile", "onDrop", "moveToEndOfLine", "useImperativeHandle", "useTest", "acceptedFiles", "getInputProps", "open", "useDropzone", "multiple", "noDrag", "accept", "useEffect", "length", "requestAnimationFrame", "f", "File", "name", "lastModified", "addLink", "image", "getView", "handleViewModeChange", "mode", "handleImageUpload", "StackItem", "Content", "EditorToolbar", "attendableId", "div", "data-testid", "data-toolbar", "stackItemContentEditorClassNames", "data-popover-collision-boundary", "composer", "window", "useExtensions", "document", "settings", "selectionManager", "previewOptions", "dispatchPromise", "useIntentDispatcher", "identity", "useIdentity", "space", "getSpace", "baseExtensions", "createBaseExtensions", "editorInputMode", "folding", "numberedHeadings", "debug", "typewriter", "useCapabilities", "MarkdownCapabilities", "Extensions", "pluginExtensions", "flat", "reduce", "acc", "extension", "createDataExtensions", "target", "createDocAccessor", "selectionState", "listener", "onChange", "setFallbackName", "selectionChange", "InputModeExtensions", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "renderLinkButton", "createLinkRenderer", "createIntent", "Open", "part", "pivotId", "fullyQualifiedId", "linkTooltip", "renderLinkTooltip", "preview", "autocomplete", "onSearch", "objects", "object", "apply", "items", "split", "updateListener", "update", "selectionSet", "facet", "cursorConverter", "converter", "ranges", "toCursor", "to", "updateMultiRange", "style", "hover", "icon", "onSelectObject", "el", "isInternal", "startsWith", "location", "origin", "onClick", "qualifiedId", "at", "href", "rel", "renderRoot", "a", "Icon", "size", "classNames", "web", "URL", "root", "node", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "MarkdownContainer", "doc", "Obj", "instanceOf", "DocumentType", "DataType", "Text", "previewBlocks", "setPreviewBlocks", "useState", "addBlockContainer", "link", "prev", "removeBlockContainer", "prevLink", "manager", "usePluginManager", "typename", "context", "getCapabilities", "Capabilities", "Metadata", "find", "metadata", "objectForms", "SpaceCapabilities", "ObjectForm", "Filter", "or", "form", "objectSchema", "slice", "results", "db", "Query", "select", "run", "getLabel", "getTypename", "ns", "default", "head", "getDXN", "insertAtLineStart", "insertAtCursor", "editor", "DocumentEditor", "inputMode", "PreviewBlock", "key", "echoDXN", "DXN", "parse", "asEchoDXN", "useSpace", "spaceId", "useQuery", "ids", "echoId", "createPortal", "Surface", "limit", "fallbackName", "getFallbackName", "upload", "FileUploader", "handleFileUpload", "graph", "useAppGraph", "Rx", "make", "get", "actions", "nodes", "action", "properties", "disposition", "edges", "source"]
7
+ }
@@ -16,18 +16,20 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var app_graph_serializer_BZPM7HHJ_exports = {};
20
- __export(app_graph_serializer_BZPM7HHJ_exports, {
19
+ var app_graph_serializer_E6BXEDEL_exports = {};
20
+ __export(app_graph_serializer_E6BXEDEL_exports, {
21
21
  default: () => app_graph_serializer_default
22
22
  });
23
- module.exports = __toCommonJS(app_graph_serializer_BZPM7HHJ_exports);
24
- var import_chunk_SYEFGLXN = require("./chunk-SYEFGLXN.cjs");
23
+ module.exports = __toCommonJS(app_graph_serializer_E6BXEDEL_exports);
24
+ var import_chunk_LQAC5HL7 = require("./chunk-LQAC5HL7.cjs");
25
25
  var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
26
26
  var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
27
27
  var import_effect = require("effect");
28
28
  var import_app_framework = require("@dxos/app-framework");
29
+ var import_echo = require("@dxos/echo");
29
30
  var import_types = require("@dxos/plugin-space/types");
30
- var import_echo = require("@dxos/react-client/echo");
31
+ var import_echo2 = require("@dxos/react-client/echo");
32
+ var import_schema = require("@dxos/schema");
31
33
  var app_graph_serializer_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphSerializer, [
32
34
  {
33
35
  inputType: import_chunk_3HHV4MM6.DocumentType.typename,
@@ -37,14 +39,14 @@ var app_graph_serializer_default = (context) => (0, import_app_framework.contrib
37
39
  const doc = node.data;
38
40
  const content = await doc.content.load();
39
41
  return {
40
- name: doc.name || doc.fallbackName || import_chunk_SYEFGLXN.translations_default[0]["en-US"][import_chunk_3HHV4MM6.DocumentType.typename]["object name placeholder"],
42
+ name: doc.name || doc.fallbackName || import_chunk_LQAC5HL7.translations_default[0]["en-US"][import_chunk_3HHV4MM6.DocumentType.typename]["object name placeholder"],
41
43
  data: content.content,
42
44
  type: "text/markdown"
43
45
  };
44
46
  },
45
47
  deserialize: async (data, ancestors) => {
46
- const space = ancestors.find(import_echo.isSpace);
47
- const target = ancestors.findLast((ancestor) => ancestor instanceof import_types.CollectionType) ?? space?.properties[import_types.CollectionType.typename]?.target;
48
+ const space = ancestors.find(import_echo2.isSpace);
49
+ const target = ancestors.findLast((ancestor) => import_echo.Obj.instanceOf(import_schema.DataType.Collection, ancestor)) ?? space?.properties[import_echo.Type.getTypename(import_schema.DataType.Collection)]?.target;
48
50
  if (!space || !target) {
49
51
  return;
50
52
  }
@@ -60,4 +62,4 @@ var app_graph_serializer_default = (context) => (0, import_app_framework.contrib
60
62
  }
61
63
  }
62
64
  ]);
63
- //# sourceMappingURL=app-graph-serializer-BZPM7HHJ.cjs.map
65
+ //# sourceMappingURL=app-graph-serializer-E6BXEDEL.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-serializer.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { pipe } from 'effect';\n\nimport { contributes, Capabilities, type PluginContext, chain, createIntent } from '@dxos/app-framework';\nimport { Obj, Type } from '@dxos/echo';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { isSpace } from '@dxos/react-client/echo';\nimport { DataType } from '@dxos/schema';\n\nimport translations from '../translations';\nimport { MarkdownAction, DocumentType } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphSerializer, [\n {\n inputType: DocumentType.typename,\n outputType: 'text/markdown',\n // Reconcile with metadata serializers.\n serialize: async (node) => {\n const doc = node.data;\n const content = await doc.content.load();\n return {\n name:\n doc.name || doc.fallbackName || translations[0]['en-US'][DocumentType.typename]['object name placeholder'],\n data: content.content,\n type: 'text/markdown',\n };\n },\n deserialize: async (data, ancestors) => {\n const space = ancestors.find(isSpace);\n const target =\n ancestors.findLast((ancestor) => Obj.instanceOf(DataType.Collection, ancestor)) ??\n space?.properties[Type.getTypename(DataType.Collection)]?.target;\n if (!space || !target) {\n return;\n }\n\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const result = await dispatch(\n pipe(\n createIntent(MarkdownAction.Create, { spaceId: space.id, name: data.name, content: data.data }),\n chain(SpaceAction.AddObject, { target }),\n ),\n );\n\n return result.data?.object;\n },\n },\n ]);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,oBAAqB;AAErB,2BAAmF;AACnF,kBAA0B;AAC1B,mBAA4B;AAC5B,IAAAA,eAAwB;AACxB,oBAAyB;AAKzB,IAAA,+BAAe,CAACC,gBACdC,kCAAYC,kCAAaC,oBAAoB;EAC3C;IACEC,WAAWC,mCAAaC;IACxBC,YAAY;;IAEZC,WAAW,OAAOC,SAAAA;AAChB,YAAMC,MAAMD,KAAKE;AACjB,YAAMC,UAAU,MAAMF,IAAIE,QAAQC,KAAI;AACtC,aAAO;QACLC,MACEJ,IAAII,QAAQJ,IAAIK,gBAAgBC,2CAAa,CAAA,EAAG,OAAA,EAASX,mCAAaC,QAAQ,EAAE,yBAAA;QAClFK,MAAMC,QAAQA;QACdK,MAAM;MACR;IACF;IACAC,aAAa,OAAOP,MAAMQ,cAAAA;AACxB,YAAMC,QAAQD,UAAUE,KAAKC,oBAAAA;AAC7B,YAAMC,SACJJ,UAAUK,SAAS,CAACC,aAAaC,gBAAIC,WAAWC,uBAASC,YAAYJ,QAAAA,CAAAA,KACrEL,OAAOU,WAAWC,iBAAKC,YAAYJ,uBAASC,UAAU,CAAA,GAAIN;AAC5D,UAAI,CAACH,SAAS,CAACG,QAAQ;AACrB;MACF;AAEA,YAAM,EAAEU,iBAAiBC,SAAQ,IAAKlC,QAAQmC,cAAcjC,kCAAakC,gBAAgB;AACzF,YAAMC,SAAS,MAAMH,aACnBI,wBACEC,mCAAaC,qCAAeC,QAAQ;QAAEC,SAAStB,MAAMuB;QAAI7B,MAAMH,KAAKG;QAAMF,SAASD,KAAKA;MAAK,CAAA,OAC7FiC,4BAAMC,yBAAYC,WAAW;QAAEvB;MAAO,CAAA,CAAA,CAAA;AAI1C,aAAOc,OAAO1B,MAAMoC;IACtB;EACF;CACD;",
6
+ "names": ["import_echo", "context", "contributes", "Capabilities", "AppGraphSerializer", "inputType", "DocumentType", "typename", "outputType", "serialize", "node", "doc", "data", "content", "load", "name", "fallbackName", "translations", "type", "deserialize", "ancestors", "space", "find", "isSpace", "target", "findLast", "ancestor", "Obj", "instanceOf", "DataType", "Collection", "properties", "Type", "getTypename", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "result", "pipe", "createIntent", "MarkdownAction", "Create", "spaceId", "id", "chain", "SpaceAction", "AddObject", "object"]
7
+ }
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_4DYNEQG3_exports = {};
30
- __export(chunk_4DYNEQG3_exports, {
29
+ var chunk_FU3XZZCO_exports = {};
30
+ __export(chunk_FU3XZZCO_exports, {
31
31
  AnchorSort: () => AnchorSort,
32
32
  AppGraphSerializer: () => AppGraphSerializer,
33
33
  ArtifactDefinition: () => ArtifactDefinition,
@@ -36,13 +36,13 @@ __export(chunk_4DYNEQG3_exports, {
36
36
  MarkdownState: () => MarkdownState,
37
37
  ReactSurface: () => ReactSurface
38
38
  });
39
- module.exports = __toCommonJS(chunk_4DYNEQG3_exports);
39
+ module.exports = __toCommonJS(chunk_FU3XZZCO_exports);
40
40
  var import_app_framework = require("@dxos/app-framework");
41
41
  var AnchorSort = (0, import_app_framework.lazy)(() => import("./anchor-sort-V3T4SFFI.cjs"));
42
- var AppGraphSerializer = (0, import_app_framework.lazy)(() => import("./app-graph-serializer-BZPM7HHJ.cjs"));
42
+ var AppGraphSerializer = (0, import_app_framework.lazy)(() => import("./app-graph-serializer-E6BXEDEL.cjs"));
43
43
  var ArtifactDefinition = (0, import_app_framework.lazy)(() => import("./artifact-definition-U27MH5SC.cjs"));
44
44
  var IntentResolver = (0, import_app_framework.lazy)(() => import("./intent-resolver-OEFLRNEJ.cjs"));
45
- var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-5RKEWAXS.cjs"));
45
+ var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-456HQ4KZ.cjs"));
46
46
  var MarkdownSettings = (0, import_app_framework.lazy)(() => import("./settings-E3NUTXJ4.cjs"));
47
47
  var MarkdownState = (0, import_app_framework.lazy)(() => import("./state-KKDRAG7X.cjs"));
48
48
  // Annotate the CommonJS export names for ESM import in node:
@@ -55,4 +55,4 @@ var MarkdownState = (0, import_app_framework.lazy)(() => import("./state-KKDRAG7
55
55
  MarkdownState,
56
56
  ReactSurface
57
57
  });
58
- //# sourceMappingURL=chunk-4DYNEQG3.cjs.map
58
+ //# sourceMappingURL=chunk-FU3XZZCO.cjs.map
@@ -16,18 +16,22 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_SYEFGLXN_exports = {};
20
- __export(chunk_SYEFGLXN_exports, {
19
+ var chunk_LQAC5HL7_exports = {};
20
+ __export(chunk_LQAC5HL7_exports, {
21
21
  translations_default: () => translations_default
22
22
  });
23
- module.exports = __toCommonJS(chunk_SYEFGLXN_exports);
23
+ module.exports = __toCommonJS(chunk_LQAC5HL7_exports);
24
24
  var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
25
25
  var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
26
+ var import_echo = require("@dxos/echo");
26
27
  var translations_default = [
27
28
  {
28
29
  "en-US": {
29
- [import_chunk_3HHV4MM6.DocumentType.typename]: {
30
+ [import_echo.Type.getTypename(import_chunk_3HHV4MM6.DocumentType)]: {
30
31
  "typename label": "Document",
32
+ "typename label_zero": "Documents",
33
+ "typename label_one": "Document",
34
+ "typename label_other": "Documents",
31
35
  "object name placeholder": "New document"
32
36
  },
33
37
  [import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN]: {
@@ -61,4 +65,4 @@ var translations_default = [
61
65
  0 && (module.exports = {
62
66
  translations_default
63
67
  });
64
- //# sourceMappingURL=chunk-SYEFGLXN.cjs.map
68
+ //# sourceMappingURL=chunk-LQAC5HL7.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/translations.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Type } from '@dxos/echo';\n\nimport { MARKDOWN_PLUGIN } from './meta';\nimport { DocumentType } from './types';\n\nexport default [\n {\n 'en-US': {\n [Type.getTypename(DocumentType)]: {\n 'typename label': 'Document',\n 'typename label_zero': 'Documents',\n 'typename label_one': 'Document',\n 'typename label_other': 'Documents',\n 'object name placeholder': 'New document',\n },\n [MARKDOWN_PLUGIN]: {\n 'plugin name': 'Editor',\n 'choose markdown from space dialog title': 'Choose one or more documents to add',\n // TODO(burdon): Style-guide for user-facing text (e.g., hints, questions, capitalization, etc.)\n 'empty choose markdown from space message': 'None available; try creating a new one instead?',\n 'chooser done label': 'Add selected',\n 'editor placeholder': '',\n 'editor input mode label': 'Editor input mode',\n 'select editor input mode placeholder': 'Select editor input mode…',\n 'settings editor input mode default label': 'Default',\n 'settings editor input mode vim label': 'Vim',\n 'settings editor input mode vscode label': 'VS Code',\n 'settings toolbar label': 'Show toolbar',\n 'settings numbered headings label': 'Numbered headings',\n 'settings folding label': 'Folding',\n 'settings experimental label': 'Enable experimental features',\n 'settings debug label': 'Enable debugging features',\n 'settings debug placeholder': 'Typewriter script...',\n 'toggle view mode label': 'Toggle read-only',\n 'default view mode label': 'Default view mode',\n 'upload image label': 'Upload image',\n 'fallback title': 'Untitled',\n 'navigate to document label': 'Open document',\n },\n },\n },\n];\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kBAAqB;AAKrB,IAAA,uBAAe;EACb;IACE,SAAS;MACP,CAACA,iBAAKC,YAAYC,kCAAAA,CAAAA,GAAgB;QAChC,kBAAkB;QAClB,uBAAuB;QACvB,sBAAsB;QACtB,wBAAwB;QACxB,2BAA2B;MAC7B;MACA,CAACC,qCAAAA,GAAkB;QACjB,eAAe;QACf,2CAA2C;;QAE3C,4CAA4C;QAC5C,sBAAsB;QACtB,sBAAsB;QACtB,2BAA2B;QAC3B,wCAAwC;QACxC,4CAA4C;QAC5C,wCAAwC;QACxC,2CAA2C;QAC3C,0BAA0B;QAC1B,oCAAoC;QACpC,0BAA0B;QAC1B,+BAA+B;QAC/B,wBAAwB;QACxB,8BAA8B;QAC9B,0BAA0B;QAC1B,2BAA2B;QAC3B,sBAAsB;QACtB,kBAAkB;QAClB,8BAA8B;MAChC;IACF;EACF;;",
6
+ "names": ["Type", "getTypename", "DocumentType", "MARKDOWN_PLUGIN"]
7
+ }
@@ -30,8 +30,8 @@ __export(node_exports, {
30
30
  setFallbackName: () => import_chunk_CJLYFGPI.setFallbackName
31
31
  });
32
32
  module.exports = __toCommonJS(node_exports);
33
- var import_chunk_SYEFGLXN = require("./chunk-SYEFGLXN.cjs");
34
- var import_chunk_4DYNEQG3 = require("./chunk-4DYNEQG3.cjs");
33
+ var import_chunk_LQAC5HL7 = require("./chunk-LQAC5HL7.cjs");
34
+ var import_chunk_FU3XZZCO = require("./chunk-FU3XZZCO.cjs");
35
35
  var import_chunk_IFYSBQE5 = require("./chunk-IFYSBQE5.cjs");
36
36
  var import_chunk_CJLYFGPI = require("./chunk-CJLYFGPI.cjs");
37
37
  var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
@@ -54,14 +54,14 @@ var MarkdownPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_
54
54
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/translations`,
55
55
  activatesOn: import_app_framework2.Events.SetupTranslations,
56
56
  activate: () => (0, import_app_framework2.contributes)(import_app_framework2.Capabilities.Translations, [
57
- ...import_chunk_SYEFGLXN.translations_default,
57
+ ...import_chunk_LQAC5HL7.translations_default,
58
58
  ...import_react_ui_editor.translations
59
59
  ])
60
60
  }),
61
61
  (0, import_app_framework2.defineModule)({
62
62
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/settings`,
63
63
  activatesOn: import_app_framework2.Events.SetupSettings,
64
- activate: import_chunk_4DYNEQG3.MarkdownSettings
64
+ activate: import_chunk_FU3XZZCO.MarkdownSettings
65
65
  }),
66
66
  (0, import_app_framework2.defineModule)({
67
67
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/state`,
@@ -69,7 +69,7 @@ var MarkdownPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_
69
69
  // Should this be a different event?
70
70
  // Should settings store be renamed to be more generic?
71
71
  activatesOn: import_app_framework2.Events.SetupSettings,
72
- activate: import_chunk_4DYNEQG3.MarkdownState
72
+ activate: import_chunk_FU3XZZCO.MarkdownState
73
73
  }),
74
74
  (0, import_app_framework2.defineModule)({
75
75
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/metadata`,
@@ -125,28 +125,28 @@ var MarkdownPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_
125
125
  activatesBefore: [
126
126
  MarkdownEvents.SetupExtensions
127
127
  ],
128
- activate: import_chunk_4DYNEQG3.ReactSurface
128
+ activate: import_chunk_FU3XZZCO.ReactSurface
129
129
  }),
130
130
  (0, import_app_framework2.defineModule)({
131
131
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/intent-resolver`,
132
132
  activatesOn: import_app_framework2.Events.SetupIntentResolver,
133
- activate: import_chunk_4DYNEQG3.IntentResolver
133
+ activate: import_chunk_FU3XZZCO.IntentResolver
134
134
  }),
135
135
  (0, import_app_framework2.defineModule)({
136
136
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/app-graph-serializer`,
137
137
  activatesOn: import_app_framework2.Events.AppGraphReady,
138
- activate: import_chunk_4DYNEQG3.AppGraphSerializer
138
+ activate: import_chunk_FU3XZZCO.AppGraphSerializer
139
139
  }),
140
140
  (0, import_app_framework2.defineModule)({
141
141
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/anchor-sort`,
142
142
  // TODO(wittjosiah): More relevant event?
143
143
  activatesOn: import_app_framework2.Events.AppGraphReady,
144
- activate: import_chunk_4DYNEQG3.AnchorSort
144
+ activate: import_chunk_FU3XZZCO.AnchorSort
145
145
  }),
146
146
  (0, import_app_framework2.defineModule)({
147
147
  id: `${import_chunk_ZU5OIHCY.meta.id}/module/artifact-definition`,
148
148
  activatesOn: import_app_framework2.Events.SetupArtifactDefinition,
149
- activate: import_chunk_4DYNEQG3.ArtifactDefinition
149
+ activate: import_chunk_FU3XZZCO.ArtifactDefinition
150
150
  })
151
151
  ]);
152
152
  // Annotate the CommonJS export names for ESM import in node: