@umbraci/jsmind 0.9.1-rich-text

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.
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Initialize graph renderer based on engine type.
3
+ * @param {import('./jsmind.view_provider.js').ViewProvider} view - View provider instance
4
+ * @param {'canvas'|'svg'} engine - Rendering engine type
5
+ * @returns {SvgGraph|CanvasGraph} Graph renderer instance
6
+ */
7
+ export function init_graph(view: import("./jsmind.view_provider.js").ViewProvider, engine: "canvas" | "svg"): SvgGraph | CanvasGraph;
8
+ /**
9
+ * SVG-based graph renderer.
10
+ */
11
+ declare class SvgGraph {
12
+ /** @param {string} tag */
13
+ static c(tag: string): SVGElement;
14
+ /**
15
+ * Create SVG graph renderer.
16
+ * @param {import('./jsmind.view_provider.js').ViewProvider} view - View provider instance
17
+ */
18
+ constructor(view: import("./jsmind.view_provider.js").ViewProvider);
19
+ view: import("./jsmind.view_provider.js").ViewProvider;
20
+ opts: {
21
+ engine: "canvas" | "svg";
22
+ enable_device_pixel_ratio: boolean;
23
+ hmargin: number;
24
+ vmargin: number;
25
+ line_width: number;
26
+ line_color: string;
27
+ line_style: "curved" | "straight";
28
+ custom_line_render?: Function;
29
+ draggable: boolean;
30
+ hide_scrollbars_when_draggable: boolean;
31
+ node_overflow: "hidden" | "wrap";
32
+ zoom: {
33
+ min: number;
34
+ max: number;
35
+ step: number;
36
+ mask_key: number;
37
+ };
38
+ custom_node_render?: Function;
39
+ expander_style: "char" | "number";
40
+ enable_multiline?: boolean;
41
+ };
42
+ e_svg: SVGElement;
43
+ size: {
44
+ w: number;
45
+ h: number;
46
+ };
47
+ /** @type {SVGPathElement[]} */
48
+ lines: SVGPathElement[];
49
+ line_drawing: {
50
+ straight: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
51
+ curved: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
52
+ };
53
+ /** Choose line drawing renderer. */
54
+ init_line_render(): void;
55
+ /** @type {(path:SVGPathElement,x1:number,y1:number,x2:number,y2:number)=>void} */
56
+ drawing: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
57
+ /** @returns {SVGSVGElement} */
58
+ element(): SVGSVGElement;
59
+ /** @param {number} w @param {number} h */
60
+ set_size(w: number, h: number): void;
61
+ clear(): void;
62
+ /** @param {{x:number,y:number}} pout @param {{x:number,y:number}} pin @param {{x:number,y:number}} offset @param {string=} color */
63
+ draw_line(pout: {
64
+ x: number;
65
+ y: number;
66
+ }, pin: {
67
+ x: number;
68
+ y: number;
69
+ }, offset: {
70
+ x: number;
71
+ y: number;
72
+ }, color?: string | undefined): void;
73
+ /** @param {CanvasRenderingContext2D} dest_canvas_ctx @param {(()=>void)=} callback */
74
+ copy_to(dest_canvas_ctx: CanvasRenderingContext2D, callback?: (() => void) | undefined): void;
75
+ /**
76
+ * Draw bezier curve to SVG path.
77
+ * @internal
78
+ * @param {SVGPathElement} path - SVG path element
79
+ * @param {number} x1 - Start x coordinate
80
+ * @param {number} y1 - Start y coordinate
81
+ * @param {number} x2 - End x coordinate
82
+ * @param {number} y2 - End y coordinate
83
+ */
84
+ _bezier_to(path: SVGPathElement, x1: number, y1: number, x2: number, y2: number): void;
85
+ /**
86
+ * Draw straight line to SVG path.
87
+ * @internal
88
+ * @param {SVGPathElement} path - SVG path element
89
+ * @param {number} x1 - Start x coordinate
90
+ * @param {number} y1 - Start y coordinate
91
+ * @param {number} x2 - End x coordinate
92
+ * @param {number} y2 - End y coordinate
93
+ */
94
+ _line_to(path: SVGPathElement, x1: number, y1: number, x2: number, y2: number): void;
95
+ }
96
+ /**
97
+ * Canvas-based graph renderer.
98
+ */
99
+ declare class CanvasGraph {
100
+ /**
101
+ * Create canvas graph renderer.
102
+ * @param {import('./jsmind.view_provider.js').ViewProvider} view - View provider instance
103
+ */
104
+ constructor(view: import("./jsmind.view_provider.js").ViewProvider);
105
+ opts: {
106
+ engine: "canvas" | "svg";
107
+ enable_device_pixel_ratio: boolean;
108
+ hmargin: number;
109
+ vmargin: number;
110
+ line_width: number;
111
+ line_color: string;
112
+ line_style: "curved" | "straight";
113
+ custom_line_render?: Function;
114
+ draggable: boolean;
115
+ hide_scrollbars_when_draggable: boolean;
116
+ node_overflow: "hidden" | "wrap";
117
+ zoom: {
118
+ min: number;
119
+ max: number;
120
+ step: number;
121
+ mask_key: number;
122
+ };
123
+ custom_node_render?: Function;
124
+ expander_style: "char" | "number";
125
+ enable_multiline?: boolean;
126
+ };
127
+ e_canvas: HTMLElement;
128
+ canvas_ctx: CanvasRenderingContext2D;
129
+ size: {
130
+ w: number;
131
+ h: number;
132
+ };
133
+ line_drawing: {
134
+ straight: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
135
+ curved: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
136
+ };
137
+ dpr: number;
138
+ /** Choose line drawing renderer. */
139
+ init_line_render(): void;
140
+ /** @type {(ctx:CanvasRenderingContext2D,x1:number,y1:number,x2:number,y2:number)=>void} */
141
+ drawing: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
142
+ /** @returns {HTMLCanvasElement} */
143
+ element(): HTMLCanvasElement;
144
+ /** @param {number} w @param {number} h */
145
+ set_size(w: number, h: number): void;
146
+ /** Clear the canvas. */
147
+ clear(): void;
148
+ /** @param {{x:number,y:number}} pout @param {{x:number,y:number}} pin @param {{x:number,y:number}} offset @param {string=} color */
149
+ draw_line(pout: {
150
+ x: number;
151
+ y: number;
152
+ }, pin: {
153
+ x: number;
154
+ y: number;
155
+ }, offset: {
156
+ x: number;
157
+ y: number;
158
+ }, color?: string | undefined): void;
159
+ /** @param {CanvasRenderingContext2D} dest_canvas_ctx @param {(()=>void)=} callback */
160
+ copy_to(dest_canvas_ctx: CanvasRenderingContext2D, callback?: (() => void) | undefined): void;
161
+ /**
162
+ * Draw bezier curve on canvas.
163
+ * @internal
164
+ * @param {CanvasRenderingContext2D} ctx - Canvas context
165
+ * @param {number} x1 - Start x coordinate
166
+ * @param {number} y1 - Start y coordinate
167
+ * @param {number} x2 - End x coordinate
168
+ * @param {number} y2 - End y coordinate
169
+ */
170
+ _bezier_to(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number): void;
171
+ /**
172
+ * Draw straight line on canvas.
173
+ * @internal
174
+ * @param {CanvasRenderingContext2D} ctx - Canvas context
175
+ * @param {number} x1 - Start x coordinate
176
+ * @param {number} y1 - Start y coordinate
177
+ * @param {number} x2 - End x coordinate
178
+ * @param {number} y2 - End y coordinate
179
+ */
180
+ _line_to(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number): void;
181
+ }
182
+ export {};
@@ -0,0 +1,182 @@
1
+ export class LayoutProvider {
2
+ /**
3
+ * Layout engine for positioning nodes and lines.
4
+ * @param {import('./jsmind.js').default} jm - jsMind instance
5
+ * @param {{mode:'full'|'side', hspace:number, vspace:number, pspace:number, cousin_space:number}} options - Layout configuration options
6
+ */
7
+ constructor(jm: import("./jsmind.js").default, options: {
8
+ mode: "full" | "side";
9
+ hspace: number;
10
+ vspace: number;
11
+ pspace: number;
12
+ cousin_space: number;
13
+ });
14
+ opts: {
15
+ mode: "full" | "side";
16
+ hspace: number;
17
+ vspace: number;
18
+ pspace: number;
19
+ cousin_space: number;
20
+ };
21
+ jm: import("./jsmind.js").default;
22
+ isside: boolean;
23
+ bounds: {
24
+ n: number;
25
+ s: number;
26
+ w: number;
27
+ e: number;
28
+ };
29
+ cache_valid: boolean;
30
+ /** Initialize layout provider. */
31
+ init(): void;
32
+ /** Reset layout state and bounds. */
33
+ reset(): void;
34
+ /**
35
+ * Decide the next child's direction for a parent node.
36
+ * @param {import('./jsmind.node.js').Node} node
37
+ * @returns {number}
38
+ */
39
+ calculate_next_child_direction(node: import("./jsmind.node.js").Node): number;
40
+ /** Perform layout and offsets recalculation. */
41
+ layout(): void;
42
+ /** Calculate and set direction for all nodes. */
43
+ layout_direction(): void;
44
+ /**
45
+ * Set direction layout for root node and its children.
46
+ * @private
47
+ */
48
+ private _layout_direction_root;
49
+ /**
50
+ * Set direction layout for a node and its descendants.
51
+ * @private
52
+ * @param {import('./jsmind.node.js').Node} node - Target node
53
+ * @param {number} direction - Direction constant (-1, 0, 1)
54
+ * @param {number} side_index - Index among siblings
55
+ */
56
+ private _layout_direction_side;
57
+ /** Calculate and set position offsets for all nodes. */
58
+ layout_offset(): void;
59
+ /**
60
+ * Layout both the x and y axis for subnodes.
61
+ * @private
62
+ * @param {import('./jsmind.node.js').Node[]} nodes - Array of nodes to layout
63
+ * @returns {number} Total height of all nodes
64
+ */
65
+ private _layout_offset_subnodes;
66
+ /**
67
+ * Layout the y axis only, for collapse/expand a node.
68
+ * @private
69
+ * @param {import('./jsmind.node.js').Node[]} nodes - Array of nodes to layout
70
+ * @returns {number} Total height of all nodes
71
+ */
72
+ private _layout_offset_subnodes_height;
73
+ /**
74
+ * Check if node should reserve cousin space.
75
+ * @private
76
+ * @param {import('./jsmind.node.js').Node} node - Node to check
77
+ * @returns {boolean} True if cousin space should be reserved
78
+ */
79
+ private _should_reserve_cousin_space;
80
+ /**
81
+ * Get absolute offset for a node.
82
+ * @param {import('./jsmind.node.js').Node} node - Target node
83
+ * @returns {{x:number, y:number}} Absolute position offset
84
+ */
85
+ get_node_offset(node: import("./jsmind.node.js").Node): {
86
+ x: number;
87
+ y: number;
88
+ };
89
+ /**
90
+ * Get anchor point for lines on a node.
91
+ * @param {import('./jsmind.node.js').Node} node - Target node
92
+ * @returns {{x:number, y:number}} Anchor point coordinates
93
+ */
94
+ get_node_point(node: import("./jsmind.node.js").Node): {
95
+ x: number;
96
+ y: number;
97
+ };
98
+ /**
99
+ * Get input point for lines on a node.
100
+ * @param {import('./jsmind.node.js').Node} node - Target node
101
+ * @returns {{x:number, y:number}} Input point coordinates
102
+ */
103
+ get_node_point_in(node: import("./jsmind.node.js").Node): {
104
+ x: number;
105
+ y: number;
106
+ };
107
+ /**
108
+ * Get output point for lines on a node.
109
+ * @param {import('./jsmind.node.js').Node} node - Target node
110
+ * @returns {{x:number, y:number}} Output point coordinates
111
+ */
112
+ get_node_point_out(node: import("./jsmind.node.js").Node): {
113
+ x: number;
114
+ y: number;
115
+ };
116
+ /**
117
+ * Get expander point for a node.
118
+ * @param {import('./jsmind.node.js').Node} node - Target node
119
+ * @returns {{x:number, y:number}} Expander point coordinates
120
+ */
121
+ get_expander_point(node: import("./jsmind.node.js").Node): {
122
+ x: number;
123
+ y: number;
124
+ };
125
+ /**
126
+ * Get minimal canvas size to contain all nodes.
127
+ * @returns {{w:number, h:number}} Minimum size required
128
+ */
129
+ get_min_size(): {
130
+ w: number;
131
+ h: number;
132
+ };
133
+ /**
134
+ * Toggle node expanded/collapsed state.
135
+ * @param {import('./jsmind.node.js').Node} node - Target node
136
+ */
137
+ toggle_node(node: import("./jsmind.node.js").Node): void;
138
+ /**
139
+ * Expand a node and show its children.
140
+ * @param {import('./jsmind.node.js').Node} node - Target node
141
+ */
142
+ expand_node(node: import("./jsmind.node.js").Node): void;
143
+ /**
144
+ * Collapse a node and hide its children.
145
+ * @param {import('./jsmind.node.js').Node} node - Target node
146
+ */
147
+ collapse_node(node: import("./jsmind.node.js").Node): void;
148
+ /** Expand all nodes in the mind map. */
149
+ expand_all(): void;
150
+ /** Collapse all nodes in the mind map. */
151
+ collapse_all(): void;
152
+ /**
153
+ * Expand nodes to a specific depth level.
154
+ * @param {number} target_depth - Target depth level
155
+ * @param {import('./jsmind.node.js').Node[]=} curr_nodes - Current nodes to process
156
+ * @param {number=} curr_depth - Current depth level
157
+ */
158
+ expand_to_depth(target_depth: number, curr_nodes?: import("./jsmind.node.js").Node[] | undefined, curr_depth?: number | undefined): void;
159
+ /**
160
+ * Perform partial layout for a node and its subtree.
161
+ * @param {import('./jsmind.node.js').Node} node - Target node
162
+ */
163
+ part_layout(node: import("./jsmind.node.js").Node): void;
164
+ /**
165
+ * Set visibility for nodes and their children.
166
+ * @param {import('./jsmind.node.js').Node[]} nodes - Array of nodes
167
+ * @param {boolean} visible - Visibility state
168
+ */
169
+ set_visible(nodes: import("./jsmind.node.js").Node[], visible: boolean): void;
170
+ /**
171
+ * Check if a node is expanded.
172
+ * @param {import('./jsmind.node.js').Node} node - Target node
173
+ * @returns {boolean} True if node is expanded
174
+ */
175
+ is_expand(node: import("./jsmind.node.js").Node): boolean;
176
+ /**
177
+ * Check if a node is visible.
178
+ * @param {import('./jsmind.node.js').Node} node - Target node
179
+ * @returns {boolean} True if node is visible
180
+ */
181
+ is_visible(node: import("./jsmind.node.js").Node): boolean;
182
+ }
@@ -0,0 +1,121 @@
1
+ export class Mind {
2
+ /** @type {string | null} */
3
+ name: string | null;
4
+ /** @type {string | null} */
5
+ author: string | null;
6
+ /** @type {string | null} */
7
+ version: string | null;
8
+ /** @type {Node | null} */
9
+ root: Node | null;
10
+ /** @type {Node | null} */
11
+ selected: Node | null;
12
+ /** @type {Record<string, Node>} */
13
+ nodes: Record<string, Node>;
14
+ /**
15
+ * Get a node by id.
16
+ * @param {string} node_id
17
+ * @returns {Node | null}
18
+ */
19
+ get_node(node_id: string): Node | null;
20
+ /**
21
+ * Set the root node, only once.
22
+ * @param {string} node_id
23
+ * @param {string} topic
24
+ * @param {Record<string, any>=} data
25
+ * @returns {Node | null}
26
+ */
27
+ set_root(node_id: string, topic: string, data?: Record<string, any> | undefined): Node | null;
28
+ /**
29
+ * Add a child node under parent.
30
+ * @param {Node} parent_node
31
+ * @param {string} node_id
32
+ * @param {string} topic
33
+ * @param {Record<string, any>=} data
34
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
35
+ * @param {boolean=} expanded
36
+ * @param {number=} idx
37
+ * @returns {Node | null}
38
+ */
39
+ add_node(parent_node: Node, node_id: string, topic: string, data?: Record<string, any> | undefined, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined, expanded?: boolean | undefined, idx?: number | undefined): Node | null;
40
+ /**
41
+ * Insert a node before target node.
42
+ * @param {Node} node_before
43
+ * @param {string} node_id
44
+ * @param {string} topic
45
+ * @param {Record<string, any>=} data
46
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
47
+ * @returns {Node | null}
48
+ */
49
+ insert_node_before(node_before: Node, node_id: string, topic: string, data?: Record<string, any> | undefined, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined): Node | null;
50
+ /**
51
+ * Get previous sibling of a node or node id.
52
+ * @param {string | Node} node
53
+ * @returns {Node | null}
54
+ */
55
+ get_node_before(node: string | Node): Node | null;
56
+ /**
57
+ * Insert a node after target node.
58
+ * @param {Node} node_after
59
+ * @param {string} node_id
60
+ * @param {string} topic
61
+ * @param {Record<string, any>=} data
62
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
63
+ * @returns {Node | null}
64
+ */
65
+ insert_node_after(node_after: Node, node_id: string, topic: string, data?: Record<string, any> | undefined, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined): Node | null;
66
+ /**
67
+ * Get next sibling of a node or node id.
68
+ * @param {string | Node} node
69
+ * @returns {Node | null}
70
+ */
71
+ get_node_after(node: string | Node): Node | null;
72
+ /**
73
+ * Move a node to new parent/position.
74
+ * @param {Node} node
75
+ * @param {string=} before_id - The ID of the node before which to place the moved node. Special values: "_first_", "_last_"
76
+ * @param {string=} parent_id
77
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
78
+ * @returns {Node | null}
79
+ */
80
+ move_node(node: Node, before_id?: string | undefined, parent_id?: string | undefined, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined): Node | null;
81
+ /**
82
+ * Propagate direction to descendants.
83
+ * @param {Node} node
84
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
85
+ */
86
+ _flow_node_direction(node: Node, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined): void;
87
+ /**
88
+ * Re-index node among siblings based on before_id marker.
89
+ * @param {Node} node
90
+ * @param {string} before_id
91
+ * @returns {Node}
92
+ */
93
+ _move_node_internal(node: Node, before_id: string): Node;
94
+ /**
95
+ * Internal move implementation.
96
+ * @param {Node} node
97
+ * @param {string} before_id
98
+ * @param {string} parent_id
99
+ * @param {('left'|'center'|'right'|'-1'|'0'|'1'|number)=} direction - Direction for node placement. Supports string values ('left', 'center', 'right'), numeric strings ('-1', '0', '1'), and numbers (-1, 0, 1)
100
+ * @returns {Node | null}
101
+ */
102
+ _move_node(node: Node, before_id: string, parent_id: string, direction?: ("left" | "center" | "right" | "-1" | "0" | "1" | number) | undefined): Node | null;
103
+ /**
104
+ * Remove a node from the mind.
105
+ * @param {Node} node
106
+ * @returns {boolean}
107
+ */
108
+ remove_node(node: Node): boolean;
109
+ /**
110
+ * Put node into the map if id is not taken.
111
+ * @param {Node} node
112
+ * @returns {boolean}
113
+ */
114
+ _put_node(node: Node): boolean;
115
+ /**
116
+ * Re-index children by Node.compare.
117
+ * @param {Node} node
118
+ */
119
+ _update_index(node: Node): void;
120
+ }
121
+ import { Node } from './jsmind.node.js';
@@ -0,0 +1,62 @@
1
+ export class Node {
2
+ /**
3
+ * Compare two nodes by index for ordering.
4
+ * @param {Node} node1
5
+ * @param {Node} node2
6
+ * @returns {number}
7
+ */
8
+ static compare(node1: Node, node2: Node): number;
9
+ /**
10
+ * Check if node is the same as or a descendant of parent_node.
11
+ * @param {Node} parent_node
12
+ * @param {Node} node
13
+ * @returns {boolean}
14
+ */
15
+ static inherited(parent_node: Node, node: Node): boolean;
16
+ /**
17
+ * Runtime check for Node instance.
18
+ * @param {unknown} n
19
+ * @returns {n is Node}
20
+ */
21
+ static is_node(n: unknown): n is Node;
22
+ /**
23
+ * Create a Node instance.
24
+ * @param {string} sId - Node id
25
+ * @param {number} iIndex - Node index (order among siblings). Use -1 for tail
26
+ * @param {string} sTopic - Node topic text
27
+ * @param {Record<string, any>=} oData - Arbitrary node data
28
+ * @param {boolean=} bIsRoot - Whether it is the root node
29
+ * @param {Node | null=} oParent - Parent node
30
+ * @param {number=} eDirection - Direction for children under root (-1 left, 0 center, 1 right)
31
+ * @param {boolean=} bExpanded - Expanded state
32
+ */
33
+ constructor(sId: string, iIndex: number, sTopic: string, oData?: Record<string, any> | undefined, bIsRoot?: boolean | undefined, oParent?: (Node | null) | undefined, eDirection?: number | undefined, bExpanded?: boolean | undefined);
34
+ id: string;
35
+ index: number;
36
+ topic: string;
37
+ /** @type {Record<string, any>} */
38
+ data: Record<string, any>;
39
+ isroot: boolean;
40
+ parent: Node;
41
+ direction: number;
42
+ expanded: boolean;
43
+ /** @type {Node[]} */
44
+ children: Node[];
45
+ _data: {};
46
+ /**
47
+ * Get absolute location of this node in view coordinates.
48
+ * @returns {{x:number,y:number}}
49
+ */
50
+ get_location(): {
51
+ x: number;
52
+ y: number;
53
+ };
54
+ /**
55
+ * Get rendered size of this node.
56
+ * @returns {{w:number,h:number}}
57
+ */
58
+ get_size(): {
59
+ w: number;
60
+ h: number;
61
+ };
62
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Merge user options with defaults. Throws if container missing.
3
+ * @param {JsMindRuntimeOptions} options
4
+ * @returns {JsMindRuntimeOptions}
5
+ */
6
+ export function merge_option(options: JsMindRuntimeOptions): JsMindRuntimeOptions;
7
+ export type JsMindRuntimeOptions = {
8
+ container: string | HTMLElement;
9
+ editable?: boolean;
10
+ theme?: (string | null);
11
+ mode?: ("full" | "side");
12
+ support_html?: boolean;
13
+ enable_multiline?: boolean;
14
+ textAutoWrapWidth?: number;
15
+ log_level?: "debug" | "info" | "warn" | "error" | "disable";
16
+ view?: {
17
+ engine?: "canvas" | "svg";
18
+ enable_device_pixel_ratio?: boolean;
19
+ hmargin?: number;
20
+ vmargin?: number;
21
+ line_width?: number;
22
+ line_color?: string;
23
+ line_style?: "curved" | "straight";
24
+ custom_line_render?: (this: object, arg: {
25
+ ctx: CanvasRenderingContext2D | SVGPathElement;
26
+ start_point: {
27
+ x: number;
28
+ y: number;
29
+ };
30
+ end_point: {
31
+ x: number;
32
+ y: number;
33
+ };
34
+ }) => void;
35
+ draggable?: boolean;
36
+ hide_scrollbars_when_draggable?: boolean;
37
+ node_overflow?: "hidden" | "wrap" | "visible";
38
+ zoom?: {
39
+ min?: number;
40
+ max?: number;
41
+ step?: number;
42
+ mask_key?: number;
43
+ };
44
+ custom_node_render?: (null | ((jm: import("./jsmind.js").default, ele: HTMLElement, node: import("./jsmind.node.js").Node) => void));
45
+ expander_style?: "char" | "number";
46
+ };
47
+ layout?: {
48
+ hspace?: number;
49
+ vspace?: number;
50
+ pspace?: number;
51
+ cousin_space?: number;
52
+ };
53
+ default_event_handle?: {
54
+ enable_mousedown_handle?: boolean;
55
+ enable_click_handle?: boolean;
56
+ enable_dblclick_handle?: boolean;
57
+ enable_mousewheel_handle?: boolean;
58
+ };
59
+ shortcut?: {
60
+ enable?: boolean;
61
+ handles?: Record<string, (jm: import("./jsmind.js").default, e: KeyboardEvent) => void>;
62
+ mapping?: Record<string, number | number[]>;
63
+ id_generator?: () => string;
64
+ };
65
+ plugin?: Record<string, object>;
66
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Register a plugin instance.
3
+ * @param {Plugin<object>} plugin
4
+ */
5
+ export function register(plugin: Plugin<object>): void;
6
+ /**
7
+ * Apply registered plugins asynchronously.
8
+ * @param {import('./jsmind.js').default} jm
9
+ * @param {Record<string, object>} options
10
+ */
11
+ export function apply(jm: import("./jsmind.js").default, options: Record<string, object>): void;
12
+ export class Plugin {
13
+ /**
14
+ * @template [TOptions=object]
15
+ * @param {string} name
16
+ * @param {(jm: import('./jsmind.js').default, options: TOptions)=>void} fn_init
17
+ */
18
+ constructor(name: string, fn_init: (jm: import("./jsmind.js").default, options: TOptions) => void);
19
+ name: string;
20
+ fn_init: (jm: import("./jsmind.js").default, options: TOptions) => void;
21
+ }