@dxos/react-ui-editor 0.3.9 → 0.3.10-main.04816d3

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 (128) hide show
  1. package/dist/lib/browser/index.mjs +952 -736
  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 +38 -0
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -0
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +5 -2
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +9 -4
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts +10 -0
  11. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +1 -0
  12. package/dist/types/src/components/TextEditor/extensions/{basic/bundle.d.ts → basic.d.ts} +1 -1
  13. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +1 -0
  14. package/dist/types/src/components/TextEditor/extensions/comments.d.ts +18 -0
  15. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +1 -0
  16. package/dist/types/src/components/TextEditor/extensions/demo.d.ts +10 -0
  17. package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +1 -0
  18. package/dist/types/src/components/TextEditor/extensions/{hyperlink/hyperlinkWidget.d.ts → experimental.d.ts} +2 -2
  19. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +1 -0
  20. package/dist/types/src/components/TextEditor/extensions/index.d.ts +7 -2
  21. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
  22. package/dist/types/src/components/TextEditor/extensions/link.d.ts +11 -0
  23. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +1 -0
  24. package/dist/types/src/components/TextEditor/extensions/listener.d.ts +9 -0
  25. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +1 -0
  26. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -1
  27. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts +31 -0
  28. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +1 -0
  29. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts +1 -1
  30. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +1 -1
  31. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +2 -0
  32. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +1 -0
  33. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +12 -0
  34. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +1 -0
  35. package/dist/types/src/components/TextEditor/index.d.ts +2 -0
  36. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  37. package/dist/types/src/components/TextEditor/themes/default.d.ts +20 -0
  38. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +1 -0
  39. package/dist/types/src/components/TextEditor/themes/index.d.ts +2 -0
  40. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +1 -0
  41. package/dist/types/src/components/TextEditor/yjs.stories.d.ts +1 -0
  42. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -1
  43. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -0
  44. package/dist/types/src/hooks/automerge/amToCodemirror.d.ts.map +1 -0
  45. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
  46. package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts.map +1 -0
  47. package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
  48. package/dist/types/src/hooks/automerge/index.d.ts.map +1 -0
  49. package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -0
  50. package/dist/types/src/hooks/index.d.ts +0 -1
  51. package/dist/types/src/hooks/index.d.ts.map +1 -1
  52. package/dist/types/src/hooks/useTextModel.d.ts +4 -4
  53. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  54. package/dist/types/src/styles/markdown.d.ts +12 -10
  55. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  56. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  57. package/package.json +22 -32
  58. package/src/components/TextEditor/MarkdownEditor.stories.tsx +275 -0
  59. package/src/components/TextEditor/TextEditor.stories.tsx +46 -43
  60. package/src/components/TextEditor/TextEditor.tsx +79 -44
  61. package/src/components/TextEditor/extensions/autocomplete.ts +74 -0
  62. package/src/components/TextEditor/extensions/{basic/bundle.ts → basic.ts} +4 -2
  63. package/src/components/TextEditor/extensions/comments.ts +190 -0
  64. package/src/components/TextEditor/extensions/demo.ts +66 -0
  65. package/src/components/TextEditor/extensions/{hyperlink/hyperlinkWidget.tsx → experimental.tsx} +18 -2
  66. package/src/components/TextEditor/extensions/index.ts +7 -2
  67. package/src/components/TextEditor/extensions/{hyperlink/hyperlinkDecoration.ts → link.ts} +76 -31
  68. package/src/components/TextEditor/extensions/{change.ts → listener.ts} +4 -3
  69. package/src/components/TextEditor/extensions/markdown/bundle.ts +21 -25
  70. package/src/components/TextEditor/extensions/markdown/highlight.ts +167 -0
  71. package/src/components/TextEditor/extensions/markdown/index.ts +1 -1
  72. package/src/components/TextEditor/extensions/tasklist.ts +107 -0
  73. package/src/components/TextEditor/extensions/{hyperlink/hyperlinkTooltip.tsx → tooltip.tsx} +9 -9
  74. package/src/components/TextEditor/index.ts +3 -0
  75. package/src/components/TextEditor/themes/default.ts +185 -0
  76. package/src/components/TextEditor/themes/index.ts +5 -0
  77. package/src/components/TextEditor/yjs.stories.tsx +1 -0
  78. package/src/{automerge → hooks/automerge}/automerge.stories.tsx +2 -1
  79. package/src/hooks/index.ts +0 -1
  80. package/src/hooks/useTextModel.ts +52 -39
  81. package/src/styles/markdown.ts +26 -24
  82. package/src/testing/replicator.ts +6 -6
  83. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
  84. package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
  85. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +0 -1
  86. package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +0 -1
  87. package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +0 -1
  88. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +0 -1
  89. package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
  90. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts.map +0 -1
  91. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts +0 -3
  92. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts.map +0 -1
  93. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts +0 -10
  94. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts.map +0 -1
  95. package/dist/types/src/components/TextEditor/extensions/change.d.ts +0 -7
  96. package/dist/types/src/components/TextEditor/extensions/change.d.ts.map +0 -1
  97. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts +0 -11
  98. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts.map +0 -1
  99. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts +0 -8
  100. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts.map +0 -1
  101. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts.map +0 -1
  102. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts +0 -4
  103. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts.map +0 -1
  104. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts +0 -17
  105. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts.map +0 -1
  106. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts +0 -21
  107. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts.map +0 -1
  108. package/dist/types/src/hooks/useCollaboration.d.ts +0 -9
  109. package/dist/types/src/hooks/useCollaboration.d.ts.map +0 -1
  110. package/src/components/TextEditor/extensions/basic/index.ts +0 -6
  111. package/src/components/TextEditor/extensions/basic/theme.ts +0 -49
  112. package/src/components/TextEditor/extensions/hyperlink/index.ts +0 -7
  113. package/src/components/TextEditor/extensions/markdown/tags.ts +0 -38
  114. package/src/components/TextEditor/extensions/markdown/theme.ts +0 -265
  115. package/src/hooks/useCollaboration.ts +0 -45
  116. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.d.ts +0 -0
  117. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.d.ts +0 -0
  118. /package/dist/types/src/{automerge → hooks/automerge}/automerge.stories.d.ts +0 -0
  119. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.d.ts +0 -0
  120. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.d.ts +0 -0
  121. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +0 -0
  122. /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/plugin.d.ts +0 -0
  123. /package/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.ts +0 -0
  124. /package/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.ts +0 -0
  125. /package/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.ts +0 -0
  126. /package/src/{automerge/automerge-plugin → hooks/automerge}/handle.ts +0 -0
  127. /package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +0 -0
  128. /package/src/{automerge/automerge-plugin → hooks/automerge}/plugin.ts +0 -0
@@ -1,15 +1,15 @@
1
+ import { type Extension } from '@codemirror/state';
1
2
  import type * as awarenessProtocol from 'y-protocols/awareness';
2
3
  import { type DocAccessor, type Space, type TextObject } from '@dxos/react-client/echo';
3
4
  import { type Identity } from '@dxos/react-client/halo';
4
5
  import type { YText, YXmlFragment } from '@dxos/text-model';
5
6
  type Awareness = awarenessProtocol.Awareness;
6
- type Provider = {
7
- awareness: Awareness;
8
- };
9
7
  export type EditorModel = {
10
8
  id: string;
11
9
  content: string | YText | YXmlFragment | DocAccessor;
12
- provider?: Provider;
10
+ text: () => string;
11
+ extension?: Extension;
12
+ awareness?: Awareness;
13
13
  peer?: {
14
14
  id: string;
15
15
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAK5D,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,GAAG,WAAW,CAAC;IACrD,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;AAKF,eAAO,MAAM,YAAY,8BAA+B,mBAAmB,KAAG,WAAW,GAAG,SAoD3F,CAAC"}
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAM5D,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAG7C,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACrD,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAGF,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,SAM3F,CAAC"}
@@ -1,17 +1,19 @@
1
1
  export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
2
2
  export declare const heading: Record<HeadingLevel, string>;
3
- export declare const blockquote = "mlb-2 border-is-4 border-neutral-500/50 pis-5";
4
- export declare const unorderedList = "mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2";
5
- export declare const orderedList = "mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1";
6
- export declare const listItem = "contents before:[counter-increment:section]";
7
- export declare const codeBlock = "mlb-2 font-mono bg-neutral-500/10 p-3 rounded";
8
- export declare const horizontalRule = "mlb-4 border-neutral-500/50";
3
+ export declare const text = "text-neutral-800 dark:text-neutral-200";
4
+ export declare const light = "text-neutral-200 dark:text-neutral-800";
5
+ export declare const mark: string;
9
6
  export declare const paragraph = "mlb-1";
10
7
  export declare const bold = "font-bold";
11
- export declare const code = "font-mono bg-neutral-500/10 rounded pli-0.5 plb-0.5 -mlb-0.5";
12
- export declare const placeholder = "font-mono";
13
- export declare const codeWithoutMarks: string;
14
8
  export declare const italic = "italic";
15
9
  export declare const strikethrough = "line-through";
16
- export declare const mark = "!font-normal !no-underline !text-inherit opacity-40";
10
+ export declare const code = "font-mono !no-underline text-neutral-700 dark:text-neutral-300";
11
+ export declare const codeMark = "font-mono text-primary-500";
12
+ export declare const codeBlock = "mlb-2 font-mono bg-neutral-500/10 p-3 rounded";
13
+ export declare const inlineUrl: string;
14
+ export declare const blockquote: string;
15
+ export declare const horizontalRule = "flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-500/50";
16
+ export declare const unorderedList = "mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2";
17
+ export declare const orderedList = "mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1";
18
+ export declare const listItem = "contents before:[counter-increment:section]";
17
19
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/styles/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEjD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAOhD,CAAC;AAEF,eAAO,MAAM,UAAU,kDAAkD,CAAC;AAG1E,eAAO,MAAM,aAAa,wHAC6F,CAAC;AACxH,eAAO,MAAM,WAAW,gJACmH,CAAC;AAE5I,eAAO,MAAM,QAAQ,gDAAgD,CAAC;AAEtE,eAAO,MAAM,SAAS,kDAAkD,CAAC;AAEzE,eAAO,MAAM,cAAc,gCAAgC,CAAC;AAE5D,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,IAAI,cAAc,CAAC;AAEhC,eAAO,MAAM,IAAI,iEAAiE,CAAC;AAEnF,eAAO,MAAM,WAAW,cAAc,CAAC;AAEvC,eAAO,MAAM,gBAAgB,QAA8B,CAAC;AAE5D,eAAO,MAAM,MAAM,WAAW,CAAC;AAE/B,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,eAAO,MAAM,IAAI,wDAAwD,CAAC"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/styles/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAGjD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAOhD,CAAC;AAEF,eAAO,MAAM,IAAI,2CAA2C,CAAC;AAC7D,eAAO,MAAM,KAAK,2CAA2C,CAAC;AAE9D,eAAO,MAAM,IAAI,QAAmE,CAAC;AAErF,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,IAAI,cAAc,CAAC;AAChC,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,eAAO,MAAM,IAAI,mEAAmE,CAAC;AACrF,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AACrD,eAAO,MAAM,SAAS,kDAAkD,CAAC;AAEzE,eAAO,MAAM,SAAS,QAAmB,CAAC;AAG1C,eAAO,MAAM,UAAU,QAAsF,CAAC;AAG9G,eAAO,MAAM,cAAc,qFAAqF,CAAC;AAGjH,eAAO,MAAM,aAAa,wHAC6F,CAAC;AACxH,eAAO,MAAM,WAAW,+IACkH,CAAC;AAE3I,eAAO,MAAM,QAAQ,gDAAgD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"replicator.d.ts","sourceRoot":"","sources":["../../../../src/testing/replicator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAEtE,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzD,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAM7C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BtG,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,mBAAmB;CAG5B;AAED;;GAEG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,KAAK,EAAE,QAAQ;IAE5C,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE;IAI7B,UAAU,OAAQ,MAAM,QAAO,GAAG,KAAe,WAAW,CAmB1D;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,WAAW,4BAA6B,kBAAkB,KAAG,WAGzE,CAAC"}
1
+ {"version":3,"file":"replicator.d.ts","sourceRoot":"","sources":["../../../../src/testing/replicator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAEtE,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzD,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAM7C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BtG,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,mBAAmB;CAG5B;AAED;;GAEG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,KAAK,EAAE,QAAQ;IAE5C,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE;IAI7B,UAAU,OAAQ,MAAM,QAAO,GAAG,KAAe,WAAW,CAoB1D;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,WAAW,4BAA6B,kBAAkB,KAAG,WAEzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.3.9",
3
+ "version": "0.3.10-main.04816d3",
4
4
  "description": "Document editing experience within a DXOS shell.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -28,60 +28,50 @@
28
28
  "@lezer/highlight": "^1.2.0",
29
29
  "@lezer/markdown": "^1.1.1",
30
30
  "@replit/codemirror-vim": "^6.0.14",
31
- "@tiptap/core": "2.0.0-beta.220",
32
- "@tiptap/extension-collaboration": "2.0.0-beta.220",
33
- "@tiptap/extension-collaboration-cursor": "2.0.0-beta.220",
34
- "@tiptap/extension-heading": "2.0.0-beta.220",
35
- "@tiptap/extension-list-item": "2.0.0-beta.220",
36
- "@tiptap/extension-placeholder": "2.0.0-beta.220",
37
- "@tiptap/pm": "2.0.0-beta.220",
38
- "@tiptap/react": "2.0.0-beta.220",
39
- "@tiptap/starter-kit": "2.0.0-beta.220",
40
31
  "codemirror": "6.0.1",
41
32
  "lib0": "^0.2.65",
42
33
  "lodash.defaultsdeep": "^4.6.1",
43
34
  "lodash.get": "^4.4.2",
44
- "prosemirror-model": "^1.19.0",
45
- "prosemirror-state": "^1.4.2",
46
- "prosemirror-view": "^1.30.1",
47
35
  "style-mod": "^4.1.0",
48
36
  "y-codemirror.next": "^0.3.2",
49
- "y-prosemirror": "~1.0.20",
50
37
  "y-protocols": "^1.0.5",
51
38
  "yjs": "^13.6.10",
52
- "@dxos/debug": "0.3.9",
53
- "@dxos/echo-schema": "0.3.9",
54
- "@dxos/automerge": "0.3.9",
55
- "@dxos/display-name": "0.3.9",
56
- "@dxos/invariant": "0.3.9",
57
- "@dxos/log": "0.3.9",
58
- "@dxos/protocols": "0.3.9",
59
- "@dxos/react-ui": "0.3.9",
60
- "@dxos/react-async": "0.3.9",
61
- "@dxos/react-ui-theme": "0.3.9",
62
- "@dxos/text-model": "0.3.9",
63
- "@dxos/util": "0.3.9"
39
+ "@dxos/async": "0.3.10-main.04816d3",
40
+ "@dxos/automerge": "0.3.10-main.04816d3",
41
+ "@dxos/debug": "0.3.10-main.04816d3",
42
+ "@dxos/invariant": "0.3.10-main.04816d3",
43
+ "@dxos/display-name": "0.3.10-main.04816d3",
44
+ "@dxos/log": "0.3.10-main.04816d3",
45
+ "@dxos/protocols": "0.3.10-main.04816d3",
46
+ "@dxos/echo-schema": "0.3.10-main.04816d3",
47
+ "@dxos/react-async": "0.3.10-main.04816d3",
48
+ "@dxos/react-ui": "0.3.10-main.04816d3",
49
+ "@dxos/react-ui-theme": "0.3.10-main.04816d3",
50
+ "@dxos/util": "0.3.10-main.04816d3",
51
+ "@dxos/text-model": "0.3.10-main.04816d3"
64
52
  },
65
53
  "devDependencies": {
66
54
  "@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
55
+ "@faker-js/faker": "^8.0.2",
67
56
  "@phosphor-icons/react": "^2.0.5",
57
+ "@preact/signals-react": "^1.3.6",
68
58
  "@types/lodash.defaultsdeep": "^4.6.6",
69
59
  "@types/lodash.get": "^4.4.7",
70
60
  "@types/react": "^18.0.21",
71
61
  "@types/react-dom": "^18.0.6",
72
62
  "react": "^18.2.0",
73
63
  "react-dom": "^18.2.0",
74
- "@dxos/react-ui": "0.3.9",
75
- "@dxos/storybook-utils": "0.3.9",
76
- "@dxos/config": "0.3.9",
77
- "@dxos/echo-typegen": "0.3.9",
78
- "@dxos/react-client": "0.3.9"
64
+ "@dxos/echo-typegen": "0.3.10-main.04816d3",
65
+ "@dxos/config": "0.3.10-main.04816d3",
66
+ "@dxos/react-ui": "0.3.10-main.04816d3",
67
+ "@dxos/storybook-utils": "0.3.10-main.04816d3",
68
+ "@dxos/react-client": "0.3.10-main.04816d3"
79
69
  },
80
70
  "peerDependencies": {
81
71
  "@phosphor-icons/react": "^2.0.5",
82
72
  "react": "^18.2.0",
83
73
  "react-dom": "^18.2.0",
84
- "@dxos/react-client": "0.3.9"
74
+ "@dxos/react-client": "0.3.10-main.04816d3"
85
75
  },
86
76
  "publishConfig": {
87
77
  "access": "public"
@@ -0,0 +1,275 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxosTheme';
6
+ import { EditorView } from '@codemirror/view';
7
+ import { faker } from '@faker-js/faker';
8
+ import { ArrowSquareOut } from '@phosphor-icons/react';
9
+ import React, { StrictMode, useRef, useState } from 'react';
10
+ import { createRoot } from 'react-dom/client';
11
+
12
+ import { TextObject } from '@dxos/echo-schema';
13
+ import { PublicKey } from '@dxos/keys';
14
+ import { fixedInsetFlexLayout, getSize, groupSurface, mx } from '@dxos/react-ui-theme';
15
+ import { withTheme } from '@dxos/storybook-utils';
16
+
17
+ import { MarkdownEditor, type TextEditorProps, type TextEditorRef } from './TextEditor';
18
+ import {
19
+ autocomplete,
20
+ listener,
21
+ link,
22
+ tasklist,
23
+ tooltip,
24
+ type TooltipOptions,
25
+ type LinkOptions,
26
+ comments,
27
+ } from './extensions';
28
+ import { useTextModel } from '../../hooks';
29
+
30
+ // TODO(burdon): Read-only render mode (presentation).
31
+ // TODO(burdon): Slides.
32
+ // TODO(burdon): Autocomplete.
33
+ // TODO(burdon): Block quote.
34
+ // TODO(burdon): Images.
35
+ // TODO(burdon): Tables.
36
+
37
+ const str = (...lines: string[]) => lines.join('\n');
38
+
39
+ // prettier-ignore
40
+ const text = {
41
+ tasks: str(
42
+ '## Tasks',
43
+ '',
44
+ '- [x] decorator',
45
+ '- [ ] checkbox',
46
+ ' - [ ] state',
47
+ ' - [ ] indent',
48
+ ' - [x] style',
49
+ ),
50
+
51
+ list: str(
52
+ '## List',
53
+ '',
54
+ '- new york',
55
+ '- london',
56
+ '- tokyo',
57
+ ),
58
+
59
+ numbered: str(
60
+ '## Numbered',
61
+ '',
62
+ '1. one',
63
+ '2. two',
64
+ '3. three',
65
+ ''
66
+ ),
67
+
68
+ code: str(
69
+ '## Code',
70
+ '',
71
+ '```',
72
+ 'const x = 100;',
73
+ '```',
74
+ '',
75
+ '```tsx',
76
+ 'const Component = () => {',
77
+ ' const x = 100;',
78
+ ' return () => <div>Test</div>;',
79
+ '};',
80
+ '```'
81
+ ),
82
+
83
+ links: str(
84
+ '## Links',
85
+ '',
86
+ 'This is a naked link https://dxos.org within a sentence.',
87
+ '',
88
+ 'Take a look at [DXOS](https://dxos.org) and how to [get started](https://docs.dxos.org/guide/getting-started.html).',
89
+ '',
90
+ ),
91
+
92
+ headings: str(
93
+ ...[1, 2, 3, 4, 5, 6].map((level) => ['#'.repeat(level) + ` Heading ${level}`, faker.lorem.sentences(), '']).flat(),
94
+ ),
95
+
96
+ paragraphs: str(...faker.helpers.multiple(() => [faker.lorem.paragraph(), ''], { count: 3 }).flat())
97
+ };
98
+
99
+ const document = str(
100
+ '# Markdown',
101
+ '',
102
+ '> This is a block quote.',
103
+ '',
104
+ 'This is all about https://dxos.org and related technologies.',
105
+ '',
106
+ 'This this is **bold**, __underlined__, _italic_, and `f(INLINE)`.',
107
+ '',
108
+ '__NOTE__: Fenced code uses the base font.',
109
+ '',
110
+ '---',
111
+ text.links,
112
+ '---',
113
+ text.list,
114
+ '---',
115
+ text.tasks,
116
+ '---',
117
+ text.numbered,
118
+ '---',
119
+ text.code,
120
+ '---',
121
+ text.headings,
122
+ );
123
+
124
+ const links = [
125
+ { label: 'DXOS', apply: '[DXOS](https://dxos.org)' },
126
+ { label: 'GitHub', apply: '[DXOS GitHub](https://github.com/dxos)' },
127
+ { label: 'Automerge', apply: '[Automerge](https://automerge.org/)' },
128
+ { label: 'IPFS', apply: '[Protocol Labs](https://docs.ipfs.tech)' },
129
+ { label: 'StackEdit', apply: '[StackEdit](https://stackedit.io/app)' },
130
+ ];
131
+
132
+ const hover =
133
+ 'rounded-sm text-base text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
134
+
135
+ const onHover: TooltipOptions['onHover'] = (el, url) => {
136
+ const web = new URL(url);
137
+ createRoot(el).render(
138
+ <StrictMode>
139
+ <a href={url} target='_blank' rel='noreferrer' className={hover}>
140
+ {web.origin}
141
+ <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1')} />
142
+ </a>
143
+ </StrictMode>,
144
+ );
145
+ };
146
+
147
+ const onRender: LinkOptions['onRender'] = (el, url) => {
148
+ createRoot(el).render(
149
+ <StrictMode>
150
+ <a href={url} target='_blank' rel='noreferrer' className={hover}>
151
+ <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 mb-1')} />
152
+ </a>
153
+ </StrictMode>,
154
+ );
155
+ };
156
+
157
+ const Story = ({
158
+ text,
159
+ automerge,
160
+ ...props
161
+ }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'extensions' | 'slots'>) => {
162
+ const ref = useRef<TextEditorRef>(null);
163
+ const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: automerge }) });
164
+ const model = useTextModel({ text: item.text });
165
+ if (!model) {
166
+ return null;
167
+ }
168
+
169
+ return (
170
+ <div className={mx(fixedInsetFlexLayout, groupSurface)}>
171
+ <div className='flex justify-center overflow-y-scroll'>
172
+ <div className='flex flex-col w-[800px] py-16'>
173
+ <MarkdownEditor ref={ref} model={model} {...props} />
174
+ <div className='flex shrink-0 h-[300px]'></div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ );
179
+ };
180
+
181
+ export default {
182
+ title: 'react-ui-editor/MarkdownEditor',
183
+ component: MarkdownEditor,
184
+ decorators: [withTheme],
185
+ render: Story,
186
+ };
187
+
188
+ export const Default = {
189
+ render: () => (
190
+ <Story
191
+ text={document}
192
+ extensions={[
193
+ link({ onRender }),
194
+ tooltip({ onHover }),
195
+ tasklist(),
196
+ autocomplete({
197
+ onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
198
+ }),
199
+ ]}
200
+ />
201
+ ),
202
+ };
203
+
204
+ export const Simple = {
205
+ render: () => <Story text={document} />,
206
+ };
207
+
208
+ export const Tooltips = {
209
+ render: () => <Story text={text.links} extensions={[tooltip({ onHover })]} />,
210
+ };
211
+
212
+ export const Links = {
213
+ render: () => <Story text={text.links} extensions={[link({ onRender })]} />,
214
+ };
215
+
216
+ export const TaskList = {
217
+ render: () => (
218
+ <Story
219
+ text={str(text.tasks, '', text.list)}
220
+ extensions={[
221
+ tasklist(),
222
+ listener({
223
+ onChange: (text) => {
224
+ console.log(text);
225
+ },
226
+ }),
227
+ ]}
228
+ />
229
+ ),
230
+ };
231
+
232
+ export const Autocomplete = {
233
+ render: () => (
234
+ <Story
235
+ text={str('# Autocomplete', '', '', '', '', '', '')}
236
+ extensions={[
237
+ link({ onRender }),
238
+ autocomplete({
239
+ onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
240
+ }),
241
+ ]}
242
+ />
243
+ ),
244
+ };
245
+
246
+ const mark = () => `[^${PublicKey.random().toHex()}]`;
247
+ export const Comments = {
248
+ render: () => (
249
+ <Story
250
+ text={str(mark(), '', text.paragraphs, mark(), '', mark(), '')}
251
+ extensions={[
252
+ comments({
253
+ onCreate: () => PublicKey.random().toHex(),
254
+ onUpdate: (info) => {
255
+ console.log('update', info);
256
+ },
257
+ }),
258
+ ]}
259
+ />
260
+ ),
261
+ };
262
+
263
+ export const Diagnostics = {
264
+ render: () => (
265
+ <Story
266
+ text={document}
267
+ extensions={[
268
+ // Cursor moved.
269
+ EditorView.updateListener.of((update) => {
270
+ console.log('update', update.view.state.selection.main.head);
271
+ }),
272
+ ]}
273
+ />
274
+ ),
275
+ };
@@ -3,63 +3,46 @@
3
3
  //
4
4
 
5
5
  import '@dxosTheme';
6
- import { markdown } from '@codemirror/lang-markdown';
7
- import { ArrowCircleUp } from '@phosphor-icons/react';
8
- import React, { StrictMode, useState } from 'react';
9
- import { createRoot } from 'react-dom/client';
6
+
7
+ import defaultsDeep from 'lodash.defaultsdeep';
8
+ import React, { useRef, useState } from 'react';
10
9
 
11
10
  import { TextObject } from '@dxos/echo-schema';
12
- import { fixedInsetFlexLayout, getSize, groupSurface, inputSurface, mx } from '@dxos/react-ui-theme';
11
+ import { fixedInsetFlexLayout, groupSurface, mx } from '@dxos/react-ui-theme';
13
12
  import { withTheme } from '@dxos/storybook-utils';
14
13
 
15
- import { TextEditor } from './TextEditor';
16
- import { createHyperlinkTooltip, hyperlinkDecoration } from './extensions';
14
+ import { defaultSlots, TextEditor, type TextEditorProps, type TextEditorRef, type TextEditorSlots } from './TextEditor';
15
+ import { textTheme } from './themes';
17
16
  import { useTextModel } from '../../hooks';
18
17
 
19
- const text = [
20
- '',
21
- '',
22
- 'This is all about [DXOS](https://dxos.org); read more [here](https://docs.dxos.org/guide/getting-started.html).',
18
+ const initialText = [
19
+ '# TextEditor',
23
20
  '',
21
+ 'This is the basic plain text editor within minimal formatting.',
22
+ 'You can add custom styles and create custom extensions.',
23
+ 'Or use the MarkdownEditor to edit documents.',
24
24
  '',
25
+ 'https://dxos.org',
25
26
  ].join('\n');
26
27
 
27
- const hyperLinkTooltip = () =>
28
- createHyperlinkTooltip((el, url) => {
29
- const web = new URL(url);
30
- createRoot(el).render(
31
- <StrictMode>
32
- <div className='flex gap-1 items-center'>
33
- <ArrowCircleUp className={mx(getSize(6), 'text-blue-500')} />
34
- <p className='pr-1'>{web.origin}</p>
35
- </div>
36
- </StrictMode>,
37
- );
38
- });
39
-
40
- const Story = ({ automerge }: { automerge?: boolean }) => {
41
- const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: !!automerge }) });
28
+ const Story = ({
29
+ text,
30
+ automerge,
31
+ ...props
32
+ }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'extensions' | 'slots'>) => {
33
+ const ref = useRef<TextEditorRef>(null);
34
+ const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: automerge }) });
42
35
  const model = useTextModel({ text: item.text });
43
36
  if (!model) {
44
- return <></>;
37
+ return null;
45
38
  }
46
39
 
47
40
  return (
48
41
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
49
- <div className='flex justify-center p-8'>
50
- <div className='w-[800px]'>
51
- <TextEditor
52
- model={model}
53
- extensions={[
54
- markdown(),
55
- hyperlinkDecoration({ link: false }),
56
- hyperLinkTooltip(),
57
- // EditorView.domEventHandlers({
58
- // mousedown: (e, view) => {},
59
- // }),
60
- ]}
61
- slots={{ root: { className: mx(inputSurface, 'p-2') } }}
62
- />
42
+ <div className='flex justify-center overflow-y-scroll'>
43
+ <div className='flex flex-col w-[800px] py-16'>
44
+ <TextEditor ref={ref} model={model} {...props} />
45
+ <div className='flex shrink-0 h-[300px]'></div>
63
46
  </div>
64
47
  </div>
65
48
  </div>
@@ -67,13 +50,33 @@ const Story = ({ automerge }: { automerge?: boolean }) => {
67
50
  };
68
51
 
69
52
  export default {
53
+ title: 'react-ui-editor/TextEditor',
70
54
  component: TextEditor,
71
55
  decorators: [withTheme],
72
56
  render: Story,
73
57
  };
74
58
 
75
- export const Default = {};
59
+ export const Default = {
60
+ render: () => (
61
+ <Story
62
+ text={initialText}
63
+ slots={defaultsDeep(
64
+ { editor: { theme: textTheme, placeholder: 'Enter text...' } } satisfies TextEditorSlots,
65
+ defaultSlots,
66
+ )}
67
+ />
68
+ ),
69
+ };
76
70
 
77
71
  export const Automerge = {
78
- render: () => <Story automerge />,
72
+ render: () => (
73
+ <Story
74
+ text={initialText}
75
+ slots={defaultsDeep(
76
+ { editor: { theme: textTheme, placeholder: 'Enter text...' } } satisfies TextEditorSlots,
77
+ defaultSlots,
78
+ )}
79
+ automerge
80
+ />
81
+ ),
79
82
  };