claude-exode-mcp 7.5.7 → 7.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/MCP_DOCUMENTATION.md +1 -0
  2. package/SKILL.md +10 -0
  3. package/examples/aurum-product-page.exode +3208 -0
  4. package/examples/bell-ring-icon.exode +1 -0
  5. package/examples/drift-kinetic-type.exode +770 -0
  6. package/examples/earbuds-product.exode +214 -0
  7. package/examples/energy-flow.exode +1736 -0
  8. package/examples/flux-hero.exode +223 -0
  9. package/examples/gooey-toggle.exode +214 -0
  10. package/examples/gravity-well.exode +3113 -0
  11. package/examples/heart-icon.exode +1 -0
  12. package/examples/hologram-temple.exode +8100 -0
  13. package/examples/jarful-app.exode +1 -0
  14. package/examples/kip-character-rig.exode +1 -0
  15. package/examples/low-tide-tilt.exode +2216 -0
  16. package/examples/manifest.json +352 -0
  17. package/examples/swipe-stack-carousel.exode +4048 -0
  18. package/examples/tokyo-neon-weather.exode +470 -0
  19. package/examples/typographic-collapse.exode +1578 -0
  20. package/examples/void-product-ad.exode +1269 -0
  21. package/examples/wire-globe-card.exode +580 -0
  22. package/index.d.ts +41 -1
  23. package/index.js +2553 -2407
  24. package/package.json +4 -2
  25. package/render-runtime/exode-runtime.js +20 -20
  26. package/skills/creative-motion/SKILL.md +10 -0
  27. package/skills/creative-motion/recipes/character-rig.js +104 -0
  28. package/skills/creative-motion/recipes/dashboard.js +120 -0
  29. package/skills/creative-motion/recipes/game-arcade.js +203 -0
  30. package/skills/creative-motion/recipes/hero-physics.js +65 -0
  31. package/skills/creative-motion/recipes/pricing.js +88 -0
  32. package/skills/creative-motion/recipes/title-sequence.js +62 -0
  33. package/skills/creative-motion/references/apps.md +37 -0
  34. package/skills/creative-motion/references/gotchas.md +80 -0
  35. package/skills/creative-motion/references/native-layers.md +60 -0
  36. package/skills/creative-motion/references/quality.md +54 -0
  37. package/src/__tests__/buildKit.test.ts +127 -0
  38. package/src/__tests__/effectKnobs.test.ts +162 -0
  39. package/src/__tests__/nativeLayers.test.ts +178 -0
  40. package/src/buildKit.d.ts +301 -0
  41. package/src/buildKit.d.ts.map +1 -0
  42. package/src/buildKit.js +559 -0
  43. package/src/buildKit.js.map +1 -0
  44. package/src/buildKit.ts +520 -0
  45. package/src/compiler.d.ts +4 -0
  46. package/src/compiler.d.ts.map +1 -1
  47. package/src/compiler.js +21 -45
  48. package/src/compiler.js.map +1 -1
  49. package/src/compiler.ts +22 -51
  50. package/src/critique.d.ts +8 -0
  51. package/src/critique.d.ts.map +1 -0
  52. package/src/critique.js +348 -0
  53. package/src/critique.js.map +1 -0
  54. package/src/critique.ts +239 -0
  55. package/src/effectKnobs.d.ts +72 -0
  56. package/src/effectKnobs.d.ts.map +1 -0
  57. package/src/effectKnobs.js +541 -0
  58. package/src/effectKnobs.js.map +1 -0
  59. package/src/effectKnobs.ts +445 -0
  60. package/src/effectOptimizer.d.ts +18 -0
  61. package/src/effectOptimizer.d.ts.map +1 -0
  62. package/src/effectOptimizer.js +125 -0
  63. package/src/effectOptimizer.js.map +1 -0
  64. package/src/effectOptimizer.ts +104 -0
  65. package/src/engine/layout.js +1 -1
  66. package/src/engine/layout.js.map +1 -1
  67. package/src/engine/layout.ts +1 -1
  68. package/src/examples.d.ts +30 -0
  69. package/src/examples.d.ts.map +1 -0
  70. package/src/examples.js +168 -0
  71. package/src/examples.js.map +1 -0
  72. package/src/examples.ts +151 -0
  73. package/src/handlers/artboardHandlers.d.ts.map +1 -1
  74. package/src/handlers/artboardHandlers.js +45 -10
  75. package/src/handlers/artboardHandlers.js.map +1 -1
  76. package/src/handlers/artboardHandlers.ts +43 -12
  77. package/src/handlers/buildHandlers.d.ts +2 -0
  78. package/src/handlers/buildHandlers.d.ts.map +1 -0
  79. package/src/handlers/buildHandlers.js +86 -0
  80. package/src/handlers/buildHandlers.js.map +1 -0
  81. package/src/handlers/buildHandlers.ts +76 -0
  82. package/src/handlers/compilerHandlers.d.ts.map +1 -1
  83. package/src/handlers/compilerHandlers.js +32 -2
  84. package/src/handlers/compilerHandlers.js.map +1 -1
  85. package/src/handlers/compilerHandlers.ts +31 -2
  86. package/src/handlers/exampleHandlers.d.ts +2 -0
  87. package/src/handlers/exampleHandlers.d.ts.map +1 -0
  88. package/src/handlers/exampleHandlers.js +81 -0
  89. package/src/handlers/exampleHandlers.js.map +1 -0
  90. package/src/handlers/exampleHandlers.ts +76 -0
  91. package/src/handlers/renderHandlers.d.ts.map +1 -1
  92. package/src/handlers/renderHandlers.js +100 -2
  93. package/src/handlers/renderHandlers.js.map +1 -1
  94. package/src/handlers/renderHandlers.ts +90 -2
  95. package/src/handlers/scaffoldHandlers.d.ts.map +1 -1
  96. package/src/handlers/scaffoldHandlers.js +3 -0
  97. package/src/handlers/scaffoldHandlers.js.map +1 -1
  98. package/src/handlers/scaffoldHandlers.ts +2 -0
  99. package/src/handlers/widgetHandlers.js +1 -1
  100. package/src/handlers/widgetHandlers.js.map +1 -1
  101. package/src/handlers/widgetHandlers.ts +1 -1
  102. package/src/lottie/convert.d.ts +16 -0
  103. package/src/lottie/convert.d.ts.map +1 -0
  104. package/src/lottie/convert.js +1225 -0
  105. package/src/lottie/convert.js.map +1 -0
  106. package/src/lottie/convert.ts +1134 -0
  107. package/src/lottie/evaluate.d.ts +48 -0
  108. package/src/lottie/evaluate.d.ts.map +1 -0
  109. package/src/lottie/evaluate.js +174 -0
  110. package/src/lottie/evaluate.js.map +1 -0
  111. package/src/lottie/evaluate.ts +184 -0
  112. package/src/nativeLayers.d.ts +76 -0
  113. package/src/nativeLayers.d.ts.map +1 -0
  114. package/src/nativeLayers.js +404 -0
  115. package/src/nativeLayers.js.map +1 -0
  116. package/src/nativeLayers.ts +339 -0
  117. package/src/render/motionBrief.d.ts.map +1 -1
  118. package/src/render/motionBrief.js +4 -0
  119. package/src/render/motionBrief.js.map +1 -1
  120. package/src/render/motionBrief.ts +4 -0
  121. package/src/render/videoRenderer.d.ts.map +1 -1
  122. package/src/render/videoRenderer.js +5 -2
  123. package/src/render/videoRenderer.js.map +1 -1
  124. package/src/render/videoRenderer.ts +5 -2
  125. package/src/rive/convert.d.ts +17 -0
  126. package/src/rive/convert.d.ts.map +1 -0
  127. package/src/rive/convert.js +1779 -0
  128. package/src/rive/convert.js.map +1 -0
  129. package/src/rive/convert.ts +1492 -0
  130. package/src/rive/font.d.ts +13 -0
  131. package/src/rive/font.d.ts.map +1 -0
  132. package/src/rive/font.js +154 -0
  133. package/src/rive/font.js.map +1 -0
  134. package/src/rive/font.ts +132 -0
  135. package/src/rive/layout.d.ts +20 -0
  136. package/src/rive/layout.d.ts.map +1 -0
  137. package/src/rive/layout.js +145 -0
  138. package/src/rive/layout.js.map +1 -0
  139. package/src/rive/layout.ts +140 -0
  140. package/src/rive/reader.d.ts +32 -0
  141. package/src/rive/reader.d.ts.map +1 -0
  142. package/src/rive/reader.js +172 -0
  143. package/src/rive/reader.js.map +1 -0
  144. package/src/rive/reader.ts +160 -0
  145. package/src/rive/schema.generated.d.ts +9 -0
  146. package/src/rive/schema.generated.d.ts.map +1 -0
  147. package/src/rive/schema.generated.js +13 -0
  148. package/src/rive/schema.generated.js.map +1 -0
  149. package/src/rive/schema.generated.ts +13 -0
  150. package/src/schema.d.ts +5 -0
  151. package/src/schema.d.ts.map +1 -1
  152. package/src/schema.js +5 -0
  153. package/src/schema.js.map +1 -1
  154. package/src/schema.ts +6 -0
  155. package/src/serverInstructions.d.ts +2 -0
  156. package/src/serverInstructions.d.ts.map +1 -0
  157. package/src/serverInstructions.js +22 -0
  158. package/src/serverInstructions.js.map +1 -0
  159. package/src/serverInstructions.ts +21 -0
  160. package/src/sseServer.d.ts +2 -0
  161. package/src/sseServer.d.ts.map +1 -0
  162. package/src/sseServer.js +165 -0
  163. package/src/sseServer.js.map +1 -0
  164. package/src/sseServer.ts +189 -0
  165. package/src/utils.d.ts.map +1 -1
  166. package/src/utils.js +23 -1
  167. package/src/utils.js.map +1 -1
  168. package/src/utils.ts +13 -1
  169. package/src/widgets.d.ts +26 -0
  170. package/src/widgets.d.ts.map +1 -1
  171. package/src/widgets.js +89 -45
  172. package/src/widgets.js.map +1 -1
  173. package/src/widgets.ts +88 -45
@@ -0,0 +1,1736 @@
1
+ {
2
+ "id": "artboard_energy_flow",
3
+ "name": "Energy Flow",
4
+ "width": 720,
5
+ "height": 560,
6
+ "backgroundColor": "#FBF8F2",
7
+ "cornerRadius": 0,
8
+ "deviceFrame": "none",
9
+ "fit": "Contain",
10
+ "opacity": 1,
11
+ "physics": {
12
+ "enabled": false,
13
+ "gravity": {
14
+ "x": 0,
15
+ "y": 0
16
+ },
17
+ "wind": {
18
+ "x": 0,
19
+ "y": 0
20
+ },
21
+ "timeScale": 1
22
+ },
23
+ "stateMachine": {
24
+ "inputs": [
25
+ {
26
+ "id": "in_solarKw",
27
+ "name": "solarKw",
28
+ "value": {
29
+ "type": "Number",
30
+ "value": 0
31
+ }
32
+ },
33
+ {
34
+ "id": "in_gridKw",
35
+ "name": "gridKw",
36
+ "value": {
37
+ "type": "Number",
38
+ "value": 0.48
39
+ }
40
+ },
41
+ {
42
+ "id": "in_loadKw",
43
+ "name": "loadKw",
44
+ "value": {
45
+ "type": "Number",
46
+ "value": 0.48
47
+ }
48
+ },
49
+ {
50
+ "id": "in_batteryKw",
51
+ "name": "batteryKw",
52
+ "value": {
53
+ "type": "Number",
54
+ "value": 0
55
+ }
56
+ },
57
+ {
58
+ "id": "in_batterySocPct",
59
+ "name": "batterySocPct",
60
+ "value": {
61
+ "type": "Number",
62
+ "value": 32
63
+ }
64
+ },
65
+ {
66
+ "id": "in_threshold",
67
+ "name": "threshold",
68
+ "value": {
69
+ "type": "Number",
70
+ "value": 0.05
71
+ }
72
+ }
73
+ ],
74
+ "layers": [
75
+ {
76
+ "id": "layer_main",
77
+ "name": "Main",
78
+ "entryStateId": "st_live",
79
+ "states": [
80
+ {
81
+ "id": "st_live",
82
+ "name": "Live",
83
+ "transitions": []
84
+ }
85
+ ]
86
+ }
87
+ ]
88
+ },
89
+ "animations": [],
90
+ "animationFlow": [],
91
+ "navigation": [],
92
+ "objects": [
93
+ {
94
+ "id": "flow_logic",
95
+ "name": "Flow logic",
96
+ "type": "Shape",
97
+ "transform": {
98
+ "x": 0.5,
99
+ "y": 0.5,
100
+ "rotation": 0,
101
+ "scale_x": 1,
102
+ "scale_y": 1,
103
+ "opacity": 1
104
+ },
105
+ "geometry": {
106
+ "type": "Rectangle",
107
+ "width": 1,
108
+ "height": 1,
109
+ "corner_radius": [
110
+ 0,
111
+ 0,
112
+ 0,
113
+ 0
114
+ ]
115
+ },
116
+ "style": {
117
+ "fill": {
118
+ "type": "Solid",
119
+ "color": "#000000",
120
+ "opacity": 0
121
+ },
122
+ "stroke": {
123
+ "color": "transparent",
124
+ "width": 0
125
+ },
126
+ "effects": [
127
+ {
128
+ "id": "fx_flow_logic",
129
+ "type": "CustomEffect",
130
+ "name": "Flow logic",
131
+ "isEnabled": true,
132
+ "params": {},
133
+ "code": "var LAYOUT = {\"solar\":{\"id\":\"solar_line\",\"len\":66,\"color\":\"#E0A82E\",\"cx\":360},\"grid\":{\"id\":\"grid_line\",\"len\":146,\"color\":\"#4A7BA6\",\"cx\":110},\"load\":{\"id\":\"load_line\",\"len\":146,\"color\":\"#C2643A\",\"cx\":610},\"battery\":{\"id\":\"battery_line\",\"len\":66,\"color\":\"#2F6B5E\",\"cx\":360}};\n/* Energy Flow logic. Runs every frame through the runtime's update(env, dt) hook.\n Reads the six inputs and drives the four lines (colour, dashes, direction,\n speed), the value/unit/status texts and the battery ring.\n Written for the .bexode minifier: explicit semicolons and block comments only. */\nvar IDLE = '#E6DFC8';\nvar DASH = [10, 8];\nvar FADE = 0.3;\nvar TEXT_W = 120;\n\nfunction efNum(env, name, d) {\n var v = Number(env.input(name));\n return isFinite(v) ? v : d;\n}\n\nfunction efHex(c) {\n var h = c.replace('#', '');\n return [parseInt(h.substring(0, 2), 16), parseInt(h.substring(2, 4), 16), parseInt(h.substring(4, 6), 16)];\n}\n\nfunction efMix(a, b, t) {\n var A = efHex(a); var B = efHex(b); var out = '#';\n for (var i = 0; i < 3; i++) {\n var v = Math.round(A[i] + (B[i] - A[i]) * t).toString(16);\n out += v.length < 2 ? '0' + v : v;\n }\n return out;\n}\n\n/* Period of one dash cycle: clamp(2.4 s minus |kW| x 0.4, 0.6 s, 2.4 s). */\nfunction efPeriod(kw) {\n return Math.min(2.4, Math.max(0.6, 2.4 - Math.abs(kw) * 0.4));\n}\n\nfunction efFmt(kw) {\n return Math.abs(kw).toFixed(2);\n}\n\n/* Text width with the same fonts the runtime draws with; falls back to an\n estimate where no canvas is available. */\nfunction efMeasure(S, str, font, size, em) {\n if (S.mctx === undefined) {\n S.mctx = null;\n try { if (typeof document !== 'undefined') S.mctx = document.createElement('canvas').getContext('2d'); } catch (e) { S.mctx = null; }\n }\n if (!S.mctx) return str.length * size * em;\n S.mctx.font = font;\n return S.mctx.measureText(str).width;\n}\n\n/* Centres \"value + unit\" under the node. */\nfunction efValue(sc, S, node, value, unit, cx) {\n var vw = efMeasure(S, value, '600 16px \"JetBrains Mono\", sans-serif', 16, 0.6);\n var uw = efMeasure(S, unit, '500 11px \"Inter\", sans-serif', 11, 0.62);\n var gap = unit === '%' ? 4 : 3;\n var left = cx - (vw + gap + uw) / 2;\n sc.set(node + '_value', 'geometry.text', value);\n sc.set(node + '_value', 'text', value);\n sc.set(node + '_value', 'x', left + TEXT_W / 2);\n sc.set(node + '_unit', 'x', left + vw + gap + TEXT_W / 2);\n}\n\nfunction efStatus(sc, node, s) {\n sc.set(node + '_status', 'geometry.text', s);\n sc.set(node + '_status', 'text', s);\n}\n\nfunction efLine(sc, S, dt, line, dir, kw, still) {\n var st = S[line.id];\n var target = dir === 0 ? IDLE : line.color;\n if (!st) {\n st = S[line.id] = { from: target, to: target, t: 1, shown: target, offset: 0, dashed: dir !== 0, dir: dir, kw: kw };\n }\n if (target !== st.to) {\n st.from = st.shown; st.to = target; st.t = 0;\n }\n if (dir !== 0) { st.dashed = true; st.dir = dir; st.kw = kw; }\n st.t = Math.min(1, st.t + dt / FADE);\n st.shown = efMix(st.from, st.to, st.t);\n /* Going idle: dashes keep running through the fade, then turn solid. */\n if (dir === 0 && st.t >= 1) st.dashed = false;\n if (st.dashed && !still) {\n st.offset += st.dir * (DASH[0] + DASH[1]) * dt / efPeriod(st.kw);\n st.offset = st.offset % 1e6;\n }\n sc.set(line.id, 'style.stroke.color', st.shown);\n sc.set(line.id, 'style.stroke.dashArray', st.dashed ? DASH : []);\n sc.set(line.id, 'style.stroke.dashOffset', st.dashed ? st.offset / line.len : 0);\n}\n\nfunction update(env, dt) {\n var sc = env.scene;\n if (!sc) return;\n var S = env.state;\n var L = LAYOUT;\n dt = Math.min(0.1, Math.max(0, dt || 0));\n\n if (S.mq === undefined) {\n S.mq = null;\n try { if (typeof matchMedia === 'function') S.mq = matchMedia('(prefers-reduced-motion: reduce)'); } catch (e) { S.mq = null; }\n }\n var still = !!(S.mq && S.mq.matches);\n\n var th = Math.max(0, efNum(env, 'threshold', 0.05));\n var solar = Math.max(0, efNum(env, 'solarKw', 0));\n var grid = efNum(env, 'gridKw', 0);\n var load = Math.max(0, efNum(env, 'loadKw', 0));\n var bat = efNum(env, 'batteryKw', 0);\n var soc = Math.min(100, Math.max(0, efNum(env, 'batterySocPct', 0)));\n\n /* Line direction: 1 runs from the line's start to its end, -1 the reverse.\n Starts: solar line at the top, grid line at the left, load line at the\n hub, battery line at the hub. */\n var dSolar = solar > th ? 1 : 0;\n var dGrid = grid > th ? 1 : (grid < -th ? -1 : 0);\n var dLoad = load > th ? 1 : 0;\n var dBat = bat > th ? -1 : (bat < -th ? 1 : 0);\n\n efLine(sc, S, dt, L.solar, dSolar, solar, still);\n efLine(sc, S, dt, L.grid, dGrid, grid, still);\n efLine(sc, S, dt, L.load, dLoad, load, still);\n efLine(sc, S, dt, L.battery, dBat, bat, still);\n\n efValue(sc, S, 'solar', efFmt(solar), 'kW', L.solar.cx);\n efValue(sc, S, 'grid', efFmt(grid), 'kW', L.grid.cx);\n efValue(sc, S, 'load', efFmt(load), 'kW', L.load.cx);\n efValue(sc, S, 'battery', String(Math.round(soc)), '%', L.battery.cx);\n\n efStatus(sc, 'grid', dGrid > 0 ? 'Importing' : (dGrid < 0 ? 'Exporting' : 'Idle'));\n efStatus(sc, 'battery', dBat < 0 ? 'Discharging' : (dBat > 0 ? 'Charging' : 'Idle'));\n\n /* Ring: full circle stroke trimmed to the charge. The ring object is turned\n -90 degrees, so the trim starts at 12 o'clock and runs clockwise. */\n sc.set('battery_ring', 'style.stroke.trimEnd', Math.max(0.001, soc / 100));\n sc.set('battery_ring', 'style.stroke.width', soc > 0 ? 4 : 0);\n}\n"
134
+ }
135
+ ]
136
+ },
137
+ "zIndex": 1
138
+ },
139
+ {
140
+ "id": "solar_line",
141
+ "name": "Solar line",
142
+ "type": "Shape",
143
+ "transform": {
144
+ "x": 360,
145
+ "y": 191,
146
+ "rotation": 90,
147
+ "scale_x": 1,
148
+ "scale_y": 1,
149
+ "opacity": 1
150
+ },
151
+ "geometry": {
152
+ "type": "Line",
153
+ "width": 66,
154
+ "height": 0
155
+ },
156
+ "style": {
157
+ "fill": {
158
+ "type": "Solid",
159
+ "color": "#000000",
160
+ "opacity": 0
161
+ },
162
+ "stroke": {
163
+ "color": "#E6DFC8",
164
+ "width": 3,
165
+ "lineCap": "round",
166
+ "dashArray": [],
167
+ "dashOffset": 0
168
+ }
169
+ },
170
+ "zIndex": 2
171
+ },
172
+ {
173
+ "id": "grid_line",
174
+ "name": "Grid line",
175
+ "type": "Shape",
176
+ "transform": {
177
+ "x": 231,
178
+ "y": 280,
179
+ "rotation": 0,
180
+ "scale_x": 1,
181
+ "scale_y": 1,
182
+ "opacity": 1
183
+ },
184
+ "geometry": {
185
+ "type": "Line",
186
+ "width": 146,
187
+ "height": 0
188
+ },
189
+ "style": {
190
+ "fill": {
191
+ "type": "Solid",
192
+ "color": "#000000",
193
+ "opacity": 0
194
+ },
195
+ "stroke": {
196
+ "color": "#E6DFC8",
197
+ "width": 3,
198
+ "lineCap": "round",
199
+ "dashArray": [],
200
+ "dashOffset": 0
201
+ }
202
+ },
203
+ "zIndex": 3
204
+ },
205
+ {
206
+ "id": "load_line",
207
+ "name": "Load line",
208
+ "type": "Shape",
209
+ "transform": {
210
+ "x": 489,
211
+ "y": 280,
212
+ "rotation": 0,
213
+ "scale_x": 1,
214
+ "scale_y": 1,
215
+ "opacity": 1
216
+ },
217
+ "geometry": {
218
+ "type": "Line",
219
+ "width": 146,
220
+ "height": 0
221
+ },
222
+ "style": {
223
+ "fill": {
224
+ "type": "Solid",
225
+ "color": "#000000",
226
+ "opacity": 0
227
+ },
228
+ "stroke": {
229
+ "color": "#E6DFC8",
230
+ "width": 3,
231
+ "lineCap": "round",
232
+ "dashArray": [],
233
+ "dashOffset": 0
234
+ }
235
+ },
236
+ "zIndex": 4
237
+ },
238
+ {
239
+ "id": "battery_line",
240
+ "name": "Battery line",
241
+ "type": "Shape",
242
+ "transform": {
243
+ "x": 360,
244
+ "y": 369,
245
+ "rotation": 90,
246
+ "scale_x": 1,
247
+ "scale_y": 1,
248
+ "opacity": 1
249
+ },
250
+ "geometry": {
251
+ "type": "Line",
252
+ "width": 66,
253
+ "height": 0
254
+ },
255
+ "style": {
256
+ "fill": {
257
+ "type": "Solid",
258
+ "color": "#000000",
259
+ "opacity": 0
260
+ },
261
+ "stroke": {
262
+ "color": "#E6DFC8",
263
+ "width": 3,
264
+ "lineCap": "round",
265
+ "dashArray": [],
266
+ "dashOffset": 0
267
+ }
268
+ },
269
+ "zIndex": 5
270
+ },
271
+ {
272
+ "id": "hub",
273
+ "name": "Hub",
274
+ "type": "Shape",
275
+ "transform": {
276
+ "x": 360,
277
+ "y": 280,
278
+ "rotation": 0,
279
+ "scale_x": 1,
280
+ "scale_y": 1,
281
+ "opacity": 1
282
+ },
283
+ "geometry": {
284
+ "type": "Ellipse",
285
+ "width": 64,
286
+ "height": 64
287
+ },
288
+ "style": {
289
+ "fill": {
290
+ "type": "Solid",
291
+ "color": "#FFFFFF",
292
+ "opacity": 1
293
+ },
294
+ "stroke": {
295
+ "color": "transparent",
296
+ "width": 0
297
+ },
298
+ "shadow": {
299
+ "isEnabled": true,
300
+ "color": "rgba(90,70,40,0.16)",
301
+ "opacity": 100,
302
+ "blur": 22,
303
+ "spread": 0,
304
+ "offsetX": 0,
305
+ "offsetY": 6
306
+ }
307
+ },
308
+ "zIndex": 6
309
+ },
310
+ {
311
+ "id": "hub_icon_0",
312
+ "name": "Hub icon 1",
313
+ "type": "Shape",
314
+ "transform": {
315
+ "x": 360,
316
+ "y": 275.39583333333337,
317
+ "rotation": 0,
318
+ "scale_x": 1,
319
+ "scale_y": 1,
320
+ "opacity": 1
321
+ },
322
+ "geometry": {
323
+ "type": "Path",
324
+ "data": "M351.88 278.92 L360.00 271.88 L368.13 278.92",
325
+ "width": 16.25,
326
+ "height": 7.041666666666686,
327
+ "is_closed": false
328
+ },
329
+ "style": {
330
+ "fill": {
331
+ "type": "None"
332
+ },
333
+ "stroke": {
334
+ "color": "#4A4A4A",
335
+ "width": 1.4,
336
+ "lineCap": "round",
337
+ "lineJoin": "round"
338
+ }
339
+ },
340
+ "zIndex": 7
341
+ },
342
+ {
343
+ "id": "hub_icon_1",
344
+ "name": "Hub icon 2",
345
+ "type": "Shape",
346
+ "transform": {
347
+ "x": 360,
348
+ "y": 282.70833333333337,
349
+ "rotation": 0,
350
+ "scale_x": 1,
351
+ "scale_y": 1,
352
+ "opacity": 1
353
+ },
354
+ "geometry": {
355
+ "type": "Path",
356
+ "data": "M354.04 277.29 L354.04 288.13 L365.96 288.13 L365.96 277.29",
357
+ "width": 11.916666666666629,
358
+ "height": 10.833333333333314,
359
+ "is_closed": false
360
+ },
361
+ "style": {
362
+ "fill": {
363
+ "type": "None"
364
+ },
365
+ "stroke": {
366
+ "color": "#4A4A4A",
367
+ "width": 1.4,
368
+ "lineCap": "round",
369
+ "lineJoin": "round"
370
+ }
371
+ },
372
+ "zIndex": 8
373
+ },
374
+ {
375
+ "id": "solar_node",
376
+ "name": "SOLAR node",
377
+ "type": "Shape",
378
+ "transform": {
379
+ "x": 360,
380
+ "y": 110,
381
+ "rotation": 0,
382
+ "scale_x": 1,
383
+ "scale_y": 1,
384
+ "opacity": 1
385
+ },
386
+ "geometry": {
387
+ "type": "Ellipse",
388
+ "width": 48,
389
+ "height": 48
390
+ },
391
+ "style": {
392
+ "fill": {
393
+ "type": "Solid",
394
+ "color": "#F3D68E",
395
+ "opacity": 1
396
+ },
397
+ "stroke": {
398
+ "color": "transparent",
399
+ "width": 0
400
+ }
401
+ },
402
+ "zIndex": 9
403
+ },
404
+ {
405
+ "id": "solar_icon_0",
406
+ "name": "SOLAR icon 1",
407
+ "type": "Shape",
408
+ "transform": {
409
+ "x": 360,
410
+ "y": 110,
411
+ "rotation": 0,
412
+ "scale_x": 1,
413
+ "scale_y": 1,
414
+ "opacity": 1
415
+ },
416
+ "geometry": {
417
+ "type": "Ellipse",
418
+ "width": 7.333333333333333,
419
+ "height": 7.333333333333333
420
+ },
421
+ "style": {
422
+ "fill": {
423
+ "type": "None"
424
+ },
425
+ "stroke": {
426
+ "color": "#E0A82E",
427
+ "width": 1.6,
428
+ "lineCap": "round",
429
+ "lineJoin": "round"
430
+ }
431
+ },
432
+ "zIndex": 10
433
+ },
434
+ {
435
+ "id": "solar_icon_1",
436
+ "name": "SOLAR icon 2",
437
+ "type": "Shape",
438
+ "transform": {
439
+ "x": 360,
440
+ "y": 102.20833333333333,
441
+ "rotation": 90,
442
+ "scale_x": 1,
443
+ "scale_y": 1,
444
+ "opacity": 1
445
+ },
446
+ "geometry": {
447
+ "type": "Line",
448
+ "width": 1.8333333333333333,
449
+ "height": 0
450
+ },
451
+ "style": {
452
+ "fill": {
453
+ "type": "None"
454
+ },
455
+ "stroke": {
456
+ "color": "#E0A82E",
457
+ "width": 1.6,
458
+ "lineCap": "round",
459
+ "lineJoin": "round"
460
+ }
461
+ },
462
+ "zIndex": 11
463
+ },
464
+ {
465
+ "id": "solar_icon_2",
466
+ "name": "SOLAR icon 3",
467
+ "type": "Shape",
468
+ "transform": {
469
+ "x": 360,
470
+ "y": 117.79166666666667,
471
+ "rotation": 90,
472
+ "scale_x": 1,
473
+ "scale_y": 1,
474
+ "opacity": 1
475
+ },
476
+ "geometry": {
477
+ "type": "Line",
478
+ "width": 1.8333333333333333,
479
+ "height": 0
480
+ },
481
+ "style": {
482
+ "fill": {
483
+ "type": "None"
484
+ },
485
+ "stroke": {
486
+ "color": "#E0A82E",
487
+ "width": 1.6,
488
+ "lineCap": "round",
489
+ "lineJoin": "round"
490
+ }
491
+ },
492
+ "zIndex": 12
493
+ },
494
+ {
495
+ "id": "solar_icon_3",
496
+ "name": "SOLAR icon 4",
497
+ "type": "Shape",
498
+ "transform": {
499
+ "x": 352.2083333333333,
500
+ "y": 110,
501
+ "rotation": 0,
502
+ "scale_x": 1,
503
+ "scale_y": 1,
504
+ "opacity": 1
505
+ },
506
+ "geometry": {
507
+ "type": "Line",
508
+ "width": 1.8333333333333333,
509
+ "height": 0
510
+ },
511
+ "style": {
512
+ "fill": {
513
+ "type": "None"
514
+ },
515
+ "stroke": {
516
+ "color": "#E0A82E",
517
+ "width": 1.6,
518
+ "lineCap": "round",
519
+ "lineJoin": "round"
520
+ }
521
+ },
522
+ "zIndex": 13
523
+ },
524
+ {
525
+ "id": "solar_icon_4",
526
+ "name": "SOLAR icon 5",
527
+ "type": "Shape",
528
+ "transform": {
529
+ "x": 367.7916666666667,
530
+ "y": 110,
531
+ "rotation": 0,
532
+ "scale_x": 1,
533
+ "scale_y": 1,
534
+ "opacity": 1
535
+ },
536
+ "geometry": {
537
+ "type": "Line",
538
+ "width": 1.8333333333333333,
539
+ "height": 0
540
+ },
541
+ "style": {
542
+ "fill": {
543
+ "type": "None"
544
+ },
545
+ "stroke": {
546
+ "color": "#E0A82E",
547
+ "width": 1.6,
548
+ "lineCap": "round",
549
+ "lineJoin": "round"
550
+ }
551
+ },
552
+ "zIndex": 14
553
+ },
554
+ {
555
+ "id": "solar_icon_5",
556
+ "name": "SOLAR icon 6",
557
+ "type": "Shape",
558
+ "transform": {
559
+ "x": 354.5,
560
+ "y": 104.5,
561
+ "rotation": 45,
562
+ "scale_x": 1,
563
+ "scale_y": 1,
564
+ "opacity": 1
565
+ },
566
+ "geometry": {
567
+ "type": "Line",
568
+ "width": 1.8149074050454723,
569
+ "height": 0
570
+ },
571
+ "style": {
572
+ "fill": {
573
+ "type": "None"
574
+ },
575
+ "stroke": {
576
+ "color": "#E0A82E",
577
+ "width": 1.6,
578
+ "lineCap": "round",
579
+ "lineJoin": "round"
580
+ }
581
+ },
582
+ "zIndex": 15
583
+ },
584
+ {
585
+ "id": "solar_icon_6",
586
+ "name": "SOLAR icon 7",
587
+ "type": "Shape",
588
+ "transform": {
589
+ "x": 365.5,
590
+ "y": 115.5,
591
+ "rotation": 45,
592
+ "scale_x": 1,
593
+ "scale_y": 1,
594
+ "opacity": 1
595
+ },
596
+ "geometry": {
597
+ "type": "Line",
598
+ "width": 1.81490740504547,
599
+ "height": 0
600
+ },
601
+ "style": {
602
+ "fill": {
603
+ "type": "None"
604
+ },
605
+ "stroke": {
606
+ "color": "#E0A82E",
607
+ "width": 1.6,
608
+ "lineCap": "round",
609
+ "lineJoin": "round"
610
+ }
611
+ },
612
+ "zIndex": 16
613
+ },
614
+ {
615
+ "id": "solar_icon_7",
616
+ "name": "SOLAR icon 8",
617
+ "type": "Shape",
618
+ "transform": {
619
+ "x": 354.5,
620
+ "y": 115.5,
621
+ "rotation": -44.999999999999964,
622
+ "scale_x": 1,
623
+ "scale_y": 1,
624
+ "opacity": 1
625
+ },
626
+ "geometry": {
627
+ "type": "Line",
628
+ "width": 1.8149074050454714,
629
+ "height": 0
630
+ },
631
+ "style": {
632
+ "fill": {
633
+ "type": "None"
634
+ },
635
+ "stroke": {
636
+ "color": "#E0A82E",
637
+ "width": 1.6,
638
+ "lineCap": "round",
639
+ "lineJoin": "round"
640
+ }
641
+ },
642
+ "zIndex": 17
643
+ },
644
+ {
645
+ "id": "solar_icon_8",
646
+ "name": "SOLAR icon 9",
647
+ "type": "Shape",
648
+ "transform": {
649
+ "x": 365.5,
650
+ "y": 104.5,
651
+ "rotation": -45.000000000000036,
652
+ "scale_x": 1,
653
+ "scale_y": 1,
654
+ "opacity": 1
655
+ },
656
+ "geometry": {
657
+ "type": "Line",
658
+ "width": 1.8149074050454714,
659
+ "height": 0
660
+ },
661
+ "style": {
662
+ "fill": {
663
+ "type": "None"
664
+ },
665
+ "stroke": {
666
+ "color": "#E0A82E",
667
+ "width": 1.6,
668
+ "lineCap": "round",
669
+ "lineJoin": "round"
670
+ }
671
+ },
672
+ "zIndex": 18
673
+ },
674
+ {
675
+ "id": "solar_label",
676
+ "name": "SOLAR label",
677
+ "type": "Shape",
678
+ "transform": {
679
+ "x": 360,
680
+ "y": 20,
681
+ "rotation": 0,
682
+ "scale_x": 1,
683
+ "scale_y": 1,
684
+ "opacity": 1
685
+ },
686
+ "geometry": {
687
+ "type": "Text",
688
+ "text": "SOLAR",
689
+ "fontSize": 10,
690
+ "fontFamily": "Inter",
691
+ "fontWeight": 500,
692
+ "textAlign": "center",
693
+ "width": 160,
694
+ "height": 14,
695
+ "letterSpacing": 0.8,
696
+ "textVerticalAlign": "middle"
697
+ },
698
+ "style": {
699
+ "fill": {
700
+ "type": "Solid",
701
+ "color": "#8A8A8A",
702
+ "opacity": 1
703
+ },
704
+ "stroke": {
705
+ "color": "transparent",
706
+ "width": 0
707
+ }
708
+ },
709
+ "zIndex": 19
710
+ },
711
+ {
712
+ "id": "solar_value",
713
+ "name": "SOLAR value",
714
+ "type": "Shape",
715
+ "transform": {
716
+ "x": 340,
717
+ "y": 40,
718
+ "rotation": 0,
719
+ "scale_x": 1,
720
+ "scale_y": 1,
721
+ "opacity": 1
722
+ },
723
+ "geometry": {
724
+ "type": "Text",
725
+ "text": "0.00",
726
+ "fontSize": 16,
727
+ "fontFamily": "JetBrains Mono",
728
+ "fontWeight": 600,
729
+ "textAlign": "left",
730
+ "width": 120,
731
+ "height": 22,
732
+ "letterSpacing": 0,
733
+ "textVerticalAlign": "middle"
734
+ },
735
+ "style": {
736
+ "fill": {
737
+ "type": "Solid",
738
+ "color": "#1A1A1A",
739
+ "opacity": 1
740
+ },
741
+ "stroke": {
742
+ "color": "transparent",
743
+ "width": 0
744
+ }
745
+ },
746
+ "zIndex": 20
747
+ },
748
+ {
749
+ "id": "solar_unit",
750
+ "name": "SOLAR unit",
751
+ "type": "Shape",
752
+ "transform": {
753
+ "x": 390,
754
+ "y": 41.5,
755
+ "rotation": 0,
756
+ "scale_x": 1,
757
+ "scale_y": 1,
758
+ "opacity": 1
759
+ },
760
+ "geometry": {
761
+ "type": "Text",
762
+ "text": "kW",
763
+ "fontSize": 11,
764
+ "fontFamily": "Inter",
765
+ "fontWeight": 500,
766
+ "textAlign": "left",
767
+ "width": 120,
768
+ "height": 15,
769
+ "letterSpacing": 0,
770
+ "textVerticalAlign": "middle"
771
+ },
772
+ "style": {
773
+ "fill": {
774
+ "type": "Solid",
775
+ "color": "#8A8A8A",
776
+ "opacity": 1
777
+ },
778
+ "stroke": {
779
+ "color": "transparent",
780
+ "width": 0
781
+ }
782
+ },
783
+ "zIndex": 21
784
+ },
785
+ {
786
+ "id": "solar_status",
787
+ "name": "SOLAR status",
788
+ "type": "Shape",
789
+ "transform": {
790
+ "x": 360,
791
+ "y": 59,
792
+ "rotation": 0,
793
+ "scale_x": 1,
794
+ "scale_y": 1,
795
+ "opacity": 1
796
+ },
797
+ "geometry": {
798
+ "type": "Text",
799
+ "text": "",
800
+ "fontSize": 10,
801
+ "fontFamily": "Inter",
802
+ "fontWeight": 400,
803
+ "textAlign": "center",
804
+ "width": 160,
805
+ "height": 14,
806
+ "letterSpacing": 0,
807
+ "textVerticalAlign": "middle"
808
+ },
809
+ "style": {
810
+ "fill": {
811
+ "type": "Solid",
812
+ "color": "#9A9A9A",
813
+ "opacity": 1
814
+ },
815
+ "stroke": {
816
+ "color": "transparent",
817
+ "width": 0
818
+ }
819
+ },
820
+ "zIndex": 22
821
+ },
822
+ {
823
+ "id": "grid_node",
824
+ "name": "GRID node",
825
+ "type": "Shape",
826
+ "transform": {
827
+ "x": 110,
828
+ "y": 280,
829
+ "rotation": 0,
830
+ "scale_x": 1,
831
+ "scale_y": 1,
832
+ "opacity": 1
833
+ },
834
+ "geometry": {
835
+ "type": "Ellipse",
836
+ "width": 48,
837
+ "height": 48
838
+ },
839
+ "style": {
840
+ "fill": {
841
+ "type": "Solid",
842
+ "color": "#B9CFE3",
843
+ "opacity": 1
844
+ },
845
+ "stroke": {
846
+ "color": "transparent",
847
+ "width": 0
848
+ }
849
+ },
850
+ "zIndex": 23
851
+ },
852
+ {
853
+ "id": "grid_icon_0",
854
+ "name": "GRID icon 1",
855
+ "type": "Shape",
856
+ "transform": {
857
+ "x": 107.25,
858
+ "y": 273.8125,
859
+ "rotation": 90,
860
+ "scale_x": 1,
861
+ "scale_y": 1,
862
+ "opacity": 1
863
+ },
864
+ "geometry": {
865
+ "type": "Line",
866
+ "width": 4.125,
867
+ "height": 0
868
+ },
869
+ "style": {
870
+ "fill": {
871
+ "type": "None"
872
+ },
873
+ "stroke": {
874
+ "color": "#3F6E99",
875
+ "width": 1.6,
876
+ "lineCap": "round",
877
+ "lineJoin": "round"
878
+ }
879
+ },
880
+ "zIndex": 24
881
+ },
882
+ {
883
+ "id": "grid_icon_1",
884
+ "name": "GRID icon 2",
885
+ "type": "Shape",
886
+ "transform": {
887
+ "x": 112.75,
888
+ "y": 273.8125,
889
+ "rotation": 90,
890
+ "scale_x": 1,
891
+ "scale_y": 1,
892
+ "opacity": 1
893
+ },
894
+ "geometry": {
895
+ "type": "Line",
896
+ "width": 4.125,
897
+ "height": 0
898
+ },
899
+ "style": {
900
+ "fill": {
901
+ "type": "None"
902
+ },
903
+ "stroke": {
904
+ "color": "#3F6E99",
905
+ "width": 1.6,
906
+ "lineCap": "round",
907
+ "lineJoin": "round"
908
+ }
909
+ },
910
+ "zIndex": 25
911
+ },
912
+ {
913
+ "id": "grid_icon_2",
914
+ "name": "GRID icon 3",
915
+ "type": "Shape",
916
+ "transform": {
917
+ "x": 110,
918
+ "y": 279.3125,
919
+ "rotation": 0,
920
+ "scale_x": 1,
921
+ "scale_y": 1,
922
+ "opacity": 1
923
+ },
924
+ "geometry": {
925
+ "type": "Path",
926
+ "data": "M104.96 275.88 L115.04 275.88 L115.04 279.08 L112.29 282.75 L107.71 282.75 L104.96 279.08 L104.96 275.88",
927
+ "width": 10.083333333333343,
928
+ "height": 6.875,
929
+ "is_closed": false
930
+ },
931
+ "style": {
932
+ "fill": {
933
+ "type": "None"
934
+ },
935
+ "stroke": {
936
+ "color": "#3F6E99",
937
+ "width": 1.6,
938
+ "lineCap": "round",
939
+ "lineJoin": "round"
940
+ }
941
+ },
942
+ "zIndex": 26
943
+ },
944
+ {
945
+ "id": "grid_icon_3",
946
+ "name": "GRID icon 4",
947
+ "type": "Shape",
948
+ "transform": {
949
+ "x": 110,
950
+ "y": 285.7291666666667,
951
+ "rotation": 90,
952
+ "scale_x": 1,
953
+ "scale_y": 1,
954
+ "opacity": 1
955
+ },
956
+ "geometry": {
957
+ "type": "Line",
958
+ "width": 5.958333333333333,
959
+ "height": 0
960
+ },
961
+ "style": {
962
+ "fill": {
963
+ "type": "None"
964
+ },
965
+ "stroke": {
966
+ "color": "#3F6E99",
967
+ "width": 1.6,
968
+ "lineCap": "round",
969
+ "lineJoin": "round"
970
+ }
971
+ },
972
+ "zIndex": 27
973
+ },
974
+ {
975
+ "id": "grid_label",
976
+ "name": "GRID label",
977
+ "type": "Shape",
978
+ "transform": {
979
+ "x": 110,
980
+ "y": 320,
981
+ "rotation": 0,
982
+ "scale_x": 1,
983
+ "scale_y": 1,
984
+ "opacity": 1
985
+ },
986
+ "geometry": {
987
+ "type": "Text",
988
+ "text": "GRID",
989
+ "fontSize": 10,
990
+ "fontFamily": "Inter",
991
+ "fontWeight": 500,
992
+ "textAlign": "center",
993
+ "width": 160,
994
+ "height": 14,
995
+ "letterSpacing": 0.8,
996
+ "textVerticalAlign": "middle"
997
+ },
998
+ "style": {
999
+ "fill": {
1000
+ "type": "Solid",
1001
+ "color": "#8A8A8A",
1002
+ "opacity": 1
1003
+ },
1004
+ "stroke": {
1005
+ "color": "transparent",
1006
+ "width": 0
1007
+ }
1008
+ },
1009
+ "zIndex": 28
1010
+ },
1011
+ {
1012
+ "id": "grid_value",
1013
+ "name": "GRID value",
1014
+ "type": "Shape",
1015
+ "transform": {
1016
+ "x": 90,
1017
+ "y": 340,
1018
+ "rotation": 0,
1019
+ "scale_x": 1,
1020
+ "scale_y": 1,
1021
+ "opacity": 1
1022
+ },
1023
+ "geometry": {
1024
+ "type": "Text",
1025
+ "text": "0.00",
1026
+ "fontSize": 16,
1027
+ "fontFamily": "JetBrains Mono",
1028
+ "fontWeight": 600,
1029
+ "textAlign": "left",
1030
+ "width": 120,
1031
+ "height": 22,
1032
+ "letterSpacing": 0,
1033
+ "textVerticalAlign": "middle"
1034
+ },
1035
+ "style": {
1036
+ "fill": {
1037
+ "type": "Solid",
1038
+ "color": "#1A1A1A",
1039
+ "opacity": 1
1040
+ },
1041
+ "stroke": {
1042
+ "color": "transparent",
1043
+ "width": 0
1044
+ }
1045
+ },
1046
+ "zIndex": 29
1047
+ },
1048
+ {
1049
+ "id": "grid_unit",
1050
+ "name": "GRID unit",
1051
+ "type": "Shape",
1052
+ "transform": {
1053
+ "x": 140,
1054
+ "y": 341.5,
1055
+ "rotation": 0,
1056
+ "scale_x": 1,
1057
+ "scale_y": 1,
1058
+ "opacity": 1
1059
+ },
1060
+ "geometry": {
1061
+ "type": "Text",
1062
+ "text": "kW",
1063
+ "fontSize": 11,
1064
+ "fontFamily": "Inter",
1065
+ "fontWeight": 500,
1066
+ "textAlign": "left",
1067
+ "width": 120,
1068
+ "height": 15,
1069
+ "letterSpacing": 0,
1070
+ "textVerticalAlign": "middle"
1071
+ },
1072
+ "style": {
1073
+ "fill": {
1074
+ "type": "Solid",
1075
+ "color": "#8A8A8A",
1076
+ "opacity": 1
1077
+ },
1078
+ "stroke": {
1079
+ "color": "transparent",
1080
+ "width": 0
1081
+ }
1082
+ },
1083
+ "zIndex": 30
1084
+ },
1085
+ {
1086
+ "id": "grid_status",
1087
+ "name": "GRID status",
1088
+ "type": "Shape",
1089
+ "transform": {
1090
+ "x": 110,
1091
+ "y": 359,
1092
+ "rotation": 0,
1093
+ "scale_x": 1,
1094
+ "scale_y": 1,
1095
+ "opacity": 1
1096
+ },
1097
+ "geometry": {
1098
+ "type": "Text",
1099
+ "text": "",
1100
+ "fontSize": 10,
1101
+ "fontFamily": "Inter",
1102
+ "fontWeight": 400,
1103
+ "textAlign": "center",
1104
+ "width": 160,
1105
+ "height": 14,
1106
+ "letterSpacing": 0,
1107
+ "textVerticalAlign": "middle"
1108
+ },
1109
+ "style": {
1110
+ "fill": {
1111
+ "type": "Solid",
1112
+ "color": "#9A9A9A",
1113
+ "opacity": 1
1114
+ },
1115
+ "stroke": {
1116
+ "color": "transparent",
1117
+ "width": 0
1118
+ }
1119
+ },
1120
+ "zIndex": 31
1121
+ },
1122
+ {
1123
+ "id": "load_node",
1124
+ "name": "LOAD node",
1125
+ "type": "Shape",
1126
+ "transform": {
1127
+ "x": 610,
1128
+ "y": 280,
1129
+ "rotation": 0,
1130
+ "scale_x": 1,
1131
+ "scale_y": 1,
1132
+ "opacity": 1
1133
+ },
1134
+ "geometry": {
1135
+ "type": "Ellipse",
1136
+ "width": 48,
1137
+ "height": 48
1138
+ },
1139
+ "style": {
1140
+ "fill": {
1141
+ "type": "Solid",
1142
+ "color": "#E4B09A",
1143
+ "opacity": 1
1144
+ },
1145
+ "stroke": {
1146
+ "color": "transparent",
1147
+ "width": 0
1148
+ }
1149
+ },
1150
+ "zIndex": 32
1151
+ },
1152
+ {
1153
+ "id": "load_icon_0",
1154
+ "name": "LOAD icon 1",
1155
+ "type": "Shape",
1156
+ "transform": {
1157
+ "x": 610,
1158
+ "y": 275.41666666666663,
1159
+ "rotation": 0,
1160
+ "scale_x": 1,
1161
+ "scale_y": 1,
1162
+ "opacity": 1
1163
+ },
1164
+ "geometry": {
1165
+ "type": "Path",
1166
+ "data": "M602.21 278.63 L610.00 272.21 L617.79 278.63",
1167
+ "width": 15.583333333333258,
1168
+ "height": 6.416666666666686,
1169
+ "is_closed": false
1170
+ },
1171
+ "style": {
1172
+ "fill": {
1173
+ "type": "None"
1174
+ },
1175
+ "stroke": {
1176
+ "color": "#9C4A2A",
1177
+ "width": 1.6,
1178
+ "lineCap": "round",
1179
+ "lineJoin": "round"
1180
+ }
1181
+ },
1182
+ "zIndex": 33
1183
+ },
1184
+ {
1185
+ "id": "load_icon_1",
1186
+ "name": "LOAD icon 2",
1187
+ "type": "Shape",
1188
+ "transform": {
1189
+ "x": 610,
1190
+ "y": 282.52083333333337,
1191
+ "rotation": 0,
1192
+ "scale_x": 1,
1193
+ "scale_y": 1,
1194
+ "opacity": 1
1195
+ },
1196
+ "geometry": {
1197
+ "type": "Path",
1198
+ "data": "M604.04 277.25 L604.04 287.79 L615.96 287.79 L615.96 277.25",
1199
+ "width": 11.916666666666742,
1200
+ "height": 10.541666666666686,
1201
+ "is_closed": false
1202
+ },
1203
+ "style": {
1204
+ "fill": {
1205
+ "type": "None"
1206
+ },
1207
+ "stroke": {
1208
+ "color": "#9C4A2A",
1209
+ "width": 1.6,
1210
+ "lineCap": "round",
1211
+ "lineJoin": "round"
1212
+ }
1213
+ },
1214
+ "zIndex": 34
1215
+ },
1216
+ {
1217
+ "id": "load_icon_2",
1218
+ "name": "LOAD icon 3",
1219
+ "type": "Shape",
1220
+ "transform": {
1221
+ "x": 610,
1222
+ "y": 285.27083333333337,
1223
+ "rotation": 0,
1224
+ "scale_x": 1,
1225
+ "scale_y": 1,
1226
+ "opacity": 1
1227
+ },
1228
+ "geometry": {
1229
+ "type": "Path",
1230
+ "data": "M608.17 287.79 L608.17 282.75 L611.83 282.75 L611.83 287.79",
1231
+ "width": 3.6666666666667425,
1232
+ "height": 5.041666666666686,
1233
+ "is_closed": false
1234
+ },
1235
+ "style": {
1236
+ "fill": {
1237
+ "type": "None"
1238
+ },
1239
+ "stroke": {
1240
+ "color": "#9C4A2A",
1241
+ "width": 1.6,
1242
+ "lineCap": "round",
1243
+ "lineJoin": "round"
1244
+ }
1245
+ },
1246
+ "zIndex": 35
1247
+ },
1248
+ {
1249
+ "id": "load_label",
1250
+ "name": "LOAD label",
1251
+ "type": "Shape",
1252
+ "transform": {
1253
+ "x": 610,
1254
+ "y": 320,
1255
+ "rotation": 0,
1256
+ "scale_x": 1,
1257
+ "scale_y": 1,
1258
+ "opacity": 1
1259
+ },
1260
+ "geometry": {
1261
+ "type": "Text",
1262
+ "text": "LOAD",
1263
+ "fontSize": 10,
1264
+ "fontFamily": "Inter",
1265
+ "fontWeight": 500,
1266
+ "textAlign": "center",
1267
+ "width": 160,
1268
+ "height": 14,
1269
+ "letterSpacing": 0.8,
1270
+ "textVerticalAlign": "middle"
1271
+ },
1272
+ "style": {
1273
+ "fill": {
1274
+ "type": "Solid",
1275
+ "color": "#8A8A8A",
1276
+ "opacity": 1
1277
+ },
1278
+ "stroke": {
1279
+ "color": "transparent",
1280
+ "width": 0
1281
+ }
1282
+ },
1283
+ "zIndex": 36
1284
+ },
1285
+ {
1286
+ "id": "load_value",
1287
+ "name": "LOAD value",
1288
+ "type": "Shape",
1289
+ "transform": {
1290
+ "x": 590,
1291
+ "y": 340,
1292
+ "rotation": 0,
1293
+ "scale_x": 1,
1294
+ "scale_y": 1,
1295
+ "opacity": 1
1296
+ },
1297
+ "geometry": {
1298
+ "type": "Text",
1299
+ "text": "0.00",
1300
+ "fontSize": 16,
1301
+ "fontFamily": "JetBrains Mono",
1302
+ "fontWeight": 600,
1303
+ "textAlign": "left",
1304
+ "width": 120,
1305
+ "height": 22,
1306
+ "letterSpacing": 0,
1307
+ "textVerticalAlign": "middle"
1308
+ },
1309
+ "style": {
1310
+ "fill": {
1311
+ "type": "Solid",
1312
+ "color": "#1A1A1A",
1313
+ "opacity": 1
1314
+ },
1315
+ "stroke": {
1316
+ "color": "transparent",
1317
+ "width": 0
1318
+ }
1319
+ },
1320
+ "zIndex": 37
1321
+ },
1322
+ {
1323
+ "id": "load_unit",
1324
+ "name": "LOAD unit",
1325
+ "type": "Shape",
1326
+ "transform": {
1327
+ "x": 640,
1328
+ "y": 341.5,
1329
+ "rotation": 0,
1330
+ "scale_x": 1,
1331
+ "scale_y": 1,
1332
+ "opacity": 1
1333
+ },
1334
+ "geometry": {
1335
+ "type": "Text",
1336
+ "text": "kW",
1337
+ "fontSize": 11,
1338
+ "fontFamily": "Inter",
1339
+ "fontWeight": 500,
1340
+ "textAlign": "left",
1341
+ "width": 120,
1342
+ "height": 15,
1343
+ "letterSpacing": 0,
1344
+ "textVerticalAlign": "middle"
1345
+ },
1346
+ "style": {
1347
+ "fill": {
1348
+ "type": "Solid",
1349
+ "color": "#8A8A8A",
1350
+ "opacity": 1
1351
+ },
1352
+ "stroke": {
1353
+ "color": "transparent",
1354
+ "width": 0
1355
+ }
1356
+ },
1357
+ "zIndex": 38
1358
+ },
1359
+ {
1360
+ "id": "load_status",
1361
+ "name": "LOAD status",
1362
+ "type": "Shape",
1363
+ "transform": {
1364
+ "x": 610,
1365
+ "y": 359,
1366
+ "rotation": 0,
1367
+ "scale_x": 1,
1368
+ "scale_y": 1,
1369
+ "opacity": 1
1370
+ },
1371
+ "geometry": {
1372
+ "type": "Text",
1373
+ "text": "",
1374
+ "fontSize": 10,
1375
+ "fontFamily": "Inter",
1376
+ "fontWeight": 400,
1377
+ "textAlign": "center",
1378
+ "width": 160,
1379
+ "height": 14,
1380
+ "letterSpacing": 0,
1381
+ "textVerticalAlign": "middle"
1382
+ },
1383
+ "style": {
1384
+ "fill": {
1385
+ "type": "Solid",
1386
+ "color": "#9A9A9A",
1387
+ "opacity": 1
1388
+ },
1389
+ "stroke": {
1390
+ "color": "transparent",
1391
+ "width": 0
1392
+ }
1393
+ },
1394
+ "zIndex": 39
1395
+ },
1396
+ {
1397
+ "id": "battery_track",
1398
+ "name": "Battery ring track",
1399
+ "type": "Shape",
1400
+ "transform": {
1401
+ "x": 360,
1402
+ "y": 450,
1403
+ "rotation": 0,
1404
+ "scale_x": 1,
1405
+ "scale_y": 1,
1406
+ "opacity": 1
1407
+ },
1408
+ "geometry": {
1409
+ "type": "Ellipse",
1410
+ "width": 44,
1411
+ "height": 44
1412
+ },
1413
+ "style": {
1414
+ "fill": {
1415
+ "type": "Solid",
1416
+ "color": "#000000",
1417
+ "opacity": 0
1418
+ },
1419
+ "stroke": {
1420
+ "color": "#DCE9E3",
1421
+ "width": 4
1422
+ }
1423
+ },
1424
+ "zIndex": 40
1425
+ },
1426
+ {
1427
+ "id": "battery_ring",
1428
+ "name": "Battery ring",
1429
+ "type": "Shape",
1430
+ "transform": {
1431
+ "x": 360,
1432
+ "y": 450,
1433
+ "rotation": -90,
1434
+ "scale_x": 1,
1435
+ "scale_y": 1,
1436
+ "opacity": 1
1437
+ },
1438
+ "geometry": {
1439
+ "type": "Ellipse",
1440
+ "width": 44,
1441
+ "height": 44
1442
+ },
1443
+ "style": {
1444
+ "fill": {
1445
+ "type": "Solid",
1446
+ "color": "#000000",
1447
+ "opacity": 0
1448
+ },
1449
+ "stroke": {
1450
+ "color": "#2F6B5E",
1451
+ "width": 4,
1452
+ "lineCap": "round",
1453
+ "trimStart": 0,
1454
+ "trimEnd": 0.32,
1455
+ "trimOffset": 0
1456
+ }
1457
+ },
1458
+ "zIndex": 41
1459
+ },
1460
+ {
1461
+ "id": "battery_icon_0",
1462
+ "name": "BATTERY icon 1",
1463
+ "type": "Shape",
1464
+ "transform": {
1465
+ "x": 360,
1466
+ "y": 450.9166666666667,
1467
+ "rotation": 0,
1468
+ "scale_x": 1,
1469
+ "scale_y": 1,
1470
+ "opacity": 1
1471
+ },
1472
+ "geometry": {
1473
+ "type": "Rectangle",
1474
+ "width": 9.166666666666666,
1475
+ "height": 14.666666666666666,
1476
+ "corner_radius": [
1477
+ 1.8333333333333333,
1478
+ 1.8333333333333333,
1479
+ 1.8333333333333333,
1480
+ 1.8333333333333333
1481
+ ]
1482
+ },
1483
+ "style": {
1484
+ "fill": {
1485
+ "type": "None"
1486
+ },
1487
+ "stroke": {
1488
+ "color": "#2F6B5E",
1489
+ "width": 1.6,
1490
+ "lineCap": "round",
1491
+ "lineJoin": "round"
1492
+ }
1493
+ },
1494
+ "zIndex": 42
1495
+ },
1496
+ {
1497
+ "id": "battery_icon_1",
1498
+ "name": "BATTERY icon 2",
1499
+ "type": "Shape",
1500
+ "transform": {
1501
+ "x": 360,
1502
+ "y": 441.2916666666667,
1503
+ "rotation": 0,
1504
+ "scale_x": 1,
1505
+ "scale_y": 1,
1506
+ "opacity": 1
1507
+ },
1508
+ "geometry": {
1509
+ "type": "Line",
1510
+ "width": 3.6666666666666665,
1511
+ "height": 0
1512
+ },
1513
+ "style": {
1514
+ "fill": {
1515
+ "type": "None"
1516
+ },
1517
+ "stroke": {
1518
+ "color": "#2F6B5E",
1519
+ "width": 1.6,
1520
+ "lineCap": "round",
1521
+ "lineJoin": "round"
1522
+ }
1523
+ },
1524
+ "zIndex": 43
1525
+ },
1526
+ {
1527
+ "id": "battery_icon_2",
1528
+ "name": "BATTERY icon 3",
1529
+ "type": "Shape",
1530
+ "transform": {
1531
+ "x": 360,
1532
+ "y": 449.5416666666667,
1533
+ "rotation": 0,
1534
+ "scale_x": 1,
1535
+ "scale_y": 1,
1536
+ "opacity": 1
1537
+ },
1538
+ "geometry": {
1539
+ "type": "Line",
1540
+ "width": 3.6666666666666665,
1541
+ "height": 0
1542
+ },
1543
+ "style": {
1544
+ "fill": {
1545
+ "type": "None"
1546
+ },
1547
+ "stroke": {
1548
+ "color": "#2F6B5E",
1549
+ "width": 1.6,
1550
+ "lineCap": "round",
1551
+ "lineJoin": "round"
1552
+ }
1553
+ },
1554
+ "zIndex": 44
1555
+ },
1556
+ {
1557
+ "id": "battery_icon_3",
1558
+ "name": "BATTERY icon 4",
1559
+ "type": "Shape",
1560
+ "transform": {
1561
+ "x": 360,
1562
+ "y": 452.75,
1563
+ "rotation": 0,
1564
+ "scale_x": 1,
1565
+ "scale_y": 1,
1566
+ "opacity": 1
1567
+ },
1568
+ "geometry": {
1569
+ "type": "Line",
1570
+ "width": 3.6666666666666665,
1571
+ "height": 0
1572
+ },
1573
+ "style": {
1574
+ "fill": {
1575
+ "type": "None"
1576
+ },
1577
+ "stroke": {
1578
+ "color": "#2F6B5E",
1579
+ "width": 1.6,
1580
+ "lineCap": "round",
1581
+ "lineJoin": "round"
1582
+ }
1583
+ },
1584
+ "zIndex": 45
1585
+ },
1586
+ {
1587
+ "id": "battery_label",
1588
+ "name": "BATTERY label",
1589
+ "type": "Shape",
1590
+ "transform": {
1591
+ "x": 360,
1592
+ "y": 490,
1593
+ "rotation": 0,
1594
+ "scale_x": 1,
1595
+ "scale_y": 1,
1596
+ "opacity": 1
1597
+ },
1598
+ "geometry": {
1599
+ "type": "Text",
1600
+ "text": "BATTERY",
1601
+ "fontSize": 10,
1602
+ "fontFamily": "Inter",
1603
+ "fontWeight": 500,
1604
+ "textAlign": "center",
1605
+ "width": 160,
1606
+ "height": 14,
1607
+ "letterSpacing": 0.8,
1608
+ "textVerticalAlign": "middle"
1609
+ },
1610
+ "style": {
1611
+ "fill": {
1612
+ "type": "Solid",
1613
+ "color": "#8A8A8A",
1614
+ "opacity": 1
1615
+ },
1616
+ "stroke": {
1617
+ "color": "transparent",
1618
+ "width": 0
1619
+ }
1620
+ },
1621
+ "zIndex": 46
1622
+ },
1623
+ {
1624
+ "id": "battery_value",
1625
+ "name": "BATTERY value",
1626
+ "type": "Shape",
1627
+ "transform": {
1628
+ "x": 340,
1629
+ "y": 510,
1630
+ "rotation": 0,
1631
+ "scale_x": 1,
1632
+ "scale_y": 1,
1633
+ "opacity": 1
1634
+ },
1635
+ "geometry": {
1636
+ "type": "Text",
1637
+ "text": "0.00",
1638
+ "fontSize": 16,
1639
+ "fontFamily": "JetBrains Mono",
1640
+ "fontWeight": 600,
1641
+ "textAlign": "left",
1642
+ "width": 120,
1643
+ "height": 22,
1644
+ "letterSpacing": 0,
1645
+ "textVerticalAlign": "middle"
1646
+ },
1647
+ "style": {
1648
+ "fill": {
1649
+ "type": "Solid",
1650
+ "color": "#1A1A1A",
1651
+ "opacity": 1
1652
+ },
1653
+ "stroke": {
1654
+ "color": "transparent",
1655
+ "width": 0
1656
+ }
1657
+ },
1658
+ "zIndex": 47
1659
+ },
1660
+ {
1661
+ "id": "battery_unit",
1662
+ "name": "BATTERY unit",
1663
+ "type": "Shape",
1664
+ "transform": {
1665
+ "x": 390,
1666
+ "y": 511.5,
1667
+ "rotation": 0,
1668
+ "scale_x": 1,
1669
+ "scale_y": 1,
1670
+ "opacity": 1
1671
+ },
1672
+ "geometry": {
1673
+ "type": "Text",
1674
+ "text": "%",
1675
+ "fontSize": 11,
1676
+ "fontFamily": "Inter",
1677
+ "fontWeight": 500,
1678
+ "textAlign": "left",
1679
+ "width": 120,
1680
+ "height": 15,
1681
+ "letterSpacing": 0,
1682
+ "textVerticalAlign": "middle"
1683
+ },
1684
+ "style": {
1685
+ "fill": {
1686
+ "type": "Solid",
1687
+ "color": "#8A8A8A",
1688
+ "opacity": 1
1689
+ },
1690
+ "stroke": {
1691
+ "color": "transparent",
1692
+ "width": 0
1693
+ }
1694
+ },
1695
+ "zIndex": 48
1696
+ },
1697
+ {
1698
+ "id": "battery_status",
1699
+ "name": "BATTERY status",
1700
+ "type": "Shape",
1701
+ "transform": {
1702
+ "x": 360,
1703
+ "y": 529,
1704
+ "rotation": 0,
1705
+ "scale_x": 1,
1706
+ "scale_y": 1,
1707
+ "opacity": 1
1708
+ },
1709
+ "geometry": {
1710
+ "type": "Text",
1711
+ "text": "",
1712
+ "fontSize": 10,
1713
+ "fontFamily": "Inter",
1714
+ "fontWeight": 400,
1715
+ "textAlign": "center",
1716
+ "width": 160,
1717
+ "height": 14,
1718
+ "letterSpacing": 0,
1719
+ "textVerticalAlign": "middle"
1720
+ },
1721
+ "style": {
1722
+ "fill": {
1723
+ "type": "Solid",
1724
+ "color": "#9A9A9A",
1725
+ "opacity": 1
1726
+ },
1727
+ "stroke": {
1728
+ "color": "transparent",
1729
+ "width": 0
1730
+ }
1731
+ },
1732
+ "zIndex": 49
1733
+ }
1734
+ ],
1735
+ "lastModified": 1792096962406
1736
+ }