sldeditor 0.6.0 → 0.7.0

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.
@@ -1,206 +1,206 @@
1
- "use strict";var Dw=Object.defineProperty;var Fw=(e,t,n)=>t in e?Dw(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ht=(e,t,n)=>Fw(e,typeof t!="symbol"?t+"":t,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),O=require("react"),jr=require("react-dom");function Hw(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const ke=Hw(O);/**
1
+ "use strict";var Vw=Object.defineProperty;var Uw=(e,t,n)=>t in e?Vw(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var gt=(e,t,n)=>Uw(e,typeof t!="symbol"?t+"":t,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),O=require("react"),Ir=require("react-dom");function Jw(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const ke=Jw(O);/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const Ww=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Er=(...e)=>e.filter((t,n,o)=>!!t&&t.trim()!==""&&o.indexOf(t)===n).join(" ").trim();/**
6
+ */const Zw=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Pr=(...e)=>e.filter((t,n,o)=>!!t&&t.trim()!==""&&o.indexOf(t)===n).join(" ").trim();/**
7
7
  * @license lucide-react v0.469.0 - ISC
8
8
  *
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
- */var qw={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
11
+ */var Qw={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
12
12
  * @license lucide-react v0.469.0 - ISC
13
13
  *
14
14
  * This source code is licensed under the ISC license.
15
15
  * See the LICENSE file in the root directory of this source tree.
16
- */const Gw=O.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:o,className:r="",children:s,iconNode:i,...a},l)=>O.createElement("svg",{ref:l,...qw,width:t,height:t,stroke:e,strokeWidth:o?Number(n)*24/Number(t):n,className:Er("lucide",r),...a},[...i.map(([u,d])=>O.createElement(u,d)),...Array.isArray(s)?s:[s]]));/**
16
+ */const ev=O.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:o,className:r="",children:s,iconNode:i,...a},l)=>O.createElement("svg",{ref:l,...Qw,width:t,height:t,stroke:e,strokeWidth:o?Number(n)*24/Number(t):n,className:Pr("lucide",r),...a},[...i.map(([d,u])=>O.createElement(d,u)),...Array.isArray(s)?s:[s]]));/**
17
17
  * @license lucide-react v0.469.0 - ISC
18
18
  *
19
19
  * This source code is licensed under the ISC license.
20
20
  * See the LICENSE file in the root directory of this source tree.
21
- */const ee=(e,t)=>{const n=O.forwardRef(({className:o,...r},s)=>O.createElement(Gw,{ref:s,iconNode:t,className:Er(`lucide-${Ww(e)}`,o),...r}));return n.displayName=`${e}`,n};/**
21
+ */const oe=(e,t)=>{const n=O.forwardRef(({className:o,...r},s)=>O.createElement(ev,{ref:s,iconNode:t,className:Pr(`lucide-${Zw(e)}`,o),...r}));return n.displayName=`${e}`,n};/**
22
22
  * @license lucide-react v0.469.0 - ISC
23
23
  *
24
24
  * This source code is licensed under the ISC license.
25
25
  * See the LICENSE file in the root directory of this source tree.
26
- */const Nr=ee("Cable",[["path",{d:"M17 21v-2a1 1 0 0 1-1-1v-1a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1",key:"10bnsj"}],["path",{d:"M19 15V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V9",key:"1eqmu1"}],["path",{d:"M21 21v-2h-4",key:"14zm7j"}],["path",{d:"M3 5h4V3",key:"z442eg"}],["path",{d:"M7 5a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1V3",key:"ebdjd7"}]]);/**
26
+ */const Or=oe("Cable",[["path",{d:"M17 21v-2a1 1 0 0 1-1-1v-1a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1",key:"10bnsj"}],["path",{d:"M19 15V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V9",key:"1eqmu1"}],["path",{d:"M21 21v-2h-4",key:"14zm7j"}],["path",{d:"M3 5h4V3",key:"z442eg"}],["path",{d:"M7 5a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1V3",key:"ebdjd7"}]]);/**
27
27
  * @license lucide-react v0.469.0 - ISC
28
28
  *
29
29
  * This source code is licensed under the ISC license.
30
30
  * See the LICENSE file in the root directory of this source tree.
31
- */const Xw=ee("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/**
31
+ */const tv=oe("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/**
32
32
  * @license lucide-react v0.469.0 - ISC
33
33
  *
34
34
  * This source code is licensed under the ISC license.
35
35
  * See the LICENSE file in the root directory of this source tree.
36
- */const Kw=ee("CircleDot",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}]]);/**
36
+ */const nv=oe("CircleDot",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}]]);/**
37
37
  * @license lucide-react v0.469.0 - ISC
38
38
  *
39
39
  * This source code is licensed under the ISC license.
40
40
  * See the LICENSE file in the root directory of this source tree.
41
- */const Mr=ee("Clipboard",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}]]);/**
41
+ */const Br=oe("Clipboard",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}]]);/**
42
42
  * @license lucide-react v0.469.0 - ISC
43
43
  *
44
44
  * This source code is licensed under the ISC license.
45
45
  * See the LICENSE file in the root directory of this source tree.
46
- */const Tr=ee("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/**
46
+ */const Lr=oe("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/**
47
47
  * @license lucide-react v0.469.0 - ISC
48
48
  *
49
49
  * This source code is licensed under the ISC license.
50
50
  * See the LICENSE file in the root directory of this source tree.
51
- */const Yw=ee("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/**
51
+ */const ov=oe("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/**
52
52
  * @license lucide-react v0.469.0 - ISC
53
53
  *
54
54
  * This source code is licensed under the ISC license.
55
55
  * See the LICENSE file in the root directory of this source tree.
56
- */const kn=ee("Ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);/**
56
+ */const Nn=oe("Ellipsis",[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]]);/**
57
57
  * @license lucide-react v0.469.0 - ISC
58
58
  *
59
59
  * This source code is licensed under the ISC license.
60
60
  * See the LICENSE file in the root directory of this source tree.
61
- */const Vw=ee("FileBox",[["path",{d:"M14.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"16lz6z"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M3 13.1a2 2 0 0 0-1 1.76v3.24a2 2 0 0 0 .97 1.78L6 21.7a2 2 0 0 0 2.03.01L11 19.9a2 2 0 0 0 1-1.76V14.9a2 2 0 0 0-.97-1.78L8 11.3a2 2 0 0 0-2.03-.01Z",key:"99pj1s"}],["path",{d:"M7 17v5",key:"1yj1jh"}],["path",{d:"M11.7 14.2 7 17l-4.7-2.8",key:"1yk8tc"}]]);/**
61
+ */const rv=oe("FileBox",[["path",{d:"M14.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"16lz6z"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M3 13.1a2 2 0 0 0-1 1.76v3.24a2 2 0 0 0 .97 1.78L6 21.7a2 2 0 0 0 2.03.01L11 19.9a2 2 0 0 0 1-1.76V14.9a2 2 0 0 0-.97-1.78L8 11.3a2 2 0 0 0-2.03-.01Z",key:"99pj1s"}],["path",{d:"M7 17v5",key:"1yj1jh"}],["path",{d:"M11.7 14.2 7 17l-4.7-2.8",key:"1yk8tc"}]]);/**
62
62
  * @license lucide-react v0.469.0 - ISC
63
63
  *
64
64
  * This source code is licensed under the ISC license.
65
65
  * See the LICENSE file in the root directory of this source tree.
66
- */const Uw=ee("FileImage",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["circle",{cx:"10",cy:"12",r:"2",key:"737tya"}],["path",{d:"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22",key:"wt3hpn"}]]);/**
66
+ */const sv=oe("FileImage",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["circle",{cx:"10",cy:"12",r:"2",key:"737tya"}],["path",{d:"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22",key:"wt3hpn"}]]);/**
67
67
  * @license lucide-react v0.469.0 - ISC
68
68
  *
69
69
  * This source code is licensed under the ISC license.
70
70
  * See the LICENSE file in the root directory of this source tree.
71
- */const Jw=ee("FilePlus",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 15h6",key:"cctwl0"}],["path",{d:"M12 18v-6",key:"17g6i2"}]]);/**
71
+ */const iv=oe("FilePlus",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 15h6",key:"cctwl0"}],["path",{d:"M12 18v-6",key:"17g6i2"}]]);/**
72
72
  * @license lucide-react v0.469.0 - ISC
73
73
  *
74
74
  * This source code is licensed under the ISC license.
75
75
  * See the LICENSE file in the root directory of this source tree.
76
- */const Zw=ee("FileType",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 13v-1h6v1",key:"1bb014"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"M11 18h2",key:"12mj7e"}]]);/**
76
+ */const av=oe("FileType",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 13v-1h6v1",key:"1bb014"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"M11 18h2",key:"12mj7e"}]]);/**
77
77
  * @license lucide-react v0.469.0 - ISC
78
78
  *
79
79
  * This source code is licensed under the ISC license.
80
80
  * See the LICENSE file in the root directory of this source tree.
81
- */const Ar=ee("FlipHorizontal",[["path",{d:"M8 3H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h3",key:"1i73f7"}],["path",{d:"M16 3h3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-3",key:"saxlbk"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 14v2",key:"8jcxud"}],["path",{d:"M12 8v2",key:"1woqiv"}],["path",{d:"M12 2v2",key:"tus03m"}]]);/**
81
+ */const zr=oe("FlipHorizontal",[["path",{d:"M8 3H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h3",key:"1i73f7"}],["path",{d:"M16 3h3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-3",key:"saxlbk"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 14v2",key:"8jcxud"}],["path",{d:"M12 8v2",key:"1woqiv"}],["path",{d:"M12 2v2",key:"tus03m"}]]);/**
82
82
  * @license lucide-react v0.469.0 - ISC
83
83
  *
84
84
  * This source code is licensed under the ISC license.
85
85
  * See the LICENSE file in the root directory of this source tree.
86
- */const yo=ee("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/**
86
+ */const jo=oe("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/**
87
87
  * @license lucide-react v0.469.0 - ISC
88
88
  *
89
89
  * This source code is licensed under the ISC license.
90
90
  * See the LICENSE file in the root directory of this source tree.
91
- */const Qw=ee("Grid2x2",[["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"M3 12h18",key:"1i2n21"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}]]);/**
91
+ */const lv=oe("Grid2x2",[["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"M3 12h18",key:"1i2n21"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}]]);/**
92
92
  * @license lucide-react v0.469.0 - ISC
93
93
  *
94
94
  * This source code is licensed under the ISC license.
95
95
  * See the LICENSE file in the root directory of this source tree.
96
- */const ev=ee("Hand",[["path",{d:"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2",key:"1fvzgz"}],["path",{d:"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2",key:"1kc0my"}],["path",{d:"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8",key:"10h0bg"}],["path",{d:"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15",key:"1s1gnw"}]]);/**
96
+ */const cv=oe("Hand",[["path",{d:"M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2",key:"1fvzgz"}],["path",{d:"M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2",key:"1kc0my"}],["path",{d:"M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8",key:"10h0bg"}],["path",{d:"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15",key:"1s1gnw"}]]);/**
97
97
  * @license lucide-react v0.469.0 - ISC
98
98
  *
99
99
  * This source code is licensed under the ISC license.
100
100
  * See the LICENSE file in the root directory of this source tree.
101
- */const Rt=ee("LayoutGrid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);/**
101
+ */const qt=oe("LayoutGrid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);/**
102
102
  * @license lucide-react v0.469.0 - ISC
103
103
  *
104
104
  * This source code is licensed under the ISC license.
105
105
  * See the LICENSE file in the root directory of this source tree.
106
- */const Cr=ee("ListTree",[["path",{d:"M21 12h-8",key:"1bmf0i"}],["path",{d:"M21 6H8",key:"1pqkrb"}],["path",{d:"M21 18h-8",key:"1tm79t"}],["path",{d:"M3 6v4c0 1.1.9 2 2 2h3",key:"1ywdgy"}],["path",{d:"M3 10v6c0 1.1.9 2 2 2h3",key:"2wc746"}]]);/**
106
+ */const Rr=oe("ListTree",[["path",{d:"M21 12h-8",key:"1bmf0i"}],["path",{d:"M21 6H8",key:"1pqkrb"}],["path",{d:"M21 18h-8",key:"1tm79t"}],["path",{d:"M3 6v4c0 1.1.9 2 2 2h3",key:"1ywdgy"}],["path",{d:"M3 10v6c0 1.1.9 2 2 2h3",key:"2wc746"}]]);/**
107
107
  * @license lucide-react v0.469.0 - ISC
108
108
  *
109
109
  * This source code is licensed under the ISC license.
110
110
  * See the LICENSE file in the root directory of this source tree.
111
- */const tv=ee("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/**
111
+ */const dv=oe("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/**
112
112
  * @license lucide-react v0.469.0 - ISC
113
113
  *
114
114
  * This source code is licensed under the ISC license.
115
115
  * See the LICENSE file in the root directory of this source tree.
116
- */const Dn=ee("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/**
116
+ */const Xn=oe("Minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]);/**
117
117
  * @license lucide-react v0.469.0 - ISC
118
118
  *
119
119
  * This source code is licensed under the ISC license.
120
120
  * See the LICENSE file in the root directory of this source tree.
121
- */const nv=ee("MousePointer2",[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]);/**
121
+ */const uv=oe("MousePointer2",[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]]);/**
122
122
  * @license lucide-react v0.469.0 - ISC
123
123
  *
124
124
  * This source code is licensed under the ISC license.
125
125
  * See the LICENSE file in the root directory of this source tree.
126
- */const ov=ee("PanelBottomClose",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"m15 8-3 3-3-3",key:"1oxy1z"}]]);/**
126
+ */const fv=oe("PanelBottomClose",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"m15 8-3 3-3-3",key:"1oxy1z"}]]);/**
127
127
  * @license lucide-react v0.469.0 - ISC
128
128
  *
129
129
  * This source code is licensed under the ISC license.
130
130
  * See the LICENSE file in the root directory of this source tree.
131
- */const rv=ee("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/**
131
+ */const mv=oe("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/**
132
132
  * @license lucide-react v0.469.0 - ISC
133
133
  *
134
134
  * This source code is licensed under the ISC license.
135
135
  * See the LICENSE file in the root directory of this source tree.
136
- */const Fn=ee("Redo2",[["path",{d:"m15 14 5-5-5-5",key:"12vg1m"}],["path",{d:"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13",key:"6uklza"}]]);/**
136
+ */const Yn=oe("Redo2",[["path",{d:"m15 14 5-5-5-5",key:"12vg1m"}],["path",{d:"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13",key:"6uklza"}]]);/**
137
137
  * @license lucide-react v0.469.0 - ISC
138
138
  *
139
139
  * This source code is licensed under the ISC license.
140
140
  * See the LICENSE file in the root directory of this source tree.
141
- */const Ir=ee("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]);/**
141
+ */const Dr=oe("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]]);/**
142
142
  * @license lucide-react v0.469.0 - ISC
143
143
  *
144
144
  * This source code is licensed under the ISC license.
145
145
  * See the LICENSE file in the root directory of this source tree.
146
- */const xo=ee("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/**
146
+ */const Eo=oe("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/**
147
147
  * @license lucide-react v0.469.0 - ISC
148
148
  *
149
149
  * This source code is licensed under the ISC license.
150
150
  * See the LICENSE file in the root directory of this source tree.
151
- */const Pr=ee("Scissors",[["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M8.12 8.12 12 12",key:"1alkpv"}],["path",{d:"M20 4 8.12 15.88",key:"xgtan2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M14.8 14.8 20 20",key:"ptml3r"}]]);/**
151
+ */const Fr=oe("Scissors",[["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M8.12 8.12 12 12",key:"1alkpv"}],["path",{d:"M20 4 8.12 15.88",key:"xgtan2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M14.8 14.8 20 20",key:"ptml3r"}]]);/**
152
152
  * @license lucide-react v0.469.0 - ISC
153
153
  *
154
154
  * This source code is licensed under the ISC license.
155
155
  * See the LICENSE file in the root directory of this source tree.
156
- */const sv=ee("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/**
156
+ */const hv=oe("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/**
157
157
  * @license lucide-react v0.469.0 - ISC
158
158
  *
159
159
  * This source code is licensed under the ISC license.
160
160
  * See the LICENSE file in the root directory of this source tree.
161
- */const Or=ee("Shapes",[["path",{d:"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z",key:"1bo67w"}],["rect",{x:"3",y:"14",width:"7",height:"7",rx:"1",key:"1bkyp8"}],["circle",{cx:"17.5",cy:"17.5",r:"3.5",key:"w3z12y"}]]);/**
161
+ */const Hr=oe("Shapes",[["path",{d:"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z",key:"1bo67w"}],["rect",{x:"3",y:"14",width:"7",height:"7",rx:"1",key:"1bkyp8"}],["circle",{cx:"17.5",cy:"17.5",r:"3.5",key:"w3z12y"}]]);/**
162
162
  * @license lucide-react v0.469.0 - ISC
163
163
  *
164
164
  * This source code is licensed under the ISC license.
165
165
  * See the LICENSE file in the root directory of this source tree.
166
- */const iv=ee("Spline",[["circle",{cx:"19",cy:"5",r:"2",key:"mhkx31"}],["circle",{cx:"5",cy:"19",r:"2",key:"v8kfzx"}],["path",{d:"M5 17A12 12 0 0 1 17 5",key:"1okkup"}]]);/**
166
+ */const pv=oe("Spline",[["circle",{cx:"19",cy:"5",r:"2",key:"mhkx31"}],["circle",{cx:"5",cy:"19",r:"2",key:"v8kfzx"}],["path",{d:"M5 17A12 12 0 0 1 17 5",key:"1okkup"}]]);/**
167
167
  * @license lucide-react v0.469.0 - ISC
168
168
  *
169
169
  * This source code is licensed under the ISC license.
170
170
  * See the LICENSE file in the root directory of this source tree.
171
- */const av=ee("SquareDashed",[["path",{d:"M5 3a2 2 0 0 0-2 2",key:"y57alp"}],["path",{d:"M19 3a2 2 0 0 1 2 2",key:"18rm91"}],["path",{d:"M21 19a2 2 0 0 1-2 2",key:"1j7049"}],["path",{d:"M5 21a2 2 0 0 1-2-2",key:"sbafld"}],["path",{d:"M9 3h1",key:"1yesri"}],["path",{d:"M9 21h1",key:"15o7lz"}],["path",{d:"M14 3h1",key:"1ec4yj"}],["path",{d:"M14 21h1",key:"v9vybs"}],["path",{d:"M3 9v1",key:"1r0deq"}],["path",{d:"M21 9v1",key:"mxsmne"}],["path",{d:"M3 14v1",key:"vnatye"}],["path",{d:"M21 14v1",key:"169vum"}]]);/**
171
+ */const gv=oe("SquareDashed",[["path",{d:"M5 3a2 2 0 0 0-2 2",key:"y57alp"}],["path",{d:"M19 3a2 2 0 0 1 2 2",key:"18rm91"}],["path",{d:"M21 19a2 2 0 0 1-2 2",key:"1j7049"}],["path",{d:"M5 21a2 2 0 0 1-2-2",key:"sbafld"}],["path",{d:"M9 3h1",key:"1yesri"}],["path",{d:"M9 21h1",key:"15o7lz"}],["path",{d:"M14 3h1",key:"1ec4yj"}],["path",{d:"M14 21h1",key:"v9vybs"}],["path",{d:"M3 9v1",key:"1r0deq"}],["path",{d:"M21 9v1",key:"mxsmne"}],["path",{d:"M3 14v1",key:"vnatye"}],["path",{d:"M21 14v1",key:"169vum"}]]);/**
172
172
  * @license lucide-react v0.469.0 - ISC
173
173
  *
174
174
  * This source code is licensed under the ISC license.
175
175
  * See the LICENSE file in the root directory of this source tree.
176
- */const Br=ee("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/**
176
+ */const Wr=oe("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/**
177
177
  * @license lucide-react v0.469.0 - ISC
178
178
  *
179
179
  * This source code is licensed under the ISC license.
180
180
  * See the LICENSE file in the root directory of this source tree.
181
- */const Lr=ee("Type",[["polyline",{points:"4 7 4 4 20 4 20 7",key:"1nosan"}],["line",{x1:"9",x2:"15",y1:"20",y2:"20",key:"swin9y"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/**
181
+ */const qr=oe("Type",[["polyline",{points:"4 7 4 4 20 4 20 7",key:"1nosan"}],["line",{x1:"9",x2:"15",y1:"20",y2:"20",key:"swin9y"}],["line",{x1:"12",x2:"12",y1:"4",y2:"20",key:"1tx1rr"}]]);/**
182
182
  * @license lucide-react v0.469.0 - ISC
183
183
  *
184
184
  * This source code is licensed under the ISC license.
185
185
  * See the LICENSE file in the root directory of this source tree.
186
- */const Hn=ee("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);/**
186
+ */const Kn=oe("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);/**
187
187
  * @license lucide-react v0.469.0 - ISC
188
188
  *
189
189
  * This source code is licensed under the ISC license.
190
190
  * See the LICENSE file in the root directory of this source tree.
191
- */const kt=ee("WandSparkles",[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]]);/**
191
+ */const $t=oe("WandSparkles",[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]]);/**
192
192
  * @license lucide-react v0.469.0 - ISC
193
193
  *
194
194
  * This source code is licensed under the ISC license.
195
195
  * See the LICENSE file in the root directory of this source tree.
196
- */const Wn=ee("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function zr(e){var t,n,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(n=zr(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}function Rr(){for(var e,t,n=0,o="",r=arguments.length;n<r;n++)(e=arguments[n])&&(t=zr(e))&&(o&&(o+=" "),o+=t);return o}const qn="-",lv=e=>{const t=dv(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:i=>{const a=i.split(qn);return a[0]===""&&a.length!==1&&a.shift(),Dr(a,t)||cv(i)},getConflictingClassGroupIds:(i,a)=>{const l=n[i]||[];return a&&o[i]?[...l,...o[i]]:l}}},Dr=(e,t)=>{var i;if(e.length===0)return t.classGroupId;const n=e[0],o=t.nextPart.get(n),r=o?Dr(e.slice(1),o):void 0;if(r)return r;if(t.validators.length===0)return;const s=e.join(qn);return(i=t.validators.find(({validator:a})=>a(s)))==null?void 0:i.classGroupId},bo=/^\[(.+)\]$/,cv=e=>{if(bo.test(e)){const t=bo.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},dv=e=>{const{theme:t,prefix:n}=e,o={nextPart:new Map,validators:[]};return mv(Object.entries(e.classGroups),n).forEach(([s,i])=>{_n(i,o,s,t)}),o},_n=(e,t,n,o)=>{e.forEach(r=>{if(typeof r=="string"){const s=r===""?t:wo(t,r);s.classGroupId=n;return}if(typeof r=="function"){if(uv(r)){_n(r(o),t,n,o);return}t.validators.push({validator:r,classGroupId:n});return}Object.entries(r).forEach(([s,i])=>{_n(i,wo(t,s),n,o)})})},wo=(e,t)=>{let n=e;return t.split(qn).forEach(o=>{n.nextPart.has(o)||n.nextPart.set(o,{nextPart:new Map,validators:[]}),n=n.nextPart.get(o)}),n},uv=e=>e.isThemeGetter,mv=(e,t)=>t?e.map(([n,o])=>{const r=o.map(s=>typeof s=="string"?t+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,a])=>[t+i,a])):s);return[n,r]}):e,fv=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,o=new Map;const r=(s,i)=>{n.set(s,i),t++,t>e&&(t=0,o=n,n=new Map)};return{get(s){let i=n.get(s);if(i!==void 0)return i;if((i=o.get(s))!==void 0)return r(s,i),i},set(s,i){n.has(s)?n.set(s,i):r(s,i)}}},Fr="!",hv=e=>{const{separator:t,experimentalParseClassName:n}=e,o=t.length===1,r=t[0],s=t.length,i=a=>{const l=[];let u=0,d=0,m;for(let w=0;w<a.length;w++){let E=a[w];if(u===0){if(E===r&&(o||a.slice(w,w+s)===t)){l.push(a.slice(d,w)),d=w+s;continue}if(E==="/"){m=w;continue}}E==="["?u++:E==="]"&&u--}const f=l.length===0?a:a.substring(d),p=f.startsWith(Fr),h=p?f.substring(1):f,g=m&&m>d?m-d:void 0;return{modifiers:l,hasImportantModifier:p,baseClassName:h,maybePostfixModifierPosition:g}};return n?a=>n({className:a,parseClassName:i}):i},pv=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(o=>{o[0]==="["?(t.push(...n.sort(),o),n=[]):n.push(o)}),t.push(...n.sort()),t},gv=e=>({cache:fv(e.cacheSize),parseClassName:hv(e),...lv(e)}),yv=/\s+/,xv=(e,t)=>{const{parseClassName:n,getClassGroupId:o,getConflictingClassGroupIds:r}=t,s=[],i=e.trim().split(yv);let a="";for(let l=i.length-1;l>=0;l-=1){const u=i[l],{modifiers:d,hasImportantModifier:m,baseClassName:f,maybePostfixModifierPosition:p}=n(u);let h=!!p,g=o(h?f.substring(0,p):f);if(!g){if(!h){a=u+(a.length>0?" "+a:a);continue}if(g=o(f),!g){a=u+(a.length>0?" "+a:a);continue}h=!1}const w=pv(d).join(":"),E=m?w+Fr:w,k=E+g;if(s.includes(k))continue;s.push(k);const x=r(g,h);for(let S=0;S<x.length;++S){const A=x[S];s.push(E+A)}a=u+(a.length>0?" "+a:a)}return a};function bv(){let e=0,t,n,o="";for(;e<arguments.length;)(t=arguments[e++])&&(n=Hr(t))&&(o&&(o+=" "),o+=n);return o}const Hr=e=>{if(typeof e=="string")return e;let t,n="";for(let o=0;o<e.length;o++)e[o]&&(t=Hr(e[o]))&&(n&&(n+=" "),n+=t);return n};function wv(e,...t){let n,o,r,s=i;function i(l){const u=t.reduce((d,m)=>m(d),e());return n=gv(u),o=n.cache.get,r=n.cache.set,s=a,a(l)}function a(l){const u=o(l);if(u)return u;const d=xv(l,n);return r(l,d),d}return function(){return s(bv.apply(null,arguments))}}const ae=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},Wr=/^\[(?:([a-z-]+):)?(.+)\]$/i,vv=/^\d+\/\d+$/,kv=new Set(["px","full","screen"]),_v=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,$v=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Sv=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,jv=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Ev=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Pe=e=>rt(e)||kv.has(e)||vv.test(e),De=e=>lt(e,"length",Ov),rt=e=>!!e&&!Number.isNaN(Number(e)),an=e=>lt(e,"number",rt),pt=e=>!!e&&Number.isInteger(Number(e)),Nv=e=>e.endsWith("%")&&rt(e.slice(0,-1)),U=e=>Wr.test(e),Fe=e=>_v.test(e),Mv=new Set(["length","size","percentage"]),Tv=e=>lt(e,Mv,qr),Av=e=>lt(e,"position",qr),Cv=new Set(["image","url"]),Iv=e=>lt(e,Cv,Lv),Pv=e=>lt(e,"",Bv),gt=()=>!0,lt=(e,t,n)=>{const o=Wr.exec(e);return o?o[1]?typeof t=="string"?o[1]===t:t.has(o[1]):n(o[2]):!1},Ov=e=>$v.test(e)&&!Sv.test(e),qr=()=>!1,Bv=e=>jv.test(e),Lv=e=>Ev.test(e),zv=()=>{const e=ae("colors"),t=ae("spacing"),n=ae("blur"),o=ae("brightness"),r=ae("borderColor"),s=ae("borderRadius"),i=ae("borderSpacing"),a=ae("borderWidth"),l=ae("contrast"),u=ae("grayscale"),d=ae("hueRotate"),m=ae("invert"),f=ae("gap"),p=ae("gradientColorStops"),h=ae("gradientColorStopPositions"),g=ae("inset"),w=ae("margin"),E=ae("opacity"),k=ae("padding"),x=ae("saturate"),S=ae("scale"),A=ae("sepia"),B=ae("skew"),q=ae("space"),V=ae("translate"),re=()=>["auto","contain","none"],se=()=>["auto","hidden","clip","visible","scroll"],R=()=>["auto",U,t],F=()=>[U,t],Z=()=>["",Pe,De],ie=()=>["auto",rt,U],le=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Q=()=>["solid","dashed","dotted","double","none"],he=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],pe=()=>["start","end","center","between","around","evenly","stretch"],ge=()=>["","0",U],Ie=()=>["auto","avoid","all","avoid-page","page","left","right","column"],$e=()=>[rt,U];return{cacheSize:500,separator:":",theme:{colors:[gt],spacing:[Pe,De],blur:["none","",Fe,U],brightness:$e(),borderColor:[e],borderRadius:["none","","full",Fe,U],borderSpacing:F(),borderWidth:Z(),contrast:$e(),grayscale:ge(),hueRotate:$e(),invert:ge(),gap:F(),gradientColorStops:[e],gradientColorStopPositions:[Nv,De],inset:R(),margin:R(),opacity:$e(),padding:F(),saturate:$e(),scale:$e(),sepia:ge(),skew:$e(),space:F(),translate:F()},classGroups:{aspect:[{aspect:["auto","square","video",U]}],container:["container"],columns:[{columns:[Fe]}],"break-after":[{"break-after":Ie()}],"break-before":[{"break-before":Ie()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...le(),U]}],overflow:[{overflow:se()}],"overflow-x":[{"overflow-x":se()}],"overflow-y":[{"overflow-y":se()}],overscroll:[{overscroll:re()}],"overscroll-x":[{"overscroll-x":re()}],"overscroll-y":[{"overscroll-y":re()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[g]}],"inset-x":[{"inset-x":[g]}],"inset-y":[{"inset-y":[g]}],start:[{start:[g]}],end:[{end:[g]}],top:[{top:[g]}],right:[{right:[g]}],bottom:[{bottom:[g]}],left:[{left:[g]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",pt,U]}],basis:[{basis:R()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",U]}],grow:[{grow:ge()}],shrink:[{shrink:ge()}],order:[{order:["first","last","none",pt,U]}],"grid-cols":[{"grid-cols":[gt]}],"col-start-end":[{col:["auto",{span:["full",pt,U]},U]}],"col-start":[{"col-start":ie()}],"col-end":[{"col-end":ie()}],"grid-rows":[{"grid-rows":[gt]}],"row-start-end":[{row:["auto",{span:[pt,U]},U]}],"row-start":[{"row-start":ie()}],"row-end":[{"row-end":ie()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",U]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",U]}],gap:[{gap:[f]}],"gap-x":[{"gap-x":[f]}],"gap-y":[{"gap-y":[f]}],"justify-content":[{justify:["normal",...pe()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...pe(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...pe(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[q]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[q]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",U,t]}],"min-w":[{"min-w":[U,t,"min","max","fit"]}],"max-w":[{"max-w":[U,t,"none","full","min","max","fit","prose",{screen:[Fe]},Fe]}],h:[{h:[U,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[U,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[U,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[U,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Fe,De]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",an]}],"font-family":[{font:[gt]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",U]}],"line-clamp":[{"line-clamp":["none",rt,an]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Pe,U]}],"list-image":[{"list-image":["none",U]}],"list-style-type":[{list:["none","disc","decimal",U]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[E]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[E]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Q(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Pe,De]}],"underline-offset":[{"underline-offset":["auto",Pe,U]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:F()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",U]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",U]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[E]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...le(),Av]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Tv]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Iv]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[h]}],"gradient-via-pos":[{via:[h]}],"gradient-to-pos":[{to:[h]}],"gradient-from":[{from:[p]}],"gradient-via":[{via:[p]}],"gradient-to":[{to:[p]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[a]}],"border-w-x":[{"border-x":[a]}],"border-w-y":[{"border-y":[a]}],"border-w-s":[{"border-s":[a]}],"border-w-e":[{"border-e":[a]}],"border-w-t":[{"border-t":[a]}],"border-w-r":[{"border-r":[a]}],"border-w-b":[{"border-b":[a]}],"border-w-l":[{"border-l":[a]}],"border-opacity":[{"border-opacity":[E]}],"border-style":[{border:[...Q(),"hidden"]}],"divide-x":[{"divide-x":[a]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[a]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[E]}],"divide-style":[{divide:Q()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...Q()]}],"outline-offset":[{"outline-offset":[Pe,U]}],"outline-w":[{outline:[Pe,De]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:Z()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[E]}],"ring-offset-w":[{"ring-offset":[Pe,De]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Fe,Pv]}],"shadow-color":[{shadow:[gt]}],opacity:[{opacity:[E]}],"mix-blend":[{"mix-blend":[...he(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":he()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[o]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Fe,U]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[m]}],saturate:[{saturate:[x]}],sepia:[{sepia:[A]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[m]}],"backdrop-opacity":[{"backdrop-opacity":[E]}],"backdrop-saturate":[{"backdrop-saturate":[x]}],"backdrop-sepia":[{"backdrop-sepia":[A]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",U]}],duration:[{duration:$e()}],ease:[{ease:["linear","in","out","in-out",U]}],delay:[{delay:$e()}],animate:[{animate:["none","spin","ping","pulse","bounce",U]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[S]}],"scale-x":[{"scale-x":[S]}],"scale-y":[{"scale-y":[S]}],rotate:[{rotate:[pt,U]}],"translate-x":[{"translate-x":[V]}],"translate-y":[{"translate-y":[V]}],"skew-x":[{"skew-x":[B]}],"skew-y":[{"skew-y":[B]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",U]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",U]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":F()}],"scroll-mx":[{"scroll-mx":F()}],"scroll-my":[{"scroll-my":F()}],"scroll-ms":[{"scroll-ms":F()}],"scroll-me":[{"scroll-me":F()}],"scroll-mt":[{"scroll-mt":F()}],"scroll-mr":[{"scroll-mr":F()}],"scroll-mb":[{"scroll-mb":F()}],"scroll-ml":[{"scroll-ml":F()}],"scroll-p":[{"scroll-p":F()}],"scroll-px":[{"scroll-px":F()}],"scroll-py":[{"scroll-py":F()}],"scroll-ps":[{"scroll-ps":F()}],"scroll-pe":[{"scroll-pe":F()}],"scroll-pt":[{"scroll-pt":F()}],"scroll-pr":[{"scroll-pr":F()}],"scroll-pb":[{"scroll-pb":F()}],"scroll-pl":[{"scroll-pl":F()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",U]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Pe,De,an]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Rv=wv(zv);function _e(...e){return Rv(Rr(e))}const Gr=O.createContext(null);function Dv(){const e=O.useContext(Gr);if(!e)throw new Error("useContextMenu must be used inside <ContextMenuHost>");return e}const At=8;function Fv({children:e}){const[t,n]=O.useState({open:!1,x:0,y:0,items:[]}),[o,r]=O.useState(null),s=O.useRef(null),i=O.useCallback(()=>{n(u=>u.open?{...u,open:!1}:u)},[]),a=O.useCallback((u,d,m)=>{r(null),n({open:!0,x:u,y:d,items:m})},[]),l=O.useMemo(()=>({open:a,close:i}),[a,i]);return O.useLayoutEffect(()=>{if(!t.open||!s.current)return;const u=s.current.getBoundingClientRect();let d=t.x,m=t.y;d+u.width>window.innerWidth-At&&(d=Math.max(At,t.x-u.width)),m+u.height>window.innerHeight-At&&(m=Math.max(At,t.y-u.height)),r({left:d,top:m})},[t]),O.useEffect(()=>{if(!t.open)return;const u=p=>{s.current&&!s.current.contains(p.target)&&i()},d=p=>{p.key==="Escape"&&(p.preventDefault(),i())},m=()=>i(),f=()=>i();return document.addEventListener("pointerdown",u,!0),document.addEventListener("keydown",d,!0),window.addEventListener("wheel",m,{passive:!0}),window.addEventListener("blur",f),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("keydown",d,!0),window.removeEventListener("wheel",m),window.removeEventListener("blur",f)}},[t.open,i]),c.jsxs(Gr.Provider,{value:l,children:[e,t.open&&c.jsx("div",{ref:s,role:"menu","aria-orientation":"vertical",className:"ole-glass fixed z-50 min-w-[200px] rounded-md border border-border p-1 text-sm shadow-md",style:{left:(o==null?void 0:o.left)??t.x,top:(o==null?void 0:o.top)??t.y,visibility:o?"visible":"hidden"},onContextMenu:u=>u.preventDefault(),children:t.items.map((u,d)=>{if(u.type==="separator")return c.jsx("div",{role:"separator",className:"my-1 h-px bg-border"},`sep-${d}`);const m=u.icon;return c.jsxs("button",{type:"button",role:"menuitem",disabled:u.disabled,className:_e("flex w-full items-center justify-between gap-3 rounded-sm px-2 py-1.5 text-left","hover:bg-accent hover:text-accent-foreground","focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-none",u.destructive&&"text-destructive hover:bg-destructive/10 hover:text-destructive",u.disabled&&"pointer-events-none text-muted-foreground opacity-60"),onClick:()=>{i(),u.onSelect()},children:[c.jsxs("span",{className:"flex items-center gap-2",children:[m?c.jsx(m,{className:"size-4"}):null,c.jsx("span",{children:u.label})]}),u.shortcut?c.jsx("span",{className:"text-xs text-muted-foreground",children:u.shortcut}):null]},`${u.label}-${d}`)})})]})}const vo=e=>{let t;const n=new Set,o=(u,d)=>{const m=typeof u=="function"?u(t):u;if(!Object.is(m,t)){const f=t;t=d??(typeof m!="object"||m===null)?m:Object.assign({},t,m),n.forEach(p=>p(t,f))}},r=()=>t,a={setState:o,getState:r,getInitialState:()=>l,subscribe:u=>(n.add(u),()=>n.delete(u))},l=t=e(o,r,a);return a},Hv=(e=>e?vo(e):vo),Wv=e=>e;function qv(e,t=Wv){const n=O.useSyncExternalStore(e.subscribe,O.useCallback(()=>t(e.getState()),[e,t]),O.useCallback(()=>t(e.getInitialState()),[e,t]));return O.useDebugValue(n),n}const ko=e=>{const t=Hv(e),n=o=>qv(t,o);return Object.assign(n,t),n},Xt=(e=>e?ko(e):ko),_o={zh:{"common.unnamed":"未命名","common.close":"关闭","common.yes":"是","common.no":"否","topbar.theme.toLight":"切换到亮色","topbar.theme.toDark":"切换到暗色","topbar.theme.currentDark":"当前:暗色主题","topbar.theme.currentLight":"当前:亮色主题","topbar.lang.toEnglish":"Switch to English","topbar.lang.toChinese":"切换到中文","topbar.lang.currentEnglish":"Current: English","topbar.lang.currentChinese":"当前:中文","topbar.export.label":"导出","topbar.export.tooltip":"SVG 矢量(可编辑)、PNG 位图(2× 高清)或 DXF(CAD)","topbar.export.pngFailed":"导出 PNG 失败:{err}","topbar.export.dxfFailed":"导出 DXF 失败:{err}","topbar.file.label":"文件","topbar.file.tooltip":"打开本地 .json 图、保存、或另存为","topbar.file.current":"当前:{name}","topbar.file.new":"新建","topbar.file.open":"打开…","topbar.file.save":"保存","topbar.file.saveAs":"另存为…","topbar.file.newConfirm":"新建会清空当前未保存的内容,是否继续?","topbar.file.openFailed":"打开失败:{err}","topbar.file.saveFailed":"保存失败:{err}","topbar.file.fileDescription":"OneLineEditor 图纸","outline.title":"大纲","outline.collapse":"折叠","outline.collapseAria":"折叠大纲","outline.empty":"(无设备 — 从元件库拖入开始)","props.title":"属性","props.node":"电气节点","props.wire":"连线","props.bus":"母线","props.junction":"接线柱","props.junctionPos":"位置","props.nSelected":"{n} 选中","props.empty":"未选中","props.multi":"已选中 {n} 个元件","props.name":"名称","props.note":"备注","props.nodeNotFound":"电气节点 {id} 不存在","props.wireNotFound":"连线 {id} 不存在","props.nodeStats":"{terminals} 个端子 · {elements} 个元件","props.selectElement":"选中 {label}","props.selectWholeNode":"选中整个电气节点","view.zoomOut":"缩小","view.zoomOutHint":"按预设档位缩小;也可滚轮 ↓ 或 ⌘−","view.reset":"重置到 100%","view.current":"当前 {z}%","view.zoomIn":"放大","view.zoomInHint":"按预设档位放大;也可滚轮 ↑ 或 ⌘+","view.fit":"适配视图","view.fitHint":"自动缩放并居中所有元件","view.gridHide":"隐藏网格","view.gridShow":"显示网格","view.gridHotkey":"G","view.gridHideHint":"同时关闭对齐吸附(拖动可自由放置)","view.gridShowHint":"同时开启对齐吸附(拖动会贴到 10px 网格)","view.gridHideAria":"隐藏网格并关闭吸附","view.gridShowAria":"显示网格并开启吸附","view.label":"标签","view.labelOff":"关闭标签","view.labelId":"仅显示 ID","view.labelAll":"ID + 参数","view.labelHint":"点击循环切换:关闭 → 仅 ID → ID + 参数","library.title":"元件库","library.empty":"没有匹配的元件","library.searchPlaceholder":"搜索元件…","library.searchAria":"搜索元件","library.clearSearch":"清除搜索","library.itemHint":"单击进入放置模式或拖到画布","tool.select":"选择","tool.selectHint":"点选元件,框选多个,或右键打开菜单","tool.pan":"平移","tool.panHint":"拖动画布;空格键可临时切换","tool.wire":"连线","tool.wireHint":"从端子/母线/接线柱拖出;拖到空白处会自动新建接线柱,拖到已有连线上可打接点","tool.bus":"母线","tool.busHint":"画布上拖动一段母线,按下定起点、释放定终点","tool.junction":"接线柱","tool.junctionHint":"点击画布放置一个接线柱(接点),连线可自由连到它","tool.place":"元件","tool.placeHint":"点击画布放置;或从端子/母线拖出,同时放置并连接","tool.text":"文字","tool.textHint":"点击画布放置一段文字注释;双击文字可重新编辑","mode.selectWithSel":"拖动元件移动 · 拖端子连线 · 右键打开菜单","mode.selectEmpty":"点选元件 · 拖动移动 · 框选多个 · 右键打开菜单","mode.pan":"拖动画布 · 滚轮缩放 · 按住空格可在其他工具下临时平移","mode.wireDragging":"拖到端子/母线/接线柱释放;空白处释放会新建接线柱","mode.wireInit":"从任意连接点或空白处按下,拖到目标释放;空白处会新建接线柱","mode.busDragging":"拖动决定母线方向,释放定终点","mode.busInit":"在画布按下定起点,拖动后释放定终点","mode.junction":"点击画布放置一个接线柱","mode.placeNoKind":"从左侧元件库选择一种元件","mode.placeFromTerm":"拖到目标位置释放,新元件将连接到起点端子","mode.placeNormal":"点击空白放置;或从已有端子 / 母线拖出,同时放置并连接","mode.text":"点击画布放置文字;双击已有文字可编辑;选中后可拖动 / 删除","mode.escSelect":"Esc 清除选择","mode.escOther":"右键 / Esc 取消","tool.placeNoKindTooltip":"从左侧元件库选择一个元件后点击画布放置","tool.undo":"撤销","tool.undoHint":"撤销上一次编辑(移动 / 旋转 / 删除等)","tool.redo":"重做","tool.redoHint":"重做被撤销的操作","layout.label":"布局","layout.hint":"自动排版整个图或仅选中范围,并填补空缺","layout.allAuto":"重新自动布局","layout.selAuto":"重新自动布局选区","layout.allFill":"填补未排版位置","layout.selFill":"填补未排版选区","tool.more":"更多","tool.moreHint":"撤销 / 重做 / 布局","view.menu":"视图","view.menuHint":"缩放、适配、网格","ctx.ariaNode":"选中节点操作","ctx.ariaWire":"选中连线操作","ctx.ariaElement":"选中元件操作","ctx.rotate":"旋转 90°","ctx.rotateHint":"顺时针旋转选中元件,连线随端子自动重排","ctx.mirror":"水平镜像","ctx.mirrorTitle":"镜像","ctx.mirrorHint":"左右翻转选中元件","ctx.delete":"删除","ctx.deleteHintNode":"断开此电气节点上的所有连接(保留元件)","ctx.deleteHintWire":"移除这一根连线(其它同节点连线保留)","ctx.deleteHintElement":"移除选中元件及其连接的连线","ctx.resetWirePath":"恢复自动走线","ctx.resetWirePathHint":"清除手动调整的拐点,让连线回到自动路由","menu.undo":"撤销","menu.redo":"重做","menu.cut":"剪切","menu.copy":"复制","menu.paste":"粘贴","menu.rotate":"旋转 90°","menu.mirror":"镜像","menu.selectAll":"全选","menu.disconnect":"断开此连线","menu.delete":"删除","io.parseFailed":"JSON 解析失败:{err}","io.notObject":"文件不是 JSON 对象","io.versionMismatch":'版本不兼容:期望 "1",实际 {actual}',"io.elementsMissing":"elements 字段缺失或不是数组","compile.duplicateId":'元件 ID 重复:"{id}"',"compile.unknownKind":'未知元件类型 kind="{kind}"',"compile.invalidTermRef":'非法端子引用 "{ref}"',"compile.elementMissing":'引用了不存在的元件 "{id}"',"compile.missingPin":'元件 "{id}" (kind={kind}) 没有引脚 "{pin}",可用引脚: {available}',"compile.singleTerminal":"节点只包含一个端子,已忽略","compile.layoutMissingElement":'layout 键 "{id}" 引用了不存在的元件',"compile.elementUnconnected":'元件 "{id}" 没有任何连接',"cat.busbar":"母线 / 接线","cat.switching":"开关","cat.protection":"保护","cat.motor-control":"电机控制","cat.transformer":"变压器","cat.instrument-transformer":"互感器","cat.measurement":"测量仪表","cat.source":"电源","cat.load":"负荷","cat.storage":"储能","cat.compensation":"无功补偿","cat.grounding":"中性点接地","cat.renewable":"新能源 / 电力电子","onboard.title":"上手三步","onboard.step1.title":"画母线","onboard.step1.body":"选择 母线 工具(B),在画布上按下拖动","onboard.step2.title":"从母线拖出元件","onboard.step2.body":"切到 元件(P)选一种,按住母线拖到目标位置 — 自动连接","onboard.step3.title":"继续串接","onboard.step3.body":"从任意端子拖出,落到目标即与该端子相连","onboard.dismiss":"知道了"},en:{"common.unnamed":"Untitled","common.close":"Close","common.yes":"Yes","common.no":"No","topbar.theme.toLight":"Switch to light","topbar.theme.toDark":"Switch to dark","topbar.theme.currentDark":"Current: dark theme","topbar.theme.currentLight":"Current: light theme","topbar.lang.toEnglish":"Switch to English","topbar.lang.toChinese":"切换到中文","topbar.lang.currentEnglish":"Current: English","topbar.lang.currentChinese":"Current: Chinese","topbar.export.label":"Export","topbar.export.tooltip":"SVG vector (editable), PNG bitmap (2× HiDPI), or DXF (CAD)","topbar.export.pngFailed":"PNG export failed: {err}","topbar.export.dxfFailed":"DXF export failed: {err}","topbar.file.label":"File","topbar.file.tooltip":"Open a local .json diagram, save, or save as","topbar.file.current":"Current: {name}","topbar.file.new":"New","topbar.file.open":"Open…","topbar.file.save":"Save","topbar.file.saveAs":"Save as…","topbar.file.newConfirm":"New will discard any unsaved changes. Continue?","topbar.file.openFailed":"Open failed: {err}","topbar.file.saveFailed":"Save failed: {err}","topbar.file.fileDescription":"OneLineEditor diagram","outline.title":"Outline","outline.collapse":"Collapse","outline.collapseAria":"Collapse outline","outline.empty":"(No elements — drag from the library to start)","props.title":"Properties","props.node":"Electrical node","props.wire":"Wire","props.bus":"Bus","props.junction":"Junction","props.junctionPos":"Position","props.nSelected":"{n} selected","props.empty":"Nothing selected","props.multi":"{n} elements selected","props.name":"Name","props.note":"Note","props.nodeNotFound":"Electrical node {id} not found","props.wireNotFound":"Wire {id} not found","props.nodeStats":"{terminals} terminals · {elements} elements","props.selectElement":"Select {label}","props.selectWholeNode":"Select whole electrical node","view.zoomOut":"Zoom out","view.zoomOutHint":"Step zoom out; also wheel ↓ or ⌘−","view.reset":"Reset to 100%","view.current":"Current {z}%","view.zoomIn":"Zoom in","view.zoomInHint":"Step zoom in; also wheel ↑ or ⌘+","view.fit":"Fit view","view.fitHint":"Auto-zoom and center all elements","view.gridHide":"Hide grid","view.gridShow":"Show grid","view.gridHotkey":"G","view.gridHideHint":"Also disables snap-to-grid (free placement)","view.gridShowHint":"Also enables snap-to-grid (snaps to 10px on drag)","view.gridHideAria":"Hide grid and disable snap","view.gridShowAria":"Show grid and enable snap","view.label":"Labels","view.labelOff":"Hide labels","view.labelId":"ID only","view.labelAll":"ID + params","view.labelHint":"Cycle: off → ID → ID + params","library.title":"Library","library.empty":"No matching elements","library.searchPlaceholder":"Search elements…","library.searchAria":"Search elements","library.clearSearch":"Clear search","library.itemHint":"Click to enter place mode, or drag onto the canvas","tool.select":"Select","tool.selectHint":"Click to pick, marquee for multiple, right-click for menu","tool.pan":"Pan","tool.panHint":"Drag the canvas; Space toggles temporarily","tool.wire":"Wire","tool.wireHint":"Drag from a pin/bus/junction; into empty space drops a junction, onto a wire taps it","tool.bus":"Busbar","tool.busHint":"Drag on the canvas — press to set start, release to set end","tool.junction":"Junction","tool.junctionHint":"Click the canvas to drop a junction (node); wires attach to it freely","tool.place":"Place","tool.placeHint":"Click to place; or drag from a terminal/bus to place and connect","tool.text":"Text","tool.textHint":"Click the canvas to drop a text note; double-click an existing one to edit","mode.selectWithSel":"Drag elements · drag terminals to wire · right-click for menu","mode.selectEmpty":"Click to pick · drag to move · marquee for multiple · right-click for menu","mode.pan":"Drag the canvas · scroll to zoom · hold Space to pan in any tool","mode.wireDragging":"Release on a pin/bus/junction; release in empty space drops a junction","mode.wireInit":"Press on any connection point or empty space, drag to a target and release","mode.busDragging":"Drag sets bus direction; release sets the end","mode.busInit":"Press on the canvas to set start, drag, release to set end","mode.junction":"Click the canvas to drop a junction","mode.placeNoKind":"Pick an element kind from the library on the left","mode.placeFromTerm":"Release at the target — the new element will connect back to the source terminal","mode.placeNormal":"Click empty space to place; or drag from a terminal / bus to place and connect","mode.text":"Click to drop text · double-click to edit · drag selected to move · Del to remove","mode.escSelect":"Esc clears selection","mode.escOther":"Right-click / Esc to cancel","tool.placeNoKindTooltip":"Pick a kind in the library on the left, then click the canvas","tool.undo":"Undo","tool.undoHint":"Undo the last edit (move / rotate / delete, etc.)","tool.redo":"Redo","tool.redoHint":"Redo the last undone edit","layout.label":"Layout","layout.hint":"Auto-layout the whole diagram or just the selection, fill gaps","layout.allAuto":"Auto-layout all","layout.selAuto":"Auto-layout selection","layout.allFill":"Fill unplaced","layout.selFill":"Fill unplaced in selection","tool.more":"More","tool.moreHint":"Undo / redo / layout","view.menu":"View","view.menuHint":"Zoom, fit, grid","ctx.ariaNode":"Node actions","ctx.ariaWire":"Wire actions","ctx.ariaElement":"Element actions","ctx.rotate":"Rotate 90°","ctx.rotateHint":"Rotate selection clockwise; wires re-route through new terminals","ctx.mirror":"Mirror horizontally","ctx.mirrorTitle":"Mirror","ctx.mirrorHint":"Flip selection left-right","ctx.delete":"Delete","ctx.deleteHintNode":"Disconnect every wire on this node (elements stay)","ctx.deleteHintWire":"Remove only this wire (siblings on the same node stay)","ctx.deleteHintElement":"Remove the selection and its wires","ctx.resetWirePath":"Reset to auto-route","ctx.resetWirePathHint":"Drop manual corners and let the router re-draw this wire","menu.undo":"Undo","menu.redo":"Redo","menu.cut":"Cut","menu.copy":"Copy","menu.paste":"Paste","menu.rotate":"Rotate 90°","menu.mirror":"Mirror","menu.selectAll":"Select all","menu.disconnect":"Disconnect this wire","menu.delete":"Delete","io.parseFailed":"JSON parse failed: {err}","io.notObject":"File is not a JSON object","io.versionMismatch":'Version mismatch: expected "1", got {actual}',"io.elementsMissing":"`elements` is missing or not an array","compile.duplicateId":'Duplicate element id: "{id}"',"compile.unknownKind":'Unknown element kind="{kind}"',"compile.invalidTermRef":'Invalid terminal reference "{ref}"',"compile.elementMissing":'Reference to unknown element "{id}"',"compile.missingPin":'Element "{id}" (kind={kind}) has no pin "{pin}"; available: {available}',"compile.singleTerminal":"Node has only one terminal — ignored","compile.layoutMissingElement":'layout key "{id}" references an unknown element',"compile.elementUnconnected":'Element "{id}" has no connections',"cat.busbar":"Busbar / wiring","cat.switching":"Switching","cat.protection":"Protection","cat.motor-control":"Motor control","cat.transformer":"Transformer","cat.instrument-transformer":"Instrument transformer","cat.measurement":"Measurement","cat.source":"Source","cat.load":"Load","cat.storage":"Storage","cat.compensation":"Compensation","cat.grounding":"Grounding","cat.renewable":"Renewables / power electronics","onboard.title":"Quick start","onboard.step1.title":"Draw a busbar","onboard.step1.body":"Pick the busbar tool (B), then press and drag on the canvas","onboard.step2.title":"Drag elements from the bus","onboard.step2.body":"Switch to Place (P), pick a kind, then drag from the bus — it auto-connects","onboard.step3.title":"Chain the next one","onboard.step3.body":"Drag from any terminal — the new element drops pre-connected","onboard.dismiss":"Got it"}},Xr="ole-locale";function Gv(){if(typeof window>"u")return"zh";try{const e=window.localStorage.getItem(Xr);if(e==="zh"||e==="en")return e}catch{}return typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language.toLowerCase().startsWith("zh")?"zh":"en":"zh"}function $o(e){try{window.localStorage.setItem(Xr,e)}catch{}}const Nt=Xt((e,t)=>({locale:Gv(),setLocale:n=>{$o(n),e({locale:n})},toggle:()=>{const n=t().locale==="zh"?"en":"zh";$o(n),e({locale:n})}}));function Kr(e,t){return t?e.replace(/\{(\w+)\}/g,(n,o)=>t[o]!==void 0?String(t[o]):`{${o}}`):e}function Yr(e,t){return _o[e][t]??_o.zh[t]??t}function we(e,t){return Kr(Yr(Nt.getState().locale,e),t)}function ne(){const e=Nt(t=>t.locale);return(t,n)=>Kr(Yr(e,t),n)}function Vr(e,t){let n;try{n=e()}catch{return}return{getItem:r=>{var s;const i=l=>l===null?null:JSON.parse(l,void 0),a=(s=n.getItem(r))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(r,s)=>n.setItem(r,JSON.stringify(s,void 0)),removeItem:r=>n.removeItem(r)}}const $n=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(o){return $n(o)(n)},catch(o){return this}}}catch(n){return{then(o){return this},catch(o){return $n(o)(n)}}}},Xv=(e,t)=>(n,o,r)=>{let s={storage:Vr(()=>window.localStorage),partialize:w=>w,version:0,merge:(w,E)=>({...E,...w}),...t},i=!1,a=0;const l=new Set,u=new Set;let d=s.storage;if(!d)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),n(...w)},o,r);const m=()=>{const w=s.partialize({...o()});return d.setItem(s.name,{state:w,version:s.version})},f=r.setState;r.setState=(w,E)=>(f(w,E),m());const p=e((...w)=>(n(...w),m()),o,r);r.getInitialState=()=>p;let h;const g=()=>{var w,E;if(!d)return;const k=++a;i=!1,l.forEach(S=>{var A;return S((A=o())!=null?A:p)});const x=((E=s.onRehydrateStorage)==null?void 0:E.call(s,(w=o())!=null?w:p))||void 0;return $n(d.getItem.bind(d))(s.name).then(S=>{if(S)if(typeof S.version=="number"&&S.version!==s.version){if(s.migrate){const A=s.migrate(S.state,S.version);return A instanceof Promise?A.then(B=>[!0,B]):[!0,A]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,S.state];return[!1,void 0]}).then(S=>{var A;if(k!==a)return;const[B,q]=S;if(h=s.merge(q,(A=o())!=null?A:p),n(h,!0),B)return m()}).then(()=>{k===a&&(x==null||x(o(),void 0),h=o(),i=!0,u.forEach(S=>S(h)))}).catch(S=>{k===a&&(x==null||x(void 0,S))})};return r.persist={setOptions:w=>{s={...s,...w},w.storage&&(d=w.storage)},clearStorage:()=>{d==null||d.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>g(),hasHydrated:()=>i,onHydrate:w=>(l.add(w),()=>{l.delete(w)}),onFinishHydration:w=>(u.add(w),()=>{u.delete(w)})},s.skipHydration||g(),h||p},Kv=Xv,Oe=.5;function Ur(e){if(e.length<2)return e.map(r=>[r[0],r[1]]);const t=[[e[0][0],e[0][1]]];for(let r=1;r<e.length;r++){const s=t[t.length-1];Math.abs(s[0]-e[r][0])<Oe&&Math.abs(s[1]-e[r][1])<Oe||t.push([e[r][0],e[r][1]])}if(t.length<2)return t;const n=[t[0]];for(let r=1;r<t.length;r++){const s=n[n.length-1],i=t[r],a=Math.abs(s[0]-i[0]),l=Math.abs(s[1]-i[1]);if(a>Oe&&l>Oe){const d=(n.length>=2?Math.abs(n[n.length-2][1]-s[1])<Oe?"h":"v":null)==="h"?[i[0],s[1]]:[s[0],i[1]];n.push(d)}n.push(i)}const o=[n[0]];for(let r=1;r<n.length-1;r++){const s=o[o.length-1],i=n[r],a=n[r+1],l=Math.abs(s[0]-i[0])<Oe&&Math.abs(i[0]-a[0])<Oe,u=Math.abs(s[1]-i[1])<Oe&&Math.abs(i[1]-a[1])<Oe;l||u||o.push(i)}return o.push(n[n.length-1]),o}function Jr(){return{elements:new Map,buses:new Map,junctions:new Map,terminals:new Map,nodes:new Map,layout:new Map,wireRenders:new Map,terminalToNode:new Map,elementToTerminals:new Map,diagnostics:[]}}function Zr(e){return{at:(e==null?void 0:e.at)??[0,0],rot:(e==null?void 0:e.rot)??0,mirror:(e==null?void 0:e.mirror)??!1}}function Sn(e){return e===90||e===270?"y":"x"}function Ae(e,t){let[n,o]=e;switch(t.mirror&&(n=-n),t.rot){case 0:break;case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}const Yv={n:"e",e:"s",s:"w",w:"n"},Vv={n:"n",s:"s",e:"w",w:"e"};function _t(e,t){let n=t.mirror?Vv[e]:e;const o=t.rot/90|0;for(let r=0;r<o;r++)n=Yv[n];return n}function jn(e){switch(e){case"n":return[0,-1];case"s":return[0,1];case"e":return[1,0];case"w":return[-1,0]}}class Qr{constructor(){ht(this,"parent",new Map);ht(this,"rank",new Map)}add(t){this.parent.has(t)||(this.parent.set(t,t),this.rank.set(t,0))}find(t){this.add(t);let n=t;for(;this.parent.get(n)!==n;){const o=this.parent.get(n),r=this.parent.get(o);this.parent.set(n,r),n=r}return n}union(t,n){const o=this.find(t),r=this.find(n);if(o===r)return;const s=this.rank.get(o),i=this.rank.get(r);s<i?this.parent.set(o,r):s>i?this.parent.set(r,o):(this.parent.set(r,o),this.rank.set(o,s+1))}groups(){const t=new Map;for(const n of this.parent.keys()){const o=this.find(n),r=t.get(o);r?r.push(n):t.set(o,[n])}return t}}const So=["n","e","s","w"],jo={n:"s",s:"n",e:"w",w:"e"};function Eo(e,t){const n=So.indexOf(e),r=((So.indexOf(t)-n)%4+4)%4;return[0,90,180,270][r]}const No=320,ln=220,yt=260,cn=720,xt=30,Mo=30,He=80,To=10,Uv=60,Jv=520,Zv=80,Qv=80,Ao=8,Co=new Set(["source","renewable"]);function e2(e){var uo,mo,fo,ho,po,go;const{elements:t,buses:n,wires:o,library:r,userLayout:s,userBusLayout:i}=e,a=new Map(s),l=new Map(i),u=new Set(s.keys()),d=new Set(i.keys()),m=new Map;for(const y of t)m.set(y.id,y);const f=new Map;for(const y of n)f.set(y.id,y);const p=y=>{const v=m.get(y);if(v)return r.get(v.kind)},h=new Set(n.map(y=>y.id)),g=y=>h.has(y),w=new Qr;for(const y of o)w.add(y.ends[0]),w.add(y.ends[1]),w.union(y.ends[0],y.ends[1]);for(const y of t){const v=r.get(y.kind);if(v)for(const $ of v.terminals)w.add(`${y.id}.${$.id}`)}for(const y of n)w.add(y.id);const E=[];for(const[,y]of w.groups())y.length>=2&&E.push(y);const k=new Map;for(const y of E)for(const v of y)k.set(v,[y]);const x=new Map;for(const y of E){const v=y.filter(g);if(v.length!==0)for(const $ of v){const j=y.filter(_=>_!==$),N=x.get($)??[];N.push(...j),x.set($,N)}}const S=new Map;for(const y of E){const v=y.filter(g);if(v.length!==0)for(const $ of y){if(g($))continue;const j=$.indexOf(".");if(j<0)continue;const N=$.slice(0,j),_=$.slice(j+1),M=S.get(N)??[];for(const L of v)M.some(C=>C.busId===L&&C.pin===_)||M.push({busId:L,pin:_});S.set(N,M)}}const A=[],B=new Set;for(const[y,v]of S)if(new Set(v.map(j=>j.busId)).size>=2){const j=((mo=r.get(((uo=m.get(y))==null?void 0:uo.kind)??""))==null?void 0:mo.category)==="transformer"?"vertical":"horizontal";A.push({elementId:y,attachments:v,orientation:j}),j==="vertical"&&B.add(y)}const q=new Map,V=(y,v)=>{y!==v&&(q.has(y)||q.set(y,new Set),q.has(v)||q.set(v,new Set),q.get(y).add(v),q.get(v).add(y))};for(const y of o)V(y.ends[0],y.ends[1]);for(const y of t){const v=r.get(y.kind);if(!v||v.terminals.length<2)continue;const $=v.terminals.map(j=>`${y.id}.${j.id}`);for(let j=0;j<$.length;j++)for(let N=j+1;N<$.length;N++)V($[j],$[N])}for(const y of t){if(B.has(y.id))continue;const v=r.get(y.kind);if(!v||v.category!=="transformer"||v.terminals.length<2)continue;const $=v.terminals.map(_=>`${y.id}.${_.id}`),j=new Map;for(const _ of $){const M=_.slice(y.id.length+1);j.set(M,new Set);const L=new Set($.filter(P=>P!==_)),C=new Set([_]),I=[_];for(;I.length>0;){const P=I.shift();if(g(P)){j.get(M).add(P);continue}const T=q.get(P);if(T)for(const z of T)C.has(z)||L.has(z)||(C.add(z),I.push(z))}}const N=new Set;for(const _ of j.values())for(const M of _)N.add(M);if(N.size>=2){const _=[];for(const[M,L]of j)for(const C of L)_.push({busId:C,pin:M});A.push({elementId:y.id,attachments:_,orientation:"vertical"}),B.add(y.id)}}const re=(y,v)=>{var L;const $=p(v),j=$?$.terminals.map(C=>`${v}.${C.id}`):[],N=y,_=new Set([N,...j]),M=[N];for(;M.length>0;){const C=M.shift(),I=C.indexOf(".");if(I>0){const T=C.slice(0,I),z=m.get(T);if(z){const D=(L=r.get(z.kind))==null?void 0:L.category;if(D&&Co.has(D))return!0}}const P=q.get(C);if(P)for(const T of P)_.has(T)||(_.add(T),M.push(T))}return!1};for(const y of A){if(y.orientation!=="horizontal")continue;const v=new Set(y.attachments.map(j=>j.busId));let $=0;for(const j of v)re(j,y.elementId)&&$++;$===1&&(y.orientation="vertical",B.add(y.elementId))}for(const y of t){if(B.has(y.id)||y.kind!=="breaker")continue;const v=r.get(y.kind);if(!v||v.terminals.length!==2)continue;const $=v.terminals.map(_=>`${y.id}.${_.id}`),j=new Map;for(const _ of $){const M=_.slice(y.id.length+1),L=new Set($.filter(P=>P!==_)),C=new Set([_]),I=[_];for(;I.length>0;){const P=I.shift();if(g(P)){j.set(M,P);break}const T=q.get(P);if(T)for(const z of T){if(C.has(z)||L.has(z))continue;const D=z.indexOf(".");if(D>0){const H=z.slice(0,D);if(H!==y.id){const G=m.get(H),K=G?r.get(G.kind):void 0;if((K==null?void 0:K.category)==="transformer")continue}}C.add(z),I.push(z)}}}if(new Set(j.values()).size>=2){const _=[];for(const[M,L]of j)_.push({busId:L,pin:M});A.push({elementId:y.id,attachments:_,orientation:"horizontal"})}}const se=new Map;for(const y of n)se.set(y.id,new Map);for(const y of A){const v=Array.from(new Set(y.attachments.map($=>$.busId)));for(const $ of v)for(const j of v)$!==j&&((fo=se.get($))==null||fo.set(j,y))}const R=y=>{var $;const v=($=r.get(y))==null?void 0:$.category;return v?Co.has(v):!1},F=[];for(const y of n){const v=x.get(y.id);if(v)for(const $ of v){if(g($))continue;const j=$.indexOf(".");if(j<0)continue;const N=$.slice(0,j),_=m.get(N);if(_&&R(_.kind)){F.push(y.id);break}}}F.length===0&&n.length>0&&F.push(n[0].id);const Z=new Map;for(const y of F)Z.set(y,0);{const y=[...F];for(;y.length>0;){const v=y.shift(),$=Z.get(v),j=se.get(v);if(j)for(const[N,_]of j){if(Z.has(N))continue;const M=_.orientation==="horizontal"?$:$+1;Z.set(N,M),y.push(N)}}}for(const y of n){if(Z.has(y.id))continue;const v=Z.size===0?-1:Math.max(...Array.from(Z.values()));Z.set(y.id,v+1)}const ie=new Map;for(const y of n){const v=Z.get(y.id),$=ie.get(v)??[];$.push(y.id),ie.set(v,$)}const le=[...ie.keys()].sort((y,v)=>y-v),Q=(y,v,$)=>{const j=`${y.elementId}.${$}`,N=v,_=p(y.elementId),M=new Set;if(_)for(const T of _.terminals)T.id!==$&&M.add(`${y.elementId}.${T.id}`);const L=new Set([j]),C=[{ref:j,dist:0}],I=new Map,P=(T,z,D,H)=>{L.add(T),I.set(T,z),C.push({ref:T,dist:H+D})};for(;C.length>0;){const{ref:T,dist:z}=C.shift();if(T===N){const K=I.get(N);let ce;if(K){const J=K.indexOf(".");if(J>0){const W=K.slice(0,J);W!==y.elementId&&(ce=W)}}return{extent:z,head:ce}}const D=T.indexOf(".");if(D<0)continue;const H=T.slice(0,D),G=T.slice(D+1);if(!g(H)&&!B.has(H)){const K=p(H),ce=K==null?void 0:K.terminals.find(J=>J.id===G);if(K&&ce)for(const J of K.terminals){if(J.id===G)continue;const W=`${H}.${J.id}`;L.has(W)||M.has(W)||P(W,T,Math.abs(ce.y-J.y),z)}}for(const K of k.get(T)??[])for(const ce of K){if(ce===T||L.has(ce)||M.has(ce))continue;const J=g(T)||g(ce);P(ce,T,J?Mo:xt,z)}}return{extent:0}},he=(y,v)=>{var T,z,D;const $=(T=se.get(y))==null?void 0:T.get(v);if(!$||$.orientation==="horizontal")return yt;const j=p($.elementId);if(!j)return yt;const N=(z=$.attachments.find(H=>H.busId===y))==null?void 0:z.pin,_=(D=$.attachments.find(H=>H.busId===v))==null?void 0:D.pin;if(!N||!_)return yt;const M=j.terminals.find(H=>H.id===N),L=j.terminals.find(H=>H.id===_);if(!M||!L)return yt;const C=Math.abs(L.y-M.y),I=Q($,y,N).extent,P=Q($,v,_).extent;return I+C+P},pe=new Map;for(const y of A){if(y.orientation!=="vertical")continue;const v=y.attachments.slice().sort((L,C)=>(Z.get(L.busId)??0)-(Z.get(C.busId)??0));if(v.length<2)continue;const $=v[0].busId,j=v[1].busId,N=v[0].pin,M=Q(y,$,N).head??y.elementId;pe.set(M,{lowerBusId:j})}const ge=30,Ie=y=>{const v=p(y);return Math.max((v==null?void 0:v.width)??He,He)},$e=2,Qn=(y,v,$,j=0)=>{const N=p(v);let _=Ie(v);if(N&&!$.has(v)&&j<$e){$.add(v);let M=0;for(const L of N.terminals){const C=`${v}.${L.id}`;if(C!==y)for(const I of k.get(C)??[]){const P=new Set;let T=!1;for(const D of I){if(D===C)continue;if(g(D)){T=!0;continue}const H=D.indexOf(".");if(H<0)continue;const G=D.slice(0,H);G===v||$.has(G)||B.has(G)||P.add(G)}if(T||P.size===0)continue;let z=0;for(const D of P){const H=[...I].find(G=>G.indexOf(".")>0&&G.slice(0,G.indexOf("."))===D);z+=(H?Qn(H,D,$,j+1):Ie(D))+ge}M=Math.max(M,z-ge)}}$.delete(v),_=Math.max(_,M)}return _},ut=320,Qe=new Map,eo=(y,v)=>{if(!B.has(y))return!1;const $=A.find(M=>M.elementId===y),j=$==null?void 0:$.attachments.find(M=>M.busId!==v);if(!j)return!1;const N=Z.get(v)??0;return(Z.get(j.busId)??0)<N},mt=(y,v,$)=>{const j=pe.get(y);if(j){const _=Qe.get(j.lowerBusId);if(_!==void 0)return Math.max(v,_+He)}let N=0;return $&&(N=Qn($,y,new Set)),Math.max(v,He,N)},to=(y,v)=>{if(Qe.has(y))return Qe.get(y);if(v.has(y))return ut;v.add(y);const $=x.get(y)??[];let j=0,N=0;for(const M of $){if(g(M))continue;const L=M.indexOf(".");if(L<0)continue;const C=M.slice(0,L),I=M.slice(L+1);if(eo(C,y))continue;const P=p(C);if(!P)continue;const T=P.terminals.find(H=>H.id===I);if(!T)continue;const z=pe.get(C);z&&to(z.lowerBusId,v);const D=mt(C,P.width,`${C}.${I}`);T.y>0?j+=D:N+=D}const _=Math.max(ut,Math.max(j,N)+He);return Qe.set(y,_),v.delete(y),_};for(const y of n)to(y.id,new Set);const Re=new Map,Aw=(y,v,$)=>{const j=p(v);if(!j)return;const N=`${v}.${$}`,_=j.terminals.filter(C=>C.id!==$).map(C=>`${v}.${C.id}`);if(_.length===0)return;const M=new Set([N,..._]),L=_.slice();for(;L.length>0;){const C=L.shift();if(g(C)&&C!==y){const P=l.get(C);return P?P.at[0]:void 0}for(const P of k.get(C)??[])for(const T of P)T===C||M.has(T)||(M.add(T),L.push(T));const I=C.indexOf(".");if(I>0){const P=C.slice(0,I);if(!g(P)){const T=p(P);if(T)for(const z of T.terminals){const D=`${P}.${z.id}`;M.has(D)||(M.add(D),L.push(D))}}}}},Cw=y=>{const v=x.get(y);if(!v||v.length===0)return;const $=l.get(y);if(!$)return;const j=v.flatMap(T=>{if(g(T))return[];const z=T.indexOf(".");if(z<0)return[];const D=T.slice(0,z),H=T.slice(z+1);if(a.has(D))return[];if(eo(D,y))return[];const G=p(D);if(!G)return[];const K=G.terminals.find(ce=>ce.id===H);return K?[{elId:D,lib:G,localTerm:K,isLinker:B.has(D),busFacingRef:`${D}.${H}`}]:[]});if(j.length===0)return;const N=[],_=[];for(const T of j)T.localTerm.y>0?N.push(T):_.push(T);const M=T=>T.reduce((z,D)=>z+mt(D.elId,D.lib.width,D.busFacingRef),0),L=Math.max(M(N),M(_))+He,C=Math.max($.span,L);C!==$.span&&!d.has(y)&&l.set(y,{...$,span:C});const I=l.get(y),P=(T,z)=>{if(T.length===0)return;const D=new Map;for(const X of T){const Y=Aw(y,X.elId,X.localTerm.id);Y!==void 0&&D.set(X.elId,Y)}T.sort((X,Y)=>{const ue=D.get(X.elId)??I.at[0],ye=D.get(Y.elId)??I.at[0];if(ue!==ye)return ue-ye;const xe=mt(X.elId,X.lib.width,X.busFacingRef);return mt(Y.elId,Y.lib.width,Y.busFacingRef)-xe});const H=T.map(X=>mt(X.elId,X.lib.width,X.busFacingRef)),G=H.reduce((X,Y)=>X+Y,0),K=Math.max(C,G),ce=(K-G)/(T.length+1);let J=I.at[0]-K/2+ce;const W=I.at[1]+z*Mo;for(let X=0;X<T.length;X++){const Y=T[X],ue=H[X],ye=J+ue/2;Y.isLinker?Re.has(Y.elId)||Re.set(Y.elId,ye):a.set(Y.elId,{at:[fe(ye-Y.localTerm.x),fe(W-Y.localTerm.y)],rot:0,mirror:!1}),J+=ue+ce}};P(N,-1),P(_,1)},Iw=y=>{if(a.has(y.elementId)||y.orientation==="horizontal")return;const v=p(y.elementId);if(!v)return;const $=y.attachments.filter(J=>l.has(J.busId));if($.length<2)return;const j=$.slice().sort((J,W)=>(Z.get(J.busId)??0)-(Z.get(W.busId)??0)),N=j[0].busId,_=l.get(N),M=j[0].pin,L=j[j.length-1].pin,C=v.terminals.find(J=>J.id===M),I=v.terminals.find(J=>J.id===L);if(!C||!I)return;const P=C.y<=I.y?0:180,T=Z.get(N)??0,z=$.filter(J=>(Z.get(J.busId)??0)===T),D=[];let H=0;for(const J of z){const W=Q(y,J.busId,J.pin);H=Math.max(H,W.extent);const X=W.head?a.get(W.head):void 0;X?D.push(X.at[0]):Re.has(y.elementId)?D.push(Re.get(y.elementId)):D.push(l.get(J.busId).at[0])}let G;D.length>0?G=D.reduce((J,W)=>J+W,0)/D.length:Re.has(y.elementId)?G=Re.get(y.elementId):G=_.at[0];const K=_.at[1]+H,ce=P===0?[fe(G-C.x),fe(K-C.y)]:[fe(G+C.x),fe(K+C.y)];if(a.set(y.elementId,{at:ce,rot:P,mirror:!1}),z.length>1){const J=a.get(y.elementId),W=Ae([C.x,C.y],J),X=_t(C.orientation,J);Pw(`${y.elementId}.${M}`,W,X,G)}},Pw=(y,v,$,j)=>{const N=new Set([y]);let _=y,M=v,L=$;for(;;){const C=k.get(_)??[];let I,P=!1;for(const be of C){if(be.length>=3){P=!0;break}const Ye=be.find(sn=>sn!==_);if(!(!Ye||N.has(Ye))){if(g(Ye)){P=!0;break}I=Ye;break}}if(P||!I)break;const T=I.indexOf(".");if(T<0)break;const z=I.slice(0,T),D=I.slice(T+1);if(g(z)||B.has(z)||a.has(z))break;const H=p(z);if(!H)break;const G=H.terminals.find(be=>be.id===D);if(!G)break;const K=jn(L),ce=[M[0]+K[0]*xt,M[1]+K[1]*xt],J=jo[L],W=Eo(G.orientation,J),X=Ae([G.x,G.y],{at:[0,0],rot:W,mirror:!1}),Y=[fe(j-X[0]),fe(ce[1]-X[1])];a.set(z,{at:Y,rot:W,mirror:!1}),N.add(I);const ue=H.terminals.find(be=>be.id!==D);if(!ue)break;const ye=`${z}.${ue.id}`;N.add(ye);const xe={at:Y,rot:W,mirror:!1};M=Ae([ue.x,ue.y],xe),L=_t(ue.orientation,xe),_=ye}},Ow=y=>{if(a.has(y.elementId)||y.orientation!=="horizontal")return;const v=p(y.elementId);if(!v)return;const $=y.attachments.filter(z=>l.has(z.busId));if($.length<2)return;const j=$.map(z=>{const D=Q(y,z.busId,z.pin),H=D.head?a.get(D.head):void 0,G=H?H.at[0]:l.get(z.busId).at[0];return{att:z,x:G,extent:D.extent}});j.sort((z,D)=>z.x-D.x);const N=j[0],_=j[j.length-1],M=v.terminals.find(z=>z.id===N.att.pin),L=v.terminals.find(z=>z.id===_.att.pin);if(!M||!L)return;const C=M.y<=L.y?270:90,I=(N.x+_.x)/2,T=l.get(N.att.busId).at[1]+Math.max(N.extent,_.extent);a.set(y.elementId,{at:[fe(I),fe(T)],rot:C,mirror:!1})},no=100;let Tt=ln;for(let y=0;y<le.length;y++){const v=le[y],$=ie.get(v);let j;if(y===0)j=ln;else{const _=ie.get(le[y-1]);let M=0;for(const L of _)for(const C of $)(ho=se.get(L))!=null&&ho.get(C)&&(M=Math.max(M,he(L,C)));M===0&&(M=yt),j=Tt+M}Tt=j;let N=No;for(const _ of $){if(l.has(_)){Tt=Math.max(Tt,l.get(_).at[1]);continue}let M;if(y>0){const C=ie.get(le[y-1]),I=[];for(const P of C){const T=(po=se.get(P))==null?void 0:po.get(_);if(!T||T.orientation!=="vertical")continue;const z=(go=T.attachments.find(H=>H.busId===P))==null?void 0:go.pin;if(!z)continue;const D=Q(T,P,z);D.head&&a.has(D.head)?I.push(a.get(D.head).at[0]):Re.has(T.elementId)?I.push(Re.get(T.elementId)):I.push(l.get(P).at[0])}I.length>0&&(M=I.reduce((P,T)=>P+T,0)/I.length)}if(M===void 0){const C=Qe.get(_)??cn;M=N+C/2,N+=C+no}const L=Qe.get(_)??cn;l.set(_,{at:[fe(M),fe(j)],rot:0,span:L,axis:Sn(0)})}for(const _ of $)Cw(_);if(y>0)for(const _ of A)a.has(_.elementId)||!_.attachments.some(L=>$.includes(L.busId))||Iw(_);for(const _ of A)_.orientation!=="horizontal"||a.has(_.elementId)||!_.attachments.every(L=>$.includes(L.busId))||Ow(_)}if(n.length===0&&a.size<t.length){const y=N=>{const _=new Set,M=p(N);if(!M)return _;for(const L of M.terminals){const C=`${N}.${L.id}`;for(const I of k.get(C)??[])for(const P of I){if(P===C||g(P))continue;const T=P.indexOf(".");if(T<0)continue;const z=P.slice(0,T);z!==N&&_.add(z)}}return _},v=new Set,$=[];for(const N of t){if(v.has(N.id)||!p(N.id))continue;const _=[],M=[N.id];for(v.add(N.id);M.length>0;){const L=M.pop();_.push(L);for(const C of y(L))v.has(C)||(v.add(C),M.push(C))}_.length>=2&&$.push(_)}let j=No;for(const N of $){if(N.some(I=>a.has(I)))continue;N.sort((I,P)=>{var G,K;const T=R(((G=m.get(I))==null?void 0:G.kind)??"")?0:1,z=R(((K=m.get(P))==null?void 0:K.kind)??"")?0:1;if(T!==z)return T-z;const D=y(I).size,H=y(P).size;return D!==H?D-H:I.localeCompare(P)});const _=N[0],M=p(_);if(!M)continue;const L=M.terminals.slice().sort((I,P)=>P.y-I.y)[0],C=L?Ae([L.x,L.y],{at:[0,0],rot:0,mirror:!1}):[0,0];a.set(_,{at:[fe(j-C[0]),fe(ln-C[1])],rot:0,mirror:!1}),j+=Math.max(cn,N.length*He)+no}}const Bw=y=>{if(g(y))return l.has(y);const v=y.indexOf(".");return v<0?!1:a.has(y.slice(0,v))};let en=!0,Lw=t.length+4;for(;en&&Lw-- >0;){en=!1;for(const y of E){if(y.length<2)continue;const v=[],$=new Map;for(const W of y){if(g(W))continue;const X=W.indexOf(".");if(X<0)continue;const Y=W.slice(0,X),ue=W.slice(X+1);if(a.has(Y)){v.push(W);continue}if(B.has(Y)||$.has(Y))continue;const ye=p(Y);if(!ye)continue;const xe=ye.terminals.find(be=>be.id===ue);xe&&$.set(Y,{ref:W,elId:Y,lib:ye,localTerm:xe})}if($.size===0||v.length===0)continue;const j=[...$.values()],N=new Map;for(const W of j)for(const X of k.get(W.ref)??[])for(const Y of X){if(Y===W.ref||g(Y)||!Bw(Y))continue;const ue=Y;N.set(ue,(N.get(ue)??0)+1)}let _;if(N.size>0){let W=-1;for(const[X,Y]of N)(Y>W||Y===W&&(_===void 0||X<_))&&(W=Y,_=X)}if(_||(_=[...v].sort()[0]),!_)continue;const M=_.indexOf("."),L=_.slice(0,M),C=_.slice(M+1),I=p(L),P=a.get(L);if(!I||!P)continue;const T=I.terminals.find(W=>W.id===C);if(!T)continue;const z=Ae([T.x,T.y],P),D=_t(T.orientation,P),H=jn(D),G=[-H[1],H[0]];j.sort((W,X)=>W.elId.localeCompare(X.elId));const K=j.map(W=>Math.max(W.lib.width,He));let J=-K.reduce((W,X)=>W+X,0)/2;for(let W=0;W<j.length;W++){const X=j[W],Y=K[W],ue=J+Y/2;J+=Y;const ye=jo[D],xe=Eo(X.localTerm.orientation,ye),be=Ae([X.localTerm.x,X.localTerm.y],{at:[0,0],rot:xe,mirror:!1}),Ye=[z[0]+H[0]*xt+G[0]*ue,z[1]+H[1]*xt+G[1]*ue],sn=[fe(Ye[0]-be[0]),fe(Ye[1]-be[1])];a.set(X.elId,{at:sn,rot:xe,mirror:!1}),en=!0}}}const ft=y=>{const v=a.get(y),$=p(y);if(!v||!$)return null;const j=$.viewBox.split(/\s+/).map(Number);if(j.length<4||j.some(T=>Number.isNaN(T))){const T=$.width/2;return{min:v.at[0]-T,max:v.at[0]+T}}const[N,_,M,L]=j,C=[[N,_],[N+M,_],[N,_+L],[N+M,_+L]];let I=1/0,P=-1/0;for(const T of C){const z=Ae(T,v);I=Math.min(I,z[0]),P=Math.max(P,z[0])}return{min:I,max:P}},tn=y=>{const v=new Set,$=p(y);if(!$)return v;for(const j of $.terminals){const N=`${y}.${j.id}`;for(const _ of k.get(N)??[])for(const M of _){if(M===N||g(M))continue;const L=M.indexOf(".");if(L<0)continue;const C=M.slice(0,L);C!==y&&v.add(C)}}return v},oo=40,nn=y=>{const v=a.get(y),$=p(y);if(!v||!$)return null;const j=$.viewBox.split(/\s+/).map(Number);if(j.length<4||j.some(T=>Number.isNaN(T))){const T=$.height/2;return{min:v.at[1]-T,max:v.at[1]+T}}const[N,_,M,L]=j,C=[[N,_],[N+M,_],[N,_+L],[N+M,_+L]];let I=1/0,P=-1/0;for(const T of C){const z=Ae(T,v);I=Math.min(I,z[1]),P=Math.max(P,z[1])}return{min:I,max:P}},zw=(y,v)=>{const $=new Set,j=[];for(const N of x.get(y)??[]){if(g(N))continue;const _=N.indexOf(".");if(_<0)continue;const M=N.slice(0,_),L=a.get(M);!L||L.at[1]>=v-1||$.has(M)||($.add(M),j.push(M))}for(;j.length>0;){const N=j.pop();for(const _ of tn(N)){if($.has(_))continue;const M=a.get(_);!M||M.at[1]>=v-1||($.add(_),j.push(_))}}return $},ro=(y,v,$)=>{const j=new Set([y]),N=[y];for(;N.length>0;){const _=N.pop();for(const M of tn(_))M===v||j.has(M)||!$.has(M)||(j.add(M),N.push(M))}return j},so=(y,v)=>{let $=y.length*y.length+8,j=!1,N=!0;for(;N&&$-- >0;){N=!1;for(let _=0;_<y.length&&!N;_++)for(let M=_+1;M<y.length;M++){const L=y[_],C=y[M],I=ft(L),P=ft(C),T=nn(L),z=nn(C);if(!I||!P||!T||!z)continue;const D=Math.min(I.max,P.max)-Math.max(I.min,P.min),H=Math.min(T.max,z.max)-Math.max(T.min,z.min);if(D<=0||H<=0)continue;const G=ro(L,C,v),K=ro(C,L,v);if(G.has(C)||K.has(L))continue;const ce=![...G].some(xe=>u.has(xe)),J=![...K].some(xe=>u.has(xe));if(!ce&&!J)continue;const W=(I.min+I.max)/2,X=(P.min+P.max)/2;let Y,ue;ce&&(!J||G.size<=K.size)?(Y=G,ue=W<=X?-1:1):(Y=K,ue=X<=W?-1:1);const ye=fe(ue*(D+oo));if(ye!==0){for(const xe of Y){const be=a.get(xe);be&&a.set(xe,{...be,at:[be.at[0]+ye,be.at[1]]})}j=!0,N=!0;break}}}return j};for(const y of n){const v=l.get(y.id);if(!v)continue;const $=zw(y.id,v.at[1]);if($.size<2)continue;const j=[...$];if(so(j,$)){let _=1/0,M=-1/0;for(const L of j){const C=ft(L);C&&(_=Math.min(_,C.min),M=Math.max(M,C.max))}if(Number.isFinite(_)){const C=j.some(P=>u.has(P))?0:fe(v.at[0]-(_+M)/2);if(C!==0)for(const P of j){const T=a.get(P);T&&a.set(P,{...T,at:[T.at[0]+C,T.at[1]]})}const I=M-_+oo;if(I>v.span&&!d.has(y.id)){const P=l.get(y.id);l.set(y.id,{...P,span:I})}}}}const io=()=>{const v=t.map(j=>j.id).filter(j=>a.has(j)).map(j=>({x:ft(j),y:nn(j)})).filter(j=>j.x&&j.y);let $=0;for(let j=0;j<v.length;j++)for(let N=j+1;N<v.length;N++){const _=Math.min(v[j].x.max,v[N].x.max)-Math.max(v[j].x.min,v[N].x.min),M=Math.min(v[j].y.max,v[N].y.max)-Math.max(v[j].y.min,v[N].y.min);_>1&&M>1&&$++}return $},Rw=io(),ao=new Map;for(const[y,v]of a)ao.set(y,{...v,at:[...v.at]});const lo=new Map;for(const[y,v]of l)lo.set(y,{...v,at:[...v.at]});const on=120,co=new Map;{const y=new Map,v=new Map,$=[];for(const N of n)for(const _ of x.get(N.id)??[]){if(g(_))continue;const M=_.indexOf(".");if(M<0)continue;const L=_.slice(0,M);a.has(L)&&$.push({el:L,bus:N.id,d:1})}$.sort((N,_)=>N.d-_.d);let j=0;for(;j<$.length;){const{el:N,bus:_,d:M}=$[j++],L=y.get(N);if(L===void 0)y.set(N,M),v.set(N,_);else if(M===L&&v.get(N)!==_){v.set(N,null);continue}else continue;for(const C of tn(N))a.has(C)&&(y.has(C)||$.push({el:C,bus:_,d:M+1}))}for(const[N,_]of v)_&&co.set(N,_)}for(const y of le){const v=(ie.get(y)??[]).filter(I=>l.has(I));if(v.length<2||v.some(I=>d.has(I)))continue;const $=[];let j=0;for(const I of v){const P=l.get(I),T=[];let z=1/0,D=-1/0;for(const[H,G]of co){if(G!==I)continue;const K=ft(H);K&&(T.push(H),z=Math.min(z,K.min),D=Math.max(D,K.max))}Number.isFinite(z)||(z=P.at[0]-ut/2,D=P.at[0]+ut/2),$.push({busId:I,min:z,max:D,members:T}),j+=D-z}if($.some(I=>I.members.some(P=>u.has(P))))continue;let N=1/0,_=-1/0;for(const I of $)N=Math.min(N,I.min),_=Math.max(_,I.max);const M=_-N,L=j+on*($.length-1);if(!(M>L+on))continue;$.sort((I,P)=>(I.min+I.max)/2-(P.min+P.max)/2);let C=N;for(const I of $){const P=fe(C-I.min);if(P!==0){const T=l.get(I.busId);l.set(I.busId,{...T,at:[T.at[0]+P,T.at[1]]});for(const z of I.members){const D=a.get(z);D&&a.set(z,{...D,at:[D.at[0]+P,D.at[1]]})}I.min+=P,I.max+=P}C=I.max+on}for(const I of $){const P=l.get(I.busId),T=Math.max(ut,I.max-I.min);T<P.span&&l.set(I.busId,{...P,span:T})}}{const y=t.map($=>$.id).filter($=>a.has($)),v=new Set(y);so(y,v)}if(io()>Rw){a.clear();for(const[y,v]of ao)a.set(y,v);l.clear();for(const[y,v]of lo)l.set(y,v)}let rn=0;for(const y of t){if(a.has(y.id))continue;const v=rn%Ao,$=Math.floor(rn/Ao);a.set(y.id,{at:[fe(Uv+v*Zv),fe(Jv+$*Qv)],rot:0,mirror:!1}),rn++}return{devices:a,buses:l}}function fe(e){return Math.round(e/To)*To}function t2(e,t){const n=e.ends[0],o=e.ends[1],r=Io(n,t),s=Io(o,t);if(r||s){const l=r?n:o,d=dn(r?o:n,t);if(!d)return null;const m=t.buses.get(l);if(!m)return null;const{axis:f,at:p,span:h}=m.geometry,g=h/2;let w;if(f==="x")w=[Dt(d[0],p[0]-g,p[0]+g),p[1]];else{const E=Dt(d[1],p[1]-g,p[1]+g);w=[p[0],E]}return{wireId:e.id,path:Oo(d,w)}}const i=dn(n,t),a=dn(o,t);return!i||!a?null:{wireId:e.id,path:Oo(i,a)}}function Io(e,t){return!e.includes(".")&&t.buses.has(e)}function dn(e,t){if(!e.includes(".")){const o=t.buses.get(e);if(o)return o.geometry.at;const r=t.junctions.get(e);return r?r.world:null}const n=t.terminals.get(e);return n?n.world:null}function Po(e,t,n){if(!e.includes(".")){const r=n.buses.get(e);if(!r){const d=n.junctions.get(e);return d?[d.world[0],d.world[1]]:null}const{axis:s,at:i,span:a}=r.geometry;if(!t)return[i[0],i[1]];const l=a/2;if(s==="x")return[Dt(t[0],i[0]-l,i[0]+l),i[1]];const u=Dt(t[1],i[1]-l,i[1]+l);return[i[0],u]}const o=n.terminals.get(e);return o?[o.world[0],o.world[1]]:null}function Oo(e,t){return e[0]===t[0]||e[1]===t[1]?[e,t]:[e,[e[0],t[1]],t]}function Dt(e,t,n){return e<t?t:e>n?n:e}const es="ammeter",ts="电流表 (A)",ns="measurement",os="-22 -42 44 44",rs=44,ss=44,is='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="0" y="-15" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="14">A</text>',as=[{id:"t_top",x:0,y:-40,orientation:"n"}],ls={kind:"inline"},n2={id:es,name:ts,category:ns,viewBox:os,width:rs,height:ss,svg:is,terminals:as,source:ls},o2=Object.freeze(Object.defineProperty({__proto__:null,category:ns,default:n2,height:ss,id:es,name:ts,source:ls,svg:is,terminals:as,viewBox:os,width:rs},Symbol.toStringTag,{value:"Module"})),cs="arc-suppression-coil",ds="消弧线圈",us="grounding",ms="中性点谐振接地:电感线圈连接到地",fs="-12 -32 24 67",hs=24,ps=67,gs='<line x1="0" y1="-30" x2="0" y2="-12" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -12 A 4 4 0 0 1 0 -4 A 4 4 0 0 1 0 4 A 4 4 0 0 1 0 12" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="12" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="20" x2="10" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="24" x2="7" y2="24" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="28" x2="4" y2="28" fill="none" stroke="black" stroke-width="1"/><line x1="-1.5" y1="32" x2="1.5" y2="32" fill="none" stroke="black" stroke-width="1"/>',ys=[{id:"t_top",x:0,y:-30,orientation:"n"}],xs={kind:"inline"},r2={id:cs,name:ds,category:us,description:ms,viewBox:fs,width:hs,height:ps,svg:gs,terminals:ys,source:xs},s2=Object.freeze(Object.defineProperty({__proto__:null,category:us,default:r2,description:ms,height:ps,id:cs,name:ds,source:xs,svg:gs,terminals:ys,viewBox:fs,width:hs},Symbol.toStringTag,{value:"Module"})),bs="arrester",ws="避雷器 (FBL)",vs="protection",ks="-7 -22 14 44",_s=14,$s=44,Ss='<line x1="0" y1="-20" x2="0" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><polygon points="-2,-8 2,-8 0,-2" fill="black" stroke="black" stroke-width="1"/><rect x="-5" y="-10" width="10" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',js=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Es={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_22/en_60617_07_22_03.elmt",qetEnglishName:"Surge diverter; Lightning arrester"},i2={id:bs,name:ws,category:vs,viewBox:ks,width:_s,height:$s,svg:Ss,terminals:js,source:Es},a2=Object.freeze(Object.defineProperty({__proto__:null,category:vs,default:i2,height:$s,id:bs,name:ws,source:Es,svg:Ss,terminals:js,viewBox:ks,width:_s},Symbol.toStringTag,{value:"Module"})),Ns="async-motor",Ms="异步电动机",Ts="load",As="-62 -82 64 84",Cs=64,Is=84,Ps='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><text x="-45" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">3</text><path d="M -25 -20 A 5 2.5 0 0 0 -35 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -20 A 5 2.5 0 0 0 -15 -20" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-60" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="-80" x2="-50" y2="-53" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-80" x2="-10" y2="-53" fill="none" stroke="black" stroke-width="1"/>',Os=[{id:"t1",x:-50,y:-80,orientation:"n"},{id:"t2",x:-10,y:-80,orientation:"n"},{id:"t3",x:-30,y:-80,orientation:"n"}],Bs={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_08/en_60617_06_08_01.elmt",qetEnglishName:"Induction motor, three-phase, squirrel cage"},l2={id:Ns,name:Ms,category:Ts,viewBox:As,width:Cs,height:Is,svg:Ps,terminals:Os,source:Bs},c2=Object.freeze(Object.defineProperty({__proto__:null,category:Ts,default:l2,height:Is,id:Ns,name:Ms,source:Bs,svg:Ps,terminals:Os,viewBox:As,width:Cs},Symbol.toStringTag,{value:"Module"})),Ls="autotransformer",zs="自耦变压器",Rs="transformer",Ds="-62 -112 64 144",Fs=64,Hs=144,Ws='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-110" x2="-30" y2="-90" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -30 A 30 60 0 0 0 -30 -90" fill="none" stroke="black" stroke-width="1"/>',qs=[{id:"t1",x:-30,y:-110,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],Gs={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_06.elmt",qetEnglishName:"Auto-transformer, general symbol"},d2={id:Ls,name:zs,category:Rs,viewBox:Ds,width:Fs,height:Hs,svg:Ws,terminals:qs,source:Gs},u2=Object.freeze(Object.defineProperty({__proto__:null,category:Rs,default:d2,height:Hs,id:Ls,name:zs,source:Gs,svg:Ws,terminals:qs,viewBox:Ds,width:Fs},Symbol.toStringTag,{value:"Module"})),Xs="battery",Ks="电池储能",Ys="storage",Vs="-12 -12 29 24",Us=29,Js=24,Zs='<line x1="-10" y1="0" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-5" x2="0" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-10" x2="5" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="0" x2="15" y2="0" fill="none" stroke="black" stroke-width="1"/>',Qs=[{id:"t_left",x:-10,y:0,orientation:"w"},{id:"t_right",x:15,y:0,orientation:"e"}],ei=[{name:"E",label:"容量",type:"number",unit:"kWh"}],ti={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_15/en_60617_06_15_01.elmt",qetEnglishName:"Battery cell"},m2={id:Xs,name:Ks,category:Ys,viewBox:Vs,width:Us,height:Js,svg:Zs,terminals:Qs,params:ei,source:ti},f2=Object.freeze(Object.defineProperty({__proto__:null,category:Ys,default:m2,height:Js,id:Xs,name:Ks,params:ei,source:ti,svg:Zs,terminals:Qs,viewBox:Vs,width:Us},Symbol.toStringTag,{value:"Module"})),ni="bell",oi="电铃 (HA)",ri="control",si="信号电铃 / 警铃。",ii="-32 -32 44 44",ai=44,li=44,ci='<line x1="-30" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -10 A 20 20 0 0 0 -30 -10" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-10" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/>',di=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],ui={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_06.elmt",qetEnglishName:"Bell"},h2={id:ni,name:oi,category:ri,description:si,viewBox:ii,width:ai,height:li,svg:ci,terminals:di,source:ui},p2=Object.freeze(Object.defineProperty({__proto__:null,category:ri,default:h2,description:si,height:li,id:ni,name:oi,source:ui,svg:ci,terminals:di,viewBox:ii,width:ai},Symbol.toStringTag,{value:"Module"})),mi="break-contact",fi="常闭触点 (NC)",hi="control",pi="常闭辅助触点 (break contact)。",gi="-2 -42 14 64",yi=14,xi=64,bi='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="10" y2="-20" fill="none" stroke="black" stroke-width="1"/>',wi=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],vi=[{name:"open",type:"boolean",default:!1,label:"断开"}],ki={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_02/en_60617_07_02_03.elmt",qetEnglishName:"Break contact"},g2={id:mi,name:fi,category:hi,description:pi,viewBox:gi,width:yi,height:xi,svg:bi,terminals:wi,state:vi,source:ki},y2=Object.freeze(Object.defineProperty({__proto__:null,category:hi,default:g2,description:pi,height:xi,id:mi,name:fi,source:ki,state:vi,svg:bi,terminals:wi,viewBox:gi,width:yi},Symbol.toStringTag,{value:"Module"})),_i="breaker",$i="断路器 (QF)",Si="switching",ji="-7 -22 15 46",Ei=15,Ni=46,Mi='<polyline points="0,20 0,10 -5,-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-8" x2="-2" y2="-12" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><text x="2" y="-10.8" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">1</text><text x="3" y="21.2" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">2</text>',Ti=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Ai=[{name:"open",type:"boolean",default:!1,label:"断开"}],Ci={x:6,y:-2,anchor:"start"},Ii={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/11_circuit_breakers/disjoncteur1.elmt",qetEnglishName:"Circuit-breaker"},x2={id:_i,name:$i,category:Si,viewBox:ji,width:Ei,height:Ni,svg:Mi,terminals:Ti,state:Ai,label:Ci,source:Ii},b2=Object.freeze(Object.defineProperty({__proto__:null,category:Si,default:x2,height:Ni,id:_i,label:Ci,name:$i,source:Ii,state:Ai,svg:Mi,terminals:Ti,viewBox:ji,width:Ei},Symbol.toStringTag,{value:"Module"})),Pi="buchholz-relay",Oi="瓦斯继电器 (63)",Bi="protection",Li="瓦斯 / 气体继电器 (Buchholz, ANSI 63)。",zi="-22 -62 44 64",Ri=44,Di=64,Fi='<rect x="-20" y="-60" width="40" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-20" y="-30" width="40" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-5" y="-20" width="10" height="10" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-20" x2="10" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-55" x2="0" y2="-50" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -50 A 10 5 0 0 0 0 -40" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -40 A 10 5 0 0 0 0 -50" fill="none" stroke="black" stroke-width="1"/>',Hi=[{id:"t_top",x:0,y:-60,orientation:"n"}],Wi={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_18/en_60617_07_18_01.elmt",qetEnglishName:"Buchholz protective device; Gas relay"},w2={id:Pi,name:Oi,category:Bi,description:Li,viewBox:zi,width:Ri,height:Di,svg:Fi,terminals:Hi,source:Wi},v2=Object.freeze(Object.defineProperty({__proto__:null,category:Bi,default:w2,description:Li,height:Di,id:Pi,name:Oi,source:Wi,svg:Fi,terminals:Hi,viewBox:zi,width:Ri},Symbol.toStringTag,{value:"Module"})),qi="busbar",Gi="母线段",Xi="busbar",Ki="可拉伸单母线段,多设备挂接",Yi="-42 -4 84 8",Vi=84,Ui=8,Ji='<line x1="-40" y1="0" x2="40" y2="0" stroke="black" stroke-width="3" stroke-linecap="round" fill="none"/>',Zi=[{id:"tap",x:0,y:0,orientation:"n"}],Qi={axis:"x",minLength:20,naturalSpan:80},ea=[{name:"Un",label:"额定电压",type:"number",unit:"kV",showOnCanvas:!0}],ta={x:0,y:-6,anchor:"middle"},na={kind:"inline"},k2={id:qi,name:Gi,category:Xi,description:Ki,viewBox:Yi,width:Vi,height:Ui,svg:Ji,terminals:Zi,stretchable:Qi,params:ea,label:ta,source:na},_2=Object.freeze(Object.defineProperty({__proto__:null,category:Xi,default:k2,description:Ki,height:Ui,id:qi,label:ta,name:Gi,params:ea,source:na,stretchable:Qi,svg:Ji,terminals:Zi,viewBox:Yi,width:Vi},Symbol.toStringTag,{value:"Module"})),oa="buzzer",ra="蜂鸣器 (HA)",sa="control",ia="信号蜂鸣器。",aa="-32 -52 44 64",la=44,ca=64,da='<line x1="-30" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><path d="M -30 -30 A 20 20 0 0 0 10 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-12" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-12" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/>',ua=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],ma={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_10.elmt",qetEnglishName:"Buzzer"},$2={id:oa,name:ra,category:sa,description:ia,viewBox:aa,width:la,height:ca,svg:da,terminals:ua,source:ma},S2=Object.freeze(Object.defineProperty({__proto__:null,category:sa,default:$2,description:ia,height:ca,id:oa,name:ra,source:ma,svg:da,terminals:ua,viewBox:aa,width:la},Symbol.toStringTag,{value:"Module"})),fa="capacitor",ha="电容 (C)",pa="passive",ga="通用 / 滤波 / 直流母线电容。无功补偿请用并联电容器。",ya="-7 -23 14 27",xa=14,ba=27,wa='<line x1="-5" y1="2" x2="5" y2="2" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-2" x2="5" y2="-2" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-2" fill="none" stroke="black" stroke-width="1"/>',va=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t_bottom",x:0,y:2,orientation:"s"}],ka=[{name:"C",label:"容值",type:"number",unit:"μF",showOnCanvas:!0},{name:"Un",label:"额定电压",type:"number",unit:"V"}],_a={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/20_capacitors/capacite.elmt",qetEnglishName:"Capacitor"},j2={id:fa,name:ha,category:pa,description:ga,viewBox:ya,width:xa,height:ba,svg:wa,terminals:va,params:ka,source:_a},E2=Object.freeze(Object.defineProperty({__proto__:null,category:pa,default:j2,description:ga,height:ba,id:fa,name:ha,params:ka,source:_a,svg:wa,terminals:va,viewBox:ya,width:xa},Symbol.toStringTag,{value:"Module"})),$a="contactor",Sa="接触器 (KM)",ja="motor-control",Ea="主回路接触器, 通常配热继电器和电机使用。",Na="-10 -42 15 64",Ma=15,Ta=64,Aa='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -24.5 A 2.5 2.5 0 0 0 0 -19.5" fill="none" stroke="black" stroke-width="1"/>',Ca=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Ia=[{name:"open",type:"boolean",default:!0,label:"断开"}],Pa={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_02.elmt",qetEnglishName:"Contactor; Main make contact of a contactor"},N2={id:$a,name:Sa,category:ja,description:Ea,viewBox:Na,width:Ma,height:Ta,svg:Aa,terminals:Ca,state:Ia,source:Pa},M2=Object.freeze(Object.defineProperty({__proto__:null,category:ja,default:N2,description:Ea,height:Ta,id:$a,name:Sa,source:Pa,state:Ia,svg:Aa,terminals:Ca,viewBox:Na,width:Ma},Symbol.toStringTag,{value:"Module"})),Oa="converter-bidir",Ba="双向变流器 (PCS)",La="renewable",za="储能变流器:双向 AC ↔ DC",Ra="-42 -42 44 48",Da=44,Fa=48,Ha='<line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-6" x2="-14" y2="-6" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-6" x2="-4" y2="-6" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -35 -30" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -15 -30" fill="none" stroke="black" stroke-width="1"/><polyline points="-28,-4 -32,0 -28,4" fill="none" stroke="black" stroke-width="1"/><polyline points="-16,-4 -12,0 -16,4" fill="none" stroke="black" stroke-width="1"/>',Wa=[{id:"t_ac",x:-20,y:-40,orientation:"n"},{id:"t_dc",x:-20,y:0,orientation:"s"}],qa=[{name:"S",label:"容量",type:"number",unit:"MVA"}],Ga={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_06.elmt",qetEnglishName:"Rectifier/inverter"},T2={id:Oa,name:Ba,category:La,description:za,viewBox:Ra,width:Da,height:Fa,svg:Ha,terminals:Wa,params:qa,source:Ga},A2=Object.freeze(Object.defineProperty({__proto__:null,category:La,default:T2,description:za,height:Fa,id:Oa,name:Ba,params:qa,source:Ga,svg:Ha,terminals:Wa,viewBox:Ra,width:Da},Symbol.toStringTag,{value:"Module"})),Xa="ct",Ka="电流互感器 (CT)",Ya="instrument-transformer",Va="-42 -62 54 64",Ua=54,Ja=64,Za='<line x1="-30" y1="-60" x2="-30" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-30" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-20" x2="5" y2="-40" fill="none" stroke="black" stroke-width="1"/>',Qa=[{id:"t1",x:-30,y:-60,orientation:"n"},{id:"t2",x:-30,y:0,orientation:"s"}],el={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_10.elmt",qetEnglishName:"Current transformer, general symbol"},C2={id:Xa,name:Ka,category:Ya,viewBox:Va,width:Ua,height:Ja,svg:Za,terminals:Qa,source:el},I2=Object.freeze(Object.defineProperty({__proto__:null,category:Ya,default:C2,height:Ja,id:Xa,name:Ka,source:el,svg:Za,terminals:Qa,viewBox:Va,width:Ua},Symbol.toStringTag,{value:"Module"})),tl="dc-combiner",nl="直流汇流箱",ol="renewable",rl="光伏组串汇流箱 (4 路输入示例)。",sl="-27 -32 54 64",il=54,al=64,ll='<rect x="-25" y="-15" width="50" height="30" fill="none" stroke="black" stroke-width="1"/><line x1="-18" y1="-30" x2="-18" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="-6" y1="-30" x2="-6" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-30" x2="6" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="18" y1="-30" x2="18" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="15" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><text x="-9" y="5" font-family="Liberation Sans, Arial, sans-serif" font-size="7" fill="#000000">DC</text>',cl=[{id:"t_s1",x:-18,y:-30,orientation:"n"},{id:"t_s2",x:-6,y:-30,orientation:"n"},{id:"t_s3",x:6,y:-30,orientation:"n"},{id:"t_s4",x:18,y:-30,orientation:"n"},{id:"t_dc",x:0,y:30,orientation:"s"}],dl={kind:"inline"},P2={id:tl,name:nl,category:ol,description:rl,viewBox:sl,width:il,height:al,svg:ll,terminals:cl,source:dl},O2=Object.freeze(Object.defineProperty({__proto__:null,category:ol,default:P2,description:rl,height:al,id:tl,name:nl,source:dl,svg:ll,terminals:cl,viewBox:sl,width:il},Symbol.toStringTag,{value:"Module"})),ul="dc-disconnector",ml="直流隔离开关",fl="switching",hl="DC isolating switch — 光伏组串 / 储能 直流侧隔离。",pl="-12 -32 30 64",gl=30,yl=64,xl='<line x1="0" y1="-30" x2="0" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="-8" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-4" x2="14" y2="-4" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-1" x2="9" y2="-1" stroke="black" stroke-width="0.8" fill="none"/><line x1="11" y1="-1" x2="14" y2="-1" stroke="black" stroke-width="0.8" fill="none"/>',bl=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],wl=[{name:"open",type:"boolean",default:!1,label:"断开"}],vl={kind:"inline"},B2={id:ul,name:ml,category:fl,description:hl,viewBox:pl,width:gl,height:yl,svg:xl,terminals:bl,state:wl,source:vl},L2=Object.freeze(Object.defineProperty({__proto__:null,category:fl,default:B2,description:hl,height:yl,id:ul,name:ml,source:vl,state:wl,svg:xl,terminals:bl,viewBox:pl,width:gl},Symbol.toStringTag,{value:"Module"})),kl="dc-motor",_l="直流电机 (M)",$l="load",Sl="直流电动机 (串励通用符号)。",jl="-72 -82 89 84",El=89,Nl=84,Ml='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><line x1="-40" y1="-20" x2="-20" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-15" x2="-32" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-29" y1="-15" x2="-20" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-70" y1="-80" x2="-70" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-70" y1="-30" x2="-60" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="10" y1="-30" x2="10" y2="-50" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -60 A 5 5 0 0 0 10 -50" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -70 A 5 5 0 0 0 10 -60" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -80 A 5 5 0 0 0 10 -70" fill="none" stroke="black" stroke-width="1"/>',Tl=[{id:"t1",x:-70,y:-80,orientation:"n"},{id:"t2",x:10,y:-80,orientation:"n"}],Al={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_05/en_60617_06_05_01.elmt",qetEnglishName:"Series motor, DC"},z2={id:kl,name:_l,category:$l,description:Sl,viewBox:jl,width:El,height:Nl,svg:Ml,terminals:Tl,source:Al},R2=Object.freeze(Object.defineProperty({__proto__:null,category:$l,default:z2,description:Sl,height:Nl,id:kl,name:_l,source:Al,svg:Ml,terminals:Tl,viewBox:jl,width:El},Symbol.toStringTag,{value:"Module"})),Cl="diode",Il="二极管 (D)",Pl="passive",Ol="整流 / 续流 / 保护二极管。t1=阳极(上), t2=阴极(下)。",Bl="-12 -42 24 44",Ll=24,zl=44,Rl='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/>',Dl=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],Fl={x:6,y:-20,anchor:"start"},Hl={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_03/en_60617_05_03_01.elmt",qetEnglishName:"Semiconductor diode, general symbol"},D2={id:Cl,name:Il,category:Pl,description:Ol,viewBox:Bl,width:Ll,height:zl,svg:Rl,terminals:Dl,label:Fl,source:Hl},F2=Object.freeze(Object.defineProperty({__proto__:null,category:Pl,default:D2,description:Ol,height:zl,id:Cl,label:Fl,name:Il,source:Hl,svg:Rl,terminals:Dl,viewBox:Bl,width:Ll},Symbol.toStringTag,{value:"Module"})),Wl="disconnector",ql="隔离开关 (QS)",Gl="switching",Xl="-10 -42 15 64",Kl=15,Yl=64,Vl='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-3" y1="-20" x2="3" y2="-20" fill="none" stroke="black" stroke-width="1"/>',Ul=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Jl=[{name:"open",type:"boolean",default:!1,label:"断开"}],Zl={x:6,y:-10,anchor:"start"},Ql={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_06.elmt",qetEnglishName:"Disconnector; Isolator"},H2={id:Wl,name:ql,category:Gl,viewBox:Xl,width:Kl,height:Yl,svg:Vl,terminals:Ul,state:Jl,label:Zl,source:Ql},W2=Object.freeze(Object.defineProperty({__proto__:null,category:Gl,default:H2,height:Yl,id:Wl,label:Zl,name:ql,source:Ql,state:Jl,svg:Vl,terminals:Ul,viewBox:Xl,width:Kl},Symbol.toStringTag,{value:"Module"})),ec="distance-relay",tc="距离继电器 (21)",nc="protection",oc="距离 / 低阻抗保护继电器 (ANSI 21)。",rc="-62 -42 64 44",sc=64,ic=44,ac='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-42" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Z &lt;</text>',lc=[{id:"t_top",x:-30,y:-40,orientation:"n"}],cc={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_09.elmt",qetEnglishName:"Under-impedance relay"},q2={id:ec,name:tc,category:nc,description:oc,viewBox:rc,width:sc,height:ic,svg:ac,terminals:lc,source:cc},G2=Object.freeze(Object.defineProperty({__proto__:null,category:nc,default:q2,description:oc,height:ic,id:ec,name:tc,source:cc,svg:ac,terminals:lc,viewBox:rc,width:sc},Symbol.toStringTag,{value:"Module"})),dc="earth",uc="接地",mc="busbar",fc="-12 -17 24 34",hc=24,pc=34,gc='<line x1="-10" y1="0" x2="10" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-15" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="5" x2="7" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="10" x2="4" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0.5" y1="15" x2="-0.5" y2="15" fill="none" stroke="black" stroke-width="1"/>',yc=[{id:"t1",x:0,y:-15,orientation:"n"}],xc={kind:"elmt",path:"91_en_60617/en_60617_02/en_60617_02_15/en_60617_02_15_01.elmt",qetEnglishName:"Earth or ground, general symbol"},X2={id:dc,name:uc,category:mc,viewBox:fc,width:hc,height:pc,svg:gc,terminals:yc,source:xc},K2=Object.freeze(Object.defineProperty({__proto__:null,category:mc,default:X2,height:pc,id:dc,name:uc,source:xc,svg:gc,terminals:yc,viewBox:fc,width:hc},Symbol.toStringTag,{value:"Module"})),bc="earthing-switch",wc="接地刀闸 (QE)",vc="switching",kc="隔离开关 + 接地连接,单端口",_c="-12 -32 24 64",$c=24,Sc=64,jc='<line x1="0" y1="-30" x2="0" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="-12" x2="-9" y2="9" stroke="black" stroke-width="1" fill="none"/><line x1="-3" y1="-12" x2="3" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="-10" y1="14" x2="10" y2="14" stroke="black" stroke-width="1" fill="none"/><line x1="-7" y1="19" x2="7" y2="19" stroke="black" stroke-width="1" fill="none"/><line x1="-4" y1="24" x2="4" y2="24" stroke="black" stroke-width="1" fill="none"/><line x1="-1.5" y1="29" x2="1.5" y2="29" stroke="black" stroke-width="1" fill="none"/>',Ec=[{id:"t_top",x:0,y:-30,orientation:"n"}],Nc=[{name:"open",type:"boolean",default:!0,label:"断开"}],Mc={x:12,y:-8,anchor:"start"},Tc={kind:"inline"},Y2={id:bc,name:wc,category:vc,description:kc,viewBox:_c,width:$c,height:Sc,svg:jc,terminals:Ec,state:Nc,label:Mc,source:Tc},V2=Object.freeze(Object.defineProperty({__proto__:null,category:vc,default:Y2,description:kc,height:Sc,id:bc,label:Mc,name:wc,source:Tc,state:Nc,svg:jc,terminals:Ec,viewBox:_c,width:$c},Symbol.toStringTag,{value:"Module"})),Ac="energy-meter",Cc="电能表 (Wh)",Ic="measurement",Pc="有功电能表 (kWh) — 服务入口 / 子表。",Oc="-22 -36 44 72",Bc=44,Lc=72,zc='<text x="-10" y="19.2" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Wh</text><rect x="-20" y="-10" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-20" y="-30" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Rc=[{id:"t1",x:0,y:-34,orientation:"n"},{id:"t2",x:0,y:34,orientation:"s"}],Dc={kind:"elmt",path:"11_singlepole/500_home_installation/40_meters/wattheuremetre_08-04-03_en60617.elmt",qetEnglishName:"Watt hour meter (en_60617)"},U2={id:Ac,name:Cc,category:Ic,description:Pc,viewBox:Oc,width:Bc,height:Lc,svg:zc,terminals:Rc,source:Dc},J2=Object.freeze(Object.defineProperty({__proto__:null,category:Ic,default:U2,description:Pc,height:Lc,id:Ac,name:Cc,source:Dc,svg:zc,terminals:Rc,viewBox:Oc,width:Bc},Symbol.toStringTag,{value:"Module"})),Fc="ev-charger",Hc="EV 充电桩",Wc="load",qc="电动汽车充电站 / 充电桩。",Gc="-17 -27 34 49",Xc=34,Kc=49,Yc='<line x1="0" y1="-25" x2="0" y2="-15" stroke="black" stroke-width="1" fill="none"/><rect x="-15" y="-15" width="30" height="35" fill="none" stroke="black" stroke-width="1"/><rect x="-9" y="-8" width="14" height="6" fill="none" stroke="black" stroke-width="0.8"/><rect x="5" y="-7" width="2" height="4" fill="black"/><text x="-9" y="13" font-family="Liberation Sans, Arial, sans-serif" font-size="7" fill="#000000">EV</text>',Vc=[{id:"t_top",x:0,y:-25,orientation:"n"}],Uc={kind:"inline"},Z2={id:Fc,name:Hc,category:Wc,description:qc,viewBox:Gc,width:Xc,height:Kc,svg:Yc,terminals:Vc,source:Uc},Q2=Object.freeze(Object.defineProperty({__proto__:null,category:Wc,default:Z2,description:qc,height:Kc,id:Fc,name:Hc,source:Uc,svg:Yc,terminals:Vc,viewBox:Gc,width:Xc},Symbol.toStringTag,{value:"Module"})),Jc="frequency-meter",Zc="频率表 (Hz)",Qc="measurement",ed="-22 -42 44 44",td=44,nd=44,od='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-8" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Hz</text>',rd=[{id:"t_top",x:0,y:-40,orientation:"n"}],sd={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_07.elmt",qetEnglishName:"Frequency meter"},ek={id:Jc,name:Zc,category:Qc,viewBox:ed,width:td,height:nd,svg:od,terminals:rd,source:sd},tk=Object.freeze(Object.defineProperty({__proto__:null,category:Qc,default:ek,height:nd,id:Jc,name:Zc,source:sd,svg:od,terminals:rd,viewBox:ed,width:td},Symbol.toStringTag,{value:"Module"})),id="fuse-switch-disconnector",ad="熔断器式隔离开关",ld="switching",cd="负荷型熔断器隔离开关 (on-load fuse switch-disconnector)。",dd="-8 -32 12 64",ud=12,md=64,fd='<line x1="0" y1="30" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="-5" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-13" x2="0" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-3" y1="6" x2="-6" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-6" x2="1" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="1" y1="5" x2="-3" y2="6" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-6" x2="-6" y2="-5" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-11" rx="1" ry="1" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-13" x2="2" y2="-13" fill="none" stroke="black" stroke-width="1"/>',hd=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],pd=[{name:"open",type:"boolean",default:!1,label:"断开"}],gd={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_21/en_60617_07_21_09.elmt",qetEnglishName:"Fuse switch-disconnector; On-load isolating fuse switch"},nk={id,name:ad,category:ld,description:cd,viewBox:dd,width:ud,height:md,svg:fd,terminals:hd,state:pd,source:gd},ok=Object.freeze(Object.defineProperty({__proto__:null,category:ld,default:nk,description:cd,height:md,id,name:ad,source:gd,state:pd,svg:fd,terminals:hd,viewBox:dd,width:ud},Symbol.toStringTag,{value:"Module"})),yd="fuse",xd="熔断器 (FU)",bd="switching",wd="-7 -32 14 64",vd=14,kd=64,_d='<line x1="0" y1="-30" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><rect x="-5" y="-15" width="10" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',$d=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],Sd=[{name:"blown",type:"boolean",default:!1,label:"熔断"}],jd={x:7,y:-2,anchor:"start"},Ed={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_21/en_60617_07_21_01.elmt",qetEnglishName:"Fuse, general symbol"},rk={id:yd,name:xd,category:bd,viewBox:wd,width:vd,height:kd,svg:_d,terminals:$d,state:Sd,label:jd,source:Ed},sk=Object.freeze(Object.defineProperty({__proto__:null,category:bd,default:rk,height:kd,id:yd,label:jd,name:xd,source:Ed,state:Sd,svg:_d,terminals:$d,viewBox:wd,width:vd},Symbol.toStringTag,{value:"Module"})),Nd="generator",Md="发电机 (G)",Td="source",Ad="-42 -42 44 44",Cd=44,Id=44,Pd='<rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-24" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">G</text>',Od=[{id:"t_bottom",x:-20,y:0,orientation:"s"}],Bd={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_16/en_60617_06_16_01.elmt",qetEnglishName:"Generator, general symbol"},ik={id:Nd,name:Md,category:Td,viewBox:Ad,width:Cd,height:Id,svg:Pd,terminals:Od,source:Bd},ak=Object.freeze(Object.defineProperty({__proto__:null,category:Td,default:ik,height:Id,id:Nd,name:Md,source:Bd,svg:Pd,terminals:Od,viewBox:Ad,width:Cd},Symbol.toStringTag,{value:"Module"})),Ld="genset",zd="发电机组 (G)",Rd="source",Dd="柴油 / 燃气发电机组。",Fd="-28 -22 56 64",Hd=56,Wd=64,qd='<rect x="-26" y="-20" width="52" height="40" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">GEN</text><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Gd=[{id:"t_out",x:0,y:40,orientation:"s"}],Xd=[{name:"P",label:"功率",type:"number",unit:"kW",showOnCanvas:!0}],Kd={kind:"inline"},lk={id:Ld,name:zd,category:Rd,description:Dd,viewBox:Fd,width:Hd,height:Wd,svg:qd,terminals:Gd,params:Xd,source:Kd},ck=Object.freeze(Object.defineProperty({__proto__:null,category:Rd,default:lk,description:Dd,height:Wd,id:Ld,name:zd,params:Xd,source:Kd,svg:qd,terminals:Gd,viewBox:Fd,width:Hd},Symbol.toStringTag,{value:"Module"})),Yd="gfci-breaker",Vd="GFCI 断路器 (RCBO)",Ud="protection",Jd="剩余电流断路器带过流保护 (UL943 / IEC 61009)。北美 GFCI / 欧洲 RCBO。",Zd="-18 -22 22 44",Qd=22,eu=44,tu='<text x="-14" y="13.8" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">IΔ</text><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-12" x2="2" y2="-8" fill="none" stroke="black" stroke-width="1"/><polyline points="-5,-10 0,10 0,20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-4" x2="-8" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><line x1="-8" y1="-4" x2="-8" y2="-8" fill="none" stroke="black" stroke-width="0.4"/><line x1="-13" y1="-8" x2="-8" y2="-8" fill="none" stroke="black" stroke-width="0.4"/><line x1="-13" y1="-8" x2="-13" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><line x1="-16" y1="-4" x2="-13" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><path d="M -8 1 A 2.5 3.5 0 0 0 -13 1" fill="none" stroke="black" stroke-width="0.4"/><line x1="-8" y1="1" x2="-2" y2="1" fill="none" stroke="black" stroke-width="0.4"/><line x1="-16" y1="1" x2="-13" y2="1" fill="none" stroke="black" stroke-width="0.4"/>',nu=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],ou=[{name:"open",type:"boolean",default:!1,label:"断开"}],ru=[{name:"In",label:"额定电流",type:"number",unit:"A"},{name:"IDn",label:"剩余动作电流",type:"number",unit:"mA",default:30}],su={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/50_residual_current_circuit_breaker/rcbo.elmt",qetEnglishName:"Residual Circuit Breaker with Overload"},dk={id:Yd,name:Vd,category:Ud,description:Jd,viewBox:Zd,width:Qd,height:eu,svg:tu,terminals:nu,state:ou,params:ru,source:su},uk=Object.freeze(Object.defineProperty({__proto__:null,category:Ud,default:dk,description:Jd,height:eu,id:Yd,name:Vd,params:ru,source:su,state:ou,svg:tu,terminals:nu,viewBox:Zd,width:Qd},Symbol.toStringTag,{value:"Module"})),iu="grid-source",au="系统电源",lu="source",cu="无穷大母线 / 外部电网",du="-16 -31 32 53",uu=32,mu=53,fu='<circle cx="0" cy="-15" r="14" fill="none" stroke="black" stroke-width="1"/><text x="0" y="-12" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="14">~</text><line x1="0" y1="-1" x2="0" y2="20" stroke="black" stroke-width="1" fill="none"/>',hu=[{id:"t_bottom",x:0,y:20,orientation:"s"}],pu={kind:"inline"},mk={id:iu,name:au,category:lu,description:cu,viewBox:du,width:uu,height:mu,svg:fu,terminals:hu,source:pu},fk=Object.freeze(Object.defineProperty({__proto__:null,category:lu,default:mk,description:cu,height:mu,id:iu,name:au,source:pu,svg:fu,terminals:hu,viewBox:du,width:uu},Symbol.toStringTag,{value:"Module"})),gu="grounding-transformer",yu="接地变 (Z形)",xu="grounding",bu="星-曲折接线变压器,中性点接地用",wu="-62 -152 64 164",vu=64,ku=164,_u='<line x1="-30" y1="-40" x2="-35" y2="-35" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-25" y2="-35" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-90" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-35" x2="-40" y2="-38" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-150" x2="-30" y2="-120" fill="none" stroke="black" stroke-width="1"/><line x1="-25" y1="-35" x2="-25" y2="-30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-30" y2="-45" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-20" x2="-30" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-45" x2="-25" y2="-48" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-130" x2="-20" y2="-140" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-135" x2="-20" y2="-145" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="0" x2="-20" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="5" x2="-20" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-85" x2="-30" y2="-95" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-95" x2="-20" y2="-100" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-95" x2="-40" y2="-100" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-20" y2="-40" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-40" rx="2" ry="2" fill="black" stroke="black" stroke-width="1"/>',$u=[{id:"t1",x:-30,y:-150,orientation:"n"},{id:"t2",x:-30,y:10,orientation:"s"}],Su={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_10/en_60617_06_10_15.elmt",qetEnglishName:"Three-phase transformer, connection star-zigzag with the neutral brought out"},hk={id:gu,name:yu,category:xu,description:bu,viewBox:wu,width:vu,height:ku,svg:_u,terminals:$u,source:Su},pk=Object.freeze(Object.defineProperty({__proto__:null,category:xu,default:hk,description:bu,height:ku,id:gu,name:yu,source:Su,svg:_u,terminals:$u,viewBox:wu,width:vu},Symbol.toStringTag,{value:"Module"})),ju="heater",Eu="电加热器 (EH)",Nu="load",Mu="电阻加热元件 / 电热负荷。",Tu="-22 -7 54 14",Au=54,Cu=14,Iu='<line x1="-20" y1="0" x2="-10" y2="0" fill="none" stroke="black" stroke-width="1"/><rect x="-10" y="-5" width="30" height="10" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="0" x2="30" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-5" x2="-5" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-5" x2="5" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="15" y1="-5" x2="15" y2="5" fill="none" stroke="black" stroke-width="1"/>',Pu=[{id:"t1",x:-20,y:0,orientation:"w"},{id:"t2",x:30,y:0,orientation:"e"}],Ou=[{name:"P",label:"功率",type:"number",unit:"kW",showOnCanvas:!0}],Bu={kind:"elmt",path:"91_en_60617/en_60617_04/en_60617_04_01/en_60617_04_01_12.elmt",qetEnglishName:"Heating element"},gk={id:ju,name:Eu,category:Nu,description:Mu,viewBox:Tu,width:Au,height:Cu,svg:Iu,terminals:Pu,params:Ou,source:Bu},yk=Object.freeze(Object.defineProperty({__proto__:null,category:Nu,default:gk,description:Mu,height:Cu,id:ju,name:Eu,params:Ou,source:Bu,svg:Iu,terminals:Pu,viewBox:Tu,width:Au},Symbol.toStringTag,{value:"Module"})),Lu="igbt",zu="绝缘栅双极晶体管 (IGBT)",Ru="passive",Du="N 沟道增强型 IGBT。t1=集电极(上), t2=发射极(下), t_g=门极。",Fu="-32 -32 54 74",Hu=54,Wu=74,qu='<line x1="0" y1="25" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polyline points="-30,20 -5,20 -5,-20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-15" x2="20" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="20" y2="40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="15" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-25" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-8" x2="0" y2="8" fill="none" stroke="black" stroke-width="1"/><polyline points="10,-24 8,-21 12,-22" fill="none" stroke="black" stroke-width="1"/><polyline points="10,25 11,29 8,27" fill="none" stroke="black" stroke-width="1"/>',Gu=[{id:"t1",x:20,y:-30,orientation:"n"},{id:"t2",x:20,y:40,orientation:"s"},{id:"t_g",x:-30,y:20,orientation:"w"}],Xu={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_05/en_60617_05_05_19.elmt",qetEnglishName:"Insulated-gate bipolar transistor (IGBT) enhancement type, N channel"},xk={id:Lu,name:zu,category:Ru,description:Du,viewBox:Fu,width:Hu,height:Wu,svg:qu,terminals:Gu,source:Xu},bk=Object.freeze(Object.defineProperty({__proto__:null,category:Ru,default:xk,description:Du,height:Wu,id:Lu,name:zu,source:Xu,svg:qu,terminals:Gu,viewBox:Fu,width:Hu},Symbol.toStringTag,{value:"Module"})),Ku="indicator-light",Yu="指示灯 (HL)",Vu="control",Uu="信号 / 状态指示灯。",Ju="-12 -22 24 24",Zu=24,Qu=24,em='<ellipse cx="0" cy="-10" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-3" x2="7" y2="-17" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-17" x2="7" y2="-3" fill="none" stroke="black" stroke-width="1"/>',tm=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],nm=[{name:"color",label:"颜色",type:"string"}],om={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_01.elmt",qetEnglishName:"Lamp, general symbol"},wk={id:Ku,name:Yu,category:Vu,description:Uu,viewBox:Ju,width:Zu,height:Qu,svg:em,terminals:tm,params:nm,source:om},vk=Object.freeze(Object.defineProperty({__proto__:null,category:Vu,default:wk,description:Uu,height:Qu,id:Ku,name:Yu,params:nm,source:om,svg:em,terminals:tm,viewBox:Ju,width:Zu},Symbol.toStringTag,{value:"Module"})),rm="inductor",sm="电感 (L)",im="passive",am="通用电感 / 线圈 / 扼流圈。",lm="-17 -32 34 64",cm=34,dm=64,um='<line x1="0" y1="15" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><path d="M 0 15 A 15 15 0 1 0 -15 0" fill="none" stroke="black" stroke-width="1"/><line x1="-15" y1="0" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/>',mm=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],fm=[{name:"L",label:"电感量",type:"number",unit:"mH",showOnCanvas:!0},{name:"In",label:"额定电流",type:"number",unit:"A"}],hm={x:6,y:0,anchor:"start"},pm={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/30_inductors/inductance.elmt",qetEnglishName:"Inductor"},kk={id:rm,name:sm,category:im,description:am,viewBox:lm,width:cm,height:dm,svg:um,terminals:mm,params:fm,label:hm,source:pm},_k=Object.freeze(Object.defineProperty({__proto__:null,category:im,default:kk,description:am,height:dm,id:rm,label:hm,name:sm,params:fm,source:pm,svg:um,terminals:mm,viewBox:lm,width:cm},Symbol.toStringTag,{value:"Module"})),gm="inverter",ym="逆变器 (DC→AC)",xm="renewable",bm="-42 -42 44 44",wm=44,vm=44,km='<path d="M -15 -8 A 5 2.5 0 0 0 -25 -8" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><path d="M -15 -8 A 5 2.5 0 0 0 -5 -8" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-36" y1="-36" x2="-20" y2="-36" fill="none" stroke="black" stroke-width="1"/><line x1="-36" y1="-32" x2="-30" y2="-32" fill="none" stroke="black" stroke-width="1"/><line x1="-26" y1="-32" x2="-20" y2="-32" fill="none" stroke="black" stroke-width="1"/>',_m=[{id:"t_dc",x:-20,y:-40,orientation:"n"},{id:"t_ac",x:-20,y:0,orientation:"s"}],$m={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_05.elmt",qetEnglishName:"Inverter"},$k={id:gm,name:ym,category:xm,viewBox:bm,width:wm,height:vm,svg:km,terminals:_m,source:$m},Sk=Object.freeze(Object.defineProperty({__proto__:null,category:xm,default:$k,height:vm,id:gm,name:ym,source:$m,svg:km,terminals:_m,viewBox:bm,width:wm},Symbol.toStringTag,{value:"Module"})),Sm="limit-switch",jm="限位开关 (SQ)",Em="control",Nm="行程 / 位置开关 (常开, 机械操作)。",Mm="-10 -42 12 64",Tm=12,Am=64,Cm='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-13" x2="-7" y2="-12" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-12" x2="-3" y2="-8" fill="none" stroke="black" stroke-width="1"/>',Im=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Pm=[{name:"closed",type:"boolean",default:!1,label:"闭合"}],Om={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_08/en_60617_07_08_01.elmt",qetEnglishName:"Position switch, make contact"},jk={id:Sm,name:jm,category:Em,description:Nm,viewBox:Mm,width:Tm,height:Am,svg:Cm,terminals:Im,state:Pm,source:Om},Ek=Object.freeze(Object.defineProperty({__proto__:null,category:Em,default:jk,description:Nm,height:Am,id:Sm,name:jm,source:Om,state:Pm,svg:Cm,terminals:Im,viewBox:Mm,width:Tm},Symbol.toStringTag,{value:"Module"})),Bm="load-switch",Lm="负荷开关",zm="switching",Rm="-10 -42 14 64",Dm=14,Fm=64,Hm='<line x1="0" y1="-24" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-22" rx="2" ry="2" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-24" x2="2" y2="-24" fill="none" stroke="black" stroke-width="1"/>',Wm=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],qm=[{name:"open",type:"boolean",default:!1,label:"断开"}],Gm={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_08.elmt",qetEnglishName:"Switch-disconnector; On-load isolating switch"},Nk={id:Bm,name:Lm,category:zm,viewBox:Rm,width:Dm,height:Fm,svg:Hm,terminals:Wm,state:qm,source:Gm},Mk=Object.freeze(Object.defineProperty({__proto__:null,category:zm,default:Nk,height:Fm,id:Bm,name:Lm,source:Gm,state:qm,svg:Hm,terminals:Wm,viewBox:Rm,width:Dm},Symbol.toStringTag,{value:"Module"})),Xm="load",Km="负荷",Ym="load",Vm="抽象负荷(电流流出箭头)",Um="-8 -22 16 46",Jm=16,Zm=46,Qm='<line x1="0" y1="-20" x2="0" y2="10" stroke="black" stroke-width="1" fill="none"/><polygon points="-6,10 6,10 0,22" fill="black" stroke="black" stroke-width="1"/>',ef=[{id:"t_top",x:0,y:-20,orientation:"n"}],tf=[{name:"P",label:"有功功率",type:"number",unit:"MW",showOnCanvas:!0},{name:"cosphi",label:"功率因数",type:"number"}],nf={x:6,y:0,anchor:"start"},of={kind:"inline"},Tk={id:Xm,name:Km,category:Ym,description:Vm,viewBox:Um,width:Jm,height:Zm,svg:Qm,terminals:ef,params:tf,label:nf,source:of},Ak=Object.freeze(Object.defineProperty({__proto__:null,category:Ym,default:Tk,description:Vm,height:Zm,id:Xm,label:nf,name:Km,params:tf,source:of,svg:Qm,terminals:ef,viewBox:Um,width:Jm},Symbol.toStringTag,{value:"Module"})),rf="make-contact",sf="常开触点 (NO)",af="control",lf="常开辅助触点 (make contact)。",cf="-10 -42 12 64",df=12,uf=64,mf='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/>',ff=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],hf=[{name:"closed",type:"boolean",default:!1,label:"闭合"}],pf={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_02/en_60617_07_02_01.elmt",qetEnglishName:"Make contact, general symbol; Switch, general symbol"},Ck={id:rf,name:sf,category:af,description:lf,viewBox:cf,width:df,height:uf,svg:mf,terminals:ff,state:hf,source:pf},Ik=Object.freeze(Object.defineProperty({__proto__:null,category:af,default:Ck,description:lf,height:uf,id:rf,name:sf,source:pf,state:hf,svg:mf,terminals:ff,viewBox:cf,width:df},Symbol.toStringTag,{value:"Module"})),gf="motor-starter",yf="电机启动器",xf="motor-control",bf="电机启动器 (IEC 60617 通用符号)。",wf="-22 -27 44 54",vf=44,kf=54,_f='<rect x="-20" y="-20" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><polyline points="-20,-20 0,-10 20,-20" fill="none" stroke="black" stroke-width="1"/>',$f=[{id:"t_top",x:0,y:-25,orientation:"n"},{id:"t_bottom",x:0,y:25,orientation:"s"}],Sf={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_14/en_60617_07_14_01.elmt",qetEnglishName:"Motor starter, general symbol"},Pk={id:gf,name:yf,category:xf,description:bf,viewBox:wf,width:vf,height:kf,svg:_f,terminals:$f,source:Sf},Ok=Object.freeze(Object.defineProperty({__proto__:null,category:xf,default:Pk,description:bf,height:kf,id:gf,name:yf,source:Sf,svg:_f,terminals:$f,viewBox:wf,width:vf},Symbol.toStringTag,{value:"Module"})),jf="ngr",Ef="中性点电阻 (NGR)",Nf="grounding",Mf="小电阻接地:连接变压器中性点到地",Tf="-12 -32 24 62",Af=24,Cf=62,If='<line x1="0" y1="-30" x2="0" y2="-15" fill="none" stroke="black" stroke-width="1"/><rect x="-6" y="-15" width="12" height="22" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="7" x2="0" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="15" x2="10" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="19" x2="7" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="23" x2="4" y2="23" fill="none" stroke="black" stroke-width="1"/><line x1="-1.5" y1="27" x2="1.5" y2="27" fill="none" stroke="black" stroke-width="1"/>',Pf=[{id:"t_top",x:0,y:-30,orientation:"n"}],Of=[{name:"R",label:"电阻",type:"number",unit:"Ω"}],Bf={kind:"inline"},Bk={id:jf,name:Ef,category:Nf,description:Mf,viewBox:Tf,width:Af,height:Cf,svg:If,terminals:Pf,params:Of,source:Bf},Lk=Object.freeze(Object.defineProperty({__proto__:null,category:Nf,default:Bk,description:Mf,height:Cf,id:jf,name:Ef,params:Of,source:Bf,svg:If,terminals:Pf,viewBox:Tf,width:Af},Symbol.toStringTag,{value:"Module"})),Lf="overcurrent-relay",zf="过流继电器 (50/51)",Rf="protection",Df="过电流保护继电器 (ANSI 50/51)。",Ff="-62 -62 64 64",Hf=64,Wf=64,qf='<rect x="-60" y="-60" width="60" height="60" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-48" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">5...10A</text>',Gf=[{id:"t_top",x:-30,y:-60,orientation:"n"}],Xf={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_05.elmt",qetEnglishName:"Overcurrent relay"},zk={id:Lf,name:zf,category:Rf,description:Df,viewBox:Ff,width:Hf,height:Wf,svg:qf,terminals:Gf,source:Xf},Rk=Object.freeze(Object.defineProperty({__proto__:null,category:Rf,default:zk,description:Df,height:Wf,id:Lf,name:zf,source:Xf,svg:qf,terminals:Gf,viewBox:Ff,width:Hf},Symbol.toStringTag,{value:"Module"})),Kf="phase-failure-relay",Yf="断相继电器",Vf="protection",Uf="断相 / 缺相保护继电器。",Jf="-62 -42 64 44",Zf=64,Qf=44,eh='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-46" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">m &lt; 3</text>',th=[{id:"t_top",x:-30,y:-40,orientation:"n"}],nh={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_12.elmt",qetEnglishName:"Phase-failure detection relay"},Dk={id:Kf,name:Yf,category:Vf,description:Uf,viewBox:Jf,width:Zf,height:Qf,svg:eh,terminals:th,source:nh},Fk=Object.freeze(Object.defineProperty({__proto__:null,category:Vf,default:Dk,description:Uf,height:Qf,id:Kf,name:Yf,source:nh,svg:eh,terminals:th,viewBox:Jf,width:Zf},Symbol.toStringTag,{value:"Module"})),oh="plc",rh="PLC / 控制器",sh="control",ih="可编程逻辑控制器 (PLC)。",ah="-24 -42 48 84",lh=48,ch=84,dh='<rect x="-22" y="-22" width="44" height="44" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">PLC</text><line x1="0" y1="-40" x2="0" y2="-22" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="22" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',uh=[{id:"t_top",x:0,y:-40,orientation:"n"},{id:"t_bottom",x:0,y:40,orientation:"s"}],mh={kind:"inline"},Hk={id:oh,name:rh,category:sh,description:ih,viewBox:ah,width:lh,height:ch,svg:dh,terminals:uh,source:mh},Wk=Object.freeze(Object.defineProperty({__proto__:null,category:sh,default:Hk,description:ih,height:ch,id:oh,name:rh,source:mh,svg:dh,terminals:uh,viewBox:ah,width:lh},Symbol.toStringTag,{value:"Module"})),fh="power-factor-meter",hh="功率因数表 (cosφ)",ph="measurement",gh="功率因数表 (cosφ)。",yh="-22 -42 44 44",xh=44,bh=44,wh='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-14" y="-6.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">cos φ</text>',vh=[{id:"t_top",x:0,y:-40,orientation:"n"}],kh={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_05.elmt",qetEnglishName:"Power-factor meter"},qk={id:fh,name:hh,category:ph,description:gh,viewBox:yh,width:xh,height:bh,svg:wh,terminals:vh,source:kh},Gk=Object.freeze(Object.defineProperty({__proto__:null,category:ph,default:qk,description:gh,height:bh,id:fh,name:hh,source:kh,svg:wh,terminals:vh,viewBox:yh,width:xh},Symbol.toStringTag,{value:"Module"})),_h="power-supply",$h="开关电源 (PS)",Sh="source",jh="AC→DC 开关电源 / 直流电源模块。t_ac 上(~), t_dc 下(=)。",Eh="-24 -42 48 84",Nh=48,Mh=84,Th='<rect x="-22" y="-20" width="44" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-22" y1="20" x2="22" y2="-20" stroke="black" stroke-width="1" fill="none"/><text x="-15" y="-5" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~</text><text x="8" y="15" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">=</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Ah=[{id:"t_ac",x:0,y:-40,orientation:"n"},{id:"t_dc",x:0,y:40,orientation:"s"}],Ch=[{name:"Vdc",label:"输出电压",type:"number",unit:"V",showOnCanvas:!0}],Ih={kind:"inline"},Xk={id:_h,name:$h,category:Sh,description:jh,viewBox:Eh,width:Nh,height:Mh,svg:Th,terminals:Ah,params:Ch,source:Ih},Kk=Object.freeze(Object.defineProperty({__proto__:null,category:Sh,default:Xk,description:jh,height:Mh,id:_h,name:$h,params:Ch,source:Ih,svg:Th,terminals:Ah,viewBox:Eh,width:Nh},Symbol.toStringTag,{value:"Module"})),Ph="protective-relay",Oh="保护继电器",Bh="protection",Lh="测量继电器 / 保护继电器通用符号 (IEC 60617)。",zh="-32 -42 64 44",Rh=64,Dh=44,Fh='<polygon points="-2,-22 2,-22 0,-25" fill="black" stroke="black" stroke-width="1"/><polygon points="-2,-22 -2,-19 -6,-20" fill="black" stroke="black" stroke-width="1"/><polygon points="2,-22 2,-19 6,-20" fill="black" stroke="black" stroke-width="1"/><polygon points="-2,-19 0,-17 -3,-15" fill="black" stroke="black" stroke-width="1"/><polygon points="0,-17 2,-19 4,-15" fill="black" stroke="black" stroke-width="1"/><rect x="-2" y="-22" width="4" height="4" rx="0" ry="0" fill="black" stroke="black" stroke-width="1"/><rect x="-30" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Hh=[{id:"t_top",x:0,y:-40,orientation:"n"}],Wh={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_16/en_60617_07_16_01.elmt",qetEnglishName:"Measuring relay; Device related to a measuring relay"},Yk={id:Ph,name:Oh,category:Bh,description:Lh,viewBox:zh,width:Rh,height:Dh,svg:Fh,terminals:Hh,source:Wh},Vk=Object.freeze(Object.defineProperty({__proto__:null,category:Bh,default:Yk,description:Lh,height:Dh,id:Ph,name:Oh,source:Wh,svg:Fh,terminals:Hh,viewBox:zh,width:Rh},Symbol.toStringTag,{value:"Module"})),qh="proximity-switch",Gh="接近开关 (SQ)",Xh="control",Kh="接近传感器 / 无触点接近开关。",Yh="-12 -32 24 64",Vh=24,Uh=64,Jh='<line x1="0" y1="-30" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="30" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polygon points="0,-10 -10,0 0,10 10,0" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-6" x2="-4" y2="6" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="-6" x2="4" y2="6" fill="none" stroke="black" stroke-width="1"/>',Zh=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],Qh={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_19/en_60617_07_19_01.elmt",qetEnglishName:"Proximity sensor"},Uk={id:qh,name:Gh,category:Xh,description:Kh,viewBox:Yh,width:Vh,height:Uh,svg:Jh,terminals:Zh,source:Qh},Jk=Object.freeze(Object.defineProperty({__proto__:null,category:Xh,default:Uk,description:Kh,height:Uh,id:qh,name:Gh,source:Qh,svg:Jh,terminals:Zh,viewBox:Yh,width:Vh},Symbol.toStringTag,{value:"Module"})),e0="pt",t0="电压互感器 (PT)",n0="instrument-transformer",o0="-22 -42 44 115",r0=44,s0=115,i0='<ellipse cx="0" cy="1" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-40" x2="0" y2="-20" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="30" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="-0.13" y1="51" x2="-0.13" y2="71" fill="none" stroke="black" stroke-width="1"/>',a0=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:71,orientation:"s"}],l0={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_13/en_60617_06_13_01A.elmt",qetEnglishName:"Voltage transformer"},Zk={id:e0,name:t0,category:n0,viewBox:o0,width:r0,height:s0,svg:i0,terminals:a0,source:l0},Qk=Object.freeze(Object.defineProperty({__proto__:null,category:n0,default:Zk,height:s0,id:e0,name:t0,source:l0,svg:i0,terminals:a0,viewBox:o0,width:r0},Symbol.toStringTag,{value:"Module"})),c0="push-button",d0="按钮 (SB)",u0="control",m0="手动按钮, 自动复位 (常开 make)。",f0="-37 -42 39 64",h0=39,p0=64,g0='<line x1="-35" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1" stroke-dasharray="4 2"/><line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-15" x2="-35" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-15" x2="-30" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-5" x2="-35" y2="-5" fill="none" stroke="black" stroke-width="1"/>',y0=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],x0={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_07/en_60617_07_07_02.elmt",qetEnglishName:"Switch, manually operated, push-button, automatic return"},e_={id:c0,name:d0,category:u0,description:m0,viewBox:f0,width:h0,height:p0,svg:g0,terminals:y0,source:x0},t_=Object.freeze(Object.defineProperty({__proto__:null,category:u0,default:e_,description:m0,height:p0,id:c0,name:d0,source:x0,svg:g0,terminals:y0,viewBox:f0,width:h0},Symbol.toStringTag,{value:"Module"})),b0="pv",w0="光伏组件",v0="renewable",k0="-33 -22 85 64",_0=85,$0=64,S0='<line x1="-16" y1="24" x2="-26" y2="14" fill="none" stroke="black" stroke-width="1"/><line x1="-21" y1="29" x2="-31" y2="19" fill="none" stroke="black" stroke-width="1"/><polygon points="-20,23 -17,20 -15,25" fill="black" stroke="black" stroke-width="1"/><polygon points="-22,25 -25,28 -20,30" fill="black" stroke="black" stroke-width="1"/><rect x="-10" y="-20" width="60" height="60" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="15" y="7.2" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">G</text><line x1="10" y1="20" x2="20" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="15" x2="20" y2="25" fill="none" stroke="black" stroke-width="1"/><line x1="25" y1="10" x2="25" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="25" y1="20" x2="35" y2="20" fill="none" stroke="black" stroke-width="1"/>',j0=[{id:"t_dc",x:50,y:10,orientation:"e"}],E0={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_18/en_60617_06_18_06.elmt",qetEnglishName:"Photovoltaic generator"},n_={id:b0,name:w0,category:v0,viewBox:k0,width:_0,height:$0,svg:S0,terminals:j0,source:E0},o_=Object.freeze(Object.defineProperty({__proto__:null,category:v0,default:n_,height:$0,id:b0,name:w0,source:E0,svg:S0,terminals:j0,viewBox:k0,width:_0},Symbol.toStringTag,{value:"Module"})),N0="rcd",M0="剩余电流装置 (RCD)",T0="protection",A0="不带过流保护的剩余电流断路器 (IEC 61008)。",C0="-12 -22 19 44",I0=19,P0=44,O0='<line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-12" x2="2" y2="-8" fill="none" stroke="black" stroke-width="1"/><polyline points="0,20 0,10 -7,-9" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="13" rx="4.5" ry="2" fill="none" stroke="black" stroke-width="1"/><polyline points="-4,0 -10,0 -10,13 -5,13" fill="none" stroke="black" stroke-width="0.4" stroke-dasharray="4 2"/>',B0=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],L0=[{name:"open",type:"boolean",default:!1,label:"断开"}],z0=[{name:"IDn",label:"剩余动作电流",type:"number",unit:"mA",default:30}],R0={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/50_residual_current_circuit_breaker/ddr1.elmt",qetEnglishName:"Residual Circuit Breaker with Overload"},r_={id:N0,name:M0,category:T0,description:A0,viewBox:C0,width:I0,height:P0,svg:O0,terminals:B0,state:L0,params:z0,source:R0},s_=Object.freeze(Object.defineProperty({__proto__:null,category:T0,default:r_,description:A0,height:P0,id:N0,name:M0,params:z0,source:R0,state:L0,svg:O0,terminals:B0,viewBox:C0,width:I0},Symbol.toStringTag,{value:"Module"})),D0="recloser",F0="重合闸 (Recloser)",H0="protection",W0="中压自动重合闸开关。",q0="-12 -32 36 64",G0=36,X0=64,K0='<line x1="0" y1="-30" x2="0" y2="-10" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="-8" y2="-13" stroke="black" stroke-width="1" fill="none"/><line x1="-2" y1="-8" x2="2" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="-2" y1="-12" x2="2" y2="-8" stroke="black" stroke-width="1" fill="none"/><path d="M 13 -12 A 7 7 0 1 1 6 -5" fill="none" stroke="black" stroke-width="0.8"/><polygon points="4,-7 6,-5 8,-3" fill="black"/><text x="14" y="6" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">AR</text>',Y0=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],V0=[{name:"open",type:"boolean",default:!1,label:"断开"}],U0={kind:"inline"},i_={id:D0,name:F0,category:H0,description:W0,viewBox:q0,width:G0,height:X0,svg:K0,terminals:Y0,state:V0,source:U0},a_=Object.freeze(Object.defineProperty({__proto__:null,category:H0,default:i_,description:W0,height:X0,id:D0,name:F0,source:U0,state:V0,svg:K0,terminals:Y0,viewBox:q0,width:G0},Symbol.toStringTag,{value:"Module"})),J0="rectifier",Z0="整流器 (AC→DC)",Q0="renewable",ep="-42 -42 44 44",tp=44,np=44,op='<line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-8" x2="-4" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-4" x2="-14" y2="-4" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-4" x2="-4" y2="-4" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -35 -30" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -15 -30" fill="none" stroke="black" stroke-width="1"/>',rp=[{id:"t_ac",x:-20,y:-40,orientation:"n"},{id:"t_dc",x:-20,y:0,orientation:"s"}],sp={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_03.elmt",qetEnglishName:"Rectifier"},l_={id:J0,name:Z0,category:Q0,viewBox:ep,width:tp,height:np,svg:op,terminals:rp,source:sp},c_=Object.freeze(Object.defineProperty({__proto__:null,category:Q0,default:l_,height:np,id:J0,name:Z0,source:sp,svg:op,terminals:rp,viewBox:ep,width:tp},Symbol.toStringTag,{value:"Module"})),ip="relay-coil",ap="继电器线圈 (KA)",lp="control",cp="继电器 / 接触器操作线圈 (方框)。",dp="-22 -22 44 44",up=44,mp=44,fp='<rect x="-20" y="-10" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/>',hp=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],pp={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_15/en_60617_07_15_01.elmt",qetEnglishName:"Operating device, general symbol; Relay coil, general symbol"},d_={id:ip,name:ap,category:lp,description:cp,viewBox:dp,width:up,height:mp,svg:fp,terminals:hp,source:pp},u_=Object.freeze(Object.defineProperty({__proto__:null,category:lp,default:d_,description:cp,height:mp,id:ip,name:ap,source:pp,svg:fp,terminals:hp,viewBox:dp,width:up},Symbol.toStringTag,{value:"Module"})),gp="resistor",yp="电阻 (R)",xp="passive",bp="通用电阻 / 限流 / 制动电阻。",wp="-6 -23 12 35",vp=12,kp=35,_p='<line x1="0" y1="-10" x2="0" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="10" x2="4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="10" x2="4" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-10" x2="-4" y2="10" fill="none" stroke="black" stroke-width="1"/>',$p=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t2",x:0,y:10,orientation:"s"}],Sp=[{name:"R",label:"阻值",type:"number",unit:"Ω",showOnCanvas:!0},{name:"P",label:"额定功率",type:"number",unit:"W"}],jp={x:6,y:0,anchor:"start"},Ep={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/10_resistors/resistance.elmt",qetEnglishName:"Resistor"},m_={id:gp,name:yp,category:xp,description:bp,viewBox:wp,width:vp,height:kp,svg:_p,terminals:$p,params:Sp,label:jp,source:Ep},f_=Object.freeze(Object.defineProperty({__proto__:null,category:xp,default:m_,description:bp,height:kp,id:gp,label:jp,name:yp,params:Sp,source:Ep,svg:_p,terminals:$p,viewBox:wp,width:vp},Symbol.toStringTag,{value:"Module"})),Np="reverse-power-relay",Mp="逆功率继电器 (32)",Tp="protection",Ap="逆功率 / 逆流保护继电器 (ANSI 32)。",Cp="-62 -42 64 44",Ip=64,Pp=44,Op='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-46" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">I</text><polygon points="-15,-20 -30,-20 -24,-22 -24,-18 -30,-20 -24,-20" fill="black" stroke="black" stroke-width="1"/>',Bp=[{id:"t_top",x:-30,y:-40,orientation:"n"}],Lp={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_02.elmt",qetEnglishName:"Reverse current relay"},h_={id:Np,name:Mp,category:Tp,description:Ap,viewBox:Cp,width:Ip,height:Pp,svg:Op,terminals:Bp,source:Lp},p_=Object.freeze(Object.defineProperty({__proto__:null,category:Tp,default:h_,description:Ap,height:Pp,id:Np,name:Mp,source:Lp,svg:Op,terminals:Bp,viewBox:Cp,width:Ip},Symbol.toStringTag,{value:"Module"})),zp="selector-switch",Rp="选择开关 (SA)",Dp="switching",Fp="转换 / 选择开关 (旋转操作, 保位)。",Hp="-34 -42 36 64",Wp=36,qp=64,Gp='<line x1="-32" y1="-10" x2="-2" y2="-10" fill="none" stroke="black" stroke-width="1" stroke-dasharray="4 2"/><line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-32" y1="-15" x2="-32" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/>',Xp=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Kp=[{name:"open",type:"boolean",default:!1,label:"断开"}],Yp={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_07/en_60617_07_07_04.elmt",qetEnglishName:"Switch, manually operated, turning, stay-put"},g_={id:zp,name:Rp,category:Dp,description:Fp,viewBox:Hp,width:Wp,height:qp,svg:Gp,terminals:Xp,state:Kp,source:Yp},y_=Object.freeze(Object.defineProperty({__proto__:null,category:Dp,default:g_,description:Fp,height:qp,id:zp,name:Rp,source:Yp,state:Kp,svg:Gp,terminals:Xp,viewBox:Hp,width:Wp},Symbol.toStringTag,{value:"Module"})),Vp="series-reactor",Up="串联电抗器",Jp="compensation",Zp="与并联电抗器同符号;通过用法区分。",Qp="-62 -82 64 104",eg=64,tg=104,ng='<line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M -30 0 A 30 30 0 1 0 -60 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-60" y1="-30" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/>',og=[{id:"t1",x:-30,y:-80,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],rg={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_08.elmt",qetEnglishName:"Choke; Reactor, general symbol"},x_={id:Vp,name:Up,category:Jp,description:Zp,viewBox:Qp,width:eg,height:tg,svg:ng,terminals:og,source:rg},b_=Object.freeze(Object.defineProperty({__proto__:null,category:Jp,default:x_,description:Zp,height:tg,id:Vp,name:Up,source:rg,svg:ng,terminals:og,viewBox:Qp,width:eg},Symbol.toStringTag,{value:"Module"})),sg="shunt-capacitor",ig="并联电容器",ag="compensation",lg="-7 -23 14 27",cg=14,dg=27,ug='<line x1="-5" y1="2" x2="5" y2="2" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-2" x2="5" y2="-2" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-2" fill="none" stroke="black" stroke-width="1"/>',mg=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t_bottom",x:0,y:2,orientation:"s"}],fg=[{name:"Q",label:"无功容量",type:"number",unit:"Mvar"},{name:"stages",label:"分组数",type:"number"}],hg={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/20_capacitors/capacite.elmt",qetEnglishName:"Capacitor"},w_={id:sg,name:ig,category:ag,viewBox:lg,width:cg,height:dg,svg:ug,terminals:mg,params:fg,source:hg},v_=Object.freeze(Object.defineProperty({__proto__:null,category:ag,default:w_,height:dg,id:sg,name:ig,params:fg,source:hg,svg:ug,terminals:mg,viewBox:lg,width:cg},Symbol.toStringTag,{value:"Module"})),pg="shunt-reactor",gg="并联电抗器",yg="compensation",xg="-62 -82 64 104",bg=64,wg=104,vg='<line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M -30 0 A 30 30 0 1 0 -60 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-60" y1="-30" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/>',kg=[{id:"t1",x:-30,y:-80,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],_g={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_08.elmt",qetEnglishName:"Choke; Reactor, general symbol"},k_={id:pg,name:gg,category:yg,viewBox:xg,width:bg,height:wg,svg:vg,terminals:kg,source:_g},__=Object.freeze(Object.defineProperty({__proto__:null,category:yg,default:k_,height:wg,id:pg,name:gg,source:_g,svg:vg,terminals:kg,viewBox:xg,width:bg},Symbol.toStringTag,{value:"Module"})),$g="siren",Sg="警笛 (HA)",jg="control",Eg="声响警笛 / 报警器。",Ng="-32 -42 44 54",Mg=44,Tg=54,Ag='<line x1="-20" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-10" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polygon points="10,-10 -30,-10 -10,-40" fill="none" stroke="black" stroke-width="1"/>',Cg=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],Ig={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_09.elmt",qetEnglishName:"Siren"},$_={id:$g,name:Sg,category:jg,description:Eg,viewBox:Ng,width:Mg,height:Tg,svg:Ag,terminals:Cg,source:Ig},S_=Object.freeze(Object.defineProperty({__proto__:null,category:jg,default:$_,description:Eg,height:Tg,id:$g,name:Sg,source:Ig,svg:Ag,terminals:Cg,viewBox:Ng,width:Mg},Symbol.toStringTag,{value:"Module"})),Pg="socket-outlet",Og="插座 / 连接器",Bg="load",Lg="电源插座 / 多极连接器。",zg="-7 -2 13 34",Rg=13,Dg=34,Fg='<line x1="-5" y1="13" x2="4" y2="20" fill="none" stroke="black" stroke-width="0.4"/><line x1="-1" y1="12" x2="-1" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="12" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="9" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="1" y1="12" x2="1" y2="19" fill="none" stroke="black" stroke-width="1"/><path d="M 3 13 A 3 3 0 0 0 -3 13" fill="none" stroke="black" stroke-width="1"/>',Hg=[{id:"t1",x:0,y:0,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],Wg={kind:"elmt",path:"11_singlepole/140_connectors_plugs/prise_multipolaire_2.elmt",qetEnglishName:`Plug and multipolar representation
197
- unifilar`},j_={id:Pg,name:Og,category:Bg,description:Lg,viewBox:zg,width:Rg,height:Dg,svg:Fg,terminals:Hg,source:Wg},E_=Object.freeze(Object.defineProperty({__proto__:null,category:Bg,default:j_,description:Lg,height:Dg,id:Pg,name:Og,source:Wg,svg:Fg,terminals:Hg,viewBox:zg,width:Rg},Symbol.toStringTag,{value:"Module"})),qg="soft-starter",Gg="软启动器",Xg="motor-control",Kg="电机软启动器 (晶闸管降压启动)。",Yg="-22 -42 44 84",Vg=44,Ug=84,Jg='<rect x="-20" y="-20" width="40" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-12" y1="-12" x2="12" y2="12" stroke="black" stroke-width="1" fill="none"/><polygon points="4,8 12,12 8,4" fill="none" stroke="black" stroke-width="1"/><text x="-12" y="-2" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">SS</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Zg=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],Qg={kind:"inline"},N_={id:qg,name:Gg,category:Xg,description:Kg,viewBox:Yg,width:Vg,height:Ug,svg:Jg,terminals:Zg,source:Qg},M_=Object.freeze(Object.defineProperty({__proto__:null,category:Xg,default:N_,description:Kg,height:Ug,id:qg,name:Gg,source:Qg,svg:Jg,terminals:Zg,viewBox:Yg,width:Vg},Symbol.toStringTag,{value:"Module"})),e1="sync-motor",t1="同步电动机",n1="load",o1="-62 -82 64 114",r1=64,s1=114,i1='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><line x1="-50" y1="-80" x2="-50" y2="-53" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-53" x2="-10" y2="-80" fill="none" stroke="black" stroke-width="1"/><text x="-45" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">1</text><path d="M -25 -20 A 5 2.5 0 0 0 -35 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -20 A 5 2.5 0 0 0 -15 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -40 10 A 5 5 0 0 0 -50 10" fill="none" stroke="black" stroke-width="1"/><path d="M -30 10 A 5 5 0 0 0 -40 10" fill="none" stroke="black" stroke-width="1"/><path d="M -20 10 A 5 5 0 0 0 -30 10" fill="none" stroke="black" stroke-width="1"/><path d="M -10 10 A 5 5 0 0 0 -20 10" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="10" x2="-50" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="10" x2="-10" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="15" x2="-20" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="20" x2="-32" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-27" y1="20" x2="-20" y2="20" fill="none" stroke="black" stroke-width="1"/>',a1=[{id:"t1",x:-10,y:-80,orientation:"n"},{id:"t2",x:-50,y:-80,orientation:"n"}],l1={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_07/en_60617_06_07_02.elmt",qetEnglishName:"Synchronous motor, single-phase"},T_={id:e1,name:t1,category:n1,viewBox:o1,width:r1,height:s1,svg:i1,terminals:a1,source:l1},A_=Object.freeze(Object.defineProperty({__proto__:null,category:n1,default:T_,height:s1,id:e1,name:t1,source:l1,svg:i1,terminals:a1,viewBox:o1,width:r1},Symbol.toStringTag,{value:"Module"})),c1="synchronoscope",d1="同步表",u1="measurement",m1="同步指示器 / 同步表。",f1="-22 -42 44 44",h1=44,p1=44,g1='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-5" x2="0" y2="-35" fill="none" stroke="black" stroke-width="1"/><path d="M 12.374 -30.374 A 17.5 17.5 0 0 0 -12.374 -30.374" fill="none" stroke="black" stroke-width="1"/><polygon points="-13,-30 -11,-33 -10,-31" fill="none" stroke="black" stroke-width="1"/><polygon points="11,-33 13,-30 10,-31" fill="none" stroke="black" stroke-width="1"/>',y1=[{id:"t_top",x:0,y:-40,orientation:"n"}],x1={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_08.elmt",qetEnglishName:"Synchronoscope"},C_={id:c1,name:d1,category:u1,description:m1,viewBox:f1,width:h1,height:p1,svg:g1,terminals:y1,source:x1},I_=Object.freeze(Object.defineProperty({__proto__:null,category:u1,default:C_,description:m1,height:p1,id:c1,name:d1,source:x1,svg:g1,terminals:y1,viewBox:f1,width:h1},Symbol.toStringTag,{value:"Module"})),b1="terminal",w1="接线端子 / 节点 (X)",v1="busbar",k1="接线端子 / 接线盒 / 汇接节点。",_1="-5 -5 10 10",$1=10,S1=10,j1='<ellipse cx="0" cy="0" rx="2.5" ry="2.5" fill="black" stroke="black" stroke-width="1"/>',E1=[{id:"t_top",x:0,y:-2.5,orientation:"n"},{id:"t_bottom",x:0,y:2.5,orientation:"s"},{id:"t_left",x:-2.5,y:0,orientation:"w"},{id:"t_right",x:2.5,y:0,orientation:"e"}],N1={kind:"elmt",path:"91_en_60617/en_60617_03/en_60617_03_02/en_60617_03_02_02.elmt",qetEnglishName:"Terminal"},P_={id:b1,name:w1,category:v1,description:k1,viewBox:_1,width:$1,height:S1,svg:j1,terminals:E1,source:N1},O_=Object.freeze(Object.defineProperty({__proto__:null,category:v1,default:P_,description:k1,height:S1,id:b1,name:w1,source:N1,svg:j1,terminals:E1,viewBox:_1,width:$1},Symbol.toStringTag,{value:"Module"})),M1="thermal-overload",T1="热过载继电器",A1="motor-control",C1="电机热过载保护继电器, 通常串接在接触器和电机之间。",I1="-9 -32 19 64",P1=19,O1=64,B1='<line x1="0" y1="-30" x2="0" y2="-15" stroke="black" stroke-width="1" fill="none"/><rect x="-7" y="-15" width="14" height="30" fill="none" stroke="black" stroke-width="1"/><polyline points="-4,-10 -1,-5 -4,0 -1,5 -4,10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/>',L1=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],z1=[{name:"tripped",type:"boolean",default:!1,label:"动作"}],R1={kind:"inline"},B_={id:M1,name:T1,category:A1,description:C1,viewBox:I1,width:P1,height:O1,svg:B1,terminals:L1,state:z1,source:R1},L_=Object.freeze(Object.defineProperty({__proto__:null,category:A1,default:B_,description:C1,height:O1,id:M1,name:T1,source:R1,state:z1,svg:B1,terminals:L1,viewBox:I1,width:P1},Symbol.toStringTag,{value:"Module"})),D1="thermocouple",F1="热电偶 (BT)",H1="measurement",W1="热电偶温度传感器。",q1="-26 -42 52 46",G1=52,X1=46,K1='<ellipse cx="0" cy="0" rx="2" ry="2" fill="black" stroke="black" stroke-width="1"/><polyline points="-10,-40 -10,-15 0,0 10,-15 10,-40" fill="none" stroke="black" stroke-width="1"/><line x1="-24" y1="-16" x2="-16" y2="-16" fill="none" stroke="black" stroke-width="1"/><line x1="16" y1="-16" x2="24" y2="-16" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="-20" x2="20" y2="-12" fill="none" stroke="black" stroke-width="1"/>',Y1=[{id:"t1",x:10,y:-40,orientation:"n"},{id:"t2",x:-10,y:-40,orientation:"n"}],V1={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_06/en_60617_08_06_01.elmt",qetEnglishName:"Thermocouple"},z_={id:D1,name:F1,category:H1,description:W1,viewBox:q1,width:G1,height:X1,svg:K1,terminals:Y1,source:V1},R_=Object.freeze(Object.defineProperty({__proto__:null,category:H1,default:z_,description:W1,height:X1,id:D1,name:F1,source:V1,svg:K1,terminals:Y1,viewBox:q1,width:G1},Symbol.toStringTag,{value:"Module"})),U1="thyristor",J1="晶闸管 (V)",Z1="passive",Q1="反向阻断三极晶闸管 / SCR。t1=阳极(上), t2=阴极(下)。",ey="-22 -42 34 44",ty=34,ny=44,oy='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/><line x1="10" y1="-20" x2="-10" y2="-20" fill="none" stroke="black" stroke-width="1"/><polyline points="-20,0 -7,0 -4,-10" fill="none" stroke="black" stroke-width="1"/>',ry=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],sy={x:6,y:-20,anchor:"start"},iy={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_04/en_60617_05_04_06.elmt",qetEnglishName:"Reverse blocking triode thyristor, P-gate (cathode-side controlled)"},D_={id:U1,name:J1,category:Z1,description:Q1,viewBox:ey,width:ty,height:ny,svg:oy,terminals:ry,label:sy,source:iy},F_=Object.freeze(Object.defineProperty({__proto__:null,category:Z1,default:D_,description:Q1,height:ny,id:U1,label:sy,name:J1,source:iy,svg:oy,terminals:ry,viewBox:ey,width:ty},Symbol.toStringTag,{value:"Module"})),ay="time-relay",ly="时间继电器 (KT)",cy="control",dy="延时 (缓动) 继电器线圈。",uy="-32 -22 54 44",my=54,fy=44,hy='<rect x="-20" y="-10" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><rect x="-30" y="-10" width="10" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="10" x2="-20" y2="-10" fill="none" stroke="black" stroke-width="1"/>',py=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],gy={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_15/en_60617_07_15_08.elmt",qetEnglishName:"Relay coil of a slow-operating relay"},H_={id:ay,name:ly,category:cy,description:dy,viewBox:uy,width:my,height:fy,svg:hy,terminals:py,source:gy},W_=Object.freeze(Object.defineProperty({__proto__:null,category:cy,default:H_,description:dy,height:fy,id:ay,name:ly,source:gy,svg:hy,terminals:py,viewBox:uy,width:my},Symbol.toStringTag,{value:"Module"})),yy="transfer-switch",xy="切换开关 (ATS)",by="switching",wy="双源切换开关 (Automatic / Manual Transfer Switch)。两个电源输入 + 一个负荷输出, 互锁不并联。",vy="-27 -32 51 64",ky=51,_y=64,$y='<line x1="-15" y1="-30" x2="-15" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="15" y1="-30" x2="15" y2="-12" stroke="black" stroke-width="1" fill="none"/><text x="-25" y="-20" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">N</text><text x="19" y="-20" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">E</text><circle cx="-15" cy="-10" r="1.5" fill="black"/><circle cx="15" cy="-10" r="1.5" fill="black"/><circle cx="0" cy="6" r="1.5" fill="black"/><line x1="-15" y1="-10" x2="0" y2="6" stroke="black" stroke-width="1" fill="none"/><line x1="15" y1="-10" x2="0" y2="6" stroke="black" stroke-width="0.6" fill="none" stroke-dasharray="2 1.5"/><line x1="0" y1="6" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/>',Sy=[{id:"t_normal",x:-15,y:-30,orientation:"n"},{id:"t_emergency",x:15,y:-30,orientation:"n"},{id:"t_load",x:0,y:30,orientation:"s"}],jy=[{name:"position",type:"string",default:"normal",label:"位置 (normal/emergency/off)"}],Ey={kind:"inline"},q_={id:yy,name:xy,category:by,description:wy,viewBox:vy,width:ky,height:_y,svg:$y,terminals:Sy,state:jy,source:Ey},G_=Object.freeze(Object.defineProperty({__proto__:null,category:by,default:q_,description:wy,height:_y,id:yy,name:xy,source:Ey,state:jy,svg:$y,terminals:Sy,viewBox:vy,width:ky},Symbol.toStringTag,{value:"Module"})),Ny="transformer-2w",My="双绕组变压器",Ty="transformer",Ay="-62 -142 64 144",Cy=64,Iy=144,Py='<ellipse cx="-30" cy="-90" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-140" x2="-30" y2="-120" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-20" x2="-30" y2="0" fill="none" stroke="black" stroke-width="1"/>',Oy=[{id:"t1",x:-30,y:-140,orientation:"n"},{id:"t2",x:-30,y:0,orientation:"s"}],By=[{name:"S",label:"容量",type:"number",unit:"MVA",showOnCanvas:!0},{name:"ratio",label:"变比",type:"string",showOnCanvas:!0}],Ly={x:4,y:-68,anchor:"start"},zy={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_01.elmt",qetEnglishName:"Transformer with two windings, general symbol"},X_={id:Ny,name:My,category:Ty,viewBox:Ay,width:Cy,height:Iy,svg:Py,terminals:Oy,params:By,label:Ly,source:zy},K_=Object.freeze(Object.defineProperty({__proto__:null,category:Ty,default:X_,height:Iy,id:Ny,label:Ly,name:My,params:By,source:zy,svg:Py,terminals:Oy,viewBox:Ay,width:Cy},Symbol.toStringTag,{value:"Module"})),Ry="transformer-3w",Dy="三绕组变压器",Fy="transformer",Hy="-82 -131 114 133",Wy=114,qy=133,Gy='<ellipse cx="-30" cy="-80" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-31" y1="-129" x2="-31" y2="-109" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-50" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="-20" x2="-50" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/>',Xy=[{id:"t1",x:-31,y:-129,orientation:"n"},{id:"t_low_left",x:-50,y:0,orientation:"s"},{id:"t_low_right",x:0,y:0,orientation:"s"}],Ky={x:4,y:-64,anchor:"start"},Yy={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_04.elmt",qetEnglishName:"Transformer with three windings, general symbol"},Y_={id:Ry,name:Dy,category:Fy,viewBox:Hy,width:Wy,height:qy,svg:Gy,terminals:Xy,label:Ky,source:Yy},V_=Object.freeze(Object.defineProperty({__proto__:null,category:Fy,default:Y_,height:qy,id:Ry,label:Ky,name:Dy,source:Yy,svg:Gy,terminals:Xy,viewBox:Hy,width:Wy},Symbol.toStringTag,{value:"Module"})),Vy="triac",Uy="双向晶闸管 (V)",Jy="passive",Zy="双向三极晶闸管 (TRIAC)。",Qy="-22 -42 44 44",ex=44,tx=44,nx='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-20,-30 0,-30 -10,-10" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="-30" x2="-10" y2="-30" fill="none" stroke="black" stroke-width="1"/><polygon points="0,-10 10,-30 20,-10" fill="none" stroke="black" stroke-width="1"/><polyline points="20,0 18,0 14,-10" fill="none" stroke="black" stroke-width="1"/>',ox=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],rx={x:6,y:-20,anchor:"start"},sx={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_04/en_60617_05_04_11.elmt",qetEnglishName:"Bidirectional triode thyristor; Triac"},U_={id:Vy,name:Uy,category:Jy,description:Zy,viewBox:Qy,width:ex,height:tx,svg:nx,terminals:ox,label:rx,source:sx},J_=Object.freeze(Object.defineProperty({__proto__:null,category:Jy,default:U_,description:Zy,height:tx,id:Vy,label:rx,name:Uy,source:sx,svg:nx,terminals:ox,viewBox:Qy,width:ex},Symbol.toStringTag,{value:"Module"})),ix="undervoltage-relay",ax="欠压继电器 (27)",lx="protection",cx="欠电压保护继电器 (ANSI 27)。",dx="-62 -82 64 84",ux=64,mx=84,fx='<rect x="-60" y="-80" width="60" height="80" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-49" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">130 %</text><text x="-55" y="-32.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">50...80 V</text><text x="-41" y="-53.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">U &lt;</text>',hx=[{id:"t_top",x:-30,y:-80,orientation:"n"}],px={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_07.elmt",qetEnglishName:"Undervoltage relay"},Z_={id:ix,name:ax,category:lx,description:cx,viewBox:dx,width:ux,height:mx,svg:fx,terminals:hx,source:px},Q_=Object.freeze(Object.defineProperty({__proto__:null,category:lx,default:Z_,description:cx,height:mx,id:ix,name:ax,source:px,svg:fx,terminals:hx,viewBox:dx,width:ux},Symbol.toStringTag,{value:"Module"})),gx="ups",yx="不间断电源 (UPS)",xx="source",bx="在线 / 后备式不间断电源。",wx="-26 -42 52 84",vx=52,kx=84,_x='<rect x="-24" y="-20" width="48" height="40" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">UPS</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',$x=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],Sx=[{name:"S",label:"容量",type:"number",unit:"kVA"}],jx={kind:"inline"},e$={id:gx,name:yx,category:xx,description:bx,viewBox:wx,width:vx,height:kx,svg:_x,terminals:$x,params:Sx,source:jx},t$=Object.freeze(Object.defineProperty({__proto__:null,category:xx,default:e$,description:bx,height:kx,id:gx,name:yx,params:Sx,source:jx,svg:_x,terminals:$x,viewBox:wx,width:vx},Symbol.toStringTag,{value:"Module"})),Ex="varmeter",Nx="无功功率表 (var)",Mx="measurement",Tx="无功功率表 (var)。",Ax="-22 -42 44 44",Cx=44,Ix=44,Px='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-8" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">var</text>',Ox=[{id:"t_top",x:0,y:-40,orientation:"n"}],Bx={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_04.elmt",qetEnglishName:"Varmeter"},n$={id:Ex,name:Nx,category:Mx,description:Tx,viewBox:Ax,width:Cx,height:Ix,svg:Px,terminals:Ox,source:Bx},o$=Object.freeze(Object.defineProperty({__proto__:null,category:Mx,default:n$,description:Tx,height:Ix,id:Ex,name:Nx,source:Bx,svg:Px,terminals:Ox,viewBox:Ax,width:Cx},Symbol.toStringTag,{value:"Module"})),Lx="vfd",zx="变频器 (VFD)",Rx="motor-control",Dx="Variable Frequency Drive — 异步电动机调速。",Fx="-24 -42 48 84",Hx=48,Wx=84,qx='<rect x="-22" y="-20" width="44" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-22" y1="20" x2="22" y2="-20" stroke="black" stroke-width="1" fill="none"/><text x="-15" y="-5" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~</text><text x="6" y="14" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~f</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Gx=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],Xx={kind:"inline"},r$={id:Lx,name:zx,category:Rx,description:Dx,viewBox:Fx,width:Hx,height:Wx,svg:qx,terminals:Gx,source:Xx},s$=Object.freeze(Object.defineProperty({__proto__:null,category:Rx,default:r$,description:Dx,height:Wx,id:Lx,name:zx,source:Xx,svg:qx,terminals:Gx,viewBox:Fx,width:Hx},Symbol.toStringTag,{value:"Module"})),Kx="voltage-regulator",Yx="调压器 (T)",Vx="transformer",Ux="可调感应调压器 / 自耦调压器。",Jx="-17 -32 38 64",Zx=38,Qx=64,eb='<line x1="-5" y1="21" x2="5" y2="17" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-16.05" x2="4.95" y2="-20.05" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-5" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="0" rx="15" ry="15" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-20.05" x2="4.95" y2="-24.05" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="23" x2="5" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-18.05" x2="4.95" y2="-22.05" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="0" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="25" x2="5" y2="21" fill="none" stroke="black" stroke-width="1"/><line x1="-15" y1="15" x2="15" y2="-15" fill="none" stroke="black" stroke-width="1"/><polygon points="13,-16 16,-13 19,-19" fill="black" stroke="black" stroke-width="0.4"/>',tb=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],nb=[{name:"ratio",label:"调压范围",type:"string",showOnCanvas:!0}],ob={kind:"elmt",path:"11_singlepole/340_converters_inverters/10_converters/regulator_ind_3f_1.elmt",qetEnglishName:"Voltage regulator"},i$={id:Kx,name:Yx,category:Vx,description:Ux,viewBox:Jx,width:Zx,height:Qx,svg:eb,terminals:tb,params:nb,source:ob},a$=Object.freeze(Object.defineProperty({__proto__:null,category:Vx,default:i$,description:Ux,height:Qx,id:Kx,name:Yx,params:nb,source:ob,svg:eb,terminals:tb,viewBox:Jx,width:Zx},Symbol.toStringTag,{value:"Module"})),rb="voltmeter",sb="电压表 (V)",ib="measurement",ab="-22 -42 44 44",lb=44,cb=44,db='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-4" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">V</text>',ub=[{id:"t_top",x:0,y:-40,orientation:"n"}],mb={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_01.elmt",qetEnglishName:"Voltmeter"},l$={id:rb,name:sb,category:ib,viewBox:ab,width:lb,height:cb,svg:db,terminals:ub,source:mb},c$=Object.freeze(Object.defineProperty({__proto__:null,category:ib,default:l$,height:cb,id:rb,name:sb,source:mb,svg:db,terminals:ub,viewBox:ab,width:lb},Symbol.toStringTag,{value:"Module"})),fb="wattmeter",hb="功率表 (W)",pb="measurement",gb="-22 -42 44 44",yb=44,xb=44,bb='<rect x="-20" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-6" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">W</text>',wb=[{id:"t_top",x:0,y:-40,orientation:"n"}],vb={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_03/en_60617_08_03_01.elmt",qetEnglishName:"Recording wattmeter"},d$={id:fb,name:hb,category:pb,viewBox:gb,width:yb,height:xb,svg:bb,terminals:wb,source:vb},u$=Object.freeze(Object.defineProperty({__proto__:null,category:pb,default:d$,height:xb,id:fb,name:hb,source:vb,svg:bb,terminals:wb,viewBox:gb,width:yb},Symbol.toStringTag,{value:"Module"})),kb="wind-turbine",_b="风力发电机",$b="renewable",Sb="风机:发电机 + 三叶轮标记",jb="-22 -46 44 68",Eb=44,Nb=68,Mb='<circle cx="0" cy="0" r="20" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="16">G</text><line x1="0" y1="-20" x2="0" y2="-32" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-32" x2="-10" y2="-39" fill="none" stroke="black" stroke-width="1.5"/><line x1="0" y1="-32" x2="10" y2="-39" fill="none" stroke="black" stroke-width="1.5"/><line x1="0" y1="-32" x2="0" y2="-44" fill="none" stroke="black" stroke-width="1.5"/>',Tb=[{id:"t_bottom",x:0,y:20,orientation:"s"}],Ab={kind:"inline"},m$={id:kb,name:_b,category:$b,description:Sb,viewBox:jb,width:Eb,height:Nb,svg:Mb,terminals:Tb,source:Ab},f$=Object.freeze(Object.defineProperty({__proto__:null,category:$b,default:m$,description:Sb,height:Nb,id:kb,name:_b,source:Ab,svg:Mb,terminals:Tb,viewBox:jb,width:Eb},Symbol.toStringTag,{value:"Module"})),Cb="zener-diode",Ib="稳压二极管 (D)",Pb="passive",Ob="齐纳 / 稳压二极管。t1=阳极(上), t2=阴极(下)。",Bb="-12 -42 24 44",Lb=24,zb=44,Rb='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-15" x2="-10" y2="-10" fill="none" stroke="black" stroke-width="1"/>',Db=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],Fb={x:6,y:-20,anchor:"start"},Hb={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_03/en_60617_05_03_06.elmt",qetEnglishName:"Breakdown diode, unidirectional; Zener diode"},h$={id:Cb,name:Ib,category:Pb,description:Ob,viewBox:Bb,width:Lb,height:zb,svg:Rb,terminals:Db,label:Fb,source:Hb},p$=Object.freeze(Object.defineProperty({__proto__:null,category:Pb,default:h$,description:Ob,height:zb,id:Cb,label:Fb,name:Ib,source:Hb,svg:Rb,terminals:Db,viewBox:Bb,width:Lb},Symbol.toStringTag,{value:"Module"})),g$=Object.assign({"./ammeter.json":o2,"./arc-suppression-coil.json":s2,"./arrester.json":a2,"./async-motor.json":c2,"./autotransformer.json":u2,"./battery.json":f2,"./bell.json":p2,"./break-contact.json":y2,"./breaker.json":b2,"./buchholz-relay.json":v2,"./busbar.json":_2,"./buzzer.json":S2,"./capacitor.json":E2,"./contactor.json":M2,"./converter-bidir.json":A2,"./ct.json":I2,"./dc-combiner.json":O2,"./dc-disconnector.json":L2,"./dc-motor.json":R2,"./diode.json":F2,"./disconnector.json":W2,"./distance-relay.json":G2,"./earth.json":K2,"./earthing-switch.json":V2,"./energy-meter.json":J2,"./ev-charger.json":Q2,"./frequency-meter.json":tk,"./fuse-switch-disconnector.json":ok,"./fuse.json":sk,"./generator.json":ak,"./genset.json":ck,"./gfci-breaker.json":uk,"./grid-source.json":fk,"./grounding-transformer.json":pk,"./heater.json":yk,"./igbt.json":bk,"./indicator-light.json":vk,"./inductor.json":_k,"./inverter.json":Sk,"./limit-switch.json":Ek,"./load-switch.json":Mk,"./load.json":Ak,"./make-contact.json":Ik,"./motor-starter.json":Ok,"./ngr.json":Lk,"./overcurrent-relay.json":Rk,"./phase-failure-relay.json":Fk,"./plc.json":Wk,"./power-factor-meter.json":Gk,"./power-supply.json":Kk,"./protective-relay.json":Vk,"./proximity-switch.json":Jk,"./pt.json":Qk,"./push-button.json":t_,"./pv.json":o_,"./rcd.json":s_,"./recloser.json":a_,"./rectifier.json":c_,"./relay-coil.json":u_,"./resistor.json":f_,"./reverse-power-relay.json":p_,"./selector-switch.json":y_,"./series-reactor.json":b_,"./shunt-capacitor.json":v_,"./shunt-reactor.json":__,"./siren.json":S_,"./socket-outlet.json":E_,"./soft-starter.json":M_,"./sync-motor.json":A_,"./synchronoscope.json":I_,"./terminal.json":O_,"./thermal-overload.json":L_,"./thermocouple.json":R_,"./thyristor.json":F_,"./time-relay.json":W_,"./transfer-switch.json":G_,"./transformer-2w.json":K_,"./transformer-3w.json":V_,"./triac.json":J_,"./undervoltage-relay.json":Q_,"./ups.json":t$,"./varmeter.json":o$,"./vfd.json":s$,"./voltage-regulator.json":a$,"./voltmeter.json":c$,"./wattmeter.json":u$,"./wind-turbine.json":f$,"./zener-diode.json":p$}),Wb=Object.values(g$).map(e=>e.default),Xe=Object.fromEntries(Wb.map(e=>[e.id,e])),Bo=["busbar","switching","protection","motor-control","control","transformer","instrument-transformer","measurement","source","load","storage","compensation","passive","grounding","renewable"],y$=(()=>{var t;const e={};for(const n of Wb)(e[t=n.category]??(e[t]=[])).push(n);return e})(),En=new Map(Object.entries(Xe));function qb(e){return Xe[e]}function x$(e){const n=[...e].sort().join("|");let o=2166136261;for(let r=0;r<n.length;r++)o^=n.charCodeAt(r),o=Math.imul(o,16777619);return`n_${(o>>>0).toString(36)}`}const b$=320;function qe(e){var h,g,w,E,k;const t=Jr(),n=new Map;e.elements.forEach((x,S)=>{if(n.has(x.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:x.id}),pointer:`/elements/${S}`});return}n.set(x.id,x);const A=En.get(x.kind);A||t.diagnostics.push({code:"E003",severity:"error",message:`${we("compile.unknownKind",{kind:x.kind})} (id=${x.id})`,pointer:`/elements/${S}`}),t.elements.set(x.id,{element:x,libraryDef:A})});const o=new Map,r=new Map;(e.buses??[]).forEach((x,S)=>{if(n.has(x.id)||o.has(x.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:x.id}),pointer:`/buses/${S}`});return}if(o.set(x.id,x),x.layout){const A=x.layout.rot??0;r.set(x.id,{at:x.layout.at,span:x.layout.span,rot:A,axis:Sn(A)})}});const s=new Map;(e.junctions??[]).forEach((x,S)=>{if(n.has(x.id)||o.has(x.id)||s.has(x.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:x.id}),pointer:`/junctions/${S}`});return}s.set(x.id,x)});const i=x=>!x.includes(".")&&o.has(x),a=x=>!x.includes(".")&&s.has(x),l=(x,S)=>{if(i(x)||a(x))return!0;const A=x.indexOf(".");if(A<=0)return t.diagnostics.push({code:"E003",severity:"error",message:we("compile.invalidTermRef",{ref:x}),pointer:S}),!1;const B=x.slice(0,A),q=x.slice(A+1),V=t.elements.get(B);if(!V)return t.diagnostics.push({code:"E002",severity:"error",message:we("compile.elementMissing",{id:B}),pointer:S}),!1;if(!V.libraryDef)return!1;if(!V.libraryDef.terminals.find(re=>re.id===q)){const re=V.libraryDef.terminals.map(se=>se.id).join(", ");return t.diagnostics.push({code:"E003",severity:"error",message:we("compile.missingPin",{id:B,kind:V.element.kind,pin:q,available:re}),pointer:S}),!1}return!0},u=[];(e.wires??[]).forEach((x,S)=>{const A=`/wires/${S}`,B=l(x.ends[0],A),q=l(x.ends[1],A);B&&q&&u.push(x)});const d=new Map;if(e.layout)for(const[x,S]of Object.entries(e.layout))t.elements.has(x)?d.set(x,Zr(S)):t.diagnostics.push({code:"E004",severity:"error",message:we("compile.layoutMissingElement",{id:x}),pointer:`/layout/${x}`});const m=e2({elements:e.elements,buses:e.buses??[],wires:u,library:En,userLayout:d,userBusLayout:r});t.layout=m.devices;for(const[x,S]of m.buses){const A=o.get(x);A&&t.buses.set(x,{bus:A,geometry:S})}for(const[x,S]of o)t.buses.has(x)||t.buses.set(x,{bus:S,geometry:{at:((h=S.layout)==null?void 0:h.at)??[0,0],span:((g=S.layout)==null?void 0:g.span)??b$,rot:((w=S.layout)==null?void 0:w.rot)??0,axis:Sn(((E=S.layout)==null?void 0:E.rot)??0)}});for(const x of t.elements.values()){if(!x.libraryDef)continue;const S=t.layout.get(x.element.id);if(!S)continue;const A=[];for(const B of x.libraryDef.terminals){const q=`${x.element.id}.${B.id}`,V=Ae([B.x,B.y],S),re=_t(B.orientation,S);t.terminals.set(q,{ref:q,elementId:x.element.id,pin:B.id,world:V,orientation:re}),A.push(q)}t.elementToTerminals.set(x.element.id,A)}const f=x=>{if(!x.includes(".")){const A=t.buses.get(x);return A?A.geometry.at:null}const S=t.terminals.get(x);return S?S.world:null};for(const[x,S]of s){let A;if((k=S.layout)!=null&&k.at)A=[S.layout.at[0],S.layout.at[1]];else{const B=[];for(const q of u){const[V,re]=q.ends,se=V===x?re:re===x?V:null;if(se===null)continue;const R=f(se);R&&B.push(R)}A=B.length?[B.reduce((q,V)=>q+V[0],0)/B.length,B.reduce((q,V)=>q+V[1],0)/B.length]:[0,0]}t.junctions.set(x,{junction:S,world:A})}const p=new Qr;for(const x of u)p.add(x.ends[0]),p.add(x.ends[1]),p.union(x.ends[0],x.ends[1]);for(const[,x]of p.groups()){const S=x$(x);t.nodes.set(S,{id:S,terminals:x});for(const A of x)t.terminalToNode.set(A,S)}for(const x of t.elements.values()){const S=t.elementToTerminals.get(x.element.id)??[];if(S.length===0)continue;S.some(B=>t.terminalToNode.has(B))||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:x.element.id})})}for(const x of t.buses.keys())t.terminalToNode.has(x)||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:x})});for(const x of t.junctions.keys())t.terminalToNode.has(x)||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:x})});for(const x of u){if(x.path&&x.path.length>=2){const A=x.path,B=A.length>=2?A[1]:null,q=A.length>=2?A[A.length-2]:null,V=Po(x.ends[0],B,t),re=Po(x.ends[1],q,t);if(V&&re){const se=[[V[0],V[1]],...A.slice(1,-1).map(F=>[F[0],F[1]]),[re[0],re[1]]],R=Ur(se);if(R.length>=2){t.wireRenders.set(x.id,{wireId:x.id,path:R,userEdited:!0});continue}}}const S=t2(x,t);S&&t.wireRenders.set(x.id,S)}return t}const w$={earth:"GND",breaker:"QF",disconnector:"QS","earthing-switch":"QE","load-switch":"QL",fuse:"FU","transformer-2w":"T","transformer-3w":"T",autotransformer:"AT",ct:"CT",pt:"PT",generator:"G","sync-motor":"M","async-motor":"M","grid-source":"L",load:"L",battery:"BAT","shunt-reactor":"LR","series-reactor":"LR","shunt-capacitor":"C",arrester:"FBL","grounding-transformer":"TG",ngr:"NGR","arc-suppression-coil":"ASC",pv:"PV","wind-turbine":"WT",rectifier:"RT",inverter:"INV","converter-bidir":"PCS"},Lo="B",zo="J";function Gn(e){return new Set([...e.elements.map(t=>t.id),...(e.buses??[]).map(t=>t.id),...(e.junctions??[]).map(t=>t.id)])}function jt(e,t){const n=w$[t]??t,o=Gn(e);let r=1;for(;o.has(`${n}${r}`);)r++;return`${n}${r}`}function Nn(e){const t=Gn(e);let n=1;for(;t.has(`${Lo}${n}`);)n++;return`${Lo}${n}`}function Mn(e){const t=Gn(e);let n=1;for(;t.has(`${zo}${n}`);)n++;return`${zo}${n}`}function v$(e){const t=new Set((e.annotations??[]).map(o=>o.id));let n=1;for(;t.has(`a${n}`);)n++;return`a${n}`}function Ue(e,t){const n=[e,t].sort(),o=`${n[0]}|${n[1]}`;let r=2166136261;for(let s=0;s<o.length;s++)r^=o.charCodeAt(s),r=Math.imul(r,16777619);return`w_${(r>>>0).toString(36)}`}const Ro={version:"1",elements:[]},k$=100,Do=20;function _$(){if(typeof window>"u")return"select";try{return window.matchMedia("(pointer: coarse)").matches?"pan":"select"}catch{return"select"}}const b=Xt()(Kv((e,t)=>({diagram:Ro,internal:qe(Ro),fileSession:null,activeTool:_$(),placeKind:null,lastPlaceKind:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null,busbarDrawStart:null,cursorSvg:null,selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,past:[],future:[],clipboard:null,clipboardPasteIndex:0,setDiagram:n=>e({diagram:n,internal:qe(n),past:[],future:[],selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null}),setFileSession:n=>e({fileSession:n}),loadDiagramFromFile:(n,o)=>e({diagram:n,internal:qe(n),fileSession:o,past:[],future:[],selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null}),dispatch:n=>{const{diagram:o,past:r}=t(),s=n(o);if(s===o)return;const i=r.length>=k$?r.slice(1):r;e({diagram:s,internal:qe(s),past:[...i,o],future:[]})},undo:()=>{const{past:n,future:o,diagram:r}=t();if(n.length===0)return;const s=n[n.length-1];e({diagram:s,internal:qe(s),past:n.slice(0,-1),future:[...o,r],wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null})},redo:()=>{const{past:n,future:o,diagram:r}=t();if(o.length===0)return;const s=o[o.length-1];e({diagram:s,internal:qe(s),past:[...n,r],future:o.slice(0,-1),wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null})},setActiveTool:(n,o)=>{const r=t();let s;(o==null?void 0:o.placeKind)!==void 0?s=o.placeKind:n==="place"?s=r.placeKind??r.lastPlaceKind:s=null,e({activeTool:n,placeKind:s,lastPlaceKind:s??r.lastPlaceKind,wireFromTerminal:n==="wire"?r.wireFromTerminal:null,wireDragFrom:n==="wire"?r.wireDragFrom:null,placeFromTerminal:n==="place"?r.placeFromTerminal:null})},setPlaceKind:n=>e(o=>({placeKind:n,lastPlaceKind:n??o.lastPlaceKind})),setWireFromTerminal:n=>e({wireFromTerminal:n}),setWireDragFrom:n=>e({wireDragFrom:n}),setPlaceFromTerminal:n=>e({placeFromTerminal:n}),setBusbarDrawStart:n=>e({busbarDrawStart:n}),setCursorSvg:n=>e({cursorSvg:n}),setSelection:n=>e({selection:$$(n),selectedWire:null,selectedNode:null,selectedAnnotation:n.length?null:t().selectedAnnotation}),toggleInSelection:n=>{const o=t().selection;e({selection:o.includes(n)?o.filter(r=>r!==n):[...o,n],selectedWire:null,selectedNode:null,selectedAnnotation:null})},clearSelection:()=>e({selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null}),setSelectedWire:n=>e({selectedWire:n,selection:n?[]:t().selection,selectedNode:null,selectedAnnotation:n?null:t().selectedAnnotation}),setSelectedNode:n=>e({selectedNode:n,selection:n?[]:t().selection,selectedWire:null,selectedAnnotation:n?null:t().selectedAnnotation}),setSelectedAnnotation:n=>e({selectedAnnotation:n,selection:n?[]:t().selection,selectedWire:n?null:t().selectedWire,selectedNode:n?null:t().selectedNode,editingAnnotation:n?t().editingAnnotation:null}),setEditingAnnotation:n=>e({editingAnnotation:n,selectedAnnotation:n??t().selectedAnnotation,editingElement:n?null:t().editingElement}),setEditingElement:n=>e({editingElement:n,selection:n?[n]:t().selection,editingAnnotation:n?null:t().editingAnnotation,selectedAnnotation:n?null:t().selectedAnnotation,selectedWire:n?null:t().selectedWire,selectedNode:n?null:t().selectedNode}),copySelection:()=>{var f;const{selection:n,diagram:o,internal:r}=t();if(n.length===0)return;const s=new Set(n),i=o.elements.filter(p=>s.has(p.id)).map(p=>structuredClone(p)),a=(o.buses??[]).filter(p=>s.has(p.id)).map(p=>structuredClone(p)),l=(o.junctions??[]).filter(p=>s.has(p.id)).map(p=>{var g;const h=structuredClone(p);if(!h.layout){const w=(g=r.junctions.get(p.id))==null?void 0:g.world;w&&(h.layout={at:[w[0],w[1]]})}return h}),u={};for(const p of n)if(s.has(p)&&!r.buses.has(p)){const h=(f=o.layout)==null?void 0:f[p];if(h){u[p]=structuredClone(h);continue}const g=r.layout.get(p);g&&(u[p]=Ct(g))}const d={};for(const p of n){const h=r.buses.get(p);h&&(d[p]=et(h.geometry))}const m=(o.wires??[]).filter(p=>p.ends.every(h=>s.has(un(h)))).map(p=>structuredClone(p));e({clipboard:{elements:i,buses:a,junctions:l,placements:u,busLayouts:d,wires:m},clipboardPasteIndex:0})},cutSelection:()=>{const{selection:n}=t();n.length!==0&&(t().copySelection(),t().deleteSelection())},pasteClipboard:()=>{const{clipboard:n,clipboardPasteIndex:o,diagram:r}=t();if(!n||n.elements.length===0&&n.buses.length===0&&n.junctions.length===0)return;const s=o+1,i=Do*s,a=Do*s,l=new Map;let u=r;for(const m of n.elements){const f=jt(u,m.kind);l.set(m.id,f),u={...u,elements:[...u.elements,{id:f,kind:m.kind}]}}for(const m of n.buses){const f=Nn(u);l.set(m.id,f),u={...u,buses:[...u.buses??[],{id:f}]}}for(const m of n.junctions){const f=Mn(u);l.set(m.id,f),u={...u,junctions:[...u.junctions??[],{id:f}]}}const d=m=>{const f=m.indexOf("."),p=f<0?m:m.slice(0,f),h=l.get(p);return h?f<0?h:`${h}${m.slice(f)}`:m};t().dispatch(m=>{const f=n.elements.map(k=>{const x=structuredClone(k);return x.id=l.get(k.id),x}),p=n.buses.map(k=>{const x=structuredClone(k);x.id=l.get(k.id);const S=n.busLayouts[k.id];return S&&(x.layout={...S,at:[S.at[0]+i,S.at[1]+a]}),x}),h=n.junctions.map(k=>{const x=structuredClone(k);return x.id=l.get(k.id),x.layout&&(x.layout={at:[x.layout.at[0]+i,x.layout.at[1]+a]}),x}),g={...m.layout??{}};for(const[k,x]of l){const S=n.placements[k];S&&(g[x]={...S,at:[S.at[0]+i,S.at[1]+a]})}const w=n.wires.map(k=>{const x=[d(k.ends[0]),d(k.ends[1])];return{id:Ue(x[0],x[1]),ends:x}}),E=Fo(m.wires??[],w);return{...m,elements:[...m.elements,...f],buses:p.length?[...m.buses??[],...p]:m.buses,junctions:h.length?[...m.junctions??[],...h]:m.junctions,wires:E.length?E:void 0,layout:Object.keys(g).length?g:void 0}}),e({selection:Array.from(l.values()),clipboardPasteIndex:s})},autoArrangeAll:()=>{t().dispatch(n=>{var l;const o=n.layout&&Object.keys(n.layout).length>0,r=(n.buses??[]).some(u=>u.layout);if(!o&&!r)return n;const{layout:s,...i}=n,a=(l=n.buses)==null?void 0:l.map(u=>{const{layout:d,...m}=u;return m});return{...i,buses:a}})},autoArrangeSelection:()=>{const{selection:n}=t();if(n.length===0)return;const o=new Set(n);t().dispatch(r=>{let s=!1,i=r.layout;if(i){const l={};for(const[u,d]of Object.entries(i)){if(o.has(u)){s=!0;continue}l[u]=d}s&&(i=Object.keys(l).length?l:void 0)}let a=r.buses;if(a){const l=a.map(u=>{if(o.has(u.id)&&u.layout){s=!0;const{layout:d,...m}=u;return m}return u});s&&(a=l)}return s?{...r,layout:i,buses:a}:r})},fillUnplacedAll:()=>{const n=t().internal;t().dispatch(o=>{const r=o.layout??{},s={};for(const l of o.elements){if(r[l.id])continue;const u=n.layout.get(l.id);u&&(s[l.id]=Ct(u))}const i=[];if((o.buses??[]).forEach((l,u)=>{l.layout||n.buses.has(l.id)&&i.push({idx:u,bus:l})}),Object.keys(s).length===0&&i.length===0)return o;let a=o.buses;return i.length>0&&a&&(a=a.map(l=>{const u=n.buses.get(l.id);return!l.layout&&u?{...l,layout:et(u.geometry)}:l})),{...o,layout:{...r,...s},buses:a}})},fillUnplacedSelection:()=>{const{selection:n,internal:o}=t();n.length!==0&&t().dispatch(r=>{var u;const s=r.layout??{},i={},a=new Map;for(const d of n)if(o.buses.has(d)){const m=o.buses.get(d);(u=r.buses)!=null&&u.find(f=>f.id===d&&f.layout)||a.set(d,et(m.geometry))}else{if(s[d])continue;const m=o.layout.get(d);m&&(i[d]=Ct(m))}if(Object.keys(i).length===0&&a.size===0)return r;let l=r.buses;return a.size>0&&l&&(l=l.map(d=>a.has(d.id)?{...d,layout:a.get(d.id)}:d)),{...r,layout:{...s,...i},buses:l}})},moveElements:n=>{if(n.size===0)return;const o=t().internal;t().dispatch(r=>{const s={...r.layout??{}},i=new Map,a=new Map;for(const[d,m]of n){if(o.buses.has(d)){i.set(d,m);continue}if(o.junctions.has(d)){a.set(d,m);continue}const f=o.layout.get(d),p=s[d]??(f?Ct(f):{at:[0,0]});s[d]={...p,at:[p.at[0]+m[0],p.at[1]+m[1]]}}let l=r.buses;i.size>0&&(l=(r.buses??[]).map(d=>{const m=i.get(d.id);if(!m)return d;const f=d.layout??et(o.buses.get(d.id).geometry);return{...d,layout:{...f,at:[f.at[0]+m[0],f.at[1]+m[1]]}}}));let u=r.junctions;return a.size>0&&(u=(r.junctions??[]).map(d=>{var p,h;const m=a.get(d.id);if(!m)return d;const f=((p=d.layout)==null?void 0:p.at)??((h=o.junctions.get(d.id))==null?void 0:h.world)??[0,0];return{...d,layout:{at:[f[0]+m[0],f[1]+m[1]]}}})),{...r,layout:s,buses:l,junctions:u}})},deleteSelection:()=>{const{selection:n}=t();if(n.length===0)return;const o=new Set(n);t().dispatch(r=>{const s=r.elements.filter(d=>!o.has(d.id)),i=(r.buses??[]).filter(d=>!o.has(d.id)),a=(r.junctions??[]).filter(d=>!o.has(d.id)),l=(r.wires??[]).filter(d=>!o.has(un(d.ends[0]))&&!o.has(un(d.ends[1]))),u=r.layout?Object.fromEntries(Object.entries(r.layout).filter(([d])=>!o.has(d))):void 0;return{...r,elements:s,buses:i.length?i:void 0,junctions:a.length?a:void 0,wires:l.length?l:void 0,layout:u&&Object.keys(u).length?u:void 0}}),e({selection:[]})},deleteSelectedWire:()=>{const{selectedWire:n,internal:o}=t();if(!n)return;const r=(t().diagram.wires??[]).find(i=>i.id===n),s=new Set;if(r)for(const i of r.ends){const a=i.indexOf(".");a>0&&s.add(i.slice(0,a))}t().dispatch(i=>{const a=(i.wires??[]).filter(u=>u.id!==n);if(a.length===(i.wires??[]).length)return i;const l={...i.layout??{}};for(const u of s){if(l[u])continue;const d=o.layout.get(u);if(!d)continue;const m={at:d.at};d.rot&&(m.rot=d.rot),d.mirror&&(m.mirror=d.mirror),l[u]=m}return{...i,wires:a.length?a:void 0,layout:Object.keys(l).length?l:void 0}}),e({selectedWire:null})},deleteSelectedNode:()=>{const{selectedNode:n,internal:o}=t();if(!n)return;const r=o.nodes.get(n);if(!r)return;const s=new Set(r.terminals),i=new Set;for(const a of r.terminals){const l=a.indexOf(".");l>0&&i.add(a.slice(0,l))}t().dispatch(a=>{const l={...a.layout??{}};for(const d of i){if(l[d])continue;const m=o.layout.get(d);if(!m)continue;const f={at:m.at};m.rot&&(f.rot=m.rot),m.mirror&&(f.mirror=m.mirror),l[d]=f}const u=(a.wires??[]).filter(d=>!s.has(d.ends[0])&&!s.has(d.ends[1]));return{...a,wires:u.length?u:void 0,layout:Object.keys(l).length?l:void 0}}),e({selectedNode:null})},rotateSelection:n=>{const{selection:o,internal:r}=t();o.length!==0&&t().dispatch(s=>{var u,d,m,f;const i={...s.layout??{}},a=new Map;for(const p of o){if(r.junctions.has(p))continue;if(r.buses.has(p)){const w=r.buses.get(p),k=(((((m=(d=(u=s.buses)==null?void 0:u.find(x=>x.id===p))==null?void 0:d.layout)==null?void 0:m.rot)??w.geometry.rot??0)+n)%360+360)%360;a.set(p,k);continue}const h=i[p]??{at:((f=r.layout.get(p))==null?void 0:f.at)??[0,0]},g=(((h.rot??0)+n)%360+360)%360;i[p]={...h,rot:g}}let l=s.buses;return a.size>0&&(l=(s.buses??[]).map(p=>{if(!a.has(p.id))return p;const h=p.layout??et(r.buses.get(p.id).geometry);return{...p,layout:{...h,rot:a.get(p.id)}}})),{...s,layout:i,buses:l}})},mirrorSelection:()=>{const{selection:n,internal:o}=t();n.length!==0&&t().dispatch(r=>{var i;const s={...r.layout??{}};for(const a of n){if(o.buses.has(a)||o.junctions.has(a))continue;const l=s[a]??{at:((i=o.layout.get(a))==null?void 0:i.at)??[0,0]};s[a]={...l,mirror:!(l.mirror??!1)}}return{...r,layout:s}})},addElement:(n,o,r)=>{if(n==="busbar")return t().addBus(o,320);const s=jt(t().diagram,n);return t().dispatch(i=>{const a={id:s,kind:n,...r??{}};return{...i,elements:[...i.elements,a],layout:{...i.layout??{},[s]:{at:o}}}}),e({selection:[s]}),s},addBus:(n,o,r)=>{const s=Nn(t().diagram);return t().dispatch(i=>{const a={id:s,layout:r!==void 0?{at:n,span:o,rot:r}:{at:n,span:o}};return{...i,buses:[...i.buses??[],a]}}),e({selection:[s]}),s},addJunction:n=>{const o=Mn(t().diagram);return t().dispatch(r=>{const s={id:o,layout:{at:n}};return{...r,junctions:[...r.junctions??[],s]}}),e({selection:[o]}),o},updateJunction:(n,o)=>{t().dispatch(r=>({...r,junctions:(r.junctions??[]).map(s=>s.id===n?{...s,...o}:s)}))},addWire:(n,o)=>{if(n===o)return;const r=Ue(n,o);t().dispatch(s=>{const i=s.wires??[];return i.some(a=>a.id===r)?s:{...s,wires:[...i,{id:r,ends:[n,o]}]}})},connectWire:(n,o)=>{t().dispatch(r=>{let s=r;const i=new Set([...s.elements.map(h=>h.id),...(s.buses??[]).map(h=>h.id),...(s.junctions??[]).map(h=>h.id)]),a=()=>{let h=1;for(;i.has(`J${h}`);)h++;const g=`J${h}`;return i.add(g),g},l=h=>{const g=a();return s={...s,junctions:[...s.junctions??[],{id:g,layout:{at:h}}]},g},u=h=>{if("end"in h)return h.end;if("junctionAt"in h)return l(h.junctionAt);const g=(s.wires??[]).find(x=>x.id===h.onWire),w=l(h.at);if(!g)return w;const E=(s.wires??[]).filter(x=>x.id!==h.onWire),k=(x,S)=>({id:Ue(x,S),ends:[x,S]});return s={...s,wires:Fo(E,[k(g.ends[0],w),k(w,g.ends[1])])},w},d=u(n),m=u(o);if(d===null||m===null||d===m)return s;const f=Ue(d,m),p=s.wires??[];return p.some(h=>h.id===f)?s:{...s,wires:[...p,{id:f,ends:[d,m]}]}})},updateWirePath:(n,o)=>{t().dispatch(r=>{const s=r.wires??[];if(!s.some(u=>u.id===n))return r;const i=o&&o.length>=2?Ur(o):null,a=i&&i.length>=2?i:null,l=s.map(u=>{if(u.id!==n)return u;if(a)return{...u,path:a};const{path:d,...m}=u;return m});return{...r,wires:l}})},resetWirePath:n=>{t().updateWirePath(n,null)},updateElement:(n,o)=>{t().dispatch(r=>({...r,elements:r.elements.map(s=>s.id===n?{...s,...o}:s)}))},updatePlacement:(n,o)=>{t().dispatch(r=>{var a;const s=((a=r.layout)==null?void 0:a[n])??t().internal.layout.get(n),i={at:o.at??(s==null?void 0:s.at)??[0,0],...o.rot!==void 0?{rot:o.rot}:s!=null&&s.rot?{rot:s.rot}:{},...o.mirror!==void 0?{mirror:o.mirror}:s!=null&&s.mirror?{mirror:s.mirror}:{}};return{...r,layout:{...r.layout??{},[n]:i}}})},updateBus:(n,o)=>{t().dispatch(r=>{const s=(r.buses??[]).map(i=>{if(i.id!==n)return i;const a=t().internal,l=i.layout??(a.buses.has(n)?et(a.buses.get(n).geometry):{at:[0,0],span:320}),u={at:o.at??l.at,span:o.span??l.span,...o.rot!==void 0?{rot:o.rot}:l.rot?{rot:l.rot}:{}};return{...i,layout:u}});return{...r,buses:s}})},addAnnotation:(n,o="")=>{const r=v$(t().diagram);return t().dispatch(s=>{const i={id:r,at:n,text:o};return{...s,annotations:[...s.annotations??[],i]}}),r},updateAnnotation:(n,o)=>{t().dispatch(r=>{const s=r.annotations??[];let i=!1;const a=s.map(l=>l.id!==n?l:(i=!0,{...l,...o,id:l.id}));return i?{...r,annotations:a}:r})},deleteAnnotation:n=>{t().dispatch(o=>{const r=o.annotations??[],s=r.filter(i=>i.id!==n);return s.length===r.length?o:{...o,annotations:s.length?s:void 0}}),t().selectedAnnotation===n&&e({selectedAnnotation:null,editingAnnotation:null})}}),{name:"ole-editor",version:2,storage:Vr(()=>localStorage),partialize:e=>({diagram:e.diagram,activeTool:e.activeTool,placeKind:e.placeKind,lastPlaceKind:e.lastPlaceKind}),onRehydrateStorage:()=>e=>{e!=null&&e.diagram&&(e.internal=qe(e.diagram))}}));function $$(e){return Array.from(new Set(e))}function un(e){const t=e.indexOf(".");return t<0?e:e.slice(0,t)}function Fo(e,t){const n=new Set(e.map(r=>r.id)),o=e.slice();for(const r of t)n.has(r.id)||(n.add(r.id),o.push(r));return o}function Ct(e){return{at:[e.at[0],e.at[1]],...e.rot?{rot:e.rot}:{},...e.mirror?{mirror:e.mirror}:{}}}function et(e){return{at:[e.at[0],e.at[1]],span:e.span,...e.rot?{rot:e.rot}:{}}}let Gb=null;function Ho(e){Gb=e}function Je(){return Gb}const Ft=10;function Xb(){if(typeof document>"u")return!0;const e=document.querySelector(".ole-canvas-root");return!!e&&!e.classList.contains("hide-grid")}function oe(e){return Xb()?Math.round(e/Ft)*Ft:e}const S$=30,j$=144;function Kb(e,t){const n=Xe[e],o=b.getState(),r=o.diagram;if(!n||e==="busbar")return{newElementId:o.addElement(e,t),attachedToBus:!1};const s=E$(r,t);if(!s){const g=Yb(n),w=g?[oe(t[0])-g.x,oe(t[1])-g.y]:[oe(t[0]),oe(t[1])];return{newElementId:o.addElement(e,w),attachedToBus:!1}}const{busId:i,busAt:a,axis:l}=s,u=N$(n,l),d=jt(r,e),m=n.terminals.find(g=>g.id===u),f=l==="x"?t[0]:a[0],p=l==="y"?t[1]:a[1],h=m?[oe(f)-m.x,oe(p)-m.y]:[oe(t[0]),oe(t[1])];return o.dispatch(g=>{const w={id:d,kind:e},E={at:h},k=`${d}.${u}`,x={id:Ue(i,k),ends:[i,k]};return{...g,elements:[...g.elements,w],wires:[...g.wires??[],x],layout:{...g.layout??{},[d]:E}}}),o.setSelection([d]),{newElementId:d,attachedToBus:!0}}function E$(e,t){const n=b.getState().internal;let o=null;for(const r of e.buses??[]){const s=n.buses.get(r.id);if(!s)continue;const{axis:i,at:a,span:l}=s.geometry;let u;if(i==="x"){const d=a[0]-l/2,m=a[0]+l/2,f=t[0]<d?d-t[0]:t[0]>m?t[0]-m:0,p=Math.abs(t[1]-a[1]);u=Math.sqrt(f*f+p*p)}else{const d=a[1]-l/2,m=a[1]+l/2,f=t[1]<d?d-t[1]:t[1]>m?t[1]-m:0,p=Math.abs(t[0]-a[0]);u=Math.sqrt(p*p+f*f)}u<=S$&&(!o||u<o.dist)&&(o={busId:r.id,busAt:[a[0],a[1]],axis:i,dist:u})}return o?{busId:o.busId,busAt:o.busAt,axis:o.axis}:null}function N$(e,t){return e.terminals.length===0?"t":[...e.terminals].sort((o,r)=>t==="x"?o.y-r.y:o.x-r.x)[0].id}function Yb(e){return!e||e.stretchable||e.terminals.length===0?null:[...e.terminals].sort((n,o)=>n.y-o.y)[0]}function Vb(e,t){const n=b.getState().internal;if(!e.includes(".")&&n.buses.has(e)){const r=n.buses.get(e),{axis:s,at:i,span:a}=r.geometry;if(s==="x"){const p=i[0]-a/2,h=i[0]+a/2,g=Math.max(p,Math.min(h,t[0])),w=i[1],E=t[1]>=w?"s":"n";return{ref:e,world:[g,w],orientation:E,isBus:!0,busId:e}}const l=i[1]-a/2,u=i[1]+a/2,d=Math.max(l,Math.min(u,t[1])),m=i[0],f=t[0]>=m?"e":"w";return{ref:e,world:[m,d],orientation:f,isBus:!0,busId:e}}const o=n.terminals.get(e);return o?{ref:e,world:o.world,orientation:o.orientation,isBus:!1}:null}const M$={n:"s",s:"n",e:"w",w:"e"};function Ub(e,t,n){if(e.terminals.length===0)return{id:"t",x:0,y:0,orientation:"n"};const o=M$[t.orientation],r=e.terminals.filter(l=>l.orientation===o),s=r.length>0?r:e.terminals;let i=s[0],a=Wo(i,n,t.world);for(let l=1;l<s.length;l++){const u=s[l],d=Wo(u,n,t.world);d<a&&(a=d,i=u)}return i}function Wo(e,t,n){const o=t[0]+e.x-n[0],r=t[1]+e.y-n[1];return o*o+r*r}function T$(e,t,n){const o=Xe[e],r=b.getState(),s=r.diagram;if(!o)return null;const i=Vb(t,n);if(!i)return null;const a=n[0]-i.world[0],l=n[1]-i.world[1],u=a*a+l*l<=j$,d=[oe(n[0]),oe(n[1])],m=Ub(o,i,d),f=u?i.world:d,p=[oe(f[0]-m.x),oe(f[1]-m.y)],h=jt(s,e);return r.dispatch(g=>{const w={id:h,kind:e},E={at:p},k=`${h}.${m.id}`,x=i.isBus&&i.busId?i.busId:t,S={id:Ue(x,k),ends:[x,k]};return{...g,elements:[...g.elements,w],wires:[...g.wires??[],S],layout:{...g.layout??{},[h]:E}}}),r.setSelection([h]),{newElementId:h,attachedToBus:i.isBus}}const Kt=9,Ht=7;function Yt(e,t){var s,i;const n=[],o=((s=e.element.name)==null?void 0:s.trim())||e.element.id;if(o&&n.push(o),t!=="all"||!((i=e.libraryDef)!=null&&i.params))return n;const r=e.element.params??{};for(const a of e.libraryDef.params){if(!a.showOnCanvas)continue;const l=r[a.name];l==null||l===""||n.push(`${l}${a.unit??""}`)}return n}function Vt(e){const t=A$(e.viewBox);return t?{x:t.x+t.w+2,y:t.y+4,anchor:"start"}:{x:0,y:0,anchor:"start"}}function Ut(e,t){let n=e.x,o=e.y;switch(t.mirror&&(n=-n),t.rot){case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}function A$(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function C$(){const e=b(r=>r.internal.elements),t=b(r=>r.internal.layout),n=b(r=>{var s;return((s=r.diagram.meta)==null?void 0:s.labelMode)??"all"}),o=b(r=>r.editingElement);return c.jsx("g",{className:"ole-annotation-layer",pointerEvents:"none",children:Array.from(e.values()).map(r=>{var d;const s=t.get(r.element.id);if(!s||!r.libraryDef)return null;const i=r.libraryDef.label??Vt(r.libraryDef),a=Ut(i,s),l=i.anchor??"start";if(o===r.element.id)return c.jsx(I$,{elementId:r.element.id,currentName:((d=r.element.name)==null?void 0:d.trim())||r.element.id,world:a,anchor:l},r.element.id);if(n==="off")return null;const u=Yt(r,n);return u.length===0?null:c.jsx("g",{className:"ole-annotation",transform:`translate(${a[0]} ${a[1]})`,children:u.map((m,f)=>c.jsx("text",{x:0,y:f*Kt,textAnchor:l,className:"ole-annotation-text",children:m},f))},r.element.id)})})}const mn=200,fn=9;function I$({elementId:e,currentName:t,world:n,anchor:o}){const r=O.useRef(null);O.useEffect(()=>{const l=r.current;if(!l)return;l.focus();const u=document.createRange();u.selectNodeContents(l);const d=window.getSelection();d==null||d.removeAllRanges(),d==null||d.addRange(u)},[e]);function s(){var f;const l=b.getState(),u=l.diagram.elements.find(p=>p.id===e);if(!u){l.setEditingElement(null);return}const d=(((f=r.current)==null?void 0:f.innerText)??"").replace(/\u00a0/g," ").trim(),m=d===""||d===e?void 0:d;m!==u.name&&l.updateElement(e,{name:m}),l.setEditingElement(null)}function i(l){if(l.key==="Escape"||l.key==="Enter"&&!l.shiftKey){l.preventDefault(),s();return}l.stopPropagation()}let a=n[0];return o==="middle"?a-=mn/2:o==="end"&&(a-=mn),c.jsx("foreignObject",{x:a,y:n[1]-fn,width:mn,height:fn*2.2,className:"ole-element-name-editor",children:c.jsx("div",{ref:r,contentEditable:!0,suppressContentEditableWarning:!0,onBlur:s,onKeyDown:i,onPointerDown:l=>l.stopPropagation(),onMouseDown:l=>l.stopPropagation(),style:{fontSize:`${fn}px`,fontFamily:"ui-sans-serif, system-ui, sans-serif",color:"var(--foreground)",background:"var(--canvas-bg)",outline:"1px dashed var(--selection)",padding:"0 2px",display:"inline-block",minWidth:"20px",lineHeight:1.1,textAlign:o==="middle"?"center":o==="end"?"right":"left",whiteSpace:"nowrap",cursor:"text"},children:t})})}const Jb=8,Wt=1.25;function P$(){const e=b(o=>o.diagram.annotations),t=b(o=>o.selectedAnnotation),n=b(o=>o.editingAnnotation);return!e||e.length===0?null:c.jsx("g",{className:"ole-free-annotation-layer",children:e.map(o=>n===o.id?c.jsx(B$,{ann:o},o.id):c.jsx(O$,{ann:o,isSelected:t===o.id},o.id))})}function O$({ann:e,isSelected:t}){const n=e.fontSize??Jb,o=e.text===""?[""]:e.text.split(`
198
- `),r=Math.max(20,...o.map(i=>i.length*n*.55)),s=o.length*n*Wt;return c.jsxs("g",{"data-annotation-id":e.id,className:"ole-free-annotation","data-selected":t?"true":void 0,children:[c.jsx("rect",{x:e.at[0]-1,y:e.at[1]-1,width:r+2,height:s+2,fill:"transparent",className:"ole-free-annotation-hit"}),t&&c.jsx("rect",{x:e.at[0]-1,y:e.at[1]-1,width:r+2,height:s+2,className:"ole-free-annotation-halo"}),o.map((i,a)=>c.jsx("text",{x:e.at[0],y:e.at[1]+n*.85+a*n*Wt,fontSize:n,className:"ole-free-annotation-text",children:i},a))]})}function B$({ann:e}){const t=O.useRef(null),n=e.fontSize??Jb;O.useEffect(()=>{const a=t.current;if(!a)return;a.focus();const l=document.createRange();l.selectNodeContents(a);const u=window.getSelection();u==null||u.removeAllRanges(),u==null||u.addRange(l)},[e.id]);function o(){var u;const a=b.getState(),l=(((u=t.current)==null?void 0:u.innerText)??"").replace(/\u00a0/g," ").trimEnd();l===""?a.deleteAnnotation(e.id):l!==e.text&&a.updateAnnotation(e.id,{text:l}),a.setEditingAnnotation(null),l!==""&&a.setSelectedAnnotation(e.id),a.activeTool==="text"&&a.setActiveTool("select")}function r(a){if(a.key==="Escape"){a.preventDefault(),o();return}if(a.key==="Enter"&&!a.shiftKey){a.preventDefault(),o();return}a.stopPropagation()}return c.jsx("foreignObject",{x:e.at[0],y:e.at[1],width:320,height:200,"data-annotation-id":e.id,className:"ole-free-annotation-edit-fo",children:c.jsx("div",{ref:t,contentEditable:!0,suppressContentEditableWarning:!0,onBlur:o,onKeyDown:r,onPointerDown:a=>a.stopPropagation(),onMouseDown:a=>a.stopPropagation(),style:{fontSize:`${n}px`,lineHeight:Wt,fontFamily:"ui-sans-serif, system-ui, sans-serif",color:"var(--foreground)",background:"var(--canvas-bg)",outline:"1px dashed var(--selection)",padding:"0 2px",minWidth:`${n}px`,minHeight:`${n*Wt}px`,whiteSpace:"pre-wrap",wordBreak:"break-word",cursor:"text"},children:e.text})})}const L$=20;function z$(){const e=b(d=>d.selection),t=b(d=>d.internal);if(e.length!==1)return null;const n=e[0],o=t.buses.get(n);if(!o)return null;const{axis:r,at:s,span:i}=o.geometry,a=i/2,l=r==="x"?[s[0]-a,s[1]]:[s[0],s[1]-a],u=r==="x"?[s[0]+a,s[1]]:[s[0],s[1]+a];return c.jsxs("g",{className:"ole-bus-handles",pointerEvents:"auto",children:[c.jsx(qo,{x:l[0],y:l[1],busId:n,side:"start",axis:r}),c.jsx(qo,{x:u[0],y:u[1],busId:n,side:"end",axis:r})]})}function qo({x:e,y:t,busId:n,side:o,axis:r}){const s=Je(),i=O.useRef(null),a=d=>{if(d.button!==0||(d.stopPropagation(),d.preventDefault(),!s))return;const m=b.getState().internal.buses.get(n);m&&(i.current={pointerId:d.pointerId,startSpan:m.geometry.span,startAt:[...m.geometry.at],startSvg:s.screenToSvg(d.clientX,d.clientY)},d.target.setPointerCapture(d.pointerId))},l=d=>{const m=i.current;if(!m||d.pointerId!==m.pointerId||!s)return;const f=s.screenToSvg(d.clientX,d.clientY),p=r==="x"?f[0]-m.startSvg[0]:f[1]-m.startSvg[1],h=Xb()?Math.round(p/Ft)*Ft:p,g=m.startSpan+(o==="end"?h:-h);if(g<L$)return;const w=r==="x"?[m.startAt[0]+h/2,m.startAt[1]]:[m.startAt[0],m.startAt[1]+h/2];b.getState().updateBus(n,{span:g,at:w})},u=d=>{const m=i.current;!m||d.pointerId!==m.pointerId||(d.target.hasPointerCapture(d.pointerId)&&d.target.releasePointerCapture(d.pointerId),i.current=null)};return c.jsx("circle",{className:"ole-bus-handle",cx:e,cy:t,r:5,"data-handle":o,onPointerDown:a,onPointerMove:l,onPointerUp:u,onPointerCancel:u})}const Tn=.5;function $t(e,t){return Math.abs(e[1]-t[1])<Tn?"h":"v"}function R$(){const e=b(a=>a.selectedWire),t=b(a=>a.internal.wireRenders);if(!e)return null;const n=t.get(e);if(!n||n.path.length<2)return null;const o=n.path,r=o.length,s=[];for(let a=1;a<r-1;a++){const l=$t(o[a-1],o[a]),u=$t(o[a],o[a+1]),d=a-1===0,m=a+1===r-1,f=d&&l==="v"||m&&u==="v",p=d&&l==="h"||m&&u==="h";f&&p||s.push(c.jsx(D$,{wireId:e,index:a,xLocked:f,yLocked:p},`v-${a}`))}const i=[];for(let a=0;a<r-1;a++){const l=o[a],u=o[a+1];Math.abs(l[0]-u[0])<Tn&&Math.abs(l[1]-u[1])<Tn||i.push(c.jsx(F$,{wireId:e,segIndex:a,axis:$t(l,u)},`m-${a}`))}return c.jsxs("g",{className:"ole-wire-handles",pointerEvents:"auto",children:[i,s]})}function D$({wireId:e,index:t,xLocked:n,yLocked:o}){const r=Je(),s=O.useRef(null),i=b(h=>{var g;return(g=h.internal.wireRenders.get(e))==null?void 0:g.path});if(!i||t<=0||t>=i.length-1)return null;const[a,l]=i[t],u=n&&!o?"ns-resize":!n&&o?"ew-resize":"move",d=h=>{if(h.button!==0||(h.stopPropagation(),h.preventDefault(),!r))return;const g=b.getState().internal.wireRenders.get(e);g&&(s.current={pointerId:h.pointerId,startPath:g.path.map(w=>[w[0],w[1]]),startSvg:r.screenToSvg(h.clientX,h.clientY),index:t,xLocked:n,yLocked:o},document.body.style.cursor=u,h.target.setPointerCapture(h.pointerId))},m=h=>{const g=s.current;if(!g||h.pointerId!==g.pointerId||!r)return;const w=r.screenToSvg(h.clientX,h.clientY),E=g.startPath,k=g.index;if(k<=0||k>=E.length-1)return;const x=E[k],S=[g.xLocked?x[0]:oe(x[0]+(w[0]-g.startSvg[0])),g.yLocked?x[1]:oe(x[1]+(w[1]-g.startSvg[1]))];if(S[0]===x[0]&&S[1]===x[1])return;const A=E.map(V=>[V[0],V[1]]);A[k]=S;const B=$t(E[k-1],E[k]);k-1>0&&(B==="h"?A[k-1]=[E[k-1][0],S[1]]:A[k-1]=[S[0],E[k-1][1]]);const q=$t(E[k],E[k+1]);k+1<E.length-1&&(q==="h"?A[k+1]=[E[k+1][0],S[1]]:A[k+1]=[S[0],E[k+1][1]]),b.getState().updateWirePath(e,A)},f=h=>{const g=s.current;!g||h.pointerId!==g.pointerId||(h.target.hasPointerCapture(h.pointerId)&&h.target.releasePointerCapture(h.pointerId),s.current=null,document.body.style.cursor="")},p=h=>{h.stopPropagation(),h.preventDefault();const g=b.getState().internal.wireRenders.get(e);if(!g||g.path.length<=2||t<=0||t>=g.path.length-1)return;const w=g.path.filter((E,k)=>k!==t);b.getState().updateWirePath(e,w)};return c.jsx("circle",{className:"ole-wire-handle ole-wire-vertex",cx:a,cy:l,r:5,style:{cursor:u},onPointerDown:d,onPointerMove:m,onPointerUp:f,onPointerCancel:f,onDoubleClick:p})}function F$({wireId:e,segIndex:t,axis:n}){const o=Je(),r=O.useRef(null),s=b(h=>{var g;return(g=h.internal.wireRenders.get(e))==null?void 0:g.path});if(!s||t<0||t>=s.length-1)return null;const i=s[t],a=s[t+1],l=(i[0]+a[0])/2,u=(i[1]+a[1])/2,d=n==="h"?"ns-resize":"ew-resize",m=h=>{if(h.button!==0||(h.stopPropagation(),h.preventDefault(),!o))return;const g=b.getState().internal.wireRenders.get(e);g&&(r.current={pointerId:h.pointerId,startPath:g.path.map(w=>[w[0],w[1]]),startSvg:o.screenToSvg(h.clientX,h.clientY),axis:n,segIndex:t},document.body.style.cursor=d,h.currentTarget.setPointerCapture(h.pointerId))},f=h=>{const g=r.current;if(!g||h.pointerId!==g.pointerId||!o)return;const w=o.screenToSvg(h.clientX,h.clientY),E=g.startPath,k=g.segIndex;if(k>=E.length-1)return;const x=E[k],S=E[k+1],A=[];for(let B=0;B<=k;B++)A.push(E[B]);if(g.axis==="h"){const B=oe(x[1]+(w[1]-g.startSvg[1]));A.push([x[0],B]),A.push([S[0],B])}else{const B=oe(x[0]+(w[0]-g.startSvg[0]));A.push([B,x[1]]),A.push([B,S[1]])}for(let B=k+1;B<E.length;B++)A.push(E[B]);b.getState().updateWirePath(e,A)},p=h=>{const g=r.current;if(!g||h.pointerId!==g.pointerId)return;const w=h.currentTarget;w.hasPointerCapture(h.pointerId)&&w.releasePointerCapture(h.pointerId),r.current=null,document.body.style.cursor=""};return c.jsxs("g",{className:"ole-wire-handle ole-wire-midpoint-group",style:{cursor:d},onPointerDown:m,onPointerMove:f,onPointerUp:p,onPointerCancel:p,children:[c.jsx("circle",{className:"ole-wire-midpoint-hit",cx:l,cy:u,r:8}),c.jsx("circle",{className:"ole-wire-handle ole-wire-midpoint",cx:l,cy:u,r:3.5})]})}const H$=3,hn=12;function W$(){const e=b(a=>a.internal.buses),t=b(a=>a.selection),n=b(a=>a.selectedNode),o=b(a=>a.internal.nodes),r=b(a=>a.internal.terminalToNode),s=new Set(t),i=new Set;if(n){const a=o.get(n);if(a)for(const l of a.terminals)!l.includes(".")&&e.has(l)&&i.add(l)}return c.jsx("g",{className:"ole-bus-layer",children:Array.from(e.values()).map(({bus:a,geometry:l})=>{const{axis:u,at:d,span:m}=l,f=m/2,p=u==="x"?d[0]-f:d[0],h=u==="x"?d[1]:d[1]-f,g=u==="x"?d[0]+f:d[0],w=u==="x"?d[1]:d[1]+f,E=s.has(a.id),k=i.has(a.id),x=r.get(a.id)??void 0,S=hn/2,A=u==="x"?d[0]-f:d[0]-S,B=u==="x"?d[1]-S:d[1]-f,q=u==="x"?m:hn,V=u==="x"?hn:m;return c.jsxs("g",{"data-bus-id":a.id,"data-element-id":a.id,"data-node-id":x,"data-selected":E?"true":void 0,"data-node-related":k?"true":void 0,className:"ole-bus",children:[c.jsx("rect",{x:A,y:B,width:q,height:V,fill:"transparent",className:"ole-bus-hit"}),c.jsx("line",{x1:p,y1:h,x2:g,y2:w,stroke:"currentColor",strokeWidth:H$,strokeLinecap:"round",fill:"none"})]},a.id)})})}function q$(){const e=b(a=>a.busbarDrawStart),t=b(a=>a.cursorSvg);if(!e||!t)return null;const n=t[0]-e[0],o=t[1]-e[1],r=Math.abs(n)>=Math.abs(o),s=r?t[0]:e[0],i=r?e[1]:t[1];return c.jsxs("g",{className:"ole-busbar-preview",pointerEvents:"none",children:[c.jsx("line",{x1:e[0],y1:e[1],x2:s,y2:i,className:"ole-busbar-preview-line"}),c.jsx("circle",{cx:e[0],cy:e[1],r:3.5,className:"ole-busbar-preview-anchor"}),c.jsx("circle",{cx:s,cy:i,r:3.5,className:"ole-busbar-preview-anchor"})]})}const G$=4,X$=9;function K$(){const e=b(a=>a.internal.junctions),t=b(a=>a.selection),n=b(a=>a.selectedNode),o=b(a=>a.internal.nodes),r=b(a=>a.internal.terminalToNode),s=new Set(t),i=new Set;if(n){const a=o.get(n);if(a)for(const l of a.terminals)i.add(l)}return c.jsx("g",{className:"ole-junction-layer",children:Array.from(e.values()).map(({junction:a,world:l})=>{const u=r.get(a.id)??void 0;return c.jsxs("g",{"data-junction-id":a.id,"data-element-id":a.id,"data-node-id":u,"data-selected":s.has(a.id)?"true":void 0,"data-node-related":i.has(a.id)?"true":void 0,className:"ole-junction",children:[c.jsx("circle",{cx:l[0],cy:l[1],r:X$,fill:"transparent",className:"ole-junction-hit"}),c.jsx("circle",{cx:l[0],cy:l[1],r:G$,className:"ole-junction-dot"})]},a.id)})})}function Ge(e){const t=[`translate(${e.at[0]} ${e.at[1]})`];return e.rot&&t.push(`rotate(${e.rot})`),e.mirror&&t.push("scale(-1 1)"),t.join(" ")}function Y$(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function V$({lib:e}){const t=Y$(e.viewBox);return t?c.jsx("rect",{className:"ole-element-hit",x:t.x,y:t.y,width:t.w,height:t.h}):null}function U$(){const e=b(a=>a.internal.elements),t=b(a=>a.internal.layout),n=b(a=>a.selection),o=b(a=>a.selectedNode),r=b(a=>a.internal.nodes),s=new Set(n),i=new Set;if(o){const a=r.get(o);if(a)for(const l of a.terminals){const u=l.indexOf(".");u>0&&i.add(l.slice(0,u))}}return c.jsx("g",{className:"ole-element-layer",children:Array.from(e.values()).map(a=>{const l=t.get(a.element.id);if(!l)return null;const u=s.has(a.element.id),d=i.has(a.element.id);return a.libraryDef?c.jsxs("g",{"data-element-id":a.element.id,"data-selected":u?"true":void 0,"data-node-related":d?"true":void 0,transform:Ge(l),className:"ole-element",children:[c.jsx(V$,{lib:a.libraryDef}),c.jsx("g",{dangerouslySetInnerHTML:{__html:a.libraryDef.svg}})]},a.element.id):c.jsxs("g",{"data-element-id":a.element.id,"data-selected":u?"true":void 0,"data-node-related":d?"true":void 0,transform:Ge(l),className:"ole-element ole-element--unknown",children:[c.jsx("rect",{x:-10,y:-10,width:20,height:20,fill:"none",stroke:"#EF4444",strokeWidth:1,strokeDasharray:"2 2"}),c.jsx("text",{x:0,y:4,fontSize:8,fill:"#EF4444",textAnchor:"middle",fontFamily:"system-ui, sans-serif",children:"?"})]},a.element.id)})})}let Zb=null;const An=new Set;function It(e){Zb=e;for(const t of An)t(e)}function J$(){return Zb}function Z$(e){return An.add(e),()=>{An.delete(e)}}function Q$(){const[e,t]=O.useState(J$());return O.useEffect(()=>Z$(t),[]),!e||e.w===0&&e.h===0?null:c.jsx("rect",{className:"ole-marquee",x:e.x,y:e.y,width:e.w,height:e.h,pointerEvents:"none"})}function eS(){const e=b(u=>u.activeTool),t=b(u=>u.placeKind),n=b(u=>u.cursorSvg),o=b(u=>u.placeFromTerminal);if(e!=="place"||!t||!n)return null;const r=qb(t);if(!r)return null;let s=null,i=null;if(o){const u=Vb(o,n);u&&(s=Ub(r,u,n),i={source:u.world,pin:n})}else s=Yb(r);const a=n[0]-((s==null?void 0:s.x)??0),l=n[1]-((s==null?void 0:s.y)??0);return c.jsxs("g",{className:"ole-place-ghost-group",pointerEvents:"none",children:[i&&c.jsxs(c.Fragment,{children:[c.jsx("line",{x1:i.source[0],y1:i.source[1],x2:i.pin[0],y2:i.pin[1],className:"ole-wire-preview-line"}),c.jsx("circle",{cx:i.source[0],cy:i.source[1],r:4,className:"ole-wire-preview-anchor"})]}),c.jsx("g",{className:"ole-place-ghost",transform:`translate(${a} ${l})`,opacity:.5,children:c.jsx("g",{dangerouslySetInnerHTML:{__html:r.svg}})})]})}function tS(){const e=b(r=>r.selection),t=b(r=>r.internal.elements),n=b(r=>r.internal.layout),o=b(r=>r.internal.buses);return e.length===0?null:c.jsx("g",{className:"ole-selection-overlay",pointerEvents:"none",children:e.map(r=>{const s=o.get(r);if(s){const{axis:u,at:d,span:m}=s.geometry,f=m/2,p=u==="x"?d[0]-f:d[0]-4,h=u==="x"?d[1]-4:d[1]-f,g=u==="x"?m:8,w=u==="x"?8:m;return c.jsx("rect",{x:p,y:h,width:g,height:w,fill:"none",className:"ole-selection-rect"},r)}const i=t.get(r),a=n.get(r);if(!(i!=null&&i.libraryDef)||!a)return null;const l=nS(i.libraryDef.viewBox);return l?c.jsx("rect",{x:l.x,y:l.y,width:l.w,height:l.h,fill:"none",className:"ole-selection-rect",transform:Ge(a)},r):null})})}function nS(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function oS(){const e=b(s=>s.internal.terminals),t=b(s=>s.internal.terminalToNode),n=b(s=>s.wireFromTerminal),o=b(s=>s.selection),r=new Set(o);return c.jsx("g",{className:"ole-terminal-layer",children:Array.from(e.values()).map(s=>{const i=t.get(s.ref),a=i!==void 0,l=n===s.ref,u=r.has(s.elementId);return c.jsx("circle",{cx:s.world[0],cy:s.world[1],r:3,"data-element-id":s.elementId,"data-terminal-id":s.ref,"data-node-id":i,"data-connected":a?"true":"false","data-active":l?"true":void 0,"data-on-selected":u?"true":void 0,className:"ole-terminal"},s.ref)})})}function rS(){const e=b(i=>i.internal.wireRenders),t=b(i=>i.internal.terminalToNode),n=b(i=>i.diagram.wires),o=b(i=>i.selectedWire),r=b(i=>i.selectedNode),s=new Map;for(const i of n??[]){const a=t.get(i.ends[0]);a&&s.set(i.id,a)}return c.jsx("g",{className:"ole-wire-layer",fill:"none",stroke:"currentColor",strokeWidth:1,children:Array.from(e.values()).flatMap(i=>{const a=i.path;if(a.length<2)return[];const l=a.map(f=>`${f[0]},${f[1]}`).join(" "),u=s.get(i.wireId),d=o===i.wireId,m=r!=null&&r===u;return[c.jsx("polyline",{"data-wire-id":i.wireId,"data-node-id":u,className:"ole-wire-hit",points:l},`hit-${i.wireId}`),c.jsx("polyline",{"data-wire-id":i.wireId,"data-node-id":u,"data-manual":i.userEdited?"true":void 0,"data-selected":d||m?"true":void 0,className:"ole-wire",points:l},i.wireId)]})})}let Ve=null;const Cn=new Set;function Be(e){if(!(e===null&&Ve===null||e&&Ve&&e.ref===Ve.ref&&e.world[0]===Ve.world[0]&&e.world[1]===Ve.world[1])){Ve=e;for(const t of Cn)t(e)}}function sS(){return Ve}function iS(e){return Cn.add(e),()=>{Cn.delete(e)}}function aS(){const e=b(l=>l.wireDragFrom),t=b(l=>l.cursorSvg),[n,o]=O.useState(sS());if(O.useEffect(()=>iS(o),[]),!e||!t)return null;const r=e.world,s=(n==null?void 0:n.world[0])??t[0],i=(n==null?void 0:n.world[1])??t[1],a=(n==null?void 0:n.create)==="junction";return c.jsxs("g",{className:"ole-wire-preview",pointerEvents:"none",children:[c.jsx("line",{x1:r[0],y1:r[1],x2:s,y2:i,className:"ole-wire-preview-line"}),c.jsx("circle",{cx:r[0],cy:r[1],r:4,className:"ole-wire-preview-anchor"}),n&&c.jsxs(c.Fragment,{children:[c.jsx("circle",{cx:n.world[0],cy:n.world[1],r:n.isBus?7:8,className:"ole-wire-preview-target-ring","data-create":a?"true":void 0}),!a&&c.jsx("circle",{cx:n.world[0],cy:n.world[1],r:n.isBus?3:4,className:"ole-wire-preview-target-dot"})]})]})}function Ze(e,t){return e instanceof Element?e.closest(`[${t}]`):null}function at(e){var t;return((t=Ze(e,"data-element-id"))==null?void 0:t.getAttribute("data-element-id"))??null}function lS(e){var t;return((t=Ze(e,"data-bus-id"))==null?void 0:t.getAttribute("data-bus-id"))??null}function cS(e){var t;return((t=Ze(e,"data-junction-id"))==null?void 0:t.getAttribute("data-junction-id"))??null}function st(e){var r;const t=(r=Ze(e,"data-terminal-id"))==null?void 0:r.getAttribute("data-terminal-id");if(t)return t;const n=cS(e);if(n)return n;const o=lS(e);return o||null}function Jt(e){var t;return((t=Ze(e,"data-node-id"))==null?void 0:t.getAttribute("data-node-id"))??null}function In(e){var t;return((t=Ze(e,"data-wire-id"))==null?void 0:t.getAttribute("data-wire-id"))??null}function qt(e){var t;return((t=Ze(e,"data-annotation-id"))==null?void 0:t.getAttribute("data-annotation-id"))??null}function Qb(e,t){try{e.dispatchEvent(new PointerEvent("pointercancel",{pointerId:t,bubbles:!0,cancelable:!0,pointerType:"touch"}))}catch{}}function dS(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.isContentEditable}function ew(){const e=b.getState(),t=e.activeTool;if(e.editingAnnotation||e.editingElement){if(typeof document<"u"){const n=document.querySelector(".ole-free-annotation-edit-fo div[contenteditable], .ole-element-name-editor div[contenteditable]");n==null||n.blur()}e.setEditingAnnotation(null),e.setEditingElement(null);return}if(t==="wire"||t==="busbar"||t==="junction"||t==="text"){e.setActiveTool("select");return}if(t==="place"){e.placeFromTerminal?e.setPlaceFromTerminal(null):e.placeKind?e.setPlaceKind(null):e.setActiveTool("select");return}(e.selectedNode||e.selectedWire||e.selection.length>0||e.selectedAnnotation)&&e.clearSelection()}function uS(){O.useEffect(()=>{const e=t=>{if(dS(t.target))return;const n=t.metaKey||t.ctrlKey,o=b.getState();if(n&&t.key.toLowerCase()==="z"){t.preventDefault(),t.shiftKey?o.redo():o.undo();return}if(n&&!t.shiftKey&&t.key.toLowerCase()==="y"){t.preventDefault(),o.redo();return}if(n&&t.key.toLowerCase()==="a"){t.preventDefault();const r=b.getState().diagram.elements.map(s=>s.id);o.setSelection(r);return}if(n&&!t.shiftKey&&!t.altKey){const r=t.key.toLowerCase();if(r==="c"){if(o.selection.length===0)return;t.preventDefault(),o.copySelection();return}if(r==="x"){if(o.selection.length===0)return;t.preventDefault(),o.cutSelection();return}if(r==="v"){if(!o.clipboard)return;t.preventDefault(),o.pasteClipboard();return}}if(!n)switch(t.key){case"v":case"V":o.setActiveTool("select");return;case"h":case"H":o.setActiveTool("pan");return;case"w":case"W":o.setActiveTool("wire");return;case"b":case"B":o.setActiveTool("busbar");return;case"j":case"J":o.setActiveTool("junction");return;case"p":case"P":o.setActiveTool("place");return;case"t":case"T":o.setActiveTool("text");return;case"r":case"R":o.selection.length>0&&(t.preventDefault(),o.rotateSelection(90));return;case"m":case"M":o.selection.length>0&&(t.preventDefault(),o.mirrorSelection());return;case"Delete":case"Backspace":o.selectedAnnotation?(t.preventDefault(),o.deleteAnnotation(o.selectedAnnotation)):o.selectedWire?(t.preventDefault(),o.deleteSelectedWire()):o.selectedNode?(t.preventDefault(),o.deleteSelectedNode()):o.selection.length>0&&(t.preventDefault(),o.deleteSelection());return;case"Escape":ew();return}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[])}let Pn=null;const On=new Set;function mS(e){if(e!==Pn){Pn=e;for(const t of On)t(e)}}function fS(){return Pn}function hS(e){return On.add(e),()=>{On.delete(e)}}const Go="ole-hover-element-host",pS="ole-hover-terminal-on",gS="ole-hover-node-on";function yS(e){O.useEffect(()=>{const t=e.current;if(!t)return;let n=null,o=null;const r=new Set,s=new Set,i=(m,f,p)=>{for(const h of m)h.classList.remove(p);m.clear();for(const h of f)h.classList.add(p),m.add(h)},a=m=>{var p,h;if(m===n)return;n&&((p=t.querySelector(`[data-element-id="${Pt(n)}"]`))==null||p.classList.remove(Go)),m&&((h=t.querySelector(`[data-element-id="${Pt(m)}"]`))==null||h.classList.add(Go));const f=m?Array.from(t.querySelectorAll(`.ole-terminal[data-element-id="${Pt(m)}"]`)):[];i(r,f,pS),n=m,m?t.setAttribute("data-hover-element",""):t.removeAttribute("data-hover-element"),mS(m)},l=m=>{if(m===o)return;const f=m?Array.from(t.querySelectorAll(`[data-node-id="${Pt(m)}"]`)):[];i(s,f,gS),o=m,m?t.setAttribute("data-hover-node",""):t.removeAttribute("data-hover-node")},u=m=>{a(at(m.target));const f=st(m.target);let p=null;f?p=b.getState().internal.terminalToNode.get(f)??null:p=Jt(m.target),l(p)},d=()=>{a(null),l(null)};return t.addEventListener("pointermove",u),t.addEventListener("pointerleave",d),()=>{t.removeEventListener("pointermove",u),t.removeEventListener("pointerleave",d),a(null),l(null)}},[e])}function Pt(e){return e.replace(/(["\\])/g,"\\$1")}function tw(e,t){const n=b.getState().internal;if(!e.includes(".")){const r=n.buses.get(e);if(r){const{axis:i,at:a,span:l}=r.geometry;if(i==="x"){const f=a[0]-l/2,p=a[0]+l/2,h=Math.max(f,Math.min(p,t[0]));return{ref:e,world:[h,a[1]],isBus:!0}}const u=a[1]-l/2,d=a[1]+l/2,m=Math.max(u,Math.min(d,t[1]));return{ref:e,world:[a[0],m],isBus:!0}}const s=n.junctions.get(e);return s?{ref:e,world:[s.world[0],s.world[1]],isBus:!1}:null}const o=n.terminals.get(e);return o?{ref:e,world:o.world,isBus:!1}:null}const Xo=3;let de=null,Se=null,je=null,me=null;const xS={id:"select",cursor:"default",onPointerDown(e,t){var f,p,h,g,w,E,k;if(e.button!==0||e.target instanceof Element&&e.target.closest(".ole-bus-handle, .ole-wire-handle"))return;const n=b.getState(),o=qt(e.target);if(o){e.preventDefault(),e.stopPropagation();const x=(f=n.diagram.annotations)==null?void 0:f.find(S=>S.id===o);if(!x)return;n.setSelectedAnnotation(o),me={pointerId:e.pointerId,id:o,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),origin:[x.at[0],x.at[1]],moved:!1};return}const s=(e.target instanceof Element?(p=e.target.closest("[data-terminal-id]"))==null?void 0:p.getAttribute("data-terminal-id"):null)?st(e.target):null;if(s){const x=s.indexOf("."),S=x>0?s.slice(0,x):"";if(S&&n.selection.includes(S)){e.preventDefault(),e.stopPropagation(),e.target instanceof Element&&((g=(h=e.target).hasPointerCapture)!=null&&g.call(h,e.pointerId))&&e.target.releasePointerCapture(e.pointerId),t.hostEl.classList.add("tool-wire"),n.setWireFromTerminal(s),n.setCursorSvg(t.viewport.screenToSvg(e.clientX,e.clientY)),je={pointerId:e.pointerId,fromRef:s};return}}let i=at(e.target);if(!i){const x=In(e.target);if(x&&typeof document<"u"){const S=document.elementsFromPoint(e.clientX,e.clientY);for(const A of S){const B=(E=(w=A.closest)==null?void 0:w.call(A,"[data-bus-id]"))==null?void 0:E.getAttribute("data-bus-id");if(!B)continue;const q=(k=n.diagram.wires)==null?void 0:k.find(V=>V.id===x);q&&(q.ends[0]===B||q.ends[1]===B)&&(i=B);break}}}if(!i){const x=In(e.target);if(x){if(e.preventDefault(),e.altKey){const S=Jt(e.target);if(S){n.setSelectedNode(S);return}}n.setSelectedWire(x);return}e.shiftKey||n.clearSelection(),Se={pointerId:e.pointerId,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),shiftKey:e.shiftKey,baseSelection:e.shiftKey?n.selection.slice():[]},t.hostEl.setPointerCapture(e.pointerId),e.preventDefault();return}const a=n.selection;e.shiftKey?n.toggleInSelection(i):a.includes(i)||n.setSelection([i]);const l=e.shiftKey?b.getState().selection:a.includes(i)?a:[i];if(l.length===0)return;const u=b.getState().internal,d=new Map,m=new Map;for(const x of l){const S=u.buses.get(x);if(S){m.set(x,[S.geometry.at[0],S.geometry.at[1]]);continue}const A=u.layout.get(x);A&&d.set(x,{...A})}d.size===0&&m.size===0||(de={pointerId:e.pointerId,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),originals:d,busOriginals:m,moved:!1},e.preventDefault())},onPointerMove(e,t){if(me&&e.pointerId===me.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=oe(n[0]-me.startSvg[0]),r=oe(n[1]-me.startSvg[1]);!me.moved&&(o!==0||r!==0)&&(me.moved=!0,t.hostEl.hasPointerCapture(e.pointerId)||t.hostEl.setPointerCapture(e.pointerId));const s=t.hostEl.querySelector(`[data-annotation-id="${We(me.id)}"]`);s&&s.setAttribute("transform",`translate(${o} ${r})`);return}if(je&&e.pointerId===je.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY);b.getState().setCursorSvg(n);const o=typeof document<"u"?document.elementFromPoint(e.clientX,e.clientY):null,r=o?st(o):null;if(!r||r===je.fromRef){Be(null);return}Be(tw(r,n));return}if(de&&e.pointerId===de.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=oe(n[0]-de.startSvg[0]),r=oe(n[1]-de.startSvg[1]);!de.moved&&(o!==0||r!==0)&&(de.moved=!0,t.hostEl.hasPointerCapture(e.pointerId)||t.hostEl.setPointerCapture(e.pointerId));for(const[s,i]of de.originals){const a=t.hostEl.querySelector(`[data-element-id="${We(s)}"]`);if(!a)continue;const l={...i,at:[i.at[0]+o,i.at[1]+r]};a.setAttribute("transform",Ge(l))}for(const s of de.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${We(s)}"]`);i&&i.setAttribute("transform",`translate(${o} ${r})`)}return}if(Se&&e.pointerId===Se.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY);It(Ko(Se.startSvg,n));return}},onPointerUp(e,t){if(me&&e.pointerId===me.pointerId){t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=oe(n[0]-me.startSvg[0]),r=oe(n[1]-me.startSvg[1]),s=t.hostEl.querySelector(`[data-annotation-id="${We(me.id)}"]`);s&&s.removeAttribute("transform"),me.moved&&(o!==0||r!==0)&&b.getState().updateAnnotation(me.id,{at:[me.origin[0]+o,me.origin[1]+r]}),me=null;return}if(je&&e.pointerId===je.pointerId){const n=b.getState(),o=je.fromRef;je=null,t.hostEl.classList.remove("tool-wire"),n.setWireFromTerminal(null),n.setCursorSvg(null),Be(null);const r=st(e.target);r&&r!==o&&n.addWire(o,r);return}if(de&&e.pointerId===de.pointerId){if(t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId),de.moved){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=oe(n[0]-de.startSvg[0]),r=oe(n[1]-de.startSvg[1]);if(o!==0||r!==0){const s=new Map;for(const i of de.originals.keys())s.set(i,[o,r]);for(const i of de.busOriginals.keys())s.set(i,[o,r]);b.getState().moveElements(s)}for(const s of de.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${We(s)}"]`);i&&i.removeAttribute("transform")}}de=null;return}if(Se&&e.pointerId===Se.pointerId){t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=Ko(Se.startSvg,n);if(o.w>=Xo||o.h>=Xo){const r=bS(o);if(Se.shiftKey){const s=new Set(Se.baseSelection);for(const i of r)s.has(i)?s.delete(i):s.add(i);b.getState().setSelection([...s])}else b.getState().setSelection(r)}It(null),Se=null}},onPointerCancel(e,t){var n,o,r,s,i,a;if(me&&e.pointerId===me.pointerId){const l=t.hostEl.querySelector(`[data-annotation-id="${We(me.id)}"]`);if(l&&l.removeAttribute("transform"),(o=(n=t.hostEl).hasPointerCapture)!=null&&o.call(n,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}me=null}if(de&&e.pointerId===de.pointerId){for(const[l,u]of de.originals){const d=t.hostEl.querySelector(`[data-element-id="${We(l)}"]`);d&&d.setAttribute("transform",Ge(u))}for(const l of de.busOriginals.keys()){const u=t.hostEl.querySelector(`[data-element-id="${We(l)}"]`);u&&u.removeAttribute("transform")}if((s=(r=t.hostEl).hasPointerCapture)!=null&&s.call(r,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}de=null}if(je&&e.pointerId===je.pointerId){t.hostEl.classList.remove("tool-wire");const l=b.getState();l.setWireFromTerminal(null),l.setCursorSvg(null),Be(null),je=null}if(Se&&e.pointerId===Se.pointerId){if((a=(i=t.hostEl).hasPointerCapture)!=null&&a.call(i,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}It(null),Se=null}},onDoubleClick(e){const t=b.getState(),n=qt(e.target);if(n){e.preventDefault(),e.stopPropagation(),t.setEditingAnnotation(n);return}const o=at(e.target);o&&(e.preventDefault(),e.stopPropagation(),t.setEditingElement(o))},onDeactivate(e){if(de=null,Se=null,me=null,je){e.hostEl.classList.remove("tool-wire");const t=b.getState();t.setWireFromTerminal(null),t.setCursorSvg(null),Be(null),je=null}It(null)}};function Ko(e,t){const n=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.abs(t[0]-e[0]),s=Math.abs(t[1]-e[1]);return{x:n,y:o,w:r,h:s}}function bS(e){const{internal:t}=b.getState(),n=[];for(const o of t.elements.values()){if(!o.libraryDef)continue;const r=t.layout.get(o.element.id);if(!r)continue;const s=vS(o.libraryDef.viewBox);if(!s)continue;const i=[[s.x,s.y],[s.x+s.w,s.y],[s.x,s.y+s.h],[s.x+s.w,s.y+s.h]].map(([m,f])=>wS([m,f],r));let a=1/0,l=-1/0,u=1/0,d=-1/0;for(const[m,f]of i)m<a&&(a=m),m>l&&(l=m),f<u&&(u=f),f>d&&(d=f);l>=e.x&&a<=e.x+e.w&&d>=e.y&&u<=e.y+e.h&&n.push(o.element.id)}for(const{bus:o,geometry:r}of t.buses.values()){const{axis:s,at:i,span:a}=r,l=a/2,u=s==="x"?i[0]-l:i[0],d=s==="x"?i[0]+l:i[0],m=s==="x"?i[1]:i[1]-l,f=s==="x"?i[1]:i[1]+l;d>=e.x&&u<=e.x+e.w&&f>=e.y&&m<=e.y+e.h&&n.push(o.id)}return n}function wS(e,t){let[n,o]=e;switch(t.mirror&&(n=-n),t.rot){case 0:break;case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}function vS(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function We(e){return e.replace(/(["\\])/g,"\\$1")}const kS=4;let te=null;const _S={id:"pan",cursor:"grab",onPointerDown(e,t){if(e.button!==0)return;const n=t.viewport.getViewport(),o=at(e.target);let r=null;if(o){const s=b.getState();s.selection.includes(o)||s.setSelection([o]);const i=b.getState().selection,a=b.getState().internal,l=new Map,u=new Map;for(const d of i){const m=a.buses.get(d);if(m){u.set(d,[m.geometry.at[0],m.geometry.at[1]]);continue}const f=a.layout.get(d);f&&l.set(d,{...f})}(l.size>0||u.size>0)&&(r={startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),originals:l,busOriginals:u})}te={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,startTx:n.tx,startTy:n.ty,startTarget:e.target,moved:!1,elementDrag:r},t.hostEl.style.cursor="grabbing",e.preventDefault()},onPointerMove(e,t){if(!te||e.pointerId!==te.pointerId)return;const n=e.clientX-te.startX,o=e.clientY-te.startY;if(!te.moved&&Math.hypot(n,o)>kS){te.moved=!0;try{t.hostEl.setPointerCapture(e.pointerId)}catch{}}if(te.moved){if(te.elementDrag){const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=oe(r[0]-te.elementDrag.startSvg[0]),i=oe(r[1]-te.elementDrag.startSvg[1]);for(const[a,l]of te.elementDrag.originals){const u=t.hostEl.querySelector(`[data-element-id="${bt(a)}"]`);if(!u)continue;const d={...l,at:[l.at[0]+s,l.at[1]+i]};u.setAttribute("transform",Ge(d))}for(const a of te.elementDrag.busOriginals.keys()){const l=t.hostEl.querySelector(`[data-element-id="${bt(a)}"]`);l&&l.setAttribute("transform",`translate(${s} ${i})`)}return}t.viewport.setViewport({tx:te.startTx+n,ty:te.startTy+o})}},onPointerUp(e,t){if(!(!te||e.pointerId!==te.pointerId)){if(t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId),t.hostEl.style.cursor="grab",te.elementDrag&&te.moved){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=oe(n[0]-te.elementDrag.startSvg[0]),r=oe(n[1]-te.elementDrag.startSvg[1]);if(o!==0||r!==0){const s=new Map;for(const i of te.elementDrag.originals.keys())s.set(i,[o,r]);for(const i of te.elementDrag.busOriginals.keys())s.set(i,[o,r]);b.getState().moveElements(s)}for(const s of te.elementDrag.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${bt(s)}"]`);i&&i.removeAttribute("transform")}}else te.moved||$S(te.startTarget);te=null}},onPointerCancel(e,t){if(te!=null&&te.elementDrag){for(const[n,o]of te.elementDrag.originals){const r=t.hostEl.querySelector(`[data-element-id="${bt(n)}"]`);r&&r.setAttribute("transform",Ge(o))}for(const n of te.elementDrag.busOriginals.keys()){const o=t.hostEl.querySelector(`[data-element-id="${bt(n)}"]`);o&&o.removeAttribute("transform")}}te=null},onDeactivate(){te=null}};function $S(e){if(!e)return;const t=b.getState(),n=qt(e);if(n){t.setSelectedAnnotation(n);return}const o=at(e);if(o){t.setSelection([o]);return}const r=Jt(e);if(r){t.setSelectedNode(r);return}t.clearSelection()}function bt(e){return e.replace(/(["\\])/g,"\\$1")}const vt={tight:1024,compact:720,dense:520,mini:380},Yo={full:0,tight:1,compact:2,dense:3,mini:4};function Ce(e,t){return Yo[e]>=Yo[t]}function SS(e){return e>=vt.tight?"full":e>=vt.compact?"tight":e>=vt.dense?"compact":e>=vt.mini?"dense":"mini"}const nw=O.createContext("full");function Ke(){return O.useContext(nw)}function jS(e){const[t,n]=O.useState(null);return O.useLayoutEffect(()=>{const o=e.current;if(!o)return;const r=()=>{const i=o.clientWidth;n(a=>a===i?a:i)};if(r(),typeof ResizeObserver>"u")return;const s=new ResizeObserver(r);return s.observe(o),()=>s.disconnect()},[e]),t}function ow(){if(typeof window>"u")return!1;try{if(!window.matchMedia("(pointer: coarse)").matches)return!1}catch{return!1}return window.innerWidth<vt.dense}function Zt(){ow()&&b.getState().setActiveTool("pan")}function ES(){ow()&&b.getState().setPlaceKind(null)}const Vo=10,Ot=e=>Math.round(e/Vo)*Vo;function NS(e,t){let n=e[0],o=1/0;for(let r=0;r<e.length-1;r++){const[s,i]=e[r],[a,l]=e[r+1],u=a-s,d=l-i,m=u*u+d*d,f=m===0?0:Math.max(0,Math.min(1,((t[0]-s)*u+(t[1]-i)*d)/m)),p=s+f*u,h=i+f*d,g=(p-t[0])**2+(h-t[1])**2;g<o&&(o=g,n=[p,h])}return n}function Uo(e,t){return typeof document<"u"?document.elementFromPoint(e,t):null}function pn(e,t){const n=e?st(e):null;if(n){const s=tw(n,t);if(s)return{spec:{end:n},world:s.world,ref:n,isBus:s.isBus,create:!1}}const o=e?In(e):null;if(o){const s=b.getState().internal.wireRenders.get(o),i=s?NS(s.path,t):t,a=[Ot(i[0]),Ot(i[1])];return{spec:{onWire:o,at:a},world:a,ref:null,isBus:!1,create:!0}}const r=[Ot(t[0]),Ot(t[1])];return{spec:{junctionAt:r},world:r,ref:null,isBus:!1,create:!0}}function MS(e){return{ref:e.ref,world:e.world,isBus:e.isBus,...e.create?{create:"junction"}:{}}}function Jo(e,t){return e.ref&&t.ref?e.ref===t.ref:!e.ref&&!t.ref?e.world[0]===t.world[0]&&e.world[1]===t.world[1]:!1}const TS={id:"wire",cursor:"crosshair",onActivate(e){e.hostEl.classList.add("tool-wire")},onDeactivate(e){e.hostEl.classList.remove("tool-wire");const t=b.getState();t.setWireFromTerminal(null),t.setWireDragFrom(null),t.setCursorSvg(null),Be(null)},onPointerDown(e,t){var s,i;if(e.button!==0)return;e.preventDefault(),e.stopPropagation(),e.target instanceof Element&&((i=(s=e.target).hasPointerCapture)!=null&&i.call(s,e.pointerId))&&e.target.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=pn(e.target instanceof Element?e.target:null,n),r=b.getState();r.setWireDragFrom({spec:o.spec,world:o.world,ref:o.ref}),r.setWireFromTerminal(o.ref),r.setCursorSvg(n)},onPointerMove(e,t){const n=b.getState(),o=n.wireDragFrom;if(!o)return;const r=t.viewport.screenToSvg(e.clientX,e.clientY);n.setCursorSvg(r);const s=Uo(e.clientX,e.clientY),i=pn(s,r),a={spec:o.spec,world:o.world,ref:o.ref,create:!o.ref};Be(Jo(a,i)?null:MS(i))},onPointerUp(e,t){const n=b.getState(),o=n.wireDragFrom;if(n.setWireFromTerminal(null),n.setWireDragFrom(null),n.setCursorSvg(null),Be(null),!o)return;const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=Uo(e.clientX,e.clientY)??(e.target instanceof Element?e.target:null),i=pn(s,r),a={spec:o.spec,world:o.world,ref:o.ref,create:!o.ref};Jo(a,i)||(n.connectWire(o.spec,i.spec),Zt())},onPointerLeave(){const e=b.getState();e.setWireFromTerminal(null),e.setWireDragFrom(null),e.setCursorSvg(null),Be(null)}},Zo=10;let wt=!1;function Qo(){setTimeout(()=>ES(),0)}const AS={id:"place",cursor:"copy",onActivate(e){e.hostEl.classList.add("tool-place")},onDeactivate(e){e.hostEl.classList.remove("tool-place");const t=b.getState();t.setPlaceFromTerminal(null),t.setCursorSvg(null),wt=!1},onPointerDown(e,t){var s,i;if(e.button!==0)return;const{placeKind:n}=b.getState();if(!n)return;e.preventDefault();const o=st(e.target);if(o){e.stopPropagation(),e.target instanceof Element&&((i=(s=e.target).hasPointerCapture)!=null&&i.call(s,e.pointerId))&&e.target.releasePointerCapture(e.pointerId);const a=b.getState();a.setPlaceFromTerminal(o),a.setCursorSvg(t.viewport.screenToSvg(e.clientX,e.clientY));return}const r=t.viewport.screenToSvg(e.clientX,e.clientY);Kb(n,r),wt=!0},onPointerMove(e,t){const n=t.viewport.screenToSvg(e.clientX,e.clientY);b.getState().setCursorSvg([er(n[0]),er(n[1])])},onPointerUp(e,t){const n=b.getState(),o=n.placeFromTerminal;if(o){n.setPlaceFromTerminal(null);const{placeKind:r}=n;if(!r)return;const s=t.viewport.screenToSvg(e.clientX,e.clientY);T$(r,o,s),Qo();return}wt&&(wt=!1,Qo())},onPointerLeave(){const e=b.getState();e.setPlaceFromTerminal(null),e.setCursorSvg(null)},onPointerCancel(){const e=b.getState();e.setPlaceFromTerminal(null),e.setCursorSvg(null),wt=!1}};function er(e){return Math.round(e/Zo)*Zo}const tr=10,nr=20;function tt(e){return Math.round(e/tr)*tr}const CS={id:"busbar",cursor:"crosshair",onPointerDown(e,t){if(e.button!==0)return;e.preventDefault();const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=[tt(n[0]),tt(n[1])];b.getState().setBusbarDrawStart(o),b.getState().setCursorSvg(o)},onPointerMove(e,t){const n=t.viewport.screenToSvg(e.clientX,e.clientY);b.getState().setCursorSvg([tt(n[0]),tt(n[1])])},onPointerUp(e,t){const n=b.getState().busbarDrawStart;if(b.getState().setBusbarDrawStart(null),!n)return;const o=t.viewport.screenToSvg(e.clientX,e.clientY),r=tt(o[0]),s=tt(o[1]),i=r-n[0],a=s-n[1],l=Math.abs(i)>=Math.abs(a);let u,d,m;if(l){if(d=Math.abs(i),d<nr)return;u=0,m=[(n[0]+r)/2,n[1]]}else{if(d=Math.abs(a),d<nr)return;u=90,m=[n[0],(n[1]+s)/2]}b.getState().addBus(m,d,u),Zt()},onPointerLeave(){const e=b.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)},onPointerCancel(){const e=b.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)},onDeactivate(){const e=b.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)}},or=10,rr=e=>Math.round(e/or)*or,IS={id:"junction",cursor:"crosshair",onPointerDown(e,t){if(e.button!==0)return;e.preventDefault(),e.stopPropagation();const n=t.viewport.screenToSvg(e.clientX,e.clientY);b.getState().addJunction([rr(n[0]),rr(n[1])]),Zt()}},PS={id:"text",cursor:"text",onPointerDown(e,t){if(e.button!==0)return;const n=b.getState(),o=qt(e.target);if(o){e.preventDefault(),e.stopPropagation(),n.setActiveTool("select"),n.setSelectedAnnotation(o);return}e.preventDefault();const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=n.addAnnotation([r[0],r[1]],"");n.setEditingAnnotation(s),Zt()}},OS={select:xS,pan:_S,wire:TS,place:AS,busbar:CS,junction:IS,text:PS};function BS(e,t){const n=b(o=>o.activeTool);O.useEffect(()=>{var f;const o=e.current;if(!o)return;const r=OS[n],s={viewport:t,hostEl:o};(f=r.onActivate)==null||f.call(r,s),r.cursor&&(o.style.cursor=r.cursor);const i=p=>{var h;return(h=r.onPointerDown)==null?void 0:h.call(r,p,s)},a=p=>{var h;return(h=r.onPointerMove)==null?void 0:h.call(r,p,s)},l=p=>{var h;return(h=r.onPointerUp)==null?void 0:h.call(r,p,s)},u=p=>{var h;return r.onPointerCancel?r.onPointerCancel(p,s):(h=r.onPointerUp)==null?void 0:h.call(r,p,s)},d=p=>{var h;return(h=r.onPointerLeave)==null?void 0:h.call(r,p,s)},m=p=>{var h;return(h=r.onDoubleClick)==null?void 0:h.call(r,p,s)};return o.addEventListener("pointerdown",i),o.addEventListener("pointermove",a),o.addEventListener("pointerup",l),o.addEventListener("pointercancel",u),o.addEventListener("pointerleave",d),o.addEventListener("dblclick",m),()=>{var p;o.removeEventListener("pointerdown",i),o.removeEventListener("pointermove",a),o.removeEventListener("pointerup",l),o.removeEventListener("pointercancel",u),o.removeEventListener("pointerleave",d),o.removeEventListener("dblclick",m),(p=r.onDeactivate)==null||p.call(r,s),o.style.cursor=""}},[n,e,t])}let Bn=1;const Ln=new Set;function LS(e){if(e!==Bn){Bn=e;for(const t of Ln)t(e)}}function zS(){return Bn}function RS(e){return Ln.add(e),()=>{Ln.delete(e)}}const gn=.1,yn=8,DS=1.0015,FS=1.02;function HS(e,t,n={tx:0,ty:0,scale:1}){const o=O.useRef({...n}),r=O.useRef(new Set),s=()=>{const i=t.current,a=e.current;if(i&&i.setAttribute("transform",`translate(${o.current.tx} ${o.current.ty}) scale(${o.current.scale})`),a&&a.style.setProperty("--canvas-scale",String(o.current.scale)),LS(o.current.scale),r.current.size>0){const l={...o.current};for(const u of r.current)u(l)}};return O.useEffect(()=>{const i=e.current;if(!i)return;let a=!1,l=-1,u=0,d=0,m=0,f=0,p=!1;const h=new Map;let g=null,w=!1;const E=()=>{if(h.size<2){g=null;return}const R=[...h.values()],F=R[1].x-R[0].x,Z=R[1].y-R[0].y,ie=Math.hypot(F,Z)||1,le=i.getBoundingClientRect();g={startDist:ie,startScale:o.current.scale,startTx:o.current.tx,startTy:o.current.ty,startMidX:(R[0].x+R[1].x)/2-le.left,startMidY:(R[0].y+R[1].y)/2-le.top}},k=R=>{if(R.pointerType==="touch"){if(h.set(R.pointerId,{x:R.clientX,y:R.clientY}),h.size>=2&&!w){w=!0;for(const F of h.keys())F!==R.pointerId&&Qb(i,F);E()}if(w){R.stopPropagation(),R.preventDefault();try{i.setPointerCapture(R.pointerId)}catch{}}}},x=R=>{if(R.pointerType!=="touch"||!h.has(R.pointerId)||(h.set(R.pointerId,{x:R.clientX,y:R.clientY}),!w||!g))return;R.stopPropagation();const F=[...h.values()];if(F.length<2)return;const Z=F[1].x-F[0].x,ie=F[1].y-F[0].y,le=Math.hypot(Z,ie)||1,Q=i.getBoundingClientRect(),he=(F[0].x+F[1].x)/2-Q.left,pe=(F[0].y+F[1].y)/2-Q.top,ge=le/g.startDist,Ie=xn(g.startScale*ge,gn,yn),$e=Ie/g.startScale;o.current.tx=g.startMidX-(g.startMidX-g.startTx)*$e+(he-g.startMidX),o.current.ty=g.startMidY-(g.startMidY-g.startTy)*$e+(pe-g.startMidY),o.current.scale=Ie,s()},S=R=>{var F;if(R.pointerType==="touch"&&h.has(R.pointerId)&&(h.delete(R.pointerId),w)){if(R.stopPropagation(),(F=i.hasPointerCapture)!=null&&F.call(i,R.pointerId))try{i.releasePointerCapture(R.pointerId)}catch{}h.size>=2?E():g=null,h.size===0&&(w=!1)}},A=R=>{R.preventDefault();const F=i.getBoundingClientRect(),Z=R.clientX-F.left,ie=R.clientY-F.top,le=R.ctrlKey||R.metaKey;if(R.deltaX===0||le){const pe=Math.pow(le?FS:DS,-R.deltaY),ge=xn(o.current.scale*pe,gn,yn),Ie=ge/o.current.scale;o.current.tx=Z-(Z-o.current.tx)*Ie,o.current.ty=ie-(ie-o.current.ty)*Ie,o.current.scale=ge}else o.current.tx-=R.deltaX,o.current.ty-=R.deltaY;s()},B=R=>{const F=R.button===1,Z=p&&R.button===0;!F&&!Z||(R.preventDefault(),a=!0,l=R.pointerId,u=R.clientX,d=R.clientY,m=o.current.tx,f=o.current.ty,i.setPointerCapture(R.pointerId),i.style.cursor="grabbing")},q=R=>{!a||R.pointerId!==l||(o.current.tx=m+(R.clientX-u),o.current.ty=f+(R.clientY-d),s())},V=R=>{a&&R.pointerId===l&&(a=!1,i.releasePointerCapture(R.pointerId),i.style.cursor=p?"grab":"")},re=R=>{if(R.code==="Space"&&!p){const F=R.target;if(F&&(F.tagName==="INPUT"||F.tagName==="TEXTAREA"||F.isContentEditable))return;p=!0,i.style.cursor="grab",R.preventDefault()}},se=R=>{R.code==="Space"&&(p=!1,a||(i.style.cursor=""))};return i.addEventListener("wheel",A,{passive:!1}),i.addEventListener("pointerdown",B),i.addEventListener("pointermove",q),i.addEventListener("pointerup",V),i.addEventListener("pointercancel",V),i.addEventListener("pointerdown",k,{capture:!0}),i.addEventListener("pointermove",x,{capture:!0}),i.addEventListener("pointerup",S,{capture:!0}),i.addEventListener("pointercancel",S,{capture:!0}),window.addEventListener("keydown",re),window.addEventListener("keyup",se),s(),()=>{i.removeEventListener("wheel",A),i.removeEventListener("pointerdown",B),i.removeEventListener("pointermove",q),i.removeEventListener("pointerup",V),i.removeEventListener("pointercancel",V),i.removeEventListener("pointerdown",k,{capture:!0}),i.removeEventListener("pointermove",x,{capture:!0}),i.removeEventListener("pointerup",S,{capture:!0}),i.removeEventListener("pointercancel",S,{capture:!0}),window.removeEventListener("keydown",re),window.removeEventListener("keyup",se)}},[]),{screenToSvg(i,a){const l=e.current;if(!l)return[i,a];const u=l.getBoundingClientRect(),d=(i-u.left-o.current.tx)/o.current.scale,m=(a-u.top-o.current.ty)/o.current.scale;return[d,m]},getViewport(){return{...o.current}},setViewport(i){i.tx!==void 0&&(o.current.tx=i.tx),i.ty!==void 0&&(o.current.ty=i.ty),i.scale!==void 0&&(o.current.scale=xn(i.scale,gn,yn)),s()},subscribe(i){return r.current.add(i),()=>{r.current.delete(i)}}}}function xn(e,t,n){return e<t?t:e>n?n:e}const rw=typeof navigator<"u"&&/Mac|iP(ad|hone|od)/.test(navigator.platform),nt=rw?"⌘":"Ctrl+",WS=rw?"⇧":"Shift+",bn=[10,20,50,100,200,500,1e3,2e3,5e3,1e4],qS=18;function GS(e){for(const t of bn)if(t*e>=qS)return t;return bn[bn.length-1]}function XS(){const e=ne(),t=O.useRef(null),n=O.useRef(null),o=O.useRef(null),r=HS(t,n);BS(t,r),yS(t),O.useEffect(()=>(Ho(r),()=>Ho(null)),[r]),O.useEffect(()=>{const d=m=>{const f=o.current;if(!f)return;const h=GS(m.scale)*m.scale;f.setAttribute("width",String(h)),f.setAttribute("height",String(h)),f.setAttribute("patternTransform",`translate(${m.tx} ${m.ty})`)};return d(r.getViewport()),r.subscribe(d)},[r]);const s=Dv(),i=O.useCallback((d,m,f)=>{const p=b.getState(),h=p.activeTool;if(h==="wire"||h==="busbar"||h==="junction"||h==="place"){ew();return}const g=at(f);if(g)p.selection.includes(g)||p.setSelection([g]);else{const B=Jt(f);B&&p.selectedNode!==B&&p.setSelectedNode(B)}const w=b.getState(),E=w.selection.length>0,k=w.selectedNode!=null,x=!!w.clipboard,S=w.diagram.elements.length>0,A=[{label:e("menu.undo"),shortcut:`${nt}Z`,icon:Hn,onSelect:()=>b.getState().undo(),disabled:w.past.length===0},{label:e("menu.redo"),shortcut:`${nt}${WS}Z`,icon:Fn,onSelect:()=>b.getState().redo(),disabled:w.future.length===0},{type:"separator"},{label:e("menu.cut"),shortcut:`${nt}X`,icon:Pr,onSelect:()=>b.getState().cutSelection(),disabled:!E},{label:e("menu.copy"),shortcut:`${nt}C`,icon:Tr,onSelect:()=>b.getState().copySelection(),disabled:!E},{label:e("menu.paste"),shortcut:`${nt}V`,icon:Mr,onSelect:()=>b.getState().pasteClipboard(),disabled:!x},{type:"separator"},{label:e("menu.rotate"),shortcut:"R",icon:Ir,onSelect:()=>b.getState().rotateSelection(90),disabled:!E},{label:e("menu.mirror"),shortcut:"M",icon:Ar,onSelect:()=>b.getState().mirrorSelection(),disabled:!E},{type:"separator"},{label:e("menu.selectAll"),shortcut:`${nt}A`,icon:av,onSelect:()=>{const B=b.getState();B.setSelection(B.diagram.elements.map(q=>q.id))},disabled:!S},{type:"separator"},{label:e(k&&!E?"menu.disconnect":"menu.delete"),shortcut:"Del",icon:Br,destructive:!0,onSelect:()=>k&&!E?b.getState().deleteSelectedNode():b.getState().deleteSelection(),disabled:!E&&!k}];s.open(d,m,A)},[s,e]);O.useEffect(()=>{const d=t.current;if(!d)return;const m=700,f=4;let p,h=null;const g=()=>{p!==void 0&&window.clearTimeout(p),p=void 0,h=null},w=x=>{x.pointerType==="touch"&&(g(),h={pointerId:x.pointerId,x:x.clientX,y:x.clientY,target:x.target},p=window.setTimeout(()=>{const S=h;h=null,p=void 0,S&&(Qb(d,S.pointerId),i(S.x,S.y,S.target))},m))},E=x=>{if(!h||x.pointerId!==h.pointerId)return;const S=x.clientX-h.x,A=x.clientY-h.y;Math.hypot(S,A)>f&&g()},k=x=>{!h||x.pointerId!==h.pointerId||g()};return d.addEventListener("pointerdown",w),d.addEventListener("pointermove",E),d.addEventListener("pointerup",k),d.addEventListener("pointercancel",k),()=>{g(),d.removeEventListener("pointerdown",w),d.removeEventListener("pointermove",E),d.removeEventListener("pointerup",k),d.removeEventListener("pointercancel",k)}},[i]);const a=d=>{d.dataTransfer.types.includes("application/x-oneline-kind")&&(d.preventDefault(),d.dataTransfer.dropEffect="copy")},l=d=>{const m=d.dataTransfer.getData("application/x-oneline-kind");if(!m)return;d.preventDefault();const f=r.screenToSvg(d.clientX,d.clientY);Kb(m,f)},u=d=>{d.preventDefault(),i(d.clientX,d.clientY,d.target)};return c.jsx("div",{ref:t,className:"ole-canvas-root absolute inset-0 overflow-hidden",onDragOver:a,onDrop:l,onContextMenu:u,children:c.jsxs("svg",{className:"ole-canvas-svg block h-full w-full",xmlns:"http://www.w3.org/2000/svg",children:[c.jsx("defs",{children:c.jsx("pattern",{ref:o,id:"ole-grid-dots",width:20,height:20,patternUnits:"userSpaceOnUse",children:c.jsx("circle",{cx:0,cy:0,r:2,fill:"var(--canvas-grid-strong)"})})}),c.jsx("rect",{width:"100%",height:"100%",fill:"url(#ole-grid-dots)"}),c.jsxs("g",{ref:n,className:"ole-viewport",children:[c.jsx(W$,{}),c.jsx(rS,{}),c.jsx(K$,{}),c.jsx(U$,{}),c.jsx(C$,{}),c.jsx(P$,{}),c.jsx(tS,{}),c.jsx(z$,{}),c.jsx(R$,{}),c.jsx(oS,{}),c.jsx(aS,{}),c.jsx(q$,{}),c.jsx(eS,{}),c.jsx(Q$,{})]})]})})}const sr=60,KS=.1,YS=8,VS=8;function US(e,t,n){return e<t?t:e>n?n:e}function JS(){return document.querySelector(".ole-canvas-root")}function Xn(){const e=Je(),t=JS();if(!e||!t)return!1;const n=t.getBoundingClientRect();if(n.width===0||n.height===0)return!1;const o=t.querySelectorAll("[data-element-id]");if(o.length===0)return e.setViewport({tx:n.width/2,ty:n.height/2,scale:1}),!0;let r=1/0,s=1/0,i=-1/0,a=-1/0;for(const E of o){const k=E.getBoundingClientRect();k.width===0&&k.height===0||(k.left<r&&(r=k.left),k.top<s&&(s=k.top),k.right>i&&(i=k.right),k.bottom>a&&(a=k.bottom))}if(r===1/0)return!1;const[l,u]=e.screenToSvg(r,s),[d,m]=e.screenToSvg(i,a),f=Math.max(d-l,1),p=Math.max(m-u,1),h=US(Math.min((n.width-sr*2)/f,(n.height-sr*2)/p),KS,YS),g=(l+d)/2,w=(u+m)/2;return e.setViewport({tx:n.width/2-h*g,ty:n.height/2-h*w,scale:h}),!0}function Kn(){let e=VS;const t=()=>{Xn()||--e>0&&requestAnimationFrame(t)};requestAnimationFrame(t)}const ir=10,ZS=100;function QS(){return typeof window>"u"||!window.matchMedia?!1:window.matchMedia("(hover: none), (pointer: coarse)").matches}function e4(){const[e,t]=O.useState(fS()),[n,o]=O.useState(!1),[r,s]=O.useState(null),i=O.useRef(null),a=O.useRef(void 0),[l]=O.useState(QS);O.useEffect(()=>hS(h=>t(h)),[]),O.useEffect(()=>{if(window.clearTimeout(a.current),o(!1),s(null),!!e)return a.current=window.setTimeout(()=>o(!0),ZS),()=>window.clearTimeout(a.current)},[e]);const u=b(h=>e?h.diagram.elements.find(g=>g.id===e)??null:null);if(O.useLayoutEffect(()=>{if(!n||!e)return;let h=0,g=-1,w=-1;const E=()=>{const k=document.querySelector(`[data-element-id="${t4(e)}"]`),x=i.current;if(k&&x){const S=k.getBoundingClientRect();let A=S.bottom+ir;A+x.offsetHeight>window.innerHeight-4&&(A=S.top-x.offsetHeight-ir);let B=S.left+S.width/2-x.offsetWidth/2;B=Math.max(4,Math.min(B,window.innerWidth-x.offsetWidth-4)),(A!==g||B!==w)&&(s({top:A,left:B}),g=A,w=B)}h=requestAnimationFrame(E)};return h=requestAnimationFrame(E),()=>cancelAnimationFrame(h)},[n,e]),l||!n||!e||!u)return null;const d=Xe[u.kind],m=u.name??u.id,f=(d==null?void 0:d.name)??u.kind,p=u.name&&u.name!==u.id;return typeof document>"u"?null:jr.createPortal(c.jsxs("div",{ref:i,role:"tooltip",className:"ole-root ole-glass pointer-events-none fixed z-[100] flex items-center gap-1.5 rounded-md border border-border px-2 py-1 text-[11px] leading-snug shadow-md",style:{top:(r==null?void 0:r.top)??-9999,left:(r==null?void 0:r.left)??-9999,opacity:r?1:0,transition:"opacity 80ms ease-out"},children:[c.jsx("span",{className:"font-medium text-foreground",children:m}),p&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground",children:u.id}),c.jsx("span",{className:"text-muted-foreground/80",children:"·"}),c.jsx("span",{className:"text-muted-foreground",children:f})]}),document.body)}function t4(e){return e.replace(/(["\\])/g,"\\$1")}function n4({width:e,children:t}){const n=e==null?"full":SS(e);return c.jsx(nw.Provider,{value:n,children:t})}function ar(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function o4(...e){return t=>{let n=!1;const o=e.map(r=>{const s=ar(r,t);return!n&&typeof s=="function"&&(n=!0),s});if(n)return()=>{for(let r=0;r<o.length;r++){const s=o[r];typeof s=="function"?s():ar(e[r],null)}}}}var r4=Symbol.for("react.lazy"),Gt=ke[" use ".trim().toString()];function s4(e){return typeof e=="object"&&e!==null&&"then"in e}function sw(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===r4&&"_payload"in e&&s4(e._payload)}function i4(e){const t=l4(e),n=ke.forwardRef((o,r)=>{let{children:s,...i}=o;sw(s)&&typeof Gt=="function"&&(s=Gt(s._payload));const a=ke.Children.toArray(s),l=a.find(d4);if(l){const u=l.props.children,d=a.map(m=>m===l?ke.Children.count(u)>1?ke.Children.only(null):ke.isValidElement(u)?u.props.children:null:m);return c.jsx(t,{...i,ref:r,children:ke.isValidElement(u)?ke.cloneElement(u,void 0,d):null})}return c.jsx(t,{...i,ref:r,children:s})});return n.displayName=`${e}.Slot`,n}var a4=i4("Slot");function l4(e){const t=ke.forwardRef((n,o)=>{let{children:r,...s}=n;if(sw(r)&&typeof Gt=="function"&&(r=Gt(r._payload)),ke.isValidElement(r)){const i=m4(r),a=u4(s,r.props);return r.type!==ke.Fragment&&(a.ref=o?o4(o,i):i),ke.cloneElement(r,a)}return ke.Children.count(r)>1?ke.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var c4=Symbol("radix.slottable");function d4(e){return ke.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===c4}function u4(e,t){const n={...t};for(const o in t){const r=e[o],s=t[o];/^on[A-Z]/.test(o)?r&&s?n[o]=(...a)=>{const l=s(...a);return r(...a),l}:r&&(n[o]=r):o==="style"?n[o]={...r,...s}:o==="className"&&(n[o]=[r,s].filter(Boolean).join(" "))}return{...e,...n}}function m4(e){var o,r;let t=(o=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:o.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}const lr=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,cr=Rr,f4=(e,t)=>n=>{var o;if((t==null?void 0:t.variants)==null)return cr(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:r,defaultVariants:s}=t,i=Object.keys(r).map(u=>{const d=n==null?void 0:n[u],m=s==null?void 0:s[u];if(d===null)return null;const f=lr(d)||lr(m);return r[u][f]}),a=n&&Object.entries(n).reduce((u,d)=>{let[m,f]=d;return f===void 0||(u[m]=f),u},{}),l=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((u,d)=>{let{class:m,className:f,...p}=d;return Object.entries(p).every(h=>{let[g,w]=h;return Array.isArray(w)?w.includes({...s,...a}[g]):{...s,...a}[g]===w})?[...u,m,f]:u},[]);return cr(e,i,l,n==null?void 0:n.class,n==null?void 0:n.className)},h4=f4("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),Ne=ke.forwardRef(({className:e,variant:t,size:n,asChild:o=!1,...r},s)=>{const i=o?a4:"button";return c.jsx(i,{className:_e(h4({variant:t,size:n,className:e})),ref:s,...r})});Ne.displayName="Button";const p4=350;function Me({content:e,children:t,disabled:n,delayMs:o=p4}){const r=O.useRef(null),s=O.useRef(null),[i,a]=O.useState(!1),[l,u]=O.useState(null),d=O.useId(),m=O.useRef(void 0),f=()=>{n||(window.clearTimeout(m.current),m.current=window.setTimeout(()=>a(!0),o))},p=()=>{window.clearTimeout(m.current),a(!1)};O.useLayoutEffect(()=>{if(!i||!r.current||!s.current)return;const E=r.current.getBoundingClientRect(),k=s.current.getBoundingClientRect(),x=8;let S="top",A=E.top-k.height-x;A<4&&(S="bottom",A=E.bottom+x);let B=E.left+E.width/2-k.width/2;B=Math.max(4,Math.min(B,window.innerWidth-k.width-4)),u({top:A,left:B,side:S})},[i,e]),O.useEffect(()=>()=>window.clearTimeout(m.current),[]),O.useEffect(()=>{if(!i)return;const E=x=>{x.key==="Escape"&&a(!1)},k=()=>a(!1);return window.addEventListener("keydown",E),window.addEventListener("scroll",k,!0),window.addEventListener("resize",k),()=>{window.removeEventListener("keydown",E),window.removeEventListener("scroll",k,!0),window.removeEventListener("resize",k)}},[i]);const h=t,g=h.props,w=O.cloneElement(h,{ref:E=>{r.current=E;const k=h.ref;typeof k=="function"?k(E):k&&typeof k=="object"&&(k.current=E)},onPointerEnter:E=>{var k;(k=g.onPointerEnter)==null||k.call(g,E),f()},onPointerLeave:E=>{var k;(k=g.onPointerLeave)==null||k.call(g,E),p()},onFocus:E=>{var k;(k=g.onFocus)==null||k.call(g,E),f()},onBlur:E=>{var k;(k=g.onBlur)==null||k.call(g,E),p()},"aria-describedby":i?d:g["aria-describedby"]});return c.jsxs(c.Fragment,{children:[w,i&&typeof document<"u"&&jr.createPortal(c.jsx("div",{ref:s,id:d,role:"tooltip","data-side":(l==null?void 0:l.side)??"top",className:"ole-root ole-glass pointer-events-none fixed z-[100] max-w-[280px] rounded-md border border-border px-2 py-1 text-[11px] leading-snug text-foreground shadow-md",style:{top:(l==null?void 0:l.top)??-9999,left:(l==null?void 0:l.left)??-9999,opacity:l?1:0,transition:"opacity 80ms ease-out"},children:e}),document.body)]})}const dr=12,g4=56;function y4(){var E;const e=ne(),t=b(k=>k.selection),n=b(k=>k.selectedNode),o=b(k=>k.selectedWire),r=b(k=>k.activeTool),s=b(k=>k.rotateSelection),i=b(k=>k.mirrorSelection),a=b(k=>k.deleteSelection),l=b(k=>k.deleteSelectedNode),u=b(k=>k.deleteSelectedWire),d=b(k=>k.resetWirePath),m=b(k=>k.internal.wireRenders),f=o!=null&&((E=m.get(o))==null?void 0:E.userEdited)===!0,p=O.useRef(null);O.useEffect(()=>{const k=p.current;if(!k)return;const x=t.length>0,S=!x&&o!=null,A=!x&&!S&&n!=null;if(!((x||S||A)&&(r==="select"||r==="pan"))){k.style.display="none";return}k.style.display="flex";let q=0,V="";const re=()=>{let se=1/0,R=-1/0,F=1/0,Z=-1/0,ie=!1;const le=Q=>{Q.width===0&&Q.height===0||(Q.left<se&&(se=Q.left),Q.right>R&&(R=Q.right),Q.top<F&&(F=Q.top),Q.bottom>Z&&(Z=Q.bottom),ie=!0)};if(x)for(const Q of t){const he=document.querySelector(`[data-element-id="${CSS.escape(Q)}"]`);he&&le(he.getBoundingClientRect())}else if(S&&o){const Q=document.querySelector(`polyline.ole-wire[data-wire-id="${CSS.escape(o)}"]`);Q&&le(Q.getBoundingClientRect())}else if(A&&n){const Q=document.querySelectorAll(`polyline.ole-wire[data-node-id="${CSS.escape(n)}"]`);for(const he of Q)le(he.getBoundingClientRect())}if(ie){const Q=(se+R)/2;let he=F-dr,pe="-100%";he<g4&&(he=Z+dr,pe="0%");const ge=`translate3d(${Q}px, ${he}px, 0) translate(-50%, ${pe})`;ge!==V&&(k.style.transform=ge,V=ge)}q=requestAnimationFrame(re)};return q=requestAnimationFrame(re),()=>cancelAnimationFrame(q)},[t,n,o,r]);const h=t.length===0&&o!=null,g=t.length===0&&!h&&n!=null,w=g||h;return c.jsxs("div",{ref:p,role:"toolbar","aria-label":e(h?"ctx.ariaWire":g?"ctx.ariaNode":"ctx.ariaElement"),className:"ole-glass pointer-events-auto fixed left-0 top-0 z-30 hidden items-center gap-0.5 rounded-2xl border border-border p-1 shadow-md",children:[h&&f&&o&&c.jsxs(c.Fragment,{children:[c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{children:c.jsx("span",{className:"font-medium",children:e("ctx.resetWirePath")})}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.resetWirePathHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>d(o),"aria-label":e("ctx.resetWirePath"),children:c.jsx(iv,{})})}),c.jsx("div",{"aria-hidden":!0,className:"mx-0.5 h-4 w-px bg-border"})]}),!w&&c.jsxs(c.Fragment,{children:[c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.rotate")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"R"})]}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.rotateHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>s(90),"aria-label":e("ctx.rotate"),children:c.jsx(Ir,{})})}),c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.mirror")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"M"})]}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.mirrorHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>i(),"aria-label":e("ctx.mirrorTitle"),children:c.jsx(Ar,{})})}),c.jsx("div",{"aria-hidden":!0,className:"mx-0.5 h-4 w-px bg-border"})]}),c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.delete")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"Del"})]}),c.jsx("div",{className:"text-muted-foreground",children:e(h?"ctx.deleteHintWire":g?"ctx.deleteHintNode":"ctx.deleteHintElement")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",className:"size-7 text-destructive hover:text-destructive",onClick:()=>h?u():g?l():a(),"aria-label":e("ctx.delete"),children:c.jsx(Br,{})})})]})}function Yn({open:e,onOpenChange:t,trigger:n,children:o}){const r=O.useRef(null);return O.useEffect(()=>{if(!e)return;const s=a=>{r.current&&!r.current.contains(a.target)&&t(!1)},i=a=>{a.key==="Escape"&&t(!1)};return window.addEventListener("mousedown",s),window.addEventListener("keydown",i),()=>{window.removeEventListener("mousedown",s),window.removeEventListener("keydown",i)}},[e,t]),c.jsxs("div",{ref:r,className:"relative",children:[n,e&&c.jsx("div",{role:"menu",className:"ole-glass absolute bottom-full right-0 mb-1.5 min-w-52 rounded-md border border-border p-1 shadow-md",children:o})]})}const iw="ole-panel-open";function x4(){if(typeof window>"u")return{outlineOpen:!1};try{const e=window.localStorage.getItem(iw);if(!e)return{outlineOpen:!1};const t=JSON.parse(e);return typeof t!="object"||t===null?{outlineOpen:!1}:{outlineOpen:t.outline===!0}}catch{return{outlineOpen:!1}}}function ur(e){try{const t={outline:e.outlineOpen};window.localStorage.setItem(iw,JSON.stringify(t))}catch{}}const Et=Xt((e,t)=>({...x4(),setOutlineOpen:n=>{e({outlineOpen:n}),ur(t())},toggleOutline:()=>{e(n=>({outlineOpen:!n.outlineOpen})),ur(t())}})),zt=[.1,.25,.5,.75,1,1.25,1.5,2,3,4,6,8],aw=.1,lw=8,cw="ole-grid";function b4(){try{const e=window.localStorage.getItem(cw);return e==null?!0:e==="1"}catch{return!0}}function w4(e){try{window.localStorage.setItem(cw,e?"1":"0")}catch{}}function v4(e,t,n){return e<t?t:e>n?n:e}function dw(){return document.querySelector(".ole-canvas-root")}function Vn(e){const t=Je(),n=dw();if(!t||!n)return;const o=n.getBoundingClientRect(),r=o.width/2,s=o.height/2,i=t.getViewport(),a=v4(e,aw,lw),l=a/i.scale;t.setViewport({tx:r-(r-i.tx)*l,ty:s-(s-i.ty)*l,scale:a})}function k4(){const e=Je();if(!e)return;const t=e.getViewport().scale,n=zt.find(o=>o>t+1e-6)??lw;Vn(n)}function _4(){const e=Je();if(!e)return;const t=e.getViewport().scale;let n=aw;for(let o=zt.length-1;o>=0;o--)if(zt[o]<t-1e-6){n=zt[o];break}Vn(n)}const $4={off:"id",id:"all",all:"off"};function S4(){var o;const e=b.getState(),t=((o=e.diagram.meta)==null?void 0:o.labelMode)??"all",n=$4[t];e.dispatch(r=>{const s={...r.meta??{},labelMode:n};return{...r,meta:s}})}function uw(){const[e,t]=O.useState(()=>b4());return O.useEffect(()=>{const n=dw();n==null||n.classList.toggle("hide-grid",!e),w4(e)},[e]),O.useEffect(()=>{const n=o=>{if(o.metaKey||o.ctrlKey||o.altKey||o.key!=="g"&&o.key!=="G")return;const r=o.target;r&&(r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.isContentEditable)||(o.preventDefault(),t(s=>!s))};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[]),[e,t]}function mw(){const e=ne();return c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.zoomOut")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.zoomOutHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:_4,"aria-label":e("view.zoomOut"),children:c.jsx(Dn,{})})})}function fw(){const e=ne();return c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.zoomIn")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.zoomInHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:k4,"aria-label":e("view.zoomIn"),children:c.jsx(rv,{})})})}function hw(){const e=ne(),[t,n]=O.useState(zS);return O.useEffect(()=>RS(n),[]),c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.reset")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.current",{z:Math.round(t*100)})})]}),children:c.jsxs("button",{type:"button",onClick:()=>Vn(1),className:"min-w-12 rounded-md px-2 py-1 text-center text-xs tabular-nums text-muted-foreground hover:bg-accent hover:text-accent-foreground","aria-label":e("view.reset"),children:[Math.round(t*100),"%"]})})}function pw(){const e=ne();return c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.fit")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.fitHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:Xn,"aria-label":e("view.fit"),children:c.jsx(tv,{})})})}function gw({grid:e,setGrid:t}){const n=ne();return c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:n(e?"view.gridHide":"view.gridShow")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:n("view.gridHotkey")})]}),c.jsx("div",{className:"text-muted-foreground",children:n(e?"view.gridHideHint":"view.gridShowHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:()=>t(o=>!o),"aria-label":n(e?"view.gridHideAria":"view.gridShowAria"),"aria-pressed":e,className:_e(!e&&"text-muted-foreground/60"),children:c.jsx(Qw,{})})})}function yw(){const e=ne(),t=b(n=>{var o;return((o=n.diagram.meta)==null?void 0:o.labelMode)??"all"});return c.jsx(Me,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e(t==="off"?"view.labelOff":t==="id"?"view.labelId":"view.labelAll")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.labelHint")})]}),children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:S4,"aria-label":e("view.label"),"aria-pressed":t!=="off",className:_e(t==="off"&&"text-muted-foreground/60"),children:c.jsx(Lr,{})})})}function j4({stacked:e}={}){const t=ne(),[n,o]=O.useState(!1),[r,s]=uw(),i=c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:t("view.menu")}),c.jsx("div",{className:"text-muted-foreground",children:t("view.menuHint")})]}),a=e?c.jsx(Me,{content:i,children:c.jsxs("button",{type:"button",onClick:()=>o(l=>!l),"aria-label":t("view.menu"),"aria-pressed":n,className:_e("flex h-12 w-12 flex-col items-center justify-center gap-0.5 rounded-md text-[10px] font-medium leading-tight transition-colors",n?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[c.jsx(kn,{className:"size-4"}),c.jsx("span",{className:"max-w-full truncate",children:t("view.menu")})]})}):c.jsx(Me,{content:i,children:c.jsx(Ne,{variant:"ghost",size:"icon",onClick:()=>o(l=>!l),"aria-label":t("view.menu"),"aria-pressed":n,children:c.jsx(kn,{})})});return c.jsx(Yn,{open:n,onOpenChange:o,trigger:a,children:c.jsxs("div",{className:"flex flex-col gap-0.5",children:[c.jsx(hw,{}),c.jsxs("div",{className:"flex items-center gap-0.5",children:[c.jsx(mw,{}),c.jsx(fw,{})]}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsxs("div",{className:"flex items-center gap-0.5",children:[c.jsx(pw,{}),c.jsx(gw,{grid:r,setGrid:s}),c.jsx(yw,{})]})]})})}function E4(){const e=Ke();return Ce(e,"dense")?null:c.jsx(N4,{tier:e})}function N4({tier:e}){const t=Ce(e,"tight"),[n,o]=uw();return c.jsx("div",{className:"absolute z-20",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))",right:"calc(0.75rem + env(safe-area-inset-right, 0px))"},children:c.jsxs("div",{className:"ole-glass flex items-center gap-0.5 rounded-2xl border border-border p-1.5 shadow-sm",children:[c.jsx(mw,{}),!t&&c.jsx(hw,{}),c.jsx(fw,{}),c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-4 w-px bg-border"}),c.jsx(pw,{}),c.jsx(gw,{grid:n,setGrid:o}),c.jsx(yw,{})]})})}const mr=[{id:"select",labelKey:"tool.select",hotkey:"V",descriptionKey:"tool.selectHint",icon:nv,switchTo:"select",iconOnly:!0},{id:"pan",labelKey:"tool.pan",hotkey:"H",descriptionKey:"tool.panHint",icon:ev,switchTo:"pan",groupBreakAfter:!0,iconOnly:!0},{id:"busbar",labelKey:"tool.bus",hotkey:"B",descriptionKey:"tool.busHint",icon:Dn,switchTo:"busbar"},{id:"junction",labelKey:"tool.junction",hotkey:"J",descriptionKey:"tool.junctionHint",icon:Kw,switchTo:"junction",iconOnly:!0},{id:"place",labelKey:"tool.place",hotkey:"P",descriptionKey:"tool.placeHint",icon:Or,switchTo:"place"},{id:"wire",labelKey:"tool.wire",hotkey:"W",descriptionKey:"tool.wireHint",icon:Nr,switchTo:"wire"},{id:"text",labelKey:"tool.text",hotkey:"T",descriptionKey:"tool.textHint",icon:Lr,switchTo:"text",iconOnly:!0}];function M4(){const e=ne(),t=b(d=>d.activeTool),n=b(d=>d.placeKind),o=b(d=>d.placeFromTerminal),r=b(d=>d.wireDragFrom),s=b(d=>d.busbarDrawStart),i=b(d=>d.selection.length>0||d.selectedNode!=null);let a=null,l=!1;switch(t){case"select":a=e(i?"mode.selectWithSel":"mode.selectEmpty"),i&&(l=!0);break;case"pan":a=e("mode.pan");break;case"wire":a=e(r?"mode.wireDragging":"mode.wireInit"),l=!0;break;case"busbar":a=e(s?"mode.busDragging":"mode.busInit"),l=!0;break;case"junction":a=e("mode.junction"),l=!0;break;case"place":n?o?a=e("mode.placeFromTerm"):a=e("mode.placeNormal"):a=e("mode.placeNoKind"),l=!0;break;case"text":a=e("mode.text"),l=!0;break}if(!a)return null;const u=e(t==="select"?"mode.escSelect":"mode.escOther");return c.jsxs("div",{className:"ole-glass pointer-events-none flex items-center gap-2 rounded-full border border-border px-3 py-1 text-xs text-muted-foreground shadow-sm",children:[c.jsx("span",{children:a}),l&&c.jsxs("span",{className:"text-muted-foreground/70",children:["· ",u]})]})}function T4(){const e=ne(),t=b(h=>h.activeTool),n=b(h=>h.placeKind),o=b(h=>h.setActiveTool),r=b(h=>h.past.length),s=b(h=>h.future.length),i=b(h=>h.undo),a=b(h=>h.redo),l=Ke(),u=Ce(l,"tight"),d=!Ce(l,"dense"),m=Ce(l,"dense"),f=m?mr.filter(h=>h.id!=="select"&&h.id!=="text"):mr,p=h=>t===h.switchTo;return c.jsxs("div",{className:"absolute left-1/2 z-20 flex -translate-x-1/2 flex-col items-center gap-1.5",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))"},children:[d&&c.jsx(M4,{}),c.jsxs("div",{className:_e("ole-glass flex flex-row items-center rounded-2xl border border-border shadow-sm",m?"gap-0.5 p-1":"gap-0.5 p-1.5"),children:[m&&c.jsx(A4,{stacked:!0}),f.map(h=>{const g=h.icon,w=p(h),E=h.id==="place"&&w&&n==null?e("tool.placeNoKindTooltip"):e(h.descriptionKey);return c.jsxs(O.Fragment,{children:[c.jsx(it,{icon:g,label:e(h.labelKey),hotkey:h.hotkey,active:w,iconOnly:!m&&(h.iconOnly||u),stacked:m,description:E,onClick:()=>{o(h.switchTo,{placeKind:h.presetPlaceKind!==void 0?h.presetPlaceKind:void 0})}}),h.groupBreakAfter&&!m&&c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"})]},h.id)}),!m&&c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"}),m?c.jsx(I4,{stacked:!0}):c.jsxs(c.Fragment,{children:[c.jsx(it,{icon:Hn,label:e("tool.undo"),hotkey:"⌘Z",description:e("tool.undoHint"),iconOnly:!0,disabled:r===0,onClick:i}),c.jsx(it,{icon:Fn,label:e("tool.redo"),hotkey:"⌘⇧Z",description:e("tool.redoHint"),iconOnly:!0,disabled:s===0,onClick:a}),c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"}),c.jsx(C4,{iconOnly:u})]}),m&&c.jsx(j4,{stacked:!0})]})]})}function A4({stacked:e}){const t=ne(),n=Et(r=>r.outlineOpen),o=Et(r=>r.toggleOutline);return c.jsx(it,{icon:Cr,label:t("outline.title"),active:n,iconOnly:!0,stacked:e,onClick:o})}function it({icon:e,label:t,hotkey:n,active:o,disabled:r,iconOnly:s,stacked:i,onClick:a,description:l}){const u=c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:t}),n&&c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:n})]}),l&&c.jsx("div",{className:"text-muted-foreground",children:l})]});return c.jsx(Me,{content:u,disabled:r,children:c.jsxs("button",{type:"button",onClick:a,disabled:r,"aria-label":t,"aria-pressed":o,className:_e("rounded-md font-medium transition-colors",i?"flex h-12 w-12 flex-col items-center justify-center gap-0.5 text-[10px] leading-tight":"flex h-9 items-center gap-1.5 text-xs",!i&&(s?"w-9 justify-center":"px-2.5"),o?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-accent-foreground",r&&"pointer-events-none opacity-40"),children:[c.jsxs("span",{className:"relative inline-flex shrink-0",children:[c.jsx(e,{className:"size-4"}),n&&!i&&c.jsx("span",{"aria-hidden":!0,className:_e("pointer-events-none absolute -right-1.5 -top-1.5 rounded-sm px-1 font-mono text-[8px] leading-[1.1]",o?"bg-primary-foreground/20 text-primary-foreground/85":"bg-foreground/10 text-muted-foreground"),children:n})]}),i?c.jsx("span",{className:"max-w-full truncate",children:t}):!s&&c.jsx("span",{children:t})]})})}function xw(){const e=b(r=>r.diagram.elements),t=b(r=>r.diagram.layout),n=b(r=>r.selection),o=t??{};return{hasAnyElement:e.length>0,hasArrangedAny:Object.keys(o).length>0,hasGapsAll:e.some(r=>!o[r.id]),hasSelection:n.length>0,selectionHasArranged:n.some(r=>!!o[r]),selectionHasGaps:n.some(r=>!o[r])}}function C4({iconOnly:e}){const t=ne(),[n,o]=O.useState(!1),r=xw(),s=i=>()=>{o(!1),i()};return c.jsxs(Yn,{open:n,onOpenChange:o,trigger:c.jsx(it,{icon:kt,label:t("layout.label"),description:t("layout.hint"),active:n,iconOnly:e,onClick:()=>o(i=>!i)}),children:[c.jsx(Ee,{onClick:s(()=>b.getState().autoArrangeAll()),icon:c.jsx(kt,{}),disabled:!r.hasAnyElement||!r.hasArrangedAny,children:t("layout.allAuto")}),c.jsx(Ee,{onClick:s(()=>b.getState().autoArrangeSelection()),icon:c.jsx(kt,{}),disabled:!r.hasSelection||!r.selectionHasArranged,children:t("layout.selAuto")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Ee,{onClick:s(()=>b.getState().fillUnplacedAll()),icon:c.jsx(Rt,{}),disabled:!r.hasGapsAll,children:t("layout.allFill")}),c.jsx(Ee,{onClick:s(()=>b.getState().fillUnplacedSelection()),icon:c.jsx(Rt,{}),disabled:!r.hasSelection||!r.selectionHasGaps,children:t("layout.selFill")})]})}function I4({stacked:e}){const t=ne(),[n,o]=O.useState(!1),r=b(f=>f.past.length),s=b(f=>f.future.length),i=b(f=>f.undo),a=b(f=>f.redo),l=b(f=>f.selection.length>0),u=b(f=>f.clipboard!=null),d=xw(),m=f=>()=>{o(!1),f()};return c.jsxs(Yn,{open:n,onOpenChange:o,trigger:c.jsx(it,{icon:kn,label:t("tool.more"),description:t("tool.moreHint"),active:n,iconOnly:!0,stacked:e,onClick:()=>o(f=>!f)}),children:[c.jsx(Ee,{onClick:m(i),icon:c.jsx(Hn,{}),disabled:r===0,children:t("tool.undo")}),c.jsx(Ee,{onClick:m(a),icon:c.jsx(Fn,{}),disabled:s===0,children:t("tool.redo")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Ee,{onClick:m(()=>b.getState().cutSelection()),icon:c.jsx(Pr,{}),disabled:!l,children:t("menu.cut")}),c.jsx(Ee,{onClick:m(()=>b.getState().copySelection()),icon:c.jsx(Tr,{}),disabled:!l,children:t("menu.copy")}),c.jsx(Ee,{onClick:m(()=>b.getState().pasteClipboard()),icon:c.jsx(Mr,{}),disabled:!u,children:t("menu.paste")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Ee,{onClick:m(()=>b.getState().autoArrangeAll()),icon:c.jsx(kt,{}),disabled:!d.hasAnyElement||!d.hasArrangedAny,children:t("layout.allAuto")}),c.jsx(Ee,{onClick:m(()=>b.getState().autoArrangeSelection()),icon:c.jsx(kt,{}),disabled:!d.hasSelection||!d.selectionHasArranged,children:t("layout.selAuto")}),c.jsx(Ee,{onClick:m(()=>b.getState().fillUnplacedAll()),icon:c.jsx(Rt,{}),disabled:!d.hasGapsAll,children:t("layout.allFill")}),c.jsx(Ee,{onClick:m(()=>b.getState().fillUnplacedSelection()),icon:c.jsx(Rt,{}),disabled:!d.hasSelection||!d.selectionHasGaps,children:t("layout.selFill")})]})}function Ee({children:e,icon:t,onClick:n,disabled:o}){return c.jsxs("button",{type:"button",role:"menuitem",disabled:o,onClick:n,className:_e("flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",o&&"pointer-events-none text-muted-foreground opacity-60 hover:bg-transparent"),children:[t,c.jsx("span",{className:"flex-1",children:e})]})}function P4(){const e=Et(r=>r.outlineOpen),t=Et(r=>r.setOutlineOpen),n=Ke();return Ce(n,"dense")?e?c.jsx("div",{className:"absolute z-10",style:{left:"calc(0.75rem + var(--ole-left-inset, 0px))",right:"calc(0.75rem + var(--ole-right-inset, 0px))",bottom:"calc(4rem + var(--ole-bottom-inset, 0px) + 0.75rem)"},children:c.jsx(fr,{onClose:()=>t(!1),sheet:!0})}):null:c.jsx("div",{className:"absolute z-10 flex flex-col items-start",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))",left:"calc(0.75rem + var(--ole-left-inset, 0px))",maxHeight:"calc(100% - 1.5rem)"},children:e?c.jsx(fr,{onClose:()=>t(!1)}):c.jsx(O4,{onClick:()=>t(!0)})})}function O4({onClick:e}){const t=ne(),n=Ke(),o=Ce(n,"compact");return c.jsxs("button",{type:"button",onClick:e,"aria-label":t("outline.title"),title:t("outline.title"),className:_e("ole-glass flex h-12 items-center rounded-2xl border border-border text-muted-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground",o?"w-12 justify-center":"gap-2 px-3"),children:[c.jsx(Cr,{className:"size-4 shrink-0"}),!o&&c.jsx("span",{className:"text-xs font-medium",children:t("outline.title")})]})}function fr({onClose:e,sheet:t}){const n=ne(),o=b(u=>u.diagram.elements),r=b(u=>u.activeTool==="place"),s=Ke(),i=Ce(s,"compact"),a=Ce(s,"dense"),l=t?"min(50vh, calc(100vh - 9rem))":r?"min(40vh, calc(100vh - 200px))":"min(70vh, calc(100vh - 100px))";return c.jsxs("aside",{className:_e("ole-glass flex flex-col overflow-hidden rounded-2xl border border-border shadow-sm",t?"w-full":i?"w-52":"w-64"),style:{height:l},children:[c.jsxs("button",{type:"button",onClick:e,"aria-label":n("outline.collapseAria"),title:n("outline.collapse"),className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2 text-left transition-colors hover:bg-muted/40",children:[c.jsx("span",{className:"flex-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:n("outline.title")}),!a&&c.jsx(L4,{children:o.length}),c.jsx(ov,{className:"size-3.5 text-muted-foreground"})]}),c.jsx("div",{className:"flex-1 overflow-y-auto px-2 pb-2",children:o.length===0?c.jsx("p",{className:"px-2 py-2 text-xs italic text-muted-foreground",children:n("outline.empty")}):c.jsx("ul",{className:"space-y-px",children:o.map(u=>c.jsx(B4,{element:u},u.id))})})]})}function B4({element:e}){const t=Xe[e.kind],n=b(l=>l.selection.includes(e.id)),o=b(l=>l.setSelection),r=b(l=>l.toggleInSelection),s=Ke(),i=!Ce(s,"compact"),a=l=>{l.shiftKey||l.metaKey||l.ctrlKey?r(e.id):o([e.id])};return c.jsxs("li",{className:"group flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-accent data-[selected=true]:bg-[color-mix(in_oklch,var(--selection)_18%,transparent)]",title:e.note??`${e.name??e.id} (${e.kind})`,"data-element-id":e.id,"data-selected":n?"true":void 0,onClick:a,children:[c.jsx("div",{className:"flex h-4 w-6 shrink-0 items-center justify-center",children:t&&c.jsx("svg",{viewBox:t.viewBox,className:"ole-symbol size-full",preserveAspectRatio:"xMidYMid meet",dangerouslySetInnerHTML:{__html:t.svg}})}),c.jsx("span",{className:"flex-1 truncate text-xs text-foreground/90 group-hover:text-accent-foreground",children:e.name??e.id}),i&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:e.id})]})}function L4({children:e}){return c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e})}const z4={"arc-suppression-coil.name":"消弧线圈","arrester.name":"避雷器 (FBL)","async-motor.name":"异步电动机","autotransformer.name":"自耦变压器","battery.name":"电池储能","breaker.name":"断路器 (QF)","busbar.name":"母线段","converter-bidir.name":"双向变流器 (PCS)","ct.name":"电流互感器 (CT)","disconnector.name":"隔离开关 (QS)","earth.name":"接地","earthing-switch.name":"接地刀闸 (QE)","fuse.name":"熔断器 (FU)","generator.name":"发电机 (G)","grid-source.name":"系统电源","grounding-transformer.name":"接地变 (Z形)","inverter.name":"逆变器 (DC→AC)","load-switch.name":"负荷开关","load.name":"负荷","ngr.name":"中性点电阻 (NGR)","pt.name":"电压互感器 (PT)","pv.name":"光伏组件","rectifier.name":"整流器 (AC→DC)","series-reactor.name":"串联电抗器","shunt-capacitor.name":"并联电容器","shunt-reactor.name":"并联电抗器","sync-motor.name":"同步电动机","transformer-2w.name":"双绕组变压器","transformer-3w.name":"三绕组变压器","wind-turbine.name":"风力发电机","gfci-breaker.name":"GFCI 断路器 (RCBO)","rcd.name":"剩余电流装置 (RCD)","recloser.name":"重合闸 (Recloser)","energy-meter.name":"电能表 (Wh)","voltmeter.name":"电压表 (V)","ammeter.name":"电流表 (A)","wattmeter.name":"功率表 (W)","frequency-meter.name":"频率表 (Hz)","contactor.name":"接触器 (KM)","motor-starter.name":"电机启动器","thermal-overload.name":"热过载继电器","vfd.name":"变频器 (VFD)","soft-starter.name":"软启动器","transfer-switch.name":"切换开关 (ATS)","dc-disconnector.name":"直流隔离开关","dc-combiner.name":"直流汇流箱","ev-charger.name":"EV 充电桩","arc-suppression-coil.desc":"中性点谐振接地:电感线圈连接到地","busbar.desc":"可拉伸单母线段,多设备挂接","converter-bidir.desc":"储能变流器:双向 AC ↔ DC","earthing-switch.desc":"隔离开关 + 接地连接,单端口","grid-source.desc":"无穷大母线 / 外部电网","grounding-transformer.desc":"星-曲折接线变压器,中性点接地用","load.desc":"抽象负荷(电流流出箭头)","ngr.desc":"小电阻接地:连接变压器中性点到地","series-reactor.desc":"与并联电抗器同符号;通过用法区分","wind-turbine.desc":"风机:发电机 + 三叶轮标记","gfci-breaker.desc":"剩余电流断路器带过流保护 (UL943 / IEC 61009)。北美 GFCI / 欧洲 RCBO。","rcd.desc":"不带过流保护的剩余电流断路器 (IEC 61008)。","recloser.desc":"中压自动重合闸开关。","energy-meter.desc":"有功电能表 (kWh) — 服务入口 / 子表。","contactor.desc":"主回路接触器, 通常配热继电器和电机使用。","motor-starter.desc":"电机启动器 (IEC 60617 通用符号)。","thermal-overload.desc":"电机热过载保护继电器, 通常串接在接触器和电机之间。","vfd.desc":"Variable Frequency Drive — 异步电动机调速。","soft-starter.desc":"电机软启动器 (晶闸管降压启动)。","transfer-switch.desc":"双源切换开关 (Automatic / Manual Transfer Switch)。两个电源输入 + 一个负荷输出, 互锁不并联。","dc-disconnector.desc":"DC 隔离开关 — 光伏组串 / 储能 直流侧隔离。","dc-combiner.desc":"光伏组串汇流箱 (4 路输入示例)。","ev-charger.desc":"电动汽车充电站 / 充电桩。","breaker.state.open":"断开","disconnector.state.open":"断开","earthing-switch.state.open":"断开","fuse.state.blown":"熔断","load-switch.state.open":"断开","gfci-breaker.state.open":"断开","rcd.state.open":"断开","recloser.state.open":"断开","contactor.state.open":"断开","thermal-overload.state.tripped":"动作","transfer-switch.state.position":"位置 (normal/emergency/off)","dc-disconnector.state.open":"断开","battery.param.E":"容量","busbar.param.Un":"额定电压","converter-bidir.param.S":"容量","load.param.P":"有功功率","load.param.cosphi":"功率因数","ngr.param.R":"电阻","shunt-capacitor.param.Q":"无功容量","shunt-capacitor.param.stages":"分组数","transformer-2w.param.S":"容量","transformer-2w.param.ratio":"变比","gfci-breaker.param.In":"额定电流","gfci-breaker.param.IDn":"剩余动作电流","rcd.param.IDn":"剩余动作电流"},R4={"arc-suppression-coil.name":"Arc-suppression coil","arrester.name":"Surge arrester (FBL)","async-motor.name":"Asynchronous motor","autotransformer.name":"Autotransformer","battery.name":"Battery storage","breaker.name":"Circuit breaker (QF)","busbar.name":"Busbar segment","converter-bidir.name":"Bidirectional converter (PCS)","ct.name":"Current transformer (CT)","disconnector.name":"Disconnector (QS)","earth.name":"Earth","earthing-switch.name":"Earthing switch (QE)","fuse.name":"Fuse (FU)","generator.name":"Generator (G)","grid-source.name":"Grid source","grounding-transformer.name":"Grounding transformer (zig-zag)","inverter.name":"Inverter (DC→AC)","load-switch.name":"Load break switch","load.name":"Load","ngr.name":"Neutral grounding resistor (NGR)","pt.name":"Voltage transformer (PT)","pv.name":"PV module","rectifier.name":"Rectifier (AC→DC)","series-reactor.name":"Series reactor","shunt-capacitor.name":"Shunt capacitor","shunt-reactor.name":"Shunt reactor","sync-motor.name":"Synchronous motor","transformer-2w.name":"Two-winding transformer","transformer-3w.name":"Three-winding transformer","wind-turbine.name":"Wind turbine","gfci-breaker.name":"GFCI breaker (RCBO)","rcd.name":"Residual current device (RCD)","recloser.name":"Recloser","energy-meter.name":"Energy meter (Wh)","voltmeter.name":"Voltmeter (V)","ammeter.name":"Ammeter (A)","wattmeter.name":"Wattmeter (W)","frequency-meter.name":"Frequency meter (Hz)","contactor.name":"Contactor (KM)","motor-starter.name":"Motor starter","thermal-overload.name":"Thermal overload relay","vfd.name":"Variable frequency drive (VFD)","soft-starter.name":"Soft starter","transfer-switch.name":"Transfer switch (ATS)","dc-disconnector.name":"DC disconnector","dc-combiner.name":"DC combiner box","ev-charger.name":"EV charger","arc-suppression-coil.desc":"Resonant neutral grounding: inductor to earth","busbar.desc":"Stretchable single-bus segment with multiple taps","converter-bidir.desc":"Storage converter: bidirectional AC ↔ DC","earthing-switch.desc":"Disconnector + earth connection, single port","grid-source.desc":"Infinite bus / external grid","grounding-transformer.desc":"Wye-zigzag transformer for neutral grounding","load.desc":"Abstract load (current-out arrow)","ngr.desc":"Low-resistance grounding: transformer neutral to earth","series-reactor.desc":"Same symbol as shunt reactor; distinguished by usage","wind-turbine.desc":"Wind turbine: generator + three-blade rotor mark","gfci-breaker.desc":"Residual-current breaker with overcurrent (UL943 / IEC 61009). NA GFCI / EU RCBO.","rcd.desc":"Residual-current breaker without overcurrent (IEC 61008).","recloser.desc":"Medium-voltage automatic recloser.","energy-meter.desc":"Active energy meter (kWh) — service entrance / submeter.","contactor.desc":"Main-circuit contactor; typically used with a thermal overload and a motor.","motor-starter.desc":"Motor starter (IEC 60617 general symbol).","thermal-overload.desc":"Motor thermal-overload relay; sits between the contactor and the motor.","vfd.desc":"Variable Frequency Drive for induction motor speed control.","soft-starter.desc":"Motor soft-starter (thyristor-based reduced-voltage starting).","transfer-switch.desc":"Two-source transfer switch (ATS / manual). Two source inputs + one load output, mechanically interlocked.","dc-disconnector.desc":"DC isolating switch — PV string / battery DC-side isolation.","dc-combiner.desc":"PV string combiner box (4-input example).","ev-charger.desc":"Electric vehicle charging station.","breaker.state.open":"Open","disconnector.state.open":"Open","earthing-switch.state.open":"Open","fuse.state.blown":"Blown","load-switch.state.open":"Open","gfci-breaker.state.open":"Open","rcd.state.open":"Open","recloser.state.open":"Open","contactor.state.open":"Open","thermal-overload.state.tripped":"Tripped","transfer-switch.state.position":"Position (normal/emergency/off)","dc-disconnector.state.open":"Open","battery.param.E":"Capacity","busbar.param.Un":"Rated voltage","converter-bidir.param.S":"Capacity","load.param.P":"Active power","load.param.cosphi":"Power factor","ngr.param.R":"Resistance","shunt-capacitor.param.Q":"Reactive capacity","shunt-capacitor.param.stages":"Stages","transformer-2w.param.S":"Capacity","transformer-2w.param.ratio":"Ratio","gfci-breaker.param.In":"Rated current","gfci-breaker.param.IDn":"Residual operating current","rcd.param.IDn":"Residual operating current","resistor.name":"Resistor (R)","capacitor.name":"Capacitor (C)","diode.name":"Diode (D)","indicator-light.name":"Indicator light (HL)","push-button.name":"Push-button (SB)","relay-coil.name":"Relay coil (KA)","make-contact.name":"NO contact (NO)","break-contact.name":"NC contact (NC)","bell.name":"Bell (HA)","terminal.name":"Terminal / junction (X)","fuse-switch-disconnector.name":"Fuse switch-disconnector","socket-outlet.name":"Socket outlet / connector","inductor.name":"Inductor (L)","voltage-regulator.name":"Voltage regulator (T)","dc-motor.name":"DC motor (M)","heater.name":"Heating element (EH)","selector-switch.name":"Selector switch (SA)","limit-switch.name":"Limit switch (SQ)","proximity-switch.name":"Proximity switch (SQ)","time-relay.name":"Time relay (KT)","buzzer.name":"Buzzer (HA)","siren.name":"Siren (HA)","thermocouple.name":"Thermocouple (BT)","thyristor.name":"Thyristor / SCR (V)","triac.name":"Triac (V)","zener-diode.name":"Zener diode (D)","igbt.name":"IGBT","plc.name":"PLC / controller","ups.name":"UPS","power-supply.name":"Power supply (PS)","genset.name":"Generator set (G)","protective-relay.name":"Protective relay","overcurrent-relay.name":"Overcurrent relay (50/51)","undervoltage-relay.name":"Undervoltage relay (27)","reverse-power-relay.name":"Reverse-power relay (32)","distance-relay.name":"Distance relay (21)","phase-failure-relay.name":"Phase-failure relay","buchholz-relay.name":"Buchholz relay (63)","power-factor-meter.name":"Power-factor meter (cosφ)","synchronoscope.name":"Synchronoscope","varmeter.name":"Varmeter (var)","resistor.desc":"General resistor / current-limiting / braking resistor.","capacitor.desc":"General / filter / DC-bus capacitor. Use shunt capacitor for PF correction.","diode.desc":"Rectifier / freewheeling / protection diode. t1 = anode (top), t2 = cathode (bottom).","indicator-light.desc":"Signal / status indicator light.","push-button.desc":"Manual push-button, automatic return (NO make).","relay-coil.desc":"Relay / contactor operating coil (box).","make-contact.desc":"Normally-open auxiliary contact (make).","break-contact.desc":"Normally-closed auxiliary contact (break).","bell.desc":"Signal bell / alarm bell.","terminal.desc":"Terminal / junction box / connection node.","fuse-switch-disconnector.desc":"On-load fuse switch-disconnector.","socket-outlet.desc":"Power socket outlet / multipole connector.","inductor.desc":"General inductor / coil / choke.","voltage-regulator.desc":"Adjustable induction / autotransformer voltage regulator.","dc-motor.desc":"DC motor (series-field general symbol).","heater.desc":"Resistive heating element / heating load.","selector-switch.desc":"Selector / changeover switch (rotary, stay-put).","limit-switch.desc":"Travel / position switch (NO, mechanically operated).","proximity-switch.desc":"Proximity sensor / contactless proximity switch.","time-relay.desc":"Time-delay (slow-operating) relay coil.","buzzer.desc":"Signal buzzer.","siren.desc":"Audible siren / alarm.","thermocouple.desc":"Thermocouple temperature sensor.","thyristor.desc":"Reverse-blocking triode thyristor / SCR. t1 = anode (top), t2 = cathode (bottom).","triac.desc":"Bidirectional triode thyristor (TRIAC).","zener-diode.desc":"Zener / voltage-regulator diode. t1 = anode (top), t2 = cathode (bottom).","igbt.desc":"N-channel enhancement IGBT. t1 = collector (top), t2 = emitter (bottom), t_g = gate.","plc.desc":"Programmable logic controller (PLC).","ups.desc":"Online / standby uninterruptible power supply.","power-supply.desc":"AC→DC switched-mode / DC power supply. t_ac top (~), t_dc bottom (=).","genset.desc":"Diesel / gas generator set.","protective-relay.desc":"Measuring / protective relay, general symbol (IEC 60617).","overcurrent-relay.desc":"Overcurrent protection relay (ANSI 50/51).","undervoltage-relay.desc":"Undervoltage protection relay (ANSI 27).","reverse-power-relay.desc":"Reverse-power / reverse-current protection relay (ANSI 32).","distance-relay.desc":"Distance / under-impedance protection relay (ANSI 21).","phase-failure-relay.desc":"Phase-failure / phase-loss protection relay.","buchholz-relay.desc":"Buchholz / gas relay (ANSI 63).","power-factor-meter.desc":"Power-factor meter (cosφ).","synchronoscope.desc":"Synchronizing indicator / synchronoscope.","varmeter.desc":"Reactive-power meter (var).","make-contact.state.closed":"Closed","break-contact.state.open":"Open","fuse-switch-disconnector.state.open":"Open","selector-switch.state.open":"Open","limit-switch.state.closed":"Closed","resistor.param.R":"Resistance","resistor.param.P":"Rated power","capacitor.param.C":"Capacitance","capacitor.param.Un":"Rated voltage","indicator-light.param.color":"Color","inductor.param.L":"Inductance","inductor.param.In":"Rated current","voltage-regulator.param.ratio":"Regulation range","heater.param.P":"Power","ups.param.S":"Capacity","power-supply.param.Vdc":"Output voltage","genset.param.P":"Power"},hr={zh:z4,en:R4};function D4(e,t){return hr[e][t]??hr.zh[t]}function Mt(){const e=Nt(t=>t.locale);return(t,n)=>D4(e,t)??n??t}const bw="ole-palette-collapsed",F4=new Set(["busbar"]),St=(()=>{const e={};for(const[t,n]of Object.entries(y$)){const o=n.filter(r=>!F4.has(r.id));o.length&&(e[t]=o)}return e})(),H4=(()=>{const e=new Set(Bo),t=Object.keys(St).filter(n=>!e.has(n));return[...Bo.filter(n=>{var o;return(o=St[n])==null?void 0:o.length}),...t]})();function W4(){try{const e=window.localStorage.getItem(bw);if(!e)return new Set;const t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(n=>typeof n=="string")):new Set}catch{return new Set}}function q4(e){try{window.localStorage.setItem(bw,JSON.stringify([...e]))}catch{}}function G4(){const e=ne(),t=b(m=>m.activeTool==="place"),n=b(m=>m.placeKind),o=b(m=>m.setActiveTool),r=Et(m=>m.outlineOpen),s=Ke(),i=Ce(s,"dense"),a=68,u=i?void 0:`calc(100vh - ${a}px - ${r?"calc(40vh + 20px)":"68px"})`;if(!t||i&&n!=null)return null;const d=i?{top:`calc(${a}px + var(--ole-top-inset, 0px))`,left:"calc(0.75rem + var(--ole-left-inset, 0px))",right:"calc(0.75rem + var(--ole-right-inset, 0px))",bottom:"calc(4rem + var(--ole-bottom-inset, 0px) + 0.75rem)"}:{top:a};return c.jsx("div",{className:i?"absolute z-20":"absolute left-3 z-20",style:d,role:"dialog","aria-label":e("library.title"),children:c.jsxs("aside",{className:i?"ole-glass flex h-full w-full flex-col overflow-hidden rounded-2xl border border-border shadow-md":"ole-glass flex w-72 flex-col overflow-hidden rounded-2xl border border-border shadow-md",style:u?{maxHeight:u}:void 0,children:[c.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2",children:[c.jsx("span",{className:"flex-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:e("library.title")}),c.jsx("button",{type:"button",onClick:()=>o(i?"pan":"select"),className:"rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground","aria-label":e("common.close"),title:e("common.close"),children:c.jsx(Wn,{className:"size-3.5"})})]}),c.jsx(X4,{sheet:i})]})})}function X4({sheet:e}){const t=ne(),n=Mt(),[o,r]=O.useState(""),[s,i]=O.useState(()=>W4()),a=O.useMemo(()=>{const m=o.trim().toLowerCase();if(!m)return St;const f={};for(const[p,h]of Object.entries(St)){const g=h.filter(w=>{const E=n(`${w.id}.name`,w.name).toLowerCase(),k=n(`${w.id}.desc`,w.description??"").toLowerCase();return E.includes(m)||w.id.toLowerCase().includes(m)||k.includes(m)});g.length&&(f[p]=g)}return f},[o,n]),l=o.trim().length>0,u=l&&Object.values(a).every(m=>!(m!=null&&m.length)),d=O.useCallback((m,f)=>{i(p=>{const h=new Set(p);return f?h.delete(m):h.add(m),q4(h),h})},[]);return c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"px-2 pb-1.5 pt-2",children:c.jsx(K4,{value:o,onChange:r})}),c.jsx("div",{className:"flex-1 overflow-y-auto px-2 pb-2",children:u?c.jsx("p",{className:"px-3 py-6 text-center text-xs text-muted-foreground",children:t("library.empty")}):H4.map(m=>{var w;const f=a[m];if(!(f!=null&&f.length))return null;const p=((w=St[m])==null?void 0:w.length)??f.length,h=t(`cat.${m}`),g=l||!s.has(m);return c.jsxs("details",{open:g,className:"group mb-2 last:mb-0",onToggle:E=>{l||d(m,E.currentTarget.open)},children:[c.jsxs("summary",{className:"flex cursor-pointer select-none items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:[c.jsx(Xw,{className:"size-3 transition-transform [details:not([open])>summary>&]:-rotate-90"}),c.jsx("span",{className:"flex-1",children:h}),c.jsx(V4,{children:l&&f.length!==p?`${f.length}/${p}`:p})]}),c.jsx("ul",{className:"mt-0.5 space-y-px",children:f.map(E=>c.jsx(Y4,{entry:E,sheet:e},E.id))})]},m)})})]})}function K4({value:e,onChange:t}){const n=ne();return c.jsxs("div",{className:"relative",children:[c.jsx(sv,{className:"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground"}),c.jsx("input",{type:"text",value:e,onChange:o=>t(o.target.value),placeholder:n("library.searchPlaceholder"),className:"h-7 w-full rounded-md border border-border/60 bg-background/50 pl-7 pr-7 text-xs placeholder:text-muted-foreground focus:border-border focus:outline-none focus:ring-1 focus:ring-ring","aria-label":n("library.searchAria")}),e&&c.jsx("button",{type:"button","aria-label":n("library.clearSearch"),onClick:()=>t(""),className:"absolute right-1 top-1/2 -translate-y-1/2 rounded-sm p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:c.jsx(Wn,{className:"size-3"})})]})}function Y4({entry:e,sheet:t}){const n=ne(),o=Mt(),r=o(`${e.id}.name`,e.name),s=o(`${e.id}.desc`,e.description??""),i=b(m=>m.setActiveTool),a=b(m=>m.activeTool==="place"&&m.placeKind===e.id),l=b(m=>t&&m.activeTool==="place"&&m.placeKind==null&&m.lastPlaceKind===e.id),u=O.useRef(null);O.useEffect(()=>{var m;l&&((m=u.current)==null||m.scrollIntoView({block:"nearest"}))},[l]);const d=m=>{m.dataTransfer.effectAllowed="copy",m.dataTransfer.setData("application/x-oneline-kind",e.id),m.dataTransfer.setData("text/plain",e.id);const f=document.createElement("div");f.className="ole-glass",f.style.cssText=["position:absolute","top:-9999px","left:-9999px","width:64px","height:64px","display:flex","align-items:center","justify-content:center","border-radius:12px","border:1px solid var(--border)","box-shadow:0 4px 12px rgba(0,0,0,0.12)","color:var(--foreground)","padding:8px"].join(";"),f.innerHTML=`<svg class="ole-symbol" viewBox="${e.viewBox}" width="48" height="48" preserveAspectRatio="xMidYMid meet">${e.svg}</svg>`,document.body.appendChild(f),m.dataTransfer.setDragImage(f,32,32),setTimeout(()=>f.remove(),0)};return c.jsxs("li",{ref:u,className:`group flex cursor-grab items-center gap-2.5 rounded-md px-2 py-1.5 transition-colors hover:bg-accent active:cursor-grabbing ${a?"bg-accent ring-1 ring-[var(--selection)]/60":l?"ring-1 ring-[var(--selection)]/30":""}`,draggable:!0,onDragStart:d,onClick:()=>i("place",{placeKind:e.id}),"data-kind":e.id,title:s?`${r} — ${s}`:`${r} — ${n("library.itemHint")}`,children:[c.jsx("div",{className:"flex h-7 w-12 shrink-0 items-center justify-center",children:c.jsx("svg",{viewBox:e.viewBox,className:"ole-symbol size-full",preserveAspectRatio:"xMidYMid meet",dangerouslySetInnerHTML:{__html:e.svg}})}),c.jsx("span",{className:"truncate text-xs text-foreground/80 group-hover:text-accent-foreground",children:r})]})}function V4({children:e}){return c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e})}const zn="ole-onboarding-dismissed";function U4(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(zn)==="1"}catch{return!1}}function pr(e){try{e?window.localStorage.setItem(zn,"1"):window.localStorage.removeItem(zn)}catch{}}const gr=Xt(e=>({dismissed:U4(),dismiss:()=>{pr(!0),e({dismissed:!0})},reset:()=>{pr(!1),e({dismissed:!1})}}));function J4(){const e=ne(),t=gr(o=>o.dismissed),n=gr(o=>o.dismiss);return t?null:c.jsxs("div",{role:"dialog","aria-label":e("onboard.title"),className:"ole-glass pointer-events-none absolute left-1/2 top-1/2 z-10 w-[min(420px,calc(100vw-2rem))] -translate-x-1/2 -translate-y-1/2 rounded-2xl border border-border p-5 shadow-md",children:[c.jsxs("div",{className:"flex items-center justify-between",children:[c.jsx("h2",{className:"text-sm font-semibold",children:e("onboard.title")}),c.jsx("button",{type:"button",onClick:n,"aria-label":e("onboard.dismiss"),className:"pointer-events-auto rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:c.jsx(Wn,{className:"size-3.5"})})]}),c.jsxs("ol",{className:"mt-3 space-y-2.5",children:[c.jsx(wn,{n:1,icon:c.jsx(Dn,{}),title:e("onboard.step1.title"),body:e("onboard.step1.body")}),c.jsx(wn,{n:2,icon:c.jsx(Or,{}),title:e("onboard.step2.title"),body:e("onboard.step2.body")}),c.jsx(wn,{n:3,icon:c.jsx(Nr,{}),title:e("onboard.step3.title"),body:e("onboard.step3.body")})]}),c.jsx("button",{type:"button",onClick:n,className:"pointer-events-auto mt-4 w-full rounded-md bg-primary py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90",children:e("onboard.dismiss")})]})}function wn({n:e,icon:t,title:n,body:o}){return c.jsxs("li",{className:"flex items-start gap-2.5",children:[c.jsx("span",{className:"mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-[color-mix(in_oklch,var(--selection)_18%,transparent)] font-mono text-[10px] font-semibold tabular-nums text-[var(--selection)]","aria-hidden":!0,children:e}),c.jsxs("div",{className:"min-w-0 flex-1",children:[c.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-medium",children:[c.jsx("span",{className:"text-muted-foreground [&>svg]:size-3.5",children:t}),c.jsx("span",{children:n})]}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-snug text-muted-foreground",children:o})]})]})}function Z4(){const e=ne(),t=b(f=>f.selection),n=b(f=>f.diagram.elements),o=b(f=>f.diagram.buses),r=b(f=>f.diagram.junctions),s=b(f=>f.selectedNode),i=b(f=>f.selectedWire);if(i)return c.jsx(rj,{wireId:i});if(s)return c.jsx(ij,{nodeId:s});if(t.length===0)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:e("props.empty")});if(t.length>1)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:e("props.multi",{n:t.length})});const a=t[0],l=(o??[]).find(f=>f.id===a);if(l)return c.jsx(nj,{bus:l});const u=(r??[]).find(f=>f.id===a);if(u)return c.jsx(sj,{junction:u});const d=n.find(f=>f.id===a);if(!d)return null;const m=Xe[d.kind];return c.jsxs("div",{className:"flex flex-col gap-2.5 overflow-y-auto px-3 py-3 text-xs",children:[c.jsx(dt,{label:e("props.name"),value:d.name??"",placeholder:d.id,onCommit:f=>b.getState().updateElement(a,{name:f.trim()===""?void 0:f.trim()})}),c.jsx(Un,{label:e("props.note"),value:d.note??"",onCommit:f=>b.getState().updateElement(a,{note:f.trim()===""?void 0:f.trim()})}),(m==null?void 0:m.state)&&m.state.length>0&&c.jsx("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:m.state.map(f=>c.jsx(aj,{id:a,element:d,field:f},f.name))}),c.jsx(Q4,{id:a,element:d,schema:(m==null?void 0:m.params)??[]})]})}function Q4({id:e,element:t,schema:n}){const o=new Set(n.map(s=>s.name)),r=t.params?Object.entries(t.params).filter(([s])=>!o.has(s)):[];return n.length===0&&r.length===0?null:c.jsxs("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:[n.map(s=>c.jsx(ej,{id:e,element:t,field:s},s.name)),r.map(([s,i])=>c.jsx(tj,{id:e,element:t,fieldKey:s,value:i},s))]})}function ej({id:e,element:t,field:n}){var l;const o=ne(),r=Mt(),s=((l=t.params)==null?void 0:l[n.name])??n.default,i=r(`${t.kind}.param.${n.name}`,n.label??n.name),a=u=>{const d={...t.params??{}};u===void 0||u===n.default?delete d[n.name]:d[n.name]=u,b.getState().updateElement(e,{params:Object.keys(d).length>0?d:void 0})};return n.type==="boolean"?c.jsx(ct,{label:i,children:c.jsx(Jn,{active:!!s,onClick:()=>a(!s),children:o(s?"common.yes":"common.no")})}):n.type==="number"?c.jsx(Qt,{label:i,value:typeof s=="number"?s:0,unit:n.unit,onCommit:a}):c.jsx(dt,{label:i,value:typeof s=="string"?s:"",unit:n.unit,onCommit:u=>a(u.trim()===""?void 0:u)})}function tj({id:e,element:t,fieldKey:n,value:o}){const r=ne(),s=i=>{const a={...t.params??{}};i===void 0?delete a[n]:a[n]=i,b.getState().updateElement(e,{params:Object.keys(a).length>0?a:void 0})};return typeof o=="boolean"?c.jsx(ct,{label:n,children:c.jsx(Jn,{active:o,onClick:()=>s(!o),children:r(o?"common.yes":"common.no")})}):typeof o=="number"?c.jsx(Qt,{label:n,value:o,onCommit:s}):c.jsx(dt,{label:n,value:o,onCommit:i=>s(i.trim()===""?void 0:i)})}function nj({bus:e}){const t=ne(),n=e.id,o=r=>{const s=r.trim();Rn(n,{name:s===""?void 0:s})};return c.jsxs("div",{className:"flex flex-col gap-2.5 overflow-y-auto px-3 py-3 text-xs",children:[c.jsx(dt,{label:t("props.name"),value:e.name??"",placeholder:e.id,onCommit:o}),c.jsx(Un,{label:t("props.note"),value:e.note??"",onCommit:r=>Rn(n,{note:r.trim()===""?void 0:r.trim()})}),c.jsx(oj,{bus:e})]})}function oj({bus:e}){const t=(o,r)=>{const s={...e.params??{}};r===void 0||r===""?delete s[o]:s[o]=r,Rn(e.id,{params:Object.keys(s).length>0?s:void 0})},n=e.params??{};return c.jsx("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:c.jsx(Qt,{label:"Un",value:typeof n.Un=="number"?n.Un:0,unit:"kV",onCommit:o=>t("Un",o)})})}function Rn(e,t){b.getState().dispatch(n=>{const o=(n.buses??[]).map(r=>r.id===e?{...r,...t}:r);return{...n,buses:o}})}function rj({wireId:e}){const t=ne(),n=b(w=>w.diagram.wires),o=b(w=>w.diagram.elements),r=b(w=>w.diagram.buses),s=b(w=>w.diagram.junctions),i=b(w=>w.internal.terminalToNode),a=b(w=>w.setSelectedNode),l=(n??[]).find(w=>w.id===e);if(!l)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:t("props.wireNotFound",{id:e})});const u=i.get(l.ends[0]),d=new Map(o.map(w=>[w.id,w])),m=new Map((r??[]).map(w=>[w.id,w])),f=new Map((s??[]).map(w=>[w.id,w])),p=w=>{if(!w.includes(".")){const A=m.get(w);if(A)return{id:w,label:A.name??w};const B=f.get(w);return{id:w,label:(B==null?void 0:B.name)??w}}const E=w.indexOf("."),k=w.slice(0,E),x=w.slice(E+1),S=d.get(k);return{id:k,label:(S==null?void 0:S.name)??k,pin:x}},h=p(l.ends[0]),g=p(l.ends[1]);return c.jsxs("div",{className:"flex flex-col gap-3 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.wire")}),c.jsx("div",{className:"font-mono text-[12px]",children:l.id})]}),c.jsx("ul",{className:"space-y-0.5 border-t border-border/40 pt-2",children:[h,g].map((w,E)=>c.jsxs("li",{className:"flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 hover:bg-accent",onClick:()=>b.getState().setSelection([w.id]),children:[c.jsx("span",{className:"flex-1 truncate font-mono text-[11px]",children:w.id}),c.jsx("span",{className:"truncate text-[10px] text-muted-foreground",children:w.label}),w.pin&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:w.pin})]},E))}),u&&c.jsx("button",{type:"button",className:"self-start rounded-md border border-border/60 px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent",onClick:()=>a(u),children:t("props.selectWholeNode")})]})}function sj({junction:e}){var r;const t=ne(),n=b(s=>{var i;return(i=s.internal.junctions.get(e.id))==null?void 0:i.world}),o=((r=e.layout)==null?void 0:r.at)??n;return c.jsxs("div",{className:"flex flex-col gap-2.5 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.junction")}),c.jsx("div",{className:"font-mono text-[12px]",children:e.id})]}),c.jsx(dt,{label:t("props.name"),value:e.name??"",placeholder:e.id,onCommit:s=>b.getState().updateJunction(e.id,{name:s.trim()===""?void 0:s.trim()})}),c.jsx(Un,{label:t("props.note"),value:e.note??"",onCommit:s=>b.getState().updateJunction(e.id,{note:s.trim()===""?void 0:s.trim()})}),o&&c.jsxs("div",{className:"flex items-center justify-between border-t border-border/40 pt-2",children:[c.jsx("span",{className:"text-muted-foreground",children:t("props.junctionPos")}),c.jsxs("span",{className:"font-mono text-[11px]",children:[Math.round(o[0]),", ",Math.round(o[1])]})]})]})}function ij({nodeId:e}){const t=ne(),n=b(a=>a.internal.nodes.get(e)),o=b(a=>a.diagram.elements),r=b(a=>a.setSelection);if(!n)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:t("props.nodeNotFound",{id:e})});const s=new Map;for(const a of n.terminals){const l=a.indexOf(".");if(l<0)continue;const u=a.slice(0,l),d=a.slice(l+1),m=s.get(u)??[];m.push(d),s.set(u,m)}const i=new Map(o.map(a=>[a.id,a]));return c.jsxs("div",{className:"flex flex-col gap-3 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.node")}),c.jsx("div",{className:"font-mono text-[12px]",children:n.id}),c.jsx("div",{className:"text-[11px] text-muted-foreground",children:t("props.nodeStats",{terminals:n.terminals.length,elements:s.size})})]}),c.jsx("ul",{className:"space-y-0.5 border-t border-border/40 pt-2",children:[...s.entries()].map(([a,l])=>{const u=i.get(a);return c.jsxs("li",{className:"flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 hover:bg-accent",onClick:()=>r([a]),title:t("props.selectElement",{label:a}),children:[c.jsx("span",{className:"flex-1 truncate font-mono text-[11px]",children:a}),c.jsx("span",{className:"truncate text-[10px] text-muted-foreground",children:(u==null?void 0:u.name)??""}),c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:l.join(", ")})]},a)})})]})}function ct({label:e,children:t}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx("label",{className:"w-16 shrink-0 truncate text-[11px] text-muted-foreground",children:e}),c.jsx("div",{className:"min-w-0 flex-1",children:t})]})}function dt({label:e,value:t,placeholder:n,unit:o,onCommit:r}){const[s,i]=O.useState(t),a=O.useRef(null);return O.useEffect(()=>i(t),[t]),c.jsx(ct,{label:e,children:c.jsxs("div",{className:"relative",children:[c.jsx("input",{ref:a,type:"text",value:s,placeholder:n,onChange:l=>i(l.target.value),onBlur:()=>{s!==t&&r(s)},onKeyDown:l=>{var u,d;l.key==="Enter"&&((u=a.current)==null||u.blur()),l.key==="Escape"&&(i(t),(d=a.current)==null||d.blur())},className:_e("h-7 w-full rounded-md border border-border/60 bg-background/50 px-2 text-[11px] focus:border-border focus:outline-none focus:ring-1 focus:ring-ring",o&&"pr-8")}),o&&c.jsx("span",{className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[10px] text-muted-foreground",children:o})]})})}function Un({label:e,value:t,onCommit:n}){const[o,r]=O.useState(t);return O.useEffect(()=>r(t),[t]),c.jsx(ct,{label:e,children:c.jsx("textarea",{rows:2,value:o,onChange:s=>r(s.target.value),onBlur:()=>{o!==t&&n(o)},className:"w-full resize-none rounded-md border border-border/60 bg-background/50 px-2 py-1 text-[11px] focus:border-border focus:outline-none focus:ring-1 focus:ring-ring"})})}function Qt({label:e,value:t,min:n,unit:o,onCommit:r}){const[s,i]=O.useState(String(t)),a=O.useRef(null);return O.useEffect(()=>i(String(t)),[t]),c.jsx(ct,{label:e,children:c.jsxs("div",{className:"relative",children:[c.jsx("input",{ref:a,type:"number",value:s,onChange:l=>i(l.target.value),onBlur:()=>{const l=Number(s);Number.isFinite(l)&&l!==t?r(l):i(String(t))},onKeyDown:l=>{var u,d;l.key==="Enter"&&((u=a.current)==null||u.blur()),l.key==="Escape"&&(i(String(t)),(d=a.current)==null||d.blur())},min:n,className:_e("h-7 w-full rounded-md border border-border/60 bg-background/50 px-2 font-mono text-[11px] tabular-nums focus:border-border focus:outline-none focus:ring-1 focus:ring-ring",o&&"pr-8")}),o&&c.jsx("span",{className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[10px] text-muted-foreground",children:o})]})})}function Jn({active:e,onClick:t,children:n}){return c.jsx("button",{type:"button",onClick:t,className:_e("flex h-6 w-full items-center justify-center gap-1.5 rounded border text-[10px] transition-colors",e?"border-[var(--selection)] bg-[var(--selection)]/15 text-foreground":"border-border/60 text-muted-foreground hover:bg-accent"),"aria-pressed":e,children:n})}function aj({id:e,element:t,field:n}){var l;const o=ne(),s=Mt()(`${t.kind}.state.${n.name}`,n.label??n.name),i=((l=t.state)==null?void 0:l[n.name])??n.default,a=u=>{const d={...t.state??{}};u===void 0||u===n.default?delete d[n.name]:d[n.name]=u,b.getState().updateElement(e,{state:Object.keys(d).length>0?d:void 0})};return n.type==="boolean"?c.jsx(ct,{label:s,children:c.jsx(Jn,{active:!!i,onClick:()=>a(!i),children:o(i?"common.yes":"common.no")})}):n.type==="number"?c.jsx(Qt,{label:s,value:typeof i=="number"?i:0,onCommit:a}):c.jsx(dt,{label:s,value:typeof i=="string"?i:"",onCommit:u=>a(u.trim()===""?void 0:u)})}function lj(){const e=ne(),t=Mt(),n=b(m=>m.selection),o=b(m=>m.selectedNode),r=b(m=>m.selectedWire),s=b(m=>m.diagram.elements),i=b(m=>m.diagram.buses),a=Ke(),l=Ce(a,"dense");if(n.length===0&&!o&&!r)return null;let u=e("props.title"),d=null;if(r)u=e("props.wire");else if(o)u=e("props.node");else if(n.length===1){const m=n[0],f=(i??[]).find(p=>p.id===m);if(f)u=f.name??e("props.bus");else{const p=s.find(h=>h.id===m);if(p){const h=Xe[p.kind];u=h?t(`${h.id}.name`,h.name):p.kind}}}else d=n.length;return c.jsxs("aside",{className:_e("ole-glass absolute z-10 flex flex-col overflow-hidden rounded-2xl border border-border shadow-sm",l?"w-48":"w-56"),style:{top:`calc(${l?"4.5rem":"0.75rem"} + var(--ole-top-inset, 0px))`,right:"calc(0.75rem + var(--ole-right-inset, 0px))",maxHeight:`calc(100% - ${l?"5.25rem":"1.5rem"} - var(--ole-top-inset, 0px) - var(--ole-bottom-inset, 0px) - 4.5rem)`},children:[c.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2",children:[c.jsx("span",{className:"flex-1 truncate text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:u}),d!=null&&c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e("props.nSelected",{n:d})})]}),c.jsx(Z4,{})]})}function cj(){O.useEffect(()=>{const e=n=>{const o=n.target;if(!o||o.tagName==="INPUT"||o.tagName==="TEXTAREA"||o.isContentEditable)return;const r=o.closest("button");r&&r.closest(".ole-glass")&&n.preventDefault()},t=n=>{const o=n.target;if(!o||!o.closest(".ole-canvas-root"))return;const r=document.activeElement;!r||r===document.body||r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.isContentEditable||r.blur()};return window.addEventListener("mousedown",e),window.addEventListener("pointerdown",t,!0),()=>{window.removeEventListener("mousedown",e),window.removeEventListener("pointerdown",t,!0)}},[])}function dj(){cj();const e=O.useRef(null),t=jS(e);return c.jsx(Fv,{children:c.jsx("div",{ref:e,className:"relative h-full w-full overflow-hidden bg-background text-foreground",children:c.jsxs(n4,{width:t,children:[c.jsx(XS,{}),c.jsx(P4,{}),c.jsx(lj,{}),c.jsx(T4,{}),c.jsx(E4,{}),c.jsx(y4,{}),c.jsx(G4,{}),c.jsx(J4,{}),c.jsx(e4,{})]})})})}const uj="ole-theme";function mj(){try{const e=window.localStorage.getItem(uj);return e==="light"||e==="dark"?e:null}catch{return null}}function fj(){return typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-color-scheme: dark)").matches}function hj(){return typeof window>"u"?"light":mj()??(fj()?"dark":"light")}function ww(e){typeof document>"u"||document.documentElement.classList.toggle("dark",e==="dark")}function pj({className:e,diagram:t,locale:n,theme:o}){return O.useEffect(()=>{if(!t)return;b.getState().diagram.elements.length===0&&b.getState().setDiagram(t)},[t]),O.useEffect(()=>{n&&Nt.getState().setLocale(n)},[n]),O.useEffect(()=>{o&&ww(o)},[o]),O.useEffect(()=>{Kn()},[]),uS(),c.jsx("div",{className:`ole-root ${e??"h-full w-full"}`,children:c.jsx(dj,{})})}const vw={"application/json":[".json"]},kw=()=>typeof window<"u"&&typeof window.showOpenFilePicker=="function",_w=e=>e instanceof DOMException&&e.name==="AbortError";function yr(e){let t;try{t=JSON.parse(e)}catch(o){throw new Error(we("io.parseFailed",{err:o.message}))}if(!t||typeof t!="object"||Array.isArray(t))throw new Error(we("io.notObject"));const n=t;if(n.version!=="1")throw new Error(we("io.versionMismatch",{actual:JSON.stringify(n.version)}));if(!Array.isArray(n.elements))throw new Error(we("io.elementsMissing"));return n}function gj(e){return JSON.stringify(e,null,2)+`
199
- `}async function yj(){if(kw()){let e;try{[e]=await window.showOpenFilePicker({multiple:!1,types:[{description:we("topbar.file.fileDescription"),accept:vw}]})}catch(n){if(_w(n))return null;throw n}const t=await e.getFile();return{diagram:yr(await t.text()),session:{handle:e,name:t.name}}}return new Promise((e,t)=>{const n=document.createElement("input");n.type="file",n.accept=".json,application/json",n.addEventListener("change",async()=>{var r;const o=(r=n.files)==null?void 0:r[0];if(!o)return e(null);try{e({diagram:yr(await o.text()),session:{name:o.name}})}catch(s){t(s)}}),n.addEventListener("cancel",()=>e(null)),n.click()})}async function xr(e,t,n={}){const o=gj(e);if(!n.saveAs&&(t!=null&&t.handle)){const i=await t.handle.createWritable();return await i.write(o),await i.close(),t}if(kw()){let i;try{i=await window.showSaveFilePicker({suggestedName:(t==null?void 0:t.name)??"diagram.json",types:[{description:we("topbar.file.fileDescription"),accept:vw}]})}catch(l){if(_w(l))return null;throw l}const a=await i.createWritable();return await a.write(o),await a.close(),{handle:i,name:i.name}}const r=URL.createObjectURL(new Blob([o],{type:"application/json"})),s=document.createElement("a");return s.href=r,s.download=(t==null?void 0:t.name)??"diagram.json",s.click(),URL.revokeObjectURL(r),t??{name:"diagram.json"}}function xj(){const e=ne(),t=b(m=>m.fileSession),n=(t==null?void 0:t.name)??e("common.unnamed"),{onNew:o,onOpen:r,onSave:s,onSaveAs:i}=bj(),[a,l]=O.useState(!1),u=O.useRef(null);O.useEffect(()=>{const m=f=>{if(!(f.metaKey||f.ctrlKey))return;const p=f.key.toLowerCase();p==="o"?(f.preventDefault(),r()):p==="s"&&(f.preventDefault(),f.shiftKey?i():s())};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[r,s,i]),O.useEffect(()=>{if(!a)return;const m=p=>{u.current&&!u.current.contains(p.target)&&l(!1)},f=p=>{p.key==="Escape"&&l(!1)};return window.addEventListener("mousedown",m),window.addEventListener("keydown",f),()=>{window.removeEventListener("mousedown",m),window.removeEventListener("keydown",f)}},[a]);const d=m=>()=>{l(!1),m()};return c.jsxs("div",{ref:u,className:"relative",children:[c.jsxs(Ne,{variant:"ghost",size:"sm",className:"gap-1.5","aria-haspopup":"menu","aria-expanded":a,onClick:()=>l(m=>!m),children:[c.jsx(yo,{}),e("topbar.file.label")]}),a&&c.jsxs("div",{role:"menu",className:"ole-glass absolute left-0 top-full mt-1.5 min-w-44 rounded-md border border-border p-1 shadow-md",children:[c.jsx("div",{className:"border-b border-border px-2 pb-1.5 pt-1 text-xs text-muted-foreground",children:n}),c.jsx(Bt,{onClick:d(o),icon:c.jsx(Jw,{}),children:e("topbar.file.new")}),c.jsx(Bt,{onClick:d(r),icon:c.jsx(yo,{}),hint:"⌘O",children:e("topbar.file.open")}),c.jsx(Bt,{onClick:d(s),icon:c.jsx(xo,{}),hint:"⌘S",children:e("topbar.file.save")}),c.jsx(Bt,{onClick:d(i),icon:c.jsx(xo,{}),hint:"⌘⇧S",children:e("topbar.file.saveAs")})]})]})}function Bt({children:e,icon:t,hint:n,onClick:o}){return c.jsxs("button",{type:"button",role:"menuitem",onClick:o,className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[t,c.jsx("span",{className:"flex-1",children:e}),n&&c.jsx("span",{className:"text-xs tabular-nums text-muted-foreground",children:n})]})}function bj(){const e=ne(),t=b(l=>l.loadDiagramFromFile),n=b(l=>l.setFileSession),o=b(l=>l.setDiagram);return{onNew:()=>{const{diagram:l}=b.getState();l.elements.length>0&&!confirm(e("topbar.file.newConfirm"))||(o({version:"1",elements:[]}),n(null))},onOpen:async()=>{try{const l=await yj();l&&(t(l.diagram,l.session),Kn())}catch(l){alert(e("topbar.file.openFailed",{err:l.message}))}},onSave:async()=>{try{const{diagram:l,fileSession:u}=b.getState(),d=await xr(l,u);d&&n(d)}catch(l){alert(e("topbar.file.saveFailed",{err:l.message}))}},onSaveAs:async()=>{try{const{diagram:l,fileSession:u}=b.getState(),d=await xr(l,u,{saveAs:!0});d&&n(d)}catch(l){alert(e("topbar.file.saveFailed",{err:l.message}))}}}}const vn="WIRES",ze="ELEMENTS",br="LABELS",wr="ANNOTATIONS",vr=32,kr=64,wj=8,vj=1.25,kj=6;function $w(e,t={}){const n=new Oj(t.precision??6);n.header(t.title),n.tables([{name:vn,color:7},{name:ze,color:7},{name:br,color:8},{name:wr,color:3}]),n.beginEntities();for(const r of e.wireRenders.values())r.path.length<2||n.lwpolyline(vn,r.path.map(Te),!1);for(const{geometry:r}of e.buses.values()){const{axis:s,at:i,span:a}=r,l=a/2,u=s==="x"?[i[0]-l,i[1]]:[i[0],i[1]-l],d=s==="x"?[i[0]+l,i[1]]:[i[0],i[1]+l];n.lwpolyline(vn,[u,d].map(Te),!1)}for(const r of e.elements.values()){const s=e.layout.get(r.element.id),i=r.libraryDef;!s||!i||_j(n,i.svg,s)}const o=t.labelMode??"all";if(o!=="off")for(const r of e.elements.values()){const s=e.layout.get(r.element.id);if(!s||!r.libraryDef)continue;const i=Yt(r,o);if(i.length===0)continue;const a=r.libraryDef.label??Vt(r.libraryDef),[l,u]=Ut(a,s);for(let d=0;d<i.length;d++){const[m,f]=Te([l,u+d*Kt]);n.text(br,[m,f],i[d],Ht,0,!1)}}for(const r of t.annotations??[]){if(!r.text)continue;const s=r.fontSize??wj,i=r.text.split(`
200
- `);for(let a=0;a<i.length;a++){const[l,u]=Te([r.at[0],r.at[1]+(a+1)*s*vj]);n.text(wr,[l,u],i[a],s,0,!1)}}return n.endEntities(),n.toString()}async function Sw(e,t="diagram.dxf",n){const o=$w(e,n),r=URL.createObjectURL(new Blob([o],{type:"application/dxf;charset=utf-8"})),s=document.createElement("a");s.href=r,s.download=t,s.click(),URL.revokeObjectURL(r)}function _j(e,t,n){const o=`<svg xmlns="http://www.w3.org/2000/svg">${t}</svg>`,s=new DOMParser().parseFromString(o,"image/svg+xml").documentElement;if(!(!s||s.querySelector("parsererror")))for(const i of Array.from(s.children))switch(i.tagName.toLowerCase()){case"line":$j(e,i,n);break;case"polyline":_r(e,i,n,!1);break;case"polygon":_r(e,i,n,!0);break;case"rect":Sj(e,i,n);break;case"circle":jj(e,i,n);break;case"ellipse":Ej(e,i,n);break;case"path":Aj(e,i,n);break;case"text":Tj(e,i,n);break}}function $j(e,t,n){const o=ve(t,"x1"),r=ve(t,"y1"),s=ve(t,"x2"),i=ve(t,"y2"),a=Te(Le([o,r],n)),l=Te(Le([s,i],n));e.line(ze,a,l)}function _r(e,t,n,o){const r=Pj(t.getAttribute("points")??"");if(r.length<2)return;const s=r.map(i=>Te(Le(i,n)));e.lwpolyline(ze,s,o)}function Sj(e,t,n){const o=ve(t,"x"),r=ve(t,"y"),s=ve(t,"width"),i=ve(t,"height"),l=[[o,r],[o+s,r],[o+s,r+i],[o,r+i]].map(u=>Te(Le(u,n)));e.lwpolyline(ze,l,!0)}function jj(e,t,n){const o=ve(t,"cx"),r=ve(t,"cy"),s=ve(t,"r"),i=Te(Le([o,r],n));e.circle(ze,i,s)}function Ej(e,t,n){const o=ve(t,"cx"),r=ve(t,"cy"),s=ve(t,"rx"),i=ve(t,"ry");if(Math.abs(s-i)<1e-6){Nj(e,o,r,s,n);return}Mj(e,o,r,s,i,n)}function Nj(e,t,n,o,r){const s=Te(Le([t,n],r));e.circle(ze,s,o)}function Mj(e,t,n,o,r,s){const i=[];for(let a=0;a<kr;a++){const l=a/kr*Math.PI*2;i.push(Te(Le([t+o*Math.cos(l),n+r*Math.sin(l)],s)))}e.lwpolyline(ze,i,!0)}function Tj(e,t,n){const o=ve(t,"x"),r=ve(t,"y"),s=parseFloat(t.getAttribute("font-size")??"")||kj,i=(t.textContent??"").trim();if(!i)return;const a=Te(Le([o,r],n));e.text(ze,a,i,s,n.rot,n.mirror)}function Aj(e,t,n){const o=t.getAttribute("d")??"",r=Cj(o);if(r.length===0)return;let s=null,i=[];const a=()=>{i.length>=2&&e.lwpolyline(ze,i.map(l=>Te(Le(l,n))),!1),i=[]};for(const l of r)if(l.cmd==="M")a(),s=[l.args[0],l.args[1]],i.push(s);else if(l.cmd==="A"&&s){const[u,d,,m,f,p,h]=l.args,g=Ij(s,[p,h],u,d,m!==0,f!==0);if(g)for(let w=1;w<=vr;w++){const E=g.theta1+g.delta*w/vr;i.push([g.cx+u*Math.cos(E),g.cy+d*Math.sin(E)])}else i.push([p,h]);s=[p,h]}a()}function Cj(e){const t=[],n=/([MmAa])([^MmAa]*)/g;let o;for(;(o=n.exec(e))!==null;){const r=o[1].toUpperCase(),s=o[2].trim().split(/[\s,]+/).filter(i=>i.length>0).map(Number);t.push({cmd:r,args:s})}return t}function Ij(e,t,n,o,r,s){if(n<=0||o<=0)return null;const[i,a]=e,[l,u]=t;if(i===l&&a===u)return null;const d=(i-l)/2,m=(a-u)/2;let f=Math.abs(n),p=Math.abs(o);const h=f*f,g=p*p,w=d*d/h+m*m/g;if(w>1){const F=Math.sqrt(w);f*=F,p*=F}const E=r===s?-1:1,k=f*f*p*p-f*f*m*m-p*p*d*d,x=f*f*m*m+p*p*d*d,S=E*Math.sqrt(Math.max(0,k/x)),A=S*(f*m)/p,B=S*-(p*d)/f,q=A+(i+l)/2,V=B+(a+u)/2,re=(F,Z,ie,le)=>{const Q=F*ie+Z*le,he=Math.hypot(F,Z)*Math.hypot(ie,le);let pe=Math.acos(Math.max(-1,Math.min(1,Q/he)));return F*le-Z*ie<0&&(pe=-pe),pe},se=re(1,0,(d-A)/f,(m-B)/p);let R=re((d-A)/f,(m-B)/p,(-d-A)/f,(-m-B)/p);return!s&&R>0?R-=2*Math.PI:s&&R<0&&(R+=2*Math.PI),{cx:q,cy:V,theta1:se,delta:R}}function Le(e,t){return Ae(e,t)}function Te(e){return[e[0],-e[1]]}function ve(e,t){const n=parseFloat(e.getAttribute(t)??"");return Number.isFinite(n)?n:0}function Pj(e){const t=e.trim().split(/[\s,]+/).map(Number).filter(o=>Number.isFinite(o)),n=[];for(let o=0;o+1<t.length;o+=2)n.push([t[o],t[o+1]]);return n}class Oj{constructor(t){ht(this,"out",[]);ht(this,"precision");this.precision=t}toString(){return this.out.join("")}g(t,n){this.out.push(`${t}
196
+ */const Vn=oe("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Gr(e){var t,n,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(n=Gr(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}function Xr(){for(var e,t,n=0,o="",r=arguments.length;n<r;n++)(e=arguments[n])&&(t=Gr(e))&&(o&&(o+=" "),o+=t);return o}const Un="-",yv=e=>{const t=bv(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:i=>{const a=i.split(Un);return a[0]===""&&a.length!==1&&a.shift(),Yr(a,t)||xv(i)},getConflictingClassGroupIds:(i,a)=>{const l=n[i]||[];return a&&o[i]?[...l,...o[i]]:l}}},Yr=(e,t)=>{var i;if(e.length===0)return t.classGroupId;const n=e[0],o=t.nextPart.get(n),r=o?Yr(e.slice(1),o):void 0;if(r)return r;if(t.validators.length===0)return;const s=e.join(Un);return(i=t.validators.find(({validator:a})=>a(s)))==null?void 0:i.classGroupId},No=/^\[(.+)\]$/,xv=e=>{if(No.test(e)){const t=No.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},bv=e=>{const{theme:t,prefix:n}=e,o={nextPart:new Map,validators:[]};return vv(Object.entries(e.classGroups),n).forEach(([s,i])=>{Mn(i,o,s,t)}),o},Mn=(e,t,n,o)=>{e.forEach(r=>{if(typeof r=="string"){const s=r===""?t:Mo(t,r);s.classGroupId=n;return}if(typeof r=="function"){if(wv(r)){Mn(r(o),t,n,o);return}t.validators.push({validator:r,classGroupId:n});return}Object.entries(r).forEach(([s,i])=>{Mn(i,Mo(t,s),n,o)})})},Mo=(e,t)=>{let n=e;return t.split(Un).forEach(o=>{n.nextPart.has(o)||n.nextPart.set(o,{nextPart:new Map,validators:[]}),n=n.nextPart.get(o)}),n},wv=e=>e.isThemeGetter,vv=(e,t)=>t?e.map(([n,o])=>{const r=o.map(s=>typeof s=="string"?t+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,a])=>[t+i,a])):s);return[n,r]}):e,kv=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,o=new Map;const r=(s,i)=>{n.set(s,i),t++,t>e&&(t=0,o=n,n=new Map)};return{get(s){let i=n.get(s);if(i!==void 0)return i;if((i=o.get(s))!==void 0)return r(s,i),i},set(s,i){n.has(s)?n.set(s,i):r(s,i)}}},Kr="!",_v=e=>{const{separator:t,experimentalParseClassName:n}=e,o=t.length===1,r=t[0],s=t.length,i=a=>{const l=[];let d=0,u=0,f;for(let w=0;w<a.length;w++){let $=a[w];if(d===0){if($===r&&(o||a.slice(w,w+s)===t)){l.push(a.slice(u,w)),u=w+s;continue}if($==="/"){f=w;continue}}$==="["?d++:$==="]"&&d--}const m=l.length===0?a:a.substring(u),p=m.startsWith(Kr),h=p?m.substring(1):m,y=f&&f>u?f-u:void 0;return{modifiers:l,hasImportantModifier:p,baseClassName:h,maybePostfixModifierPosition:y}};return n?a=>n({className:a,parseClassName:i}):i},$v=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(o=>{o[0]==="["?(t.push(...n.sort(),o),n=[]):n.push(o)}),t.push(...n.sort()),t},Sv=e=>({cache:kv(e.cacheSize),parseClassName:_v(e),...yv(e)}),jv=/\s+/,Ev=(e,t)=>{const{parseClassName:n,getClassGroupId:o,getConflictingClassGroupIds:r}=t,s=[],i=e.trim().split(jv);let a="";for(let l=i.length-1;l>=0;l-=1){const d=i[l],{modifiers:u,hasImportantModifier:f,baseClassName:m,maybePostfixModifierPosition:p}=n(d);let h=!!p,y=o(h?m.substring(0,p):m);if(!y){if(!h){a=d+(a.length>0?" "+a:a);continue}if(y=o(m),!y){a=d+(a.length>0?" "+a:a);continue}h=!1}const w=$v(u).join(":"),$=f?w+Kr:w,k=$+y;if(s.includes(k))continue;s.push(k);const b=r(y,h);for(let S=0;S<b.length;++S){const C=b[S];s.push($+C)}a=d+(a.length>0?" "+a:a)}return a};function Nv(){let e=0,t,n,o="";for(;e<arguments.length;)(t=arguments[e++])&&(n=Vr(t))&&(o&&(o+=" "),o+=n);return o}const Vr=e=>{if(typeof e=="string")return e;let t,n="";for(let o=0;o<e.length;o++)e[o]&&(t=Vr(e[o]))&&(n&&(n+=" "),n+=t);return n};function Mv(e,...t){let n,o,r,s=i;function i(l){const d=t.reduce((u,f)=>f(u),e());return n=Sv(d),o=n.cache.get,r=n.cache.set,s=a,a(l)}function a(l){const d=o(l);if(d)return d;const u=Ev(l,n);return r(l,u),u}return function(){return s(Nv.apply(null,arguments))}}const fe=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},Ur=/^\[(?:([a-z-]+):)?(.+)\]$/i,Tv=/^\d+\/\d+$/,Av=new Set(["px","full","screen"]),Cv=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Iv=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Pv=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ov=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Bv=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Le=e=>st(e)||Av.has(e)||Tv.test(e),We=e=>ct(e,"length",qv),st=e=>!!e&&!Number.isNaN(Number(e)),fn=e=>ct(e,"number",st),yt=e=>!!e&&Number.isInteger(Number(e)),Lv=e=>e.endsWith("%")&&st(e.slice(0,-1)),ee=e=>Ur.test(e),qe=e=>Cv.test(e),zv=new Set(["length","size","percentage"]),Rv=e=>ct(e,zv,Jr),Dv=e=>ct(e,"position",Jr),Fv=new Set(["image","url"]),Hv=e=>ct(e,Fv,Xv),Wv=e=>ct(e,"",Gv),xt=()=>!0,ct=(e,t,n)=>{const o=Ur.exec(e);return o?o[1]?typeof t=="string"?o[1]===t:t.has(o[1]):n(o[2]):!1},qv=e=>Iv.test(e)&&!Pv.test(e),Jr=()=>!1,Gv=e=>Ov.test(e),Xv=e=>Bv.test(e),Yv=()=>{const e=fe("colors"),t=fe("spacing"),n=fe("blur"),o=fe("brightness"),r=fe("borderColor"),s=fe("borderRadius"),i=fe("borderSpacing"),a=fe("borderWidth"),l=fe("contrast"),d=fe("grayscale"),u=fe("hueRotate"),f=fe("invert"),m=fe("gap"),p=fe("gradientColorStops"),h=fe("gradientColorStopPositions"),y=fe("inset"),w=fe("margin"),$=fe("opacity"),k=fe("padding"),b=fe("saturate"),S=fe("scale"),C=fe("sepia"),R=fe("skew"),X=fe("space"),V=fe("translate"),te=()=>["auto","contain","none"],ae=()=>["auto","hidden","clip","visible","scroll"],D=()=>["auto",ee,t],W=()=>[ee,t],ye=()=>["",Le,We],ue=()=>["auto",st,ee],pe=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ne=()=>["solid","dashed","dotted","double","none"],re=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ge=()=>["start","end","center","between","around","evenly","stretch"],xe=()=>["","0",ee],_e=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Ee=()=>[st,ee];return{cacheSize:500,separator:":",theme:{colors:[xt],spacing:[Le,We],blur:["none","",qe,ee],brightness:Ee(),borderColor:[e],borderRadius:["none","","full",qe,ee],borderSpacing:W(),borderWidth:ye(),contrast:Ee(),grayscale:xe(),hueRotate:Ee(),invert:xe(),gap:W(),gradientColorStops:[e],gradientColorStopPositions:[Lv,We],inset:D(),margin:D(),opacity:Ee(),padding:W(),saturate:Ee(),scale:Ee(),sepia:xe(),skew:Ee(),space:W(),translate:W()},classGroups:{aspect:[{aspect:["auto","square","video",ee]}],container:["container"],columns:[{columns:[qe]}],"break-after":[{"break-after":_e()}],"break-before":[{"break-before":_e()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...pe(),ee]}],overflow:[{overflow:ae()}],"overflow-x":[{"overflow-x":ae()}],"overflow-y":[{"overflow-y":ae()}],overscroll:[{overscroll:te()}],"overscroll-x":[{"overscroll-x":te()}],"overscroll-y":[{"overscroll-y":te()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",yt,ee]}],basis:[{basis:D()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",ee]}],grow:[{grow:xe()}],shrink:[{shrink:xe()}],order:[{order:["first","last","none",yt,ee]}],"grid-cols":[{"grid-cols":[xt]}],"col-start-end":[{col:["auto",{span:["full",yt,ee]},ee]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[xt]}],"row-start-end":[{row:["auto",{span:[yt,ee]},ee]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",ee]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",ee]}],gap:[{gap:[m]}],"gap-x":[{"gap-x":[m]}],"gap-y":[{"gap-y":[m]}],"justify-content":[{justify:["normal",...ge()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...ge(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...ge(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[X]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[X]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",ee,t]}],"min-w":[{"min-w":[ee,t,"min","max","fit"]}],"max-w":[{"max-w":[ee,t,"none","full","min","max","fit","prose",{screen:[qe]},qe]}],h:[{h:[ee,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[ee,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[ee,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[ee,t,"auto","min","max","fit"]}],"font-size":[{text:["base",qe,We]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",fn]}],"font-family":[{font:[xt]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",ee]}],"line-clamp":[{"line-clamp":["none",st,fn]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Le,ee]}],"list-image":[{"list-image":["none",ee]}],"list-style-type":[{list:["none","disc","decimal",ee]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[$]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[$]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ne(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Le,We]}],"underline-offset":[{"underline-offset":["auto",Le,ee]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:W()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ee]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ee]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[$]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...pe(),Dv]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Rv]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Hv]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[h]}],"gradient-via-pos":[{via:[h]}],"gradient-to-pos":[{to:[h]}],"gradient-from":[{from:[p]}],"gradient-via":[{via:[p]}],"gradient-to":[{to:[p]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[a]}],"border-w-x":[{"border-x":[a]}],"border-w-y":[{"border-y":[a]}],"border-w-s":[{"border-s":[a]}],"border-w-e":[{"border-e":[a]}],"border-w-t":[{"border-t":[a]}],"border-w-r":[{"border-r":[a]}],"border-w-b":[{"border-b":[a]}],"border-w-l":[{"border-l":[a]}],"border-opacity":[{"border-opacity":[$]}],"border-style":[{border:[...ne(),"hidden"]}],"divide-x":[{"divide-x":[a]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[a]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[$]}],"divide-style":[{divide:ne()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...ne()]}],"outline-offset":[{"outline-offset":[Le,ee]}],"outline-w":[{outline:[Le,We]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:ye()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[$]}],"ring-offset-w":[{"ring-offset":[Le,We]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",qe,Wv]}],"shadow-color":[{shadow:[xt]}],opacity:[{opacity:[$]}],"mix-blend":[{"mix-blend":[...re(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":re()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[o]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",qe,ee]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[f]}],saturate:[{saturate:[b]}],sepia:[{sepia:[C]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[f]}],"backdrop-opacity":[{"backdrop-opacity":[$]}],"backdrop-saturate":[{"backdrop-saturate":[b]}],"backdrop-sepia":[{"backdrop-sepia":[C]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[i]}],"border-spacing-x":[{"border-spacing-x":[i]}],"border-spacing-y":[{"border-spacing-y":[i]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",ee]}],duration:[{duration:Ee()}],ease:[{ease:["linear","in","out","in-out",ee]}],delay:[{delay:Ee()}],animate:[{animate:["none","spin","ping","pulse","bounce",ee]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[S]}],"scale-x":[{"scale-x":[S]}],"scale-y":[{"scale-y":[S]}],rotate:[{rotate:[yt,ee]}],"translate-x":[{"translate-x":[V]}],"translate-y":[{"translate-y":[V]}],"skew-x":[{"skew-x":[R]}],"skew-y":[{"skew-y":[R]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",ee]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ee]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":W()}],"scroll-mx":[{"scroll-mx":W()}],"scroll-my":[{"scroll-my":W()}],"scroll-ms":[{"scroll-ms":W()}],"scroll-me":[{"scroll-me":W()}],"scroll-mt":[{"scroll-mt":W()}],"scroll-mr":[{"scroll-mr":W()}],"scroll-mb":[{"scroll-mb":W()}],"scroll-ml":[{"scroll-ml":W()}],"scroll-p":[{"scroll-p":W()}],"scroll-px":[{"scroll-px":W()}],"scroll-py":[{"scroll-py":W()}],"scroll-ps":[{"scroll-ps":W()}],"scroll-pe":[{"scroll-pe":W()}],"scroll-pt":[{"scroll-pt":W()}],"scroll-pr":[{"scroll-pr":W()}],"scroll-pb":[{"scroll-pb":W()}],"scroll-pl":[{"scroll-pl":W()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ee]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Le,We,fn]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Kv=Mv(Yv);function je(...e){return Kv(Xr(e))}const Zr=O.createContext(null);function Vv(){const e=O.useContext(Zr);if(!e)throw new Error("useContextMenu must be used inside <ContextMenuHost>");return e}const Pt=8;function Uv({children:e}){const[t,n]=O.useState({open:!1,x:0,y:0,items:[]}),[o,r]=O.useState(null),s=O.useRef(null),i=O.useCallback(()=>{n(d=>d.open?{...d,open:!1}:d)},[]),a=O.useCallback((d,u,f)=>{r(null),n({open:!0,x:d,y:u,items:f})},[]),l=O.useMemo(()=>({open:a,close:i}),[a,i]);return O.useLayoutEffect(()=>{if(!t.open||!s.current)return;const d=s.current.getBoundingClientRect();let u=t.x,f=t.y;u+d.width>window.innerWidth-Pt&&(u=Math.max(Pt,t.x-d.width)),f+d.height>window.innerHeight-Pt&&(f=Math.max(Pt,t.y-d.height)),r({left:u,top:f})},[t]),O.useEffect(()=>{if(!t.open)return;const d=p=>{s.current&&!s.current.contains(p.target)&&i()},u=p=>{p.key==="Escape"&&(p.preventDefault(),i())},f=()=>i(),m=()=>i();return document.addEventListener("pointerdown",d,!0),document.addEventListener("keydown",u,!0),window.addEventListener("wheel",f,{passive:!0}),window.addEventListener("blur",m),()=>{document.removeEventListener("pointerdown",d,!0),document.removeEventListener("keydown",u,!0),window.removeEventListener("wheel",f),window.removeEventListener("blur",m)}},[t.open,i]),c.jsxs(Zr.Provider,{value:l,children:[e,t.open&&c.jsx("div",{ref:s,role:"menu","aria-orientation":"vertical",className:"ole-glass fixed z-50 min-w-[200px] rounded-md border border-border p-1 text-sm shadow-md",style:{left:(o==null?void 0:o.left)??t.x,top:(o==null?void 0:o.top)??t.y,visibility:o?"visible":"hidden"},onContextMenu:d=>d.preventDefault(),children:t.items.map((d,u)=>{if(d.type==="separator")return c.jsx("div",{role:"separator",className:"my-1 h-px bg-border"},`sep-${u}`);const f=d.icon;return c.jsxs("button",{type:"button",role:"menuitem",disabled:d.disabled,className:je("flex w-full items-center justify-between gap-3 rounded-sm px-2 py-1.5 text-left","hover:bg-accent hover:text-accent-foreground","focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-none",d.destructive&&"text-destructive hover:bg-destructive/10 hover:text-destructive",d.disabled&&"pointer-events-none text-muted-foreground opacity-60"),onClick:()=>{i(),d.onSelect()},children:[c.jsxs("span",{className:"flex items-center gap-2",children:[f?c.jsx(f,{className:"size-4"}):null,c.jsx("span",{children:d.label})]}),d.shortcut?c.jsx("span",{className:"text-xs text-muted-foreground",children:d.shortcut}):null]},`${d.label}-${u}`)})})]})}const To=e=>{let t;const n=new Set,o=(d,u)=>{const f=typeof d=="function"?d(t):d;if(!Object.is(f,t)){const m=t;t=u??(typeof f!="object"||f===null)?f:Object.assign({},t,f),n.forEach(p=>p(t,m))}},r=()=>t,a={setState:o,getState:r,getInitialState:()=>l,subscribe:d=>(n.add(d),()=>n.delete(d))},l=t=e(o,r,a);return a},Jv=(e=>e?To(e):To),Zv=e=>e;function Qv(e,t=Zv){const n=O.useSyncExternalStore(e.subscribe,O.useCallback(()=>t(e.getState()),[e,t]),O.useCallback(()=>t(e.getInitialState()),[e,t]));return O.useDebugValue(n),n}const Ao=e=>{const t=Jv(e),n=o=>Qv(t,o);return Object.assign(n,t),n},Jt=(e=>e?Ao(e):Ao),Co={zh:{"common.unnamed":"未命名","common.close":"关闭","common.yes":"是","common.no":"否","topbar.theme.toLight":"切换到亮色","topbar.theme.toDark":"切换到暗色","topbar.theme.currentDark":"当前:暗色主题","topbar.theme.currentLight":"当前:亮色主题","topbar.lang.toEnglish":"Switch to English","topbar.lang.toChinese":"切换到中文","topbar.lang.currentEnglish":"Current: English","topbar.lang.currentChinese":"当前:中文","topbar.export.label":"导出","topbar.export.tooltip":"SVG 矢量(可编辑)、PNG 位图(2× 高清)或 DXF(CAD)","topbar.export.pngFailed":"导出 PNG 失败:{err}","topbar.export.dxfFailed":"导出 DXF 失败:{err}","topbar.file.label":"文件","topbar.file.tooltip":"打开本地 .json 图、保存、或另存为","topbar.file.current":"当前:{name}","topbar.file.new":"新建","topbar.file.open":"打开…","topbar.file.save":"保存","topbar.file.saveAs":"另存为…","topbar.file.newConfirm":"新建会清空当前未保存的内容,是否继续?","topbar.file.openFailed":"打开失败:{err}","topbar.file.saveFailed":"保存失败:{err}","topbar.file.fileDescription":"OneLineEditor 图纸","outline.title":"大纲","outline.collapse":"折叠","outline.collapseAria":"折叠大纲","outline.empty":"(无设备 — 从元件库拖入开始)","props.title":"属性","props.node":"电气节点","props.wire":"连线","props.bus":"母线","props.junction":"接线柱","props.junctionPos":"位置","props.nSelected":"{n} 选中","props.empty":"未选中","props.multi":"已选中 {n} 个元件","props.name":"名称","props.note":"备注","props.nodeNotFound":"电气节点 {id} 不存在","props.wireNotFound":"连线 {id} 不存在","props.nodeStats":"{terminals} 个端子 · {elements} 个元件","props.selectElement":"选中 {label}","props.selectWholeNode":"选中整个电气节点","view.zoomOut":"缩小","view.zoomOutHint":"按预设档位缩小;也可滚轮 ↓ 或 ⌘−","view.reset":"重置到 100%","view.current":"当前 {z}%","view.zoomIn":"放大","view.zoomInHint":"按预设档位放大;也可滚轮 ↑ 或 ⌘+","view.fit":"适配视图","view.fitHint":"自动缩放并居中所有元件","view.gridHide":"隐藏网格","view.gridShow":"显示网格","view.gridHotkey":"G","view.gridHideHint":"同时关闭对齐吸附(拖动可自由放置)","view.gridShowHint":"同时开启对齐吸附(拖动会贴到 10px 网格)","view.gridHideAria":"隐藏网格并关闭吸附","view.gridShowAria":"显示网格并开启吸附","view.label":"标签","view.labelOff":"关闭标签","view.labelId":"仅显示 ID","view.labelAll":"ID + 参数","view.labelHint":"点击循环切换:关闭 → 仅 ID → ID + 参数","library.title":"元件库","library.empty":"没有匹配的元件","library.searchPlaceholder":"搜索元件…","library.searchAria":"搜索元件","library.clearSearch":"清除搜索","library.itemHint":"单击进入放置模式或拖到画布","tool.select":"选择","tool.selectHint":"点选元件,框选多个,或右键打开菜单","tool.pan":"平移","tool.panHint":"拖动画布;空格键可临时切换","tool.wire":"连线","tool.wireHint":"从端子/母线/接线柱拖出;拖到空白处会自动新建接线柱,拖到已有连线上可打接点","tool.bus":"母线","tool.busHint":"画布上拖动一段母线,按下定起点、释放定终点","tool.junction":"接线柱","tool.junctionHint":"点击画布放置一个接线柱(接点),连线可自由连到它","tool.place":"元件","tool.placeHint":"点击画布放置;或从端子/母线拖出,同时放置并连接","tool.text":"文字","tool.textHint":"点击画布放置一段文字注释;双击文字可重新编辑","mode.selectWithSel":"拖动元件移动 · 拖端子连线 · 右键打开菜单","mode.selectEmpty":"点选元件 · 拖动移动 · 框选多个 · 右键打开菜单","mode.pan":"拖动画布 · 滚轮缩放 · 按住空格可在其他工具下临时平移","mode.wireDragging":"拖到端子/母线/接线柱释放;空白处释放会新建接线柱","mode.wireInit":"从任意连接点或空白处按下,拖到目标释放;空白处会新建接线柱","mode.busDragging":"拖动决定母线方向,释放定终点","mode.busInit":"在画布按下定起点,拖动后释放定终点","mode.junction":"点击画布放置一个接线柱","mode.placeNoKind":"从左侧元件库选择一种元件","mode.placeFromTerm":"拖到目标位置释放,新元件将连接到起点端子","mode.placeNormal":"点击空白放置;或从已有端子 / 母线拖出,同时放置并连接","mode.text":"点击画布放置文字;双击已有文字可编辑;选中后可拖动 / 删除","mode.escSelect":"Esc 清除选择","mode.escOther":"右键 / Esc 取消","tool.placeNoKindTooltip":"从左侧元件库选择一个元件后点击画布放置","tool.undo":"撤销","tool.undoHint":"撤销上一次编辑(移动 / 旋转 / 删除等)","tool.redo":"重做","tool.redoHint":"重做被撤销的操作","layout.label":"布局","layout.hint":"自动排版整个图或仅选中范围,并填补空缺","layout.allAuto":"重新自动布局","layout.selAuto":"重新自动布局选区","layout.allFill":"填补未排版位置","layout.selFill":"填补未排版选区","tool.more":"更多","tool.moreHint":"撤销 / 重做 / 布局","view.menu":"视图","view.menuHint":"缩放、适配、网格","ctx.ariaNode":"选中节点操作","ctx.ariaWire":"选中连线操作","ctx.ariaElement":"选中元件操作","ctx.rotate":"旋转 90°","ctx.rotateHint":"顺时针旋转选中元件,连线随端子自动重排","ctx.mirror":"水平镜像","ctx.mirrorTitle":"镜像","ctx.mirrorHint":"左右翻转选中元件","ctx.delete":"删除","ctx.deleteHintNode":"断开此电气节点上的所有连接(保留元件)","ctx.deleteHintWire":"移除这一根连线(其它同节点连线保留)","ctx.deleteHintElement":"移除选中元件及其连接的连线","ctx.resetWirePath":"恢复自动走线","ctx.resetWirePathHint":"清除手动调整的拐点,让连线回到自动路由","menu.undo":"撤销","menu.redo":"重做","menu.cut":"剪切","menu.copy":"复制","menu.paste":"粘贴","menu.rotate":"旋转 90°","menu.mirror":"镜像","menu.selectAll":"全选","menu.disconnect":"断开此连线","menu.delete":"删除","io.parseFailed":"JSON 解析失败:{err}","io.notObject":"文件不是 JSON 对象","io.versionMismatch":'版本不兼容:期望 "1",实际 {actual}',"io.elementsMissing":"elements 字段缺失或不是数组","compile.duplicateId":'元件 ID 重复:"{id}"',"compile.unknownKind":'未知元件类型 kind="{kind}"',"compile.invalidTermRef":'非法端子引用 "{ref}"',"compile.elementMissing":'引用了不存在的元件 "{id}"',"compile.missingPin":'元件 "{id}" (kind={kind}) 没有引脚 "{pin}",可用引脚: {available}',"compile.singleTerminal":"节点只包含一个端子,已忽略","compile.layoutMissingElement":'layout 键 "{id}" 引用了不存在的元件',"compile.elementUnconnected":'元件 "{id}" 没有任何连接',"cat.busbar":"母线 / 接线","cat.switching":"开关","cat.protection":"保护","cat.motor-control":"电机控制","cat.transformer":"变压器","cat.instrument-transformer":"互感器","cat.measurement":"测量仪表","cat.source":"电源","cat.load":"负荷","cat.storage":"储能","cat.compensation":"无功补偿","cat.grounding":"中性点接地","cat.renewable":"新能源 / 电力电子","onboard.title":"上手三步","onboard.step1.title":"画母线","onboard.step1.body":"选择 母线 工具(B),在画布上按下拖动","onboard.step2.title":"从母线拖出元件","onboard.step2.body":"切到 元件(P)选一种,按住母线拖到目标位置 — 自动连接","onboard.step3.title":"继续串接","onboard.step3.body":"从任意端子拖出,落到目标即与该端子相连","onboard.dismiss":"知道了"},en:{"common.unnamed":"Untitled","common.close":"Close","common.yes":"Yes","common.no":"No","topbar.theme.toLight":"Switch to light","topbar.theme.toDark":"Switch to dark","topbar.theme.currentDark":"Current: dark theme","topbar.theme.currentLight":"Current: light theme","topbar.lang.toEnglish":"Switch to English","topbar.lang.toChinese":"切换到中文","topbar.lang.currentEnglish":"Current: English","topbar.lang.currentChinese":"Current: Chinese","topbar.export.label":"Export","topbar.export.tooltip":"SVG vector (editable), PNG bitmap (2× HiDPI), or DXF (CAD)","topbar.export.pngFailed":"PNG export failed: {err}","topbar.export.dxfFailed":"DXF export failed: {err}","topbar.file.label":"File","topbar.file.tooltip":"Open a local .json diagram, save, or save as","topbar.file.current":"Current: {name}","topbar.file.new":"New","topbar.file.open":"Open…","topbar.file.save":"Save","topbar.file.saveAs":"Save as…","topbar.file.newConfirm":"New will discard any unsaved changes. Continue?","topbar.file.openFailed":"Open failed: {err}","topbar.file.saveFailed":"Save failed: {err}","topbar.file.fileDescription":"OneLineEditor diagram","outline.title":"Outline","outline.collapse":"Collapse","outline.collapseAria":"Collapse outline","outline.empty":"(No elements — drag from the library to start)","props.title":"Properties","props.node":"Electrical node","props.wire":"Wire","props.bus":"Bus","props.junction":"Junction","props.junctionPos":"Position","props.nSelected":"{n} selected","props.empty":"Nothing selected","props.multi":"{n} elements selected","props.name":"Name","props.note":"Note","props.nodeNotFound":"Electrical node {id} not found","props.wireNotFound":"Wire {id} not found","props.nodeStats":"{terminals} terminals · {elements} elements","props.selectElement":"Select {label}","props.selectWholeNode":"Select whole electrical node","view.zoomOut":"Zoom out","view.zoomOutHint":"Step zoom out; also wheel ↓ or ⌘−","view.reset":"Reset to 100%","view.current":"Current {z}%","view.zoomIn":"Zoom in","view.zoomInHint":"Step zoom in; also wheel ↑ or ⌘+","view.fit":"Fit view","view.fitHint":"Auto-zoom and center all elements","view.gridHide":"Hide grid","view.gridShow":"Show grid","view.gridHotkey":"G","view.gridHideHint":"Also disables snap-to-grid (free placement)","view.gridShowHint":"Also enables snap-to-grid (snaps to 10px on drag)","view.gridHideAria":"Hide grid and disable snap","view.gridShowAria":"Show grid and enable snap","view.label":"Labels","view.labelOff":"Hide labels","view.labelId":"ID only","view.labelAll":"ID + params","view.labelHint":"Cycle: off → ID → ID + params","library.title":"Library","library.empty":"No matching elements","library.searchPlaceholder":"Search elements…","library.searchAria":"Search elements","library.clearSearch":"Clear search","library.itemHint":"Click to enter place mode, or drag onto the canvas","tool.select":"Select","tool.selectHint":"Click to pick, marquee for multiple, right-click for menu","tool.pan":"Pan","tool.panHint":"Drag the canvas; Space toggles temporarily","tool.wire":"Wire","tool.wireHint":"Drag from a pin/bus/junction; into empty space drops a junction, onto a wire taps it","tool.bus":"Busbar","tool.busHint":"Drag on the canvas — press to set start, release to set end","tool.junction":"Junction","tool.junctionHint":"Click the canvas to drop a junction (node); wires attach to it freely","tool.place":"Place","tool.placeHint":"Click to place; or drag from a terminal/bus to place and connect","tool.text":"Text","tool.textHint":"Click the canvas to drop a text note; double-click an existing one to edit","mode.selectWithSel":"Drag elements · drag terminals to wire · right-click for menu","mode.selectEmpty":"Click to pick · drag to move · marquee for multiple · right-click for menu","mode.pan":"Drag the canvas · scroll to zoom · hold Space to pan in any tool","mode.wireDragging":"Release on a pin/bus/junction; release in empty space drops a junction","mode.wireInit":"Press on any connection point or empty space, drag to a target and release","mode.busDragging":"Drag sets bus direction; release sets the end","mode.busInit":"Press on the canvas to set start, drag, release to set end","mode.junction":"Click the canvas to drop a junction","mode.placeNoKind":"Pick an element kind from the library on the left","mode.placeFromTerm":"Release at the target — the new element will connect back to the source terminal","mode.placeNormal":"Click empty space to place; or drag from a terminal / bus to place and connect","mode.text":"Click to drop text · double-click to edit · drag selected to move · Del to remove","mode.escSelect":"Esc clears selection","mode.escOther":"Right-click / Esc to cancel","tool.placeNoKindTooltip":"Pick a kind in the library on the left, then click the canvas","tool.undo":"Undo","tool.undoHint":"Undo the last edit (move / rotate / delete, etc.)","tool.redo":"Redo","tool.redoHint":"Redo the last undone edit","layout.label":"Layout","layout.hint":"Auto-layout the whole diagram or just the selection, fill gaps","layout.allAuto":"Auto-layout all","layout.selAuto":"Auto-layout selection","layout.allFill":"Fill unplaced","layout.selFill":"Fill unplaced in selection","tool.more":"More","tool.moreHint":"Undo / redo / layout","view.menu":"View","view.menuHint":"Zoom, fit, grid","ctx.ariaNode":"Node actions","ctx.ariaWire":"Wire actions","ctx.ariaElement":"Element actions","ctx.rotate":"Rotate 90°","ctx.rotateHint":"Rotate selection clockwise; wires re-route through new terminals","ctx.mirror":"Mirror horizontally","ctx.mirrorTitle":"Mirror","ctx.mirrorHint":"Flip selection left-right","ctx.delete":"Delete","ctx.deleteHintNode":"Disconnect every wire on this node (elements stay)","ctx.deleteHintWire":"Remove only this wire (siblings on the same node stay)","ctx.deleteHintElement":"Remove the selection and its wires","ctx.resetWirePath":"Reset to auto-route","ctx.resetWirePathHint":"Drop manual corners and let the router re-draw this wire","menu.undo":"Undo","menu.redo":"Redo","menu.cut":"Cut","menu.copy":"Copy","menu.paste":"Paste","menu.rotate":"Rotate 90°","menu.mirror":"Mirror","menu.selectAll":"Select all","menu.disconnect":"Disconnect this wire","menu.delete":"Delete","io.parseFailed":"JSON parse failed: {err}","io.notObject":"File is not a JSON object","io.versionMismatch":'Version mismatch: expected "1", got {actual}',"io.elementsMissing":"`elements` is missing or not an array","compile.duplicateId":'Duplicate element id: "{id}"',"compile.unknownKind":'Unknown element kind="{kind}"',"compile.invalidTermRef":'Invalid terminal reference "{ref}"',"compile.elementMissing":'Reference to unknown element "{id}"',"compile.missingPin":'Element "{id}" (kind={kind}) has no pin "{pin}"; available: {available}',"compile.singleTerminal":"Node has only one terminal — ignored","compile.layoutMissingElement":'layout key "{id}" references an unknown element',"compile.elementUnconnected":'Element "{id}" has no connections',"cat.busbar":"Busbar / wiring","cat.switching":"Switching","cat.protection":"Protection","cat.motor-control":"Motor control","cat.transformer":"Transformer","cat.instrument-transformer":"Instrument transformer","cat.measurement":"Measurement","cat.source":"Source","cat.load":"Load","cat.storage":"Storage","cat.compensation":"Compensation","cat.grounding":"Grounding","cat.renewable":"Renewables / power electronics","onboard.title":"Quick start","onboard.step1.title":"Draw a busbar","onboard.step1.body":"Pick the busbar tool (B), then press and drag on the canvas","onboard.step2.title":"Drag elements from the bus","onboard.step2.body":"Switch to Place (P), pick a kind, then drag from the bus — it auto-connects","onboard.step3.title":"Chain the next one","onboard.step3.body":"Drag from any terminal — the new element drops pre-connected","onboard.dismiss":"Got it"}},Qr="ole-locale";function e2(){if(typeof window>"u")return"zh";try{const e=window.localStorage.getItem(Qr);if(e==="zh"||e==="en")return e}catch{}return typeof navigator<"u"&&typeof navigator.language=="string"?navigator.language.toLowerCase().startsWith("zh")?"zh":"en":"zh"}function Io(e){try{window.localStorage.setItem(Qr,e)}catch{}}const Tt=Jt((e,t)=>({locale:e2(),setLocale:n=>{Io(n),e({locale:n})},toggle:()=>{const n=t().locale==="zh"?"en":"zh";Io(n),e({locale:n})}}));function es(e,t){return t?e.replace(/\{(\w+)\}/g,(n,o)=>t[o]!==void 0?String(t[o]):`{${o}}`):e}function ts(e,t){return Co[e][t]??Co.zh[t]??t}function we(e,t){return es(ts(Tt.getState().locale,e),t)}function ie(){const e=Tt(t=>t.locale);return(t,n)=>es(ts(e,t),n)}function ns(e,t){let n;try{n=e()}catch{return}return{getItem:r=>{var s;const i=l=>l===null?null:JSON.parse(l,void 0),a=(s=n.getItem(r))!=null?s:null;return a instanceof Promise?a.then(i):i(a)},setItem:(r,s)=>n.setItem(r,JSON.stringify(s,void 0)),removeItem:r=>n.removeItem(r)}}const Tn=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then(o){return Tn(o)(n)},catch(o){return this}}}catch(n){return{then(o){return this},catch(o){return Tn(o)(n)}}}},t2=(e,t)=>(n,o,r)=>{let s={storage:ns(()=>window.localStorage),partialize:w=>w,version:0,merge:(w,$)=>({...$,...w}),...t},i=!1,a=0;const l=new Set,d=new Set;let u=s.storage;if(!u)return e((...w)=>{console.warn(`[zustand persist middleware] Unable to update item '${s.name}', the given storage is currently unavailable.`),n(...w)},o,r);const f=()=>{const w=s.partialize({...o()});return u.setItem(s.name,{state:w,version:s.version})},m=r.setState;r.setState=(w,$)=>(m(w,$),f());const p=e((...w)=>(n(...w),f()),o,r);r.getInitialState=()=>p;let h;const y=()=>{var w,$;if(!u)return;const k=++a;i=!1,l.forEach(S=>{var C;return S((C=o())!=null?C:p)});const b=(($=s.onRehydrateStorage)==null?void 0:$.call(s,(w=o())!=null?w:p))||void 0;return Tn(u.getItem.bind(u))(s.name).then(S=>{if(S)if(typeof S.version=="number"&&S.version!==s.version){if(s.migrate){const C=s.migrate(S.state,S.version);return C instanceof Promise?C.then(R=>[!0,R]):[!0,C]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,S.state];return[!1,void 0]}).then(S=>{var C;if(k!==a)return;const[R,X]=S;if(h=s.merge(X,(C=o())!=null?C:p),n(h,!0),R)return f()}).then(()=>{k===a&&(b==null||b(o(),void 0),h=o(),i=!0,d.forEach(S=>S(h)))}).catch(S=>{k===a&&(b==null||b(void 0,S))})};return r.persist={setOptions:w=>{s={...s,...w},w.storage&&(u=w.storage)},clearStorage:()=>{u==null||u.removeItem(s.name)},getOptions:()=>s,rehydrate:()=>y(),hasHydrated:()=>i,onHydrate:w=>(l.add(w),()=>{l.delete(w)}),onFinishHydration:w=>(d.add(w),()=>{d.delete(w)})},s.skipHydration||y(),h||p},n2=t2,ze=.5;function os(e){if(e.length<2)return e.map(r=>[r[0],r[1]]);const t=[[e[0][0],e[0][1]]];for(let r=1;r<e.length;r++){const s=t[t.length-1];Math.abs(s[0]-e[r][0])<ze&&Math.abs(s[1]-e[r][1])<ze||t.push([e[r][0],e[r][1]])}if(t.length<2)return t;const n=[t[0]];for(let r=1;r<t.length;r++){const s=n[n.length-1],i=t[r],a=Math.abs(s[0]-i[0]),l=Math.abs(s[1]-i[1]);if(a>ze&&l>ze){const u=(n.length>=2?Math.abs(n[n.length-2][1]-s[1])<ze?"h":"v":null)==="h"?[i[0],s[1]]:[s[0],i[1]];n.push(u)}n.push(i)}const o=[n[0]];for(let r=1;r<n.length-1;r++){const s=o[o.length-1],i=n[r],a=n[r+1],l=Math.abs(s[0]-i[0])<ze&&Math.abs(i[0]-a[0])<ze,d=Math.abs(s[1]-i[1])<ze&&Math.abs(i[1]-a[1])<ze;l||d||o.push(i)}return o.push(n[n.length-1]),o}function rs(){return{elements:new Map,buses:new Map,junctions:new Map,terminals:new Map,nodes:new Map,layout:new Map,wireRenders:new Map,terminalToNode:new Map,elementToTerminals:new Map,diagnostics:[]}}function ss(e){return{at:(e==null?void 0:e.at)??[0,0],rot:(e==null?void 0:e.rot)??0,mirror:(e==null?void 0:e.mirror)??!1}}function An(e){return e===90||e===270?"y":"x"}function Pe(e,t){let[n,o]=e;switch(t.mirror&&(n=-n),t.rot){case 0:break;case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}const o2={n:"e",e:"s",s:"w",w:"n"},r2={n:"n",s:"s",e:"w",w:"e"};function St(e,t){let n=t.mirror?r2[e]:e;const o=t.rot/90|0;for(let r=0;r<o;r++)n=o2[n];return n}function Cn(e){switch(e){case"n":return[0,-1];case"s":return[0,1];case"e":return[1,0];case"w":return[-1,0]}}class is{constructor(){gt(this,"parent",new Map);gt(this,"rank",new Map)}add(t){this.parent.has(t)||(this.parent.set(t,t),this.rank.set(t,0))}find(t){this.add(t);let n=t;for(;this.parent.get(n)!==n;){const o=this.parent.get(n),r=this.parent.get(o);this.parent.set(n,r),n=r}return n}union(t,n){const o=this.find(t),r=this.find(n);if(o===r)return;const s=this.rank.get(o),i=this.rank.get(r);s<i?this.parent.set(o,r):s>i?this.parent.set(r,o):(this.parent.set(r,o),this.rank.set(o,s+1))}groups(){const t=new Map;for(const n of this.parent.keys()){const o=this.find(n),r=t.get(o);r?r.push(n):t.set(o,[n])}return t}}const Po=["n","e","s","w"],Oo={n:"s",s:"n",e:"w",w:"e"};function Ot(e,t){const n=Po.indexOf(e),r=((Po.indexOf(t)-n)%4+4)%4;return[0,90,180,270][r]}const mn=320,Bt=220,bt=260,hn=720,wt=30,Bo=30,Ge=80,Lo=10,s2=60,i2=520,a2=80,l2=80,zo=8,Ro=new Set(["source","renewable"]);function c2(e){var bo,wo,vo,ko,_o,$o;const{elements:t,buses:n,junctions:o,wires:r,library:s,userLayout:i,userBusLayout:a}=e,l=new Map(i),d=new Map(a),u=new Map,f=new Set(i.keys()),m=new Set(a.keys()),p=new Map;for(const g of t)p.set(g.id,g);const h=new Map;for(const g of n)h.set(g.id,g);const y=g=>{const v=p.get(g);if(v)return s.get(v.kind)},w=new Set(n.map(g=>g.id)),$=g=>w.has(g),k=new Set(o.map(g=>g.id)),b=new Set(o.filter(g=>{var v;return(v=g.layout)==null?void 0:v.at}).map(g=>g.id)),S=new is;for(const g of r)S.add(g.ends[0]),S.add(g.ends[1]),S.union(g.ends[0],g.ends[1]);for(const g of t){const v=s.get(g.kind);if(v)for(const j of v.terminals)S.add(`${g.id}.${j.id}`)}for(const g of n)S.add(g.id);const C=[];for(const[,g]of S.groups())g.length>=2&&C.push(g);const R=new Map;for(const g of C)for(const v of g)R.set(v,[g]);const X=new Map;for(const g of C){const v=g.filter($);if(v.length!==0)for(const j of v){const N=g.filter(_=>_!==j),E=X.get(j)??[];E.push(...N),X.set(j,E)}}{const j=A=>p.has(A)&&!!y(A),N=A=>{if($(A))return null;if(k.has(A))return A;const M=A.indexOf(".");return M>0?A.slice(0,M):null},E=new Map,_=new Set,T=(A,M)=>{E.has(A)||E.set(A,new Set),E.has(M)||E.set(M,new Set),A!==M&&(E.get(A).add(M),E.get(M).add(A))};for(const A of C){const M=[];let B=!1;for(const H of A){if($(H)){B=!0;continue}const J=N(H);J&&M.push(J)}const L=[...new Set(M)];for(const H of L)E.has(H)||E.set(H,new Set),B&&_.add(H);const F=L.filter(H=>k.has(H)),q=L.filter(H=>!k.has(H));if(F.length>0){for(const H of F)for(const J of q)T(H,J);for(let H=0;H<F.length;H++)for(let J=H+1;J<F.length;J++)T(F[H],F[J])}else for(let H=0;H<q.length;H++)for(let J=H+1;J<q.length;J++)T(q[H],q[J])}const z=(A,M)=>{const B=y(A);if(!B)return null;for(const L of B.terminals){const F=`${A}.${L.id}`;for(const q of R.get(F)??[])for(const H of q)if(N(H)===M)return L}return null},I=A=>{const M=K=>{var Q;return((Q=E.get(K))==null?void 0:Q.size)??0},B=K=>{var Q;return((Q=y(K))==null?void 0:Q.category)??""},L=K=>{const Q=B(K);return Q==="source"?0:Q==="renewable"?1:2+Math.min(M(K),9)/10},F=A.filter(j).sort((K,Q)=>L(K)-L(Q)||K.localeCompare(Q))[0];if(!F)return;const q=new Map([[F,null]]),H=new Map([[F,0]]),J=new Map,Z=[],G=[F],Y=new Set([F]);for(;G.length;){const K=G.shift();Z.push(K);for(const Q of[...E.get(K)??[]].sort(($e,Se)=>$e.localeCompare(Se)))Y.has(Q)||(Y.add(Q),q.set(Q,K),H.set(Q,(H.get(K)??0)+1),J.has(K)||J.set(K,[]),J.get(K).push(Q),G.push(Q))}let U=0;const le=new Map,be=K=>{const Q=J.get(K)??[];if(Q.length===0){le.set(K,U++);return}for(const Se of Q)be(Se);const $e=Q.map(Se=>le.get(Se));le.set(K,$e.reduce((Se,It)=>Se+It,0)/$e.length)};be(F);for(const K of Z){const Q=me(mn+(le.get(K)??0)*160),$e=me(Bt+(H.get(K)??0)*140);if(k.has(K)){u.set(K,[Q,$e]);continue}let Se=0;const It=q.get(K)??null;if(It){const pt=z(K,It);pt&&(Se=Ot(pt.orientation,"n"))}else{const pt=(J.get(K)??[])[0],So=pt?z(K,pt):null;So&&(Se=Ot(So.orientation,"s"))}l.set(K,{at:[Q,$e],rot:Se,mirror:!1}),f.add(K)}},P=new Set;for(const A of E.keys()){if(P.has(A))continue;const M=[],B=[A];for(P.add(A);B.length;){const L=B.pop();M.push(L);for(const F of E.get(L)??[])P.has(F)||(P.add(F),B.push(F))}M.length<2||M.some(L=>_.has(L))||M.some(L=>l.has(L)||b.has(L))||M.some(j)&&I(M)}}const V=new Map;for(const g of C){const v=g.filter($);if(v.length!==0)for(const j of g){if($(j))continue;const N=j.indexOf(".");if(N<0)continue;const E=j.slice(0,N),_=j.slice(N+1),T=V.get(E)??[];for(const z of v)T.some(I=>I.busId===z&&I.pin===_)||T.push({busId:z,pin:_});V.set(E,T)}}const te=[],ae=new Set;for(const[g,v]of V)if(new Set(v.map(N=>N.busId)).size>=2){const N=((wo=s.get(((bo=p.get(g))==null?void 0:bo.kind)??""))==null?void 0:wo.category)==="transformer"?"vertical":"horizontal";te.push({elementId:g,attachments:v,orientation:N}),N==="vertical"&&ae.add(g)}const D=new Map,W=(g,v)=>{g!==v&&(D.has(g)||D.set(g,new Set),D.has(v)||D.set(v,new Set),D.get(g).add(v),D.get(v).add(g))};for(const g of r)W(g.ends[0],g.ends[1]);for(const g of t){const v=s.get(g.kind);if(!v||v.terminals.length<2)continue;const j=v.terminals.map(N=>`${g.id}.${N.id}`);for(let N=0;N<j.length;N++)for(let E=N+1;E<j.length;E++)W(j[N],j[E])}for(const g of t){if(ae.has(g.id))continue;const v=s.get(g.kind);if(!v||v.category!=="transformer"||v.terminals.length<2)continue;const j=v.terminals.map(_=>`${g.id}.${_.id}`),N=new Map;for(const _ of j){const T=_.slice(g.id.length+1);N.set(T,new Set);const z=new Set(j.filter(A=>A!==_)),I=new Set([_]),P=[_];for(;P.length>0;){const A=P.shift();if($(A)){N.get(T).add(A);continue}const M=D.get(A);if(M)for(const B of M)I.has(B)||z.has(B)||(I.add(B),P.push(B))}}const E=new Set;for(const _ of N.values())for(const T of _)E.add(T);if(E.size>=2){const _=[];for(const[T,z]of N)for(const I of z)_.push({busId:I,pin:T});te.push({elementId:g.id,attachments:_,orientation:"vertical"}),ae.add(g.id)}}const ye=(g,v)=>{var z;const j=y(v),N=j?j.terminals.map(I=>`${v}.${I.id}`):[],E=g,_=new Set([E,...N]),T=[E];for(;T.length>0;){const I=T.shift(),P=I.indexOf(".");if(P>0){const M=I.slice(0,P),B=p.get(M);if(B){const L=(z=s.get(B.kind))==null?void 0:z.category;if(L&&Ro.has(L))return!0}}const A=D.get(I);if(A)for(const M of A)_.has(M)||(_.add(M),T.push(M))}return!1};for(const g of te){if(g.orientation!=="horizontal")continue;const v=new Set(g.attachments.map(N=>N.busId));let j=0;for(const N of v)ye(N,g.elementId)&&j++;j===1&&(g.orientation="vertical",ae.add(g.elementId))}for(const g of t){if(ae.has(g.id)||g.kind!=="breaker")continue;const v=s.get(g.kind);if(!v||v.terminals.length!==2)continue;const j=v.terminals.map(_=>`${g.id}.${_.id}`),N=new Map;for(const _ of j){const T=_.slice(g.id.length+1),z=new Set(j.filter(A=>A!==_)),I=new Set([_]),P=[_];for(;P.length>0;){const A=P.shift();if($(A)){N.set(T,A);break}const M=D.get(A);if(M)for(const B of M){if(I.has(B)||z.has(B))continue;const L=B.indexOf(".");if(L>0){const F=B.slice(0,L);if(F!==g.id){const q=p.get(F),H=q?s.get(q.kind):void 0;if((H==null?void 0:H.category)==="transformer")continue}}I.add(B),P.push(B)}}}if(new Set(N.values()).size>=2){const _=[];for(const[T,z]of N)_.push({busId:z,pin:T});te.push({elementId:g.id,attachments:_,orientation:"horizontal"})}}const ue=new Map;for(const g of n)ue.set(g.id,new Map);for(const g of te){const v=Array.from(new Set(g.attachments.map(j=>j.busId)));for(const j of v)for(const N of v)j!==N&&((vo=ue.get(j))==null||vo.set(N,g))}const pe=g=>{var j;const v=(j=s.get(g))==null?void 0:j.category;return v?Ro.has(v):!1},ne=[];for(const g of n){const v=X.get(g.id);if(v)for(const j of v){if($(j))continue;const N=j.indexOf(".");if(N<0)continue;const E=j.slice(0,N),_=p.get(E);if(_&&pe(_.kind)){ne.push(g.id);break}}}ne.length===0&&n.length>0&&ne.push(n[0].id);const re=new Map;for(const g of ne)re.set(g,0);{const g=[...ne];for(;g.length>0;){const v=g.shift(),j=re.get(v),N=ue.get(v);if(N)for(const[E,_]of N){if(re.has(E))continue;const T=_.orientation==="horizontal"?j:j+1;re.set(E,T),g.push(E)}}}for(const g of n){if(re.has(g.id))continue;const v=re.size===0?-1:Math.max(...Array.from(re.values()));re.set(g.id,v+1)}const ge=new Map;for(const g of n){const v=re.get(g.id),j=ge.get(v)??[];j.push(g.id),ge.set(v,j)}const xe=[...ge.keys()].sort((g,v)=>g-v),_e=(g,v,j)=>{const N=`${g.elementId}.${j}`,E=v,_=y(g.elementId),T=new Set;if(_)for(const M of _.terminals)M.id!==j&&T.add(`${g.elementId}.${M.id}`);const z=new Set([N]),I=[{ref:N,dist:0}],P=new Map,A=(M,B,L,F)=>{z.add(M),P.set(M,B),I.push({ref:M,dist:F+L})};for(;I.length>0;){const{ref:M,dist:B}=I.shift();if(M===E){const H=P.get(E);let J;if(H){const Z=H.indexOf(".");if(Z>0){const G=H.slice(0,Z);G!==g.elementId&&(J=G)}}return{extent:B,head:J}}const L=M.indexOf(".");if(L<0)continue;const F=M.slice(0,L),q=M.slice(L+1);if(!$(F)&&!ae.has(F)){const H=y(F),J=H==null?void 0:H.terminals.find(Z=>Z.id===q);if(H&&J)for(const Z of H.terminals){if(Z.id===q)continue;const G=`${F}.${Z.id}`;z.has(G)||T.has(G)||A(G,M,Math.abs(J.y-Z.y),B)}}for(const H of R.get(M)??[])for(const J of H){if(J===M||z.has(J)||T.has(J))continue;const Z=$(M)||$(J);A(J,M,Z?Bo:wt,B)}}return{extent:0}},Ee=(g,v)=>{var M,B,L;const j=(M=ue.get(g))==null?void 0:M.get(v);if(!j||j.orientation==="horizontal")return bt;const N=y(j.elementId);if(!N)return bt;const E=(B=j.attachments.find(F=>F.busId===g))==null?void 0:B.pin,_=(L=j.attachments.find(F=>F.busId===v))==null?void 0:L.pin;if(!E||!_)return bt;const T=N.terminals.find(F=>F.id===E),z=N.terminals.find(F=>F.id===_);if(!T||!z)return bt;const I=Math.abs(z.y-T.y),P=_e(j,g,E).extent,A=_e(j,v,_).extent;return P+I+A},sn=new Map;for(const g of te){if(g.orientation!=="vertical")continue;const v=g.attachments.slice().sort((z,I)=>(re.get(z.busId)??0)-(re.get(I.busId)??0));if(v.length<2)continue;const j=v[0].busId,N=v[1].busId,E=v[0].pin,T=_e(g,j,E).head??g.elementId;sn.set(T,{lowerBusId:N})}const so=30,io=g=>{const v=y(g);return Math.max((v==null?void 0:v.width)??Ge,Ge)},Rw=2,ao=(g,v,j,N=0)=>{const E=y(v);let _=io(v);if(E&&!j.has(v)&&N<Rw){j.add(v);let T=0;for(const z of E.terminals){const I=`${v}.${z.id}`;if(I!==g)for(const P of R.get(I)??[]){const A=new Set;let M=!1;for(const L of P){if(L===I)continue;if($(L)){M=!0;continue}const F=L.indexOf(".");if(F<0)continue;const q=L.slice(0,F);q===v||j.has(q)||ae.has(q)||A.add(q)}if(M||A.size===0)continue;let B=0;for(const L of A){const F=[...P].find(q=>q.indexOf(".")>0&&q.slice(0,q.indexOf("."))===L);B+=(F?ao(F,L,j,N+1):io(L))+so}T=Math.max(T,B-so)}}j.delete(v),_=Math.max(_,T)}return _},ft=320,et=new Map,lo=(g,v)=>{if(!ae.has(g))return!1;const j=te.find(T=>T.elementId===g),N=j==null?void 0:j.attachments.find(T=>T.busId!==v);if(!N)return!1;const E=re.get(v)??0;return(re.get(N.busId)??0)<E},mt=(g,v,j)=>{const N=sn.get(g);if(N){const _=et.get(N.lowerBusId);if(_!==void 0)return Math.max(v,_+Ge)}let E=0;return j&&(E=ao(j,g,new Set)),Math.max(v,Ge,E)},co=(g,v)=>{if(et.has(g))return et.get(g);if(v.has(g))return ft;v.add(g);const j=X.get(g)??[];let N=0,E=0;for(const T of j){if($(T))continue;const z=T.indexOf(".");if(z<0)continue;const I=T.slice(0,z),P=T.slice(z+1);if(lo(I,g))continue;const A=y(I);if(!A)continue;const M=A.terminals.find(F=>F.id===P);if(!M)continue;const B=sn.get(I);B&&co(B.lowerBusId,v);const L=mt(I,A.width,`${I}.${P}`);M.y>0?N+=L:E+=L}const _=Math.max(ft,Math.max(N,E)+Ge);return et.set(g,_),v.delete(g),_};for(const g of n)co(g.id,new Set);const He=new Map,Dw=(g,v,j)=>{const N=y(v);if(!N)return;const E=`${v}.${j}`,_=N.terminals.filter(I=>I.id!==j).map(I=>`${v}.${I.id}`);if(_.length===0)return;const T=new Set([E,..._]),z=_.slice();for(;z.length>0;){const I=z.shift();if($(I)&&I!==g){const A=d.get(I);return A?A.at[0]:void 0}for(const A of R.get(I)??[])for(const M of A)M===I||T.has(M)||(T.add(M),z.push(M));const P=I.indexOf(".");if(P>0){const A=I.slice(0,P);if(!$(A)){const M=y(A);if(M)for(const B of M.terminals){const L=`${A}.${B.id}`;T.has(L)||(T.add(L),z.push(L))}}}}},Fw=g=>{const v=X.get(g);if(!v||v.length===0)return;const j=d.get(g);if(!j)return;const N=v.flatMap(M=>{if($(M))return[];const B=M.indexOf(".");if(B<0)return[];const L=M.slice(0,B),F=M.slice(B+1);if(l.has(L))return[];if(lo(L,g))return[];const q=y(L);if(!q)return[];const H=q.terminals.find(J=>J.id===F);return H?[{elId:L,lib:q,localTerm:H,isLinker:ae.has(L),busFacingRef:`${L}.${F}`}]:[]});if(N.length===0)return;const E=[],_=[];for(const M of N)M.localTerm.y>0?E.push(M):_.push(M);const T=M=>M.reduce((B,L)=>B+mt(L.elId,L.lib.width,L.busFacingRef),0),z=Math.max(T(E),T(_))+Ge,I=Math.max(j.span,z);I!==j.span&&!m.has(g)&&d.set(g,{...j,span:I});const P=d.get(g),A=(M,B)=>{if(M.length===0)return;const L=new Map;for(const Y of M){const U=Dw(g,Y.elId,Y.localTerm.id);U!==void 0&&L.set(Y.elId,U)}M.sort((Y,U)=>{const le=L.get(Y.elId)??P.at[0],be=L.get(U.elId)??P.at[0];if(le!==be)return le-be;const K=mt(Y.elId,Y.lib.width,Y.busFacingRef);return mt(U.elId,U.lib.width,U.busFacingRef)-K});const F=M.map(Y=>mt(Y.elId,Y.lib.width,Y.busFacingRef)),q=F.reduce((Y,U)=>Y+U,0),H=Math.max(I,q),J=(H-q)/(M.length+1);let Z=P.at[0]-H/2+J;const G=P.at[1]+B*Bo;for(let Y=0;Y<M.length;Y++){const U=M[Y],le=F[Y],be=Z+le/2;U.isLinker?He.has(U.elId)||He.set(U.elId,be):l.set(U.elId,{at:[me(be-U.localTerm.x),me(G-U.localTerm.y)],rot:0,mirror:!1}),Z+=le+J}};A(E,-1),A(_,1)},Hw=g=>{if(l.has(g.elementId)||g.orientation==="horizontal")return;const v=y(g.elementId);if(!v)return;const j=g.attachments.filter(Z=>d.has(Z.busId));if(j.length<2)return;const N=j.slice().sort((Z,G)=>(re.get(Z.busId)??0)-(re.get(G.busId)??0)),E=N[0].busId,_=d.get(E),T=N[0].pin,z=N[N.length-1].pin,I=v.terminals.find(Z=>Z.id===T),P=v.terminals.find(Z=>Z.id===z);if(!I||!P)return;const A=I.y<=P.y?0:180,M=re.get(E)??0,B=j.filter(Z=>(re.get(Z.busId)??0)===M),L=[];let F=0;for(const Z of B){const G=_e(g,Z.busId,Z.pin);F=Math.max(F,G.extent);const Y=G.head?l.get(G.head):void 0;Y?L.push(Y.at[0]):He.has(g.elementId)?L.push(He.get(g.elementId)):L.push(d.get(Z.busId).at[0])}let q;L.length>0?q=L.reduce((Z,G)=>Z+G,0)/L.length:He.has(g.elementId)?q=He.get(g.elementId):q=_.at[0];const H=_.at[1]+F,J=A===0?[me(q-I.x),me(H-I.y)]:[me(q+I.x),me(H+I.y)];if(l.set(g.elementId,{at:J,rot:A,mirror:!1}),B.length>1){const Z=l.get(g.elementId),G=Pe([I.x,I.y],Z),Y=St(I.orientation,Z);Ww(`${g.elementId}.${T}`,G,Y,q)}},Ww=(g,v,j,N)=>{const E=new Set([g]);let _=g,T=v,z=j;for(;;){const I=R.get(_)??[];let P,A=!1;for(const Q of I){if(Q.length>=3){A=!0;break}const $e=Q.find(Se=>Se!==_);if(!(!$e||E.has($e))){if($($e)){A=!0;break}P=$e;break}}if(A||!P)break;const M=P.indexOf(".");if(M<0)break;const B=P.slice(0,M),L=P.slice(M+1);if($(B)||ae.has(B)||l.has(B))break;const F=y(B);if(!F)break;const q=F.terminals.find(Q=>Q.id===L);if(!q)break;const H=Cn(z),J=[T[0]+H[0]*wt,T[1]+H[1]*wt],Z=Oo[z],G=Ot(q.orientation,Z),Y=Pe([q.x,q.y],{at:[0,0],rot:G,mirror:!1}),U=[me(N-Y[0]),me(J[1]-Y[1])];l.set(B,{at:U,rot:G,mirror:!1}),E.add(P);const le=F.terminals.find(Q=>Q.id!==L);if(!le)break;const be=`${B}.${le.id}`;E.add(be);const K={at:U,rot:G,mirror:!1};T=Pe([le.x,le.y],K),z=St(le.orientation,K),_=be}},qw=g=>{if(l.has(g.elementId)||g.orientation!=="horizontal")return;const v=y(g.elementId);if(!v)return;const j=g.attachments.filter(B=>d.has(B.busId));if(j.length<2)return;const N=j.map(B=>{const L=_e(g,B.busId,B.pin),F=L.head?l.get(L.head):void 0,q=F?F.at[0]:d.get(B.busId).at[0];return{att:B,x:q,extent:L.extent}});N.sort((B,L)=>B.x-L.x);const E=N[0],_=N[N.length-1],T=v.terminals.find(B=>B.id===E.att.pin),z=v.terminals.find(B=>B.id===_.att.pin);if(!T||!z)return;const I=T.y<=z.y?270:90,P=(E.x+_.x)/2,M=d.get(E.att.busId).at[1]+Math.max(E.extent,_.extent);l.set(g.elementId,{at:[me(P),me(M)],rot:I,mirror:!1})},uo=100;let Ct=Bt;for(let g=0;g<xe.length;g++){const v=xe[g],j=ge.get(v);let N;if(g===0)N=Bt;else{const _=ge.get(xe[g-1]);let T=0;for(const z of _)for(const I of j)(ko=ue.get(z))!=null&&ko.get(I)&&(T=Math.max(T,Ee(z,I)));T===0&&(T=bt),N=Ct+T}Ct=N;let E=mn;for(const _ of j){if(d.has(_)){Ct=Math.max(Ct,d.get(_).at[1]);continue}let T;if(g>0){const I=ge.get(xe[g-1]),P=[];for(const A of I){const M=(_o=ue.get(A))==null?void 0:_o.get(_);if(!M||M.orientation!=="vertical")continue;const B=($o=M.attachments.find(F=>F.busId===A))==null?void 0:$o.pin;if(!B)continue;const L=_e(M,A,B);L.head&&l.has(L.head)?P.push(l.get(L.head).at[0]):He.has(M.elementId)?P.push(He.get(M.elementId)):P.push(d.get(A).at[0])}P.length>0&&(T=P.reduce((A,M)=>A+M,0)/P.length)}if(T===void 0){const I=et.get(_)??hn;T=E+I/2,E+=I+uo}const z=et.get(_)??hn;d.set(_,{at:[me(T),me(N)],rot:0,span:z,axis:An(0)})}for(const _ of j)Fw(_);if(g>0)for(const _ of te)l.has(_.elementId)||!_.attachments.some(z=>j.includes(z.busId))||Hw(_);for(const _ of te)_.orientation!=="horizontal"||l.has(_.elementId)||!_.attachments.every(z=>j.includes(z.busId))||qw(_)}if(n.length===0&&l.size<t.length){const g=E=>{const _=new Set,T=y(E);if(!T)return _;for(const z of T.terminals){const I=`${E}.${z.id}`;for(const P of R.get(I)??[])for(const A of P){if(A===I||$(A))continue;const M=A.indexOf(".");if(M<0)continue;const B=A.slice(0,M);B!==E&&_.add(B)}}return _},v=new Set,j=[];for(const E of t){if(v.has(E.id)||!y(E.id))continue;const _=[],T=[E.id];for(v.add(E.id);T.length>0;){const z=T.pop();_.push(z);for(const I of g(z))v.has(I)||(v.add(I),T.push(I))}_.length>=2&&j.push(_)}let N=mn;for(const E of j){if(E.some(P=>l.has(P)))continue;E.sort((P,A)=>{var q,H;const M=pe(((q=p.get(P))==null?void 0:q.kind)??"")?0:1,B=pe(((H=p.get(A))==null?void 0:H.kind)??"")?0:1;if(M!==B)return M-B;const L=g(P).size,F=g(A).size;return L!==F?L-F:P.localeCompare(A)});const _=E[0],T=y(_);if(!T)continue;const z=T.terminals.slice().sort((P,A)=>A.y-P.y)[0],I=z?Pe([z.x,z.y],{at:[0,0],rot:0,mirror:!1}):[0,0];l.set(_,{at:[me(N-I[0]),me(Bt-I[1])],rot:0,mirror:!1}),N+=Math.max(hn,E.length*Ge)+uo}}const Gw=g=>{if($(g))return d.has(g);const v=g.indexOf(".");return v<0?!1:l.has(g.slice(0,v))};let an=!0,Xw=t.length+4;for(;an&&Xw-- >0;){an=!1;for(const g of C){if(g.length<2)continue;const v=[],j=new Map;for(const G of g){if($(G))continue;const Y=G.indexOf(".");if(Y<0)continue;const U=G.slice(0,Y),le=G.slice(Y+1);if(l.has(U)){v.push(G);continue}if(ae.has(U)||j.has(U))continue;const be=y(U);if(!be)continue;const K=be.terminals.find(Q=>Q.id===le);K&&j.set(U,{ref:G,elId:U,lib:be,localTerm:K})}if(j.size===0||v.length===0)continue;const N=[...j.values()],E=new Map;for(const G of N)for(const Y of R.get(G.ref)??[])for(const U of Y){if(U===G.ref||$(U)||!Gw(U))continue;const le=U;E.set(le,(E.get(le)??0)+1)}let _;if(E.size>0){let G=-1;for(const[Y,U]of E)(U>G||U===G&&(_===void 0||Y<_))&&(G=U,_=Y)}if(_||(_=[...v].sort()[0]),!_)continue;const T=_.indexOf("."),z=_.slice(0,T),I=_.slice(T+1),P=y(z),A=l.get(z);if(!P||!A)continue;const M=P.terminals.find(G=>G.id===I);if(!M)continue;const B=Pe([M.x,M.y],A),L=St(M.orientation,A),F=Cn(L),q=[-F[1],F[0]];N.sort((G,Y)=>G.elId.localeCompare(Y.elId));const H=N.map(G=>Math.max(G.lib.width,Ge));let Z=-H.reduce((G,Y)=>G+Y,0)/2;for(let G=0;G<N.length;G++){const Y=N[G],U=H[G],le=Z+U/2;Z+=U;const be=Oo[L],K=Ot(Y.localTerm.orientation,be),Q=Pe([Y.localTerm.x,Y.localTerm.y],{at:[0,0],rot:K,mirror:!1}),$e=[B[0]+F[0]*wt+q[0]*le,B[1]+F[1]*wt+q[1]*le],Se=[me($e[0]-Q[0]),me($e[1]-Q[1])];l.set(Y.elId,{at:Se,rot:K,mirror:!1}),an=!0}}}const ht=g=>{const v=l.get(g),j=y(g);if(!v||!j)return null;const N=j.viewBox.split(/\s+/).map(Number);if(N.length<4||N.some(M=>Number.isNaN(M))){const M=j.width/2;return{min:v.at[0]-M,max:v.at[0]+M}}const[E,_,T,z]=N,I=[[E,_],[E+T,_],[E,_+z],[E+T,_+z]];let P=1/0,A=-1/0;for(const M of I){const B=Pe(M,v);P=Math.min(P,B[0]),A=Math.max(A,B[0])}return{min:P,max:A}},ln=g=>{const v=new Set,j=y(g);if(!j)return v;for(const N of j.terminals){const E=`${g}.${N.id}`;for(const _ of R.get(E)??[])for(const T of _){if(T===E||$(T))continue;const z=T.indexOf(".");if(z<0)continue;const I=T.slice(0,z);I!==g&&v.add(I)}}return v},fo=40,cn=g=>{const v=l.get(g),j=y(g);if(!v||!j)return null;const N=j.viewBox.split(/\s+/).map(Number);if(N.length<4||N.some(M=>Number.isNaN(M))){const M=j.height/2;return{min:v.at[1]-M,max:v.at[1]+M}}const[E,_,T,z]=N,I=[[E,_],[E+T,_],[E,_+z],[E+T,_+z]];let P=1/0,A=-1/0;for(const M of I){const B=Pe(M,v);P=Math.min(P,B[1]),A=Math.max(A,B[1])}return{min:P,max:A}},Yw=(g,v)=>{const j=new Set,N=[];for(const E of X.get(g)??[]){if($(E))continue;const _=E.indexOf(".");if(_<0)continue;const T=E.slice(0,_),z=l.get(T);!z||z.at[1]>=v-1||j.has(T)||(j.add(T),N.push(T))}for(;N.length>0;){const E=N.pop();for(const _ of ln(E)){if(j.has(_))continue;const T=l.get(_);!T||T.at[1]>=v-1||(j.add(_),N.push(_))}}return j},mo=(g,v,j)=>{const N=new Set([g]),E=[g];for(;E.length>0;){const _=E.pop();for(const T of ln(_))T===v||N.has(T)||!j.has(T)||(N.add(T),E.push(T))}return N},ho=(g,v)=>{let j=g.length*g.length+8,N=!1,E=!0;for(;E&&j-- >0;){E=!1;for(let _=0;_<g.length&&!E;_++)for(let T=_+1;T<g.length;T++){const z=g[_],I=g[T],P=ht(z),A=ht(I),M=cn(z),B=cn(I);if(!P||!A||!M||!B)continue;const L=Math.min(P.max,A.max)-Math.max(P.min,A.min),F=Math.min(M.max,B.max)-Math.max(M.min,B.min);if(L<=0||F<=0)continue;const q=mo(z,I,v),H=mo(I,z,v);if(q.has(I)||H.has(z))continue;const J=![...q].some(K=>f.has(K)),Z=![...H].some(K=>f.has(K));if(!J&&!Z)continue;const G=(P.min+P.max)/2,Y=(A.min+A.max)/2;let U,le;J&&(!Z||q.size<=H.size)?(U=q,le=G<=Y?-1:1):(U=H,le=Y<=G?-1:1);const be=me(le*(L+fo));if(be!==0){for(const K of U){const Q=l.get(K);Q&&l.set(K,{...Q,at:[Q.at[0]+be,Q.at[1]]})}N=!0,E=!0;break}}}return N};for(const g of n){const v=d.get(g.id);if(!v)continue;const j=Yw(g.id,v.at[1]);if(j.size<2)continue;const N=[...j];if(ho(N,j)){let _=1/0,T=-1/0;for(const z of N){const I=ht(z);I&&(_=Math.min(_,I.min),T=Math.max(T,I.max))}if(Number.isFinite(_)){const I=N.some(A=>f.has(A))?0:me(v.at[0]-(_+T)/2);if(I!==0)for(const A of N){const M=l.get(A);M&&l.set(A,{...M,at:[M.at[0]+I,M.at[1]]})}const P=T-_+fo;if(P>v.span&&!m.has(g.id)){const A=d.get(g.id);d.set(g.id,{...A,span:P})}}}}const po=()=>{const v=t.map(N=>N.id).filter(N=>l.has(N)).map(N=>({x:ht(N),y:cn(N)})).filter(N=>N.x&&N.y);let j=0;for(let N=0;N<v.length;N++)for(let E=N+1;E<v.length;E++){const _=Math.min(v[N].x.max,v[E].x.max)-Math.max(v[N].x.min,v[E].x.min),T=Math.min(v[N].y.max,v[E].y.max)-Math.max(v[N].y.min,v[E].y.min);_>1&&T>1&&j++}return j},Kw=po(),go=new Map;for(const[g,v]of l)go.set(g,{...v,at:[...v.at]});const yo=new Map;for(const[g,v]of d)yo.set(g,{...v,at:[...v.at]});const dn=120,xo=new Map;{const g=new Map,v=new Map,j=[];for(const E of n)for(const _ of X.get(E.id)??[]){if($(_))continue;const T=_.indexOf(".");if(T<0)continue;const z=_.slice(0,T);l.has(z)&&j.push({el:z,bus:E.id,d:1})}j.sort((E,_)=>E.d-_.d);let N=0;for(;N<j.length;){const{el:E,bus:_,d:T}=j[N++],z=g.get(E);if(z===void 0)g.set(E,T),v.set(E,_);else if(T===z&&v.get(E)!==_){v.set(E,null);continue}else continue;for(const I of ln(E))l.has(I)&&(g.has(I)||j.push({el:I,bus:_,d:T+1}))}for(const[E,_]of v)_&&xo.set(E,_)}for(const g of xe){const v=(ge.get(g)??[]).filter(P=>d.has(P));if(v.length<2||v.some(P=>m.has(P)))continue;const j=[];let N=0;for(const P of v){const A=d.get(P),M=[];let B=1/0,L=-1/0;for(const[F,q]of xo){if(q!==P)continue;const H=ht(F);H&&(M.push(F),B=Math.min(B,H.min),L=Math.max(L,H.max))}Number.isFinite(B)||(B=A.at[0]-ft/2,L=A.at[0]+ft/2),j.push({busId:P,min:B,max:L,members:M}),N+=L-B}if(j.some(P=>P.members.some(A=>f.has(A))))continue;let E=1/0,_=-1/0;for(const P of j)E=Math.min(E,P.min),_=Math.max(_,P.max);const T=_-E,z=N+dn*(j.length-1);if(!(T>z+dn))continue;j.sort((P,A)=>(P.min+P.max)/2-(A.min+A.max)/2);let I=E;for(const P of j){const A=me(I-P.min);if(A!==0){const M=d.get(P.busId);d.set(P.busId,{...M,at:[M.at[0]+A,M.at[1]]});for(const B of P.members){const L=l.get(B);L&&l.set(B,{...L,at:[L.at[0]+A,L.at[1]]})}P.min+=A,P.max+=A}I=P.max+dn}for(const P of j){const A=d.get(P.busId),M=Math.max(ft,P.max-P.min);M<A.span&&d.set(P.busId,{...A,span:M})}}{const g=t.map(j=>j.id).filter(j=>l.has(j)),v=new Set(g);ho(g,v)}if(po()>Kw){l.clear();for(const[g,v]of go)l.set(g,v);d.clear();for(const[g,v]of yo)d.set(g,v)}let un=0;for(const g of t){if(l.has(g.id))continue;const v=un%zo,j=Math.floor(un/zo);l.set(g.id,{at:[me(s2+v*a2),me(i2+j*l2)],rot:0,mirror:!1}),un++}return{devices:l,buses:d,junctions:u}}function me(e){return Math.round(e/Lo)*Lo}function d2(e,t){const n=e.ends[0],o=e.ends[1],r=Do(n,t),s=Do(o,t);if(r||s){const l=r?n:o,u=pn(r?o:n,t);if(!u)return null;const f=t.buses.get(l);if(!f)return null;const{axis:m,at:p,span:h}=f.geometry,y=h/2;let w;if(m==="x")w=[Gt(u[0],p[0]-y,p[0]+y),p[1]];else{const $=Gt(u[1],p[1]-y,p[1]+y);w=[p[0],$]}return{wireId:e.id,path:Ho(u,w)}}const i=pn(n,t),a=pn(o,t);return!i||!a?null:{wireId:e.id,path:Ho(i,a)}}function Do(e,t){return!e.includes(".")&&t.buses.has(e)}function pn(e,t){if(!e.includes(".")){const o=t.buses.get(e);if(o)return o.geometry.at;const r=t.junctions.get(e);return r?r.world:null}const n=t.terminals.get(e);return n?n.world:null}function Fo(e,t,n){if(!e.includes(".")){const r=n.buses.get(e);if(!r){const u=n.junctions.get(e);return u?[u.world[0],u.world[1]]:null}const{axis:s,at:i,span:a}=r.geometry;if(!t)return[i[0],i[1]];const l=a/2;if(s==="x")return[Gt(t[0],i[0]-l,i[0]+l),i[1]];const d=Gt(t[1],i[1]-l,i[1]+l);return[i[0],d]}const o=n.terminals.get(e);return o?[o.world[0],o.world[1]]:null}function Ho(e,t){return e[0]===t[0]||e[1]===t[1]?[e,t]:[e,[e[0],t[1]],t]}function Gt(e,t,n){return e<t?t:e>n?n:e}const as="ammeter",ls="电流表 (A)",cs="measurement",ds="-22 -42 44 44",us=44,fs=44,ms='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="0" y="-15" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="14">A</text>',hs=[{id:"t_top",x:0,y:-40,orientation:"n"}],ps={kind:"inline"},u2={id:as,name:ls,category:cs,viewBox:ds,width:us,height:fs,svg:ms,terminals:hs,source:ps},f2=Object.freeze(Object.defineProperty({__proto__:null,category:cs,default:u2,height:fs,id:as,name:ls,source:ps,svg:ms,terminals:hs,viewBox:ds,width:us},Symbol.toStringTag,{value:"Module"})),gs="arc-suppression-coil",ys="消弧线圈",xs="grounding",bs="中性点谐振接地:电感线圈连接到地",ws="-12 -32 24 67",vs=24,ks=67,_s='<line x1="0" y1="-30" x2="0" y2="-12" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -12 A 4 4 0 0 1 0 -4 A 4 4 0 0 1 0 4 A 4 4 0 0 1 0 12" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="12" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="20" x2="10" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="24" x2="7" y2="24" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="28" x2="4" y2="28" fill="none" stroke="black" stroke-width="1"/><line x1="-1.5" y1="32" x2="1.5" y2="32" fill="none" stroke="black" stroke-width="1"/>',$s=[{id:"t_top",x:0,y:-30,orientation:"n"}],Ss={kind:"inline"},m2={id:gs,name:ys,category:xs,description:bs,viewBox:ws,width:vs,height:ks,svg:_s,terminals:$s,source:Ss},h2=Object.freeze(Object.defineProperty({__proto__:null,category:xs,default:m2,description:bs,height:ks,id:gs,name:ys,source:Ss,svg:_s,terminals:$s,viewBox:ws,width:vs},Symbol.toStringTag,{value:"Module"})),js="arrester",Es="避雷器 (FBL)",Ns="protection",Ms="-7 -22 14 44",Ts=14,As=44,Cs='<line x1="0" y1="-20" x2="0" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><polygon points="-2,-8 2,-8 0,-2" fill="black" stroke="black" stroke-width="1"/><rect x="-5" y="-10" width="10" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Is=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Ps={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_22/en_60617_07_22_03.elmt",qetEnglishName:"Surge diverter; Lightning arrester"},p2={id:js,name:Es,category:Ns,viewBox:Ms,width:Ts,height:As,svg:Cs,terminals:Is,source:Ps},g2=Object.freeze(Object.defineProperty({__proto__:null,category:Ns,default:p2,height:As,id:js,name:Es,source:Ps,svg:Cs,terminals:Is,viewBox:Ms,width:Ts},Symbol.toStringTag,{value:"Module"})),Os="async-motor",Bs="异步电动机",Ls="load",zs="-62 -82 64 84",Rs=64,Ds=84,Fs='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><text x="-45" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">3</text><path d="M -25 -20 A 5 2.5 0 0 0 -35 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -20 A 5 2.5 0 0 0 -15 -20" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-60" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="-80" x2="-50" y2="-53" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-80" x2="-10" y2="-53" fill="none" stroke="black" stroke-width="1"/>',Hs=[{id:"t1",x:-50,y:-80,orientation:"n"},{id:"t2",x:-10,y:-80,orientation:"n"},{id:"t3",x:-30,y:-80,orientation:"n"}],Ws={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_08/en_60617_06_08_01.elmt",qetEnglishName:"Induction motor, three-phase, squirrel cage"},y2={id:Os,name:Bs,category:Ls,viewBox:zs,width:Rs,height:Ds,svg:Fs,terminals:Hs,source:Ws},x2=Object.freeze(Object.defineProperty({__proto__:null,category:Ls,default:y2,height:Ds,id:Os,name:Bs,source:Ws,svg:Fs,terminals:Hs,viewBox:zs,width:Rs},Symbol.toStringTag,{value:"Module"})),qs="autotransformer",Gs="自耦变压器",Xs="transformer",Ys="-62 -112 64 144",Ks=64,Vs=144,Us='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-110" x2="-30" y2="-90" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -30 A 30 60 0 0 0 -30 -90" fill="none" stroke="black" stroke-width="1"/>',Js=[{id:"t1",x:-30,y:-110,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],Zs={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_06.elmt",qetEnglishName:"Auto-transformer, general symbol"},b2={id:qs,name:Gs,category:Xs,viewBox:Ys,width:Ks,height:Vs,svg:Us,terminals:Js,source:Zs},w2=Object.freeze(Object.defineProperty({__proto__:null,category:Xs,default:b2,height:Vs,id:qs,name:Gs,source:Zs,svg:Us,terminals:Js,viewBox:Ys,width:Ks},Symbol.toStringTag,{value:"Module"})),Qs="battery",ei="电池储能",ti="storage",ni="-12 -12 29 24",oi=29,ri=24,si='<line x1="-10" y1="0" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-5" x2="0" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-10" x2="5" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="0" x2="15" y2="0" fill="none" stroke="black" stroke-width="1"/>',ii=[{id:"t_left",x:-10,y:0,orientation:"w"},{id:"t_right",x:15,y:0,orientation:"e"}],ai=[{name:"E",label:"容量",type:"number",unit:"kWh"}],li={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_15/en_60617_06_15_01.elmt",qetEnglishName:"Battery cell"},v2={id:Qs,name:ei,category:ti,viewBox:ni,width:oi,height:ri,svg:si,terminals:ii,params:ai,source:li},k2=Object.freeze(Object.defineProperty({__proto__:null,category:ti,default:v2,height:ri,id:Qs,name:ei,params:ai,source:li,svg:si,terminals:ii,viewBox:ni,width:oi},Symbol.toStringTag,{value:"Module"})),ci="bell",di="电铃 (HA)",ui="control",fi="信号电铃 / 警铃。",mi="-32 -32 44 44",hi=44,pi=44,gi='<line x1="-30" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -10 A 20 20 0 0 0 -30 -10" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-10" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/>',yi=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],xi={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_06.elmt",qetEnglishName:"Bell"},_2={id:ci,name:di,category:ui,description:fi,viewBox:mi,width:hi,height:pi,svg:gi,terminals:yi,source:xi},$2=Object.freeze(Object.defineProperty({__proto__:null,category:ui,default:_2,description:fi,height:pi,id:ci,name:di,source:xi,svg:gi,terminals:yi,viewBox:mi,width:hi},Symbol.toStringTag,{value:"Module"})),bi="break-contact",wi="常闭触点 (NC)",vi="control",ki="常闭辅助触点 (break contact)。",_i="-2 -42 14 64",$i=14,Si=64,ji='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="10" y2="-20" fill="none" stroke="black" stroke-width="1"/>',Ei=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Ni=[{name:"open",type:"boolean",default:!1,label:"断开"}],Mi={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_02/en_60617_07_02_03.elmt",qetEnglishName:"Break contact"},S2={id:bi,name:wi,category:vi,description:ki,viewBox:_i,width:$i,height:Si,svg:ji,terminals:Ei,state:Ni,source:Mi},j2=Object.freeze(Object.defineProperty({__proto__:null,category:vi,default:S2,description:ki,height:Si,id:bi,name:wi,source:Mi,state:Ni,svg:ji,terminals:Ei,viewBox:_i,width:$i},Symbol.toStringTag,{value:"Module"})),Ti="breaker",Ai="断路器 (QF)",Ci="switching",Ii="-7 -22 15 46",Pi=15,Oi=46,Bi='<polyline points="0,20 0,10 -5,-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-8" x2="-2" y2="-12" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><text x="2" y="-10.8" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">1</text><text x="3" y="21.2" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">2</text>',Li=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],zi=[{name:"open",type:"boolean",default:!1,label:"断开"}],Ri={x:6,y:-2,anchor:"start"},Di={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/11_circuit_breakers/disjoncteur1.elmt",qetEnglishName:"Circuit-breaker"},E2={id:Ti,name:Ai,category:Ci,viewBox:Ii,width:Pi,height:Oi,svg:Bi,terminals:Li,state:zi,label:Ri,source:Di},N2=Object.freeze(Object.defineProperty({__proto__:null,category:Ci,default:E2,height:Oi,id:Ti,label:Ri,name:Ai,source:Di,state:zi,svg:Bi,terminals:Li,viewBox:Ii,width:Pi},Symbol.toStringTag,{value:"Module"})),Fi="buchholz-relay",Hi="瓦斯继电器 (63)",Wi="protection",qi="瓦斯 / 气体继电器 (Buchholz, ANSI 63)。",Gi="-22 -62 44 64",Xi=44,Yi=64,Ki='<rect x="-20" y="-60" width="40" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-20" y="-30" width="40" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-5" y="-20" width="10" height="10" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-20" x2="10" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-55" x2="0" y2="-50" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -50 A 10 5 0 0 0 0 -40" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -40 A 10 5 0 0 0 0 -50" fill="none" stroke="black" stroke-width="1"/>',Vi=[{id:"t_top",x:0,y:-60,orientation:"n"}],Ui={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_18/en_60617_07_18_01.elmt",qetEnglishName:"Buchholz protective device; Gas relay"},M2={id:Fi,name:Hi,category:Wi,description:qi,viewBox:Gi,width:Xi,height:Yi,svg:Ki,terminals:Vi,source:Ui},T2=Object.freeze(Object.defineProperty({__proto__:null,category:Wi,default:M2,description:qi,height:Yi,id:Fi,name:Hi,source:Ui,svg:Ki,terminals:Vi,viewBox:Gi,width:Xi},Symbol.toStringTag,{value:"Module"})),Ji="busbar",Zi="母线段",Qi="busbar",ea="可拉伸单母线段,多设备挂接",ta="-42 -4 84 8",na=84,oa=8,ra='<line x1="-40" y1="0" x2="40" y2="0" stroke="black" stroke-width="3" stroke-linecap="round" fill="none"/>',sa=[{id:"tap",x:0,y:0,orientation:"n"}],ia={axis:"x",minLength:20,naturalSpan:80},aa=[{name:"Un",label:"额定电压",type:"number",unit:"kV",showOnCanvas:!0}],la={x:0,y:-6,anchor:"middle"},ca={kind:"inline"},A2={id:Ji,name:Zi,category:Qi,description:ea,viewBox:ta,width:na,height:oa,svg:ra,terminals:sa,stretchable:ia,params:aa,label:la,source:ca},C2=Object.freeze(Object.defineProperty({__proto__:null,category:Qi,default:A2,description:ea,height:oa,id:Ji,label:la,name:Zi,params:aa,source:ca,stretchable:ia,svg:ra,terminals:sa,viewBox:ta,width:na},Symbol.toStringTag,{value:"Module"})),da="buzzer",ua="蜂鸣器 (HA)",fa="control",ma="信号蜂鸣器。",ha="-32 -52 44 64",pa=44,ga=64,ya='<line x1="-30" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><path d="M -30 -30 A 20 20 0 0 0 10 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-12" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-12" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/>',xa=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],ba={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_10.elmt",qetEnglishName:"Buzzer"},I2={id:da,name:ua,category:fa,description:ma,viewBox:ha,width:pa,height:ga,svg:ya,terminals:xa,source:ba},P2=Object.freeze(Object.defineProperty({__proto__:null,category:fa,default:I2,description:ma,height:ga,id:da,name:ua,source:ba,svg:ya,terminals:xa,viewBox:ha,width:pa},Symbol.toStringTag,{value:"Module"})),wa="capacitor",va="电容 (C)",ka="passive",_a="通用 / 滤波 / 直流母线电容。无功补偿请用并联电容器。",$a="-7 -23 14 27",Sa=14,ja=27,Ea='<line x1="-5" y1="2" x2="5" y2="2" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-2" x2="5" y2="-2" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-2" fill="none" stroke="black" stroke-width="1"/>',Na=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t_bottom",x:0,y:2,orientation:"s"}],Ma=[{name:"C",label:"容值",type:"number",unit:"μF",showOnCanvas:!0},{name:"Un",label:"额定电压",type:"number",unit:"V"}],Ta={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/20_capacitors/capacite.elmt",qetEnglishName:"Capacitor"},O2={id:wa,name:va,category:ka,description:_a,viewBox:$a,width:Sa,height:ja,svg:Ea,terminals:Na,params:Ma,source:Ta},B2=Object.freeze(Object.defineProperty({__proto__:null,category:ka,default:O2,description:_a,height:ja,id:wa,name:va,params:Ma,source:Ta,svg:Ea,terminals:Na,viewBox:$a,width:Sa},Symbol.toStringTag,{value:"Module"})),Aa="contactor",Ca="接触器 (KM)",Ia="motor-control",Pa="主回路接触器, 通常配热继电器和电机使用。",Oa="-10 -42 15 64",Ba=15,La=64,za='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><path d="M 0 -24.5 A 2.5 2.5 0 0 0 0 -19.5" fill="none" stroke="black" stroke-width="1"/>',Ra=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Da=[{name:"open",type:"boolean",default:!0,label:"断开"}],Fa={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_02.elmt",qetEnglishName:"Contactor; Main make contact of a contactor"},L2={id:Aa,name:Ca,category:Ia,description:Pa,viewBox:Oa,width:Ba,height:La,svg:za,terminals:Ra,state:Da,source:Fa},z2=Object.freeze(Object.defineProperty({__proto__:null,category:Ia,default:L2,description:Pa,height:La,id:Aa,name:Ca,source:Fa,state:Da,svg:za,terminals:Ra,viewBox:Oa,width:Ba},Symbol.toStringTag,{value:"Module"})),Ha="converter-bidir",Wa="双向变流器 (PCS)",qa="renewable",Ga="储能变流器:双向 AC ↔ DC",Xa="-42 -42 44 48",Ya=44,Ka=48,Va='<line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-6" x2="-14" y2="-6" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-6" x2="-4" y2="-6" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -35 -30" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -15 -30" fill="none" stroke="black" stroke-width="1"/><polyline points="-28,-4 -32,0 -28,4" fill="none" stroke="black" stroke-width="1"/><polyline points="-16,-4 -12,0 -16,4" fill="none" stroke="black" stroke-width="1"/>',Ua=[{id:"t_ac",x:-20,y:-40,orientation:"n"},{id:"t_dc",x:-20,y:0,orientation:"s"}],Ja=[{name:"S",label:"容量",type:"number",unit:"MVA"}],Za={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_06.elmt",qetEnglishName:"Rectifier/inverter"},R2={id:Ha,name:Wa,category:qa,description:Ga,viewBox:Xa,width:Ya,height:Ka,svg:Va,terminals:Ua,params:Ja,source:Za},D2=Object.freeze(Object.defineProperty({__proto__:null,category:qa,default:R2,description:Ga,height:Ka,id:Ha,name:Wa,params:Ja,source:Za,svg:Va,terminals:Ua,viewBox:Xa,width:Ya},Symbol.toStringTag,{value:"Module"})),Qa="ct",el="电流互感器 (CT)",tl="instrument-transformer",nl="-42 -62 54 64",ol=54,rl=64,sl='<line x1="-30" y1="-60" x2="-30" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-30" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-20" x2="5" y2="-40" fill="none" stroke="black" stroke-width="1"/>',il=[{id:"t1",x:-30,y:-60,orientation:"n"},{id:"t2",x:-30,y:0,orientation:"s"}],al={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_10.elmt",qetEnglishName:"Current transformer, general symbol"},F2={id:Qa,name:el,category:tl,viewBox:nl,width:ol,height:rl,svg:sl,terminals:il,source:al},H2=Object.freeze(Object.defineProperty({__proto__:null,category:tl,default:F2,height:rl,id:Qa,name:el,source:al,svg:sl,terminals:il,viewBox:nl,width:ol},Symbol.toStringTag,{value:"Module"})),ll="dc-combiner",cl="直流汇流箱",dl="renewable",ul="光伏组串汇流箱 (4 路输入示例)。",fl="-27 -32 54 64",ml=54,hl=64,pl='<rect x="-25" y="-15" width="50" height="30" fill="none" stroke="black" stroke-width="1"/><line x1="-18" y1="-30" x2="-18" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="-6" y1="-30" x2="-6" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-30" x2="6" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="18" y1="-30" x2="18" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="15" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><text x="-9" y="5" font-family="Liberation Sans, Arial, sans-serif" font-size="7" fill="#000000">DC</text>',gl=[{id:"t_s1",x:-18,y:-30,orientation:"n"},{id:"t_s2",x:-6,y:-30,orientation:"n"},{id:"t_s3",x:6,y:-30,orientation:"n"},{id:"t_s4",x:18,y:-30,orientation:"n"},{id:"t_dc",x:0,y:30,orientation:"s"}],yl={kind:"inline"},W2={id:ll,name:cl,category:dl,description:ul,viewBox:fl,width:ml,height:hl,svg:pl,terminals:gl,source:yl},q2=Object.freeze(Object.defineProperty({__proto__:null,category:dl,default:W2,description:ul,height:hl,id:ll,name:cl,source:yl,svg:pl,terminals:gl,viewBox:fl,width:ml},Symbol.toStringTag,{value:"Module"})),xl="dc-disconnector",bl="直流隔离开关",wl="switching",vl="DC isolating switch — 光伏组串 / 储能 直流侧隔离。",kl="-12 -32 30 64",_l=30,$l=64,Sl='<line x1="0" y1="-30" x2="0" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="-8" y2="-15" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-4" x2="14" y2="-4" stroke="black" stroke-width="1" fill="none"/><line x1="6" y1="-1" x2="9" y2="-1" stroke="black" stroke-width="0.8" fill="none"/><line x1="11" y1="-1" x2="14" y2="-1" stroke="black" stroke-width="0.8" fill="none"/>',jl=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],El=[{name:"open",type:"boolean",default:!1,label:"断开"}],Nl={kind:"inline"},G2={id:xl,name:bl,category:wl,description:vl,viewBox:kl,width:_l,height:$l,svg:Sl,terminals:jl,state:El,source:Nl},X2=Object.freeze(Object.defineProperty({__proto__:null,category:wl,default:G2,description:vl,height:$l,id:xl,name:bl,source:Nl,state:El,svg:Sl,terminals:jl,viewBox:kl,width:_l},Symbol.toStringTag,{value:"Module"})),Ml="dc-motor",Tl="直流电机 (M)",Al="load",Cl="直流电动机 (串励通用符号)。",Il="-72 -82 89 84",Pl=89,Ol=84,Bl='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><line x1="-40" y1="-20" x2="-20" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-15" x2="-32" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-29" y1="-15" x2="-20" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-70" y1="-80" x2="-70" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-70" y1="-30" x2="-60" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="10" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="10" y1="-30" x2="10" y2="-50" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -60 A 5 5 0 0 0 10 -50" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -70 A 5 5 0 0 0 10 -60" fill="none" stroke="black" stroke-width="1"/><path d="M 10 -80 A 5 5 0 0 0 10 -70" fill="none" stroke="black" stroke-width="1"/>',Ll=[{id:"t1",x:-70,y:-80,orientation:"n"},{id:"t2",x:10,y:-80,orientation:"n"}],zl={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_05/en_60617_06_05_01.elmt",qetEnglishName:"Series motor, DC"},Y2={id:Ml,name:Tl,category:Al,description:Cl,viewBox:Il,width:Pl,height:Ol,svg:Bl,terminals:Ll,source:zl},K2=Object.freeze(Object.defineProperty({__proto__:null,category:Al,default:Y2,description:Cl,height:Ol,id:Ml,name:Tl,source:zl,svg:Bl,terminals:Ll,viewBox:Il,width:Pl},Symbol.toStringTag,{value:"Module"})),Rl="diode",Dl="二极管 (D)",Fl="passive",Hl="整流 / 续流 / 保护二极管。t1=阳极(上), t2=阴极(下)。",Wl="-12 -42 24 44",ql=24,Gl=44,Xl='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/>',Yl=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],Kl={x:6,y:-20,anchor:"start"},Vl={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_03/en_60617_05_03_01.elmt",qetEnglishName:"Semiconductor diode, general symbol"},V2={id:Rl,name:Dl,category:Fl,description:Hl,viewBox:Wl,width:ql,height:Gl,svg:Xl,terminals:Yl,label:Kl,source:Vl},U2=Object.freeze(Object.defineProperty({__proto__:null,category:Fl,default:V2,description:Hl,height:Gl,id:Rl,label:Kl,name:Dl,source:Vl,svg:Xl,terminals:Yl,viewBox:Wl,width:ql},Symbol.toStringTag,{value:"Module"})),Ul="disconnector",Jl="隔离开关 (QS)",Zl="switching",Ql="-10 -42 15 64",ec=15,tc=64,nc='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-3" y1="-20" x2="3" y2="-20" fill="none" stroke="black" stroke-width="1"/>',oc=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],rc=[{name:"open",type:"boolean",default:!1,label:"断开"}],sc={x:6,y:-10,anchor:"start"},ic={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_06.elmt",qetEnglishName:"Disconnector; Isolator"},J2={id:Ul,name:Jl,category:Zl,viewBox:Ql,width:ec,height:tc,svg:nc,terminals:oc,state:rc,label:sc,source:ic},Z2=Object.freeze(Object.defineProperty({__proto__:null,category:Zl,default:J2,height:tc,id:Ul,label:sc,name:Jl,source:ic,state:rc,svg:nc,terminals:oc,viewBox:Ql,width:ec},Symbol.toStringTag,{value:"Module"})),ac="distance-relay",lc="距离继电器 (21)",cc="protection",dc="距离 / 低阻抗保护继电器 (ANSI 21)。",uc="-62 -42 64 44",fc=64,mc=44,hc='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-42" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Z &lt;</text>',pc=[{id:"t_top",x:-30,y:-40,orientation:"n"}],gc={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_09.elmt",qetEnglishName:"Under-impedance relay"},Q2={id:ac,name:lc,category:cc,description:dc,viewBox:uc,width:fc,height:mc,svg:hc,terminals:pc,source:gc},ek=Object.freeze(Object.defineProperty({__proto__:null,category:cc,default:Q2,description:dc,height:mc,id:ac,name:lc,source:gc,svg:hc,terminals:pc,viewBox:uc,width:fc},Symbol.toStringTag,{value:"Module"})),yc="earth",xc="接地",bc="busbar",wc="-12 -17 24 34",vc=24,kc=34,_c='<line x1="-10" y1="0" x2="10" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-15" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="5" x2="7" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="10" x2="4" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0.5" y1="15" x2="-0.5" y2="15" fill="none" stroke="black" stroke-width="1"/>',$c=[{id:"t1",x:0,y:-15,orientation:"n"}],Sc={kind:"elmt",path:"91_en_60617/en_60617_02/en_60617_02_15/en_60617_02_15_01.elmt",qetEnglishName:"Earth or ground, general symbol"},tk={id:yc,name:xc,category:bc,viewBox:wc,width:vc,height:kc,svg:_c,terminals:$c,source:Sc},nk=Object.freeze(Object.defineProperty({__proto__:null,category:bc,default:tk,height:kc,id:yc,name:xc,source:Sc,svg:_c,terminals:$c,viewBox:wc,width:vc},Symbol.toStringTag,{value:"Module"})),jc="earthing-switch",Ec="接地刀闸 (QE)",Nc="switching",Mc="隔离开关 + 接地连接,单端口",Tc="-12 -32 24 64",Ac=24,Cc=64,Ic='<line x1="0" y1="-30" x2="0" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="-12" x2="-9" y2="9" stroke="black" stroke-width="1" fill="none"/><line x1="-3" y1="-12" x2="3" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="-10" y1="14" x2="10" y2="14" stroke="black" stroke-width="1" fill="none"/><line x1="-7" y1="19" x2="7" y2="19" stroke="black" stroke-width="1" fill="none"/><line x1="-4" y1="24" x2="4" y2="24" stroke="black" stroke-width="1" fill="none"/><line x1="-1.5" y1="29" x2="1.5" y2="29" stroke="black" stroke-width="1" fill="none"/>',Pc=[{id:"t_top",x:0,y:-30,orientation:"n"}],Oc=[{name:"open",type:"boolean",default:!0,label:"断开"}],Bc={x:12,y:-8,anchor:"start"},Lc={kind:"inline"},ok={id:jc,name:Ec,category:Nc,description:Mc,viewBox:Tc,width:Ac,height:Cc,svg:Ic,terminals:Pc,state:Oc,label:Bc,source:Lc},rk=Object.freeze(Object.defineProperty({__proto__:null,category:Nc,default:ok,description:Mc,height:Cc,id:jc,label:Bc,name:Ec,source:Lc,state:Oc,svg:Ic,terminals:Pc,viewBox:Tc,width:Ac},Symbol.toStringTag,{value:"Module"})),zc="energy-meter",Rc="电能表 (Wh)",Dc="measurement",Fc="有功电能表 (kWh) — 服务入口 / 子表。",Hc="-22 -36 44 72",Wc=44,qc=72,Gc='<text x="-10" y="19.2" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Wh</text><rect x="-20" y="-10" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><rect x="-20" y="-30" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Xc=[{id:"t1",x:0,y:-34,orientation:"n"},{id:"t2",x:0,y:34,orientation:"s"}],Yc={kind:"elmt",path:"11_singlepole/500_home_installation/40_meters/wattheuremetre_08-04-03_en60617.elmt",qetEnglishName:"Watt hour meter (en_60617)"},sk={id:zc,name:Rc,category:Dc,description:Fc,viewBox:Hc,width:Wc,height:qc,svg:Gc,terminals:Xc,source:Yc},ik=Object.freeze(Object.defineProperty({__proto__:null,category:Dc,default:sk,description:Fc,height:qc,id:zc,name:Rc,source:Yc,svg:Gc,terminals:Xc,viewBox:Hc,width:Wc},Symbol.toStringTag,{value:"Module"})),Kc="ev-charger",Vc="EV 充电桩",Uc="load",Jc="电动汽车充电站 / 充电桩。",Zc="-17 -27 34 49",Qc=34,ed=49,td='<line x1="0" y1="-25" x2="0" y2="-15" stroke="black" stroke-width="1" fill="none"/><rect x="-15" y="-15" width="30" height="35" fill="none" stroke="black" stroke-width="1"/><rect x="-9" y="-8" width="14" height="6" fill="none" stroke="black" stroke-width="0.8"/><rect x="5" y="-7" width="2" height="4" fill="black"/><text x="-9" y="13" font-family="Liberation Sans, Arial, sans-serif" font-size="7" fill="#000000">EV</text>',nd=[{id:"t_top",x:0,y:-25,orientation:"n"}],od={kind:"inline"},ak={id:Kc,name:Vc,category:Uc,description:Jc,viewBox:Zc,width:Qc,height:ed,svg:td,terminals:nd,source:od},lk=Object.freeze(Object.defineProperty({__proto__:null,category:Uc,default:ak,description:Jc,height:ed,id:Kc,name:Vc,source:od,svg:td,terminals:nd,viewBox:Zc,width:Qc},Symbol.toStringTag,{value:"Module"})),rd="frequency-meter",sd="频率表 (Hz)",id="measurement",ad="-22 -42 44 44",ld=44,cd=44,dd='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-8" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">Hz</text>',ud=[{id:"t_top",x:0,y:-40,orientation:"n"}],fd={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_07.elmt",qetEnglishName:"Frequency meter"},ck={id:rd,name:sd,category:id,viewBox:ad,width:ld,height:cd,svg:dd,terminals:ud,source:fd},dk=Object.freeze(Object.defineProperty({__proto__:null,category:id,default:ck,height:cd,id:rd,name:sd,source:fd,svg:dd,terminals:ud,viewBox:ad,width:ld},Symbol.toStringTag,{value:"Module"})),md="fuse-switch-disconnector",hd="熔断器式隔离开关",pd="switching",gd="负荷型熔断器隔离开关 (on-load fuse switch-disconnector)。",yd="-8 -32 12 64",xd=12,bd=64,wd='<line x1="0" y1="30" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="-5" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-13" x2="0" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-3" y1="6" x2="-6" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-6" x2="1" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="1" y1="5" x2="-3" y2="6" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-6" x2="-6" y2="-5" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-11" rx="1" ry="1" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-13" x2="2" y2="-13" fill="none" stroke="black" stroke-width="1"/>',vd=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],kd=[{name:"open",type:"boolean",default:!1,label:"断开"}],_d={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_21/en_60617_07_21_09.elmt",qetEnglishName:"Fuse switch-disconnector; On-load isolating fuse switch"},uk={id:md,name:hd,category:pd,description:gd,viewBox:yd,width:xd,height:bd,svg:wd,terminals:vd,state:kd,source:_d},fk=Object.freeze(Object.defineProperty({__proto__:null,category:pd,default:uk,description:gd,height:bd,id:md,name:hd,source:_d,state:kd,svg:wd,terminals:vd,viewBox:yd,width:xd},Symbol.toStringTag,{value:"Module"})),$d="fuse",Sd="熔断器 (FU)",jd="switching",Ed="-7 -32 14 64",Nd=14,Md=64,Td='<line x1="0" y1="-30" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><rect x="-5" y="-15" width="10" height="30" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Ad=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],Cd=[{name:"blown",type:"boolean",default:!1,label:"熔断"}],Id={x:7,y:-2,anchor:"start"},Pd={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_21/en_60617_07_21_01.elmt",qetEnglishName:"Fuse, general symbol"},mk={id:$d,name:Sd,category:jd,viewBox:Ed,width:Nd,height:Md,svg:Td,terminals:Ad,state:Cd,label:Id,source:Pd},hk=Object.freeze(Object.defineProperty({__proto__:null,category:jd,default:mk,height:Md,id:$d,label:Id,name:Sd,source:Pd,state:Cd,svg:Td,terminals:Ad,viewBox:Ed,width:Nd},Symbol.toStringTag,{value:"Module"})),Od="generator",Bd="发电机 (G)",Ld="source",zd="-42 -42 44 44",Rd=44,Dd=44,Fd='<rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-24" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">G</text>',Hd=[{id:"t_bottom",x:-20,y:0,orientation:"s"}],Wd={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_16/en_60617_06_16_01.elmt",qetEnglishName:"Generator, general symbol"},pk={id:Od,name:Bd,category:Ld,viewBox:zd,width:Rd,height:Dd,svg:Fd,terminals:Hd,source:Wd},gk=Object.freeze(Object.defineProperty({__proto__:null,category:Ld,default:pk,height:Dd,id:Od,name:Bd,source:Wd,svg:Fd,terminals:Hd,viewBox:zd,width:Rd},Symbol.toStringTag,{value:"Module"})),qd="genset",Gd="发电机组 (G)",Xd="source",Yd="柴油 / 燃气发电机组。",Kd="-28 -22 56 64",Vd=56,Ud=64,Jd='<rect x="-26" y="-20" width="52" height="40" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">GEN</text><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Zd=[{id:"t_out",x:0,y:40,orientation:"s"}],Qd=[{name:"P",label:"功率",type:"number",unit:"kW",showOnCanvas:!0}],eu={kind:"inline"},yk={id:qd,name:Gd,category:Xd,description:Yd,viewBox:Kd,width:Vd,height:Ud,svg:Jd,terminals:Zd,params:Qd,source:eu},xk=Object.freeze(Object.defineProperty({__proto__:null,category:Xd,default:yk,description:Yd,height:Ud,id:qd,name:Gd,params:Qd,source:eu,svg:Jd,terminals:Zd,viewBox:Kd,width:Vd},Symbol.toStringTag,{value:"Module"})),tu="gfci-breaker",nu="GFCI 断路器 (RCBO)",ou="protection",ru="剩余电流断路器带过流保护 (UL943 / IEC 61009)。北美 GFCI / 欧洲 RCBO。",su="-18 -22 22 44",iu=22,au=44,lu='<text x="-14" y="13.8" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">IΔ</text><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-12" x2="2" y2="-8" fill="none" stroke="black" stroke-width="1"/><polyline points="-5,-10 0,10 0,20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-4" x2="-8" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><line x1="-8" y1="-4" x2="-8" y2="-8" fill="none" stroke="black" stroke-width="0.4"/><line x1="-13" y1="-8" x2="-8" y2="-8" fill="none" stroke="black" stroke-width="0.4"/><line x1="-13" y1="-8" x2="-13" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><line x1="-16" y1="-4" x2="-13" y2="-4" fill="none" stroke="black" stroke-width="0.4"/><path d="M -8 1 A 2.5 3.5 0 0 0 -13 1" fill="none" stroke="black" stroke-width="0.4"/><line x1="-8" y1="1" x2="-2" y2="1" fill="none" stroke="black" stroke-width="0.4"/><line x1="-16" y1="1" x2="-13" y2="1" fill="none" stroke="black" stroke-width="0.4"/>',cu=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],du=[{name:"open",type:"boolean",default:!1,label:"断开"}],uu=[{name:"In",label:"额定电流",type:"number",unit:"A"},{name:"IDn",label:"剩余动作电流",type:"number",unit:"mA",default:30}],fu={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/50_residual_current_circuit_breaker/rcbo.elmt",qetEnglishName:"Residual Circuit Breaker with Overload"},bk={id:tu,name:nu,category:ou,description:ru,viewBox:su,width:iu,height:au,svg:lu,terminals:cu,state:du,params:uu,source:fu},wk=Object.freeze(Object.defineProperty({__proto__:null,category:ou,default:bk,description:ru,height:au,id:tu,name:nu,params:uu,source:fu,state:du,svg:lu,terminals:cu,viewBox:su,width:iu},Symbol.toStringTag,{value:"Module"})),mu="grid-source",hu="系统电源",pu="source",gu="无穷大母线 / 外部电网",yu="-16 -31 32 53",xu=32,bu=53,wu='<circle cx="0" cy="-15" r="14" fill="none" stroke="black" stroke-width="1"/><text x="0" y="-12" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="14">~</text><line x1="0" y1="-1" x2="0" y2="20" stroke="black" stroke-width="1" fill="none"/>',vu=[{id:"t_bottom",x:0,y:20,orientation:"s"}],ku={kind:"inline"},vk={id:mu,name:hu,category:pu,description:gu,viewBox:yu,width:xu,height:bu,svg:wu,terminals:vu,source:ku},kk=Object.freeze(Object.defineProperty({__proto__:null,category:pu,default:vk,description:gu,height:bu,id:mu,name:hu,source:ku,svg:wu,terminals:vu,viewBox:yu,width:xu},Symbol.toStringTag,{value:"Module"})),_u="grounding-transformer",$u="接地变 (Z形)",Su="grounding",ju="星-曲折接线变压器,中性点接地用",Eu="-62 -152 64 164",Nu=64,Mu=164,Tu='<line x1="-30" y1="-40" x2="-35" y2="-35" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-25" y2="-35" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-90" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-35" x2="-40" y2="-38" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-150" x2="-30" y2="-120" fill="none" stroke="black" stroke-width="1"/><line x1="-25" y1="-35" x2="-25" y2="-30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-30" y2="-45" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-20" x2="-30" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-45" x2="-25" y2="-48" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-130" x2="-20" y2="-140" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="-135" x2="-20" y2="-145" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="0" x2="-20" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="5" x2="-20" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-85" x2="-30" y2="-95" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-95" x2="-20" y2="-100" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-95" x2="-40" y2="-100" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-40" x2="-20" y2="-40" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-40" rx="2" ry="2" fill="black" stroke="black" stroke-width="1"/>',Au=[{id:"t1",x:-30,y:-150,orientation:"n"},{id:"t2",x:-30,y:10,orientation:"s"}],Cu={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_10/en_60617_06_10_15.elmt",qetEnglishName:"Three-phase transformer, connection star-zigzag with the neutral brought out"},_k={id:_u,name:$u,category:Su,description:ju,viewBox:Eu,width:Nu,height:Mu,svg:Tu,terminals:Au,source:Cu},$k=Object.freeze(Object.defineProperty({__proto__:null,category:Su,default:_k,description:ju,height:Mu,id:_u,name:$u,source:Cu,svg:Tu,terminals:Au,viewBox:Eu,width:Nu},Symbol.toStringTag,{value:"Module"})),Iu="heater",Pu="电加热器 (EH)",Ou="load",Bu="电阻加热元件 / 电热负荷。",Lu="-22 -7 54 14",zu=54,Ru=14,Du='<line x1="-20" y1="0" x2="-10" y2="0" fill="none" stroke="black" stroke-width="1"/><rect x="-10" y="-5" width="30" height="10" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="0" x2="30" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-5" x2="-5" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="5" y1="-5" x2="5" y2="5" fill="none" stroke="black" stroke-width="1"/><line x1="15" y1="-5" x2="15" y2="5" fill="none" stroke="black" stroke-width="1"/>',Fu=[{id:"t1",x:-20,y:0,orientation:"w"},{id:"t2",x:30,y:0,orientation:"e"}],Hu=[{name:"P",label:"功率",type:"number",unit:"kW",showOnCanvas:!0}],Wu={kind:"elmt",path:"91_en_60617/en_60617_04/en_60617_04_01/en_60617_04_01_12.elmt",qetEnglishName:"Heating element"},Sk={id:Iu,name:Pu,category:Ou,description:Bu,viewBox:Lu,width:zu,height:Ru,svg:Du,terminals:Fu,params:Hu,source:Wu},jk=Object.freeze(Object.defineProperty({__proto__:null,category:Ou,default:Sk,description:Bu,height:Ru,id:Iu,name:Pu,params:Hu,source:Wu,svg:Du,terminals:Fu,viewBox:Lu,width:zu},Symbol.toStringTag,{value:"Module"})),qu="igbt",Gu="绝缘栅双极晶体管 (IGBT)",Xu="passive",Yu="N 沟道增强型 IGBT。t1=集电极(上), t2=发射极(下), t_g=门极。",Ku="-32 -32 54 74",Vu=54,Uu=74,Ju='<line x1="0" y1="25" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polyline points="-30,20 -5,20 -5,-20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-15" x2="20" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="20" y2="40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="15" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-25" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-8" x2="0" y2="8" fill="none" stroke="black" stroke-width="1"/><polyline points="10,-24 8,-21 12,-22" fill="none" stroke="black" stroke-width="1"/><polyline points="10,25 11,29 8,27" fill="none" stroke="black" stroke-width="1"/>',Zu=[{id:"t1",x:20,y:-30,orientation:"n"},{id:"t2",x:20,y:40,orientation:"s"},{id:"t_g",x:-30,y:20,orientation:"w"}],Qu={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_05/en_60617_05_05_19.elmt",qetEnglishName:"Insulated-gate bipolar transistor (IGBT) enhancement type, N channel"},Ek={id:qu,name:Gu,category:Xu,description:Yu,viewBox:Ku,width:Vu,height:Uu,svg:Ju,terminals:Zu,source:Qu},Nk=Object.freeze(Object.defineProperty({__proto__:null,category:Xu,default:Ek,description:Yu,height:Uu,id:qu,name:Gu,source:Qu,svg:Ju,terminals:Zu,viewBox:Ku,width:Vu},Symbol.toStringTag,{value:"Module"})),ef="indicator-light",tf="指示灯 (HL)",nf="control",of="信号 / 状态指示灯。",rf="-12 -22 24 24",sf=24,af=24,lf='<ellipse cx="0" cy="-10" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-3" x2="7" y2="-17" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-17" x2="7" y2="-3" fill="none" stroke="black" stroke-width="1"/>',cf=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],df=[{name:"color",label:"颜色",type:"string"}],uf={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_01.elmt",qetEnglishName:"Lamp, general symbol"},Mk={id:ef,name:tf,category:nf,description:of,viewBox:rf,width:sf,height:af,svg:lf,terminals:cf,params:df,source:uf},Tk=Object.freeze(Object.defineProperty({__proto__:null,category:nf,default:Mk,description:of,height:af,id:ef,name:tf,params:df,source:uf,svg:lf,terminals:cf,viewBox:rf,width:sf},Symbol.toStringTag,{value:"Module"})),ff="inductor",mf="电感 (L)",hf="passive",pf="通用电感 / 线圈 / 扼流圈。",gf="-17 -32 34 64",yf=34,xf=64,bf='<line x1="0" y1="15" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><path d="M 0 15 A 15 15 0 1 0 -15 0" fill="none" stroke="black" stroke-width="1"/><line x1="-15" y1="0" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/>',wf=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],vf=[{name:"L",label:"电感量",type:"number",unit:"mH",showOnCanvas:!0},{name:"In",label:"额定电流",type:"number",unit:"A"}],kf={x:6,y:0,anchor:"start"},_f={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/30_inductors/inductance.elmt",qetEnglishName:"Inductor"},Ak={id:ff,name:mf,category:hf,description:pf,viewBox:gf,width:yf,height:xf,svg:bf,terminals:wf,params:vf,label:kf,source:_f},Ck=Object.freeze(Object.defineProperty({__proto__:null,category:hf,default:Ak,description:pf,height:xf,id:ff,label:kf,name:mf,params:vf,source:_f,svg:bf,terminals:wf,viewBox:gf,width:yf},Symbol.toStringTag,{value:"Module"})),$f="inverter",Sf="逆变器 (DC→AC)",jf="renewable",Ef="-42 -42 44 44",Nf=44,Mf=44,Tf='<path d="M -15 -8 A 5 2.5 0 0 0 -25 -8" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><path d="M -15 -8 A 5 2.5 0 0 0 -5 -8" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-36" y1="-36" x2="-20" y2="-36" fill="none" stroke="black" stroke-width="1"/><line x1="-36" y1="-32" x2="-30" y2="-32" fill="none" stroke="black" stroke-width="1"/><line x1="-26" y1="-32" x2="-20" y2="-32" fill="none" stroke="black" stroke-width="1"/>',Af=[{id:"t_dc",x:-20,y:-40,orientation:"n"},{id:"t_ac",x:-20,y:0,orientation:"s"}],Cf={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_05.elmt",qetEnglishName:"Inverter"},Ik={id:$f,name:Sf,category:jf,viewBox:Ef,width:Nf,height:Mf,svg:Tf,terminals:Af,source:Cf},Pk=Object.freeze(Object.defineProperty({__proto__:null,category:jf,default:Ik,height:Mf,id:$f,name:Sf,source:Cf,svg:Tf,terminals:Af,viewBox:Ef,width:Nf},Symbol.toStringTag,{value:"Module"})),If="limit-switch",Pf="限位开关 (SQ)",Of="control",Bf="行程 / 位置开关 (常开, 机械操作)。",Lf="-10 -42 12 64",zf=12,Rf=64,Df='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-13" x2="-7" y2="-12" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="-12" x2="-3" y2="-8" fill="none" stroke="black" stroke-width="1"/>',Ff=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Hf=[{name:"closed",type:"boolean",default:!1,label:"闭合"}],Wf={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_08/en_60617_07_08_01.elmt",qetEnglishName:"Position switch, make contact"},Ok={id:If,name:Pf,category:Of,description:Bf,viewBox:Lf,width:zf,height:Rf,svg:Df,terminals:Ff,state:Hf,source:Wf},Bk=Object.freeze(Object.defineProperty({__proto__:null,category:Of,default:Ok,description:Bf,height:Rf,id:If,name:Pf,source:Wf,state:Hf,svg:Df,terminals:Ff,viewBox:Lf,width:zf},Symbol.toStringTag,{value:"Module"})),qf="load-switch",Gf="负荷开关",Xf="switching",Yf="-10 -42 14 64",Kf=14,Vf=64,Uf='<line x1="0" y1="-24" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-22" rx="2" ry="2" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-24" x2="2" y2="-24" fill="none" stroke="black" stroke-width="1"/>',Jf=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],Zf=[{name:"open",type:"boolean",default:!1,label:"断开"}],Qf={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_13/en_60617_07_13_08.elmt",qetEnglishName:"Switch-disconnector; On-load isolating switch"},Lk={id:qf,name:Gf,category:Xf,viewBox:Yf,width:Kf,height:Vf,svg:Uf,terminals:Jf,state:Zf,source:Qf},zk=Object.freeze(Object.defineProperty({__proto__:null,category:Xf,default:Lk,height:Vf,id:qf,name:Gf,source:Qf,state:Zf,svg:Uf,terminals:Jf,viewBox:Yf,width:Kf},Symbol.toStringTag,{value:"Module"})),em="load",tm="负荷",nm="load",om="抽象负荷(电流流出箭头)",rm="-8 -22 16 46",sm=16,im=46,am='<line x1="0" y1="-20" x2="0" y2="10" stroke="black" stroke-width="1" fill="none"/><polygon points="-6,10 6,10 0,22" fill="black" stroke="black" stroke-width="1"/>',lm=[{id:"t_top",x:0,y:-20,orientation:"n"}],cm=[{name:"P",label:"有功功率",type:"number",unit:"MW",showOnCanvas:!0},{name:"cosphi",label:"功率因数",type:"number"}],dm={x:6,y:0,anchor:"start"},um={kind:"inline"},Rk={id:em,name:tm,category:nm,description:om,viewBox:rm,width:sm,height:im,svg:am,terminals:lm,params:cm,label:dm,source:um},Dk=Object.freeze(Object.defineProperty({__proto__:null,category:nm,default:Rk,description:om,height:im,id:em,label:dm,name:tm,params:cm,source:um,svg:am,terminals:lm,viewBox:rm,width:sm},Symbol.toStringTag,{value:"Module"})),fm="make-contact",mm="常开触点 (NO)",hm="control",pm="常开辅助触点 (make contact)。",gm="-10 -42 12 64",ym=12,xm=64,bm='<line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/>',wm=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],vm=[{name:"closed",type:"boolean",default:!1,label:"闭合"}],km={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_02/en_60617_07_02_01.elmt",qetEnglishName:"Make contact, general symbol; Switch, general symbol"},Fk={id:fm,name:mm,category:hm,description:pm,viewBox:gm,width:ym,height:xm,svg:bm,terminals:wm,state:vm,source:km},Hk=Object.freeze(Object.defineProperty({__proto__:null,category:hm,default:Fk,description:pm,height:xm,id:fm,name:mm,source:km,state:vm,svg:bm,terminals:wm,viewBox:gm,width:ym},Symbol.toStringTag,{value:"Module"})),_m="motor-starter",$m="电机启动器",Sm="motor-control",jm="电机启动器 (IEC 60617 通用符号)。",Em="-22 -27 44 54",Nm=44,Mm=54,Tm='<rect x="-20" y="-20" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><polyline points="-20,-20 0,-10 20,-20" fill="none" stroke="black" stroke-width="1"/>',Am=[{id:"t_top",x:0,y:-25,orientation:"n"},{id:"t_bottom",x:0,y:25,orientation:"s"}],Cm={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_14/en_60617_07_14_01.elmt",qetEnglishName:"Motor starter, general symbol"},Wk={id:_m,name:$m,category:Sm,description:jm,viewBox:Em,width:Nm,height:Mm,svg:Tm,terminals:Am,source:Cm},qk=Object.freeze(Object.defineProperty({__proto__:null,category:Sm,default:Wk,description:jm,height:Mm,id:_m,name:$m,source:Cm,svg:Tm,terminals:Am,viewBox:Em,width:Nm},Symbol.toStringTag,{value:"Module"})),Im="ngr",Pm="中性点电阻 (NGR)",Om="grounding",Bm="小电阻接地:连接变压器中性点到地",Lm="-12 -32 24 62",zm=24,Rm=62,Dm='<line x1="0" y1="-30" x2="0" y2="-15" fill="none" stroke="black" stroke-width="1"/><rect x="-6" y="-15" width="12" height="22" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="7" x2="0" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="15" x2="10" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-7" y1="19" x2="7" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="23" x2="4" y2="23" fill="none" stroke="black" stroke-width="1"/><line x1="-1.5" y1="27" x2="1.5" y2="27" fill="none" stroke="black" stroke-width="1"/>',Fm=[{id:"t_top",x:0,y:-30,orientation:"n"}],Hm=[{name:"R",label:"电阻",type:"number",unit:"Ω"}],Wm={kind:"inline"},Gk={id:Im,name:Pm,category:Om,description:Bm,viewBox:Lm,width:zm,height:Rm,svg:Dm,terminals:Fm,params:Hm,source:Wm},Xk=Object.freeze(Object.defineProperty({__proto__:null,category:Om,default:Gk,description:Bm,height:Rm,id:Im,name:Pm,params:Hm,source:Wm,svg:Dm,terminals:Fm,viewBox:Lm,width:zm},Symbol.toStringTag,{value:"Module"})),qm="overcurrent-relay",Gm="过流继电器 (50/51)",Xm="protection",Ym="过电流保护继电器 (ANSI 50/51)。",Km="-62 -62 64 64",Vm=64,Um=64,Jm='<rect x="-60" y="-60" width="60" height="60" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-48" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">5...10A</text>',Zm=[{id:"t_top",x:-30,y:-60,orientation:"n"}],Qm={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_05.elmt",qetEnglishName:"Overcurrent relay"},Yk={id:qm,name:Gm,category:Xm,description:Ym,viewBox:Km,width:Vm,height:Um,svg:Jm,terminals:Zm,source:Qm},Kk=Object.freeze(Object.defineProperty({__proto__:null,category:Xm,default:Yk,description:Ym,height:Um,id:qm,name:Gm,source:Qm,svg:Jm,terminals:Zm,viewBox:Km,width:Vm},Symbol.toStringTag,{value:"Module"})),eh="phase-failure-relay",th="断相继电器",nh="protection",oh="断相 / 缺相保护继电器。",rh="-62 -42 64 44",sh=64,ih=44,ah='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-46" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">m &lt; 3</text>',lh=[{id:"t_top",x:-30,y:-40,orientation:"n"}],ch={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_12.elmt",qetEnglishName:"Phase-failure detection relay"},Vk={id:eh,name:th,category:nh,description:oh,viewBox:rh,width:sh,height:ih,svg:ah,terminals:lh,source:ch},Uk=Object.freeze(Object.defineProperty({__proto__:null,category:nh,default:Vk,description:oh,height:ih,id:eh,name:th,source:ch,svg:ah,terminals:lh,viewBox:rh,width:sh},Symbol.toStringTag,{value:"Module"})),dh="plc",uh="PLC / 控制器",fh="control",mh="可编程逻辑控制器 (PLC)。",hh="-24 -42 48 84",ph=48,gh=84,yh='<rect x="-22" y="-22" width="44" height="44" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">PLC</text><line x1="0" y1="-40" x2="0" y2="-22" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="22" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',xh=[{id:"t_top",x:0,y:-40,orientation:"n"},{id:"t_bottom",x:0,y:40,orientation:"s"}],bh={kind:"inline"},Jk={id:dh,name:uh,category:fh,description:mh,viewBox:hh,width:ph,height:gh,svg:yh,terminals:xh,source:bh},Zk=Object.freeze(Object.defineProperty({__proto__:null,category:fh,default:Jk,description:mh,height:gh,id:dh,name:uh,source:bh,svg:yh,terminals:xh,viewBox:hh,width:ph},Symbol.toStringTag,{value:"Module"})),wh="power-factor-meter",vh="功率因数表 (cosφ)",kh="measurement",_h="功率因数表 (cosφ)。",$h="-22 -42 44 44",Sh=44,jh=44,Eh='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-14" y="-6.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">cos φ</text>',Nh=[{id:"t_top",x:0,y:-40,orientation:"n"}],Mh={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_05.elmt",qetEnglishName:"Power-factor meter"},Qk={id:wh,name:vh,category:kh,description:_h,viewBox:$h,width:Sh,height:jh,svg:Eh,terminals:Nh,source:Mh},e_=Object.freeze(Object.defineProperty({__proto__:null,category:kh,default:Qk,description:_h,height:jh,id:wh,name:vh,source:Mh,svg:Eh,terminals:Nh,viewBox:$h,width:Sh},Symbol.toStringTag,{value:"Module"})),Th="power-supply",Ah="开关电源 (PS)",Ch="source",Ih="AC→DC 开关电源 / 直流电源模块。t_ac 上(~), t_dc 下(=)。",Ph="-24 -42 48 84",Oh=48,Bh=84,Lh='<rect x="-22" y="-20" width="44" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-22" y1="20" x2="22" y2="-20" stroke="black" stroke-width="1" fill="none"/><text x="-15" y="-5" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~</text><text x="8" y="15" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">=</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',zh=[{id:"t_ac",x:0,y:-40,orientation:"n"},{id:"t_dc",x:0,y:40,orientation:"s"}],Rh=[{name:"Vdc",label:"输出电压",type:"number",unit:"V",showOnCanvas:!0}],Dh={kind:"inline"},t_={id:Th,name:Ah,category:Ch,description:Ih,viewBox:Ph,width:Oh,height:Bh,svg:Lh,terminals:zh,params:Rh,source:Dh},n_=Object.freeze(Object.defineProperty({__proto__:null,category:Ch,default:t_,description:Ih,height:Bh,id:Th,name:Ah,params:Rh,source:Dh,svg:Lh,terminals:zh,viewBox:Ph,width:Oh},Symbol.toStringTag,{value:"Module"})),Fh="protective-relay",Hh="保护继电器",Wh="protection",qh="测量继电器 / 保护继电器通用符号 (IEC 60617)。",Gh="-32 -42 64 44",Xh=64,Yh=44,Kh='<polygon points="-2,-22 2,-22 0,-25" fill="black" stroke="black" stroke-width="1"/><polygon points="-2,-22 -2,-19 -6,-20" fill="black" stroke="black" stroke-width="1"/><polygon points="2,-22 2,-19 6,-20" fill="black" stroke="black" stroke-width="1"/><polygon points="-2,-19 0,-17 -3,-15" fill="black" stroke="black" stroke-width="1"/><polygon points="0,-17 2,-19 4,-15" fill="black" stroke="black" stroke-width="1"/><rect x="-2" y="-22" width="4" height="4" rx="0" ry="0" fill="black" stroke="black" stroke-width="1"/><rect x="-30" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/>',Vh=[{id:"t_top",x:0,y:-40,orientation:"n"}],Uh={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_16/en_60617_07_16_01.elmt",qetEnglishName:"Measuring relay; Device related to a measuring relay"},o_={id:Fh,name:Hh,category:Wh,description:qh,viewBox:Gh,width:Xh,height:Yh,svg:Kh,terminals:Vh,source:Uh},r_=Object.freeze(Object.defineProperty({__proto__:null,category:Wh,default:o_,description:qh,height:Yh,id:Fh,name:Hh,source:Uh,svg:Kh,terminals:Vh,viewBox:Gh,width:Xh},Symbol.toStringTag,{value:"Module"})),Jh="proximity-switch",Zh="接近开关 (SQ)",Qh="control",e0="接近传感器 / 无触点接近开关。",t0="-12 -32 24 64",n0=24,o0=64,r0='<line x1="0" y1="-30" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="30" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polygon points="0,-10 -10,0 0,10 10,0" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-6" x2="-4" y2="6" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="-6" x2="4" y2="6" fill="none" stroke="black" stroke-width="1"/>',s0=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],i0={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_19/en_60617_07_19_01.elmt",qetEnglishName:"Proximity sensor"},s_={id:Jh,name:Zh,category:Qh,description:e0,viewBox:t0,width:n0,height:o0,svg:r0,terminals:s0,source:i0},i_=Object.freeze(Object.defineProperty({__proto__:null,category:Qh,default:s_,description:e0,height:o0,id:Jh,name:Zh,source:i0,svg:r0,terminals:s0,viewBox:t0,width:n0},Symbol.toStringTag,{value:"Module"})),a0="pt",l0="电压互感器 (PT)",c0="instrument-transformer",d0="-22 -42 44 115",u0=44,f0=115,m0='<ellipse cx="0" cy="1" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-40" x2="0" y2="-20" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="30" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="-0.13" y1="51" x2="-0.13" y2="71" fill="none" stroke="black" stroke-width="1"/>',h0=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:71,orientation:"s"}],p0={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_13/en_60617_06_13_01A.elmt",qetEnglishName:"Voltage transformer"},a_={id:a0,name:l0,category:c0,viewBox:d0,width:u0,height:f0,svg:m0,terminals:h0,source:p0},l_=Object.freeze(Object.defineProperty({__proto__:null,category:c0,default:a_,height:f0,id:a0,name:l0,source:p0,svg:m0,terminals:h0,viewBox:d0,width:u0},Symbol.toStringTag,{value:"Module"})),g0="push-button",y0="按钮 (SB)",x0="control",b0="手动按钮, 自动复位 (常开 make)。",w0="-37 -42 39 64",v0=39,k0=64,_0='<line x1="-35" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1" stroke-dasharray="4 2"/><line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-15" x2="-35" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/><line x1="-35" y1="-15" x2="-30" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-5" x2="-35" y2="-5" fill="none" stroke="black" stroke-width="1"/>',$0=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],S0={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_07/en_60617_07_07_02.elmt",qetEnglishName:"Switch, manually operated, push-button, automatic return"},c_={id:g0,name:y0,category:x0,description:b0,viewBox:w0,width:v0,height:k0,svg:_0,terminals:$0,source:S0},d_=Object.freeze(Object.defineProperty({__proto__:null,category:x0,default:c_,description:b0,height:k0,id:g0,name:y0,source:S0,svg:_0,terminals:$0,viewBox:w0,width:v0},Symbol.toStringTag,{value:"Module"})),j0="pv",E0="光伏组件",N0="renewable",M0="-33 -22 85 64",T0=85,A0=64,C0='<line x1="-16" y1="24" x2="-26" y2="14" fill="none" stroke="black" stroke-width="1"/><line x1="-21" y1="29" x2="-31" y2="19" fill="none" stroke="black" stroke-width="1"/><polygon points="-20,23 -17,20 -15,25" fill="black" stroke="black" stroke-width="1"/><polygon points="-22,25 -25,28 -20,30" fill="black" stroke="black" stroke-width="1"/><rect x="-10" y="-20" width="60" height="60" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="15" y="7.2" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">G</text><line x1="10" y1="20" x2="20" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="15" x2="20" y2="25" fill="none" stroke="black" stroke-width="1"/><line x1="25" y1="10" x2="25" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="25" y1="20" x2="35" y2="20" fill="none" stroke="black" stroke-width="1"/>',I0=[{id:"t_dc",x:50,y:10,orientation:"e"}],P0={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_18/en_60617_06_18_06.elmt",qetEnglishName:"Photovoltaic generator"},u_={id:j0,name:E0,category:N0,viewBox:M0,width:T0,height:A0,svg:C0,terminals:I0,source:P0},f_=Object.freeze(Object.defineProperty({__proto__:null,category:N0,default:u_,height:A0,id:j0,name:E0,source:P0,svg:C0,terminals:I0,viewBox:M0,width:T0},Symbol.toStringTag,{value:"Module"})),O0="rcd",B0="剩余电流装置 (RCD)",L0="protection",z0="不带过流保护的剩余电流断路器 (IEC 61008)。",R0="-12 -22 19 44",D0=19,F0=44,H0='<line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="2" y1="-12" x2="-2" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-2" y1="-12" x2="2" y2="-8" fill="none" stroke="black" stroke-width="1"/><polyline points="0,20 0,10 -7,-9" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="13" rx="4.5" ry="2" fill="none" stroke="black" stroke-width="1"/><polyline points="-4,0 -10,0 -10,13 -5,13" fill="none" stroke="black" stroke-width="0.4" stroke-dasharray="4 2"/>',W0=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],q0=[{name:"open",type:"boolean",default:!1,label:"断开"}],G0=[{name:"IDn",label:"剩余动作电流",type:"number",unit:"mA",default:30}],X0={kind:"elmt",path:"11_singlepole/200_fuses_protective_gears/50_residual_current_circuit_breaker/ddr1.elmt",qetEnglishName:"Residual Circuit Breaker with Overload"},m_={id:O0,name:B0,category:L0,description:z0,viewBox:R0,width:D0,height:F0,svg:H0,terminals:W0,state:q0,params:G0,source:X0},h_=Object.freeze(Object.defineProperty({__proto__:null,category:L0,default:m_,description:z0,height:F0,id:O0,name:B0,params:G0,source:X0,state:q0,svg:H0,terminals:W0,viewBox:R0,width:D0},Symbol.toStringTag,{value:"Module"})),Y0="recloser",K0="重合闸 (Recloser)",V0="protection",U0="中压自动重合闸开关。",J0="-12 -32 36 64",Z0=36,Q0=64,ep='<line x1="0" y1="-30" x2="0" y2="-10" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="0" x2="-8" y2="-13" stroke="black" stroke-width="1" fill="none"/><line x1="-2" y1="-8" x2="2" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="-2" y1="-12" x2="2" y2="-8" stroke="black" stroke-width="1" fill="none"/><path d="M 13 -12 A 7 7 0 1 1 6 -5" fill="none" stroke="black" stroke-width="0.8"/><polygon points="4,-7 6,-5 8,-3" fill="black"/><text x="14" y="6" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">AR</text>',tp=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],np=[{name:"open",type:"boolean",default:!1,label:"断开"}],op={kind:"inline"},p_={id:Y0,name:K0,category:V0,description:U0,viewBox:J0,width:Z0,height:Q0,svg:ep,terminals:tp,state:np,source:op},g_=Object.freeze(Object.defineProperty({__proto__:null,category:V0,default:p_,description:U0,height:Q0,id:Y0,name:K0,source:op,state:np,svg:ep,terminals:tp,viewBox:J0,width:Z0},Symbol.toStringTag,{value:"Module"})),rp="rectifier",sp="整流器 (AC→DC)",ip="renewable",ap="-42 -42 44 44",lp=44,cp=44,dp='<line x1="-40" y1="0" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><rect x="-40" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-8" x2="-4" y2="-8" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-4" x2="-14" y2="-4" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-4" x2="-4" y2="-4" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -35 -30" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -30 A 5 2.5 0 0 0 -15 -30" fill="none" stroke="black" stroke-width="1"/>',up=[{id:"t_ac",x:-20,y:-40,orientation:"n"},{id:"t_dc",x:-20,y:0,orientation:"s"}],fp={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_14/en_60617_06_14_03.elmt",qetEnglishName:"Rectifier"},y_={id:rp,name:sp,category:ip,viewBox:ap,width:lp,height:cp,svg:dp,terminals:up,source:fp},x_=Object.freeze(Object.defineProperty({__proto__:null,category:ip,default:y_,height:cp,id:rp,name:sp,source:fp,svg:dp,terminals:up,viewBox:ap,width:lp},Symbol.toStringTag,{value:"Module"})),mp="relay-coil",hp="继电器线圈 (KA)",pp="control",gp="继电器 / 接触器操作线圈 (方框)。",yp="-22 -22 44 44",xp=44,bp=44,wp='<rect x="-20" y="-10" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/>',vp=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],kp={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_15/en_60617_07_15_01.elmt",qetEnglishName:"Operating device, general symbol; Relay coil, general symbol"},b_={id:mp,name:hp,category:pp,description:gp,viewBox:yp,width:xp,height:bp,svg:wp,terminals:vp,source:kp},w_=Object.freeze(Object.defineProperty({__proto__:null,category:pp,default:b_,description:gp,height:bp,id:mp,name:hp,source:kp,svg:wp,terminals:vp,viewBox:yp,width:xp},Symbol.toStringTag,{value:"Module"})),_p="resistor",$p="电阻 (R)",Sp="passive",jp="通用电阻 / 限流 / 制动电阻。",Ep="-6 -23 12 35",Np=12,Mp=35,Tp='<line x1="0" y1="-10" x2="0" y2="-20" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="10" x2="4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="10" x2="4" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="4" y1="-10" x2="-4" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="-4" y1="-10" x2="-4" y2="10" fill="none" stroke="black" stroke-width="1"/>',Ap=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t2",x:0,y:10,orientation:"s"}],Cp=[{name:"R",label:"阻值",type:"number",unit:"Ω",showOnCanvas:!0},{name:"P",label:"额定功率",type:"number",unit:"W"}],Ip={x:6,y:0,anchor:"start"},Pp={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/10_resistors/resistance.elmt",qetEnglishName:"Resistor"},v_={id:_p,name:$p,category:Sp,description:jp,viewBox:Ep,width:Np,height:Mp,svg:Tp,terminals:Ap,params:Cp,label:Ip,source:Pp},k_=Object.freeze(Object.defineProperty({__proto__:null,category:Sp,default:v_,description:jp,height:Mp,id:_p,label:Ip,name:$p,params:Cp,source:Pp,svg:Tp,terminals:Ap,viewBox:Ep,width:Np},Symbol.toStringTag,{value:"Module"})),Op="reverse-power-relay",Bp="逆功率继电器 (32)",Lp="protection",zp="逆功率 / 逆流保护继电器 (ANSI 32)。",Rp="-62 -42 64 44",Dp=64,Fp=44,Hp='<rect x="-60" y="-40" width="60" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-46" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">I</text><polygon points="-15,-20 -30,-20 -24,-22 -24,-18 -30,-20 -24,-20" fill="black" stroke="black" stroke-width="1"/>',Wp=[{id:"t_top",x:-30,y:-40,orientation:"n"}],qp={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_02.elmt",qetEnglishName:"Reverse current relay"},__={id:Op,name:Bp,category:Lp,description:zp,viewBox:Rp,width:Dp,height:Fp,svg:Hp,terminals:Wp,source:qp},$_=Object.freeze(Object.defineProperty({__proto__:null,category:Lp,default:__,description:zp,height:Fp,id:Op,name:Bp,source:qp,svg:Hp,terminals:Wp,viewBox:Rp,width:Dp},Symbol.toStringTag,{value:"Module"})),Gp="selector-switch",Xp="选择开关 (SA)",Yp="switching",Kp="转换 / 选择开关 (旋转操作, 保位)。",Vp="-34 -42 36 64",Up=36,Jp=64,Zp='<line x1="-32" y1="-10" x2="-2" y2="-10" fill="none" stroke="black" stroke-width="1" stroke-dasharray="4 2"/><line x1="0" y1="-20" x2="0" y2="-40" fill="none" stroke="black" stroke-width="1"/><line x1="-32" y1="-15" x2="-32" y2="-5" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="0" x2="-8" y2="-23" fill="none" stroke="black" stroke-width="1"/>',Qp=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],eg=[{name:"open",type:"boolean",default:!1,label:"断开"}],tg={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_07/en_60617_07_07_04.elmt",qetEnglishName:"Switch, manually operated, turning, stay-put"},S_={id:Gp,name:Xp,category:Yp,description:Kp,viewBox:Vp,width:Up,height:Jp,svg:Zp,terminals:Qp,state:eg,source:tg},j_=Object.freeze(Object.defineProperty({__proto__:null,category:Yp,default:S_,description:Kp,height:Jp,id:Gp,name:Xp,source:tg,state:eg,svg:Zp,terminals:Qp,viewBox:Vp,width:Up},Symbol.toStringTag,{value:"Module"})),ng="series-reactor",og="串联电抗器",rg="compensation",sg="与并联电抗器同符号;通过用法区分。",ig="-62 -82 64 104",ag=64,lg=104,cg='<line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M -30 0 A 30 30 0 1 0 -60 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-60" y1="-30" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/>',dg=[{id:"t1",x:-30,y:-80,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],ug={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_08.elmt",qetEnglishName:"Choke; Reactor, general symbol"},E_={id:ng,name:og,category:rg,description:sg,viewBox:ig,width:ag,height:lg,svg:cg,terminals:dg,source:ug},N_=Object.freeze(Object.defineProperty({__proto__:null,category:rg,default:E_,description:sg,height:lg,id:ng,name:og,source:ug,svg:cg,terminals:dg,viewBox:ig,width:ag},Symbol.toStringTag,{value:"Module"})),fg="shunt-capacitor",mg="并联电容器",hg="compensation",pg="-7 -23 14 27",gg=14,yg=27,xg='<line x1="-5" y1="2" x2="5" y2="2" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="-2" x2="5" y2="-2" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-2" fill="none" stroke="black" stroke-width="1"/>',bg=[{id:"t1",x:0,y:-21,orientation:"n"},{id:"t_bottom",x:0,y:2,orientation:"s"}],wg=[{name:"Q",label:"无功容量",type:"number",unit:"Mvar"},{name:"stages",label:"分组数",type:"number"}],vg={kind:"elmt",path:"11_singlepole/395_electronics_semiconductors/20_capacitors/capacite.elmt",qetEnglishName:"Capacitor"},M_={id:fg,name:mg,category:hg,viewBox:pg,width:gg,height:yg,svg:xg,terminals:bg,params:wg,source:vg},T_=Object.freeze(Object.defineProperty({__proto__:null,category:hg,default:M_,height:yg,id:fg,name:mg,params:wg,source:vg,svg:xg,terminals:bg,viewBox:pg,width:gg},Symbol.toStringTag,{value:"Module"})),kg="shunt-reactor",_g="并联电抗器",$g="compensation",Sg="-62 -82 64 104",jg=64,Eg=104,Ng='<line x1="-30" y1="0" x2="-30" y2="20" fill="none" stroke="black" stroke-width="1"/><path d="M -30 0 A 30 30 0 1 0 -60 -30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-80" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/><line x1="-60" y1="-30" x2="-30" y2="-30" fill="none" stroke="black" stroke-width="1"/>',Mg=[{id:"t1",x:-30,y:-80,orientation:"n"},{id:"t_bottom",x:-30,y:20,orientation:"s"}],Tg={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_08.elmt",qetEnglishName:"Choke; Reactor, general symbol"},A_={id:kg,name:_g,category:$g,viewBox:Sg,width:jg,height:Eg,svg:Ng,terminals:Mg,source:Tg},C_=Object.freeze(Object.defineProperty({__proto__:null,category:$g,default:A_,height:Eg,id:kg,name:_g,source:Tg,svg:Ng,terminals:Mg,viewBox:Sg,width:jg},Symbol.toStringTag,{value:"Module"})),Ag="siren",Cg="警笛 (HA)",Ig="control",Pg="声响警笛 / 报警器。",Og="-32 -42 44 54",Bg=44,Lg=54,zg='<line x1="-20" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-10" x2="0" y2="10" fill="none" stroke="black" stroke-width="1"/><polygon points="10,-10 -30,-10 -10,-40" fill="none" stroke="black" stroke-width="1"/>',Rg=[{id:"t1",x:-20,y:10,orientation:"s"},{id:"t2",x:0,y:10,orientation:"s"}],Dg={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_10/en_60617_08_10_09.elmt",qetEnglishName:"Siren"},I_={id:Ag,name:Cg,category:Ig,description:Pg,viewBox:Og,width:Bg,height:Lg,svg:zg,terminals:Rg,source:Dg},P_=Object.freeze(Object.defineProperty({__proto__:null,category:Ig,default:I_,description:Pg,height:Lg,id:Ag,name:Cg,source:Dg,svg:zg,terminals:Rg,viewBox:Og,width:Bg},Symbol.toStringTag,{value:"Module"})),Fg="socket-outlet",Hg="插座 / 连接器",Wg="load",qg="电源插座 / 多极连接器。",Gg="-7 -2 13 34",Xg=13,Yg=34,Kg='<line x1="-5" y1="13" x2="4" y2="20" fill="none" stroke="black" stroke-width="0.4"/><line x1="-1" y1="12" x2="-1" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="12" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="9" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="1" y1="12" x2="1" y2="19" fill="none" stroke="black" stroke-width="1"/><path d="M 3 13 A 3 3 0 0 0 -3 13" fill="none" stroke="black" stroke-width="1"/>',Vg=[{id:"t1",x:0,y:0,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],Ug={kind:"elmt",path:"11_singlepole/140_connectors_plugs/prise_multipolaire_2.elmt",qetEnglishName:`Plug and multipolar representation
197
+ unifilar`},O_={id:Fg,name:Hg,category:Wg,description:qg,viewBox:Gg,width:Xg,height:Yg,svg:Kg,terminals:Vg,source:Ug},B_=Object.freeze(Object.defineProperty({__proto__:null,category:Wg,default:O_,description:qg,height:Yg,id:Fg,name:Hg,source:Ug,svg:Kg,terminals:Vg,viewBox:Gg,width:Xg},Symbol.toStringTag,{value:"Module"})),Jg="soft-starter",Zg="软启动器",Qg="motor-control",e1="电机软启动器 (晶闸管降压启动)。",t1="-22 -42 44 84",n1=44,o1=84,r1='<rect x="-20" y="-20" width="40" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-12" y1="-12" x2="12" y2="12" stroke="black" stroke-width="1" fill="none"/><polygon points="4,8 12,12 8,4" fill="none" stroke="black" stroke-width="1"/><text x="-12" y="-2" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">SS</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',s1=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],i1={kind:"inline"},L_={id:Jg,name:Zg,category:Qg,description:e1,viewBox:t1,width:n1,height:o1,svg:r1,terminals:s1,source:i1},z_=Object.freeze(Object.defineProperty({__proto__:null,category:Qg,default:L_,description:e1,height:o1,id:Jg,name:Zg,source:i1,svg:r1,terminals:s1,viewBox:t1,width:n1},Symbol.toStringTag,{value:"Module"})),a1="sync-motor",l1="同步电动机",c1="load",d1="-62 -82 64 114",u1=64,f1=114,m1='<ellipse cx="-30" cy="-30" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><text x="-34" y="-24.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">M</text><line x1="-50" y1="-80" x2="-50" y2="-53" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-53" x2="-10" y2="-80" fill="none" stroke="black" stroke-width="1"/><text x="-45" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="14" fill="#000000">1</text><path d="M -25 -20 A 5 2.5 0 0 0 -35 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -25 -20 A 5 2.5 0 0 0 -15 -20" fill="none" stroke="black" stroke-width="1"/><path d="M -40 10 A 5 5 0 0 0 -50 10" fill="none" stroke="black" stroke-width="1"/><path d="M -30 10 A 5 5 0 0 0 -40 10" fill="none" stroke="black" stroke-width="1"/><path d="M -20 10 A 5 5 0 0 0 -30 10" fill="none" stroke="black" stroke-width="1"/><path d="M -10 10 A 5 5 0 0 0 -20 10" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="10" x2="-50" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="10" x2="-10" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="15" x2="-20" y2="15" fill="none" stroke="black" stroke-width="1"/><line x1="-40" y1="20" x2="-32" y2="20" fill="none" stroke="black" stroke-width="1"/><line x1="-27" y1="20" x2="-20" y2="20" fill="none" stroke="black" stroke-width="1"/>',h1=[{id:"t1",x:-10,y:-80,orientation:"n"},{id:"t2",x:-50,y:-80,orientation:"n"}],p1={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_07/en_60617_06_07_02.elmt",qetEnglishName:"Synchronous motor, single-phase"},R_={id:a1,name:l1,category:c1,viewBox:d1,width:u1,height:f1,svg:m1,terminals:h1,source:p1},D_=Object.freeze(Object.defineProperty({__proto__:null,category:c1,default:R_,height:f1,id:a1,name:l1,source:p1,svg:m1,terminals:h1,viewBox:d1,width:u1},Symbol.toStringTag,{value:"Module"})),g1="synchronoscope",y1="同步表",x1="measurement",b1="同步指示器 / 同步表。",w1="-22 -42 44 44",v1=44,k1=44,_1='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-5" x2="0" y2="-35" fill="none" stroke="black" stroke-width="1"/><path d="M 12.374 -30.374 A 17.5 17.5 0 0 0 -12.374 -30.374" fill="none" stroke="black" stroke-width="1"/><polygon points="-13,-30 -11,-33 -10,-31" fill="none" stroke="black" stroke-width="1"/><polygon points="11,-33 13,-30 10,-31" fill="none" stroke="black" stroke-width="1"/>',$1=[{id:"t_top",x:0,y:-40,orientation:"n"}],S1={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_08.elmt",qetEnglishName:"Synchronoscope"},F_={id:g1,name:y1,category:x1,description:b1,viewBox:w1,width:v1,height:k1,svg:_1,terminals:$1,source:S1},H_=Object.freeze(Object.defineProperty({__proto__:null,category:x1,default:F_,description:b1,height:k1,id:g1,name:y1,source:S1,svg:_1,terminals:$1,viewBox:w1,width:v1},Symbol.toStringTag,{value:"Module"})),j1="terminal",E1="接线端子 / 节点 (X)",N1="busbar",M1="接线端子 / 接线盒 / 汇接节点。",T1="-5 -5 10 10",A1=10,C1=10,I1='<ellipse cx="0" cy="0" rx="2.5" ry="2.5" fill="black" stroke="black" stroke-width="1"/>',P1=[{id:"t_top",x:0,y:-2.5,orientation:"n"},{id:"t_bottom",x:0,y:2.5,orientation:"s"},{id:"t_left",x:-2.5,y:0,orientation:"w"},{id:"t_right",x:2.5,y:0,orientation:"e"}],O1={kind:"elmt",path:"91_en_60617/en_60617_03/en_60617_03_02/en_60617_03_02_02.elmt",qetEnglishName:"Terminal"},W_={id:j1,name:E1,category:N1,description:M1,viewBox:T1,width:A1,height:C1,svg:I1,terminals:P1,source:O1},q_=Object.freeze(Object.defineProperty({__proto__:null,category:N1,default:W_,description:M1,height:C1,id:j1,name:E1,source:O1,svg:I1,terminals:P1,viewBox:T1,width:A1},Symbol.toStringTag,{value:"Module"})),B1="thermal-overload",L1="热过载继电器",z1="motor-control",R1="电机热过载保护继电器, 通常串接在接触器和电机之间。",D1="-9 -32 19 64",F1=19,H1=64,W1='<line x1="0" y1="-30" x2="0" y2="-15" stroke="black" stroke-width="1" fill="none"/><rect x="-7" y="-15" width="14" height="30" fill="none" stroke="black" stroke-width="1"/><polyline points="-4,-10 -1,-5 -4,0 -1,5 -4,10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/>',q1=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],G1=[{name:"tripped",type:"boolean",default:!1,label:"动作"}],X1={kind:"inline"},G_={id:B1,name:L1,category:z1,description:R1,viewBox:D1,width:F1,height:H1,svg:W1,terminals:q1,state:G1,source:X1},X_=Object.freeze(Object.defineProperty({__proto__:null,category:z1,default:G_,description:R1,height:H1,id:B1,name:L1,source:X1,state:G1,svg:W1,terminals:q1,viewBox:D1,width:F1},Symbol.toStringTag,{value:"Module"})),Y1="thermocouple",K1="热电偶 (BT)",V1="measurement",U1="热电偶温度传感器。",J1="-26 -42 52 46",Z1=52,Q1=46,ey='<ellipse cx="0" cy="0" rx="2" ry="2" fill="black" stroke="black" stroke-width="1"/><polyline points="-10,-40 -10,-15 0,0 10,-15 10,-40" fill="none" stroke="black" stroke-width="1"/><line x1="-24" y1="-16" x2="-16" y2="-16" fill="none" stroke="black" stroke-width="1"/><line x1="16" y1="-16" x2="24" y2="-16" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="-20" x2="20" y2="-12" fill="none" stroke="black" stroke-width="1"/>',ty=[{id:"t1",x:10,y:-40,orientation:"n"},{id:"t2",x:-10,y:-40,orientation:"n"}],ny={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_06/en_60617_08_06_01.elmt",qetEnglishName:"Thermocouple"},Y_={id:Y1,name:K1,category:V1,description:U1,viewBox:J1,width:Z1,height:Q1,svg:ey,terminals:ty,source:ny},K_=Object.freeze(Object.defineProperty({__proto__:null,category:V1,default:Y_,description:U1,height:Q1,id:Y1,name:K1,source:ny,svg:ey,terminals:ty,viewBox:J1,width:Z1},Symbol.toStringTag,{value:"Module"})),oy="thyristor",ry="晶闸管 (V)",sy="passive",iy="反向阻断三极晶闸管 / SCR。t1=阳极(上), t2=阴极(下)。",ay="-22 -42 34 44",ly=34,cy=44,dy='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/><line x1="10" y1="-20" x2="-10" y2="-20" fill="none" stroke="black" stroke-width="1"/><polyline points="-20,0 -7,0 -4,-10" fill="none" stroke="black" stroke-width="1"/>',uy=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],fy={x:6,y:-20,anchor:"start"},my={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_04/en_60617_05_04_06.elmt",qetEnglishName:"Reverse blocking triode thyristor, P-gate (cathode-side controlled)"},V_={id:oy,name:ry,category:sy,description:iy,viewBox:ay,width:ly,height:cy,svg:dy,terminals:uy,label:fy,source:my},U_=Object.freeze(Object.defineProperty({__proto__:null,category:sy,default:V_,description:iy,height:cy,id:oy,label:fy,name:ry,source:my,svg:dy,terminals:uy,viewBox:ay,width:ly},Symbol.toStringTag,{value:"Module"})),hy="time-relay",py="时间继电器 (KT)",gy="control",yy="延时 (缓动) 继电器线圈。",xy="-32 -22 54 44",by=54,wy=44,vy='<rect x="-20" y="-10" width="40" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="-10" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="10" x2="0" y2="20" fill="none" stroke="black" stroke-width="1"/><rect x="-30" y="-10" width="10" height="20" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-10" x2="-20" y2="10" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="10" x2="-20" y2="-10" fill="none" stroke="black" stroke-width="1"/>',ky=[{id:"t1",x:0,y:-20,orientation:"n"},{id:"t2",x:0,y:20,orientation:"s"}],_y={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_15/en_60617_07_15_08.elmt",qetEnglishName:"Relay coil of a slow-operating relay"},J_={id:hy,name:py,category:gy,description:yy,viewBox:xy,width:by,height:wy,svg:vy,terminals:ky,source:_y},Z_=Object.freeze(Object.defineProperty({__proto__:null,category:gy,default:J_,description:yy,height:wy,id:hy,name:py,source:_y,svg:vy,terminals:ky,viewBox:xy,width:by},Symbol.toStringTag,{value:"Module"})),$y="transfer-switch",Sy="切换开关 (ATS)",jy="switching",Ey="双源切换开关 (Automatic / Manual Transfer Switch)。两个电源输入 + 一个负荷输出, 互锁不并联。",Ny="-27 -32 51 64",My=51,Ty=64,Ay='<line x1="-15" y1="-30" x2="-15" y2="-12" stroke="black" stroke-width="1" fill="none"/><line x1="15" y1="-30" x2="15" y2="-12" stroke="black" stroke-width="1" fill="none"/><text x="-25" y="-20" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">N</text><text x="19" y="-20" font-family="Liberation Sans, Arial, sans-serif" font-size="6" fill="#000000">E</text><circle cx="-15" cy="-10" r="1.5" fill="black"/><circle cx="15" cy="-10" r="1.5" fill="black"/><circle cx="0" cy="6" r="1.5" fill="black"/><line x1="-15" y1="-10" x2="0" y2="6" stroke="black" stroke-width="1" fill="none"/><line x1="15" y1="-10" x2="0" y2="6" stroke="black" stroke-width="0.6" fill="none" stroke-dasharray="2 1.5"/><line x1="0" y1="6" x2="0" y2="30" stroke="black" stroke-width="1" fill="none"/>',Cy=[{id:"t_normal",x:-15,y:-30,orientation:"n"},{id:"t_emergency",x:15,y:-30,orientation:"n"},{id:"t_load",x:0,y:30,orientation:"s"}],Iy=[{name:"position",type:"string",default:"normal",label:"位置 (normal/emergency/off)"}],Py={kind:"inline"},Q_={id:$y,name:Sy,category:jy,description:Ey,viewBox:Ny,width:My,height:Ty,svg:Ay,terminals:Cy,state:Iy,source:Py},e$=Object.freeze(Object.defineProperty({__proto__:null,category:jy,default:Q_,description:Ey,height:Ty,id:$y,name:Sy,source:Py,state:Iy,svg:Ay,terminals:Cy,viewBox:Ny,width:My},Symbol.toStringTag,{value:"Module"})),Oy="transformer-2w",By="双绕组变压器",Ly="transformer",zy="-62 -142 64 144",Ry=64,Dy=144,Fy='<ellipse cx="-30" cy="-90" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-140" x2="-30" y2="-120" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-30" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-30" y1="-20" x2="-30" y2="0" fill="none" stroke="black" stroke-width="1"/>',Hy=[{id:"t1",x:-30,y:-140,orientation:"n"},{id:"t2",x:-30,y:0,orientation:"s"}],Wy=[{name:"S",label:"容量",type:"number",unit:"MVA",showOnCanvas:!0},{name:"ratio",label:"变比",type:"string",showOnCanvas:!0}],qy={x:4,y:-68,anchor:"start"},Gy={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_01.elmt",qetEnglishName:"Transformer with two windings, general symbol"},t$={id:Oy,name:By,category:Ly,viewBox:zy,width:Ry,height:Dy,svg:Fy,terminals:Hy,params:Wy,label:qy,source:Gy},n$=Object.freeze(Object.defineProperty({__proto__:null,category:Ly,default:t$,height:Dy,id:Oy,label:qy,name:By,params:Wy,source:Gy,svg:Fy,terminals:Hy,viewBox:zy,width:Ry},Symbol.toStringTag,{value:"Module"})),Xy="transformer-3w",Yy="三绕组变压器",Ky="transformer",Vy="-82 -131 114 133",Uy=114,Jy=133,Zy='<ellipse cx="-30" cy="-80" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-31" y1="-129" x2="-31" y2="-109" fill="none" stroke="black" stroke-width="1"/><ellipse cx="-50" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-50" rx="30" ry="30" fill="none" stroke="black" stroke-width="1"/><line x1="-50" y1="-20" x2="-50" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-20" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/>',Qy=[{id:"t1",x:-31,y:-129,orientation:"n"},{id:"t_low_left",x:-50,y:0,orientation:"s"},{id:"t_low_right",x:0,y:0,orientation:"s"}],ex={x:4,y:-64,anchor:"start"},tx={kind:"elmt",path:"91_en_60617/en_60617_06/en_60617_06_09/en_60617_06_09_04.elmt",qetEnglishName:"Transformer with three windings, general symbol"},o$={id:Xy,name:Yy,category:Ky,viewBox:Vy,width:Uy,height:Jy,svg:Zy,terminals:Qy,label:ex,source:tx},r$=Object.freeze(Object.defineProperty({__proto__:null,category:Ky,default:o$,height:Jy,id:Xy,label:ex,name:Yy,source:tx,svg:Zy,terminals:Qy,viewBox:Vy,width:Uy},Symbol.toStringTag,{value:"Module"})),nx="triac",ox="双向晶闸管 (V)",rx="passive",sx="双向三极晶闸管 (TRIAC)。",ix="-22 -42 44 44",ax=44,lx=44,cx='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-20" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-20,-30 0,-30 -10,-10" fill="none" stroke="black" stroke-width="1"/><line x1="20" y1="-30" x2="-10" y2="-30" fill="none" stroke="black" stroke-width="1"/><polygon points="0,-10 10,-30 20,-10" fill="none" stroke="black" stroke-width="1"/><polyline points="20,0 18,0 14,-10" fill="none" stroke="black" stroke-width="1"/>',dx=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],ux={x:6,y:-20,anchor:"start"},fx={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_04/en_60617_05_04_11.elmt",qetEnglishName:"Bidirectional triode thyristor; Triac"},s$={id:nx,name:ox,category:rx,description:sx,viewBox:ix,width:ax,height:lx,svg:cx,terminals:dx,label:ux,source:fx},i$=Object.freeze(Object.defineProperty({__proto__:null,category:rx,default:s$,description:sx,height:lx,id:nx,label:ux,name:ox,source:fx,svg:cx,terminals:dx,viewBox:ix,width:ax},Symbol.toStringTag,{value:"Module"})),mx="undervoltage-relay",hx="欠压继电器 (27)",px="protection",gx="欠电压保护继电器 (ANSI 27)。",yx="-62 -82 64 84",xx=64,bx=84,wx='<rect x="-60" y="-80" width="60" height="80" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-49" y="-7.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">130 %</text><text x="-55" y="-32.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">50...80 V</text><text x="-41" y="-53.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">U &lt;</text>',vx=[{id:"t_top",x:-30,y:-80,orientation:"n"}],kx={kind:"elmt",path:"91_en_60617/en_60617_07/en_60617_07_17/en_60617_07_17_07.elmt",qetEnglishName:"Undervoltage relay"},a$={id:mx,name:hx,category:px,description:gx,viewBox:yx,width:xx,height:bx,svg:wx,terminals:vx,source:kx},l$=Object.freeze(Object.defineProperty({__proto__:null,category:px,default:a$,description:gx,height:bx,id:mx,name:hx,source:kx,svg:wx,terminals:vx,viewBox:yx,width:xx},Symbol.toStringTag,{value:"Module"})),_x="ups",$x="不间断电源 (UPS)",Sx="source",jx="在线 / 后备式不间断电源。",Ex="-26 -42 52 84",Nx=52,Mx=84,Tx='<rect x="-24" y="-20" width="48" height="40" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="11" fill="#000000">UPS</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Ax=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],Cx=[{name:"S",label:"容量",type:"number",unit:"kVA"}],Ix={kind:"inline"},c$={id:_x,name:$x,category:Sx,description:jx,viewBox:Ex,width:Nx,height:Mx,svg:Tx,terminals:Ax,params:Cx,source:Ix},d$=Object.freeze(Object.defineProperty({__proto__:null,category:Sx,default:c$,description:jx,height:Mx,id:_x,name:$x,params:Cx,source:Ix,svg:Tx,terminals:Ax,viewBox:Ex,width:Nx},Symbol.toStringTag,{value:"Module"})),Px="varmeter",Ox="无功功率表 (var)",Bx="measurement",Lx="无功功率表 (var)。",zx="-22 -42 44 44",Rx=44,Dx=44,Fx='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-8" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">var</text>',Hx=[{id:"t_top",x:0,y:-40,orientation:"n"}],Wx={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_04.elmt",qetEnglishName:"Varmeter"},u$={id:Px,name:Ox,category:Bx,description:Lx,viewBox:zx,width:Rx,height:Dx,svg:Fx,terminals:Hx,source:Wx},f$=Object.freeze(Object.defineProperty({__proto__:null,category:Bx,default:u$,description:Lx,height:Dx,id:Px,name:Ox,source:Wx,svg:Fx,terminals:Hx,viewBox:zx,width:Rx},Symbol.toStringTag,{value:"Module"})),qx="vfd",Gx="变频器 (VFD)",Xx="motor-control",Yx="Variable Frequency Drive — 异步电动机调速。",Kx="-24 -42 48 84",Vx=48,Ux=84,Jx='<rect x="-22" y="-20" width="44" height="40" fill="none" stroke="black" stroke-width="1"/><line x1="-22" y1="20" x2="22" y2="-20" stroke="black" stroke-width="1" fill="none"/><text x="-15" y="-5" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~</text><text x="6" y="14" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">~f</text><line x1="0" y1="-40" x2="0" y2="-20" stroke="black" stroke-width="1" fill="none"/><line x1="0" y1="20" x2="0" y2="40" stroke="black" stroke-width="1" fill="none"/>',Zx=[{id:"t_in",x:0,y:-40,orientation:"n"},{id:"t_out",x:0,y:40,orientation:"s"}],Qx={kind:"inline"},m$={id:qx,name:Gx,category:Xx,description:Yx,viewBox:Kx,width:Vx,height:Ux,svg:Jx,terminals:Zx,source:Qx},h$=Object.freeze(Object.defineProperty({__proto__:null,category:Xx,default:m$,description:Yx,height:Ux,id:qx,name:Gx,source:Qx,svg:Jx,terminals:Zx,viewBox:Kx,width:Vx},Symbol.toStringTag,{value:"Module"})),eb="voltage-regulator",tb="调压器 (T)",nb="transformer",ob="可调感应调压器 / 自耦调压器。",rb="-17 -32 38 64",sb=38,ib=64,ab='<line x1="-5" y1="21" x2="5" y2="17" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-16.05" x2="4.95" y2="-20.05" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="-5" rx="10" ry="10" fill="none" stroke="black" stroke-width="1"/><ellipse cx="0" cy="0" rx="15" ry="15" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-20.05" x2="4.95" y2="-24.05" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="23" x2="5" y2="19" fill="none" stroke="black" stroke-width="1"/><line x1="-5.05" y1="-18.05" x2="4.95" y2="-22.05" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-30" x2="0" y2="-15" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="15" x2="0" y2="30" fill="none" stroke="black" stroke-width="1"/><line x1="-5" y1="25" x2="5" y2="21" fill="none" stroke="black" stroke-width="1"/><line x1="-15" y1="15" x2="15" y2="-15" fill="none" stroke="black" stroke-width="1"/><polygon points="13,-16 16,-13 19,-19" fill="black" stroke="black" stroke-width="0.4"/>',lb=[{id:"t1",x:0,y:-30,orientation:"n"},{id:"t2",x:0,y:30,orientation:"s"}],cb=[{name:"ratio",label:"调压范围",type:"string",showOnCanvas:!0}],db={kind:"elmt",path:"11_singlepole/340_converters_inverters/10_converters/regulator_ind_3f_1.elmt",qetEnglishName:"Voltage regulator"},p$={id:eb,name:tb,category:nb,description:ob,viewBox:rb,width:sb,height:ib,svg:ab,terminals:lb,params:cb,source:db},g$=Object.freeze(Object.defineProperty({__proto__:null,category:nb,default:p$,description:ob,height:ib,id:eb,name:tb,params:cb,source:db,svg:ab,terminals:lb,viewBox:rb,width:sb},Symbol.toStringTag,{value:"Module"})),ub="voltmeter",fb="电压表 (V)",mb="measurement",hb="-22 -42 44 44",pb=44,gb=44,yb='<ellipse cx="0" cy="-20" rx="20" ry="20" fill="none" stroke="black" stroke-width="1"/><text x="-4" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">V</text>',xb=[{id:"t_top",x:0,y:-40,orientation:"n"}],bb={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_02/en_60617_08_02_01.elmt",qetEnglishName:"Voltmeter"},y$={id:ub,name:fb,category:mb,viewBox:hb,width:pb,height:gb,svg:yb,terminals:xb,source:bb},x$=Object.freeze(Object.defineProperty({__proto__:null,category:mb,default:y$,height:gb,id:ub,name:fb,source:bb,svg:yb,terminals:xb,viewBox:hb,width:pb},Symbol.toStringTag,{value:"Module"})),wb="wattmeter",vb="功率表 (W)",kb="measurement",_b="-22 -42 44 44",$b=44,Sb=44,jb='<rect x="-20" y="-40" width="40" height="40" rx="0" ry="0" fill="none" stroke="black" stroke-width="1"/><text x="-6" y="-8.8" font-family="Liberation Sans, Arial, sans-serif" font-size="9" fill="#000000">W</text>',Eb=[{id:"t_top",x:0,y:-40,orientation:"n"}],Nb={kind:"elmt",path:"91_en_60617/en_60617_08/en_60617_08_03/en_60617_08_03_01.elmt",qetEnglishName:"Recording wattmeter"},b$={id:wb,name:vb,category:kb,viewBox:_b,width:$b,height:Sb,svg:jb,terminals:Eb,source:Nb},w$=Object.freeze(Object.defineProperty({__proto__:null,category:kb,default:b$,height:Sb,id:wb,name:vb,source:Nb,svg:jb,terminals:Eb,viewBox:_b,width:$b},Symbol.toStringTag,{value:"Module"})),Mb="wind-turbine",Tb="风力发电机",Ab="renewable",Cb="风机:发电机 + 三叶轮标记",Ib="-22 -46 44 68",Pb=44,Ob=68,Bb='<circle cx="0" cy="0" r="20" fill="none" stroke="black" stroke-width="1"/><text x="0" y="4" text-anchor="middle" font-family="Liberation Sans, Arial, sans-serif" font-size="16">G</text><line x1="0" y1="-20" x2="0" y2="-32" fill="none" stroke="black" stroke-width="1"/><line x1="0" y1="-32" x2="-10" y2="-39" fill="none" stroke="black" stroke-width="1.5"/><line x1="0" y1="-32" x2="10" y2="-39" fill="none" stroke="black" stroke-width="1.5"/><line x1="0" y1="-32" x2="0" y2="-44" fill="none" stroke="black" stroke-width="1.5"/>',Lb=[{id:"t_bottom",x:0,y:20,orientation:"s"}],zb={kind:"inline"},v$={id:Mb,name:Tb,category:Ab,description:Cb,viewBox:Ib,width:Pb,height:Ob,svg:Bb,terminals:Lb,source:zb},k$=Object.freeze(Object.defineProperty({__proto__:null,category:Ab,default:v$,description:Cb,height:Ob,id:Mb,name:Tb,source:zb,svg:Bb,terminals:Lb,viewBox:Ib,width:Pb},Symbol.toStringTag,{value:"Module"})),Rb="zener-diode",Db="稳压二极管 (D)",Fb="passive",Hb="齐纳 / 稳压二极管。t1=阳极(上), t2=阴极(下)。",Wb="-12 -42 24 44",qb=24,Gb=44,Xb='<line x1="0" y1="-40" x2="0" y2="0" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-10" x2="10" y2="-10" fill="none" stroke="black" stroke-width="1"/><polygon points="-10,-30 10,-30 0,-10" fill="none" stroke="black" stroke-width="1"/><line x1="-10" y1="-15" x2="-10" y2="-10" fill="none" stroke="black" stroke-width="1"/>',Yb=[{id:"t1",x:0,y:-40,orientation:"n"},{id:"t2",x:0,y:0,orientation:"s"}],Kb={x:6,y:-20,anchor:"start"},Vb={kind:"elmt",path:"91_en_60617/en_60617_05/en_60617_05_03/en_60617_05_03_06.elmt",qetEnglishName:"Breakdown diode, unidirectional; Zener diode"},_$={id:Rb,name:Db,category:Fb,description:Hb,viewBox:Wb,width:qb,height:Gb,svg:Xb,terminals:Yb,label:Kb,source:Vb},$$=Object.freeze(Object.defineProperty({__proto__:null,category:Fb,default:_$,description:Hb,height:Gb,id:Rb,label:Kb,name:Db,source:Vb,svg:Xb,terminals:Yb,viewBox:Wb,width:qb},Symbol.toStringTag,{value:"Module"})),S$=Object.assign({"./ammeter.json":f2,"./arc-suppression-coil.json":h2,"./arrester.json":g2,"./async-motor.json":x2,"./autotransformer.json":w2,"./battery.json":k2,"./bell.json":$2,"./break-contact.json":j2,"./breaker.json":N2,"./buchholz-relay.json":T2,"./busbar.json":C2,"./buzzer.json":P2,"./capacitor.json":B2,"./contactor.json":z2,"./converter-bidir.json":D2,"./ct.json":H2,"./dc-combiner.json":q2,"./dc-disconnector.json":X2,"./dc-motor.json":K2,"./diode.json":U2,"./disconnector.json":Z2,"./distance-relay.json":ek,"./earth.json":nk,"./earthing-switch.json":rk,"./energy-meter.json":ik,"./ev-charger.json":lk,"./frequency-meter.json":dk,"./fuse-switch-disconnector.json":fk,"./fuse.json":hk,"./generator.json":gk,"./genset.json":xk,"./gfci-breaker.json":wk,"./grid-source.json":kk,"./grounding-transformer.json":$k,"./heater.json":jk,"./igbt.json":Nk,"./indicator-light.json":Tk,"./inductor.json":Ck,"./inverter.json":Pk,"./limit-switch.json":Bk,"./load-switch.json":zk,"./load.json":Dk,"./make-contact.json":Hk,"./motor-starter.json":qk,"./ngr.json":Xk,"./overcurrent-relay.json":Kk,"./phase-failure-relay.json":Uk,"./plc.json":Zk,"./power-factor-meter.json":e_,"./power-supply.json":n_,"./protective-relay.json":r_,"./proximity-switch.json":i_,"./pt.json":l_,"./push-button.json":d_,"./pv.json":f_,"./rcd.json":h_,"./recloser.json":g_,"./rectifier.json":x_,"./relay-coil.json":w_,"./resistor.json":k_,"./reverse-power-relay.json":$_,"./selector-switch.json":j_,"./series-reactor.json":N_,"./shunt-capacitor.json":T_,"./shunt-reactor.json":C_,"./siren.json":P_,"./socket-outlet.json":B_,"./soft-starter.json":z_,"./sync-motor.json":D_,"./synchronoscope.json":H_,"./terminal.json":q_,"./thermal-overload.json":X_,"./thermocouple.json":K_,"./thyristor.json":U_,"./time-relay.json":Z_,"./transfer-switch.json":e$,"./transformer-2w.json":n$,"./transformer-3w.json":r$,"./triac.json":i$,"./undervoltage-relay.json":l$,"./ups.json":d$,"./varmeter.json":f$,"./vfd.json":h$,"./voltage-regulator.json":g$,"./voltmeter.json":x$,"./wattmeter.json":w$,"./wind-turbine.json":k$,"./zener-diode.json":$$}),Ub=Object.values(S$).map(e=>e.default),Ke=Object.fromEntries(Ub.map(e=>[e.id,e])),Wo=["busbar","switching","protection","motor-control","control","transformer","instrument-transformer","measurement","source","load","storage","compensation","passive","grounding","renewable"],j$=(()=>{var t;const e={};for(const n of Ub)(e[t=n.category]??(e[t]=[])).push(n);return e})(),In=new Map(Object.entries(Ke));function Jb(e){return Ke[e]}function E$(e){const n=[...e].sort().join("|");let o=2166136261;for(let r=0;r<n.length;r++)o^=n.charCodeAt(r),o=Math.imul(o,16777619);return`n_${(o>>>0).toString(36)}`}const N$=320;function Xe(e){var h,y,w,$,k;const t=rs(),n=new Map;e.elements.forEach((b,S)=>{if(n.has(b.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:b.id}),pointer:`/elements/${S}`});return}n.set(b.id,b);const C=In.get(b.kind);C||t.diagnostics.push({code:"E003",severity:"error",message:`${we("compile.unknownKind",{kind:b.kind})} (id=${b.id})`,pointer:`/elements/${S}`}),t.elements.set(b.id,{element:b,libraryDef:C})});const o=new Map,r=new Map;(e.buses??[]).forEach((b,S)=>{if(n.has(b.id)||o.has(b.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:b.id}),pointer:`/buses/${S}`});return}if(o.set(b.id,b),b.layout){const C=b.layout.rot??0;r.set(b.id,{at:b.layout.at,span:b.layout.span,rot:C,axis:An(C)})}});const s=new Map;(e.junctions??[]).forEach((b,S)=>{if(n.has(b.id)||o.has(b.id)||s.has(b.id)){t.diagnostics.push({code:"E001",severity:"error",message:we("compile.duplicateId",{id:b.id}),pointer:`/junctions/${S}`});return}s.set(b.id,b)});const i=b=>!b.includes(".")&&o.has(b),a=b=>!b.includes(".")&&s.has(b),l=(b,S)=>{if(i(b)||a(b))return!0;const C=b.indexOf(".");if(C<=0)return t.diagnostics.push({code:"E003",severity:"error",message:we("compile.invalidTermRef",{ref:b}),pointer:S}),!1;const R=b.slice(0,C),X=b.slice(C+1),V=t.elements.get(R);if(!V)return t.diagnostics.push({code:"E002",severity:"error",message:we("compile.elementMissing",{id:R}),pointer:S}),!1;if(!V.libraryDef)return!1;if(!V.libraryDef.terminals.find(te=>te.id===X)){const te=V.libraryDef.terminals.map(ae=>ae.id).join(", ");return t.diagnostics.push({code:"E003",severity:"error",message:we("compile.missingPin",{id:R,kind:V.element.kind,pin:X,available:te}),pointer:S}),!1}return!0},d=[];(e.wires??[]).forEach((b,S)=>{const C=`/wires/${S}`,R=l(b.ends[0],C),X=l(b.ends[1],C);R&&X&&d.push(b)});const u=new Map;if(e.layout)for(const[b,S]of Object.entries(e.layout))t.elements.has(b)?u.set(b,ss(S)):t.diagnostics.push({code:"E004",severity:"error",message:we("compile.layoutMissingElement",{id:b}),pointer:`/layout/${b}`});const f=c2({elements:e.elements,buses:e.buses??[],junctions:e.junctions??[],wires:d,library:In,userLayout:u,userBusLayout:r});t.layout=f.devices;for(const[b,S]of f.buses){const C=o.get(b);C&&t.buses.set(b,{bus:C,geometry:S})}for(const[b,S]of o)t.buses.has(b)||t.buses.set(b,{bus:S,geometry:{at:((h=S.layout)==null?void 0:h.at)??[0,0],span:((y=S.layout)==null?void 0:y.span)??N$,rot:((w=S.layout)==null?void 0:w.rot)??0,axis:An((($=S.layout)==null?void 0:$.rot)??0)}});for(const b of t.elements.values()){if(!b.libraryDef)continue;const S=t.layout.get(b.element.id);if(!S)continue;const C=[];for(const R of b.libraryDef.terminals){const X=`${b.element.id}.${R.id}`,V=Pe([R.x,R.y],S),te=St(R.orientation,S);t.terminals.set(X,{ref:X,elementId:b.element.id,pin:R.id,world:V,orientation:te}),C.push(X)}t.elementToTerminals.set(b.element.id,C)}const m=b=>{if(!b.includes(".")){const C=t.buses.get(b);return C?C.geometry.at:null}const S=t.terminals.get(b);return S?S.world:null};for(const[b,S]of s){let C;if((k=S.layout)!=null&&k.at)C=[S.layout.at[0],S.layout.at[1]];else if(f.junctions.has(b))C=f.junctions.get(b);else{const R=[];for(const X of d){const[V,te]=X.ends,ae=V===b?te:te===b?V:null;if(ae===null)continue;const D=m(ae);D&&R.push(D)}C=R.length?[R.reduce((X,V)=>X+V[0],0)/R.length,R.reduce((X,V)=>X+V[1],0)/R.length]:[0,0]}t.junctions.set(b,{junction:S,world:C})}const p=new is;for(const b of d)p.add(b.ends[0]),p.add(b.ends[1]),p.union(b.ends[0],b.ends[1]);for(const[,b]of p.groups()){const S=E$(b);t.nodes.set(S,{id:S,terminals:b});for(const C of b)t.terminalToNode.set(C,S)}for(const b of t.elements.values()){const S=t.elementToTerminals.get(b.element.id)??[];if(S.length===0)continue;S.some(R=>t.terminalToNode.has(R))||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:b.element.id})})}for(const b of t.buses.keys())t.terminalToNode.has(b)||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:b})});for(const b of t.junctions.keys())t.terminalToNode.has(b)||t.diagnostics.push({code:"W001",severity:"warning",message:we("compile.elementUnconnected",{id:b})});for(const b of d){if(b.path&&b.path.length>=2){const C=b.path,R=C.length>=2?C[1]:null,X=C.length>=2?C[C.length-2]:null,V=Fo(b.ends[0],R,t),te=Fo(b.ends[1],X,t);if(V&&te){const ae=[[V[0],V[1]],...C.slice(1,-1).map(W=>[W[0],W[1]]),[te[0],te[1]]],D=os(ae);if(D.length>=2){t.wireRenders.set(b.id,{wireId:b.id,path:D,userEdited:!0});continue}}}const S=d2(b,t);S&&t.wireRenders.set(b.id,S)}return t}const M$={earth:"GND",breaker:"QF",disconnector:"QS","earthing-switch":"QE","load-switch":"QL",fuse:"FU","transformer-2w":"T","transformer-3w":"T",autotransformer:"AT",ct:"CT",pt:"PT",generator:"G","sync-motor":"M","async-motor":"M","grid-source":"L",load:"L",battery:"BAT","shunt-reactor":"LR","series-reactor":"LR","shunt-capacitor":"C",arrester:"FBL","grounding-transformer":"TG",ngr:"NGR","arc-suppression-coil":"ASC",pv:"PV","wind-turbine":"WT",rectifier:"RT",inverter:"INV","converter-bidir":"PCS"},qo="B",Go="J";function Jn(e){return new Set([...e.elements.map(t=>t.id),...(e.buses??[]).map(t=>t.id),...(e.junctions??[]).map(t=>t.id)])}function Nt(e,t){const n=M$[t]??t,o=Jn(e);let r=1;for(;o.has(`${n}${r}`);)r++;return`${n}${r}`}function Pn(e){const t=Jn(e);let n=1;for(;t.has(`${qo}${n}`);)n++;return`${qo}${n}`}function On(e){const t=Jn(e);let n=1;for(;t.has(`${Go}${n}`);)n++;return`${Go}${n}`}function T$(e){const t=new Set((e.annotations??[]).map(o=>o.id));let n=1;for(;t.has(`a${n}`);)n++;return`a${n}`}function Je(e,t){const n=[e,t].sort(),o=`${n[0]}|${n[1]}`;let r=2166136261;for(let s=0;s<o.length;s++)r^=o.charCodeAt(s),r=Math.imul(r,16777619);return`w_${(r>>>0).toString(36)}`}const Xo={version:"1",elements:[]},A$=100,Yo=20;function C$(){if(typeof window>"u")return"select";try{return window.matchMedia("(pointer: coarse)").matches?"pan":"select"}catch{return"select"}}const x=Jt()(n2((e,t)=>({diagram:Xo,internal:Xe(Xo),fileSession:null,activeTool:C$(),placeKind:null,lastPlaceKind:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null,busbarDrawStart:null,cursorSvg:null,selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,past:[],future:[],clipboard:null,clipboardPasteIndex:0,setDiagram:n=>e({diagram:n,internal:Xe(n),past:[],future:[],selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null}),setFileSession:n=>e({fileSession:n}),loadDiagramFromFile:(n,o)=>e({diagram:n,internal:Xe(n),fileSession:o,past:[],future:[],selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null,wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null}),dispatch:n=>{const{diagram:o,past:r}=t(),s=n(o);if(s===o)return;const i=r.length>=A$?r.slice(1):r;e({diagram:s,internal:Xe(s),past:[...i,o],future:[]})},undo:()=>{const{past:n,future:o,diagram:r}=t();if(n.length===0)return;const s=n[n.length-1];e({diagram:s,internal:Xe(s),past:n.slice(0,-1),future:[...o,r],wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null})},redo:()=>{const{past:n,future:o,diagram:r}=t();if(o.length===0)return;const s=o[o.length-1];e({diagram:s,internal:Xe(s),past:[...n,r],future:o.slice(0,-1),wireFromTerminal:null,wireDragFrom:null,placeFromTerminal:null})},setActiveTool:(n,o)=>{const r=t();let s;(o==null?void 0:o.placeKind)!==void 0?s=o.placeKind:n==="place"?s=r.placeKind??r.lastPlaceKind:s=null,e({activeTool:n,placeKind:s,lastPlaceKind:s??r.lastPlaceKind,wireFromTerminal:n==="wire"?r.wireFromTerminal:null,wireDragFrom:n==="wire"?r.wireDragFrom:null,placeFromTerminal:n==="place"?r.placeFromTerminal:null})},setPlaceKind:n=>e(o=>({placeKind:n,lastPlaceKind:n??o.lastPlaceKind})),setWireFromTerminal:n=>e({wireFromTerminal:n}),setWireDragFrom:n=>e({wireDragFrom:n}),setPlaceFromTerminal:n=>e({placeFromTerminal:n}),setBusbarDrawStart:n=>e({busbarDrawStart:n}),setCursorSvg:n=>e({cursorSvg:n}),setSelection:n=>e({selection:I$(n),selectedWire:null,selectedNode:null,selectedAnnotation:n.length?null:t().selectedAnnotation}),toggleInSelection:n=>{const o=t().selection;e({selection:o.includes(n)?o.filter(r=>r!==n):[...o,n],selectedWire:null,selectedNode:null,selectedAnnotation:null})},clearSelection:()=>e({selection:[],selectedWire:null,selectedNode:null,selectedAnnotation:null,editingAnnotation:null,editingElement:null}),setSelectedWire:n=>e({selectedWire:n,selection:n?[]:t().selection,selectedNode:null,selectedAnnotation:n?null:t().selectedAnnotation}),setSelectedNode:n=>e({selectedNode:n,selection:n?[]:t().selection,selectedWire:null,selectedAnnotation:n?null:t().selectedAnnotation}),setSelectedAnnotation:n=>e({selectedAnnotation:n,selection:n?[]:t().selection,selectedWire:n?null:t().selectedWire,selectedNode:n?null:t().selectedNode,editingAnnotation:n?t().editingAnnotation:null}),setEditingAnnotation:n=>e({editingAnnotation:n,selectedAnnotation:n??t().selectedAnnotation,editingElement:n?null:t().editingElement}),setEditingElement:n=>e({editingElement:n,selection:n?[n]:t().selection,editingAnnotation:n?null:t().editingAnnotation,selectedAnnotation:n?null:t().selectedAnnotation,selectedWire:n?null:t().selectedWire,selectedNode:n?null:t().selectedNode}),copySelection:()=>{var m;const{selection:n,diagram:o,internal:r}=t();if(n.length===0)return;const s=new Set(n),i=o.elements.filter(p=>s.has(p.id)).map(p=>structuredClone(p)),a=(o.buses??[]).filter(p=>s.has(p.id)).map(p=>structuredClone(p)),l=(o.junctions??[]).filter(p=>s.has(p.id)).map(p=>{var y;const h=structuredClone(p);if(!h.layout){const w=(y=r.junctions.get(p.id))==null?void 0:y.world;w&&(h.layout={at:[w[0],w[1]]})}return h}),d={};for(const p of n)if(s.has(p)&&!r.buses.has(p)){const h=(m=o.layout)==null?void 0:m[p];if(h){d[p]=structuredClone(h);continue}const y=r.layout.get(p);y&&(d[p]=Lt(y))}const u={};for(const p of n){const h=r.buses.get(p);h&&(u[p]=tt(h.geometry))}const f=(o.wires??[]).filter(p=>p.ends.every(h=>s.has(gn(h)))).map(p=>structuredClone(p));e({clipboard:{elements:i,buses:a,junctions:l,placements:d,busLayouts:u,wires:f},clipboardPasteIndex:0})},cutSelection:()=>{const{selection:n}=t();n.length!==0&&(t().copySelection(),t().deleteSelection())},pasteClipboard:()=>{const{clipboard:n,clipboardPasteIndex:o,diagram:r}=t();if(!n||n.elements.length===0&&n.buses.length===0&&n.junctions.length===0)return;const s=o+1,i=Yo*s,a=Yo*s,l=new Map;let d=r;for(const f of n.elements){const m=Nt(d,f.kind);l.set(f.id,m),d={...d,elements:[...d.elements,{id:m,kind:f.kind}]}}for(const f of n.buses){const m=Pn(d);l.set(f.id,m),d={...d,buses:[...d.buses??[],{id:m}]}}for(const f of n.junctions){const m=On(d);l.set(f.id,m),d={...d,junctions:[...d.junctions??[],{id:m}]}}const u=f=>{const m=f.indexOf("."),p=m<0?f:f.slice(0,m),h=l.get(p);return h?m<0?h:`${h}${f.slice(m)}`:f};t().dispatch(f=>{const m=n.elements.map(k=>{const b=structuredClone(k);return b.id=l.get(k.id),b}),p=n.buses.map(k=>{const b=structuredClone(k);b.id=l.get(k.id);const S=n.busLayouts[k.id];return S&&(b.layout={...S,at:[S.at[0]+i,S.at[1]+a]}),b}),h=n.junctions.map(k=>{const b=structuredClone(k);return b.id=l.get(k.id),b.layout&&(b.layout={at:[b.layout.at[0]+i,b.layout.at[1]+a]}),b}),y={...f.layout??{}};for(const[k,b]of l){const S=n.placements[k];S&&(y[b]={...S,at:[S.at[0]+i,S.at[1]+a]})}const w=n.wires.map(k=>{const b=[u(k.ends[0]),u(k.ends[1])];return{id:Je(b[0],b[1]),ends:b}}),$=Ko(f.wires??[],w);return{...f,elements:[...f.elements,...m],buses:p.length?[...f.buses??[],...p]:f.buses,junctions:h.length?[...f.junctions??[],...h]:f.junctions,wires:$.length?$:void 0,layout:Object.keys(y).length?y:void 0}}),e({selection:Array.from(l.values()),clipboardPasteIndex:s})},autoArrangeAll:()=>{t().dispatch(n=>{var l;const o=n.layout&&Object.keys(n.layout).length>0,r=(n.buses??[]).some(d=>d.layout);if(!o&&!r)return n;const{layout:s,...i}=n,a=(l=n.buses)==null?void 0:l.map(d=>{const{layout:u,...f}=d;return f});return{...i,buses:a}})},autoArrangeSelection:()=>{const{selection:n}=t();if(n.length===0)return;const o=new Set(n);t().dispatch(r=>{let s=!1,i=r.layout;if(i){const l={};for(const[d,u]of Object.entries(i)){if(o.has(d)){s=!0;continue}l[d]=u}s&&(i=Object.keys(l).length?l:void 0)}let a=r.buses;if(a){const l=a.map(d=>{if(o.has(d.id)&&d.layout){s=!0;const{layout:u,...f}=d;return f}return d});s&&(a=l)}return s?{...r,layout:i,buses:a}:r})},fillUnplacedAll:()=>{const n=t().internal;t().dispatch(o=>{const r=o.layout??{},s={};for(const l of o.elements){if(r[l.id])continue;const d=n.layout.get(l.id);d&&(s[l.id]=Lt(d))}const i=[];if((o.buses??[]).forEach((l,d)=>{l.layout||n.buses.has(l.id)&&i.push({idx:d,bus:l})}),Object.keys(s).length===0&&i.length===0)return o;let a=o.buses;return i.length>0&&a&&(a=a.map(l=>{const d=n.buses.get(l.id);return!l.layout&&d?{...l,layout:tt(d.geometry)}:l})),{...o,layout:{...r,...s},buses:a}})},fillUnplacedSelection:()=>{const{selection:n,internal:o}=t();n.length!==0&&t().dispatch(r=>{var d;const s=r.layout??{},i={},a=new Map;for(const u of n)if(o.buses.has(u)){const f=o.buses.get(u);(d=r.buses)!=null&&d.find(m=>m.id===u&&m.layout)||a.set(u,tt(f.geometry))}else{if(s[u])continue;const f=o.layout.get(u);f&&(i[u]=Lt(f))}if(Object.keys(i).length===0&&a.size===0)return r;let l=r.buses;return a.size>0&&l&&(l=l.map(u=>a.has(u.id)?{...u,layout:a.get(u.id)}:u)),{...r,layout:{...s,...i},buses:l}})},moveElements:n=>{if(n.size===0)return;const o=t().internal;t().dispatch(r=>{const s={...r.layout??{}},i=new Map,a=new Map;for(const[u,f]of n){if(o.buses.has(u)){i.set(u,f);continue}if(o.junctions.has(u)){a.set(u,f);continue}const m=o.layout.get(u),p=s[u]??(m?Lt(m):{at:[0,0]});s[u]={...p,at:[p.at[0]+f[0],p.at[1]+f[1]]}}let l=r.buses;i.size>0&&(l=(r.buses??[]).map(u=>{const f=i.get(u.id);if(!f)return u;const m=u.layout??tt(o.buses.get(u.id).geometry);return{...u,layout:{...m,at:[m.at[0]+f[0],m.at[1]+f[1]]}}}));let d=r.junctions;return a.size>0&&(d=(r.junctions??[]).map(u=>{var p,h;const f=a.get(u.id);if(!f)return u;const m=((p=u.layout)==null?void 0:p.at)??((h=o.junctions.get(u.id))==null?void 0:h.world)??[0,0];return{...u,layout:{at:[m[0]+f[0],m[1]+f[1]]}}})),{...r,layout:s,buses:l,junctions:d}})},deleteSelection:()=>{const{selection:n}=t();if(n.length===0)return;const o=new Set(n);t().dispatch(r=>{const s=r.elements.filter(u=>!o.has(u.id)),i=(r.buses??[]).filter(u=>!o.has(u.id)),a=(r.junctions??[]).filter(u=>!o.has(u.id)),l=(r.wires??[]).filter(u=>!o.has(gn(u.ends[0]))&&!o.has(gn(u.ends[1]))),d=r.layout?Object.fromEntries(Object.entries(r.layout).filter(([u])=>!o.has(u))):void 0;return{...r,elements:s,buses:i.length?i:void 0,junctions:a.length?a:void 0,wires:l.length?l:void 0,layout:d&&Object.keys(d).length?d:void 0}}),e({selection:[]})},deleteSelectedWire:()=>{const{selectedWire:n,internal:o}=t();if(!n)return;const r=(t().diagram.wires??[]).find(i=>i.id===n),s=new Set;if(r)for(const i of r.ends){const a=i.indexOf(".");a>0&&s.add(i.slice(0,a))}t().dispatch(i=>{const a=(i.wires??[]).filter(d=>d.id!==n);if(a.length===(i.wires??[]).length)return i;const l={...i.layout??{}};for(const d of s){if(l[d])continue;const u=o.layout.get(d);if(!u)continue;const f={at:u.at};u.rot&&(f.rot=u.rot),u.mirror&&(f.mirror=u.mirror),l[d]=f}return{...i,wires:a.length?a:void 0,layout:Object.keys(l).length?l:void 0}}),e({selectedWire:null})},deleteSelectedNode:()=>{const{selectedNode:n,internal:o}=t();if(!n)return;const r=o.nodes.get(n);if(!r)return;const s=new Set(r.terminals),i=new Set;for(const a of r.terminals){const l=a.indexOf(".");l>0&&i.add(a.slice(0,l))}t().dispatch(a=>{const l={...a.layout??{}};for(const u of i){if(l[u])continue;const f=o.layout.get(u);if(!f)continue;const m={at:f.at};f.rot&&(m.rot=f.rot),f.mirror&&(m.mirror=f.mirror),l[u]=m}const d=(a.wires??[]).filter(u=>!s.has(u.ends[0])&&!s.has(u.ends[1]));return{...a,wires:d.length?d:void 0,layout:Object.keys(l).length?l:void 0}}),e({selectedNode:null})},rotateSelection:n=>{const{selection:o,internal:r}=t();o.length!==0&&t().dispatch(s=>{var d,u,f,m;const i={...s.layout??{}},a=new Map;for(const p of o){if(r.junctions.has(p))continue;if(r.buses.has(p)){const w=r.buses.get(p),k=(((((f=(u=(d=s.buses)==null?void 0:d.find(b=>b.id===p))==null?void 0:u.layout)==null?void 0:f.rot)??w.geometry.rot??0)+n)%360+360)%360;a.set(p,k);continue}const h=i[p]??{at:((m=r.layout.get(p))==null?void 0:m.at)??[0,0]},y=(((h.rot??0)+n)%360+360)%360;i[p]={...h,rot:y}}let l=s.buses;return a.size>0&&(l=(s.buses??[]).map(p=>{if(!a.has(p.id))return p;const h=p.layout??tt(r.buses.get(p.id).geometry);return{...p,layout:{...h,rot:a.get(p.id)}}})),{...s,layout:i,buses:l}})},mirrorSelection:()=>{const{selection:n,internal:o}=t();n.length!==0&&t().dispatch(r=>{var i;const s={...r.layout??{}};for(const a of n){if(o.buses.has(a)||o.junctions.has(a))continue;const l=s[a]??{at:((i=o.layout.get(a))==null?void 0:i.at)??[0,0]};s[a]={...l,mirror:!(l.mirror??!1)}}return{...r,layout:s}})},addElement:(n,o,r)=>{if(n==="busbar")return t().addBus(o,320);const s=Nt(t().diagram,n);return t().dispatch(i=>{const a={id:s,kind:n,...r??{}};return{...i,elements:[...i.elements,a],layout:{...i.layout??{},[s]:{at:o}}}}),e({selection:[s]}),s},addBus:(n,o,r)=>{const s=Pn(t().diagram);return t().dispatch(i=>{const a={id:s,layout:r!==void 0?{at:n,span:o,rot:r}:{at:n,span:o}};return{...i,buses:[...i.buses??[],a]}}),e({selection:[s]}),s},addJunction:n=>{const o=On(t().diagram);return t().dispatch(r=>{const s={id:o,layout:{at:n}};return{...r,junctions:[...r.junctions??[],s]}}),e({selection:[o]}),o},updateJunction:(n,o)=>{t().dispatch(r=>({...r,junctions:(r.junctions??[]).map(s=>s.id===n?{...s,...o}:s)}))},addWire:(n,o)=>{if(n===o)return;const r=Je(n,o);t().dispatch(s=>{const i=s.wires??[];return i.some(a=>a.id===r)?s:{...s,wires:[...i,{id:r,ends:[n,o]}]}})},connectWire:(n,o)=>{t().dispatch(r=>{let s=r;const i=new Set([...s.elements.map(h=>h.id),...(s.buses??[]).map(h=>h.id),...(s.junctions??[]).map(h=>h.id)]),a=()=>{let h=1;for(;i.has(`J${h}`);)h++;const y=`J${h}`;return i.add(y),y},l=h=>{const y=a();return s={...s,junctions:[...s.junctions??[],{id:y,layout:{at:h}}]},y},d=h=>{if("end"in h)return h.end;if("junctionAt"in h)return l(h.junctionAt);const y=(s.wires??[]).find(b=>b.id===h.onWire),w=l(h.at);if(!y)return w;const $=(s.wires??[]).filter(b=>b.id!==h.onWire),k=(b,S)=>({id:Je(b,S),ends:[b,S]});return s={...s,wires:Ko($,[k(y.ends[0],w),k(w,y.ends[1])])},w},u=d(n),f=d(o);if(u===null||f===null||u===f)return s;const m=Je(u,f),p=s.wires??[];return p.some(h=>h.id===m)?s:{...s,wires:[...p,{id:m,ends:[u,f]}]}})},updateWirePath:(n,o)=>{t().dispatch(r=>{const s=r.wires??[];if(!s.some(d=>d.id===n))return r;const i=o&&o.length>=2?os(o):null,a=i&&i.length>=2?i:null,l=s.map(d=>{if(d.id!==n)return d;if(a)return{...d,path:a};const{path:u,...f}=d;return f});return{...r,wires:l}})},resetWirePath:n=>{t().updateWirePath(n,null)},updateElement:(n,o)=>{t().dispatch(r=>({...r,elements:r.elements.map(s=>s.id===n?{...s,...o}:s)}))},updatePlacement:(n,o)=>{t().dispatch(r=>{var a;const s=((a=r.layout)==null?void 0:a[n])??t().internal.layout.get(n),i={at:o.at??(s==null?void 0:s.at)??[0,0],...o.rot!==void 0?{rot:o.rot}:s!=null&&s.rot?{rot:s.rot}:{},...o.mirror!==void 0?{mirror:o.mirror}:s!=null&&s.mirror?{mirror:s.mirror}:{}};return{...r,layout:{...r.layout??{},[n]:i}}})},updateBus:(n,o)=>{t().dispatch(r=>{const s=(r.buses??[]).map(i=>{if(i.id!==n)return i;const a=t().internal,l=i.layout??(a.buses.has(n)?tt(a.buses.get(n).geometry):{at:[0,0],span:320}),d={at:o.at??l.at,span:o.span??l.span,...o.rot!==void 0?{rot:o.rot}:l.rot?{rot:l.rot}:{}};return{...i,layout:d}});return{...r,buses:s}})},addAnnotation:(n,o="")=>{const r=T$(t().diagram);return t().dispatch(s=>{const i={id:r,at:n,text:o};return{...s,annotations:[...s.annotations??[],i]}}),r},updateAnnotation:(n,o)=>{t().dispatch(r=>{const s=r.annotations??[];let i=!1;const a=s.map(l=>l.id!==n?l:(i=!0,{...l,...o,id:l.id}));return i?{...r,annotations:a}:r})},deleteAnnotation:n=>{t().dispatch(o=>{const r=o.annotations??[],s=r.filter(i=>i.id!==n);return s.length===r.length?o:{...o,annotations:s.length?s:void 0}}),t().selectedAnnotation===n&&e({selectedAnnotation:null,editingAnnotation:null})}}),{name:"ole-editor",version:2,storage:ns(()=>localStorage),partialize:e=>({diagram:e.diagram,activeTool:e.activeTool,placeKind:e.placeKind,lastPlaceKind:e.lastPlaceKind}),onRehydrateStorage:()=>e=>{e!=null&&e.diagram&&(e.internal=Xe(e.diagram))}}));function I$(e){return Array.from(new Set(e))}function gn(e){const t=e.indexOf(".");return t<0?e:e.slice(0,t)}function Ko(e,t){const n=new Set(e.map(r=>r.id)),o=e.slice();for(const r of t)n.has(r.id)||(n.add(r.id),o.push(r));return o}function Lt(e){return{at:[e.at[0],e.at[1]],...e.rot?{rot:e.rot}:{},...e.mirror?{mirror:e.mirror}:{}}}function tt(e){return{at:[e.at[0],e.at[1]],span:e.span,...e.rot?{rot:e.rot}:{}}}let Zb=null;function Vo(e){Zb=e}function Ze(){return Zb}const Xt=10;function Qb(){if(typeof document>"u")return!0;const e=document.querySelector(".ole-canvas-root");return!!e&&!e.classList.contains("hide-grid")}function de(e){return Qb()?Math.round(e/Xt)*Xt:e}const P$=30,O$=144;function ew(e,t){const n=Ke[e],o=x.getState(),r=o.diagram;if(!n||e==="busbar")return{newElementId:o.addElement(e,t),attachedToBus:!1};const s=B$(r,t);if(!s){const y=tw(n),w=y?[de(t[0])-y.x,de(t[1])-y.y]:[de(t[0]),de(t[1])];return{newElementId:o.addElement(e,w),attachedToBus:!1}}const{busId:i,busAt:a,axis:l}=s,d=L$(n,l),u=Nt(r,e),f=n.terminals.find(y=>y.id===d),m=l==="x"?t[0]:a[0],p=l==="y"?t[1]:a[1],h=f?[de(m)-f.x,de(p)-f.y]:[de(t[0]),de(t[1])];return o.dispatch(y=>{const w={id:u,kind:e},$={at:h},k=`${u}.${d}`,b={id:Je(i,k),ends:[i,k]};return{...y,elements:[...y.elements,w],wires:[...y.wires??[],b],layout:{...y.layout??{},[u]:$}}}),o.setSelection([u]),{newElementId:u,attachedToBus:!0}}function B$(e,t){const n=x.getState().internal;let o=null;for(const r of e.buses??[]){const s=n.buses.get(r.id);if(!s)continue;const{axis:i,at:a,span:l}=s.geometry;let d;if(i==="x"){const u=a[0]-l/2,f=a[0]+l/2,m=t[0]<u?u-t[0]:t[0]>f?t[0]-f:0,p=Math.abs(t[1]-a[1]);d=Math.sqrt(m*m+p*p)}else{const u=a[1]-l/2,f=a[1]+l/2,m=t[1]<u?u-t[1]:t[1]>f?t[1]-f:0,p=Math.abs(t[0]-a[0]);d=Math.sqrt(p*p+m*m)}d<=P$&&(!o||d<o.dist)&&(o={busId:r.id,busAt:[a[0],a[1]],axis:i,dist:d})}return o?{busId:o.busId,busAt:o.busAt,axis:o.axis}:null}function L$(e,t){return e.terminals.length===0?"t":[...e.terminals].sort((o,r)=>t==="x"?o.y-r.y:o.x-r.x)[0].id}function tw(e){return!e||e.stretchable||e.terminals.length===0?null:[...e.terminals].sort((n,o)=>n.y-o.y)[0]}function nw(e,t){const n=x.getState().internal;if(!e.includes(".")&&n.buses.has(e)){const r=n.buses.get(e),{axis:s,at:i,span:a}=r.geometry;if(s==="x"){const p=i[0]-a/2,h=i[0]+a/2,y=Math.max(p,Math.min(h,t[0])),w=i[1],$=t[1]>=w?"s":"n";return{ref:e,world:[y,w],orientation:$,isBus:!0,busId:e}}const l=i[1]-a/2,d=i[1]+a/2,u=Math.max(l,Math.min(d,t[1])),f=i[0],m=t[0]>=f?"e":"w";return{ref:e,world:[f,u],orientation:m,isBus:!0,busId:e}}const o=n.terminals.get(e);return o?{ref:e,world:o.world,orientation:o.orientation,isBus:!1}:null}const z$={n:"s",s:"n",e:"w",w:"e"};function ow(e,t,n){if(e.terminals.length===0)return{id:"t",x:0,y:0,orientation:"n"};const o=z$[t.orientation],r=e.terminals.filter(l=>l.orientation===o),s=r.length>0?r:e.terminals;let i=s[0],a=Uo(i,n,t.world);for(let l=1;l<s.length;l++){const d=s[l],u=Uo(d,n,t.world);u<a&&(a=u,i=d)}return i}function Uo(e,t,n){const o=t[0]+e.x-n[0],r=t[1]+e.y-n[1];return o*o+r*r}function R$(e,t,n){const o=Ke[e],r=x.getState(),s=r.diagram;if(!o)return null;const i=nw(t,n);if(!i)return null;const a=n[0]-i.world[0],l=n[1]-i.world[1],d=a*a+l*l<=O$,u=[de(n[0]),de(n[1])],f=ow(o,i,u),m=d?i.world:u,p=[de(m[0]-f.x),de(m[1]-f.y)],h=Nt(s,e);return r.dispatch(y=>{const w={id:h,kind:e},$={at:p},k=`${h}.${f.id}`,b=i.isBus&&i.busId?i.busId:t,S={id:Je(b,k),ends:[b,k]};return{...y,elements:[...y.elements,w],wires:[...y.wires??[],S],layout:{...y.layout??{},[h]:$}}}),r.setSelection([h]),{newElementId:h,attachedToBus:i.isBus}}const Zt=9,Yt=7;function Qt(e,t){var s,i;const n=[],o=((s=e.element.name)==null?void 0:s.trim())||e.element.id;if(o&&n.push(o),t!=="all"||!((i=e.libraryDef)!=null&&i.params))return n;const r=e.element.params??{};for(const a of e.libraryDef.params){if(!a.showOnCanvas)continue;const l=r[a.name];l==null||l===""||n.push(`${l}${a.unit??""}`)}return n}function en(e){const t=D$(e.viewBox);return t?{x:t.x+t.w+2,y:t.y+4,anchor:"start"}:{x:0,y:0,anchor:"start"}}function tn(e,t){let n=e.x,o=e.y;switch(t.mirror&&(n=-n),t.rot){case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}function D$(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function F$(){const e=x(r=>r.internal.elements),t=x(r=>r.internal.layout),n=x(r=>{var s;return((s=r.diagram.meta)==null?void 0:s.labelMode)??"all"}),o=x(r=>r.editingElement);return c.jsx("g",{className:"ole-annotation-layer",pointerEvents:"none",children:Array.from(e.values()).map(r=>{var u;const s=t.get(r.element.id);if(!s||!r.libraryDef)return null;const i=r.libraryDef.label??en(r.libraryDef),a=tn(i,s),l=i.anchor??"start";if(o===r.element.id)return c.jsx(H$,{elementId:r.element.id,currentName:((u=r.element.name)==null?void 0:u.trim())||r.element.id,world:a,anchor:l},r.element.id);if(n==="off")return null;const d=Qt(r,n);return d.length===0?null:c.jsx("g",{className:"ole-annotation",transform:`translate(${a[0]} ${a[1]})`,children:d.map((f,m)=>c.jsx("text",{x:0,y:m*Zt,textAnchor:l,className:"ole-annotation-text",children:f},m))},r.element.id)})})}const yn=200,xn=9;function H$({elementId:e,currentName:t,world:n,anchor:o}){const r=O.useRef(null);O.useEffect(()=>{const l=r.current;if(!l)return;l.focus();const d=document.createRange();d.selectNodeContents(l);const u=window.getSelection();u==null||u.removeAllRanges(),u==null||u.addRange(d)},[e]);function s(){var m;const l=x.getState(),d=l.diagram.elements.find(p=>p.id===e);if(!d){l.setEditingElement(null);return}const u=(((m=r.current)==null?void 0:m.innerText)??"").replace(/\u00a0/g," ").trim(),f=u===""||u===e?void 0:u;f!==d.name&&l.updateElement(e,{name:f}),l.setEditingElement(null)}function i(l){if(l.key==="Escape"||l.key==="Enter"&&!l.shiftKey){l.preventDefault(),s();return}l.stopPropagation()}let a=n[0];return o==="middle"?a-=yn/2:o==="end"&&(a-=yn),c.jsx("foreignObject",{x:a,y:n[1]-xn,width:yn,height:xn*2.2,className:"ole-element-name-editor",children:c.jsx("div",{ref:r,contentEditable:!0,suppressContentEditableWarning:!0,onBlur:s,onKeyDown:i,onPointerDown:l=>l.stopPropagation(),onMouseDown:l=>l.stopPropagation(),style:{fontSize:`${xn}px`,fontFamily:"ui-sans-serif, system-ui, sans-serif",color:"var(--foreground)",background:"var(--canvas-bg)",outline:"1px dashed var(--selection)",padding:"0 2px",display:"inline-block",minWidth:"20px",lineHeight:1.1,textAlign:o==="middle"?"center":o==="end"?"right":"left",whiteSpace:"nowrap",cursor:"text"},children:t})})}const rw=8,Kt=1.25;function W$(){const e=x(o=>o.diagram.annotations),t=x(o=>o.selectedAnnotation),n=x(o=>o.editingAnnotation);return!e||e.length===0?null:c.jsx("g",{className:"ole-free-annotation-layer",children:e.map(o=>n===o.id?c.jsx(G$,{ann:o},o.id):c.jsx(q$,{ann:o,isSelected:t===o.id},o.id))})}function q$({ann:e,isSelected:t}){const n=e.fontSize??rw,o=e.text===""?[""]:e.text.split(`
198
+ `),r=Math.max(20,...o.map(i=>i.length*n*.55)),s=o.length*n*Kt;return c.jsxs("g",{"data-annotation-id":e.id,className:"ole-free-annotation","data-selected":t?"true":void 0,children:[c.jsx("rect",{x:e.at[0]-1,y:e.at[1]-1,width:r+2,height:s+2,fill:"transparent",className:"ole-free-annotation-hit"}),t&&c.jsx("rect",{x:e.at[0]-1,y:e.at[1]-1,width:r+2,height:s+2,className:"ole-free-annotation-halo"}),o.map((i,a)=>c.jsx("text",{x:e.at[0],y:e.at[1]+n*.85+a*n*Kt,fontSize:n,className:"ole-free-annotation-text",children:i},a))]})}function G$({ann:e}){const t=O.useRef(null),n=e.fontSize??rw;O.useEffect(()=>{const a=t.current;if(!a)return;a.focus();const l=document.createRange();l.selectNodeContents(a);const d=window.getSelection();d==null||d.removeAllRanges(),d==null||d.addRange(l)},[e.id]);function o(){var d;const a=x.getState(),l=(((d=t.current)==null?void 0:d.innerText)??"").replace(/\u00a0/g," ").trimEnd();l===""?a.deleteAnnotation(e.id):l!==e.text&&a.updateAnnotation(e.id,{text:l}),a.setEditingAnnotation(null),l!==""&&a.setSelectedAnnotation(e.id),a.activeTool==="text"&&a.setActiveTool("select")}function r(a){if(a.key==="Escape"){a.preventDefault(),o();return}if(a.key==="Enter"&&!a.shiftKey){a.preventDefault(),o();return}a.stopPropagation()}return c.jsx("foreignObject",{x:e.at[0],y:e.at[1],width:320,height:200,"data-annotation-id":e.id,className:"ole-free-annotation-edit-fo",children:c.jsx("div",{ref:t,contentEditable:!0,suppressContentEditableWarning:!0,onBlur:o,onKeyDown:r,onPointerDown:a=>a.stopPropagation(),onMouseDown:a=>a.stopPropagation(),style:{fontSize:`${n}px`,lineHeight:Kt,fontFamily:"ui-sans-serif, system-ui, sans-serif",color:"var(--foreground)",background:"var(--canvas-bg)",outline:"1px dashed var(--selection)",padding:"0 2px",minWidth:`${n}px`,minHeight:`${n*Kt}px`,whiteSpace:"pre-wrap",wordBreak:"break-word",cursor:"text"},children:e.text})})}const X$=20;function Y$(){const e=x(u=>u.selection),t=x(u=>u.internal);if(e.length!==1)return null;const n=e[0],o=t.buses.get(n);if(!o)return null;const{axis:r,at:s,span:i}=o.geometry,a=i/2,l=r==="x"?[s[0]-a,s[1]]:[s[0],s[1]-a],d=r==="x"?[s[0]+a,s[1]]:[s[0],s[1]+a];return c.jsxs("g",{className:"ole-bus-handles",pointerEvents:"auto",children:[c.jsx(Jo,{x:l[0],y:l[1],busId:n,side:"start",axis:r}),c.jsx(Jo,{x:d[0],y:d[1],busId:n,side:"end",axis:r})]})}function Jo({x:e,y:t,busId:n,side:o,axis:r}){const s=Ze(),i=O.useRef(null),a=u=>{if(u.button!==0||(u.stopPropagation(),u.preventDefault(),!s))return;const f=x.getState().internal.buses.get(n);f&&(i.current={pointerId:u.pointerId,startSpan:f.geometry.span,startAt:[...f.geometry.at],startSvg:s.screenToSvg(u.clientX,u.clientY)},u.target.setPointerCapture(u.pointerId))},l=u=>{const f=i.current;if(!f||u.pointerId!==f.pointerId||!s)return;const m=s.screenToSvg(u.clientX,u.clientY),p=r==="x"?m[0]-f.startSvg[0]:m[1]-f.startSvg[1],h=Qb()?Math.round(p/Xt)*Xt:p,y=f.startSpan+(o==="end"?h:-h);if(y<X$)return;const w=r==="x"?[f.startAt[0]+h/2,f.startAt[1]]:[f.startAt[0],f.startAt[1]+h/2];x.getState().updateBus(n,{span:y,at:w})},d=u=>{const f=i.current;!f||u.pointerId!==f.pointerId||(u.target.hasPointerCapture(u.pointerId)&&u.target.releasePointerCapture(u.pointerId),i.current=null)};return c.jsx("circle",{className:"ole-bus-handle",cx:e,cy:t,r:5,"data-handle":o,onPointerDown:a,onPointerMove:l,onPointerUp:d,onPointerCancel:d})}const Bn=.5;function jt(e,t){return Math.abs(e[1]-t[1])<Bn?"h":"v"}function K$(){const e=x(a=>a.selectedWire),t=x(a=>a.internal.wireRenders);if(!e)return null;const n=t.get(e);if(!n||n.path.length<2)return null;const o=n.path,r=o.length,s=[];for(let a=1;a<r-1;a++){const l=jt(o[a-1],o[a]),d=jt(o[a],o[a+1]),u=a-1===0,f=a+1===r-1,m=u&&l==="v"||f&&d==="v",p=u&&l==="h"||f&&d==="h";m&&p||s.push(c.jsx(V$,{wireId:e,index:a,xLocked:m,yLocked:p},`v-${a}`))}const i=[];for(let a=0;a<r-1;a++){const l=o[a],d=o[a+1];Math.abs(l[0]-d[0])<Bn&&Math.abs(l[1]-d[1])<Bn||i.push(c.jsx(U$,{wireId:e,segIndex:a,axis:jt(l,d)},`m-${a}`))}return c.jsxs("g",{className:"ole-wire-handles",pointerEvents:"auto",children:[i,s]})}function V$({wireId:e,index:t,xLocked:n,yLocked:o}){const r=Ze(),s=O.useRef(null),i=x(h=>{var y;return(y=h.internal.wireRenders.get(e))==null?void 0:y.path});if(!i||t<=0||t>=i.length-1)return null;const[a,l]=i[t],d=n&&!o?"ns-resize":!n&&o?"ew-resize":"move",u=h=>{if(h.button!==0||(h.stopPropagation(),h.preventDefault(),!r))return;const y=x.getState().internal.wireRenders.get(e);y&&(s.current={pointerId:h.pointerId,startPath:y.path.map(w=>[w[0],w[1]]),startSvg:r.screenToSvg(h.clientX,h.clientY),index:t,xLocked:n,yLocked:o},document.body.style.cursor=d,h.target.setPointerCapture(h.pointerId))},f=h=>{const y=s.current;if(!y||h.pointerId!==y.pointerId||!r)return;const w=r.screenToSvg(h.clientX,h.clientY),$=y.startPath,k=y.index;if(k<=0||k>=$.length-1)return;const b=$[k],S=[y.xLocked?b[0]:de(b[0]+(w[0]-y.startSvg[0])),y.yLocked?b[1]:de(b[1]+(w[1]-y.startSvg[1]))];if(S[0]===b[0]&&S[1]===b[1])return;const C=$.map(V=>[V[0],V[1]]);C[k]=S;const R=jt($[k-1],$[k]);k-1>0&&(R==="h"?C[k-1]=[$[k-1][0],S[1]]:C[k-1]=[S[0],$[k-1][1]]);const X=jt($[k],$[k+1]);k+1<$.length-1&&(X==="h"?C[k+1]=[$[k+1][0],S[1]]:C[k+1]=[S[0],$[k+1][1]]),x.getState().updateWirePath(e,C)},m=h=>{const y=s.current;!y||h.pointerId!==y.pointerId||(h.target.hasPointerCapture(h.pointerId)&&h.target.releasePointerCapture(h.pointerId),s.current=null,document.body.style.cursor="")},p=h=>{h.stopPropagation(),h.preventDefault();const y=x.getState().internal.wireRenders.get(e);if(!y||y.path.length<=2||t<=0||t>=y.path.length-1)return;const w=y.path.filter(($,k)=>k!==t);x.getState().updateWirePath(e,w)};return c.jsx("circle",{className:"ole-wire-handle ole-wire-vertex",cx:a,cy:l,r:5,style:{cursor:d},onPointerDown:u,onPointerMove:f,onPointerUp:m,onPointerCancel:m,onDoubleClick:p})}function U$({wireId:e,segIndex:t,axis:n}){const o=Ze(),r=O.useRef(null),s=x(h=>{var y;return(y=h.internal.wireRenders.get(e))==null?void 0:y.path});if(!s||t<0||t>=s.length-1)return null;const i=s[t],a=s[t+1],l=(i[0]+a[0])/2,d=(i[1]+a[1])/2,u=n==="h"?"ns-resize":"ew-resize",f=h=>{if(h.button!==0||(h.stopPropagation(),h.preventDefault(),!o))return;const y=x.getState().internal.wireRenders.get(e);y&&(r.current={pointerId:h.pointerId,startPath:y.path.map(w=>[w[0],w[1]]),startSvg:o.screenToSvg(h.clientX,h.clientY),axis:n,segIndex:t},document.body.style.cursor=u,h.currentTarget.setPointerCapture(h.pointerId))},m=h=>{const y=r.current;if(!y||h.pointerId!==y.pointerId||!o)return;const w=o.screenToSvg(h.clientX,h.clientY),$=y.startPath,k=y.segIndex;if(k>=$.length-1)return;const b=$[k],S=$[k+1],C=[];for(let R=0;R<=k;R++)C.push($[R]);if(y.axis==="h"){const R=de(b[1]+(w[1]-y.startSvg[1]));C.push([b[0],R]),C.push([S[0],R])}else{const R=de(b[0]+(w[0]-y.startSvg[0]));C.push([R,b[1]]),C.push([R,S[1]])}for(let R=k+1;R<$.length;R++)C.push($[R]);x.getState().updateWirePath(e,C)},p=h=>{const y=r.current;if(!y||h.pointerId!==y.pointerId)return;const w=h.currentTarget;w.hasPointerCapture(h.pointerId)&&w.releasePointerCapture(h.pointerId),r.current=null,document.body.style.cursor=""};return c.jsxs("g",{className:"ole-wire-handle ole-wire-midpoint-group",style:{cursor:u},onPointerDown:f,onPointerMove:m,onPointerUp:p,onPointerCancel:p,children:[c.jsx("circle",{className:"ole-wire-midpoint-hit",cx:l,cy:d,r:8}),c.jsx("circle",{className:"ole-wire-handle ole-wire-midpoint",cx:l,cy:d,r:3.5})]})}const J$=3,bn=12;function Z$(){const e=x(a=>a.internal.buses),t=x(a=>a.selection),n=x(a=>a.selectedNode),o=x(a=>a.internal.nodes),r=x(a=>a.internal.terminalToNode),s=new Set(t),i=new Set;if(n){const a=o.get(n);if(a)for(const l of a.terminals)!l.includes(".")&&e.has(l)&&i.add(l)}return c.jsx("g",{className:"ole-bus-layer",children:Array.from(e.values()).map(({bus:a,geometry:l})=>{const{axis:d,at:u,span:f}=l,m=f/2,p=d==="x"?u[0]-m:u[0],h=d==="x"?u[1]:u[1]-m,y=d==="x"?u[0]+m:u[0],w=d==="x"?u[1]:u[1]+m,$=s.has(a.id),k=i.has(a.id),b=r.get(a.id)??void 0,S=bn/2,C=d==="x"?u[0]-m:u[0]-S,R=d==="x"?u[1]-S:u[1]-m,X=d==="x"?f:bn,V=d==="x"?bn:f;return c.jsxs("g",{"data-bus-id":a.id,"data-element-id":a.id,"data-node-id":b,"data-selected":$?"true":void 0,"data-node-related":k?"true":void 0,className:"ole-bus",children:[c.jsx("rect",{x:C,y:R,width:X,height:V,fill:"transparent",className:"ole-bus-hit"}),c.jsx("line",{x1:p,y1:h,x2:y,y2:w,stroke:"currentColor",strokeWidth:J$,strokeLinecap:"round",fill:"none"})]},a.id)})})}function Q$(){const e=x(a=>a.busbarDrawStart),t=x(a=>a.cursorSvg);if(!e||!t)return null;const n=t[0]-e[0],o=t[1]-e[1],r=Math.abs(n)>=Math.abs(o),s=r?t[0]:e[0],i=r?e[1]:t[1];return c.jsxs("g",{className:"ole-busbar-preview",pointerEvents:"none",children:[c.jsx("line",{x1:e[0],y1:e[1],x2:s,y2:i,className:"ole-busbar-preview-line"}),c.jsx("circle",{cx:e[0],cy:e[1],r:3.5,className:"ole-busbar-preview-anchor"}),c.jsx("circle",{cx:s,cy:i,r:3.5,className:"ole-busbar-preview-anchor"})]})}const eS=4,tS=9;function nS(){const e=x(a=>a.internal.junctions),t=x(a=>a.selection),n=x(a=>a.selectedNode),o=x(a=>a.internal.nodes),r=x(a=>a.internal.terminalToNode),s=new Set(t),i=new Set;if(n){const a=o.get(n);if(a)for(const l of a.terminals)i.add(l)}return c.jsx("g",{className:"ole-junction-layer",children:Array.from(e.values()).map(({junction:a,world:l})=>{const d=r.get(a.id)??void 0;return c.jsxs("g",{"data-junction-id":a.id,"data-element-id":a.id,"data-node-id":d,"data-selected":s.has(a.id)?"true":void 0,"data-node-related":i.has(a.id)?"true":void 0,className:"ole-junction",children:[c.jsx("circle",{cx:l[0],cy:l[1],r:tS,fill:"transparent",className:"ole-junction-hit"}),c.jsx("circle",{cx:l[0],cy:l[1],r:eS,className:"ole-junction-dot"})]},a.id)})})}function Ye(e){const t=[`translate(${e.at[0]} ${e.at[1]})`];return e.rot&&t.push(`rotate(${e.rot})`),e.mirror&&t.push("scale(-1 1)"),t.join(" ")}function oS(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function rS({lib:e}){const t=oS(e.viewBox);return t?c.jsx("rect",{className:"ole-element-hit",x:t.x,y:t.y,width:t.w,height:t.h}):null}function sS(){const e=x(a=>a.internal.elements),t=x(a=>a.internal.layout),n=x(a=>a.selection),o=x(a=>a.selectedNode),r=x(a=>a.internal.nodes),s=new Set(n),i=new Set;if(o){const a=r.get(o);if(a)for(const l of a.terminals){const d=l.indexOf(".");d>0&&i.add(l.slice(0,d))}}return c.jsx("g",{className:"ole-element-layer",children:Array.from(e.values()).map(a=>{const l=t.get(a.element.id);if(!l)return null;const d=s.has(a.element.id),u=i.has(a.element.id);return a.libraryDef?c.jsxs("g",{"data-element-id":a.element.id,"data-selected":d?"true":void 0,"data-node-related":u?"true":void 0,transform:Ye(l),className:"ole-element",children:[c.jsx(rS,{lib:a.libraryDef}),c.jsx("g",{dangerouslySetInnerHTML:{__html:a.libraryDef.svg}})]},a.element.id):c.jsxs("g",{"data-element-id":a.element.id,"data-selected":d?"true":void 0,"data-node-related":u?"true":void 0,transform:Ye(l),className:"ole-element ole-element--unknown",children:[c.jsx("rect",{x:-10,y:-10,width:20,height:20,fill:"none",stroke:"#EF4444",strokeWidth:1,strokeDasharray:"2 2"}),c.jsx("text",{x:0,y:4,fontSize:8,fill:"#EF4444",textAnchor:"middle",fontFamily:"system-ui, sans-serif",children:"?"})]},a.element.id)})})}let sw=null;const Ln=new Set;function zt(e){sw=e;for(const t of Ln)t(e)}function iS(){return sw}function aS(e){return Ln.add(e),()=>{Ln.delete(e)}}function lS(){const[e,t]=O.useState(iS());return O.useEffect(()=>aS(t),[]),!e||e.w===0&&e.h===0?null:c.jsx("rect",{className:"ole-marquee",x:e.x,y:e.y,width:e.w,height:e.h,pointerEvents:"none"})}function cS(){const e=x(d=>d.activeTool),t=x(d=>d.placeKind),n=x(d=>d.cursorSvg),o=x(d=>d.placeFromTerminal);if(e!=="place"||!t||!n)return null;const r=Jb(t);if(!r)return null;let s=null,i=null;if(o){const d=nw(o,n);d&&(s=ow(r,d,n),i={source:d.world,pin:n})}else s=tw(r);const a=n[0]-((s==null?void 0:s.x)??0),l=n[1]-((s==null?void 0:s.y)??0);return c.jsxs("g",{className:"ole-place-ghost-group",pointerEvents:"none",children:[i&&c.jsxs(c.Fragment,{children:[c.jsx("line",{x1:i.source[0],y1:i.source[1],x2:i.pin[0],y2:i.pin[1],className:"ole-wire-preview-line"}),c.jsx("circle",{cx:i.source[0],cy:i.source[1],r:4,className:"ole-wire-preview-anchor"})]}),c.jsx("g",{className:"ole-place-ghost",transform:`translate(${a} ${l})`,opacity:.5,children:c.jsx("g",{dangerouslySetInnerHTML:{__html:r.svg}})})]})}function dS(){const e=x(r=>r.selection),t=x(r=>r.internal.elements),n=x(r=>r.internal.layout),o=x(r=>r.internal.buses);return e.length===0?null:c.jsx("g",{className:"ole-selection-overlay",pointerEvents:"none",children:e.map(r=>{const s=o.get(r);if(s){const{axis:d,at:u,span:f}=s.geometry,m=f/2,p=d==="x"?u[0]-m:u[0]-4,h=d==="x"?u[1]-4:u[1]-m,y=d==="x"?f:8,w=d==="x"?8:f;return c.jsx("rect",{x:p,y:h,width:y,height:w,fill:"none",className:"ole-selection-rect"},r)}const i=t.get(r),a=n.get(r);if(!(i!=null&&i.libraryDef)||!a)return null;const l=uS(i.libraryDef.viewBox);return l?c.jsx("rect",{x:l.x,y:l.y,width:l.w,height:l.h,fill:"none",className:"ole-selection-rect",transform:Ye(a)},r):null})})}function uS(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function fS(){const e=x(s=>s.internal.terminals),t=x(s=>s.internal.terminalToNode),n=x(s=>s.wireFromTerminal),o=x(s=>s.selection),r=new Set(o);return c.jsx("g",{className:"ole-terminal-layer",children:Array.from(e.values()).map(s=>{const i=t.get(s.ref),a=i!==void 0,l=n===s.ref,d=r.has(s.elementId);return c.jsx("circle",{cx:s.world[0],cy:s.world[1],r:3,"data-element-id":s.elementId,"data-terminal-id":s.ref,"data-node-id":i,"data-connected":a?"true":"false","data-active":l?"true":void 0,"data-on-selected":d?"true":void 0,className:"ole-terminal"},s.ref)})})}function mS(){const e=x(i=>i.internal.wireRenders),t=x(i=>i.internal.terminalToNode),n=x(i=>i.diagram.wires),o=x(i=>i.selectedWire),r=x(i=>i.selectedNode),s=new Map;for(const i of n??[]){const a=t.get(i.ends[0]);a&&s.set(i.id,a)}return c.jsx("g",{className:"ole-wire-layer",fill:"none",stroke:"currentColor",strokeWidth:1,children:Array.from(e.values()).flatMap(i=>{const a=i.path;if(a.length<2)return[];const l=a.map(m=>`${m[0]},${m[1]}`).join(" "),d=s.get(i.wireId),u=o===i.wireId,f=r!=null&&r===d;return[c.jsx("polyline",{"data-wire-id":i.wireId,"data-node-id":d,className:"ole-wire-hit",points:l},`hit-${i.wireId}`),c.jsx("polyline",{"data-wire-id":i.wireId,"data-node-id":d,"data-manual":i.userEdited?"true":void 0,"data-selected":u||f?"true":void 0,className:"ole-wire",points:l},i.wireId)]})})}let Ue=null;const zn=new Set;function Re(e){if(!(e===null&&Ue===null||e&&Ue&&e.ref===Ue.ref&&e.world[0]===Ue.world[0]&&e.world[1]===Ue.world[1])){Ue=e;for(const t of zn)t(e)}}function hS(){return Ue}function pS(e){return zn.add(e),()=>{zn.delete(e)}}function gS(){const e=x(l=>l.wireDragFrom),t=x(l=>l.cursorSvg),[n,o]=O.useState(hS());if(O.useEffect(()=>pS(o),[]),!e||!t)return null;const r=e.world,s=(n==null?void 0:n.world[0])??t[0],i=(n==null?void 0:n.world[1])??t[1],a=(n==null?void 0:n.create)==="junction";return c.jsxs("g",{className:"ole-wire-preview",pointerEvents:"none",children:[c.jsx("line",{x1:r[0],y1:r[1],x2:s,y2:i,className:"ole-wire-preview-line"}),c.jsx("circle",{cx:r[0],cy:r[1],r:4,className:"ole-wire-preview-anchor"}),n&&c.jsxs(c.Fragment,{children:[c.jsx("circle",{cx:n.world[0],cy:n.world[1],r:n.isBus?7:8,className:"ole-wire-preview-target-ring","data-create":a?"true":void 0}),!a&&c.jsx("circle",{cx:n.world[0],cy:n.world[1],r:n.isBus?3:4,className:"ole-wire-preview-target-dot"})]})]})}function Qe(e,t){return e instanceof Element?e.closest(`[${t}]`):null}function lt(e){var t;return((t=Qe(e,"data-element-id"))==null?void 0:t.getAttribute("data-element-id"))??null}function yS(e){var t;return((t=Qe(e,"data-bus-id"))==null?void 0:t.getAttribute("data-bus-id"))??null}function xS(e){var t;return((t=Qe(e,"data-junction-id"))==null?void 0:t.getAttribute("data-junction-id"))??null}function it(e){var r;const t=(r=Qe(e,"data-terminal-id"))==null?void 0:r.getAttribute("data-terminal-id");if(t)return t;const n=xS(e);if(n)return n;const o=yS(e);return o||null}function nn(e){var t;return((t=Qe(e,"data-node-id"))==null?void 0:t.getAttribute("data-node-id"))??null}function Rn(e){var t;return((t=Qe(e,"data-wire-id"))==null?void 0:t.getAttribute("data-wire-id"))??null}function Vt(e){var t;return((t=Qe(e,"data-annotation-id"))==null?void 0:t.getAttribute("data-annotation-id"))??null}function iw(e,t){try{e.dispatchEvent(new PointerEvent("pointercancel",{pointerId:t,bubbles:!0,cancelable:!0,pointerType:"touch"}))}catch{}}function bS(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.isContentEditable}function aw(){const e=x.getState(),t=e.activeTool;if(e.editingAnnotation||e.editingElement){if(typeof document<"u"){const n=document.querySelector(".ole-free-annotation-edit-fo div[contenteditable], .ole-element-name-editor div[contenteditable]");n==null||n.blur()}e.setEditingAnnotation(null),e.setEditingElement(null);return}if(t==="wire"||t==="busbar"||t==="junction"||t==="text"){e.setActiveTool("select");return}if(t==="place"){e.placeFromTerminal?e.setPlaceFromTerminal(null):e.placeKind?e.setPlaceKind(null):e.setActiveTool("select");return}(e.selectedNode||e.selectedWire||e.selection.length>0||e.selectedAnnotation)&&e.clearSelection()}function wS(){O.useEffect(()=>{const e=t=>{if(bS(t.target))return;const n=t.metaKey||t.ctrlKey,o=x.getState();if(n&&t.key.toLowerCase()==="z"){t.preventDefault(),t.shiftKey?o.redo():o.undo();return}if(n&&!t.shiftKey&&t.key.toLowerCase()==="y"){t.preventDefault(),o.redo();return}if(n&&t.key.toLowerCase()==="a"){t.preventDefault();const r=x.getState().diagram.elements.map(s=>s.id);o.setSelection(r);return}if(n&&!t.shiftKey&&!t.altKey){const r=t.key.toLowerCase();if(r==="c"){if(o.selection.length===0)return;t.preventDefault(),o.copySelection();return}if(r==="x"){if(o.selection.length===0)return;t.preventDefault(),o.cutSelection();return}if(r==="v"){if(!o.clipboard)return;t.preventDefault(),o.pasteClipboard();return}}if(!n)switch(t.key){case"v":case"V":o.setActiveTool("select");return;case"h":case"H":o.setActiveTool("pan");return;case"w":case"W":o.setActiveTool("wire");return;case"b":case"B":o.setActiveTool("busbar");return;case"j":case"J":o.setActiveTool("junction");return;case"p":case"P":o.setActiveTool("place");return;case"t":case"T":o.setActiveTool("text");return;case"r":case"R":o.selection.length>0&&(t.preventDefault(),o.rotateSelection(90));return;case"m":case"M":o.selection.length>0&&(t.preventDefault(),o.mirrorSelection());return;case"Delete":case"Backspace":o.selectedAnnotation?(t.preventDefault(),o.deleteAnnotation(o.selectedAnnotation)):o.selectedWire?(t.preventDefault(),o.deleteSelectedWire()):o.selectedNode?(t.preventDefault(),o.deleteSelectedNode()):o.selection.length>0&&(t.preventDefault(),o.deleteSelection());return;case"Escape":aw();return}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[])}let Dn=null;const Fn=new Set;function vS(e){if(e!==Dn){Dn=e;for(const t of Fn)t(e)}}function kS(){return Dn}function _S(e){return Fn.add(e),()=>{Fn.delete(e)}}const Zo="ole-hover-element-host",$S="ole-hover-terminal-on",SS="ole-hover-node-on";function jS(e){O.useEffect(()=>{const t=e.current;if(!t)return;let n=null,o=null;const r=new Set,s=new Set,i=(f,m,p)=>{for(const h of f)h.classList.remove(p);f.clear();for(const h of m)h.classList.add(p),f.add(h)},a=f=>{var p,h;if(f===n)return;n&&((p=t.querySelector(`[data-element-id="${Rt(n)}"]`))==null||p.classList.remove(Zo)),f&&((h=t.querySelector(`[data-element-id="${Rt(f)}"]`))==null||h.classList.add(Zo));const m=f?Array.from(t.querySelectorAll(`.ole-terminal[data-element-id="${Rt(f)}"]`)):[];i(r,m,$S),n=f,f?t.setAttribute("data-hover-element",""):t.removeAttribute("data-hover-element"),vS(f)},l=f=>{if(f===o)return;const m=f?Array.from(t.querySelectorAll(`[data-node-id="${Rt(f)}"]`)):[];i(s,m,SS),o=f,f?t.setAttribute("data-hover-node",""):t.removeAttribute("data-hover-node")},d=f=>{a(lt(f.target));const m=it(f.target);let p=null;m?p=x.getState().internal.terminalToNode.get(m)??null:p=nn(f.target),l(p)},u=()=>{a(null),l(null)};return t.addEventListener("pointermove",d),t.addEventListener("pointerleave",u),()=>{t.removeEventListener("pointermove",d),t.removeEventListener("pointerleave",u),a(null),l(null)}},[e])}function Rt(e){return e.replace(/(["\\])/g,"\\$1")}function lw(e,t){const n=x.getState().internal;if(!e.includes(".")){const r=n.buses.get(e);if(r){const{axis:i,at:a,span:l}=r.geometry;if(i==="x"){const m=a[0]-l/2,p=a[0]+l/2,h=Math.max(m,Math.min(p,t[0]));return{ref:e,world:[h,a[1]],isBus:!0}}const d=a[1]-l/2,u=a[1]+l/2,f=Math.max(d,Math.min(u,t[1]));return{ref:e,world:[a[0],f],isBus:!0}}const s=n.junctions.get(e);return s?{ref:e,world:[s.world[0],s.world[1]],isBus:!1}:null}const o=n.terminals.get(e);return o?{ref:e,world:o.world,isBus:!1}:null}const Qo=3;let ce=null,Ne=null,Me=null,he=null;const ES={id:"select",cursor:"default",onPointerDown(e,t){var p,h,y,w,$,k,b;if(e.button!==0||e.target instanceof Element&&e.target.closest(".ole-bus-handle, .ole-wire-handle"))return;const n=x.getState(),o=Vt(e.target);if(o){e.preventDefault(),e.stopPropagation();const S=(p=n.diagram.annotations)==null?void 0:p.find(C=>C.id===o);if(!S)return;n.setSelectedAnnotation(o),he={pointerId:e.pointerId,id:o,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),origin:[S.at[0],S.at[1]],moved:!1};return}const s=(e.target instanceof Element?(h=e.target.closest("[data-terminal-id]"))==null?void 0:h.getAttribute("data-terminal-id"):null)?it(e.target):null;if(s){const S=s.indexOf("."),C=S>0?s.slice(0,S):"";if(C&&n.selection.includes(C)){e.preventDefault(),e.stopPropagation(),e.target instanceof Element&&((w=(y=e.target).hasPointerCapture)!=null&&w.call(y,e.pointerId))&&e.target.releasePointerCapture(e.pointerId),t.hostEl.classList.add("tool-wire"),n.setWireFromTerminal(s),n.setCursorSvg(t.viewport.screenToSvg(e.clientX,e.clientY)),Me={pointerId:e.pointerId,fromRef:s};return}}let i=lt(e.target);if(!i){const S=Rn(e.target);if(S&&typeof document<"u"){const C=document.elementsFromPoint(e.clientX,e.clientY);for(const R of C){const X=(k=($=R.closest)==null?void 0:$.call(R,"[data-bus-id]"))==null?void 0:k.getAttribute("data-bus-id");if(!X)continue;const V=(b=n.diagram.wires)==null?void 0:b.find(te=>te.id===S);V&&(V.ends[0]===X||V.ends[1]===X)&&(i=X);break}}}if(!i){const S=Rn(e.target);if(S){if(e.preventDefault(),e.altKey){const C=nn(e.target);if(C){n.setSelectedNode(C);return}}n.setSelectedWire(S);return}e.shiftKey||n.clearSelection(),Ne={pointerId:e.pointerId,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),shiftKey:e.shiftKey,baseSelection:e.shiftKey?n.selection.slice():[]},t.hostEl.setPointerCapture(e.pointerId),e.preventDefault();return}const a=n.selection;e.shiftKey?n.toggleInSelection(i):a.includes(i)||n.setSelection([i]);const l=e.shiftKey?x.getState().selection:a.includes(i)?a:[i];if(l.length===0)return;const d=x.getState().internal,u=new Map,f=new Map,m=new Map;for(const S of l){const C=d.buses.get(S);if(C){f.set(S,[C.geometry.at[0],C.geometry.at[1]]);continue}const R=d.junctions.get(S);if(R){m.set(S,[R.world[0],R.world[1]]);continue}const X=d.layout.get(S);X&&u.set(S,{...X})}u.size===0&&f.size===0&&m.size===0||(ce={pointerId:e.pointerId,startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),originals:u,busOriginals:f,junctionOriginals:m,moved:!1},e.preventDefault())},onPointerMove(e,t){if(he&&e.pointerId===he.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=de(n[0]-he.startSvg[0]),r=de(n[1]-he.startSvg[1]);!he.moved&&(o!==0||r!==0)&&(he.moved=!0,t.hostEl.hasPointerCapture(e.pointerId)||t.hostEl.setPointerCapture(e.pointerId));const s=t.hostEl.querySelector(`[data-annotation-id="${Be(he.id)}"]`);s&&s.setAttribute("transform",`translate(${o} ${r})`);return}if(Me&&e.pointerId===Me.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY);x.getState().setCursorSvg(n);const o=typeof document<"u"?document.elementFromPoint(e.clientX,e.clientY):null,r=o?it(o):null;if(!r||r===Me.fromRef){Re(null);return}Re(lw(r,n));return}if(ce&&e.pointerId===ce.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=de(n[0]-ce.startSvg[0]),r=de(n[1]-ce.startSvg[1]);!ce.moved&&(o!==0||r!==0)&&(ce.moved=!0,t.hostEl.hasPointerCapture(e.pointerId)||t.hostEl.setPointerCapture(e.pointerId));for(const[s,i]of ce.originals){const a=t.hostEl.querySelector(`[data-element-id="${Be(s)}"]`);if(!a)continue;const l={...i,at:[i.at[0]+o,i.at[1]+r]};a.setAttribute("transform",Ye(l))}for(const s of ce.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${Be(s)}"]`);i&&i.setAttribute("transform",`translate(${o} ${r})`)}for(const s of ce.junctionOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${Be(s)}"]`);i&&i.setAttribute("transform",`translate(${o} ${r})`)}return}if(Ne&&e.pointerId===Ne.pointerId){const n=t.viewport.screenToSvg(e.clientX,e.clientY);zt(er(Ne.startSvg,n));return}},onPointerUp(e,t){if(he&&e.pointerId===he.pointerId){t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=de(n[0]-he.startSvg[0]),r=de(n[1]-he.startSvg[1]),s=t.hostEl.querySelector(`[data-annotation-id="${Be(he.id)}"]`);s&&s.removeAttribute("transform"),he.moved&&(o!==0||r!==0)&&x.getState().updateAnnotation(he.id,{at:[he.origin[0]+o,he.origin[1]+r]}),he=null;return}if(Me&&e.pointerId===Me.pointerId){const n=x.getState(),o=Me.fromRef;Me=null,t.hostEl.classList.remove("tool-wire"),n.setWireFromTerminal(null),n.setCursorSvg(null),Re(null);const r=it(e.target);r&&r!==o&&n.addWire(o,r);return}if(ce&&e.pointerId===ce.pointerId){if(t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId),ce.moved){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=de(n[0]-ce.startSvg[0]),r=de(n[1]-ce.startSvg[1]);if(o!==0||r!==0){const s=new Map;for(const i of ce.originals.keys())s.set(i,[o,r]);for(const i of ce.busOriginals.keys())s.set(i,[o,r]);for(const i of ce.junctionOriginals.keys())s.set(i,[o,r]);x.getState().moveElements(s)}for(const s of ce.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${Be(s)}"]`);i&&i.removeAttribute("transform")}for(const s of ce.junctionOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${Be(s)}"]`);i&&i.removeAttribute("transform")}}ce=null;return}if(Ne&&e.pointerId===Ne.pointerId){t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=er(Ne.startSvg,n);if(o.w>=Qo||o.h>=Qo){const r=NS(o);if(Ne.shiftKey){const s=new Set(Ne.baseSelection);for(const i of r)s.has(i)?s.delete(i):s.add(i);x.getState().setSelection([...s])}else x.getState().setSelection(r)}zt(null),Ne=null}},onPointerCancel(e,t){var n,o,r,s,i,a;if(he&&e.pointerId===he.pointerId){const l=t.hostEl.querySelector(`[data-annotation-id="${Be(he.id)}"]`);if(l&&l.removeAttribute("transform"),(o=(n=t.hostEl).hasPointerCapture)!=null&&o.call(n,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}he=null}if(ce&&e.pointerId===ce.pointerId){for(const[l,d]of ce.originals){const u=t.hostEl.querySelector(`[data-element-id="${Be(l)}"]`);u&&u.setAttribute("transform",Ye(d))}for(const l of ce.busOriginals.keys()){const d=t.hostEl.querySelector(`[data-element-id="${Be(l)}"]`);d&&d.removeAttribute("transform")}for(const l of ce.junctionOriginals.keys()){const d=t.hostEl.querySelector(`[data-element-id="${Be(l)}"]`);d&&d.removeAttribute("transform")}if((s=(r=t.hostEl).hasPointerCapture)!=null&&s.call(r,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}ce=null}if(Me&&e.pointerId===Me.pointerId){t.hostEl.classList.remove("tool-wire");const l=x.getState();l.setWireFromTerminal(null),l.setCursorSvg(null),Re(null),Me=null}if(Ne&&e.pointerId===Ne.pointerId){if((a=(i=t.hostEl).hasPointerCapture)!=null&&a.call(i,e.pointerId))try{t.hostEl.releasePointerCapture(e.pointerId)}catch{}zt(null),Ne=null}},onDoubleClick(e){const t=x.getState(),n=Vt(e.target);if(n){e.preventDefault(),e.stopPropagation(),t.setEditingAnnotation(n);return}const o=lt(e.target);o&&(e.preventDefault(),e.stopPropagation(),t.setEditingElement(o))},onDeactivate(e){if(ce=null,Ne=null,he=null,Me){e.hostEl.classList.remove("tool-wire");const t=x.getState();t.setWireFromTerminal(null),t.setCursorSvg(null),Re(null),Me=null}zt(null)}};function er(e,t){const n=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.abs(t[0]-e[0]),s=Math.abs(t[1]-e[1]);return{x:n,y:o,w:r,h:s}}function NS(e){const{internal:t}=x.getState(),n=[];for(const o of t.elements.values()){if(!o.libraryDef)continue;const r=t.layout.get(o.element.id);if(!r)continue;const s=TS(o.libraryDef.viewBox);if(!s)continue;const i=[[s.x,s.y],[s.x+s.w,s.y],[s.x,s.y+s.h],[s.x+s.w,s.y+s.h]].map(([f,m])=>MS([f,m],r));let a=1/0,l=-1/0,d=1/0,u=-1/0;for(const[f,m]of i)f<a&&(a=f),f>l&&(l=f),m<d&&(d=m),m>u&&(u=m);l>=e.x&&a<=e.x+e.w&&u>=e.y&&d<=e.y+e.h&&n.push(o.element.id)}for(const{bus:o,geometry:r}of t.buses.values()){const{axis:s,at:i,span:a}=r,l=a/2,d=s==="x"?i[0]-l:i[0],u=s==="x"?i[0]+l:i[0],f=s==="x"?i[1]:i[1]-l,m=s==="x"?i[1]:i[1]+l;u>=e.x&&d<=e.x+e.w&&m>=e.y&&f<=e.y+e.h&&n.push(o.id)}for(const{junction:o,world:r}of t.junctions.values())r[0]>=e.x&&r[0]<=e.x+e.w&&r[1]>=e.y&&r[1]<=e.y+e.h&&n.push(o.id);return n}function MS(e,t){let[n,o]=e;switch(t.mirror&&(n=-n),t.rot){case 0:break;case 90:[n,o]=[-o,n];break;case 180:[n,o]=[-n,-o];break;case 270:[n,o]=[o,-n];break}return[n+t.at[0],o+t.at[1]]}function TS(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function Be(e){return e.replace(/(["\\])/g,"\\$1")}const AS=4;let se=null;const CS={id:"pan",cursor:"grab",onPointerDown(e,t){if(e.button!==0)return;const n=t.viewport.getViewport(),o=lt(e.target);let r=null;if(o){const s=x.getState();s.selection.includes(o)||s.setSelection([o]);const i=x.getState().selection,a=x.getState().internal,l=new Map,d=new Map;for(const u of i){const f=a.buses.get(u);if(f){d.set(u,[f.geometry.at[0],f.geometry.at[1]]);continue}const m=a.layout.get(u);m&&l.set(u,{...m})}(l.size>0||d.size>0)&&(r={startSvg:t.viewport.screenToSvg(e.clientX,e.clientY),originals:l,busOriginals:d})}se={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,startTx:n.tx,startTy:n.ty,startTarget:e.target,moved:!1,elementDrag:r},t.hostEl.style.cursor="grabbing",e.preventDefault()},onPointerMove(e,t){if(!se||e.pointerId!==se.pointerId)return;const n=e.clientX-se.startX,o=e.clientY-se.startY;if(!se.moved&&Math.hypot(n,o)>AS){se.moved=!0;try{t.hostEl.setPointerCapture(e.pointerId)}catch{}}if(se.moved){if(se.elementDrag){const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=de(r[0]-se.elementDrag.startSvg[0]),i=de(r[1]-se.elementDrag.startSvg[1]);for(const[a,l]of se.elementDrag.originals){const d=t.hostEl.querySelector(`[data-element-id="${vt(a)}"]`);if(!d)continue;const u={...l,at:[l.at[0]+s,l.at[1]+i]};d.setAttribute("transform",Ye(u))}for(const a of se.elementDrag.busOriginals.keys()){const l=t.hostEl.querySelector(`[data-element-id="${vt(a)}"]`);l&&l.setAttribute("transform",`translate(${s} ${i})`)}return}t.viewport.setViewport({tx:se.startTx+n,ty:se.startTy+o})}},onPointerUp(e,t){if(!(!se||e.pointerId!==se.pointerId)){if(t.hostEl.hasPointerCapture(e.pointerId)&&t.hostEl.releasePointerCapture(e.pointerId),t.hostEl.style.cursor="grab",se.elementDrag&&se.moved){const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=de(n[0]-se.elementDrag.startSvg[0]),r=de(n[1]-se.elementDrag.startSvg[1]);if(o!==0||r!==0){const s=new Map;for(const i of se.elementDrag.originals.keys())s.set(i,[o,r]);for(const i of se.elementDrag.busOriginals.keys())s.set(i,[o,r]);x.getState().moveElements(s)}for(const s of se.elementDrag.busOriginals.keys()){const i=t.hostEl.querySelector(`[data-element-id="${vt(s)}"]`);i&&i.removeAttribute("transform")}}else se.moved||IS(se.startTarget);se=null}},onPointerCancel(e,t){if(se!=null&&se.elementDrag){for(const[n,o]of se.elementDrag.originals){const r=t.hostEl.querySelector(`[data-element-id="${vt(n)}"]`);r&&r.setAttribute("transform",Ye(o))}for(const n of se.elementDrag.busOriginals.keys()){const o=t.hostEl.querySelector(`[data-element-id="${vt(n)}"]`);o&&o.removeAttribute("transform")}}se=null},onDeactivate(){se=null}};function IS(e){if(!e)return;const t=x.getState(),n=Vt(e);if(n){t.setSelectedAnnotation(n);return}const o=lt(e);if(o){t.setSelection([o]);return}const r=nn(e);if(r){t.setSelectedNode(r);return}t.clearSelection()}function vt(e){return e.replace(/(["\\])/g,"\\$1")}const _t={tight:1024,compact:720,dense:520,mini:380},tr={full:0,tight:1,compact:2,dense:3,mini:4};function Oe(e,t){return tr[e]>=tr[t]}function PS(e){return e>=_t.tight?"full":e>=_t.compact?"tight":e>=_t.dense?"compact":e>=_t.mini?"dense":"mini"}const cw=O.createContext("full");function Ve(){return O.useContext(cw)}function OS(e){const[t,n]=O.useState(null);return O.useLayoutEffect(()=>{const o=e.current;if(!o)return;const r=()=>{const i=o.clientWidth;n(a=>a===i?a:i)};if(r(),typeof ResizeObserver>"u")return;const s=new ResizeObserver(r);return s.observe(o),()=>s.disconnect()},[e]),t}function dw(){if(typeof window>"u")return!1;try{if(!window.matchMedia("(pointer: coarse)").matches)return!1}catch{return!1}return window.innerWidth<_t.dense}function on(){dw()&&x.getState().setActiveTool("pan")}function BS(){dw()&&x.getState().setPlaceKind(null)}const nr=10,Dt=e=>Math.round(e/nr)*nr,LS=16;function uw(e,t){let n=e[0],o=1/0;for(let r=0;r<e.length-1;r++){const[s,i]=e[r],[a,l]=e[r+1],d=a-s,u=l-i,f=d*d+u*u,m=f===0?0:Math.max(0,Math.min(1,((t[0]-s)*d+(t[1]-i)*u)/f)),p=s+m*d,h=i+m*u,y=(p-t[0])**2+(h-t[1])**2;y<o&&(o=y,n=[p,h])}return n}function or(e,t){return typeof document<"u"?document.elementFromPoint(e,t):null}function zS(e,t){const n=x.getState().internal.wireRenders;let o=null,r=t;for(const s of n.values()){if(s.path.length<2)continue;const i=uw(s.path,e),a=Math.hypot(i[0]-e[0],i[1]-e[1]);a<=r&&(r=a,o={wireId:s.wireId,at:i})}return o}function wn(e,t,n){const o=e?it(e):null;if(o){const a=lw(o,t);if(a)return{spec:{end:o},world:a.world,ref:o,isBus:a.isBus,create:!1}}let r=e?Rn(e):null,s=null;if(r){const a=x.getState().internal.wireRenders.get(r);s=a?uw(a.path,t):t}else{const a=zS(t,n);a&&(r=a.wireId,s=a.at)}if(r&&s){const a=[Dt(s[0]),Dt(s[1])];return{spec:{onWire:r,at:a},world:a,ref:null,isBus:!1,create:!0}}const i=[Dt(t[0]),Dt(t[1])];return{spec:{junctionAt:i},world:i,ref:null,isBus:!1,create:!0}}function vn(e,t,n){const o=e.viewport.screenToSvg(t,n),r=e.viewport.screenToSvg(t+LS,n);return Math.hypot(r[0]-o[0],r[1]-o[1])}function RS(e){return{ref:e.ref,world:e.world,isBus:e.isBus,...e.create?{create:"junction"}:{}}}function rr(e,t){return e.ref&&t.ref?e.ref===t.ref:!e.ref&&!t.ref?e.world[0]===t.world[0]&&e.world[1]===t.world[1]:!1}const DS={id:"wire",cursor:"crosshair",onActivate(e){e.hostEl.classList.add("tool-wire")},onDeactivate(e){e.hostEl.classList.remove("tool-wire");const t=x.getState();t.setWireFromTerminal(null),t.setWireDragFrom(null),t.setCursorSvg(null),Re(null)},onPointerDown(e,t){var i,a;if(e.button!==0)return;e.preventDefault(),e.stopPropagation(),e.target instanceof Element&&((a=(i=e.target).hasPointerCapture)!=null&&a.call(i,e.pointerId))&&e.target.releasePointerCapture(e.pointerId);const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=vn(t,e.clientX,e.clientY),r=wn(e.target instanceof Element?e.target:null,n,o),s=x.getState();s.setWireDragFrom({spec:r.spec,world:r.world,ref:r.ref}),s.setWireFromTerminal(r.ref),s.setCursorSvg(n)},onPointerMove(e,t){const n=x.getState(),o=n.wireDragFrom;if(!o)return;const r=t.viewport.screenToSvg(e.clientX,e.clientY);n.setCursorSvg(r);const s=or(e.clientX,e.clientY),i=wn(s,r,vn(t,e.clientX,e.clientY)),a={spec:o.spec,world:o.world,ref:o.ref,create:!o.ref};Re(rr(a,i)?null:RS(i))},onPointerUp(e,t){const n=x.getState(),o=n.wireDragFrom;if(n.setWireFromTerminal(null),n.setWireDragFrom(null),n.setCursorSvg(null),Re(null),!o)return;const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=or(e.clientX,e.clientY)??(e.target instanceof Element?e.target:null),i=wn(s,r,vn(t,e.clientX,e.clientY)),a={spec:o.spec,world:o.world,ref:o.ref,create:!o.ref};rr(a,i)||(n.connectWire(o.spec,i.spec),on())},onPointerLeave(){const e=x.getState();e.setWireFromTerminal(null),e.setWireDragFrom(null),e.setCursorSvg(null),Re(null)}},sr=10;let kt=!1;function ir(){setTimeout(()=>BS(),0)}const FS={id:"place",cursor:"copy",onActivate(e){e.hostEl.classList.add("tool-place")},onDeactivate(e){e.hostEl.classList.remove("tool-place");const t=x.getState();t.setPlaceFromTerminal(null),t.setCursorSvg(null),kt=!1},onPointerDown(e,t){var s,i;if(e.button!==0)return;const{placeKind:n}=x.getState();if(!n)return;e.preventDefault();const o=it(e.target);if(o){e.stopPropagation(),e.target instanceof Element&&((i=(s=e.target).hasPointerCapture)!=null&&i.call(s,e.pointerId))&&e.target.releasePointerCapture(e.pointerId);const a=x.getState();a.setPlaceFromTerminal(o),a.setCursorSvg(t.viewport.screenToSvg(e.clientX,e.clientY));return}const r=t.viewport.screenToSvg(e.clientX,e.clientY);ew(n,r),kt=!0},onPointerMove(e,t){const n=t.viewport.screenToSvg(e.clientX,e.clientY);x.getState().setCursorSvg([ar(n[0]),ar(n[1])])},onPointerUp(e,t){const n=x.getState(),o=n.placeFromTerminal;if(o){n.setPlaceFromTerminal(null);const{placeKind:r}=n;if(!r)return;const s=t.viewport.screenToSvg(e.clientX,e.clientY);R$(r,o,s),ir();return}kt&&(kt=!1,ir())},onPointerLeave(){const e=x.getState();e.setPlaceFromTerminal(null),e.setCursorSvg(null)},onPointerCancel(){const e=x.getState();e.setPlaceFromTerminal(null),e.setCursorSvg(null),kt=!1}};function ar(e){return Math.round(e/sr)*sr}const lr=10,cr=20;function nt(e){return Math.round(e/lr)*lr}const HS={id:"busbar",cursor:"crosshair",onPointerDown(e,t){if(e.button!==0)return;e.preventDefault();const n=t.viewport.screenToSvg(e.clientX,e.clientY),o=[nt(n[0]),nt(n[1])];x.getState().setBusbarDrawStart(o),x.getState().setCursorSvg(o)},onPointerMove(e,t){const n=t.viewport.screenToSvg(e.clientX,e.clientY);x.getState().setCursorSvg([nt(n[0]),nt(n[1])])},onPointerUp(e,t){const n=x.getState().busbarDrawStart;if(x.getState().setBusbarDrawStart(null),!n)return;const o=t.viewport.screenToSvg(e.clientX,e.clientY),r=nt(o[0]),s=nt(o[1]),i=r-n[0],a=s-n[1],l=Math.abs(i)>=Math.abs(a);let d,u,f;if(l){if(u=Math.abs(i),u<cr)return;d=0,f=[(n[0]+r)/2,n[1]]}else{if(u=Math.abs(a),u<cr)return;d=90,f=[n[0],(n[1]+s)/2]}x.getState().addBus(f,u,d),on()},onPointerLeave(){const e=x.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)},onPointerCancel(){const e=x.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)},onDeactivate(){const e=x.getState();e.setBusbarDrawStart(null),e.setCursorSvg(null)}},dr=10,ur=e=>Math.round(e/dr)*dr,WS={id:"junction",cursor:"crosshair",onPointerDown(e,t){if(e.button!==0)return;e.preventDefault(),e.stopPropagation();const n=t.viewport.screenToSvg(e.clientX,e.clientY);x.getState().addJunction([ur(n[0]),ur(n[1])]),on()}},qS={id:"text",cursor:"text",onPointerDown(e,t){if(e.button!==0)return;const n=x.getState(),o=Vt(e.target);if(o){e.preventDefault(),e.stopPropagation(),n.setActiveTool("select"),n.setSelectedAnnotation(o);return}e.preventDefault();const r=t.viewport.screenToSvg(e.clientX,e.clientY),s=n.addAnnotation([r[0],r[1]],"");n.setEditingAnnotation(s),on()}},GS={select:ES,pan:CS,wire:DS,place:FS,busbar:HS,junction:WS,text:qS};function XS(e,t){const n=x(o=>o.activeTool);O.useEffect(()=>{var m;const o=e.current;if(!o)return;const r=GS[n],s={viewport:t,hostEl:o};(m=r.onActivate)==null||m.call(r,s),r.cursor&&(o.style.cursor=r.cursor);const i=p=>{var h;return(h=r.onPointerDown)==null?void 0:h.call(r,p,s)},a=p=>{var h;return(h=r.onPointerMove)==null?void 0:h.call(r,p,s)},l=p=>{var h;return(h=r.onPointerUp)==null?void 0:h.call(r,p,s)},d=p=>{var h;return r.onPointerCancel?r.onPointerCancel(p,s):(h=r.onPointerUp)==null?void 0:h.call(r,p,s)},u=p=>{var h;return(h=r.onPointerLeave)==null?void 0:h.call(r,p,s)},f=p=>{var h;return(h=r.onDoubleClick)==null?void 0:h.call(r,p,s)};return o.addEventListener("pointerdown",i),o.addEventListener("pointermove",a),o.addEventListener("pointerup",l),o.addEventListener("pointercancel",d),o.addEventListener("pointerleave",u),o.addEventListener("dblclick",f),()=>{var p;o.removeEventListener("pointerdown",i),o.removeEventListener("pointermove",a),o.removeEventListener("pointerup",l),o.removeEventListener("pointercancel",d),o.removeEventListener("pointerleave",u),o.removeEventListener("dblclick",f),(p=r.onDeactivate)==null||p.call(r,s),o.style.cursor=""}},[n,e,t])}let Hn=1;const Wn=new Set;function YS(e){if(e!==Hn){Hn=e;for(const t of Wn)t(e)}}function KS(){return Hn}function VS(e){return Wn.add(e),()=>{Wn.delete(e)}}const kn=.1,_n=8,US=1.0015,JS=1.02;function ZS(e,t,n={tx:0,ty:0,scale:1}){const o=O.useRef({...n}),r=O.useRef(new Set),s=()=>{const i=t.current,a=e.current;if(i&&i.setAttribute("transform",`translate(${o.current.tx} ${o.current.ty}) scale(${o.current.scale})`),a&&a.style.setProperty("--canvas-scale",String(o.current.scale)),YS(o.current.scale),r.current.size>0){const l={...o.current};for(const d of r.current)d(l)}};return O.useEffect(()=>{const i=e.current;if(!i)return;let a=!1,l=-1,d=0,u=0,f=0,m=0,p=!1;const h=new Map;let y=null,w=!1;const $=()=>{if(h.size<2){y=null;return}const D=[...h.values()],W=D[1].x-D[0].x,ye=D[1].y-D[0].y,ue=Math.hypot(W,ye)||1,pe=i.getBoundingClientRect();y={startDist:ue,startScale:o.current.scale,startTx:o.current.tx,startTy:o.current.ty,startMidX:(D[0].x+D[1].x)/2-pe.left,startMidY:(D[0].y+D[1].y)/2-pe.top}},k=D=>{if(D.pointerType==="touch"){if(h.set(D.pointerId,{x:D.clientX,y:D.clientY}),h.size>=2&&!w){w=!0;for(const W of h.keys())W!==D.pointerId&&iw(i,W);$()}if(w){D.stopPropagation(),D.preventDefault();try{i.setPointerCapture(D.pointerId)}catch{}}}},b=D=>{if(D.pointerType!=="touch"||!h.has(D.pointerId)||(h.set(D.pointerId,{x:D.clientX,y:D.clientY}),!w||!y))return;D.stopPropagation();const W=[...h.values()];if(W.length<2)return;const ye=W[1].x-W[0].x,ue=W[1].y-W[0].y,pe=Math.hypot(ye,ue)||1,ne=i.getBoundingClientRect(),re=(W[0].x+W[1].x)/2-ne.left,ge=(W[0].y+W[1].y)/2-ne.top,xe=pe/y.startDist,_e=$n(y.startScale*xe,kn,_n),Ee=_e/y.startScale;o.current.tx=y.startMidX-(y.startMidX-y.startTx)*Ee+(re-y.startMidX),o.current.ty=y.startMidY-(y.startMidY-y.startTy)*Ee+(ge-y.startMidY),o.current.scale=_e,s()},S=D=>{var W;if(D.pointerType==="touch"&&h.has(D.pointerId)&&(h.delete(D.pointerId),w)){if(D.stopPropagation(),(W=i.hasPointerCapture)!=null&&W.call(i,D.pointerId))try{i.releasePointerCapture(D.pointerId)}catch{}h.size>=2?$():y=null,h.size===0&&(w=!1)}},C=D=>{D.preventDefault();const W=i.getBoundingClientRect(),ye=D.clientX-W.left,ue=D.clientY-W.top,pe=D.ctrlKey||D.metaKey;if(D.deltaX===0||pe){const ge=Math.pow(pe?JS:US,-D.deltaY),xe=$n(o.current.scale*ge,kn,_n),_e=xe/o.current.scale;o.current.tx=ye-(ye-o.current.tx)*_e,o.current.ty=ue-(ue-o.current.ty)*_e,o.current.scale=xe}else o.current.tx-=D.deltaX,o.current.ty-=D.deltaY;s()},R=D=>{const W=D.button===1,ye=p&&D.button===0;!W&&!ye||(D.preventDefault(),a=!0,l=D.pointerId,d=D.clientX,u=D.clientY,f=o.current.tx,m=o.current.ty,i.setPointerCapture(D.pointerId),i.style.cursor="grabbing")},X=D=>{!a||D.pointerId!==l||(o.current.tx=f+(D.clientX-d),o.current.ty=m+(D.clientY-u),s())},V=D=>{a&&D.pointerId===l&&(a=!1,i.releasePointerCapture(D.pointerId),i.style.cursor=p?"grab":"")},te=D=>{if(D.code==="Space"&&!p){const W=D.target;if(W&&(W.tagName==="INPUT"||W.tagName==="TEXTAREA"||W.isContentEditable))return;p=!0,i.style.cursor="grab",D.preventDefault()}},ae=D=>{D.code==="Space"&&(p=!1,a||(i.style.cursor=""))};return i.addEventListener("wheel",C,{passive:!1}),i.addEventListener("pointerdown",R),i.addEventListener("pointermove",X),i.addEventListener("pointerup",V),i.addEventListener("pointercancel",V),i.addEventListener("pointerdown",k,{capture:!0}),i.addEventListener("pointermove",b,{capture:!0}),i.addEventListener("pointerup",S,{capture:!0}),i.addEventListener("pointercancel",S,{capture:!0}),window.addEventListener("keydown",te),window.addEventListener("keyup",ae),s(),()=>{i.removeEventListener("wheel",C),i.removeEventListener("pointerdown",R),i.removeEventListener("pointermove",X),i.removeEventListener("pointerup",V),i.removeEventListener("pointercancel",V),i.removeEventListener("pointerdown",k,{capture:!0}),i.removeEventListener("pointermove",b,{capture:!0}),i.removeEventListener("pointerup",S,{capture:!0}),i.removeEventListener("pointercancel",S,{capture:!0}),window.removeEventListener("keydown",te),window.removeEventListener("keyup",ae)}},[]),{screenToSvg(i,a){const l=e.current;if(!l)return[i,a];const d=l.getBoundingClientRect(),u=(i-d.left-o.current.tx)/o.current.scale,f=(a-d.top-o.current.ty)/o.current.scale;return[u,f]},getViewport(){return{...o.current}},setViewport(i){i.tx!==void 0&&(o.current.tx=i.tx),i.ty!==void 0&&(o.current.ty=i.ty),i.scale!==void 0&&(o.current.scale=$n(i.scale,kn,_n)),s()},subscribe(i){return r.current.add(i),()=>{r.current.delete(i)}}}}function $n(e,t,n){return e<t?t:e>n?n:e}const fw=typeof navigator<"u"&&/Mac|iP(ad|hone|od)/.test(navigator.platform),ot=fw?"⌘":"Ctrl+",QS=fw?"⇧":"Shift+",Sn=[10,20,50,100,200,500,1e3,2e3,5e3,1e4],e4=18;function t4(e){for(const t of Sn)if(t*e>=e4)return t;return Sn[Sn.length-1]}function n4(){const e=ie(),t=O.useRef(null),n=O.useRef(null),o=O.useRef(null),r=ZS(t,n);XS(t,r),jS(t),O.useEffect(()=>(Vo(r),()=>Vo(null)),[r]),O.useEffect(()=>{const u=f=>{const m=o.current;if(!m)return;const h=t4(f.scale)*f.scale;m.setAttribute("width",String(h)),m.setAttribute("height",String(h)),m.setAttribute("patternTransform",`translate(${f.tx} ${f.ty})`)};return u(r.getViewport()),r.subscribe(u)},[r]);const s=Vv(),i=O.useCallback((u,f,m)=>{const p=x.getState(),h=p.activeTool;if(h==="wire"||h==="busbar"||h==="junction"||h==="place"){aw();return}const y=lt(m);if(y)p.selection.includes(y)||p.setSelection([y]);else{const R=nn(m);R&&p.selectedNode!==R&&p.setSelectedNode(R)}const w=x.getState(),$=w.selection.length>0,k=w.selectedNode!=null,b=!!w.clipboard,S=w.diagram.elements.length>0,C=[{label:e("menu.undo"),shortcut:`${ot}Z`,icon:Kn,onSelect:()=>x.getState().undo(),disabled:w.past.length===0},{label:e("menu.redo"),shortcut:`${ot}${QS}Z`,icon:Yn,onSelect:()=>x.getState().redo(),disabled:w.future.length===0},{type:"separator"},{label:e("menu.cut"),shortcut:`${ot}X`,icon:Fr,onSelect:()=>x.getState().cutSelection(),disabled:!$},{label:e("menu.copy"),shortcut:`${ot}C`,icon:Lr,onSelect:()=>x.getState().copySelection(),disabled:!$},{label:e("menu.paste"),shortcut:`${ot}V`,icon:Br,onSelect:()=>x.getState().pasteClipboard(),disabled:!b},{type:"separator"},{label:e("menu.rotate"),shortcut:"R",icon:Dr,onSelect:()=>x.getState().rotateSelection(90),disabled:!$},{label:e("menu.mirror"),shortcut:"M",icon:zr,onSelect:()=>x.getState().mirrorSelection(),disabled:!$},{type:"separator"},{label:e("menu.selectAll"),shortcut:`${ot}A`,icon:gv,onSelect:()=>{const R=x.getState();R.setSelection(R.diagram.elements.map(X=>X.id))},disabled:!S},{type:"separator"},{label:e(k&&!$?"menu.disconnect":"menu.delete"),shortcut:"Del",icon:Wr,destructive:!0,onSelect:()=>k&&!$?x.getState().deleteSelectedNode():x.getState().deleteSelection(),disabled:!$&&!k}];s.open(u,f,C)},[s,e]);O.useEffect(()=>{const u=t.current;if(!u)return;const f=700,m=4;let p,h=null;const y=()=>{p!==void 0&&window.clearTimeout(p),p=void 0,h=null},w=b=>{b.pointerType==="touch"&&(y(),h={pointerId:b.pointerId,x:b.clientX,y:b.clientY,target:b.target},p=window.setTimeout(()=>{const S=h;h=null,p=void 0,S&&(iw(u,S.pointerId),i(S.x,S.y,S.target))},f))},$=b=>{if(!h||b.pointerId!==h.pointerId)return;const S=b.clientX-h.x,C=b.clientY-h.y;Math.hypot(S,C)>m&&y()},k=b=>{!h||b.pointerId!==h.pointerId||y()};return u.addEventListener("pointerdown",w),u.addEventListener("pointermove",$),u.addEventListener("pointerup",k),u.addEventListener("pointercancel",k),()=>{y(),u.removeEventListener("pointerdown",w),u.removeEventListener("pointermove",$),u.removeEventListener("pointerup",k),u.removeEventListener("pointercancel",k)}},[i]);const a=u=>{u.dataTransfer.types.includes("application/x-oneline-kind")&&(u.preventDefault(),u.dataTransfer.dropEffect="copy")},l=u=>{const f=u.dataTransfer.getData("application/x-oneline-kind");if(!f)return;u.preventDefault();const m=r.screenToSvg(u.clientX,u.clientY);ew(f,m)},d=u=>{u.preventDefault(),i(u.clientX,u.clientY,u.target)};return c.jsx("div",{ref:t,className:"ole-canvas-root absolute inset-0 overflow-hidden",onDragOver:a,onDrop:l,onContextMenu:d,children:c.jsxs("svg",{className:"ole-canvas-svg block h-full w-full",xmlns:"http://www.w3.org/2000/svg",children:[c.jsx("defs",{children:c.jsx("pattern",{ref:o,id:"ole-grid-dots",width:20,height:20,patternUnits:"userSpaceOnUse",children:c.jsx("circle",{cx:0,cy:0,r:2,fill:"var(--canvas-grid-strong)"})})}),c.jsx("rect",{width:"100%",height:"100%",fill:"url(#ole-grid-dots)"}),c.jsxs("g",{ref:n,className:"ole-viewport",children:[c.jsx(Z$,{}),c.jsx(mS,{}),c.jsx(nS,{}),c.jsx(sS,{}),c.jsx(F$,{}),c.jsx(W$,{}),c.jsx(dS,{}),c.jsx(Y$,{}),c.jsx(K$,{}),c.jsx(fS,{}),c.jsx(gS,{}),c.jsx(Q$,{}),c.jsx(cS,{}),c.jsx(lS,{})]})]})})}const fr=60,o4=.1,r4=8,s4=8;function i4(e,t,n){return e<t?t:e>n?n:e}function a4(){return document.querySelector(".ole-canvas-root")}function Zn(){const e=Ze(),t=a4();if(!e||!t)return!1;const n=t.getBoundingClientRect();if(n.width===0||n.height===0)return!1;const o=t.querySelectorAll("[data-element-id]");if(o.length===0)return e.setViewport({tx:n.width/2,ty:n.height/2,scale:1}),!0;let r=1/0,s=1/0,i=-1/0,a=-1/0;for(const $ of o){const k=$.getBoundingClientRect();k.width===0&&k.height===0||(k.left<r&&(r=k.left),k.top<s&&(s=k.top),k.right>i&&(i=k.right),k.bottom>a&&(a=k.bottom))}if(r===1/0)return!1;const[l,d]=e.screenToSvg(r,s),[u,f]=e.screenToSvg(i,a),m=Math.max(u-l,1),p=Math.max(f-d,1),h=i4(Math.min((n.width-fr*2)/m,(n.height-fr*2)/p),o4,r4),y=(l+u)/2,w=(d+f)/2;return e.setViewport({tx:n.width/2-h*y,ty:n.height/2-h*w,scale:h}),!0}function Qn(){let e=s4;const t=()=>{Zn()||--e>0&&requestAnimationFrame(t)};requestAnimationFrame(t)}const mr=10,l4=100;function c4(){return typeof window>"u"||!window.matchMedia?!1:window.matchMedia("(hover: none), (pointer: coarse)").matches}function d4(){const[e,t]=O.useState(kS()),[n,o]=O.useState(!1),[r,s]=O.useState(null),i=O.useRef(null),a=O.useRef(void 0),[l]=O.useState(c4);O.useEffect(()=>_S(h=>t(h)),[]),O.useEffect(()=>{if(window.clearTimeout(a.current),o(!1),s(null),!!e)return a.current=window.setTimeout(()=>o(!0),l4),()=>window.clearTimeout(a.current)},[e]);const d=x(h=>e?h.diagram.elements.find(y=>y.id===e)??null:null);if(O.useLayoutEffect(()=>{if(!n||!e)return;let h=0,y=-1,w=-1;const $=()=>{const k=document.querySelector(`[data-element-id="${u4(e)}"]`),b=i.current;if(k&&b){const S=k.getBoundingClientRect();let C=S.bottom+mr;C+b.offsetHeight>window.innerHeight-4&&(C=S.top-b.offsetHeight-mr);let R=S.left+S.width/2-b.offsetWidth/2;R=Math.max(4,Math.min(R,window.innerWidth-b.offsetWidth-4)),(C!==y||R!==w)&&(s({top:C,left:R}),y=C,w=R)}h=requestAnimationFrame($)};return h=requestAnimationFrame($),()=>cancelAnimationFrame(h)},[n,e]),l||!n||!e||!d)return null;const u=Ke[d.kind],f=d.name??d.id,m=(u==null?void 0:u.name)??d.kind,p=d.name&&d.name!==d.id;return typeof document>"u"?null:Ir.createPortal(c.jsxs("div",{ref:i,role:"tooltip",className:"ole-root ole-glass pointer-events-none fixed z-[100] flex items-center gap-1.5 rounded-md border border-border px-2 py-1 text-[11px] leading-snug shadow-md",style:{top:(r==null?void 0:r.top)??-9999,left:(r==null?void 0:r.left)??-9999,opacity:r?1:0,transition:"opacity 80ms ease-out"},children:[c.jsx("span",{className:"font-medium text-foreground",children:f}),p&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground",children:d.id}),c.jsx("span",{className:"text-muted-foreground/80",children:"·"}),c.jsx("span",{className:"text-muted-foreground",children:m})]}),document.body)}function u4(e){return e.replace(/(["\\])/g,"\\$1")}function f4({width:e,children:t}){const n=e==null?"full":PS(e);return c.jsx(cw.Provider,{value:n,children:t})}function hr(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function m4(...e){return t=>{let n=!1;const o=e.map(r=>{const s=hr(r,t);return!n&&typeof s=="function"&&(n=!0),s});if(n)return()=>{for(let r=0;r<o.length;r++){const s=o[r];typeof s=="function"?s():hr(e[r],null)}}}}var h4=Symbol.for("react.lazy"),Ut=ke[" use ".trim().toString()];function p4(e){return typeof e=="object"&&e!==null&&"then"in e}function mw(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===h4&&"_payload"in e&&p4(e._payload)}function g4(e){const t=x4(e),n=ke.forwardRef((o,r)=>{let{children:s,...i}=o;mw(s)&&typeof Ut=="function"&&(s=Ut(s._payload));const a=ke.Children.toArray(s),l=a.find(w4);if(l){const d=l.props.children,u=a.map(f=>f===l?ke.Children.count(d)>1?ke.Children.only(null):ke.isValidElement(d)?d.props.children:null:f);return c.jsx(t,{...i,ref:r,children:ke.isValidElement(d)?ke.cloneElement(d,void 0,u):null})}return c.jsx(t,{...i,ref:r,children:s})});return n.displayName=`${e}.Slot`,n}var y4=g4("Slot");function x4(e){const t=ke.forwardRef((n,o)=>{let{children:r,...s}=n;if(mw(r)&&typeof Ut=="function"&&(r=Ut(r._payload)),ke.isValidElement(r)){const i=k4(r),a=v4(s,r.props);return r.type!==ke.Fragment&&(a.ref=o?m4(o,i):i),ke.cloneElement(r,a)}return ke.Children.count(r)>1?ke.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var b4=Symbol("radix.slottable");function w4(e){return ke.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===b4}function v4(e,t){const n={...t};for(const o in t){const r=e[o],s=t[o];/^on[A-Z]/.test(o)?r&&s?n[o]=(...a)=>{const l=s(...a);return r(...a),l}:r&&(n[o]=r):o==="style"?n[o]={...r,...s}:o==="className"&&(n[o]=[r,s].filter(Boolean).join(" "))}return{...e,...n}}function k4(e){var o,r;let t=(o=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:o.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}const pr=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,gr=Xr,_4=(e,t)=>n=>{var o;if((t==null?void 0:t.variants)==null)return gr(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:r,defaultVariants:s}=t,i=Object.keys(r).map(d=>{const u=n==null?void 0:n[d],f=s==null?void 0:s[d];if(u===null)return null;const m=pr(u)||pr(f);return r[d][m]}),a=n&&Object.entries(n).reduce((d,u)=>{let[f,m]=u;return m===void 0||(d[f]=m),d},{}),l=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((d,u)=>{let{class:f,className:m,...p}=u;return Object.entries(p).every(h=>{let[y,w]=h;return Array.isArray(w)?w.includes({...s,...a}[y]):{...s,...a}[y]===w})?[...d,f,m]:d},[]);return gr(e,i,l,n==null?void 0:n.class,n==null?void 0:n.className)},$4=_4("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),Ae=ke.forwardRef(({className:e,variant:t,size:n,asChild:o=!1,...r},s)=>{const i=o?y4:"button";return c.jsx(i,{className:je($4({variant:t,size:n,className:e})),ref:s,...r})});Ae.displayName="Button";const S4=350;function Ce({content:e,children:t,disabled:n,delayMs:o=S4}){const r=O.useRef(null),s=O.useRef(null),[i,a]=O.useState(!1),[l,d]=O.useState(null),u=O.useId(),f=O.useRef(void 0),m=()=>{n||(window.clearTimeout(f.current),f.current=window.setTimeout(()=>a(!0),o))},p=()=>{window.clearTimeout(f.current),a(!1)};O.useLayoutEffect(()=>{if(!i||!r.current||!s.current)return;const $=r.current.getBoundingClientRect(),k=s.current.getBoundingClientRect(),b=8;let S="top",C=$.top-k.height-b;C<4&&(S="bottom",C=$.bottom+b);let R=$.left+$.width/2-k.width/2;R=Math.max(4,Math.min(R,window.innerWidth-k.width-4)),d({top:C,left:R,side:S})},[i,e]),O.useEffect(()=>()=>window.clearTimeout(f.current),[]),O.useEffect(()=>{if(!i)return;const $=b=>{b.key==="Escape"&&a(!1)},k=()=>a(!1);return window.addEventListener("keydown",$),window.addEventListener("scroll",k,!0),window.addEventListener("resize",k),()=>{window.removeEventListener("keydown",$),window.removeEventListener("scroll",k,!0),window.removeEventListener("resize",k)}},[i]);const h=t,y=h.props,w=O.cloneElement(h,{ref:$=>{r.current=$;const k=h.ref;typeof k=="function"?k($):k&&typeof k=="object"&&(k.current=$)},onPointerEnter:$=>{var k;(k=y.onPointerEnter)==null||k.call(y,$),m()},onPointerLeave:$=>{var k;(k=y.onPointerLeave)==null||k.call(y,$),p()},onFocus:$=>{var k;(k=y.onFocus)==null||k.call(y,$),m()},onBlur:$=>{var k;(k=y.onBlur)==null||k.call(y,$),p()},"aria-describedby":i?u:y["aria-describedby"]});return c.jsxs(c.Fragment,{children:[w,i&&typeof document<"u"&&Ir.createPortal(c.jsx("div",{ref:s,id:u,role:"tooltip","data-side":(l==null?void 0:l.side)??"top",className:"ole-root ole-glass pointer-events-none fixed z-[100] max-w-[280px] rounded-md border border-border px-2 py-1 text-[11px] leading-snug text-foreground shadow-md",style:{top:(l==null?void 0:l.top)??-9999,left:(l==null?void 0:l.left)??-9999,opacity:l?1:0,transition:"opacity 80ms ease-out"},children:e}),document.body)]})}const yr=12,j4=56;function E4(){var $;const e=ie(),t=x(k=>k.selection),n=x(k=>k.selectedNode),o=x(k=>k.selectedWire),r=x(k=>k.activeTool),s=x(k=>k.rotateSelection),i=x(k=>k.mirrorSelection),a=x(k=>k.deleteSelection),l=x(k=>k.deleteSelectedNode),d=x(k=>k.deleteSelectedWire),u=x(k=>k.resetWirePath),f=x(k=>k.internal.wireRenders),m=o!=null&&(($=f.get(o))==null?void 0:$.userEdited)===!0,p=O.useRef(null);O.useEffect(()=>{const k=p.current;if(!k)return;const b=t.length>0,S=!b&&o!=null,C=!b&&!S&&n!=null;if(!((b||S||C)&&(r==="select"||r==="pan"))){k.style.display="none";return}k.style.display="flex";let X=0,V="";const te=()=>{let ae=1/0,D=-1/0,W=1/0,ye=-1/0,ue=!1;const pe=ne=>{ne.width===0&&ne.height===0||(ne.left<ae&&(ae=ne.left),ne.right>D&&(D=ne.right),ne.top<W&&(W=ne.top),ne.bottom>ye&&(ye=ne.bottom),ue=!0)};if(b)for(const ne of t){const re=document.querySelector(`[data-element-id="${CSS.escape(ne)}"]`);re&&pe(re.getBoundingClientRect())}else if(S&&o){const ne=document.querySelector(`polyline.ole-wire[data-wire-id="${CSS.escape(o)}"]`);ne&&pe(ne.getBoundingClientRect())}else if(C&&n){const ne=document.querySelectorAll(`polyline.ole-wire[data-node-id="${CSS.escape(n)}"]`);for(const re of ne)pe(re.getBoundingClientRect())}if(ue){const ne=(ae+D)/2;let re=W-yr,ge="-100%";re<j4&&(re=ye+yr,ge="0%");const xe=`translate3d(${ne}px, ${re}px, 0) translate(-50%, ${ge})`;xe!==V&&(k.style.transform=xe,V=xe)}X=requestAnimationFrame(te)};return X=requestAnimationFrame(te),()=>cancelAnimationFrame(X)},[t,n,o,r]);const h=t.length===0&&o!=null,y=t.length===0&&!h&&n!=null,w=y||h;return c.jsxs("div",{ref:p,role:"toolbar","aria-label":e(h?"ctx.ariaWire":y?"ctx.ariaNode":"ctx.ariaElement"),className:"ole-glass pointer-events-auto fixed left-0 top-0 z-30 hidden items-center gap-0.5 rounded-2xl border border-border p-1 shadow-md",children:[h&&m&&o&&c.jsxs(c.Fragment,{children:[c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{children:c.jsx("span",{className:"font-medium",children:e("ctx.resetWirePath")})}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.resetWirePathHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>u(o),"aria-label":e("ctx.resetWirePath"),children:c.jsx(pv,{})})}),c.jsx("div",{"aria-hidden":!0,className:"mx-0.5 h-4 w-px bg-border"})]}),!w&&c.jsxs(c.Fragment,{children:[c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.rotate")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"R"})]}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.rotateHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>s(90),"aria-label":e("ctx.rotate"),children:c.jsx(Dr,{})})}),c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.mirror")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"M"})]}),c.jsx("div",{className:"text-muted-foreground",children:e("ctx.mirrorHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",className:"size-7",onClick:()=>i(),"aria-label":e("ctx.mirrorTitle"),children:c.jsx(zr,{})})}),c.jsx("div",{"aria-hidden":!0,className:"mx-0.5 h-4 w-px bg-border"})]}),c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:e("ctx.delete")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:"Del"})]}),c.jsx("div",{className:"text-muted-foreground",children:e(h?"ctx.deleteHintWire":y?"ctx.deleteHintNode":"ctx.deleteHintElement")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",className:"size-7 text-destructive hover:text-destructive",onClick:()=>h?d():y?l():a(),"aria-label":e("ctx.delete"),children:c.jsx(Wr,{})})})]})}function eo({open:e,onOpenChange:t,trigger:n,children:o}){const r=O.useRef(null);return O.useEffect(()=>{if(!e)return;const s=a=>{r.current&&!r.current.contains(a.target)&&t(!1)},i=a=>{a.key==="Escape"&&t(!1)};return window.addEventListener("mousedown",s),window.addEventListener("keydown",i),()=>{window.removeEventListener("mousedown",s),window.removeEventListener("keydown",i)}},[e,t]),c.jsxs("div",{ref:r,className:"relative",children:[n,e&&c.jsx("div",{role:"menu",className:"ole-glass absolute bottom-full right-0 mb-1.5 min-w-52 rounded-md border border-border p-1 shadow-md",children:o})]})}const hw="ole-panel-open";function N4(){if(typeof window>"u")return{outlineOpen:!1};try{const e=window.localStorage.getItem(hw);if(!e)return{outlineOpen:!1};const t=JSON.parse(e);return typeof t!="object"||t===null?{outlineOpen:!1}:{outlineOpen:t.outline===!0}}catch{return{outlineOpen:!1}}}function xr(e){try{const t={outline:e.outlineOpen};window.localStorage.setItem(hw,JSON.stringify(t))}catch{}}const Mt=Jt((e,t)=>({...N4(),setOutlineOpen:n=>{e({outlineOpen:n}),xr(t())},toggleOutline:()=>{e(n=>({outlineOpen:!n.outlineOpen})),xr(t())}})),Wt=[.1,.25,.5,.75,1,1.25,1.5,2,3,4,6,8],pw=.1,gw=8,yw="ole-grid";function M4(){try{const e=window.localStorage.getItem(yw);return e==null?!0:e==="1"}catch{return!0}}function T4(e){try{window.localStorage.setItem(yw,e?"1":"0")}catch{}}function A4(e,t,n){return e<t?t:e>n?n:e}function xw(){return document.querySelector(".ole-canvas-root")}function to(e){const t=Ze(),n=xw();if(!t||!n)return;const o=n.getBoundingClientRect(),r=o.width/2,s=o.height/2,i=t.getViewport(),a=A4(e,pw,gw),l=a/i.scale;t.setViewport({tx:r-(r-i.tx)*l,ty:s-(s-i.ty)*l,scale:a})}function C4(){const e=Ze();if(!e)return;const t=e.getViewport().scale,n=Wt.find(o=>o>t+1e-6)??gw;to(n)}function I4(){const e=Ze();if(!e)return;const t=e.getViewport().scale;let n=pw;for(let o=Wt.length-1;o>=0;o--)if(Wt[o]<t-1e-6){n=Wt[o];break}to(n)}const P4={off:"id",id:"all",all:"off"};function O4(){var o;const e=x.getState(),t=((o=e.diagram.meta)==null?void 0:o.labelMode)??"all",n=P4[t];e.dispatch(r=>{const s={...r.meta??{},labelMode:n};return{...r,meta:s}})}function bw(){const[e,t]=O.useState(()=>M4());return O.useEffect(()=>{const n=xw();n==null||n.classList.toggle("hide-grid",!e),T4(e)},[e]),O.useEffect(()=>{const n=o=>{if(o.metaKey||o.ctrlKey||o.altKey||o.key!=="g"&&o.key!=="G")return;const r=o.target;r&&(r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.isContentEditable)||(o.preventDefault(),t(s=>!s))};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[]),[e,t]}function ww(){const e=ie();return c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.zoomOut")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.zoomOutHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:I4,"aria-label":e("view.zoomOut"),children:c.jsx(Xn,{})})})}function vw(){const e=ie();return c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.zoomIn")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.zoomInHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:C4,"aria-label":e("view.zoomIn"),children:c.jsx(mv,{})})})}function kw(){const e=ie(),[t,n]=O.useState(KS);return O.useEffect(()=>VS(n),[]),c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.reset")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.current",{z:Math.round(t*100)})})]}),children:c.jsxs("button",{type:"button",onClick:()=>to(1),className:"min-w-12 rounded-md px-2 py-1 text-center text-xs tabular-nums text-muted-foreground hover:bg-accent hover:text-accent-foreground","aria-label":e("view.reset"),children:[Math.round(t*100),"%"]})})}function _w(){const e=ie();return c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e("view.fit")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.fitHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:Zn,"aria-label":e("view.fit"),children:c.jsx(dv,{})})})}function $w({grid:e,setGrid:t}){const n=ie();return c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:n(e?"view.gridHide":"view.gridShow")}),c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:n("view.gridHotkey")})]}),c.jsx("div",{className:"text-muted-foreground",children:n(e?"view.gridHideHint":"view.gridShowHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:()=>t(o=>!o),"aria-label":n(e?"view.gridHideAria":"view.gridShowAria"),"aria-pressed":e,className:je(!e&&"text-muted-foreground/60"),children:c.jsx(lv,{})})})}function Sw(){const e=ie(),t=x(n=>{var o;return((o=n.diagram.meta)==null?void 0:o.labelMode)??"all"});return c.jsx(Ce,{content:c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:e(t==="off"?"view.labelOff":t==="id"?"view.labelId":"view.labelAll")}),c.jsx("div",{className:"text-muted-foreground",children:e("view.labelHint")})]}),children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:O4,"aria-label":e("view.label"),"aria-pressed":t!=="off",className:je(t==="off"&&"text-muted-foreground/60"),children:c.jsx(qr,{})})})}function B4({stacked:e}={}){const t=ie(),[n,o]=O.useState(!1),[r,s]=bw(),i=c.jsxs("div",{className:"space-y-0.5",children:[c.jsx("div",{className:"font-medium",children:t("view.menu")}),c.jsx("div",{className:"text-muted-foreground",children:t("view.menuHint")})]}),a=e?c.jsx(Ce,{content:i,children:c.jsxs("button",{type:"button",onClick:()=>o(l=>!l),"aria-label":t("view.menu"),"aria-pressed":n,className:je("flex h-12 w-12 flex-col items-center justify-center gap-0.5 rounded-md text-[10px] font-medium leading-tight transition-colors",n?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[c.jsx(Nn,{className:"size-4"}),c.jsx("span",{className:"max-w-full truncate",children:t("view.menu")})]})}):c.jsx(Ce,{content:i,children:c.jsx(Ae,{variant:"ghost",size:"icon",onClick:()=>o(l=>!l),"aria-label":t("view.menu"),"aria-pressed":n,children:c.jsx(Nn,{})})});return c.jsx(eo,{open:n,onOpenChange:o,trigger:a,children:c.jsxs("div",{className:"flex flex-col gap-0.5",children:[c.jsx(kw,{}),c.jsxs("div",{className:"flex items-center gap-0.5",children:[c.jsx(ww,{}),c.jsx(vw,{})]}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsxs("div",{className:"flex items-center gap-0.5",children:[c.jsx(_w,{}),c.jsx($w,{grid:r,setGrid:s}),c.jsx(Sw,{})]})]})})}function L4(){const e=Ve();return Oe(e,"dense")?null:c.jsx(z4,{tier:e})}function z4({tier:e}){const t=Oe(e,"tight"),[n,o]=bw();return c.jsx("div",{className:"absolute z-20",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))",right:"calc(0.75rem + env(safe-area-inset-right, 0px))"},children:c.jsxs("div",{className:"ole-glass flex items-center gap-0.5 rounded-2xl border border-border p-1.5 shadow-sm",children:[c.jsx(ww,{}),!t&&c.jsx(kw,{}),c.jsx(vw,{}),c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-4 w-px bg-border"}),c.jsx(_w,{}),c.jsx($w,{grid:n,setGrid:o}),c.jsx(Sw,{})]})})}const br=[{id:"select",labelKey:"tool.select",hotkey:"V",descriptionKey:"tool.selectHint",icon:uv,switchTo:"select",iconOnly:!0},{id:"pan",labelKey:"tool.pan",hotkey:"H",descriptionKey:"tool.panHint",icon:cv,switchTo:"pan",groupBreakAfter:!0,iconOnly:!0},{id:"busbar",labelKey:"tool.bus",hotkey:"B",descriptionKey:"tool.busHint",icon:Xn,switchTo:"busbar"},{id:"junction",labelKey:"tool.junction",hotkey:"J",descriptionKey:"tool.junctionHint",icon:nv,switchTo:"junction",iconOnly:!0},{id:"place",labelKey:"tool.place",hotkey:"P",descriptionKey:"tool.placeHint",icon:Hr,switchTo:"place"},{id:"wire",labelKey:"tool.wire",hotkey:"W",descriptionKey:"tool.wireHint",icon:Or,switchTo:"wire"},{id:"text",labelKey:"tool.text",hotkey:"T",descriptionKey:"tool.textHint",icon:qr,switchTo:"text",iconOnly:!0}];function R4(){const e=ie(),t=x(u=>u.activeTool),n=x(u=>u.placeKind),o=x(u=>u.placeFromTerminal),r=x(u=>u.wireDragFrom),s=x(u=>u.busbarDrawStart),i=x(u=>u.selection.length>0||u.selectedNode!=null);let a=null,l=!1;switch(t){case"select":a=e(i?"mode.selectWithSel":"mode.selectEmpty"),i&&(l=!0);break;case"pan":a=e("mode.pan");break;case"wire":a=e(r?"mode.wireDragging":"mode.wireInit"),l=!0;break;case"busbar":a=e(s?"mode.busDragging":"mode.busInit"),l=!0;break;case"junction":a=e("mode.junction"),l=!0;break;case"place":n?o?a=e("mode.placeFromTerm"):a=e("mode.placeNormal"):a=e("mode.placeNoKind"),l=!0;break;case"text":a=e("mode.text"),l=!0;break}if(!a)return null;const d=e(t==="select"?"mode.escSelect":"mode.escOther");return c.jsxs("div",{className:"ole-glass pointer-events-none flex items-center gap-2 rounded-full border border-border px-3 py-1 text-xs text-muted-foreground shadow-sm",children:[c.jsx("span",{children:a}),l&&c.jsxs("span",{className:"text-muted-foreground/70",children:["· ",d]})]})}function D4(){const e=ie(),t=x(h=>h.activeTool),n=x(h=>h.placeKind),o=x(h=>h.setActiveTool),r=x(h=>h.past.length),s=x(h=>h.future.length),i=x(h=>h.undo),a=x(h=>h.redo),l=Ve(),d=Oe(l,"tight"),u=!Oe(l,"dense"),f=Oe(l,"dense"),m=f?br.filter(h=>h.id!=="select"&&h.id!=="text"):br,p=h=>t===h.switchTo;return c.jsxs("div",{className:"absolute left-1/2 z-20 flex -translate-x-1/2 flex-col items-center gap-1.5",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))"},children:[u&&c.jsx(R4,{}),c.jsxs("div",{className:je("ole-glass flex flex-row items-center rounded-2xl border border-border shadow-sm",f?"gap-0.5 p-1":"gap-0.5 p-1.5"),children:[f&&c.jsx(F4,{stacked:!0}),m.map(h=>{const y=h.icon,w=p(h),$=h.id==="place"&&w&&n==null?e("tool.placeNoKindTooltip"):e(h.descriptionKey);return c.jsxs(O.Fragment,{children:[c.jsx(at,{icon:y,label:e(h.labelKey),hotkey:h.hotkey,active:w,iconOnly:!f&&(h.iconOnly||d),stacked:f,description:$,onClick:()=>{o(h.switchTo,{placeKind:h.presetPlaceKind!==void 0?h.presetPlaceKind:void 0})}}),h.groupBreakAfter&&!f&&c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"})]},h.id)}),!f&&c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"}),f?c.jsx(W4,{stacked:!0}):c.jsxs(c.Fragment,{children:[c.jsx(at,{icon:Kn,label:e("tool.undo"),hotkey:"⌘Z",description:e("tool.undoHint"),iconOnly:!0,disabled:r===0,onClick:i}),c.jsx(at,{icon:Yn,label:e("tool.redo"),hotkey:"⌘⇧Z",description:e("tool.redoHint"),iconOnly:!0,disabled:s===0,onClick:a}),c.jsx("div",{"aria-hidden":!0,className:"mx-1 h-5 w-px bg-border"}),c.jsx(H4,{iconOnly:d})]}),f&&c.jsx(B4,{stacked:!0})]})]})}function F4({stacked:e}){const t=ie(),n=Mt(r=>r.outlineOpen),o=Mt(r=>r.toggleOutline);return c.jsx(at,{icon:Rr,label:t("outline.title"),active:n,iconOnly:!0,stacked:e,onClick:o})}function at({icon:e,label:t,hotkey:n,active:o,disabled:r,iconOnly:s,stacked:i,onClick:a,description:l}){const d=c.jsxs("div",{className:"space-y-0.5",children:[c.jsxs("div",{children:[c.jsx("span",{className:"font-medium",children:t}),n&&c.jsx("span",{className:"ml-1.5 text-muted-foreground",children:n})]}),l&&c.jsx("div",{className:"text-muted-foreground",children:l})]});return c.jsx(Ce,{content:d,disabled:r,children:c.jsxs("button",{type:"button",onClick:a,disabled:r,"aria-label":t,"aria-pressed":o,className:je("rounded-md font-medium transition-colors",i?"flex h-12 w-12 flex-col items-center justify-center gap-0.5 text-[10px] leading-tight":"flex h-9 items-center gap-1.5 text-xs",!i&&(s?"w-9 justify-center":"px-2.5"),o?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-accent-foreground",r&&"pointer-events-none opacity-40"),children:[c.jsxs("span",{className:"relative inline-flex shrink-0",children:[c.jsx(e,{className:"size-4"}),n&&!i&&c.jsx("span",{"aria-hidden":!0,className:je("pointer-events-none absolute -right-1.5 -top-1.5 rounded-sm px-1 font-mono text-[8px] leading-[1.1]",o?"bg-primary-foreground/20 text-primary-foreground/85":"bg-foreground/10 text-muted-foreground"),children:n})]}),i?c.jsx("span",{className:"max-w-full truncate",children:t}):!s&&c.jsx("span",{children:t})]})})}function jw(){const e=x(r=>r.diagram.elements),t=x(r=>r.diagram.layout),n=x(r=>r.selection),o=t??{};return{hasAnyElement:e.length>0,hasArrangedAny:Object.keys(o).length>0,hasGapsAll:e.some(r=>!o[r.id]),hasSelection:n.length>0,selectionHasArranged:n.some(r=>!!o[r]),selectionHasGaps:n.some(r=>!o[r])}}function H4({iconOnly:e}){const t=ie(),[n,o]=O.useState(!1),r=jw(),s=i=>()=>{o(!1),i()};return c.jsxs(eo,{open:n,onOpenChange:o,trigger:c.jsx(at,{icon:$t,label:t("layout.label"),description:t("layout.hint"),active:n,iconOnly:e,onClick:()=>o(i=>!i)}),children:[c.jsx(Te,{onClick:s(()=>x.getState().autoArrangeAll()),icon:c.jsx($t,{}),disabled:!r.hasAnyElement||!r.hasArrangedAny,children:t("layout.allAuto")}),c.jsx(Te,{onClick:s(()=>x.getState().autoArrangeSelection()),icon:c.jsx($t,{}),disabled:!r.hasSelection||!r.selectionHasArranged,children:t("layout.selAuto")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Te,{onClick:s(()=>x.getState().fillUnplacedAll()),icon:c.jsx(qt,{}),disabled:!r.hasGapsAll,children:t("layout.allFill")}),c.jsx(Te,{onClick:s(()=>x.getState().fillUnplacedSelection()),icon:c.jsx(qt,{}),disabled:!r.hasSelection||!r.selectionHasGaps,children:t("layout.selFill")})]})}function W4({stacked:e}){const t=ie(),[n,o]=O.useState(!1),r=x(m=>m.past.length),s=x(m=>m.future.length),i=x(m=>m.undo),a=x(m=>m.redo),l=x(m=>m.selection.length>0),d=x(m=>m.clipboard!=null),u=jw(),f=m=>()=>{o(!1),m()};return c.jsxs(eo,{open:n,onOpenChange:o,trigger:c.jsx(at,{icon:Nn,label:t("tool.more"),description:t("tool.moreHint"),active:n,iconOnly:!0,stacked:e,onClick:()=>o(m=>!m)}),children:[c.jsx(Te,{onClick:f(i),icon:c.jsx(Kn,{}),disabled:r===0,children:t("tool.undo")}),c.jsx(Te,{onClick:f(a),icon:c.jsx(Yn,{}),disabled:s===0,children:t("tool.redo")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Te,{onClick:f(()=>x.getState().cutSelection()),icon:c.jsx(Fr,{}),disabled:!l,children:t("menu.cut")}),c.jsx(Te,{onClick:f(()=>x.getState().copySelection()),icon:c.jsx(Lr,{}),disabled:!l,children:t("menu.copy")}),c.jsx(Te,{onClick:f(()=>x.getState().pasteClipboard()),icon:c.jsx(Br,{}),disabled:!d,children:t("menu.paste")}),c.jsx("div",{"aria-hidden":!0,className:"my-1 h-px bg-border"}),c.jsx(Te,{onClick:f(()=>x.getState().autoArrangeAll()),icon:c.jsx($t,{}),disabled:!u.hasAnyElement||!u.hasArrangedAny,children:t("layout.allAuto")}),c.jsx(Te,{onClick:f(()=>x.getState().autoArrangeSelection()),icon:c.jsx($t,{}),disabled:!u.hasSelection||!u.selectionHasArranged,children:t("layout.selAuto")}),c.jsx(Te,{onClick:f(()=>x.getState().fillUnplacedAll()),icon:c.jsx(qt,{}),disabled:!u.hasGapsAll,children:t("layout.allFill")}),c.jsx(Te,{onClick:f(()=>x.getState().fillUnplacedSelection()),icon:c.jsx(qt,{}),disabled:!u.hasSelection||!u.selectionHasGaps,children:t("layout.selFill")})]})}function Te({children:e,icon:t,onClick:n,disabled:o}){return c.jsxs("button",{type:"button",role:"menuitem",disabled:o,onClick:n,className:je("flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",o&&"pointer-events-none text-muted-foreground opacity-60 hover:bg-transparent"),children:[t,c.jsx("span",{className:"flex-1",children:e})]})}function q4(){const e=Mt(r=>r.outlineOpen),t=Mt(r=>r.setOutlineOpen),n=Ve();return Oe(n,"dense")?e?c.jsx("div",{className:"absolute z-10",style:{left:"calc(0.75rem + var(--ole-left-inset, 0px))",right:"calc(0.75rem + var(--ole-right-inset, 0px))",bottom:"calc(4rem + var(--ole-bottom-inset, 0px) + 0.75rem)"},children:c.jsx(wr,{onClose:()=>t(!1),sheet:!0})}):null:c.jsx("div",{className:"absolute z-10 flex flex-col items-start",style:{bottom:"calc(0.75rem + var(--ole-bottom-inset, 0px))",left:"calc(0.75rem + var(--ole-left-inset, 0px))",maxHeight:"calc(100% - 1.5rem)"},children:e?c.jsx(wr,{onClose:()=>t(!1)}):c.jsx(G4,{onClick:()=>t(!0)})})}function G4({onClick:e}){const t=ie(),n=Ve(),o=Oe(n,"compact");return c.jsxs("button",{type:"button",onClick:e,"aria-label":t("outline.title"),title:t("outline.title"),className:je("ole-glass flex h-12 items-center rounded-2xl border border-border text-muted-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground",o?"w-12 justify-center":"gap-2 px-3"),children:[c.jsx(Rr,{className:"size-4 shrink-0"}),!o&&c.jsx("span",{className:"text-xs font-medium",children:t("outline.title")})]})}function wr({onClose:e,sheet:t}){const n=ie(),o=x(d=>d.diagram.elements),r=x(d=>d.activeTool==="place"),s=Ve(),i=Oe(s,"compact"),a=Oe(s,"dense"),l=t?"min(50vh, calc(100vh - 9rem))":r?"min(40vh, calc(100vh - 200px))":"min(70vh, calc(100vh - 100px))";return c.jsxs("aside",{className:je("ole-glass flex flex-col overflow-hidden rounded-2xl border border-border shadow-sm",t?"w-full":i?"w-52":"w-64"),style:{height:l},children:[c.jsxs("button",{type:"button",onClick:e,"aria-label":n("outline.collapseAria"),title:n("outline.collapse"),className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2 text-left transition-colors hover:bg-muted/40",children:[c.jsx("span",{className:"flex-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:n("outline.title")}),!a&&c.jsx(Y4,{children:o.length}),c.jsx(fv,{className:"size-3.5 text-muted-foreground"})]}),c.jsx("div",{className:"flex-1 overflow-y-auto px-2 pb-2",children:o.length===0?c.jsx("p",{className:"px-2 py-2 text-xs italic text-muted-foreground",children:n("outline.empty")}):c.jsx("ul",{className:"space-y-px",children:o.map(d=>c.jsx(X4,{element:d},d.id))})})]})}function X4({element:e}){const t=Ke[e.kind],n=x(l=>l.selection.includes(e.id)),o=x(l=>l.setSelection),r=x(l=>l.toggleInSelection),s=Ve(),i=!Oe(s,"compact"),a=l=>{l.shiftKey||l.metaKey||l.ctrlKey?r(e.id):o([e.id])};return c.jsxs("li",{className:"group flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-accent data-[selected=true]:bg-[color-mix(in_oklch,var(--selection)_18%,transparent)]",title:e.note??`${e.name??e.id} (${e.kind})`,"data-element-id":e.id,"data-selected":n?"true":void 0,onClick:a,children:[c.jsx("div",{className:"flex h-4 w-6 shrink-0 items-center justify-center",children:t&&c.jsx("svg",{viewBox:t.viewBox,className:"ole-symbol size-full",preserveAspectRatio:"xMidYMid meet",dangerouslySetInnerHTML:{__html:t.svg}})}),c.jsx("span",{className:"flex-1 truncate text-xs text-foreground/90 group-hover:text-accent-foreground",children:e.name??e.id}),i&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:e.id})]})}function Y4({children:e}){return c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e})}const K4={"arc-suppression-coil.name":"消弧线圈","arrester.name":"避雷器 (FBL)","async-motor.name":"异步电动机","autotransformer.name":"自耦变压器","battery.name":"电池储能","breaker.name":"断路器 (QF)","busbar.name":"母线段","converter-bidir.name":"双向变流器 (PCS)","ct.name":"电流互感器 (CT)","disconnector.name":"隔离开关 (QS)","earth.name":"接地","earthing-switch.name":"接地刀闸 (QE)","fuse.name":"熔断器 (FU)","generator.name":"发电机 (G)","grid-source.name":"系统电源","grounding-transformer.name":"接地变 (Z形)","inverter.name":"逆变器 (DC→AC)","load-switch.name":"负荷开关","load.name":"负荷","ngr.name":"中性点电阻 (NGR)","pt.name":"电压互感器 (PT)","pv.name":"光伏组件","rectifier.name":"整流器 (AC→DC)","series-reactor.name":"串联电抗器","shunt-capacitor.name":"并联电容器","shunt-reactor.name":"并联电抗器","sync-motor.name":"同步电动机","transformer-2w.name":"双绕组变压器","transformer-3w.name":"三绕组变压器","wind-turbine.name":"风力发电机","gfci-breaker.name":"GFCI 断路器 (RCBO)","rcd.name":"剩余电流装置 (RCD)","recloser.name":"重合闸 (Recloser)","energy-meter.name":"电能表 (Wh)","voltmeter.name":"电压表 (V)","ammeter.name":"电流表 (A)","wattmeter.name":"功率表 (W)","frequency-meter.name":"频率表 (Hz)","contactor.name":"接触器 (KM)","motor-starter.name":"电机启动器","thermal-overload.name":"热过载继电器","vfd.name":"变频器 (VFD)","soft-starter.name":"软启动器","transfer-switch.name":"切换开关 (ATS)","dc-disconnector.name":"直流隔离开关","dc-combiner.name":"直流汇流箱","ev-charger.name":"EV 充电桩","arc-suppression-coil.desc":"中性点谐振接地:电感线圈连接到地","busbar.desc":"可拉伸单母线段,多设备挂接","converter-bidir.desc":"储能变流器:双向 AC ↔ DC","earthing-switch.desc":"隔离开关 + 接地连接,单端口","grid-source.desc":"无穷大母线 / 外部电网","grounding-transformer.desc":"星-曲折接线变压器,中性点接地用","load.desc":"抽象负荷(电流流出箭头)","ngr.desc":"小电阻接地:连接变压器中性点到地","series-reactor.desc":"与并联电抗器同符号;通过用法区分","wind-turbine.desc":"风机:发电机 + 三叶轮标记","gfci-breaker.desc":"剩余电流断路器带过流保护 (UL943 / IEC 61009)。北美 GFCI / 欧洲 RCBO。","rcd.desc":"不带过流保护的剩余电流断路器 (IEC 61008)。","recloser.desc":"中压自动重合闸开关。","energy-meter.desc":"有功电能表 (kWh) — 服务入口 / 子表。","contactor.desc":"主回路接触器, 通常配热继电器和电机使用。","motor-starter.desc":"电机启动器 (IEC 60617 通用符号)。","thermal-overload.desc":"电机热过载保护继电器, 通常串接在接触器和电机之间。","vfd.desc":"Variable Frequency Drive — 异步电动机调速。","soft-starter.desc":"电机软启动器 (晶闸管降压启动)。","transfer-switch.desc":"双源切换开关 (Automatic / Manual Transfer Switch)。两个电源输入 + 一个负荷输出, 互锁不并联。","dc-disconnector.desc":"DC 隔离开关 — 光伏组串 / 储能 直流侧隔离。","dc-combiner.desc":"光伏组串汇流箱 (4 路输入示例)。","ev-charger.desc":"电动汽车充电站 / 充电桩。","breaker.state.open":"断开","disconnector.state.open":"断开","earthing-switch.state.open":"断开","fuse.state.blown":"熔断","load-switch.state.open":"断开","gfci-breaker.state.open":"断开","rcd.state.open":"断开","recloser.state.open":"断开","contactor.state.open":"断开","thermal-overload.state.tripped":"动作","transfer-switch.state.position":"位置 (normal/emergency/off)","dc-disconnector.state.open":"断开","battery.param.E":"容量","busbar.param.Un":"额定电压","converter-bidir.param.S":"容量","load.param.P":"有功功率","load.param.cosphi":"功率因数","ngr.param.R":"电阻","shunt-capacitor.param.Q":"无功容量","shunt-capacitor.param.stages":"分组数","transformer-2w.param.S":"容量","transformer-2w.param.ratio":"变比","gfci-breaker.param.In":"额定电流","gfci-breaker.param.IDn":"剩余动作电流","rcd.param.IDn":"剩余动作电流"},V4={"arc-suppression-coil.name":"Arc-suppression coil","arrester.name":"Surge arrester (FBL)","async-motor.name":"Asynchronous motor","autotransformer.name":"Autotransformer","battery.name":"Battery storage","breaker.name":"Circuit breaker (QF)","busbar.name":"Busbar segment","converter-bidir.name":"Bidirectional converter (PCS)","ct.name":"Current transformer (CT)","disconnector.name":"Disconnector (QS)","earth.name":"Earth","earthing-switch.name":"Earthing switch (QE)","fuse.name":"Fuse (FU)","generator.name":"Generator (G)","grid-source.name":"Grid source","grounding-transformer.name":"Grounding transformer (zig-zag)","inverter.name":"Inverter (DC→AC)","load-switch.name":"Load break switch","load.name":"Load","ngr.name":"Neutral grounding resistor (NGR)","pt.name":"Voltage transformer (PT)","pv.name":"PV module","rectifier.name":"Rectifier (AC→DC)","series-reactor.name":"Series reactor","shunt-capacitor.name":"Shunt capacitor","shunt-reactor.name":"Shunt reactor","sync-motor.name":"Synchronous motor","transformer-2w.name":"Two-winding transformer","transformer-3w.name":"Three-winding transformer","wind-turbine.name":"Wind turbine","gfci-breaker.name":"GFCI breaker (RCBO)","rcd.name":"Residual current device (RCD)","recloser.name":"Recloser","energy-meter.name":"Energy meter (Wh)","voltmeter.name":"Voltmeter (V)","ammeter.name":"Ammeter (A)","wattmeter.name":"Wattmeter (W)","frequency-meter.name":"Frequency meter (Hz)","contactor.name":"Contactor (KM)","motor-starter.name":"Motor starter","thermal-overload.name":"Thermal overload relay","vfd.name":"Variable frequency drive (VFD)","soft-starter.name":"Soft starter","transfer-switch.name":"Transfer switch (ATS)","dc-disconnector.name":"DC disconnector","dc-combiner.name":"DC combiner box","ev-charger.name":"EV charger","arc-suppression-coil.desc":"Resonant neutral grounding: inductor to earth","busbar.desc":"Stretchable single-bus segment with multiple taps","converter-bidir.desc":"Storage converter: bidirectional AC ↔ DC","earthing-switch.desc":"Disconnector + earth connection, single port","grid-source.desc":"Infinite bus / external grid","grounding-transformer.desc":"Wye-zigzag transformer for neutral grounding","load.desc":"Abstract load (current-out arrow)","ngr.desc":"Low-resistance grounding: transformer neutral to earth","series-reactor.desc":"Same symbol as shunt reactor; distinguished by usage","wind-turbine.desc":"Wind turbine: generator + three-blade rotor mark","gfci-breaker.desc":"Residual-current breaker with overcurrent (UL943 / IEC 61009). NA GFCI / EU RCBO.","rcd.desc":"Residual-current breaker without overcurrent (IEC 61008).","recloser.desc":"Medium-voltage automatic recloser.","energy-meter.desc":"Active energy meter (kWh) — service entrance / submeter.","contactor.desc":"Main-circuit contactor; typically used with a thermal overload and a motor.","motor-starter.desc":"Motor starter (IEC 60617 general symbol).","thermal-overload.desc":"Motor thermal-overload relay; sits between the contactor and the motor.","vfd.desc":"Variable Frequency Drive for induction motor speed control.","soft-starter.desc":"Motor soft-starter (thyristor-based reduced-voltage starting).","transfer-switch.desc":"Two-source transfer switch (ATS / manual). Two source inputs + one load output, mechanically interlocked.","dc-disconnector.desc":"DC isolating switch — PV string / battery DC-side isolation.","dc-combiner.desc":"PV string combiner box (4-input example).","ev-charger.desc":"Electric vehicle charging station.","breaker.state.open":"Open","disconnector.state.open":"Open","earthing-switch.state.open":"Open","fuse.state.blown":"Blown","load-switch.state.open":"Open","gfci-breaker.state.open":"Open","rcd.state.open":"Open","recloser.state.open":"Open","contactor.state.open":"Open","thermal-overload.state.tripped":"Tripped","transfer-switch.state.position":"Position (normal/emergency/off)","dc-disconnector.state.open":"Open","battery.param.E":"Capacity","busbar.param.Un":"Rated voltage","converter-bidir.param.S":"Capacity","load.param.P":"Active power","load.param.cosphi":"Power factor","ngr.param.R":"Resistance","shunt-capacitor.param.Q":"Reactive capacity","shunt-capacitor.param.stages":"Stages","transformer-2w.param.S":"Capacity","transformer-2w.param.ratio":"Ratio","gfci-breaker.param.In":"Rated current","gfci-breaker.param.IDn":"Residual operating current","rcd.param.IDn":"Residual operating current","resistor.name":"Resistor (R)","capacitor.name":"Capacitor (C)","diode.name":"Diode (D)","indicator-light.name":"Indicator light (HL)","push-button.name":"Push-button (SB)","relay-coil.name":"Relay coil (KA)","make-contact.name":"NO contact (NO)","break-contact.name":"NC contact (NC)","bell.name":"Bell (HA)","terminal.name":"Terminal / junction (X)","fuse-switch-disconnector.name":"Fuse switch-disconnector","socket-outlet.name":"Socket outlet / connector","inductor.name":"Inductor (L)","voltage-regulator.name":"Voltage regulator (T)","dc-motor.name":"DC motor (M)","heater.name":"Heating element (EH)","selector-switch.name":"Selector switch (SA)","limit-switch.name":"Limit switch (SQ)","proximity-switch.name":"Proximity switch (SQ)","time-relay.name":"Time relay (KT)","buzzer.name":"Buzzer (HA)","siren.name":"Siren (HA)","thermocouple.name":"Thermocouple (BT)","thyristor.name":"Thyristor / SCR (V)","triac.name":"Triac (V)","zener-diode.name":"Zener diode (D)","igbt.name":"IGBT","plc.name":"PLC / controller","ups.name":"UPS","power-supply.name":"Power supply (PS)","genset.name":"Generator set (G)","protective-relay.name":"Protective relay","overcurrent-relay.name":"Overcurrent relay (50/51)","undervoltage-relay.name":"Undervoltage relay (27)","reverse-power-relay.name":"Reverse-power relay (32)","distance-relay.name":"Distance relay (21)","phase-failure-relay.name":"Phase-failure relay","buchholz-relay.name":"Buchholz relay (63)","power-factor-meter.name":"Power-factor meter (cosφ)","synchronoscope.name":"Synchronoscope","varmeter.name":"Varmeter (var)","resistor.desc":"General resistor / current-limiting / braking resistor.","capacitor.desc":"General / filter / DC-bus capacitor. Use shunt capacitor for PF correction.","diode.desc":"Rectifier / freewheeling / protection diode. t1 = anode (top), t2 = cathode (bottom).","indicator-light.desc":"Signal / status indicator light.","push-button.desc":"Manual push-button, automatic return (NO make).","relay-coil.desc":"Relay / contactor operating coil (box).","make-contact.desc":"Normally-open auxiliary contact (make).","break-contact.desc":"Normally-closed auxiliary contact (break).","bell.desc":"Signal bell / alarm bell.","terminal.desc":"Terminal / junction box / connection node.","fuse-switch-disconnector.desc":"On-load fuse switch-disconnector.","socket-outlet.desc":"Power socket outlet / multipole connector.","inductor.desc":"General inductor / coil / choke.","voltage-regulator.desc":"Adjustable induction / autotransformer voltage regulator.","dc-motor.desc":"DC motor (series-field general symbol).","heater.desc":"Resistive heating element / heating load.","selector-switch.desc":"Selector / changeover switch (rotary, stay-put).","limit-switch.desc":"Travel / position switch (NO, mechanically operated).","proximity-switch.desc":"Proximity sensor / contactless proximity switch.","time-relay.desc":"Time-delay (slow-operating) relay coil.","buzzer.desc":"Signal buzzer.","siren.desc":"Audible siren / alarm.","thermocouple.desc":"Thermocouple temperature sensor.","thyristor.desc":"Reverse-blocking triode thyristor / SCR. t1 = anode (top), t2 = cathode (bottom).","triac.desc":"Bidirectional triode thyristor (TRIAC).","zener-diode.desc":"Zener / voltage-regulator diode. t1 = anode (top), t2 = cathode (bottom).","igbt.desc":"N-channel enhancement IGBT. t1 = collector (top), t2 = emitter (bottom), t_g = gate.","plc.desc":"Programmable logic controller (PLC).","ups.desc":"Online / standby uninterruptible power supply.","power-supply.desc":"AC→DC switched-mode / DC power supply. t_ac top (~), t_dc bottom (=).","genset.desc":"Diesel / gas generator set.","protective-relay.desc":"Measuring / protective relay, general symbol (IEC 60617).","overcurrent-relay.desc":"Overcurrent protection relay (ANSI 50/51).","undervoltage-relay.desc":"Undervoltage protection relay (ANSI 27).","reverse-power-relay.desc":"Reverse-power / reverse-current protection relay (ANSI 32).","distance-relay.desc":"Distance / under-impedance protection relay (ANSI 21).","phase-failure-relay.desc":"Phase-failure / phase-loss protection relay.","buchholz-relay.desc":"Buchholz / gas relay (ANSI 63).","power-factor-meter.desc":"Power-factor meter (cosφ).","synchronoscope.desc":"Synchronizing indicator / synchronoscope.","varmeter.desc":"Reactive-power meter (var).","make-contact.state.closed":"Closed","break-contact.state.open":"Open","fuse-switch-disconnector.state.open":"Open","selector-switch.state.open":"Open","limit-switch.state.closed":"Closed","resistor.param.R":"Resistance","resistor.param.P":"Rated power","capacitor.param.C":"Capacitance","capacitor.param.Un":"Rated voltage","indicator-light.param.color":"Color","inductor.param.L":"Inductance","inductor.param.In":"Rated current","voltage-regulator.param.ratio":"Regulation range","heater.param.P":"Power","ups.param.S":"Capacity","power-supply.param.Vdc":"Output voltage","genset.param.P":"Power"},vr={zh:K4,en:V4};function U4(e,t){return vr[e][t]??vr.zh[t]}function At(){const e=Tt(t=>t.locale);return(t,n)=>U4(e,t)??n??t}const Ew="ole-palette-collapsed",J4=new Set(["busbar"]),Et=(()=>{const e={};for(const[t,n]of Object.entries(j$)){const o=n.filter(r=>!J4.has(r.id));o.length&&(e[t]=o)}return e})(),Z4=(()=>{const e=new Set(Wo),t=Object.keys(Et).filter(n=>!e.has(n));return[...Wo.filter(n=>{var o;return(o=Et[n])==null?void 0:o.length}),...t]})();function Q4(){try{const e=window.localStorage.getItem(Ew);if(!e)return new Set;const t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(n=>typeof n=="string")):new Set}catch{return new Set}}function ej(e){try{window.localStorage.setItem(Ew,JSON.stringify([...e]))}catch{}}function tj(){const e=ie(),t=x(f=>f.activeTool==="place"),n=x(f=>f.placeKind),o=x(f=>f.setActiveTool),r=Mt(f=>f.outlineOpen),s=Ve(),i=Oe(s,"dense"),a=68,d=i?void 0:`calc(100vh - ${a}px - ${r?"calc(40vh + 20px)":"68px"})`;if(!t||i&&n!=null)return null;const u=i?{top:`calc(${a}px + var(--ole-top-inset, 0px))`,left:"calc(0.75rem + var(--ole-left-inset, 0px))",right:"calc(0.75rem + var(--ole-right-inset, 0px))",bottom:"calc(4rem + var(--ole-bottom-inset, 0px) + 0.75rem)"}:{top:a};return c.jsx("div",{className:i?"absolute z-20":"absolute left-3 z-20",style:u,role:"dialog","aria-label":e("library.title"),children:c.jsxs("aside",{className:i?"ole-glass flex h-full w-full flex-col overflow-hidden rounded-2xl border border-border shadow-md":"ole-glass flex w-72 flex-col overflow-hidden rounded-2xl border border-border shadow-md",style:d?{maxHeight:d}:void 0,children:[c.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2",children:[c.jsx("span",{className:"flex-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:e("library.title")}),c.jsx("button",{type:"button",onClick:()=>o(i?"pan":"select"),className:"rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground","aria-label":e("common.close"),title:e("common.close"),children:c.jsx(Vn,{className:"size-3.5"})})]}),c.jsx(nj,{sheet:i})]})})}function nj({sheet:e}){const t=ie(),n=At(),[o,r]=O.useState(""),[s,i]=O.useState(()=>Q4()),a=O.useMemo(()=>{const f=o.trim().toLowerCase();if(!f)return Et;const m={};for(const[p,h]of Object.entries(Et)){const y=h.filter(w=>{const $=n(`${w.id}.name`,w.name).toLowerCase(),k=n(`${w.id}.desc`,w.description??"").toLowerCase();return $.includes(f)||w.id.toLowerCase().includes(f)||k.includes(f)});y.length&&(m[p]=y)}return m},[o,n]),l=o.trim().length>0,d=l&&Object.values(a).every(f=>!(f!=null&&f.length)),u=O.useCallback((f,m)=>{i(p=>{const h=new Set(p);return m?h.delete(f):h.add(f),ej(h),h})},[]);return c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"px-2 pb-1.5 pt-2",children:c.jsx(oj,{value:o,onChange:r})}),c.jsx("div",{className:"flex-1 overflow-y-auto px-2 pb-2",children:d?c.jsx("p",{className:"px-3 py-6 text-center text-xs text-muted-foreground",children:t("library.empty")}):Z4.map(f=>{var w;const m=a[f];if(!(m!=null&&m.length))return null;const p=((w=Et[f])==null?void 0:w.length)??m.length,h=t(`cat.${f}`),y=l||!s.has(f);return c.jsxs("details",{open:y,className:"group mb-2 last:mb-0",onToggle:$=>{l||u(f,$.currentTarget.open)},children:[c.jsxs("summary",{className:"flex cursor-pointer select-none items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:[c.jsx(tv,{className:"size-3 transition-transform [details:not([open])>summary>&]:-rotate-90"}),c.jsx("span",{className:"flex-1",children:h}),c.jsx(sj,{children:l&&m.length!==p?`${m.length}/${p}`:p})]}),c.jsx("ul",{className:"mt-0.5 space-y-px",children:m.map($=>c.jsx(rj,{entry:$,sheet:e},$.id))})]},f)})})]})}function oj({value:e,onChange:t}){const n=ie();return c.jsxs("div",{className:"relative",children:[c.jsx(hv,{className:"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground"}),c.jsx("input",{type:"text",value:e,onChange:o=>t(o.target.value),placeholder:n("library.searchPlaceholder"),className:"h-7 w-full rounded-md border border-border/60 bg-background/50 pl-7 pr-7 text-xs placeholder:text-muted-foreground focus:border-border focus:outline-none focus:ring-1 focus:ring-ring","aria-label":n("library.searchAria")}),e&&c.jsx("button",{type:"button","aria-label":n("library.clearSearch"),onClick:()=>t(""),className:"absolute right-1 top-1/2 -translate-y-1/2 rounded-sm p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:c.jsx(Vn,{className:"size-3"})})]})}function rj({entry:e,sheet:t}){const n=ie(),o=At(),r=o(`${e.id}.name`,e.name),s=o(`${e.id}.desc`,e.description??""),i=x(f=>f.setActiveTool),a=x(f=>f.activeTool==="place"&&f.placeKind===e.id),l=x(f=>t&&f.activeTool==="place"&&f.placeKind==null&&f.lastPlaceKind===e.id),d=O.useRef(null);O.useEffect(()=>{var f;l&&((f=d.current)==null||f.scrollIntoView({block:"nearest"}))},[l]);const u=f=>{f.dataTransfer.effectAllowed="copy",f.dataTransfer.setData("application/x-oneline-kind",e.id),f.dataTransfer.setData("text/plain",e.id);const m=document.createElement("div");m.className="ole-glass",m.style.cssText=["position:absolute","top:-9999px","left:-9999px","width:64px","height:64px","display:flex","align-items:center","justify-content:center","border-radius:12px","border:1px solid var(--border)","box-shadow:0 4px 12px rgba(0,0,0,0.12)","color:var(--foreground)","padding:8px"].join(";"),m.innerHTML=`<svg class="ole-symbol" viewBox="${e.viewBox}" width="48" height="48" preserveAspectRatio="xMidYMid meet">${e.svg}</svg>`,document.body.appendChild(m),f.dataTransfer.setDragImage(m,32,32),setTimeout(()=>m.remove(),0)};return c.jsxs("li",{ref:d,className:`group flex cursor-grab items-center gap-2.5 rounded-md px-2 py-1.5 transition-colors hover:bg-accent active:cursor-grabbing ${a?"bg-accent ring-1 ring-[var(--selection)]/60":l?"ring-1 ring-[var(--selection)]/30":""}`,draggable:!0,onDragStart:u,onClick:()=>i("place",{placeKind:e.id}),"data-kind":e.id,title:s?`${r} — ${s}`:`${r} — ${n("library.itemHint")}`,children:[c.jsx("div",{className:"flex h-7 w-12 shrink-0 items-center justify-center",children:c.jsx("svg",{viewBox:e.viewBox,className:"ole-symbol size-full",preserveAspectRatio:"xMidYMid meet",dangerouslySetInnerHTML:{__html:e.svg}})}),c.jsx("span",{className:"truncate text-xs text-foreground/80 group-hover:text-accent-foreground",children:r})]})}function sj({children:e}){return c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e})}const qn="ole-onboarding-dismissed";function ij(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(qn)==="1"}catch{return!1}}function kr(e){try{e?window.localStorage.setItem(qn,"1"):window.localStorage.removeItem(qn)}catch{}}const _r=Jt(e=>({dismissed:ij(),dismiss:()=>{kr(!0),e({dismissed:!0})},reset:()=>{kr(!1),e({dismissed:!1})}}));function aj(){const e=ie(),t=_r(o=>o.dismissed),n=_r(o=>o.dismiss);return t?null:c.jsxs("div",{role:"dialog","aria-label":e("onboard.title"),className:"ole-glass pointer-events-none absolute left-1/2 top-1/2 z-10 w-[min(420px,calc(100vw-2rem))] -translate-x-1/2 -translate-y-1/2 rounded-2xl border border-border p-5 shadow-md",children:[c.jsxs("div",{className:"flex items-center justify-between",children:[c.jsx("h2",{className:"text-sm font-semibold",children:e("onboard.title")}),c.jsx("button",{type:"button",onClick:n,"aria-label":e("onboard.dismiss"),className:"pointer-events-auto rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground",children:c.jsx(Vn,{className:"size-3.5"})})]}),c.jsxs("ol",{className:"mt-3 space-y-2.5",children:[c.jsx(jn,{n:1,icon:c.jsx(Xn,{}),title:e("onboard.step1.title"),body:e("onboard.step1.body")}),c.jsx(jn,{n:2,icon:c.jsx(Hr,{}),title:e("onboard.step2.title"),body:e("onboard.step2.body")}),c.jsx(jn,{n:3,icon:c.jsx(Or,{}),title:e("onboard.step3.title"),body:e("onboard.step3.body")})]}),c.jsx("button",{type:"button",onClick:n,className:"pointer-events-auto mt-4 w-full rounded-md bg-primary py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90",children:e("onboard.dismiss")})]})}function jn({n:e,icon:t,title:n,body:o}){return c.jsxs("li",{className:"flex items-start gap-2.5",children:[c.jsx("span",{className:"mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-[color-mix(in_oklch,var(--selection)_18%,transparent)] font-mono text-[10px] font-semibold tabular-nums text-[var(--selection)]","aria-hidden":!0,children:e}),c.jsxs("div",{className:"min-w-0 flex-1",children:[c.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-medium",children:[c.jsx("span",{className:"text-muted-foreground [&>svg]:size-3.5",children:t}),c.jsx("span",{children:n})]}),c.jsx("p",{className:"mt-0.5 text-[11px] leading-snug text-muted-foreground",children:o})]})]})}function lj(){const e=ie(),t=x(m=>m.selection),n=x(m=>m.diagram.elements),o=x(m=>m.diagram.buses),r=x(m=>m.diagram.junctions),s=x(m=>m.selectedNode),i=x(m=>m.selectedWire);if(i)return c.jsx(hj,{wireId:i});if(s)return c.jsx(gj,{nodeId:s});if(t.length===0)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:e("props.empty")});if(t.length>1)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:e("props.multi",{n:t.length})});const a=t[0],l=(o??[]).find(m=>m.id===a);if(l)return c.jsx(fj,{bus:l});const d=(r??[]).find(m=>m.id===a);if(d)return c.jsx(pj,{junction:d});const u=n.find(m=>m.id===a);if(!u)return null;const f=Ke[u.kind];return c.jsxs("div",{className:"flex flex-col gap-2.5 overflow-y-auto px-3 py-3 text-xs",children:[c.jsx(ut,{label:e("props.name"),value:u.name??"",placeholder:u.id,onCommit:m=>x.getState().updateElement(a,{name:m.trim()===""?void 0:m.trim()})}),c.jsx(no,{label:e("props.note"),value:u.note??"",onCommit:m=>x.getState().updateElement(a,{note:m.trim()===""?void 0:m.trim()})}),(f==null?void 0:f.state)&&f.state.length>0&&c.jsx("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:f.state.map(m=>c.jsx(yj,{id:a,element:u,field:m},m.name))}),c.jsx(cj,{id:a,element:u,schema:(f==null?void 0:f.params)??[]})]})}function cj({id:e,element:t,schema:n}){const o=new Set(n.map(s=>s.name)),r=t.params?Object.entries(t.params).filter(([s])=>!o.has(s)):[];return n.length===0&&r.length===0?null:c.jsxs("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:[n.map(s=>c.jsx(dj,{id:e,element:t,field:s},s.name)),r.map(([s,i])=>c.jsx(uj,{id:e,element:t,fieldKey:s,value:i},s))]})}function dj({id:e,element:t,field:n}){var l;const o=ie(),r=At(),s=((l=t.params)==null?void 0:l[n.name])??n.default,i=r(`${t.kind}.param.${n.name}`,n.label??n.name),a=d=>{const u={...t.params??{}};d===void 0||d===n.default?delete u[n.name]:u[n.name]=d,x.getState().updateElement(e,{params:Object.keys(u).length>0?u:void 0})};return n.type==="boolean"?c.jsx(dt,{label:i,children:c.jsx(oo,{active:!!s,onClick:()=>a(!s),children:o(s?"common.yes":"common.no")})}):n.type==="number"?c.jsx(rn,{label:i,value:typeof s=="number"?s:0,unit:n.unit,onCommit:a}):c.jsx(ut,{label:i,value:typeof s=="string"?s:"",unit:n.unit,onCommit:d=>a(d.trim()===""?void 0:d)})}function uj({id:e,element:t,fieldKey:n,value:o}){const r=ie(),s=i=>{const a={...t.params??{}};i===void 0?delete a[n]:a[n]=i,x.getState().updateElement(e,{params:Object.keys(a).length>0?a:void 0})};return typeof o=="boolean"?c.jsx(dt,{label:n,children:c.jsx(oo,{active:o,onClick:()=>s(!o),children:r(o?"common.yes":"common.no")})}):typeof o=="number"?c.jsx(rn,{label:n,value:o,onCommit:s}):c.jsx(ut,{label:n,value:o,onCommit:i=>s(i.trim()===""?void 0:i)})}function fj({bus:e}){const t=ie(),n=e.id,o=r=>{const s=r.trim();Gn(n,{name:s===""?void 0:s})};return c.jsxs("div",{className:"flex flex-col gap-2.5 overflow-y-auto px-3 py-3 text-xs",children:[c.jsx(ut,{label:t("props.name"),value:e.name??"",placeholder:e.id,onCommit:o}),c.jsx(no,{label:t("props.note"),value:e.note??"",onCommit:r=>Gn(n,{note:r.trim()===""?void 0:r.trim()})}),c.jsx(mj,{bus:e})]})}function mj({bus:e}){const t=(o,r)=>{const s={...e.params??{}};r===void 0||r===""?delete s[o]:s[o]=r,Gn(e.id,{params:Object.keys(s).length>0?s:void 0})},n=e.params??{};return c.jsx("div",{className:"mt-1 flex flex-col gap-1.5 border-t border-border/40 pt-2.5",children:c.jsx(rn,{label:"Un",value:typeof n.Un=="number"?n.Un:0,unit:"kV",onCommit:o=>t("Un",o)})})}function Gn(e,t){x.getState().dispatch(n=>{const o=(n.buses??[]).map(r=>r.id===e?{...r,...t}:r);return{...n,buses:o}})}function hj({wireId:e}){const t=ie(),n=x(w=>w.diagram.wires),o=x(w=>w.diagram.elements),r=x(w=>w.diagram.buses),s=x(w=>w.diagram.junctions),i=x(w=>w.internal.terminalToNode),a=x(w=>w.setSelectedNode),l=(n??[]).find(w=>w.id===e);if(!l)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:t("props.wireNotFound",{id:e})});const d=i.get(l.ends[0]),u=new Map(o.map(w=>[w.id,w])),f=new Map((r??[]).map(w=>[w.id,w])),m=new Map((s??[]).map(w=>[w.id,w])),p=w=>{if(!w.includes(".")){const C=f.get(w);if(C)return{id:w,label:C.name??w};const R=m.get(w);return{id:w,label:(R==null?void 0:R.name)??w}}const $=w.indexOf("."),k=w.slice(0,$),b=w.slice($+1),S=u.get(k);return{id:k,label:(S==null?void 0:S.name)??k,pin:b}},h=p(l.ends[0]),y=p(l.ends[1]);return c.jsxs("div",{className:"flex flex-col gap-3 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.wire")}),c.jsx("div",{className:"font-mono text-[12px]",children:l.id})]}),c.jsx("ul",{className:"space-y-0.5 border-t border-border/40 pt-2",children:[h,y].map((w,$)=>c.jsxs("li",{className:"flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 hover:bg-accent",onClick:()=>x.getState().setSelection([w.id]),children:[c.jsx("span",{className:"flex-1 truncate font-mono text-[11px]",children:w.id}),c.jsx("span",{className:"truncate text-[10px] text-muted-foreground",children:w.label}),w.pin&&c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:w.pin})]},$))}),d&&c.jsx("button",{type:"button",className:"self-start rounded-md border border-border/60 px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent",onClick:()=>a(d),children:t("props.selectWholeNode")})]})}function pj({junction:e}){var r;const t=ie(),n=x(s=>{var i;return(i=s.internal.junctions.get(e.id))==null?void 0:i.world}),o=((r=e.layout)==null?void 0:r.at)??n;return c.jsxs("div",{className:"flex flex-col gap-2.5 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.junction")}),c.jsx("div",{className:"font-mono text-[12px]",children:e.id})]}),c.jsx(ut,{label:t("props.name"),value:e.name??"",placeholder:e.id,onCommit:s=>x.getState().updateJunction(e.id,{name:s.trim()===""?void 0:s.trim()})}),c.jsx(no,{label:t("props.note"),value:e.note??"",onCommit:s=>x.getState().updateJunction(e.id,{note:s.trim()===""?void 0:s.trim()})}),o&&c.jsxs("div",{className:"flex items-center justify-between border-t border-border/40 pt-2",children:[c.jsx("span",{className:"text-muted-foreground",children:t("props.junctionPos")}),c.jsxs("span",{className:"font-mono text-[11px]",children:[Math.round(o[0]),", ",Math.round(o[1])]})]})]})}function gj({nodeId:e}){const t=ie(),n=x(a=>a.internal.nodes.get(e)),o=x(a=>a.diagram.elements),r=x(a=>a.setSelection);if(!n)return c.jsx("div",{className:"px-4 py-5 text-center text-xs text-muted-foreground",children:t("props.nodeNotFound",{id:e})});const s=new Map;for(const a of n.terminals){const l=a.indexOf(".");if(l<0)continue;const d=a.slice(0,l),u=a.slice(l+1),f=s.get(d)??[];f.push(u),s.set(d,f)}const i=new Map(o.map(a=>[a.id,a]));return c.jsxs("div",{className:"flex flex-col gap-3 px-3 py-3 text-xs",children:[c.jsxs("div",{className:"space-y-1",children:[c.jsx("div",{className:"text-[11px] uppercase tracking-wide text-muted-foreground",children:t("props.node")}),c.jsx("div",{className:"font-mono text-[12px]",children:n.id}),c.jsx("div",{className:"text-[11px] text-muted-foreground",children:t("props.nodeStats",{terminals:n.terminals.length,elements:s.size})})]}),c.jsx("ul",{className:"space-y-0.5 border-t border-border/40 pt-2",children:[...s.entries()].map(([a,l])=>{const d=i.get(a);return c.jsxs("li",{className:"flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 hover:bg-accent",onClick:()=>r([a]),title:t("props.selectElement",{label:a}),children:[c.jsx("span",{className:"flex-1 truncate font-mono text-[11px]",children:a}),c.jsx("span",{className:"truncate text-[10px] text-muted-foreground",children:(d==null?void 0:d.name)??""}),c.jsx("span",{className:"font-mono text-[10px] text-muted-foreground/80",children:l.join(", ")})]},a)})})]})}function dt({label:e,children:t}){return c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx("label",{className:"w-16 shrink-0 truncate text-[11px] text-muted-foreground",children:e}),c.jsx("div",{className:"min-w-0 flex-1",children:t})]})}function ut({label:e,value:t,placeholder:n,unit:o,onCommit:r}){const[s,i]=O.useState(t),a=O.useRef(null);return O.useEffect(()=>i(t),[t]),c.jsx(dt,{label:e,children:c.jsxs("div",{className:"relative",children:[c.jsx("input",{ref:a,type:"text",value:s,placeholder:n,onChange:l=>i(l.target.value),onBlur:()=>{s!==t&&r(s)},onKeyDown:l=>{var d,u;l.key==="Enter"&&((d=a.current)==null||d.blur()),l.key==="Escape"&&(i(t),(u=a.current)==null||u.blur())},className:je("h-7 w-full rounded-md border border-border/60 bg-background/50 px-2 text-[11px] focus:border-border focus:outline-none focus:ring-1 focus:ring-ring",o&&"pr-8")}),o&&c.jsx("span",{className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[10px] text-muted-foreground",children:o})]})})}function no({label:e,value:t,onCommit:n}){const[o,r]=O.useState(t);return O.useEffect(()=>r(t),[t]),c.jsx(dt,{label:e,children:c.jsx("textarea",{rows:2,value:o,onChange:s=>r(s.target.value),onBlur:()=>{o!==t&&n(o)},className:"w-full resize-none rounded-md border border-border/60 bg-background/50 px-2 py-1 text-[11px] focus:border-border focus:outline-none focus:ring-1 focus:ring-ring"})})}function rn({label:e,value:t,min:n,unit:o,onCommit:r}){const[s,i]=O.useState(String(t)),a=O.useRef(null);return O.useEffect(()=>i(String(t)),[t]),c.jsx(dt,{label:e,children:c.jsxs("div",{className:"relative",children:[c.jsx("input",{ref:a,type:"number",value:s,onChange:l=>i(l.target.value),onBlur:()=>{const l=Number(s);Number.isFinite(l)&&l!==t?r(l):i(String(t))},onKeyDown:l=>{var d,u;l.key==="Enter"&&((d=a.current)==null||d.blur()),l.key==="Escape"&&(i(String(t)),(u=a.current)==null||u.blur())},min:n,className:je("h-7 w-full rounded-md border border-border/60 bg-background/50 px-2 font-mono text-[11px] tabular-nums focus:border-border focus:outline-none focus:ring-1 focus:ring-ring",o&&"pr-8")}),o&&c.jsx("span",{className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[10px] text-muted-foreground",children:o})]})})}function oo({active:e,onClick:t,children:n}){return c.jsx("button",{type:"button",onClick:t,className:je("flex h-6 w-full items-center justify-center gap-1.5 rounded border text-[10px] transition-colors",e?"border-[var(--selection)] bg-[var(--selection)]/15 text-foreground":"border-border/60 text-muted-foreground hover:bg-accent"),"aria-pressed":e,children:n})}function yj({id:e,element:t,field:n}){var l;const o=ie(),s=At()(`${t.kind}.state.${n.name}`,n.label??n.name),i=((l=t.state)==null?void 0:l[n.name])??n.default,a=d=>{const u={...t.state??{}};d===void 0||d===n.default?delete u[n.name]:u[n.name]=d,x.getState().updateElement(e,{state:Object.keys(u).length>0?u:void 0})};return n.type==="boolean"?c.jsx(dt,{label:s,children:c.jsx(oo,{active:!!i,onClick:()=>a(!i),children:o(i?"common.yes":"common.no")})}):n.type==="number"?c.jsx(rn,{label:s,value:typeof i=="number"?i:0,onCommit:a}):c.jsx(ut,{label:s,value:typeof i=="string"?i:"",onCommit:d=>a(d.trim()===""?void 0:d)})}function xj(){const e=ie(),t=At(),n=x(f=>f.selection),o=x(f=>f.selectedNode),r=x(f=>f.selectedWire),s=x(f=>f.diagram.elements),i=x(f=>f.diagram.buses),a=Ve(),l=Oe(a,"dense");if(n.length===0&&!o&&!r)return null;let d=e("props.title"),u=null;if(r)d=e("props.wire");else if(o)d=e("props.node");else if(n.length===1){const f=n[0],m=(i??[]).find(p=>p.id===f);if(m)d=m.name??e("props.bus");else{const p=s.find(h=>h.id===f);if(p){const h=Ke[p.kind];d=h?t(`${h.id}.name`,h.name):p.kind}}}else u=n.length;return c.jsxs("aside",{className:je("ole-glass absolute z-10 flex flex-col overflow-hidden rounded-2xl border border-border shadow-sm",l?"w-48":"w-56"),style:{top:`calc(${l?"4.5rem":"0.75rem"} + var(--ole-top-inset, 0px))`,right:"calc(0.75rem + var(--ole-right-inset, 0px))",maxHeight:`calc(100% - ${l?"5.25rem":"1.5rem"} - var(--ole-top-inset, 0px) - var(--ole-bottom-inset, 0px) - 4.5rem)`},children:[c.jsxs("div",{className:"flex items-center gap-1.5 border-b border-border/40 px-3 py-2",children:[c.jsx("span",{className:"flex-1 truncate text-[11px] font-semibold uppercase tracking-wide text-muted-foreground",children:d}),u!=null&&c.jsx("span",{className:"rounded bg-muted/50 px-1.5 py-0.5 font-mono text-[10px] tabular-nums text-muted-foreground/80",children:e("props.nSelected",{n:u})})]}),c.jsx(lj,{})]})}function bj(){O.useEffect(()=>{const e=n=>{const o=n.target;if(!o||o.tagName==="INPUT"||o.tagName==="TEXTAREA"||o.isContentEditable)return;const r=o.closest("button");r&&r.closest(".ole-glass")&&n.preventDefault()},t=n=>{const o=n.target;if(!o||!o.closest(".ole-canvas-root"))return;const r=document.activeElement;!r||r===document.body||r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.isContentEditable||r.blur()};return window.addEventListener("mousedown",e),window.addEventListener("pointerdown",t,!0),()=>{window.removeEventListener("mousedown",e),window.removeEventListener("pointerdown",t,!0)}},[])}function wj(){bj();const e=O.useRef(null),t=OS(e);return c.jsx(Uv,{children:c.jsx("div",{ref:e,className:"relative h-full w-full overflow-hidden bg-background text-foreground",children:c.jsxs(f4,{width:t,children:[c.jsx(n4,{}),c.jsx(q4,{}),c.jsx(xj,{}),c.jsx(D4,{}),c.jsx(L4,{}),c.jsx(E4,{}),c.jsx(tj,{}),c.jsx(aj,{}),c.jsx(d4,{})]})})})}const vj="ole-theme";function kj(){try{const e=window.localStorage.getItem(vj);return e==="light"||e==="dark"?e:null}catch{return null}}function _j(){return typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-color-scheme: dark)").matches}function $j(){return typeof window>"u"?"light":kj()??(_j()?"dark":"light")}function Nw(e){typeof document>"u"||document.documentElement.classList.toggle("dark",e==="dark")}function Sj({className:e,diagram:t,locale:n,theme:o}){return O.useEffect(()=>{if(!t)return;x.getState().diagram.elements.length===0&&x.getState().setDiagram(t)},[t]),O.useEffect(()=>{n&&Tt.getState().setLocale(n)},[n]),O.useEffect(()=>{o&&Nw(o)},[o]),O.useEffect(()=>{Qn()},[]),wS(),c.jsx("div",{className:`ole-root ${e??"h-full w-full"}`,children:c.jsx(wj,{})})}const Mw={"application/json":[".json"]},Tw=()=>typeof window<"u"&&typeof window.showOpenFilePicker=="function",Aw=e=>e instanceof DOMException&&e.name==="AbortError";function $r(e){let t;try{t=JSON.parse(e)}catch(o){throw new Error(we("io.parseFailed",{err:o.message}))}if(!t||typeof t!="object"||Array.isArray(t))throw new Error(we("io.notObject"));const n=t;if(n.version!=="1")throw new Error(we("io.versionMismatch",{actual:JSON.stringify(n.version)}));if(!Array.isArray(n.elements))throw new Error(we("io.elementsMissing"));return n}function jj(e){return JSON.stringify(e,null,2)+`
199
+ `}async function Ej(){if(Tw()){let e;try{[e]=await window.showOpenFilePicker({multiple:!1,types:[{description:we("topbar.file.fileDescription"),accept:Mw}]})}catch(n){if(Aw(n))return null;throw n}const t=await e.getFile();return{diagram:$r(await t.text()),session:{handle:e,name:t.name}}}return new Promise((e,t)=>{const n=document.createElement("input");n.type="file",n.accept=".json,application/json",n.addEventListener("change",async()=>{var r;const o=(r=n.files)==null?void 0:r[0];if(!o)return e(null);try{e({diagram:$r(await o.text()),session:{name:o.name}})}catch(s){t(s)}}),n.addEventListener("cancel",()=>e(null)),n.click()})}async function Sr(e,t,n={}){const o=jj(e);if(!n.saveAs&&(t!=null&&t.handle)){const i=await t.handle.createWritable();return await i.write(o),await i.close(),t}if(Tw()){let i;try{i=await window.showSaveFilePicker({suggestedName:(t==null?void 0:t.name)??"diagram.json",types:[{description:we("topbar.file.fileDescription"),accept:Mw}]})}catch(l){if(Aw(l))return null;throw l}const a=await i.createWritable();return await a.write(o),await a.close(),{handle:i,name:i.name}}const r=URL.createObjectURL(new Blob([o],{type:"application/json"})),s=document.createElement("a");return s.href=r,s.download=(t==null?void 0:t.name)??"diagram.json",s.click(),URL.revokeObjectURL(r),t??{name:"diagram.json"}}function Nj(){const e=ie(),t=x(f=>f.fileSession),n=(t==null?void 0:t.name)??e("common.unnamed"),{onNew:o,onOpen:r,onSave:s,onSaveAs:i}=Mj(),[a,l]=O.useState(!1),d=O.useRef(null);O.useEffect(()=>{const f=m=>{if(!(m.metaKey||m.ctrlKey))return;const p=m.key.toLowerCase();p==="o"?(m.preventDefault(),r()):p==="s"&&(m.preventDefault(),m.shiftKey?i():s())};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)},[r,s,i]),O.useEffect(()=>{if(!a)return;const f=p=>{d.current&&!d.current.contains(p.target)&&l(!1)},m=p=>{p.key==="Escape"&&l(!1)};return window.addEventListener("mousedown",f),window.addEventListener("keydown",m),()=>{window.removeEventListener("mousedown",f),window.removeEventListener("keydown",m)}},[a]);const u=f=>()=>{l(!1),f()};return c.jsxs("div",{ref:d,className:"relative",children:[c.jsxs(Ae,{variant:"ghost",size:"sm",className:"gap-1.5","aria-haspopup":"menu","aria-expanded":a,onClick:()=>l(f=>!f),children:[c.jsx(jo,{}),e("topbar.file.label")]}),a&&c.jsxs("div",{role:"menu",className:"ole-glass absolute left-0 top-full mt-1.5 min-w-44 rounded-md border border-border p-1 shadow-md",children:[c.jsx("div",{className:"border-b border-border px-2 pb-1.5 pt-1 text-xs text-muted-foreground",children:n}),c.jsx(Ft,{onClick:u(o),icon:c.jsx(iv,{}),children:e("topbar.file.new")}),c.jsx(Ft,{onClick:u(r),icon:c.jsx(jo,{}),hint:"⌘O",children:e("topbar.file.open")}),c.jsx(Ft,{onClick:u(s),icon:c.jsx(Eo,{}),hint:"⌘S",children:e("topbar.file.save")}),c.jsx(Ft,{onClick:u(i),icon:c.jsx(Eo,{}),hint:"⌘⇧S",children:e("topbar.file.saveAs")})]})]})}function Ft({children:e,icon:t,hint:n,onClick:o}){return c.jsxs("button",{type:"button",role:"menuitem",onClick:o,className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[t,c.jsx("span",{className:"flex-1",children:e}),n&&c.jsx("span",{className:"text-xs tabular-nums text-muted-foreground",children:n})]})}function Mj(){const e=ie(),t=x(l=>l.loadDiagramFromFile),n=x(l=>l.setFileSession),o=x(l=>l.setDiagram);return{onNew:()=>{const{diagram:l}=x.getState();l.elements.length>0&&!confirm(e("topbar.file.newConfirm"))||(o({version:"1",elements:[]}),n(null))},onOpen:async()=>{try{const l=await Ej();l&&(t(l.diagram,l.session),Qn())}catch(l){alert(e("topbar.file.openFailed",{err:l.message}))}},onSave:async()=>{try{const{diagram:l,fileSession:d}=x.getState(),u=await Sr(l,d);u&&n(u)}catch(l){alert(e("topbar.file.saveFailed",{err:l.message}))}},onSaveAs:async()=>{try{const{diagram:l,fileSession:d}=x.getState(),u=await Sr(l,d,{saveAs:!0});u&&n(u)}catch(l){alert(e("topbar.file.saveFailed",{err:l.message}))}}}}const En="WIRES",Fe="ELEMENTS",jr="LABELS",Er="ANNOTATIONS",Nr=32,Mr=64,Tj=8,Aj=1.25,Cj=6;function Cw(e,t={}){const n=new Gj(t.precision??6);n.header(t.title),n.tables([{name:En,color:7},{name:Fe,color:7},{name:jr,color:8},{name:Er,color:3}]),n.beginEntities();for(const r of e.wireRenders.values())r.path.length<2||n.lwpolyline(En,r.path.map(Ie),!1);for(const{geometry:r}of e.buses.values()){const{axis:s,at:i,span:a}=r,l=a/2,d=s==="x"?[i[0]-l,i[1]]:[i[0],i[1]-l],u=s==="x"?[i[0]+l,i[1]]:[i[0],i[1]+l];n.lwpolyline(En,[d,u].map(Ie),!1)}for(const r of e.elements.values()){const s=e.layout.get(r.element.id),i=r.libraryDef;!s||!i||Ij(n,i.svg,s)}const o=t.labelMode??"all";if(o!=="off")for(const r of e.elements.values()){const s=e.layout.get(r.element.id);if(!s||!r.libraryDef)continue;const i=Qt(r,o);if(i.length===0)continue;const a=r.libraryDef.label??en(r.libraryDef),[l,d]=tn(a,s);for(let u=0;u<i.length;u++){const[f,m]=Ie([l,d+u*Zt]);n.text(jr,[f,m],i[u],Yt,0,!1)}}for(const r of t.annotations??[]){if(!r.text)continue;const s=r.fontSize??Tj,i=r.text.split(`
200
+ `);for(let a=0;a<i.length;a++){const[l,d]=Ie([r.at[0],r.at[1]+(a+1)*s*Aj]);n.text(Er,[l,d],i[a],s,0,!1)}}return n.endEntities(),n.toString()}async function Iw(e,t="diagram.dxf",n){const o=Cw(e,n),r=URL.createObjectURL(new Blob([o],{type:"application/dxf;charset=utf-8"})),s=document.createElement("a");s.href=r,s.download=t,s.click(),URL.revokeObjectURL(r)}function Ij(e,t,n){const o=`<svg xmlns="http://www.w3.org/2000/svg">${t}</svg>`,s=new DOMParser().parseFromString(o,"image/svg+xml").documentElement;if(!(!s||s.querySelector("parsererror")))for(const i of Array.from(s.children))switch(i.tagName.toLowerCase()){case"line":Pj(e,i,n);break;case"polyline":Tr(e,i,n,!1);break;case"polygon":Tr(e,i,n,!0);break;case"rect":Oj(e,i,n);break;case"circle":Bj(e,i,n);break;case"ellipse":Lj(e,i,n);break;case"path":Fj(e,i,n);break;case"text":Dj(e,i,n);break}}function Pj(e,t,n){const o=ve(t,"x1"),r=ve(t,"y1"),s=ve(t,"x2"),i=ve(t,"y2"),a=Ie(De([o,r],n)),l=Ie(De([s,i],n));e.line(Fe,a,l)}function Tr(e,t,n,o){const r=qj(t.getAttribute("points")??"");if(r.length<2)return;const s=r.map(i=>Ie(De(i,n)));e.lwpolyline(Fe,s,o)}function Oj(e,t,n){const o=ve(t,"x"),r=ve(t,"y"),s=ve(t,"width"),i=ve(t,"height"),l=[[o,r],[o+s,r],[o+s,r+i],[o,r+i]].map(d=>Ie(De(d,n)));e.lwpolyline(Fe,l,!0)}function Bj(e,t,n){const o=ve(t,"cx"),r=ve(t,"cy"),s=ve(t,"r"),i=Ie(De([o,r],n));e.circle(Fe,i,s)}function Lj(e,t,n){const o=ve(t,"cx"),r=ve(t,"cy"),s=ve(t,"rx"),i=ve(t,"ry");if(Math.abs(s-i)<1e-6){zj(e,o,r,s,n);return}Rj(e,o,r,s,i,n)}function zj(e,t,n,o,r){const s=Ie(De([t,n],r));e.circle(Fe,s,o)}function Rj(e,t,n,o,r,s){const i=[];for(let a=0;a<Mr;a++){const l=a/Mr*Math.PI*2;i.push(Ie(De([t+o*Math.cos(l),n+r*Math.sin(l)],s)))}e.lwpolyline(Fe,i,!0)}function Dj(e,t,n){const o=ve(t,"x"),r=ve(t,"y"),s=parseFloat(t.getAttribute("font-size")??"")||Cj,i=(t.textContent??"").trim();if(!i)return;const a=Ie(De([o,r],n));e.text(Fe,a,i,s,n.rot,n.mirror)}function Fj(e,t,n){const o=t.getAttribute("d")??"",r=Hj(o);if(r.length===0)return;let s=null,i=[];const a=()=>{i.length>=2&&e.lwpolyline(Fe,i.map(l=>Ie(De(l,n))),!1),i=[]};for(const l of r)if(l.cmd==="M")a(),s=[l.args[0],l.args[1]],i.push(s);else if(l.cmd==="A"&&s){const[d,u,,f,m,p,h]=l.args,y=Wj(s,[p,h],d,u,f!==0,m!==0);if(y)for(let w=1;w<=Nr;w++){const $=y.theta1+y.delta*w/Nr;i.push([y.cx+d*Math.cos($),y.cy+u*Math.sin($)])}else i.push([p,h]);s=[p,h]}a()}function Hj(e){const t=[],n=/([MmAa])([^MmAa]*)/g;let o;for(;(o=n.exec(e))!==null;){const r=o[1].toUpperCase(),s=o[2].trim().split(/[\s,]+/).filter(i=>i.length>0).map(Number);t.push({cmd:r,args:s})}return t}function Wj(e,t,n,o,r,s){if(n<=0||o<=0)return null;const[i,a]=e,[l,d]=t;if(i===l&&a===d)return null;const u=(i-l)/2,f=(a-d)/2;let m=Math.abs(n),p=Math.abs(o);const h=m*m,y=p*p,w=u*u/h+f*f/y;if(w>1){const W=Math.sqrt(w);m*=W,p*=W}const $=r===s?-1:1,k=m*m*p*p-m*m*f*f-p*p*u*u,b=m*m*f*f+p*p*u*u,S=$*Math.sqrt(Math.max(0,k/b)),C=S*(m*f)/p,R=S*-(p*u)/m,X=C+(i+l)/2,V=R+(a+d)/2,te=(W,ye,ue,pe)=>{const ne=W*ue+ye*pe,re=Math.hypot(W,ye)*Math.hypot(ue,pe);let ge=Math.acos(Math.max(-1,Math.min(1,ne/re)));return W*pe-ye*ue<0&&(ge=-ge),ge},ae=te(1,0,(u-C)/m,(f-R)/p);let D=te((u-C)/m,(f-R)/p,(-u-C)/m,(-f-R)/p);return!s&&D>0?D-=2*Math.PI:s&&D<0&&(D+=2*Math.PI),{cx:X,cy:V,theta1:ae,delta:D}}function De(e,t){return Pe(e,t)}function Ie(e){return[e[0],-e[1]]}function ve(e,t){const n=parseFloat(e.getAttribute(t)??"");return Number.isFinite(n)?n:0}function qj(e){const t=e.trim().split(/[\s,]+/).map(Number).filter(o=>Number.isFinite(o)),n=[];for(let o=0;o+1<t.length;o+=2)n.push([t[o],t[o+1]]);return n}class Gj{constructor(t){gt(this,"out",[]);gt(this,"precision");this.precision=t}toString(){return this.out.join("")}g(t,n){this.out.push(`${t}
201
201
  ${this.fmt(n)}
202
- `)}fmt(t){return typeof t=="number"?Number.isFinite(t)?Number.isInteger(t)?String(t):t.toFixed(this.precision):"0":t}header(t){this.g(0,"SECTION"),this.g(2,"HEADER"),this.g(9,"$ACADVER"),this.g(1,"AC1009"),this.g(9,"$INSUNITS"),this.g(70,0),t&&(this.g(9,"$PROJECTNAME"),this.g(1,$r(t))),this.g(0,"ENDSEC")}tables(t){this.g(0,"SECTION"),this.g(2,"TABLES"),this.g(0,"TABLE"),this.g(2,"LAYER"),this.g(70,t.length);for(const n of t)this.g(0,"LAYER"),this.g(2,n.name),this.g(70,0),this.g(62,n.color),this.g(6,"CONTINUOUS");this.g(0,"ENDTAB"),this.g(0,"ENDSEC")}beginEntities(){this.g(0,"SECTION"),this.g(2,"ENTITIES")}endEntities(){this.g(0,"ENDSEC"),this.g(0,"EOF")}line(t,n,o){this.g(0,"LINE"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(11,o[0]),this.g(21,o[1]),this.g(31,0)}lwpolyline(t,n,o){if(!(n.length<2)){this.g(0,"LWPOLYLINE"),this.g(8,t),this.g(90,n.length),this.g(70,o?1:0);for(const[r,s]of n)this.g(10,r),this.g(20,s)}}circle(t,n,o){this.g(0,"CIRCLE"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(40,o)}text(t,n,o,r,s,i){this.g(0,"TEXT"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(40,r),this.g(1,$r(o)),s!==0&&this.g(50,s),i&&this.g(71,2)}}function $r(e){return e.replace(/[\r\n]+/g," ").slice(0,250)}const Bj="http://www.w3.org/2000/svg",Lt=24,jw=8,Ew=1.25;function Zn(e,t={}){const n=Lj(e,t),o=Math.floor(n.minX-Lt),r=Math.floor(n.minY-Lt),s=Math.ceil(n.maxX+Lt)-o,i=Math.ceil(n.maxY+Lt)-r,a=t.background??"#FFFFFF",l=[];l.push('<?xml version="1.0" encoding="UTF-8"?>'),l.push(`<svg xmlns="${Bj}" viewBox="${o} ${r} ${s} ${i}" width="${s}" height="${i}">`),t.title&&l.push(` <title>${ot(t.title)}</title>`),a!=="transparent"&&l.push(` <rect x="${o}" y="${r}" width="${s}" height="${i}" fill="${a}"/>`),l.push(' <g fill="none" stroke="black" stroke-width="1">');for(const m of e.wireRenders.values()){if(m.path.length<2)continue;const f=m.path.map(([p,h])=>`${p},${h}`).join(" ");l.push(` <polyline points="${f}"/>`)}l.push(" </g>");for(const{bus:m,geometry:f}of e.buses.values()){const{axis:p,at:h,span:g}=f,w=g/2,E=p==="x"?h[0]-w:h[0],k=p==="x"?h[1]:h[1]-w,x=p==="x"?h[0]+w:h[0],S=p==="x"?h[1]:h[1]+w;l.push(` <line id="${ot(m.id)}" x1="${E}" y1="${k}" x2="${x}" y2="${S}" stroke="black" stroke-width="3" stroke-linecap="round" fill="none"/>`)}for(const{junction:m,world:f}of e.junctions.values())l.push(` <circle id="${ot(m.id)}" cx="${f[0]}" cy="${f[1]}" r="3.5" fill="black"/>`);for(const m of e.elements.values()){if(!m.libraryDef)continue;const f=e.layout.get(m.element.id);f&&(l.push(` <g id="${ot(m.element.id)}" transform="${Ge(f)}">`),l.push(` ${m.libraryDef.svg}`),l.push(" </g>"))}const u=t.labelMode??"all";if(u!=="off"){const m=a==="transparent"?"#FFFFFF":a;l.push(` <g fill="black" font-family="ui-sans-serif, system-ui, sans-serif" font-size="${Ht}" paint-order="stroke" stroke="${m}" stroke-width="2" stroke-linejoin="round">`);for(const f of e.elements.values()){const p=e.layout.get(f.element.id);if(!p||!f.libraryDef)continue;const h=Yt(f,u);if(h.length===0)continue;const g=f.libraryDef.label??Vt(f.libraryDef),[w,E]=Ut(g,p),k=g.anchor??"start";for(let x=0;x<h.length;x++)l.push(` <text x="${w}" y="${E+x*Kt}" text-anchor="${k}">${ot(h[x])}</text>`)}l.push(" </g>")}const d=t.annotations??[];if(d.length>0){const m=a==="transparent"?"#FFFFFF":a;l.push(` <g fill="black" font-family="ui-sans-serif, system-ui, sans-serif" paint-order="stroke" stroke="${m}" stroke-width="2" stroke-linejoin="round">`);for(const f of d){if(!f.text)continue;const p=f.fontSize??jw,h=f.text.split(`
203
- `);for(let g=0;g<h.length;g++){const w=f.at[1]+p*.85+g*p*Ew;l.push(` <text x="${f.at[0]}" y="${w}" font-size="${p}">${ot(h[g])}</text>`)}}l.push(" </g>")}return l.push("</svg>"),l.join(`
204
- `)}function Lj(e,t){let n=1/0,o=1/0,r=-1/0,s=-1/0;const i=(l,u)=>{l<n&&(n=l),l>r&&(r=l),u<o&&(o=u),u>s&&(s=u)};for(const l of e.terminals.values())i(l.world[0],l.world[1]);for(const l of e.junctions.values())i(l.world[0],l.world[1]);for(const l of e.elements.values()){const u=e.layout.get(l.element.id),d=l.libraryDef;if(!u||!d)continue;const m=zj(d.viewBox);if(!m){i(u.at[0],u.at[1]);continue}const f=[[m.x,m.y],[m.x+m.w,m.y],[m.x,m.y+m.h],[m.x+m.w,m.y+m.h]];for(const p of f){const[h,g]=Ae(p,u);i(h,g)}}for(const{geometry:l}of e.buses.values()){const{axis:u,at:d,span:m}=l,f=m/2;u==="x"?(i(d[0]-f,d[1]),i(d[0]+f,d[1])):(i(d[0],d[1]-f),i(d[0],d[1]+f))}for(const l of e.wireRenders.values())for(const[u,d]of l.path)i(u,d);const a=t.labelMode??"all";if(a!=="off")for(const l of e.elements.values()){const u=e.layout.get(l.element.id);if(!u||!l.libraryDef)continue;const d=Yt(l,a);if(d.length===0)continue;const m=l.libraryDef.label??Vt(l.libraryDef),[f,p]=Ut(m,u),h=Sr(d,Ht),g=d.length*Kt,w=m.anchor??"start",E=w==="middle"?f-h/2:w==="end"?f-h:f;i(E,p-Ht),i(E+h,p+g)}for(const l of t.annotations??[]){if(!l.text)continue;const u=l.fontSize??jw,d=l.text.split(`
205
- `),m=Sr(d,u),f=d.length*u*Ew;i(l.at[0],l.at[1]),i(l.at[0]+m,l.at[1]+f)}return n===1/0&&(n=0,o=0,r=0,s=0),{minX:n,minY:o,maxX:r,maxY:s}}function Sr(e,t){let n=0;for(const o of e){const r=o.length*t*.55;r>n&&(n=r)}return Math.max(20,n)}function zj(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function ot(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}async function Nw(e,t="diagram.svg",n){const o=Zn(e,n);Tw(new Blob([o],{type:"image/svg+xml;charset=utf-8"}),t)}async function Mw(e,t="diagram.png",n){const o=Zn(e,n),r=(n==null?void 0:n.scale)??2,s=URL.createObjectURL(new Blob([o],{type:"image/svg+xml;charset=utf-8"}));try{const i=await Rj(s),a=document.createElement("canvas");a.width=Math.round(i.naturalWidth*r),a.height=Math.round(i.naturalHeight*r);const l=a.getContext("2d");if(!l)throw new Error("canvas 2d context unavailable");n!=null&&n.background&&n.background!=="transparent"&&(l.fillStyle=n.background,l.fillRect(0,0,a.width,a.height)),l.drawImage(i,0,0,a.width,a.height);const u=await new Promise((d,m)=>{a.toBlob(f=>f?d(f):m(new Error("toBlob failed")),"image/png")});Tw(u,t)}finally{URL.revokeObjectURL(s)}}function Rj(e){return new Promise((t,n)=>{const o=new Image;o.onload=()=>t(o),o.onerror=()=>n(new Error("failed to load SVG into image")),o.src=e})}function Tw(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.click(),URL.revokeObjectURL(n)}function Dj(){const e=ne(),[t,n]=O.useState(!1),o=O.useRef(null);O.useEffect(()=>{if(!t)return;const s=a=>{o.current&&!o.current.contains(a.target)&&n(!1)},i=a=>{a.key==="Escape"&&n(!1)};return window.addEventListener("mousedown",s),window.addEventListener("keydown",i),()=>{window.removeEventListener("mousedown",s),window.removeEventListener("keydown",i)}},[t]);const r=s=>()=>{var m,f,p,h;n(!1);const{internal:i,diagram:a,fileSession:l}=b.getState(),u=((m=l==null?void 0:l.name)==null?void 0:m.replace(/\.json$/i,""))??((f=a.meta)==null?void 0:f.title)??"diagram",d={title:(p=a.meta)==null?void 0:p.title,labelMode:(h=a.meta)==null?void 0:h.labelMode,annotations:a.annotations};s==="svg"?Nw(i,`${u}.svg`,d):s==="png"?Mw(i,`${u}.png`,{...d,scale:2}).catch(g=>{console.error(g),alert(e("topbar.export.pngFailed",{err:g.message}))}):Sw(i,`${u}.dxf`,d).catch(g=>{console.error(g),alert(e("topbar.export.dxfFailed",{err:g.message}))})};return c.jsxs("div",{ref:o,className:"relative",children:[c.jsxs(Ne,{variant:"ghost",size:"sm",className:"gap-1.5","aria-haspopup":"menu","aria-expanded":t,onClick:()=>n(s=>!s),children:[c.jsx(Yw,{}),e("topbar.export.label")]}),t&&c.jsxs("div",{role:"menu",className:"ole-glass absolute left-0 top-full mt-1.5 min-w-40 rounded-md border border-border p-1 shadow-md",children:[c.jsxs("button",{type:"button",role:"menuitem",onClick:r("svg"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(Zw,{}),c.jsx("span",{className:"flex-1",children:"SVG"})]}),c.jsxs("button",{type:"button",role:"menuitem",onClick:r("png"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(Uw,{}),c.jsx("span",{className:"flex-1",children:"PNG (2×)"})]}),c.jsxs("button",{type:"button",role:"menuitem",onClick:r("dxf"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(Vw,{}),c.jsx("span",{className:"flex-1",children:"DXF"})]})]})]})}exports.ExportMenu=Dj;exports.FileMenu=xj;exports.LIBRARY=En;exports.OneLineEditor=pj;exports.applyTheme=ww;exports.buildExportDxf=$w;exports.buildExportSvg=Zn;exports.compile=qe;exports.downloadDxf=Sw;exports.downloadPng=Mw;exports.downloadSvg=Nw;exports.emptyInternalModel=Jr;exports.fitToContent=Xn;exports.fitToContentSoon=Kn;exports.getInitialTheme=hj;exports.getLibraryEntry=qb;exports.newBusId=Nn;exports.newElementId=jt;exports.newJunctionId=Mn;exports.orientationVec=jn;exports.resolvePlacement=Zr;exports.transformOrientation=_t;exports.transformPoint=Ae;exports.useEditorStore=b;exports.useLocale=Nt;exports.wireIdFromEnds=Ue;
202
+ `)}fmt(t){return typeof t=="number"?Number.isFinite(t)?Number.isInteger(t)?String(t):t.toFixed(this.precision):"0":t}header(t){this.g(0,"SECTION"),this.g(2,"HEADER"),this.g(9,"$ACADVER"),this.g(1,"AC1009"),this.g(9,"$INSUNITS"),this.g(70,0),t&&(this.g(9,"$PROJECTNAME"),this.g(1,Ar(t))),this.g(0,"ENDSEC")}tables(t){this.g(0,"SECTION"),this.g(2,"TABLES"),this.g(0,"TABLE"),this.g(2,"LAYER"),this.g(70,t.length);for(const n of t)this.g(0,"LAYER"),this.g(2,n.name),this.g(70,0),this.g(62,n.color),this.g(6,"CONTINUOUS");this.g(0,"ENDTAB"),this.g(0,"ENDSEC")}beginEntities(){this.g(0,"SECTION"),this.g(2,"ENTITIES")}endEntities(){this.g(0,"ENDSEC"),this.g(0,"EOF")}line(t,n,o){this.g(0,"LINE"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(11,o[0]),this.g(21,o[1]),this.g(31,0)}lwpolyline(t,n,o){if(!(n.length<2)){this.g(0,"LWPOLYLINE"),this.g(8,t),this.g(90,n.length),this.g(70,o?1:0);for(const[r,s]of n)this.g(10,r),this.g(20,s)}}circle(t,n,o){this.g(0,"CIRCLE"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(40,o)}text(t,n,o,r,s,i){this.g(0,"TEXT"),this.g(8,t),this.g(10,n[0]),this.g(20,n[1]),this.g(30,0),this.g(40,r),this.g(1,Ar(o)),s!==0&&this.g(50,s),i&&this.g(71,2)}}function Ar(e){return e.replace(/[\r\n]+/g," ").slice(0,250)}const Xj="http://www.w3.org/2000/svg",Ht=24,Pw=8,Ow=1.25;function ro(e,t={}){const n=Yj(e,t),o=Math.floor(n.minX-Ht),r=Math.floor(n.minY-Ht),s=Math.ceil(n.maxX+Ht)-o,i=Math.ceil(n.maxY+Ht)-r,a=t.background??"#FFFFFF",l=[];l.push('<?xml version="1.0" encoding="UTF-8"?>'),l.push(`<svg xmlns="${Xj}" viewBox="${o} ${r} ${s} ${i}" width="${s}" height="${i}">`),t.title&&l.push(` <title>${rt(t.title)}</title>`),a!=="transparent"&&l.push(` <rect x="${o}" y="${r}" width="${s}" height="${i}" fill="${a}"/>`),l.push(' <g fill="none" stroke="black" stroke-width="1">');for(const f of e.wireRenders.values()){if(f.path.length<2)continue;const m=f.path.map(([p,h])=>`${p},${h}`).join(" ");l.push(` <polyline points="${m}"/>`)}l.push(" </g>");for(const{bus:f,geometry:m}of e.buses.values()){const{axis:p,at:h,span:y}=m,w=y/2,$=p==="x"?h[0]-w:h[0],k=p==="x"?h[1]:h[1]-w,b=p==="x"?h[0]+w:h[0],S=p==="x"?h[1]:h[1]+w;l.push(` <line id="${rt(f.id)}" x1="${$}" y1="${k}" x2="${b}" y2="${S}" stroke="black" stroke-width="3" stroke-linecap="round" fill="none"/>`)}for(const{junction:f,world:m}of e.junctions.values())l.push(` <circle id="${rt(f.id)}" cx="${m[0]}" cy="${m[1]}" r="3.5" fill="black"/>`);for(const f of e.elements.values()){if(!f.libraryDef)continue;const m=e.layout.get(f.element.id);m&&(l.push(` <g id="${rt(f.element.id)}" transform="${Ye(m)}">`),l.push(` ${f.libraryDef.svg}`),l.push(" </g>"))}const d=t.labelMode??"all";if(d!=="off"){const f=a==="transparent"?"#FFFFFF":a;l.push(` <g fill="black" font-family="ui-sans-serif, system-ui, sans-serif" font-size="${Yt}" paint-order="stroke" stroke="${f}" stroke-width="2" stroke-linejoin="round">`);for(const m of e.elements.values()){const p=e.layout.get(m.element.id);if(!p||!m.libraryDef)continue;const h=Qt(m,d);if(h.length===0)continue;const y=m.libraryDef.label??en(m.libraryDef),[w,$]=tn(y,p),k=y.anchor??"start";for(let b=0;b<h.length;b++)l.push(` <text x="${w}" y="${$+b*Zt}" text-anchor="${k}">${rt(h[b])}</text>`)}l.push(" </g>")}const u=t.annotations??[];if(u.length>0){const f=a==="transparent"?"#FFFFFF":a;l.push(` <g fill="black" font-family="ui-sans-serif, system-ui, sans-serif" paint-order="stroke" stroke="${f}" stroke-width="2" stroke-linejoin="round">`);for(const m of u){if(!m.text)continue;const p=m.fontSize??Pw,h=m.text.split(`
203
+ `);for(let y=0;y<h.length;y++){const w=m.at[1]+p*.85+y*p*Ow;l.push(` <text x="${m.at[0]}" y="${w}" font-size="${p}">${rt(h[y])}</text>`)}}l.push(" </g>")}return l.push("</svg>"),l.join(`
204
+ `)}function Yj(e,t){let n=1/0,o=1/0,r=-1/0,s=-1/0;const i=(l,d)=>{l<n&&(n=l),l>r&&(r=l),d<o&&(o=d),d>s&&(s=d)};for(const l of e.terminals.values())i(l.world[0],l.world[1]);for(const l of e.junctions.values())i(l.world[0],l.world[1]);for(const l of e.elements.values()){const d=e.layout.get(l.element.id),u=l.libraryDef;if(!d||!u)continue;const f=Kj(u.viewBox);if(!f){i(d.at[0],d.at[1]);continue}const m=[[f.x,f.y],[f.x+f.w,f.y],[f.x,f.y+f.h],[f.x+f.w,f.y+f.h]];for(const p of m){const[h,y]=Pe(p,d);i(h,y)}}for(const{geometry:l}of e.buses.values()){const{axis:d,at:u,span:f}=l,m=f/2;d==="x"?(i(u[0]-m,u[1]),i(u[0]+m,u[1])):(i(u[0],u[1]-m),i(u[0],u[1]+m))}for(const l of e.wireRenders.values())for(const[d,u]of l.path)i(d,u);const a=t.labelMode??"all";if(a!=="off")for(const l of e.elements.values()){const d=e.layout.get(l.element.id);if(!d||!l.libraryDef)continue;const u=Qt(l,a);if(u.length===0)continue;const f=l.libraryDef.label??en(l.libraryDef),[m,p]=tn(f,d),h=Cr(u,Yt),y=u.length*Zt,w=f.anchor??"start",$=w==="middle"?m-h/2:w==="end"?m-h:m;i($,p-Yt),i($+h,p+y)}for(const l of t.annotations??[]){if(!l.text)continue;const d=l.fontSize??Pw,u=l.text.split(`
205
+ `),f=Cr(u,d),m=u.length*d*Ow;i(l.at[0],l.at[1]),i(l.at[0]+f,l.at[1]+m)}return n===1/0&&(n=0,o=0,r=0,s=0),{minX:n,minY:o,maxX:r,maxY:s}}function Cr(e,t){let n=0;for(const o of e){const r=o.length*t*.55;r>n&&(n=r)}return Math.max(20,n)}function Kj(e){const t=e.trim().split(/\s+/).map(Number);return t.length!==4||t.some(n=>Number.isNaN(n))?null:{x:t[0],y:t[1],w:t[2],h:t[3]}}function rt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}async function Bw(e,t="diagram.svg",n){const o=ro(e,n);zw(new Blob([o],{type:"image/svg+xml;charset=utf-8"}),t)}async function Lw(e,t="diagram.png",n){const o=ro(e,n),r=(n==null?void 0:n.scale)??2,s=URL.createObjectURL(new Blob([o],{type:"image/svg+xml;charset=utf-8"}));try{const i=await Vj(s),a=document.createElement("canvas");a.width=Math.round(i.naturalWidth*r),a.height=Math.round(i.naturalHeight*r);const l=a.getContext("2d");if(!l)throw new Error("canvas 2d context unavailable");n!=null&&n.background&&n.background!=="transparent"&&(l.fillStyle=n.background,l.fillRect(0,0,a.width,a.height)),l.drawImage(i,0,0,a.width,a.height);const d=await new Promise((u,f)=>{a.toBlob(m=>m?u(m):f(new Error("toBlob failed")),"image/png")});zw(d,t)}finally{URL.revokeObjectURL(s)}}function Vj(e){return new Promise((t,n)=>{const o=new Image;o.onload=()=>t(o),o.onerror=()=>n(new Error("failed to load SVG into image")),o.src=e})}function zw(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.click(),URL.revokeObjectURL(n)}function Uj(){const e=ie(),[t,n]=O.useState(!1),o=O.useRef(null);O.useEffect(()=>{if(!t)return;const s=a=>{o.current&&!o.current.contains(a.target)&&n(!1)},i=a=>{a.key==="Escape"&&n(!1)};return window.addEventListener("mousedown",s),window.addEventListener("keydown",i),()=>{window.removeEventListener("mousedown",s),window.removeEventListener("keydown",i)}},[t]);const r=s=>()=>{var f,m,p,h;n(!1);const{internal:i,diagram:a,fileSession:l}=x.getState(),d=((f=l==null?void 0:l.name)==null?void 0:f.replace(/\.json$/i,""))??((m=a.meta)==null?void 0:m.title)??"diagram",u={title:(p=a.meta)==null?void 0:p.title,labelMode:(h=a.meta)==null?void 0:h.labelMode,annotations:a.annotations};s==="svg"?Bw(i,`${d}.svg`,u):s==="png"?Lw(i,`${d}.png`,{...u,scale:2}).catch(y=>{console.error(y),alert(e("topbar.export.pngFailed",{err:y.message}))}):Iw(i,`${d}.dxf`,u).catch(y=>{console.error(y),alert(e("topbar.export.dxfFailed",{err:y.message}))})};return c.jsxs("div",{ref:o,className:"relative",children:[c.jsxs(Ae,{variant:"ghost",size:"sm",className:"gap-1.5","aria-haspopup":"menu","aria-expanded":t,onClick:()=>n(s=>!s),children:[c.jsx(ov,{}),e("topbar.export.label")]}),t&&c.jsxs("div",{role:"menu",className:"ole-glass absolute left-0 top-full mt-1.5 min-w-40 rounded-md border border-border p-1 shadow-md",children:[c.jsxs("button",{type:"button",role:"menuitem",onClick:r("svg"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(av,{}),c.jsx("span",{className:"flex-1",children:"SVG"})]}),c.jsxs("button",{type:"button",role:"menuitem",onClick:r("png"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(sv,{}),c.jsx("span",{className:"flex-1",children:"PNG (2×)"})]}),c.jsxs("button",{type:"button",role:"menuitem",onClick:r("dxf"),className:"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-accent-foreground [&>svg]:size-4",children:[c.jsx(rv,{}),c.jsx("span",{className:"flex-1",children:"DXF"})]})]})]})}exports.ExportMenu=Uj;exports.FileMenu=Nj;exports.LIBRARY=In;exports.OneLineEditor=Sj;exports.applyTheme=Nw;exports.buildExportDxf=Cw;exports.buildExportSvg=ro;exports.compile=Xe;exports.downloadDxf=Iw;exports.downloadPng=Lw;exports.downloadSvg=Bw;exports.emptyInternalModel=rs;exports.fitToContent=Zn;exports.fitToContentSoon=Qn;exports.getInitialTheme=$j;exports.getLibraryEntry=Jb;exports.newBusId=Pn;exports.newElementId=Nt;exports.newJunctionId=On;exports.orientationVec=Cn;exports.resolvePlacement=ss;exports.transformOrientation=St;exports.transformPoint=Pe;exports.useEditorStore=x;exports.useLocale=Tt;exports.wireIdFromEnds=Je;
206
206
  //# sourceMappingURL=sldeditor.cjs.map