@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,52 @@
|
|
|
1
|
+
export class ShortcutProvider {
|
|
2
|
+
/**
|
|
3
|
+
* @param {import('./jsmind.js').default} jm
|
|
4
|
+
* @param {{ enable:boolean, handles: Record<string,(jm: import('./jsmind.js').default, e: KeyboardEvent)=>void>, mapping: Record<string, number|number[]>, id_generator?: ()=>string }} options
|
|
5
|
+
*/
|
|
6
|
+
constructor(jm: import("./jsmind.js").default, options: {
|
|
7
|
+
enable: boolean;
|
|
8
|
+
handles: Record<string, (jm: import("./jsmind.js").default, e: KeyboardEvent) => void>;
|
|
9
|
+
mapping: Record<string, number | number[]>;
|
|
10
|
+
id_generator?: () => string;
|
|
11
|
+
});
|
|
12
|
+
jm: import("./jsmind.js").default;
|
|
13
|
+
opts: {
|
|
14
|
+
enable: boolean;
|
|
15
|
+
handles: Record<string, (jm: import("./jsmind.js").default, e: KeyboardEvent) => void>;
|
|
16
|
+
mapping: Record<string, number | number[]>;
|
|
17
|
+
id_generator?: () => string;
|
|
18
|
+
};
|
|
19
|
+
/** @type {Record<string, number|number[]>} */
|
|
20
|
+
mapping: Record<string, number | number[]>;
|
|
21
|
+
/** @type {Record<string,(jm: import('./jsmind.js').default, e: KeyboardEvent)=>void>} */
|
|
22
|
+
handles: Record<string, (jm: import("./jsmind.js").default, e: KeyboardEvent) => void>;
|
|
23
|
+
/** @type {()=>string|null} */
|
|
24
|
+
_newid: () => string | null;
|
|
25
|
+
/** @type {Record<number,(jm: import('./jsmind.js').default, e: KeyboardEvent)=>void>} */
|
|
26
|
+
_mapping: Record<number, (jm: import("./jsmind.js").default, e: KeyboardEvent) => void>;
|
|
27
|
+
init(): void;
|
|
28
|
+
enable_shortcut(): void;
|
|
29
|
+
disable_shortcut(): void;
|
|
30
|
+
/** @param {KeyboardEvent} e */
|
|
31
|
+
handler(e: KeyboardEvent): boolean;
|
|
32
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
33
|
+
handle_addchild(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
34
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
35
|
+
handle_addbrother(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
36
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
37
|
+
handle_editnode(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
38
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
39
|
+
handle_delnode(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
40
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
41
|
+
handle_toggle(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
42
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
43
|
+
handle_up(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
44
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
45
|
+
handle_down(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
46
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
47
|
+
handle_left(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
48
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e */
|
|
49
|
+
handle_right(_jm: import("./jsmind.js").default, e: KeyboardEvent): void;
|
|
50
|
+
/** @param {import('./jsmind.js').default} _jm @param {KeyboardEvent} e @param {number} d */
|
|
51
|
+
_handle_direction(_jm: import("./jsmind.js").default, e: KeyboardEvent, d: number): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Misc utility collection.
|
|
3
|
+
* @type {{
|
|
4
|
+
* file: { read: (file: File, cb:(result:string,name:string)=>void)=>void, save:(data:string,type:string,name:string)=>void},
|
|
5
|
+
* json: { json2string:(v:unknown)=>string, string2json:(s:string)=>unknown, merge:(b:object,a:object)=>object },
|
|
6
|
+
* uuid: { newid:()=>string },
|
|
7
|
+
* text: { is_empty:(s?:string)=>boolean }
|
|
8
|
+
* }}
|
|
9
|
+
*/
|
|
10
|
+
export const util: {
|
|
11
|
+
file: {
|
|
12
|
+
read: (file: File, cb: (result: string, name: string) => void) => void;
|
|
13
|
+
save: (data: string, type: string, name: string) => void;
|
|
14
|
+
};
|
|
15
|
+
json: {
|
|
16
|
+
json2string: (v: unknown) => string;
|
|
17
|
+
string2json: (s: string) => unknown;
|
|
18
|
+
merge: (b: object, a: object) => object;
|
|
19
|
+
};
|
|
20
|
+
uuid: {
|
|
21
|
+
newid: () => string;
|
|
22
|
+
};
|
|
23
|
+
text: {
|
|
24
|
+
is_empty: (s?: string) => boolean;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
export class ViewProvider {
|
|
2
|
+
/**
|
|
3
|
+
* View layer: DOM nodes, editor, graph and zoom.
|
|
4
|
+
* @param {import('./jsmind.js').default} jm - jsMind instance
|
|
5
|
+
* @param {{
|
|
6
|
+
* engine: 'canvas'|'svg',
|
|
7
|
+
* enable_device_pixel_ratio: boolean,
|
|
8
|
+
* hmargin: number,
|
|
9
|
+
* vmargin: number,
|
|
10
|
+
* line_width: number,
|
|
11
|
+
* line_color: string,
|
|
12
|
+
* line_style: 'curved'|'straight',
|
|
13
|
+
* custom_line_render?: Function,
|
|
14
|
+
* draggable: boolean,
|
|
15
|
+
* hide_scrollbars_when_draggable: boolean,
|
|
16
|
+
* node_overflow: 'hidden'|'wrap',
|
|
17
|
+
* zoom: {min:number, max:number, step:number, mask_key:number},
|
|
18
|
+
* custom_node_render?: Function,
|
|
19
|
+
* expander_style: 'char'|'number',
|
|
20
|
+
* enable_multiline?: boolean
|
|
21
|
+
* }} options - View configuration options
|
|
22
|
+
*/
|
|
23
|
+
constructor(jm: import("./jsmind.js").default, options: {
|
|
24
|
+
engine: "canvas" | "svg";
|
|
25
|
+
enable_device_pixel_ratio: boolean;
|
|
26
|
+
hmargin: number;
|
|
27
|
+
vmargin: number;
|
|
28
|
+
line_width: number;
|
|
29
|
+
line_color: string;
|
|
30
|
+
line_style: "curved" | "straight";
|
|
31
|
+
custom_line_render?: Function;
|
|
32
|
+
draggable: boolean;
|
|
33
|
+
hide_scrollbars_when_draggable: boolean;
|
|
34
|
+
node_overflow: "hidden" | "wrap";
|
|
35
|
+
zoom: {
|
|
36
|
+
min: number;
|
|
37
|
+
max: number;
|
|
38
|
+
step: number;
|
|
39
|
+
mask_key: number;
|
|
40
|
+
};
|
|
41
|
+
custom_node_render?: Function;
|
|
42
|
+
expander_style: "char" | "number";
|
|
43
|
+
enable_multiline?: boolean;
|
|
44
|
+
});
|
|
45
|
+
opts: {
|
|
46
|
+
engine: "canvas" | "svg";
|
|
47
|
+
enable_device_pixel_ratio: boolean;
|
|
48
|
+
hmargin: number;
|
|
49
|
+
vmargin: number;
|
|
50
|
+
line_width: number;
|
|
51
|
+
line_color: string;
|
|
52
|
+
line_style: "curved" | "straight";
|
|
53
|
+
custom_line_render?: Function;
|
|
54
|
+
draggable: boolean;
|
|
55
|
+
hide_scrollbars_when_draggable: boolean;
|
|
56
|
+
node_overflow: "hidden" | "wrap";
|
|
57
|
+
zoom: {
|
|
58
|
+
min: number;
|
|
59
|
+
max: number;
|
|
60
|
+
step: number;
|
|
61
|
+
mask_key: number;
|
|
62
|
+
};
|
|
63
|
+
custom_node_render?: Function;
|
|
64
|
+
expander_style: "char" | "number";
|
|
65
|
+
enable_multiline?: boolean;
|
|
66
|
+
};
|
|
67
|
+
jm: import("./jsmind.js").default;
|
|
68
|
+
layout: import("./jsmind.layout_provider.js").LayoutProvider;
|
|
69
|
+
container: HTMLElement;
|
|
70
|
+
e_panel: HTMLElement;
|
|
71
|
+
e_nodes: HTMLElement;
|
|
72
|
+
size: {
|
|
73
|
+
w: number;
|
|
74
|
+
h: number;
|
|
75
|
+
};
|
|
76
|
+
selected_node: import("./jsmind.node.js").Node;
|
|
77
|
+
editing_node: import("./jsmind.node.js").Node;
|
|
78
|
+
graph: {
|
|
79
|
+
view: ViewProvider;
|
|
80
|
+
opts: {
|
|
81
|
+
engine: "canvas" | "svg";
|
|
82
|
+
enable_device_pixel_ratio: boolean;
|
|
83
|
+
hmargin: number;
|
|
84
|
+
vmargin: number;
|
|
85
|
+
line_width: number;
|
|
86
|
+
line_color: string;
|
|
87
|
+
line_style: "curved" | "straight";
|
|
88
|
+
custom_line_render?: Function;
|
|
89
|
+
draggable: boolean;
|
|
90
|
+
hide_scrollbars_when_draggable: boolean;
|
|
91
|
+
node_overflow: "hidden" | "wrap";
|
|
92
|
+
zoom: {
|
|
93
|
+
min: number;
|
|
94
|
+
max: number;
|
|
95
|
+
step: number;
|
|
96
|
+
mask_key: number;
|
|
97
|
+
};
|
|
98
|
+
custom_node_render?: Function;
|
|
99
|
+
expander_style: "char" | "number";
|
|
100
|
+
enable_multiline?: boolean;
|
|
101
|
+
};
|
|
102
|
+
e_svg: SVGElement;
|
|
103
|
+
size: {
|
|
104
|
+
w: number;
|
|
105
|
+
h: number;
|
|
106
|
+
};
|
|
107
|
+
lines: SVGPathElement[];
|
|
108
|
+
line_drawing: {
|
|
109
|
+
straight: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
|
|
110
|
+
curved: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
|
|
111
|
+
};
|
|
112
|
+
init_line_render(): void;
|
|
113
|
+
drawing: (path: SVGPathElement, x1: number, y1: number, x2: number, y2: number) => void;
|
|
114
|
+
element(): SVGSVGElement;
|
|
115
|
+
set_size(w: number, h: number): void;
|
|
116
|
+
clear(): void;
|
|
117
|
+
draw_line(pout: {
|
|
118
|
+
x: number;
|
|
119
|
+
y: number;
|
|
120
|
+
}, pin: {
|
|
121
|
+
x: number;
|
|
122
|
+
y: number;
|
|
123
|
+
}, offset: {
|
|
124
|
+
x: number;
|
|
125
|
+
y: number;
|
|
126
|
+
}, color?: string | undefined): void;
|
|
127
|
+
copy_to(dest_canvas_ctx: CanvasRenderingContext2D, callback?: (() => void) | undefined): void;
|
|
128
|
+
_bezier_to(path: SVGPathElement, x1: number, y1: number, x2: number, y2: number): void;
|
|
129
|
+
_line_to(path: SVGPathElement, x1: number, y1: number, x2: number, y2: number): void;
|
|
130
|
+
} | {
|
|
131
|
+
opts: {
|
|
132
|
+
engine: "canvas" | "svg";
|
|
133
|
+
enable_device_pixel_ratio: boolean;
|
|
134
|
+
hmargin: number;
|
|
135
|
+
vmargin: number;
|
|
136
|
+
line_width: number;
|
|
137
|
+
line_color: string;
|
|
138
|
+
line_style: "curved" | "straight";
|
|
139
|
+
custom_line_render?: Function;
|
|
140
|
+
draggable: boolean;
|
|
141
|
+
hide_scrollbars_when_draggable: boolean;
|
|
142
|
+
node_overflow: "hidden" | "wrap";
|
|
143
|
+
zoom: {
|
|
144
|
+
min: number;
|
|
145
|
+
max: number;
|
|
146
|
+
step: number;
|
|
147
|
+
mask_key: number;
|
|
148
|
+
};
|
|
149
|
+
custom_node_render?: Function;
|
|
150
|
+
expander_style: "char" | "number";
|
|
151
|
+
enable_multiline?: boolean;
|
|
152
|
+
};
|
|
153
|
+
e_canvas: HTMLElement;
|
|
154
|
+
canvas_ctx: CanvasRenderingContext2D;
|
|
155
|
+
size: {
|
|
156
|
+
w: number;
|
|
157
|
+
h: number;
|
|
158
|
+
};
|
|
159
|
+
line_drawing: {
|
|
160
|
+
straight: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
|
|
161
|
+
curved: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
|
|
162
|
+
};
|
|
163
|
+
dpr: number;
|
|
164
|
+
init_line_render(): void;
|
|
165
|
+
drawing: (ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) => void;
|
|
166
|
+
element(): HTMLCanvasElement;
|
|
167
|
+
set_size(w: number, h: number): void;
|
|
168
|
+
clear(): void;
|
|
169
|
+
draw_line(pout: {
|
|
170
|
+
x: number;
|
|
171
|
+
y: number;
|
|
172
|
+
}, pin: {
|
|
173
|
+
x: number;
|
|
174
|
+
y: number;
|
|
175
|
+
}, offset: {
|
|
176
|
+
x: number;
|
|
177
|
+
y: number;
|
|
178
|
+
}, color?: string | undefined): void;
|
|
179
|
+
copy_to(dest_canvas_ctx: CanvasRenderingContext2D, callback?: (() => void) | undefined): void;
|
|
180
|
+
_bezier_to(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number): void;
|
|
181
|
+
_line_to(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number): void;
|
|
182
|
+
};
|
|
183
|
+
render_node: (ele: HTMLElement, node: import("./jsmind.node.js").Node) => void;
|
|
184
|
+
zoom_current: number;
|
|
185
|
+
device_pixel_ratio: number;
|
|
186
|
+
_initialized: boolean;
|
|
187
|
+
/** Initialize DOM structure, graph and editor. */
|
|
188
|
+
init(): void;
|
|
189
|
+
e_editor: HTMLElement;
|
|
190
|
+
/**
|
|
191
|
+
* Add a delegated event handler.
|
|
192
|
+
* @param {import('./jsmind.js').default} obj
|
|
193
|
+
* @param {string} event_name
|
|
194
|
+
* @param {(e:Event)=>void} event_handle
|
|
195
|
+
* @param {boolean=} capture_by_panel
|
|
196
|
+
*/
|
|
197
|
+
add_event(obj: import("./jsmind.js").default, event_name: string, event_handle: (e: Event) => void, capture_by_panel?: boolean | undefined): void;
|
|
198
|
+
/**
|
|
199
|
+
* @param {HTMLElement|null} element
|
|
200
|
+
* @returns {string|null}
|
|
201
|
+
*/
|
|
202
|
+
get_binded_nodeid(element: HTMLElement | null): string | null;
|
|
203
|
+
/**
|
|
204
|
+
* @param {HTMLElement|null} element
|
|
205
|
+
* @returns {boolean}
|
|
206
|
+
*/
|
|
207
|
+
is_node(element: HTMLElement | null): boolean;
|
|
208
|
+
/**
|
|
209
|
+
* @param {HTMLElement} element
|
|
210
|
+
* @returns {boolean}
|
|
211
|
+
*/
|
|
212
|
+
is_expander(element: HTMLElement): boolean;
|
|
213
|
+
reset(): void;
|
|
214
|
+
reset_theme(): void;
|
|
215
|
+
/** Reset custom styles for all nodes. */
|
|
216
|
+
reset_custom_style(): void;
|
|
217
|
+
/** Load and initialize the view. */
|
|
218
|
+
load(): void;
|
|
219
|
+
/** Calculate and set the expanded canvas size. */
|
|
220
|
+
expand_size(): void;
|
|
221
|
+
/**
|
|
222
|
+
* Initialize size data for a node.
|
|
223
|
+
* @param {import('./jsmind.node.js').Node} node - Target node
|
|
224
|
+
*/
|
|
225
|
+
init_nodes_size(node: import("./jsmind.node.js").Node): void;
|
|
226
|
+
/**
|
|
227
|
+
* Ensure correct size calculation for multiline nodes
|
|
228
|
+
* @param {HTMLElement} element - Node element
|
|
229
|
+
*/
|
|
230
|
+
_ensure_multiline_node_size(element: HTMLElement): void;
|
|
231
|
+
/** Initialize DOM elements for all nodes. */
|
|
232
|
+
init_nodes(): void;
|
|
233
|
+
/**
|
|
234
|
+
* Add a new node to the view.
|
|
235
|
+
* @param {import('./jsmind.node.js').Node} node - Node to add
|
|
236
|
+
*/
|
|
237
|
+
add_node(node: import("./jsmind.node.js").Node): void;
|
|
238
|
+
/**
|
|
239
|
+
* Run function in compatibility mode if container is not visible.
|
|
240
|
+
* @param {Function} func - Function to execute
|
|
241
|
+
*/
|
|
242
|
+
run_in_c11y_mode_if_needed(func: Function): void;
|
|
243
|
+
/**
|
|
244
|
+
* Create a DOM element for a node and append to parent container.
|
|
245
|
+
* @param {import('./jsmind.node.js').Node} node
|
|
246
|
+
* @param {HTMLElement} parent_node
|
|
247
|
+
*/
|
|
248
|
+
create_node_element(node: import("./jsmind.node.js").Node, parent_node: HTMLElement): void;
|
|
249
|
+
/**
|
|
250
|
+
* Remove a node from the view.
|
|
251
|
+
* @param {import('./jsmind.node.js').Node} node - Node to remove
|
|
252
|
+
*/
|
|
253
|
+
remove_node(node: import("./jsmind.node.js").Node): void;
|
|
254
|
+
/**
|
|
255
|
+
* Update a node's display.
|
|
256
|
+
* @param {import('./jsmind.node.js').Node} node - Node to update
|
|
257
|
+
*/
|
|
258
|
+
update_node(node: import("./jsmind.node.js").Node): void;
|
|
259
|
+
/**
|
|
260
|
+
* Force recalculation of node size
|
|
261
|
+
* @param {import('./jsmind.node.js').Node} node - Node to recalculate
|
|
262
|
+
*/
|
|
263
|
+
_force_recalc_node_size(node: import("./jsmind.node.js").Node): void;
|
|
264
|
+
/**
|
|
265
|
+
* Select a node visually.
|
|
266
|
+
* @param {import('./jsmind.node.js').Node|null} node - Node to select
|
|
267
|
+
*/
|
|
268
|
+
select_node(node: import("./jsmind.node.js").Node | null): void;
|
|
269
|
+
/** Clear node selection. */
|
|
270
|
+
select_clear(): void;
|
|
271
|
+
/**
|
|
272
|
+
* Get currently editing node.
|
|
273
|
+
* @returns {import('./jsmind.node.js').Node|null} Currently editing node
|
|
274
|
+
*/
|
|
275
|
+
get_editing_node(): import("./jsmind.node.js").Node | null;
|
|
276
|
+
/**
|
|
277
|
+
* Check if any node is being edited.
|
|
278
|
+
* @returns {boolean} True if editing
|
|
279
|
+
*/
|
|
280
|
+
is_editing(): boolean;
|
|
281
|
+
/**
|
|
282
|
+
* Begin editing a node.
|
|
283
|
+
* @param {import('./jsmind.node.js').Node} node - Node to edit
|
|
284
|
+
*/
|
|
285
|
+
edit_node_begin(node: import("./jsmind.node.js").Node): void;
|
|
286
|
+
/** End editing current node. */
|
|
287
|
+
edit_node_end(): void;
|
|
288
|
+
_editor_input_handler: () => void;
|
|
289
|
+
/**
|
|
290
|
+
* Setup editor resize listener for multiline editing
|
|
291
|
+
* Reference TextEdit.js updateTextEditNode logic
|
|
292
|
+
*/
|
|
293
|
+
_setup_editor_resize_listener(): void;
|
|
294
|
+
/**
|
|
295
|
+
* Dynamically update CSS styles for multiline nodes to sync max-width with textAutoWrapWidth
|
|
296
|
+
*/
|
|
297
|
+
_update_multiline_css(): void;
|
|
298
|
+
/** @returns {{x:number,y:number}} */
|
|
299
|
+
get_view_offset(): {
|
|
300
|
+
x: number;
|
|
301
|
+
y: number;
|
|
302
|
+
};
|
|
303
|
+
/** Resize the view to fit container. */
|
|
304
|
+
resize(): void;
|
|
305
|
+
/**
|
|
306
|
+
* Internal show implementation.
|
|
307
|
+
* @private
|
|
308
|
+
*/
|
|
309
|
+
private _show;
|
|
310
|
+
/**
|
|
311
|
+
* Zoom in the view.
|
|
312
|
+
* @param {MouseEvent=} e - Mouse event for zoom center
|
|
313
|
+
* @returns {boolean} True if zoom succeeded
|
|
314
|
+
*/
|
|
315
|
+
zoom_in(e?: MouseEvent | undefined): boolean;
|
|
316
|
+
/**
|
|
317
|
+
* Zoom out the view.
|
|
318
|
+
* @param {MouseEvent=} e - Mouse event for zoom center
|
|
319
|
+
* @returns {boolean} True if zoom succeeded
|
|
320
|
+
*/
|
|
321
|
+
zoom_out(e?: MouseEvent | undefined): boolean;
|
|
322
|
+
/**
|
|
323
|
+
* Set zoom level and keep scroll around zoom center.
|
|
324
|
+
* @param {number} zoom
|
|
325
|
+
* @param {MouseEvent=} e
|
|
326
|
+
*/
|
|
327
|
+
set_zoom(zoom: number, e?: MouseEvent | undefined): boolean;
|
|
328
|
+
/** @param {boolean=} keep_center */
|
|
329
|
+
show(keep_center?: boolean | undefined): void;
|
|
330
|
+
relayout(): void;
|
|
331
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
332
|
+
save_location(node: import("./jsmind.node.js").Node): void;
|
|
333
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
334
|
+
restore_location(node: import("./jsmind.node.js").Node): void;
|
|
335
|
+
clear_nodes(): void;
|
|
336
|
+
/** Render node elements and expanders to screen. */
|
|
337
|
+
show_nodes(): void;
|
|
338
|
+
/** @param {import('./jsmind.node.js').Node} node @param {{x:number,y:number}} view_offset */
|
|
339
|
+
_show_expander(node: import("./jsmind.node.js").Node, view_offset: {
|
|
340
|
+
x: number;
|
|
341
|
+
y: number;
|
|
342
|
+
}): void;
|
|
343
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
344
|
+
_get_expander_text(node: import("./jsmind.node.js").Node): number | "..." | "-" | "+";
|
|
345
|
+
/** @param {HTMLElement} ele @param {import('./jsmind.node.js').Node} node */
|
|
346
|
+
_default_node_render(ele: HTMLElement, node: import("./jsmind.node.js").Node): void;
|
|
347
|
+
/** @param {HTMLElement} ele @param {import('./jsmind.node.js').Node} node */
|
|
348
|
+
_custom_node_render(ele: HTMLElement, node: import("./jsmind.node.js").Node): void;
|
|
349
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
350
|
+
reset_node_custom_style(node: import("./jsmind.node.js").Node): void;
|
|
351
|
+
/** @param {HTMLElement} node_element @param {Record<string,string|number>} node_data */
|
|
352
|
+
_reset_node_custom_style(node_element: HTMLElement, node_data: Record<string, string | number>): void;
|
|
353
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
354
|
+
restore_selected_node_custom_style(node: import("./jsmind.node.js").Node): void;
|
|
355
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
356
|
+
clear_selected_node_custom_style(node: import("./jsmind.node.js").Node): void;
|
|
357
|
+
clear_lines(): void;
|
|
358
|
+
show_lines(): void;
|
|
359
|
+
/**
|
|
360
|
+
* Enable/disable dragging the whole canvas with mouse.
|
|
361
|
+
* @param {boolean} enabled
|
|
362
|
+
*/
|
|
363
|
+
setup_canvas_draggable(enabled: boolean): void;
|
|
364
|
+
/** @param {import('./jsmind.node.js').Node} node */
|
|
365
|
+
center_node(node: import("./jsmind.node.js").Node): boolean;
|
|
366
|
+
/** @param {MouseEvent=} e */
|
|
367
|
+
zoomIn(e?: MouseEvent | undefined): boolean;
|
|
368
|
+
/** @param {MouseEvent=} e */
|
|
369
|
+
zoomOut(e?: MouseEvent | undefined): boolean;
|
|
370
|
+
/** @param {number} zoom @param {MouseEvent=} e */
|
|
371
|
+
setZoom(zoom: number, e?: MouseEvent | undefined): boolean;
|
|
372
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draggable node plugin for jsMind.
|
|
3
|
+
*/
|
|
4
|
+
export class DraggableNode {
|
|
5
|
+
/**
|
|
6
|
+
* Create draggable node plugin instance.
|
|
7
|
+
* @param {import('../jsmind.js').default} jm - jsMind instance
|
|
8
|
+
* @param {Partial<DraggableNodeOptions>} options - Plugin options
|
|
9
|
+
*/
|
|
10
|
+
constructor(jm: import("../jsmind.js").default, options: Partial<DraggableNodeOptions>);
|
|
11
|
+
version: string;
|
|
12
|
+
/** @type {import('../jsmind.js').default} */
|
|
13
|
+
jm: import("../jsmind.js").default;
|
|
14
|
+
/** @type {DraggableNodeOptions} */
|
|
15
|
+
options: DraggableNodeOptions;
|
|
16
|
+
/** @type {HTMLCanvasElement|null} */
|
|
17
|
+
e_canvas: HTMLCanvasElement | null;
|
|
18
|
+
/** @type {CanvasRenderingContext2D|null} */
|
|
19
|
+
canvas_ctx: CanvasRenderingContext2D | null;
|
|
20
|
+
/** @type {HTMLElement|null} */
|
|
21
|
+
shadow: HTMLElement | null;
|
|
22
|
+
/** @type {number} */
|
|
23
|
+
shadow_p_x: number;
|
|
24
|
+
/** @type {number} */
|
|
25
|
+
shadow_p_y: number;
|
|
26
|
+
/** @type {number} */
|
|
27
|
+
shadow_w: number;
|
|
28
|
+
/** @type {number} */
|
|
29
|
+
shadow_h: number;
|
|
30
|
+
/** @type {import('../jsmind.node.js').Node|null} */
|
|
31
|
+
active_node: import("../jsmind.node.js").Node | null;
|
|
32
|
+
/** @type {import('../jsmind.node.js').Node|null} */
|
|
33
|
+
target_node: import("../jsmind.node.js").Node | null;
|
|
34
|
+
/** @type {number|null} */
|
|
35
|
+
target_direct: number | null;
|
|
36
|
+
/** @type {number} */
|
|
37
|
+
client_w: number;
|
|
38
|
+
/** @type {number} */
|
|
39
|
+
client_h: number;
|
|
40
|
+
/** @type {number} */
|
|
41
|
+
offset_x: number;
|
|
42
|
+
/** @type {number} */
|
|
43
|
+
offset_y: number;
|
|
44
|
+
/** @type {number} */
|
|
45
|
+
hlookup_delay: number;
|
|
46
|
+
/** @type {number} */
|
|
47
|
+
hlookup_timer: number;
|
|
48
|
+
/** @type {boolean} */
|
|
49
|
+
capture: boolean;
|
|
50
|
+
/** @type {boolean} */
|
|
51
|
+
moved: boolean;
|
|
52
|
+
/** @type {boolean} */
|
|
53
|
+
canvas_draggable: boolean;
|
|
54
|
+
/** @type {HTMLElement} */
|
|
55
|
+
view_panel: HTMLElement;
|
|
56
|
+
/** @type {DOMRect|null} */
|
|
57
|
+
view_panel_rect: DOMRect | null;
|
|
58
|
+
/** Initialize the draggable node plugin. */
|
|
59
|
+
init(): void;
|
|
60
|
+
/** Resize canvas and shadow elements. */
|
|
61
|
+
resize(): void;
|
|
62
|
+
/** Create canvas for drawing drag lines. */
|
|
63
|
+
create_canvas(): void;
|
|
64
|
+
create_shadow(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Reset shadow element style and cache its size.
|
|
67
|
+
* @param {HTMLElement} el - The node element to mirror as shadow
|
|
68
|
+
*/
|
|
69
|
+
reset_shadow(el: HTMLElement): void;
|
|
70
|
+
/** Show the shadow element. */
|
|
71
|
+
show_shadow(): void;
|
|
72
|
+
/** Hide the shadow element. */
|
|
73
|
+
hide_shadow(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Draw a helper line between the shadow and target node.
|
|
76
|
+
* @param {{x:number,y:number}} shadow_p - Shadow anchor point
|
|
77
|
+
* @param {{x:number,y:number}} node_p - Target node anchor point
|
|
78
|
+
* @param {boolean} invalid - Whether current target is invalid
|
|
79
|
+
*/
|
|
80
|
+
magnet_shadow(shadow_p: {
|
|
81
|
+
x: number;
|
|
82
|
+
y: number;
|
|
83
|
+
}, node_p: {
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
}, invalid: boolean): void;
|
|
87
|
+
/** Clear helper lines from canvas. */
|
|
88
|
+
clear_lines(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Draw a straight helper line.
|
|
91
|
+
* @param {number} x1
|
|
92
|
+
* @param {number} y1
|
|
93
|
+
* @param {number} x2
|
|
94
|
+
* @param {number} y2
|
|
95
|
+
*/
|
|
96
|
+
canvas_lineto(x1: number, y1: number, x2: number, y2: number): void;
|
|
97
|
+
/** Bind mouse/touch events for dragging. */
|
|
98
|
+
event_bind(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Begin dragging interaction.
|
|
101
|
+
* @param {MouseEvent|TouchEvent} e - Pointer down event
|
|
102
|
+
*/
|
|
103
|
+
dragstart(e: MouseEvent | TouchEvent): void;
|
|
104
|
+
view_draggable: boolean;
|
|
105
|
+
client_hw: number;
|
|
106
|
+
client_hh: number;
|
|
107
|
+
/**
|
|
108
|
+
* Drag handler to move shadow and auto-scroll container.
|
|
109
|
+
* @param {MouseEvent|TouchEvent} e - Pointer move event
|
|
110
|
+
*/
|
|
111
|
+
drag(e: MouseEvent | TouchEvent): void;
|
|
112
|
+
/**
|
|
113
|
+
* Finish dragging, move the node if applicable.
|
|
114
|
+
* @param {MouseEvent|TouchEvent} e - Pointer up event
|
|
115
|
+
*/
|
|
116
|
+
dragend(e: MouseEvent | TouchEvent): void;
|
|
117
|
+
/**
|
|
118
|
+
* Find the closest node element from an event target.
|
|
119
|
+
* @param {HTMLElement} el - Current DOM element
|
|
120
|
+
* @returns {HTMLElement|null} Matched node element or null
|
|
121
|
+
*/
|
|
122
|
+
find_node_element(el: HTMLElement): HTMLElement | null;
|
|
123
|
+
/** Recompute target node under the shadow and draw helper. */
|
|
124
|
+
lookup_target_node(): void;
|
|
125
|
+
/**
|
|
126
|
+
* Get X coordinate of root node center.
|
|
127
|
+
* @returns {number}
|
|
128
|
+
*/
|
|
129
|
+
get_root_x(): number;
|
|
130
|
+
/**
|
|
131
|
+
* Lookup overlapping node's parent near the shadow position.
|
|
132
|
+
* @param {number} direction - Direction constant
|
|
133
|
+
* @returns {import('../jsmind.node.js').Node|null}
|
|
134
|
+
*/
|
|
135
|
+
lookup_overlapping_node_parent(direction: number): import("../jsmind.node.js").Node | null;
|
|
136
|
+
/**
|
|
137
|
+
* Find node's parent by a screen location.
|
|
138
|
+
* @param {number} x - Client X
|
|
139
|
+
* @param {number} y - Client Y
|
|
140
|
+
* @returns {import('../jsmind.node.js').Node|null}
|
|
141
|
+
*/
|
|
142
|
+
lookup_node_parent_by_location(x: number, y: number): import("../jsmind.node.js").Node | null;
|
|
143
|
+
/**
|
|
144
|
+
* Lookup the closest node along a direction.
|
|
145
|
+
* @param {number} direction
|
|
146
|
+
* @returns {import('../jsmind.node.js').Node}
|
|
147
|
+
*/
|
|
148
|
+
lookup_close_node(direction: number): import("../jsmind.node.js").Node;
|
|
149
|
+
/**
|
|
150
|
+
* Check if shadow is on the target side of a node.
|
|
151
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
152
|
+
* @param {number} dir
|
|
153
|
+
* @returns {boolean}
|
|
154
|
+
*/
|
|
155
|
+
shadow_on_target_side(node: import("../jsmind.node.js").Node, dir: number): boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Distance from shadow to the right side of a node.
|
|
158
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
159
|
+
* @returns {number}
|
|
160
|
+
*/
|
|
161
|
+
shadow_to_right_of_node(node: import("../jsmind.node.js").Node): number;
|
|
162
|
+
/**
|
|
163
|
+
* Distance from shadow to the left side of a node.
|
|
164
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
165
|
+
* @returns {number}
|
|
166
|
+
*/
|
|
167
|
+
shadow_to_left_of_node(node: import("../jsmind.node.js").Node): number;
|
|
168
|
+
/**
|
|
169
|
+
* Vertical distance between shadow centerline and node centerline.
|
|
170
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
171
|
+
* @returns {number}
|
|
172
|
+
*/
|
|
173
|
+
shadow_to_base_line_of_node(node: import("../jsmind.node.js").Node): number;
|
|
174
|
+
/**
|
|
175
|
+
* Manhattan distance to a node along a direction.
|
|
176
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
177
|
+
* @param {number} dir
|
|
178
|
+
* @returns {number}
|
|
179
|
+
*/
|
|
180
|
+
shadow_to_node(node: import("../jsmind.node.js").Node, dir: number): number;
|
|
181
|
+
/**
|
|
182
|
+
* Calculate connection points of a node and the shadow.
|
|
183
|
+
* @param {import('../jsmind.node.js').Node} node
|
|
184
|
+
* @param {number} dir
|
|
185
|
+
* @returns {{sp:{x:number,y:number}, np:{x:number,y:number}}}
|
|
186
|
+
*/
|
|
187
|
+
calc_point_of_node(node: import("../jsmind.node.js").Node, dir: number): {
|
|
188
|
+
sp: {
|
|
189
|
+
x: number;
|
|
190
|
+
y: number;
|
|
191
|
+
};
|
|
192
|
+
np: {
|
|
193
|
+
x: number;
|
|
194
|
+
y: number;
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Move a node to a new parent/position.
|
|
199
|
+
* @param {import('../jsmind.node.js').Node} src_node
|
|
200
|
+
* @param {import('../jsmind.node.js').Node|null} target_node
|
|
201
|
+
* @param {number|null} target_direct
|
|
202
|
+
*/
|
|
203
|
+
move_node(src_node: import("../jsmind.node.js").Node, target_node: import("../jsmind.node.js").Node | null, target_direct: number | null): void;
|
|
204
|
+
/**
|
|
205
|
+
* Handle jsMind events.
|
|
206
|
+
* @param {number|string} type - Event type
|
|
207
|
+
* @param {object} [data] - Event data
|
|
208
|
+
*/
|
|
209
|
+
jm_event_handle(type: number | string, data?: object): void;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Draggable node plugin registration.
|
|
213
|
+
* @type {import('../jsmind.plugin.js').Plugin<Partial<DraggableNodeOptions>>}
|
|
214
|
+
*/
|
|
215
|
+
export const draggable_plugin: import("../jsmind.plugin.js").Plugin<Partial<DraggableNodeOptions>>;
|
|
216
|
+
export default DraggableNode;
|
|
217
|
+
/**
|
|
218
|
+
* Default options for draggable node plugin.
|
|
219
|
+
*/
|
|
220
|
+
export type DraggableNodeOptions = {
|
|
221
|
+
line_width?: number;
|
|
222
|
+
line_color?: string;
|
|
223
|
+
line_color_invalid?: string;
|
|
224
|
+
lookup_delay?: number;
|
|
225
|
+
lookup_interval?: number;
|
|
226
|
+
scrolling_trigger_width?: number;
|
|
227
|
+
scrolling_step_length?: number;
|
|
228
|
+
shadow_node_class_name?: string;
|
|
229
|
+
};
|