@stesura/react-wordgard 0.0.0-stage → 0.2.0

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 (111) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE.txt +21 -0
  3. package/README.md +912 -2
  4. package/THIRD_PARTY_LICENSES.txt +93 -0
  5. package/dist/ReactWordgard.d.ts +13 -0
  6. package/dist/ReactWordgard.js +94 -0
  7. package/dist/changes.d.ts +14 -0
  8. package/dist/changes.js +163 -0
  9. package/dist/components/ChildNodeViews.d.ts +8 -0
  10. package/dist/components/ChildNodeViews.js +36 -0
  11. package/dist/components/DecorationRoot.d.ts +13 -0
  12. package/dist/components/DecorationRoot.js +31 -0
  13. package/dist/components/ErrorBoundary.d.ts +18 -0
  14. package/dist/components/ErrorBoundary.js +14 -0
  15. package/dist/components/SeparatorHackView.d.ts +2 -0
  16. package/dist/components/SeparatorHackView.js +4 -0
  17. package/dist/components/ShapeView.d.ts +12 -0
  18. package/dist/components/ShapeView.js +24 -0
  19. package/dist/components/TextNodeView.d.ts +5 -0
  20. package/dist/components/TextNodeView.js +4 -0
  21. package/dist/components/TrailingHackView.d.ts +2 -0
  22. package/dist/components/TrailingHackView.js +4 -0
  23. package/dist/components/WidgetView.d.ts +10 -0
  24. package/dist/components/WidgetView.js +32 -0
  25. package/dist/components/WordgardDoc.d.ts +9 -0
  26. package/dist/components/WordgardDoc.js +36 -0
  27. package/dist/components/WordgardEditor.d.ts +15 -0
  28. package/dist/components/WordgardEditor.js +17 -0
  29. package/dist/components/WordgardScope.d.ts +14 -0
  30. package/dist/components/WordgardScope.js +14 -0
  31. package/dist/components/WrapperView.d.ts +12 -0
  32. package/dist/components/WrapperView.js +23 -0
  33. package/dist/components/marks/MarkView.d.ts +11 -0
  34. package/dist/components/marks/MarkView.js +10 -0
  35. package/dist/components/marks/ReactMarkView.d.ts +10 -0
  36. package/dist/components/marks/ReactMarkView.js +30 -0
  37. package/dist/components/nodes/DefaultNodeView.d.ts +16 -0
  38. package/dist/components/nodes/DefaultNodeView.js +112 -0
  39. package/dist/components/nodes/DocNodeView.d.ts +7 -0
  40. package/dist/components/nodes/DocNodeView.js +5 -0
  41. package/dist/composition.d.ts +23 -0
  42. package/dist/composition.js +95 -0
  43. package/dist/contexts/DecorationContext.d.ts +15 -0
  44. package/dist/contexts/DecorationContext.js +35 -0
  45. package/dist/contexts/DecorationRootContext.d.ts +6 -0
  46. package/dist/contexts/DecorationRootContext.js +4 -0
  47. package/dist/contexts/EditorContext.d.ts +27 -0
  48. package/dist/contexts/EditorContext.js +87 -0
  49. package/dist/contexts/RenderStoreContext.d.ts +15 -0
  50. package/dist/contexts/RenderStoreContext.js +41 -0
  51. package/dist/contexts/editorEvents.d.ts +12 -0
  52. package/dist/contexts/editorEvents.js +92 -0
  53. package/dist/decorations/DecoIterator.d.ts +43 -0
  54. package/dist/decorations/DecoIterator.js +462 -0
  55. package/dist/decorations/ReactMarkType.d.ts +41 -0
  56. package/dist/decorations/ReactMarkType.js +47 -0
  57. package/dist/decorations/ReactShapeType.d.ts +65 -0
  58. package/dist/decorations/ReactShapeType.js +202 -0
  59. package/dist/decorations/ReactWidgetType.d.ts +29 -0
  60. package/dist/decorations/ReactWidgetType.js +67 -0
  61. package/dist/decorations/ReactWrapperType.d.ts +31 -0
  62. package/dist/decorations/ReactWrapperType.js +41 -0
  63. package/dist/decorations/iterDeco.d.ts +82 -0
  64. package/dist/decorations/iterDeco.js +406 -0
  65. package/dist/helpers/attributes.d.ts +2 -0
  66. package/dist/helpers/attributes.js +11 -0
  67. package/dist/helpers/index.d.ts +2 -0
  68. package/dist/helpers/index.js +2 -0
  69. package/dist/helpers/props.d.ts +8 -0
  70. package/dist/helpers/props.js +248 -0
  71. package/dist/helpers/refs.d.ts +6 -0
  72. package/dist/helpers/refs.js +20 -0
  73. package/dist/hooks/useEditorEffect.d.ts +10 -0
  74. package/dist/hooks/useEditorEffect.js +28 -0
  75. package/dist/hooks/useEditorEventCallback.d.ts +8 -0
  76. package/dist/hooks/useEditorEventCallback.js +17 -0
  77. package/dist/hooks/useEditorEventListener.d.ts +10 -0
  78. package/dist/hooks/useEditorEventListener.js +26 -0
  79. package/dist/hooks/useEditorLayoutEffect.d.ts +15 -0
  80. package/dist/hooks/useEditorLayoutEffect.js +34 -0
  81. package/dist/hooks/useEditorState.d.ts +6 -0
  82. package/dist/hooks/useEditorState.js +12 -0
  83. package/dist/hooks/useEditorStateSelector.d.ts +7 -0
  84. package/dist/hooks/useEditorStateSelector.js +11 -0
  85. package/dist/hooks/useIgnoreMutation.d.ts +6 -0
  86. package/dist/hooks/useIgnoreMutation.js +19 -0
  87. package/dist/hooks/useIsNodeSelected.d.ts +2 -0
  88. package/dist/hooks/useIsNodeSelected.js +5 -0
  89. package/dist/hooks/useMergedDOMRefs.d.ts +6 -0
  90. package/dist/hooks/useMergedDOMRefs.js +18 -0
  91. package/dist/hooks/useNodePos.d.ts +4 -0
  92. package/dist/hooks/useNodePos.js +7 -0
  93. package/dist/hooks/useSelectNode.d.ts +6 -0
  94. package/dist/hooks/useSelectNode.js +25 -0
  95. package/dist/hooks/useStopEvent.d.ts +8 -0
  96. package/dist/hooks/useStopEvent.js +21 -0
  97. package/dist/hooks/useWordgard.d.ts +2 -0
  98. package/dist/hooks/useWordgard.js +3 -0
  99. package/dist/index.d.ts +21 -0
  100. package/dist/index.js +21 -0
  101. package/dist/reactKeys.d.ts +39 -0
  102. package/dist/reactKeys.js +188 -0
  103. package/dist/tile.d.ts +32 -0
  104. package/dist/tile.js +1319 -0
  105. package/dist/viewRoots.d.ts +2 -0
  106. package/dist/viewRoots.js +7 -0
  107. package/dist/wordgardInternals.d.ts +211 -0
  108. package/dist/wordgardInternals.js +82 -0
  109. package/package.json +119 -4
  110. package/skills/react-wordgard/SKILL.md +525 -0
  111. package/skills/react-wordgard/references/wordgard.md +189 -0
@@ -0,0 +1,2 @@
1
+ export declare const viewRoots: WeakSet<Element>;
2
+ export declare const viewRoot: (dom: Element | null) => void;
@@ -0,0 +1,7 @@
1
+ // The elements React drew for node views and mark wrappers, to tell a React shape's chrome from its
2
+ // content.
3
+ export const viewRoots = new WeakSet();
4
+ export const viewRoot = (dom) => {
5
+ if (dom)
6
+ viewRoots.add(dom);
7
+ };
@@ -0,0 +1,211 @@
1
+ import { type Attributes, type Node as DocNode, Elt, type Mark } from "wordgard/doc";
2
+ import { Decoration, Widget, Wordgard } from "wordgard/editor";
3
+ import { GardState } from "wordgard/state";
4
+ export type Tile = NonNullable<Node["wgTile"]>;
5
+ export type CompositeTile = NonNullable<Tile["parent"]>;
6
+ export type DecoSet = {
7
+ readonly points: Map<(state: GardState) => Decoration.Point.Set, Decoration.Point.Set>;
8
+ readonly ranges: Map<(state: GardState) => Decoration.Range.Set, Decoration.Range.Set>;
9
+ };
10
+ export interface DocTile extends CompositeTile {
11
+ readonly state: GardState;
12
+ readonly cursorWrapper: Mark.Set | null;
13
+ readonly decoSet: DecoSet;
14
+ update(state: GardState, changes: readonly number[], wg: Wordgard, composition?: CompositionInfo | null): DocTile;
15
+ updateRanges(state: GardState, decoSet: DecoSet, changes: readonly number[], wg: Wordgard, composition?: CompositionInfo | null): DocTile;
16
+ resolve(pos: number, side?: -1 | 1): {
17
+ tile: Tile;
18
+ offset: number;
19
+ pos: number;
20
+ };
21
+ nodeTile(pos: number): Tile | null;
22
+ nearest(dom: Node): Tile | null;
23
+ posFromDOM(dom: Node, offset: number, bias?: -1 | 1): number;
24
+ }
25
+ export interface CompositionInfo {
26
+ readonly fromB: number;
27
+ readonly toB: number;
28
+ readonly text: string;
29
+ readonly target: Text | null;
30
+ readonly wrapCursor?: Mark.Set | null;
31
+ }
32
+ export interface DOMObserver {
33
+ ignore<T>(f: () => T): T;
34
+ observer: MutationObserver;
35
+ queue: MutationRecord[];
36
+ }
37
+ interface DocTileClass {
38
+ new (state: GardState, dom: Element, cursorWrapper: Mark.Set | null, decoSet: DecoSet): DocTile;
39
+ create(state: GardState, dom: Element, wg: Wordgard): DocTile;
40
+ }
41
+ export interface EltTile extends CompositeTile {
42
+ readonly elt: DecoElt;
43
+ }
44
+ export interface EltTileClass {
45
+ new (elt: DecoElt, tag: DocNode.Tag | null, flags: number, length: number, dom: Element): EltTile;
46
+ of(elt: DecoElt, tag: DocNode.Tag | null, flags: number, length: number, dom?: Element | null): EltTile;
47
+ }
48
+ export interface TextTile extends Tile {
49
+ text: string;
50
+ dom: Text;
51
+ }
52
+ interface TextTileClass {
53
+ new (text: string, dom: Text, flags?: number): TextTile;
54
+ }
55
+ export interface WidgetTile extends Tile {
56
+ readonly widget: Widget;
57
+ }
58
+ interface WidgetTileClass {
59
+ new (widget: Widget, tag: DocNode.Tag | null, flags: number, dom: Element | Text, length?: number): WidgetTile;
60
+ }
61
+ export declare const TileFlag: {
62
+ readonly NodeInner: 1;
63
+ readonly PlotContent: 2;
64
+ readonly Spanning: 4;
65
+ readonly Wrapper: 8;
66
+ readonly Point: 16;
67
+ readonly PointBefore: 32;
68
+ readonly PointAfter: 64;
69
+ readonly Composition: 128;
70
+ readonly Synced: 256;
71
+ readonly Atom: 512;
72
+ readonly HasContent: 1024;
73
+ readonly AfterContent: 2048;
74
+ readonly ContentNotLast: 4096;
75
+ readonly Dirty: 8192;
76
+ };
77
+ export declare const Reused: {
78
+ readonly Full: 1;
79
+ readonly DOM: 2;
80
+ };
81
+ interface NodeShape<Param> {
82
+ readonly atom: boolean;
83
+ create(param: Param): Elt;
84
+ }
85
+ export interface EltSelector {
86
+ match(elt: Elt): boolean;
87
+ }
88
+ declare module "wordgard/doc" {
89
+ namespace Plot {
90
+ interface Type<Param = unknown> {
91
+ readonly shape: NodeShape<Param>;
92
+ }
93
+ }
94
+ namespace Leaf {
95
+ interface Type<Param = unknown> {
96
+ readonly shape: NodeShape<Param>;
97
+ }
98
+ }
99
+ namespace Mark {
100
+ interface Type<Param = unknown> {
101
+ readonly rank: number;
102
+ readonly element: {
103
+ readonly name: string;
104
+ attrs(value: Param): Attributes;
105
+ } | null;
106
+ readonly attribute: {
107
+ get(value: Param): Attributes;
108
+ readonly target: EltSelector | null;
109
+ } | null;
110
+ }
111
+ }
112
+ interface Elt<T = string> {
113
+ addAttrs(attrs: Attributes, target?: EltSelector): Elt<T>;
114
+ wrap(wrapper: Elt<T>, target?: EltSelector): Elt<T>;
115
+ fill(content: readonly (0 | T | Elt<T>)[]): Elt<T>;
116
+ }
117
+ namespace Attributes {
118
+ function push(attrs: string[], name: string, value: string): void;
119
+ }
120
+ }
121
+ declare module "wordgard/editor" {
122
+ interface Widget<Param = unknown> {
123
+ readonly hasContent: boolean;
124
+ render(wg: Wordgard): Element | Text;
125
+ }
126
+ namespace Wordgard {
127
+ const DocTile: DocTileClass;
128
+ }
129
+ namespace Widget {
130
+ interface Type<Param> {
131
+ readonly inFlow: boolean;
132
+ readonly editable: boolean;
133
+ }
134
+ const br: Widget<null>;
135
+ const img: Widget<null>;
136
+ const text: Widget.Type<string>;
137
+ const editableText: Widget.Type<string>;
138
+ }
139
+ namespace Decoration {
140
+ interface Range {
141
+ readonly query: DocNode.Query | null;
142
+ readonly scope: number;
143
+ readonly inc: number;
144
+ }
145
+ }
146
+ }
147
+ export declare const DocTile: DocTileClass;
148
+ export declare const getTileClasses: () => {
149
+ EltTile: EltTileClass;
150
+ TextTile: TextTileClass;
151
+ WidgetTile: WidgetTileClass;
152
+ };
153
+ export type DecoElt = Elt<Widget | string>;
154
+ export interface WidgetDecoration extends Decoration.Point {
155
+ readonly widget: Widget;
156
+ }
157
+ export interface ShapeDecoration extends Decoration.Point {
158
+ readonly shape: Decoration.Shape;
159
+ }
160
+ export interface AttributeDecoration extends Decoration.Point {
161
+ readonly attrs: Attributes;
162
+ readonly selector: EltSelector | null;
163
+ }
164
+ export interface WrapperDecoration extends Decoration.Point {
165
+ readonly elt: DecoElt;
166
+ readonly selector: EltSelector | null;
167
+ }
168
+ export interface WrapperRangeDecoration extends Decoration.Range {
169
+ readonly elt: DecoElt;
170
+ readonly rank: number;
171
+ readonly spanning: boolean;
172
+ }
173
+ export interface AttributeRangeDecoration extends Decoration.Range {
174
+ readonly attribute: string;
175
+ readonly value: string;
176
+ }
177
+ export type TagShape = {
178
+ readonly type: DocNode.Type;
179
+ readonly shape: (tag: DocNode.Tag) => Decoration.Shape;
180
+ };
181
+ export type TagWidget = {
182
+ readonly type: DocNode.Type;
183
+ readonly place: number;
184
+ readonly widget: Widget | ((tag: DocNode.Tag) => Widget | null);
185
+ };
186
+ export type TagWrapper = {
187
+ readonly type: DocNode.Type;
188
+ readonly elt: DecoElt;
189
+ readonly target: EltSelector | null;
190
+ };
191
+ export type TagAttribute = {
192
+ readonly type: DocNode.Type;
193
+ readonly attr: string;
194
+ readonly value: (tag: DocNode.Tag) => string;
195
+ readonly target: EltSelector | null;
196
+ };
197
+ type Class<T> = new (...args: never[]) => T;
198
+ export declare const getDecorationInternals: () => {
199
+ WidgetDecoration: Class<WidgetDecoration>;
200
+ ShapeDecoration: Class<ShapeDecoration>;
201
+ AttributeDecoration: Class<AttributeDecoration>;
202
+ WrapperDecoration: Class<WrapperDecoration>;
203
+ WrapperRangeDecoration: Class<WrapperRangeDecoration>;
204
+ AttributeRangeDecoration: Class<AttributeRangeDecoration>;
205
+ tagShape: GardState.Facet<TagShape, Map<DocNode.Type, (tag: DocNode.Tag) => Decoration.Shape>>;
206
+ tagWidget: GardState.Facet<TagWidget, readonly TagWidget[]>;
207
+ tagWrapper: GardState.Facet<TagWrapper, readonly TagWrapper[]>;
208
+ tagAttribute: GardState.Facet<TagAttribute, readonly TagAttribute[]>;
209
+ markShape: GardState.Facet<unknown, Map<Mark.Type, Mark.Type>>;
210
+ };
211
+ export {};
@@ -0,0 +1,82 @@
1
+ // The one place depending on Wordgard internals missing from its typings. The declarations are
2
+ // trusted, not checked: re-read them against Wordgard's source after `npm run update-wordgard`.
3
+ import { Elt } from "wordgard/doc";
4
+ import { Decoration, Widget, Wordgard } from "wordgard/editor";
5
+ import { basicSchema } from "wordgard/schema";
6
+ import { GardState } from "wordgard/state";
7
+ import { Emphasis, Image, Paragraph } from "wordgard/types";
8
+ // Wordgard's `TileFlag`, a const enum its typings declare without exporting.
9
+ export const TileFlag = {
10
+ NodeInner: 0x1,
11
+ PlotContent: 0x2,
12
+ Spanning: 0x4,
13
+ Wrapper: 0x8,
14
+ Point: 0x10,
15
+ PointBefore: 0x20,
16
+ PointAfter: 0x40,
17
+ Composition: 0x80,
18
+ Synced: 0x100,
19
+ Atom: 0x200,
20
+ HasContent: 0x400,
21
+ AfterContent: 0x800,
22
+ ContentNotLast: 0x1000,
23
+ Dirty: 0x2000,
24
+ };
25
+ // Wordgard's `Reused`, how a tile of the previous tree was used in the new one:
26
+ // whole (`Full`, not disconnected), or for its DOM only.
27
+ export const Reused = { Full: 1, DOM: 2 };
28
+ export const DocTile = Wordgard.DocTile;
29
+ let tileClasses;
30
+ // Wordgard doesn't expose its other tile classes, and its code checks
31
+ // `instanceof TextTile`, so we take them from a tree it builds, once. Their
32
+ // types come from `Object.getPrototypeOf`'s `any`: unchecked, like the
33
+ // declarations above.
34
+ export const getTileClasses = () => {
35
+ if (tileClasses)
36
+ return tileClasses;
37
+ const wg = Wordgard.create({ doc: "<p>x</p><p></p>", config: [basicSchema()] });
38
+ const [text, empty] = wg.contentDOM.children;
39
+ const classOf = (dom) => {
40
+ if (!dom?.wgTile)
41
+ throw new Error("Wordgard's tile tree has an unexpected shape");
42
+ return Object.getPrototypeOf(dom.wgTile).constructor;
43
+ };
44
+ tileClasses = {
45
+ EltTile: classOf(text),
46
+ TextTile: classOf(text?.firstChild),
47
+ WidgetTile: classOf(empty?.firstChild),
48
+ };
49
+ return tileClasses;
50
+ };
51
+ let decorationInternals;
52
+ // The facet a provider (what `Facet.of` returns) is for.
53
+ const facetOf = (extension) => {
54
+ if (typeof extension == "object" &&
55
+ extension &&
56
+ "facet" in extension &&
57
+ extension.facet instanceof GardState.Facet)
58
+ return extension.facet;
59
+ throw new Error("Wordgard's decoration facets have an unexpected shape");
60
+ };
61
+ // Wordgard's decoration classes and facets, taken from what its public
62
+ // factories return, once. Typed through `any` (`getPrototypeOf`, `instanceof`
63
+ // on a generic class): unchecked, like the declarations above.
64
+ export const getDecorationInternals = () => {
65
+ if (decorationInternals)
66
+ return decorationInternals;
67
+ const classOf = (value) => Object.getPrototypeOf(value).constructor;
68
+ decorationInternals = {
69
+ WidgetDecoration: classOf(Decoration.Point.widget(Widget.br)),
70
+ ShapeDecoration: classOf(Decoration.Point.shape(Elt.mk("span"))),
71
+ AttributeDecoration: classOf(Decoration.Point.attributes({})),
72
+ WrapperDecoration: classOf(Decoration.Point.wrapper(Elt.mk("span", [0]))),
73
+ WrapperRangeDecoration: classOf(Decoration.Range.wrapper("span", {})),
74
+ AttributeRangeDecoration: classOf(Decoration.Range.attribute("data-x", "")),
75
+ tagShape: facetOf(Decoration.Tag.shape(Image, Elt.mk("img"))),
76
+ tagWidget: facetOf(Decoration.Tag.widget(Paragraph, "before", Widget.br)),
77
+ tagWrapper: facetOf(Decoration.Tag.wrapper(Paragraph, Elt.mk("div", [0]))),
78
+ tagAttribute: facetOf(Decoration.Tag.attribute(Paragraph, "data-x", "")),
79
+ markShape: facetOf(Decoration.Mark.shape(Emphasis, { element: "i" })),
80
+ };
81
+ return decorationInternals;
82
+ };
package/package.json CHANGED
@@ -1,6 +1,121 @@
1
1
  {
2
2
  "name": "@stesura/react-wordgard",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "A React view for the Wordgard rich text editor",
5
+ "keywords": [
6
+ "react",
7
+ "wordgard",
8
+ "rich-text",
9
+ "editor",
10
+ "contenteditable"
11
+ ],
12
+ "homepage": "https://github.com/stesura/react-wordgard#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/stesura/react-wordgard/issues"
15
+ },
16
+ "author": "Edoardo Caratti",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/stesura/react-wordgard.git"
20
+ },
21
+ "license": "MIT",
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "type": "module",
26
+ "sideEffects": false,
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "README.md",
37
+ "CHANGELOG.md",
38
+ "LICENSE.txt",
39
+ "THIRD_PARTY_LICENSES.txt",
40
+ "dist",
41
+ "skills"
42
+ ],
43
+ "scripts": {
44
+ "prebuild": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
45
+ "build": "tsc -p tsconfig.build.json",
46
+ "dev": "tsc -p tsconfig.build.json --watch",
47
+ "check": "npm run check:types && npm run check:lint && npm run check:format",
48
+ "check:types": "tsc",
49
+ "check:lint": "eslint .",
50
+ "check:format": "prettier --check .",
51
+ "check:bench": "tsc -p bench",
52
+ "fix": "eslint --fix . && prettier --write .",
53
+ "demo": "vite",
54
+ "demo:preview": "vite build --outDir demo-dist && vite preview --outDir demo-dist",
55
+ "test": "vitest run",
56
+ "test:unit": "vitest run --project unit",
57
+ "test:browser": "vitest run --project browser",
58
+ "bench": "vitest run --config bench/vitest.config.ts",
59
+ "bench:dev": "vitest run --config bench/vitest.config.ts --mode development",
60
+ "bench:smoke": "vitest run --config bench/vitest.config.ts --mode smoke",
61
+ "bench:heap": "vitest run --config bench/vitest.config.ts --mode heap",
62
+ "bench:heap-dev": "vitest run --config bench/vitest.config.ts --mode heap-development",
63
+ "bench:profile": "vitest run --config bench/vitest.config.ts --mode profile",
64
+ "bench:profile-dev": "vitest run --config bench/vitest.config.ts --mode profile-development",
65
+ "sync-wordgard-tests": "node scripts/sync-wordgard-tests.js",
66
+ "update-wordgard": "node scripts/update-wordgard.js",
67
+ "release:prepare": "node scripts/release.js prepare",
68
+ "release:publish": "node scripts/release.js publish",
69
+ "prepack": "npm run build"
70
+ },
71
+ "devDependencies": {
72
+ "@eslint/js": "^10.0.1",
73
+ "@handlewithcare/react-prosemirror": "^3.2.11",
74
+ "@testing-library/dom": "^10.4.0",
75
+ "@testing-library/react": "^16.3.0",
76
+ "@types/node": "^22.0.0",
77
+ "@types/react": "^18.2.0",
78
+ "@types/react-dom": "^18.2.0",
79
+ "@types/use-sync-external-store": "^1.7.0",
80
+ "@vitejs/plugin-react": "^6.1.2",
81
+ "@vitest/browser-playwright": "^5.0.5",
82
+ "axe-core": "^4.14.0",
83
+ "eslint": "^10.14.0",
84
+ "eslint-config-prettier": "^10.1.8",
85
+ "eslint-plugin-react-hooks": "^7.1.1",
86
+ "globals": "^17.13.0",
87
+ "ist": "^1.1.7",
88
+ "jsdom": "^30.1.3",
89
+ "playwright": "^1.64.1",
90
+ "prettier": "^3.9.10",
91
+ "prosemirror-commands": "^1.7.2",
92
+ "prosemirror-history": "^1.5.1",
93
+ "prosemirror-model": "^1.25.12",
94
+ "prosemirror-schema-basic": "^1.2.5",
95
+ "prosemirror-state": "^1.4.4",
96
+ "prosemirror-transform": "^1.12.4",
97
+ "prosemirror-view": "^1.42.3",
98
+ "react": "^18.2.0",
99
+ "react-dom": "^18.2.0",
100
+ "react-reconciler": "^0.29.2",
101
+ "typescript": "^6.0.3",
102
+ "typescript-eslint": "^8.72.1",
103
+ "vite": "^8.3.5",
104
+ "vitest": "^5.0.5",
105
+ "wordgard": "0.6.2"
106
+ },
107
+ "peerDependencies": {
108
+ "react": ">=18 <20",
109
+ "react-dom": ">=18 <20",
110
+ "wordgard": "~0.6.2"
111
+ },
112
+ "dependencies": {
113
+ "use-sync-external-store": "^1.7.0"
114
+ },
115
+ "devEngines": {
116
+ "runtime": {
117
+ "name": "node",
118
+ "version": ">=22.12"
119
+ }
120
+ }
121
+ }