blue-chestnut-solar-expert 0.0.62 → 0.0.64

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 (162) hide show
  1. package/dist/cjs/{eraser-icon_18.cjs.entry.js → eraser-icon_19.cjs.entry.js} +22 -21
  2. package/dist/cjs/eraser-icon_19.cjs.entry.js.map +1 -0
  3. package/dist/cjs/{lerc-BC1SKbTC.js → lerc-CQf05pmr.js} +9 -9
  4. package/dist/cjs/{lerc-BC1SKbTC.js.map → lerc-CQf05pmr.js.map} +1 -1
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/loading-widget.cjs.entry.js +2 -2
  7. package/dist/cjs/loading-widget.cjs.entry.js.map +1 -1
  8. package/dist/cjs/loading-widget.entry.cjs.js.map +1 -1
  9. package/dist/cjs/stencil-library.cjs.js +1 -1
  10. package/dist/collection/collection-manifest.json +2 -1
  11. package/dist/collection/components/map-draw/map-draw.js +54 -54
  12. package/dist/collection/components/map-draw/map-draw.js.map +1 -1
  13. package/dist/collection/components/map-draw/map-selector.js +3 -3
  14. package/dist/collection/components/map-draw/polygon-buttons.js +1 -1
  15. package/dist/collection/components/map-draw/polygon-information.js +18 -11
  16. package/dist/collection/components/map-draw/polygon-information.js.map +1 -1
  17. package/dist/collection/components/map-draw/tool-box.js +3 -3
  18. package/dist/collection/components/map-draw/tutorial-component.js +36 -3
  19. package/dist/collection/components/map-draw/tutorial-component.js.map +1 -1
  20. package/dist/collection/components/settings/settings.js +8 -8
  21. package/dist/collection/components/solar-expert/solar-expert.js +3 -1
  22. package/dist/collection/components/solar-expert/solar-expert.js.map +1 -1
  23. package/dist/collection/components/solar-system-form/solar-system-form.js +36 -36
  24. package/dist/collection/components/widgets/loading-widget.js +1 -1
  25. package/dist/collection/components/widgets/toast-notification.js +133 -0
  26. package/dist/collection/components/widgets/toast-notification.js.map +1 -0
  27. package/dist/collection/output.css +113 -110
  28. package/dist/collection/types/lang.js.map +1 -1
  29. package/dist/collection/utils/lang/english.js +7 -0
  30. package/dist/collection/utils/lang/english.js.map +1 -1
  31. package/dist/collection/utils/lang/german.js +7 -0
  32. package/dist/collection/utils/lang/german.js.map +1 -1
  33. package/dist/collection/utils/lang/spanish.js +7 -0
  34. package/dist/collection/utils/lang/spanish.js.map +1 -1
  35. package/dist/collection/utils/solar.js +1 -0
  36. package/dist/collection/utils/solar.js.map +1 -1
  37. package/dist/components/eraser-icon.js +1 -1
  38. package/dist/components/house-icon.js +1 -1
  39. package/dist/components/icon-selector.js +1 -1
  40. package/dist/components/loading-widget.js +2 -2
  41. package/dist/components/loading-widget.js.map +1 -1
  42. package/dist/components/map-draw.js +1 -1
  43. package/dist/components/map-selector.js +1 -1
  44. package/dist/components/marker-icon.js +1 -1
  45. package/dist/components/move-icon.js +1 -1
  46. package/dist/components/octagon-minus-icon.js +1 -1
  47. package/dist/components/p-1jcVNjsm.js +47 -0
  48. package/dist/components/p-1jcVNjsm.js.map +1 -0
  49. package/dist/components/p-4FooU4eR.js +40 -0
  50. package/dist/components/p-4FooU4eR.js.map +1 -0
  51. package/dist/components/p-6rmvkwsO.js +163 -0
  52. package/dist/components/p-6rmvkwsO.js.map +1 -0
  53. package/dist/components/p-BYULvwxQ.js +40 -0
  54. package/dist/components/p-BYULvwxQ.js.map +1 -0
  55. package/dist/components/{p-CRQ8cKpY.js → p-B_6Ue-UQ.js} +23 -2
  56. package/dist/components/p-B_6Ue-UQ.js.map +1 -0
  57. package/dist/components/p-BcBvva_X.js +40 -0
  58. package/dist/components/p-BcBvva_X.js.map +1 -0
  59. package/dist/components/p-But3uNm3.js +76 -0
  60. package/dist/components/p-But3uNm3.js.map +1 -0
  61. package/dist/components/p-COCnOrkb.js +121 -0
  62. package/dist/components/p-COCnOrkb.js.map +1 -0
  63. package/dist/components/p-COL7rExT.js +86 -0
  64. package/dist/components/p-COL7rExT.js.map +1 -0
  65. package/dist/components/p-CpGXfh7Q.js +114 -0
  66. package/dist/components/p-CpGXfh7Q.js.map +1 -0
  67. package/dist/components/p-Cu7ckMQp.js +40 -0
  68. package/dist/components/p-Cu7ckMQp.js.map +1 -0
  69. package/dist/components/p-CxwiRuTf.js +623 -0
  70. package/dist/components/p-CxwiRuTf.js.map +1 -0
  71. package/dist/components/p-DCMO4ssM.js +40 -0
  72. package/dist/components/p-DCMO4ssM.js.map +1 -0
  73. package/dist/components/p-DWrXodHT.js +40 -0
  74. package/dist/components/p-DWrXodHT.js.map +1 -0
  75. package/dist/components/{p-N0461-xw.js → p-De6Uhz0b.js} +93 -86
  76. package/dist/components/p-De6Uhz0b.js.map +1 -0
  77. package/dist/components/{p-CH_OwRlu.js → p-DoOT28vq.js} +3 -3
  78. package/dist/components/{p-CH_OwRlu.js.map → p-DoOT28vq.js.map} +1 -1
  79. package/dist/components/{p-DJcc5dax.js → p-IzVa21Wl.js} +40 -40
  80. package/dist/components/{p-DJcc5dax.js.map → p-IzVa21Wl.js.map} +1 -1
  81. package/dist/components/p-JzJ_ZuEh.js +89 -0
  82. package/dist/components/p-JzJ_ZuEh.js.map +1 -0
  83. package/dist/components/p-kB7DMoo7.js +40 -0
  84. package/dist/components/p-kB7DMoo7.js.map +1 -0
  85. package/dist/components/p-rW0sFWOp.js +40 -0
  86. package/dist/components/p-rW0sFWOp.js.map +1 -0
  87. package/dist/components/polygon-buttons.js +1 -1
  88. package/dist/components/polygon-information.js +1 -1
  89. package/dist/components/search-icon.js +1 -1
  90. package/dist/components/settings-icon.js +1 -1
  91. package/dist/components/settings-modal.js +1 -1
  92. package/dist/components/solar-expert.js +42 -34
  93. package/dist/components/solar-expert.js.map +1 -1
  94. package/dist/components/solar-system-form.js +1 -1
  95. package/dist/components/toast-notification.d.ts +11 -0
  96. package/dist/components/toast-notification.js +11 -0
  97. package/dist/components/toast-notification.js.map +1 -0
  98. package/dist/components/tool-box.js +1 -1
  99. package/dist/components/tutorial-component.js +1 -1
  100. package/dist/components/undo-icon.js +1 -1
  101. package/dist/esm/eraser-icon_19.entry.js +7 -0
  102. package/dist/esm/{eraser-icon_18.entry.js.map → eraser-icon_19.entry.js.map} +1 -1
  103. package/dist/esm/{lerc-C1dTV3Ec.js → lerc-j3yBkoBc.js} +3 -3
  104. package/dist/esm/{lerc-C1dTV3Ec.js.map → lerc-j3yBkoBc.js.map} +1 -1
  105. package/dist/esm/loader.js +1 -1
  106. package/dist/esm/loading-widget.entry.js +2 -2
  107. package/dist/esm/loading-widget.entry.js.map +1 -1
  108. package/dist/esm/stencil-library.js +1 -1
  109. package/dist/stencil-library/loading-widget.entry.esm.js.map +1 -1
  110. package/dist/stencil-library/p-741a746a.entry.js +2 -0
  111. package/dist/stencil-library/p-741a746a.entry.js.map +1 -0
  112. package/dist/stencil-library/p-c6J1w7ew.js +2 -0
  113. package/dist/stencil-library/{p-DN5z5Lnk.js.map → p-c6J1w7ew.js.map} +1 -1
  114. package/dist/stencil-library/{p-d3e17162.entry.js → p-d2fcb2d8.entry.js} +2 -2
  115. package/dist/stencil-library/{p-DYtW7_ih.js → p-rVA7BFlW.js} +4 -4
  116. package/dist/stencil-library/{p-DYtW7_ih.js.map → p-rVA7BFlW.js.map} +1 -1
  117. package/dist/stencil-library/stencil-library.esm.js +1 -1
  118. package/dist/types/components/map-draw/map-draw.d.ts +5 -4
  119. package/dist/types/components/map-draw/polygon-information.d.ts +1 -0
  120. package/dist/types/components/map-draw/tutorial-component.d.ts +9 -0
  121. package/dist/types/components/widgets/toast-notification.d.ts +14 -0
  122. package/dist/types/components.d.ts +19 -0
  123. package/dist/types/types/lang.d.ts +7 -0
  124. package/package.json +1 -1
  125. package/dist/cjs/eraser-icon_18.cjs.entry.js.map +0 -1
  126. package/dist/components/p-B7UJpRdF.js +0 -40
  127. package/dist/components/p-B7UJpRdF.js.map +0 -1
  128. package/dist/components/p-BELtn8mh.js +0 -40
  129. package/dist/components/p-BELtn8mh.js.map +0 -1
  130. package/dist/components/p-BFxdD9Vs.js +0 -40
  131. package/dist/components/p-BFxdD9Vs.js.map +0 -1
  132. package/dist/components/p-BXbeMtbx.js +0 -76
  133. package/dist/components/p-BXbeMtbx.js.map +0 -1
  134. package/dist/components/p-BYE5N70N.js +0 -163
  135. package/dist/components/p-BYE5N70N.js.map +0 -1
  136. package/dist/components/p-BnTinS5t.js +0 -40
  137. package/dist/components/p-BnTinS5t.js.map +0 -1
  138. package/dist/components/p-BsLLB46f.js +0 -114
  139. package/dist/components/p-BsLLB46f.js.map +0 -1
  140. package/dist/components/p-CO7fYxHj.js +0 -40
  141. package/dist/components/p-CO7fYxHj.js.map +0 -1
  142. package/dist/components/p-CRQ8cKpY.js.map +0 -1
  143. package/dist/components/p-CZydnQHs.js +0 -114
  144. package/dist/components/p-CZydnQHs.js.map +0 -1
  145. package/dist/components/p-CcItlhA2.js +0 -60
  146. package/dist/components/p-CcItlhA2.js.map +0 -1
  147. package/dist/components/p-Dcu7-bdb.js +0 -623
  148. package/dist/components/p-Dcu7-bdb.js.map +0 -1
  149. package/dist/components/p-DotCjbjt.js +0 -40
  150. package/dist/components/p-DotCjbjt.js.map +0 -1
  151. package/dist/components/p-Dqekrz_n.js +0 -40
  152. package/dist/components/p-Dqekrz_n.js.map +0 -1
  153. package/dist/components/p-DvYICeab.js +0 -40
  154. package/dist/components/p-DvYICeab.js.map +0 -1
  155. package/dist/components/p-Dvlk0vkV.js +0 -47
  156. package/dist/components/p-Dvlk0vkV.js.map +0 -1
  157. package/dist/components/p-N0461-xw.js.map +0 -1
  158. package/dist/esm/eraser-icon_18.entry.js +0 -7
  159. package/dist/stencil-library/p-0cc467c4.entry.js +0 -2
  160. package/dist/stencil-library/p-0cc467c4.entry.js.map +0 -1
  161. package/dist/stencil-library/p-DN5z5Lnk.js +0 -2
  162. /package/dist/stencil-library/{p-d3e17162.entry.js.map → p-d2fcb2d8.entry.js.map} +0 -0
@@ -22,8 +22,6 @@ export class MapDraw {
22
22
  firstPolygonClosed = false;
23
23
  zoom = 1;
24
24
  loadingState = "empty";
25
- buildingInsightsLoaded = false;
26
- buildingImagesLoaded = false;
27
25
  rgbTiff = null;
28
26
  currentTool = roofTool;
29
27
  buildingInsights = null;
@@ -35,6 +33,9 @@ export class MapDraw {
35
33
  };
36
34
  currentPolygon = null;
37
35
  solarSystem = {};
36
+ showToast = false;
37
+ toastMessage = "";
38
+ toastType = "success";
38
39
  el;
39
40
  canvasElement;
40
41
  polygonCanvas;
@@ -51,8 +52,6 @@ export class MapDraw {
51
52
  this.latitudeChangeListener = () => {
52
53
  if (state.latitude && state.longitude) {
53
54
  this.loadingState = "loading";
54
- this.buildingInsightsLoaded = false;
55
- this.buildingImagesLoaded = false;
56
55
  this.getBuildingImages();
57
56
  this.getBuildingInsights();
58
57
  // Reset tutorial states for new location
@@ -68,8 +67,6 @@ export class MapDraw {
68
67
  this.longitudeChangeListener = () => {
69
68
  if (state.latitude && state.longitude) {
70
69
  this.loadingState = "loading";
71
- this.buildingInsightsLoaded = false;
72
- this.buildingImagesLoaded = false;
73
70
  this.getBuildingImages();
74
71
  this.getBuildingInsights();
75
72
  // Reset tutorial states for new location
@@ -87,8 +84,6 @@ export class MapDraw {
87
84
  // Load data if coordinates already exist
88
85
  if (state.latitude && state.longitude) {
89
86
  this.loadingState = "loading";
90
- this.buildingInsightsLoaded = false;
91
- this.buildingImagesLoaded = false;
92
87
  this.getBuildingInsights();
93
88
  this.getBuildingImages();
94
89
  // Show tutorial if coordinates already exist
@@ -155,7 +150,7 @@ export class MapDraw {
155
150
  },
156
151
  onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),
157
152
  onLowerRoofEdgeMarked: () => {
158
- this.calculateSolarPanels();
153
+ this.calculateSolarPanels(false);
159
154
  if (!this.additionalToolsTutorialShown) {
160
155
  this.showAdditionalToolsTutorial = true;
161
156
  this.additionalToolsTutorialShown = true;
@@ -260,7 +255,7 @@ export class MapDraw {
260
255
  this.handleToolSelect(moveTool);
261
256
  if (polygon.azimuth && polygon.pitch) {
262
257
  if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {
263
- this.calculateSolarPanels();
258
+ this.calculateSolarPanels(false);
264
259
  }
265
260
  return;
266
261
  }
@@ -283,7 +278,7 @@ export class MapDraw {
283
278
  }
284
279
  if (polygon.closed &&
285
280
  this.canvasManager?.getPositionedSolarPanels(polygon.id)) {
286
- this.calculateSolarPanels();
281
+ this.calculateSolarPanels(false);
287
282
  }
288
283
  }
289
284
  handleMouseUp = (event) => {
@@ -381,16 +376,12 @@ export class MapDraw {
381
376
  }
382
377
  async getBuildingInsights() {
383
378
  if (!state.latitude || !state.longitude) {
384
- this.buildingInsightsLoaded = true;
385
- this.checkLoadingComplete();
386
379
  return;
387
380
  }
388
381
  if (this.buildingInsights) {
389
382
  const sameLocation = this.buildingInsights.center.latitude === state.latitude &&
390
383
  this.buildingInsights.center.longitude === state.longitude;
391
384
  if (sameLocation) {
392
- this.buildingInsightsLoaded = true;
393
- this.checkLoadingComplete();
394
385
  return;
395
386
  }
396
387
  this.solarSystem = {};
@@ -414,20 +405,9 @@ export class MapDraw {
414
405
  catch (error) {
415
406
  console.error("Failed to get building insights:", error);
416
407
  }
417
- finally {
418
- this.buildingInsightsLoaded = true;
419
- this.checkLoadingComplete();
420
- }
421
- }
422
- checkLoadingComplete() {
423
- if (this.buildingInsightsLoaded && this.buildingImagesLoaded) {
424
- this.loadingState = "loaded";
425
- }
426
408
  }
427
409
  async getBuildingImages() {
428
410
  if (!state.latitude || !state.longitude) {
429
- this.buildingImagesLoaded = true;
430
- this.checkLoadingComplete();
431
411
  return;
432
412
  }
433
413
  // Check if we already have building insights for the same location
@@ -435,9 +415,6 @@ export class MapDraw {
435
415
  const sameLocation = this.buildingInsights.center.latitude === state.latitude &&
436
416
  this.buildingInsights.center.longitude === state.longitude;
437
417
  if (sameLocation) {
438
- // If we have the same location, we might already have the images too
439
- this.buildingImagesLoaded = true;
440
- this.checkLoadingComplete();
441
418
  return;
442
419
  }
443
420
  }
@@ -448,14 +425,15 @@ export class MapDraw {
448
425
  if (this.canvasManager) {
449
426
  this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);
450
427
  }
428
+ // this.loadingState = "loaded";
429
+ }
430
+ else {
431
+ this.loadingState = "error";
451
432
  }
452
433
  }
453
434
  catch (error) {
454
435
  console.error("Failed to get building images:", error);
455
- }
456
- finally {
457
- this.buildingImagesLoaded = true;
458
- this.checkLoadingComplete();
436
+ this.loadingState = "error";
459
437
  }
460
438
  }
461
439
  async drawMap() {
@@ -474,12 +452,7 @@ export class MapDraw {
474
452
  await new Promise((resolve) => setTimeout(resolve, 0));
475
453
  try {
476
454
  renderRGB(this.rgbTiff, undefined, this.canvasElement);
477
- }
478
- catch (error) {
479
- console.error("Failed to render RGB image:", error);
480
- }
481
- try {
482
- renderRGB(this.rgbTiff, undefined, this.canvasElement);
455
+ this.loadingState = "loaded";
483
456
  }
484
457
  catch (error) {
485
458
  console.error("Failed to render RGB image:", error);
@@ -508,14 +481,22 @@ export class MapDraw {
508
481
  this.currentTool = moveTool;
509
482
  break;
510
483
  }
484
+ // Show toast message
485
+ const t = getLanguageStrings(state.settings.language);
486
+ this.showToastMessage(t.mapDraw.toast.undoSuccess, "success");
511
487
  // if (!this.currentPolygon?.closed) {
512
488
  // this.handleToolSelect(roofTool);
513
489
  // }
514
490
  }
515
491
  }
516
- calculateSolarPanels() {
492
+ calculateSolarPanels(showToast = false) {
517
493
  if (this.currentPolygon) {
518
494
  this.calculateSolarPanelsForPolygon(this.currentPolygon, false);
495
+ // Show toast message only when explicitly requested
496
+ if (showToast) {
497
+ const t = getLanguageStrings(state.settings.language);
498
+ this.showToastMessage(t.mapDraw.toast.calculateSolarPanelsSuccess, "success");
499
+ }
519
500
  }
520
501
  }
521
502
  markAsFlatRoof() {
@@ -528,6 +509,11 @@ export class MapDraw {
528
509
  this.canvasManager?.updatePolygon(newPolygon);
529
510
  this.currentPolygon = newPolygon;
530
511
  this.calculateSolarPanelsForPolygon(newPolygon, true);
512
+ // Show toast message
513
+ const t = getLanguageStrings(state.settings.language);
514
+ this.showToastMessage(t.mapDraw.toast.markAsFlatRoofSuccess, "info");
515
+ // Auto-select the mark roof edge tool
516
+ this.handleToolSelect(markRoofEdgeTool);
531
517
  }
532
518
  }
533
519
  calculateSolarPanelsForPolygon(polygon, isFlatRoof) {
@@ -568,13 +554,14 @@ export class MapDraw {
568
554
  }
569
555
  if (this.currentPolygon?.type === "roof" &&
570
556
  this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)) {
571
- this.calculateSolarPanels();
557
+ this.calculateSolarPanels(false);
572
558
  return;
573
559
  }
574
560
  }
575
561
  handleAzimuthChange(event) {
576
562
  const target = event.target;
577
- const azimuth = parseFloat(target.value);
563
+ const displayAzimuth = parseFloat(target.value);
564
+ const azimuth = (displayAzimuth + 270) % 360;
578
565
  if (this.currentPolygon) {
579
566
  const newPolygon = {
580
567
  ...this.currentPolygon,
@@ -585,7 +572,7 @@ export class MapDraw {
585
572
  }
586
573
  if (this.currentPolygon?.type === "roof" &&
587
574
  this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)) {
588
- this.calculateSolarPanels();
575
+ this.calculateSolarPanels(false);
589
576
  return;
590
577
  }
591
578
  }
@@ -629,29 +616,41 @@ export class MapDraw {
629
616
  };
630
617
  handleMarkEdgeTutorialClose = () => {
631
618
  this.showMarkEdgeTutorial = false;
619
+ this.handleToolSelect(markRoofEdgeTool);
632
620
  };
633
621
  handleAdditionalToolsTutorialClose = () => {
634
622
  this.showAdditionalToolsTutorial = false;
635
623
  };
624
+ showToastMessage(message, type = "success") {
625
+ this.toastMessage = message;
626
+ this.toastType = type;
627
+ this.showToast = true;
628
+ // Hide toast after 3 seconds
629
+ setTimeout(() => {
630
+ this.showToast = false;
631
+ }, 3000);
632
+ }
636
633
  render() {
634
+ console.log(this.loadingState);
637
635
  const t = getLanguageStrings(state.settings.language);
638
- return (h("div", { key: 'deed6c1f74dbf3902ec65c09a05cae5c32fe437f', class: "flex flex-col justify-center items-center w-full h-full gap-4", id: "map-draw" }, this.showTutorial && (h("tutorial-component", { key: 'a76125a68dd04b17429ec16d98357ff20333c313', onClose: this.handleTutorialClose, title: t.mapDraw.tutorial.title, description: t.mapDraw.tutorial.description, videoSource: getAssetPath("./assets/tutorial1.mp4") })), this.showMarkEdgeTutorial && (h("tutorial-component", { key: '366f794b4d41f8d4102a9b27da8cda1f74faa713', onClose: this.handleMarkEdgeTutorialClose, title: t.mapDraw.tutorial.markEdge.title, description: t.mapDraw.tutorial.markEdge
639
- .description, videoSource: getAssetPath("./assets/tutorial2.mp4") })), this.showAdditionalToolsTutorial && (h("tutorial-component", { key: 'c995cfefb6cedef0adb2702db1074fb158d917f4', onClose: this
636
+ return (h("div", { key: 'd9a05eaaeab8dc47f8a5eb753e778bcaa1e5bc2e', class: "flex flex-col justify-center items-center w-full h-full gap-4", id: "map-draw" }, this.showTutorial && (h("tutorial-component", { key: 'a3ef87f44343c603939ef5344fec0186033516bc', onClose: this.handleTutorialClose, title: t.mapDraw.tutorial.title, description: t.mapDraw.tutorial.description, videoSource: getAssetPath("./assets/tutorial1.mp4") })), this.showMarkEdgeTutorial && (h("tutorial-component", { key: 'ca5fb10099c9b4543cfbc6602810a8861cc21fa5', onClose: this.handleMarkEdgeTutorialClose, title: t.mapDraw.tutorial.markEdge.title, description: t.mapDraw.tutorial.markEdge
637
+ .description, videoSource: getAssetPath("./assets/tutorial2.mp4") })), this.showAdditionalToolsTutorial && (h("tutorial-component", { key: '2e38dcf38139dfcaf841627347bc5543de848946', onClose: this
640
638
  .handleAdditionalToolsTutorialClose, title: t.mapDraw.tutorial.additionalTools.title, description: t.mapDraw.tutorial.additionalTools
641
639
  .description, videoSource: getAssetPath("./assets/tutorial3.mp4") })), (state.latitude && state.longitude &&
642
- this.loadingState === "loading") && (h("div", { key: 'c506d8dd8c598c0ab2e6e358d252d49d527c2eb3', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: 'cfeb62d4b47fe6eebe7c933532b0ee848a490221', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary" }))), h("div", { key: 'e501cff31404ec0a6689dd33a8516cfbb44ea7b3', class: "flex items-start justify-center h-full w-full bg-primary rounded-4xl" }, h("div", { key: '0e34861a06dd7bc66eb098fdacfcc9f3f9e52de2', class: "relative h-full flex items-center justify-center w-full rounded-4xl bg-secondary", style: {
640
+ this.loadingState === "loading") && (h("div", { key: 'b0b5a1f60190494e4b0c8ca8537683869763e41f', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: 'dd7ba3950d8ff8ba1fb9623bc390a048c273a490', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary" }))), (state.latitude && state.longitude &&
641
+ this.loadingState === "error") && (h("div", { key: '1cb84bb0c87d36d8174388a4786613ce270b4f67', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: 'd80b3194807377813dab5d5a12e7de0f6b287e2f', class: "text-red-500 text-center text-lg font-semibold" }, t.mapDraw.imageLoadError))), h("div", { key: '2452897337412c77409f842c599ae70526c8e1bd', class: "flex items-start justify-center w-full bg-primary rounded-4xl" }, h("div", { key: '2eafe76ce4b3f4a215c0bfb0d138797d432c8c48', class: "relative flex items-center justify-center w-full rounded-4xl bg-secondary", style: {
643
642
  aspectRatio: this.rgbTiff
644
643
  ? `${this.rgbTiff.width}/${this.rgbTiff.height}`
645
- : "1/1",
646
- } }, h("canvas", { key: '25c2a1e181f62ac8114b5e0dbb75176cf6f1eac7', ref: (el) => this.canvasElement = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", id: "map-draw-canvas", style: {
644
+ : "",
645
+ } }, h("canvas", { key: '60e4aade9147dc13cca63f726a51cbe97f4935ed', ref: (el) => this.canvasElement = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", id: "map-draw-canvas", style: {
647
646
  cursor: this.currentTool.cursor,
648
- } }), h("canvas", { key: 'aed95e405efa0feb1ca742416ded22d2b59edbf4', ref: (el) => this.polygonCanvas = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", style: {
647
+ } }), h("canvas", { key: '8befa9adabe400ee1b36fc586bb1df36c9e5dbe0', ref: (el) => this.polygonCanvas = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", style: {
649
648
  cursor: this.currentTool.cursor,
650
- } }))), h("div", { key: 'd60deae8244d9eb37d5c52f690acd5f77ba1f08b', class: "w-full" }, h("tool-box", { key: 'eb88b074bd5dbb8fe1879942001c08bb5c9bb400', currentTool: this.currentTool, onToolSelect: (tool) => this.handleToolSelect(tool), undoCallback: () => this.undo() })), h("div", { key: '4b401da3fd5592f555de4d0371a81f0b1e03e61f', class: "w-full" }, h("polygon-information", { key: '5e9351c5cb88cee4bdc7ae5729741df4a95cf1bf', currentPolygon: this.currentPolygon, numberOfPanels: this.currentPolygon
649
+ } }))), this.rgbTiff && (h("div", { key: '055d405de5e09790d338e6453c9cd7198b10058a', class: "w-full" }, h("div", { key: 'c81baf5675e4296a56d486686577cb374d77894d', class: "w-full pb-4" }, h("tool-box", { key: '659ade1aeb4caea1217e6a04b7dcf32f4a70a4a3', currentTool: this.currentTool, onToolSelect: (tool) => this.handleToolSelect(tool), undoCallback: () => this.undo() })), h("div", { key: '5f991ffadf72406ebb9f43250cfa93c1a355626d', class: "w-full" }, h("polygon-information", { key: 'ddcf8aed64fc1859b6d557bbeda6808c031f1ee3', currentPolygon: this.currentPolygon, numberOfPanels: this.currentPolygon
651
650
  ? this
652
651
  .solarSystem[this.currentPolygon.id]
653
652
  ?.numberOfPanels
654
- : undefined, handleAzimuthChange: (event) => this.handleAzimuthChange(event), handlePitchChange: (event) => this.handlePitchChange(event), calculateSolarPanels: () => this.calculateSolarPanels(), markAsFlatRoof: () => this.markAsFlatRoof(), currentTool: this.currentTool.name })), h("div", { key: '94745e50a078e9b89e10ad70e75d2e63f12314f4', class: "w-full" }, h("solar-system-form", { key: '3f039715b008f5861f404ba547217dc43cf82805', systemConfigs: this.solarSystem, polygons: this.canvasManager?.getPolygons(), roofCanvas: this.canvasElement, polygonCanvas: this.polygonCanvas })), this.showSettings && (h("settings-modal", { key: '93aacedcce3f43792c570579ff7b58d49ab9c822', settings: state.settings, onClose: this.handleSettingsClose, onSave: this.handleSettingsSave }))));
653
+ : undefined, handleAzimuthChange: (event) => this.handleAzimuthChange(event), handlePitchChange: (event) => this.handlePitchChange(event), calculateSolarPanels: () => this.calculateSolarPanels(true), markAsFlatRoof: () => this.markAsFlatRoof(), currentTool: this.currentTool.name })), h("div", { key: '3f2e17665909001fdc2b15bc66fcf6d866f04da2', class: "w-full" }, h("solar-system-form", { key: '329beb621c93331bc345c4b7787f283a798ddf74', systemConfigs: this.solarSystem, polygons: this.canvasManager?.getPolygons(), roofCanvas: this.canvasElement, polygonCanvas: this.polygonCanvas })))), this.showSettings && (h("settings-modal", { key: 'c39deffc663210f2d1d4b03855e173c281b12d52', settings: state.settings, onClose: this.handleSettingsClose, onSave: this.handleSettingsSave })), this.showToast && (h("toast-notification", { key: '85748d0c1422ce7bf76cfc8eed72f10bc8be5485', message: this.toastMessage, type: this.toastType, duration: 3000 }))));
655
654
  }
656
655
  static get is() { return "map-draw"; }
657
656
  static get originalStyleUrls() {
@@ -769,15 +768,16 @@ export class MapDraw {
769
768
  "firstPolygonClosed": {},
770
769
  "zoom": {},
771
770
  "loadingState": {},
772
- "buildingInsightsLoaded": {},
773
- "buildingImagesLoaded": {},
774
771
  "rgbTiff": {},
775
772
  "currentTool": {},
776
773
  "buildingInsights": {},
777
774
  "pixelInMeters": {},
778
775
  "interaction": {},
779
776
  "currentPolygon": {},
780
- "solarSystem": {}
777
+ "solarSystem": {},
778
+ "showToast": {},
779
+ "toastMessage": {},
780
+ "toastType": {}
781
781
  };
782
782
  }
783
783
  static get elementRef() { return "el"; }
@@ -1 +1 @@
1
- {"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" = \"empty\";\r\n @State()\r\n private buildingInsightsLoaded: boolean = false;\r\n @State()\r\n private buildingImagesLoaded: boolean = false;\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.buildingInsightsLoaded = false;\r\n this.buildingImagesLoaded = false;\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.buildingInsightsLoaded = false;\r\n this.buildingImagesLoaded = false;\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.buildingInsightsLoaded = false;\r\n this.buildingImagesLoaded = false;\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels();\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n });\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels();\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels();\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n this.buildingInsightsLoaded = true;\r\n this.checkLoadingComplete();\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n this.buildingInsightsLoaded = true;\r\n this.checkLoadingComplete();\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n } finally {\r\n this.buildingInsightsLoaded = true;\r\n this.checkLoadingComplete();\r\n }\r\n }\r\n\r\n private checkLoadingComplete() {\r\n if (this.buildingInsightsLoaded && this.buildingImagesLoaded) {\r\n this.loadingState = \"loaded\";\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n this.buildingImagesLoaded = true;\r\n this.checkLoadingComplete();\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n // If we have the same location, we might already have the images too\r\n this.buildingImagesLoaded = true;\r\n this.checkLoadingComplete();\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n } finally {\r\n this.buildingImagesLoaded = true;\r\n this.checkLoadingComplete();\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n console.log(\"undo\");\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels() {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const azimuth = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n };\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center h-full w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative h-full flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"1/1\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n <div class=\"w-full\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) => this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() => this.calculateSolarPanels()}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n />\r\n </div>\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" | \"error\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n @State()\r\n showToast: boolean = false;\r\n @State()\r\n toastMessage: string = \"\";\r\n @State()\r\n toastType: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\";\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels(false);\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n });\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels(false);\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n // this.loadingState = \"loaded\";\r\n } else {\r\n this.loadingState = \"error\";\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n this.loadingState = \"error\";\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n this.loadingState = \"loaded\";\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n console.log(\"undo\");\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(t.mapDraw.toast.undoSuccess, \"success\");\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels(showToast: boolean = false) {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n\r\n // Show toast message only when explicitly requested\r\n if (showToast) {\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.calculateSolarPanelsSuccess,\r\n \"success\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.markAsFlatRoofSuccess,\r\n \"info\",\r\n );\r\n\r\n // Auto-select the mark roof edge tool\r\n this.handleToolSelect(markRoofEdgeTool);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const displayAzimuth = parseFloat(target.value);\r\n const azimuth = (displayAzimuth + 270) % 360;\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n this.handleToolSelect(markRoofEdgeTool);\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n };\r\n\r\n private showToastMessage(\r\n message: string,\r\n type: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\",\r\n ) {\r\n this.toastMessage = message;\r\n this.toastType = type;\r\n this.showToast = true;\r\n\r\n // Hide toast after 3 seconds\r\n setTimeout(() => {\r\n this.showToast = false;\r\n }, 3000);\r\n }\r\n\r\n render() {\r\n console.log(this.loadingState);\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"error\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"text-red-500 text-center text-lg font-semibold\">\r\n {t.mapDraw.imageLoadError}\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n {this.rgbTiff && (\r\n <div class=\"w-full\">\r\n <div class=\"w-full pb-4\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) =>\r\n this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels(true)}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n {this.showToast && (\r\n <toast-notification\r\n message={this.toastMessage}\r\n type={this.toastType}\r\n duration={3000}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -145,7 +145,7 @@ export class MapSelector {
145
145
  }
146
146
  render() {
147
147
  const t = getLanguageStrings(this.language);
148
- return (h("div", { key: '7388d1c150e35711ad5ef732955f6f40a82253e0', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: '1f381d7671feffd6e944a5e92077856eff443d02', class: "relative" }, h("div", { key: 'a2c52385b2ffb6182047d78d4654f5d6cbcb78a0', class: "absolute left-3 top-0 h-full flex items-center pointer-events-none" }, h("search-icon", { key: '20edd171ffce0d3bbdefa2377160e7ee1717593a' })), h("input", { key: 'd0e320924656945e02059806f231fe4b54fdd92a', ref: (el) => this.inputElement = el, type: "text", placeholder: t.solarExpert.searchPlaceholder, class: "w-full pl-10 pr-4 py-2 border border-border rounded-4xl focus:ring-secondary bg-muted" })), h("div", { key: '4f532ab6294486b9266b3776e40dbdc358a6d501', class: "w-full rounded-4xl p-4 bg-overlay" }, t.mapSelector.explanation), h("div", { key: 'bcd3998bcb72ac1515844bf767efeebbc4cc09df', class: "flex items-center gap-4" }, h("label", { key: '2fed4665e01b6bfcfee2119d4a842c7a7be47e2f', class: "text-sm font-medium text-text-muted" }, t.mapSelector.radius), this.isIOS()
148
+ return (h("div", { key: 'f609afa9e2a2226b3be80de17a3b810f802b16a4', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: 'b0eec355ec27870b08a9c21f9129ee51e384d301', class: "relative" }, h("div", { key: 'baf26233c9d7c1526135f6bdef5fa2bbe8d449b8', class: "absolute left-3 top-0 h-full flex items-center pointer-events-none" }, h("search-icon", { key: '315a034e92ce894f189be3195686c054d61914dc' })), h("input", { key: '0ae0c9a8597532bd7f7a932fd513fa8cc2789a97', ref: (el) => this.inputElement = el, type: "text", placeholder: t.solarExpert.searchPlaceholder, class: "w-full pl-10 pr-4 py-2 border border-border rounded-4xl focus:ring-secondary bg-muted" })), h("div", { key: '3dbace40d04a11c7283fc19da070438f4120dae5', class: "w-full rounded-4xl p-4 bg-overlay" }, t.mapSelector.explanation), h("div", { key: 'c51a2ce5158c5553997db9d05818f71f6342ff8b', class: "flex items-center gap-4" }, h("label", { key: 'cbc40a3b6df04e8021ccc9da278f6663b9d370ab', class: "text-sm font-medium text-text-muted" }, t.mapSelector.radius), this.isIOS()
149
149
  ? (h("div", { class: "flex items-center gap-2" }, h("input", { type: "number", min: "5", max: "100", step: "5", class: "flex-1 px-4 py-2 rounded-4xl border border-border focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", value: this.radius, onInput: (e) => {
150
150
  const value = parseInt(e.target
151
151
  .value);
@@ -158,11 +158,11 @@ export class MapSelector {
158
158
  }, style: {
159
159
  border: "1px solid var(--color-border)",
160
160
  } }), h("span", { class: "text-sm text-text-muted" }, "m")))
161
- : (h("input", { type: "range", min: "5", max: "100", value: this.radius, onInput: (e) => this.handleRadiusChange(e), 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" })), !this.isIOS() && (h("span", { key: '5feb153500a3a57625dadffcfcd1f07c1e527acf', class: "text-sm text-text-muted" }, this.radius, "m"))), h("button", { key: 'd8463c0c7339df1e50daaa438a9e2ead1ff98c21', onClick: () => this.handleToggleMapMode(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
161
+ : (h("input", { type: "range", min: "5", max: "100", value: this.radius, onInput: (e) => this.handleRadiusChange(e), 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" })), !this.isIOS() && (h("span", { key: '27afa73a7462deb1640bd348da6ddbc837108e80', class: "text-sm text-text-muted" }, this.radius, "m"))), h("button", { key: '6a57821539f57e3fc1be52b9885c1677c2d821b0', onClick: () => this.handleToggleMapMode(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
162
162
  color: "#ffffff",
163
163
  } }, this.isSatelliteMode
164
164
  ? t.mapSelector.switchToStandard
165
- : t.mapSelector.switchToSatellite), h("div", { key: 'f6c9202c4f06caba27fc2ad682db965079722b28', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-border" }), this.showAddressError && (h("div", { key: '5162db4bbbe2445e3269c07669e5700bd00e1aac', class: "w-full p-3 bg-red-100 border border-red-300 rounded-4xl text-red-700 text-sm" }, t.mapSelector.noAddressSelected)), h("button", { key: '99021b5d4cc28cc37e62251b363f6e88ce5c3bac', onClick: () => this.handleAcceptPosition(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
165
+ : t.mapSelector.switchToSatellite), h("div", { key: '33cf7a585ec2a3340ef6ee98468c0f0fde84bfb2', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-border" }), this.showAddressError && (h("div", { key: '62c0d763bd71014fd1cddb6ed554b6b5df461ac3', class: "w-full p-3 bg-red-100 border border-red-300 rounded-4xl text-red-700 text-sm" }, t.mapSelector.noAddressSelected)), h("button", { key: '15d857409bb93e66705353c093de07edf1113ad8', onClick: () => this.handleAcceptPosition(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
166
166
  color: "#ffffff",
167
167
  } }, t.mapSelector.accept)));
168
168
  }