@dxos/react-ui-editor 0.3.10 → 0.3.11-main.00a28cb

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 (222) hide show
  1. package/dist/lib/browser/index.mjs +1724 -1105
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +24 -13
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +15 -19
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +6 -3
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/{hooks/automerge → components/TextEditor}/automerge.stories.d.ts +6 -2
  11. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/TextEditor/comments.stories.d.ts +26 -0
  14. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -0
  15. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  16. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  17. package/dist/types/src/{hooks/yjs → components/TextEditor}/yjs.stories.d.ts +1 -1
  18. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -0
  19. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  20. package/dist/types/src/extensions/automerge/automerge.d.ts +9 -0
  21. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -0
  22. package/dist/types/src/extensions/automerge/cursor.d.ts +5 -0
  23. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -0
  24. package/dist/types/src/extensions/automerge/defs.d.ts +26 -0
  25. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -0
  26. package/dist/types/src/extensions/automerge/index.d.ts +3 -0
  27. package/dist/types/src/extensions/automerge/index.d.ts.map +1 -0
  28. package/dist/types/src/extensions/automerge/semaphore.d.ts +14 -0
  29. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -0
  30. package/dist/types/src/extensions/automerge/update-automerge.d.ts +5 -0
  31. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -0
  32. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +5 -0
  33. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -0
  34. package/dist/types/src/extensions/awareness.d.ts +46 -0
  35. package/dist/types/src/extensions/awareness.d.ts.map +1 -0
  36. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  37. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  38. package/dist/types/src/extensions/code.d.ts.map +1 -0
  39. package/dist/types/src/extensions/comments.d.ts +59 -0
  40. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  41. package/dist/types/src/extensions/cursor.d.ts +25 -0
  42. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  43. package/dist/types/src/extensions/hr.d.ts +2 -0
  44. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  45. package/dist/types/src/extensions/image.d.ts.map +1 -0
  46. package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +7 -3
  47. package/dist/types/src/extensions/index.d.ts.map +1 -0
  48. package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
  49. package/dist/types/src/extensions/link.d.ts.map +1 -0
  50. package/dist/types/src/extensions/listener.d.ts +10 -0
  51. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  52. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  53. package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -1
  54. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  55. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  56. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  57. package/dist/types/src/extensions/outliner.d.ts +4 -0
  58. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  59. package/dist/types/src/extensions/table.d.ts.map +1 -0
  60. package/dist/types/src/extensions/tasklist.d.ts +7 -0
  61. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  62. package/dist/types/src/{components/TextEditor/extensions/demo.d.ts → extensions/typewriter.d.ts} +2 -3
  63. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  64. package/dist/types/src/extensions/yjs/cursor.d.ts +4 -0
  65. package/dist/types/src/extensions/yjs/cursor.d.ts.map +1 -0
  66. package/dist/types/src/extensions/yjs/index.d.ts +2 -0
  67. package/dist/types/src/extensions/yjs/index.d.ts.map +1 -0
  68. package/dist/types/src/extensions/yjs/yjs.d.ts +4 -0
  69. package/dist/types/src/extensions/yjs/yjs.d.ts.map +1 -0
  70. package/dist/types/src/extensions/yjs/yjs.test.d.ts +2 -0
  71. package/dist/types/src/extensions/yjs/yjs.test.d.ts.map +1 -0
  72. package/dist/types/src/hooks/automerge.d.ts +3 -0
  73. package/dist/types/src/hooks/automerge.d.ts.map +1 -0
  74. package/dist/types/src/hooks/awareness-provider.d.ts +28 -0
  75. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -0
  76. package/dist/types/src/hooks/index.d.ts +3 -1
  77. package/dist/types/src/hooks/index.d.ts.map +1 -1
  78. package/dist/types/src/hooks/useTextModel.d.ts +15 -11
  79. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  80. package/dist/types/src/hooks/{yjs/space-provider.d.ts → yjs.d.ts} +8 -8
  81. package/dist/types/src/hooks/yjs.d.ts.map +1 -0
  82. package/dist/types/src/index.d.ts +6 -0
  83. package/dist/types/src/index.d.ts.map +1 -1
  84. package/dist/types/src/styles/cursors.d.ts.map +1 -0
  85. package/dist/types/src/styles/index.d.ts +1 -0
  86. package/dist/types/src/styles/index.d.ts.map +1 -1
  87. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  88. package/dist/types/src/styles/tokens.d.ts +1 -0
  89. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  90. package/dist/types/src/testing/replicator.d.ts +2 -2
  91. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  92. package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +5 -13
  93. package/dist/types/src/themes/default.d.ts.map +1 -0
  94. package/dist/types/src/themes/index.d.ts.map +1 -0
  95. package/dist/types/src/util.d.ts +5 -0
  96. package/dist/types/src/util.d.ts.map +1 -0
  97. package/package.json +28 -22
  98. package/src/components/TextEditor/MarkdownEditor.stories.tsx +150 -87
  99. package/src/components/TextEditor/TextEditor.stories.tsx +14 -35
  100. package/src/components/TextEditor/TextEditor.tsx +87 -79
  101. package/src/{hooks/automerge → components/TextEditor}/automerge.stories.tsx +67 -8
  102. package/src/components/TextEditor/codemirror.stories.ts +3 -2
  103. package/src/components/TextEditor/comments.stories.tsx +355 -0
  104. package/src/components/TextEditor/index.ts +0 -3
  105. package/src/{hooks/yjs → components/TextEditor}/yjs.stories.tsx +1 -1
  106. package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +18 -17
  107. package/src/extensions/automerge/automerge.ts +92 -0
  108. package/src/extensions/automerge/cursor.ts +52 -0
  109. package/src/extensions/automerge/defs.ts +66 -0
  110. package/src/extensions/automerge/index.ts +6 -0
  111. package/src/{hooks/automerge/PatchSemaphore.ts → extensions/automerge/semaphore.ts} +26 -25
  112. package/src/{hooks/automerge/translation/codemirror-to-automerge.ts → extensions/automerge/update-automerge.ts} +6 -7
  113. package/src/{hooks/automerge/translation/automerge-to-codemirror.ts → extensions/automerge/update-codemirror.ts} +14 -11
  114. package/src/extensions/awareness.ts +310 -0
  115. package/src/extensions/code.ts +104 -0
  116. package/src/extensions/comments.ts +408 -0
  117. package/src/extensions/cursor.ts +46 -0
  118. package/src/extensions/hr.ts +72 -0
  119. package/src/extensions/image.ts +87 -0
  120. package/src/{components/TextEditor/extensions → extensions}/index.ts +7 -3
  121. package/src/{components/TextEditor/extensions → extensions}/link.ts +116 -62
  122. package/src/extensions/listener.ts +35 -0
  123. package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +4 -16
  124. package/src/extensions/outliner.ts +12 -0
  125. package/src/{components/TextEditor/extensions → extensions}/table.ts +23 -4
  126. package/src/extensions/tasklist.ts +96 -0
  127. package/src/{components/TextEditor/extensions/demo.ts → extensions/typewriter.ts} +2 -3
  128. package/src/extensions/yjs/cursor.ts +22 -0
  129. package/src/extensions/yjs/index.ts +5 -0
  130. package/src/extensions/yjs/yjs.test.ts +35 -0
  131. package/src/extensions/yjs/yjs.ts +16 -0
  132. package/src/hooks/automerge.ts +52 -0
  133. package/src/hooks/awareness-provider.ts +120 -0
  134. package/src/hooks/index.ts +4 -1
  135. package/src/hooks/useTextModel.ts +40 -79
  136. package/src/hooks/{yjs/space-provider.ts → yjs.ts} +49 -19
  137. package/src/index.ts +6 -0
  138. package/src/styles/index.ts +1 -0
  139. package/src/styles/markdown.ts +0 -2
  140. package/src/styles/tokens.ts +3 -0
  141. package/src/testing/replicator.ts +10 -16
  142. package/src/themes/default.ts +275 -0
  143. package/src/util.ts +18 -0
  144. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
  145. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
  146. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  147. package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
  148. package/dist/types/src/components/TextEditor/extensions/comments.d.ts +0 -18
  149. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
  150. package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +0 -1
  151. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts +0 -10
  152. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +0 -1
  153. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts +0 -24
  154. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts.map +0 -1
  155. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  156. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  157. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
  158. package/dist/types/src/components/TextEditor/extensions/listener.d.ts +0 -9
  159. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
  160. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  161. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
  162. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  163. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  164. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  165. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +0 -3
  166. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
  167. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
  168. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
  169. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
  170. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
  171. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts +0 -19
  172. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +0 -1
  173. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +0 -1
  174. package/dist/types/src/hooks/automerge/handle.d.ts +0 -9
  175. package/dist/types/src/hooks/automerge/handle.d.ts.map +0 -1
  176. package/dist/types/src/hooks/automerge/index.d.ts +0 -3
  177. package/dist/types/src/hooks/automerge/index.d.ts.map +0 -1
  178. package/dist/types/src/hooks/automerge/plugin.d.ts +0 -26
  179. package/dist/types/src/hooks/automerge/plugin.d.ts.map +0 -1
  180. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts +0 -5
  181. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts.map +0 -1
  182. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts +0 -6
  183. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts.map +0 -1
  184. package/dist/types/src/hooks/automerge/translation/index.d.ts +0 -3
  185. package/dist/types/src/hooks/automerge/translation/index.d.ts.map +0 -1
  186. package/dist/types/src/hooks/yjs/cursors.d.ts.map +0 -1
  187. package/dist/types/src/hooks/yjs/index.d.ts +0 -3
  188. package/dist/types/src/hooks/yjs/index.d.ts.map +0 -1
  189. package/dist/types/src/hooks/yjs/space-provider.d.ts.map +0 -1
  190. package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +0 -1
  191. package/src/components/TextEditor/extensions/code.ts +0 -99
  192. package/src/components/TextEditor/extensions/comments.ts +0 -173
  193. package/src/components/TextEditor/extensions/experimental.tsx +0 -114
  194. package/src/components/TextEditor/extensions/highlight.ts +0 -128
  195. package/src/components/TextEditor/extensions/image.ts +0 -67
  196. package/src/components/TextEditor/extensions/listener.ts +0 -23
  197. package/src/components/TextEditor/extensions/tasklist.ts +0 -121
  198. package/src/components/TextEditor/extensions/tooltip.tsx +0 -61
  199. package/src/components/TextEditor/themes/default.ts +0 -279
  200. package/src/hooks/automerge/handle.ts +0 -14
  201. package/src/hooks/automerge/index.ts +0 -6
  202. package/src/hooks/automerge/plugin.ts +0 -134
  203. package/src/hooks/automerge/translation/index.ts +0 -6
  204. package/src/hooks/yjs/index.ts +0 -6
  205. /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
  206. /package/dist/types/src/{components/TextEditor/extensions → extensions}/basic.d.ts +0 -0
  207. /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
  208. /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
  209. /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
  210. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +0 -0
  211. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
  212. /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
  213. /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
  214. /package/dist/types/src/{hooks/yjs → styles}/cursors.d.ts +0 -0
  215. /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
  216. /package/src/{components/TextEditor/extensions → extensions}/basic.ts +0 -0
  217. /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
  218. /package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +0 -0
  219. /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
  220. /package/src/{components/TextEditor/extensions → extensions}/mention.ts +0 -0
  221. /package/src/{hooks/yjs → styles}/cursors.ts +0 -0
  222. /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/extensions/autocomplete.ts", "../../../src/components/TextEditor/extensions/basic.ts", "../../../src/components/TextEditor/extensions/blast.ts", "../../../src/components/TextEditor/extensions/code.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/components/TextEditor/extensions/demo.ts", "../../../src/components/TextEditor/extensions/comments.ts", "../../../src/components/TextEditor/extensions/highlight.ts", "../../../src/components/TextEditor/extensions/image.ts", "../../../src/components/TextEditor/extensions/link.ts", "../../../src/components/TextEditor/extensions/listener.ts", "../../../src/components/TextEditor/extensions/markdown/bundle.ts", "../../../src/components/TextEditor/extensions/markdown/highlight.ts", "../../../src/components/TextEditor/extensions/mention.ts", "../../../src/components/TextEditor/extensions/table.ts", "../../../src/components/TextEditor/extensions/tasklist.ts", "../../../src/components/TextEditor/extensions/tooltip.tsx", "../../../src/components/TextEditor/themes/default.ts", "../../../src/components/TextEditor/TextEditor.tsx", "../../../src/hooks/useTextModel.ts", "../../../src/hooks/automerge/plugin.ts", "../../../src/hooks/automerge/PatchSemaphore.ts", "../../../src/hooks/automerge/translation/automerge-to-codemirror.ts", "../../../src/hooks/automerge/translation/codemirror-to-automerge.ts", "../../../src/hooks/yjs/cursors.ts", "../../../src/hooks/yjs/space-provider.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';\nexport { Doc, YText, YXmlFragment } from '@dxos/text-model';\n\nexport * from './components';\nexport * from './hooks';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\nexport { type Extension } from '@codemirror/state';\n\nexport * from './extensions';\nexport * from './themes';\n\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// https://codemirror.net/examples/autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.Completion\n\nimport {\n autocompletion,\n completionKeymap,\n type Completion,\n type CompletionContext,\n type CompletionResult,\n} from '@codemirror/autocomplete';\nimport { keymap } from '@codemirror/view';\n\nexport type AutocompleteResult = Completion;\n\nexport type AutocompleteOptions = {\n onSearch: (text: string) => Completion[];\n};\n\n/**\n * Autocomplete extension.\n */\nexport const autocomplete = ({ onSearch }: AutocompleteOptions) => {\n return [\n // https://codemirror.net/docs/ref/#view.keymap\n // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322\n keymap.of(completionKeymap),\n\n // https://codemirror.net/examples/autocompletion\n // https://codemirror.net/docs/ref/#autocomplete.autocompletion\n autocompletion({\n // TODO(burdon): Set custom keymap.\n // defaultKeymap: false,\n\n // Don't start unless key press.\n activateOnTyping: false,\n\n // TODO(burdon): Option to create new page?\n // TODO(burdon): Optional decoration via addToOptions\n override: [\n (context: CompletionContext): CompletionResult | null => {\n const match = context.matchBefore(/\\w*/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n return {\n from: match.from,\n options: onSearch(match.text.toLowerCase()),\n };\n },\n ],\n }),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { drawSelection, EditorView, placeholder } from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nexport type BasicBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const basicBundle = ({ readonly, themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>\n [\n EditorView.lineWrapping,\n\n // TODO(burdon): Compare with minimalSetup.\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n drawSelection(),\n _placeholder && placeholder(_placeholder),\n\n // TODO(burdon): Is this required?\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n", "//\n// Copyright 2023 DXOS.org\n// Based on a demo by Joel Besada and Kushagra Gour.\n// https://twitter.com/JoelBesada/status/670343885655293952\n// https://github.com/chinchang/code-blast-codemirror/blob/master/code-blast.js\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { invariant } from '@dxos/invariant';\n\nexport type BlastOptions = {\n effect?: number;\n maxParticles: number;\n particleGravity: number;\n particleAlphaFadeout: number;\n particleSize: { min: number; max: number };\n particleNumRange: { min: number; max: number };\n particleVelocityRange: { x: [number, number]; y: [number, number] };\n particleShrinkRate: number;\n shakeIntensity: number;\n color?: () => number[];\n};\n\nexport const defaultOptions: BlastOptions = {\n effect: 2,\n maxParticles: 200,\n particleGravity: 0.08,\n particleAlphaFadeout: 0.996,\n particleSize: { min: 2, max: 8 },\n particleNumRange: { min: 5, max: 10 },\n particleVelocityRange: { x: [-1, 1], y: [-3.5, -1.5] },\n particleShrinkRate: 0.95,\n shakeIntensity: 5,\n};\n\nexport const blast = (options: Partial<BlastOptions> = defaultOptions): Extension => {\n let blaster: Blaster | undefined;\n let last = 0;\n\n const getPoint = (view: EditorView, pos: number) => {\n const { left: x = 0, top: y = 0 } = view.coordsForChar(pos) ?? {};\n const element = document.elementFromPoint(x, y);\n\n const { offsetLeft: left = 0, offsetTop: top = 0 } = view.scrollDOM.parentElement ?? {};\n const point = { x: x - left, y: y - top };\n\n return { element, point };\n };\n\n return [\n // Cursor moved.\n EditorView.updateListener.of((update) => {\n // NOTE: The MarkdownEditor may recreated the EditorView.\n if (blaster?.node !== update.view.scrollDOM) {\n if (blaster) {\n blaster.destroy();\n }\n\n blaster = new Blaster(\n update.view.scrollDOM,\n defaultsDeep(\n {\n particleGravity: 0.2,\n particleShrinkRate: 0.995,\n color: () => [100 + Math.random() * 100, 0, 0],\n },\n options,\n defaultOptions,\n ),\n );\n blaster.initialize();\n blaster.start(); // TODO(burdon): Stop/clean-up.\n } else {\n blaster.resize();\n }\n\n const current = update.state.selection.main.head;\n if (current !== last) {\n last = current;\n // TODO(burdon): Null if end of line.\n const { element, point } = getPoint(update.view, current - 1);\n if (element && point) {\n blaster.spawn({ element, point });\n }\n }\n }),\n\n keymap.of([\n {\n any: (_, event) => {\n if (blaster) {\n if (event.key === 'Enter' && event.shiftKey) {\n blaster.shake({ time: 0.8 });\n return true;\n }\n }\n\n return false;\n },\n },\n ]),\n ];\n};\n\n//\n// Blaster (no CM deps).\n//\n\nclass Blaster {\n private readonly _effect: Effect;\n\n _canvas: HTMLCanvasElement | undefined;\n _ctx: CanvasRenderingContext2D | undefined | null;\n\n _running = false;\n _lastTime: number | undefined;\n _shakeTime = 0;\n _shakeTimeMax = 0;\n\n _particles: Particle[] = [];\n _particlePointer = 0;\n\n _lastPoint = { x: 0, y: 0 };\n\n constructor(private readonly _node: HTMLElement, private readonly _options: BlastOptions) {\n this._effect = this._options.effect === 1 ? new Effect1(_options) : new Effect2(_options);\n }\n\n get node() {\n return this._node;\n }\n\n initialize() {\n // console.log('initialize');\n invariant(!this._canvas && !this._ctx);\n\n this._canvas = document.createElement('canvas');\n this._canvas.id = 'code-blast-canvas';\n this._canvas.style.position = 'absolute';\n this._canvas.style.zIndex = '0';\n this._canvas.style.pointerEvents = 'none';\n // this._canvas.style.border = '2px dashed red';\n\n this._ctx = this._canvas.getContext('2d');\n\n const parent = this._node.parentElement?.parentElement;\n parent?.appendChild(this._canvas);\n\n this.resize();\n }\n\n destroy() {\n this.stop();\n // console.log('destroy');\n if (this._canvas) {\n this._canvas.remove();\n this._canvas = undefined;\n this._ctx = undefined;\n }\n }\n\n resize() {\n if (this._node.parentElement && this._canvas) {\n const { offsetLeft: x, offsetTop: y, offsetWidth: width, offsetHeight: height } = this._node.parentElement;\n this._canvas.style.top = `${y}px`;\n this._canvas.style.left = `${x}px`;\n this._canvas.width = width;\n this._canvas.height = height;\n }\n }\n\n start() {\n // console.log('start');\n invariant(this._canvas && this._ctx);\n this._running = true;\n this.loop();\n }\n\n stop() {\n // console.log('stop');\n this._running = false;\n this._node.style.transform = 'translate(0px, 0px)';\n }\n\n loop() {\n if (!this._running || !this._canvas || !this._ctx) {\n return;\n }\n\n this._ctx.clearRect(0, 0, this._canvas.width ?? 0, this._canvas.height ?? 0);\n\n // Calculate the delta from the previous frame.\n const now = new Date().getTime();\n this._lastTime ??= now;\n const dt = (now - this._lastTime) / 1000;\n this._lastTime = now;\n\n if (this._shakeTime > 0) {\n this._shakeTime -= dt;\n const magnitude = (this._shakeTime / this._shakeTimeMax) * this._options.shakeIntensity;\n const shakeX = random(-magnitude, magnitude);\n const shakeY = random(-magnitude, magnitude);\n this._node!.style.transform = `translate(${shakeX}px,${shakeY}px)`;\n }\n\n this.drawParticles();\n\n requestAnimationFrame(this.loop.bind(this));\n }\n\n shake = throttle<{ time: number }>(({ time }) => {\n this._shakeTime = this._shakeTimeMax || time;\n this._shakeTimeMax = time;\n }, 100);\n\n spawn = throttle<{ element: Element; point: { x: number; y: number } }>(({ element, point }) => {\n const color = getRGBComponents(element, this._options.color);\n const numParticles = random(this._options.particleNumRange.min, this._options.particleNumRange.max);\n const dir = this._lastPoint.x === point.x ? 0 : this._lastPoint.x < point.x ? 1 : -1;\n this._lastPoint = point;\n for (let i = numParticles; i--; i > 0) {\n this._particles[this._particlePointer] = this._effect.create(point.x - dir * 16, point.y, color);\n this._particlePointer = (this._particlePointer + 1) % this._options.maxParticles;\n }\n }, 100);\n\n drawParticles() {\n for (let i = this._particles.length; i--; i > 0) {\n const particle = this._particles[i];\n if (!particle) {\n continue;\n }\n\n if (particle.alpha < 0.01 || particle.size <= 0.5) {\n continue;\n }\n\n this._effect.update(this._ctx!, particle);\n }\n }\n}\n\n//\n// Effects\n//\n\ntype Particle = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n color: (string | number)[];\n alpha: number;\n theta?: number;\n drag?: number;\n wander?: number;\n};\n\nabstract class Effect {\n constructor(protected readonly _options: BlastOptions) {}\n abstract create(x: number, y: number, color: Particle['color']): Particle;\n abstract update(ctx: CanvasRenderingContext2D, particle: Particle): void;\n}\n\nclass Effect1 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.fillRect(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, particle.size);\n }\n}\n\n/**\n * Based on Soulwire's demo.\n * http://codepen.io/soulwire/pen/foktm\n */\nclass Effect2 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n theta: (random(0, 360) * Math.PI) / 180,\n drag: 0.92,\n wander: 0.15,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.vx *= particle.drag!;\n particle.vy *= particle.drag!;\n particle.theta! += random(-0.5, 0.5);\n particle.vx += Math.sin(particle.theta!) * 0.1;\n particle.vy += Math.cos(particle.theta!) * 0.1;\n particle.size *= this._options.particleShrinkRate;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.beginPath();\n ctx.arc(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n}\n\n//\n// Utils\n//\n\nfunction throttle<T>(callback: (arg: T) => void, limit: number): (arg: T) => void {\n let wait = false;\n return function (...args: any[]) {\n if (!wait) {\n // @ts-ignore\n callback.apply(this, args);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n };\n}\n\nconst getRGBComponents = (node: Element, color: BlastOptions['color']): Particle['color'] => {\n if (typeof color === 'function') {\n return color();\n }\n\n const bgColor = getComputedStyle(node).color;\n if (bgColor) {\n const x = bgColor.match(/(\\d+), (\\d+), (\\d+)/)?.slice(1);\n if (x) {\n return x;\n }\n }\n\n return [50, 50, 50];\n};\n\nconst random = (min: number, max: number) => {\n if (!max) {\n max = min;\n min = 0;\n }\n\n return min + ~~(Math.random() * (max - min + 1));\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Range } from '@codemirror/state';\nimport {\n ViewPlugin,\n type DecorationSet,\n EditorView,\n type ViewUpdate,\n Decoration,\n type BlockInfo,\n} from '@codemirror/view';\nimport get from 'lodash.get';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { tokens } from '../../../styles';\n\nconst CODE_REGEX = /```[\\s\\S]*?```/gs;\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-code-block': {\n display: 'block',\n paddingInline: '4px !important',\n },\n '&light .cm-code-block': {\n background: get(tokens, 'extend.colors.neutral.50'),\n },\n '&dark .cm-code-block': {\n background: get(tokens, 'extend.colors.neutral.850'),\n },\n '& .cm-code-block-first': {\n paddingTop: '4px !important',\n borderTopLeftRadius: '4px',\n borderTopRightRadius: '4px',\n },\n '& .cm-code-block-last': {\n paddingBottom: '4px !important',\n borderBottomLeftRadius: '4px',\n borderBottomRightRadius: '4px',\n },\n});\n\nconst getLineRange = (lines: BlockInfo[], from: number, to: number) => {\n const start = lines.findIndex((line) => line.from >= from);\n const end = lines.findIndex((line) => line.to >= to);\n return [start, end];\n};\n\nexport const code = () => {\n const getDecorations = (view: EditorView) => {\n const decorations: Range<Decoration>[] = [];\n if (view.state.readOnly) {\n const text = view.state.doc.sliceString(0);\n const matches = text.matchAll(CODE_REGEX);\n const blocks = view.viewportLineBlocks;\n for (const match of matches) {\n const range = getLineRange(blocks, match.index!, match.index! + match[0].length);\n for (let i = range[0]; i <= range[1]; i++) {\n const block = blocks[i];\n decorations.push(\n Decoration.line({\n class: mx(\n 'cm-code-block',\n i === range[0] && 'cm-code-block-first',\n i === range[1] && 'cm-code-block-last',\n ),\n }).range(block.from),\n );\n }\n }\n }\n\n return Decoration.set(decorations);\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = getDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = getDecorations(update.view);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n// TODO(burdon): Better way to align vertically than negative margin? Font-specific?\n// https://tailwindcss.com/docs/font-weight\nexport const headings: Record<HeadingLevel, string[]> = {\n 1: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl', '-ml-[10px]'],\n 2: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl', '-ml-[8px]'],\n 3: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl', '-ml-[7px]'],\n 4: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-xl', '-ml-[6px]'],\n 5: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-lg', '-ml-[5px]'],\n 6: ['mbs-4 mbe-2 font-medium text-inherit no-underline', '-ml-[4px]'],\n};\n\nexport const heading = (level: HeadingLevel, readonly?: boolean) => {\n const [style, offset] = headings[level];\n return mx(style, readonly && offset);\n};\n\nexport const text = 'text-neutral-800 dark:text-neutral-200';\nexport const light = 'text-neutral-200 dark:text-neutral-800';\n\nexport const mark = mx('!font-normal !no-underline !text-inherit opacity-40', light);\n\nexport const paragraph = 'mlb-1';\n\nexport const bold = 'font-bold';\nexport const italic = 'italic';\nexport const strikethrough = 'line-through';\n\nexport const code = 'font-mono !no-underline text-neutral-700 dark:text-neutral-300';\nexport const codeMark = 'font-mono text-primary-500';\nexport const codeBlock = 'mlb-2 font-mono bg-neutral-500/10 p-3 rounded';\n\nexport const inlineUrl = mx(code, 'px-1');\n\n// TODO(burdon): Replace with widget.\nexport const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);\n\n// TODO(burdon): Replace with widget.\nexport const horizontalRule =\n 'flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-200 dark:border-neutral-800';\n\n// TODO(thure): Tailwind was not seeing `[&>li:before]:content-[\"•\"]` as a utility class, but it would work if instead of `\"•\"` it was `\"X\"`… why?\nexport const unorderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2';\nexport const orderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1';\n\nexport const listItem = 'contents before:[counter-increment:section]';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { StyleSpec } from 'style-mod';\n\nimport { tailwindConfig, type TailwindConfig } from '@dxos/react-ui-theme';\n\nexport type ThemeStyles = {\n [selector: string]: StyleSpec;\n};\n\n// TODO(thure): Why export the whole theme? Can this be done differently?\nexport const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\n\n// TODO(burdon): Review https://github.com/sergeche/codemirror-movie?tab=readme-ov-file\n\nexport type DemoOptions = {\n delay?: number;\n items?: string[];\n};\n\nconst defaultItems = ['hello world!', 'this is a test.', 'this is [DXOS](https://dxos.org)'];\n\n/**\n * Demo script.\n * Configurable plugin that let's user cycle through pre-configured input script.\n */\nexport const demo = ({ delay = 75, items = defaultItems }: DemoOptions = {}): Extension => {\n let t: any;\n let idx = 0;\n\n return [\n keymap.of([\n {\n // Reset.\n key: \"alt-meta-'\",\n run: (view) => {\n clearTimeout(t);\n idx = 0;\n return true;\n },\n },\n {\n // Next prompt.\n // TODO(burdon): Press 1-9 to select prompt?\n key: \"shift-meta-'\",\n run: (view) => {\n clearTimeout(t);\n // TODO(burdon): Add space if needed.\n const text = items[idx++];\n if (idx === items?.length) {\n idx = 0;\n }\n\n let i = 0;\n const insert = (d = 0) => {\n t = setTimeout(() => {\n const pos = view.state.selection.main.head;\n view.dispatch({\n changes: { from: pos, insert: text[i++] },\n selection: { anchor: pos + 1 },\n });\n\n if (i < text.length) {\n insert(Math.random() * delay * (text[i] === ' ' ? 2 : 1));\n }\n }, d);\n };\n\n insert();\n return true;\n },\n },\n ]),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport {\n keymap,\n type DecorationSet,\n type Rect,\n type ViewUpdate,\n Decoration,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n WidgetType,\n} from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-bookmark': {\n cursor: 'pointer',\n margin: '4px',\n padding: '4px',\n backgroundColor: 'yellow',\n },\n '& .cm-bookmark-selected': {\n backgroundColor: 'orange',\n },\n});\n\nclass BookmarkWidget extends WidgetType {\n constructor(private readonly _pos: number, private readonly _id: string, private readonly _handleClick: () => void) {\n super();\n invariant(this._id);\n }\n\n override eq(other: BookmarkWidget) {\n return this._id === other._id;\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-bookmark';\n span.textContent = '§';\n span.onclick = () => this._handleClick();\n return span;\n }\n}\n\ntype CommentsInfo = {\n active?: string;\n items?: { id: string; pos: number; location: Rect | null }[];\n};\n\nexport type CommentsOptions = {\n key?: string;\n onCreate?: (from: number, to: number) => string | void;\n onUpdate?: (info: CommentsInfo) => void;\n};\n\n// https://www.markdownguide.org/extended-syntax/#footnotes\n// TODO(burdon): Record span in automerge model?\n// TODO(burdon): Extended markdown: https://www.markdownguide.org/extended-syntax\nexport const comments = (options: CommentsOptions = {}): Extension => {\n let active: string | undefined;\n\n const bookmarkMatcher = new MatchDecorator({\n regexp: /\\[\\^(\\w+)\\]/g,\n decoration: (match, view, pos) => {\n const id = match[1];\n return Decoration.replace({\n id,\n widget: new BookmarkWidget(pos, id, () => handleUpdate({ active: id })),\n });\n },\n });\n\n const bookmarks = ViewPlugin.fromClass(\n class {\n bookmarks: DecorationSet;\n constructor(view: EditorView) {\n this.bookmarks = bookmarkMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.bookmarks = bookmarkMatcher.updateDeco(update, this.bookmarks);\n }\n },\n {\n decorations: (instance) => instance.bookmarks,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.bookmarks || Decoration.none;\n }),\n },\n );\n\n const handleUpdate = debounce((data: CommentsInfo) => {\n options.onUpdate?.(data);\n }, 200);\n\n return [\n keymap.of([\n {\n key: options?.key ?? 'shift-meta-c',\n run: (view) => {\n // Insert footnote.\n const { from, to, head } = view.state.selection.main;\n const id = options.onCreate?.(from, to);\n if (id) {\n const tag = `[^${id}]`;\n // TODO(burdon): Add selection.\n view.dispatch({\n changes: { from: head, insert: tag },\n selection: { anchor: head + tag.length },\n });\n\n return true;\n }\n\n return false;\n },\n },\n ]),\n\n bookmarks,\n\n // Monitor cursor movement.\n EditorView.updateListener.of((update) => {\n active = undefined;\n if (!options.onUpdate) {\n return;\n }\n\n const { view, state } = update;\n const pos = state.selection.main.head;\n\n const decorations: { from: number; to: number; value: Decoration }[] = [];\n const rangeSet = view.plugin(bookmarks)?.bookmarks;\n let closest = Infinity;\n // TODO(burdon): Handle multiple visible ranges in large documents.\n const { from, to } = /* view.visibleRanges?.[0] ?? */ { from: 0, to: state.doc.length };\n rangeSet?.between(from, to, (from, to, value) => {\n decorations.push({ from, to, value });\n const d = Math.min(Math.abs(pos - from), Math.abs(pos - to));\n if (d < closest) {\n // TODO(burdon): Update class of selected.\n active = value.spec.id;\n closest = d;\n }\n });\n\n if (decorations.length) {\n handleUpdate({\n active,\n items: decorations.map(\n ({\n from,\n value: {\n spec: { id },\n },\n }) => ({ id: id as string, pos: from, location: view.coordsAtPos(from) }),\n ),\n });\n }\n }),\n\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView } from '@codemirror/view';\nimport sortBy from 'lodash.sortby';\nimport { useEffect } from 'react';\n\nimport { type DocumentRange } from '../../../hooks';\n\n// TODO(burdon): Detect click, or cursor proximity.\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-highlight': {\n backgroundColor: 'yellow', // TODO(burdon): Reconcile with tailwind theme.\n },\n '& .cm-highlight::before': {\n content: ']',\n },\n '& .cm-highlight-active': {\n backgroundColor: 'lime',\n },\n});\n\nconst marks = {\n highlight: Decoration.mark({ class: 'cm-highlight' }),\n HighlightActive: Decoration.mark({ class: 'cm-highlight-active' }),\n};\n\ntype HighlightRange = DocumentRange & { active?: boolean };\n\n// TODO(burdon): Make configurable to support multiple layers.\nconst setHighlights = StateEffect.define<HighlightRange[]>();\n\n/**\n * Update field set.\n */\n// TODO(burdon): Reconcile range from data model, vs. in-markdown characters.\nexport const useHighlights = (view: EditorView | undefined, ranges: HighlightRange[] = []) => {\n useEffect(() => {\n view?.dispatch({\n effects: setHighlights.of(ranges),\n });\n }, [view, ranges]);\n};\n\n/**\n * State field that tracks highlight ranges.\n */\nexport const highlightStateField = StateField.define<HighlightRange[]>({\n create: () => [],\n update: (threads, tr) => {\n for (const effect of tr.effects) {\n if (effect.is(setHighlights)) {\n return effect.value;\n }\n }\n\n return threads;\n },\n});\n\n/**\n * Decorate ranges.\n */\n// TODO(burdon): Pass in field to make reusable (e.g., comments, search).\nexport const highlightDecorations = EditorView.decorations.compute([highlightStateField], (state) => {\n const selectionRanges = state.field(highlightStateField);\n const decorations =\n sortBy(selectionRanges ?? [], (selection) => selection.from)?.flatMap((selection) => {\n const range = { from: selection.from, to: selection.to + 1 };\n if (selection.to > selection.from) {\n if (selection.active) {\n return marks.HighlightActive.range(range.from, range.to);\n } else {\n return marks.highlight.range(range.from, range.to);\n }\n } else {\n return [];\n }\n }) ?? [];\n\n return Decoration.set(decorations);\n});\n\n// TODO(burdon): Use current range to create comment.\n// TODO(burdon): Allow/prevent overlapping?\n\n/**\n * Track cursor entering and existing ranges.\n */\nconst listener = (options: HighlightOptions) => {\n return EditorView.updateListener.of((update) => {\n const { view, state } = update;\n const { /* from, to, */ head } = state.selection.main;\n const ranges = state.field(highlightStateField);\n\n // TODO(burdon): Modify range if editing.\n // console.log('::::', update);\n\n // Set active.\n let mod = false;\n const newRanges = ranges.map((range) => {\n const active = head >= range.from && head <= range.to;\n if (active !== range.active) {\n mod = true;\n return { ...range, active };\n } else {\n return range;\n }\n });\n\n if (mod) {\n view.dispatch({ effects: setHighlights.of(newRanges) });\n options?.onChange?.(newRanges.find((range) => range.active)?.id);\n }\n });\n};\n\nexport type HighlightOptions = {\n onChange?: (active?: string) => {};\n};\n\nexport const highlight = (options: HighlightOptions = {}): Extension => {\n return [highlightStateField, highlightDecorations, listener(options), styles];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\nexport type ImageOptions = {};\n\nexport const image = (options: ImageOptions = {}): Extension => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, options),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, options),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nconst update = (state: EditorState, options: ImageOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'Image') {\n const urlNode = node.node.getChild('URL');\n if (urlNode) {\n const hide = state.readOnly || cursor < node.from || cursor > node.to;\n const url = state.sliceDoc(urlNode.from, urlNode.to);\n builder.add(\n hide ? node.from : node.to,\n node.to,\n Decoration.replace({\n widget: new ImageWidget(url),\n }),\n );\n }\n }\n },\n });\n\n return builder.finish();\n};\n\nclass ImageWidget extends WidgetType {\n constructor(readonly _url: string) {\n super();\n }\n\n override eq(other: WidgetType) {\n return this._url === (other as any as ImageWidget)?._url;\n }\n\n toDOM(view: EditorView) {\n const img = document.createElement('img');\n img.setAttribute('src', this._url);\n img.setAttribute('class', 'cm-image');\n return img;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\nexport type LinkOptions = {\n link?: boolean;\n onRender?: (el: Element, url: string) => void;\n};\n\n/**\n * Creates a state field to replace AST elements with a hyperlink widget.\n * https://codemirror.net/docs/ref/#state.StateField\n */\nexport const link = (options: LinkOptions = {}): Extension => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, options),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, options),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nclass LinkButton extends WidgetType {\n constructor(\n private readonly _pos: number,\n private readonly _url: string,\n private readonly _onAttach: LinkOptions['onRender'],\n ) {\n super();\n }\n\n override eq(other: LinkButton) {\n return this._pos === other._pos && this._url === other._url;\n }\n\n toDOM(view: EditorView) {\n const el = document.createElement('span');\n this._onAttach!(el, this._url);\n return el;\n }\n}\n\nclass LinkText extends WidgetType {\n constructor(private readonly _pos: number, private readonly _text: string, private readonly _url?: string) {\n super();\n }\n\n override eq(other: LinkText) {\n return this._pos === other._pos && this._url === other._url;\n }\n\n toDOM(view: EditorView) {\n const link = document.createElement('a');\n link.setAttribute('class', 'cm-link');\n link.textContent = this._text;\n if (this._url) {\n link.setAttribute('rel', 'noreferrer');\n link.setAttribute('target', '_blank');\n link.href = this._url;\n } else {\n link.onclick = () => {\n view.dispatch({\n selection: {\n anchor: this._pos,\n },\n });\n };\n }\n\n return link;\n }\n}\n\n/**\n * Range sets provide a data structure that can hold a collection of tagged,\n * possibly overlapping ranges in such a way that they can efficiently be mapped though document changes.\n * https://codemirror.net/docs/ref/#state\n */\nconst update = (state: EditorState, options: LinkOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n if (node.name === 'Link') {\n const marks = node.node.getChildren('LinkMark');\n const text = marks.length >= 2 ? state.sliceDoc(marks[0].to, marks[1].from) : '';\n const urlNode = node.node.getChild('URL');\n const url = urlNode ? state.sliceDoc(urlNode.from, urlNode.to) : '';\n if (!url) {\n return false;\n }\n\n if (state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new LinkText(node.from, text, options.link ? url : undefined),\n }),\n );\n }\n\n if (options.onRender) {\n builder.add(\n node.to,\n node.to,\n Decoration.replace({\n widget: new LinkButton(node.from, url, options.onRender),\n }),\n );\n }\n\n return false;\n }\n },\n });\n\n return builder.finish();\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { StateField } from '@codemirror/state';\n\nexport type ListenerOptions = { onChange: (text: string) => void };\n\n/**\n * Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799\n */\nexport const listener = ({ onChange }: ListenerOptions) => {\n return StateField.define({\n create: () => null,\n update: (_value, transaction) => {\n if (transaction.docChanged && onChange) {\n onChange(transaction.newDoc.toString());\n }\n\n return null;\n },\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { history, historyKeymap, indentWithTab, standardKeymap } from '@codemirror/commands';\nimport { markdownLanguage, markdown } from '@codemirror/lang-markdown';\nimport { bracketMatching, defaultHighlightStyle, indentOnInput, syntaxHighlighting } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { searchKeymap } from '@codemirror/search';\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport {\n crosshairCursor,\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nimport { markdownHighlightStyle, markdownTagsExtensions } from './highlight';\n\nexport type MarkdownBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\n/**\n * Markdown bundle.\n * Refs:\n * https://github.com/codemirror/basic-setup\n * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts#L50\n * https://codemirror.net/docs/community\n * https://codemirror.net/docs/ref/#codemirror.basicSetup\n */\n// TODO(burdon): Add Composer here: https://codemirror.net/docs/community\nexport const markdownBundle = ({\n readonly,\n themeMode,\n placeholder: _placeholder,\n}: MarkdownBundleOptions): Extension[] => {\n return [\n EditorState.allowMultipleSelections.of(true),\n EditorState.tabSize.of(2),\n EditorView.lineWrapping,\n\n customKeymap(),\n\n bracketMatching(),\n closeBrackets(),\n crosshairCursor(),\n dropCursor(),\n drawSelection(),\n highlightActiveLine(),\n history(),\n indentOnInput(),\n _placeholder && placeholder(_placeholder),\n\n // Main extension.\n // https://github.com/codemirror/lang-markdown\n // https://codemirror.net/5/mode/markdown/index.html (demo).\n markdown({\n // GRM by default (vs strict CommonMark):\n // Table, TaskList, Strikethrough, and Autolink.\n // NOTE: This extends the parser; it doesn't affect rendering.\n // https://github.github.com/gfm\n // https://github.com/lezer-parser/markdown?tab=readme-ov-file#github-flavored-markdown\n base: markdownLanguage,\n\n // Languages for syntax highlighting fenced code blocks.\n codeLanguages: languages,\n\n // Parser extensions.\n extensions: [\n // GFM provided by default.\n markdownTagsExtensions,\n ],\n }),\n\n // https://github.com/codemirror/theme-one-dark\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n\n // Custom styles.\n syntaxHighlighting(markdownHighlightStyle(readonly)),\n ].filter(Boolean) as Extension[];\n};\n\n// https://codemirror.net/docs/ref/#view.keymap\nconst customKeymap = () =>\n keymap.of([\n // https://codemirror.net/docs/ref/#commands.indentWithTab\n indentWithTab,\n // https://codemirror.net/docs/ref/#commands.standardKeymap\n ...standardKeymap,\n // https://codemirror.net/docs/ref/#commands.historyKeymap\n ...historyKeymap,\n // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap\n ...closeBracketsKeymap,\n // https://codemirror.net/docs/ref/#search.searchKeymap\n ...searchKeymap,\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle } from '@codemirror/language';\nimport { tags, styleTags, Tag } from '@lezer/highlight';\nimport { type MarkdownConfig, Table } from '@lezer/markdown';\nimport get from 'lodash.get';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport {\n blockquote,\n bold,\n code,\n codeMark,\n heading,\n horizontalRule,\n inlineUrl,\n italic,\n mark,\n strikethrough,\n tokens,\n} from '../../../../styles';\n\n/**\n * Custom tags defined and processed by the GFM lezer extension.\n * https://github.com/lezer-parser/markdown\n * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts\n */\nexport const markdownTags = {\n Blockquote: Tag.define(),\n CodeMark: Tag.define(),\n CodeText: Tag.define(),\n EmphasisMark: Tag.define(),\n HeaderMark: Tag.define(),\n HorizontalRule: Tag.define(),\n InlineCode: Tag.define(),\n LinkLabel: Tag.define(),\n LinkReference: Tag.define(),\n ListMark: Tag.define(),\n QuoteMark: Tag.define(),\n URL: Tag.define(),\n\n // Custom.\n TableCell: Tag.define(),\n};\n\n// TODO(burdon): Customize table parser (make all content monospace).\n// https://github.com/lezer-parser/markdown/blob/main/src/extension.ts\nTable.defineNodes?.forEach((node: any) => {\n switch (node?.name) {\n case 'TableCell': {\n node.style = markdownTags.TableCell;\n break;\n }\n }\n});\n\nexport const markdownTagsExtensions: MarkdownConfig[] = [\n Table,\n {\n props: [styleTags(markdownTags)],\n },\n];\n\n/**\n * Styling based on `lezer` parser tags.\n * https://codemirror.net/examples/styling\n * https://github.com/lezer-parser/highlight\n * https://github.com/lezer-parser/highlight/blob/main/src/highlight.ts#L427\n * https://lezer.codemirror.net/docs/ref/#highlight.tags (list of tags)\n *\n * Examples:\n * - https://github.com/codemirror/language/blob/main/src/highlight.ts#L194\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts#L115\n */\nexport const markdownHighlightStyle = (readonly?: boolean) => {\n return HighlightStyle.define(\n [\n {\n tag: [\n tags.keyword,\n tags.name,\n tags.deleted,\n tags.character,\n tags.propertyName,\n tags.macroName,\n tags.color,\n tags.constant(tags.name),\n tags.standard(tags.name),\n tags.definition(tags.name),\n tags.separator,\n tags.typeName,\n tags.className,\n tags.number,\n tags.changed,\n tags.annotation,\n tags.modifier,\n tags.self,\n tags.namespace,\n tags.operator,\n tags.operatorKeyword,\n tags.escape,\n tags.regexp,\n tags.special(tags.string),\n tags.meta,\n tags.comment,\n tags.atom,\n tags.bool,\n tags.special(tags.variableName),\n tags.processingInstruction,\n tags.string,\n tags.inserted,\n tags.invalid,\n ],\n color: 'inherit !important',\n },\n\n // Markdown marks.\n {\n tag: [\n tags.meta,\n tags.processingInstruction,\n markdownTags.LinkLabel,\n markdownTags.LinkReference,\n markdownTags.ListMark,\n ],\n class: mark,\n },\n\n // Markdown marks.\n {\n tag: [markdownTags.CodeMark, markdownTags.HeaderMark, markdownTags.QuoteMark, markdownTags.EmphasisMark],\n class: readonly ? 'hidden' : mark,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: readonly ? 'hidden' : codeMark,\n },\n\n {\n tag: [tags.monospace],\n class: 'font-mono',\n },\n\n // Headings.\n { tag: tags.heading1, class: heading(1, readonly) },\n { tag: tags.heading2, class: heading(2, readonly) },\n { tag: tags.heading3, class: heading(3, readonly) },\n { tag: tags.heading4, class: heading(4, readonly) },\n { tag: tags.heading5, class: heading(5, readonly) },\n { tag: tags.heading6, class: heading(6, readonly) },\n\n // Emphasis.\n { tag: tags.emphasis, class: italic },\n { tag: tags.strong, class: bold },\n { tag: tags.strikethrough, class: strikethrough },\n\n // Naked URLs.\n {\n tag: [markdownTags.URL],\n class: inlineUrl,\n },\n\n // NOTE: The `markdown` extension configures extensions for `lezer` to parse markdown tokens (incl. below).\n // However, since `codeLanguages` is also defined, the `lezer` will not parse fenced code blocks,\n // when a language is specified. In this case, the syntax highlighting extensions will colorize\n // the code, but all other CSS properties will be inherited.\n // IMPORTANT: Therefore, the fenced code block will use the base editor font.\n {\n tag: [markdownTags.CodeText, markdownTags.InlineCode],\n class: code,\n },\n\n {\n tag: [markdownTags.QuoteMark],\n class: blockquote,\n },\n\n // TODO(burdon): Replace with extension.\n {\n tag: [markdownTags.HorizontalRule],\n class: mx(horizontalRule, readonly && '-indent-[100rem]'),\n },\n\n // TODO(burdon): Only if being edited.\n {\n tag: [markdownTags.TableCell],\n class: 'font-mono',\n },\n\n // Main content, paragraphs, etc.\n // {\n // tag: [tags.content],\n // fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n // },\n ],\n {\n scope: markdownLanguage,\n all: { fontFamily: get(tokens, 'fontFamily.body', []).join(',') },\n },\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { autocompletion, type CompletionContext, type CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\n\nexport type MentionOptions = {\n onSearch: (text: string) => string[];\n};\n\nexport const mention = ({ onSearch }: MentionOptions): Extension => {\n return autocompletion({\n closeOnBlur: false, // For debugging.\n override: [\n (context: CompletionContext): CompletionResult | null => {\n const match = context.matchBefore(/@(\\w+)?/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n console.log(match);\n\n return {\n from: match.from,\n options: onSearch(match.text.slice(1).toLowerCase()).map((value) => ({ label: `@${value}` })),\n };\n },\n ],\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type RangeSet, RangeSetBuilder, StateField, type Transaction } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\n// TODO(burdon): Snippet to create basic table.\n// https://codemirror.net/docs/ref/#autocomplete.snippet\n\nexport type TableOptions = {};\n\n/**\n * GFM tables.\n * https://github.github.com/gfm/#tables-extension\n */\nexport const table = (options: TableOptions = {}) => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, options),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, options),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\ntype Table = {\n from: number;\n to: number;\n header?: string[];\n rows?: string[][];\n};\n\nconst update = (state: EditorState, options: TableOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n const tables: Table[] = [];\n const getTable = () => tables[tables.length - 1];\n const getRow = () => {\n const table = getTable();\n return table.rows?.[table.rows.length - 1];\n };\n\n // Parse table.\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n switch (node.name) {\n case 'Table': {\n tables.push({ from: node.from, to: node.to });\n break;\n }\n case 'TableHeader': {\n getTable().header = [];\n break;\n }\n case 'TableRow': {\n (getTable().rows ??= []).push([]);\n break;\n }\n case 'TableCell': {\n const row = getRow();\n if (row) {\n row.push(state.sliceDoc(node.from, node.to));\n } else {\n getTable().header?.push(state.sliceDoc(node.from, node.to));\n }\n break;\n }\n }\n },\n });\n\n tables.forEach((table) => {\n const hide = state.readOnly || cursor < table.from || cursor > table.to;\n hide && builder.add(table.from, table.to, Decoration.replace({ widget: new TableWidget(table) }));\n builder.add(table.from, table.to, Decoration.mark({ class: 'cm-table' }));\n });\n\n return builder.finish();\n};\n\nclass TableWidget extends WidgetType {\n constructor(readonly _table: Table) {\n super();\n }\n\n override eq(other: WidgetType) {\n return this._table.from === (other as any as TableWidget)?._table?.from;\n }\n\n toDOM(view: EditorView) {\n const table = document.createElement('table');\n\n {\n const header = table.appendChild(document.createElement('thead'));\n const tr = header.appendChild(document.createElement('tr'));\n this._table.header?.forEach((cell) => {\n const th = document.createElement('th');\n th.setAttribute('class', 'cm-table-head');\n tr.appendChild(th).textContent = cell;\n });\n }\n\n {\n const body = table.appendChild(document.createElement('tbody'));\n this._table.rows?.forEach((row) => {\n const tr = body.appendChild(document.createElement('tr'));\n row.forEach((cell) => {\n const td = document.createElement('td');\n td.setAttribute('class', 'cm-table-cell');\n tr.appendChild(td).textContent = cell;\n });\n });\n }\n\n return table;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n EditorView,\n Decoration,\n WidgetType,\n MatchDecorator,\n ViewPlugin,\n type DecorationSet,\n type ViewUpdate,\n} from '@codemirror/view';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-task-item': {\n paddingLeft: '4px',\n paddingRight: '8px',\n },\n});\n\nclass CheckboxWidget extends WidgetType {\n constructor(\n private readonly _pos: number,\n private _checked: boolean,\n private readonly _indent: number,\n private readonly _onCheck?: (check: boolean) => void,\n ) {\n super();\n }\n\n override eq(other: CheckboxWidget) {\n return this._pos === other._pos && this._checked === other._checked && this._indent === other._indent;\n }\n\n toDOM(view: EditorView) {\n const wrap = document.createElement('span');\n wrap.className = 'cm-task-item';\n wrap.setAttribute('aria-hidden', 'true');\n wrap.style.setProperty('margin-left', this._indent * 24 + 'px');\n\n const input = wrap.appendChild(document.createElement('input'));\n input.type = 'checkbox';\n input.checked = this._checked;\n if (!this._onCheck) {\n input.setAttribute('disabled', 'true');\n }\n if (this._onCheck) {\n input.onchange = (event: Event) => {\n this._onCheck?.((event.target as any).checked);\n return true;\n };\n }\n\n return wrap;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nexport type TasklistOptions = {};\n\nexport const tasklist = (options: TasklistOptions = {}) => {\n // TODO(burdon): Matcher isn't as precise as syntax tree.\n // Allows for indents to be greater than AST would allow.\n const taskMatcher = new MatchDecorator({\n regexp: /^(\\s*)- \\[([ xX])\\]\\s/g,\n decoration: (match, view, pos) => {\n const indent = Math.floor(match[1].length / 2);\n const checked = match[2] === 'x' || match[2] === 'X';\n return Decoration.replace({\n widget: new CheckboxWidget(\n pos,\n checked,\n indent,\n view.state.readOnly\n ? undefined\n : (checked) => {\n const idx = pos + match[0].indexOf('[') + 1;\n view.dispatch({\n changes: {\n from: idx,\n to: idx + 1,\n insert: checked ? 'x' : ' ',\n },\n // TODO(burdon): Restore cursor position? More useful to move to end of line (can indent).\n selection: {\n anchor: idx + 3,\n },\n });\n },\n ),\n });\n },\n });\n\n const tasks = ViewPlugin.fromClass(\n class {\n tasks: DecorationSet;\n constructor(view: EditorView) {\n this.tasks = taskMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.tasks = taskMatcher.updateDeco(update, this.tasks);\n }\n },\n {\n decorations: (value) => value.tasks,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.tasks || Decoration.none;\n }),\n },\n );\n\n return [tasks, styles];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { hoverTooltip } from '@codemirror/view';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\nconst markdownLinkRegexp = /\\[([^\\]]+)]\\(([^)]+)\\)/;\n\nexport type TooltipOptions = {\n onHover: (el: Element, url: string) => void;\n regexp?: RegExp;\n};\n\n/**\n * https://codemirror.net/examples/tooltip\n * https://codemirror.net/docs/ref/#view.hoverTooltip\n * https://github.com/codemirror/view/blob/main/src/tooltip.ts\n */\nexport const tooltip = ({ onHover, regexp = markdownLinkRegexp }: TooltipOptions): Extension =>\n hoverTooltip((view, pos) => {\n const { from, text } = view.state.doc.lineAt(pos);\n const p = pos - from;\n\n let idx = 0;\n let match;\n do {\n match = text.substring(idx).match(regexp);\n if (!match) {\n match = undefined;\n break;\n }\n\n idx = text.indexOf(match[0]);\n if (p >= idx && p < idx + match[0].length) {\n break;\n }\n\n idx += match[0].length;\n } while (true);\n\n if (!match) {\n return null;\n }\n\n const [, , url] = match ?? [];\n\n return {\n pos: idx + from,\n end: idx + from + match[0].length,\n above: true,\n create: () => {\n const el = document.createElement('div');\n el.className = tooltipContent({}, 'pli-2 plb-1');\n onHover(el, url);\n return { dom: el, offset: { x: 0, y: 12 } };\n },\n };\n });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport { type StyleSpec } from 'style-mod';\n\nimport { tokens } from '../../../styles';\n\n/**\n * Minimal styles.\n * https://codemirror.net/examples/styling\n *\n * Examples:\n * - https://github.com/codemirror/view/blob/main/src/theme.ts\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts\n *\n * NOTE: Use one of '&', '&light', and '&dark' prefix to scope instance.\n * NOTE: `light` and `dark` selectors are preprocessed by CodeMirror and can only be in the base theme.\n */\nexport const defaultTheme: {\n [selector: string]: StyleSpec;\n} = {\n //\n // Main layout:\n // <div class=\".cm-editor .cm-focused\">\n // <div class=\".cm-scroller\">\n // <div class=\".cm-content\" role=\"textbox\" contenteditable=\"true\">\n // <div class=\".cm-line\" />\n // </div>\n // </div>\n // </div>\n //\n '&': {},\n '&.cm-focused': {\n outline: 'none',\n },\n '& .cm-scroller': {\n overflow: 'visible',\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n '& .cm-content': {\n padding: 0,\n // Base font size (otherwise defined by HTML tag, which might be different for storybook).\n fontSize: '16px',\n },\n '&light .cm-content': {\n color: get(tokens, 'extend.colors.neutral.900', 'black'),\n caretColor: 'black',\n },\n '&dark .cm-content': {\n color: get(tokens, 'extend.colors.neutral.100', 'white'),\n caretColor: 'white',\n },\n\n //\n // Cursor\n //\n '&light .cm-cursor, &light .cm-dropCursor': {\n borderLeft: '2px solid black',\n },\n '&dark .cm-cursor, &dark .cm-dropCursor': {\n borderLeft: '2px solid white',\n },\n '& .cm-placeholder': {\n fontWeight: 100,\n },\n\n //\n // line\n //\n '& .cm-line': {\n paddingInline: 0,\n },\n '& .cm-line *': {},\n '& .cm-activeLine': {\n backgroundColor: 'transparent',\n },\n\n //\n // selection\n //\n\n '&light .cm-selectionBackground, &light.cm-focused .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.150', '#00ffff'),\n },\n '&dark .cm-selectionBackground, &dark.cm-focused .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.850', '#00ffff'),\n },\n '&light .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.250', '#00ffff') + '44',\n },\n '&dark .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.600', '#00ffff') + '44',\n },\n\n //\n // collaboration\n // TODO(burdon): Review classnames (YJS dependent?)\n //\n\n '&light .cm-ySelection, &light .cm-yLineSelection': {\n mixBlendMode: 'multiply',\n },\n '&dark .cm-ySelection, &dark .cm-yLineSelection': {\n mixBlendMode: 'screen',\n },\n\n '& .cm-ySelectionInfo': {\n padding: '2px 4px',\n marginBlockStart: '-4px',\n },\n '& .cm-ySelection, & .cm-selectionMatch': {\n paddingBlockStart: '.15em',\n paddingBlockEnd: '.15em',\n },\n '& .cm-ySelectionCaret': {\n display: 'inline-block',\n insetBlockStart: '.1em',\n blockSize: '1.4em',\n verticalAlign: 'top',\n },\n '& .cm-yLineSelection': {\n margin: 0,\n },\n\n //\n // link\n //\n '& .cm-link': {\n color: get(tokens, 'extend.colors.primary.500'),\n textDecorationLine: 'underline',\n textDecorationThickness: '1px',\n textUnderlineOffset: '2px',\n borderRadius: '.125rem',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n\n //\n // tooltip\n //\n '& .cm-tooltip': {\n border: 'none',\n },\n '& .cm-tooltip-below': {},\n\n //\n // autocomplete\n //\n '& .cm-tooltip-autocomplete': {\n marginTop: '4px',\n marginLeft: '-3px',\n },\n '& .cm-tooltip-autocomplete ul li': {},\n '& .cm-tooltip-autocomplete ul li[aria-selected]': {},\n '& .cm-completionIcon': {\n display: 'none',\n },\n '& .cm-completionLabel': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-completionMatchedText': {\n textDecoration: 'none',\n },\n\n //\n // widgets\n //\n '& .cm-widgetBuffer': {\n display: 'none',\n height: 0,\n },\n\n //\n // table\n //\n '& .cm-table *': {\n fontFamily: `${get(tokens, 'fontFamily.mono', []).join(',')} !important`,\n textDecoration: 'none !important',\n },\n '& .cm-table-head': {\n padding: '2px 16px 2px 0px',\n borderBottom: `1px solid ${get(tokens, 'extend.colors.neutral.500')}`,\n fontWeight: 100,\n textAlign: 'left',\n color: get(tokens, 'extend.colors.neutral.500'),\n },\n '& .cm-table-cell': {\n padding: '2px 16px 2px 0px',\n },\n\n //\n // image\n //\n '& .cm-image': {\n margin: '0.5rem 0',\n },\n\n //\n // font size\n // TODO(thure): This appears to be the best or only way to set selection caret heights, but it's far more verbose than it needs to be.\n //\n ...Object.keys(get(tokens, 'extend.fontSize', {})).reduce((acc: Record<string, any>, fontSize) => {\n const height = get(tokens, ['extend', 'fontSize', fontSize, 1, 'lineHeight']);\n\n acc[`& .text-${fontSize} + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-ySelection + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-widgetBuffer + .cm-ySelectionCaret`] = { height };\n return acc;\n }, {}),\n\n /**\n * Panels\n * https://github.com/codemirror/search/blob/main/src/search.ts#L745\n *\n * Find/replace panel.\n * <div class=\"cm-announced\">...</div>\n * <div class=\"cm-scroller\">...</div>\n * <div class=\"cm-panels cm-panels-bottom\">\n * <div class=\"cm-search cm-panel\">\n * <input class=\"cm-textfield\" />\n * <button class=\"cm-button\">...</button>\n * <label><input type=\"checkbox\" />...</label>\n * </div>\n * </div\n */\n '& .cm-panels': {\n border: `1px solid ${get(tokens, 'extend.colors.neutral.200')}`,\n borderBottom: 'none',\n },\n '& .cm-panel': {\n background: get(tokens, 'extend.colors.neutral.50'),\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-button': {\n margin: '4px',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n background: get(tokens, 'extend.colors.neutral.100'),\n border: 'none',\n },\n\n '& .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.100'),\n },\n '& .cm-searchMatch.cm-searchMatch-selected': {\n backgroundColor: get(tokens, 'extend.colors.primary.100'),\n },\n};\n\nexport const textTheme: {\n [selector: string]: StyleSpec;\n} = {\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const markdownTheme: {\n [selector: string]: StyleSpec;\n} = {\n // NOTE: Must leave base font family as is (i.e., monospace) due to fenced code blocks.\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const codeTheme: {\n [selector: string]: StyleSpec;\n} = {\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { vim } from '@replit/codemirror-vim';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport React, {\n type ComponentProps,\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { getColorForValue, inputSurface, mx } from '@dxos/react-ui-theme';\n\nimport { basicBundle, markdownBundle } from './extensions';\nimport { defaultTheme, markdownTheme, textTheme } from './themes';\nimport { type EditorModel } from '../../hooks';\nimport { type ThemeStyles } from '../../styles';\n\nexport const EditorModes = ['default', 'vim'] as const;\nexport type EditorMode = (typeof EditorModes)[number];\n\nexport type CursorInfo = {\n from: number;\n to: number;\n line: number;\n lines: number;\n after?: string;\n};\n\nexport type TextEditorRef = {\n root: HTMLDivElement | null;\n state?: EditorState;\n view?: EditorView;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n editor?: {\n className?: string;\n placeholder?: string;\n spellCheck?: boolean;\n tabIndex?: number;\n theme?: ThemeStyles;\n };\n};\n\nexport type TextEditorProps = {\n model: EditorModel;\n readonly?: boolean;\n editorMode?: EditorMode;\n extensions?: Extension[];\n slots?: TextEditorSlots;\n};\n\n/**\n * Base text editor.\n * NOTE: Rather than adding properties, try to create extensions that can be reused.\n */\nexport const BaseTextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ model, readonly, editorMode, extensions = [], slots = defaultSlots }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n const [state, setState] = useState<EditorState>();\n const [view, setView] = useState<EditorView>();\n useImperativeHandle(forwardedRef, () => ({ root, state, view }), [view, state, root]);\n\n // TODO(burdon): Factor out?\n const { awareness, peer } = model;\n useEffect(() => {\n if (awareness && peer) {\n awareness.setLocalStateField('user', {\n name: peer.name ?? generateName(peer.id),\n color: getColorForValue({ value: peer.id, type: 'color' }),\n colorLight: getColorForValue({ value: peer.id, themeMode, type: 'highlight' }),\n });\n }\n }, [awareness, peer, themeMode]);\n\n // TODO(burdon): Get from model.\n // useHighlights(view, [\n // { id: 'c-1', from: 0, to: 20 },\n // { id: 'c-2', from: 100, to: 120 },\n // ]);\n\n useEffect(() => {\n if (!root) {\n return;\n }\n\n const state = EditorState.create({\n doc: model.text(),\n extensions: [\n readonly && EditorState.readOnly.of(readonly),\n\n // TODO(burdon): Factor out VIM mode?\n editorMode === 'vim' && vim(),\n\n // Theme.\n // TODO(burdon): Make optional.\n EditorView.baseTheme(defaultTheme),\n EditorView.theme(slots?.editor?.theme ?? {}),\n // TODO(burdon): themeMode doesn't change in storybooks.\n EditorView.darkTheme.of(themeMode === 'dark'),\n\n // Storage and replication.\n model.extension,\n\n // Custom.\n ...extensions,\n ].filter(Boolean) as Extension[],\n });\n\n // NOTE: This repaints the editor.\n // If the new state is derived from the old state, it will likely not be visible other than the cursor resetting.\n // Ideally this should not be hit except when changing between text objects.\n view?.destroy();\n setView(\n new EditorView({\n state,\n parent: root,\n // NOTE: Uncomment to spy on all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n // dispatch: (transaction, view) => {\n // view.update([transaction]);\n // },\n }),\n );\n setState(state);\n\n return () => {\n view?.destroy();\n setView(undefined);\n setState(undefined);\n };\n }, [root, model, themeMode, readonly, editorMode]);\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n case 'Enter': {\n view?.contentDOM.focus();\n break;\n }\n\n case 'Escape': {\n editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey) && root?.focus();\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n ref={setRoot}\n tabIndex={0}\n {...slots?.root}\n {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n onKeyUp={handleKeyUp}\n />\n );\n },\n);\n\nexport const TextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[basicBundle({ readonly, themeMode, placeholder: slots?.editor?.placeholder }), ...extensions]}\n slots={slots}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[markdownBundle({ readonly, themeMode, placeholder: slots?.editor?.placeholder }), ...extensions]}\n slots={slots}\n {...props}\n />\n );\n },\n);\n\nexport const defaultSlots: TextEditorSlots = {\n root: {\n className: mx('p-2', inputSurface),\n },\n};\n\nexport const defaultTextSlots: TextEditorSlots = {\n ...defaultSlots,\n editor: {\n theme: textTheme,\n },\n};\n\nexport const defaultMarkdownSlots: TextEditorSlots = {\n ...defaultSlots,\n editor: {\n theme: markdownTheme,\n },\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport get from 'lodash.get';\nimport { useEffect, useState } from 'react';\nimport { yCollab } from 'y-codemirror.next';\nimport type * as awarenessProtocol from 'y-protocols/awareness';\n\nimport { invariant } from '@dxos/invariant';\nimport {\n type DocAccessor,\n type Space,\n type TextObject,\n type AutomergeTextCompat,\n getRawDoc,\n isActualAutomergeObject,\n} from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport type { YText, YXmlFragment } from '@dxos/text-model';\n\nimport { automergePlugin } from './automerge';\nimport { SpaceAwarenessProvider } from './yjs';\n\n// TODO(burdon): Move.\ntype Awareness = awarenessProtocol.Awareness;\n\nexport type DocumentRange = {\n id: string;\n from: number;\n to: number;\n};\n\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport type EditorModel = {\n id: string;\n // TODO(burdon): Remove.\n content: string | YText | YXmlFragment | DocAccessor;\n text: () => string;\n ranges: DocumentRange[];\n extension?: Extension;\n awareness?: Awareness;\n peer?: {\n id: string;\n name?: string;\n };\n};\n\n// TODO(burdon): Remove space/identity dependency. Define interface for the framework re content and presence.\nexport type UseTextModelOptions = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\n// TODO(burdon): Remove YJS/Automerge deps (from UI component -- create abstraction; incl. all ECHO/Space deps).\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport const useTextModel = ({ identity, space, text }: UseTextModelOptions): EditorModel | undefined => {\n const [model, setModel] = useState<EditorModel | undefined>(() => createModel({ identity, space, text }));\n useEffect(() => {\n setModel(createModel({ identity, space, text }));\n }, [identity, space, text]);\n return model;\n};\n\nconst createModel = (options: UseTextModelOptions) => {\n const { text } = options;\n if (isActualAutomergeObject(text)) {\n return createAutomergeModel(options);\n } else {\n if (!text?.doc) {\n return undefined;\n }\n\n return createYjsModel(options);\n }\n};\n\nconst createYjsModel = ({ identity, space, text }: UseTextModelOptions): EditorModel => {\n invariant(text?.doc && text?.content);\n const provider = space\n ? new SpaceAwarenessProvider({ space, doc: text.doc, channel: `yjs.awareness.${text.id}` })\n : undefined;\n\n return {\n id: text.doc.guid,\n content: text.content,\n text: () => text.content!.toString(),\n ranges: [],\n extension: yCollab(text.content as YText, provider?.awareness),\n awareness: provider?.awareness,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n};\n\nconst createAutomergeModel = ({ identity, text }: UseTextModelOptions): EditorModel => {\n const obj = text as any as AutomergeTextCompat;\n const doc = getRawDoc(obj, [obj.field]);\n\n return {\n id: obj.id,\n content: doc,\n text: () => get(doc.handle.docSync(), doc.path),\n ranges: [],\n extension: automergePlugin(doc.handle, doc.path),\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n Annotation,\n type EditorState,\n type Extension,\n Facet,\n StateEffect,\n StateField,\n type Transaction,\n type TransactionSpec,\n} from '@codemirror/state';\nimport { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';\n\nimport * as automerge from '@dxos/automerge/automerge';\nimport { type Heads, type Prop } from '@dxos/automerge/automerge';\n\nimport { PatchSemaphore } from './PatchSemaphore';\nimport { type IDocHandle } from './handle';\n\nexport type Value = {\n lastHeads: Heads;\n path: Prop[];\n unreconciledTransactions: Transaction[];\n};\n\ntype UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const effectType = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => effectType.of({ newHeads });\n\nexport const getLastHeads = (state: EditorState, field: Field): Heads => state.field(field).lastHeads;\n\nexport const getPath = (state: EditorState, field: Field): Prop[] => state.field(field).path;\n\nexport type Field = StateField<Value>;\n\nconst semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({\n combine: (values) => values.at(-1)!, // Take last.\n});\n\nexport type AutomergePlugin = {\n extension: Extension;\n};\n\nexport const automergePlugin = (handle: IDocHandle, path: Prop[]): AutomergePlugin => {\n const stateField: StateField<Value> = StateField.define({\n create: () => ({\n lastHeads: automerge.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n path: path.slice(),\n }),\n update: (value: Value, tr: Transaction) => {\n const result: Value = {\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n path: path.slice(),\n };\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(effectType)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcileTx(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n return result;\n },\n });\n\n const semaphore = new PatchSemaphore(stateField);\n\n const viewPlugin = ViewPlugin.fromClass(\n class AutomergeCodemirrorViewPlugin implements PluginValue {\n private _view: EditorView;\n\n constructor(view: EditorView) {\n this._view = view;\n handle.addListener('change', this._handleChange);\n }\n\n update(update: ViewUpdate) {\n if (update.transactions.length > 0 && update.transactions.some((t) => !isReconcileTx(t))) {\n queueMicrotask(() => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n });\n }\n }\n\n destroy() {\n handle.addListener('change', this._handleChange);\n }\n\n private _handleChange = () => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n };\n },\n );\n\n return {\n extension: [stateField, semaphoreFacet.of(semaphore), viewPlugin],\n };\n};\n\nexport const reconcileAnnotationType = Annotation.define<unknown>();\n\nexport const isReconcileTx = (tr: Transaction): boolean => !!tr.annotation(reconcileAnnotationType);\n\nexport const makeReconcile = (tr: TransactionSpec) => {\n if (tr.annotations != null) {\n if (tr.annotations instanceof Array) {\n tr.annotations = [...tr.annotations, reconcileAnnotationType.of({})];\n } else {\n tr.annotations = [tr.annotations, reconcileAnnotationType.of({})];\n }\n } else {\n tr.annotations = [reconcileAnnotationType.of({})];\n }\n // return {\n // ...tr,\n // annotations: reconcileAnnotationType.of({})\n // }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(burdon): Additional copyright?\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './handle';\nimport { type Field, isReconcileTx, getPath, reconcileAnnotationType, updateHeads, getLastHeads } from './plugin';\nimport { automergeToCodemirror, codemirrorToAutomerge } from './translation';\n\ntype Doc<T> = automerge.Doc<T>;\ntype Heads = automerge.Heads;\n\ntype ChangeFn = (atHeads: Heads, change: (doc: Doc<unknown>) => void) => Heads | undefined;\n\n/**\n * TODO(burdon): Comment.\n */\nexport class PatchSemaphore {\n _field!: Field;\n _inReconcile = false;\n _queue: Array<ChangeFn> = [];\n\n constructor(field?: Field) {\n if (field !== undefined) {\n this._field = field;\n }\n }\n\n reconcile = (handle: IDocHandle, view: EditorView) => {\n if (this._inReconcile) {\n return;\n }\n this._inReconcile = true;\n\n const path = getPath(view.state, this._field);\n const oldHeads = getLastHeads(view.state, this._field);\n let selection = view.state.selection;\n\n const transactions = view.state.field(this._field).unreconciledTransactions.filter((tx) => !isReconcileTx(tx));\n\n // First undo all the unreconciled transactions.\n const toInvert = transactions.slice().reverse();\n for (const tx of toInvert) {\n const inverted = tx.changes.invert(tx.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotationType.of(true),\n });\n }\n\n // Apply the unreconciled transactions to the document.\n let newHeads = codemirrorToAutomerge(this._field, handle, transactions, view.state);\n\n // NOTE: null and undefined each come from automerge and repo respectively.\n if (newHeads === null || newHeads === undefined) {\n // TODO: @alexjg this is the call that's resetting the editor state on click\n newHeads = automerge.getHeads(handle.docSync()!);\n }\n\n // Now get the diff between the updated state of the document and the heads and apply that to the codemirror doc.\n const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.docSync()!, oldHeads, newHeads);\n automergeToCodemirror(view, selection, path, diff);\n\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotationType.of({}),\n });\n\n this._inReconcile = false;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(burdon): Additional copyright?\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotationType } from '../plugin';\n\nexport const automergeToCodemirror = (\n view: EditorView,\n selection: EditorSelection,\n target: Prop[],\n patches: Patch[],\n) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotationType.of({}),\n });\n }\n }\n\n view.dispatch({\n selection,\n annotations: reconcileAnnotationType.of({}),\n });\n};\n\nconst handlePatch = (patch: Patch, target: Prop[], state: EditorState): ChangeSpec | null => {\n if (patch.action === 'insert') {\n return handleInsert(target, patch);\n } else if (patch.action === 'splice') {\n return handleSplice(target, patch);\n } else if (patch.action === 'del') {\n return handleDel(target, patch);\n } else if (patch.action === 'put') {\n return handlePut(target, patch, state);\n } else {\n return null;\n }\n};\n\nconst handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const text = patch.values.map((v) => (v ? v.toString() : '')).join('');\n return [{ from: index, to: index, insert: text }];\n};\n\nconst handleSplice = (target: Prop[], patch: SpliceTextPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n return [{ from: index, insert: patch.value }];\n};\n\nconst handleDel = (target: Prop[], patch: DelPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const length = patch.length || 1;\n return [{ from: index, to: index + length }];\n};\n\nconst handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<ChangeSpec> => {\n const index = charPath(target, [...patch.path, 0]);\n if (index == null) {\n return [];\n }\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non string values?\n }\n return [{ from: 0, to: length, insert: patch.value as any }];\n};\n\n// If the path of the patch is of the form [path, <index>] then we know this is\n// a path to a character within the sequence given by path\nconst charPath = (textPath: Prop[], candidatePath: Prop[]): number | null => {\n if (candidatePath.length !== textPath.length + 1) {\n return null;\n }\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n return null;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(burdon): Additional copyright?\n\nimport { type EditorState, type Text, type Transaction } from '@codemirror/state';\n\nimport { next as am, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from '../handle';\nimport { type Field } from '../plugin';\n\nexport const codemirrorToAutomerge = (\n field: Field,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState,\n): Heads | undefined => {\n const { lastHeads, path } = state.field(field);\n\n // We don't want to call `automerge.updateAt` if there are no changes.\n // Otherwise, later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.\n let hasChanges = false;\n for (const tr of transactions) {\n tr.changes.iterChanges(() => {\n hasChanges = true;\n });\n }\n\n if (!hasChanges) {\n return undefined;\n }\n\n const newHeads = handle.changeAt(lastHeads, (doc: am.Doc<unknown>) => {\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA: number, toA: number, _fromB: number, _toB: number, inserted: Text) => {\n am.splice(doc, path, fromA, toA - fromA, inserted.toString());\n });\n }\n });\n\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// Copied from https://github.com/yjs/y-codemirror.next#example.\n\nimport * as random from 'lib0/random';\n\nconst cursorColors = [\n { color: '#30bced', light: '#30bced33' },\n { color: '#6eeb83', light: '#6eeb8333' },\n { color: '#ffbc42', light: '#ffbc4233' },\n { color: '#ecd444', light: '#ecd44433' },\n { color: '#ee6352', light: '#ee635233' },\n { color: '#9ac2c9', light: '#9ac2c933' },\n { color: '#8acb88', light: '#8acb8833' },\n { color: '#1be7ff', light: '#1be7ff33' },\n];\n\n// Select a random color for this user.\nexport const cursorColor = cursorColors[random.uint32() % cursorColors.length];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport * as decoding from 'lib0/decoding';\nimport * as encoding from 'lib0/encoding';\nimport { Observable } from 'lib0/observable';\nimport * as awarenessProtocol from 'y-protocols/awareness';\nimport { type Doc } from 'yjs';\n\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\ntype Awareness = awarenessProtocol.Awareness;\n\n// Based on https://github.com/yjs/y-webrtc/blob/88baab2/src/y-webrtc.js.\n\nconst messageAwareness = 1;\nconst messageQueryAwareness = 3;\n\n/**\n * Yjs awareness provider on top of a DXOS space.\n */\nexport class SpaceAwarenessProvider extends Observable<any> {\n private readonly _space: Space;\n private readonly _awareness: Awareness;\n private readonly _clientId: number;\n private readonly _channel: string;\n\n constructor({ space, doc, channel, awareness }: { space: Space; doc: Doc; channel: string; awareness?: Awareness }) {\n super();\n this._space = space;\n this._awareness = awareness ?? new awarenessProtocol.Awareness(doc);\n this._channel = channel;\n this._clientId = doc.clientID;\n\n this._awareness.on('update', this._handleAwarenessUpdate.bind(this));\n this._space.listen(this._channel, this._handleSpaceMessage.bind(this));\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this._handleBeforeUnload.bind(this));\n } else if (typeof process !== 'undefined') {\n process.on('exit', this._handleBeforeUnload.bind(this));\n }\n\n // Post queryAwareness.\n const encoderAwarenessQuery = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessQuery));\n\n // Post local awareness state.\n const encoderAwarenessState = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessState, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [this._clientId]),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessState));\n }\n\n get awareness(): Awareness {\n return this._awareness;\n }\n\n private _handleAwarenessUpdate({ added, updated, removed }: any, origin: any) {\n log('awareness update', { added, updated, removed, origin });\n const changedClients = added.concat(updated).concat(removed);\n const encoderAwareness = encoding.createEncoder();\n encoding.writeVarUint(encoderAwareness, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwareness,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, changedClients),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwareness));\n }\n\n private _handleSpaceMessage({ payload }: GossipMessage) {\n log('space message', payload);\n const data = new Uint8Array(Array.from(Object.values(payload)));\n const encoder = this._readMessage(data);\n if (encoder) {\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoder));\n }\n }\n\n private _readMessage(message: Uint8Array) {\n const decoder = decoding.createDecoder(message);\n const encoder = encoding.createEncoder();\n const messageType = decoding.readVarUint(decoder);\n\n let sendReply = false;\n switch (messageType) {\n case messageAwareness: {\n awarenessProtocol.applyAwarenessUpdate(this._awareness, decoding.readVarUint8Array(decoder), this);\n break;\n }\n\n case messageQueryAwareness: {\n encoding.writeVarUint(encoder, messageAwareness);\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, Array.from(this._awareness.getStates().keys())),\n );\n sendReply = true;\n break;\n }\n\n default: {\n console.error('Invalid message:', messageType);\n return encoder;\n }\n }\n\n if (!sendReply) {\n // Nothing has been written, no answer created.\n return null;\n }\n\n return encoder;\n }\n\n private _handleBeforeUnload() {\n awarenessProtocol.removeAwarenessStates(this._awareness, [this._clientId], 'window unload');\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["TextKind", "Doc", "YText", "YXmlFragment", "tags", "autocompletion", "completionKeymap", "keymap", "autocomplete", "onSearch", "keymap", "of", "completionKeymap", "autocompletion", "activateOnTyping", "override", "context", "match", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "closeBrackets", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "drawSelection", "EditorView", "placeholder", "basicBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorView", "lineWrapping", "bracketMatching", "closeBrackets", "drawSelection", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "EditorView", "keymap", "defaultsDeep", "invariant", "defaultOptions", "effect", "maxParticles", "particleGravity", "particleAlphaFadeout", "particleSize", "min", "max", "particleNumRange", "particleVelocityRange", "x", "y", "particleShrinkRate", "shakeIntensity", "blast", "options", "blaster", "last", "getPoint", "view", "pos", "left", "top", "coordsForChar", "element", "document", "elementFromPoint", "offsetLeft", "offsetTop", "scrollDOM", "parentElement", "point", "updateListener", "of", "update", "node", "destroy", "Blaster", "color", "Math", "random", "initialize", "start", "resize", "current", "state", "selection", "main", "head", "spawn", "any", "_", "event", "key", "shiftKey", "shake", "time", "constructor", "_node", "_options", "_running", "_shakeTime", "_shakeTimeMax", "_particles", "_particlePointer", "_lastPoint", "throttle", "getRGBComponents", "numParticles", "dir", "i", "_effect", "create", "Effect1", "Effect2", "_canvas", "_ctx", "createElement", "id", "style", "position", "zIndex", "pointerEvents", "getContext", "parent", "appendChild", "stop", "remove", "undefined", "offsetWidth", "width", "offsetHeight", "height", "loop", "transform", "clearRect", "now", "Date", "getTime", "_lastTime", "dt", "magnitude", "shakeX", "shakeY", "drawParticles", "requestAnimationFrame", "bind", "length", "particle", "alpha", "size", "Effect", "vx", "vy", "ctx", "fillStyle", "fillRect", "round", "theta", "PI", "drag", "wander", "sin", "cos", "beginPath", "arc", "fill", "callback", "limit", "wait", "args", "apply", "setTimeout", "bgColor", "getComputedStyle", "match", "slice", "ViewPlugin", "EditorView", "Decoration", "get", "mx", "mx", "headings", "heading", "level", "readonly", "style", "offset", "mx", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "horizontalRule", "tailwindConfig", "tokens", "tailwindConfig", "theme", "CODE_REGEX", "styles", "EditorView", "baseTheme", "display", "paddingInline", "background", "get", "tokens", "paddingTop", "borderTopLeftRadius", "borderTopRightRadius", "paddingBottom", "borderBottomLeftRadius", "borderBottomRightRadius", "getLineRange", "lines", "from", "to", "start", "findIndex", "line", "end", "code", "getDecorations", "view", "decorations", "state", "readOnly", "text", "doc", "sliceString", "matches", "matchAll", "blocks", "viewportLineBlocks", "match", "range", "index", "length", "i", "block", "push", "Decoration", "class", "mx", "set", "ViewPlugin", "fromClass", "constructor", "update", "docChanged", "viewportChanged", "value", "keymap", "defaultItems", "demo", "delay", "items", "t", "idx", "keymap", "of", "key", "run", "view", "clearTimeout", "text", "length", "i", "insert", "d", "setTimeout", "pos", "state", "selection", "main", "head", "dispatch", "changes", "from", "anchor", "Math", "random", "keymap", "Decoration", "EditorView", "MatchDecorator", "ViewPlugin", "WidgetType", "debounce", "invariant", "styles", "baseTheme", "cursor", "margin", "padding", "backgroundColor", "BookmarkWidget", "constructor", "_pos", "_id", "_handleClick", "eq", "other", "toDOM", "span", "document", "createElement", "className", "textContent", "onclick", "comments", "options", "active", "bookmarkMatcher", "regexp", "decoration", "match", "view", "pos", "id", "replace", "widget", "handleUpdate", "bookmarks", "fromClass", "createDeco", "update", "updateDeco", "decorations", "instance", "provide", "plugin", "atomicRanges", "of", "none", "data", "onUpdate", "key", "run", "from", "to", "head", "state", "selection", "main", "onCreate", "tag", "dispatch", "changes", "insert", "anchor", "length", "updateListener", "undefined", "rangeSet", "closest", "Infinity", "doc", "between", "value", "push", "d", "Math", "min", "abs", "spec", "items", "map", "location", "coordsAtPos", "StateEffect", "StateField", "Decoration", "EditorView", "sortBy", "useEffect", "styles", "EditorView", "baseTheme", "backgroundColor", "content", "marks", "highlight", "Decoration", "mark", "class", "HighlightActive", "setHighlights", "StateEffect", "define", "useHighlights", "view", "ranges", "useEffect", "dispatch", "effects", "of", "highlightStateField", "StateField", "create", "update", "threads", "tr", "effect", "is", "value", "highlightDecorations", "decorations", "compute", "state", "selectionRanges", "field", "sortBy", "selection", "from", "flatMap", "range", "to", "active", "set", "listener", "options", "updateListener", "head", "main", "mod", "newRanges", "map", "onChange", "find", "id", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "image", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "to", "url", "sliceDoc", "add", "Decoration", "replace", "widget", "ImageWidget", "finish", "WidgetType", "constructor", "_url", "eq", "other", "toDOM", "view", "img", "document", "createElement", "setAttribute", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "link", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "LinkButton", "WidgetType", "constructor", "_pos", "_url", "_onAttach", "eq", "other", "toDOM", "view", "el", "document", "createElement", "LinkText", "_text", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "builder", "RangeSetBuilder", "cursor", "main", "head", "syntaxTree", "iterate", "enter", "node", "name", "marks", "getChildren", "text", "length", "sliceDoc", "to", "urlNode", "getChild", "url", "readOnly", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "StateField", "listener", "onChange", "StateField", "define", "create", "update", "_value", "transaction", "docChanged", "newDoc", "toString", "closeBrackets", "closeBracketsKeymap", "history", "historyKeymap", "indentWithTab", "standardKeymap", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "keymap", "placeholder", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "Table", "get", "mx", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "HorizontalRule", "InlineCode", "LinkLabel", "LinkReference", "ListMark", "QuoteMark", "URL", "TableCell", "Table", "defineNodes", "forEach", "node", "name", "style", "markdownTagsExtensions", "props", "styleTags", "markdownHighlightStyle", "readonly", "HighlightStyle", "tag", "tags", "keyword", "deleted", "character", "propertyName", "macroName", "color", "constant", "standard", "definition", "separator", "typeName", "className", "number", "changed", "annotation", "modifier", "self", "namespace", "operator", "operatorKeyword", "escape", "regexp", "special", "string", "meta", "comment", "atom", "bool", "variableName", "processingInstruction", "inserted", "invalid", "class", "mark", "function", "labelName", "codeMark", "monospace", "heading1", "heading", "heading2", "heading3", "heading4", "heading5", "heading6", "emphasis", "italic", "strong", "bold", "strikethrough", "inlineUrl", "code", "blockquote", "mx", "horizontalRule", "scope", "markdownLanguage", "all", "fontFamily", "get", "tokens", "join", "markdownBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorState", "allowMultipleSelections", "of", "tabSize", "EditorView", "lineWrapping", "customKeymap", "bracketMatching", "closeBrackets", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "history", "indentOnInput", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtensions", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "markdownHighlightStyle", "filter", "Boolean", "keymap", "indentWithTab", "standardKeymap", "historyKeymap", "closeBracketsKeymap", "searchKeymap", "autocompletion", "mention", "onSearch", "autocompletion", "closeOnBlur", "override", "context", "match", "matchBefore", "from", "to", "explicit", "console", "log", "options", "text", "slice", "toLowerCase", "map", "value", "label", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "table", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "tables", "getTable", "length", "getRow", "rows", "syntaxTree", "iterate", "enter", "node", "name", "push", "to", "header", "row", "sliceDoc", "forEach", "hide", "readOnly", "add", "Decoration", "replace", "widget", "TableWidget", "mark", "class", "finish", "WidgetType", "constructor", "_table", "eq", "other", "toDOM", "view", "document", "createElement", "appendChild", "cell", "th", "setAttribute", "textContent", "body", "td", "EditorView", "Decoration", "WidgetType", "MatchDecorator", "ViewPlugin", "styles", "EditorView", "baseTheme", "paddingLeft", "paddingRight", "CheckboxWidget", "WidgetType", "constructor", "_pos", "_checked", "_indent", "_onCheck", "eq", "other", "toDOM", "view", "wrap", "document", "createElement", "className", "setAttribute", "style", "setProperty", "input", "appendChild", "type", "checked", "onchange", "event", "target", "ignoreEvent", "tasklist", "options", "taskMatcher", "MatchDecorator", "regexp", "decoration", "match", "pos", "indent", "Math", "floor", "length", "Decoration", "replace", "widget", "state", "readOnly", "undefined", "idx", "indexOf", "dispatch", "changes", "from", "to", "insert", "selection", "anchor", "tasks", "ViewPlugin", "fromClass", "createDeco", "update", "updateDeco", "decorations", "value", "provide", "plugin", "atomicRanges", "of", "none", "hoverTooltip", "tooltipContent", "markdownLinkRegexp", "tooltip", "onHover", "regexp", "hoverTooltip", "view", "pos", "from", "text", "state", "doc", "lineAt", "p", "idx", "match", "substring", "undefined", "indexOf", "length", "url", "end", "above", "create", "el", "document", "createElement", "className", "tooltipContent", "dom", "offset", "x", "y", "get", "defaultTheme", "outline", "overflow", "fontFamily", "get", "tokens", "join", "padding", "fontSize", "color", "caretColor", "borderLeft", "fontWeight", "paddingInline", "backgroundColor", "background", "mixBlendMode", "marginBlockStart", "paddingBlockStart", "paddingBlockEnd", "display", "insetBlockStart", "blockSize", "verticalAlign", "margin", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "border", "marginTop", "marginLeft", "textDecoration", "height", "borderBottom", "textAlign", "Object", "keys", "reduce", "acc", "textTheme", "markdownTheme", "codeTheme", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "generateName", "useThemeContext", "getColorForValue", "inputSurface", "mx", "EditorModes", "BaseTextEditor", "forwardRef", "model", "readonly", "editorMode", "extensions", "slots", "defaultSlots", "forwardedRef", "themeMode", "useThemeContext", "tabsterDOMAttribute", "useFocusableGroup", "tabBehavior", "root", "setRoot", "useState", "state", "setState", "view", "setView", "useImperativeHandle", "awareness", "peer", "useEffect", "setLocalStateField", "name", "generateName", "id", "color", "getColorForValue", "value", "type", "colorLight", "EditorState", "create", "doc", "text", "readOnly", "of", "vim", "EditorView", "baseTheme", "defaultTheme", "theme", "editor", "darkTheme", "extension", "filter", "Boolean", "destroy", "parent", "undefined", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "contentDOM", "focus", "div", "ref", "tabIndex", "onKeyUp", "TextEditor", "_slots", "props", "defaultsDeep", "defaultTextSlots", "basicBundle", "placeholder", "MarkdownEditor", "defaultMarkdownSlots", "markdownBundle", "className", "mx", "inputSurface", "textTheme", "markdownTheme", "get", "useEffect", "useState", "yCollab", "invariant", "getRawDoc", "isActualAutomergeObject", "Annotation", "Facet", "StateEffect", "StateField", "ViewPlugin", "automerge", "next", "automerge", "ChangeSet", "automergeToCodemirror", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotationType", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "v", "toString", "join", "from", "to", "insert", "value", "textPath", "candidatePath", "i", "next", "am", "codemirrorToAutomerge", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "fromA", "toA", "_fromB", "_toB", "inserted", "am", "splice", "toString", "PatchSemaphore", "constructor", "field", "_inReconcile", "_queue", "reconcile", "handle", "view", "path", "getPath", "state", "_field", "oldHeads", "getLastHeads", "selection", "transactions", "unreconciledTransactions", "filter", "tx", "isReconcileTx", "toInvert", "slice", "reverse", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotationType", "of", "newHeads", "codemirrorToAutomerge", "undefined", "automerge", "getHeads", "docSync", "diff", "equals", "automergeToCodemirror", "effects", "updateHeads", "effectType", "StateEffect", "define", "updateHeads", "newHeads", "of", "getLastHeads", "state", "field", "lastHeads", "getPath", "path", "semaphoreFacet", "Facet", "combine", "values", "at", "automergePlugin", "handle", "stateField", "StateField", "create", "getHeads", "docSync", "unreconciledTransactions", "slice", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "isReconcileTx", "push", "semaphore", "PatchSemaphore", "viewPlugin", "ViewPlugin", "fromClass", "AutomergeCodemirrorViewPlugin", "constructor", "view", "_handleChange", "_view", "facet", "reconcile", "addListener", "transactions", "length", "some", "t", "queueMicrotask", "destroy", "extension", "reconcileAnnotationType", "Annotation", "annotation", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "decoding", "encoding", "Observable", "awarenessProtocol", "log", "messageAwareness", "messageQueryAwareness", "SpaceAwarenessProvider", "constructor", "space", "doc", "channel", "awareness", "_space", "_awareness", "Awareness", "_channel", "_clientId", "clientID", "on", "_handleAwarenessUpdate", "bind", "listen", "_handleSpaceMessage", "window", "addEventListener", "_handleBeforeUnload", "process", "encoderAwarenessQuery", "createEncoder", "writeVarUint", "postMessage", "toUint8Array", "encoderAwarenessState", "writeVarUint8Array", "encodeAwarenessUpdate", "added", "updated", "removed", "origin", "changedClients", "concat", "encoderAwareness", "payload", "data", "Uint8Array", "Array", "from", "Object", "values", "encoder", "_readMessage", "message", "decoder", "createDecoder", "messageType", "readVarUint", "sendReply", "applyAwarenessUpdate", "readVarUint8Array", "getStates", "keys", "console", "error", "removeAwarenessStates", "useTextModel", "identity", "space", "text", "model", "setModel", "useState", "createModel", "useEffect", "options", "isActualAutomergeObject", "createAutomergeModel", "doc", "undefined", "createYjsModel", "invariant", "content", "provider", "SpaceAwarenessProvider", "channel", "id", "guid", "toString", "ranges", "extension", "yCollab", "awareness", "peer", "identityKey", "toHex", "name", "profile", "displayName", "obj", "getRawDoc", "field", "get", "handle", "docSync", "path", "automergePlugin"]
3
+ "sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/TextEditor.tsx", "../../../src/extensions/autocomplete.ts", "../../../src/extensions/automerge/automerge.ts", "../../../src/extensions/automerge/cursor.ts", "../../../src/extensions/automerge/defs.ts", "../../../src/extensions/automerge/semaphore.ts", "../../../src/extensions/automerge/update-automerge.ts", "../../../src/extensions/automerge/update-codemirror.ts", "../../../src/extensions/cursor.ts", "../../../src/extensions/awareness.ts", "../../../src/extensions/basic.ts", "../../../src/extensions/blast.ts", "../../../src/extensions/code.ts", "../../../src/styles/cursors.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/extensions/comments.ts", "../../../src/util.ts", "../../../src/extensions/hr.ts", "../../../src/extensions/image.ts", "../../../src/extensions/link.ts", "../../../src/extensions/listener.ts", "../../../src/extensions/markdown/bundle.ts", "../../../src/extensions/markdown/highlight.ts", "../../../src/extensions/mention.ts", "../../../src/extensions/outliner.ts", "../../../src/extensions/table.ts", "../../../src/extensions/tasklist.ts", "../../../src/extensions/typewriter.ts", "../../../src/extensions/yjs/yjs.ts", "../../../src/extensions/yjs/cursor.ts", "../../../src/themes/default.ts", "../../../src/hooks/automerge.ts", "../../../src/hooks/awareness-provider.ts", "../../../src/hooks/useTextModel.ts", "../../../src/hooks/yjs.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';\nexport { Doc, YText, YXmlFragment } from '@dxos/text-model';\nexport { type Extension } from '@codemirror/state';\nexport { type EditorView } from '@codemirror/view';\n\nexport * from './components';\nexport * from './extensions';\nexport * from './hooks';\nexport { getToken } from './styles';\nexport * from './themes';\nexport * from './util';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\nexport { type Extension } from '@codemirror/state';\n\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { vim } from '@replit/codemirror-vim';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport React, {\n type ComponentProps,\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n useRef,\n} from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { getColorForValue, inputSurface, mx } from '@dxos/react-ui-theme';\n\nimport { basicBundle, markdownBundle, setCommentRange } from '../../extensions';\nimport { type CommentRange, type EditorModel } from '../../hooks';\nimport { type ThemeStyles } from '../../styles';\nimport { defaultTheme, markdownTheme, textTheme } from '../../themes';\n\nexport const EditorModes = ['default', 'vim'] as const;\nexport type EditorMode = (typeof EditorModes)[number];\n\nexport type CursorInfo = {\n from: number;\n to: number;\n line: number;\n lines: number;\n length: number;\n after?: string;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n // editor?: {\n // className?: string;\n // };\n};\n\n// TODO(burdon): Spellcheck?\nexport type TextEditorProps = {\n model: EditorModel;\n autofocus?: boolean;\n readonly?: boolean; // TODO(burdon): Move into model.\n selection?: { anchor: number; head?: number };\n comments?: CommentRange[]; // TODO(burdon): Move into extension?\n extensions?: Extension[];\n editorMode?: EditorMode;\n placeholder?: string;\n theme?: ThemeStyles;\n slots?: TextEditorSlots;\n};\n\n/**\n * Base text editor.\n */\nexport const BaseTextEditor = forwardRef<EditorView, TextEditorProps>(\n (\n { model, autofocus, readonly, selection, comments, extensions = [], editorMode, theme, slots = defaultSlots },\n forwardedRef,\n ) => {\n const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n const { themeMode } = useThemeContext();\n\n // The editor view ref should only be used as an escape hatch.\n const rootRef = useRef<HTMLDivElement>(null);\n const [view, setView] = useState<EditorView | null>(null);\n // NOTE: This does not cause the parent to re-render, so the ref is not available immediately.\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);\n\n useEffect(() => {\n if (autofocus) {\n view?.focus();\n }\n }, [autofocus, view]);\n\n // TODO(burdon): Factor out as extension/hook.\n const { awareness, peer } = model;\n useEffect(() => {\n if (awareness && peer) {\n awareness.setLocalStateField('user', {\n name: peer.name ?? generateName(peer.id),\n color: getColorForValue({ value: peer.id, type: 'color' }),\n colorLight: getColorForValue({ value: peer.id, themeMode, type: 'highlight' }),\n });\n }\n }, [awareness, peer, themeMode]);\n\n // TODO(burdon): Factor out as extension/hook.\n useEffect(() => {\n if (view && comments !== undefined) {\n view.dispatch({\n effects: setCommentRange.of({ model, comments }),\n });\n }\n }, [view, comments]);\n\n useEffect(() => {\n if (!model || !rootRef.current) {\n return;\n }\n\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n const state = EditorState.create({\n doc: model.text(),\n // TODO(burdon): Composer should store and set selection when switching documents.\n selection,\n extensions: [\n readonly && EditorState.readOnly.of(readonly),\n\n // TODO(burdon): Factor out VIM mode? (manage via MarkdownPlugin).\n editorMode === 'vim' && vim(),\n\n // Theme.\n // TODO(burdon): Make theme configurable.\n EditorView.baseTheme(defaultTheme),\n EditorView.theme(theme ?? {}),\n EditorView.darkTheme.of(themeMode === 'dark'),\n\n // Storage and replication.\n model.extension,\n\n // Custom.\n ...extensions,\n ].filter(Boolean) as Extension[],\n });\n\n // NOTE: This repaints the editor.\n // If the new state is derived from the old state, it will likely not be visible other than the cursor resetting.\n // Ideally this should not happen except when changing between text objects.\n view?.destroy();\n const newView = new EditorView({\n parent: rootRef.current,\n state,\n // NOTE: Uncomment to spy on all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n // dispatch: (transaction, view) => {\n // view.update([transaction]);\n // },\n });\n\n setView(newView);\n return () => {\n newView?.destroy();\n setView(null);\n };\n }, [rootRef, model, readonly, editorMode, themeMode]);\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n // TODO(burdon): Is this required (for vim mode?)\n // case 'Enter': {\n // view?.contentDOM.focus();\n // break;\n // }\n\n case 'Escape': {\n editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey) && rootRef.current?.focus();\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n role='none'\n tabIndex={0}\n onKeyUp={handleKeyUp}\n {...slots.root}\n {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n ref={rootRef}\n />\n );\n },\n);\n\nexport const TextEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, extensions = [], theme = textTheme, slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[basicBundle({ readonly, themeMode, placeholder }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\n// TODO(burdon): Remove (Just provide bundle, slots).\nexport const MarkdownEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, extensions = [], theme = markdownTheme, slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[markdownBundle({ readonly, themeMode, placeholder }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\nexport const defaultSlots: TextEditorSlots = {\n root: {\n className: mx('w-full p-2 overflow-y-auto', inputSurface),\n },\n};\n\nexport const defaultTextSlots: TextEditorSlots = {\n ...defaultSlots,\n};\n\nexport const defaultMarkdownSlots: TextEditorSlots = {\n ...defaultSlots,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// https://codemirror.net/examples/autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.Completion\n\nimport {\n autocompletion,\n completionKeymap,\n type Completion,\n type CompletionContext,\n type CompletionResult,\n} from '@codemirror/autocomplete';\nimport { markdownLanguage } from '@codemirror/lang-markdown';\nimport { keymap } from '@codemirror/view';\n\nexport type AutocompleteResult = Completion;\n\nexport type AutocompleteOptions = {\n onSearch: (text: string) => Completion[];\n};\n\n/**\n * Autocomplete extension.\n */\nexport const autocomplete = ({ onSearch }: AutocompleteOptions) => {\n return [\n // https://codemirror.net/docs/ref/#view.keymap\n // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322\n // TODO(burdon): Set custom keymap.\n keymap.of(completionKeymap),\n\n // https://codemirror.net/examples/autocompletion\n // https://codemirror.net/docs/ref/#autocomplete.autocompletion\n autocompletion({\n defaultKeymap: false,\n\n // Don't start unless key press.\n activateOnTyping: false,\n }),\n\n // TODO(burdon): Option to create new page?\n // TODO(burdon): Optional decoration via addToOptions\n markdownLanguage.data.of({\n autocomplete: (context: CompletionContext): CompletionResult | null => {\n const match = context.matchBefore(/\\w*/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n return {\n from: match.from,\n options: onSearch(match.text.toLowerCase()),\n };\n },\n }),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { StateField, type Extension, type Transaction } from '@codemirror/state';\nimport { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';\n\nimport { next as A } from '@dxos/automerge/automerge';\nimport { type Prop } from '@dxos/automerge/automerge';\n\nimport { cursorConverter } from './cursor';\nimport { effectType, type IDocHandle, isReconcileTx, semaphoreFacet, type Value } from './defs';\nimport { PatchSemaphore } from './semaphore';\nimport { Cursor } from '../cursor';\n\nexport type AutomergeOptions = {\n handle: IDocHandle;\n path: Prop[];\n};\n\nexport const automerge = ({ handle, path }: AutomergeOptions): Extension => {\n const stateField: StateField<Value> = StateField.define({\n create: () => ({\n lastHeads: A.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n path: path.slice(),\n }),\n\n update: (value: Value, tr: Transaction) => {\n const result: Value = {\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n path: path.slice(),\n };\n\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(effectType)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcileTx(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n\n return result;\n },\n });\n\n const semaphore = new PatchSemaphore(handle, stateField);\n\n const viewPlugin = ViewPlugin.fromClass(\n class AutomergeViewPlugin implements PluginValue {\n constructor(private readonly _view: EditorView) {\n handle.addListener('change', this._handleChange);\n }\n\n update(update: ViewUpdate) {\n if (update.transactions.length > 0 && update.transactions.some((tr) => !isReconcileTx(tr))) {\n queueMicrotask(() => {\n this._view.state.facet(semaphoreFacet).reconcile(this._view);\n });\n }\n }\n\n destroy() {\n handle.addListener('change', this._handleChange);\n }\n\n private _handleChange = () => {\n this._view.state.facet(semaphoreFacet).reconcile(this._view);\n };\n },\n );\n\n return {\n extension: [\n Cursor.converter.of(cursorConverter(handle, path)),\n semaphoreFacet.of(semaphore),\n stateField,\n viewPlugin,\n ],\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport get from 'lodash.get';\n\nimport type { Prop } from '@dxos/automerge/automerge';\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './defs';\nimport { type CursorConverter } from '../cursor';\n\nexport const cursorConverter = (handle: IDocHandle, path: Prop[]): CursorConverter => ({\n // TODO(burdon): Handle assoc to associate with a previous character.\n toCursor: (pos) => {\n const doc = handle.docSync();\n if (!doc) {\n return '';\n }\n\n const value = get(doc, path);\n if (typeof value === 'string' && value.length <= pos) {\n return 'end';\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return automerge.getCursor(doc, path.slice(), pos);\n },\n\n fromCursor: (cursor) => {\n if (cursor === '') {\n return 0;\n }\n\n const doc = handle.docSync();\n if (!doc) {\n return 0;\n }\n\n if (cursor === 'end') {\n const value = get(doc, path);\n if (typeof value === 'string') {\n return value.length;\n } else {\n return 0;\n }\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return automerge.getCursorPosition(doc, path.slice(), cursor);\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { Annotation, StateEffect, type StateField, type EditorState, type Transaction, Facet } from '@codemirror/state';\n\nimport { type ChangeFn, type ChangeOptions, type Doc, type Heads, type Prop } from '@dxos/automerge/automerge';\n\nimport { type PatchSemaphore } from './semaphore';\n\nexport type Value = {\n lastHeads: Heads;\n path: Prop[];\n unreconciledTransactions: Transaction[];\n};\n\nexport type UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const effectType = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => effectType.of({ newHeads });\n\nexport const getLastHeads = (state: EditorState, field: StateField<Value>): Heads => state.field(field).lastHeads;\n\nexport const getPath = (state: EditorState, field: StateField<Value>): Prop[] => state.field(field).path;\n\nexport const reconcileAnnotationType = Annotation.define<unknown>();\n\nexport const isReconcileTx = (tr: Transaction): boolean => !!tr.annotation(reconcileAnnotationType);\n\n// TODO(burdon): Rename sync/create generic def (like cursor) to decouple automerge deps.\nexport const semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({\n combine: (values) => values.at(-1)!, // Take last.\n});\n\n/*\nexport const makeReconcile = (tr: TransactionSpec) => {\n if (tr.annotations != null) {\n if (tr.annotations instanceof Array) {\n tr.annotations = [...tr.annotations, reconcileAnnotationType.of({})];\n } else {\n tr.annotations = [tr.annotations, reconcileAnnotationType.of({})];\n }\n } else {\n tr.annotations = [reconcileAnnotationType.of({})];\n }\n\n // return {\n // ...tr,\n // annotations: reconcileAnnotationType.of({})\n // }\n};\n*/\n\nexport type IDocHandle<T = any> = {\n docSync(): Doc<T> | undefined;\n change(callback: ChangeFn<T>, options?: ChangeOptions<T>): void;\n changeAt(heads: Heads, callback: ChangeFn<T>, options?: ChangeOptions<T>): string[] | undefined;\n\n addListener(event: 'change', listener: () => void): void;\n removeListener(event: 'change', listener: () => void): void;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type StateField } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport {\n getLastHeads,\n getPath,\n isReconcileTx,\n reconcileAnnotationType,\n updateHeads,\n type IDocHandle,\n type Value,\n} from './defs';\nimport { updateAutomerge } from './update-automerge';\nimport { updateCodeMirror } from './update-codemirror';\n\n/**\n * Implements three-way merge (on each mutation/key-stroke).\n */\nexport class PatchSemaphore {\n _inReconcile = false;\n\n constructor(private readonly _handle: IDocHandle, private readonly _field: StateField<Value>) {}\n\n reconcile = (view: EditorView) => {\n if (this._inReconcile) {\n return;\n }\n this._inReconcile = true;\n\n const path = getPath(view.state, this._field);\n\n // Get the heads before the unreconciled transactions are applied.\n const oldHeads = getLastHeads(view.state, this._field);\n let selection = view.state.selection;\n\n // First undo all the unreconciled transactions.\n const transactions = view.state.field(this._field).unreconciledTransactions.filter((tx) => !isReconcileTx(tx));\n const toInvert = transactions.slice().reverse();\n for (const tx of toInvert) {\n const inverted = tx.changes.invert(tx.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotationType.of(true),\n });\n }\n\n // Apply the unreconciled transactions to the document.\n let newHeads = updateAutomerge(this._field, this._handle, transactions, view.state);\n\n // NOTE: null and undefined each come from automerge and repo respectively.\n if (newHeads === null || newHeads === undefined) {\n // TODO: @alexjg this is the call that's resetting the editor state on click\n newHeads = automerge.getHeads(this._handle.docSync()!);\n }\n\n // Now get the diff between the updated state of the document and the heads and apply that to the codemirror doc.\n const diff = automerge.equals(oldHeads, newHeads)\n ? []\n : automerge.diff(this._handle.docSync()!, oldHeads, newHeads);\n updateCodeMirror(view, selection, path, diff);\n\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotationType.of({}),\n });\n\n this._inReconcile = false;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type EditorState, type StateField, type Text, type Transaction } from '@codemirror/state';\n\nimport { next as am, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle, type Value } from './defs';\n\nexport const updateAutomerge = (\n field: StateField<Value>,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState,\n): Heads | undefined => {\n const { lastHeads, path } = state.field(field);\n\n // We don't want to call `automerge.updateAt` if there are no changes.\n // Otherwise, later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.\n let hasChanges = false;\n for (const tr of transactions) {\n tr.changes.iterChanges(() => {\n hasChanges = true;\n });\n }\n\n if (!hasChanges) {\n return undefined;\n }\n\n const newHeads = handle.changeAt(lastHeads, (doc: am.Doc<unknown>) => {\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA: number, toA: number, _fromB: number, _toB: number, inserted: Text) => {\n am.splice(doc, path, fromA, toA - fromA, inserted.toString());\n });\n }\n });\n\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotationType } from './defs';\n\nexport const updateCodeMirror = (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotationType.of({}),\n });\n }\n }\n\n view.dispatch({\n selection,\n annotations: reconcileAnnotationType.of({}),\n });\n};\n\nconst handlePatch = (patch: Patch, target: Prop[], state: EditorState): ChangeSpec | null => {\n if (patch.action === 'insert') {\n return handleInsert(target, patch);\n } else if (patch.action === 'splice') {\n return handleSplice(target, patch);\n } else if (patch.action === 'del') {\n return handleDel(target, patch);\n } else if (patch.action === 'put') {\n return handlePut(target, patch, state);\n } else {\n return null;\n }\n};\n\nconst handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n\n const text = patch.values.map((v) => (v ? v.toString() : '')).join('');\n return [{ from: index, to: index, insert: text }];\n};\n\nconst handleSplice = (target: Prop[], patch: SpliceTextPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n\n return [{ from: index, insert: patch.value }];\n};\n\nconst handleDel = (target: Prop[], patch: DelPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n\n const length = patch.length || 1;\n return [{ from: index, to: index + length }];\n};\n\nconst handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<ChangeSpec> => {\n const index = charPath(target, [...patch.path, 0]);\n if (index == null) {\n return [];\n }\n\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non string values?\n }\n\n return [{ from: 0, to: length, insert: patch.value as any }];\n};\n\n// If the path of the patch is of the form [path, <index>] then we know this is a path to a character\n// within the sequence given by path.\nconst charPath = (textPath: Prop[], candidatePath: Prop[]): number | null => {\n if (candidatePath.length !== textPath.length + 1) {\n return null;\n }\n\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nimport type { Range } from '../hooks';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = Facet.define<CursorConverter, CursorConverter>({\n combine: (providers) => providers[0] ?? defaultCursorConverter,\n });\n\n static readonly getCursorFromRange = (cursorConverter: CursorConverter, range: Range) => {\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (cursorConverter: CursorConverter, cursor: string) => {\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Annotation, Facet, type Extension, RangeSet, type Range } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { Cursor, type CursorConverter } from './cursor';\n\nexport interface AwarenessProvider {\n remoteStateChange: Event<void>;\n\n open(): void;\n close(): void;\n\n update(position: AwarenessPosition | undefined): void;\n getRemoteStates(): AwarenessState[];\n}\n\nconst dummyProvider: AwarenessProvider = {\n remoteStateChange: new Event(),\n\n open: () => {},\n close: () => {},\n\n update: () => {},\n getRemoteStates: () => [],\n};\n\nexport const AwarenessProvider = Facet.define<AwarenessProvider, AwarenessProvider>({\n combine: (providers) => providers[0] ?? dummyProvider,\n});\n\n// TODO(dmaretskyi): Specify the users that actually changed. Currently, we recalculate positions for every user.\nconst RemoteSelectionChangedAnnotation = Annotation.define();\n\nexport type AwarenessPosition = {\n anchor?: string;\n head?: string;\n};\n\nexport type AwarenessInfo = {\n displayName?: string;\n // TODO(burdon): Rename light/dark.\n color?: string;\n lightColor?: string;\n};\n\nexport type AwarenessState = {\n position?: AwarenessPosition;\n peerId: string;\n info: AwarenessInfo;\n};\n\n/**\n * Extension provides presence information about other peers.\n */\n// TODO(burdon): Why provide default?\nexport const awareness = (provider = dummyProvider): Extension => {\n return [\n AwarenessProvider.of(provider),\n ViewPlugin.fromClass(RemoteSelectionsDecorator, {\n decorations: (value) => value.decorations,\n }),\n styles,\n ];\n};\n\n/**\n * Generates selection decorations from remote peers.\n */\nexport class RemoteSelectionsDecorator implements PluginValue {\n public decorations: DecorationSet = RangeSet.of([]);\n\n private readonly _ctx = new Context();\n\n private _cursorConverter: CursorConverter;\n private _provider: AwarenessProvider;\n private _lastAnchor?: number = undefined;\n private _lastHead?: number = undefined;\n\n constructor(view: EditorView) {\n this._cursorConverter = view.state.facet(Cursor.converter);\n this._provider = view.state.facet(AwarenessProvider);\n this._provider.open();\n this._provider.remoteStateChange.on(this._ctx, () => {\n view.dispatch({ annotations: [RemoteSelectionChangedAnnotation.of([])] });\n });\n }\n\n destroy() {\n void this._ctx.dispose();\n this._provider.close();\n }\n\n update(update: ViewUpdate) {\n this._updateLocalSelection(update);\n this._updateRemoteSelections(update);\n }\n\n private _updateLocalSelection(update: ViewUpdate) {\n const hasFocus = update.view.hasFocus && update.view.dom.ownerDocument.hasFocus();\n const { anchor = undefined, head = undefined } = hasFocus ? update.state.selection.main : {};\n if (this._lastAnchor === anchor && this._lastHead === head) {\n return;\n }\n\n this._lastAnchor = anchor;\n this._lastHead = head;\n\n this._provider.update(\n anchor !== undefined && head !== undefined\n ? {\n anchor: this._cursorConverter.toCursor(anchor),\n head: this._cursorConverter.toCursor(head),\n }\n : undefined,\n );\n }\n\n private _updateRemoteSelections(update: ViewUpdate) {\n const decorations: Range<Decoration>[] = [];\n const awarenessStates = this._provider.getRemoteStates();\n for (const state of awarenessStates) {\n const anchor = state.position?.anchor ? this._cursorConverter.fromCursor(state.position.anchor) : null;\n const head = state.position?.head ? this._cursorConverter.fromCursor(state.position.head) : null;\n if (anchor == null || head == null) {\n continue;\n }\n\n const start = Math.min(Math.min(anchor, head), update.view.state.doc.length);\n const end = Math.min(Math.max(anchor, head), update.view.state.doc.length);\n\n const startLine = update.view.state.doc.lineAt(start);\n const endLine = update.view.state.doc.lineAt(end);\n\n // TODO(burdon): Factor out styles.\n const color = state.info.color ?? '#30bced';\n const lightColor = state.info.lightColor ?? color + '33';\n\n if (startLine.number === endLine.number) {\n // Selected content in a single line.\n decorations.push({\n from: start,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${lightColor}` },\n class: 'cm-collab-selection',\n }),\n });\n } else {\n // Selected content in multiple lines; first, render text-selection in the first line.\n decorations.push({\n from: start,\n to: startLine.from + startLine.length,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n // Render text-selection in the last line.\n decorations.push({\n from: endLine.from,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n for (let i = startLine.number + 1; i < endLine.number; i++) {\n const linePos = update.view.state.doc.line(i).from;\n decorations.push({\n from: linePos,\n to: linePos,\n value: Decoration.line({\n attributes: { style: `background-color: ${color}`, class: 'cm-collab-selectionLine' },\n }),\n });\n }\n }\n\n decorations.push({\n from: head,\n to: head,\n value: Decoration.widget({\n side: head - anchor > 0 ? -1 : 1, // The local cursor should be rendered outside the remote selection.\n block: false,\n widget: new RemoteCaretWidget(state.info.displayName ?? 'Anonymous', color),\n }),\n });\n }\n\n this.decorations = Decoration.set(decorations, true);\n }\n}\n\nclass RemoteCaretWidget extends WidgetType {\n constructor(private readonly _name: string, private readonly _color: string) {\n super();\n }\n\n override toDOM(): HTMLElement {\n const span = document.createElement('span');\n span.className = 'cm-collab-selectionCaret';\n span.style.backgroundColor = this._color;\n span.style.borderColor = this._color;\n\n const dot = document.createElement('div');\n dot.className = 'cm-collab-selectionCaretDot';\n\n const info = document.createElement('div');\n info.className = 'cm-collab-selectionInfo';\n info.innerText = this._name;\n\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(dot);\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(info);\n span.appendChild(document.createTextNode('\\u2060'));\n\n return span;\n }\n\n override updateDOM() {\n return false;\n }\n\n override eq(widget: this) {\n return widget._color === this._color;\n }\n\n override get estimatedHeight() {\n return -1;\n }\n\n override ignoreEvent() {\n return true;\n }\n}\n\n// TODO(burdon): Mixed case?\nconst styles = EditorView.baseTheme({\n '.cm-collab-selection': {},\n '.cm-collab-selectionLine': {\n padding: 0,\n margin: '0px 2px 0px 4px',\n },\n '.cm-collab-selectionCaret': {\n position: 'relative',\n borderLeft: '1px solid black',\n borderRight: '1px solid black',\n marginLeft: '-1px',\n marginRight: '-1px',\n boxSizing: 'border-box',\n display: 'inline',\n },\n '.cm-collab-selectionCaretDot': {\n borderRadius: '50%',\n position: 'absolute',\n width: '.4em',\n height: '.4em',\n top: '-.2em',\n left: '-.2em',\n backgroundColor: 'inherit',\n transition: 'transform .3s ease-in-out',\n boxSizing: 'border-box',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionCaretDot': {\n transformOrigin: 'bottom center',\n transform: 'scale(0)',\n },\n '.cm-collab-selectionInfo': {\n position: 'absolute',\n top: '-1.05em',\n left: '-1px',\n fontSize: '.75em',\n fontFamily: 'serif',\n fontStyle: 'normal',\n fontWeight: 'normal',\n lineHeight: 'normal',\n userSelect: 'none',\n color: 'white',\n paddingLeft: '2px',\n paddingRight: '2px',\n zIndex: 101,\n transition: 'opacity .3s ease-in-out',\n backgroundColor: 'inherit',\n // These should be separate.\n opacity: 0,\n transitionDelay: '0s',\n whiteSpace: 'nowrap',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionInfo': {\n opacity: 1,\n transitionDelay: '0s',\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { drawSelection, EditorView, placeholder } from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nexport type BasicBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const basicBundle = ({ readonly, themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>\n [\n EditorView.lineWrapping,\n\n // TODO(burdon): Compare with minimalSetup.\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n drawSelection(),\n _placeholder && placeholder(_placeholder),\n\n // TODO(burdon): Is this required?\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n", "//\n// Copyright 2023 DXOS.org\n// Based on a demo by Joel Besada and Kushagra Gour.\n// https://twitter.com/JoelBesada/status/670343885655293952\n// https://github.com/chinchang/code-blast-codemirror/blob/master/code-blast.js\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { invariant } from '@dxos/invariant';\n\nexport type BlastOptions = {\n effect?: number;\n maxParticles: number;\n particleGravity: number;\n particleAlphaFadeout: number;\n particleSize: { min: number; max: number };\n particleNumRange: { min: number; max: number };\n particleVelocityRange: { x: [number, number]; y: [number, number] };\n particleShrinkRate: number;\n shakeIntensity: number;\n color?: () => number[];\n};\n\nexport const defaultOptions: BlastOptions = {\n effect: 2,\n maxParticles: 200,\n particleGravity: 0.08,\n particleAlphaFadeout: 0.996,\n particleSize: { min: 2, max: 8 },\n particleNumRange: { min: 5, max: 10 },\n particleVelocityRange: { x: [-1, 1], y: [-3.5, -1.5] },\n particleShrinkRate: 0.95,\n shakeIntensity: 5,\n};\n\nexport const blast = (options: Partial<BlastOptions> = defaultOptions): Extension => {\n let blaster: Blaster | undefined;\n let last = 0;\n\n const getPoint = (view: EditorView, pos: number) => {\n const { left: x = 0, top: y = 0 } = view.coordsForChar(pos) ?? {};\n const element = document.elementFromPoint(x, y);\n\n const { offsetLeft: left = 0, offsetTop: top = 0 } = view.scrollDOM.parentElement ?? {};\n const point = { x: x - left, y: y - top };\n\n return { element, point };\n };\n\n return [\n // Cursor moved.\n EditorView.updateListener.of((update) => {\n // NOTE: The MarkdownEditor may recreated the EditorView.\n if (blaster?.node !== update.view.scrollDOM) {\n if (blaster) {\n blaster.destroy();\n }\n\n blaster = new Blaster(\n update.view.scrollDOM,\n defaultsDeep(\n {\n particleGravity: 0.2,\n particleShrinkRate: 0.995,\n color: () => [100 + Math.random() * 100, 0, 0],\n },\n options,\n defaultOptions,\n ),\n );\n blaster.initialize();\n blaster.start(); // TODO(burdon): Stop/clean-up.\n } else {\n blaster.resize();\n }\n\n const current = update.state.selection.main.head;\n if (current !== last) {\n last = current;\n // TODO(burdon): Null if end of line.\n const { element, point } = getPoint(update.view, current - 1);\n if (element && point) {\n blaster.spawn({ element, point });\n }\n }\n }),\n\n keymap.of([\n {\n any: (_, event) => {\n if (blaster) {\n if (event.key === 'Enter' && event.shiftKey) {\n blaster.shake({ time: 0.8 });\n return true;\n }\n }\n\n return false;\n },\n },\n ]),\n ];\n};\n\n//\n// Blaster (no CM deps).\n//\n\nclass Blaster {\n private readonly _effect: Effect;\n\n _canvas: HTMLCanvasElement | undefined;\n _ctx: CanvasRenderingContext2D | undefined | null;\n\n _running = false;\n _lastTime: number | undefined;\n _shakeTime = 0;\n _shakeTimeMax = 0;\n\n _particles: Particle[] = [];\n _particlePointer = 0;\n\n _lastPoint = { x: 0, y: 0 };\n\n constructor(private readonly _node: HTMLElement, private readonly _options: BlastOptions) {\n this._effect = this._options.effect === 1 ? new Effect1(_options) : new Effect2(_options);\n }\n\n get node() {\n return this._node;\n }\n\n initialize() {\n // console.log('initialize');\n invariant(!this._canvas && !this._ctx);\n\n this._canvas = document.createElement('canvas');\n this._canvas.id = 'code-blast-canvas';\n this._canvas.style.position = 'absolute';\n this._canvas.style.zIndex = '0';\n this._canvas.style.pointerEvents = 'none';\n // this._canvas.style.border = '2px dashed red';\n\n this._ctx = this._canvas.getContext('2d');\n\n const parent = this._node.parentElement?.parentElement;\n parent?.appendChild(this._canvas);\n\n this.resize();\n }\n\n destroy() {\n this.stop();\n // console.log('destroy');\n if (this._canvas) {\n this._canvas.remove();\n this._canvas = undefined;\n this._ctx = undefined;\n }\n }\n\n resize() {\n if (this._node.parentElement && this._canvas) {\n const { offsetLeft: x, offsetTop: y, offsetWidth: width, offsetHeight: height } = this._node.parentElement;\n this._canvas.style.top = `${y}px`;\n this._canvas.style.left = `${x}px`;\n this._canvas.width = width;\n this._canvas.height = height;\n }\n }\n\n start() {\n // console.log('start');\n invariant(this._canvas && this._ctx);\n this._running = true;\n this.loop();\n }\n\n stop() {\n // console.log('stop');\n this._running = false;\n this._node.style.transform = 'translate(0px, 0px)';\n }\n\n loop() {\n if (!this._running || !this._canvas || !this._ctx) {\n return;\n }\n\n this._ctx.clearRect(0, 0, this._canvas.width ?? 0, this._canvas.height ?? 0);\n\n // Calculate the delta from the previous frame.\n const now = new Date().getTime();\n this._lastTime ??= now;\n const dt = (now - this._lastTime) / 1000;\n this._lastTime = now;\n\n if (this._shakeTime > 0) {\n this._shakeTime -= dt;\n const magnitude = (this._shakeTime / this._shakeTimeMax) * this._options.shakeIntensity;\n const shakeX = random(-magnitude, magnitude);\n const shakeY = random(-magnitude, magnitude);\n this._node!.style.transform = `translate(${shakeX}px,${shakeY}px)`;\n }\n\n this.drawParticles();\n\n requestAnimationFrame(this.loop.bind(this));\n }\n\n shake = throttle<{ time: number }>(({ time }) => {\n this._shakeTime = this._shakeTimeMax || time;\n this._shakeTimeMax = time;\n }, 100);\n\n spawn = throttle<{ element: Element; point: { x: number; y: number } }>(({ element, point }) => {\n const color = getRGBComponents(element, this._options.color);\n const numParticles = random(this._options.particleNumRange.min, this._options.particleNumRange.max);\n const dir = this._lastPoint.x === point.x ? 0 : this._lastPoint.x < point.x ? 1 : -1;\n this._lastPoint = point;\n for (let i = numParticles; i--; i > 0) {\n this._particles[this._particlePointer] = this._effect.create(point.x - dir * 16, point.y, color);\n this._particlePointer = (this._particlePointer + 1) % this._options.maxParticles;\n }\n }, 100);\n\n drawParticles() {\n for (let i = this._particles.length; i--; i > 0) {\n const particle = this._particles[i];\n if (!particle) {\n continue;\n }\n\n if (particle.alpha < 0.01 || particle.size <= 0.5) {\n continue;\n }\n\n this._effect.update(this._ctx!, particle);\n }\n }\n}\n\n//\n// Effects\n//\n\ntype Particle = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n color: (string | number)[];\n alpha: number;\n theta?: number;\n drag?: number;\n wander?: number;\n};\n\nabstract class Effect {\n constructor(protected readonly _options: BlastOptions) {}\n abstract create(x: number, y: number, color: Particle['color']): Particle;\n abstract update(ctx: CanvasRenderingContext2D, particle: Particle): void;\n}\n\nclass Effect1 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.fillRect(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, particle.size);\n }\n}\n\n/**\n * Based on Soulwire's demo.\n * http://codepen.io/soulwire/pen/foktm\n */\nclass Effect2 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n theta: (random(0, 360) * Math.PI) / 180,\n drag: 0.92,\n wander: 0.15,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.vx *= particle.drag!;\n particle.vy *= particle.drag!;\n particle.theta! += random(-0.5, 0.5);\n particle.vx += Math.sin(particle.theta!) * 0.1;\n particle.vy += Math.cos(particle.theta!) * 0.1;\n particle.size *= this._options.particleShrinkRate;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.beginPath();\n ctx.arc(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n}\n\n//\n// Utils\n//\n\nfunction throttle<T>(callback: (arg: T) => void, limit: number): (arg: T) => void {\n let wait = false;\n return function (...args: any[]) {\n if (!wait) {\n // @ts-ignore\n callback.apply(this, args);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n };\n}\n\nconst getRGBComponents = (node: Element, color: BlastOptions['color']): Particle['color'] => {\n if (typeof color === 'function') {\n return color();\n }\n\n const bgColor = getComputedStyle(node).color;\n if (bgColor) {\n const x = bgColor.match(/(\\d+), (\\d+), (\\d+)/)?.slice(1);\n if (x) {\n return x;\n }\n }\n\n return [50, 50, 50];\n};\n\nconst random = (min: number, max: number) => {\n if (!max) {\n max = min;\n min = 0;\n }\n\n return min + ~~(Math.random() * (max - min + 1));\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Range } from '@codemirror/state';\nimport {\n ViewPlugin,\n type DecorationSet,\n EditorView,\n type ViewUpdate,\n Decoration,\n type BlockInfo,\n} from '@codemirror/view';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { getToken } from '../styles';\n\nconst CODE_REGEX = /```[\\s\\S]*?```/gs;\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-codeblock': {\n fontFamily: getToken('fontFamily.mono', []).join(','),\n },\n '&light [aria-readonly=\"true\"] .cm-codeblock': {\n background: getToken('extend.colors.neutral.50'),\n },\n '&dark [aria-readonly=\"true\"] .cm-codeblock': {\n background: getToken('extend.colors.neutral.850'),\n },\n '& [aria-readonly=\"true\"] .cm-codeblock': {\n display: 'block',\n paddingInline: '4px !important',\n },\n '& [aria-readonly=\"true\"] .cm-codeblock-first': {\n paddingTop: '4px !important',\n borderTopLeftRadius: '4px',\n borderTopRightRadius: '4px',\n },\n '& [aria-readonly=\"true\"] .cm-codeblock-last': {\n paddingBottom: '4px !important',\n borderBottomLeftRadius: '4px',\n borderBottomRightRadius: '4px',\n },\n});\n\n// TODO(burdon): Start from EditorView.lineBlockAt(pos).\nconst getLineRange = (lines: BlockInfo[], from: number, to: number) => {\n const start = lines.findIndex((line) => line.from >= from);\n const end = lines.findIndex((line) => line.to >= to);\n return [start, end];\n};\n\nexport const code = () => {\n const buildDecorations = (view: EditorView) => {\n const decorations: Range<Decoration>[] = [];\n const text = view.state.doc.sliceString(0);\n const matches = text.matchAll(CODE_REGEX);\n const blocks = view.viewportLineBlocks;\n for (const match of matches) {\n const range = getLineRange(blocks, match.index!, match.index! + match[0].length);\n for (let i = range[0]; i <= range[1]; i++) {\n const block = blocks[i];\n decorations.push(\n Decoration.line({\n class: mx('cm-codeblock', i === range[0] && 'cm-codeblock-first', i === range[1] && 'cm-codeblock-last'),\n }).range(block.from),\n );\n }\n }\n\n return Decoration.set(decorations);\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n hasFocus = false;\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (\n // TODO(burdon): Generalize for other extensions.\n this.hasFocus !== update.view.hasFocus ||\n update.startState.readOnly !== update.view.state.readOnly ||\n update.docChanged ||\n update.viewportChanged\n ) {\n this.hasFocus = update.view.hasFocus;\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// Copied from https://github.com/yjs/y-codemirror.next#example.\n\nimport * as random from 'lib0/random';\n\nconst cursorColors = [\n { color: '#30bced', light: '#30bced33' },\n { color: '#6eeb83', light: '#6eeb8333' },\n { color: '#ffbc42', light: '#ffbc4233' },\n { color: '#ecd444', light: '#ecd44433' },\n { color: '#ee6352', light: '#ee635233' },\n { color: '#9ac2c9', light: '#9ac2c933' },\n { color: '#8acb88', light: '#8acb8833' },\n { color: '#1be7ff', light: '#1be7ff33' },\n];\n\n// Select a random color for this user.\nexport const cursorColor = cursorColors[random.uint32() % cursorColors.length];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n// TODO(burdon): Better way to align vertically than negative margin? Font-specific?\n// https://tailwindcss.com/docs/font-weight\nexport const headings: Record<HeadingLevel, string[]> = {\n 1: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl', '-ml-[10px]'],\n 2: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl', '-ml-[8px]'],\n 3: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl', '-ml-[7px]'],\n 4: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-xl', '-ml-[6px]'],\n 5: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-lg', '-ml-[5px]'],\n 6: ['mbs-4 mbe-2 font-medium text-inherit no-underline', '-ml-[4px]'],\n};\n\nexport const heading = (level: HeadingLevel, readonly?: boolean) => {\n const [style, offset] = headings[level];\n return mx(style, readonly && offset);\n};\n\nexport const text = 'text-neutral-800 dark:text-neutral-200';\nexport const light = 'text-neutral-200 dark:text-neutral-800';\n\nexport const mark = mx('!font-normal !no-underline !text-inherit opacity-40', light);\n\nexport const paragraph = 'mlb-1';\n\nexport const bold = 'font-bold';\nexport const italic = 'italic';\nexport const strikethrough = 'line-through';\n\nexport const code = 'font-mono !no-underline text-neutral-700 dark:text-neutral-300';\nexport const codeMark = 'font-mono text-primary-500';\nexport const codeBlock = 'mlb-2 font-mono bg-neutral-500/10 p-3 rounded';\n\nexport const inlineUrl = mx(code, 'px-1');\n\nexport const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);\n\nexport const horizontalRule =\n 'flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-200 dark:border-neutral-800';\n\n// TODO(thure): Tailwind was not seeing `[&>li:before]:content-[\"•\"]` as a utility class, but it would work if instead of `\"•\"` it was `\"X\"`… why?\nexport const unorderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2';\nexport const orderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1';\n\nexport const listItem = 'contents before:[counter-increment:section]';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport type { StyleSpec } from 'style-mod';\n\nimport { tailwindConfig, type TailwindConfig } from '@dxos/react-ui-theme';\n\nexport type ThemeStyles = {\n [selector: string]: StyleSpec;\n};\n\n// TODO(thure): Why export the whole theme? Can this be done differently?\nexport const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;\n\nexport const getToken = (path: string, defaultValue: any = undefined) => get(tokens, path, defaultValue);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension, StateEffect, StateField, type Text } from '@codemirror/state';\nimport { hoverTooltip, keymap, type Command, Decoration, EditorView, type Rect } from '@codemirror/view';\nimport sortBy from 'lodash.sortby';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { semaphoreFacet } from './automerge/defs';\nimport { Cursor } from './cursor';\nimport { type CommentRange, type EditorModel, type Range } from '../hooks';\nimport { getToken } from '../styles';\nimport { callbackWrapper } from '../util';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-comment': {\n backgroundColor: getToken('extend.colors.yellow.50'),\n },\n '& .cm-comment-active': {\n backgroundColor: getToken('extend.colors.yellow.100'),\n },\n});\n\nconst marks = {\n highlight: Decoration.mark({ class: 'cm-comment' }),\n highlightActive: Decoration.mark({ class: 'cm-comment-active' }),\n};\n\n// TODO(burdon): Should this be part of state?\ntype CommentSelected = {\n active?: string;\n closest?: string;\n};\n\n// TODO(burdon): Rename.\ntype ExtendedCommentRange = Range &\n CommentRange & {\n // TODO(burdon): Not part of state; just required for callback.\n location?: Rect | null;\n };\n\nexport type CommentsState = CommentSelected & {\n ranges: ExtendedCommentRange[];\n};\n\nexport const setFocus = (view: EditorView, thread: string) => {\n const range = view.state.field(commentsStateField).ranges.find((range) => range.id === thread);\n if (!range) {\n return;\n }\n\n view.dispatch({\n effects: setSelection.of({ active: thread }),\n selection: { anchor: range.from },\n scrollIntoView: true, // TODO(burdon): Scroll to y-position (or center of screen?)\n });\n};\n\nexport const setCommentRange = StateEffect.define<{ model: EditorModel; comments: CommentRange[] }>();\n\nexport const setSelection = StateEffect.define<CommentSelected>();\n\nconst setCommentState = StateEffect.define<CommentsState>();\n\n/**\n * State field (reducer) that tracks comment ranges.\n * The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.\n */\nconst commentsStateField = StateField.define<CommentsState>({\n create: () => ({ ranges: [] }),\n update: (value, tr) => {\n const cursorConverter = tr.state.facet(Cursor.converter);\n\n for (const effect of tr.effects) {\n // Update selection.\n if (effect.is(setSelection)) {\n return { ...value, ...effect.value };\n }\n\n // Update range from store.\n if (effect.is(setCommentRange)) {\n const { comments } = effect.value;\n const ranges: ExtendedCommentRange[] = comments\n .map((comment) => {\n const range = Cursor.getRangeFromCursor(cursorConverter, comment.cursor);\n // console.log('update', JSON.stringify({ range, cursor: comment.cursor }, undefined, 2));\n return range && { ...comment, ...range };\n })\n .filter(nonNullable);\n\n return { ...value, ranges };\n }\n\n // Update entire state.\n if (effect.is(setCommentState)) {\n return effect.value;\n }\n }\n\n return value;\n },\n});\n\n/**\n * Decorate ranges.\n */\nconst highlightDecorations = EditorView.decorations.compute([commentsStateField], (state) => {\n const { active, ranges } = state.field(commentsStateField);\n const decorations =\n sortBy(ranges ?? [], (range) => range.from)\n ?.flatMap((selection) => {\n // TODO(burdon): Invalid range (e.g., deleted).\n if (selection.from === selection.to) {\n return undefined;\n }\n\n const range = { from: selection.from, to: selection.to };\n if (selection.id === active) {\n return marks.highlightActive.range(range.from, range.to);\n } else {\n return marks.highlight.range(range.from, range.to);\n }\n })\n .filter(nonNullable) ?? [];\n\n return Decoration.set(decorations);\n});\n\nexport type CommentsOptions = {\n /**\n * Key shortcut to create a new thread.\n */\n key?: string;\n /**\n * Called to create a new thread and return the thread id.\n */\n onCreate?: (cursor: string, location?: Rect | null) => string | undefined;\n /**\n * Selection cut/deleted.\n */\n onDelete?: (thread: string) => void;\n /**\n * Called when a comment is moved.\n */\n onUpdate?: (thread: string, cursor: string) => void;\n /**\n * Called to notify which thread is currently closest to the cursor.\n */\n onSelect?: (state: CommentsState) => void;\n /**\n * Called to render tooltip.\n */\n onHover?: (el: Element, shortcut: string) => void;\n};\n\n// TODO(burdon): Handle cut/restore via undo (need to integrate with history?)\nconst trackPastedComments = (onUpdate: NonNullable<CommentsOptions['onUpdate']>) => {\n // Cut/deleted comments.\n // Tracks indexed selections within text.\n let tracked: { text: Text; comments: { id: string; from: number; to: number }[] } | null = null;\n\n // Track cut or copy (enables cut-and-paste and copy-delete-paste to restore comment selection).\n const handleTrack = (event: Event, view: EditorView) => {\n const comments = view.state.field(commentsStateField);\n const { main } = view.state.selection;\n const selectedRanges = comments.ranges.filter(\n (range) => range.from >= main.from && range.to <= main.to && range.from < range.to,\n );\n\n if (!selectedRanges.length) {\n tracked = null;\n } else {\n tracked = {\n text: view.state.doc.slice(main.from, main.to),\n comments: selectedRanges.map((range) => ({\n id: range.id,\n from: range.from - main.from,\n to: range.to - main.from,\n })),\n };\n }\n\n // console.log('track', JSON.stringify({ tracked }, undefined, 2));\n };\n\n return [\n EditorView.domEventHandlers({\n cut: handleTrack,\n copy: handleTrack,\n }),\n\n // Handle paste.\n EditorView.updateListener.of(({ view, state, transactions }) => {\n if (tracked) {\n const paste = transactions.find((tr) => tr.isUserEvent('input.paste'));\n if (paste) {\n let found = -1;\n paste.changes.iterChanges((fromA, toA, fromB, toB, text) => {\n if (text.eq(tracked!.text)) {\n for (let i = transactions.indexOf(paste!) + 1; i < transactions.length; i++) {\n fromB = transactions[i].changes.mapPos(fromB);\n }\n\n found = fromB;\n }\n });\n\n if (found > -1) {\n const comments = tracked.comments;\n\n // Sync before recomputing cursor/range.\n // TODO(burdon): Generalize sync facet to decouple from automerge?\n view.state.facet(semaphoreFacet).reconcile(view);\n\n const active = state.field(commentsStateField).ranges;\n for (const moved of comments) {\n if (active.some((range) => range.id === moved.id && range.from === range.to)) {\n const range = {\n from: found + moved.from,\n to: found + moved.to,\n };\n\n const cursor = Cursor.getCursorFromRange(state.facet(Cursor.converter), range);\n // console.log('paste', JSON.stringify({ moved, range, cursor }, undefined, 2));\n onUpdate(moved.id, cursor);\n }\n }\n }\n\n tracked = null;\n }\n }\n }),\n ];\n};\n\n/**\n * Comment threads.\n * 1). Updates the EditorModel to store relative selections for a set of comments threads.\n * Since the selections are relative, they do not need to be updated when the document is edited.\n * 2). Implements a StateField to track absolute selections corresponding to the comments (i.e., when the document is edited).\n * 3). Creates decoration marks to apply classes to each selection.\n * 4). Tracks the current cursor position to:\n * a). Update the decoration to show if the cursor is within a current selection.\n * b). Calls a handler to indicate which is the closest selection (e.g., to update the thread sidebar).\n * 5). Optionally, implements a hoverTooltip to show hints when creating a selection range.\n */\nexport const comments = (options: CommentsOptions = {}): Extension => {\n const { key: shortcut = \"meta-'\" } = options;\n\n const handleSelect = debounce((state: CommentsState) => options.onSelect?.(state), 200);\n\n /**\n * Create comment thread action.\n */\n const createCommentThread: Command = (view) => {\n const cursorConverter = view.state.facet(Cursor.converter);\n\n invariant(options.onCreate);\n const { from, to } = view.state.selection.main;\n if (from === to) {\n return false;\n }\n\n const cursor = Cursor.getCursorFromRange(cursorConverter, { from, to });\n if (cursor) {\n // Create thread via callback.\n const id = callbackWrapper(options.onCreate)(cursor, view.coordsAtPos(from));\n if (id) {\n // Update range.\n view.dispatch({\n effects: setSelection.of({ active: id }),\n selection: { anchor: from },\n });\n\n return true;\n }\n }\n\n return false;\n };\n\n return [\n commentsStateField,\n highlightDecorations,\n styles,\n\n //\n // Keymap.\n //\n options.onCreate\n ? keymap.of([\n {\n key: shortcut,\n run: callbackWrapper(createCommentThread),\n },\n ])\n : [],\n\n //\n // Hover tooltip (for key shortcut hints, etc.)\n // TODO(burdon): Factor out to generic hints extension for current selection/line.\n //\n options.onHover\n ? hoverTooltip(\n (view, pos) => {\n const selection = view.state.selection.main;\n if (selection && pos >= selection.from && pos <= selection.to) {\n return {\n pos: selection.from,\n end: selection.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n options.onHover!(el, shortcut);\n return { dom: el, offset: { x: 0, y: 8 } };\n },\n };\n }\n\n return null;\n },\n {\n // TODO(burdon): Hide on change triggered immediately?\n // hideOnChange: true,\n hoverTime: 1_000,\n },\n )\n : [],\n\n //\n // Monitor cursor movement and text updates.\n // TODO(burdon): Is there a better (finer grained) way to do this?\n //\n EditorView.updateListener.of(({ view, state, changes }) => {\n const cursorConverter = view.state.facet(Cursor.converter);\n\n //\n // Test if need to recompute indexed range if document changes before the end of the range.\n //\n {\n let mod = false;\n const { active, ranges } = state.field(commentsStateField);\n changes.iterChanges((from, to, from2, to2) => {\n // TODO(burdon): Skip deleted (tracked) ranges.\n ranges.forEach((range) => {\n if (from2 === to2) {\n const newRange = Cursor.getRangeFromCursor(cursorConverter, range.cursor);\n if (!newRange || newRange.to - newRange.from === 0) {\n options.onDelete?.(range.id);\n }\n }\n\n if (from <= range.to) {\n const newRange = Cursor.getRangeFromCursor(cursorConverter, range.cursor);\n Object.assign(range, newRange);\n mod = true;\n }\n });\n });\n\n if (mod) {\n view.dispatch({ effects: setCommentState.of({ active, ranges }) });\n }\n }\n\n //\n // Track the current selection.\n //\n {\n const { head } = state.selection.main;\n\n let min = Infinity;\n const { active, closest, ranges } = state.field(commentsStateField);\n const selected: CommentSelected = { active: undefined, closest: undefined };\n\n // TODO(burdon): Skip deleted (tracked) ranges.\n ranges.forEach((comment) => {\n const d = Math.min(Math.abs(head - comment.from), Math.abs(head - comment.to));\n if (head >= comment.from && head <= comment.to) {\n selected.active = comment.id;\n }\n if (d < min) {\n selected.closest = comment.id;\n min = d;\n }\n });\n\n if (selected.active !== active || selected.closest !== closest) {\n view.dispatch({ effects: setSelection.of(selected) });\n\n // Update callback.\n handleSelect({\n ...selected,\n ranges: ranges.map((range) => ({ ...range, location: view.coordsAtPos(range.from) })),\n });\n }\n }\n }),\n\n options.onUpdate ? trackPastedComments(options.onUpdate) : [],\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { log } from '@dxos/log';\n\n/**\n * CodeMirror callbacks swallow errors so wrap handlers.\n */\n// TODO(burdon): Figure out how to systematize this.\nexport const callbackWrapper = <T extends Function>(fn: T): T =>\n ((...args: any[]) => {\n try {\n return fn(...args);\n } catch (error) {\n log.catch(error);\n }\n }) as unknown as T;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport { getToken } from '../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-hr': {\n // TODO(burdon): ???\n // Note that block-level decorations should not have vertical margins,\n borderBottom: `1px solid ${getToken('extend.colors.neutral.200')}`,\n },\n});\n\nclass HorizontalRuleWidget extends WidgetType {\n constructor(readonly _pos: number) {\n super();\n }\n\n override eq(other: this) {\n return this._pos === (other as any as HorizontalRuleWidget)._pos;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('div');\n el.className = 'cm-hr';\n return el;\n }\n}\n\n// TODO(burdon): Like Tasklist, allow cursor to move into range.\n\n// NOTE: Without a blank line before this markup will treat the previous line as a heading.\n// https://www.markdownguide.org/basic-syntax/#horizontal-rules\nconst placeholderMatcher = new MatchDecorator({\n // regexp: /(?<=\\n\\n)---/gs,\n regexp: /^---$/gs,\n decoration: (match, view, pos) =>\n Decoration.replace({\n widget: new HorizontalRuleWidget(pos),\n }),\n});\n\nexport const hr = () => [\n styles,\n ViewPlugin.fromClass(\n class {\n rules: DecorationSet;\n constructor(view: EditorView) {\n this.rules = placeholderMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.rules = placeholderMatcher.updateDeco(update, this.rules);\n }\n },\n {\n decorations: (instance) => instance.rules,\n },\n ),\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type Extension, StateField, type Transaction, type Range } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, WidgetType } from '@codemirror/view';\n\nexport type ImageOptions = {};\n\nexport const image = (options: ImageOptions = {}): Extension => {\n return StateField.define<DecorationSet>({\n create: (state) => {\n return Decoration.set(buildDecorations(0, state.doc.length, state));\n },\n update: (value: DecorationSet, tr: Transaction) => {\n if (!tr.docChanged && !tr.selection) {\n return value;\n }\n // Find range of changes and cursor changes.\n const cursor = tr.state.selection.main.head;\n const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);\n let from = Math.min(cursor, oldCursor);\n let to = Math.max(cursor, oldCursor);\n tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {\n from = Math.min(from, fromB);\n to = Math.max(to, toB);\n });\n // Expand to cover lines\n from = tr.state.doc.lineAt(from).from;\n to = tr.state.doc.lineAt(to).to;\n return value.map(tr.changes).update({\n filterFrom: from,\n filterTo: to,\n filter: () => false,\n add: buildDecorations(from, to, tr.state),\n });\n },\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nconst buildDecorations = (from: number, to: number, state: EditorState) => {\n const decorations: Range<Decoration>[] = [];\n const cursor = state.selection.main.head;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'Image') {\n const urlNode = node.node.getChild('URL');\n if (urlNode) {\n const hide = state.readOnly || cursor < node.from || cursor > node.to;\n const url = state.sliceDoc(urlNode.from, urlNode.to);\n decorations.push(\n Decoration.replace({\n block: true, // Prevent cursor from entering.\n widget: new ImageWidget(url),\n }).range(hide ? node.from : node.to, node.to),\n );\n }\n }\n },\n from,\n to,\n });\n\n return decorations;\n};\n\nclass ImageWidget extends WidgetType {\n constructor(readonly _url: string) {\n super();\n }\n\n override eq(other: this) {\n return this._url === (other as any as ImageWidget)._url;\n }\n\n override toDOM(view: EditorView) {\n const img = document.createElement('img');\n img.setAttribute('src', this._url);\n img.setAttribute('class', 'cm-image');\n // Images are hidden until successfully loaded to avoid flickering effects.\n img.onload = () => img.classList.add('cm-loaded-image');\n return img;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport {\n hoverTooltip,\n Decoration,\n type DecorationSet,\n type EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\nexport type LinkOptions = {\n link?: boolean;\n onHover?: (el: Element, url: string) => void;\n onRender?: (el: Element, url: string) => void;\n};\n\n/**\n * Creates a state field to replace AST elements with a hyperlink widget.\n * https://codemirror.net/docs/ref/#state.StateField\n */\nexport const link = (options: LinkOptions = {}): Extension => {\n const extensions: Extension[] = [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view, options);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view, options);\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n },\n ),\n ];\n\n if (options.onHover) {\n extensions.push(\n // https://codemirror.net/examples/tooltip\n // https://codemirror.net/docs/ref/#view.hoverTooltip\n // https://github.com/codemirror/view/blob/main/src/tooltip.ts\n hoverTooltip((view, pos, side) => {\n const syntax = syntaxTree(view.state).resolveInner(pos, side);\n let link = null;\n for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {\n link = node.name === 'Link' ? node : null;\n }\n const url = link && link.getChild('URL');\n if (!url || !link) {\n return null;\n }\n const urlText = view.state.sliceDoc(url.from, url.to);\n return {\n pos: link.from,\n end: link.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n el.className = tooltipContent({}, 'pli-2 plb-1');\n options.onHover!(el, urlText);\n return { dom: el, offset: { x: 0, y: 4 } };\n },\n };\n }),\n );\n }\n\n return extensions;\n};\n\nclass LinkButton extends WidgetType {\n constructor(private readonly _url: string, private readonly _onAttach: LinkOptions['onRender']) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('span');\n this._onAttach!(el, this._url);\n return el;\n }\n}\n\nclass LinkText extends WidgetType {\n constructor(private readonly _text: string, private readonly _url?: string) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override toDOM(view: EditorView) {\n const link = document.createElement('a');\n link.setAttribute('class', 'cm-link');\n link.textContent = this._text;\n if (this._url) {\n link.setAttribute('rel', 'noreferrer');\n link.setAttribute('target', '_blank');\n link.href = this._url;\n } else {\n link.onclick = () => {\n view.dispatch({\n selection: {\n anchor: view.posAtDOM(link),\n },\n });\n };\n }\n\n return link;\n }\n}\n\n/**\n * Range sets provide a data structure that can hold a collection of tagged,\n * possibly overlapping ranges in such a way that they can efficiently be mapped though document changes.\n * https://codemirror.net/docs/ref/#state\n */\nconst buildDecorations = (view: EditorView, options: LinkOptions): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n if (node.name === 'Link') {\n const marks = node.node.getChildren('LinkMark');\n const text = marks.length >= 2 ? state.sliceDoc(marks[0].to, marks[1].from) : '';\n const urlNode = node.node.getChild('URL');\n const url = urlNode ? state.sliceDoc(urlNode.from, urlNode.to) : '';\n if (!url) {\n return false;\n }\n\n if (!view.hasFocus || state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new LinkText(text, options.link ? url : undefined),\n }),\n );\n }\n\n if (options.onRender) {\n builder.add(\n node.to,\n node.to,\n Decoration.replace({\n widget: new LinkButton(url, options.onRender),\n }),\n );\n }\n\n return false;\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type ListenerOptions = {\n onFocus?: (focused: boolean) => void;\n onChange?: (text: string) => void;\n};\n\n/**\n * Event listener.\n */\nexport const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {\n const extensions: Extension[] = [];\n\n onFocus &&\n extensions.push(\n EditorView.focusChangeEffect.of((_, focused) => {\n onFocus(focused);\n return null;\n }),\n );\n\n onChange &&\n extensions.push(\n EditorView.updateListener.of((update) => {\n onChange(update.state.doc.toString());\n }),\n );\n\n return extensions;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { history, historyKeymap, indentWithTab, standardKeymap } from '@codemirror/commands';\nimport { markdownLanguage, markdown } from '@codemirror/lang-markdown';\nimport { bracketMatching, defaultHighlightStyle, indentOnInput, syntaxHighlighting } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { searchKeymap } from '@codemirror/search';\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport {\n crosshairCursor,\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nimport { markdownHighlightStyle, markdownTagsExtensions } from './highlight';\n\nexport type MarkdownBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\n/**\n * Markdown bundle.\n * Refs:\n * https://github.com/codemirror/basic-setup\n * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts#L50\n * https://codemirror.net/docs/community\n * https://codemirror.net/docs/ref/#codemirror.basicSetup\n */\n// TODO(burdon): Add Composer here: https://codemirror.net/docs/community\nexport const markdownBundle = ({\n readonly,\n themeMode,\n placeholder: _placeholder,\n}: MarkdownBundleOptions): Extension[] => {\n return [\n EditorState.allowMultipleSelections.of(true),\n EditorState.tabSize.of(2),\n EditorView.lineWrapping,\n\n customKeymap(),\n\n bracketMatching(),\n closeBrackets(),\n crosshairCursor(),\n dropCursor(),\n drawSelection(),\n highlightActiveLine(),\n history(),\n indentOnInput(),\n _placeholder && placeholder(_placeholder),\n\n // Main extension.\n // https://github.com/codemirror/lang-markdown\n // https://codemirror.net/5/mode/markdown/index.html (demo).\n markdown({\n // GRM by default (vs strict CommonMark):\n // Table, TaskList, Strikethrough, and Autolink.\n // NOTE: This extends the parser; it doesn't affect rendering.\n // https://github.github.com/gfm\n // https://github.com/lezer-parser/markdown?tab=readme-ov-file#github-flavored-markdown\n base: markdownLanguage,\n\n // Languages for syntax highlighting fenced code blocks.\n codeLanguages: languages,\n\n // Parser extensions.\n extensions: [\n // GFM provided by default.\n markdownTagsExtensions,\n ],\n }),\n\n // https://github.com/codemirror/theme-one-dark\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n\n // Custom styles.\n syntaxHighlighting(markdownHighlightStyle(readonly)),\n ].filter(Boolean) as Extension[];\n};\n\n// https://codemirror.net/docs/ref/#view.keymap\nconst customKeymap = () =>\n keymap.of([\n // https://codemirror.net/docs/ref/#commands.indentWithTab\n indentWithTab,\n // https://codemirror.net/docs/ref/#commands.standardKeymap\n ...standardKeymap,\n // https://codemirror.net/docs/ref/#commands.historyKeymap\n ...historyKeymap,\n // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap\n ...closeBracketsKeymap,\n // https://codemirror.net/docs/ref/#search.searchKeymap\n ...searchKeymap,\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle } from '@codemirror/language';\nimport { tags, styleTags, Tag } from '@lezer/highlight';\nimport { type MarkdownConfig, Table } from '@lezer/markdown';\n\nimport {\n blockquote,\n bold,\n code,\n codeMark,\n getToken,\n heading,\n inlineUrl,\n italic,\n mark,\n strikethrough,\n} from '../../styles';\n\n/**\n * Custom tags defined and processed by the GFM lezer extension.\n * https://github.com/lezer-parser/markdown\n * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts\n */\nexport const markdownTags = {\n Blockquote: Tag.define(),\n CodeMark: Tag.define(),\n CodeText: Tag.define(),\n EmphasisMark: Tag.define(),\n HeaderMark: Tag.define(),\n InlineCode: Tag.define(),\n LinkLabel: Tag.define(),\n LinkReference: Tag.define(),\n ListMark: Tag.define(),\n QuoteMark: Tag.define(),\n URL: Tag.define(),\n\n // Custom.\n TableCell: Tag.define(),\n};\n\n// TODO(burdon): Customize table parser (make all content monospace).\n// https://github.com/lezer-parser/markdown/blob/main/src/extension.ts\nTable.defineNodes?.forEach((node: any) => {\n switch (node?.name) {\n case 'TableCell': {\n node.style = markdownTags.TableCell;\n break;\n }\n }\n});\n\nexport const markdownTagsExtensions: MarkdownConfig[] = [\n Table,\n {\n props: [styleTags(markdownTags)],\n },\n];\n\n/**\n * Styling based on `lezer` parser tags.\n * https://codemirror.net/examples/styling\n * https://github.com/lezer-parser/highlight\n * https://github.com/lezer-parser/highlight/blob/main/src/highlight.ts#L427\n * https://lezer.codemirror.net/docs/ref/#highlight.tags (list of tags)\n *\n * Examples:\n * - https://github.com/codemirror/language/blob/main/src/highlight.ts#L194\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts#L115\n */\nexport const markdownHighlightStyle = (readonly?: boolean) => {\n return HighlightStyle.define(\n [\n {\n tag: [\n tags.keyword,\n tags.name,\n tags.deleted,\n tags.character,\n tags.propertyName,\n tags.macroName,\n tags.color,\n tags.constant(tags.name),\n tags.standard(tags.name),\n tags.definition(tags.name),\n tags.separator,\n tags.typeName,\n tags.className,\n tags.number,\n tags.changed,\n tags.annotation,\n tags.modifier,\n tags.self,\n tags.namespace,\n tags.operator,\n tags.operatorKeyword,\n tags.escape,\n tags.regexp,\n tags.special(tags.string),\n tags.meta,\n tags.comment,\n tags.atom,\n tags.bool,\n tags.special(tags.variableName),\n tags.processingInstruction,\n tags.string,\n tags.inserted,\n tags.invalid,\n ],\n color: 'inherit !important',\n },\n\n // Markdown marks.\n {\n tag: [\n tags.meta,\n tags.processingInstruction,\n markdownTags.LinkLabel,\n markdownTags.LinkReference,\n markdownTags.ListMark,\n ],\n class: mark,\n },\n\n // Markdown marks.\n {\n tag: [markdownTags.CodeMark, markdownTags.HeaderMark, markdownTags.QuoteMark, markdownTags.EmphasisMark],\n class: readonly ? 'hidden' : mark,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: readonly ? 'hidden' : codeMark,\n },\n\n {\n tag: [tags.monospace],\n class: 'font-mono',\n },\n\n // Headings.\n { tag: tags.heading1, class: heading(1, readonly) },\n { tag: tags.heading2, class: heading(2, readonly) },\n { tag: tags.heading3, class: heading(3, readonly) },\n { tag: tags.heading4, class: heading(4, readonly) },\n { tag: tags.heading5, class: heading(5, readonly) },\n { tag: tags.heading6, class: heading(6, readonly) },\n\n // Emphasis.\n { tag: tags.emphasis, class: italic },\n { tag: tags.strong, class: bold },\n { tag: tags.strikethrough, class: strikethrough },\n\n // Naked URLs.\n {\n tag: [markdownTags.URL],\n class: inlineUrl,\n },\n\n // NOTE: The `markdown` extension configures extensions for `lezer` to parse markdown tokens (incl. below).\n // However, since `codeLanguages` is also defined, the `lezer` will not parse fenced code blocks,\n // when a language is specified. In this case, the syntax highlighting extensions will colorize\n // the code, but all other CSS properties will be inherited.\n // IMPORTANT: Therefore, the fenced code block will use the base editor font.\n {\n tag: [markdownTags.CodeText, markdownTags.InlineCode],\n class: code,\n },\n\n {\n tag: [markdownTags.QuoteMark],\n class: blockquote,\n },\n\n {\n tag: [markdownTags.TableCell],\n class: 'font-mono',\n },\n\n // Main content, paragraphs, etc.\n // {\n // tag: [tags.content],\n // fontFamily: getToken('fontFamily.body', []).join(','),\n // },\n ],\n {\n scope: markdownLanguage,\n all: { fontFamily: getToken('fontFamily.body', []).join(',') },\n },\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { autocompletion, type CompletionContext, type CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\n\nexport type MentionOptions = {\n onSearch: (text: string) => string[];\n};\n\nexport const mention = ({ onSearch }: MentionOptions): Extension => {\n return autocompletion({\n closeOnBlur: false, // For debugging.\n override: [\n (context: CompletionContext): CompletionResult | null => {\n const match = context.matchBefore(/@(\\w+)?/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n console.log(match);\n\n return {\n from: match.from,\n options: onSearch(match.text.slice(1).toLowerCase()).map((value) => ({ label: `@${value}` })),\n };\n },\n ],\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\n\nexport type OutlinerOptions = {};\n\n// TODO(burdon): Experimental component: multiple hierarchical draggable editor sections.\nexport const outliner = (options: OutlinerOptions = {}): Extension => {\n return [];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type RangeSet, RangeSetBuilder, StateField, type Transaction } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\n// TODO(burdon): Snippet to create basic table.\n// https://codemirror.net/docs/ref/#autocomplete.snippet\n\n// TODO(burdon): Advanced formatting (left/right/center).\n// TODO(burdon): Editor to auto balance columns.\n\nexport type TableOptions = {};\n\n/**\n * GFM tables.\n * https://github.github.com/gfm/#tables-extension\n */\nexport const table = (options: TableOptions = {}) => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, options),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, options),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\ntype Table = {\n from: number;\n to: number;\n header?: string[];\n rows?: string[][];\n};\n\nconst update = (state: EditorState, options: TableOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n const tables: Table[] = [];\n const getTable = () => tables[tables.length - 1];\n const getRow = () => {\n const table = getTable();\n return table.rows?.[table.rows.length - 1];\n };\n\n // Parse table.\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n switch (node.name) {\n case 'Table': {\n tables.push({ from: node.from, to: node.to });\n break;\n }\n case 'TableHeader': {\n getTable().header = [];\n break;\n }\n case 'TableRow': {\n (getTable().rows ??= []).push([]);\n break;\n }\n case 'TableCell': {\n const row = getRow();\n if (row) {\n row.push(state.sliceDoc(node.from, node.to));\n } else {\n getTable().header?.push(state.sliceDoc(node.from, node.to));\n }\n break;\n }\n }\n },\n });\n\n tables.forEach((table) => {\n const hide = state.readOnly || cursor < table.from || cursor > table.to;\n hide &&\n builder.add(\n table.from,\n table.to,\n Decoration.replace({\n widget: new TableWidget(table),\n }),\n );\n\n // Add class for styling.\n builder.add(table.from, table.to, Decoration.mark({ class: 'cm-table' }));\n });\n\n return builder.finish();\n};\n\nclass TableWidget extends WidgetType {\n constructor(readonly _table: Table) {\n super();\n }\n\n override eq(other: this) {\n return (\n this._table.header?.join() === other._table.header?.join() &&\n this._table.rows?.join() === other._table.rows?.join()\n );\n }\n\n override toDOM(view: EditorView) {\n const table = document.createElement('table');\n\n {\n const header = table.appendChild(document.createElement('thead'));\n const tr = header.appendChild(document.createElement('tr'));\n this._table.header?.forEach((cell) => {\n const th = document.createElement('th');\n th.setAttribute('class', 'cm-table-head');\n tr.appendChild(th).textContent = cell;\n });\n }\n\n {\n const body = table.appendChild(document.createElement('tbody'));\n this._table.rows?.forEach((row) => {\n const tr = body.appendChild(document.createElement('tr'));\n row.forEach((cell) => {\n const td = document.createElement('td');\n td.setAttribute('class', 'cm-table-cell');\n tr.appendChild(td).textContent = cell;\n });\n });\n }\n\n return table;\n }\n\n override ignoreEvent(e: Event) {\n return !/^mouse/.test(e.type);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, Decoration, WidgetType, ViewPlugin, type DecorationSet, type ViewUpdate } from '@codemirror/view';\n\nclass CheckboxWidget extends WidgetType {\n constructor(private _checked: boolean) {\n super();\n }\n\n override eq(other: this) {\n return this._checked === other._checked;\n }\n\n override toDOM(view: EditorView) {\n const input = document.createElement('input');\n input.type = 'checkbox';\n input.checked = this._checked;\n if (view.state.readOnly) {\n input.setAttribute('disabled', 'true');\n } else {\n input.onmousedown = (event: Event) => {\n const pos = view.posAtDOM(input);\n const text = view.state.sliceDoc(pos, pos + 3);\n if (text === (this._checked ? '[x]' : '[ ]')) {\n view.dispatch({\n changes: { from: pos + 1, to: pos + 2, insert: this._checked ? ' ' : 'x' },\n });\n event.preventDefault();\n }\n };\n }\n\n return input;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nconst checkedDeco = Decoration.replace({ widget: new CheckboxWidget(true) });\nconst uncheckedDeco = Decoration.replace({ widget: new CheckboxWidget(false) });\n\nexport type TasklistOptions = {};\n\nexport const tasklist = (options: TasklistOptions = {}) => {\n return ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n // TODO(burdon): Is this still required?\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.decorations || Decoration.none;\n }),\n },\n );\n};\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n if (node.name === 'TaskMarker' && (cursor < node.from || cursor > node.to)) {\n const checked = state.doc.sliceString(node.from + 1, node.to - 1) === 'x';\n builder.add(node.from, node.to, checked ? checkedDeco : uncheckedDeco);\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\n\n// TODO(burdon): Review https://github.com/sergeche/codemirror-movie?tab=readme-ov-file\n\nexport type DemoOptions = {\n delay?: number;\n items?: string[];\n};\n\nconst defaultItems = ['hello world!', 'this is a test.', 'this is [DXOS](https://dxos.org)'];\n\n/**\n * Configurable plugin that let's user cycle through pre-configured input script.\n */\nexport const typewriter = ({ delay = 75, items = defaultItems }: DemoOptions = {}): Extension => {\n let t: any;\n let idx = 0; // TODO(burdon): Make global.\n\n return [\n keymap.of([\n {\n // Reset.\n key: \"alt-meta-'\",\n run: (view) => {\n clearTimeout(t);\n idx = 0;\n return true;\n },\n },\n {\n // Next prompt.\n // TODO(burdon): Press 1-9 to select prompt?\n key: \"shift-meta-'\",\n run: (view) => {\n clearTimeout(t);\n // TODO(burdon): Add space if needed.\n const text = items[idx++];\n if (idx === items?.length) {\n idx = 0;\n }\n\n let i = 0;\n const insert = (d = 0) => {\n t = setTimeout(() => {\n const pos = view.state.selection.main.head;\n view.dispatch({\n changes: { from: pos, insert: text[i++] },\n selection: { anchor: pos + 1 },\n });\n\n if (i < text.length) {\n insert(Math.random() * delay * (text[i] === ' ' ? 2 : 1));\n }\n }, d);\n };\n\n insert();\n return true;\n },\n },\n ]),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { yCollab } from 'y-codemirror.next';\nimport type * as YP from 'y-protocols/awareness';\n\nimport type { YText } from '@dxos/text-model';\n\nimport { cursorConverter } from './cursor';\nimport { Cursor } from '../cursor';\n\nexport const yjs = (content: YText, awareness?: YP.Awareness) => [\n Cursor.converter.of(cursorConverter(content)),\n yCollab(content, awareness),\n];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Y from 'yjs';\n\nimport { arrayToString, stringToArray } from '@dxos/util';\n\nimport { type CursorConverter } from '../cursor';\n\nexport const cursorConverter = (text: Y.Text): CursorConverter => ({\n toCursor: (index, assoc) => {\n return arrayToString(Y.encodeRelativePosition(Y.createRelativePositionFromTypeIndex(text, index, assoc)));\n },\n\n fromCursor: (cursor) => {\n return (\n Y.createAbsolutePositionFromRelativePosition(Y.decodeRelativePosition(stringToArray(cursor)), text.doc!)?.index ??\n 0\n );\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\n\nimport { type ThemeStyles, tokens } from '../styles';\n\n// TODO(burdon): Can we use @apply and import css file?\n// https://tailwindcss.com/docs/reusing-styles#extracting-classes-with-apply?\n\n/**\n * Minimal styles.\n * https://codemirror.net/examples/styling\n *\n * Examples:\n * - https://github.com/codemirror/view/blob/main/src/theme.ts\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts\n *\n * NOTE: Use one of '&', '&light', and '&dark' prefix to scope instance.\n * NOTE: `light` and `dark` selectors are preprocessed by CodeMirror and can only be in the base theme.\n */\nexport const defaultTheme: ThemeStyles = {\n //\n // Main layout:\n // https://codemirror.net/examples/styling\n //\n // <div class=\"cm-editor [cm-focused] [generated classes]\">\n // <div class=\"cm-scroller\">\n // <div class=\"cm-gutters\">\n // <div class=\"cm-gutter [...]\">\n // <div class=\"cm-gutterElement\">...</div>\n // </div>\n // </div>\n // <div class=\"cm-content\" role=\"textbox\" contenteditable=\"true\">\n // <div class=\"cm-line\"></div>\n // </div>\n // <div class=\"cm-selectionLayer\">\n // <div class=\"cm-selectionBackground\"></div>\n // </div>\n // <div class=\"cm-cursorLayer\">\n // <div class=\"cm-cursor\"></div>\n // </div>\n // </div>\n // </div>\n //\n\n '&': {},\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n overflow: 'visible',\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n\n '.cm-content': {\n padding: 0,\n // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).\n fontSize: '16px',\n },\n '&light .cm-content': {\n color: get(tokens, 'extend.colors.neutral.900', 'black'),\n caretColor: 'black',\n },\n '&dark .cm-content': {\n color: get(tokens, 'extend.colors.neutral.100', 'white'),\n caretColor: 'white',\n },\n\n //\n // Cursor\n //\n '&light .cm-cursor, &light .cm-dropCursor': {\n borderLeft: '2px solid black',\n },\n '&dark .cm-cursor, &dark .cm-dropCursor': {\n borderLeft: '2px solid white',\n },\n '.cm-placeholder': {\n fontWeight: 100,\n },\n\n //\n // line\n //\n '.cm-line': {\n paddingInline: 0,\n // TODO(burdon): Other values leave gaps between lines when highlighted.\n // lineHeight: 'normal',\n },\n '.cm-activeLine': {\n background: 'inherit',\n },\n\n //\n // Selection\n //\n\n '&light .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.100'),\n },\n '&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.200'),\n },\n '&dark .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.700'),\n },\n '&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.600'),\n },\n\n //\n // Search\n //\n\n '&light .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.100'),\n },\n '&dark .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.700'),\n },\n\n //\n // link\n //\n '.cm-link': {\n color: get(tokens, 'extend.colors.primary.500'),\n textDecorationLine: 'underline',\n textDecorationThickness: '1px',\n textUnderlineOffset: '2px',\n borderRadius: '.125rem',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n\n //\n // tooltip\n //\n '.cm-tooltip': {\n border: 'none',\n },\n '.cm-tooltip-below': {},\n\n //\n // autocomplete\n //\n '.cm-tooltip-autocomplete': {\n marginTop: '4px',\n marginLeft: '-3px',\n },\n '.cm-tooltip-autocomplete ul li': {},\n '.cm-tooltip-autocomplete ul li[aria-selected]': {},\n '.cm-completionIcon': {\n display: 'none',\n },\n '.cm-completionLabel': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '.cm-completionMatchedText': {\n textDecoration: 'none',\n },\n\n //\n // table\n //\n '.cm-table *': {\n fontFamily: `${get(tokens, 'fontFamily.mono', []).join(',')} !important`,\n textDecoration: 'none !important',\n },\n '.cm-table-head': {\n padding: '2px 16px 2px 0px',\n borderBottom: `1px solid ${get(tokens, 'extend.colors.neutral.500')}`,\n fontWeight: 100,\n textAlign: 'left',\n color: get(tokens, 'extend.colors.neutral.500'),\n },\n '.cm-table-cell': {\n padding: '2px 16px 2px 0px',\n },\n\n //\n // image\n //\n '.cm-image': {\n display: 'block',\n height: '0',\n },\n '.cm-image.cm-loaded-image': {\n height: 'auto',\n borderTop: '0.5rem solid transparent',\n borderBottom: '0.5rem solid transparent',\n },\n\n //\n // font size\n // TODO(thure): This appears to be the best or only way to set selection caret heights,\n // but it's far more verbose than it needs to be.\n //\n // ...Object.keys(get(tokens, 'extend.fontSize', {})).reduce((acc: Record<string, any>, fontSize) => {\n // const height = get(tokens, ['extend', 'fontSize', fontSize, 1, 'lineHeight']);\n //\n // acc[`& .text-${fontSize} + .cm-ySelectionCaret`] = { height };\n // acc[`& .text-${fontSize} + .cm-ySelection + .cm-ySelectionCaret`] = { height };\n // acc[`& .text-${fontSize} + .cm-widgetBuffer + .cm-ySelectionCaret`] = { height };\n // return acc;\n // }, {}),\n\n /**\n * Panels\n * TODO(burdon): Needs styling attention (esp. dark mode).\n * https://github.com/codemirror/search/blob/main/src/search.ts#L745\n *\n * Find/replace panel.\n * <div class=\"cm-announced\">...</div>\n * <div class=\"cm-scroller\">...</div>\n * <div class=\"cm-panels cm-panels-bottom\">\n * <div class=\"cm-search cm-panel\">\n * <input class=\"cm-textfield\" />\n * <button class=\"cm-button\">...</button>\n * <label><input type=\"checkbox\" />...</label>\n * </div>\n * </div\n */\n '.cm-panels': {\n border: `1px solid ${get(tokens, 'extend.colors.neutral.200')}`,\n },\n '.cm-panel': {\n background: get(tokens, 'extend.colors.neutral.50'),\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '.cm-button': {\n margin: '4px',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n background: get(tokens, 'extend.colors.neutral.100'),\n backgroundImage: 'none',\n border: 'none',\n '&:hover': {\n background: get(tokens, 'extend.colors.neutral.200'),\n },\n '&:active': {\n background: get(tokens, 'extend.colors.neutral.300'),\n backgroundImage: 'none',\n },\n },\n '.cm-panel input[type=checkbox]': {\n marginRight: '0.4rem !important',\n },\n};\n\nexport const textTheme: ThemeStyles = {\n '.cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '.cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const markdownTheme: ThemeStyles = {\n '.cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '.cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const codeTheme: ThemeStyles = {\n '.cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n '.cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport get from 'lodash.get';\n\nimport { type AutomergeTextCompat, getRawDoc } from '@dxos/echo-schema';\nimport { isNotNullOrUndefined } from '@dxos/util';\n\nimport { SpaceAwarenessProvider } from './awareness-provider';\nimport { type EditorModel, modelState, type UseTextModelProps } from './useTextModel';\nimport { automerge, awareness, AwarenessProvider } from '../extensions';\nimport { cursorColor } from '../styles';\n\nexport const createAutomergeModel = ({ space, identity, text }: UseTextModelProps): EditorModel => {\n const obj = text as any as AutomergeTextCompat;\n const doc = getRawDoc(obj, [obj.field]);\n\n const awarenessProvider =\n space &&\n new SpaceAwarenessProvider({\n space,\n channel: `automerge.awareness.${obj.id}`,\n info: {\n displayName: identity?.profile?.displayName ?? '',\n color: cursorColor.color,\n lightColor: cursorColor.light,\n },\n peerId: identity?.identityKey.toHex() ?? 'Anonymous',\n });\n\n const model: EditorModel = {\n id: obj.id,\n content: doc,\n text: () => get(doc.handle.docSync(), doc.path),\n // TODO(burdon): https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n extension: [\n modelState.init(() => model),\n automerge({ handle: doc.handle, path: doc.path }),\n awarenessProvider && AwarenessProvider.of(awarenessProvider),\n awareness(),\n ].filter(isNotNullOrUndefined),\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n\n return model;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DeferredTask, Event, sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\nimport { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from '../extensions';\n\ntype ProtocolMessage =\n | {\n kind: 'query';\n }\n | {\n kind: 'post';\n state: AwarenessState;\n };\n\nconst DEBOUNCE_INTERVAL = 100; // ms\n\nexport type AwarenessProviderParams = {\n space: Space;\n channel: string;\n peerId: string;\n info: AwarenessInfo;\n};\n\nexport class SpaceAwarenessProvider implements AwarenessProvider {\n public readonly remoteStateChange = new Event<void>();\n\n private readonly _remoteStates = new Map<string, AwarenessState>();\n\n private readonly _space: Space;\n private readonly _channel: string;\n private readonly _peerId: string;\n private readonly _info: AwarenessInfo;\n\n private _localState?: AwarenessState;\n private _postTask?: DeferredTask;\n private _ctx?: Context;\n\n constructor(params: AwarenessProviderParams) {\n this._space = params.space;\n this._channel = params.channel;\n this._peerId = params.peerId;\n this._info = params.info;\n }\n\n open() {\n this._ctx = new Context();\n this._postTask = new DeferredTask(this._ctx, async () => {\n if (this._localState) {\n await this._space.postMessage(this._channel, {\n kind: 'post',\n state: this._localState,\n } satisfies ProtocolMessage);\n\n await sleep(DEBOUNCE_INTERVAL);\n }\n });\n\n const unsubscribe = this._space.listen(this._channel, (message: GossipMessage) => {\n switch (message.payload.kind) {\n case 'query': {\n this._handleQueryMessage();\n break;\n }\n case 'post': {\n this._handlePostMessage(message.payload);\n break;\n }\n }\n });\n this._ctx.onDispose(unsubscribe);\n\n void this._space\n .postMessage(this._channel, {\n kind: 'query',\n } satisfies ProtocolMessage)\n .catch((err) => {\n log.debug('failed to query awareness', { err });\n });\n }\n\n close() {\n void this._ctx?.dispose();\n this._ctx = undefined;\n this._postTask = undefined;\n }\n\n update(position: AwarenessPosition | undefined): void {\n invariant(this._postTask);\n this._localState = {\n peerId: this._peerId,\n position,\n info: this._info,\n };\n\n this._postTask.schedule();\n }\n\n getRemoteStates(): AwarenessState[] {\n return Array.from(this._remoteStates.values());\n }\n\n private _handleQueryMessage() {\n invariant(this._postTask);\n this._postTask.schedule();\n }\n\n private _handlePostMessage(message: ProtocolMessage) {\n invariant(message.kind === 'post');\n this._remoteStates.set(message.state.peerId, message.state);\n this.remoteStateChange.emit();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { StateField, type Extension } from '@codemirror/state';\nimport { useEffect, useState } from 'react';\nimport type * as YP from 'y-protocols/awareness';\n\nimport { isAutomergeObject, type DocAccessor, type Space, type TextObject } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport type { YText, YXmlFragment } from '@dxos/text-model';\n\nimport { createAutomergeModel } from './automerge';\nimport { createYjsModel } from './yjs';\n\n// TODO(burdon): Factor out defs.\n\n/**\n * State field makes the model available to other extensions.\n */\nexport const modelState = StateField.define<EditorModel | undefined>({\n create: () => undefined,\n update: (model) => model,\n});\n\nexport type Range = {\n from: number;\n to: number;\n};\n\nexport type CommentRange = {\n id: string;\n cursor: string; // TODO(burdon): Rename range.\n};\n\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport type EditorModel = {\n id: string;\n text: () => string;\n extension?: Extension;\n\n // TODO(burdon): Remove.\n content: string | YText | YXmlFragment | DocAccessor;\n\n // TODO(burdon): Move into extension.\n awareness?: YP.Awareness;\n\n // TODO(burdon): Remove.\n peer?: {\n id: string;\n name?: string;\n };\n};\n\n// TODO(burdon): Remove space/identity dependency. Define interface for the framework re content and presence.\nexport type UseTextModelProps = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\n// TODO(burdon): Remove YJS/Automerge deps (from UI component -- create abstraction; incl. all ECHO/Space deps).\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport const useTextModel = (props: UseTextModelProps): EditorModel | undefined => {\n const { identity, space, text } = props;\n const [model, setModel] = useState<EditorModel | undefined>();\n useEffect(() => setModel(createModel(props)), [identity, space, text]);\n return model;\n};\n\nconst createModel = (props: UseTextModelProps) => {\n const { text } = props;\n if (isAutomergeObject(text)) {\n return createAutomergeModel(props);\n } else if (text?.doc) {\n return createYjsModel(props);\n } else {\n return undefined;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport * as decoding from 'lib0/decoding';\nimport * as encoding from 'lib0/encoding';\nimport { Observable } from 'lib0/observable';\nimport * as YP from 'y-protocols/awareness';\nimport { type Doc } from 'yjs';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\nimport type { YText } from '@dxos/text-model';\n\nimport { type EditorModel, modelState, type UseTextModelProps } from './useTextModel';\nimport { yjs } from '../extensions';\n\nexport const createYjsModel = ({ identity, space, text }: UseTextModelProps): EditorModel => {\n invariant(text?.doc && text?.content);\n const provider = space\n ? new YAwarenessProvider({ space, doc: text.doc, channel: `yjs.awareness.${text.id}` })\n : undefined;\n\n const model: EditorModel = {\n id: text.doc.guid,\n content: text.content,\n text: () => text.content!.toString(),\n extension: [modelState.init(() => model), yjs(text.content as YText, provider?.awareness)],\n awareness: provider?.awareness,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n\n return model;\n};\n\n// Based on https://github.com/yjs/y-webrtc/blob/88baab2/src/y-webrtc.js.\n\nconst messageAwareness = 1;\nconst messageQueryAwareness = 3;\n\n/**\n * Yjs awareness provider on top of a DXOS space.\n */\nexport class YAwarenessProvider extends Observable<any> {\n private readonly _space: Space;\n private readonly _awareness: YP.Awareness;\n private readonly _clientId: number;\n private readonly _channel: string;\n\n constructor({\n space,\n doc,\n channel,\n awareness,\n }: {\n space: Space;\n doc: Doc;\n channel: string;\n awareness?: YP.Awareness;\n }) {\n super();\n this._space = space;\n this._awareness = awareness ?? new YP.Awareness(doc);\n this._channel = channel;\n this._clientId = doc.clientID;\n\n this._awareness.on('update', this._handleAwarenessUpdate.bind(this));\n this._space.listen(this._channel, this._handleSpaceMessage.bind(this));\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this._handleBeforeUnload.bind(this));\n } else if (typeof process !== 'undefined') {\n process.on('exit', this._handleBeforeUnload.bind(this));\n }\n\n // Post queryAwareness.\n const encoderAwarenessQuery = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessQuery));\n\n // Post local awareness state.\n const encoderAwarenessState = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessState, messageAwareness);\n encoding.writeVarUint8Array(encoderAwarenessState, YP.encodeAwarenessUpdate(this.awareness, [this._clientId]));\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessState));\n }\n\n get awareness(): YP.Awareness {\n return this._awareness;\n }\n\n private _handleAwarenessUpdate({ added, updated, removed }: any, origin: any) {\n log('awareness update', { added, updated, removed, origin });\n const changedClients = added.concat(updated).concat(removed);\n const encoderAwareness = encoding.createEncoder();\n encoding.writeVarUint(encoderAwareness, messageAwareness);\n encoding.writeVarUint8Array(encoderAwareness, YP.encodeAwarenessUpdate(this._awareness, changedClients));\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwareness));\n }\n\n private _handleSpaceMessage({ payload }: GossipMessage) {\n log('space message', payload);\n const data = new Uint8Array(Array.from(Object.values(payload)));\n const encoder = this._readMessage(data);\n if (encoder) {\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoder));\n }\n }\n\n private _readMessage(message: Uint8Array) {\n const decoder = decoding.createDecoder(message);\n const encoder = encoding.createEncoder();\n const messageType = decoding.readVarUint(decoder);\n\n let sendReply = false;\n switch (messageType) {\n case messageAwareness: {\n YP.applyAwarenessUpdate(this._awareness, decoding.readVarUint8Array(decoder), this);\n break;\n }\n\n case messageQueryAwareness: {\n encoding.writeVarUint(encoder, messageAwareness);\n encoding.writeVarUint8Array(\n encoder,\n YP.encodeAwarenessUpdate(this._awareness, Array.from(this._awareness.getStates().keys())),\n );\n sendReply = true;\n break;\n }\n\n default: {\n console.error('Invalid message:', messageType);\n return encoder;\n }\n }\n\n if (!sendReply) {\n // Nothing has been written, no answer created.\n return null;\n }\n\n return encoder;\n }\n\n private _handleBeforeUnload() {\n YP.removeAwarenessStates(this._awareness, [this._clientId], 'window unload');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TextKind", "Doc", "YText", "YXmlFragment", "tags", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "useRef", "generateName", "useThemeContext", "getColorForValue", "inputSurface", "mx", "autocompletion", "completionKeymap", "markdownLanguage", "keymap", "autocomplete", "onSearch", "keymap", "of", "completionKeymap", "autocompletion", "defaultKeymap", "activateOnTyping", "markdownLanguage", "data", "context", "match", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "StateField", "ViewPlugin", "next", "A", "get", "next", "automerge", "cursorConverter", "handle", "path", "toCursor", "pos", "doc", "docSync", "value", "get", "length", "automerge", "getCursor", "slice", "fromCursor", "cursor", "getCursorPosition", "Annotation", "StateEffect", "Facet", "effectType", "StateEffect", "define", "updateHeads", "newHeads", "of", "getLastHeads", "state", "field", "lastHeads", "getPath", "path", "reconcileAnnotationType", "Annotation", "isReconcileTx", "tr", "annotation", "semaphoreFacet", "Facet", "combine", "values", "at", "next", "automerge", "next", "am", "updateAutomerge", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "fromA", "toA", "_fromB", "_toB", "inserted", "am", "splice", "toString", "ChangeSet", "updateCodeMirror", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotationType", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "v", "toString", "join", "from", "to", "insert", "value", "textPath", "candidatePath", "i", "PatchSemaphore", "constructor", "_handle", "_field", "_inReconcile", "reconcile", "view", "path", "getPath", "state", "oldHeads", "getLastHeads", "selection", "transactions", "field", "unreconciledTransactions", "filter", "tx", "isReconcileTx", "toInvert", "slice", "reverse", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotationType", "of", "newHeads", "updateAutomerge", "undefined", "automerge", "getHeads", "docSync", "diff", "equals", "updateCodeMirror", "effects", "updateHeads", "Facet", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "Facet", "define", "combine", "providers", "getCursorFromRange", "cursorConverter", "range", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "automerge", "handle", "path", "stateField", "StateField", "define", "create", "lastHeads", "A", "getHeads", "docSync", "unreconciledTransactions", "slice", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "effectType", "newHeads", "isReconcileTx", "push", "semaphore", "PatchSemaphore", "viewPlugin", "ViewPlugin", "fromClass", "AutomergeViewPlugin", "constructor", "_view", "_handleChange", "state", "facet", "semaphoreFacet", "reconcile", "addListener", "transactions", "length", "some", "queueMicrotask", "destroy", "extension", "Cursor", "converter", "of", "cursorConverter", "Annotation", "Facet", "RangeSet", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "Event", "Context", "dummyProvider", "remoteStateChange", "Event", "open", "close", "update", "getRemoteStates", "AwarenessProvider", "Facet", "define", "combine", "providers", "RemoteSelectionChangedAnnotation", "Annotation", "awareness", "provider", "of", "ViewPlugin", "fromClass", "RemoteSelectionsDecorator", "decorations", "value", "styles", "constructor", "view", "RangeSet", "_ctx", "Context", "_lastAnchor", "undefined", "_lastHead", "_cursorConverter", "state", "facet", "Cursor", "converter", "_provider", "on", "dispatch", "annotations", "destroy", "dispose", "_updateLocalSelection", "_updateRemoteSelections", "hasFocus", "dom", "ownerDocument", "anchor", "head", "selection", "main", "toCursor", "awarenessStates", "position", "fromCursor", "start", "Math", "min", "doc", "length", "end", "max", "startLine", "lineAt", "endLine", "color", "info", "lightColor", "number", "push", "from", "to", "Decoration", "mark", "attributes", "style", "class", "i", "linePos", "line", "widget", "side", "block", "RemoteCaretWidget", "displayName", "set", "WidgetType", "_name", "_color", "toDOM", "span", "document", "createElement", "className", "backgroundColor", "borderColor", "dot", "innerText", "appendChild", "createTextNode", "updateDOM", "eq", "estimatedHeight", "ignoreEvent", "EditorView", "baseTheme", "padding", "margin", "borderLeft", "borderRight", "marginLeft", "marginRight", "boxSizing", "display", "borderRadius", "width", "height", "top", "left", "transition", "transformOrigin", "transform", "fontSize", "fontFamily", "fontStyle", "fontWeight", "lineHeight", "userSelect", "paddingLeft", "paddingRight", "zIndex", "opacity", "transitionDelay", "whiteSpace", "closeBrackets", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "drawSelection", "EditorView", "placeholder", "basicBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorView", "lineWrapping", "bracketMatching", "closeBrackets", "drawSelection", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "EditorView", "keymap", "defaultsDeep", "invariant", "defaultOptions", "effect", "maxParticles", "particleGravity", "particleAlphaFadeout", "particleSize", "min", "max", "particleNumRange", "particleVelocityRange", "x", "y", "particleShrinkRate", "shakeIntensity", "blast", "options", "blaster", "last", "getPoint", "view", "pos", "left", "top", "coordsForChar", "element", "document", "elementFromPoint", "offsetLeft", "offsetTop", "scrollDOM", "parentElement", "point", "updateListener", "of", "update", "node", "destroy", "Blaster", "color", "Math", "random", "initialize", "start", "resize", "current", "state", "selection", "main", "head", "spawn", "any", "_", "event", "key", "shiftKey", "shake", "time", "constructor", "_node", "_options", "_running", "_shakeTime", "_shakeTimeMax", "_particles", "_particlePointer", "_lastPoint", "throttle", "getRGBComponents", "numParticles", "dir", "i", "_effect", "create", "Effect1", "Effect2", "_canvas", "_ctx", "createElement", "id", "style", "position", "zIndex", "pointerEvents", "getContext", "parent", "appendChild", "stop", "remove", "undefined", "offsetWidth", "width", "offsetHeight", "height", "loop", "transform", "clearRect", "now", "Date", "getTime", "_lastTime", "dt", "magnitude", "shakeX", "shakeY", "drawParticles", "requestAnimationFrame", "bind", "length", "particle", "alpha", "size", "Effect", "vx", "vy", "ctx", "fillStyle", "fillRect", "round", "theta", "PI", "drag", "wander", "sin", "cos", "beginPath", "arc", "fill", "callback", "limit", "wait", "args", "apply", "setTimeout", "bgColor", "getComputedStyle", "match", "slice", "ViewPlugin", "EditorView", "Decoration", "mx", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "mx", "headings", "heading", "level", "readonly", "style", "offset", "mx", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "get", "tailwindConfig", "tokens", "tailwindConfig", "theme", "getToken", "path", "defaultValue", "undefined", "get", "CODE_REGEX", "styles", "EditorView", "baseTheme", "fontFamily", "getToken", "join", "background", "display", "paddingInline", "paddingTop", "borderTopLeftRadius", "borderTopRightRadius", "paddingBottom", "borderBottomLeftRadius", "borderBottomRightRadius", "getLineRange", "lines", "from", "to", "start", "findIndex", "line", "end", "code", "buildDecorations", "view", "decorations", "text", "state", "doc", "sliceString", "matches", "matchAll", "blocks", "viewportLineBlocks", "match", "range", "index", "length", "i", "block", "push", "Decoration", "class", "mx", "set", "ViewPlugin", "fromClass", "constructor", "hasFocus", "update", "startState", "readOnly", "docChanged", "viewportChanged", "value", "StateEffect", "StateField", "hoverTooltip", "keymap", "Decoration", "EditorView", "sortBy", "debounce", "invariant", "nonNullable", "log", "callbackWrapper", "fn", "args", "error", "catch", "styles", "EditorView", "baseTheme", "backgroundColor", "getToken", "marks", "highlight", "Decoration", "mark", "class", "highlightActive", "setFocus", "view", "thread", "range", "state", "field", "commentsStateField", "ranges", "find", "id", "dispatch", "effects", "setSelection", "of", "active", "selection", "anchor", "from", "scrollIntoView", "setCommentRange", "StateEffect", "define", "setCommentState", "StateField", "create", "update", "value", "tr", "cursorConverter", "facet", "Cursor", "converter", "effect", "is", "comments", "map", "comment", "getRangeFromCursor", "cursor", "filter", "nonNullable", "highlightDecorations", "decorations", "compute", "sortBy", "flatMap", "to", "undefined", "set", "trackPastedComments", "onUpdate", "tracked", "handleTrack", "event", "main", "selectedRanges", "length", "text", "doc", "slice", "domEventHandlers", "cut", "copy", "updateListener", "transactions", "paste", "isUserEvent", "found", "changes", "iterChanges", "fromA", "toA", "fromB", "toB", "eq", "i", "indexOf", "mapPos", "semaphoreFacet", "reconcile", "moved", "some", "getCursorFromRange", "options", "key", "shortcut", "handleSelect", "debounce", "onSelect", "createCommentThread", "invariant", "onCreate", "callbackWrapper", "coordsAtPos", "keymap", "run", "onHover", "hoverTooltip", "pos", "end", "above", "el", "document", "createElement", "dom", "offset", "x", "y", "hoverTime", "mod", "from2", "to2", "forEach", "newRange", "onDelete", "Object", "assign", "head", "min", "Infinity", "closest", "selected", "d", "Math", "abs", "location", "Decoration", "EditorView", "MatchDecorator", "ViewPlugin", "WidgetType", "styles", "EditorView", "baseTheme", "borderBottom", "getToken", "HorizontalRuleWidget", "WidgetType", "constructor", "_pos", "eq", "other", "toDOM", "view", "el", "document", "createElement", "className", "placeholderMatcher", "MatchDecorator", "regexp", "decoration", "match", "pos", "Decoration", "replace", "widget", "hr", "ViewPlugin", "fromClass", "rules", "createDeco", "update", "updateDeco", "decorations", "instance", "syntaxTree", "StateField", "Decoration", "EditorView", "WidgetType", "image", "options", "StateField", "define", "create", "state", "Decoration", "set", "buildDecorations", "doc", "length", "update", "value", "tr", "docChanged", "selection", "cursor", "main", "head", "oldCursor", "changes", "mapPos", "startState", "from", "Math", "min", "to", "max", "iterChangedRanges", "fromA", "toA", "fromB", "toB", "lineAt", "map", "filterFrom", "filterTo", "filter", "add", "provide", "field", "EditorView", "decorations", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "url", "sliceDoc", "push", "replace", "block", "widget", "ImageWidget", "range", "WidgetType", "constructor", "_url", "eq", "other", "toDOM", "view", "img", "document", "createElement", "setAttribute", "onload", "classList", "syntaxTree", "RangeSetBuilder", "hoverTooltip", "Decoration", "ViewPlugin", "WidgetType", "tooltipContent", "link", "options", "extensions", "ViewPlugin", "fromClass", "constructor", "view", "decorations", "buildDecorations", "update", "docChanged", "viewportChanged", "selectionSet", "v", "onHover", "push", "hoverTooltip", "pos", "side", "syntax", "syntaxTree", "state", "resolveInner", "i", "node", "parent", "name", "url", "getChild", "urlText", "sliceDoc", "from", "to", "end", "above", "create", "el", "document", "createElement", "className", "tooltipContent", "dom", "offset", "x", "y", "LinkButton", "WidgetType", "_url", "_onAttach", "eq", "other", "toDOM", "LinkText", "_text", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "posAtDOM", "builder", "RangeSetBuilder", "cursor", "main", "head", "visibleRanges", "iterate", "enter", "marks", "getChildren", "text", "length", "urlNode", "hasFocus", "readOnly", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "EditorView", "listener", "onFocus", "onChange", "extensions", "push", "EditorView", "focusChangeEffect", "of", "_", "focused", "updateListener", "update", "state", "doc", "toString", "closeBrackets", "closeBracketsKeymap", "history", "historyKeymap", "indentWithTab", "standardKeymap", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "keymap", "placeholder", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "Table", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "InlineCode", "LinkLabel", "LinkReference", "ListMark", "QuoteMark", "URL", "TableCell", "Table", "defineNodes", "forEach", "node", "name", "style", "markdownTagsExtensions", "props", "styleTags", "markdownHighlightStyle", "readonly", "HighlightStyle", "tag", "tags", "keyword", "deleted", "character", "propertyName", "macroName", "color", "constant", "standard", "definition", "separator", "typeName", "className", "number", "changed", "annotation", "modifier", "self", "namespace", "operator", "operatorKeyword", "escape", "regexp", "special", "string", "meta", "comment", "atom", "bool", "variableName", "processingInstruction", "inserted", "invalid", "class", "mark", "function", "labelName", "codeMark", "monospace", "heading1", "heading", "heading2", "heading3", "heading4", "heading5", "heading6", "emphasis", "italic", "strong", "bold", "strikethrough", "inlineUrl", "code", "blockquote", "scope", "markdownLanguage", "all", "fontFamily", "getToken", "join", "markdownBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorState", "allowMultipleSelections", "of", "tabSize", "EditorView", "lineWrapping", "customKeymap", "bracketMatching", "closeBrackets", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "history", "indentOnInput", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtensions", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "markdownHighlightStyle", "filter", "Boolean", "keymap", "indentWithTab", "standardKeymap", "historyKeymap", "closeBracketsKeymap", "searchKeymap", "autocompletion", "mention", "onSearch", "autocompletion", "closeOnBlur", "override", "context", "match", "matchBefore", "from", "to", "explicit", "console", "log", "options", "text", "slice", "toLowerCase", "map", "value", "label", "outliner", "options", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "table", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "tables", "getTable", "length", "getRow", "rows", "syntaxTree", "iterate", "enter", "node", "name", "push", "to", "header", "row", "sliceDoc", "forEach", "hide", "readOnly", "add", "Decoration", "replace", "widget", "TableWidget", "mark", "class", "finish", "WidgetType", "constructor", "_table", "eq", "other", "join", "toDOM", "view", "document", "createElement", "appendChild", "cell", "th", "setAttribute", "textContent", "body", "td", "ignoreEvent", "e", "test", "type", "syntaxTree", "RangeSetBuilder", "EditorView", "Decoration", "WidgetType", "ViewPlugin", "CheckboxWidget", "WidgetType", "constructor", "_checked", "eq", "other", "toDOM", "view", "input", "document", "createElement", "type", "checked", "state", "readOnly", "setAttribute", "onmousedown", "event", "pos", "posAtDOM", "text", "sliceDoc", "dispatch", "changes", "from", "to", "insert", "preventDefault", "ignoreEvent", "checkedDeco", "Decoration", "replace", "widget", "uncheckedDeco", "tasklist", "options", "ViewPlugin", "fromClass", "decorations", "buildDecorations", "update", "docChanged", "viewportChanged", "selectionSet", "v", "provide", "plugin", "EditorView", "atomicRanges", "of", "none", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "doc", "sliceString", "add", "finish", "keymap", "defaultItems", "typewriter", "delay", "items", "t", "idx", "keymap", "of", "key", "run", "view", "clearTimeout", "text", "length", "i", "insert", "d", "setTimeout", "pos", "state", "selection", "main", "head", "dispatch", "changes", "from", "anchor", "Math", "random", "yCollab", "Y", "arrayToString", "stringToArray", "cursorConverter", "text", "toCursor", "index", "assoc", "arrayToString", "encodeRelativePosition", "createRelativePositionFromTypeIndex", "fromCursor", "cursor", "createAbsolutePositionFromRelativePosition", "decodeRelativePosition", "stringToArray", "doc", "yjs", "content", "awareness", "Cursor", "converter", "of", "cursorConverter", "yCollab", "get", "defaultTheme", "outline", "overflow", "fontFamily", "get", "tokens", "join", "padding", "fontSize", "color", "caretColor", "borderLeft", "fontWeight", "paddingInline", "background", "backgroundColor", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "border", "marginTop", "marginLeft", "display", "textDecoration", "borderBottom", "textAlign", "height", "borderTop", "margin", "backgroundImage", "marginRight", "textTheme", "markdownTheme", "codeTheme", "EditorModes", "BaseTextEditor", "forwardRef", "model", "autofocus", "readonly", "selection", "comments", "extensions", "editorMode", "theme", "slots", "defaultSlots", "forwardedRef", "tabsterDOMAttribute", "useFocusableGroup", "tabBehavior", "themeMode", "useThemeContext", "rootRef", "useRef", "view", "setView", "useState", "useImperativeHandle", "useEffect", "focus", "awareness", "peer", "setLocalStateField", "name", "generateName", "id", "color", "getColorForValue", "value", "type", "colorLight", "undefined", "dispatch", "effects", "setCommentRange", "of", "current", "state", "EditorState", "create", "doc", "text", "readOnly", "vim", "EditorView", "baseTheme", "defaultTheme", "darkTheme", "extension", "filter", "Boolean", "destroy", "newView", "parent", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "div", "role", "tabIndex", "onKeyUp", "root", "ref", "TextEditor", "placeholder", "textTheme", "props", "updatedSlots", "defaultsDeep", "defaultTextSlots", "basicBundle", "MarkdownEditor", "markdownTheme", "defaultMarkdownSlots", "markdownBundle", "className", "mx", "inputSurface", "get", "getRawDoc", "isNotNullOrUndefined", "DeferredTask", "Event", "sleep", "Context", "invariant", "log", "DEBOUNCE_INTERVAL", "SpaceAwarenessProvider", "constructor", "params", "remoteStateChange", "_remoteStates", "Map", "_space", "space", "_channel", "channel", "_peerId", "peerId", "_info", "info", "open", "_ctx", "_postTask", "_localState", "postMessage", "kind", "state", "unsubscribe", "listen", "message", "payload", "_handleQueryMessage", "_handlePostMessage", "onDispose", "catch", "err", "debug", "close", "dispose", "undefined", "update", "position", "schedule", "getRemoteStates", "Array", "from", "values", "set", "emit", "StateField", "useEffect", "useState", "isAutomergeObject", "decoding", "encoding", "Observable", "YP", "invariant", "log", "createYjsModel", "identity", "space", "text", "invariant", "doc", "content", "provider", "YAwarenessProvider", "channel", "id", "undefined", "model", "guid", "toString", "extension", "modelState", "init", "yjs", "awareness", "peer", "identityKey", "toHex", "name", "profile", "displayName", "messageAwareness", "messageQueryAwareness", "Observable", "constructor", "_space", "_awareness", "Awareness", "_channel", "_clientId", "clientID", "on", "_handleAwarenessUpdate", "bind", "listen", "_handleSpaceMessage", "window", "addEventListener", "_handleBeforeUnload", "process", "encoderAwarenessQuery", "createEncoder", "encoding", "writeVarUint", "postMessage", "toUint8Array", "encoderAwarenessState", "writeVarUint8Array", "encodeAwarenessUpdate", "added", "updated", "removed", "origin", "log", "changedClients", "concat", "encoderAwareness", "payload", "data", "Uint8Array", "Array", "from", "Object", "values", "encoder", "_readMessage", "message", "decoder", "createDecoder", "messageType", "readVarUint", "sendReply", "YP", "applyAwarenessUpdate", "readVarUint8Array", "getStates", "keys", "console", "error", "removeAwarenessStates", "modelState", "StateField", "define", "create", "undefined", "update", "model", "useTextModel", "props", "identity", "space", "text", "setModel", "useState", "useEffect", "createModel", "isAutomergeObject", "createAutomergeModel", "doc", "createYjsModel", "createAutomergeModel", "space", "identity", "text", "obj", "doc", "getRawDoc", "field", "awarenessProvider", "SpaceAwarenessProvider", "channel", "id", "info", "displayName", "profile", "color", "cursorColor", "lightColor", "light", "peerId", "identityKey", "toHex", "model", "content", "get", "handle", "docSync", "path", "extension", "modelState", "init", "automerge", "AwarenessProvider", "of", "awareness", "filter", "isNotNullOrUndefined", "peer", "name", "undefined"]
7
7
  }