@dxos/plugin-markdown 0.8.4-main.2c6827d → 0.8.4-main.3c1ae3b

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 (142) hide show
  1. package/dist/lib/browser/MarkdownCard-THZFDOOV.mjs +13 -0
  2. package/dist/lib/browser/MarkdownContainer-VKPSVI5F.mjs +16 -0
  3. package/dist/lib/browser/{anchor-sort-3HGPGCOO.mjs → anchor-sort-3MYLO74J.mjs} +6 -5
  4. package/dist/lib/browser/anchor-sort-3MYLO74J.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-serializer-POZN234F.mjs → app-graph-serializer-BZJ4TQOE.mjs} +3 -3
  6. package/dist/lib/browser/{blueprint-definition-GIPKFDY5.mjs → blueprint-definition-R5T6LTPN.mjs} +3 -3
  7. package/dist/lib/browser/{chunk-K3LXOU3E.mjs → chunk-56SUMOIZ.mjs} +102 -195
  8. package/dist/lib/browser/chunk-56SUMOIZ.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-6OMOMVO7.mjs +107 -0
  10. package/dist/lib/browser/chunk-6OMOMVO7.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QYSEJ5GP.mjs → chunk-CN35HEBX.mjs} +6 -6
  12. package/dist/lib/browser/chunk-CN35HEBX.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-PBJLFIOX.mjs → chunk-KCOBZZIL.mjs} +38 -23
  14. package/dist/lib/browser/chunk-KCOBZZIL.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GH6GQSBL.mjs → chunk-KPH4ZPQN.mjs} +53 -5
  16. package/dist/lib/browser/chunk-KPH4ZPQN.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-22XSSNBS.mjs → chunk-NXT2E2BG.mjs} +4 -3
  18. package/dist/lib/browser/chunk-NXT2E2BG.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-Y53FQREH.mjs → chunk-RJPOHSYN.mjs} +8 -6
  20. package/dist/lib/browser/chunk-RJPOHSYN.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-2MLGSYRN.mjs → chunk-U6Y53XZK.mjs} +7 -7
  22. package/dist/lib/browser/index.mjs +10 -24
  23. package/dist/lib/browser/index.mjs.map +3 -3
  24. package/dist/lib/browser/{intent-resolver-Z5L7TXUK.mjs → intent-resolver-55ASQRIW.mjs} +3 -3
  25. package/dist/lib/browser/{intent-resolver-Z5L7TXUK.mjs.map → intent-resolver-55ASQRIW.mjs.map} +1 -1
  26. package/dist/lib/browser/meta.json +1 -1
  27. package/dist/lib/browser/{react-surface-GO5ZOKNN.mjs → react-surface-Q3C5H2KT.mjs} +21 -17
  28. package/dist/lib/browser/react-surface-Q3C5H2KT.mjs.map +7 -0
  29. package/dist/lib/browser/{settings-TZUDB5EW.mjs → settings-G3ZOXJQY.mjs} +2 -2
  30. package/dist/lib/browser/toolkit.mjs +2 -2
  31. package/dist/lib/browser/types/index.mjs +1 -1
  32. package/dist/lib/node-esm/{MarkdownCard-ZXPJLUYO.mjs → MarkdownCard-QHSSZGIY.mjs} +5 -4
  33. package/dist/lib/node-esm/{MarkdownContainer-YRDSRDCS.mjs → MarkdownContainer-G3ZQJS7A.mjs} +7 -6
  34. package/dist/lib/node-esm/{anchor-sort-PCDXEBJ2.mjs → anchor-sort-W4HCTYUQ.mjs} +6 -5
  35. package/dist/lib/node-esm/anchor-sort-W4HCTYUQ.mjs.map +7 -0
  36. package/dist/lib/node-esm/{app-graph-serializer-NF65JYAS.mjs → app-graph-serializer-OCTHXWLF.mjs} +3 -3
  37. package/dist/lib/node-esm/{blueprint-definition-ENKJZYQS.mjs → blueprint-definition-2JV3WV22.mjs} +3 -3
  38. package/dist/lib/node-esm/{chunk-PLZ7EVCT.mjs → chunk-6F6FCTIA.mjs} +53 -5
  39. package/dist/lib/node-esm/chunk-6F6FCTIA.mjs.map +7 -0
  40. package/dist/lib/node-esm/{chunk-HAIEWPU7.mjs → chunk-C5KXP2ZE.mjs} +8 -6
  41. package/dist/lib/node-esm/chunk-C5KXP2ZE.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-CT7CFX5G.mjs → chunk-FR6RW6DH.mjs} +102 -195
  43. package/dist/lib/node-esm/chunk-FR6RW6DH.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-AMHACOXW.mjs → chunk-I5JSQBPI.mjs} +4 -3
  45. package/dist/lib/node-esm/chunk-I5JSQBPI.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-KCHUTL3Q.mjs → chunk-KM7KYV6W.mjs} +7 -7
  47. package/dist/lib/node-esm/chunk-KYWXTMKI.mjs +108 -0
  48. package/dist/lib/node-esm/chunk-KYWXTMKI.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-PIOOG7A5.mjs → chunk-R3SGV4ES.mjs} +38 -23
  50. package/dist/lib/node-esm/chunk-R3SGV4ES.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-NGYJNQ6A.mjs → chunk-YFRTKXTB.mjs} +6 -6
  52. package/dist/lib/node-esm/chunk-YFRTKXTB.mjs.map +7 -0
  53. package/dist/lib/node-esm/index.mjs +10 -24
  54. package/dist/lib/node-esm/index.mjs.map +3 -3
  55. package/dist/lib/node-esm/{intent-resolver-6B3PFQ5F.mjs → intent-resolver-DTBVWCNO.mjs} +3 -3
  56. package/dist/lib/node-esm/{intent-resolver-6B3PFQ5F.mjs.map → intent-resolver-DTBVWCNO.mjs.map} +1 -1
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{react-surface-I46BPCWT.mjs → react-surface-QWRT4SD6.mjs} +21 -17
  59. package/dist/lib/node-esm/react-surface-QWRT4SD6.mjs.map +7 -0
  60. package/dist/lib/node-esm/{settings-CJ3T5EX4.mjs → settings-IBFFCGNL.mjs} +2 -2
  61. package/dist/lib/node-esm/toolkit.mjs +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +1 -1
  63. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  65. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +14 -1
  66. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -1
  67. package/dist/types/src/components/MarkdownContainer.d.ts +6 -1
  68. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  69. package/dist/types/src/components/MarkdownContainer.stories.d.ts +1 -0
  70. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +8 -5
  72. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  73. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/index.d.ts +5 -2
  75. package/dist/types/src/components/index.d.ts.map +1 -1
  76. package/dist/types/src/functions/open.d.ts.map +1 -1
  77. package/dist/types/src/functions/update.d.ts.map +1 -1
  78. package/dist/types/src/testing.d.ts +2 -2
  79. package/dist/types/src/testing.d.ts.map +1 -1
  80. package/dist/types/src/translations.d.ts +1 -0
  81. package/dist/types/src/translations.d.ts.map +1 -1
  82. package/dist/types/src/types/Markdown.d.ts +6 -6
  83. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  84. package/dist/types/src/types/MarkdownAction.d.ts +3 -3
  85. package/dist/types/src/util.d.ts +3 -0
  86. package/dist/types/src/util.d.ts.map +1 -1
  87. package/dist/types/src/util.test.d.ts +2 -0
  88. package/dist/types/src/util.test.d.ts.map +1 -0
  89. package/dist/types/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +44 -44
  91. package/src/MarkdownPlugin.tsx +5 -21
  92. package/src/capabilities/anchor-sort.ts +4 -3
  93. package/src/capabilities/artifact-definition.ts +1 -1
  94. package/src/capabilities/intent-resolver.ts +1 -1
  95. package/src/capabilities/react-surface.tsx +32 -28
  96. package/src/components/MarkdownCard/MarkdownCard.tsx +39 -32
  97. package/src/components/MarkdownContainer.tsx +68 -73
  98. package/src/components/MarkdownEditor/MarkdownEditor.tsx +5 -5
  99. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +24 -8
  100. package/src/components/Suggestions.stories.tsx +2 -1
  101. package/src/components/index.ts +8 -3
  102. package/src/functions/create.test.ts +14 -18
  103. package/src/functions/open.ts +3 -2
  104. package/src/functions/update.test.ts +17 -21
  105. package/src/functions/update.ts +3 -2
  106. package/src/hooks/useExtensions.tsx +2 -2
  107. package/src/hooks/useLinkQuery.ts +10 -10
  108. package/src/testing.ts +5 -5
  109. package/src/translations.ts +1 -0
  110. package/src/types/Markdown.ts +4 -5
  111. package/src/util.test.ts +44 -0
  112. package/src/util.tsx +72 -4
  113. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +0 -12
  114. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +0 -15
  115. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +0 -7
  116. package/dist/lib/browser/chunk-22XSSNBS.mjs.map +0 -7
  117. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +0 -7
  118. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +0 -7
  120. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +0 -7
  122. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +0 -7
  123. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +0 -7
  124. package/dist/lib/node-esm/chunk-AMHACOXW.mjs.map +0 -7
  125. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +0 -7
  127. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +0 -7
  129. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +0 -7
  130. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +0 -7
  131. /package/dist/lib/browser/{MarkdownCard-JYMDPKV5.mjs.map → MarkdownCard-THZFDOOV.mjs.map} +0 -0
  132. /package/dist/lib/browser/{MarkdownContainer-Y75XSVBX.mjs.map → MarkdownContainer-VKPSVI5F.mjs.map} +0 -0
  133. /package/dist/lib/browser/{app-graph-serializer-POZN234F.mjs.map → app-graph-serializer-BZJ4TQOE.mjs.map} +0 -0
  134. /package/dist/lib/browser/{blueprint-definition-GIPKFDY5.mjs.map → blueprint-definition-R5T6LTPN.mjs.map} +0 -0
  135. /package/dist/lib/browser/{chunk-2MLGSYRN.mjs.map → chunk-U6Y53XZK.mjs.map} +0 -0
  136. /package/dist/lib/browser/{settings-TZUDB5EW.mjs.map → settings-G3ZOXJQY.mjs.map} +0 -0
  137. /package/dist/lib/node-esm/{MarkdownCard-ZXPJLUYO.mjs.map → MarkdownCard-QHSSZGIY.mjs.map} +0 -0
  138. /package/dist/lib/node-esm/{MarkdownContainer-YRDSRDCS.mjs.map → MarkdownContainer-G3ZQJS7A.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{app-graph-serializer-NF65JYAS.mjs.map → app-graph-serializer-OCTHXWLF.mjs.map} +0 -0
  140. /package/dist/lib/node-esm/{blueprint-definition-ENKJZYQS.mjs.map → blueprint-definition-2JV3WV22.mjs.map} +0 -0
  141. /package/dist/lib/node-esm/{chunk-KCHUTL3Q.mjs.map → chunk-KM7KYV6W.mjs.map} +0 -0
  142. /package/dist/lib/node-esm/{settings-CJ3T5EX4.mjs.map → settings-IBFFCGNL.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/anchor-sort.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { Relation } from '@dxos/echo';\nimport { createDocAccessor, getRangeFromCursor } from '@dxos/echo-db';\nimport { type AnchoredTo } from '@dxos/types';\n\nimport { Markdown } from '../types';\n\nexport default () =>\n contributes(Capabilities.AnchorSort, {\n key: Markdown.Document.typename,\n sort: (anchorA: AnchoredTo.AnchoredTo, anchorB: AnchoredTo.AnchoredTo) => {\n const doc = Relation.getTarget(anchorA) as Markdown.Document;\n const accessor = doc.content.target ? createDocAccessor(doc.content.target, ['content']) : undefined;\n if (doc !== Relation.getTarget(anchorB) || !accessor) {\n return 0;\n }\n\n const getStartPosition = (cursor: string | undefined) => {\n const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;\n return range?.start ?? Number.MAX_SAFE_INTEGER;\n };\n\n const posA = getStartPosition(anchorA.anchor);\n const posB = getStartPosition(anchorB.anchor);\n return posA - posB;\n },\n });\n"],
5
+ "mappings": ";;;;;;;AAIA,SAASA,cAAcC,mBAAmB;AAC1C,SAASC,gBAAgB;AACzB,SAASC,mBAAmBC,0BAA0B;AAKtD,IAAA,uBAAe,MACbC,YAAYC,aAAaC,YAAY;EACnCC,KAAKC,iBAASC,SAASC;EACvBC,MAAM,CAACC,SAAgCC,YAAAA;AACrC,UAAMC,MAAMC,SAASC,UAAUJ,OAAAA;AAC/B,UAAMK,WAAWH,IAAII,QAAQC,SAASC,kBAAkBN,IAAII,QAAQC,QAAQ;MAAC;KAAU,IAAIE;AAC3F,QAAIP,QAAQC,SAASC,UAAUH,OAAAA,KAAY,CAACI,UAAU;AACpD,aAAO;IACT;AAEA,UAAMK,mBAAmB,CAACC,WAAAA;AACxB,YAAMC,QAAQD,SAASE,mBAAmBR,UAAUM,MAAAA,IAAUF;AAC9D,aAAOG,OAAOE,SAASC,OAAOC;IAChC;AAEA,UAAMC,OAAOP,iBAAiBV,QAAQkB,MAAM;AAC5C,UAAMC,OAAOT,iBAAiBT,QAAQiB,MAAM;AAC5C,WAAOD,OAAOE;EAChB;AACF,CAAA;",
6
+ "names": ["Capabilities", "contributes", "Relation", "createDocAccessor", "getRangeFromCursor", "contributes", "Capabilities", "AnchorSort", "key", "Markdown", "Document", "typename", "sort", "anchorA", "anchorB", "doc", "Relation", "getTarget", "accessor", "content", "target", "createDocAccessor", "undefined", "getStartPosition", "cursor", "range", "getRangeFromCursor", "start", "Number", "MAX_SAFE_INTEGER", "posA", "anchor", "posB"]
7
+ }
@@ -1,11 +1,11 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  translations
4
- } from "./chunk-AMHACOXW.mjs";
4
+ } from "./chunk-I5JSQBPI.mjs";
5
5
  import {
6
6
  MarkdownAction_exports,
7
7
  Markdown_exports
8
- } from "./chunk-NGYJNQ6A.mjs";
8
+ } from "./chunk-YFRTKXTB.mjs";
9
9
  import "./chunk-SHAMSMKQ.mjs";
10
10
 
11
11
  // src/capabilities/app-graph-serializer.ts
@@ -49,4 +49,4 @@ var app_graph_serializer_default = ((context) => contributes(Capabilities.AppGra
49
49
  export {
50
50
  app_graph_serializer_default as default
51
51
  };
52
- //# sourceMappingURL=app-graph-serializer-NF65JYAS.mjs.map
52
+ //# sourceMappingURL=app-graph-serializer-OCTHXWLF.mjs.map
@@ -3,12 +3,12 @@ import {
3
3
  MARKDOWN_BLUEPRINT_KEY,
4
4
  MarkdownBlueprint,
5
5
  blueprint_definition_default
6
- } from "./chunk-HAIEWPU7.mjs";
7
- import "./chunk-NGYJNQ6A.mjs";
6
+ } from "./chunk-C5KXP2ZE.mjs";
7
+ import "./chunk-YFRTKXTB.mjs";
8
8
  import "./chunk-SHAMSMKQ.mjs";
9
9
  export {
10
10
  MARKDOWN_BLUEPRINT_KEY,
11
11
  MarkdownBlueprint,
12
12
  blueprint_definition_default as default
13
13
  };
14
- //# sourceMappingURL=blueprint-definition-ENKJZYQS.mjs.map
14
+ //# sourceMappingURL=blueprint-definition-2JV3WV22.mjs.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  Markdown_exports
4
- } from "./chunk-NGYJNQ6A.mjs";
4
+ } from "./chunk-YFRTKXTB.mjs";
5
5
 
6
6
  // src/util.tsx
7
7
  import { debounce } from "@dxos/async";
@@ -9,12 +9,60 @@ import { Obj } from "@dxos/echo";
9
9
  var isEditorModel = (data) => data && typeof data === "object" && "id" in data && typeof data.id === "string" && "text" in data && typeof data.text === "string";
10
10
  var isMarkdownProperties = (data) => Obj.isObject(data) ? true : data && typeof data === "object" ? "title" in data && typeof data.title === "string" : false;
11
11
  var nonTitleChars = /[^\w ]/g;
12
+ var skipPatterns = [
13
+ /^!\[/,
14
+ /^---\s*$/,
15
+ /^```/,
16
+ /^\s*$/
17
+ ];
18
+ var titlePatterns = [
19
+ /^#{1,6}\s+(.+)/
20
+ ];
12
21
  var getFallbackName = (content = "") => {
13
- return content.substring(0, 31).split("\n")[0].replaceAll(nonTitleChars, "").trim();
22
+ const len = content.length;
23
+ let i = 0;
24
+ while (i < len) {
25
+ let lineEnd = i;
26
+ while (lineEnd < len && content[lineEnd] !== "\n") {
27
+ lineEnd++;
28
+ }
29
+ const line = content.slice(i, lineEnd).trim();
30
+ i = lineEnd + 1;
31
+ if (skipPatterns.some((pattern) => pattern.test(line))) {
32
+ continue;
33
+ }
34
+ for (const pattern of titlePatterns) {
35
+ const match = pattern.exec(line);
36
+ if (match) {
37
+ const text2 = match[1].replaceAll(nonTitleChars, "").trim();
38
+ if (text2.length > 0) {
39
+ return text2;
40
+ }
41
+ }
42
+ }
43
+ const maxLen = 32;
44
+ const text = line.replaceAll(nonTitleChars, "").trim();
45
+ if (text.length > 0) {
46
+ if (text.length > maxLen) {
47
+ const words = text.split(/\s+/);
48
+ let result = "";
49
+ for (const word of words) {
50
+ const next = result.length === 0 ? word : result + " " + word;
51
+ if (next.length > maxLen) {
52
+ break;
53
+ }
54
+ result = next;
55
+ }
56
+ return result + "\u2026";
57
+ }
58
+ return text;
59
+ }
60
+ }
61
+ return "";
14
62
  };
15
63
  var getContentSnippet = (content = "") => {
16
- const abstract = content.split("\n").filter((line) => !line.startsWith("#")).filter((line) => line.trim() !== "");
17
- return abstract.length > 0 ? abstract[0].replaceAll(nonTitleChars, "").trim() + "..." : "";
64
+ const abstract = content.split("\n").filter((line) => !line.startsWith("!")).filter((line) => line.trim() !== "");
65
+ return abstract.slice(0, 3).join("\n") ?? "";
18
66
  };
19
67
  var setFallbackName = debounce((doc, content = "") => {
20
68
  const name = getFallbackName(content);
@@ -49,4 +97,4 @@ export {
49
97
  setFallbackName,
50
98
  serializer
51
99
  };
52
- //# sourceMappingURL=chunk-PLZ7EVCT.mjs.map
100
+ //# sourceMappingURL=chunk-6F6FCTIA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { debounce } from '@dxos/async';\nimport { Obj } from '@dxos/echo';\nimport { type TypedObjectSerializer } from '@dxos/plugin-space/types';\n\nimport { Markdown } from './types';\n\n/**\n * Checks if an object conforms to the interface needed to render an editor.\n * @deprecated Use Schema.instanceOf(Markdown.Document, data)\n */\n// TODO(burdon): Normalize types (from FilesPlugin).\nexport const isEditorModel = (data: any): data is { id: string; text: string } =>\n data &&\n typeof data === 'object' &&\n 'id' in data &&\n typeof data.id === 'string' &&\n 'text' in data &&\n typeof data.text === 'string';\n\nexport type MarkdownProperties = Record<string, any>;\n\nexport const isMarkdownProperties = (data: unknown): data is MarkdownProperties =>\n (Obj.isObject(data) as boolean)\n ? true\n : data && typeof data === 'object'\n ? 'title' in data && typeof data.title === 'string'\n : false;\n\nconst nonTitleChars = /[^\\w ]/g;\n\n// Lines matching these patterns are skipped.\nconst skipPatterns = [\n /^!\\[/, // Image.\n /^---\\s*$/, // Horizontal rule.\n /^```/, // Code block fence.\n /^\\s*$/, // Empty or whitespace-only.\n];\n\n// Patterns to extract title text (first capture group is used).\nconst titlePatterns = [\n /^#{1,6}\\s+(.+)/, // Heading.\n];\n\n/**\n * Extracts a fallback name by scanning lines for the first heading or text fragment.\n */\nexport const getFallbackName = (content = ''): string => {\n const len = content.length;\n\n let i = 0;\n while (i < len) {\n // Find end of line.\n let lineEnd = i;\n while (lineEnd < len && content[lineEnd] !== '\\n') {\n lineEnd++;\n }\n\n const line = content.slice(i, lineEnd).trim();\n i = lineEnd + 1;\n\n // Skip lines matching skip patterns.\n if (skipPatterns.some((pattern) => pattern.test(line))) {\n continue;\n }\n\n // Check for title patterns.\n for (const pattern of titlePatterns) {\n const match = pattern.exec(line);\n if (match) {\n const text = match[1].replaceAll(nonTitleChars, '').trim();\n if (text.length > 0) {\n return text;\n }\n }\n }\n\n // Use line as plain text fallback.\n const maxLen = 32;\n const text = line.replaceAll(nonTitleChars, '').trim();\n if (text.length > 0) {\n if (text.length > maxLen) {\n const words = text.split(/\\s+/);\n let result = '';\n for (const word of words) {\n const next = result.length === 0 ? word : result + ' ' + word;\n if (next.length > maxLen) {\n break;\n }\n result = next;\n }\n\n return result + '…';\n }\n\n return text;\n }\n }\n\n return '';\n};\n\n// TODO(burdon): Option to strip Markdown.\nexport const getContentSnippet = (content = '') => {\n const abstract = content\n .split('\\n')\n .filter((line) => !line.startsWith('!'))\n .filter((line) => line.trim() !== '');\n\n return abstract.slice(0, 3).join('\\n') ?? '';\n};\n\nexport const setFallbackName = debounce((doc: Markdown.Document, content = '') => {\n const name = getFallbackName(content);\n if (doc.fallbackName !== name) {\n doc.fallbackName = name;\n }\n}, 200);\n\nexport const serializer: TypedObjectSerializer<Markdown.Document> = {\n serialize: async ({ object }): Promise<string> => {\n const { content } = await object.content.load();\n return JSON.stringify({ name: object.name, fallbackName: object.fallbackName, content });\n },\n\n deserialize: async ({ content: serialized }) => {\n const { name, fallbackName, content } = JSON.parse(serialized);\n return Markdown.make({ name, fallbackName, content });\n },\n};\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,gBAAgB;AACzB,SAASC,WAAW;AAUb,IAAMC,gBAAgB,CAACC,SAC5BA,QACA,OAAOA,SAAS,YAChB,QAAQA,QACR,OAAOA,KAAKC,OAAO,YACnB,UAAUD,QACV,OAAOA,KAAKE,SAAS;AAIhB,IAAMC,uBAAuB,CAACH,SAClCI,IAAIC,SAASL,IAAAA,IACV,OACAA,QAAQ,OAAOA,SAAS,WACtB,WAAWA,QAAQ,OAAOA,KAAKM,UAAU,WACzC;AAER,IAAMC,gBAAgB;AAGtB,IAAMC,eAAe;EACnB;EACA;EACA;EACA;;AAIF,IAAMC,gBAAgB;EACpB;;AAMK,IAAMC,kBAAkB,CAACC,UAAU,OAAE;AAC1C,QAAMC,MAAMD,QAAQE;AAEpB,MAAIC,IAAI;AACR,SAAOA,IAAIF,KAAK;AAEd,QAAIG,UAAUD;AACd,WAAOC,UAAUH,OAAOD,QAAQI,OAAAA,MAAa,MAAM;AACjDA;IACF;AAEA,UAAMC,OAAOL,QAAQM,MAAMH,GAAGC,OAAAA,EAASG,KAAI;AAC3CJ,QAAIC,UAAU;AAGd,QAAIP,aAAaW,KAAK,CAACC,YAAYA,QAAQC,KAAKL,IAAAA,CAAAA,GAAQ;AACtD;IACF;AAGA,eAAWI,WAAWX,eAAe;AACnC,YAAMa,QAAQF,QAAQG,KAAKP,IAAAA;AAC3B,UAAIM,OAAO;AACT,cAAMpB,QAAOoB,MAAM,CAAA,EAAGE,WAAWjB,eAAe,EAAA,EAAIW,KAAI;AACxD,YAAIhB,MAAKW,SAAS,GAAG;AACnB,iBAAOX;QACT;MACF;IACF;AAGA,UAAMuB,SAAS;AACf,UAAMvB,OAAOc,KAAKQ,WAAWjB,eAAe,EAAA,EAAIW,KAAI;AACpD,QAAIhB,KAAKW,SAAS,GAAG;AACnB,UAAIX,KAAKW,SAASY,QAAQ;AACxB,cAAMC,QAAQxB,KAAKyB,MAAM,KAAA;AACzB,YAAIC,SAAS;AACb,mBAAWC,QAAQH,OAAO;AACxB,gBAAMI,OAAOF,OAAOf,WAAW,IAAIgB,OAAOD,SAAS,MAAMC;AACzD,cAAIC,KAAKjB,SAASY,QAAQ;AACxB;UACF;AACAG,mBAASE;QACX;AAEA,eAAOF,SAAS;MAClB;AAEA,aAAO1B;IACT;EACF;AAEA,SAAO;AACT;AAGO,IAAM6B,oBAAoB,CAACpB,UAAU,OAAE;AAC5C,QAAMqB,WAAWrB,QACdgB,MAAM,IAAA,EACNM,OAAO,CAACjB,SAAS,CAACA,KAAKkB,WAAW,GAAA,CAAA,EAClCD,OAAO,CAACjB,SAASA,KAAKE,KAAI,MAAO,EAAA;AAEpC,SAAOc,SAASf,MAAM,GAAG,CAAA,EAAGkB,KAAK,IAAA,KAAS;AAC5C;AAEO,IAAMC,kBAAkBC,SAAS,CAACC,KAAwB3B,UAAU,OAAE;AAC3E,QAAM4B,OAAO7B,gBAAgBC,OAAAA;AAC7B,MAAI2B,IAAIE,iBAAiBD,MAAM;AAC7BD,QAAIE,eAAeD;EACrB;AACF,GAAG,GAAA;AAEI,IAAME,aAAuD;EAClEC,WAAW,OAAO,EAAEC,OAAM,MAAE;AAC1B,UAAM,EAAEhC,QAAO,IAAK,MAAMgC,OAAOhC,QAAQiC,KAAI;AAC7C,WAAOC,KAAKC,UAAU;MAAEP,MAAMI,OAAOJ;MAAMC,cAAcG,OAAOH;MAAc7B;IAAQ,CAAA;EACxF;EAEAoC,aAAa,OAAO,EAAEpC,SAASqC,WAAU,MAAE;AACzC,UAAM,EAAET,MAAMC,cAAc7B,QAAO,IAAKkC,KAAKI,MAAMD,UAAAA;AACnD,WAAOE,iBAASC,KAAK;MAAEZ;MAAMC;MAAc7B;IAAQ,CAAA;EACrD;AACF;",
6
+ "names": ["debounce", "Obj", "isEditorModel", "data", "id", "text", "isMarkdownProperties", "Obj", "isObject", "title", "nonTitleChars", "skipPatterns", "titlePatterns", "getFallbackName", "content", "len", "length", "i", "lineEnd", "line", "slice", "trim", "some", "pattern", "test", "match", "exec", "replaceAll", "maxLen", "words", "split", "result", "word", "next", "getContentSnippet", "abstract", "filter", "startsWith", "join", "setFallbackName", "debounce", "doc", "name", "fallbackName", "serializer", "serialize", "object", "load", "JSON", "stringify", "deserialize", "serialized", "parse", "Markdown", "make"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  Markdown_exports
4
- } from "./chunk-NGYJNQ6A.mjs";
4
+ } from "./chunk-YFRTKXTB.mjs";
5
5
 
6
6
  // src/capabilities/blueprint-definition.ts
7
7
  import { Capabilities, contributes } from "@dxos/app-framework";
@@ -44,7 +44,8 @@ var create_default = defineFunction({
44
44
  import * as Effect2 from "effect/Effect";
45
45
  import * as Schema2 from "effect/Schema";
46
46
  import { ArtifactId as ArtifactId2 } from "@dxos/assistant";
47
- import { DatabaseService, defineFunction as defineFunction2 } from "@dxos/functions";
47
+ import { Database } from "@dxos/echo";
48
+ import { defineFunction as defineFunction2 } from "@dxos/functions";
48
49
  var open_default = defineFunction2({
49
50
  key: "dxos.org/function/markdown/open",
50
51
  name: "Open",
@@ -58,7 +59,7 @@ var open_default = defineFunction2({
58
59
  content: Schema2.String
59
60
  }),
60
61
  handler: Effect2.fn(function* ({ data: { id } }) {
61
- const object = yield* DatabaseService.resolve(ArtifactId2.toDXN(id), Markdown_exports.Document);
62
+ const object = yield* Database.Service.resolve(ArtifactId2.toDXN(id), Markdown_exports.Document);
62
63
  const { content } = yield* Effect2.promise(() => object.content.load());
63
64
  return {
64
65
  content
@@ -70,8 +71,9 @@ var open_default = defineFunction2({
70
71
  import * as Effect3 from "effect/Effect";
71
72
  import * as Schema3 from "effect/Schema";
72
73
  import { ArtifactId as ArtifactId3, applyDiffs } from "@dxos/assistant";
74
+ import { Database as Database2 } from "@dxos/echo";
73
75
  import { createDocAccessor } from "@dxos/echo-db";
74
- import { DatabaseService as DatabaseService2, defineFunction as defineFunction3 } from "@dxos/functions";
76
+ import { defineFunction as defineFunction3 } from "@dxos/functions";
75
77
  import { trim } from "@dxos/util";
76
78
  var update_default = defineFunction3({
77
79
  key: "dxos.org/function/markdown/update",
@@ -89,7 +91,7 @@ var update_default = defineFunction3({
89
91
  }),
90
92
  outputSchema: Schema3.Void,
91
93
  handler: Effect3.fn(function* ({ data: { id, diffs } }) {
92
- const object = yield* DatabaseService2.resolve(ArtifactId3.toDXN(id), Markdown_exports.Document);
94
+ const object = yield* Database2.Service.resolve(ArtifactId3.toDXN(id), Markdown_exports.Document);
93
95
  const content = yield* Effect3.promise(() => object.content.load());
94
96
  const accessor = createDocAccessor(content, [
95
97
  "content"
@@ -148,4 +150,4 @@ export {
148
150
  MarkdownBlueprint,
149
151
  blueprint_definition_default
150
152
  };
151
- //# sourceMappingURL=chunk-HAIEWPU7.mjs.map
153
+ //# sourceMappingURL=chunk-C5KXP2ZE.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/blueprint-definition.ts", "../../../src/functions/create.ts", "../../../src/functions/open.ts", "../../../src/functions/update.ts", "../../../src/functions/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes } from '@dxos/app-framework';\nimport { Blueprint, Template } from '@dxos/blueprints';\nimport { type FunctionDefinition } from '@dxos/functions';\nimport { trim } from '@dxos/util';\n\nimport { MarkdownFunction } from '../functions';\n\nconst functions: FunctionDefinition[] = [MarkdownFunction.create, MarkdownFunction.open, MarkdownFunction.update];\n\nexport const MARKDOWN_BLUEPRINT_KEY = 'dxos.org/blueprint/markdown';\n\nexport const MarkdownBlueprint: Blueprint.Blueprint = Blueprint.make({\n key: MARKDOWN_BLUEPRINT_KEY,\n name: 'Markdown',\n tools: Blueprint.toolDefinitions({ functions }),\n instructions: Template.make({\n // TODO(wittjosiah): Move example to function input schema annotation.\n source: trim`\n {{! Markdown }}\n\n You can create, read and update markdown documents.\n When asked to edit or update documents return updates as a set of compact diff string pairs.\n For each diff, respond with the smallest possible matching span.\n \n Example:\n ${'```'}diff\n - \"There is a tyop in this sentence.\"\n + \"There is a typo in this sentence.\"\n - \"This id good.\"\n + \"This sentence is really good.\"\n ${'```'}\n `,\n }),\n});\n\nexport default () => [\n contributes(Capabilities.Functions, functions),\n contributes(Capabilities.BlueprintDefinition, MarkdownBlueprint),\n];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId } from '@dxos/assistant';\nimport { Obj } from '@dxos/echo';\nimport { defineFunction } from '@dxos/functions';\nimport { Collection } from '@dxos/schema';\n\nimport { Markdown } from '../types';\n\nexport default defineFunction({\n key: 'dxos.org/function/markdown/create',\n name: 'Create',\n description: 'Creates a new markdown document and adds it to the space.',\n inputSchema: Schema.Struct({\n name: Schema.String,\n content: Schema.String,\n }),\n outputSchema: Schema.Struct({\n id: ArtifactId,\n }),\n handler: Effect.fn(function* ({ data: { name, content } }) {\n const object = Markdown.make({ name, content });\n yield* Collection.add({ object });\n\n return {\n id: Obj.getDXN(object).toString(),\n };\n }),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId } from '@dxos/assistant';\nimport { Database } from '@dxos/echo';\nimport { defineFunction } from '@dxos/functions';\n\nimport { Markdown } from '../types';\n\nexport default defineFunction({\n key: 'dxos.org/function/markdown/open',\n name: 'Open',\n description: 'Opens and reads the contents of a new markdown document.',\n inputSchema: Schema.Struct({\n id: ArtifactId.annotations({\n description: 'The ID of the markdown document.',\n }),\n }),\n outputSchema: Schema.Struct({\n content: Schema.String,\n }),\n handler: Effect.fn(function* ({ data: { id } }) {\n const object = yield* Database.Service.resolve(ArtifactId.toDXN(id), Markdown.Document);\n const { content } = yield* Effect.promise(() => object.content.load());\n return {\n content,\n };\n }),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId, applyDiffs } from '@dxos/assistant';\nimport { Database } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-db';\nimport { defineFunction } from '@dxos/functions';\nimport { trim } from '@dxos/util';\n\nimport { Markdown } from '../types';\n\n// TODO(wittjosiah): Reconcile with ThreadAction.AddProposal.\nexport default defineFunction({\n key: 'dxos.org/function/markdown/update',\n name: 'Update',\n description: trim`\n Applies a set of diffs to the markdown document.\n `,\n inputSchema: Schema.Struct({\n id: ArtifactId.annotations({\n description: 'The ID of the markdown document.',\n }),\n diffs: Schema.Array(Schema.String).annotations({\n description: 'The diffs to apply to the document.',\n }),\n }),\n outputSchema: Schema.Void,\n handler: Effect.fn(function* ({ data: { id, diffs } }) {\n const object = yield* Database.Service.resolve(ArtifactId.toDXN(id), Markdown.Document);\n const content = yield* Effect.promise(() => object.content.load());\n const accessor = createDocAccessor(content, ['content']);\n applyDiffs(accessor, diffs);\n }),\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { default as create } from './create';\nimport { default as open } from './open';\nimport { default as update } from './update';\n\nexport const MarkdownFunction = {\n create,\n open,\n update,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "Blueprint", "Template", "trim", "Effect", "Schema", "ArtifactId", "Obj", "defineFunction", "Collection", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "String", "content", "outputSchema", "id", "ArtifactId", "handler", "fn", "data", "object", "Markdown", "make", "Collection", "add", "Obj", "getDXN", "toString", "Effect", "Schema", "ArtifactId", "Database", "defineFunction", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "id", "ArtifactId", "annotations", "outputSchema", "content", "String", "handler", "fn", "data", "object", "Database", "Service", "resolve", "toDXN", "Markdown", "Document", "promise", "load", "Effect", "Schema", "ArtifactId", "applyDiffs", "Database", "createDocAccessor", "defineFunction", "trim", "defineFunction", "key", "name", "description", "trim", "inputSchema", "Struct", "id", "ArtifactId", "annotations", "diffs", "Array", "String", "outputSchema", "Void", "handler", "fn", "data", "object", "Database", "Service", "resolve", "toDXN", "Markdown", "Document", "content", "promise", "load", "accessor", "createDocAccessor", "applyDiffs", "MarkdownFunction", "create", "open", "update", "functions", "MarkdownFunction", "create", "open", "update", "MARKDOWN_BLUEPRINT_KEY", "MarkdownBlueprint", "Blueprint", "make", "key", "name", "tools", "toolDefinitions", "instructions", "Template", "source", "trim", "contributes", "Capabilities", "Functions", "BlueprintDefinition"]
7
+ }
@@ -1,35 +1,94 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- MarkdownCapabilities
4
- } from "./chunk-GMMVSXQ6.mjs";
5
2
  import {
6
3
  setFallbackName
7
- } from "./chunk-PLZ7EVCT.mjs";
4
+ } from "./chunk-6F6FCTIA.mjs";
8
5
  import {
9
6
  Markdown_exports
10
- } from "./chunk-NGYJNQ6A.mjs";
7
+ } from "./chunk-YFRTKXTB.mjs";
11
8
  import {
12
9
  meta
13
10
  } from "./chunk-SHAMSMKQ.mjs";
14
11
 
15
- // src/components/MarkdownContainer.tsx
16
- import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
17
- import { Atom } from "@effect-atom/atom-react";
18
- import React6, { useMemo as useMemo7 } from "react";
19
- import { Capabilities as Capabilities2 } from "@dxos/app-framework";
20
- import { useAppGraph, useCapabilities as useCapabilities2 } from "@dxos/app-framework/react";
21
- import { Obj as Obj3 } from "@dxos/echo";
22
- import { getSpace as getSpace2 } from "@dxos/react-client/echo";
23
- import { StackItem } from "@dxos/react-ui-stack";
24
- import { Text as Text2 } from "@dxos/schema";
12
+ // src/hooks/useLinkQuery.ts
13
+ import * as Option from "effect/Option";
14
+ import { useCallback, useMemo } from "react";
15
+ import { Capabilities } from "@dxos/app-framework";
16
+ import { usePluginManager } from "@dxos/app-framework/react";
17
+ import { Filter, Obj, Query, Type } from "@dxos/echo";
18
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from "@dxos/echo/internal";
19
+ import { toLocalizedString, useTranslation } from "@dxos/react-ui";
20
+ import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
21
+ var useLinkQuery = (space) => {
22
+ const { t } = useTranslation();
23
+ const manager = usePluginManager();
24
+ const resolve = useCallback((typename) => manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {}, [
25
+ manager
26
+ ]);
27
+ const filter = useMemo(() => Filter.or(...(space?.db.schemaRegistry.query({
28
+ location: [
29
+ "database",
30
+ "runtime"
31
+ ]
32
+ }).runSync() ?? []).filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation).filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false))).map((schema) => Filter.typename(Type.getTypename(schema)))), [
33
+ space
34
+ ]);
35
+ const handleLinkQuery = useCallback(async (query) => {
36
+ const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
37
+ const results = await space?.db.query(Query.select(filter)).run();
38
+ const getLabel = (object) => {
39
+ const label = Obj.getLabel(object);
40
+ if (label) {
41
+ return label;
42
+ }
43
+ const type = Obj.getTypename(object);
44
+ const metadata = resolve(type);
45
+ return metadata.label?.(object) || [
46
+ "object name placeholder",
47
+ {
48
+ ns: type,
49
+ default: "New object"
50
+ }
51
+ ];
52
+ };
53
+ const items = results?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
54
+ const metadata = resolve(Obj.getTypename(object));
55
+ const label = toLocalizedString(getLabel(object), t);
56
+ return {
57
+ id: object.id,
58
+ label,
59
+ icon: metadata.icon,
60
+ onSelect: ({ view, head }) => {
61
+ const link = `[${label}](${Obj.getDXN(object)})`;
62
+ if (query?.startsWith("@")) {
63
+ insertAtLineStart(view, head, `!${link}
64
+ `);
65
+ } else {
66
+ insertAtCursor(view, head, `${link} `);
67
+ }
68
+ }
69
+ };
70
+ }) ?? [];
71
+ return [
72
+ {
73
+ id: "echo",
74
+ items
75
+ }
76
+ ];
77
+ }, [
78
+ space,
79
+ filter,
80
+ resolve
81
+ ]);
82
+ return handleLinkQuery;
83
+ };
25
84
 
26
85
  // src/hooks/useEditorMenuOptions.ts
27
- import { useCallback, useMemo, useRef } from "react";
28
- import { Domino, toLocalizedString, useTranslation } from "@dxos/react-ui";
86
+ import { useCallback as useCallback2, useMemo as useMemo2, useRef } from "react";
87
+ import { Domino, toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
29
88
  import { filterMenuGroups, formattingCommands, linkSlashCommands } from "@dxos/react-ui-editor";
30
89
  var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) => {
31
- const { t } = useTranslation(meta.id);
32
- const getMenu = useCallback(({ text, trigger }) => {
90
+ const { t } = useTranslation2(meta.id);
91
+ const getMenu = useCallback2(({ text, trigger }) => {
33
92
  switch (trigger) {
34
93
  case "@": {
35
94
  return onLinkQuery?.(text) ?? [];
@@ -40,7 +99,7 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
40
99
  formattingCommands,
41
100
  linkSlashCommands,
42
101
  ...slashCommandGroups ?? []
43
- ], (item) => text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
102
+ ], (item) => text ? toLocalizedString2(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
44
103
  }
45
104
  }
46
105
  }, [
@@ -48,7 +107,7 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
48
107
  onLinkQuery
49
108
  ]);
50
109
  const viewRef = useRef(editorView);
51
- return useMemo(() => {
110
+ return useMemo2(() => {
52
111
  const trigger = onLinkQuery ? [
53
112
  "/",
54
113
  "@"
@@ -72,14 +131,14 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
72
131
  };
73
132
 
74
133
  // src/hooks/useExtensions.tsx
75
- import React, { useMemo as useMemo2 } from "react";
134
+ import React, { useMemo as useMemo3 } from "react";
76
135
  import { createRoot } from "react-dom/client";
77
136
  import { LayoutAction, createIntent } from "@dxos/app-framework";
78
137
  import { useIntentDispatcher } from "@dxos/app-framework/react";
79
138
  import { debounceAndThrottle } from "@dxos/async";
80
- import { Obj } from "@dxos/echo";
139
+ import { Obj as Obj2 } from "@dxos/echo";
140
+ import { createDocAccessor } from "@dxos/echo-db";
81
141
  import { invariant } from "@dxos/invariant";
82
- import { createDocAccessor } from "@dxos/react-client/echo";
83
142
  import { getSpace } from "@dxos/react-client/echo";
84
143
  import { useIdentity } from "@dxos/react-client/halo";
85
144
  import { Icon, ThemeProvider } from "@dxos/react-ui";
@@ -93,12 +152,12 @@ var useExtensions = ({ id, object, settings, selectionManager, viewMode, editorS
93
152
  const identity = useIdentity();
94
153
  const space = getSpace(object);
95
154
  let target;
96
- if (Obj.instanceOf(Markdown_exports.Document, object)) {
155
+ if (Obj2.instanceOf(Markdown_exports.Document, object)) {
97
156
  target = object.content.target;
98
- } else if (Obj.instanceOf(Text.Text, object)) {
157
+ } else if (Obj2.instanceOf(Text.Text, object)) {
99
158
  target = object;
100
159
  }
101
- const baseExtensions = useMemo2(() => createBaseExtensions({
160
+ const baseExtensions = useMemo3(() => createBaseExtensions({
102
161
  id,
103
162
  object,
104
163
  settings,
@@ -120,7 +179,7 @@ var useExtensions = ({ id, object, settings, selectionManager, viewMode, editorS
120
179
  settings?.typewriter,
121
180
  selectionManager
122
181
  ]);
123
- return useMemo2(() => [
182
+ return useMemo3(() => [
124
183
  // TODO(burdon): Pass this in?
125
184
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
126
185
  target && createDataExtensions({
@@ -128,11 +187,11 @@ var useExtensions = ({ id, object, settings, selectionManager, viewMode, editorS
128
187
  text: createDocAccessor(target, [
129
188
  "content"
130
189
  ]),
131
- space,
190
+ messenger: space,
132
191
  identity
133
192
  }),
134
193
  // TODO(burdon): Reconcile with effect in parent.
135
- Obj.instanceOf(Markdown_exports.Document, object) && listener({
194
+ Obj2.instanceOf(Markdown_exports.Document, object) && listener({
136
195
  onChange: ({ text }) => {
137
196
  setFallbackName(object, text);
138
197
  }
@@ -171,7 +230,7 @@ var createBaseExtensions = ({ id, object, dispatch, settings, selectionManager,
171
230
  id2
172
231
  ],
173
232
  options: {
174
- pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id2
233
+ pivotId: object && Obj2.isObject(object) ? Obj2.getDXN(object).toString() : id2
175
234
  }
176
235
  }));
177
236
  }) : void 0
@@ -260,77 +319,6 @@ var renderRoot = (root, node) => {
260
319
  return root;
261
320
  };
262
321
 
263
- // src/hooks/useLinkQuery.ts
264
- import { useCallback as useCallback2, useMemo as useMemo3 } from "react";
265
- import { Capabilities } from "@dxos/app-framework";
266
- import { useCapabilities, usePluginManager } from "@dxos/app-framework/react";
267
- import { Filter, Obj as Obj2, Query, Type } from "@dxos/echo";
268
- import { ClientCapabilities } from "@dxos/plugin-client";
269
- import { SpaceCapabilities } from "@dxos/plugin-space";
270
- import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
271
- import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
272
- var useLinkQuery = (space) => {
273
- const { t } = useTranslation2();
274
- const manager = usePluginManager();
275
- const resolve = useCallback2((typename) => manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {}, [
276
- manager
277
- ]);
278
- const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
279
- const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
280
- const filter = useMemo3(() => Filter.or(...objectForms.map((form) => Filter.type(form.objectSchema)), ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema)))), [
281
- objectForms,
282
- schemaWhiteList
283
- ]);
284
- const handleLinkQuery = useCallback2(async (query) => {
285
- const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
286
- const results = await space?.db.query(Query.select(filter)).run();
287
- const getLabel = (object) => {
288
- const label = Obj2.getLabel(object);
289
- if (label) {
290
- return label;
291
- }
292
- const type = Obj2.getTypename(object);
293
- const metadata = resolve(type);
294
- return metadata.label?.(object) || [
295
- "object name placeholder",
296
- {
297
- ns: type,
298
- default: "New object"
299
- }
300
- ];
301
- };
302
- const items = results?.objects.filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
303
- const metadata = resolve(Obj2.getTypename(object));
304
- const label = toLocalizedString2(getLabel(object), t);
305
- return {
306
- id: object.id,
307
- label,
308
- icon: metadata.icon,
309
- onSelect: ({ view, head }) => {
310
- const link = `[${label}](${Obj2.getDXN(object)})`;
311
- if (query?.startsWith("@")) {
312
- insertAtLineStart(view, head, `!${link}
313
- `);
314
- } else {
315
- insertAtCursor(view, head, `${link} `);
316
- }
317
- }
318
- };
319
- }) ?? [];
320
- return [
321
- {
322
- id: "echo",
323
- items
324
- }
325
- ];
326
- }, [
327
- space,
328
- filter,
329
- resolve
330
- ]);
331
- return handleLinkQuery;
332
- };
333
-
334
322
  // src/hooks/useSelectCurrentThread.tsx
335
323
  import { EditorView as EditorView2 } from "@codemirror/view";
336
324
  import * as Schema from "effect/Schema";
@@ -407,9 +395,10 @@ import { isNonNullable } from "@dxos/util";
407
395
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
408
396
  import React2, { forwardRef, useEffect, useImperativeHandle, useMemo as useMemo5 } from "react";
409
397
  import { useDynamicRef, useThemeContext, useTranslation as useTranslation3 } from "@dxos/react-ui";
410
- import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, formattingListener, processEditorPayload, stackItemContentEditorClassNames, useTextEditor } from "@dxos/react-ui-editor";
398
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorSlots, formattingListener, processEditorPayload, stackItemContentEditorClassNames, useTextEditor } from "@dxos/react-ui-editor";
399
+ import { mx } from "@dxos/react-ui-theme";
411
400
  import { isTruthy as isTruthy2 } from "@dxos/util";
412
- var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ id, role, initialValue, editorStateStore, toolbarState, extensions, viewMode, scrollPastEnd, onFileUpload }, forwardedRef) => {
401
+ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ classNames, id, role, viewMode, initialValue, editorStateStore, toolbarState, extensions, scrollPastEnd, slots = editorSlots, onFileUpload }, forwardedRef) => {
413
402
  var _effect = _useSignals();
414
403
  try {
415
404
  const { t } = useTranslation3(meta.id);
@@ -437,12 +426,11 @@ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ id, role, initialValue
437
426
  }),
438
427
  createThemeExtensions({
439
428
  themeMode,
440
- slots: editorSlots,
429
+ slots,
441
430
  syntaxHighlighting: true
442
431
  }),
443
432
  createMarkdownExtensions(),
444
433
  formattingListener(() => toolbarStateRef.current),
445
- editorGutter,
446
434
  role !== "section" && onFileUpload && dropFile({
447
435
  // TODO(wittjosiah): Factor out to file uploader plugin.
448
436
  onDrop: async (view, { files }) => {
@@ -473,7 +461,7 @@ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ id, role, initialValue
473
461
  role: "none",
474
462
  ref: parentRef,
475
463
  "data-testid": "composer.markdownRoot",
476
- className: stackItemContentEditorClassNames(role),
464
+ className: mx(stackItemContentEditorClassNames(role), classNames),
477
465
  "data-popover-collision-boundary": true,
478
466
  ...focusAttributes
479
467
  });
@@ -667,7 +655,7 @@ MarkdownEditorRoot.displayName = "MarkdownEditor.Root";
667
655
  var MarkdownEditorContent2 = (props) => {
668
656
  var _effect = _useSignals4();
669
657
  try {
670
- const { id, extensions, editorView, setEditorView, toolbarState, viewMode, popoverMenu: { groupsRef, ...menuProps } } = useMarkdownEditorContext(MarkdownEditorContent2.displayName);
658
+ const { id, editorView, setEditorView, viewMode, toolbarState, extensions, popoverMenu: { groupsRef, ...menuProps } } = useMarkdownEditorContext(MarkdownEditorContent2.displayName);
671
659
  return /* @__PURE__ */ React5.createElement(EditorMenuProvider, {
672
660
  view: editorView,
673
661
  groups: groupsRef.current,
@@ -675,9 +663,9 @@ var MarkdownEditorContent2 = (props) => {
675
663
  }, /* @__PURE__ */ React5.createElement(MarkdownEditorContent, {
676
664
  ...props,
677
665
  id,
678
- extensions,
679
- toolbarState,
680
666
  viewMode,
667
+ toolbarState,
668
+ extensions,
681
669
  ref: setEditorView
682
670
  }));
683
671
  } finally {
@@ -718,7 +706,7 @@ var PreviewBlock = ({ el, link }) => {
718
706
  try {
719
707
  const client = useClient();
720
708
  const dxn = DXN.parse(link.ref);
721
- const subject = client.graph.ref(dxn).target;
709
+ const subject = client.graph.makeRef(dxn).target;
722
710
  const data = useMemo6(() => ({
723
711
  subject
724
712
  }), [
@@ -740,89 +728,8 @@ var MarkdownEditor = {
740
728
  Blocks: MarkdownEditorBlocks
741
729
  };
742
730
 
743
- // src/components/MarkdownContainer.tsx
744
- var MarkdownContainer = ({ id, role, object, settings, extensionProviders, ...props }) => {
745
- var _effect = _useSignals5();
746
- try {
747
- const space = getSpace2(object);
748
- const isDocument = Obj3.instanceOf(Markdown_exports.Document, object);
749
- const isText = Obj3.instanceOf(Text2.Text, object);
750
- const attendableId = isDocument ? Obj3.getDXN(object).toString() : void 0;
751
- const otherExtensionProviders = useCapabilities2(MarkdownCapabilities.Extensions);
752
- const extensions = useMemo7(() => {
753
- if (!Obj3.instanceOf(Markdown_exports.Document, object)) {
754
- return [];
755
- }
756
- return [
757
- ...otherExtensionProviders ?? [],
758
- ...extensionProviders ?? []
759
- ].flat().reduce((acc, provider) => {
760
- const extension = typeof provider === "function" ? provider({
761
- document: object
762
- }) : provider;
763
- if (extension) {
764
- acc.push(extension);
765
- }
766
- return acc;
767
- }, []);
768
- }, [
769
- extensionProviders,
770
- otherExtensionProviders,
771
- object
772
- ]);
773
- const { graph } = useAppGraph();
774
- const customActions = useMemo7(() => {
775
- return Atom.make((get) => {
776
- const actions = get(graph.actions(id));
777
- const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
778
- const edges = nodes.map((node) => ({
779
- source: "root",
780
- target: node.id
781
- }));
782
- return {
783
- nodes,
784
- edges
785
- };
786
- });
787
- }, [
788
- graph
789
- ]);
790
- const [upload] = useCapabilities2(Capabilities2.FileUploader);
791
- const handleFileUpload = useMemo7(() => {
792
- if (!space || !upload) {
793
- return void 0;
794
- }
795
- return async (file) => upload(space, file);
796
- }, [
797
- space,
798
- upload
799
- ]);
800
- const handleLinkQuery = useLinkQuery(space);
801
- return /* @__PURE__ */ React6.createElement(StackItem.Content, {
802
- toolbar: settings.toolbar
803
- }, /* @__PURE__ */ React6.createElement(MarkdownEditor.Root, {
804
- id: attendableId ?? id,
805
- object,
806
- extensions,
807
- onFileUpload: handleFileUpload,
808
- onLinkQuery: handleLinkQuery,
809
- ...props
810
- }, settings.toolbar && /* @__PURE__ */ React6.createElement(MarkdownEditor.Toolbar, {
811
- id: attendableId ?? id,
812
- role,
813
- customActions
814
- }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Content, {
815
- initialValue: isDocument ? object.content?.target?.content : isText ? object.content : object.text,
816
- scrollPastEnd: role === "article"
817
- }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Blocks, null)));
818
- } finally {
819
- _effect.f();
820
- }
821
- };
822
- var MarkdownContainer_default = MarkdownContainer;
823
-
824
731
  export {
825
- MarkdownContainer,
826
- MarkdownContainer_default
732
+ useLinkQuery,
733
+ MarkdownEditor
827
734
  };
828
- //# sourceMappingURL=chunk-CT7CFX5G.mjs.map
735
+ //# sourceMappingURL=chunk-FR6RW6DH.mjs.map