@kerebron/editor-react 0.4.3

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 (88) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +82 -0
  3. package/esm/_dnt.shims.d.ts +2 -0
  4. package/esm/_dnt.shims.d.ts.map +1 -0
  5. package/esm/_dnt.shims.js +57 -0
  6. package/esm/editor/src/CoreEditor.d.ts +40 -0
  7. package/esm/editor/src/CoreEditor.d.ts.map +1 -0
  8. package/esm/editor/src/CoreEditor.js +252 -0
  9. package/esm/editor/src/DummyEditorView.d.ts +60 -0
  10. package/esm/editor/src/DummyEditorView.d.ts.map +1 -0
  11. package/esm/editor/src/DummyEditorView.js +277 -0
  12. package/esm/editor/src/Extension.d.ts +31 -0
  13. package/esm/editor/src/Extension.d.ts.map +1 -0
  14. package/esm/editor/src/Extension.js +53 -0
  15. package/esm/editor/src/ExtensionManager.d.ts +32 -0
  16. package/esm/editor/src/ExtensionManager.d.ts.map +1 -0
  17. package/esm/editor/src/ExtensionManager.js +260 -0
  18. package/esm/editor/src/Mark.d.ts +23 -0
  19. package/esm/editor/src/Mark.d.ts.map +1 -0
  20. package/esm/editor/src/Mark.js +51 -0
  21. package/esm/editor/src/Node.d.ts +32 -0
  22. package/esm/editor/src/Node.d.ts.map +1 -0
  23. package/esm/editor/src/Node.js +60 -0
  24. package/esm/editor/src/commands/CommandManager.d.ts +23 -0
  25. package/esm/editor/src/commands/CommandManager.d.ts.map +1 -0
  26. package/esm/editor/src/commands/CommandManager.js +118 -0
  27. package/esm/editor/src/commands/baseCommandFactories.d.ts +3 -0
  28. package/esm/editor/src/commands/baseCommandFactories.d.ts.map +1 -0
  29. package/esm/editor/src/commands/baseCommandFactories.js +836 -0
  30. package/esm/editor/src/commands/createChainableState.d.ts +3 -0
  31. package/esm/editor/src/commands/createChainableState.d.ts.map +1 -0
  32. package/esm/editor/src/commands/createChainableState.js +29 -0
  33. package/esm/editor/src/commands/keyCommandFactories.d.ts +3 -0
  34. package/esm/editor/src/commands/keyCommandFactories.d.ts.map +1 -0
  35. package/esm/editor/src/commands/keyCommandFactories.js +10 -0
  36. package/esm/editor/src/commands/mod.d.ts +7 -0
  37. package/esm/editor/src/commands/mod.d.ts.map +1 -0
  38. package/esm/editor/src/commands/mod.js +76 -0
  39. package/esm/editor/src/commands/replaceCommandFactories.d.ts +3 -0
  40. package/esm/editor/src/commands/replaceCommandFactories.d.ts.map +1 -0
  41. package/esm/editor/src/commands/replaceCommandFactories.js +94 -0
  42. package/esm/editor/src/commands/types.d.ts +18 -0
  43. package/esm/editor/src/commands/types.d.ts.map +1 -0
  44. package/esm/editor/src/commands/types.js +1 -0
  45. package/esm/editor/src/mod.d.ts +9 -0
  46. package/esm/editor/src/mod.d.ts.map +1 -0
  47. package/esm/editor/src/mod.js +8 -0
  48. package/esm/editor/src/nodeToTreeString.d.ts +10 -0
  49. package/esm/editor/src/nodeToTreeString.d.ts.map +1 -0
  50. package/esm/editor/src/nodeToTreeString.js +74 -0
  51. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts +6 -0
  52. package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts.map +1 -0
  53. package/esm/editor/src/plugins/TrackSelecionPlugin.js +24 -0
  54. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts +23 -0
  55. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts.map +1 -0
  56. package/esm/editor/src/plugins/input-rules/InputRulesPlugin.js +163 -0
  57. package/esm/editor/src/plugins/keymap/keymap.d.ts +11 -0
  58. package/esm/editor/src/plugins/keymap/keymap.d.ts.map +1 -0
  59. package/esm/editor/src/plugins/keymap/keymap.js +125 -0
  60. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts +4 -0
  61. package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts.map +1 -0
  62. package/esm/editor/src/plugins/keymap/w3c-keyname.js +124 -0
  63. package/esm/editor/src/types.d.ts +52 -0
  64. package/esm/editor/src/types.d.ts.map +1 -0
  65. package/esm/editor/src/types.js +1 -0
  66. package/esm/editor/src/ui.d.ts +15 -0
  67. package/esm/editor/src/ui.d.ts.map +1 -0
  68. package/esm/editor/src/ui.js +16 -0
  69. package/esm/editor/src/utilities/SmartOutput.d.ts +41 -0
  70. package/esm/editor/src/utilities/SmartOutput.d.ts.map +1 -0
  71. package/esm/editor/src/utilities/SmartOutput.js +228 -0
  72. package/esm/editor/src/utilities/createNodeFromContent.d.ts +9 -0
  73. package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -0
  74. package/esm/editor/src/utilities/createNodeFromContent.js +32 -0
  75. package/esm/editor/src/utilities/getHtmlAttributes.d.ts +9 -0
  76. package/esm/editor/src/utilities/getHtmlAttributes.d.ts.map +1 -0
  77. package/esm/editor/src/utilities/getHtmlAttributes.js +47 -0
  78. package/esm/editor-react/src/EditorContent.d.ts +26 -0
  79. package/esm/editor-react/src/EditorContent.d.ts.map +1 -0
  80. package/esm/editor-react/src/EditorContent.js +31 -0
  81. package/esm/editor-react/src/mod.d.ts +24 -0
  82. package/esm/editor-react/src/mod.d.ts.map +1 -0
  83. package/esm/editor-react/src/mod.js +24 -0
  84. package/esm/editor-react/src/useEditor.d.ts +38 -0
  85. package/esm/editor-react/src/useEditor.d.ts.map +1 -0
  86. package/esm/editor-react/src/useEditor.js +69 -0
  87. package/esm/package.json +3 -0
  88. package/package.json +22 -0
@@ -0,0 +1,9 @@
1
+ import type { MarkSpec, Node as ProseMirrorNode, NodeSpec } from 'prosemirror-model';
2
+ import type { Mark } from '../Mark.js';
3
+ import type { Node } from '../Node.js';
4
+ type MarkOfNode = Mark | Node;
5
+ export declare function getHtmlAttributes(extension: MarkOfNode, node: ProseMirrorNode): Record<string, any>;
6
+ export declare function setHtmlAttributes(extension: MarkOfNode, element: HTMLElement): Record<string, any>;
7
+ export declare function addAttributesToSchema(spec: MarkSpec | NodeSpec, extension: MarkOfNode): void;
8
+ export {};
9
+ //# sourceMappingURL=getHtmlAttributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getHtmlAttributes.d.ts","sourceRoot":"","sources":["../../../../src/editor/src/utilities/getHtmlAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,IAAI,IAAI,eAAe,EACvB,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,eAAe,uBAmBtB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,uBAc5E;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,SAAS,EAAE,UAAU,QAetB"}
@@ -0,0 +1,47 @@
1
+ export function getHtmlAttributes(extension, node) {
2
+ const attrs = {};
3
+ if (extension.attributes) {
4
+ for (const [key, value] of Object.entries(extension.attributes)) {
5
+ if ('undefined' !== typeof node.attrs[key]) {
6
+ attrs[key] = node.attrs[key];
7
+ }
8
+ else {
9
+ if (value.toDom) {
10
+ attrs[key] = value.toDom(node);
11
+ }
12
+ else {
13
+ attrs[key] = value.default;
14
+ }
15
+ }
16
+ }
17
+ }
18
+ return attrs;
19
+ }
20
+ export function setHtmlAttributes(extension, element) {
21
+ const attrs = {};
22
+ if (extension.attributes) {
23
+ for (const [key, value] of Object.entries(extension.attributes)) {
24
+ if (value.fromDom) {
25
+ attrs[key] = value.fromDom(element);
26
+ }
27
+ else {
28
+ attrs[key] = value.default;
29
+ }
30
+ }
31
+ }
32
+ return attrs;
33
+ }
34
+ export function addAttributesToSchema(spec, extension) {
35
+ const attrs = {};
36
+ if (extension.attributes) {
37
+ if (!spec.attrs) {
38
+ spec.attrs = {};
39
+ }
40
+ for (const [key, value] of Object.entries(extension.attributes)) {
41
+ spec.attrs[key] = value;
42
+ if (!value.toDom) {
43
+ value.toDom = (node) => node.attrs[key];
44
+ }
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import type { CoreEditor } from '../../editor/src/mod.js';
3
+ export interface EditorContentProps {
4
+ /** The editor instance from useEditor */
5
+ editor: CoreEditor | null;
6
+ /** Additional class name */
7
+ className?: string;
8
+ /** Additional inline styles */
9
+ style?: React.CSSProperties;
10
+ }
11
+ export interface EditorContentRef {
12
+ /** Get the container element */
13
+ getElement: () => HTMLDivElement | null;
14
+ }
15
+ /**
16
+ * EditorContent renders the Kerebron editor.
17
+ * Use with the useEditor hook.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const editor = useEditor({ extensions: [StarterKit] })
22
+ * return <EditorContent editor={editor} />
23
+ * ```
24
+ */
25
+ export declare const EditorContent: React.ForwardRefExoticComponent<EditorContentProps & React.RefAttributes<EditorContentRef>>;
26
+ //# sourceMappingURL=EditorContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorContent.d.ts","sourceRoot":"","sources":["../../../src/editor-react/src/EditorContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,UAAU,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;CACzC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,6FAkCzB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import React, { forwardRef, useEffect, useImperativeHandle, useRef, } from 'react';
2
+ /**
3
+ * EditorContent renders the Kerebron editor.
4
+ * Use with the useEditor hook.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * const editor = useEditor({ extensions: [StarterKit] })
9
+ * return <EditorContent editor={editor} />
10
+ * ```
11
+ */
12
+ export const EditorContent = forwardRef(function EditorContent({ editor, className = '', style }, ref) {
13
+ const containerRef = useRef(null);
14
+ useImperativeHandle(ref, () => ({
15
+ getElement: () => containerRef.current,
16
+ }));
17
+ useEffect(() => {
18
+ const container = containerRef.current;
19
+ if (!container || !editor)
20
+ return;
21
+ // Get the editor's DOM element and append it to our container
22
+ const editorDom = editor.view?.dom;
23
+ if (editorDom && editorDom.parentElement !== container) {
24
+ container.appendChild(editorDom);
25
+ }
26
+ return () => {
27
+ // Don't remove on cleanup - editor.destroy() handles this
28
+ };
29
+ }, [editor]);
30
+ return (React.createElement("div", { ref: containerRef, className: `kb-component ${className}`.trim(), style: style }));
31
+ });
@@ -0,0 +1,24 @@
1
+ /**
2
+ * React bindings for Kerebron Editor
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { useEditor, EditorContent } from '@kerebron/editor-react'
7
+ * import { StarterKit } from '@kerebron/editor-kits/StarterKit'
8
+ *
9
+ * const MyEditor = () => {
10
+ * const editor = useEditor({
11
+ * extensions: [StarterKit],
12
+ * content: '<p>Hello World!</p>',
13
+ * })
14
+ *
15
+ * return <EditorContent editor={editor} />
16
+ * }
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ export { useEditor, type UseEditorOptions } from './useEditor.js';
22
+ export { EditorContent, type EditorContentProps, type EditorContentRef, } from './EditorContent.js';
23
+ export { CoreEditor } from '../../editor/src/mod.js';
24
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/editor-react/src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * React bindings for Kerebron Editor
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { useEditor, EditorContent } from '@kerebron/editor-react'
7
+ * import { StarterKit } from '@kerebron/editor-kits/StarterKit'
8
+ *
9
+ * const MyEditor = () => {
10
+ * const editor = useEditor({
11
+ * extensions: [StarterKit],
12
+ * content: '<p>Hello World!</p>',
13
+ * })
14
+ *
15
+ * return <EditorContent editor={editor} />
16
+ * }
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ export { useEditor } from './useEditor.js';
22
+ export { EditorContent, } from './EditorContent.js';
23
+ // Re-export CoreEditor for convenience
24
+ export { CoreEditor } from '../../editor/src/mod.js';
@@ -0,0 +1,38 @@
1
+ import { type DependencyList } from 'react';
2
+ import { CoreEditor } from '../../editor/src/mod.js';
3
+ import type { AnyExtensionOrReq, Content } from '../../editor/src/mod.js';
4
+ export interface UseEditorOptions {
5
+ /** Array of extensions to use */
6
+ extensions?: AnyExtensionOrReq[];
7
+ /** Initial HTML content */
8
+ content?: string;
9
+ /** Initial JSON content */
10
+ initialContent?: Content;
11
+ /** CDN URL for WASM files */
12
+ cdnUrl?: string;
13
+ /** Document URI */
14
+ uri?: string;
15
+ /** Called when editor is ready */
16
+ onReady?: (editor: CoreEditor) => void;
17
+ /** Called on every transaction */
18
+ onTransaction?: (editor: CoreEditor) => void;
19
+ /** Called when content changes */
20
+ onChange?: (editor: CoreEditor) => void;
21
+ /** Prevent immediate render (useful for SSR) */
22
+ immediatelyRender?: boolean;
23
+ }
24
+ /**
25
+ * React hook for creating and managing a Kerebron editor instance.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * const editor = useEditor({
30
+ * extensions: [StarterKit],
31
+ * content: '<p>Hello World!</p>',
32
+ * })
33
+ *
34
+ * return <EditorContent editor={editor} />
35
+ * ```
36
+ */
37
+ export declare function useEditor(options?: UseEditorOptions, deps?: DependencyList): CoreEditor | null;
38
+ //# sourceMappingURL=useEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEditor.d.ts","sourceRoot":"","sources":["../../../src/editor-react/src/useEditor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAA+B,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,kCAAkC;IAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CACvB,OAAO,GAAE,gBAAqB,EAC9B,IAAI,GAAE,cAAmB,GACxB,UAAU,GAAG,IAAI,CAyEnB"}
@@ -0,0 +1,69 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { CoreEditor } from '../../editor/src/mod.js';
4
+ /**
5
+ * React hook for creating and managing a Kerebron editor instance.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * const editor = useEditor({
10
+ * extensions: [StarterKit],
11
+ * content: '<p>Hello World!</p>',
12
+ * })
13
+ *
14
+ * return <EditorContent editor={editor} />
15
+ * ```
16
+ */
17
+ export function useEditor(options = {}, deps = []) {
18
+ const [editor, setEditor] = useState(null);
19
+ const editorContainerRef = useRef(null);
20
+ const optionsRef = useRef(options);
21
+ // Keep options ref updated
22
+ optionsRef.current = options;
23
+ useEffect(() => {
24
+ // Skip if SSR and immediatelyRender is false
25
+ if (options.immediatelyRender === false && typeof dntShim.dntGlobalThis === 'undefined') {
26
+ return;
27
+ }
28
+ const { extensions = [], content, initialContent, cdnUrl, uri, onReady, onTransaction, onChange, } = optionsRef.current;
29
+ // Create a container element for the editor
30
+ const container = document.createElement('div');
31
+ editorContainerRef.current = container;
32
+ const editorInstance = new CoreEditor({
33
+ element: container,
34
+ extensions,
35
+ content: initialContent,
36
+ cdnUrl,
37
+ uri,
38
+ });
39
+ // Set up event listeners
40
+ if (onTransaction) {
41
+ editorInstance.addEventListener('transaction', () => {
42
+ onTransaction(editorInstance);
43
+ });
44
+ }
45
+ if (onChange) {
46
+ editorInstance.addEventListener('changed', () => {
47
+ onChange(editorInstance);
48
+ });
49
+ }
50
+ // Load HTML content if provided
51
+ if (content) {
52
+ const buffer = new TextEncoder().encode(content);
53
+ editorInstance.loadDocument('text/html', buffer).catch(() => {
54
+ // If HTML loading fails, try setting as plain text
55
+ console.warn('Failed to load HTML content');
56
+ });
57
+ }
58
+ setEditor(editorInstance);
59
+ if (onReady) {
60
+ onReady(editorInstance);
61
+ }
62
+ // Cleanup
63
+ return () => {
64
+ editorInstance.destroy();
65
+ setEditor(null);
66
+ };
67
+ }, deps); // eslint-disable-line react-hooks/exhaustive-deps
68
+ return editor;
69
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@kerebron/editor-react",
3
+ "version": "0.4.3",
4
+ "license": "MIT",
5
+ "module": "./esm/editor-react/src/mod.js",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./esm/editor-react/src/mod.js"
9
+ }
10
+ },
11
+ "scripts": {},
12
+ "dependencies": {
13
+ "prosemirror-model": "1.25.3",
14
+ "prosemirror-state": "1.4.3",
15
+ "prosemirror-transform": "1.10.4",
16
+ "prosemirror-view": "1.40.0"
17
+ },
18
+ "devDependencies": {
19
+ "@types/node": "^20.9.0"
20
+ },
21
+ "_generatedBy": "dnt@dev"
22
+ }