@umbraci/jsmind 0.10.13 → 0.10.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +24 -24
  2. package/README.md +116 -116
  3. package/dist/jsmind.copy-paste.js +9 -0
  4. package/dist/jsmind.copy-paste.js.map +1 -0
  5. package/dist/jsmind.draggable-node.js +1 -1
  6. package/dist/jsmind.draggable-node.js.map +1 -1
  7. package/dist/jsmind.history.js +1 -1
  8. package/dist/jsmind.history.js.map +1 -1
  9. package/dist/jsmind.js +1 -1
  10. package/dist/jsmind.js.map +1 -1
  11. package/dist/jsmind.multi-select.js +9 -0
  12. package/dist/jsmind.multi-select.js.map +1 -0
  13. package/dist/jsmind.multiline-text.js +1 -1
  14. package/dist/jsmind.multiline-text.js.map +1 -1
  15. package/dist/jsmind.screenshot.js +1 -1
  16. package/dist/jsmind.screenshot.js.map +1 -1
  17. package/es/jsmind.copy-paste.js +9 -0
  18. package/es/jsmind.copy-paste.js.map +1 -0
  19. package/es/jsmind.draggable-node.js +1 -1
  20. package/es/jsmind.draggable-node.js.map +1 -1
  21. package/es/jsmind.history.js +1 -1
  22. package/es/jsmind.history.js.map +1 -1
  23. package/es/jsmind.js +1 -1
  24. package/es/jsmind.js.map +1 -1
  25. package/es/jsmind.multi-select.js +9 -0
  26. package/es/jsmind.multi-select.js.map +1 -0
  27. package/es/jsmind.multiline-text.js +1 -1
  28. package/es/jsmind.multiline-text.js.map +1 -1
  29. package/es/jsmind.screenshot.js +1 -1
  30. package/es/jsmind.screenshot.js.map +1 -1
  31. package/lib/jsmind.copy-paste.js +9 -0
  32. package/lib/jsmind.copy-paste.js.map +1 -0
  33. package/lib/jsmind.draggable-node.js +1 -1
  34. package/lib/jsmind.draggable-node.js.map +1 -1
  35. package/lib/jsmind.history.js +1 -1
  36. package/lib/jsmind.history.js.map +1 -1
  37. package/lib/jsmind.js +1 -1
  38. package/lib/jsmind.js.map +1 -1
  39. package/lib/jsmind.multi-select.js +9 -0
  40. package/lib/jsmind.multi-select.js.map +1 -0
  41. package/lib/jsmind.multiline-text.js +1 -1
  42. package/lib/jsmind.multiline-text.js.map +1 -1
  43. package/lib/jsmind.screenshot.js +1 -1
  44. package/lib/jsmind.screenshot.js.map +1 -1
  45. package/package.json +115 -111
  46. package/style/jsmind.css +408 -408
  47. package/types/generated/jsmind.option.d.ts +0 -1
  48. package/types/tsconfig.declaration.json +19 -19
package/LICENSE CHANGED
@@ -1,24 +1,24 @@
1
- Copyright (c) 2014-2025, ZHANG ZHIGANG <hizzgdev@163.com>
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
-
6
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
- * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9
-
10
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11
-
12
-
13
-
14
- 版权所有 (c) 2014-2025, 张志刚 <hizzgdev@163.com>
15
- 保留一切权利。
16
-
17
- 在满足下列条件的前提下,授予使用者使用及再发布本软件的源代码或二进制形式的权利,无论是否修改皆然:
18
-
19
- * 对于本软件源代码的再发布,必须保留上述的版权声明、此三条许可条件,以及下述的免责声明。
20
- * 对于本软件二进制形式的再发布,必须在随同提供的文档和/或其它媒介中,包含上述的版权声明、此三条许可条件,以及下述的免责声明。
21
- * 未获得事前书面许可,不得使用版权所有人的名称和贡献者的名字,来为本软件的衍生物做任何支持、认可或推广、促销的行为。
22
-
23
- 此软件由版权所有者及贡献者以现状("as is")方式提供,本软件不负任何明示或暗示的担保责任,包括但不限于就适销性以及特定目的的适用性的暗示性担保。任何因使用本软件造成的,直接、间接、连带、特别、惩戒或任何结果的损害(包括但不限于替代商品及服务的采购,无法使用,数据丢失,盈利损失或业务中断等),无论任何条件、无论任何原因或任何责任推断、无论是否属于合同范畴、无论是否为严格赔偿责任或民事侵权行为(包括过失或其他原因)而起,即使在使用前已获告知可能会造成此类损害的情形下,版权所有者及贡献者均不负任何责任。
24
-
1
+ Copyright (c) 2014-2025, ZHANG ZHIGANG <hizzgdev@163.com>
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
+
6
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
+ * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9
+
10
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11
+
12
+
13
+
14
+ 版权所有 (c) 2014-2025, 张志刚 <hizzgdev@163.com>
15
+ 保留一切权利。
16
+
17
+ 在满足下列条件的前提下,授予使用者使用及再发布本软件的源代码或二进制形式的权利,无论是否修改皆然:
18
+
19
+ * 对于本软件源代码的再发布,必须保留上述的版权声明、此三条许可条件,以及下述的免责声明。
20
+ * 对于本软件二进制形式的再发布,必须在随同提供的文档和/或其它媒介中,包含上述的版权声明、此三条许可条件,以及下述的免责声明。
21
+ * 未获得事前书面许可,不得使用版权所有人的名称和贡献者的名字,来为本软件的衍生物做任何支持、认可或推广、促销的行为。
22
+
23
+ 此软件由版权所有者及贡献者以现状("as is")方式提供,本软件不负任何明示或暗示的担保责任,包括但不限于就适销性以及特定目的的适用性的暗示性担保。任何因使用本软件造成的,直接、间接、连带、特别、惩戒或任何结果的损害(包括但不限于替代商品及服务的采购,无法使用,数据丢失,盈利损失或业务中断等),无论任何条件、无论任何原因或任何责任推断、无论是否属于合同范畴、无论是否为严格赔偿责任或民事侵权行为(包括过失或其他原因)而起,即使在使用前已获告知可能会造成此类损害的情形下,版权所有者及贡献者均不负任何责任。
24
+
package/README.md CHANGED
@@ -1,116 +1,116 @@
1
- # jsMind
2
-
3
- [![npm version](https://badge.fury.io/js/jsmind.svg)](https://www.npmjs.com/package/jsmind)
4
- ![build-test](https://github.com/hizzgdev/jsmind/actions/workflows/node.js.yml/badge.svg)
5
-
6
- jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 canvas 和 svg 进行设计。jsMind 以 [BSD 协议开源](LICENSE),在此基础上你可以在你的项目上任意使用。
7
-
8
- jsMind is mind map library built by javascript, it base on html5 canvas and svg. jsMind is released under [the BSD license](LICENSE), you can embed it in any project as long as you abide by the license.
9
-
10
- ## ✨ New Feature: Enhanced Plugin System
11
-
12
- jsMind now supports a new enhanced plugin system with:
13
-
14
- - **Synchronous Initialization**: Plugins initialize before rendering, allowing them to affect the initial render
15
- - **Preload Support**: Control plugin initialization order (before or after core modules)
16
- - **Lifecycle Management**: Proper cleanup with `beforePluginRemove()` and `beforePluginDestroy()` hooks
17
- - **Dynamic Plugin Management**: Add or remove plugins at runtime
18
- - **Backward Compatibility**: Works alongside the existing plugin system
19
-
20
- See [Enhanced Plugin System Documentation](docs/enhanced-plugin-system.md) for more information.
21
-
22
- ### Quick Example
23
-
24
- ```javascript
25
- import jsMind from './jsmind.js';
26
- import MultilineTextV2 from './plugins/jsmind.multiline-text-v2.js';
27
-
28
- // Register plugin (before creating instance)
29
- jsMind.usePlugin(MultilineTextV2, {
30
- text_width: 250,
31
- min_height: 40,
32
- });
33
-
34
- // Create jsMind instance
35
- const jm = new jsMind({
36
- container: 'jsmind_container',
37
- editable: true,
38
- });
39
-
40
- // Show mind map with multiline text
41
- jm.show({
42
- meta: { name: 'demo' },
43
- format: 'node_tree',
44
- data: {
45
- id: 'root',
46
- topic: 'Root Node',
47
- children: [{ id: 'node1', topic: 'Line 1\nLine 2\nLine 3' }],
48
- },
49
- });
50
- ```
51
-
52
- ## Project Home
53
-
54
- - [jsMind on Github](https://github.com/hizzgdev/jsmind)
55
- - [国内镜像 - Gitee](https://gitee.com/hizzgdev/jsmind)
56
-
57
- ## Get Started
58
-
59
- ```html
60
- <html>
61
- <head>
62
- <link
63
- type="text/css"
64
- rel="stylesheet"
65
- href="//cdn.jsdelivr.net/npm/jsmind@0.9.0/style/jsmind.css"
66
- />
67
- <script
68
- type="text/javascript"
69
- src="//cdn.jsdelivr.net/npm/jsmind@0.9.0/es6/jsmind.js"
70
- ></script>
71
- </head>
72
- <body>
73
- <div id="jsmind_container"></div>
74
-
75
- <script type="text/javascript">
76
- var mind = {
77
- // 3 data formats were supported ...
78
- // see documents for more information
79
- };
80
- var options = {
81
- container: 'jsmind_container',
82
- theme: 'orange',
83
- editable: true,
84
- };
85
- var jm = new jsMind(options);
86
- jm.show(mind);
87
- </script>
88
- </body>
89
- </html>
90
- ```
91
-
92
- ## Links
93
-
94
- - Resources:
95
- - [文档 - Documents](https://hizzgdev.github.io/jsmind/docs)
96
- - [NPM - jsmind](https://www.npmjs.com/package/jsmind)
97
- - CDN - [用法](docs/zh/1.usage.md) [Usage](docs/en/1.usage.md)
98
- - [UNPKG](https://unpkg.com/browse/jsmind/)
99
- - [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/)
100
- - [jsDelivr 国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)
101
- - Apps :
102
- - <https://jsmind.online>
103
- - Demo :
104
- - [显示一个脑图 Render a mindmap](https://hizzgdev.github.io/jsmind/example/1_basic.html) [[国内版](https://hizzgdev.github.io/jsmind/example/1_basic_cn.html)]
105
- - [试用所有功能 Try all features](https://hizzgdev.github.io/jsmind/example/2_features.html) [[国内版](https://hizzgdev.github.io/jsmind/example/2_features_cn.html)]
106
- - [requirejs + jsMind](https://hizzgdev.github.io/jsmind/example/3_requirejs.html)
107
- - [更多示例 - More samples](https://github.com/hizzgdev/jsmind-samples) [[国内版](https://gitee.com/hizzgdev/jsmind-samples)]
108
-
109
- ## Funding
110
-
111
- - [致谢 - Acknowledgement](https://hizzgdev.github.io/acknowledgement.html)
112
- - [资助 - Sponsor](https://hizzgdev.github.io/sponsor.html)
113
-
114
- ## Maintainer
115
-
116
- - [张志刚 - Zhigang Zhang](https://hizzgdev.github.io)
1
+ # jsMind
2
+
3
+ [![npm version](https://badge.fury.io/js/jsmind.svg)](https://www.npmjs.com/package/jsmind)
4
+ ![build-test](https://github.com/hizzgdev/jsmind/actions/workflows/node.js.yml/badge.svg)
5
+
6
+ jsMind 是一个显示/编辑思维导图的纯 javascript 类库,其基于 html5 canvas 和 svg 进行设计。jsMind 以 [BSD 协议开源](LICENSE),在此基础上你可以在你的项目上任意使用。
7
+
8
+ jsMind is mind map library built by javascript, it base on html5 canvas and svg. jsMind is released under [the BSD license](LICENSE), you can embed it in any project as long as you abide by the license.
9
+
10
+ ## ✨ New Feature: Enhanced Plugin System
11
+
12
+ jsMind now supports a new enhanced plugin system with:
13
+
14
+ - **Synchronous Initialization**: Plugins initialize before rendering, allowing them to affect the initial render
15
+ - **Preload Support**: Control plugin initialization order (before or after core modules)
16
+ - **Lifecycle Management**: Proper cleanup with `beforePluginRemove()` and `beforePluginDestroy()` hooks
17
+ - **Dynamic Plugin Management**: Add or remove plugins at runtime
18
+ - **Backward Compatibility**: Works alongside the existing plugin system
19
+
20
+ See [Enhanced Plugin System Documentation](docs/enhanced-plugin-system.md) for more information.
21
+
22
+ ### Quick Example
23
+
24
+ ```javascript
25
+ import jsMind from './jsmind.js';
26
+ import MultilineTextV2 from './plugins/jsmind.multiline-text-v2.js';
27
+
28
+ // Register plugin (before creating instance)
29
+ jsMind.usePlugin(MultilineTextV2, {
30
+ text_width: 250,
31
+ min_height: 40,
32
+ });
33
+
34
+ // Create jsMind instance
35
+ const jm = new jsMind({
36
+ container: 'jsmind_container',
37
+ editable: true,
38
+ });
39
+
40
+ // Show mind map with multiline text
41
+ jm.show({
42
+ meta: { name: 'demo' },
43
+ format: 'node_tree',
44
+ data: {
45
+ id: 'root',
46
+ topic: 'Root Node',
47
+ children: [{ id: 'node1', topic: 'Line 1\nLine 2\nLine 3' }],
48
+ },
49
+ });
50
+ ```
51
+
52
+ ## Project Home
53
+
54
+ - [jsMind on Github](https://github.com/hizzgdev/jsmind)
55
+ - [国内镜像 - Gitee](https://gitee.com/hizzgdev/jsmind)
56
+
57
+ ## Get Started
58
+
59
+ ```html
60
+ <html>
61
+ <head>
62
+ <link
63
+ type="text/css"
64
+ rel="stylesheet"
65
+ href="//cdn.jsdelivr.net/npm/jsmind@0.9.0/style/jsmind.css"
66
+ />
67
+ <script
68
+ type="text/javascript"
69
+ src="//cdn.jsdelivr.net/npm/jsmind@0.9.0/es6/jsmind.js"
70
+ ></script>
71
+ </head>
72
+ <body>
73
+ <div id="jsmind_container"></div>
74
+
75
+ <script type="text/javascript">
76
+ var mind = {
77
+ // 3 data formats were supported ...
78
+ // see documents for more information
79
+ };
80
+ var options = {
81
+ container: 'jsmind_container',
82
+ theme: 'orange',
83
+ editable: true,
84
+ };
85
+ var jm = new jsMind(options);
86
+ jm.show(mind);
87
+ </script>
88
+ </body>
89
+ </html>
90
+ ```
91
+
92
+ ## Links
93
+
94
+ - Resources:
95
+ - [文档 - Documents](https://hizzgdev.github.io/jsmind/docs)
96
+ - [NPM - jsmind](https://www.npmjs.com/package/jsmind)
97
+ - CDN - [用法](docs/zh/1.usage.md) [Usage](docs/en/1.usage.md)
98
+ - [UNPKG](https://unpkg.com/browse/jsmind/)
99
+ - [jsDelivr](https://www.jsdelivr.com/package/npm/jsmind/)
100
+ - [jsDelivr 国内镜像](https://jsd.onmicrosoft.cn/npm/jsmind/)
101
+ - Apps :
102
+ - <https://jsmind.online>
103
+ - Demo :
104
+ - [显示一个脑图 Render a mindmap](https://hizzgdev.github.io/jsmind/example/1_basic.html) [[国内版](https://hizzgdev.github.io/jsmind/example/1_basic_cn.html)]
105
+ - [试用所有功能 Try all features](https://hizzgdev.github.io/jsmind/example/2_features.html) [[国内版](https://hizzgdev.github.io/jsmind/example/2_features_cn.html)]
106
+ - [requirejs + jsMind](https://hizzgdev.github.io/jsmind/example/3_requirejs.html)
107
+ - [更多示例 - More samples](https://github.com/hizzgdev/jsmind-samples) [[国内版](https://gitee.com/hizzgdev/jsmind-samples)]
108
+
109
+ ## Funding
110
+
111
+ - [致谢 - Acknowledgement](https://hizzgdev.github.io/acknowledgement.html)
112
+ - [资助 - Sponsor](https://hizzgdev.github.io/sponsor.html)
113
+
114
+ ## Maintainer
115
+
116
+ - [张志刚 - Zhigang Zhang](https://hizzgdev.github.io)
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license BSD-3-Clause
3
+ * @copyright 2014-2025 hizzgdev@163.com
4
+ *
5
+ * Project Home:
6
+ * https://github.com/hizzgdev/jsmind/
7
+ */
8
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@umbraci/jsmind")):"function"==typeof define&&define.amd?define(["exports","@umbraci/jsmind"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).jsMindCopyPaste={},e.jsMind)}(this,function(e,t){"use strict";function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=i(t);const o=new class{constructor(e){this.w=e,this.d=e.document,this.g=function(e){return this.d.getElementById(e)},this.c=function(e){return this.d.createElement(e)},this.t=function(e,t){e.hasChildNodes()?e.firstChild.nodeValue=t:e.appendChild(this.d.createTextNode(t))},this.h=function(e,t){t instanceof HTMLElement?(e.innerHTML="",e.appendChild(t)):e.innerHTML=t},this.i=function(e){return!!e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument},this.on=function(e,t,i){e.addEventListener?e.addEventListener(t,i,!1):e.attachEvent("on"+t,i)}}}(window),a={file:{read:function(e,t){var i=new FileReader;i.onload=function(){"function"==typeof t&&t(this.result,e.name)},i.readAsText(e)},save:function(e,t,i){var n;if("function"==typeof o.w.Blob)n=new Blob([e],{type:t});else{var a=new(o.w.BlobBuilder||o.w.MozBlobBuilder||o.w.WebKitBlobBuilder||o.w.MSBlobBuilder);a.append(e),n=a.getBlob(t)}if(navigator.msSaveBlob)navigator.msSaveBlob(n,i);else{var r=(o.w.URL||o.w.webkitURL).createObjectURL(n),s=o.c("a");if("download"in s){s.style.visibility="hidden",s.href=r,s.download=i,o.d.body.appendChild(s);var d=o.d.createEvent("MouseEvents");d.initEvent("click",!0,!0),s.dispatchEvent(d),o.d.body.removeChild(s)}else location.href=r}}},json:{json2string:function(e){return JSON.stringify(e)},string2json:function(e){return JSON.parse(e)},merge:function(e,t){for(var i in t)i in e?"object"!=typeof e[i]||"[object object]"!=Object.prototype.toString.call(e[i]).toLowerCase()||e[i].length?e[i]=t[i]:a.json.merge(e[i],t[i]):e[i]=t[i];return e}},uuid:{newid:function(){return((new Date).getTime().toString(16)+Math.random().toString(16).substring(2)).substring(2,18)}},text:{is_empty:function(e){return!e||0==e.replace(/\s*/,"").length}}};class r{constructor(e,t={}){this.jsMind=e,this.options={enabled:!0,shortcuts:{copy:"meta+c",paste:"meta+v",cut:"meta+x"},...t},this.clipboardData=null,this.logger={info:e=>console.info("[CopyPaste]",e),warn:e=>console.warn("[CopyPaste]",e),error:e=>console.error("[CopyPaste]",e),debug:e=>console.debug("[CopyPaste]",e)},this.init()}init(){return this.logger.info("CopyPaste plugin initialized"),!0}handleCopy(e){if(!this.options.enabled)return;const t=this.jsMind.get_selected_node();if(t)try{e.preventDefault(),this.clipboardData={id:t.id,topic:t.topic,data:t.data||{},direction:t.direction,expanded:t.expanded,children:this.copyChildren(t)},this.logger.info("Node copied:",t.topic),this.showMessage("节点已复制")}catch(e){this.logger.error("Copy failed:",e),this.showMessage("复制失败","error")}else this.logger.warn("No node selected for copying")}handlePaste(e){if(!this.options.enabled)return;if(!this.clipboardData)return this.logger.warn("No data in clipboard"),void this.showMessage("剪贴板为空,请先复制节点","warning");const t=this.jsMind.get_selected_node();if(!t)return this.logger.warn("No target node selected for pasting"),void this.showMessage("请选择目标节点","warning");try{e.preventDefault();const i=this.prepareBatchData(this.clipboardData),n=this.jsMind.add_nodes(t,[i]);n&&n.length>0&&(this.logger.info("Nodes pasted successfully:",this.clipboardData.topic),this.showMessage("粘贴成功"))}catch(e){this.logger.error("Paste failed:",e),this.showMessage("粘贴失败","error")}}handleCut(e){if(!this.options.enabled)return;const t=this.jsMind.get_selected_node();if(t){if(t.isroot)return this.logger.warn("Cannot cut root node"),void this.showMessage("不能剪切根节点","warning");try{e.preventDefault(),this.clipboardData={id:t.id,topic:t.topic,data:t.data||{},direction:t.direction,expanded:t.expanded,children:this.copyChildren(t)};this.jsMind.remove_node(t)&&(this.logger.info("Node cut:",t.topic),this.showMessage("节点已剪切"))}catch(e){this.logger.error("Cut failed:",e),this.showMessage("剪切失败","error")}}else this.logger.warn("No node selected for cutting")}copyChildren(e){return e.children&&0!==e.children.length?e.children.map(e=>({id:e.id,topic:e.topic,data:e.data||{},direction:e.direction,expanded:e.expanded,children:this.copyChildren(e)})):[]}prepareBatchData(e){return{id:a.uuid.newid(),topic:e.topic,data:e.data||{},children:e.children&&e.children.length>0?e.children.map(e=>this.prepareBatchData(e)):void 0}}pasteChildren(e,t){if(!t||0===t.length)return[];const i=t.map(e=>this.prepareBatchData(e));return this.jsMind.add_nodes(e,i)}showMessage(e,t="info"){console.log(`[CopyPaste ${t.toUpperCase()}]: ${e}`)}clear(){this.clipboardData=null,this.logger.info("Clipboard cleared")}getStatus(){return{hasData:!!this.clipboardData,data:this.clipboardData}}}const s=new n.default.plugin("copy-paste",function(e,t){var i=t||{};i.shortcuts=i.shortcuts||{copy:"meta+c",paste:"meta+v",cut:"meta+x"};var n=new r(e,i);e.view&&e.view.e_panel&&e.view.e_panel.addEventListener("keydown",function(e){!e.metaKey&&!e.ctrlKey||"c"!==e.key||e.shiftKey||e.altKey?!e.metaKey&&!e.ctrlKey||"v"!==e.key||e.shiftKey||e.altKey?!e.metaKey&&!e.ctrlKey||"x"!==e.key||e.shiftKey||e.altKey||n.handleCut(e):n.handlePaste(e):n.handleCopy(e)}),e.copy_paste_handler=n});n.default.register_plugin(s),e.copy_paste_plugin=s,e.default=r,Object.defineProperty(e,"__esModule",{value:!0})});
9
+ //# sourceMappingURL=jsmind.copy-paste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsmind.copy-paste.js","sources":["../src/jsmind.dom.js","../src/jsmind.util.js","../src/plugins/copy-paste/copy-paste-plugin-simple.js"],"sourcesContent":["/**\n * @license BSD\n * @copyright 2014-2025 UmbraCi\n *\n * Project Home:\n * https://github.com/UmbraCi/jsmind/\n */\n\n/**\n * Lightweight DOM helpers bound to a window.\n */\nclass Dom {\n /**\n * @param {Window} w\n */\n constructor(w) {\n /** @type {Window} */\n this.w = w;\n /** @type {Document} */\n this.d = w.document;\n /**\n * Get element by id.\n * @param {string} id\n * @returns {HTMLElement|null}\n */\n this.g = function (id) {\n return this.d.getElementById(id);\n };\n /**\n * Create element with given tag.\n * @param {string} tag\n * @returns {HTMLElement}\n */\n this.c = function (tag) {\n return this.d.createElement(tag);\n };\n /**\n * Set text content for element.\n * @param {HTMLElement} n\n * @param {string} t\n */\n this.t = function (n, t) {\n if (n.hasChildNodes()) {\n n.firstChild.nodeValue = t;\n } else {\n n.appendChild(this.d.createTextNode(t));\n }\n };\n\n /**\n * Set inner HTML or append element.\n * @param {HTMLElement} n\n * @param {string|HTMLElement} t\n */\n this.h = function (n, t) {\n if (t instanceof HTMLElement) {\n n.innerHTML = '';\n n.appendChild(t);\n } else {\n n.innerHTML = t;\n }\n };\n // detect isElement\n /**\n * Runtime check for HTMLElement.\n * @param {unknown} el\n * @returns {el is HTMLElement}\n */\n this.i = function (el) {\n return (\n !!el &&\n typeof el === 'object' &&\n el.nodeType === 1 &&\n typeof el.style === 'object' &&\n typeof el.ownerDocument === 'object'\n );\n };\n\n //target,eventType,handler\n /**\n * Add event listener with legacy fallback.\n * @param {HTMLElement} t\n * @param {string} e\n * @param {(ev:Event)=>void} h\n */\n this.on = function (t, e, h) {\n if (!!t.addEventListener) {\n t.addEventListener(e, h, false);\n } else {\n t.attachEvent('on' + e, h);\n }\n };\n }\n}\n\nexport const $ = new Dom(window);\n","/**\n * @license BSD\n * @copyright 2014-2025 UmbraCi\n *\n * Project Home:\n * https://github.com/UmbraCi/jsmind/\n */\n\nimport { $ } from './jsmind.dom.js';\n\n/**\n * Misc utility collection.\n * @type {{\n * file: { read: (file: File, cb:(result:string,name:string)=>void)=>void, save:(data:string,type:string,name:string)=>void},\n * json: { json2string:(v:unknown)=>string, string2json:(s:string)=>unknown, merge:(b:object,a:object)=>object },\n * uuid: { newid:()=>string },\n * text: { is_empty:(s?:string)=>boolean }\n * }}\n */\nexport const util = {\n file: {\n read: function (file_data, fn_callback) {\n var reader = new FileReader();\n reader.onload = function () {\n if (typeof fn_callback === 'function') {\n fn_callback(this.result, file_data.name);\n }\n };\n reader.readAsText(file_data);\n },\n\n save: function (file_data, type, name) {\n var blob;\n if (typeof $.w.Blob === 'function') {\n blob = new Blob([file_data], { type: type });\n } else {\n var BlobBuilder =\n $.w.BlobBuilder ||\n $.w.MozBlobBuilder ||\n $.w.WebKitBlobBuilder ||\n $.w.MSBlobBuilder;\n var bb = new BlobBuilder();\n bb.append(file_data);\n blob = bb.getBlob(type);\n }\n if (navigator.msSaveBlob) {\n navigator.msSaveBlob(blob, name);\n } else {\n var URL = $.w.URL || $.w.webkitURL;\n var blob_url = URL.createObjectURL(blob);\n var anchor = $.c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = blob_url;\n anchor.download = name;\n $.d.body.appendChild(anchor);\n var evt = $.d.createEvent('MouseEvents');\n evt.initEvent('click', true, true);\n anchor.dispatchEvent(evt);\n $.d.body.removeChild(anchor);\n } else {\n location.href = blob_url;\n }\n }\n },\n },\n\n json: {\n json2string: function (json) {\n return JSON.stringify(json);\n },\n string2json: function (json_str) {\n return JSON.parse(json_str);\n },\n merge: function (b, a) {\n for (var o in a) {\n if (o in b) {\n if (\n typeof b[o] === 'object' &&\n Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' &&\n !b[o].length\n ) {\n util.json.merge(b[o], a[o]);\n } else {\n b[o] = a[o];\n }\n } else {\n b[o] = a[o];\n }\n }\n return b;\n },\n },\n\n uuid: {\n newid: function () {\n return (\n new Date().getTime().toString(16) + Math.random().toString(16).substring(2)\n ).substring(2, 18);\n },\n },\n\n text: {\n is_empty: function (s) {\n if (!s) {\n return true;\n }\n return s.replace(/\\s*/, '').length == 0;\n },\n },\n};\n","/**\n * @license BSD-3-Clause\n * @copyright 2014-2025 hizzgdev@163.com\n *\n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\nimport { Plugin } from '../../jsmind.plugin.js';\nimport { util } from '../../jsmind.util.js';\nimport jsMind from '@umbraci/jsmind';\n\n/**\n * 简化版复制粘贴插件\n */\n\nclass CopyPasteHandler {\n constructor(jm, options = {}) {\n this.jsMind = jm;\n this.options = {\n enabled: true,\n shortcuts: {\n copy: 'meta+c',\n paste: 'meta+v',\n cut: 'meta+x'\n },\n ...options\n };\n this.clipboardData = null;\n\n this.logger = {\n info: (msg) => console.info('[CopyPaste]', msg),\n warn: (msg) => console.warn('[CopyPaste]', msg),\n error: (msg) => console.error('[CopyPaste]', msg),\n debug: (msg) => console.debug('[CopyPaste]', msg)\n };\n\n this.init();\n }\n\n init() {\n this.logger.info('CopyPaste plugin initialized');\n return true;\n }\n\n handleCopy(event) {\n if (!this.options.enabled) return;\n\n const selectedNode = this.jsMind.get_selected_node();\n if (!selectedNode) {\n this.logger.warn('No node selected for copying');\n return;\n }\n\n try {\n event.preventDefault();\n\n // 复制节点数据\n this.clipboardData = {\n id: selectedNode.id,\n topic: selectedNode.topic,\n data: selectedNode.data || {},\n direction: selectedNode.direction,\n expanded: selectedNode.expanded,\n children: this.copyChildren(selectedNode)\n };\n\n this.logger.info('Node copied:', selectedNode.topic);\n\n // 显示成功消息\n this.showMessage('节点已复制');\n\n } catch (error) {\n this.logger.error('Copy failed:', error);\n this.showMessage('复制失败', 'error');\n }\n }\n\n handlePaste(event) {\n if (!this.options.enabled) return;\n if (!this.clipboardData) {\n this.logger.warn('No data in clipboard');\n this.showMessage('剪贴板为空,请先复制节点', 'warning');\n return;\n }\n\n const targetNode = this.jsMind.get_selected_node();\n if (!targetNode) {\n this.logger.warn('No target node selected for pasting');\n this.showMessage('请选择目标节点', 'warning');\n return;\n }\n\n try {\n event.preventDefault();\n\n // 准备批量数据(包含所有子节点)\n const batchData = this.prepareBatchData(this.clipboardData);\n\n // 使用 add_nodes 批量创建节点\n const createdNodes = this.jsMind.add_nodes(targetNode, [batchData]);\n\n if (createdNodes && createdNodes.length > 0) {\n this.logger.info('Nodes pasted successfully:', this.clipboardData.topic);\n this.showMessage('粘贴成功');\n }\n\n } catch (error) {\n this.logger.error('Paste failed:', error);\n this.showMessage('粘贴失败', 'error');\n }\n }\n\n handleCut(event) {\n if (!this.options.enabled) return;\n\n const selectedNode = this.jsMind.get_selected_node();\n if (!selectedNode) {\n this.logger.warn('No node selected for cutting');\n return;\n }\n\n if (selectedNode.isroot) {\n this.logger.warn('Cannot cut root node');\n this.showMessage('不能剪切根节点', 'warning');\n return;\n }\n\n try {\n event.preventDefault();\n\n // 先复制到剪贴板\n this.clipboardData = {\n id: selectedNode.id,\n topic: selectedNode.topic,\n data: selectedNode.data || {},\n direction: selectedNode.direction,\n expanded: selectedNode.expanded,\n children: this.copyChildren(selectedNode)\n };\n\n // 删除原节点\n const removed = this.jsMind.remove_node(selectedNode);\n\n if (removed) {\n this.logger.info('Node cut:', selectedNode.topic);\n this.showMessage('节点已剪切');\n }\n\n } catch (error) {\n this.logger.error('Cut failed:', error);\n this.showMessage('剪切失败', 'error');\n }\n }\n\n copyChildren(node) {\n if (!node.children || node.children.length === 0) {\n return [];\n }\n\n return node.children.map(child => ({\n id: child.id,\n topic: child.topic,\n data: child.data || {},\n direction: child.direction,\n expanded: child.expanded,\n children: this.copyChildren(child)\n }));\n }\n\n /**\n * 准备批量数据,将节点数据转换为 add_nodes 所需的格式\n * @param {Object} nodeData - 节点数据\n * @returns {Object} - 格式化后的批量数据\n */\n prepareBatchData(nodeData) {\n return {\n id: util.uuid.newid(),\n topic: nodeData.topic,\n data: nodeData.data || {},\n children: nodeData.children && nodeData.children.length > 0\n ? nodeData.children.map(child => this.prepareBatchData(child))\n : undefined\n };\n }\n\n pasteChildren(parentNode, children) {\n // 保留此方法以备兼容性,但新的实现不再使用递归方式\n if (!children || children.length === 0) return [];\n\n const batchData = children.map(child => this.prepareBatchData(child));\n return this.jsMind.add_nodes(parentNode, batchData);\n }\n\n showMessage(message, type = 'info') {\n // 简单的消息显示\n console.log(`[CopyPaste ${type.toUpperCase()}]: ${message}`);\n }\n\n clear() {\n this.clipboardData = null;\n this.logger.info('Clipboard cleared');\n }\n\n getStatus() {\n return {\n hasData: !!this.clipboardData,\n data: this.clipboardData\n };\n }\n}\n\n/**\n * 复制粘贴插件注册\n */\nexport const copy_paste_plugin = new jsMind.plugin('copy-paste', function (jm, options) {\n // 确保options存在且包含shortcuts\n var pluginOptions = options || {};\n pluginOptions.shortcuts = pluginOptions.shortcuts || {\n copy: 'meta+c',\n paste: 'meta+v',\n cut: 'meta+x'\n };\n\n var handler = new CopyPasteHandler(jm, pluginOptions);\n\n // 直接注册键盘事件监听器,而不是使用不存在的add_shortcut方法\n if (jm.view && jm.view.e_panel) {\n jm.view.e_panel.addEventListener('keydown', function(event) {\n // 检查是否按下了复制快捷键\n if ((event.metaKey || event.ctrlKey) && event.key === 'c' && !event.shiftKey && !event.altKey) {\n handler.handleCopy(event);\n }\n // 检查是否按下了粘贴快捷键\n else if ((event.metaKey || event.ctrlKey) && event.key === 'v' && !event.shiftKey && !event.altKey) {\n handler.handlePaste(event);\n }\n // 检查是否按下了剪切快捷键\n else if ((event.metaKey || event.ctrlKey) && event.key === 'x' && !event.shiftKey && !event.altKey) {\n handler.handleCut(event);\n }\n });\n }\n\n // 将处理器实例附加到jm对象,方便外部调用\n jm.copy_paste_handler = handler;\n});\n\n// 注册插件\njsMind.register_plugin(copy_paste_plugin);\n\nexport default CopyPasteHandler;"],"names":["$","constructor","w","this","d","document","g","id","getElementById","c","tag","createElement","t","n","hasChildNodes","firstChild","nodeValue","appendChild","createTextNode","h","HTMLElement","innerHTML","i","el","nodeType","style","ownerDocument","on","e","addEventListener","attachEvent","window","util","file","read","file_data","fn_callback","reader","FileReader","onload","result","name","readAsText","save","type","blob","Blob","bb","BlobBuilder","MozBlobBuilder","WebKitBlobBuilder","MSBlobBuilder","append","getBlob","navigator","msSaveBlob","blob_url","URL","webkitURL","createObjectURL","anchor","visibility","href","download","body","evt","createEvent","initEvent","dispatchEvent","removeChild","location","json","json2string","JSON","stringify","string2json","json_str","parse","merge","b","a","o","Object","prototype","toString","call","toLowerCase","length","uuid","newid","Date","getTime","Math","random","substring","text","is_empty","s","replace","CopyPasteHandler","jm","options","jsMind","enabled","shortcuts","copy","paste","cut","clipboardData","logger","info","msg","console","warn","error","debug","init","handleCopy","event","selectedNode","get_selected_node","preventDefault","topic","data","direction","expanded","children","copyChildren","showMessage","handlePaste","targetNode","batchData","prepareBatchData","createdNodes","add_nodes","handleCut","isroot","remove_node","node","map","child","nodeData","undefined","pasteChildren","parentNode","message","log","toUpperCase","clear","getStatus","hasData","copy_paste_plugin","plugin","pluginOptions","handler","view","e_panel","metaKey","ctrlKey","key","shiftKey","altKey","copy_paste_handler","register_plugin"],"mappings":"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"}
@@ -5,5 +5,5 @@
5
5
  * Project Home:
6
6
  * https://github.com/hizzgdev/jsmind/
7
7
  */
8
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@umbraci/jsmind")):"function"==typeof define&&define.amd?define(["exports","@umbraci/jsmind"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).jsMindDraggableNode={},t.jsMind)}(this,(function(t,e){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var s=i(e);if(!s.default)throw new Error("jsMind is not defined");const o=s.default.$,n="getSelection"in o.w?function(){o.w.getSelection().removeAllRanges()}:function(){o.d.selection.empty()},h={line_width:5,line_color:"rgba(0,0,0,0.3)",line_color_invalid:"rgba(255,51,51,0.6)",lookup_delay:200,lookup_interval:100,scrolling_trigger_width:20,scrolling_step_length:10,shadow_node_class_name:"jsmind-draggable-shadow-node"};class l{constructor(t,e){var i={};s.default.util.json.merge(i,h),s.default.util.json.merge(i,e),this.version="0.4.0",this.jm=t,this.options=i,this.is_svg_engine="svg"===t.view.opts.engine,this.e_canvas=null,this.canvas_ctx=null,this.helper_line=null,this.shadow=null,this.shadow_p_x=0,this.shadow_p_y=0,this.shadow_w=0,this.shadow_h=0,this.active_node=null,this.target_node=null,this.target_direct=null,this.client_w=0,this.client_h=0,this.offset_x=0,this.offset_y=0,this.hlookup_delay=0,this.hlookup_timer=0,this.capture=!1,this.moved=!1,this.canvas_draggable=t.get_view_draggable(),this.view_panel=t.view.e_panel,this.view_panel_rect=null}init(){this.create_canvas(),this.create_shadow(),this.event_bind()}resize(){this.jm.view.e_nodes.appendChild(this.shadow),this.is_svg_engine?(this.e_canvas.setAttribute("width",this.jm.view.size.w),this.e_canvas.setAttribute("height",this.jm.view.size.h)):(this.e_canvas.width=this.jm.view.size.w,this.e_canvas.height=this.jm.view.size.h)}create_canvas(){if(this.is_svg_engine){var t=this._create_svg_element("svg");t.setAttribute("class","jsmind-draggable-helper"),t.setAttribute("style","position: absolute; top: 0; left: 0; pointer-events: none;"),this.jm.view.e_panel.appendChild(t),this.e_canvas=t}else{var e=o.c("canvas");this.jm.view.e_panel.appendChild(e);var i=e.getContext("2d");this.e_canvas=e,this.canvas_ctx=i}}_create_svg_element(t){return o.d.createElementNS("http://www.w3.org/2000/svg",t)}create_shadow(){var t=o.c("jmnode");t.style.visibility="hidden",t.style.zIndex="3",t.style.cursor="move",t.style.opacity="0.7",t.className=this.options.shadow_node_class_name,this.shadow=t}reset_shadow(t){var e=this.shadow.style;this.shadow.innerHTML=t.innerHTML,e.left=t.style.left,e.top=t.style.top,e.width=t.style.width,e.height=t.style.height,e.backgroundImage=t.style.backgroundImage,e.backgroundSize=t.style.backgroundSize,e.transform=t.style.transform,this.shadow_w=this.shadow.clientWidth,this.shadow_h=this.shadow.clientHeight}show_shadow(){this.moved||(this.shadow.style.visibility="visible")}hide_shadow(){this.shadow.style.visibility="hidden"}magnet_shadow(t,e,i){this.clear_lines();var s=i?this.options.line_color_invalid:this.options.line_color;this.is_svg_engine?this.svg_draw_line(t.x,t.y,e.x,e.y,s):(this.canvas_ctx.lineWidth=this.options.line_width,this.canvas_ctx.strokeStyle=s,this.canvas_ctx.lineCap="round",this.canvas_lineto(t.x,t.y,e.x,e.y))}clear_lines(){this.is_svg_engine?this.helper_line&&this.helper_line.parentNode&&(this.e_canvas.removeChild(this.helper_line),this.helper_line=null):this.canvas_ctx.clearRect(0,0,this.jm.view.size.w,this.jm.view.size.h)}canvas_lineto(t,e,i,s){this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(t,e),this.canvas_ctx.lineTo(i,s),this.canvas_ctx.stroke()}svg_draw_line(t,e,i,s,o){this.helper_line=this._create_svg_element("path"),this.helper_line.setAttribute("stroke",o),this.helper_line.setAttribute("stroke-width",this.options.line_width),this.helper_line.setAttribute("fill","transparent"),this.helper_line.setAttribute("stroke-linecap","round"),this._svg_bezier_to(this.helper_line,t,e,i,s),this.e_canvas.appendChild(this.helper_line)}_svg_bezier_to(t,e,i,s,o){t.setAttribute("d","M "+e+" "+i+" C "+(e+2*(s-e)/3)+" "+i+", "+e+" "+o+", "+s+" "+o)}event_bind(){var t=this,e=this.jm.view.container;o.on(e,"mousedown",(function(e){0===e.button&&t.dragstart.call(t,e)})),o.on(e,"mousemove",(function(e){0===e.movementX&&0===e.movementY||t.drag.call(t,e)})),o.on(e,"mouseup",(function(e){t.dragend.call(t,e)})),o.on(e,"touchstart",(function(e){t.dragstart.call(t,e)})),o.on(e,"touchmove",(function(e){t.drag.call(t,e)})),o.on(e,"touchend",(function(e){t.dragend.call(t,e)}))}dragstart(t){if(this.jm.get_editable()&&!this.capture){var e=this.jm.view;if(!e.is_editing()){this.active_node=null,this.view_draggable=this.jm.get_view_draggable();var i=this.find_node_element(t.target);if(i){this.view_draggable&&this.jm.disable_view_draggable();var s=e.get_binded_nodeid(i);if(s){var n=this.jm.get_node(s);if(!n.isroot){if(n.data&&!1===n.data.draggable)return;this.reset_shadow(i),this.view_panel_rect=this.view_panel.getBoundingClientRect(),this.active_node=n,this.offset_x=(t.clientX||t.touches[0].clientX)/e.zoom_current-i.offsetLeft,this.offset_y=(t.clientY||t.touches[0].clientY)/e.zoom_current-i.offsetTop,this.client_hw=Math.floor(i.clientWidth/2),this.client_hh=Math.floor(i.clientHeight/2),0!=this.hlookup_delay&&o.w.clearTimeout(this.hlookup_delay),0!=this.hlookup_timer&&o.w.clearInterval(this.hlookup_timer);var h=this;this.hlookup_delay=o.w.setTimeout((function(){h.hlookup_delay=0,h.hlookup_timer=o.w.setInterval((function(){h.lookup_target_node.call(h)}),h.options.lookup_interval)}),this.options.lookup_delay),h.capture=!0}}}}}}drag(t){if(this.jm.get_editable()&&this.capture){t.preventDefault(),this.show_shadow(),this.moved=!0,n();var e=this.jm.view,i=(t.clientX||t.touches[0].clientX)/e.zoom_current-this.offset_x,s=(t.clientY||t.touches[0].clientY)/e.zoom_current-this.offset_y;t.clientY-this.view_panel_rect.top<this.options.scrolling_trigger_width&&this.view_panel.scrollTop>this.options.scrolling_step_length?(this.view_panel.scrollBy(0,-this.options.scrolling_step_length),this.offset_y+=this.options.scrolling_step_length/e.zoom_current):this.view_panel_rect.bottom-t.clientY<this.options.scrolling_trigger_width&&this.view_panel.scrollTop<this.view_panel.scrollHeight-this.view_panel_rect.height-this.options.scrolling_step_length&&(this.view_panel.scrollBy(0,this.options.scrolling_step_length),this.offset_y-=this.options.scrolling_step_length/e.zoom_current),t.clientX-this.view_panel_rect.left<this.options.scrolling_trigger_width&&this.view_panel.scrollLeft>this.options.scrolling_step_length?(this.view_panel.scrollBy(-this.options.scrolling_step_length,0),this.offset_x+=this.options.scrolling_step_length/e.zoom_current):this.view_panel_rect.right-t.clientX<this.options.scrolling_trigger_width&&this.view_panel.scrollLeft<this.view_panel.scrollWidth-this.view_panel_rect.width-this.options.scrolling_step_length&&(this.view_panel.scrollBy(this.options.scrolling_step_length,0),this.offset_x-=this.options.scrolling_step_length/e.zoom_current),this.shadow.style.left=i+"px",this.shadow.style.top=s+"px",n()}}dragend(t){if(this.jm.get_editable()){if(this.view_draggable&&this.jm.enable_view_draggable(),this.capture){if(0!=this.hlookup_delay&&(o.w.clearTimeout(this.hlookup_delay),this.hlookup_delay=0,this.clear_lines()),0!=this.hlookup_timer&&(o.w.clearInterval(this.hlookup_timer),this.hlookup_timer=0,this.clear_lines()),this.moved){var e=this.active_node,i=this.target_node,s=this.target_direct;this.move_node(e,i,s)}this.hide_shadow()}this.view_panel_rect=null,this.moved=!1,this.capture=!1}}find_node_element(t){return t===this.jm.view.e_nodes||t===this.jm.view.e_panel||t===this.jm.view.container?null:"jmnode"===t.tagName.toLowerCase()?t:this.find_node_element(t.parentNode)}lookup_target_node(){let t=this.shadow.offsetLeft,e=this.shadow.offsetTop;if(t===this.shadow_p_x&&e===this.shadow_p_y)return;this.shadow_p_x=t,this.shadow_p_y=e;let i=this.shadow_p_x+this.shadow_w/2>=this.get_root_x()?s.default.direction.right:s.default.direction.left,o=this.lookup_overlapping_node_parent(i)||this.lookup_close_node(i);if(o){let t=this.calc_point_of_node(o,i),e=s.default.node.inherited(this.active_node,o);this.magnet_shadow(t.sp,t.np,e),this.target_node=o,this.target_direct=i}}get_root_x(){let t=this.jm.get_root(),e=t.get_location(),i=t.get_size();return e.x+i.w/2}lookup_overlapping_node_parent(t){let e=this.shadow.getBoundingClientRect(),i=e.x+e.width*(1-t)/2,s=(this.jm.options.layout.hspace+this.jm.options.layout.pspace)*t,o=e.height,n=[[i,e.y],[i,e.y+o/2],[i,e.y+o],[i+s/2,e.y],[i+s/2,e.y+o/2],[i+s/2,e.y+o],[i+s,e.y],[i+s,e.y+o/2],[i+s,e.y+o]];for(const t of n){let e=this.lookup_node_parent_by_location(t[0],t[1]);if(e)return e}}lookup_node_parent_by_location(t,e){return o.d.elementsFromPoint(t,e).filter((t=>"JMNODE"===t.tagName&&t.className!==this.options.shadow_node_class_name)).map((t=>this.jm.view.get_binded_nodeid(t))).map((t=>t&&this.jm.mind.nodes[t])).map((t=>t&&t.parent)).find((t=>t))}lookup_close_node(t){return Object.values(this.jm.mind.nodes).filter((e=>e.direction==t||e.isroot)).filter((t=>this.jm.layout.is_visible(t))).filter((e=>this.shadow_on_target_side(e,t))).map((e=>({node:e,distance:this.shadow_to_node(e,t)}))).reduce(((t,e)=>t.distance<e.distance?t:e),{node:this.jm.get_root(),distance:Number.MAX_VALUE}).node}shadow_on_target_side(t,e){return e==s.default.direction.right&&this.shadow_to_right_of_node(t)>0||e==s.default.direction.left&&this.shadow_to_left_of_node(t)>0}shadow_to_right_of_node(t){return this.shadow_p_x-t.get_location().x-t.get_size().w}shadow_to_left_of_node(t){return t.get_location().x-this.shadow_p_x-this.shadow_w}shadow_to_base_line_of_node(t){return this.shadow_p_y+this.shadow_h/2-t.get_location().y-t.get_size().h/2}shadow_to_node(t,e){return(e===s.default.direction.right?Math.abs(this.shadow_to_right_of_node(t)):Math.abs(this.shadow_to_left_of_node(t)))+Math.abs(this.shadow_to_base_line_of_node(t))}calc_point_of_node(t,e){let i=t.get_size(),s=t.get_location(),o=t.isroot?s.x+i.w/2:s.x+i.w*(1+e)/2+this.options.line_width*e,n=s.y+i.h/2;return{sp:{x:this.shadow_p_x+this.shadow_w*(1-e)/2-this.options.line_width*e,y:this.shadow_p_y+this.shadow_h/2},np:{x:o,y:n}}}move_node(t,e,i){var o=this.shadow.offsetTop;if(e&&t&&!s.default.node.inherited(t,e)){if(this.options.validate_drag&&"function"==typeof this.options.validate_drag){if(!this.options.validate_drag(t,e))return this.active_node=null,this.target_node=null,void(this.target_direct=null)}for(var n=e.children,h=n.length,l=null,a=Number.MAX_VALUE,_=null,r="_last_";h--;)if((l=n[h]).direction==i&&l.id!=t.id){var d=l.get_location().y-o;d>0&&d<a&&(a=d,_=l,r="_first_")}_&&(r=_.id),this.jm.move_node(t.id,r,e.id,i)}this.active_node=null,this.target_node=null,this.target_direct=null}jm_event_handle(t,e){t===s.default.event_type.resize&&this.resize()}}const a=new s.default.plugin("draggable_node",(function(t,e){var i=new l(t,e);i.init(),t.add_event_listener((function(t,e){i.jm_event_handle.call(i,t,e)}))}));s.default.register_plugin(a),t.DraggableNode=l,t.default=l,t.draggable_plugin=a,Object.defineProperty(t,"__esModule",{value:!0})}));
8
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@umbraci/jsmind")):"function"==typeof define&&define.amd?define(["exports","@umbraci/jsmind"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).jsMindDraggableNode={},t.jsMind)}(this,function(t,e){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var s=i(e);if(!s.default)throw new Error("jsMind is not defined");const o=s.default.$,n="getSelection"in o.w?function(){o.w.getSelection().removeAllRanges()}:function(){o.d.selection.empty()},h={line_width:5,line_color:"rgba(0,0,0,0.3)",line_color_invalid:"rgba(255,51,51,0.6)",lookup_delay:200,lookup_interval:100,scrolling_trigger_width:20,scrolling_step_length:10,shadow_node_class_name:"jsmind-draggable-shadow-node"};class l{constructor(t,e){var i={};s.default.util.json.merge(i,h),s.default.util.json.merge(i,e),this.version="0.4.0",this.jm=t,this.options=i,this.is_svg_engine="svg"===t.view.opts.engine,this.e_canvas=null,this.canvas_ctx=null,this.helper_line=null,this.shadow=null,this.shadow_p_x=0,this.shadow_p_y=0,this.shadow_w=0,this.shadow_h=0,this.active_node=null,this.target_node=null,this.target_direct=null,this.client_w=0,this.client_h=0,this.offset_x=0,this.offset_y=0,this.hlookup_delay=0,this.hlookup_timer=0,this.capture=!1,this.moved=!1,this.canvas_draggable=t.get_view_draggable(),this.view_panel=t.view.e_panel,this.view_panel_rect=null}init(){this.create_canvas(),this.create_shadow(),this.event_bind()}resize(){this.jm.view.e_nodes.appendChild(this.shadow),this.is_svg_engine?(this.e_canvas.setAttribute("width",this.jm.view.size.w),this.e_canvas.setAttribute("height",this.jm.view.size.h)):(this.e_canvas.width=this.jm.view.size.w,this.e_canvas.height=this.jm.view.size.h)}create_canvas(){if(this.is_svg_engine){var t=this._create_svg_element("svg");t.setAttribute("class","jsmind-draggable-helper"),t.setAttribute("style","position: absolute; top: 0; left: 0; pointer-events: none;"),this.jm.view.e_panel.appendChild(t),this.e_canvas=t}else{var e=o.c("canvas");this.jm.view.e_panel.appendChild(e);var i=e.getContext("2d");this.e_canvas=e,this.canvas_ctx=i}}_create_svg_element(t){return o.d.createElementNS("http://www.w3.org/2000/svg",t)}create_shadow(){var t=o.c("jmnode");t.style.visibility="hidden",t.style.zIndex="3",t.style.cursor="move",t.style.opacity="0.7",t.className=this.options.shadow_node_class_name,this.shadow=t}reset_shadow(t){var e=this.shadow.style;this.shadow.innerHTML=t.innerHTML,e.left=t.style.left,e.top=t.style.top,e.width=t.style.width,e.height=t.style.height,e.backgroundImage=t.style.backgroundImage,e.backgroundSize=t.style.backgroundSize,e.transform=t.style.transform,this.shadow_w=this.shadow.clientWidth,this.shadow_h=this.shadow.clientHeight}show_shadow(){this.moved||(this.shadow.style.visibility="visible")}hide_shadow(){this.shadow.style.visibility="hidden"}magnet_shadow(t,e,i){this.clear_lines();var s=i?this.options.line_color_invalid:this.options.line_color;this.is_svg_engine?this.svg_draw_line(t.x,t.y,e.x,e.y,s):(this.canvas_ctx.lineWidth=this.options.line_width,this.canvas_ctx.strokeStyle=s,this.canvas_ctx.lineCap="round",this.canvas_lineto(t.x,t.y,e.x,e.y))}clear_lines(){this.is_svg_engine?this.helper_line&&this.helper_line.parentNode&&(this.e_canvas.removeChild(this.helper_line),this.helper_line=null):this.canvas_ctx.clearRect(0,0,this.jm.view.size.w,this.jm.view.size.h)}canvas_lineto(t,e,i,s){this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(t,e),this.canvas_ctx.lineTo(i,s),this.canvas_ctx.stroke()}svg_draw_line(t,e,i,s,o){this.helper_line=this._create_svg_element("path"),this.helper_line.setAttribute("stroke",o),this.helper_line.setAttribute("stroke-width",this.options.line_width),this.helper_line.setAttribute("fill","transparent"),this.helper_line.setAttribute("stroke-linecap","round"),this._svg_bezier_to(this.helper_line,t,e,i,s),this.e_canvas.appendChild(this.helper_line)}_svg_bezier_to(t,e,i,s,o){t.setAttribute("d","M "+e+" "+i+" C "+(e+2*(s-e)/3)+" "+i+", "+e+" "+o+", "+s+" "+o)}event_bind(){var t=this,e=this.jm.view.container;o.on(e,"mousedown",function(e){0===e.button&&t.dragstart.call(t,e)}),o.on(e,"mousemove",function(e){0===e.movementX&&0===e.movementY||t.drag.call(t,e)}),o.on(e,"mouseup",function(e){t.dragend.call(t,e)}),o.on(e,"touchstart",function(e){t.dragstart.call(t,e)}),o.on(e,"touchmove",function(e){t.drag.call(t,e)}),o.on(e,"touchend",function(e){t.dragend.call(t,e)})}dragstart(t){if(this.jm.get_editable()&&!this.capture){var e=this.jm.view;if(!e.is_editing()){this.active_node=null,this.view_draggable=this.jm.get_view_draggable();var i=this.find_node_element(t.target);if(i){this.view_draggable&&this.jm.disable_view_draggable();var s=e.get_binded_nodeid(i);if(s){var n=this.jm.get_node(s);if(!n.isroot){if(n.data&&!1===n.data.draggable)return;this.reset_shadow(i),this.view_panel_rect=this.view_panel.getBoundingClientRect(),this.active_node=n,this.offset_x=(t.clientX||t.touches[0].clientX)/e.zoom_current-i.offsetLeft,this.offset_y=(t.clientY||t.touches[0].clientY)/e.zoom_current-i.offsetTop,this.client_hw=Math.floor(i.clientWidth/2),this.client_hh=Math.floor(i.clientHeight/2),0!=this.hlookup_delay&&o.w.clearTimeout(this.hlookup_delay),0!=this.hlookup_timer&&o.w.clearInterval(this.hlookup_timer);var h=this;this.hlookup_delay=o.w.setTimeout(function(){h.hlookup_delay=0,h.hlookup_timer=o.w.setInterval(function(){h.lookup_target_node.call(h)},h.options.lookup_interval)},this.options.lookup_delay),h.capture=!0}}}}}}drag(t){if(this.jm.get_editable()&&this.capture){t.preventDefault(),this.show_shadow(),this.moved=!0,n();var e=this.jm.view,i=(t.clientX||t.touches[0].clientX)/e.zoom_current-this.offset_x,s=(t.clientY||t.touches[0].clientY)/e.zoom_current-this.offset_y;t.clientY-this.view_panel_rect.top<this.options.scrolling_trigger_width&&this.view_panel.scrollTop>this.options.scrolling_step_length?(this.view_panel.scrollBy(0,-this.options.scrolling_step_length),this.offset_y+=this.options.scrolling_step_length/e.zoom_current):this.view_panel_rect.bottom-t.clientY<this.options.scrolling_trigger_width&&this.view_panel.scrollTop<this.view_panel.scrollHeight-this.view_panel_rect.height-this.options.scrolling_step_length&&(this.view_panel.scrollBy(0,this.options.scrolling_step_length),this.offset_y-=this.options.scrolling_step_length/e.zoom_current),t.clientX-this.view_panel_rect.left<this.options.scrolling_trigger_width&&this.view_panel.scrollLeft>this.options.scrolling_step_length?(this.view_panel.scrollBy(-this.options.scrolling_step_length,0),this.offset_x+=this.options.scrolling_step_length/e.zoom_current):this.view_panel_rect.right-t.clientX<this.options.scrolling_trigger_width&&this.view_panel.scrollLeft<this.view_panel.scrollWidth-this.view_panel_rect.width-this.options.scrolling_step_length&&(this.view_panel.scrollBy(this.options.scrolling_step_length,0),this.offset_x-=this.options.scrolling_step_length/e.zoom_current),this.shadow.style.left=i+"px",this.shadow.style.top=s+"px",n()}}dragend(t){if(this.jm.get_editable()){if(this.view_draggable&&this.jm.enable_view_draggable(),this.capture){if(0!=this.hlookup_delay&&(o.w.clearTimeout(this.hlookup_delay),this.hlookup_delay=0,this.clear_lines()),0!=this.hlookup_timer&&(o.w.clearInterval(this.hlookup_timer),this.hlookup_timer=0,this.clear_lines()),this.moved){var e=this.active_node,i=this.target_node,s=this.target_direct;this.move_node(e,i,s)}this.hide_shadow()}this.view_panel_rect=null,this.moved=!1,this.capture=!1}}find_node_element(t){return t===this.jm.view.e_nodes||t===this.jm.view.e_panel||t===this.jm.view.container?null:"jmnode"===t.tagName.toLowerCase()?t:this.find_node_element(t.parentNode)}lookup_target_node(){let t=this.shadow.offsetLeft,e=this.shadow.offsetTop;if(t===this.shadow_p_x&&e===this.shadow_p_y)return;this.shadow_p_x=t,this.shadow_p_y=e;let i=this.shadow_p_x+this.shadow_w/2>=this.get_root_x()?s.default.direction.right:s.default.direction.left,o=this.lookup_overlapping_node_parent(i)||this.lookup_close_node(i);if(o){let t=this.calc_point_of_node(o,i),e=s.default.node.inherited(this.active_node,o);this.magnet_shadow(t.sp,t.np,e),this.target_node=o,this.target_direct=i}}get_root_x(){let t=this.jm.get_root(),e=t.get_location(),i=t.get_size();return e.x+i.w/2}lookup_overlapping_node_parent(t){let e=this.shadow.getBoundingClientRect(),i=e.x+e.width*(1-t)/2,s=(this.jm.options.layout.hspace+this.jm.options.layout.pspace)*t,o=e.height,n=[[i,e.y],[i,e.y+o/2],[i,e.y+o],[i+s/2,e.y],[i+s/2,e.y+o/2],[i+s/2,e.y+o],[i+s,e.y],[i+s,e.y+o/2],[i+s,e.y+o]];for(const t of n){let e=this.lookup_node_parent_by_location(t[0],t[1]);if(e)return e}}lookup_node_parent_by_location(t,e){return o.d.elementsFromPoint(t,e).filter(t=>"JMNODE"===t.tagName&&t.className!==this.options.shadow_node_class_name).map(t=>this.jm.view.get_binded_nodeid(t)).map(t=>t&&this.jm.mind.nodes[t]).map(t=>t&&t.parent).find(t=>t)}lookup_close_node(t){return Object.values(this.jm.mind.nodes).filter(e=>e.direction==t||e.isroot).filter(t=>this.jm.layout.is_visible(t)).filter(e=>this.shadow_on_target_side(e,t)).map(e=>({node:e,distance:this.shadow_to_node(e,t)})).reduce((t,e)=>t.distance<e.distance?t:e,{node:this.jm.get_root(),distance:Number.MAX_VALUE}).node}shadow_on_target_side(t,e){return e==s.default.direction.right&&this.shadow_to_right_of_node(t)>0||e==s.default.direction.left&&this.shadow_to_left_of_node(t)>0}shadow_to_right_of_node(t){return this.shadow_p_x-t.get_location().x-t.get_size().w}shadow_to_left_of_node(t){return t.get_location().x-this.shadow_p_x-this.shadow_w}shadow_to_base_line_of_node(t){return this.shadow_p_y+this.shadow_h/2-t.get_location().y-t.get_size().h/2}shadow_to_node(t,e){return(e===s.default.direction.right?Math.abs(this.shadow_to_right_of_node(t)):Math.abs(this.shadow_to_left_of_node(t)))+Math.abs(this.shadow_to_base_line_of_node(t))}calc_point_of_node(t,e){let i=t.get_size(),s=t.get_location(),o=t.isroot?s.x+i.w/2:s.x+i.w*(1+e)/2+this.options.line_width*e,n=s.y+i.h/2;return{sp:{x:this.shadow_p_x+this.shadow_w*(1-e)/2-this.options.line_width*e,y:this.shadow_p_y+this.shadow_h/2},np:{x:o,y:n}}}move_node(t,e,i){var o=this.shadow.offsetTop;if(e&&t&&!s.default.node.inherited(t,e)){if(this.options.validate_drag&&"function"==typeof this.options.validate_drag){if(!this.options.validate_drag(t,e))return this.active_node=null,this.target_node=null,void(this.target_direct=null)}for(var n=e.children,h=n.length,l=null,a=Number.MAX_VALUE,_=null,r="_last_";h--;)if((l=n[h]).direction==i&&l.id!=t.id){var d=l.get_location().y-o;d>0&&d<a&&(a=d,_=l,r="_first_")}_&&(r=_.id),this.jm.move_node(t.id,r,e.id,i)}this.active_node=null,this.target_node=null,this.target_direct=null}jm_event_handle(t,e){t===s.default.event_type.resize&&this.resize()}}const a=new s.default.plugin("draggable_node",function(t,e){var i=new l(t,e);i.init(),t.add_event_listener(function(t,e){i.jm_event_handle.call(i,t,e)})});s.default.register_plugin(a),t.DraggableNode=l,t.default=l,t.draggable_plugin=a,Object.defineProperty(t,"__esModule",{value:!0})});
9
9
  //# sourceMappingURL=jsmind.draggable-node.js.map