blue-chestnut-solar-expert 0.0.62 → 0.0.63

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 (158) 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-Cg9Ef4kN.js} +9 -9
  4. package/dist/cjs/{lerc-BC1SKbTC.js.map → lerc-Cg9Ef4kN.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 +44 -15
  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 +2 -2
  16. package/dist/collection/components/map-draw/tool-box.js +3 -3
  17. package/dist/collection/components/map-draw/tutorial-component.js +36 -3
  18. package/dist/collection/components/map-draw/tutorial-component.js.map +1 -1
  19. package/dist/collection/components/settings/settings.js +8 -8
  20. package/dist/collection/components/solar-expert/solar-expert.js +1 -1
  21. package/dist/collection/components/solar-system-form/solar-system-form.js +36 -36
  22. package/dist/collection/components/widgets/loading-widget.js +1 -1
  23. package/dist/collection/components/widgets/toast-notification.js +133 -0
  24. package/dist/collection/components/widgets/toast-notification.js.map +1 -0
  25. package/dist/collection/output.css +101 -115
  26. package/dist/collection/types/lang.js.map +1 -1
  27. package/dist/collection/utils/lang/english.js +6 -0
  28. package/dist/collection/utils/lang/english.js.map +1 -1
  29. package/dist/collection/utils/lang/german.js +6 -0
  30. package/dist/collection/utils/lang/german.js.map +1 -1
  31. package/dist/collection/utils/lang/spanish.js +6 -0
  32. package/dist/collection/utils/lang/spanish.js.map +1 -1
  33. package/dist/components/eraser-icon.js +1 -1
  34. package/dist/components/house-icon.js +1 -1
  35. package/dist/components/icon-selector.js +1 -1
  36. package/dist/components/loading-widget.js +2 -2
  37. package/dist/components/loading-widget.js.map +1 -1
  38. package/dist/components/map-draw.js +1 -1
  39. package/dist/components/map-selector.js +1 -1
  40. package/dist/components/marker-icon.js +1 -1
  41. package/dist/components/move-icon.js +1 -1
  42. package/dist/components/octagon-minus-icon.js +1 -1
  43. package/dist/components/p-6t2i7GOy.js +163 -0
  44. package/dist/components/p-6t2i7GOy.js.map +1 -0
  45. package/dist/components/p-B2W-WTcd.js +47 -0
  46. package/dist/components/p-B2W-WTcd.js.map +1 -0
  47. package/dist/components/p-Bl-OxMMK.js +40 -0
  48. package/dist/components/p-Bl-OxMMK.js.map +1 -0
  49. package/dist/components/{p-CRQ8cKpY.js → p-BsvvtnQe.js} +20 -2
  50. package/dist/components/p-BsvvtnQe.js.map +1 -0
  51. package/dist/components/p-BzU0ssT8.js +40 -0
  52. package/dist/components/p-BzU0ssT8.js.map +1 -0
  53. package/dist/components/p-C241_R3r.js +623 -0
  54. package/dist/components/p-C241_R3r.js.map +1 -0
  55. package/dist/components/p-CBoVsYa-.js +40 -0
  56. package/dist/components/p-CBoVsYa-.js.map +1 -0
  57. package/dist/components/{p-N0461-xw.js → p-CIfpd0H7.js} +82 -47
  58. package/dist/components/p-CIfpd0H7.js.map +1 -0
  59. package/dist/components/p-CuNvbl9l.js +40 -0
  60. package/dist/components/p-CuNvbl9l.js.map +1 -0
  61. package/dist/components/p-CuhV6w4i.js +40 -0
  62. package/dist/components/p-CuhV6w4i.js.map +1 -0
  63. package/dist/components/p-CwFdd3zn.js +86 -0
  64. package/dist/components/p-CwFdd3zn.js.map +1 -0
  65. package/dist/components/p-D3H70xDr.js +40 -0
  66. package/dist/components/p-D3H70xDr.js.map +1 -0
  67. package/dist/components/p-DIii3RoN.js +76 -0
  68. package/dist/components/p-DIii3RoN.js.map +1 -0
  69. package/dist/components/p-DPHbqum8.js +114 -0
  70. package/dist/components/p-DPHbqum8.js.map +1 -0
  71. package/dist/components/p-DXQvpFgv.js +114 -0
  72. package/dist/components/p-DXQvpFgv.js.map +1 -0
  73. package/dist/components/p-DnjGygv7.js +89 -0
  74. package/dist/components/p-DnjGygv7.js.map +1 -0
  75. package/dist/components/p-DxfT4KzX.js +40 -0
  76. package/dist/components/p-DxfT4KzX.js.map +1 -0
  77. package/dist/components/{p-CH_OwRlu.js → p-UhBaEaSb.js} +3 -3
  78. package/dist/components/{p-CH_OwRlu.js.map → p-UhBaEaSb.js.map} +1 -1
  79. package/dist/components/p-gYPKei39.js +40 -0
  80. package/dist/components/p-gYPKei39.js.map +1 -0
  81. package/dist/components/{p-DJcc5dax.js → p-kbMAsJ_s.js} +40 -40
  82. package/dist/components/{p-DJcc5dax.js.map → p-kbMAsJ_s.js.map} +1 -1
  83. package/dist/components/polygon-buttons.js +1 -1
  84. package/dist/components/polygon-information.js +1 -1
  85. package/dist/components/search-icon.js +1 -1
  86. package/dist/components/settings-icon.js +1 -1
  87. package/dist/components/settings-modal.js +1 -1
  88. package/dist/components/solar-expert.js +40 -34
  89. package/dist/components/solar-expert.js.map +1 -1
  90. package/dist/components/solar-system-form.js +1 -1
  91. package/dist/components/toast-notification.d.ts +11 -0
  92. package/dist/components/toast-notification.js +11 -0
  93. package/dist/components/toast-notification.js.map +1 -0
  94. package/dist/components/tool-box.js +1 -1
  95. package/dist/components/tutorial-component.js +1 -1
  96. package/dist/components/undo-icon.js +1 -1
  97. package/dist/esm/eraser-icon_19.entry.js +7 -0
  98. package/dist/esm/{eraser-icon_18.entry.js.map → eraser-icon_19.entry.js.map} +1 -1
  99. package/dist/esm/{lerc-C1dTV3Ec.js → lerc-D1ySec2h.js} +3 -3
  100. package/dist/esm/{lerc-C1dTV3Ec.js.map → lerc-D1ySec2h.js.map} +1 -1
  101. package/dist/esm/loader.js +1 -1
  102. package/dist/esm/loading-widget.entry.js +2 -2
  103. package/dist/esm/loading-widget.entry.js.map +1 -1
  104. package/dist/esm/stencil-library.js +1 -1
  105. package/dist/stencil-library/loading-widget.entry.esm.js.map +1 -1
  106. package/dist/stencil-library/p-Tmp2o-vp.js +2 -0
  107. package/dist/stencil-library/p-Tmp2o-vp.js.map +1 -0
  108. package/dist/stencil-library/p-c2c69c28.entry.js +2 -0
  109. package/dist/stencil-library/p-c2c69c28.entry.js.map +1 -0
  110. package/dist/stencil-library/{p-d3e17162.entry.js → p-ea3fd08c.entry.js} +2 -2
  111. package/dist/stencil-library/{p-DYtW7_ih.js → p-r7aBltoS.js} +4 -4
  112. package/dist/stencil-library/{p-DYtW7_ih.js.map → p-r7aBltoS.js.map} +1 -1
  113. package/dist/stencil-library/stencil-library.esm.js +1 -1
  114. package/dist/types/components/map-draw/map-draw.d.ts +4 -0
  115. package/dist/types/components/map-draw/tutorial-component.d.ts +9 -0
  116. package/dist/types/components/widgets/toast-notification.d.ts +14 -0
  117. package/dist/types/components.d.ts +19 -0
  118. package/dist/types/types/lang.d.ts +6 -0
  119. package/package.json +1 -1
  120. package/dist/cjs/eraser-icon_18.cjs.entry.js.map +0 -1
  121. package/dist/components/p-B7UJpRdF.js +0 -40
  122. package/dist/components/p-B7UJpRdF.js.map +0 -1
  123. package/dist/components/p-BELtn8mh.js +0 -40
  124. package/dist/components/p-BELtn8mh.js.map +0 -1
  125. package/dist/components/p-BFxdD9Vs.js +0 -40
  126. package/dist/components/p-BFxdD9Vs.js.map +0 -1
  127. package/dist/components/p-BXbeMtbx.js +0 -76
  128. package/dist/components/p-BXbeMtbx.js.map +0 -1
  129. package/dist/components/p-BYE5N70N.js +0 -163
  130. package/dist/components/p-BYE5N70N.js.map +0 -1
  131. package/dist/components/p-BnTinS5t.js +0 -40
  132. package/dist/components/p-BnTinS5t.js.map +0 -1
  133. package/dist/components/p-BsLLB46f.js +0 -114
  134. package/dist/components/p-BsLLB46f.js.map +0 -1
  135. package/dist/components/p-CO7fYxHj.js +0 -40
  136. package/dist/components/p-CO7fYxHj.js.map +0 -1
  137. package/dist/components/p-CRQ8cKpY.js.map +0 -1
  138. package/dist/components/p-CZydnQHs.js +0 -114
  139. package/dist/components/p-CZydnQHs.js.map +0 -1
  140. package/dist/components/p-CcItlhA2.js +0 -60
  141. package/dist/components/p-CcItlhA2.js.map +0 -1
  142. package/dist/components/p-Dcu7-bdb.js +0 -623
  143. package/dist/components/p-Dcu7-bdb.js.map +0 -1
  144. package/dist/components/p-DotCjbjt.js +0 -40
  145. package/dist/components/p-DotCjbjt.js.map +0 -1
  146. package/dist/components/p-Dqekrz_n.js +0 -40
  147. package/dist/components/p-Dqekrz_n.js.map +0 -1
  148. package/dist/components/p-DvYICeab.js +0 -40
  149. package/dist/components/p-DvYICeab.js.map +0 -1
  150. package/dist/components/p-Dvlk0vkV.js +0 -47
  151. package/dist/components/p-Dvlk0vkV.js.map +0 -1
  152. package/dist/components/p-N0461-xw.js.map +0 -1
  153. package/dist/esm/eraser-icon_18.entry.js +0 -7
  154. package/dist/stencil-library/p-0cc467c4.entry.js +0 -2
  155. package/dist/stencil-library/p-0cc467c4.entry.js.map +0 -1
  156. package/dist/stencil-library/p-DN5z5Lnk.js +0 -2
  157. package/dist/stencil-library/p-DN5z5Lnk.js.map +0 -1
  158. /package/dist/stencil-library/{p-d3e17162.entry.js.map → p-ea3fd08c.entry.js.map} +0 -0
@@ -35,6 +35,9 @@ export class MapDraw {
35
35
  };
36
36
  currentPolygon = null;
37
37
  solarSystem = {};
38
+ showToast = false;
39
+ toastMessage = "";
40
+ toastType = "success";
38
41
  el;
39
42
  canvasElement;
40
43
  polygonCanvas;
@@ -155,7 +158,7 @@ export class MapDraw {
155
158
  },
156
159
  onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),
157
160
  onLowerRoofEdgeMarked: () => {
158
- this.calculateSolarPanels();
161
+ this.calculateSolarPanels(false);
159
162
  if (!this.additionalToolsTutorialShown) {
160
163
  this.showAdditionalToolsTutorial = true;
161
164
  this.additionalToolsTutorialShown = true;
@@ -260,7 +263,7 @@ export class MapDraw {
260
263
  this.handleToolSelect(moveTool);
261
264
  if (polygon.azimuth && polygon.pitch) {
262
265
  if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {
263
- this.calculateSolarPanels();
266
+ this.calculateSolarPanels(false);
264
267
  }
265
268
  return;
266
269
  }
@@ -283,7 +286,7 @@ export class MapDraw {
283
286
  }
284
287
  if (polygon.closed &&
285
288
  this.canvasManager?.getPositionedSolarPanels(polygon.id)) {
286
- this.calculateSolarPanels();
289
+ this.calculateSolarPanels(false);
287
290
  }
288
291
  }
289
292
  handleMouseUp = (event) => {
@@ -508,14 +511,22 @@ export class MapDraw {
508
511
  this.currentTool = moveTool;
509
512
  break;
510
513
  }
514
+ // Show toast message
515
+ const t = getLanguageStrings(state.settings.language);
516
+ this.showToastMessage(t.mapDraw.toast.undoSuccess, "success");
511
517
  // if (!this.currentPolygon?.closed) {
512
518
  // this.handleToolSelect(roofTool);
513
519
  // }
514
520
  }
515
521
  }
516
- calculateSolarPanels() {
522
+ calculateSolarPanels(showToast = false) {
517
523
  if (this.currentPolygon) {
518
524
  this.calculateSolarPanelsForPolygon(this.currentPolygon, false);
525
+ // Show toast message only when explicitly requested
526
+ if (showToast) {
527
+ const t = getLanguageStrings(state.settings.language);
528
+ this.showToastMessage(t.mapDraw.toast.calculateSolarPanelsSuccess, "success");
529
+ }
519
530
  }
520
531
  }
521
532
  markAsFlatRoof() {
@@ -528,6 +539,11 @@ export class MapDraw {
528
539
  this.canvasManager?.updatePolygon(newPolygon);
529
540
  this.currentPolygon = newPolygon;
530
541
  this.calculateSolarPanelsForPolygon(newPolygon, true);
542
+ // Show toast message
543
+ const t = getLanguageStrings(state.settings.language);
544
+ this.showToastMessage(t.mapDraw.toast.markAsFlatRoofSuccess, "info");
545
+ // Auto-select the mark roof edge tool
546
+ this.handleToolSelect(markRoofEdgeTool);
531
547
  }
532
548
  }
533
549
  calculateSolarPanelsForPolygon(polygon, isFlatRoof) {
@@ -568,7 +584,7 @@ export class MapDraw {
568
584
  }
569
585
  if (this.currentPolygon?.type === "roof" &&
570
586
  this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)) {
571
- this.calculateSolarPanels();
587
+ this.calculateSolarPanels(false);
572
588
  return;
573
589
  }
574
590
  }
@@ -585,7 +601,7 @@ export class MapDraw {
585
601
  }
586
602
  if (this.currentPolygon?.type === "roof" &&
587
603
  this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)) {
588
- this.calculateSolarPanels();
604
+ this.calculateSolarPanels(false);
589
605
  return;
590
606
  }
591
607
  }
@@ -629,29 +645,39 @@ export class MapDraw {
629
645
  };
630
646
  handleMarkEdgeTutorialClose = () => {
631
647
  this.showMarkEdgeTutorial = false;
648
+ this.handleToolSelect(markRoofEdgeTool);
632
649
  };
633
650
  handleAdditionalToolsTutorialClose = () => {
634
651
  this.showAdditionalToolsTutorial = false;
635
652
  };
653
+ showToastMessage(message, type = "success") {
654
+ this.toastMessage = message;
655
+ this.toastType = type;
656
+ this.showToast = true;
657
+ // Hide toast after 3 seconds
658
+ setTimeout(() => {
659
+ this.showToast = false;
660
+ }, 3000);
661
+ }
636
662
  render() {
637
663
  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
664
+ return (h("div", { key: 'eded4b7548bafc72381363412a89f22ad5379c14', class: "flex flex-col justify-center items-center w-full h-full gap-4", id: "map-draw" }, this.showTutorial && (h("tutorial-component", { key: '053a6ed9c0f0915b92c6cc0ce78626b7fcded086', onClose: this.handleTutorialClose, title: t.mapDraw.tutorial.title, description: t.mapDraw.tutorial.description, videoSource: getAssetPath("./assets/tutorial1.mp4") })), this.showMarkEdgeTutorial && (h("tutorial-component", { key: '1e04020685acea3bea9c5f631de4a966db03ae89', onClose: this.handleMarkEdgeTutorialClose, title: t.mapDraw.tutorial.markEdge.title, description: t.mapDraw.tutorial.markEdge
665
+ .description, videoSource: getAssetPath("./assets/tutorial2.mp4") })), this.showAdditionalToolsTutorial && (h("tutorial-component", { key: '4e04524447d986b565d2a76878493c6e5269e337', onClose: this
640
666
  .handleAdditionalToolsTutorialClose, title: t.mapDraw.tutorial.additionalTools.title, description: t.mapDraw.tutorial.additionalTools
641
667
  .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: {
668
+ this.loadingState === "loading") && (h("div", { key: '8170dc338a63f206d29af5f22356206a2480ff71', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: '835f7e9bd1ddacc2753359495ce7677b359d3eea', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary" }))), h("div", { key: 'ca641d2d0bb95be9c86a16a45d512d105f4e4e87', class: "flex items-start justify-center w-full bg-primary rounded-4xl" }, h("div", { key: '40919f75b3c51cb83924d7d3e5213f4678e9a6fa', class: "relative flex items-center justify-center w-full rounded-4xl bg-secondary", style: {
643
669
  aspectRatio: this.rgbTiff
644
670
  ? `${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: {
671
+ : "",
672
+ } }, h("canvas", { key: 'd1824ffc2c475385b4ad6bbdaa57dbdbd88dcffa', ref: (el) => this.canvasElement = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", id: "map-draw-canvas", style: {
647
673
  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: {
674
+ } }), h("canvas", { key: '06355f468608d575ae9506e75653ebef27025a50', ref: (el) => this.polygonCanvas = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", style: {
649
675
  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
676
+ } }))), this.rgbTiff && (h("div", { key: '5f88a5e3a24d6b472b5b168859c109bdd98d3c68', class: "w-full" }, h("div", { key: '37004210dee2dcfbdcc5fd1aabeeb1513aad4e1f', class: "w-full pb-4" }, h("tool-box", { key: '2e7335cfa43ba79f0f3a0da43e00137d56c1723f', currentTool: this.currentTool, onToolSelect: (tool) => this.handleToolSelect(tool), undoCallback: () => this.undo() })), h("div", { key: '8ac2e39eb2d5a5513dc9727a640f5f55b79669eb', class: "w-full" }, h("polygon-information", { key: 'dd22b28608e9dc129ec25c6b4f54f10f875fa26a', currentPolygon: this.currentPolygon, numberOfPanels: this.currentPolygon
651
677
  ? this
652
678
  .solarSystem[this.currentPolygon.id]
653
679
  ?.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 }))));
680
+ : 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: 'ddb84e776e17117e92d1d48b1d4e94dce70ce301', class: "w-full" }, h("solar-system-form", { key: 'f4a6a28cd96ef2a20705d918701b6b2003c0d773', systemConfigs: this.solarSystem, polygons: this.canvasManager?.getPolygons(), roofCanvas: this.canvasElement, polygonCanvas: this.polygonCanvas })))), this.showSettings && (h("settings-modal", { key: 'b2d5af05d2e74ef3e792b1910caee70779fabe95', settings: state.settings, onClose: this.handleSettingsClose, onSave: this.handleSettingsSave })), this.showToast && (h("toast-notification", { key: '0103ed71a766aba1b387a47b6dec5f4d1ad81b15', message: this.toastMessage, type: this.toastType, duration: 3000 }))));
655
681
  }
656
682
  static get is() { return "map-draw"; }
657
683
  static get originalStyleUrls() {
@@ -777,7 +803,10 @@ export class MapDraw {
777
803
  "pixelInMeters": {},
778
804
  "interaction": {},
779
805
  "currentPolygon": {},
780
- "solarSystem": {}
806
+ "solarSystem": {},
807
+ "showToast": {},
808
+ "toastMessage": {},
809
+ "toastType": {}
781
810
  };
782
811
  }
783
812
  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\" = \"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 @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.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(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 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 // 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 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(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 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 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: 'e0c3e9f226e08a7bcc197e870591439d1b4e0c42', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: '18c10a71955d5c904383d078259440969628eca8', class: "relative" }, h("div", { key: 'bbedbc15c18746b87618512bb64410894c7225d4', class: "absolute left-3 top-0 h-full flex items-center pointer-events-none" }, h("search-icon", { key: '105a13c8ac3e54eef87d98c4057363c7140919ad' })), h("input", { key: 'a8d09484990ceb8c197006c306a4b58cd6491d6f', 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: 'c37cbdd4e7156712ab6dd1170cdcb78f41bba0db', class: "w-full rounded-4xl p-4 bg-overlay" }, t.mapSelector.explanation), h("div", { key: 'e0a147dd79362b04bf8c206870ec9f3e81cfc46c', class: "flex items-center gap-4" }, h("label", { key: '037b77e7c69a05779cdf6d9b085e339bf7de7621', 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: '5c5758d6abd2732fa5e04d2efa589d5768704539', class: "text-sm text-text-muted" }, this.radius, "m"))), h("button", { key: '682e7459111c0d4c30192d43afbb8bcbe173773d', 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: '23358bf64ee2f68b46576ed8ddd32750bd628894', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-border" }), this.showAddressError && (h("div", { key: '83bbaaf57c87e052d50e50a5e6207dec63888685', 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: 'd84b9777b77ac9a6e6ebd5b7f9c8c74f84d19d8d', 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
  }
@@ -10,7 +10,7 @@ export class PolygonButtons {
10
10
  const buttonStyles = {
11
11
  border: "1px solid #ccc",
12
12
  };
13
- return (h("div", { key: '965884d5e648b65093b2795bf67bcd9bf78ac391', class: "flex w-full gap-2 justify-center pb-3" }, h("button", { key: '43f6d313baff9a9e9ed8b6b6891333f130b96f43', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.markAsFlatRoof() }, t.mapDraw.markAsFlatRoof), h("button", { key: '88a54c8a862ed1491946dba83db13a7ee5c45b8a', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.calculateSolarPanels() }, t.mapDraw.calculateSolarPanels)));
13
+ return (h("div", { key: 'a3995b011060206399d293879f33738c160bf4aa', class: "flex w-full gap-2 justify-center pb-3" }, h("button", { key: 'ce2f459bf947535d040a036603aee9d112179037', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.markAsFlatRoof() }, t.mapDraw.markAsFlatRoof), h("button", { key: '795a7aee4d2faf1b3bc8a623596b4c76aed0d9e5', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.calculateSolarPanels() }, t.mapDraw.calculateSolarPanels)));
14
14
  }
15
15
  static get is() { return "polygon-buttons"; }
16
16
  static get originalStyleUrls() {
@@ -13,9 +13,9 @@ export class PolygonInformation {
13
13
  render() {
14
14
  const t = getLanguageStrings(state.settings.language);
15
15
  // console.log(this.currentPolygon);
16
- return (h("div", { key: 'ea12d974f8928984d3ef4138bdd516dec317c5b0', class: "flex gap-4 flex-row justify-center items-center w-full rounded-4xl pb-2", style: {
16
+ return (h("div", { key: '1813dd4ca945aa3f7f55e3fd3363805d273a805b', class: "flex gap-4 flex-row justify-center items-center w-full rounded-4xl pb-2", style: {
17
17
  border: "1px solid var(--color-border)",
18
- } }, h("div", { key: 'dd5c55a781b771779783e1e90c5918089d668de9', class: "w-full bg-primary rounded-4xl p-3 text-secondary" }, h("h3", { key: 'beb6358d3ec077a11163f377829182f0d21a115d', class: "text-lg font-semibold mb-4 text-center" }, t.mapDraw.information), h("polygon-buttons", { key: '1d866d933593dbd31b385a1aeb2b384144b1aa10', calculateSolarPanels: this.calculateSolarPanels, markAsFlatRoof: this.markAsFlatRoof, currentTool: this.currentTool }), this.currentPolygon?.area
18
+ } }, h("div", { key: '6d7e682793cbbd5bdbeacee1ef5f7730719b79c1', class: "w-full bg-primary rounded-4xl p-3 text-secondary" }, h("h3", { key: '8aa924845f88cc4607d59234e8021b2ffed57935', class: "text-lg font-semibold mb-4 text-center" }, t.mapDraw.information), h("polygon-buttons", { key: '91327f046caaf69dd7106b87b09f59b563b43736', calculateSolarPanels: this.calculateSolarPanels, markAsFlatRoof: this.markAsFlatRoof, currentTool: this.currentTool }), this.currentPolygon?.area
19
19
  ? (h("div", { class: "space-y-4" }, h("div", null, h("div", { class: "grid grid-cols-2 gap-2" }, h("div", null, h("h4", { class: "text-sm font-medium text-text-muted" }, t.mapDraw.area), h("p", { class: "text-lg" }, this.currentPolygon
20
20
  ?.area
21
21
  .toFixed(2), " m\u00B2")), h("div", null, h("div", null, h("h4", { class: "text-sm font-medium text-text-muted" }, t.mapDraw.panels), h("p", { class: "text-lg" }, this.numberOfPanels ?? 0))))), h("div", null, h("h4", { class: "text-sm font-medium text-text-muted" }, t.mapDraw.azimuth), h("div", { class: "flex gap-2 flex-row justify-start bg-muted rounded-4xl p-2" }, h("input", { class: "text-lg w-full", onKeyDown: (e) => {
@@ -9,7 +9,7 @@ export class ToolBox {
9
9
  render() {
10
10
  const t = getLanguageStrings(state.settings.language);
11
11
  const undoToolStrings = t.mapDraw.tools[undoTool.name];
12
- return (h("div", { key: '8e967f7d9c64bb3144fb452fafc507e46e4943d1', class: "flex gap-1 sm:gap-4 rounded-4xl bg-primary pt-3 pl-3 pr-3 flex-wrap justify-center w-full text-xs" }, tools.map((tool) => {
12
+ return (h("div", { key: '847b2ae7ebb0abf4f4a3c793b2a70fb7bec199ab', class: "flex gap-1 sm:gap-4 rounded-4xl bg-primary pt-3 pl-3 pr-3 flex-wrap justify-center w-full text-xs" }, tools.map((tool) => {
13
13
  const toolStrings = t.mapDraw.tools[tool.name];
14
14
  return (h("button", { class: `px-3 py-2 rounded-4xl transition-colors duration-200 ${this.currentTool.name === tool.name
15
15
  ? "bg-secondary hover:bg-secondary/80"
@@ -19,9 +19,9 @@ export class ToolBox {
19
19
  : "var(--color-primary-foreground)",
20
20
  border: "1px solid var(--color-border)",
21
21
  }, "aria-label": toolStrings.ariaLabel, title: toolStrings.explanation, onClick: () => this.onToolSelect(tool) }, h("div", { class: "flex items-center gap-1 flex-col" }, h("icon-selector", { name: tool.icon }), h("span", null, toolStrings.name))));
22
- }), h("button", { key: 'ef4c27258c2cfa29ad937319c8260f885d94b234', class: `px-3 py-2 rounded-4xl transition-colors duration-200 bg-primary hover:bg-muted text-primary-foreground focus:border-2 focus:border-secondary`, style: {
22
+ }), h("button", { key: '76a9f6829a70dbf4f655b3af9c579e29c6fc2a82', class: `px-3 py-2 rounded-4xl transition-colors duration-200 bg-primary hover:bg-muted text-primary-foreground focus:border-2 focus:border-secondary`, style: {
23
23
  border: "1px solid var(--color-border)",
24
- }, "aria-label": undoToolStrings.ariaLabel, title: undoToolStrings.explanation, onClick: () => this.undoCallback() }, h("div", { key: '37d59dc02ab0a8f61a9ef983030756a56dc2c8dc', class: "flex items-center gap-1 flex-col" }, h("undo-icon", { key: 'a4a581a73623722219ecf944bf9eda8613a31944' }), h("span", { key: 'df5e5aeca411a468f4024037d8cc27c7038c3dae' }, undoToolStrings.name)))));
24
+ }, "aria-label": undoToolStrings.ariaLabel, title: undoToolStrings.explanation, onClick: () => this.undoCallback() }, h("div", { key: '55a26a055ebf66a977e7999f419e1ec6fd2578c1', class: "flex items-center gap-1 flex-col" }, h("undo-icon", { key: '8c05120dd0753cfe64fd9fad37f03f41e5eb2acd' }), h("span", { key: '5d9223eeb3adf8589d35db57bb5f1a4e772de765' }, undoToolStrings.name)))));
25
25
  }
26
26
  static get is() { return "tool-box"; }
27
27
  static get originalStyleUrls() {