@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,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
+ };