@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.
- package/LICENSE +24 -0
- package/README.md +74 -0
- package/es6/README-en.md +37 -0
- package/es6/README.md +34 -0
- package/es6/jsmind.draggable-node.js +9 -0
- package/es6/jsmind.draggable-node.js.map +1 -0
- package/es6/jsmind.js +9 -0
- package/es6/jsmind.js.map +1 -0
- package/es6/jsmind.screenshot.js +9 -0
- package/es6/jsmind.screenshot.js.map +1 -0
- package/package.json +85 -0
- package/style/jsmind.css +498 -0
- package/types/generated/index.d.ts +8 -0
- package/types/generated/jsmind.common.d.ts +66 -0
- package/types/generated/jsmind.d.ts +343 -0
- package/types/generated/jsmind.data_provider.d.ts +56 -0
- package/types/generated/jsmind.dom.d.ts +59 -0
- package/types/generated/jsmind.format.d.ts +100 -0
- package/types/generated/jsmind.graph.d.ts +182 -0
- package/types/generated/jsmind.layout_provider.d.ts +182 -0
- package/types/generated/jsmind.mind.d.ts +121 -0
- package/types/generated/jsmind.node.d.ts +62 -0
- package/types/generated/jsmind.option.d.ts +66 -0
- package/types/generated/jsmind.plugin.d.ts +21 -0
- package/types/generated/jsmind.shortcut_provider.d.ts +52 -0
- package/types/generated/jsmind.util.d.ts +26 -0
- package/types/generated/jsmind.view_provider.d.ts +372 -0
- package/types/generated/plugins/jsmind.draggable-node.d.ts +229 -0
- package/types/generated/plugins/jsmind.screenshot.d.ts +83 -0
- package/types/tsconfig.declaration.json +19 -0
|
@@ -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
|
+
}
|