@dxos/react-ui-editor 0.3.9-main.9ca5eac → 0.3.9-main.9da1d41

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 (149) hide show
  1. package/dist/lib/browser/index.mjs +654 -734
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts +2 -2
  5. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +1 -1
  6. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts +2 -2
  7. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +1 -1
  8. package/dist/types/src/automerge/automerge-plugin/handle.d.ts +9 -0
  9. package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +1 -0
  10. package/dist/types/src/automerge/automerge-plugin/index.d.ts +2 -2
  11. package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +1 -1
  12. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts +6 -5
  13. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +1 -1
  14. package/dist/types/src/automerge/automerge.stories.d.ts +1 -0
  15. package/dist/types/src/automerge/automerge.stories.d.ts.map +1 -1
  16. package/dist/types/src/components/TextEditor/TextEditor.d.ts +24 -20
  17. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  18. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +2 -25
  19. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  20. package/dist/types/{stories/html/code-mirror.stories.d.ts → src/components/TextEditor/codemirror.stories.d.ts} +2 -2
  21. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +1 -0
  22. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts +8 -0
  23. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts.map +1 -0
  24. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts +3 -0
  25. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts.map +1 -0
  26. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts +10 -0
  27. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts.map +1 -0
  28. package/dist/types/src/components/TextEditor/extensions/change.d.ts +7 -0
  29. package/dist/types/src/components/TextEditor/extensions/change.d.ts.map +1 -0
  30. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts +11 -0
  31. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts.map +1 -0
  32. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts.map +1 -0
  33. package/dist/types/src/components/TextEditor/extensions/{hyperlink.d.ts → hyperlink/hyperlinkWidget.d.ts} +3 -3
  34. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts.map +1 -0
  35. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts +4 -0
  36. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts.map +1 -0
  37. package/dist/types/src/components/TextEditor/extensions/index.d.ts +3 -1
  38. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
  39. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +8 -0
  40. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -0
  41. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts +3 -0
  42. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +1 -0
  43. package/dist/types/src/components/{Markdown/markdownTags.d.ts → TextEditor/extensions/markdown/tags.d.ts} +1 -1
  44. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts.map +1 -0
  45. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts +21 -0
  46. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts.map +1 -0
  47. package/dist/types/src/components/TextEditor/index.d.ts +1 -3
  48. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  49. package/dist/types/src/components/TextEditor/yjs.stories.d.ts +11 -0
  50. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -0
  51. package/dist/types/src/components/index.d.ts +0 -3
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/hooks/index.d.ts +4 -0
  54. package/dist/types/src/hooks/index.d.ts.map +1 -0
  55. package/dist/types/src/hooks/useCollaboration.d.ts +9 -0
  56. package/dist/types/src/hooks/useCollaboration.d.ts.map +1 -0
  57. package/dist/types/src/{model.d.ts → hooks/useTextModel.d.ts} +1 -13
  58. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -0
  59. package/dist/types/src/hooks/yjs/cursors.d.ts.map +1 -0
  60. package/dist/types/src/hooks/yjs/index.d.ts.map +1 -0
  61. package/dist/types/src/hooks/yjs/space-provider.d.ts.map +1 -0
  62. package/dist/types/src/index.d.ts +2 -2
  63. package/dist/types/src/index.d.ts.map +1 -1
  64. package/dist/types/src/styles/tokens.d.ts +4 -0
  65. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  66. package/dist/types/src/testing/replicator.d.ts +1 -1
  67. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  68. package/package.json +30 -27
  69. package/src/automerge/automerge-plugin/PatchSemaphore.ts +5 -5
  70. package/src/automerge/automerge-plugin/codeMirrorToAm.ts +10 -7
  71. package/src/automerge/automerge-plugin/handle.ts +14 -0
  72. package/src/automerge/automerge-plugin/index.ts +2 -2
  73. package/src/automerge/automerge-plugin/plugin.ts +39 -10
  74. package/src/automerge/automerge.stories.tsx +31 -46
  75. package/src/components/TextEditor/TextEditor.stories.tsx +43 -65
  76. package/src/components/TextEditor/TextEditor.tsx +108 -56
  77. package/src/components/TextEditor/codemirror.stories.ts +114 -0
  78. package/src/components/TextEditor/extensions/basic/bundle.ts +26 -0
  79. package/src/components/TextEditor/extensions/basic/index.ts +6 -0
  80. package/src/components/TextEditor/extensions/basic/theme.ts +49 -0
  81. package/src/components/TextEditor/extensions/change.ts +22 -0
  82. package/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.ts +99 -0
  83. package/src/components/TextEditor/extensions/{hyperlinkTooltip.tsx → hyperlink/hyperlinkTooltip.tsx} +1 -0
  84. package/src/components/TextEditor/extensions/{hyperlink.tsx → hyperlink/hyperlinkWidget.tsx} +21 -10
  85. package/src/components/TextEditor/extensions/hyperlink/index.ts +7 -0
  86. package/src/components/TextEditor/extensions/index.ts +3 -1
  87. package/src/components/TextEditor/extensions/markdown/bundle.ts +99 -0
  88. package/src/components/TextEditor/extensions/markdown/index.ts +6 -0
  89. package/src/components/{Markdown/markdownTheme.ts → TextEditor/extensions/markdown/theme.ts} +23 -12
  90. package/src/components/TextEditor/index.ts +1 -4
  91. package/src/components/TextEditor/yjs.stories.tsx +55 -0
  92. package/src/components/index.ts +0 -3
  93. package/src/hooks/index.ts +7 -0
  94. package/src/hooks/useCollaboration.ts +35 -0
  95. package/src/{model.ts → hooks/useTextModel.ts} +4 -14
  96. package/src/index.ts +3 -3
  97. package/src/styles/tokens.ts +6 -0
  98. package/src/testing/replicator.ts +1 -2
  99. package/dist/types/src/automerge/demo.d.ts +0 -25
  100. package/dist/types/src/automerge/demo.d.ts.map +0 -1
  101. package/dist/types/src/components/Editor/Editor.d.ts +0 -15
  102. package/dist/types/src/components/Editor/Editor.d.ts.map +0 -1
  103. package/dist/types/src/components/Editor/Editor.stories.d.ts +0 -29
  104. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +0 -1
  105. package/dist/types/src/components/Editor/index.d.ts +0 -2
  106. package/dist/types/src/components/Editor/index.d.ts.map +0 -1
  107. package/dist/types/src/components/Markdown/Markdown.d.ts +0 -20
  108. package/dist/types/src/components/Markdown/Markdown.d.ts.map +0 -1
  109. package/dist/types/src/components/Markdown/Markdown.stories.d.ts +0 -20
  110. package/dist/types/src/components/Markdown/Markdown.stories.d.ts.map +0 -1
  111. package/dist/types/src/components/Markdown/index.d.ts +0 -2
  112. package/dist/types/src/components/Markdown/index.d.ts.map +0 -1
  113. package/dist/types/src/components/Markdown/markdownTags.d.ts.map +0 -1
  114. package/dist/types/src/components/Markdown/markdownTheme.d.ts +0 -93
  115. package/dist/types/src/components/Markdown/markdownTheme.d.ts.map +0 -1
  116. package/dist/types/src/components/RichText/RichText.d.ts +0 -20
  117. package/dist/types/src/components/RichText/RichText.d.ts.map +0 -1
  118. package/dist/types/src/components/RichText/RichText.stories.d.ts +0 -27
  119. package/dist/types/src/components/RichText/RichText.stories.d.ts.map +0 -1
  120. package/dist/types/src/components/RichText/index.d.ts +0 -2
  121. package/dist/types/src/components/RichText/index.d.ts.map +0 -1
  122. package/dist/types/src/components/TextEditor/extensions/hyperlink.d.ts.map +0 -1
  123. package/dist/types/src/components/TextEditor/extensions/hyperlinkTooltip.d.ts.map +0 -1
  124. package/dist/types/src/components/TextEditor/theme.d.ts +0 -8
  125. package/dist/types/src/components/TextEditor/theme.d.ts.map +0 -1
  126. package/dist/types/src/model.d.ts.map +0 -1
  127. package/dist/types/src/yjs/cursors.d.ts.map +0 -1
  128. package/dist/types/src/yjs/index.d.ts.map +0 -1
  129. package/dist/types/src/yjs/space-provider.d.ts.map +0 -1
  130. package/dist/types/stories/html/code-mirror.stories.d.ts.map +0 -1
  131. package/src/automerge/demo.ts +0 -106
  132. package/src/components/Editor/Editor.stories.tsx +0 -82
  133. package/src/components/Editor/Editor.tsx +0 -33
  134. package/src/components/Editor/index.ts +0 -5
  135. package/src/components/Markdown/Markdown.stories.tsx +0 -59
  136. package/src/components/Markdown/Markdown.tsx +0 -214
  137. package/src/components/Markdown/index.ts +0 -5
  138. package/src/components/RichText/RichText.stories.tsx +0 -70
  139. package/src/components/RichText/RichText.tsx +0 -181
  140. package/src/components/RichText/index.ts +0 -5
  141. package/src/components/TextEditor/theme.ts +0 -33
  142. /package/dist/types/src/components/TextEditor/extensions/{hyperlinkTooltip.d.ts → hyperlink/hyperlinkTooltip.d.ts} +0 -0
  143. /package/dist/types/src/{yjs → hooks/yjs}/cursors.d.ts +0 -0
  144. /package/dist/types/src/{yjs → hooks/yjs}/index.d.ts +0 -0
  145. /package/dist/types/src/{yjs → hooks/yjs}/space-provider.d.ts +0 -0
  146. /package/src/components/{Markdown/markdownTags.ts → TextEditor/extensions/markdown/tags.ts} +0 -0
  147. /package/src/{yjs → hooks/yjs}/cursors.ts +0 -0
  148. /package/src/{yjs → hooks/yjs}/index.ts +0 -0
  149. /package/src/{yjs → hooks/yjs}/space-provider.ts +0 -0
@@ -1,20 +0,0 @@
1
- import { type Editor } from '@tiptap/react';
2
- import React from 'react';
3
- import { type EditorModel, type EditorSlots } from '../../model';
4
- export type TipTapEditor = Editor;
5
- type UseEditorOptions = {
6
- model?: EditorModel;
7
- placeholder?: string;
8
- slots?: Pick<EditorSlots, 'editor'>;
9
- };
10
- export type RichTextEditorProps = UseEditorOptions & {
11
- slots?: EditorSlots;
12
- };
13
- /**
14
- * @deprecated
15
- */
16
- export declare const RichTextEditor: React.ForwardRefExoticComponent<UseEditorOptions & {
17
- slots?: EditorSlots | undefined;
18
- } & React.RefAttributes<Editor | null>>;
19
- export {};
20
- //# sourceMappingURL=RichText.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../../../../src/components/RichText/RichText.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,MAAM,EAAgD,MAAM,eAAe,CAAC;AAE1F,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAkBjE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;CACrC,CAAC;AA2HF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,cAAc;;uCASzB,CAAC"}
@@ -1,27 +0,0 @@
1
- import '@dxosTheme';
2
- import React from 'react';
3
- import { type RichTextEditorProps } from './RichText';
4
- declare const _default: {
5
- component: React.ForwardRefExoticComponent<{
6
- model?: import("../..").EditorModel | undefined;
7
- placeholder?: string | undefined;
8
- slots?: Pick<import("../..").EditorSlots, "editor"> | undefined;
9
- } & {
10
- slots?: import("../..").EditorSlots | undefined;
11
- } & React.RefAttributes<import("@tiptap/react").Editor | null>>;
12
- decorators: import("@storybook/react").Decorator[];
13
- };
14
- export default _default;
15
- export declare const Default: {
16
- args: {
17
- model: {
18
- id: string;
19
- content: string;
20
- };
21
- };
22
- };
23
- export declare const WithYjs: {
24
- render: (args: Omit<RichTextEditorProps, 'model'>) => JSX.Element;
25
- decorators: import("@storybook/csf").DecoratorFunction<import("@storybook/react/dist/types-0fc72a6d").R, any>[];
26
- };
27
- //# sourceMappingURL=RichText.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RichText.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/RichText/RichText.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAEpB,OAAO,KAAmB,MAAM,OAAO,CAAC;AASxC,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;;;;;;;;;;;AAGtE,wBAGE;AAEF,eAAO,MAAM,OAAO;;;;;;;CAOnB,CAAC;AAGF,eAAO,MAAM,OAAO;mBACH,KAAK,mBAAmB,EAAE,OAAO,CAAC;;CAmClD,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './RichText';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/RichText/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hyperlink.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/hyperlink.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAEL,KAAK,aAAa,EAElB,cAAc,EACd,UAAU,EACV,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AA4C1B,wBAAgB,kBAAkB;wBAGR,cAAc;;mBAOnB,UAAU;GAwB9B;AAED,eAAO,MAAM,cAAc,WAYzB,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,SAAkD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hyperlinkTooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/extensions/hyperlinkTooltip.tsx"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,YAAa,gBAAgB,2DA0C5D,CAAC"}
@@ -1,8 +0,0 @@
1
- import { type StyleSpec } from 'style-mod';
2
- /**
3
- * https://codemirror.net/examples/styling
4
- */
5
- export declare const defaultStyles: {
6
- [selector: string]: StyleSpec;
7
- };
8
- //# sourceMappingURL=theme.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../../../src/components/TextEditor/theme.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAM3C;;GAEG;AAEH,eAAO,MAAM,aAAa,EAAE;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAgB/B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/model.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI5D,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACxD,CAAC;CACH,CAAC;AAEF,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAC7C,KAAK,QAAQ,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAGzC,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IACvC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,YAAY,8BAA+B,mBAAmB,KAAG,WAAW,GAAG,SAwB3F,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursors.d.ts","sourceRoot":"","sources":["../../../../src/yjs/cursors.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,WAAW;;;CAAsD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/yjs/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"space-provider.d.ts","sourceRoot":"","sources":["../../../../src/yjs/space-provider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGrD,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAO7C;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BlH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-mirror.stories.d.ts","sourceRoot":"","sources":["../../../../stories/html/code-mirror.stories.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKhD,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;;;;AAS5D,wBAEE;AAoEF,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,CAoBjF,CAAC"}
@@ -1,106 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { Event } from '@dxos/async';
6
- import {
7
- type Doc,
8
- next as automerge,
9
- type ChangeOptions,
10
- type ChangeFn,
11
- type Heads,
12
- type SyncState,
13
- } from '@dxos/automerge/automerge';
14
-
15
- export class Peer {
16
- changeEvent = new Event();
17
-
18
- storage = new Map<string, Uint8Array>();
19
- stats = {
20
- messagesSent: 0,
21
- messagesReceived: 0,
22
- bytesSent: 0,
23
- bytesReceived: 0,
24
- snapshotBytes: 0,
25
- incrementalBytes: 0,
26
- };
27
-
28
- doc!: Doc<{ text: string }>;
29
-
30
- change(options: string | ChangeOptions<any> | ChangeFn<any>, callback?: ChangeFn<any>) {
31
- this.doc = automerge.change(this.doc, options, callback);
32
- this._handleChange();
33
- }
34
-
35
- changeAt(scope: Heads, options: string | ChangeOptions<any> | ChangeFn<any>, callback?: ChangeFn<any>) {
36
- const { newDoc, newHeads } = automerge.changeAt(this.doc, scope, options, callback);
37
- this.doc = newDoc;
38
- this._handleChange();
39
- return newHeads;
40
- }
41
-
42
- replicate(): { readable: ReadableStream<Uint8Array>; writable: WritableStream<Uint8Array> } {
43
- let syncState: SyncState = automerge.initSyncState();
44
-
45
- let unsub: (() => void) | undefined;
46
- const readable = new ReadableStream({
47
- start: (controller) => {
48
- unsub = this.changeEvent.on(() => {
49
- const [newState, msg] = automerge.generateSyncMessage(this.doc, syncState);
50
- syncState = newState;
51
-
52
- if (msg) {
53
- this.stats.messagesSent++;
54
- this.stats.bytesSent += msg.byteLength;
55
- controller.enqueue(msg);
56
- }
57
- });
58
- },
59
- pull: (controller) => {
60
- const [newState, msg] = automerge.generateSyncMessage(this.doc, syncState);
61
- syncState = newState;
62
-
63
- if (msg) {
64
- this.stats.messagesSent++;
65
- this.stats.bytesSent += msg.byteLength;
66
- controller.enqueue(msg);
67
- }
68
- },
69
- cancel: () => {
70
- unsub?.();
71
- },
72
- });
73
-
74
- const writable = new WritableStream({
75
- write: (chunk) => {
76
- this.stats.messagesReceived++;
77
- this.stats.bytesReceived += chunk.byteLength;
78
-
79
- const [newDoc, newState] = automerge.receiveSyncMessage(this.doc, syncState, chunk);
80
- this.doc = newDoc;
81
- syncState = newState;
82
-
83
- this._handleChange();
84
- },
85
- });
86
-
87
- return { readable, writable };
88
- }
89
-
90
- private _handleChange() {
91
- // TODO(dmaretskyi): Save since + debounce.
92
-
93
- if (this.stats.incrementalBytes > 1024 && this.stats.incrementalBytes > this.stats.snapshotBytes) {
94
- const snapshot = automerge.save(this.doc);
95
- this.stats.snapshotBytes = snapshot.byteLength;
96
- this.stats.incrementalBytes = 0;
97
- console.log('snapshot save', snapshot.byteLength);
98
- } else {
99
- const chunk = automerge.saveIncremental(this.doc);
100
- this.stats.incrementalBytes += chunk.length;
101
- console.log('incremental save', chunk.length);
102
- }
103
-
104
- this.changeEvent.emit();
105
- }
106
- }
@@ -1,82 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxosTheme';
6
-
7
- import React, { useState } from 'react';
8
-
9
- import { type PublicKey } from '@dxos/react-client';
10
- import { TextObject, TextKind, useQuery, useSpace } from '@dxos/react-client/echo';
11
- import { useIdentity } from '@dxos/react-client/halo';
12
- import { ClientDecorator, setupPeersInSpace, textGenerator, useDataGenerator } from '@dxos/react-client/testing';
13
- import { useId } from '@dxos/react-ui';
14
- import { withTheme } from '@dxos/storybook-utils';
15
-
16
- import { Editor, type EditorProps } from './Editor';
17
- import { EditorDocument, types as schema } from '../../testing';
18
-
19
- export default {
20
- component: Editor,
21
- decorators: [withTheme],
22
- };
23
-
24
- const Story = ({ spaceKey, ...params }: Pick<EditorProps, 'slots'> & { spaceKey: PublicKey }) => {
25
- const [generate, setGenerate] = useState(false);
26
- const generateId = useId('generate');
27
-
28
- const identity = useIdentity();
29
- const space = useSpace(spaceKey);
30
- const [document] = useQuery(space, EditorDocument.filter());
31
-
32
- useDataGenerator({
33
- generator: generate ? textGenerator : undefined,
34
- options: { text: document?.content.content },
35
- });
36
-
37
- return (
38
- <main className='flex-1 min-w-0 p-4'>
39
- <div id={generateId} className='flex'>
40
- <input type='checkbox' onChange={(event) => setGenerate(event.target.checked)} />
41
- Generate Data
42
- </div>
43
- {document?.content.toString().length}
44
- <Editor identity={identity} space={space} text={document?.content} {...params} />
45
- </main>
46
- );
47
- };
48
-
49
- const { spaceKey: markdownSpaceKey, clients: markdownClients } = await setupPeersInSpace({
50
- count: 2,
51
- schema,
52
- onCreateSpace: async (space) => {
53
- const document = new EditorDocument({ content: new TextObject('Hello, Storybook!') });
54
- await space?.db.add(document);
55
- },
56
- });
57
-
58
- export const Markdown = {
59
- render: (args: { id: number }) => <Story {...args} spaceKey={markdownSpaceKey} />,
60
- decorators: [ClientDecorator({ clients: markdownClients })],
61
- };
62
-
63
- const { spaceKey: richSpaceKey, clients: richClients } = await setupPeersInSpace({
64
- count: 2,
65
- schema,
66
- onCreateSpace: async (space) => {
67
- const document = new EditorDocument({ content: new TextObject('Hello, Storybook!', TextKind.RICH) });
68
- await space?.db.add(document);
69
- },
70
- });
71
-
72
- export const Rich = {
73
- render: (args: { id: number }) => <Story {...args} spaceKey={richSpaceKey} />,
74
- args: {
75
- slots: {
76
- editor: {
77
- className: 'z-0 rounded bg-white text-neutral-900 w-full p-4 dark:bg-neutral-850 dark:text-white min-bs-[12em]',
78
- },
79
- },
80
- },
81
- decorators: [ClientDecorator({ clients: richClients })],
82
- };
@@ -1,33 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import React, { forwardRef, memo, type Ref } from 'react';
6
-
7
- import { YXmlFragment } from '@dxos/text-model';
8
-
9
- import { type EditorSlots, useTextModel, type UseTextModelOptions } from '../../model';
10
- import { MarkdownEditor, type MarkdownEditorRef } from '../Markdown';
11
- import { RichTextEditor, type TipTapEditor } from '../RichText';
12
-
13
- export type EditorProps = UseTextModelOptions & {
14
- slots?: EditorSlots;
15
- };
16
-
17
- /**
18
- * Memoized editor which depends on DXOS platform.
19
- *
20
- * Determines which editor to render based on the kind of text.
21
- */
22
- // NOTE: Without `memo`, if parent component uses `observer` the editor re-renders excessively.
23
- // TODO(wittjosiah): Factor out?
24
- export const Editor = memo(
25
- forwardRef<TipTapEditor | MarkdownEditorRef, EditorProps>(({ slots, ...params }, forwardedRef) => {
26
- const model = useTextModel(params);
27
- if (model?.content instanceof YXmlFragment) {
28
- return <RichTextEditor ref={forwardedRef as Ref<TipTapEditor>} model={model} slots={slots} />;
29
- } else {
30
- return <MarkdownEditor ref={forwardedRef as Ref<MarkdownEditorRef>} model={model} slots={slots} />;
31
- }
32
- }),
33
- );
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export * from './Editor';
@@ -1,59 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxosTheme';
6
-
7
- import React, { useState } from 'react';
8
-
9
- import { PublicKey } from '@dxos/react-client';
10
- import { TextKind } from '@dxos/react-client/echo';
11
- import { ClientDecorator, textGenerator, useDataGenerator } from '@dxos/react-client/testing';
12
- import { useId } from '@dxos/react-ui';
13
- import { withTheme } from '@dxos/storybook-utils';
14
-
15
- import { MarkdownEditor } from './Markdown';
16
- import { Replicator, useYjsModel } from '../../testing';
17
-
18
- export default {
19
- component: MarkdownEditor,
20
- decorators: [withTheme],
21
- };
22
-
23
- export const Default = {
24
- args: {
25
- model: {
26
- id: 'editor',
27
- content: 'Hello, Storybook!',
28
- },
29
- },
30
- };
31
-
32
- const replicator = new Replicator(TextKind.PLAIN);
33
-
34
- export const WithYjs = {
35
- render: () => {
36
- const [generate, setGenerate] = useState(false);
37
- const generateId = useId('generate');
38
-
39
- const [id] = useState(PublicKey.random().toHex());
40
- const model = useYjsModel({ id, replicator });
41
-
42
- useDataGenerator({
43
- generator: generate ? textGenerator : undefined,
44
- options: { text: typeof model?.content !== 'string' ? model?.content : undefined },
45
- });
46
-
47
- return (
48
- <main className='flex-1 min-w-0 p-4'>
49
- <div id={generateId} className='flex'>
50
- <input type='checkbox' onChange={(event) => setGenerate(event.target.checked)} />
51
- Generate Data
52
- </div>
53
- <MarkdownEditor model={model} />
54
- </main>
55
- );
56
- },
57
- // TODO(wittjosiah): Decorator for doing this without clients being initialized?
58
- decorators: [ClientDecorator({ count: 2 })],
59
- };
@@ -1,214 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
6
- import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';
7
- import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
8
- import {
9
- bracketMatching,
10
- defaultHighlightStyle,
11
- foldKeymap,
12
- indentOnInput,
13
- syntaxHighlighting,
14
- } from '@codemirror/language';
15
- import { languages } from '@codemirror/language-data';
16
- import { lintKeymap } from '@codemirror/lint';
17
- import { searchKeymap, highlightSelectionMatches } from '@codemirror/search';
18
- import { EditorState, type Extension, StateField, type Text } from '@codemirror/state';
19
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
20
- import {
21
- keymap,
22
- crosshairCursor,
23
- drawSelection,
24
- dropCursor,
25
- highlightActiveLine,
26
- highlightActiveLineGutter,
27
- highlightSpecialChars,
28
- placeholder,
29
- rectangularSelection,
30
- EditorView,
31
- } from '@codemirror/view';
32
- import { useFocusableGroup } from '@fluentui/react-tabster';
33
- import { vim } from '@replit/codemirror-vim';
34
- import React, {
35
- type KeyboardEvent,
36
- forwardRef,
37
- useEffect,
38
- useImperativeHandle,
39
- useState,
40
- useMemo,
41
- useCallback,
42
- } from 'react';
43
- import { yCollab } from 'y-codemirror.next';
44
-
45
- import { generateName } from '@dxos/display-name';
46
- import { useThemeContext } from '@dxos/react-ui';
47
- import { getColorForValue } from '@dxos/react-ui-theme';
48
- import { YText } from '@dxos/text-model';
49
-
50
- import { markdownTagsExtension } from './markdownTags';
51
- import { markdownDarkHighlighting, markdownTheme } from './markdownTheme';
52
- import { type EditorModel, type EditorSlots } from '../../model';
53
-
54
- export const EditorModes = ['default', 'vim'] as const;
55
- export type EditorMode = (typeof EditorModes)[number];
56
-
57
- export type MarkdownEditorProps = {
58
- model?: EditorModel;
59
- slots?: EditorSlots;
60
- editorMode?: EditorMode;
61
- extensions?: Extension[];
62
- onChange?: (content: string | Text) => void;
63
- };
64
-
65
- export type MarkdownEditorRef = {
66
- editor: HTMLDivElement | null;
67
- state?: EditorState;
68
- view?: EditorView;
69
- };
70
-
71
- export const MarkdownEditor = forwardRef<MarkdownEditorRef, MarkdownEditorProps>(
72
- ({ model, slots = {}, editorMode, extensions = [], onChange }, forwardedRef) => {
73
- const { id, content, provider, peer } = model ?? {};
74
- const { themeMode } = useThemeContext();
75
- const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });
76
-
77
- const [parent, setParent] = useState<HTMLDivElement | null>(null);
78
- const [state, setState] = useState<EditorState>();
79
- const [view, setView] = useState<EditorView>();
80
-
81
- useImperativeHandle(forwardedRef, () => ({
82
- editor: parent,
83
- state,
84
- view,
85
- }));
86
-
87
- const listenChangesExtension = useMemo(
88
- () =>
89
- StateField.define({
90
- create: () => null,
91
- update: (_value, transaction) => {
92
- if (transaction.docChanged && onChange) {
93
- onChange(transaction.newDoc);
94
- }
95
- return null;
96
- },
97
- }),
98
- [onChange],
99
- );
100
-
101
- useEffect(() => {
102
- if (provider && peer) {
103
- provider.awareness.setLocalStateField('user', {
104
- name: peer.name ?? generateName(peer.id),
105
- color: getColorForValue({ value: peer.id, type: 'color' }),
106
- colorLight: getColorForValue({ value: peer.id, themeMode, type: 'highlight' }),
107
- });
108
- }
109
- }, [provider, peer, themeMode]);
110
-
111
- useEffect(() => {
112
- if (!parent) {
113
- return;
114
- }
115
-
116
- const state = EditorState.create({
117
- doc: content?.toString(),
118
- extensions: [
119
- // Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799.
120
- listenChangesExtension,
121
-
122
- ...(editorMode === 'vim' ? [vim()] : []),
123
-
124
- // All of https://github.com/codemirror/basic-setup minus line numbers and fold gutter.
125
- highlightActiveLineGutter(),
126
- highlightSpecialChars(),
127
- history(),
128
- drawSelection(),
129
- dropCursor(),
130
- EditorState.allowMultipleSelections.of(true),
131
- indentOnInput(),
132
- syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
133
- bracketMatching(),
134
- closeBrackets(),
135
- autocompletion(),
136
- rectangularSelection(),
137
- crosshairCursor(),
138
- highlightActiveLine(),
139
- highlightSelectionMatches(),
140
- placeholder(slots.editor?.placeholder ?? ''), // TODO(burdon): Needs consistent styling.
141
- keymap.of([
142
- ...closeBracketsKeymap,
143
- ...defaultKeymap,
144
- ...searchKeymap,
145
- ...historyKeymap,
146
- ...foldKeymap,
147
- ...completionKeymap,
148
- ...lintKeymap,
149
- indentWithTab,
150
- ]),
151
- EditorView.lineWrapping,
152
-
153
- // Themes.
154
- markdown({ base: markdownLanguage, codeLanguages: languages, extensions: [markdownTagsExtension] }),
155
- EditorView.theme({ ...markdownTheme, ...slots.editor?.markdownTheme }),
156
- ...(themeMode === 'dark'
157
- ? [syntaxHighlighting(oneDarkHighlightStyle)]
158
- : [syntaxHighlighting(defaultHighlightStyle)]),
159
- // TODO(thure): All but one rule here apply to both themes; rename or refactor.
160
- syntaxHighlighting(markdownDarkHighlighting),
161
-
162
- // Replication and awareness (incl. remote selection).
163
- ...(content instanceof YText ? [yCollab(content, provider?.awareness)] : []),
164
-
165
- // Custom.
166
- ...extensions,
167
- ],
168
- });
169
-
170
- setState(state);
171
-
172
- // NOTE: This repaints the editor.
173
- // If the new state is derived from the old state, it will likely not be visible other than the cursor resetting.
174
- // Ideally this should not be hit except when changing between text objects.
175
- view?.destroy();
176
- setView(new EditorView({ state, parent }));
177
-
178
- return () => {
179
- view?.destroy();
180
- setView(undefined);
181
- setState(undefined);
182
- };
183
- }, [parent, content, provider?.awareness, themeMode, editorMode]);
184
-
185
- const handleKeyUp = useCallback(
186
- (event: KeyboardEvent) => {
187
- const { key, altKey, shiftKey, metaKey, ctrlKey } = event;
188
- switch (key) {
189
- case 'Enter': {
190
- view?.contentDOM.focus();
191
- break;
192
- }
193
-
194
- case 'Escape': {
195
- editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey) && parent?.focus();
196
- break;
197
- }
198
- }
199
- },
200
- [view, editorMode],
201
- );
202
-
203
- return (
204
- <div
205
- tabIndex={0}
206
- ref={setParent}
207
- key={id}
208
- {...slots.root}
209
- {...(editorMode !== 'vim' ? tabsterDOMAttribute : {})}
210
- onKeyUp={handleKeyUp}
211
- />
212
- );
213
- },
214
- );
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export * from './Markdown';