blue-chestnut-solar-expert 0.0.67 → 0.0.69

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 (90) hide show
  1. package/dist/cjs/eraser-icon_19.cjs.entry.js +1 -1
  2. package/dist/cjs/{lerc-v64rYVDy.js → lerc-Bdx5y-yw.js} +3 -3
  3. package/dist/cjs/{lerc-v64rYVDy.js.map → lerc-Bdx5y-yw.js.map} +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/loading-widget.cjs.entry.js +1 -1
  6. package/dist/cjs/stencil-library.cjs.js +1 -1
  7. package/dist/collection/components/map-draw/map-draw.js +54 -25
  8. package/dist/collection/components/map-draw/map-draw.js.map +1 -1
  9. package/dist/collection/components/map-draw/map-selector.js +3 -3
  10. package/dist/collection/components/map-draw/polygon-buttons.js +1 -1
  11. package/dist/collection/components/map-draw/polygon-information.js +2 -2
  12. package/dist/collection/components/map-draw/tool-box.js +3 -3
  13. package/dist/collection/components/map-draw/tutorial-component.js +72 -4
  14. package/dist/collection/components/map-draw/tutorial-component.js.map +1 -1
  15. package/dist/collection/components/settings/settings.js +8 -8
  16. package/dist/collection/components/solar-expert/solar-expert.js +1 -1
  17. package/dist/collection/components/solar-system-form/solar-system-form.js +57 -36
  18. package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
  19. package/dist/collection/components/widgets/loading-widget.js +1 -1
  20. package/dist/collection/types/lang.js.map +1 -1
  21. package/dist/collection/utils/api.js +3 -2
  22. package/dist/collection/utils/api.js.map +1 -1
  23. package/dist/collection/utils/lang/english.js +7 -0
  24. package/dist/collection/utils/lang/english.js.map +1 -1
  25. package/dist/collection/utils/lang/german.js +7 -0
  26. package/dist/collection/utils/lang/german.js.map +1 -1
  27. package/dist/collection/utils/lang/spanish.js +7 -0
  28. package/dist/collection/utils/lang/spanish.js.map +1 -1
  29. package/dist/collection/utils/solar.js +0 -1
  30. package/dist/collection/utils/solar.js.map +1 -1
  31. package/dist/components/loading-widget.js +1 -1
  32. package/dist/components/map-draw.js +1 -1
  33. package/dist/components/map-selector.js +1 -1
  34. package/dist/components/{p-i1uLweD0.js → p-26DHwbCE.js} +4 -4
  35. package/dist/components/{p-i1uLweD0.js.map → p-26DHwbCE.js.map} +1 -1
  36. package/dist/components/{p-DlNHVTGB.js → p-BOe-Z8rz.js} +1462 -1088
  37. package/dist/components/p-BOe-Z8rz.js.map +1 -0
  38. package/dist/components/{p-Bopprtc7.js → p-Bduzzygj.js} +6 -6
  39. package/dist/components/{p-Bopprtc7.js.map → p-Bduzzygj.js.map} +1 -1
  40. package/dist/components/p-C3ZXE525.js +855 -0
  41. package/dist/components/p-C3ZXE525.js.map +1 -0
  42. package/dist/components/{p-DWirjxpO.js → p-Cx7fffWb.js} +6 -6
  43. package/dist/components/{p-DWirjxpO.js.map → p-Cx7fffWb.js.map} +1 -1
  44. package/dist/components/{p-Dzl6kfPI.js → p-D2AHNjbG.js} +39 -7
  45. package/dist/components/p-D2AHNjbG.js.map +1 -0
  46. package/dist/components/{p-BcVa4_YP.js → p-DLWzgdrw.js} +3 -3
  47. package/dist/components/{p-BcVa4_YP.js.map → p-DLWzgdrw.js.map} +1 -1
  48. package/dist/components/{p-B4X-RCW0.js → p-Ddk3b30j.js} +11 -11
  49. package/dist/components/{p-B4X-RCW0.js.map → p-Ddk3b30j.js.map} +1 -1
  50. package/dist/components/{p-eDwaXClX.js → p-DfzSejIb.js} +23 -2
  51. package/dist/components/p-DfzSejIb.js.map +1 -0
  52. package/dist/components/{p-BFJHTJPM.js → p-OxUYjaAL.js} +6 -6
  53. package/dist/components/{p-BFJHTJPM.js.map → p-OxUYjaAL.js.map} +1 -1
  54. package/dist/components/polygon-buttons.js +1 -1
  55. package/dist/components/polygon-information.js +1 -1
  56. package/dist/components/settings-modal.js +1 -1
  57. package/dist/components/solar-expert.js +10 -10
  58. package/dist/components/solar-system-form.js +1 -1
  59. package/dist/components/tool-box.js +1 -1
  60. package/dist/components/tutorial-component.js +1 -1
  61. package/dist/esm/eraser-icon_19.entry.js +1 -1
  62. package/dist/esm/{lerc-CAiDQjTu.js → lerc-DF5Lrv5A.js} +3 -3
  63. package/dist/esm/{lerc-CAiDQjTu.js.map → lerc-DF5Lrv5A.js.map} +1 -1
  64. package/dist/esm/loader.js +1 -1
  65. package/dist/esm/loading-widget.entry.js +1 -1
  66. package/dist/esm/stencil-library.js +1 -1
  67. package/dist/stencil-library/assets/tutorial4.mp4 +0 -0
  68. package/dist/stencil-library/{p-ab0f2031.entry.js → p-9b4e52c3.entry.js} +2 -2
  69. package/dist/stencil-library/p-CymYGBJH.js +2 -0
  70. package/dist/stencil-library/p-CymYGBJH.js.map +1 -0
  71. package/dist/stencil-library/{p-cAuhy_jT.js → p-DHgjDQwz.js} +4 -4
  72. package/dist/stencil-library/{p-cAuhy_jT.js.map → p-DHgjDQwz.js.map} +1 -1
  73. package/dist/stencil-library/{p-e7b94dbb.entry.js → p-ba64c5e4.entry.js} +2 -2
  74. package/dist/stencil-library/stencil-library.esm.js +1 -1
  75. package/dist/types/components/map-draw/map-draw.d.ts +5 -0
  76. package/dist/types/components/map-draw/tutorial-component.d.ts +7 -0
  77. package/dist/types/components/solar-system-form/solar-system-form.d.ts +1 -0
  78. package/dist/types/components.d.ts +6 -0
  79. package/dist/types/types/lang.d.ts +7 -0
  80. package/dist/types/utils/api.d.ts +1 -0
  81. package/package.json +1 -1
  82. package/dist/components/p-DlNHVTGB.js.map +0 -1
  83. package/dist/components/p-Dzl6kfPI.js.map +0 -1
  84. package/dist/components/p-PkMjF2if.js +0 -1985
  85. package/dist/components/p-PkMjF2if.js.map +0 -1
  86. package/dist/components/p-eDwaXClX.js.map +0 -1
  87. package/dist/stencil-library/p-BBtmpSUK.js +0 -2
  88. package/dist/stencil-library/p-BBtmpSUK.js.map +0 -1
  89. /package/dist/stencil-library/{p-ab0f2031.entry.js.map → p-9b4e52c3.entry.js.map} +0 -0
  90. /package/dist/stencil-library/{p-e7b94dbb.entry.js.map → p-ba64c5e4.entry.js.map} +0 -0
@@ -0,0 +1,855 @@
1
+
2
+ if (typeof global === "undefined") { var global = globalThis || window || self; }
3
+ import { p as proxyCustomElement, H, h } from './index.js';
4
+ import { g as getLanguageStrings, s as state } from './p-DfzSejIb.js';
5
+
6
+ const SOLAR_RADIATION = [
7
+ 0,
8
+ 0,
9
+ 0,
10
+ 0,
11
+ 0,
12
+ 0,
13
+ 0,
14
+ 0.1,
15
+ 0.2,
16
+ 0.4,
17
+ 0.8,
18
+ 0.9,
19
+ 1,
20
+ 0.95,
21
+ 0.9,
22
+ 0.7,
23
+ 0.5,
24
+ 0.3,
25
+ 0.16,
26
+ 0.02,
27
+ 0,
28
+ 0,
29
+ 0,
30
+ 0,
31
+ ];
32
+ function getSolarRadiation(discountFactor) {
33
+ return SOLAR_RADIATION.map((value) => value * discountFactor);
34
+ }
35
+ const CONSUMPTION_PROFILES = {
36
+ mostly_at_home: [
37
+ 0.1,
38
+ 0.1,
39
+ 0.1,
40
+ 0.1,
41
+ 0.1,
42
+ 0.15,
43
+ 0.23,
44
+ 0.26,
45
+ 0.16,
46
+ 0.16,
47
+ 0.15,
48
+ 0.19,
49
+ 0.23,
50
+ 0.24,
51
+ 0.35,
52
+ 0.28,
53
+ 0.275,
54
+ 0.8,
55
+ 0.78,
56
+ 0.74,
57
+ 0.75,
58
+ 0.73,
59
+ 0.26,
60
+ 0.1,
61
+ ],
62
+ mostly_away: [
63
+ 0.1,
64
+ 0.1,
65
+ 0.1,
66
+ 0.1,
67
+ 0.1,
68
+ 0.15,
69
+ 0.29,
70
+ 0.32,
71
+ 0.25,
72
+ 0.15,
73
+ 0.12,
74
+ 0.14,
75
+ 0.15,
76
+ 0.12,
77
+ 0.16,
78
+ 0.21,
79
+ 0.285,
80
+ 1,
81
+ 0.81,
82
+ 0.77,
83
+ 0.79,
84
+ 0.73,
85
+ 0.26,
86
+ 0.1,
87
+ ],
88
+ };
89
+
90
+ const DEFAULT_GENERAL_SIMULATION_CONFIG = {
91
+ simulationYears: 25,
92
+ };
93
+
94
+ function generateElectricCarChargingHours(start, end) {
95
+ let hours = new Array(24).fill(false);
96
+ if (start < end) {
97
+ for (let i = start; i <= end; i++) {
98
+ hours[i] = true;
99
+ }
100
+ }
101
+ else {
102
+ for (let i = start; i <= 24; i++) {
103
+ hours[i] = true;
104
+ }
105
+ for (let i = 0; i <= end; i++) {
106
+ hours[i] = true;
107
+ }
108
+ }
109
+ return hours;
110
+ }
111
+ function simulateDay(production, consumption, dailyConsumption, battery) {
112
+ let batteryCharge = 0;
113
+ let soldEnergy = 0;
114
+ let energyUsageOfProduction = 0;
115
+ for (let hour = 0; hour < production.length; hour++) {
116
+ const energyDifference = production[hour] - consumption[hour];
117
+ if (energyDifference > 0) {
118
+ energyUsageOfProduction += consumption[hour];
119
+ if (batteryCharge < battery &&
120
+ batteryCharge + energyDifference <= battery) {
121
+ batteryCharge = batteryCharge + energyDifference;
122
+ }
123
+ else if (batteryCharge < battery) {
124
+ const batteryDifference = battery - batteryCharge;
125
+ batteryCharge = battery;
126
+ soldEnergy += energyDifference - batteryDifference;
127
+ }
128
+ else {
129
+ soldEnergy += energyDifference;
130
+ }
131
+ }
132
+ else {
133
+ if (batteryCharge > 0) {
134
+ if (batteryCharge >= -energyDifference) {
135
+ batteryCharge += energyDifference;
136
+ energyUsageOfProduction += consumption[hour];
137
+ }
138
+ else {
139
+ energyUsageOfProduction += production[hour] + batteryCharge;
140
+ batteryCharge = 0;
141
+ }
142
+ }
143
+ else {
144
+ energyUsageOfProduction += production[hour];
145
+ }
146
+ }
147
+ }
148
+ if (batteryCharge > 0) {
149
+ soldEnergy += batteryCharge;
150
+ }
151
+ const autonomy = energyUsageOfProduction / dailyConsumption;
152
+ return {
153
+ autonomy: autonomy > 1 ? 1 : autonomy,
154
+ soldEnergy,
155
+ energyUsageOfProduction,
156
+ };
157
+ }
158
+ function simulate(config) {
159
+ const generalConfig = {
160
+ ...DEFAULT_GENERAL_SIMULATION_CONFIG,
161
+ ...config.general,
162
+ };
163
+ const consumption = CONSUMPTION_PROFILES[config.householdConsumption.consumptionProfile];
164
+ const norm = consumption.reduce((acc, curr) => acc + curr, 0);
165
+ let additionalConsumption = 0;
166
+ if (config.heatPump) {
167
+ additionalConsumption =
168
+ (config.heatPump.m2 || 0) * config.heatPump.consumptionPerM2 || 0;
169
+ }
170
+ let electricCarConsumption = 0;
171
+ let electricCarNorm = 1;
172
+ let electricCarChargingHours = consumption.map((_) => false);
173
+ if (config.electricCar) {
174
+ electricCarChargingHours = config.electricCar.chargingHours;
175
+ const dailyCarUsage = config.electricCar.averageKilometersPerDay / 100 *
176
+ config.electricCar.consumptionkWhPer100km;
177
+ electricCarConsumption = Math.min(dailyCarUsage, config.electricCar.batteryKWh);
178
+ electricCarNorm = config.electricCar.chargingHours.reduce((acc, curr) => acc + (curr ? 1 : 0), 0);
179
+ if (electricCarNorm === 0) {
180
+ electricCarNorm = 1;
181
+ }
182
+ }
183
+ let systemSize = 0;
184
+ if (config.solarSystems) {
185
+ systemSize = Object.values(config.solarSystems).reduce((acc, curr) => {
186
+ return acc + curr.numberOfPanels * curr.panelType.kWattPeak;
187
+ }, 0);
188
+ }
189
+ else if (config.solarSystem) {
190
+ console.warn("solarSystem is deprecated, use solarSystems instead");
191
+ systemSize = config.solarSystem.numberOfPanels *
192
+ config.solarSystem.panelType.kWattPeak;
193
+ }
194
+ else {
195
+ throw new Error("No solar system found");
196
+ }
197
+ const summerProduction = getSolarRadiation(config.solarRadiation.summerFactor * systemSize);
198
+ const winterProduction = getSolarRadiation(config.solarRadiation.winterFactor * systemSize);
199
+ const summerConsumptionWholeDay = config.householdConsumption.averageConsumption *
200
+ config.householdConsumption.summerConsumptionFactor +
201
+ additionalConsumption *
202
+ config.householdConsumption.summerConsumptionFactor;
203
+ const summerConsumptionDaily = consumption.map((c, i) => c / norm * summerConsumptionWholeDay +
204
+ electricCarConsumption / electricCarNorm *
205
+ (electricCarChargingHours[i] ? 1 : 0));
206
+ const winterConsumptionWholeDay = config.householdConsumption.averageConsumption *
207
+ config.householdConsumption.winterConsumptionFactor +
208
+ additionalConsumption *
209
+ config.householdConsumption.winterConsumptionFactor;
210
+ const winterConsumptionDaily = consumption.map((c, i) => c / norm * winterConsumptionWholeDay +
211
+ electricCarConsumption / electricCarNorm *
212
+ (electricCarChargingHours[i] ? 1 : 0));
213
+ const summerDay = simulateDay(summerProduction, summerConsumptionDaily, summerConsumptionWholeDay + electricCarConsumption, config.batteryKWh);
214
+ const winterDay = simulateDay(winterProduction, winterConsumptionDaily, winterConsumptionWholeDay + electricCarConsumption, config.batteryKWh);
215
+ let savedCostsByYear = [];
216
+ const soldEnergy = (summerDay.soldEnergy + winterDay.soldEnergy) / 2;
217
+ const ownConsumption = (summerDay.energyUsageOfProduction +
218
+ winterDay.energyUsageOfProduction) / 2;
219
+ let energyPrice = config.electricityPrice.purchase;
220
+ for (let i = 0; i < generalConfig.simulationYears; i++) {
221
+ const savedCostsThisYear = ownConsumption * energyPrice * 365;
222
+ savedCostsByYear.push(savedCostsThisYear);
223
+ energyPrice = (1 + config.electricityPrice.increase) * energyPrice;
224
+ }
225
+ const totalEnergyProduction = (summerProduction.reduce((acc, curr) => acc + curr, 0) +
226
+ winterProduction.reduce((acc, curr) => acc + curr, 0)) / 2;
227
+ return {
228
+ autonomy: (summerDay.autonomy + winterDay.autonomy) / 2,
229
+ compensationPerDay: soldEnergy * config.electricityPrice.sell,
230
+ byYearSavedCosts: savedCostsByYear,
231
+ totalEnergyConsumptionDay: (summerConsumptionWholeDay + winterConsumptionWholeDay) / 2 +
232
+ electricCarConsumption,
233
+ totalEnergyProduction,
234
+ };
235
+ }
236
+
237
+ const DEFAULT_SOLAR_EXPERT_CONFIG = {
238
+ openRoofColor: "#d6eeff",
239
+ closedRoofColor: "#ffffff",
240
+ openObstructionColor: "#f57242",
241
+ closedObstructionColor: "rgba(255, 132, 107, 0.8)",
242
+ roofPolygonFillColor: "rgba(92, 187, 255, 0.5)",
243
+ obstructionPolygonFillColor: "rgba(255, 132, 107, 0.5)",
244
+ roofPolygonHoverFillColor: "rgba(92, 187, 255, 0.8)",
245
+ obstructionPolygonHoverFillColor: "rgba(255, 132, 107, 0.8)",
246
+ roofPolygonSelectedFillColor: "rgba(92, 187, 255, 0.7)",
247
+ obstructionPolygonSelectedFillColor: "rgba(255, 132, 107, 0.7)",
248
+ highlightColor: "rgba(0, 89, 255, 1)",
249
+ };
250
+ const DEFAULT_SOLAR_PANEL_TYPE = {
251
+ widthMeters: 1.134,
252
+ heightMeters: 1.762,
253
+ kWattPeak: 0.455,
254
+ efficiency: 0.224,
255
+ price: 77.68,
256
+ };
257
+ const DEFAULT_COLOR_SCHEME = {
258
+ primary: "hsl(41 51% 90%)",
259
+ primaryForeground: "hsl(0 0% 0%)",
260
+ secondary: "hsl(28 100% 8%)",
261
+ secondaryForeground: "hsl(0 0% 100%)",
262
+ tertiary: "hsl(28 100% 29%)",
263
+ tertiaryForeground: "hsl(0 0% 100%)",
264
+ muted: "hsl(0 0% 100%)",
265
+ mutedForeground: "hsl(0 0% 0%)",
266
+ error: "hsl(0 100% 50%)",
267
+ errorForeground: "hsl(0 0% 100%)",
268
+ // Surface colors
269
+ surface: "hsl(0 0% 88%)", // gray-200
270
+ surfaceHover: "hsl(0 0% 82%)", // gray-300
271
+ surfaceActive: "hsl(0 0% 64%)", // gray-400
272
+ // Text colors
273
+ textMuted: "hsl(0 0% 45%)", // gray-600
274
+ textSecondary: "hsl(0 0% 55%)", // gray-500
275
+ textPlaceholder: "hsl(0 0% 73%)", // gray-400
276
+ // Border colors
277
+ border: "hsl(0 0% 82%)", // gray-300
278
+ borderLight: "hsl(0 0% 93%)", // gray-200
279
+ // Status colors
280
+ success: "hsl(142 76% 36%)", // green-600
281
+ info: "hsl(221 83% 53%)", // blue-500
282
+ // Interactive colors
283
+ hover: "hsl(0 0% 88%)", // gray-200
284
+ hoverDark: "hsl(28 100% 8%)", // darker secondary for hover
285
+ overlay: "rgba(0, 0, 0, 0.24)", // #0000003c
286
+ tooltip: "hsl(0 0% 13%)", // gray-800
287
+ };
288
+
289
+ const BORDER_INSET = 0;
290
+ const HEAT_PUMP_CONSUMPTION = 46; // kWh per m² per year
291
+
292
+ async function sendLeadToNexvoro(leadData) {
293
+ try {
294
+ const extradata = {
295
+ leadtype: "A-lead",
296
+ phase: "10 Anbahnung",
297
+ title: `${leadData.client.name}/solarExpert`,
298
+ extradata: leadData,
299
+ };
300
+ const formData = new FormData();
301
+ formData.append("md", "81.87.84.81.84.");
302
+ formData.append("token", "estwtayazyrwtddwsstqatw");
303
+ formData.append("NewsletterID", "20404");
304
+ formData.append("type", "new");
305
+ formData.append("data", "lead");
306
+ formData.append("values", JSON.stringify(extradata));
307
+ // Build the URL
308
+ const baseUrl = "https://workspace.nexvoro.cloud/exchange/extevent";
309
+ const url = baseUrl;
310
+ // Send the request with FormData to avoid CORS preflight
311
+ const response = await fetch(url, {
312
+ method: "POST",
313
+ body: formData,
314
+ // No custom headers to avoid preflight request
315
+ });
316
+ if (!response.ok) {
317
+ const errorText = await response.text();
318
+ console.error("Error sending lead to Nexvoro:", response.status, errorText);
319
+ throw new Error(`HTTP error! status: ${response.status}, body: ${errorText}`);
320
+ }
321
+ const result = await response.text();
322
+ console.log("result", result);
323
+ // Check if the response contains a lead ID (successful creation)
324
+ if (result.includes("ERROR")) {
325
+ return {
326
+ success: false,
327
+ message: "Lead not created",
328
+ leadId: result,
329
+ };
330
+ }
331
+ else {
332
+ return {
333
+ success: true,
334
+ message: "Lead submitted successfully",
335
+ leadId: undefined,
336
+ };
337
+ }
338
+ }
339
+ catch (error) {
340
+ console.error("Error sending lead to Nexvoro:", error);
341
+ return {
342
+ success: false,
343
+ message: error instanceof Error
344
+ ? error.message
345
+ : "Unknown error occurred",
346
+ };
347
+ }
348
+ }
349
+
350
+ const outputCss = "/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-md: 28rem;\n --container-2xl: 42rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --radius-lg: 0.5rem;\n --radius-4xl: 2rem;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n --color-primary: hsl(41 51% 90%);\n --color-primary-foreground: hsl(0 0% 0%);\n --color-secondary: hsl(28 100% 8%);\n --color-secondary-foreground: hsl(0 0% 100%);\n --color-tertiary: hsl(28 100% 29%);\n --color-tertiary-foreground: hsl(0 0% 100%);\n --color-muted: hsl(0 0% 100%);\n --color-muted-foreground: hsl(0 0% 0%);\n --color-error: hsl(0 100% 50%);\n --color-error-foreground: hsl(0 0% 100%);\n --color-surface: hsl(0 0% 88%);\n --color-surface-hover: hsl(0 0% 82%);\n --color-surface-active: hsl(0 0% 64%);\n --color-text-muted: hsl(0 0% 45%);\n --color-text-secondary: hsl(0 0% 55%);\n --color-text-placeholder: hsl(0 0% 73%);\n --color-border: hsl(0 0% 82%);\n --color-border-light: hsl(0 0% 93%);\n --color-success: hsl(142 76% 36%);\n --color-info: hsl(221 83% 53%);\n --color-hover: hsl(0 0% 88%);\n --color-hover-dark: hsl(28 100% 8%);\n --color-overlay: rgba(0, 0, 0, 0.24);\n --color-tooltip: hsl(0 0% 13%);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .bottom-4 {\n bottom: calc(var(--spacing) * 4);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-50 {\n z-index: 50;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .m-auto {\n margin: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-6 {\n margin-top: calc(var(--spacing) * 6);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .inline {\n display: inline;\n }\n .inline-block {\n display: inline-block;\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-48 {\n height: calc(var(--spacing) * 48);\n }\n .h-64 {\n height: calc(var(--spacing) * 64);\n }\n .h-\\[400px\\] {\n height: 400px;\n }\n .h-full {\n height: 100%;\n }\n .max-h-full {\n max-height: 100%;\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-full {\n width: 100%;\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .flex-1 {\n flex: 1;\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0 {\n --tw-translate-y: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-2 {\n --tw-translate-y: calc(var(--spacing) * 2);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .scale-95 {\n --tw-scale-x: 95%;\n --tw-scale-y: 95%;\n --tw-scale-z: 95%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-100 {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-not-allowed {\n cursor: not-allowed;\n }\n .resize {\n resize: both;\n }\n .appearance-none {\n appearance: none;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .grid-rows-2 {\n grid-template-rows: repeat(2, minmax(0, 1fr));\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-0 {\n gap: calc(var(--spacing) * 0);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-4xl {\n border-radius: var(--radius-4xl);\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius-lg);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-t-2 {\n border-top-style: var(--tw-border-style);\n border-top-width: 2px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-border {\n border-color: var(--color-border);\n }\n .border-current {\n border-color: currentcolor;\n }\n .border-error\\/20 {\n border-color: color-mix(in srgb, hsl(0 100% 50%) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-error) 20%, transparent);\n }\n }\n .border-info\\/20 {\n border-color: color-mix(in srgb, hsl(221 83% 53%) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-info) 20%, transparent);\n }\n }\n .border-red-300 {\n border-color: var(--color-red-300);\n }\n .border-secondary {\n border-color: var(--color-secondary);\n }\n .border-success\\/20 {\n border-color: color-mix(in srgb, hsl(142 76% 36%) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-success) 20%, transparent);\n }\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .bg-black {\n background-color: var(--color-black);\n }\n .bg-error\\/10 {\n background-color: color-mix(in srgb, hsl(0 100% 50%) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-error) 10%, transparent);\n }\n }\n .bg-error\\/90 {\n background-color: color-mix(in srgb, hsl(0 100% 50%) 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-error) 90%, transparent);\n }\n }\n .bg-info\\/90 {\n background-color: color-mix(in srgb, hsl(221 83% 53%) 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-info) 90%, transparent);\n }\n }\n .bg-muted {\n background-color: var(--color-muted);\n }\n .bg-overlay {\n background-color: var(--color-overlay);\n }\n .bg-primary {\n background-color: var(--color-primary);\n }\n .bg-red-100 {\n background-color: var(--color-red-100);\n }\n .bg-secondary {\n background-color: var(--color-secondary);\n }\n .bg-success\\/10 {\n background-color: color-mix(in srgb, hsl(142 76% 36%) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-success) 10%, transparent);\n }\n }\n .bg-success\\/90 {\n background-color: color-mix(in srgb, hsl(142 76% 36%) 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-success) 90%, transparent);\n }\n }\n .bg-surface {\n background-color: var(--color-surface);\n }\n .bg-tertiary {\n background-color: var(--color-tertiary);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .object-contain {\n object-fit: contain;\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .pt-3 {\n padding-top: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-7 {\n padding-top: calc(var(--spacing) * 7);\n }\n .pr-3 {\n padding-right: calc(var(--spacing) * 3);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .pl-4 {\n padding-left: calc(var(--spacing) * 4);\n }\n .pl-10 {\n padding-left: calc(var(--spacing) * 10);\n }\n .text-center {\n text-align: center;\n }\n .text-right {\n text-align: right;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .text-error {\n color: var(--color-error);\n }\n .text-error-foreground {\n color: var(--color-error-foreground);\n }\n .text-muted {\n color: var(--color-muted);\n }\n .text-muted-foreground {\n color: var(--color-muted-foreground);\n }\n .text-primary-foreground {\n color: var(--color-primary-foreground);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-red-700 {\n color: var(--color-red-700);\n }\n .text-secondary {\n color: var(--color-secondary);\n }\n .text-success {\n color: var(--color-success);\n }\n .text-text-muted {\n color: var(--color-text-muted);\n }\n .text-text-secondary {\n color: var(--color-text-secondary);\n }\n .text-white {\n color: var(--color-white);\n }\n .accent-tertiary {\n accent-color: var(--color-tertiary);\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .hover\\:bg-hover {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-hover);\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-muted);\n }\n }\n }\n .hover\\:bg-overlay {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-overlay);\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, hsl(28 100% 8%) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-surface-hover {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-surface-hover);\n }\n }\n }\n .hover\\:bg-tertiary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-tertiary);\n }\n }\n }\n .hover\\:bg-tertiary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, hsl(28 100% 29%) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-tertiary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-text-secondary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-text-secondary);\n }\n }\n }\n .focus\\:border-2 {\n &:focus {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n }\n .focus\\:border-secondary {\n &:focus {\n border-color: var(--color-secondary);\n }\n }\n .focus\\:border-transparent {\n &:focus {\n border-color: transparent;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-secondary {\n &:focus {\n --tw-ring-color: var(--color-secondary);\n }\n }\n .focus\\:ring-tertiary {\n &:focus {\n --tw-ring-color: var(--color-tertiary);\n }\n }\n .focus\\:ring-offset-0 {\n &:focus {\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .sm\\:mt-0 {\n @media (width >= 40rem) {\n margin-top: calc(var(--spacing) * 0);\n }\n }\n .sm\\:flex-3 {\n @media (width >= 40rem) {\n flex: 3;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row;\n }\n }\n .sm\\:items-center {\n @media (width >= 40rem) {\n align-items: center;\n }\n }\n .sm\\:gap-4 {\n @media (width >= 40rem) {\n gap: calc(var(--spacing) * 4);\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .md\\:pl-2 {\n @media (width >= 48rem) {\n padding-left: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-runnable-track\\]\\:rounded-full {\n &::-webkit-slider-runnable-track {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-runnable-track\\]\\:bg-black\\/25 {\n &::-webkit-slider-runnable-track {\n background-color: color-mix(in srgb, #000 25%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 25%, transparent);\n }\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:h-\\[10px\\] {\n &::-webkit-slider-thumb {\n height: 10px;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:w-\\[10px\\] {\n &::-webkit-slider-thumb {\n width: 10px;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:appearance-none {\n &::-webkit-slider-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:rounded-full {\n &::-webkit-slider-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:bg-muted {\n &::-webkit-slider-thumb {\n background-color: var(--color-muted);\n }\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-border-style: solid;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-duration: initial;\n --tw-ease: initial;\n }\n }\n}\n";
351
+
352
+ const SolarSystemForm = /*@__PURE__*/ proxyCustomElement(class SolarSystemForm extends H {
353
+ constructor() {
354
+ super();
355
+ this.__registerHost();
356
+ }
357
+ systemConfigs = {};
358
+ polygons = [];
359
+ roofCanvas;
360
+ polygonCanvas;
361
+ pixelInMeters;
362
+ householdConsumption = 4500;
363
+ consumptionProfile = "mostly_at_home";
364
+ electricityPrice = 0.3;
365
+ compensationRate = 0.07;
366
+ annualPriceIncrease = 2;
367
+ autonomy = 0;
368
+ costSavings = 0;
369
+ numberOfPanels = 5;
370
+ panelPeakPower = 0.4; // kW per panel
371
+ name = "";
372
+ email = "";
373
+ phone = "";
374
+ nameError = "";
375
+ emailError = "";
376
+ phoneError = "";
377
+ electricCar = false;
378
+ electricCarChargingTime = "day";
379
+ heatPump = 0;
380
+ battery = 0;
381
+ batteryEnabled = false;
382
+ compensation20Years = 0;
383
+ savedCosts20Years = 0;
384
+ maxPanels = 5;
385
+ kmDrivenPerYear = 10000;
386
+ totalEnergyConsumption = 4500;
387
+ totalEnergyProduction = 0;
388
+ isSubmitting = false;
389
+ submitMessage = "";
390
+ submitSuccess = false;
391
+ updateSystemConfigs() {
392
+ if (Object.keys(this.systemConfigs).length === 0) {
393
+ this.numberOfPanels = 0;
394
+ this.maxPanels = 0;
395
+ return;
396
+ }
397
+ this.numberOfPanels = Object.keys(this.systemConfigs).reduce((acc, curr) => acc + this.systemConfigs[curr].numberOfPanels, 0);
398
+ this.maxPanels = Object.keys(this.systemConfigs).reduce((acc, curr) => acc + this.systemConfigs[curr].numberOfPanels, 0);
399
+ this.panelPeakPower = Object.entries(this.systemConfigs)[0][1][0]
400
+ ?.panel.kWattPeak ?? 0.44;
401
+ this.recalculate();
402
+ }
403
+ formatEuropeanNumber(num, decimals = 2) {
404
+ const fixed = num.toFixed(decimals);
405
+ const [integerPart, decimalPart] = fixed.split(".");
406
+ // Add dots as thousands separators
407
+ const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
408
+ // Join with comma as decimal separator
409
+ return decimalPart
410
+ ? `${formattedInteger},${decimalPart}`
411
+ : formattedInteger;
412
+ }
413
+ recalculate() {
414
+ const currentSystemConfigs = {};
415
+ let totalNumberOfPanels = 0;
416
+ for (const [key, value] of Object.entries(this.systemConfigs)) {
417
+ if (totalNumberOfPanels >= this.numberOfPanels) {
418
+ break;
419
+ }
420
+ if (value.numberOfPanels + totalNumberOfPanels > this.numberOfPanels) {
421
+ currentSystemConfigs[key] = {
422
+ ...value,
423
+ numberOfPanels: this.numberOfPanels - totalNumberOfPanels,
424
+ };
425
+ totalNumberOfPanels = this.numberOfPanels;
426
+ }
427
+ else {
428
+ currentSystemConfigs[key] = value;
429
+ totalNumberOfPanels += value.numberOfPanels;
430
+ }
431
+ }
432
+ const simulationConfig = {
433
+ general: {
434
+ simulationYears: 20,
435
+ },
436
+ householdConsumption: {
437
+ consumptionProfile: this.consumptionProfile,
438
+ winterConsumptionFactor: 1.4,
439
+ summerConsumptionFactor: 0.6,
440
+ averageConsumption: this.householdConsumption / 365,
441
+ },
442
+ electricityPrice: {
443
+ purchase: this.electricityPrice,
444
+ sell: this.compensationRate,
445
+ increase: this.annualPriceIncrease / 100,
446
+ },
447
+ solarSystems: currentSystemConfigs,
448
+ batteryKWh: this.battery,
449
+ solarRadiation: {
450
+ winterFactor: 0.2,
451
+ summerFactor: 0.6,
452
+ },
453
+ heatPump: {
454
+ m2: this.heatPump,
455
+ consumptionPerM2: HEAT_PUMP_CONSUMPTION / 365,
456
+ },
457
+ electricCar: this.electricCar
458
+ ? {
459
+ averageKilometersPerDay: this.kmDrivenPerYear / 365,
460
+ consumptionkWhPer100km: 20,
461
+ batteryKWh: 80,
462
+ chargingHours: this.electricCarChargingTime === "day"
463
+ ? generateElectricCarChargingHours(6, 18)
464
+ : generateElectricCarChargingHours(18, 6),
465
+ }
466
+ : undefined,
467
+ };
468
+ const result = simulate(simulationConfig);
469
+ this.compensation20Years = result.compensationPerDay * 365 * 20;
470
+ this.savedCosts20Years = result.byYearSavedCosts.reduce((acc, curr) => acc + curr, 0) + this.compensation20Years;
471
+ this.costSavings = result.byYearSavedCosts[0];
472
+ this.autonomy = result.autonomy * 100;
473
+ this.totalEnergyConsumption = result.totalEnergyConsumptionDay * 365;
474
+ // Calculate total energy production based on compensation and rate
475
+ this.totalEnergyProduction = result.totalEnergyProduction * 365;
476
+ }
477
+ componentWillLoad() {
478
+ this.updateSystemConfigs();
479
+ }
480
+ validateForm() {
481
+ let isValid = true;
482
+ const t = getLanguageStrings(state.settings.language);
483
+ // Validate name
484
+ if (!this.name.trim()) {
485
+ this.nameError = t.solarSystemForm.nameError;
486
+ isValid = false;
487
+ }
488
+ else {
489
+ this.nameError = "";
490
+ }
491
+ // Validate email
492
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
493
+ if (!this.email.trim()) {
494
+ this.emailError = t.solarSystemForm.emailError;
495
+ isValid = false;
496
+ }
497
+ else if (!emailRegex.test(this.email)) {
498
+ this.emailError = t.solarSystemForm.validEmailError;
499
+ isValid = false;
500
+ }
501
+ else {
502
+ this.emailError = "";
503
+ }
504
+ // Validate phone (optional)
505
+ const phoneRegex = /^[\+]?[1-9][\d]{0,15}$/;
506
+ if (this.phone.trim() &&
507
+ !phoneRegex.test(this.phone.replace(/[\s\-\(\)]/g, ""))) {
508
+ this.phoneError = t.solarSystemForm.phoneError;
509
+ isValid = false;
510
+ }
511
+ else {
512
+ this.phoneError = "";
513
+ }
514
+ return isValid;
515
+ }
516
+ async handleRequestOffer() {
517
+ if (!this.validateForm()) {
518
+ return;
519
+ }
520
+ this.isSubmitting = true;
521
+ this.submitMessage = "";
522
+ this.submitSuccess = false;
523
+ const t = getLanguageStrings(state.settings.language);
524
+ try {
525
+ const leadData = {
526
+ location: {
527
+ name: state.location,
528
+ latitude: state.latitude,
529
+ longitude: state.longitude,
530
+ },
531
+ systemConfig: {
532
+ maxNumberOfPanels: this.maxPanels,
533
+ panelPeakPower: this.panelPeakPower,
534
+ polygons: this.polygons,
535
+ solarSystems: this.systemConfigs,
536
+ electricityPrice: this.electricityPrice,
537
+ compensationRate: this.compensationRate,
538
+ annualPriceIncrease: this.annualPriceIncrease,
539
+ },
540
+ client: {
541
+ name: this.name,
542
+ email: this.email,
543
+ phone: this.phone,
544
+ consumption: this.householdConsumption,
545
+ consumptionProfile: this.consumptionProfile,
546
+ hasBattery: this.batteryEnabled,
547
+ battery: this.battery,
548
+ hasHeatPump: this.heatPump > 0,
549
+ heatPumpM2: this.heatPump,
550
+ hasElectricCar: this.electricCar,
551
+ electricCarChargingTime: this.electricCarChargingTime,
552
+ electricCarKmPerYear: this.kmDrivenPerYear,
553
+ },
554
+ images: {
555
+ roof: this.roofCanvas.toDataURL(),
556
+ polygon: this.polygonCanvas.toDataURL(),
557
+ pixelInMeters: this.pixelInMeters,
558
+ },
559
+ results: {
560
+ autonomy: this.autonomy,
561
+ costSavings: this.costSavings,
562
+ compensation20Years: this.compensation20Years,
563
+ savedCosts20Years: this.savedCosts20Years,
564
+ totalEnergyConsumption: this.totalEnergyConsumption,
565
+ },
566
+ };
567
+ console.log("leadData", leadData);
568
+ const result = await sendLeadToNexvoro(leadData);
569
+ this.submitSuccess = result.success;
570
+ if (result.success) {
571
+ console.log("Lead successfully sent to Nexvoro", result);
572
+ this.submitMessage = t.solarSystemForm.leadSubmitted;
573
+ // Optionally reset form or show success message
574
+ }
575
+ else {
576
+ console.error("Failed to send lead to Nexvoro:", result.message);
577
+ this.submitMessage = t.solarSystemForm.leadError;
578
+ }
579
+ }
580
+ catch (error) {
581
+ console.error("Error in handleRequestOffer:", error);
582
+ this.submitSuccess = false;
583
+ this.submitMessage = error instanceof Error
584
+ ? error.message
585
+ : "An unexpected error occurred";
586
+ }
587
+ finally {
588
+ this.isSubmitting = false;
589
+ }
590
+ }
591
+ isIOS() {
592
+ return state.isIOS;
593
+ }
594
+ render() {
595
+ const t = getLanguageStrings(state.settings.language);
596
+ // Reusable style objects
597
+ const borderStyle = { border: "1px solid var(--color-border)" };
598
+ const errorBorderStyle = { border: "1px solid var(--color-error)" };
599
+ return (h("div", { key: '42867ab1fc1201f981ee3c96a138ff5d999740fc', class: "flex flex-col justify-center items-center w-full h-full pt-4" // style={{
600
+ ,
601
+ // display: (Object.keys(this.systemConfigs).length === 0)
602
+ // ? "none"
603
+ // : "flex",
604
+ // }}
605
+ id: "solar-system-form" }, h("h1", { key: 'ee1db435412a97d54333c36fc0c1a6fab5fe597f', class: "text-2xl font-bold text-secondary mb-4 w-full" }, t.solarSystemForm.title), h("div", { key: '27dcc67909fcbafd2093792e2ee822d233a23421', class: "w-full bg-primary rounded-4xl space-y-6" }, h("div", { key: '93ae54e79a272a01acdcfe21f1e0983811669ca6', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: '2998dbde483a512c28d6b02ace04944eda49ff7c', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.systemInformation), h("div", { key: 'a169b4bdfd3c0b6c175971cfa119c48bdde6ff9d', class: "flex flex-col sm:flex-row gap-4" }, h("div", { key: '72a5c0c40117ddee1d14808898703869e34afb23', class: "flex-1 bg-muted rounded-4xl p-4 space-y-3" }, h("div", { key: '286c9346d417f9325aeb4653a428fc527317f1f2', class: "flex items-center justify-between" }, h("label", { key: 'cd78273dbacea60dfa7d3cd52fd61709c728c179', class: "text-sm font-medium text-text-muted" }, t.solarSystemForm.numberOfPanels), !this.isIOS()
606
+ ? (h("input", { type: "number", class: "w-20 px-3 py-1 rounded-full bg-muted text-muted-foreground text-right", value: this.numberOfPanels, readOnly: true }))
607
+ : (h("input", { type: "number", min: "1", max: this.maxPanels, class: "w-20 px-3 py-1 rounded-full focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground text-center", style: borderStyle, value: this.numberOfPanels, onInput: (e) => {
608
+ const value = parseInt(e.target
609
+ .value);
610
+ if (value >= 1 &&
611
+ value <=
612
+ this.maxPanels) {
613
+ this.numberOfPanels =
614
+ value;
615
+ this.recalculate();
616
+ }
617
+ } }))), !this.isIOS() && (h("input", { key: 'db21c520b3151ab4f766bd99092a36707fad3922', type: "range", min: "1", max: this.maxPanels, step: "1", class: "input-slider w-full custom-range appearance-none rounded-full bg-transparent [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-black/25 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-muted", value: this.numberOfPanels, onInput: (e) => {
618
+ this.numberOfPanels = parseInt(e.target
619
+ .value);
620
+ if (isNaN(this.numberOfPanels)) {
621
+ this.numberOfPanels = 0;
622
+ }
623
+ this.recalculate();
624
+ } }))), h("div", { key: 'fed7b9efc92d01c73a34da7dfa3663d801f40ebb', class: "flex-1 bg-muted rounded-4xl p-4" }, h("div", { key: '97cf3fef6db644774469fbca6b7681c5865b54d2', class: "flex items-center justify-between" }, h("label", { key: '7471aeacdeddfe2951b474bb0006bc018b52528c', class: "text-sm font-medium text-text-muted" }, t.solarSystemForm.panelPeakPower), h("span", { key: 'cad4639ae980b4228723c78f0b0bbbc27d9322c0', class: "text-text-muted" }, this.panelPeakPower.toFixed(2), " kW")), h("div", { key: 'b344c0c87bbd7e016681034434a36982759f4107', class: "flex items-center justify-between mt-4" }, h("span", { key: '8619d3662fb929a2b9f185f556ded70de0210f70', class: "text-sm font-medium text-text-muted" }, t.solarSystemForm.totalSystemPeakPower), h("span", { key: '2ad8de7cb701e9410425bb762d03e03a5e9b3181', class: "font-bold text-text-muted" }, (DEFAULT_SOLAR_PANEL_TYPE.kWattPeak *
625
+ this.numberOfPanels).toFixed(1), " kWp"))))), h("div", { key: '2cacc97462ac629a060baad3975179da6ad94e53', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: 'c10ec73052c222c5b3d75f2b28ae98189cf51380', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.householdConsumptionTitle), h("div", { key: '0279cc5c0f7cf3dcfd5c59075f4136edfde0b557', class: "grid grid-rows-2 gap-0" }, h("div", { key: '9e4b72083f26c1c540f757f74297f2bf1fe0c93c', class: "grid grid-cols-2 gap-4" }, h("label", { key: '7a5e9bf3b54bbc8328755837542a3766315247ef', class: "block text-sm font-medium text-text-muted" }, t.solarSystemForm.annualConsumption), h("label", { key: '5e75002062d1e932d451f8350078afe3b34c3126', class: "block text-sm font-medium text-text-muted" }, t.solarSystemForm.consumptionProfileTitle)), h("div", { key: '28ead4dbbe0258b6134a5c0c948ae993865c7da9', class: "grid grid-cols-2 gap-4" }, h("input", { key: '3b4cebdf7e4d38b3503d49f2c3cb2291ad17c6d0', type: "number", step: "100", min: "0", class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground", style: borderStyle, value: this.householdConsumption, onInput: (e) => {
626
+ this.householdConsumption = parseInt(e.target
627
+ .value);
628
+ this.recalculate();
629
+ } }), h("select", { key: '76994946ffe5e5d53037a58ed13fe103d8af3e64', class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground", style: borderStyle, onChange: (e) => {
630
+ this.consumptionProfile =
631
+ e.target
632
+ .value;
633
+ this.recalculate();
634
+ } }, h("option", { key: 'c7d2c8ec8d92f9339e33d5532504e92e1868bd0b', value: "mostly_at_home", selected: this.consumptionProfile ===
635
+ "mostly_at_home" }, t.solarSystemForm.consumptionProfiles
636
+ .mostlyAtHome), h("option", { key: '668d7edd27b5c923c944ab442b960ae94c12af00', value: "mostly_away", selected: this.consumptionProfile ===
637
+ "mostly_away" }, t.solarSystemForm.consumptionProfiles
638
+ .mostlyAway))))), h("div", { key: 'e2e2e002761485d99790c4727bd46ed1ed190123', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: '46f8a7b7fc363d6eca28fbe5701d04c7d95e54e5', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.additionalComponents.title), h("div", { key: '08eaa438ae318304b5f2c3de023823b21f19eb75', class: "flex flex-col gap-4" }, h("div", { key: '4d56b31df0ca2935710fcd8d1733ba5f5ef07d92', class: "flex flex-col bg-muted rounded-4xl p-4 gap-4" }, h("div", { key: '0f399db912c4851d1d22d430c479f35a684e8405', class: "flex items-center justify-between" }, h("div", { key: 'af002c41ce930b0c1cb7bd9f9e58890064fc3fe8', class: "flex items-center gap-2" }, h("input", { key: '781624b2b616de5b5d9ade954911950c77224d55', type: "checkbox", id: "heatPump", class: "w-4 h-4 accent-tertiary border-border rounded-full focus:ring-tertiary focus:ring-offset-0 focus:ring-2", checked: this.heatPump > 0, onChange: (e) => {
639
+ this.heatPump =
640
+ e.target
641
+ .checked
642
+ ? 100
643
+ : 0;
644
+ this.recalculate();
645
+ } }), h("label", { key: '94e129a09f3af63d049c3b58bb6d3bb1b788739c', htmlFor: "heatPump", class: "text-text-muted" }, t.solarSystemForm
646
+ .additionalComponents
647
+ .heatPump)), (this.heatPump > 0 && !this.isIOS()) && (h("span", { key: '9a9c4208690edaa0809435a9bfb219d65ac825a1', class: "text-text-muted" }, this.heatPump, " m\u00B2"))), this.heatPump > 0 && (h("div", { key: 'b71000e853b6f5317f5b5190fdfe57582217dbbe', class: "flex flex-col gap-2" }, this.isIOS()
648
+ ? (h("div", { class: "flex items-center gap-2" }, h("input", { type: "number", min: "10", max: "300", step: "10", class: "flex-1 px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", style: borderStyle, value: this.heatPump, onInput: (e) => {
649
+ let value = parseInt(e.target
650
+ .value);
651
+ if (isNaN(value)) {
652
+ value = 0;
653
+ }
654
+ if (value >= 0 &&
655
+ value <= 300) {
656
+ this.heatPump =
657
+ value;
658
+ this.recalculate();
659
+ }
660
+ } }), h("span", { class: "text-sm text-text-muted" }, "m\u00B2")))
661
+ : (h("input", { type: "range", min: "10", max: "300", step: "10", class: "input-slider custom-range appearance-none rounded-full bg-transparent [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-black/25 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-muted", value: this.heatPump, onInput: (e) => {
662
+ this.heatPump =
663
+ parseInt(e.target
664
+ .value);
665
+ this.recalculate();
666
+ } }))))), h("div", { key: 'a3ffb277ff4f4c5539c8484c1e2b9e9c5dbff64f', class: "flex flex-col bg-muted rounded-4xl p-4 gap-4" }, h("div", { key: '520a1c1f3aff8482bab8206e72fd0f8480192e31', class: "flex items-center justify-between" }, h("div", { key: 'c5dee085ffcc1b93acacf451ce7044c1dbbbd5ae', class: "flex items-center gap-2" }, h("input", { key: '835135fc8cd50873fdc2611526735b2a8b8d238c', type: "checkbox", id: "electricCar", class: "w-4 h-4 accent-tertiary border-border rounded focus:ring-tertiary focus:ring-offset-0 focus:ring-2", checked: this.electricCar, onChange: (e) => {
667
+ this.electricCar =
668
+ e.target
669
+ .checked;
670
+ this.recalculate();
671
+ } }), h("label", { key: 'f401eb62de0b05c0e65c89294d65e78925f19749', htmlFor: "electricCar", class: "text-text-muted" }, t.solarSystemForm
672
+ .additionalComponents
673
+ .electricCar))), this.electricCar && (h("div", { key: 'a53474411832751c7a30aeb5ea02db0f9f512963', class: "flex flex-col gap-2" }, h("div", { key: '19f2e4448eaaa94fba0b6d922ecb18ff28d052bc', class: "grid grid-cols-2 gap-4" }, h("label", { key: 'bd92f4dd142ef6a732c85d9b71bc9eb3c6b60fa6', class: "text-sm text-text-muted" }, t.solarSystemForm
674
+ .additionalComponents
675
+ .chargingTime), h("label", { key: 'bb0552899cf2642b866213d91d5d90d2d8a1424e', class: "text-sm text-text-muted" }, t.solarSystemForm
676
+ .additionalComponents
677
+ .kilometersPerYear)), h("div", { key: '35ef876cab7b2d4fe0fea2eb2b821b5c59cdbd34', class: "grid grid-cols-2 gap-4" }, h("select", { key: '9b6961f77e163568d4c09b207cec5958c2a5302b', class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", onChange: (e) => {
678
+ this.electricCarChargingTime =
679
+ e.target
680
+ .value;
681
+ this.recalculate();
682
+ }, style: borderStyle }, h("option", { key: '5e67bdee8a891ace0299fbc3f2faaa82ceab9963', value: "day", selected: this
683
+ .electricCarChargingTime ===
684
+ "day" }, t.solarSystemForm
685
+ .additionalComponents
686
+ .chargingTimeDay), h("option", { key: '00649f89de616ada4292ff71eb15524a5b946059', value: "night", selected: this
687
+ .electricCarChargingTime ===
688
+ "night" }, t.solarSystemForm
689
+ .additionalComponents
690
+ .chargingTimeNight)), h("input", { key: '3234b8ac6c559b57b8d24bacb1794fd2860aab24', type: "number", min: "1000", max: "100000", step: "1000", class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", value: this.kmDrivenPerYear, onInput: (e) => {
691
+ this.kmDrivenPerYear =
692
+ parseInt(e.target
693
+ .value);
694
+ if (isNaN(this.kmDrivenPerYear)) {
695
+ this.kmDrivenPerYear =
696
+ 0;
697
+ }
698
+ this.recalculate();
699
+ }, style: borderStyle }))))), h("div", { key: '8d5eec07f8446d8984d3f6b767b404e5840dc67f', class: "flex flex-col bg-muted rounded-4xl p-4 gap-4" }, h("div", { key: '2321a2419b1f6ab4ab591ac09a44bc9168b591c2', class: "flex items-center justify-between" }, h("div", { key: '33cbfd3dbfac3a3077e73ad3d5a61bd845cfe1c8', class: "flex items-center gap-2" }, h("input", { key: 'd3d6b513e7eb73cc96f4ed1b5b70f4d46eebb8b1', type: "checkbox", id: "battery", class: "w-4 h-4 accent-tertiary border-border rounded-full focus:ring-tertiary focus:ring-offset-0 focus:ring-2", checked: this.batteryEnabled, onChange: (e) => {
700
+ this.batteryEnabled =
701
+ e.target
702
+ .checked;
703
+ this.battery =
704
+ this.batteryEnabled
705
+ ? 5
706
+ : 0;
707
+ this.recalculate();
708
+ } }), h("label", { key: 'd73591c77f3b04c2b78c33a6d71808cdddd782e7', htmlFor: "battery", class: "text-text-muted" }, t.solarSystemForm
709
+ .additionalComponents
710
+ .battery)), (this.batteryEnabled && !this.isIOS()) && (h("span", { key: 'dffc91a5159c4e2b8889175751c432e318f47dae', class: "text-text-muted" }, this.battery, " kWh"))), this.batteryEnabled && (h("div", { key: 'ead4529d83f84e9f8e762e7ccc6203c886fea2cf', class: "flex flex-col gap-2" }, this.isIOS()
711
+ ? (h("div", { class: "flex items-center gap-2" }, h("input", { type: "number", min: "0", max: "20", step: "1", class: "flex-1 px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", value: this.battery, onInput: (e) => {
712
+ let value = parseInt(e.target
713
+ .value);
714
+ if (isNaN(value)) {
715
+ value = 0;
716
+ }
717
+ if (value >= 0 &&
718
+ value <= 20) {
719
+ this.battery =
720
+ value;
721
+ }
722
+ else {
723
+ this.battery =
724
+ 20;
725
+ }
726
+ this.recalculate();
727
+ }, style: borderStyle }), h("span", { class: "text-sm text-text-muted" }, "kWh")))
728
+ : (h("input", { type: "range", min: "1", max: "20", step: "1", class: "input-slider w-full custom-range appearance-none rounded-full bg-transparent [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-black/25 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-muted", value: this.battery, onInput: (e) => {
729
+ const value = parseInt(e.target
730
+ .value);
731
+ this.battery = value;
732
+ this.batteryEnabled =
733
+ value > 0;
734
+ this.recalculate();
735
+ } }))))))), h("div", { key: 'cc21f52e0e1ea5d1f731951325053a4615641288', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: '413db6f645abd608dc74c0fe9dd2b8538e439ff3', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.electricityCostsTitle), h("div", { key: '36a7f1d8ca5b115cf86c136ab8b2834c621cbff4', style: {
736
+ display: "grid",
737
+ gridTemplateColumns: "repeat(auto-fit, minmax(100px, 1fr))",
738
+ gap: "1rem",
739
+ } }, h("div", { key: '393a18f5a6d81a557d85a77ec83a764ee22043cb' }, h("label", { key: '23c407eba1f39251193d83320f79feb88a709ce9', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.electricityPrice), h("input", { key: '6e9a5ed3a36231ffccc9dcaa00ac6919668078c7', type: "number", step: "0.01", class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", style: borderStyle, value: this.electricityPrice.toFixed(2), onInput: (e) => {
740
+ this.electricityPrice = parseFloat(e.target
741
+ .value);
742
+ this.recalculate();
743
+ } })), h("div", { key: '3942694c95b0b451bca63341cdfb92b5f5829593' }, h("label", { key: 'bdb87c826d37b147c031a2ca53411a7432c845fd', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.compensationRate), h("input", { key: 'b91214ef6aebe7c342ec4bb604f6e3a37b189488', type: "number", step: "0.01", class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", style: borderStyle, value: this.compensationRate.toFixed(2), onInput: (e) => {
744
+ this.compensationRate = parseFloat(e.target
745
+ .value);
746
+ this.recalculate();
747
+ } })), h("div", { key: '56684c4d9d65272834bd4cebe8c4c167bb16a958' }, h("label", { key: 'af7337ddaa1529dbc6b07704a2c313a591b6e3bd', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.annualPriceIncrease), h("input", { key: '90bef6067bf8fae6b598a551ab2ddbb4f0725b29', type: "number", step: "0.1", class: "w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", style: borderStyle, value: this.annualPriceIncrease.toFixed(1), onInput: (e) => {
748
+ this.annualPriceIncrease = parseFloat(e.target
749
+ .value);
750
+ this.recalculate();
751
+ } })))), h("div", { key: '266bd42a4b60349bbb098f8a56a1af6444b85fad', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: 'c24a5e56041eeaf26a5648af092a942ccd41e739', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.resultsTitle), h("div", { key: '3fd59700c6cdb99662f8a7232141d1f7efb2109f', class: "bg-muted rounded-4xl p-4" }, h("div", { key: '25708d8c8cdd04b21e66ac05776cef76ce53725a', class: "flex flex-col sm:flex-row sm:items-center justify-between" }, h("span", { key: '0b45f781be44dd70a66d68446319f17800357984', class: "text-text-muted" }, t.solarSystemForm.autonomy), h("span", { key: 'a56d5b093834c6a42f74619ab569a983057e91a0', class: "text-xl font-bold text-secondary mt-1 sm:mt-0" }, this.autonomy > 100
752
+ ? "100"
753
+ : this.formatEuropeanNumber(this.autonomy, 1), "%")), h("div", { key: 'feea3eca497e8f14eb619c4f2ece03c39394ca74', class: "flex flex-col sm:flex-row sm:items-center justify-between mt-4" }, h("span", { key: '3b5ae4b3be1368da0a8c6eb0c9e1c07c6ef6e2d7', class: "text-text-muted" }, t.solarSystemForm.totalEnergyConsumption), h("span", { key: '04d21a3ce938bd47aee28598467984d467c19fba', class: "text-xl font-bold text-secondary mt-1 sm:mt-0" }, this.formatEuropeanNumber(this.totalEnergyConsumption, 0), " kWh/", t.solarSystemForm.year)), h("div", { key: '6812053410e4372e791cf1fc7f74b411549fc8d9', class: "flex flex-col sm:flex-row sm:items-center justify-between mt-4" }, h("span", { key: '2451f60fe0ec7edb6312bc7b8a50b63c4e4af182', class: "text-text-muted" }, t.solarSystemForm.totalEnergyProduction), h("span", { key: '8695bcaee81b83829460639976872d141734bf16', class: "text-xl font-bold text-secondary mt-1 sm:mt-0" }, this.formatEuropeanNumber(this.totalEnergyProduction, 0), " kWh/", t.solarSystemForm.year)), h("div", { key: 'c7bc91f11c89d492cdd4545a96af349e2a643fc9', class: "flex flex-col sm:flex-row sm:items-center justify-between mt-4" }, h("div", { key: 'b28127d6c7cb295a61cd5a5e0a21dbba9acbbdba', class: "flex items-center gap-2" }, h("span", { key: 'f0a7b0e4359155d99e0859da98eb9cbedcd53a00', class: "text-text-muted" }, t.solarSystemForm.costSavings)), h("span", { key: 'ec566bd9d9fb4f2757c8467525bef7a4e584642a', class: "text-xl font-bold text-success mt-1 sm:mt-0" }, this.formatEuropeanNumber(this.costSavings), " \u20AC/", t
754
+ .solarSystemForm.year)), h("div", { key: 'f68554341ba8b734ea64507f705a0d1318317598', class: "flex flex-col sm:flex-row sm:items-center justify-between mt-4" }, h("div", { key: '95ea75c1ada49b28ccbba230fb696660e5892538', class: "flex items-center gap-2" }, h("span", { key: '169dd5d92dad7d8fb54a24eee3f736b30f635600', class: "text-text-muted" }, t.solarSystemForm.compensation20Years)), h("span", { key: 'c1445a608709f8202bf9e9cdc06cce961e1b949f', class: "text-xl font-bold text-success mt-1 sm:mt-0" }, this.formatEuropeanNumber(this.compensation20Years), " \u20AC")), h("div", { key: '9a45d97faab0feefdbbef029c664579347f48aaf', class: "flex flex-col sm:flex-row sm:items-center justify-between mt-4" }, h("div", { key: 'dce377238f8650fb00f90eb31e533e2282e8c02b', class: "flex items-center gap-2" }, h("span", { key: 'd0c04b9c4aca6c4605f04f68eb86d21f994ea7a9', class: "text-text-muted" }, t.solarSystemForm
755
+ .monetaryBenefit20Years)), h("span", { key: 'f56d1995af5bda25c068ee58c36edf4cd6a61d9f', class: "text-xl font-bold text-success mt-1 sm:mt-0" }, this.formatEuropeanNumber(this.savedCosts20Years), " \u20AC")))), h("div", { key: '6b8acc3f0c13fa2b70854214d5882f8024dbcc8c', class: "space-y-4 p-4 rounded-4xl", style: borderStyle }, h("h2", { key: '216a6809e770f9e67d9731e104ed50ec68a3d187', class: "text-lg font-semibold text-secondary" }, t.solarSystemForm.requestOffer), h("div", { key: '7ed284d01cc4f3375e20f8b85d2c0d1af287227e', style: {
756
+ display: "grid",
757
+ gridTemplateColumns: "repeat(auto-fit, minmax(1 00px, 1fr))",
758
+ gap: "1rem",
759
+ } }, h("div", { key: 'e0f7dc87d379fdccbe3c28fbae46b3104235b68d' }, h("label", { key: '6f3b10b41a081224855dd6aa68df0ede72e0a6c7', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.name), h("input", { key: '1e8f43f9818f896e53fa0fcb859b7865e64a2a64', type: "text", class: `w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground`, style: this.nameError
760
+ ? errorBorderStyle
761
+ : borderStyle, value: this.name, onInput: (e) => {
762
+ this.name =
763
+ e.target
764
+ .value;
765
+ this.validateForm();
766
+ }, placeholder: "Your name" }), this.nameError && (h("p", { key: '2057d743304e3e4fbb1367971ac7ff5a008b8ae7', class: "text-error text-sm mt-1" }, this.nameError))), h("div", { key: '4884e8d194a8be9c17ca8f38fc4349e5e79396bb' }, h("label", { key: '329f5d0502c8e685a4abc2f49e153f6c3e69f13f', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.email), h("input", { key: '847cff5833cc8d1872fc8a620344085a74d885ca', type: "email", class: `w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground`, style: this.emailError
767
+ ? errorBorderStyle
768
+ : borderStyle, value: this.email, onInput: (e) => {
769
+ this.email =
770
+ e.target
771
+ .value;
772
+ this.validateForm();
773
+ }, placeholder: "your.email@example.com" }), this.emailError && (h("p", { key: '956e51452f32f6c92d70de7ca28beab4922850f9', class: "text-error text-sm mt-1" }, this.emailError))), h("div", { key: '48e2718dd33ab7efa45e0992c8f281083e77b2de' }, h("label", { key: '545eca60f2f30861cbb49f12391098fcd437d51b', class: "block text-sm font-medium text-text-muted mb-1" }, t.solarSystemForm.phone), h("input", { key: '9baca33fb75c16ca3500b8980c6b55ffe35bedfc', type: "tel", class: `w-full px-4 py-2 rounded-4xl focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted text-muted-foreground`, style: this.phoneError
774
+ ? errorBorderStyle
775
+ : borderStyle, value: this.phone, onInput: (e) => {
776
+ this.phone =
777
+ e.target
778
+ .value;
779
+ this.validateForm();
780
+ }, placeholder: "+34 123 456 789" }), this.phoneError && (h("p", { key: '23c1d5ee25d9b01295627db3feea507e2e0804a4', class: "text-error text-sm mt-1" }, this.phoneError)))), h("div", { key: '155f8a5dcecdb0c330b6ce3f3455f39c1d7689b5', class: "flex flex-col items-center gap-4" }, h("button", { key: 'fabacedfac41216d9b48beed1fce03ccd39dd5cd', onClick: () => this.handleRequestOffer(), disabled: !this.name.trim() ||
781
+ !this.email.trim() || !!this.nameError ||
782
+ !!this.emailError || !!this.phoneError ||
783
+ this.isSubmitting, class: `px-6 py-3 rounded-4xl transition-colors duration-200 flex items-center gap-2 ${this.isSubmitting
784
+ ? "bg-muted text-text-muted cursor-not-allowed"
785
+ : "bg-secondary hover:bg-tertiary"}`, style: {
786
+ color: this.isSubmitting
787
+ ? "var(--color-text-muted)"
788
+ : "#ffffff",
789
+ } }, this.isSubmitting && (h("div", { key: '51b7a0add44644aa898060aeba67ef74cdb32d5d', class: "w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin" })), this.isSubmitting
790
+ ? t.solarSystemForm.sending
791
+ : t.solarSystemForm.requestOfferButton), this.submitMessage && (h("div", { key: 'cb54060dff88997e93fc105ebb876c8e518de545', class: `text-sm px-4 py-2 rounded-4xl ${this.submitSuccess
792
+ ? "bg-success/10 text-success border border-success/20"
793
+ : "bg-error/10 text-error border border-error/20"}` }, this.submitMessage)))))));
794
+ }
795
+ static get watchers() { return {
796
+ "systemConfigs": ["updateSystemConfigs"]
797
+ }; }
798
+ static get style() { return outputCss; }
799
+ }, [0, "solar-system-form", {
800
+ "systemConfigs": [16, "system-configs"],
801
+ "polygons": [16],
802
+ "roofCanvas": [16, "roof-canvas"],
803
+ "polygonCanvas": [16, "polygon-canvas"],
804
+ "pixelInMeters": [2, "pixel-in-meters"],
805
+ "householdConsumption": [32],
806
+ "consumptionProfile": [32],
807
+ "electricityPrice": [32],
808
+ "compensationRate": [32],
809
+ "annualPriceIncrease": [32],
810
+ "autonomy": [32],
811
+ "costSavings": [32],
812
+ "numberOfPanels": [32],
813
+ "panelPeakPower": [32],
814
+ "name": [32],
815
+ "email": [32],
816
+ "phone": [32],
817
+ "nameError": [32],
818
+ "emailError": [32],
819
+ "phoneError": [32],
820
+ "electricCar": [32],
821
+ "electricCarChargingTime": [32],
822
+ "heatPump": [32],
823
+ "battery": [32],
824
+ "batteryEnabled": [32],
825
+ "compensation20Years": [32],
826
+ "savedCosts20Years": [32],
827
+ "maxPanels": [32],
828
+ "kmDrivenPerYear": [32],
829
+ "totalEnergyConsumption": [32],
830
+ "totalEnergyProduction": [32],
831
+ "isSubmitting": [32],
832
+ "submitMessage": [32],
833
+ "submitSuccess": [32]
834
+ }, undefined, {
835
+ "systemConfigs": ["updateSystemConfigs"]
836
+ }]);
837
+ function defineCustomElement() {
838
+ if (typeof customElements === "undefined") {
839
+ return;
840
+ }
841
+ const components = ["solar-system-form"];
842
+ components.forEach(tagName => { switch (tagName) {
843
+ case "solar-system-form":
844
+ if (!customElements.get(tagName)) {
845
+ customElements.define(tagName, SolarSystemForm);
846
+ }
847
+ break;
848
+ } });
849
+ }
850
+ defineCustomElement();
851
+
852
+ export { BORDER_INSET as B, DEFAULT_COLOR_SCHEME as D, SolarSystemForm as S, DEFAULT_SOLAR_EXPERT_CONFIG as a, DEFAULT_SOLAR_PANEL_TYPE as b, defineCustomElement as d };
853
+ //# sourceMappingURL=p-C3ZXE525.js.map
854
+
855
+ //# sourceMappingURL=p-C3ZXE525.js.map