@geoql/v-maplibre 2.0.0 → 2.0.1

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 (99) hide show
  1. package/dist/{arc-B_fAMcpz.js → arc-XYgM0NpD.js} +2 -2
  2. package/dist/{arc-B_fAMcpz.js.map → arc-XYgM0NpD.js.map} +1 -1
  3. package/dist/{bitmap-C_yi2tt7.js → bitmap-CEQZNyod.js} +2 -2
  4. package/dist/{bitmap-C_yi2tt7.js.map → bitmap-CEQZNyod.js.map} +1 -1
  5. package/dist/{cog-Cksxp4kb.js → cog-B3kQFMdO.js} +2 -2
  6. package/dist/{cog-Cksxp4kb.js.map → cog-B3kQFMdO.js.map} +1 -1
  7. package/dist/{column-CN436hkx.js → column-6Alyevco.js} +2 -2
  8. package/dist/{column-CN436hkx.js.map → column-6Alyevco.js.map} +1 -1
  9. package/dist/{contour-DJbs8Kf4.js → contour-D5irVPeN.js} +2 -2
  10. package/dist/{contour-DJbs8Kf4.js.map → contour-D5irVPeN.js.map} +1 -1
  11. package/dist/deckgl.js +1 -1
  12. package/dist/{generic-B-YSsfL2.js → generic-DXw_QGDp.js} +2 -2
  13. package/dist/{generic-B-YSsfL2.js.map → generic-DXw_QGDp.js.map} +1 -1
  14. package/dist/{geoarrow-path-4ompjoL_.js → geoarrow-path-tBmjWKYC.js} +2 -2
  15. package/dist/{geoarrow-path-4ompjoL_.js.map → geoarrow-path-tBmjWKYC.js.map} +1 -1
  16. package/dist/{geoarrow-polygon-DUlcZwlA.js → geoarrow-polygon-C2sWPrq6.js} +2 -2
  17. package/dist/{geoarrow-polygon-DUlcZwlA.js.map → geoarrow-polygon-C2sWPrq6.js.map} +1 -1
  18. package/dist/{geoarrow-scatterplot-Cd2DK-iz.js → geoarrow-scatterplot-BvvHZc7E.js} +2 -2
  19. package/dist/{geoarrow-scatterplot-Cd2DK-iz.js.map → geoarrow-scatterplot-BvvHZc7E.js.map} +1 -1
  20. package/dist/{geoarrow-solid-polygon-q14Ff9j9.js → geoarrow-solid-polygon-DPmDfwoY.js} +2 -2
  21. package/dist/{geoarrow-solid-polygon-q14Ff9j9.js.map → geoarrow-solid-polygon-DPmDfwoY.js.map} +1 -1
  22. package/dist/{geoarrow-text-DHvTakUd.js → geoarrow-text-DEFcoF0G.js} +2 -2
  23. package/dist/{geoarrow-text-DHvTakUd.js.map → geoarrow-text-DEFcoF0G.js.map} +1 -1
  24. package/dist/{geoarrow-trips-CwRSQdMU.js → geoarrow-trips-C9_EXHnn.js} +2 -2
  25. package/dist/{geoarrow-trips-CwRSQdMU.js.map → geoarrow-trips-C9_EXHnn.js.map} +1 -1
  26. package/dist/{geohash-DfnNENva.js → geohash-vWnSK76U.js} +2 -2
  27. package/dist/{geohash-DfnNENva.js.map → geohash-vWnSK76U.js.map} +1 -1
  28. package/dist/{geojson-BRWVICwI.js → geojson-CqnyNLW0.js} +2 -2
  29. package/dist/{geojson-BRWVICwI.js.map → geojson-CqnyNLW0.js.map} +1 -1
  30. package/dist/geotiff.js +1 -1
  31. package/dist/{great-circle-Da5XIa2p.js → great-circle-Bz8TvCiM.js} +2 -2
  32. package/dist/{great-circle-Da5XIa2p.js.map → great-circle-Bz8TvCiM.js.map} +1 -1
  33. package/dist/{grid-DKP8clpW.js → grid-B_D40N2N.js} +2 -2
  34. package/dist/{grid-DKP8clpW.js.map → grid-B_D40N2N.js.map} +1 -1
  35. package/dist/{grid-cell-CZ41kY8K.js → grid-cell-fa_NejcO.js} +2 -2
  36. package/dist/{grid-cell-CZ41kY8K.js.map → grid-cell-fa_NejcO.js.map} +1 -1
  37. package/dist/{h3-cluster-Cco_QCbU.js → h3-cluster-Cg0CEA_m.js} +2 -2
  38. package/dist/{h3-cluster-Cco_QCbU.js.map → h3-cluster-Cg0CEA_m.js.map} +1 -1
  39. package/dist/{h3-hexagon-BqvZfU5b.js → h3-hexagon-DkIZnQEf.js} +2 -2
  40. package/dist/{h3-hexagon-BqvZfU5b.js.map → h3-hexagon-DkIZnQEf.js.map} +1 -1
  41. package/dist/{heatmap-Bq7-L0jp.js → heatmap-D7R9nYug.js} +2 -2
  42. package/dist/{heatmap-Bq7-L0jp.js.map → heatmap-D7R9nYug.js.map} +1 -1
  43. package/dist/{hexagon-T0vesB_G.js → hexagon-Bl_UBlOT.js} +2 -2
  44. package/dist/{hexagon-T0vesB_G.js.map → hexagon-Bl_UBlOT.js.map} +1 -1
  45. package/dist/{icon-Bwm2m8b4.js → icon-Dm1fyRNM.js} +2 -2
  46. package/dist/{icon-Bwm2m8b4.js.map → icon-Dm1fyRNM.js.map} +1 -1
  47. package/dist/index.d.ts +15 -15
  48. package/dist/index.js +1 -1
  49. package/dist/lidar.js +1 -1
  50. package/dist/{line-2EN6ukkf.js → line-B77d8tio.js} +2 -2
  51. package/dist/{line-2EN6ukkf.js.map → line-B77d8tio.js.map} +1 -1
  52. package/dist/{mosaic-DUwBxfGg.js → mosaic-Bm1aKa0Q.js} +2 -2
  53. package/dist/{mosaic-DUwBxfGg.js.map → mosaic-Bm1aKa0Q.js.map} +1 -1
  54. package/dist/{multi-cog-B2kVLX90.js → multi-cog-D2ys9o3u.js} +2 -2
  55. package/dist/{multi-cog-B2kVLX90.js.map → multi-cog-D2ys9o3u.js.map} +1 -1
  56. package/dist/{mvt-q6iXzmEF.js → mvt-BUVHps3s.js} +2 -2
  57. package/dist/{mvt-q6iXzmEF.js.map → mvt-BUVHps3s.js.map} +1 -1
  58. package/dist/{path-CKCx5_Gi.js → path-CvxVK8wm.js} +2 -2
  59. package/dist/{path-CKCx5_Gi.js.map → path-CvxVK8wm.js.map} +1 -1
  60. package/dist/{point-cloud-C9zJxZDT.js → point-cloud-CSsO2nuJ.js} +2 -2
  61. package/dist/{point-cloud-C9zJxZDT.js.map → point-cloud-CSsO2nuJ.js.map} +1 -1
  62. package/dist/{polygon-DRpsvg1W.js → polygon-DAVE4LXH.js} +2 -2
  63. package/dist/{polygon-DRpsvg1W.js.map → polygon-DAVE4LXH.js.map} +1 -1
  64. package/dist/{quadkey-DfoG2hLL.js → quadkey-BAnxuF9T.js} +2 -2
  65. package/dist/{quadkey-DfoG2hLL.js.map → quadkey-BAnxuF9T.js.map} +1 -1
  66. package/dist/{s2-DlEDAkpJ.js → s2-Bv5MIwa9.js} +2 -2
  67. package/dist/{s2-DlEDAkpJ.js.map → s2-Bv5MIwa9.js.map} +1 -1
  68. package/dist/{scatterplot-B9zXE6Jf.js → scatterplot-aZig07ZM.js} +2 -2
  69. package/dist/{scatterplot-B9zXE6Jf.js.map → scatterplot-aZig07ZM.js.map} +1 -1
  70. package/dist/{scenegraph-BVXLw8Cw.js → scenegraph-WEtd4Tza.js} +2 -2
  71. package/dist/{scenegraph-BVXLw8Cw.js.map → scenegraph-WEtd4Tza.js.map} +1 -1
  72. package/dist/{screen-grid-Dgj0QdEI.js → screen-grid-Cp80FMUf.js} +2 -2
  73. package/dist/{screen-grid-Dgj0QdEI.js.map → screen-grid-Cp80FMUf.js.map} +1 -1
  74. package/dist/{simple-mesh-ypHRymUD.js → simple-mesh-DT1BC-Mz.js} +2 -2
  75. package/dist/{simple-mesh-ypHRymUD.js.map → simple-mesh-DT1BC-Mz.js.map} +1 -1
  76. package/dist/{solid-polygon-DyWHVxEO.js → solid-polygon-BxLiMNAC.js} +2 -2
  77. package/dist/{solid-polygon-DyWHVxEO.js.map → solid-polygon-BxLiMNAC.js.map} +1 -1
  78. package/dist/{terrain-D3LKaDfn.js → terrain-CPKUswLf.js} +2 -2
  79. package/dist/{terrain-D3LKaDfn.js.map → terrain-CPKUswLf.js.map} +1 -1
  80. package/dist/{text-C6lF4GFS.js → text-Qf7B4QNZ.js} +2 -2
  81. package/dist/{text-C6lF4GFS.js.map → text-Qf7B4QNZ.js.map} +1 -1
  82. package/dist/{tile-3d-DHzr5_s2.js → tile-3d-CbQInXbC.js} +2 -2
  83. package/dist/{tile-3d-DHzr5_s2.js.map → tile-3d-CbQInXbC.js.map} +1 -1
  84. package/dist/{tile-DqpbfgRL.js → tile-BxWRJ8QY.js} +2 -2
  85. package/dist/{tile-DqpbfgRL.js.map → tile-BxWRJ8QY.js.map} +1 -1
  86. package/dist/{trips-CchyX_8N.js → trips-CwzuAg1k.js} +2 -2
  87. package/dist/{trips-CchyX_8N.js.map → trips-CwzuAg1k.js.map} +1 -1
  88. package/dist/useDeckOverlay-CI56uIKH.js +2 -0
  89. package/dist/useDeckOverlay-CI56uIKH.js.map +1 -0
  90. package/dist/{wind-particle-Rs67QBQ9.js → wind-particle-D3y-A-W4.js} +2 -2
  91. package/dist/{wind-particle-Rs67QBQ9.js.map → wind-particle-D3y-A-W4.js.map} +1 -1
  92. package/dist/wind.js +1 -1
  93. package/dist/{wms-KlHzzqd3.js → wms-BEsf7XG6.js} +2 -2
  94. package/dist/{wms-KlHzzqd3.js.map → wms-BEsf7XG6.js.map} +1 -1
  95. package/dist/{zarr-Czf44Tqd.js → zarr-BWbq3Uwq.js} +2 -2
  96. package/dist/{zarr-Czf44Tqd.js.map → zarr-BWbq3Uwq.js.map} +1 -1
  97. package/package.json +12 -12
  98. package/dist/useDeckOverlay-GlkH_rvP.js +0 -2
  99. package/dist/useDeckOverlay-GlkH_rvP.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -465,12 +465,10 @@ type __VLS_Slots$7 = {} & {
465
465
  default?: (props: typeof __VLS_1$7) => any;
466
466
  };
467
467
  declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
468
- click: (...args: any[]) => void;
469
- mouseenter: (...args: any[]) => void;
470
- mouseleave: (...args: any[]) => void;
471
468
  touchcancel: (...args: any[]) => void;
472
469
  touchend: (...args: any[]) => void;
473
470
  touchstart: (...args: any[]) => void;
471
+ click: (...args: any[]) => void;
474
472
  contextmenu: (...args: any[]) => void;
475
473
  dblclick: (...args: any[]) => void;
476
474
  mousemove: (...args: any[]) => void;
@@ -478,13 +476,13 @@ declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {},
478
476
  mousedown: (...args: any[]) => void;
479
477
  mouseout: (...args: any[]) => void;
480
478
  mouseover: (...args: any[]) => void;
479
+ mouseenter: (...args: any[]) => void;
480
+ mouseleave: (...args: any[]) => void;
481
481
  }, string, import("vue").PublicProps, Readonly<__VLS_Props$3> & Readonly<{
482
- onClick?: ((...args: any[]) => any) | undefined;
483
- onMouseenter?: ((...args: any[]) => any) | undefined;
484
- onMouseleave?: ((...args: any[]) => any) | undefined;
485
482
  onTouchcancel?: ((...args: any[]) => any) | undefined;
486
483
  onTouchend?: ((...args: any[]) => any) | undefined;
487
484
  onTouchstart?: ((...args: any[]) => any) | undefined;
485
+ onClick?: ((...args: any[]) => any) | undefined;
488
486
  onContextmenu?: ((...args: any[]) => any) | undefined;
489
487
  onDblclick?: ((...args: any[]) => any) | undefined;
490
488
  onMousemove?: ((...args: any[]) => any) | undefined;
@@ -492,6 +490,8 @@ declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {},
492
490
  onMousedown?: ((...args: any[]) => any) | undefined;
493
491
  onMouseout?: ((...args: any[]) => any) | undefined;
494
492
  onMouseover?: ((...args: any[]) => any) | undefined;
493
+ onMouseenter?: ((...args: any[]) => any) | undefined;
494
+ onMouseleave?: ((...args: any[]) => any) | undefined;
495
495
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
496
496
  declare const __VLS_export$8: __VLS_WithSlots$7<typeof __VLS_base$7, __VLS_Slots$7>;
497
497
  declare const _default$16: typeof __VLS_export$8;
@@ -844,10 +844,6 @@ type __VLS_Slots$2 = {} & {
844
844
  default?: (props: typeof __VLS_3) => any;
845
845
  };
846
846
  declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
847
- dragstart: (...args: any[]) => void;
848
- drag: (...args: any[]) => void;
849
- dragend: (...args: any[]) => void;
850
- click: (...args: any[]) => void;
851
847
  loaded: (...args: any[]) => void;
852
848
  error: (...args: any[]) => void;
853
849
  load: (...args: any[]) => void;
@@ -874,6 +870,7 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
874
870
  touchmove: (...args: any[]) => void;
875
871
  touchend: (...args: any[]) => void;
876
872
  touchstart: (...args: any[]) => void;
873
+ click: (...args: any[]) => void;
877
874
  contextmenu: (...args: any[]) => void;
878
875
  dblclick: (...args: any[]) => void;
879
876
  mousemove: (...args: any[]) => void;
@@ -890,6 +887,9 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
890
887
  rotatestart: (...args: any[]) => void;
891
888
  rotate: (...args: any[]) => void;
892
889
  rotateend: (...args: any[]) => void;
890
+ dragstart: (...args: any[]) => void;
891
+ drag: (...args: any[]) => void;
892
+ dragend: (...args: any[]) => void;
893
893
  pitchstart: (...args: any[]) => void;
894
894
  pitch: (...args: any[]) => void;
895
895
  pitchend: (...args: any[]) => void;
@@ -898,10 +898,6 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
898
898
  cooperativegestureprevented: (...args: any[]) => void;
899
899
  projectiontransition: (...args: any[]) => void;
900
900
  }, string, import("vue").PublicProps, Readonly<__VLS_Props$2> & Readonly<{
901
- onDragstart?: ((...args: any[]) => any) | undefined;
902
- onDrag?: ((...args: any[]) => any) | undefined;
903
- onDragend?: ((...args: any[]) => any) | undefined;
904
- onClick?: ((...args: any[]) => any) | undefined;
905
901
  onLoaded?: ((...args: any[]) => any) | undefined;
906
902
  onError?: ((...args: any[]) => any) | undefined;
907
903
  onLoad?: ((...args: any[]) => any) | undefined;
@@ -928,6 +924,7 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
928
924
  onTouchmove?: ((...args: any[]) => any) | undefined;
929
925
  onTouchend?: ((...args: any[]) => any) | undefined;
930
926
  onTouchstart?: ((...args: any[]) => any) | undefined;
927
+ onClick?: ((...args: any[]) => any) | undefined;
931
928
  onContextmenu?: ((...args: any[]) => any) | undefined;
932
929
  onDblclick?: ((...args: any[]) => any) | undefined;
933
930
  onMousemove?: ((...args: any[]) => any) | undefined;
@@ -944,6 +941,9 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
944
941
  onRotatestart?: ((...args: any[]) => any) | undefined;
945
942
  onRotate?: ((...args: any[]) => any) | undefined;
946
943
  onRotateend?: ((...args: any[]) => any) | undefined;
944
+ onDragstart?: ((...args: any[]) => any) | undefined;
945
+ onDrag?: ((...args: any[]) => any) | undefined;
946
+ onDragend?: ((...args: any[]) => any) | undefined;
947
947
  onPitchstart?: ((...args: any[]) => any) | undefined;
948
948
  onPitch?: ((...args: any[]) => any) | undefined;
949
949
  onPitchend?: ((...args: any[]) => any) | undefined;
@@ -1017,8 +1017,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
1017
1017
  onOpen?: (() => any) | undefined;
1018
1018
  onClose?: (() => any) | undefined;
1019
1019
  }>, {
1020
- coordinates: LngLatLike;
1021
1020
  options: PopupOptions;
1021
+ coordinates: LngLatLike;
1022
1022
  marker: Marker;
1023
1023
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
1024
1024
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{n as e,r as t,t as n}from"./symbols-DXKzIgbY.js";import{a as r,i,t as a}from"./useDeckOverlay-GlkH_rvP.js";import{Fragment as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,defineComponent as f,inject as p,nextTick as m,normalizeClass as h,normalizeStyle as g,onBeforeUnmount as _,onMounted as v,onUnmounted as y,onUpdated as b,openBlock as x,provide as S,ref as C,renderList as w,renderSlot as T,shallowRef as E,toDisplayString as D,useSlots as O,watch as k,withCtx as A}from"vue";import j,{AttributionControl as M,FullscreenControl as N,GeolocateControl as P,Map as F,Marker as I,NavigationControl as L,Popup as R,ScaleControl as z}from"maplibre-gl";import{PMTiles as B,Protocol as V}from"pmtiles";const H=f({__name:`VControlAttribution`,props:{options:{default:void 0},position:{default:`bottom-right`}},setup(e){let r={compact:!1,customAttribution:void 0},i=e,a=O(),o=t(n);v(()=>{s()});let s=()=>{let e=r;i.options&&(e={...i.options}),a&&a.default?.()&&(e.customAttribution=a.default()[0].children);let t=new M(e);o.value.addControl(t,i.position)};return(e,t)=>T(e.$slots,`default`)}}),U=f({__name:`VControlFullscreen`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let r={container:void 0},i=e,a=t(n);v(()=>{o()});let o=()=>{let e=new N(i.options||r);a.value.addControl(e,i.position)};return()=>{}}}),W=[`geolocate`,`error`,`outofmaxbounds`,`trackuserlocationstart`,`trackuserlocationend`],G=f({__name:`VControlGeolocate`,props:{options:{default:void 0},position:{default:`top-left`}},emits:W,setup(e,{emit:r}){let i={fitBoundsOptions:{linear:!1,offset:[0,0],maxZoom:22},positionOptions:{enableHighAccuracy:!0,maximumAge:0,timeout:6e3},trackUserLocation:!0,showAccuracyCircle:!0,showUserLocation:!0},a=e,o=r,s=t(n);v(()=>{c()});let c=()=>{let e=new P(a.options||i);s.value.addControl(e,a.position),W.forEach(t=>{e.on(t,()=>{o(t)})})};return()=>{}}}),ee=f({__name:`VControlNavigation`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let t={showCompass:!0,showZoom:!0,visualizePitch:!0},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new L(r.options||t);i.value.addControl(e,r.position)};return()=>{}}}),te=f({__name:`VControlScale`,props:{options:{default:void 0},position:{default:`bottom-left`}},setup(e){let t={maxWidth:100,unit:`metric`},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new z(r.options||t);i?.value.addControl(e,r.position)};return(e,t)=>T(e.$slots,`default`)}});function K(e,t,n){let r=null,i=!1,a=()=>{i&&t.value&&!t.value.classList.contains(`maplibregl-ctrl`)&&t.value.classList.add(`maplibregl-ctrl`)};v(()=>{!e.value||!t.value||(r={onAdd:()=>(t.value?.classList.add(`maplibregl-ctrl`),t.value),onRemove:()=>{}},e.value.addControl(r,n),i=!0)}),b(()=>{a()}),y(()=>{if(e.value&&r)try{e.value.removeControl(r)}catch{}})}const ne={class:`v-layer-control-header`},re={class:`v-layer-control-title`},ie=[`aria-pressed`,`title`],ae={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},oe={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},se={class:`v-layer-control-slider-row`},ce=[`value`,`disabled`],le={class:`v-layer-control-value`},ue=f({__name:`VControlLayer`,props:{layerId:{},position:{default:`top-right`},visible:{type:Boolean,default:!0},opacity:{default:1},title:{default:`Layer Control`},layerType:{default:void 0}},emits:[`visibility-change`,`opacity-change`,`update:visible`,`update:opacity`],setup(e,{emit:r}){let i=e,o=r,s=t(n),c=p(a,null),l=C(null),f=C(i.visible),m=C(i.opacity);K(s,l,i.position);let g=()=>i.layerType?i.layerType:s.value?s.value.getLayer(i.layerId)?`maplibre`:c&&c.getLayers().find(e=>e.id===i.layerId)?`deckgl`:null:null,_=()=>{if(!s.value||g()!==`maplibre`)return null;let e=s.value.getLayer(i.layerId);if(!e)return null;switch(e.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;default:return null}},y=e=>{let t=g();if(t===`maplibre`){if(!s.value)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setLayoutProperty(i.layerId,`visibility`,e?`visible`:`none`)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({visible:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`visibility-change`,e),o(`update:visible`,e)},b=e=>{let t=g();if(t===`maplibre`){let t=_();if(!s.value||!t)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setPaintProperty(i.layerId,t,e)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({opacity:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`opacity-change`,e),o(`update:opacity`,e)},S=()=>{f.value=!f.value},w=e=>{let t=e.target;m.value=Number(t.value)/100};return k(f,e=>{y(e)}),k(m,e=>{b(e)}),k(()=>i.visible,e=>{f.value=e}),k(()=>i.opacity,e=>{m.value=e}),v(()=>{let e=!1,t=()=>e?!0:g()?(e=!0,y(f.value),b(m.value),!0):!1;if(t())return;let n=[100,200,300,500,500,1e3,1e3,1e3,2e3,3e3],r=0,i=()=>{t()||r>=n.length||setTimeout(()=>{r++,i()},n[r])};i()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:l,class:`v-layer-control`},[d(`div`,ne,[d(`span`,re,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-control-toggle`,{"is-hidden":!f.value}]),"aria-pressed":f.value,title:f.value?`Hide layer`:`Show layer`,onClick:S},[f.value?(x(),u(`svg`,ae,[...n[0]||(n[0]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,oe,[...n[1]||(n[1]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,ie)]),d(`div`,se,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(m.value*100),class:`v-layer-control-slider`,disabled:!f.value,onInput:w},null,40,ce),d(`span`,le,D(Math.round(m.value*100))+`%`,1)]),T(t.$slots,`default`)],512))}}),de={class:`v-layer-group-title`},fe={key:1,class:`v-layer-group-header is-static`},pe={class:`v-layer-group-title`},me={key:2,class:`v-layer-group-content`},he={class:`v-layer-group-item-header`},ge={class:`v-layer-group-item-title`},_e=[`aria-pressed`,`title`,`onClick`],ve={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},ye={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},be={class:`v-layer-group-slider-row`},xe=[`value`,`disabled`,`onInput`],Se={class:`v-layer-group-value`},Ce=f({__name:`VControlLayerGroup`,props:{layers:{},position:{default:`top-right`},title:{default:`Layers`},collapsible:{type:Boolean,default:!0},collapsed:{type:Boolean,default:!1}},emits:[`visibility-change`,`opacity-change`,`update:layers`],setup(e,{emit:r}){let i=e,s=r,c=t(n),f=p(a,null),m=C(null),g=C(i.collapsed),_=C(new Map);K(c,m,i.position);let y=()=>{for(let e of i.layers)_.value.set(e.id,{visible:e.visible??!0,opacity:e.opacity??1})},b=(e,t)=>t||(c.value?c.value.getLayer(e)?`maplibre`:f&&f.getLayers().find(t=>t.id===e)?`deckgl`:null:null),S=e=>{if(!c.value)return null;let t=c.value.getLayer(e);if(!t)return null;switch(t.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;case`raster`:return`raster-opacity`;default:return null}},E=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){if(!c.value)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setLayoutProperty(e,`visibility`,t?`visible`:`none`)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({visible:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`visibility-change`,{layerId:e,visible:t})},O=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){let n=S(e);if(!c.value||!n)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setPaintProperty(e,n,t)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({opacity:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`opacity-change`,{layerId:e,opacity:t})},A=e=>{let t=_.value.get(e.id);if(!t)return;let n=!t.visible;t.visible=n,E(e.id,n,e.type)},j=(e,t)=>{let n=t.target,r=Number(n.value)/100,i=_.value.get(e.id);i&&(i.opacity=r,O(e.id,r,e.type))},M=e=>_.value.get(e)??{visible:!0,opacity:1},N=()=>{i.collapsible&&(g.value=!g.value)};return k(()=>i.layers,()=>{y()},{deep:!0}),k(()=>i.collapsed,e=>{g.value=e}),v(()=>{y();for(let e of i.layers){let t=M(e.id);E(e.id,t.visible,e.type),O(e.id,t.opacity,e.type)}}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:m,class:h([`v-layer-group maplibregl-ctrl`,{"is-collapsed":g.value}])},[e.collapsible?(x(),u(`button`,{key:0,type:`button`,class:`v-layer-group-header`,onClick:N},[d(`span`,de,D(e.title),1),(x(),u(`svg`,{class:h([`v-layer-group-chevron`,{"is-collapsed":g.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))])):(x(),u(`div`,fe,[d(`span`,pe,D(e.title),1)])),g.value?l(`v-if`,!0):(x(),u(`div`,me,[(x(!0),u(o,null,w(e.layers,e=>(x(),u(`div`,{key:e.id,class:`v-layer-group-item`},[d(`div`,he,[d(`span`,ge,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-group-toggle`,{"is-hidden":!M(e.id).visible}]),"aria-pressed":M(e.id).visible,title:M(e.id).visible?`Hide layer`:`Show layer`,onClick:t=>A(e)},[M(e.id).visible?(x(),u(`svg`,ve,[...n[1]||(n[1]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,ye,[...n[2]||(n[2]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,_e)]),d(`div`,be,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(M(e.id).opacity*100),class:`v-layer-group-slider`,disabled:!M(e.id).visible,onInput:t=>j(e,t)},null,40,xe),d(`span`,Se,D(Math.round(M(e.id).opacity*100))+`%`,1)])]))),128))])),T(t.$slots,`default`)],2))}}),we={class:`v-legend-control-title`},Te={key:0,class:`v-legend-control-content`},Ee=[`disabled`,`onClick`],De={class:`v-legend-control-label`},Oe={key:0,class:`v-legend-control-count`},ke={class:`v-legend-control-gradient-labels`},Ae={class:`v-legend-control-size-circle-wrap`},je={class:`v-legend-control-label`},Me={key:3,class:`v-legend-control-table`},Ne=[`title`],Pe={class:`v-legend-control-table-label`},Fe={class:`v-legend-control-table-value`},Ie=f({__name:`VControlLegend`,props:{layerIds:{},type:{default:`category`},items:{},position:{default:`top-right`},property:{},autoGenerate:{type:Boolean,default:!1},title:{default:`Legend`},collapsed:{type:Boolean,default:!1},interactive:{type:Boolean,default:!0}},emits:[`item-click`,`filter-change`,`update:filter`],setup(e,{emit:r}){let i=e,c=r,f=t(n),m=p(a,null),_=C(null),y=C(i.collapsed),b=C(new Map),S=C([]);K(f,_,i.position);let E=e=>{let t=[],n=e[e.length-1];for(let n=2;n<e.length-1;n+=2){let r=e[n],i=e[n+1];if(Array.isArray(r))for(let e of r)t.push({value:e,label:String(e),color:i,visible:!0});else t.push({value:r,label:String(r),color:i,visible:!0})}return t.length>0&&n&&typeof n==`string`&&t.push({value:`__default__`,label:`Other`,color:n,visible:!0}),t},O=e=>{let t=[],n=[],r=e[2];t.push(r);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length===0?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},A=e=>{let t=[],n=[];e[1]&&Array.isArray(e[1]);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length<2?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},j=()=>{if(!i.autoGenerate||!i.property||!f.value)return[];let e=i.layerIds[0];if(!e)return[];if(!f.value.getLayer(e))return console.warn(`[VControlLegend] Layer not found: ${e}`),[];let t=f.value.getPaintProperty(e,i.property);if(!t||!Array.isArray(t))return console.warn(`[VControlLegend] Paint property "${i.property}" not found or not an expression`),[];let n=t[0];if(n===`match`)return E(t);if(n===`step`){let e=O(t);return e?[e]:[]}if(n===`interpolate`||n===`interpolate-hcl`||n===`interpolate-lab`){let e=A(t);return e?[e]:[]}return console.warn(`[VControlLegend] Unsupported expression type: ${n}`),[]},M=s(()=>i.items&&i.items.length>0?i.items:S.value),N=s(()=>i.type===`category`?M.value.filter(e=>`value`in e&&`color`in e&&`label`in e):[]),P=s(()=>{if(i.type!==`gradient`)return null;let e=M.value;if(e.length===0)return null;let t=e[0];return`min`in t&&`max`in t&&`colors`in t?t:null}),F=s(()=>i.type===`size`?M.value.filter(e=>`size`in e&&`value`in e):[]),I=s(()=>i.type===`table`?M.value.filter(e=>`label`in e&&`color`in e&&`value`in e&&!(`size`in e)&&!(`visible`in e)).sort((e,t)=>t.value-e.value):[]),L=e=>e.formattedValue?e.formattedValue:`${e.value}${e.unit??``}`,R=s(()=>({visibleValues:Array.from(b.value.entries()).filter(([,e])=>e).map(([e])=>e)})),z=s(()=>P.value?`linear-gradient(to right, ${P.value.colors.join(`, `)})`:``),B=()=>{if(i.type===`category`)for(let e of N.value)b.value.set(e.value,e.visible??!0)},V=()=>{if(!f.value||!i.property||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length;for(let t of i.layerIds)if(f.value.getLayer(t))if(n)f.value.setFilter(t,null);else if(e.length===0)f.value.setFilter(t,[`==`,[`get`,`_never_match_`],!0]);else{let n=f.value.getPaintProperty(t,i.property);if(!n||!Array.isArray(n))continue;let r=n[1],a=null;Array.isArray(r)&&r[0]===`get`&&(a=r[1]),a&&f.value.setFilter(t,[`in`,[`get`,a],[`literal`,e]])}},H=()=>{if(!m||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length,r=m.getLayers();for(let t of i.layerIds){if(f.value?.getLayer(t))continue;let i=r.find(e=>e.id===t);if(i){if(!i.props?.extensions?.some(e=>e?.constructor?.name===`DataFilterExtension`)){console.warn(`[VControlLegend] deck.gl layer "${t}" requires DataFilterExtension for filtering. Add DataFilterExtension to layer extensions and configure getFilterValue accessor.`);continue}if(typeof i.clone==`function`)if(n){let e=i.clone({filterRange:[-1/0,1/0]});m.updateLayer(t,e)}else if(e.length===0){let e=i.clone({filterRange:[1/0,1/0]});m.updateLayer(t,e)}else{let n=e.map(e=>N.value.findIndex(t=>t.value===e)).filter(e=>e>=0);if(n.length>0){let e=Math.min(...n),r=Math.max(...n),a=i.clone({filterRange:[e-.5,r+.5]});m.updateLayer(t,a)}}}}},U=(e,t)=>{if(!i.interactive)return;let n=!(b.value.get(e.value)??!0);b.value.set(e.value,n),V(),H(),c(`item-click`,{item:e,index:t,visible:n}),c(`filter-change`,{filter:R.value,layerIds:i.layerIds}),c(`update:filter`,R.value)},W=e=>b.value.get(e.value)??!0,G=()=>{y.value=!y.value};return k(()=>i.items,()=>{B()},{deep:!0}),k(()=>i.collapsed,e=>{y.value=e}),v(()=>{i.autoGenerate&&(S.value=j()),B()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:_,class:h([`v-legend-control`,{"is-collapsed":y.value}])},[d(`button`,{type:`button`,class:`v-legend-control-header`,onClick:G},[d(`span`,we,D(e.title),1),(x(),u(`svg`,{class:h([`v-legend-control-chevron`,{"is-collapsed":y.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))]),y.value?l(`v-if`,!0):(x(),u(`div`,Te,[e.type===`category`?(x(!0),u(o,{key:0},w(N.value,(t,n)=>(x(),u(`button`,{key:t.value,type:`button`,class:h([`v-legend-control-item`,{"is-interactive":e.interactive,"is-hidden":!W(t)}]),disabled:!e.interactive,onClick:e=>U(t,n)},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:t.color})},null,4),d(`span`,De,D(t.label),1),t.count===void 0?l(`v-if`,!0):(x(),u(`span`,Oe,D(t.count),1))],10,Ee))),128)):e.type===`gradient`&&P.value?(x(),u(o,{key:1},[d(`div`,{class:`v-legend-control-gradient`,style:g({background:z.value})},null,4),d(`div`,ke,[d(`span`,null,D(P.value.minLabel??P.value.min),1),d(`span`,null,D(P.value.maxLabel??P.value.max),1)])],64)):e.type===`size`?(x(!0),u(o,{key:2},w(F.value,e=>(x(),u(`div`,{key:e.value,class:`v-legend-control-size-item`},[d(`div`,Ae,[d(`div`,{class:`v-legend-control-size-circle`,style:g({width:`${Math.min(e.size,20)}px`,height:`${Math.min(e.size,20)}px`})},null,4)]),d(`span`,je,D(e.label),1)]))),128)):e.type===`table`?(x(),u(`div`,Me,[(x(!0),u(o,null,w(I.value,e=>(x(),u(`div`,{key:e.label,class:`v-legend-control-table-row`,title:e.description},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:e.color})},null,4),d(`span`,Pe,D(e.label),1),d(`span`,Fe,D(L(e)),1)],8,Ne))),128))])):l(`v-if`,!0)])),T(t.$slots,`default`)],2))}}),Le=f({__name:`VLayerMaplibreCanvas`,props:{source:{},layer:{},sourceId:{default:`maplibre.gl-canvas-source`},layerId:{default:`maplibre.gl-canvas-layer`},before:{default:``}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Canvas layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}catch(e){console.error(`Error updating Canvas source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Canvas layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Canvas layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Re=f({__name:`VLayerMaplibreGeojson`,props:{sourceId:{default:`maplibre-gl-geojson-source`},layerId:{default:`maplibre-gl-geojson-layer`},source:{},layer:{},before:{default:``}},emits:[`on-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=e=>!e||typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e?e.type===`FeatureCollection`&&`features`in e?e.features.length>0:e.type===`Feature`||e.type===`Point`||e.type===`LineString`||e.type===`Polygon`||e.type===`MultiPoint`||e.type===`MultiLineString`||e.type===`MultiPolygon`:!1,c=()=>o.value||null,l=C(!1),u=null,d=null,f=null,p=()=>{if(l.value)return!0;let e=c();if(!e||!e.isStyleLoaded()||!s(i.source.data))return!1;try{if(e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),!e.getLayer(i.layerId)){let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}return x(e),l.value=!0,!0}catch(e){return console.error(`Error adding GeoJSON layer:`,e),!1}},h=e=>{u!==e&&(g(),u=e,d=()=>{p()},e.on(`style.load`,d),f=()=>{if(l.value){f&&u&&u.off(`idle`,f),f=null;return}p()},e.on(`idle`,f),p())},g=()=>{u&&(d&&u.off(`style.load`,d),f&&u.off(`idle`,f)),u=null,d=null,f=null},y=()=>{let e=c();if(e)try{let t=e.getSource(i.sourceId);if(t&&`setData`in t){let n=e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId);(n.length===0||n[0]?.id===i.layerId)&&t.setData(i.source.data)}else t||p()}catch(e){console.error(`Error updating GeoJSON source:`,e)}},b=()=>{let e=c();if(e)try{e.getLayer(i.layerId)?(Object.entries(i.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(i.layerId,t,n)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(i.layerId,t,n)})):p()}catch(e){console.error(`Error updating GeoJSON layer:`,e)}},x=e=>{if(e)try{e.on(`click`,i.layerId,e=>{e.features&&e.features.length>0&&a(`on-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`mouseenter`,i.layerId,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,i.layerId,()=>{e.getCanvas().style.cursor=``})}catch(e){console.error(`Error in setupLayerEvents:`,e)}};return k(o,e=>{e?h(e):(g(),l.value=!1)},{immediate:!0}),k(()=>i.source.data,(e,t)=>{if(s(e)){if(!l.value){let e=c();e&&!u?h(e):p();return}JSON.stringify(e)!==JSON.stringify(t)&&y()}}),k(()=>i.layer,b,{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=c();if(!t||!t.isStyleLoaded())return;let n=t.getLayer(i.layerId);if(!n&&e===`visible`)s(i.source.data)&&p();else if(n)try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`Error updating visibility for ${i.layerId}:`,e)}},{immediate:!0}),v(()=>{m(()=>{p()})}),_(()=>{g();let e=c();if(e)try{e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId).length===0&&e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up GeoJSON layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),ze=f({__name:`VLayerMaplibreImage`,props:{sourceId:{type:String,default:`maplibre.gl-image-source`,required:!0},layerId:{type:String,default:`maplibre.gl-image-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Image layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t)if(t.updateImage)t.updateImage({url:r.source.url,coordinates:r.source.coordinates});else{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}}catch(e){console.error(`Error updating Image source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Image layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Image layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),q=f({__name:`VLayerMaplibreRaster`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),e.getLayer(r.layerId)||(e.addLayer(r.layer,r.before),r.layer.layout?.visibility&&e.setLayoutProperty(r.layerId,`visibility`,r.layer.layout.visibility)),o.value=!0,!0}catch(e){return console.error(`[${r.layerId}] Error setting up layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null},p=()=>{let e=a();if(e)try{let t=r.before;e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,type:`raster`,source:r.sourceId};t&&e.getLayer(t)?e.addLayer(n,t):e.addLayer(n)}catch(e){console.error(`Error updating Raster source:`,e)}};return k(()=>r.source.tiles?.[0],(e,t)=>{e!==t&&p()}),k(()=>r.layer,()=>{let e=a();if(e)try{if(e.getLayer(r.layerId)){let t=r.layer.paint||{};Object.entries(t).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)});let n=r.layer.layout||{};Object.entries(n).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)})}}catch(e){console.error(`Error updating Raster layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),k(()=>r.layer.layout?.visibility,e=>{let t=a();if(t)if(t.getLayer(r.layerId))try{t.setLayoutProperty(r.layerId,`visibility`,e),e===`visible`&&r.before&&t.moveLayer(r.layerId,r.before)}catch(e){console.error(`[${r.layerId}] Error updating visibility:`,e)}else try{t.addLayer(r.layer,r.before)}catch(e){console.error(`[${r.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>r.before,e=>{let t=a();if(!(!t||!t.getLayer(r.layerId))&&r.layer.layout?.visibility===`visible`)try{console.log(`[${r.layerId}] Moving layer before:`,e),t.moveLayer(r.layerId,e)}catch(e){console.error(`[${r.layerId}] Error moving layer:`,e)}}),v(()=>{u()}),_(()=>{f()}),(e,t)=>T(e.$slots,`default`)}}),J=[`click`,`dblclick`,`mousedown`,`mouseup`,`mousemove`,`mouseenter`,`mouseleave`,`mouseover`,`mouseout`,`contextmenu`,`touchstart`,`touchend`,`touchcancel`],Y=`error.load.idle.remove.render.resize.webglcontextlost.webglcontextrestored.dataloading.data.tiledataloading.sourcedataloading.styledataloading.sourcedata.styledata.boxzoomcancel.boxzoomstart.boxzoomend.touchcancel.touchmove.touchend.touchstart.click.contextmenu.dblclick.mousemove.mouseup.mousedown.mouseout.mouseover.movestart.move.moveend.zoomstart.zoom.zoomend.rotatestart.rotate.rotateend.dragstart.drag.dragend.pitchstart.pitch.pitchend.wheel`.split(`.`),X=[`dragstart`,`drag`,`dragend`],Z=[`click`,`mouseenter`,`mouseleave`],Q=[`open`,`close`],Be=f({__name:`VLayerMaplibreVector`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},emits:[...J],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=()=>o.value||null,c=C(!1),l=null,u=null,d=null,f=()=>{if(c.value)return!0;let e=s();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),e.getLayer(i.layerId)||(i.layer.layout?.visibility===`visible`?e.addLayer(i.layer,i.before):e.addLayer(i.layer)),y(e),c.value=!0,!0}catch(e){return console.error(`[${i.layerId}] Error setting up layer:`,e),!1}},p=e=>{l!==e&&(m(),l=e,u=()=>{f()},e.on(`style.load`,u),d=()=>{if(c.value){d&&l&&l.off(`idle`,d),d=null;return}f()},e.on(`idle`,d),f())},m=()=>{l&&(u&&l.off(`style.load`,u),d&&l.off(`idle`,d)),l=null,u=null,d=null},h=()=>{let e=s();if(e)try{let t=e.getSource(i.sourceId);if(t&&JSON.stringify(t.serialize())!==JSON.stringify(i.source)){e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.removeSource(i.sourceId),e.addSource(i.sourceId,i.source);let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}}catch(e){console.error(`Error updating vector source:`,e)}},g=()=>{let e=s();if(e)try{if(e.getLayer(i.layerId)){let t=e.getLayer(i.layerId),n=t?.paint||{},r=t?.layout||{};Object.entries(i.layer.paint||{}).forEach(([t,r])=>{JSON.stringify(n[t])!==JSON.stringify(r)&&e.setPaintProperty(i.layerId,t,r)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{JSON.stringify(r[t])!==JSON.stringify(n)&&e.setLayoutProperty(i.layerId,t,n)})}}catch(e){console.error(`Error updating vector layer:`,e)}},y=e=>{if(e)try{J.forEach(t=>{e.on(t,i.layerId,n=>{t===`mousemove`&&(e.getCanvas().style.cursor=`pointer`),t===`mouseleave`&&(e.getCanvas().style.cursor=``),a(t,n)})})}catch(e){console.error(`Error setting up layer events:`,e)}};return k(o,e=>{e?p(e):(m(),c.value=!1)},{immediate:!0}),k(()=>JSON.stringify(i.source.tiles),(e,t)=>{e!==t&&h()}),k(()=>({paint:i.layer.paint,layout:i.layer.layout?{...i.layer.layout,visibility:void 0}:void 0}),(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&g()},{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e),e===`visible`&&i.before&&setTimeout(()=>{t.moveLayer(i.layerId,i.before)},0)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>i.before,e=>{let t=s();if(!(!t||!t.getLayer(i.layerId))&&i.layer.layout?.visibility===`visible`)try{t.moveLayer(i.layerId,e)}catch(e){console.error(`Error reordering vector layer ${i.layerId}:`,e)}}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),v(()=>{f()}),_(()=>{m()}),(e,t)=>T(e.$slots,`default`)}}),Ve=f({__name:`VLayerMaplibreVideo`,props:{sourceId:{type:String,default:`maplibre.gl-video-source`,required:!0},layerId:{type:String,default:`maplibre.gl-video-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Video layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t){e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,source:r.sourceId};if(e.addLayer(n,r.before),t.getVideo){let e=t.getVideo();e&&e.play().catch(e=>{console.error(`Error playing video:`,e)})}}}catch(e){console.error(`Error updating Video source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Video layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t?.getVideo){let e=t.getVideo();e&&(e.pause(),e.remove())}e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Video layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),He=f({__name:`VLayerMaplibrePmtile`,props:{sourceId:{type:String,default:`maplibre.gl-pmtile-source`,required:!0},layerId:{type:String,default:`maplibre.gl-pmtile-layer`,required:!0},url:{type:String,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(t){let n=t,r=p(e);if(!r)throw Error(`Protocol not provided`);let i=C({type:`raster`,url:`pmtiles://${n.url}`,tileSize:512,volatile:!0});return v(async()=>{let e=new B(n.url);r.add(e)}),(e,n)=>(x(),c(q,{"source-id":t.sourceId,"layer-id":t.layerId,source:i.value,layer:{...t.layer,type:`raster`},before:t.before},null,8,[`source-id`,`layer-id`,`source`,`layer`,`before`]))}}),Ue=f({__name:`VLayerMaplibreCluster`,props:{sourceId:{default:`cluster-source`},baseLayerId:{default:`cluster`},source:{},visibility:{type:Boolean,default:!0},clusterPaint:{default:()=>({colors:[`#51bbd6`,`#f1f075`,`#f28cb1`],radii:[20,30,40],breakpoints:[100,750]})},unclusteredPaint:{default:()=>({color:`#51bbd6`,radius:6})},textPaint:{default:()=>({color:`#ffffff`,font:[`DIN Offc Pro Medium`,`Arial Unicode MS Bold`],size:12})}},emits:[`cluster-click`,`point-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.baseLayerId}-clusters`),u=s(()=>`${i.baseLayerId}-cluster-count`),d=s(()=>`${i.baseLayerId}-unclustered-point`),f=()=>o.value||null,p=e=>typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e&&e.type===`FeatureCollection`&&`features`in e?e.features.length>0:!1,m=()=>{let e=f();if(!(!e||!e.isStyleLoaded()))try{if(!e.getSource(i.sourceId))console.log(`Adding clustered source: ${i.sourceId}`),e.addSource(i.sourceId,{...i.source,cluster:!0,clusterMaxZoom:14,clusterRadius:50});else{let t=e.getSource(i.sourceId);t&&`setData`in t&&t.setData(i.source.data)}e.getLayer(l.value)||(console.log(`Adding clusters layer: ${l.value}`),e.addLayer({id:l.value,type:`circle`,source:i.sourceId,filter:[`has`,`point_count`],paint:{"circle-color":[`step`,[`get`,`point_count`],i.clusterPaint.colors[0],i.clusterPaint.breakpoints[0],i.clusterPaint.colors[1],i.clusterPaint.breakpoints[1],i.clusterPaint.colors[2]],"circle-radius":[`step`,[`get`,`point_count`],i.clusterPaint.radii[0],i.clusterPaint.breakpoints[0],i.clusterPaint.radii[1],i.clusterPaint.breakpoints[1],i.clusterPaint.radii[2]],"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.9},layout:{visibility:i.visibility?`visible`:`none`}})),e.getLayer(u.value)||(console.log(`Adding cluster count layer: ${u.value}`),e.addLayer({id:u.value,type:`symbol`,source:i.sourceId,filter:[`has`,`point_count`],layout:{"text-field":`{point_count_abbreviated}`,"text-font":i.textPaint.font,"text-size":i.textPaint.size,visibility:i.visibility?`visible`:`none`},paint:{"text-color":i.textPaint.color}})),e.getLayer(d.value)||(console.log(`Adding unclustered points layer: ${d.value}`),e.addLayer({id:d.value,type:`circle`,source:i.sourceId,filter:[`!`,[`has`,`point_count`]],paint:{"circle-color":i.unclusteredPaint.color,"circle-radius":i.unclusteredPaint.radius,"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.95},layout:{visibility:i.visibility?`visible`:`none`}})),console.log(`All cluster layers added for ${i.baseLayerId}`),y(e)}catch(e){console.error(`Error adding cluster layers:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(i.sourceId);t&&`setData`in t?(console.log(`Updating source ${i.sourceId} with data`),t.setData(i.source.data),setTimeout(()=>{m()},100)):t||m()}catch(e){console.error(`Error updating source:`,e)}},g=e=>{let t=f();if(!t)return;let n=e?`visible`:`none`;[l.value,u.value,d.value].forEach(e=>{t.getLayer(e)&&t.setLayoutProperty(e,`visibility`,n)})},y=e=>{if(e)try{e.on(`click`,l.value,e=>{e.features&&e.features.length>0&&a(`cluster-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`point-click`,{features:e.features,coordinates:e.lngLat})}),[l.value,d.value].forEach(t=>{e.on(`mouseenter`,t,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,t,()=>{e.getCanvas().style.cursor=``})})}catch(e){console.error(`Error setting up layer events:`,e)}},b=e=>{e&&(e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?(c.value=!0,p(i.source.data)&&m()):(c.value=!1,setTimeout(t,200))};t()}),e.isStyleLoaded()&&(c.value=!0,p(i.source.data)&&m()))};return k(()=>i.source.data,e=>{if(p(e)){let e=f();e?.isStyleLoaded()&&(e.getSource(i.sourceId)?h():m())}},{deep:!0,immediate:!0}),k(()=>i.visibility,g),k(o,e=>{e&&b(e)},{immediate:!0}),v(()=>{f()?.isStyleLoaded()&&p(i.source.data)&&m()}),_(()=>{let e=f();if(e)try{[l.value,d.value].forEach(t=>{e.off(`click`,t,()=>{}),e.off(`mouseenter`,t,()=>{}),e.off(`mouseleave`,t,()=>{})}),[l.value,u.value,d.value].forEach(t=>{e.getLayer(t)&&e.removeLayer(t)}),e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up cluster layers:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),We=f({__name:`VLayerMaplibreRoute`,props:{id:{default:()=>`route-${Math.random().toString(36).slice(2,9)}`},coordinates:{},color:{default:`#4285F4`},width:{default:4},opacity:{default:1},lineCap:{default:`round`},lineJoin:{default:`round`},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},dashArray:{},blur:{default:0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.id}-source`),u=s(()=>`${i.id}-layer`),d=s(()=>({type:`FeatureCollection`,features:i.coordinates.length>=2?[{type:`Feature`,properties:{},geometry:{type:`LineString`,coordinates:i.coordinates}}]:[]})),f=()=>o.value||null,p=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},m=()=>{let e=f();if(!(!e||!e.isStyleLoaded())&&!(i.coordinates.length<2))try{if(e.getSource(l.value)||e.addSource(l.value,{type:`geojson`,data:d.value}),!e.getLayer(u.value)){let t={id:u.value,type:`line`,source:l.value,layout:{"line-cap":i.lineCap,"line-join":i.lineJoin,visibility:i.visible?`visible`:`none`},paint:{"line-color":i.color,"line-width":i.width,"line-opacity":i.opacity,...i.blur>0&&{"line-blur":i.blur},...i.dashArray&&{"line-dasharray":i.dashArray}}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding route layer:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(l.value);t&&`setData`in t?t.setData(d.value):!t&&i.coordinates.length>=2&&m()}catch(e){console.error(`Error updating route source:`,e)}},g=()=>{let e=f();if(!(!e||!e.getLayer(u.value)))try{e.setPaintProperty(u.value,`line-color`,i.color),e.setPaintProperty(u.value,`line-width`,i.width),e.setPaintProperty(u.value,`line-opacity`,i.opacity),i.blur>0&&e.setPaintProperty(u.value,`line-blur`,i.blur),i.dashArray&&e.setPaintProperty(u.value,`line-dasharray`,i.dashArray),e.setLayoutProperty(u.value,`line-cap`,i.lineCap),e.setLayoutProperty(u.value,`line-join`,i.lineJoin),e.setLayoutProperty(u.value,`visibility`,i.visible?`visible`:`none`)}catch(e){console.error(`Error updating route layer style:`,e)}},y=e=>{if(!(!e||!i.interactive))try{e.on(`click`,u.value,e=>{a(`click`,{coordinates:e.lngLat})}),e.on(`mouseenter`,u.value,()=>{e.getCanvas().style.cursor=`pointer`,a(`mouseenter`)}),e.on(`mouseleave`,u.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up route layer events:`,e)}};return k(()=>i.coordinates,()=>{let e=f();e?.isStyleLoaded()&&(e.getSource(l.value)?h():m())},{deep:!0}),k(()=>[i.color,i.width,i.opacity,i.lineCap,i.lineJoin,i.visible,i.blur,i.dashArray],()=>g(),{deep:!0}),k(o,e=>{e&&(p(e),e.isStyleLoaded()&&(c.value=!0))},{immediate:!0}),k(c,e=>{if(e&&i.coordinates.length>=2){let e=f();e&&(m(),y(e))}}),v(()=>{try{let e=f();e?.isStyleLoaded()&&i.coordinates.length>=2&&(m(),y(e))}catch(e){console.error(`Error mounting route layer:`,e)}}),_(()=>{let e=f();if(e)try{e.getLayer(u.value)&&e.removeLayer(u.value),e.getSource(l.value)&&e.removeSource(l.value)}catch(e){console.error(`Error cleaning up route layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Ge=f({__name:`VLayerMaplibreIsochrone`,props:{id:{default:()=>`isochrone-${Math.random().toString(36).slice(2,9)}`},data:{},fillOpacity:{default:.4},lineWidth:{default:2},lineOpacity:{default:.8},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},reverseOrder:{type:Boolean,default:!0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=C(!1),u=s(()=>`${i.id}-source`),d=s(()=>`${i.id}-fill`),f=s(()=>`${i.id}-line`),p=s(()=>!i.data||!i.data.features||i.data.features.length===0?null:{type:`FeatureCollection`,features:(i.reverseOrder?[...i.data.features].reverse():i.data.features).map(e=>({...e,properties:{...e.properties,fillColor:e.properties.color.startsWith(`#`)?e.properties.color:`#${e.properties.color}`}}))}),h=()=>o.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},y=()=>{let e=h();if(!e||!e.isStyleLoaded())return;let t=p.value;if(t)try{if(e.getSource(u.value)||e.addSource(u.value,{type:`geojson`,data:t}),!e.getLayer(d.value)){let t={id:d.value,type:`fill`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"fill-color":[`get`,`fillColor`],"fill-opacity":i.fillOpacity}};e.addLayer(t,i.before||void 0)}if(!e.getLayer(f.value)){let t={id:f.value,type:`line`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"line-color":[`get`,`fillColor`],"line-width":i.lineWidth,"line-opacity":i.lineOpacity}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding isochrone layers:`,e)}},b=()=>{let e=h();if(e)try{let t=e.getSource(u.value),n=p.value;t&&`setData`in t?n&&t.setData(n):!t&&n&&y()}catch(e){console.error(`Error updating isochrone source:`,e)}},x=()=>{let e=h();if(e)try{e.getLayer(d.value)&&(e.setPaintProperty(d.value,`fill-opacity`,i.fillOpacity),e.setLayoutProperty(d.value,`visibility`,i.visible?`visible`:`none`)),e.getLayer(f.value)&&(e.setPaintProperty(f.value,`line-width`,i.lineWidth),e.setPaintProperty(f.value,`line-opacity`,i.lineOpacity),e.setLayoutProperty(f.value,`visibility`,i.visible?`visible`:`none`))}catch(e){console.error(`Error updating isochrone layer style:`,e)}},S=e=>{if(!(!e||!i.interactive))try{e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`click`,{feature:e.features[0],coordinates:e.lngLat})}),e.on(`mouseenter`,d.value,t=>{e.getCanvas().style.cursor=`pointer`,t.features&&t.features.length>0&&a(`mouseenter`,t.features[0])}),e.on(`mouseleave`,d.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up isochrone layer events:`,e)}},w=async()=>{if(l.value)return;let e=h();!e||!e.isStyleLoaded()||p.value&&(await m(),!l.value&&(y(),S(e),l.value=!0))};return k(()=>i.data,()=>{let e=h();e?.isStyleLoaded()&&(e.getSource(u.value)?b():y())},{deep:!0}),k(()=>[i.fillOpacity,i.lineWidth,i.lineOpacity,i.visible],()=>x(),{deep:!0}),k(c,e=>{e&&w()}),k(o,e=>{e&&(g(e),e.isStyleLoaded()&&(c.value=!0,w()))},{immediate:!0}),v(()=>{m(()=>{w()})}),_(()=>{let e=h();if(e)try{e.getLayer(f.value)&&e.removeLayer(f.value),e.getLayer(d.value)&&e.removeLayer(d.value),e.getSource(u.value)&&e.removeSource(u.value)}catch(e){console.error(`Error cleaning up isochrone layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}});var Ke=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const qe=[`id`];var $=Ke(f({__name:`VMap`,props:{options:{default:()=>({container:`map`})},supportPmtiles:{type:Boolean,default:!1},projection:{default:`mercator`}},emits:[`loaded`,...Y],setup(t,{emit:r}){let a=t,o=r;if(a.supportPmtiles){let t=new V({metadata:!0});j.addProtocol(`pmtiles`,t.tile),S(e,t)}let s=E(null),c=C(!1),d=C(Y);S(n,s),i(s,{globe:a.projection===`globe`}),v(()=>{s.value=new F(a.options),c.value=!0,f()});let f=()=>{s.value&&d.value.forEach(e=>{s.value?.on(e,t=>{switch(e){case`load`:o(`loaded`,s.value);break;default:o(e,t);break}})})};return(e,n)=>(x(),u(`div`,{id:`${t.options?.container}`,class:`v-map-container`},[c.value?T(e.$slots,`default`,{key:0},()=>[T(e.$slots,`default`,{},void 0,!0)],!0):l(`v-if`,!0)],8,qe))}}),[[`__scopeId`,`data-v-2632eb0f`]]);const Je=[`id`],Ye=f({__name:`VPopup`,props:{options:{default:()=>({})},coordinates:{default:()=>({})},marker:{default:()=>({})}},emits:[`added`,`removed`,`open`,`close`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=new R(i.options),c=C(!0),l=C(null),d=()=>o.value||null,f=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},p=()=>{try{l.value&&s.setDOMContent(l.value)}catch(e){console.error(`Error setting popup content:`,e)}},m=()=>{try{s.setLngLat(i.coordinates)}catch(e){console.error(`Error setting popup coordinates:`,e)}},h=()=>{let e=d();if(e)try{`setPopup`in i.marker?i.marker.setPopup(s):s.addTo(e),a(`added`,{popup:s})}catch(e){console.error(`Error adding popup to marker:`,e)}},g=()=>{try{s.remove(),a(`removed`)}catch(e){console.error(`Error removing popup:`,e)}},y=()=>{try{Q.forEach(e=>{s.on(e,()=>{a(e)})})}catch(e){console.error(`Error setting up popup events:`,e)}},b=()=>{try{Q.forEach(e=>{s.off(e,()=>{a(e)})})}catch(e){console.error(`Error removing popup events:`,e)}};return k(o,e=>{e&&f(e)},{immediate:!0}),k(()=>i.coordinates,()=>{m()},{deep:!0}),v(()=>{if(c.value)try{p(),m(),h(),y()}catch(e){console.error(`Error initializing popup:`,e)}else g(),b()}),_(()=>{g(),b()}),(e,t)=>(x(),u(`section`,{id:`popup-${Date.now()}`,ref_key:`content`,ref:l},[T(e.$slots,`default`)],8,Je))}}),Xe=[`id`],Ze=f({__name:`VMarker`,props:{coordinates:{},options:{default:()=>({})},popupOptions:{default:()=>({})},cursor:{default:`pointer`}},emits:[`added`,`update:coordinates`,`removed`,...X,...Z],setup(e,{emit:r}){let i=O(),a=e,o=r,s=t(n),d=C(null),f=C(!0),p=C(!1),m=C(null),h=()=>s.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?f.value=!0:(f.value=!1,setTimeout(t,200))};t()})},y=e=>{e instanceof HTMLElement&&(m.value=e)},b=e=>{try{e.setLngLat(a.coordinates)}catch(e){console.error(`Error setting marker coordinates:`,e)}},S=e=>{try{e.getElement().style.cursor=a.cursor||`default`}catch(e){console.error(`Error setting cursor:`,e)}},w=e=>{let t=h();if(t)try{e.addTo(t),o(`added`,{marker:e})}catch(e){console.error(`Error adding marker to map:`,e)}},E=e=>{try{e.remove(),o(`removed`)}catch(e){console.error(`Error removing marker from map:`,e)}},D=e=>{try{let t;X.forEach(n=>{e.on(n,e=>{n===`dragend`&&(t=Array.isArray(a.coordinates)?[e.target.getLngLat().lng,e.target.getLngLat().lat]:e.target.getLngLat(),o(`update:coordinates`,t)),o(n,e)})}),Z.forEach(t=>{e.getElement().addEventListener(t,e=>{o(t,e)})})}catch(e){console.error(`Error setting up marker events:`,e)}};k(d,e=>{p.value=e!==null&&`_map`in e}),k(s,e=>{e&&g(e)},{immediate:!0});let j=e=>{if(!(!f.value||d.value))try{d.value=new I({...a.options,element:e||void 0}),b(d.value),w(d.value),S(d.value),D(d.value)}catch(e){console.error(`Error initializing marker:`,e)}};return k(m,e=>{e&&!d.value&&j(e)}),v(()=>{i.markers||j()}),_(()=>{d.value&&E(d.value)}),(t,n)=>(x(),u(`section`,{id:`marker-${Date.now()}`,class:`absolute`},[T(t.$slots,`markers`,{setRef:y}),p.value&&t.$slots.default?(x(),c(Ye,{key:0,marker:d.value,options:e.popupOptions,coordinates:e.coordinates},{default:A(()=>[T(t.$slots,`default`)]),_:3},8,[`marker`,`options`,`coordinates`])):l(`v-if`,!0)],8,Xe))}});var Qe=$;export{H as VControlAttribution,U as VControlFullscreen,G as VControlGeolocate,ue as VControlLayer,Ce as VControlLayerGroup,Ie as VControlLegend,ee as VControlNavigation,te as VControlScale,Le as VLayerMaplibreCanvas,Ue as VLayerMaplibreCluster,Re as VLayerMaplibreGeojson,ze as VLayerMaplibreImage,Ge as VLayerMaplibreIsochrone,He as VLayerMaplibrePmtile,q as VLayerMaplibreRaster,We as VLayerMaplibreRoute,Be as VLayerMaplibreVector,Ve as VLayerMaplibreVideo,$ as VMap,Ze as VMarker,Ye as VPopup,Qe as default,r as requirePeer};
1
+ import{n as e,r as t,t as n}from"./symbols-DXKzIgbY.js";import{a as r,i,t as a}from"./useDeckOverlay-CI56uIKH.js";import{Fragment as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,defineComponent as f,inject as p,nextTick as m,normalizeClass as h,normalizeStyle as g,onBeforeUnmount as _,onMounted as v,onUnmounted as y,onUpdated as b,openBlock as x,provide as S,ref as C,renderList as w,renderSlot as T,shallowRef as E,toDisplayString as D,useSlots as O,watch as k,withCtx as A}from"vue";import j,{AttributionControl as M,FullscreenControl as N,GeolocateControl as P,Map as F,Marker as I,NavigationControl as L,Popup as R,ScaleControl as z}from"maplibre-gl";import{PMTiles as B,Protocol as V}from"pmtiles";const H=f({__name:`VControlAttribution`,props:{options:{default:void 0},position:{default:`bottom-right`}},setup(e){let r={compact:!1,customAttribution:void 0},i=e,a=O(),o=t(n);v(()=>{s()});let s=()=>{let e=r;i.options&&(e={...i.options}),a&&a.default?.()&&(e.customAttribution=a.default()[0].children);let t=new M(e);o.value.addControl(t,i.position)};return(e,t)=>T(e.$slots,`default`)}}),U=f({__name:`VControlFullscreen`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let r={container:void 0},i=e,a=t(n);v(()=>{o()});let o=()=>{let e=new N(i.options||r);a.value.addControl(e,i.position)};return()=>{}}}),W=[`geolocate`,`error`,`outofmaxbounds`,`trackuserlocationstart`,`trackuserlocationend`],G=f({__name:`VControlGeolocate`,props:{options:{default:void 0},position:{default:`top-left`}},emits:W,setup(e,{emit:r}){let i={fitBoundsOptions:{linear:!1,offset:[0,0],maxZoom:22},positionOptions:{enableHighAccuracy:!0,maximumAge:0,timeout:6e3},trackUserLocation:!0,showAccuracyCircle:!0,showUserLocation:!0},a=e,o=r,s=t(n);v(()=>{c()});let c=()=>{let e=new P(a.options||i);s.value.addControl(e,a.position),W.forEach(t=>{e.on(t,()=>{o(t)})})};return()=>{}}}),ee=f({__name:`VControlNavigation`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let t={showCompass:!0,showZoom:!0,visualizePitch:!0},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new L(r.options||t);i.value.addControl(e,r.position)};return()=>{}}}),te=f({__name:`VControlScale`,props:{options:{default:void 0},position:{default:`bottom-left`}},setup(e){let t={maxWidth:100,unit:`metric`},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new z(r.options||t);i?.value.addControl(e,r.position)};return(e,t)=>T(e.$slots,`default`)}});function K(e,t,n){let r=null,i=!1,a=()=>{i&&t.value&&!t.value.classList.contains(`maplibregl-ctrl`)&&t.value.classList.add(`maplibregl-ctrl`)};v(()=>{!e.value||!t.value||(r={onAdd:()=>(t.value?.classList.add(`maplibregl-ctrl`),t.value),onRemove:()=>{}},e.value.addControl(r,n),i=!0)}),b(()=>{a()}),y(()=>{if(e.value&&r)try{e.value.removeControl(r)}catch{}})}const ne={class:`v-layer-control-header`},re={class:`v-layer-control-title`},ie=[`aria-pressed`,`title`],ae={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},oe={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},se={class:`v-layer-control-slider-row`},ce=[`value`,`disabled`],le={class:`v-layer-control-value`},ue=f({__name:`VControlLayer`,props:{layerId:{},position:{default:`top-right`},visible:{type:Boolean,default:!0},opacity:{default:1},title:{default:`Layer Control`},layerType:{default:void 0}},emits:[`visibility-change`,`opacity-change`,`update:visible`,`update:opacity`],setup(e,{emit:r}){let i=e,o=r,s=t(n),c=p(a,null),l=C(null),f=C(i.visible),m=C(i.opacity);K(s,l,i.position);let g=()=>i.layerType?i.layerType:s.value?s.value.getLayer(i.layerId)?`maplibre`:c&&c.getLayers().find(e=>e.id===i.layerId)?`deckgl`:null:null,_=()=>{if(!s.value||g()!==`maplibre`)return null;let e=s.value.getLayer(i.layerId);if(!e)return null;switch(e.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;default:return null}},y=e=>{let t=g();if(t===`maplibre`){if(!s.value)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setLayoutProperty(i.layerId,`visibility`,e?`visible`:`none`)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({visible:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`visibility-change`,e),o(`update:visible`,e)},b=e=>{let t=g();if(t===`maplibre`){let t=_();if(!s.value||!t)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setPaintProperty(i.layerId,t,e)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({opacity:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`opacity-change`,e),o(`update:opacity`,e)},S=()=>{f.value=!f.value},w=e=>{let t=e.target;m.value=Number(t.value)/100};return k(f,e=>{y(e)}),k(m,e=>{b(e)}),k(()=>i.visible,e=>{f.value=e}),k(()=>i.opacity,e=>{m.value=e}),v(()=>{let e=!1,t=()=>e?!0:g()?(e=!0,y(f.value),b(m.value),!0):!1;if(t())return;let n=[100,200,300,500,500,1e3,1e3,1e3,2e3,3e3],r=0,i=()=>{t()||r>=n.length||setTimeout(()=>{r++,i()},n[r])};i()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:l,class:`v-layer-control`},[d(`div`,ne,[d(`span`,re,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-control-toggle`,{"is-hidden":!f.value}]),"aria-pressed":f.value,title:f.value?`Hide layer`:`Show layer`,onClick:S},[f.value?(x(),u(`svg`,ae,[...n[0]||(n[0]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,oe,[...n[1]||(n[1]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,ie)]),d(`div`,se,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(m.value*100),class:`v-layer-control-slider`,disabled:!f.value,onInput:w},null,40,ce),d(`span`,le,D(Math.round(m.value*100))+`%`,1)]),T(t.$slots,`default`)],512))}}),de={class:`v-layer-group-title`},fe={key:1,class:`v-layer-group-header is-static`},pe={class:`v-layer-group-title`},me={key:2,class:`v-layer-group-content`},he={class:`v-layer-group-item-header`},ge={class:`v-layer-group-item-title`},_e=[`aria-pressed`,`title`,`onClick`],ve={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},ye={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},be={class:`v-layer-group-slider-row`},xe=[`value`,`disabled`,`onInput`],Se={class:`v-layer-group-value`},Ce=f({__name:`VControlLayerGroup`,props:{layers:{},position:{default:`top-right`},title:{default:`Layers`},collapsible:{type:Boolean,default:!0},collapsed:{type:Boolean,default:!1}},emits:[`visibility-change`,`opacity-change`,`update:layers`],setup(e,{emit:r}){let i=e,s=r,c=t(n),f=p(a,null),m=C(null),g=C(i.collapsed),_=C(new Map);K(c,m,i.position);let y=()=>{for(let e of i.layers)_.value.set(e.id,{visible:e.visible??!0,opacity:e.opacity??1})},b=(e,t)=>t||(c.value?c.value.getLayer(e)?`maplibre`:f&&f.getLayers().find(t=>t.id===e)?`deckgl`:null:null),S=e=>{if(!c.value)return null;let t=c.value.getLayer(e);if(!t)return null;switch(t.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;case`raster`:return`raster-opacity`;default:return null}},E=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){if(!c.value)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setLayoutProperty(e,`visibility`,t?`visible`:`none`)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({visible:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`visibility-change`,{layerId:e,visible:t})},O=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){let n=S(e);if(!c.value||!n)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setPaintProperty(e,n,t)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({opacity:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`opacity-change`,{layerId:e,opacity:t})},A=e=>{let t=_.value.get(e.id);if(!t)return;let n=!t.visible;t.visible=n,E(e.id,n,e.type)},j=(e,t)=>{let n=t.target,r=Number(n.value)/100,i=_.value.get(e.id);i&&(i.opacity=r,O(e.id,r,e.type))},M=e=>_.value.get(e)??{visible:!0,opacity:1},N=()=>{i.collapsible&&(g.value=!g.value)};return k(()=>i.layers,()=>{y()},{deep:!0}),k(()=>i.collapsed,e=>{g.value=e}),v(()=>{y();for(let e of i.layers){let t=M(e.id);E(e.id,t.visible,e.type),O(e.id,t.opacity,e.type)}}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:m,class:h([`v-layer-group maplibregl-ctrl`,{"is-collapsed":g.value}])},[e.collapsible?(x(),u(`button`,{key:0,type:`button`,class:`v-layer-group-header`,onClick:N},[d(`span`,de,D(e.title),1),(x(),u(`svg`,{class:h([`v-layer-group-chevron`,{"is-collapsed":g.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))])):(x(),u(`div`,fe,[d(`span`,pe,D(e.title),1)])),g.value?l(`v-if`,!0):(x(),u(`div`,me,[(x(!0),u(o,null,w(e.layers,e=>(x(),u(`div`,{key:e.id,class:`v-layer-group-item`},[d(`div`,he,[d(`span`,ge,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-group-toggle`,{"is-hidden":!M(e.id).visible}]),"aria-pressed":M(e.id).visible,title:M(e.id).visible?`Hide layer`:`Show layer`,onClick:t=>A(e)},[M(e.id).visible?(x(),u(`svg`,ve,[...n[1]||(n[1]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,ye,[...n[2]||(n[2]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,_e)]),d(`div`,be,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(M(e.id).opacity*100),class:`v-layer-group-slider`,disabled:!M(e.id).visible,onInput:t=>j(e,t)},null,40,xe),d(`span`,Se,D(Math.round(M(e.id).opacity*100))+`%`,1)])]))),128))])),T(t.$slots,`default`)],2))}}),we={class:`v-legend-control-title`},Te={key:0,class:`v-legend-control-content`},Ee=[`disabled`,`onClick`],De={class:`v-legend-control-label`},Oe={key:0,class:`v-legend-control-count`},ke={class:`v-legend-control-gradient-labels`},Ae={class:`v-legend-control-size-circle-wrap`},je={class:`v-legend-control-label`},Me={key:3,class:`v-legend-control-table`},Ne=[`title`],Pe={class:`v-legend-control-table-label`},Fe={class:`v-legend-control-table-value`},Ie=f({__name:`VControlLegend`,props:{layerIds:{},type:{default:`category`},items:{},position:{default:`top-right`},property:{},autoGenerate:{type:Boolean,default:!1},title:{default:`Legend`},collapsed:{type:Boolean,default:!1},interactive:{type:Boolean,default:!0}},emits:[`item-click`,`filter-change`,`update:filter`],setup(e,{emit:r}){let i=e,c=r,f=t(n),m=p(a,null),_=C(null),y=C(i.collapsed),b=C(new Map),S=C([]);K(f,_,i.position);let E=e=>{let t=[],n=e[e.length-1];for(let n=2;n<e.length-1;n+=2){let r=e[n],i=e[n+1];if(Array.isArray(r))for(let e of r)t.push({value:e,label:String(e),color:i,visible:!0});else t.push({value:r,label:String(r),color:i,visible:!0})}return t.length>0&&n&&typeof n==`string`&&t.push({value:`__default__`,label:`Other`,color:n,visible:!0}),t},O=e=>{let t=[],n=[],r=e[2];t.push(r);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length===0?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},A=e=>{let t=[],n=[];e[1]&&Array.isArray(e[1]);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length<2?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},j=()=>{if(!i.autoGenerate||!i.property||!f.value)return[];let e=i.layerIds[0];if(!e)return[];if(!f.value.getLayer(e))return console.warn(`[VControlLegend] Layer not found: ${e}`),[];let t=f.value.getPaintProperty(e,i.property);if(!t||!Array.isArray(t))return console.warn(`[VControlLegend] Paint property "${i.property}" not found or not an expression`),[];let n=t[0];if(n===`match`)return E(t);if(n===`step`){let e=O(t);return e?[e]:[]}if(n===`interpolate`||n===`interpolate-hcl`||n===`interpolate-lab`){let e=A(t);return e?[e]:[]}return console.warn(`[VControlLegend] Unsupported expression type: ${n}`),[]},M=s(()=>i.items&&i.items.length>0?i.items:S.value),N=s(()=>i.type===`category`?M.value.filter(e=>`value`in e&&`color`in e&&`label`in e):[]),P=s(()=>{if(i.type!==`gradient`)return null;let e=M.value;if(e.length===0)return null;let t=e[0];return`min`in t&&`max`in t&&`colors`in t?t:null}),F=s(()=>i.type===`size`?M.value.filter(e=>`size`in e&&`value`in e):[]),I=s(()=>i.type===`table`?M.value.filter(e=>`label`in e&&`color`in e&&`value`in e&&!(`size`in e)&&!(`visible`in e)).sort((e,t)=>t.value-e.value):[]),L=e=>e.formattedValue?e.formattedValue:`${e.value}${e.unit??``}`,R=s(()=>({visibleValues:Array.from(b.value.entries()).filter(([,e])=>e).map(([e])=>e)})),z=s(()=>P.value?`linear-gradient(to right, ${P.value.colors.join(`, `)})`:``),B=()=>{if(i.type===`category`)for(let e of N.value)b.value.set(e.value,e.visible??!0)},V=()=>{if(!f.value||!i.property||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length;for(let t of i.layerIds)if(f.value.getLayer(t))if(n)f.value.setFilter(t,null);else if(e.length===0)f.value.setFilter(t,[`==`,[`get`,`_never_match_`],!0]);else{let n=f.value.getPaintProperty(t,i.property);if(!n||!Array.isArray(n))continue;let r=n[1],a=null;Array.isArray(r)&&r[0]===`get`&&(a=r[1]),a&&f.value.setFilter(t,[`in`,[`get`,a],[`literal`,e]])}},H=()=>{if(!m||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length,r=m.getLayers();for(let t of i.layerIds){if(f.value?.getLayer(t))continue;let i=r.find(e=>e.id===t);if(i){if(!i.props?.extensions?.some(e=>e?.constructor?.name===`DataFilterExtension`)){console.warn(`[VControlLegend] deck.gl layer "${t}" requires DataFilterExtension for filtering. Add DataFilterExtension to layer extensions and configure getFilterValue accessor.`);continue}if(typeof i.clone==`function`)if(n){let e=i.clone({filterRange:[-1/0,1/0]});m.updateLayer(t,e)}else if(e.length===0){let e=i.clone({filterRange:[1/0,1/0]});m.updateLayer(t,e)}else{let n=e.map(e=>N.value.findIndex(t=>t.value===e)).filter(e=>e>=0);if(n.length>0){let e=Math.min(...n),r=Math.max(...n),a=i.clone({filterRange:[e-.5,r+.5]});m.updateLayer(t,a)}}}}},U=(e,t)=>{if(!i.interactive)return;let n=!(b.value.get(e.value)??!0);b.value.set(e.value,n),V(),H(),c(`item-click`,{item:e,index:t,visible:n}),c(`filter-change`,{filter:R.value,layerIds:i.layerIds}),c(`update:filter`,R.value)},W=e=>b.value.get(e.value)??!0,G=()=>{y.value=!y.value};return k(()=>i.items,()=>{B()},{deep:!0}),k(()=>i.collapsed,e=>{y.value=e}),v(()=>{i.autoGenerate&&(S.value=j()),B()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:_,class:h([`v-legend-control`,{"is-collapsed":y.value}])},[d(`button`,{type:`button`,class:`v-legend-control-header`,onClick:G},[d(`span`,we,D(e.title),1),(x(),u(`svg`,{class:h([`v-legend-control-chevron`,{"is-collapsed":y.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))]),y.value?l(`v-if`,!0):(x(),u(`div`,Te,[e.type===`category`?(x(!0),u(o,{key:0},w(N.value,(t,n)=>(x(),u(`button`,{key:t.value,type:`button`,class:h([`v-legend-control-item`,{"is-interactive":e.interactive,"is-hidden":!W(t)}]),disabled:!e.interactive,onClick:e=>U(t,n)},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:t.color})},null,4),d(`span`,De,D(t.label),1),t.count===void 0?l(`v-if`,!0):(x(),u(`span`,Oe,D(t.count),1))],10,Ee))),128)):e.type===`gradient`&&P.value?(x(),u(o,{key:1},[d(`div`,{class:`v-legend-control-gradient`,style:g({background:z.value})},null,4),d(`div`,ke,[d(`span`,null,D(P.value.minLabel??P.value.min),1),d(`span`,null,D(P.value.maxLabel??P.value.max),1)])],64)):e.type===`size`?(x(!0),u(o,{key:2},w(F.value,e=>(x(),u(`div`,{key:e.value,class:`v-legend-control-size-item`},[d(`div`,Ae,[d(`div`,{class:`v-legend-control-size-circle`,style:g({width:`${Math.min(e.size,20)}px`,height:`${Math.min(e.size,20)}px`})},null,4)]),d(`span`,je,D(e.label),1)]))),128)):e.type===`table`?(x(),u(`div`,Me,[(x(!0),u(o,null,w(I.value,e=>(x(),u(`div`,{key:e.label,class:`v-legend-control-table-row`,title:e.description},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:e.color})},null,4),d(`span`,Pe,D(e.label),1),d(`span`,Fe,D(L(e)),1)],8,Ne))),128))])):l(`v-if`,!0)])),T(t.$slots,`default`)],2))}}),Le=f({__name:`VLayerMaplibreCanvas`,props:{source:{},layer:{},sourceId:{default:`maplibre.gl-canvas-source`},layerId:{default:`maplibre.gl-canvas-layer`},before:{default:``}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Canvas layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}catch(e){console.error(`Error updating Canvas source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Canvas layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Canvas layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Re=f({__name:`VLayerMaplibreGeojson`,props:{sourceId:{default:`maplibre-gl-geojson-source`},layerId:{default:`maplibre-gl-geojson-layer`},source:{},layer:{},before:{default:``}},emits:[`on-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=e=>!e||typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e?e.type===`FeatureCollection`&&`features`in e?e.features.length>0:e.type===`Feature`||e.type===`Point`||e.type===`LineString`||e.type===`Polygon`||e.type===`MultiPoint`||e.type===`MultiLineString`||e.type===`MultiPolygon`:!1,c=()=>o.value||null,l=C(!1),u=null,d=null,f=null,p=()=>{if(l.value)return!0;let e=c();if(!e||!e.isStyleLoaded()||!s(i.source.data))return!1;try{if(e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),!e.getLayer(i.layerId)){let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}return x(e),l.value=!0,!0}catch(e){return console.error(`Error adding GeoJSON layer:`,e),!1}},h=e=>{u!==e&&(g(),u=e,d=()=>{p()},e.on(`style.load`,d),f=()=>{if(l.value){f&&u&&u.off(`idle`,f),f=null;return}p()},e.on(`idle`,f),p())},g=()=>{u&&(d&&u.off(`style.load`,d),f&&u.off(`idle`,f)),u=null,d=null,f=null},y=()=>{let e=c();if(e)try{let t=e.getSource(i.sourceId);if(t&&`setData`in t){let n=e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId);(n.length===0||n[0]?.id===i.layerId)&&t.setData(i.source.data)}else t||p()}catch(e){console.error(`Error updating GeoJSON source:`,e)}},b=()=>{let e=c();if(e)try{e.getLayer(i.layerId)?(Object.entries(i.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(i.layerId,t,n)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(i.layerId,t,n)})):p()}catch(e){console.error(`Error updating GeoJSON layer:`,e)}},x=e=>{if(e)try{e.on(`click`,i.layerId,e=>{e.features&&e.features.length>0&&a(`on-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`mouseenter`,i.layerId,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,i.layerId,()=>{e.getCanvas().style.cursor=``})}catch(e){console.error(`Error in setupLayerEvents:`,e)}};return k(o,e=>{e?h(e):(g(),l.value=!1)},{immediate:!0}),k(()=>i.source.data,(e,t)=>{if(s(e)){if(!l.value){let e=c();e&&!u?h(e):p();return}JSON.stringify(e)!==JSON.stringify(t)&&y()}}),k(()=>i.layer,b,{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=c();if(!t||!t.isStyleLoaded())return;let n=t.getLayer(i.layerId);if(!n&&e===`visible`)s(i.source.data)&&p();else if(n)try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`Error updating visibility for ${i.layerId}:`,e)}},{immediate:!0}),v(()=>{m(()=>{p()})}),_(()=>{g();let e=c();if(e)try{e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId).length===0&&e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up GeoJSON layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),ze=f({__name:`VLayerMaplibreImage`,props:{sourceId:{type:String,default:`maplibre.gl-image-source`,required:!0},layerId:{type:String,default:`maplibre.gl-image-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Image layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t)if(t.updateImage)t.updateImage({url:r.source.url,coordinates:r.source.coordinates});else{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}}catch(e){console.error(`Error updating Image source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Image layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Image layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),q=f({__name:`VLayerMaplibreRaster`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),e.getLayer(r.layerId)||(e.addLayer(r.layer,r.before),r.layer.layout?.visibility&&e.setLayoutProperty(r.layerId,`visibility`,r.layer.layout.visibility)),o.value=!0,!0}catch(e){return console.error(`[${r.layerId}] Error setting up layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null},p=()=>{let e=a();if(e)try{let t=r.before;e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,type:`raster`,source:r.sourceId};t&&e.getLayer(t)?e.addLayer(n,t):e.addLayer(n)}catch(e){console.error(`Error updating Raster source:`,e)}};return k(()=>r.source.tiles?.[0],(e,t)=>{e!==t&&p()}),k(()=>r.layer,()=>{let e=a();if(e)try{if(e.getLayer(r.layerId)){let t=r.layer.paint||{};Object.entries(t).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)});let n=r.layer.layout||{};Object.entries(n).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)})}}catch(e){console.error(`Error updating Raster layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),k(()=>r.layer.layout?.visibility,e=>{let t=a();if(t)if(t.getLayer(r.layerId))try{t.setLayoutProperty(r.layerId,`visibility`,e),e===`visible`&&r.before&&t.moveLayer(r.layerId,r.before)}catch(e){console.error(`[${r.layerId}] Error updating visibility:`,e)}else try{t.addLayer(r.layer,r.before)}catch(e){console.error(`[${r.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>r.before,e=>{let t=a();if(!(!t||!t.getLayer(r.layerId))&&r.layer.layout?.visibility===`visible`)try{console.log(`[${r.layerId}] Moving layer before:`,e),t.moveLayer(r.layerId,e)}catch(e){console.error(`[${r.layerId}] Error moving layer:`,e)}}),v(()=>{u()}),_(()=>{f()}),(e,t)=>T(e.$slots,`default`)}}),J=[`click`,`dblclick`,`mousedown`,`mouseup`,`mousemove`,`mouseenter`,`mouseleave`,`mouseover`,`mouseout`,`contextmenu`,`touchstart`,`touchend`,`touchcancel`],Y=`error.load.idle.remove.render.resize.webglcontextlost.webglcontextrestored.dataloading.data.tiledataloading.sourcedataloading.styledataloading.sourcedata.styledata.boxzoomcancel.boxzoomstart.boxzoomend.touchcancel.touchmove.touchend.touchstart.click.contextmenu.dblclick.mousemove.mouseup.mousedown.mouseout.mouseover.movestart.move.moveend.zoomstart.zoom.zoomend.rotatestart.rotate.rotateend.dragstart.drag.dragend.pitchstart.pitch.pitchend.wheel`.split(`.`),X=[`dragstart`,`drag`,`dragend`],Z=[`click`,`mouseenter`,`mouseleave`],Q=[`open`,`close`],Be=f({__name:`VLayerMaplibreVector`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},emits:[...J],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=()=>o.value||null,c=C(!1),l=null,u=null,d=null,f=()=>{if(c.value)return!0;let e=s();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),e.getLayer(i.layerId)||(i.layer.layout?.visibility===`visible`?e.addLayer(i.layer,i.before):e.addLayer(i.layer)),y(e),c.value=!0,!0}catch(e){return console.error(`[${i.layerId}] Error setting up layer:`,e),!1}},p=e=>{l!==e&&(m(),l=e,u=()=>{f()},e.on(`style.load`,u),d=()=>{if(c.value){d&&l&&l.off(`idle`,d),d=null;return}f()},e.on(`idle`,d),f())},m=()=>{l&&(u&&l.off(`style.load`,u),d&&l.off(`idle`,d)),l=null,u=null,d=null},h=()=>{let e=s();if(e)try{let t=e.getSource(i.sourceId);if(t&&JSON.stringify(t.serialize())!==JSON.stringify(i.source)){e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.removeSource(i.sourceId),e.addSource(i.sourceId,i.source);let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}}catch(e){console.error(`Error updating vector source:`,e)}},g=()=>{let e=s();if(e)try{if(e.getLayer(i.layerId)){let t=e.getLayer(i.layerId),n=t?.paint||{},r=t?.layout||{};Object.entries(i.layer.paint||{}).forEach(([t,r])=>{JSON.stringify(n[t])!==JSON.stringify(r)&&e.setPaintProperty(i.layerId,t,r)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{JSON.stringify(r[t])!==JSON.stringify(n)&&e.setLayoutProperty(i.layerId,t,n)})}}catch(e){console.error(`Error updating vector layer:`,e)}},y=e=>{if(e)try{J.forEach(t=>{e.on(t,i.layerId,n=>{t===`mousemove`&&(e.getCanvas().style.cursor=`pointer`),t===`mouseleave`&&(e.getCanvas().style.cursor=``),a(t,n)})})}catch(e){console.error(`Error setting up layer events:`,e)}};return k(o,e=>{e?p(e):(m(),c.value=!1)},{immediate:!0}),k(()=>JSON.stringify(i.source.tiles),(e,t)=>{e!==t&&h()}),k(()=>({paint:i.layer.paint,layout:i.layer.layout?{...i.layer.layout,visibility:void 0}:void 0}),(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&g()},{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e),e===`visible`&&i.before&&setTimeout(()=>{t.moveLayer(i.layerId,i.before)},0)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>i.before,e=>{let t=s();if(!(!t||!t.getLayer(i.layerId))&&i.layer.layout?.visibility===`visible`)try{t.moveLayer(i.layerId,e)}catch(e){console.error(`Error reordering vector layer ${i.layerId}:`,e)}}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),v(()=>{f()}),_(()=>{m()}),(e,t)=>T(e.$slots,`default`)}}),Ve=f({__name:`VLayerMaplibreVideo`,props:{sourceId:{type:String,default:`maplibre.gl-video-source`,required:!0},layerId:{type:String,default:`maplibre.gl-video-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Video layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t){e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,source:r.sourceId};if(e.addLayer(n,r.before),t.getVideo){let e=t.getVideo();e&&e.play().catch(e=>{console.error(`Error playing video:`,e)})}}}catch(e){console.error(`Error updating Video source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Video layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t?.getVideo){let e=t.getVideo();e&&(e.pause(),e.remove())}e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Video layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),He=f({__name:`VLayerMaplibrePmtile`,props:{sourceId:{type:String,default:`maplibre.gl-pmtile-source`,required:!0},layerId:{type:String,default:`maplibre.gl-pmtile-layer`,required:!0},url:{type:String,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(t){let n=t,r=p(e);if(!r)throw Error(`Protocol not provided`);let i=C({type:`raster`,url:`pmtiles://${n.url}`,tileSize:512,volatile:!0});return v(async()=>{let e=new B(n.url);r.add(e)}),(e,n)=>(x(),c(q,{"source-id":t.sourceId,"layer-id":t.layerId,source:i.value,layer:{...t.layer,type:`raster`},before:t.before},null,8,[`source-id`,`layer-id`,`source`,`layer`,`before`]))}}),Ue=f({__name:`VLayerMaplibreCluster`,props:{sourceId:{default:`cluster-source`},baseLayerId:{default:`cluster`},source:{},visibility:{type:Boolean,default:!0},clusterPaint:{default:()=>({colors:[`#51bbd6`,`#f1f075`,`#f28cb1`],radii:[20,30,40],breakpoints:[100,750]})},unclusteredPaint:{default:()=>({color:`#51bbd6`,radius:6})},textPaint:{default:()=>({color:`#ffffff`,font:[`DIN Offc Pro Medium`,`Arial Unicode MS Bold`],size:12})}},emits:[`cluster-click`,`point-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.baseLayerId}-clusters`),u=s(()=>`${i.baseLayerId}-cluster-count`),d=s(()=>`${i.baseLayerId}-unclustered-point`),f=()=>o.value||null,p=e=>typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e&&e.type===`FeatureCollection`&&`features`in e?e.features.length>0:!1,m=()=>{let e=f();if(!(!e||!e.isStyleLoaded()))try{if(!e.getSource(i.sourceId))console.log(`Adding clustered source: ${i.sourceId}`),e.addSource(i.sourceId,{...i.source,cluster:!0,clusterMaxZoom:14,clusterRadius:50});else{let t=e.getSource(i.sourceId);t&&`setData`in t&&t.setData(i.source.data)}e.getLayer(l.value)||(console.log(`Adding clusters layer: ${l.value}`),e.addLayer({id:l.value,type:`circle`,source:i.sourceId,filter:[`has`,`point_count`],paint:{"circle-color":[`step`,[`get`,`point_count`],i.clusterPaint.colors[0],i.clusterPaint.breakpoints[0],i.clusterPaint.colors[1],i.clusterPaint.breakpoints[1],i.clusterPaint.colors[2]],"circle-radius":[`step`,[`get`,`point_count`],i.clusterPaint.radii[0],i.clusterPaint.breakpoints[0],i.clusterPaint.radii[1],i.clusterPaint.breakpoints[1],i.clusterPaint.radii[2]],"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.9},layout:{visibility:i.visibility?`visible`:`none`}})),e.getLayer(u.value)||(console.log(`Adding cluster count layer: ${u.value}`),e.addLayer({id:u.value,type:`symbol`,source:i.sourceId,filter:[`has`,`point_count`],layout:{"text-field":`{point_count_abbreviated}`,"text-font":i.textPaint.font,"text-size":i.textPaint.size,visibility:i.visibility?`visible`:`none`},paint:{"text-color":i.textPaint.color}})),e.getLayer(d.value)||(console.log(`Adding unclustered points layer: ${d.value}`),e.addLayer({id:d.value,type:`circle`,source:i.sourceId,filter:[`!`,[`has`,`point_count`]],paint:{"circle-color":i.unclusteredPaint.color,"circle-radius":i.unclusteredPaint.radius,"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.95},layout:{visibility:i.visibility?`visible`:`none`}})),console.log(`All cluster layers added for ${i.baseLayerId}`),y(e)}catch(e){console.error(`Error adding cluster layers:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(i.sourceId);t&&`setData`in t?(console.log(`Updating source ${i.sourceId} with data`),t.setData(i.source.data),setTimeout(()=>{m()},100)):t||m()}catch(e){console.error(`Error updating source:`,e)}},g=e=>{let t=f();if(!t)return;let n=e?`visible`:`none`;[l.value,u.value,d.value].forEach(e=>{t.getLayer(e)&&t.setLayoutProperty(e,`visibility`,n)})},y=e=>{if(e)try{e.on(`click`,l.value,e=>{e.features&&e.features.length>0&&a(`cluster-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`point-click`,{features:e.features,coordinates:e.lngLat})}),[l.value,d.value].forEach(t=>{e.on(`mouseenter`,t,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,t,()=>{e.getCanvas().style.cursor=``})})}catch(e){console.error(`Error setting up layer events:`,e)}},b=e=>{e&&(e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?(c.value=!0,p(i.source.data)&&m()):(c.value=!1,setTimeout(t,200))};t()}),e.isStyleLoaded()&&(c.value=!0,p(i.source.data)&&m()))};return k(()=>i.source.data,e=>{if(p(e)){let e=f();e?.isStyleLoaded()&&(e.getSource(i.sourceId)?h():m())}},{deep:!0,immediate:!0}),k(()=>i.visibility,g),k(o,e=>{e&&b(e)},{immediate:!0}),v(()=>{f()?.isStyleLoaded()&&p(i.source.data)&&m()}),_(()=>{let e=f();if(e)try{[l.value,d.value].forEach(t=>{e.off(`click`,t,()=>{}),e.off(`mouseenter`,t,()=>{}),e.off(`mouseleave`,t,()=>{})}),[l.value,u.value,d.value].forEach(t=>{e.getLayer(t)&&e.removeLayer(t)}),e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up cluster layers:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),We=f({__name:`VLayerMaplibreRoute`,props:{id:{default:()=>`route-${Math.random().toString(36).slice(2,9)}`},coordinates:{},color:{default:`#4285F4`},width:{default:4},opacity:{default:1},lineCap:{default:`round`},lineJoin:{default:`round`},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},dashArray:{},blur:{default:0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.id}-source`),u=s(()=>`${i.id}-layer`),d=s(()=>({type:`FeatureCollection`,features:i.coordinates.length>=2?[{type:`Feature`,properties:{},geometry:{type:`LineString`,coordinates:i.coordinates}}]:[]})),f=()=>o.value||null,p=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},m=()=>{let e=f();if(!(!e||!e.isStyleLoaded())&&!(i.coordinates.length<2))try{if(e.getSource(l.value)||e.addSource(l.value,{type:`geojson`,data:d.value}),!e.getLayer(u.value)){let t={id:u.value,type:`line`,source:l.value,layout:{"line-cap":i.lineCap,"line-join":i.lineJoin,visibility:i.visible?`visible`:`none`},paint:{"line-color":i.color,"line-width":i.width,"line-opacity":i.opacity,...i.blur>0&&{"line-blur":i.blur},...i.dashArray&&{"line-dasharray":i.dashArray}}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding route layer:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(l.value);t&&`setData`in t?t.setData(d.value):!t&&i.coordinates.length>=2&&m()}catch(e){console.error(`Error updating route source:`,e)}},g=()=>{let e=f();if(!(!e||!e.getLayer(u.value)))try{e.setPaintProperty(u.value,`line-color`,i.color),e.setPaintProperty(u.value,`line-width`,i.width),e.setPaintProperty(u.value,`line-opacity`,i.opacity),i.blur>0&&e.setPaintProperty(u.value,`line-blur`,i.blur),i.dashArray&&e.setPaintProperty(u.value,`line-dasharray`,i.dashArray),e.setLayoutProperty(u.value,`line-cap`,i.lineCap),e.setLayoutProperty(u.value,`line-join`,i.lineJoin),e.setLayoutProperty(u.value,`visibility`,i.visible?`visible`:`none`)}catch(e){console.error(`Error updating route layer style:`,e)}},y=e=>{if(!(!e||!i.interactive))try{e.on(`click`,u.value,e=>{a(`click`,{coordinates:e.lngLat})}),e.on(`mouseenter`,u.value,()=>{e.getCanvas().style.cursor=`pointer`,a(`mouseenter`)}),e.on(`mouseleave`,u.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up route layer events:`,e)}};return k(()=>i.coordinates,()=>{let e=f();e?.isStyleLoaded()&&(e.getSource(l.value)?h():m())},{deep:!0}),k(()=>[i.color,i.width,i.opacity,i.lineCap,i.lineJoin,i.visible,i.blur,i.dashArray],()=>g(),{deep:!0}),k(o,e=>{e&&(p(e),e.isStyleLoaded()&&(c.value=!0))},{immediate:!0}),k(c,e=>{if(e&&i.coordinates.length>=2){let e=f();e&&(m(),y(e))}}),v(()=>{try{let e=f();e?.isStyleLoaded()&&i.coordinates.length>=2&&(m(),y(e))}catch(e){console.error(`Error mounting route layer:`,e)}}),_(()=>{let e=f();if(e)try{e.getLayer(u.value)&&e.removeLayer(u.value),e.getSource(l.value)&&e.removeSource(l.value)}catch(e){console.error(`Error cleaning up route layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Ge=f({__name:`VLayerMaplibreIsochrone`,props:{id:{default:()=>`isochrone-${Math.random().toString(36).slice(2,9)}`},data:{},fillOpacity:{default:.4},lineWidth:{default:2},lineOpacity:{default:.8},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},reverseOrder:{type:Boolean,default:!0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=C(!1),u=s(()=>`${i.id}-source`),d=s(()=>`${i.id}-fill`),f=s(()=>`${i.id}-line`),p=s(()=>!i.data||!i.data.features||i.data.features.length===0?null:{type:`FeatureCollection`,features:(i.reverseOrder?[...i.data.features].reverse():i.data.features).map(e=>({...e,properties:{...e.properties,fillColor:e.properties.color.startsWith(`#`)?e.properties.color:`#${e.properties.color}`}}))}),h=()=>o.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},y=()=>{let e=h();if(!e||!e.isStyleLoaded())return;let t=p.value;if(t)try{if(e.getSource(u.value)||e.addSource(u.value,{type:`geojson`,data:t}),!e.getLayer(d.value)){let t={id:d.value,type:`fill`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"fill-color":[`get`,`fillColor`],"fill-opacity":i.fillOpacity}};e.addLayer(t,i.before||void 0)}if(!e.getLayer(f.value)){let t={id:f.value,type:`line`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"line-color":[`get`,`fillColor`],"line-width":i.lineWidth,"line-opacity":i.lineOpacity}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding isochrone layers:`,e)}},b=()=>{let e=h();if(e)try{let t=e.getSource(u.value),n=p.value;t&&`setData`in t?n&&t.setData(n):!t&&n&&y()}catch(e){console.error(`Error updating isochrone source:`,e)}},x=()=>{let e=h();if(e)try{e.getLayer(d.value)&&(e.setPaintProperty(d.value,`fill-opacity`,i.fillOpacity),e.setLayoutProperty(d.value,`visibility`,i.visible?`visible`:`none`)),e.getLayer(f.value)&&(e.setPaintProperty(f.value,`line-width`,i.lineWidth),e.setPaintProperty(f.value,`line-opacity`,i.lineOpacity),e.setLayoutProperty(f.value,`visibility`,i.visible?`visible`:`none`))}catch(e){console.error(`Error updating isochrone layer style:`,e)}},S=e=>{if(!(!e||!i.interactive))try{e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`click`,{feature:e.features[0],coordinates:e.lngLat})}),e.on(`mouseenter`,d.value,t=>{e.getCanvas().style.cursor=`pointer`,t.features&&t.features.length>0&&a(`mouseenter`,t.features[0])}),e.on(`mouseleave`,d.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up isochrone layer events:`,e)}},w=async()=>{if(l.value)return;let e=h();!e||!e.isStyleLoaded()||p.value&&(await m(),!l.value&&(y(),S(e),l.value=!0))};return k(()=>i.data,()=>{let e=h();e?.isStyleLoaded()&&(e.getSource(u.value)?b():y())},{deep:!0}),k(()=>[i.fillOpacity,i.lineWidth,i.lineOpacity,i.visible],()=>x(),{deep:!0}),k(c,e=>{e&&w()}),k(o,e=>{e&&(g(e),e.isStyleLoaded()&&(c.value=!0,w()))},{immediate:!0}),v(()=>{m(()=>{w()})}),_(()=>{let e=h();if(e)try{e.getLayer(f.value)&&e.removeLayer(f.value),e.getLayer(d.value)&&e.removeLayer(d.value),e.getSource(u.value)&&e.removeSource(u.value)}catch(e){console.error(`Error cleaning up isochrone layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}});var Ke=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const qe=[`id`];var $=Ke(f({__name:`VMap`,props:{options:{default:()=>({container:`map`})},supportPmtiles:{type:Boolean,default:!1},projection:{default:`mercator`}},emits:[`loaded`,...Y],setup(t,{emit:r}){let a=t,o=r;if(a.supportPmtiles){let t=new V({metadata:!0});j.addProtocol(`pmtiles`,t.tile),S(e,t)}let s=E(null),c=C(!1),d=C(Y);S(n,s),i(s,{globe:a.projection===`globe`}),v(()=>{s.value=new F(a.options),c.value=!0,f()});let f=()=>{s.value&&d.value.forEach(e=>{s.value?.on(e,t=>{switch(e){case`load`:o(`loaded`,s.value);break;default:o(e,t);break}})})};return(e,n)=>(x(),u(`div`,{id:`${t.options?.container}`,class:`v-map-container`},[c.value?T(e.$slots,`default`,{key:0},()=>[T(e.$slots,`default`,{},void 0,!0)],!0):l(`v-if`,!0)],8,qe))}}),[[`__scopeId`,`data-v-2632eb0f`]]);const Je=[`id`],Ye=f({__name:`VPopup`,props:{options:{default:()=>({})},coordinates:{default:()=>({})},marker:{default:()=>({})}},emits:[`added`,`removed`,`open`,`close`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=new R(i.options),c=C(!0),l=C(null),d=()=>o.value||null,f=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},p=()=>{try{l.value&&s.setDOMContent(l.value)}catch(e){console.error(`Error setting popup content:`,e)}},m=()=>{try{s.setLngLat(i.coordinates)}catch(e){console.error(`Error setting popup coordinates:`,e)}},h=()=>{let e=d();if(e)try{`setPopup`in i.marker?i.marker.setPopup(s):s.addTo(e),a(`added`,{popup:s})}catch(e){console.error(`Error adding popup to marker:`,e)}},g=()=>{try{s.remove(),a(`removed`)}catch(e){console.error(`Error removing popup:`,e)}},y=()=>{try{Q.forEach(e=>{s.on(e,()=>{a(e)})})}catch(e){console.error(`Error setting up popup events:`,e)}},b=()=>{try{Q.forEach(e=>{s.off(e,()=>{a(e)})})}catch(e){console.error(`Error removing popup events:`,e)}};return k(o,e=>{e&&f(e)},{immediate:!0}),k(()=>i.coordinates,()=>{m()},{deep:!0}),v(()=>{if(c.value)try{p(),m(),h(),y()}catch(e){console.error(`Error initializing popup:`,e)}else g(),b()}),_(()=>{g(),b()}),(e,t)=>(x(),u(`section`,{id:`popup-${Date.now()}`,ref_key:`content`,ref:l},[T(e.$slots,`default`)],8,Je))}}),Xe=[`id`],Ze=f({__name:`VMarker`,props:{coordinates:{},options:{default:()=>({})},popupOptions:{default:()=>({})},cursor:{default:`pointer`}},emits:[`added`,`update:coordinates`,`removed`,...X,...Z],setup(e,{emit:r}){let i=O(),a=e,o=r,s=t(n),d=C(null),f=C(!0),p=C(!1),m=C(null),h=()=>s.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?f.value=!0:(f.value=!1,setTimeout(t,200))};t()})},y=e=>{e instanceof HTMLElement&&(m.value=e)},b=e=>{try{e.setLngLat(a.coordinates)}catch(e){console.error(`Error setting marker coordinates:`,e)}},S=e=>{try{e.getElement().style.cursor=a.cursor||`default`}catch(e){console.error(`Error setting cursor:`,e)}},w=e=>{let t=h();if(t)try{e.addTo(t),o(`added`,{marker:e})}catch(e){console.error(`Error adding marker to map:`,e)}},E=e=>{try{e.remove(),o(`removed`)}catch(e){console.error(`Error removing marker from map:`,e)}},D=e=>{try{let t;X.forEach(n=>{e.on(n,e=>{n===`dragend`&&(t=Array.isArray(a.coordinates)?[e.target.getLngLat().lng,e.target.getLngLat().lat]:e.target.getLngLat(),o(`update:coordinates`,t)),o(n,e)})}),Z.forEach(t=>{e.getElement().addEventListener(t,e=>{o(t,e)})})}catch(e){console.error(`Error setting up marker events:`,e)}};k(d,e=>{p.value=e!==null&&`_map`in e}),k(s,e=>{e&&g(e)},{immediate:!0});let j=e=>{if(!(!f.value||d.value))try{d.value=new I({...a.options,element:e||void 0}),b(d.value),w(d.value),S(d.value),D(d.value)}catch(e){console.error(`Error initializing marker:`,e)}};return k(m,e=>{e&&!d.value&&j(e)}),v(()=>{i.markers||j()}),_(()=>{d.value&&E(d.value)}),(t,n)=>(x(),u(`section`,{id:`marker-${Date.now()}`,class:`absolute`},[T(t.$slots,`markers`,{setRef:y}),p.value&&t.$slots.default?(x(),c(Ye,{key:0,marker:d.value,options:e.popupOptions,coordinates:e.coordinates},{default:A(()=>[T(t.$slots,`default`)]),_:3},8,[`marker`,`options`,`coordinates`])):l(`v-if`,!0)],8,Xe))}});var Qe=$;export{H as VControlAttribution,U as VControlFullscreen,G as VControlGeolocate,ue as VControlLayer,Ce as VControlLayerGroup,Ie as VControlLegend,ee as VControlNavigation,te as VControlScale,Le as VLayerMaplibreCanvas,Ue as VLayerMaplibreCluster,Re as VLayerMaplibreGeojson,ze as VLayerMaplibreImage,Ge as VLayerMaplibreIsochrone,He as VLayerMaplibrePmtile,q as VLayerMaplibreRaster,We as VLayerMaplibreRoute,Be as VLayerMaplibreVector,Ve as VLayerMaplibreVideo,$ as VMap,Ze as VMarker,Ye as VPopup,Qe as default,r as requirePeer};
2
2
  //# sourceMappingURL=index.js.map
package/dist/lidar.js CHANGED
@@ -1,2 +1,2 @@
1
- import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n}from"./useDeckOverlay-GlkH_rvP.js";import{defineComponent as r,onMounted as i,onUnmounted as a,ref as o}from"vue";const s=[`load`,`loadstart`,`loaderror`,`unload`,`statechange`,`stylechange`,`collapse`,`expand`,`streamingstart`,`streamingstop`,`streamingprogress`,`budgetreached`],c=r({__name:`VControlLidar`,props:{options:{default:void 0},position:{default:`top-right`},defaultUrl:{default:void 0}},emits:s,setup(r,{expose:c,emit:l}){let u={collapsed:!0,pointSize:2,colorScheme:`elevation`,pickable:!1,autoZoom:!0},d=r,f=l,p=e(t),m=o(null);i(async()=>{await h()}),a(()=>{m.value&&p.value&&(p.value.removeControl(m.value),m.value=null)});let h=async()=>{let{LidarControl:e}=await n(`maplibre-gl-lidar`,()=>import(`maplibre-gl-lidar`));m.value=new e(d.options||u),p.value.addControl(m.value,d.position),s.forEach(e=>{m.value.on(e,t=>{f(e,t)})}),d.defaultUrl&&m.value.loadPointCloud(d.defaultUrl)};return c({loadPointCloud:(e,t)=>m.value?.loadPointCloud(e,t),loadPointCloudStreaming:(e,t)=>m.value?.loadPointCloudStreaming(e,t),loadPointCloudEptStreaming:(e,t)=>m.value?.loadPointCloudEptStreaming(e,t),unloadPointCloud:e=>m.value?.unloadPointCloud(e),flyToPointCloud:e=>m.value?.flyToPointCloud(e),setPointSize:e=>m.value?.setPointSize(e),setColorScheme:e=>m.value?.setColorScheme(e),setColormap:e=>m.value?.setColormap(e),getColormap:()=>m.value?.getColormap(),setColorRange:e=>m.value?.setColorRange(e),getColorRange:()=>m.value?.getColorRange(),setOpacity:e=>m.value?.setOpacity(e),setPickable:e=>m.value?.setPickable(e),setUsePercentile:e=>m.value?.setUsePercentile(e),getUsePercentile:()=>m.value?.getUsePercentile(),setElevationRange:(e,t)=>m.value?.setElevationRange(e,t),clearElevationRange:()=>m.value?.clearElevationRange(),setPointBudget:e=>m.value?.setPointBudget(e),setZOffset:e=>m.value?.setZOffset(e),setZOffsetEnabled:e=>m.value?.setZOffsetEnabled(e),getZOffset:()=>m.value?.getZOffset(),setTerrain:e=>m.value?.setTerrain(e),getTerrain:()=>m.value?.getTerrain(),setPickInfoFields:e=>m.value?.setPickInfoFields(e),getPickInfoFields:()=>m.value?.getPickInfoFields(),setClassificationVisibility:(e,t)=>m.value?.setClassificationVisibility(e,t),showAllClassifications:()=>m.value?.showAllClassifications(),hideAllClassifications:()=>m.value?.hideAllClassifications(),getHiddenClassifications:()=>m.value?.getHiddenClassifications(),getAvailableClassifications:()=>m.value?.getAvailableClassifications(),toggle:()=>m.value?.toggle(),expand:()=>m.value?.expand(),collapse:()=>m.value?.collapse(),getState:()=>m.value?.getState(),getPointClouds:()=>m.value?.getPointClouds(),stopStreaming:e=>m.value?.stopStreaming(e),isStreaming:e=>m.value?.isStreaming(e),getStreamingProgress:()=>m.value?.getStreamingProgress(),getMap:()=>m.value?.getMap(),getPanelElement:()=>m.value?.getPanelElement(),getControl:()=>m.value}),()=>{}}});export{c as VControlLidar};
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as r,onMounted as i,onUnmounted as a,ref as o}from"vue";const s=[`load`,`loadstart`,`loaderror`,`unload`,`statechange`,`stylechange`,`collapse`,`expand`,`streamingstart`,`streamingstop`,`streamingprogress`,`budgetreached`],c=r({__name:`VControlLidar`,props:{options:{default:void 0},position:{default:`top-right`},defaultUrl:{default:void 0}},emits:s,setup(r,{expose:c,emit:l}){let u={collapsed:!0,pointSize:2,colorScheme:`elevation`,pickable:!1,autoZoom:!0},d=r,f=l,p=e(t),m=o(null);i(async()=>{await h()}),a(()=>{m.value&&p.value&&(p.value.removeControl(m.value),m.value=null)});let h=async()=>{let{LidarControl:e}=await n(`maplibre-gl-lidar`,()=>import(`maplibre-gl-lidar`));m.value=new e(d.options||u),p.value.addControl(m.value,d.position),s.forEach(e=>{m.value.on(e,t=>{f(e,t)})}),d.defaultUrl&&m.value.loadPointCloud(d.defaultUrl)};return c({loadPointCloud:(e,t)=>m.value?.loadPointCloud(e,t),loadPointCloudStreaming:(e,t)=>m.value?.loadPointCloudStreaming(e,t),loadPointCloudEptStreaming:(e,t)=>m.value?.loadPointCloudEptStreaming(e,t),unloadPointCloud:e=>m.value?.unloadPointCloud(e),flyToPointCloud:e=>m.value?.flyToPointCloud(e),setPointSize:e=>m.value?.setPointSize(e),setColorScheme:e=>m.value?.setColorScheme(e),setColormap:e=>m.value?.setColormap(e),getColormap:()=>m.value?.getColormap(),setColorRange:e=>m.value?.setColorRange(e),getColorRange:()=>m.value?.getColorRange(),setOpacity:e=>m.value?.setOpacity(e),setPickable:e=>m.value?.setPickable(e),setUsePercentile:e=>m.value?.setUsePercentile(e),getUsePercentile:()=>m.value?.getUsePercentile(),setElevationRange:(e,t)=>m.value?.setElevationRange(e,t),clearElevationRange:()=>m.value?.clearElevationRange(),setPointBudget:e=>m.value?.setPointBudget(e),setZOffset:e=>m.value?.setZOffset(e),setZOffsetEnabled:e=>m.value?.setZOffsetEnabled(e),getZOffset:()=>m.value?.getZOffset(),setTerrain:e=>m.value?.setTerrain(e),getTerrain:()=>m.value?.getTerrain(),setPickInfoFields:e=>m.value?.setPickInfoFields(e),getPickInfoFields:()=>m.value?.getPickInfoFields(),setClassificationVisibility:(e,t)=>m.value?.setClassificationVisibility(e,t),showAllClassifications:()=>m.value?.showAllClassifications(),hideAllClassifications:()=>m.value?.hideAllClassifications(),getHiddenClassifications:()=>m.value?.getHiddenClassifications(),getAvailableClassifications:()=>m.value?.getAvailableClassifications(),toggle:()=>m.value?.toggle(),expand:()=>m.value?.expand(),collapse:()=>m.value?.collapse(),getState:()=>m.value?.getState(),getPointClouds:()=>m.value?.getPointClouds(),stopStreaming:e=>m.value?.stopStreaming(e),isStreaming:e=>m.value?.isStreaming(e),getStreamingProgress:()=>m.value?.getStreamingProgress(),getMap:()=>m.value?.getMap(),getPanelElement:()=>m.value?.getPanelElement(),getControl:()=>m.value}),()=>{}}});export{c as VControlLidar};
2
2
  //# sourceMappingURL=lidar.js.map
@@ -1,2 +1,2 @@
1
- import{r as e,t}from"./symbols-DXKzIgbY.js";import{i as n}from"./useDeckOverlay-GlkH_rvP.js";import{defineComponent as r,onBeforeUnmount as i,renderSlot as a,watch as o}from"vue";import{LineLayer as s}from"@deck.gl/layers";const c=r({__name:`VLayerDeckglLine`,props:{id:{},data:{},getSourcePosition:{},getTargetPosition:{},getColor:{},getWidth:{},widthUnits:{default:`pixels`},widthScale:{default:1},widthMinPixels:{default:0},widthMaxPixels:{default:2**53-1},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!0},autoHighlight:{type:Boolean,default:!1},highlightColor:{},beforeId:{}},emits:[`click`,`hover`],setup(r,{emit:c}){let l=r,u=c,d=e(t),{addLayer:f,removeLayer:p,updateLayer:m}=n(d),h=()=>new s({id:l.id,data:l.data,getSourcePosition:l.getSourcePosition,getTargetPosition:l.getTargetPosition,getColor:l.getColor??[0,0,0,255],getWidth:l.getWidth??1,widthUnits:l.widthUnits,widthScale:l.widthScale,widthMinPixels:l.widthMinPixels,widthMaxPixels:l.widthMaxPixels,opacity:l.opacity,visible:l.visible,pickable:l.pickable,autoHighlight:l.autoHighlight,highlightColor:l.highlightColor,beforeId:l.beforeId,onClick:e=>u(`click`,e),onHover:e=>u(`hover`,e)}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.getSourcePosition,l.getTargetPosition,l.getColor,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglLine};
2
- //# sourceMappingURL=line-2EN6ukkf.js.map
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{i as n}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as r,onBeforeUnmount as i,renderSlot as a,watch as o}from"vue";import{LineLayer as s}from"@deck.gl/layers";const c=r({__name:`VLayerDeckglLine`,props:{id:{},data:{},getSourcePosition:{},getTargetPosition:{},getColor:{},getWidth:{},widthUnits:{default:`pixels`},widthScale:{default:1},widthMinPixels:{default:0},widthMaxPixels:{default:2**53-1},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!0},autoHighlight:{type:Boolean,default:!1},highlightColor:{},beforeId:{}},emits:[`click`,`hover`],setup(r,{emit:c}){let l=r,u=c,d=e(t),{addLayer:f,removeLayer:p,updateLayer:m}=n(d),h=()=>new s({id:l.id,data:l.data,getSourcePosition:l.getSourcePosition,getTargetPosition:l.getTargetPosition,getColor:l.getColor??[0,0,0,255],getWidth:l.getWidth??1,widthUnits:l.widthUnits,widthScale:l.widthScale,widthMinPixels:l.widthMinPixels,widthMaxPixels:l.widthMaxPixels,opacity:l.opacity,visible:l.visible,pickable:l.pickable,autoHighlight:l.autoHighlight,highlightColor:l.highlightColor,beforeId:l.beforeId,onClick:e=>u(`click`,e),onHover:e=>u(`hover`,e)}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.getSourcePosition,l.getTargetPosition,l.getColor,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglLine};
2
+ //# sourceMappingURL=line-B77d8tio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"line-2EN6ukkf.js","names":[],"sources":["../src/layers/deckgl/line/VLayerDeckglLine.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render flat straight lines between coordinate pairs.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { LineLayer } from '@deck.gl/layers';\n import type { LineLayerProps } from '@deck.gl/layers';\n import type { PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n import type { Color } from '../_shared/types';\n\n type Accessor<In, Out> = Out | ((object: In) => Out);\n\n interface Props<D = unknown> {\n id: string;\n data: D[] | string | Promise<D[]>;\n getSourcePosition: Accessor<D, Position>;\n getTargetPosition: Accessor<D, Position>;\n getColor?: Accessor<D, Color>;\n getWidth?: Accessor<D, number>;\n widthUnits?: 'meters' | 'common' | 'pixels';\n widthScale?: number;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n opacity?: number;\n visible?: boolean;\n pickable?: boolean;\n autoHighlight?: boolean;\n highlightColor?: Color;\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n widthUnits: 'pixels',\n widthScale: 1,\n widthMinPixels: 0,\n widthMaxPixels: Number.MAX_SAFE_INTEGER,\n opacity: 1,\n visible: true,\n pickable: true,\n autoHighlight: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const createLayer = () => {\n return new LineLayer({\n id: props.id,\n data: props.data,\n getSourcePosition: props.getSourcePosition,\n getTargetPosition: props.getTargetPosition,\n getColor: props.getColor ?? [0, 0, 0, 255],\n getWidth: props.getWidth ?? 1,\n widthUnits: props.widthUnits,\n widthScale: props.widthScale,\n widthMinPixels: props.widthMinPixels,\n widthMaxPixels: props.widthMaxPixels,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n highlightColor: props.highlightColor,\n beforeId: props.beforeId,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n } as LineLayerProps);\n };\n\n const initializeLayer = () => {\n addLayer(createLayer());\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.data,\n props.getSourcePosition,\n props.getTargetPosition,\n props.getColor,\n props.opacity,\n props.visible,\n ],\n () => updateLayer(props.id, createLayer()),\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"spBAwCE,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAU,CACnB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,kBAAmB,EAAM,kBACzB,kBAAmB,EAAM,kBACzB,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,EAAG,GAAG,EACzC,SAAU,EAAM,UAAY,EAC5B,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,eAAgB,EAAM,eACtB,SAAU,EAAM,SAChB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,CACpD,CAAmB,EAGf,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,KACN,EAAM,kBACN,EAAM,kBACN,EAAM,SACN,EAAM,QACN,EAAM,OACR,MACM,EAAY,EAAM,GAAI,EAAY,CAAC,EACzC,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
1
+ {"version":3,"file":"line-B77d8tio.js","names":[],"sources":["../src/layers/deckgl/line/VLayerDeckglLine.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render flat straight lines between coordinate pairs.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { LineLayer } from '@deck.gl/layers';\n import type { LineLayerProps } from '@deck.gl/layers';\n import type { PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n import type { Color } from '../_shared/types';\n\n type Accessor<In, Out> = Out | ((object: In) => Out);\n\n interface Props<D = unknown> {\n id: string;\n data: D[] | string | Promise<D[]>;\n getSourcePosition: Accessor<D, Position>;\n getTargetPosition: Accessor<D, Position>;\n getColor?: Accessor<D, Color>;\n getWidth?: Accessor<D, number>;\n widthUnits?: 'meters' | 'common' | 'pixels';\n widthScale?: number;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n opacity?: number;\n visible?: boolean;\n pickable?: boolean;\n autoHighlight?: boolean;\n highlightColor?: Color;\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n widthUnits: 'pixels',\n widthScale: 1,\n widthMinPixels: 0,\n widthMaxPixels: Number.MAX_SAFE_INTEGER,\n opacity: 1,\n visible: true,\n pickable: true,\n autoHighlight: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const createLayer = () => {\n return new LineLayer({\n id: props.id,\n data: props.data,\n getSourcePosition: props.getSourcePosition,\n getTargetPosition: props.getTargetPosition,\n getColor: props.getColor ?? [0, 0, 0, 255],\n getWidth: props.getWidth ?? 1,\n widthUnits: props.widthUnits,\n widthScale: props.widthScale,\n widthMinPixels: props.widthMinPixels,\n widthMaxPixels: props.widthMaxPixels,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n highlightColor: props.highlightColor,\n beforeId: props.beforeId,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n } as LineLayerProps);\n };\n\n const initializeLayer = () => {\n addLayer(createLayer());\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.data,\n props.getSourcePosition,\n props.getTargetPosition,\n props.getColor,\n props.opacity,\n props.visible,\n ],\n () => updateLayer(props.id, createLayer()),\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"spBAwCE,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAU,CACnB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,kBAAmB,EAAM,kBACzB,kBAAmB,EAAM,kBACzB,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,EAAG,GAAG,EACzC,SAAU,EAAM,UAAY,EAC5B,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,eAAgB,EAAM,eACtB,SAAU,EAAM,SAChB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,CACpD,CAAmB,EAGf,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,KACN,EAAM,kBACN,EAAM,kBACN,EAAM,SACN,EAAM,QACN,EAAM,OACR,MACM,EAAY,EAAM,GAAI,EAAY,CAAC,EACzC,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
@@ -1,4 +1,4 @@
1
- import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-GlkH_rvP.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMosaic`,props:{id:{},sources:{},renderMode:{default:`trueColor`},customRenderModules:{},colormapData:{},maxCacheSize:{default:1/0},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},highlightColor:{},ndviRange:{default:()=>[-1,1]},beforeId:{}},emits:[`click`,`hover`,`sourceLoad`,`error`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_}=r(h),v=``,y=c(null),b={name:`set-alpha-1`,inject:{"fs:DECKGL_FILTER_COLOR":`color = vec4(color.rgb, 1.0);`}},x={name:`false-color-infrared`,inject:{"fs:DECKGL_FILTER_COLOR":`
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMosaic`,props:{id:{},sources:{},renderMode:{default:`trueColor`},customRenderModules:{},colormapData:{},maxCacheSize:{default:1/0},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},highlightColor:{},ndviRange:{default:()=>[-1,1]},beforeId:{}},emits:[`click`,`hover`,`sourceLoad`,`error`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_}=r(h),v=``,y=c(null),b={name:`set-alpha-1`,inject:{"fs:DECKGL_FILTER_COLOR":`color = vec4(color.rgb, 1.0);`}},x={name:`false-color-infrared`,inject:{"fs:DECKGL_FILTER_COLOR":`
2
2
  float nir = color[3];
3
3
  float red = color[0];
4
4
  float green = color[1];
@@ -40,4 +40,4 @@ import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckO
40
40
 
41
41
  color.rgb = result;
42
42
  `}};function T(e,t,n,r,i){if(e===`custom`&&i)return i(t);let a=[{module:n.CreateTexture,props:{textureName:t}}];return e===`trueColor`?[...a,{module:b}]:e===`falseColor`?[...a,{module:x},{module:b}]:[...a,{module:S},{module:C,props:{ndviMin:r[0],ndviMax:r[1]}},{module:w},{module:b}]}function E(){let e=y.value;if(!e||!p.sources.length)return null;let{MosaicLayer:t,COGLayer:n,CreateTexture:r,fromUrl:i,resolveEpsg:a}=e,o=l(p.sources),s=l(p.renderMode),c=l(p.ndviRange),u=p.customRenderModules;return new t({id:`${l(p.id)}-mosaic`,sources:o,maxCacheSize:l(p.maxCacheSize),getSource:async e=>{try{let t=await i(e.assets.image.href);return m(`sourceLoad`,e),t}catch(t){throw m(`error`,t,e),t}},renderSource:(e,{data:t,signal:i})=>t?new n({id:`cog-${e.assets.image.href}-${s}`,geotiff:t,epsgResolver:a,getTileData:async(e,t)=>{let{device:n,x:r,y:a}=t,{array:o}=await e.fetchTile(r,a,{signal:i,boundless:!1});if(o.layout===`band-separate`)throw Error(`Band-separate COGs are not supported`);return{texture:n.createTexture({data:o.data,format:`rgba8unorm`,width:o.width,height:o.height}),width:o.width,height:o.height}},renderTile:e=>({image:e.texture,renderPipeline:T(s,e.texture,{CreateTexture:r},c,u)}),signal:i}):null})}async function D(){try{let[e,t,r,i]=await Promise.all([n(`@developmentseed/deck.gl-geotiff`,()=>import(`@developmentseed/deck.gl-geotiff`),d),n(`@developmentseed/deck.gl-raster`,()=>import(`@developmentseed/deck.gl-raster/gpu-modules`),d),n(`@developmentseed/geotiff`,()=>import(`@developmentseed/geotiff`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);y.value=a({MosaicLayer:e.MosaicLayer,COGLayer:e.COGLayer,CreateTexture:t.CreateTexture,fromUrl:r.GeoTIFF.fromUrl,resolveEpsg:i.epsgResolver});let o=E();o&&(v=o.id,g(o))}catch(e){console.error(`[deck.gl-mosaic] Error loading MosaicLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed`),m(`error`,e)}}return u(h,e=>{e&&D()},{immediate:!0}),u(()=>[p.sources,p.renderMode,p.ndviRange,p.opacity,p.visible],()=>{if(y.value){let e=E();e&&(v=e.id,g(e))}},{deep:!0}),o(()=>{v&&_(v)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerMosaic};
43
- //# sourceMappingURL=mosaic-DUwBxfGg.js.map
43
+ //# sourceMappingURL=mosaic-Bm1aKa0Q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mosaic-DUwBxfGg.js","names":[],"sources":["../src/layers/deckgl/mosaic/VLayerMosaic.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Client-side COG mosaic for STAC items — GPU-rendered, no tile server required.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMosaic - Client-side COG mosaic layer for STAC items\n *\n * Uses @developmentseed/deck.gl-geotiff v0.3.0 MosaicLayer for efficient\n * client-side rendering of multiple COGs from STAC APIs.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/naip-mosaic/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import type { GeoTIFF, Overview } from '@developmentseed/geotiff';\n import type { Texture } from '@luma.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { ShaderModule } from '@luma.gl/shadertools';\n import type {\n COGLayerProps,\n GetTileDataOptions,\n MosaicLayerProps,\n MosaicSource as BaseMosaicSource,\n } from '@developmentseed/deck.gl-geotiff';\n import type { EpsgResolver } from '@developmentseed/proj';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n const MOSAIC_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n\n /**\n * A STAC-like item with bounding box and COG asset URL\n * Extends the base MosaicSource from deck.gl-geotiff with asset info\n */\n export interface MosaicSource extends BaseMosaicSource {\n /** Asset containing the COG URL */\n assets: {\n image: { href: string };\n };\n }\n\n /**\n * Render mode for the mosaic layer\n */\n export type MosaicRenderMode = 'trueColor' | 'falseColor' | 'ndvi' | 'custom';\n\n /**\n * Custom render module for advanced band manipulation\n */\n export interface RenderModule {\n module: { name: string; inject?: Record<string, string> };\n props?: Record<string, unknown>;\n }\n\n interface Props {\n id: string;\n /**\n * Array of STAC-like items with bbox and COG asset URLs\n */\n sources: MosaicSource[];\n /**\n * Render mode: trueColor (RGB), falseColor (NIR-R-G), ndvi (with colormap)\n */\n renderMode?: MosaicRenderMode;\n /**\n * Custom render modules (only used when renderMode is 'custom')\n */\n customRenderModules?: (texture: Texture) => RenderModule[];\n /**\n * Custom colormap data for NDVI (Uint8ClampedArray of RGBA values, 256 colors)\n * @reserved Currently not implemented - NDVI uses built-in cfastie colormap.\n */\n colormapData?: Uint8ClampedArray;\n /**\n * Maximum number of tiles to cache\n */\n maxCacheSize?: number;\n /**\n * Layer opacity (0-1)\n */\n opacity?: number;\n /**\n * Layer visibility\n */\n visible?: boolean;\n /**\n * Enable picking on this layer\n */\n pickable?: boolean;\n /**\n * Auto highlight on hover\n */\n autoHighlight?: boolean;\n /**\n * Highlight color when autoHighlight is enabled\n */\n highlightColor?: Color;\n /**\n * NDVI range filter: pixels outside [min, max] are discarded.\n * Only applies when renderMode is 'ndvi'. Range: [-1, 1].\n */\n ndviRange?: [number, number];\n /**\n * Insert layer before this layer id\n */\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n renderMode: 'trueColor',\n maxCacheSize: Infinity,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n ndviRange: () => [-1, 1] as [number, number],\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n sourceLoad: [source: MosaicSource];\n error: [error: Error, source?: MosaicSource];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer } = useDeckOverlay(map);\n let activeLayerId = '';\n\n interface TextureData {\n texture: Texture;\n width: number;\n height: number;\n }\n\n interface LoadedModules {\n MosaicLayer: typeof import('@developmentseed/deck.gl-geotiff').MosaicLayer;\n COGLayer: typeof import('@developmentseed/deck.gl-geotiff').COGLayer;\n CreateTexture: RasterModule['module'];\n fromUrl: typeof GeoTIFF.fromUrl;\n resolveEpsg: EpsgResolver;\n }\n\n const modules = shallowRef<LoadedModules | null>(null);\n\n // Shader modules for different render modes\n const SetAlpha1 = {\n name: 'set-alpha-1',\n inject: { 'fs:DECKGL_FILTER_COLOR': `color = vec4(color.rgb, 1.0);` },\n };\n\n const FalseColorInfrared = {\n name: 'false-color-infrared',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir = color[3];\n float red = color[0];\n float green = color[1];\n color.rgb = vec3(nir, red, green);\n `,\n },\n };\n\n // --- NDVI Pipeline: 3 separate modules matching upstream pattern ---\n // Uniforms update per-draw via MeshTextureLayer.draw() → setProps() without\n // re-rendering tiles. Baked constants don't work because renderTile only runs\n // when tiles are FIRST FETCHED — cached tiles keep old shader modules.\n\n // Step 1: Compute NDVI from raw RGBA bands, store in color.r\n const NDVICompute = {\n name: 'ndvi-compute',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir_c = color[3];\n float red_c = color[0];\n float sum_c = nir_c + red_c;\n float ndvi_c = sum_c > 0.001 ? (nir_c - red_c) / sum_c : 0.0;\n color = vec4(ndvi_c, ndvi_c, ndvi_c, 1.0);\n `,\n },\n };\n\n // Step 2: Filter by NDVI range — uniforms update per-draw without tile re-render\n const ndviFilterUniformBlock = `\\\nuniform ndviFilterUniforms {\n float ndviMin;\n float ndviMax;\n} ndviFilter;\n`;\n\n const NDVIFilter = {\n name: 'ndviFilter',\n fs: ndviFilterUniformBlock,\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n if (color.r < ndviFilter.ndviMin || color.r > ndviFilter.ndviMax) {\n discard;\n }\n `,\n },\n uniformTypes: {\n ndviMin: 'f32',\n ndviMax: 'f32',\n },\n getUniforms: (uniformProps: Record<string, unknown>) => ({\n ndviMin: (uniformProps.ndviMin as number) ?? -1.0,\n ndviMax: (uniformProps.ndviMax as number) ?? 1.0,\n }),\n } as const satisfies ShaderModule<{ ndviMin: number; ndviMax: number }>;\n\n // Step 3: Apply cfastie-inspired colormap gradient from color.r (NDVI value)\n const NDVIColormap = {\n name: 'ndvi-colormap',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float t = clamp((color.r + 1.0) / 2.0, 0.0, 1.0);\n \n vec3 result;\n if (t < 0.4) {\n float localT = t / 0.4;\n result = mix(vec3(0.0, 0.0, 0.5), vec3(0.5, 0.8, 0.9), localT);\n } else if (t < 0.5) {\n float localT = (t - 0.4) / 0.1;\n result = mix(vec3(0.5, 0.8, 0.9), vec3(0.9, 0.9, 0.4), localT);\n } else if (t < 0.6) {\n float localT = (t - 0.5) / 0.1;\n result = mix(vec3(0.9, 0.9, 0.4), vec3(0.6, 0.8, 0.2), localT);\n } else if (t < 0.75) {\n float localT = (t - 0.6) / 0.15;\n result = mix(vec3(0.6, 0.8, 0.2), vec3(0.1, 0.6, 0.1), localT);\n } else {\n float localT = (t - 0.75) / 0.25;\n result = mix(vec3(0.1, 0.6, 0.1), vec3(0.0, 0.3, 0.0), localT);\n }\n \n color.rgb = result;\n `,\n },\n };\n\n function getRenderModules(\n mode: MosaicRenderMode,\n texture: Texture,\n mods: {\n CreateTexture: RasterModule['module'];\n },\n ndviRange: [number, number],\n customModules?: (texture: Texture) => RenderModule[],\n ): RasterModule[] {\n if (mode === 'custom' && customModules) {\n return customModules(texture) as RasterModule[];\n }\n\n const base: RasterModule[] = [\n { module: mods.CreateTexture, props: { textureName: texture } },\n ];\n\n if (mode === 'trueColor') {\n return [...base, { module: SetAlpha1 }];\n }\n\n if (mode === 'falseColor') {\n return [...base, { module: FalseColorInfrared }, { module: SetAlpha1 }];\n }\n\n // NDVI pipeline: compute → filter → colormap → alpha\n // NDVIFilter uses uniformTypes + getUniforms so uniform values update\n // per-draw via MeshTextureLayer.draw() WITHOUT re-rendering tiles.\n return [\n ...base,\n { module: NDVICompute },\n {\n module: NDVIFilter,\n props: { ndviMin: ndviRange[0], ndviMax: ndviRange[1] },\n },\n { module: NDVIColormap },\n { module: SetAlpha1 },\n ];\n }\n\n function createLayer() {\n const mods = modules.value;\n if (!mods || !props.sources.length) return null;\n\n const { MosaicLayer, COGLayer, CreateTexture, fromUrl, resolveEpsg } = mods;\n\n const rawSources = toRaw(props.sources);\n const renderMode = toRaw(props.renderMode);\n const ndviRange = toRaw(props.ndviRange) as [number, number];\n const customRenderModules = props.customRenderModules;\n\n // Fixed ID matching upstream pattern — deck.gl diffs old vs new layer\n // via setProps, detecting changed renderSource/renderTile callbacks.\n const newId = `${toRaw(props.id)}-mosaic`;\n const layer = new MosaicLayer<MosaicSource, GeoTIFF>({\n id: newId,\n sources: rawSources,\n maxCacheSize: toRaw(props.maxCacheSize),\n\n getSource: async (source) => {\n try {\n const tiff = await fromUrl(source.assets.image.href);\n emit('sourceLoad', source);\n return tiff;\n } catch (error) {\n emit('error', error as Error, source);\n throw error;\n }\n },\n\n renderSource: (source, { data, signal }) => {\n if (!data) return null;\n\n return new COGLayer<TextureData>({\n id: `cog-${source.assets.image.href}-${renderMode}`,\n geotiff: data,\n epsgResolver: resolveEpsg,\n getTileData: async (\n image: GeoTIFF | Overview,\n options: GetTileDataOptions,\n ) => {\n const { device, x, y } = options;\n const tile = await image.fetchTile(x, y, {\n signal,\n boundless: false,\n });\n const { array } = tile;\n if (array.layout === 'band-separate') {\n throw new Error('Band-separate COGs are not supported');\n }\n const texture = device.createTexture({\n data: array.data,\n format: 'rgba8unorm',\n width: array.width,\n height: array.height,\n });\n return {\n texture,\n width: array.width,\n height: array.height,\n };\n },\n renderTile: (tileData: TextureData) => ({\n image: tileData.texture,\n renderPipeline: getRenderModules(\n renderMode,\n tileData.texture,\n { CreateTexture },\n ndviRange,\n customRenderModules,\n ),\n }),\n signal,\n } as COGLayerProps<TextureData>);\n },\n } as MosaicLayerProps<MosaicSource, GeoTIFF>);\n\n return layer;\n }\n\n async function initializeLayer() {\n try {\n const [geotiffModule, rasterModule, devGeotiff, projModule] =\n await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/deck.gl-raster',\n () => import('@developmentseed/deck.gl-raster/gpu-modules'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/geotiff',\n () => import('@developmentseed/geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MOSAIC_PEER_INSTALL,\n ),\n ]);\n\n modules.value = markRaw({\n MosaicLayer: geotiffModule.MosaicLayer,\n COGLayer: geotiffModule.COGLayer,\n CreateTexture: rasterModule.CreateTexture,\n fromUrl: devGeotiff.GeoTIFF.fromUrl,\n resolveEpsg: projModule.epsgResolver,\n });\n\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-mosaic] Error loading MosaicLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed',\n );\n emit('error', error as Error);\n }\n }\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.renderMode,\n props.ndviRange,\n props.opacity,\n props.visible,\n ],\n () => {\n if (modules.value) {\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n if (activeLayerId) {\n removeLayer(activeLayerId);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAuCE,MAAM,EACJ,6jBAgFF,IAAM,EAAQ,EAUR,EAAO,EAOP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,eAAgB,EAAe,CAAG,EAChD,EAAgB,GAgBd,EAAU,EAAiC,IAAI,EAG/C,EAAY,CAChB,KAAM,cACN,OAAQ,CAAE,yBAA0B,+BAAgC,CACtE,EAEM,EAAqB,CACzB,KAAM,uBACN,OAAQ,CACN,yBAA0B;;;;;OAM5B,CACF,EAQM,EAAc,CAClB,KAAM,eACN,OAAQ,CACN,yBAA0B;;;;;;OAO5B,CACF,EAUM,EAAa,CACjB,KAAM,aACN,GAAI;;;;EACJ,OAAQ,CACN,yBAA0B;;;;OAK5B,EACA,aAAc,CACZ,QAAS,MACT,QAAS,KACX,EACA,YAAc,IAA2C,CACvD,QAAU,EAAa,SAAsB,GAC7C,QAAU,EAAa,SAAsB,CAC/C,EACF,EAGM,EAAe,CACnB,KAAM,gBACN,OAAQ,CACN,yBAA0B;;;;;;;;;;;;;;;;;;;;;;OAuB5B,CACF,EAEA,SAAS,EACP,EACA,EACA,EAGA,EACA,EACgB,CAChB,GAAI,IAAS,UAAY,EACvB,OAAO,EAAc,CAAO,EAG9B,IAAM,EAAuB,CAC3B,CAAE,OAAQ,EAAK,cAAe,MAAO,CAAE,YAAa,CAAQ,CAAE,CAChE,EAaA,OAXI,IAAS,YACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAU,CAAC,EAGpC,IAAS,aACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAmB,EAAG,CAAE,OAAQ,CAAU,CAAC,EAMjE,CACL,GAAG,EACH,CAAE,OAAQ,CAAY,EACtB,CACE,OAAQ,EACR,MAAO,CAAE,QAAS,EAAU,GAAI,QAAS,EAAU,EAAG,CACxD,EACA,CAAE,OAAQ,CAAa,EACvB,CAAE,OAAQ,CAAU,CACtB,CACF,CAEA,SAAS,GAAc,CACrB,IAAM,EAAO,EAAQ,MACrB,GAAI,CAAC,GAAQ,CAAC,EAAM,QAAQ,OAAQ,OAAO,KAE3C,GAAM,CAAE,cAAa,WAAU,gBAAe,UAAS,eAAgB,EAEjE,EAAa,EAAM,EAAM,OAAO,EAChC,EAAa,EAAM,EAAM,UAAU,EACnC,EAAY,EAAM,EAAM,SAAS,EACjC,EAAsB,EAAM,oBAoElC,OAAO,IA/DW,EAAmC,CACnD,GAAI,GAFW,EAAM,EAAM,EAAE,EAAE,SAG/B,QAAS,EACT,aAAc,EAAM,EAAM,YAAY,EAEtC,UAAW,KAAO,IAAW,CAC3B,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,EAAO,OAAO,MAAM,IAAI,EAEnD,OADA,EAAK,aAAc,CAAM,EAClB,CACT,OAAS,EAAO,CAEd,MADA,EAAK,QAAS,EAAgB,CAAM,EAC9B,CACR,CACF,EAEA,cAAe,EAAQ,CAAE,OAAM,YACxB,EAEE,IAAI,EAAsB,CAC/B,GAAI,OAAO,EAAO,OAAO,MAAM,KAAK,GAAG,IACvC,QAAS,EACT,aAAc,EACd,YAAa,MACX,EACA,IACG,CACH,GAAM,CAAE,SAAQ,IAAG,KAAM,EAKnB,CAAE,SAAU,MAJC,EAAM,UAAU,EAAG,EAAG,CACvC,SACA,UAAW,EACb,CAAC,EAED,GAAI,EAAM,SAAW,gBACnB,MAAU,MAAM,sCAAsC,EAQxD,MAAO,CACL,QAPc,EAAO,cAAc,CACnC,KAAM,EAAM,KACZ,OAAQ,aACR,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CAEE,EACA,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CACF,EACA,WAAa,IAA2B,CACtC,MAAO,EAAS,QAChB,eAAgB,EACd,EACA,EAAS,QACT,CAAE,eAAc,EAChB,EACA,CACF,CACF,GACA,QACF,CAA+B,EA1Cb,IA4CtB,CAEO,CACT,CAEA,eAAe,GAAkB,CAC/B,GAAI,CACF,GAAM,CAAC,EAAe,EAAc,EAAY,GAC9C,MAAM,QAAQ,IAAI,CAChB,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,sCACM,OAAO,+CACb,CACF,EACA,EACE,+BACM,OAAO,4BACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAEH,EAAQ,MAAQ,EAAQ,CACtB,YAAa,EAAc,YAC3B,SAAU,EAAc,SACxB,cAAe,EAAa,cAC5B,QAAS,EAAW,QAAQ,QAC5B,YAAa,EAAW,YAC1B,CAAC,EAED,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,OAAS,EAAO,CACd,QAAQ,MAAM,8CAA+C,CAAK,EAClE,QAAQ,MACN,yHACF,EACA,EAAK,QAAS,CAAc,CAC9B,CACF,QAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,WACN,EAAM,UACN,EAAM,QACN,EAAM,OACR,MACM,CACJ,GAAI,EAAQ,MAAO,CACjB,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,CACF,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CAChB,GACF,EAAY,CAAa,CAE7B,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
1
+ {"version":3,"file":"mosaic-Bm1aKa0Q.js","names":[],"sources":["../src/layers/deckgl/mosaic/VLayerMosaic.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Client-side COG mosaic for STAC items — GPU-rendered, no tile server required.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMosaic - Client-side COG mosaic layer for STAC items\n *\n * Uses @developmentseed/deck.gl-geotiff v0.3.0 MosaicLayer for efficient\n * client-side rendering of multiple COGs from STAC APIs.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/naip-mosaic/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import type { GeoTIFF, Overview } from '@developmentseed/geotiff';\n import type { Texture } from '@luma.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { ShaderModule } from '@luma.gl/shadertools';\n import type {\n COGLayerProps,\n GetTileDataOptions,\n MosaicLayerProps,\n MosaicSource as BaseMosaicSource,\n } from '@developmentseed/deck.gl-geotiff';\n import type { EpsgResolver } from '@developmentseed/proj';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n const MOSAIC_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n\n /**\n * A STAC-like item with bounding box and COG asset URL\n * Extends the base MosaicSource from deck.gl-geotiff with asset info\n */\n export interface MosaicSource extends BaseMosaicSource {\n /** Asset containing the COG URL */\n assets: {\n image: { href: string };\n };\n }\n\n /**\n * Render mode for the mosaic layer\n */\n export type MosaicRenderMode = 'trueColor' | 'falseColor' | 'ndvi' | 'custom';\n\n /**\n * Custom render module for advanced band manipulation\n */\n export interface RenderModule {\n module: { name: string; inject?: Record<string, string> };\n props?: Record<string, unknown>;\n }\n\n interface Props {\n id: string;\n /**\n * Array of STAC-like items with bbox and COG asset URLs\n */\n sources: MosaicSource[];\n /**\n * Render mode: trueColor (RGB), falseColor (NIR-R-G), ndvi (with colormap)\n */\n renderMode?: MosaicRenderMode;\n /**\n * Custom render modules (only used when renderMode is 'custom')\n */\n customRenderModules?: (texture: Texture) => RenderModule[];\n /**\n * Custom colormap data for NDVI (Uint8ClampedArray of RGBA values, 256 colors)\n * @reserved Currently not implemented - NDVI uses built-in cfastie colormap.\n */\n colormapData?: Uint8ClampedArray;\n /**\n * Maximum number of tiles to cache\n */\n maxCacheSize?: number;\n /**\n * Layer opacity (0-1)\n */\n opacity?: number;\n /**\n * Layer visibility\n */\n visible?: boolean;\n /**\n * Enable picking on this layer\n */\n pickable?: boolean;\n /**\n * Auto highlight on hover\n */\n autoHighlight?: boolean;\n /**\n * Highlight color when autoHighlight is enabled\n */\n highlightColor?: Color;\n /**\n * NDVI range filter: pixels outside [min, max] are discarded.\n * Only applies when renderMode is 'ndvi'. Range: [-1, 1].\n */\n ndviRange?: [number, number];\n /**\n * Insert layer before this layer id\n */\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n renderMode: 'trueColor',\n maxCacheSize: Infinity,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n ndviRange: () => [-1, 1] as [number, number],\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n sourceLoad: [source: MosaicSource];\n error: [error: Error, source?: MosaicSource];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer } = useDeckOverlay(map);\n let activeLayerId = '';\n\n interface TextureData {\n texture: Texture;\n width: number;\n height: number;\n }\n\n interface LoadedModules {\n MosaicLayer: typeof import('@developmentseed/deck.gl-geotiff').MosaicLayer;\n COGLayer: typeof import('@developmentseed/deck.gl-geotiff').COGLayer;\n CreateTexture: RasterModule['module'];\n fromUrl: typeof GeoTIFF.fromUrl;\n resolveEpsg: EpsgResolver;\n }\n\n const modules = shallowRef<LoadedModules | null>(null);\n\n // Shader modules for different render modes\n const SetAlpha1 = {\n name: 'set-alpha-1',\n inject: { 'fs:DECKGL_FILTER_COLOR': `color = vec4(color.rgb, 1.0);` },\n };\n\n const FalseColorInfrared = {\n name: 'false-color-infrared',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir = color[3];\n float red = color[0];\n float green = color[1];\n color.rgb = vec3(nir, red, green);\n `,\n },\n };\n\n // --- NDVI Pipeline: 3 separate modules matching upstream pattern ---\n // Uniforms update per-draw via MeshTextureLayer.draw() → setProps() without\n // re-rendering tiles. Baked constants don't work because renderTile only runs\n // when tiles are FIRST FETCHED — cached tiles keep old shader modules.\n\n // Step 1: Compute NDVI from raw RGBA bands, store in color.r\n const NDVICompute = {\n name: 'ndvi-compute',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir_c = color[3];\n float red_c = color[0];\n float sum_c = nir_c + red_c;\n float ndvi_c = sum_c > 0.001 ? (nir_c - red_c) / sum_c : 0.0;\n color = vec4(ndvi_c, ndvi_c, ndvi_c, 1.0);\n `,\n },\n };\n\n // Step 2: Filter by NDVI range — uniforms update per-draw without tile re-render\n const ndviFilterUniformBlock = `\\\nuniform ndviFilterUniforms {\n float ndviMin;\n float ndviMax;\n} ndviFilter;\n`;\n\n const NDVIFilter = {\n name: 'ndviFilter',\n fs: ndviFilterUniformBlock,\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n if (color.r < ndviFilter.ndviMin || color.r > ndviFilter.ndviMax) {\n discard;\n }\n `,\n },\n uniformTypes: {\n ndviMin: 'f32',\n ndviMax: 'f32',\n },\n getUniforms: (uniformProps: Record<string, unknown>) => ({\n ndviMin: (uniformProps.ndviMin as number) ?? -1.0,\n ndviMax: (uniformProps.ndviMax as number) ?? 1.0,\n }),\n } as const satisfies ShaderModule<{ ndviMin: number; ndviMax: number }>;\n\n // Step 3: Apply cfastie-inspired colormap gradient from color.r (NDVI value)\n const NDVIColormap = {\n name: 'ndvi-colormap',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float t = clamp((color.r + 1.0) / 2.0, 0.0, 1.0);\n \n vec3 result;\n if (t < 0.4) {\n float localT = t / 0.4;\n result = mix(vec3(0.0, 0.0, 0.5), vec3(0.5, 0.8, 0.9), localT);\n } else if (t < 0.5) {\n float localT = (t - 0.4) / 0.1;\n result = mix(vec3(0.5, 0.8, 0.9), vec3(0.9, 0.9, 0.4), localT);\n } else if (t < 0.6) {\n float localT = (t - 0.5) / 0.1;\n result = mix(vec3(0.9, 0.9, 0.4), vec3(0.6, 0.8, 0.2), localT);\n } else if (t < 0.75) {\n float localT = (t - 0.6) / 0.15;\n result = mix(vec3(0.6, 0.8, 0.2), vec3(0.1, 0.6, 0.1), localT);\n } else {\n float localT = (t - 0.75) / 0.25;\n result = mix(vec3(0.1, 0.6, 0.1), vec3(0.0, 0.3, 0.0), localT);\n }\n \n color.rgb = result;\n `,\n },\n };\n\n function getRenderModules(\n mode: MosaicRenderMode,\n texture: Texture,\n mods: {\n CreateTexture: RasterModule['module'];\n },\n ndviRange: [number, number],\n customModules?: (texture: Texture) => RenderModule[],\n ): RasterModule[] {\n if (mode === 'custom' && customModules) {\n return customModules(texture) as RasterModule[];\n }\n\n const base: RasterModule[] = [\n { module: mods.CreateTexture, props: { textureName: texture } },\n ];\n\n if (mode === 'trueColor') {\n return [...base, { module: SetAlpha1 }];\n }\n\n if (mode === 'falseColor') {\n return [...base, { module: FalseColorInfrared }, { module: SetAlpha1 }];\n }\n\n // NDVI pipeline: compute → filter → colormap → alpha\n // NDVIFilter uses uniformTypes + getUniforms so uniform values update\n // per-draw via MeshTextureLayer.draw() WITHOUT re-rendering tiles.\n return [\n ...base,\n { module: NDVICompute },\n {\n module: NDVIFilter,\n props: { ndviMin: ndviRange[0], ndviMax: ndviRange[1] },\n },\n { module: NDVIColormap },\n { module: SetAlpha1 },\n ];\n }\n\n function createLayer() {\n const mods = modules.value;\n if (!mods || !props.sources.length) return null;\n\n const { MosaicLayer, COGLayer, CreateTexture, fromUrl, resolveEpsg } = mods;\n\n const rawSources = toRaw(props.sources);\n const renderMode = toRaw(props.renderMode);\n const ndviRange = toRaw(props.ndviRange) as [number, number];\n const customRenderModules = props.customRenderModules;\n\n // Fixed ID matching upstream pattern — deck.gl diffs old vs new layer\n // via setProps, detecting changed renderSource/renderTile callbacks.\n const newId = `${toRaw(props.id)}-mosaic`;\n const layer = new MosaicLayer<MosaicSource, GeoTIFF>({\n id: newId,\n sources: rawSources,\n maxCacheSize: toRaw(props.maxCacheSize),\n\n getSource: async (source) => {\n try {\n const tiff = await fromUrl(source.assets.image.href);\n emit('sourceLoad', source);\n return tiff;\n } catch (error) {\n emit('error', error as Error, source);\n throw error;\n }\n },\n\n renderSource: (source, { data, signal }) => {\n if (!data) return null;\n\n return new COGLayer<TextureData>({\n id: `cog-${source.assets.image.href}-${renderMode}`,\n geotiff: data,\n epsgResolver: resolveEpsg,\n getTileData: async (\n image: GeoTIFF | Overview,\n options: GetTileDataOptions,\n ) => {\n const { device, x, y } = options;\n const tile = await image.fetchTile(x, y, {\n signal,\n boundless: false,\n });\n const { array } = tile;\n if (array.layout === 'band-separate') {\n throw new Error('Band-separate COGs are not supported');\n }\n const texture = device.createTexture({\n data: array.data,\n format: 'rgba8unorm',\n width: array.width,\n height: array.height,\n });\n return {\n texture,\n width: array.width,\n height: array.height,\n };\n },\n renderTile: (tileData: TextureData) => ({\n image: tileData.texture,\n renderPipeline: getRenderModules(\n renderMode,\n tileData.texture,\n { CreateTexture },\n ndviRange,\n customRenderModules,\n ),\n }),\n signal,\n } as COGLayerProps<TextureData>);\n },\n } as MosaicLayerProps<MosaicSource, GeoTIFF>);\n\n return layer;\n }\n\n async function initializeLayer() {\n try {\n const [geotiffModule, rasterModule, devGeotiff, projModule] =\n await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/deck.gl-raster',\n () => import('@developmentseed/deck.gl-raster/gpu-modules'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/geotiff',\n () => import('@developmentseed/geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MOSAIC_PEER_INSTALL,\n ),\n ]);\n\n modules.value = markRaw({\n MosaicLayer: geotiffModule.MosaicLayer,\n COGLayer: geotiffModule.COGLayer,\n CreateTexture: rasterModule.CreateTexture,\n fromUrl: devGeotiff.GeoTIFF.fromUrl,\n resolveEpsg: projModule.epsgResolver,\n });\n\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-mosaic] Error loading MosaicLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed',\n );\n emit('error', error as Error);\n }\n }\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.renderMode,\n props.ndviRange,\n props.opacity,\n props.visible,\n ],\n () => {\n if (modules.value) {\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n if (activeLayerId) {\n removeLayer(activeLayerId);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAuCE,MAAM,EACJ,6jBAgFF,IAAM,EAAQ,EAUR,EAAO,EAOP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,eAAgB,EAAe,CAAG,EAChD,EAAgB,GAgBd,EAAU,EAAiC,IAAI,EAG/C,EAAY,CAChB,KAAM,cACN,OAAQ,CAAE,yBAA0B,+BAAgC,CACtE,EAEM,EAAqB,CACzB,KAAM,uBACN,OAAQ,CACN,yBAA0B;;;;;OAM5B,CACF,EAQM,EAAc,CAClB,KAAM,eACN,OAAQ,CACN,yBAA0B;;;;;;OAO5B,CACF,EAUM,EAAa,CACjB,KAAM,aACN,GAAI;;;;EACJ,OAAQ,CACN,yBAA0B;;;;OAK5B,EACA,aAAc,CACZ,QAAS,MACT,QAAS,KACX,EACA,YAAc,IAA2C,CACvD,QAAU,EAAa,SAAsB,GAC7C,QAAU,EAAa,SAAsB,CAC/C,EACF,EAGM,EAAe,CACnB,KAAM,gBACN,OAAQ,CACN,yBAA0B;;;;;;;;;;;;;;;;;;;;;;OAuB5B,CACF,EAEA,SAAS,EACP,EACA,EACA,EAGA,EACA,EACgB,CAChB,GAAI,IAAS,UAAY,EACvB,OAAO,EAAc,CAAO,EAG9B,IAAM,EAAuB,CAC3B,CAAE,OAAQ,EAAK,cAAe,MAAO,CAAE,YAAa,CAAQ,CAAE,CAChE,EAaA,OAXI,IAAS,YACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAU,CAAC,EAGpC,IAAS,aACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAmB,EAAG,CAAE,OAAQ,CAAU,CAAC,EAMjE,CACL,GAAG,EACH,CAAE,OAAQ,CAAY,EACtB,CACE,OAAQ,EACR,MAAO,CAAE,QAAS,EAAU,GAAI,QAAS,EAAU,EAAG,CACxD,EACA,CAAE,OAAQ,CAAa,EACvB,CAAE,OAAQ,CAAU,CACtB,CACF,CAEA,SAAS,GAAc,CACrB,IAAM,EAAO,EAAQ,MACrB,GAAI,CAAC,GAAQ,CAAC,EAAM,QAAQ,OAAQ,OAAO,KAE3C,GAAM,CAAE,cAAa,WAAU,gBAAe,UAAS,eAAgB,EAEjE,EAAa,EAAM,EAAM,OAAO,EAChC,EAAa,EAAM,EAAM,UAAU,EACnC,EAAY,EAAM,EAAM,SAAS,EACjC,EAAsB,EAAM,oBAoElC,OAAO,IA/DW,EAAmC,CACnD,GAAI,GAFW,EAAM,EAAM,EAAE,EAAE,SAG/B,QAAS,EACT,aAAc,EAAM,EAAM,YAAY,EAEtC,UAAW,KAAO,IAAW,CAC3B,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,EAAO,OAAO,MAAM,IAAI,EAEnD,OADA,EAAK,aAAc,CAAM,EAClB,CACT,OAAS,EAAO,CAEd,MADA,EAAK,QAAS,EAAgB,CAAM,EAC9B,CACR,CACF,EAEA,cAAe,EAAQ,CAAE,OAAM,YACxB,EAEE,IAAI,EAAsB,CAC/B,GAAI,OAAO,EAAO,OAAO,MAAM,KAAK,GAAG,IACvC,QAAS,EACT,aAAc,EACd,YAAa,MACX,EACA,IACG,CACH,GAAM,CAAE,SAAQ,IAAG,KAAM,EAKnB,CAAE,SAAU,MAJC,EAAM,UAAU,EAAG,EAAG,CACvC,SACA,UAAW,EACb,CAAC,EAED,GAAI,EAAM,SAAW,gBACnB,MAAU,MAAM,sCAAsC,EAQxD,MAAO,CACL,QAPc,EAAO,cAAc,CACnC,KAAM,EAAM,KACZ,OAAQ,aACR,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CAEE,EACA,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CACF,EACA,WAAa,IAA2B,CACtC,MAAO,EAAS,QAChB,eAAgB,EACd,EACA,EAAS,QACT,CAAE,eAAc,EAChB,EACA,CACF,CACF,GACA,QACF,CAA+B,EA1Cb,IA4CtB,CAEO,CACT,CAEA,eAAe,GAAkB,CAC/B,GAAI,CACF,GAAM,CAAC,EAAe,EAAc,EAAY,GAC9C,MAAM,QAAQ,IAAI,CAChB,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,sCACM,OAAO,+CACb,CACF,EACA,EACE,+BACM,OAAO,4BACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAEH,EAAQ,MAAQ,EAAQ,CACtB,YAAa,EAAc,YAC3B,SAAU,EAAc,SACxB,cAAe,EAAa,cAC5B,QAAS,EAAW,QAAQ,QAC5B,YAAa,EAAW,YAC1B,CAAC,EAED,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,OAAS,EAAO,CACd,QAAQ,MAAM,8CAA+C,CAAK,EAClE,QAAQ,MACN,yHACF,EACA,EAAK,QAAS,CAAc,CAC9B,CACF,QAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,WACN,EAAM,UACN,EAAM,QACN,EAAM,OACR,MACM,CACJ,GAAI,EAAQ,MAAO,CACjB,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,CACF,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CAChB,GACF,EAAY,CAAa,CAE7B,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
@@ -1,2 +1,2 @@
1
- import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-GlkH_rvP.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMultiCog`,props:{id:{},sources:{},composite:{},renderPipeline:{},maxError:{default:.125},maxCacheSize:{},maxCacheByteSize:{},maxRequests:{default:6},debounceTime:{},refinementStrategy:{default:`best-available`},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},beforeId:{},debug:{type:Boolean,default:!1},debugOpacity:{default:.5},debugLevel:{default:1}},emits:[`click`,`hover`,`geotiffLoad`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_,updateLayer:v}=r(h),y=c(null),b=c(null),x=()=>{if(!y.value)return null;let e={id:l(p.id),sources:l(p.sources),opacity:l(p.opacity),visible:l(p.visible),pickable:l(p.pickable),autoHighlight:l(p.autoHighlight),debug:l(p.debug),debugOpacity:l(p.debugOpacity),debugLevel:l(p.debugLevel),maxError:l(p.maxError)};return b.value&&(e.epsgResolver=b.value),p.composite&&(e.composite=l(p.composite)),p.renderPipeline&&(e.renderPipeline=l(p.renderPipeline)),p.maxCacheSize!==void 0&&(e.maxCacheSize=l(p.maxCacheSize)),p.maxCacheByteSize!==void 0&&(e.maxCacheByteSize=l(p.maxCacheByteSize)),p.maxRequests!==6&&(e.maxRequests=l(p.maxRequests)),p.debounceTime!==void 0&&(e.debounceTime=l(p.debounceTime)),p.refinementStrategy!==`best-available`&&(e.refinementStrategy=l(p.refinementStrategy)),p.beforeId!==void 0&&(e.beforeId=l(p.beforeId)),e.onGeoTIFFLoad=(e,t)=>{m(`geotiffLoad`,e,t)},a(new y.value(e))},S=async()=>{try{let[e,t]=await Promise.all([n(`@developmentseed/deck.gl-geotiff`,()=>import(`@developmentseed/deck.gl-geotiff`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);y.value=a(e.MultiCOGLayer),b.value=t.epsgResolver;let r=x();r&&g(r)}catch(e){console.error(`[deck.gl-raster] Error loading MultiCOGLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed`)}};return u(h,e=>{e&&S()},{immediate:!0}),u(()=>[p.sources,p.composite,p.renderPipeline,p.opacity,p.visible,p.debug,p.debugOpacity,p.debugLevel,p.maxError],()=>{let e=x();e&&v(p.id,e)},{deep:!0}),o(()=>{_(p.id)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerMultiCog};
2
- //# sourceMappingURL=multi-cog-B2kVLX90.js.map
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMultiCog`,props:{id:{},sources:{},composite:{},renderPipeline:{},maxError:{default:.125},maxCacheSize:{},maxCacheByteSize:{},maxRequests:{default:6},debounceTime:{},refinementStrategy:{default:`best-available`},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},beforeId:{},debug:{type:Boolean,default:!1},debugOpacity:{default:.5},debugLevel:{default:1}},emits:[`click`,`hover`,`geotiffLoad`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_,updateLayer:v}=r(h),y=c(null),b=c(null),x=()=>{if(!y.value)return null;let e={id:l(p.id),sources:l(p.sources),opacity:l(p.opacity),visible:l(p.visible),pickable:l(p.pickable),autoHighlight:l(p.autoHighlight),debug:l(p.debug),debugOpacity:l(p.debugOpacity),debugLevel:l(p.debugLevel),maxError:l(p.maxError)};return b.value&&(e.epsgResolver=b.value),p.composite&&(e.composite=l(p.composite)),p.renderPipeline&&(e.renderPipeline=l(p.renderPipeline)),p.maxCacheSize!==void 0&&(e.maxCacheSize=l(p.maxCacheSize)),p.maxCacheByteSize!==void 0&&(e.maxCacheByteSize=l(p.maxCacheByteSize)),p.maxRequests!==6&&(e.maxRequests=l(p.maxRequests)),p.debounceTime!==void 0&&(e.debounceTime=l(p.debounceTime)),p.refinementStrategy!==`best-available`&&(e.refinementStrategy=l(p.refinementStrategy)),p.beforeId!==void 0&&(e.beforeId=l(p.beforeId)),e.onGeoTIFFLoad=(e,t)=>{m(`geotiffLoad`,e,t)},a(new y.value(e))},S=async()=>{try{let[e,t]=await Promise.all([n(`@developmentseed/deck.gl-geotiff`,()=>import(`@developmentseed/deck.gl-geotiff`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);y.value=a(e.MultiCOGLayer),b.value=t.epsgResolver;let r=x();r&&g(r)}catch(e){console.error(`[deck.gl-raster] Error loading MultiCOGLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed`)}};return u(h,e=>{e&&S()},{immediate:!0}),u(()=>[p.sources,p.composite,p.renderPipeline,p.opacity,p.visible,p.debug,p.debugOpacity,p.debugLevel,p.maxError],()=>{let e=x();e&&v(p.id,e)},{deep:!0}),o(()=>{_(p.id)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerMultiCog};
2
+ //# sourceMappingURL=multi-cog-D2ys9o3u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-cog-B2kVLX90.js","names":[],"sources":["../src/layers/deckgl/multi-cog/VLayerMultiCog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Multi-band split-resolution COG compositor (e.g. Sentinel-2 band combinations).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMultiCog — multi-band split-resolution COG compositing.\n *\n * Wraps @developmentseed/deck.gl-geotiff MultiCOGLayer.\n * Use case: render Sentinel-2 or other multi-band imagery where bands live in\n * separate COGs at different native resolutions. The layer opens all sources\n * in parallel, picks the finest as the primary tileset, and the GPU\n * resamples lower-resolution bands to match.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/sentinel-2/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { MultiCOGSourceConfig } from '@developmentseed/deck.gl-geotiff';\n import type { GeoTIFF } from '@developmentseed/geotiff';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n\n const MULTICOG_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n /**\n * Maps source band names to RGB(A) output channels for the compositing step.\n */\n export interface MultiCogComposite {\n r: string;\n g?: string;\n b?: string;\n a?: string;\n }\n\n interface Props {\n id: string;\n /**\n * Named sources — each key is the band name. Pass at least one entry per\n * band referenced in `composite`.\n */\n sources: Record<string, MultiCOGSourceConfig>;\n /**\n * Map source band names to RGB(A) output channels. Defaults to passing\n * the first source through to all channels (greyscale) if omitted.\n */\n composite?: MultiCogComposite;\n /**\n * Post-processing render pipeline modules applied after band compositing\n * (e.g. LinearRescale, ColormapSprite, NDVI).\n */\n renderPipeline?: RasterModule[];\n /** Max reprojection error in pixels for mesh refinement. */\n maxError?: number;\n /** Maximum number of tiles to cache. */\n maxCacheSize?: number;\n /** Maximum cached tile byte size. */\n maxCacheByteSize?: number;\n /** Maximum concurrent tile requests. */\n maxRequests?: number;\n /** Tile fetch debounce (ms). */\n debounceTime?: number;\n /** Tile refinement strategy. */\n refinementStrategy?: 'best-available' | 'no-overlap' | 'never';\n /** Layer opacity (0-1). */\n opacity?: number;\n /** Layer visibility. */\n visible?: boolean;\n /** Enable picking. */\n pickable?: boolean;\n /** Auto-highlight on hover. */\n autoHighlight?: boolean;\n /** Insert layer before this layer id. */\n beforeId?: string;\n /** Show debug overlay on tiles. */\n debug?: boolean;\n /** Debug overlay opacity (0-1). */\n debugOpacity?: number;\n /** Debug verbosity: 1=coords, 2=+uv/tiles, 3=+stitched-size/meters/px. */\n debugLevel?: 1 | 2 | 3;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n maxError: 0.125,\n maxRequests: 6,\n refinementStrategy: 'best-available',\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n debug: false,\n debugOpacity: 0.5,\n debugLevel: 1,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n geotiffLoad: [\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const MultiCOGLayerClass = shallowRef<\n typeof import('@developmentseed/deck.gl-geotiff').MultiCOGLayer | null\n >(null);\n const epsgResolverFn = shallowRef<\n typeof import('@developmentseed/proj').epsgResolver | null\n >(null);\n\n const createLayer = () => {\n if (!MultiCOGLayerClass.value) return null;\n\n const layerProps: Record<string, unknown> = {\n id: toRaw(props.id),\n sources: toRaw(props.sources),\n opacity: toRaw(props.opacity),\n visible: toRaw(props.visible),\n pickable: toRaw(props.pickable),\n autoHighlight: toRaw(props.autoHighlight),\n debug: toRaw(props.debug),\n debugOpacity: toRaw(props.debugOpacity),\n debugLevel: toRaw(props.debugLevel),\n maxError: toRaw(props.maxError),\n };\n\n if (epsgResolverFn.value) {\n layerProps.epsgResolver = epsgResolverFn.value;\n }\n\n if (props.composite) {\n layerProps.composite = toRaw(props.composite);\n }\n if (props.renderPipeline) {\n layerProps.renderPipeline = toRaw(props.renderPipeline);\n }\n if (props.maxCacheSize !== undefined)\n layerProps.maxCacheSize = toRaw(props.maxCacheSize);\n if (props.maxCacheByteSize !== undefined)\n layerProps.maxCacheByteSize = toRaw(props.maxCacheByteSize);\n if (props.maxRequests !== 6)\n layerProps.maxRequests = toRaw(props.maxRequests);\n if (props.debounceTime !== undefined)\n layerProps.debounceTime = toRaw(props.debounceTime);\n if (props.refinementStrategy !== 'best-available')\n layerProps.refinementStrategy = toRaw(props.refinementStrategy);\n if (props.beforeId !== undefined)\n layerProps.beforeId = toRaw(props.beforeId);\n\n layerProps.onGeoTIFFLoad = (\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ) => {\n emit('geotiffLoad', sources, options);\n };\n\n const layer = new MultiCOGLayerClass.value(layerProps);\n return markRaw(layer);\n };\n\n const initializeLayer = async () => {\n try {\n const [geotiffModule, projModule] = await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MULTICOG_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MULTICOG_PEER_INSTALL,\n ),\n ]);\n\n MultiCOGLayerClass.value = markRaw(geotiffModule.MultiCOGLayer);\n epsgResolverFn.value = projModule.epsgResolver;\n\n const layer = createLayer();\n if (layer) {\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-raster] Error loading MultiCOGLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed',\n );\n }\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.composite,\n props.renderPipeline,\n props.opacity,\n props.visible,\n props.debug,\n props.debugOpacity,\n props.debugLevel,\n props.maxError,\n ],\n () => {\n const layer = createLayer();\n if (layer) {\n updateLayer(props.id, layer);\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAiCE,MAAM,EACJ,sqBA4DF,IAAM,EAAQ,EAaR,EAAO,EAiBP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAqB,EAEzB,IAAI,EACA,EAAiB,EAErB,IAAI,EAEA,MAAoB,CACxB,GAAI,CAAC,EAAmB,MAAO,OAAO,KAEtC,IAAM,EAAsC,CAC1C,GAAI,EAAM,EAAM,EAAE,EAClB,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,SAAU,EAAM,EAAM,QAAQ,EAC9B,cAAe,EAAM,EAAM,aAAa,EACxC,MAAO,EAAM,EAAM,KAAK,EACxB,aAAc,EAAM,EAAM,YAAY,EACtC,WAAY,EAAM,EAAM,UAAU,EAClC,SAAU,EAAM,EAAM,QAAQ,CAChC,EAyCA,OAvCI,EAAe,QACjB,EAAW,aAAe,EAAe,OAGvC,EAAM,YACR,EAAW,UAAY,EAAM,EAAM,SAAS,GAE1C,EAAM,iBACR,EAAW,eAAiB,EAAM,EAAM,cAAc,GAEpD,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,mBAAqB,IAAA,KAC7B,EAAW,iBAAmB,EAAM,EAAM,gBAAgB,GACxD,EAAM,cAAgB,IACxB,EAAW,YAAc,EAAM,EAAM,WAAW,GAC9C,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,qBAAuB,mBAC/B,EAAW,mBAAqB,EAAM,EAAM,kBAAkB,GAC5D,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAE5C,EAAW,eACT,EACA,IASG,CACH,EAAK,cAAe,EAAS,CAAO,CACtC,EAGO,EAAQ,IADG,EAAmB,MAAM,CAC5B,CAAK,CACtB,EAEM,EAAkB,SAAY,CAClC,GAAI,CACF,GAAM,CAAC,EAAe,GAAc,MAAM,QAAQ,IAAI,CACpD,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAED,EAAmB,MAAQ,EAAQ,EAAc,aAAa,EAC9D,EAAe,MAAQ,EAAW,aAElC,IAAM,EAAQ,EAAY,EACtB,GACF,EAAS,CAAK,CAElB,OAAS,EAAO,CACd,QAAQ,MAAM,gDAAiD,CAAK,EACpE,QAAQ,MACN,oFACF,CACF,CACF,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,UACN,EAAM,eACN,EAAM,QACN,EAAM,QACN,EAAM,MACN,EAAM,aACN,EAAM,WACN,EAAM,QACR,MACM,CACJ,IAAM,EAAQ,EAAY,EACtB,GACF,EAAY,EAAM,GAAI,CAAK,CAE/B,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
1
+ {"version":3,"file":"multi-cog-D2ys9o3u.js","names":[],"sources":["../src/layers/deckgl/multi-cog/VLayerMultiCog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Multi-band split-resolution COG compositor (e.g. Sentinel-2 band combinations).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMultiCog — multi-band split-resolution COG compositing.\n *\n * Wraps @developmentseed/deck.gl-geotiff MultiCOGLayer.\n * Use case: render Sentinel-2 or other multi-band imagery where bands live in\n * separate COGs at different native resolutions. The layer opens all sources\n * in parallel, picks the finest as the primary tileset, and the GPU\n * resamples lower-resolution bands to match.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/sentinel-2/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { MultiCOGSourceConfig } from '@developmentseed/deck.gl-geotiff';\n import type { GeoTIFF } from '@developmentseed/geotiff';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n\n const MULTICOG_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n /**\n * Maps source band names to RGB(A) output channels for the compositing step.\n */\n export interface MultiCogComposite {\n r: string;\n g?: string;\n b?: string;\n a?: string;\n }\n\n interface Props {\n id: string;\n /**\n * Named sources — each key is the band name. Pass at least one entry per\n * band referenced in `composite`.\n */\n sources: Record<string, MultiCOGSourceConfig>;\n /**\n * Map source band names to RGB(A) output channels. Defaults to passing\n * the first source through to all channels (greyscale) if omitted.\n */\n composite?: MultiCogComposite;\n /**\n * Post-processing render pipeline modules applied after band compositing\n * (e.g. LinearRescale, ColormapSprite, NDVI).\n */\n renderPipeline?: RasterModule[];\n /** Max reprojection error in pixels for mesh refinement. */\n maxError?: number;\n /** Maximum number of tiles to cache. */\n maxCacheSize?: number;\n /** Maximum cached tile byte size. */\n maxCacheByteSize?: number;\n /** Maximum concurrent tile requests. */\n maxRequests?: number;\n /** Tile fetch debounce (ms). */\n debounceTime?: number;\n /** Tile refinement strategy. */\n refinementStrategy?: 'best-available' | 'no-overlap' | 'never';\n /** Layer opacity (0-1). */\n opacity?: number;\n /** Layer visibility. */\n visible?: boolean;\n /** Enable picking. */\n pickable?: boolean;\n /** Auto-highlight on hover. */\n autoHighlight?: boolean;\n /** Insert layer before this layer id. */\n beforeId?: string;\n /** Show debug overlay on tiles. */\n debug?: boolean;\n /** Debug overlay opacity (0-1). */\n debugOpacity?: number;\n /** Debug verbosity: 1=coords, 2=+uv/tiles, 3=+stitched-size/meters/px. */\n debugLevel?: 1 | 2 | 3;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n maxError: 0.125,\n maxRequests: 6,\n refinementStrategy: 'best-available',\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n debug: false,\n debugOpacity: 0.5,\n debugLevel: 1,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n geotiffLoad: [\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const MultiCOGLayerClass = shallowRef<\n typeof import('@developmentseed/deck.gl-geotiff').MultiCOGLayer | null\n >(null);\n const epsgResolverFn = shallowRef<\n typeof import('@developmentseed/proj').epsgResolver | null\n >(null);\n\n const createLayer = () => {\n if (!MultiCOGLayerClass.value) return null;\n\n const layerProps: Record<string, unknown> = {\n id: toRaw(props.id),\n sources: toRaw(props.sources),\n opacity: toRaw(props.opacity),\n visible: toRaw(props.visible),\n pickable: toRaw(props.pickable),\n autoHighlight: toRaw(props.autoHighlight),\n debug: toRaw(props.debug),\n debugOpacity: toRaw(props.debugOpacity),\n debugLevel: toRaw(props.debugLevel),\n maxError: toRaw(props.maxError),\n };\n\n if (epsgResolverFn.value) {\n layerProps.epsgResolver = epsgResolverFn.value;\n }\n\n if (props.composite) {\n layerProps.composite = toRaw(props.composite);\n }\n if (props.renderPipeline) {\n layerProps.renderPipeline = toRaw(props.renderPipeline);\n }\n if (props.maxCacheSize !== undefined)\n layerProps.maxCacheSize = toRaw(props.maxCacheSize);\n if (props.maxCacheByteSize !== undefined)\n layerProps.maxCacheByteSize = toRaw(props.maxCacheByteSize);\n if (props.maxRequests !== 6)\n layerProps.maxRequests = toRaw(props.maxRequests);\n if (props.debounceTime !== undefined)\n layerProps.debounceTime = toRaw(props.debounceTime);\n if (props.refinementStrategy !== 'best-available')\n layerProps.refinementStrategy = toRaw(props.refinementStrategy);\n if (props.beforeId !== undefined)\n layerProps.beforeId = toRaw(props.beforeId);\n\n layerProps.onGeoTIFFLoad = (\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ) => {\n emit('geotiffLoad', sources, options);\n };\n\n const layer = new MultiCOGLayerClass.value(layerProps);\n return markRaw(layer);\n };\n\n const initializeLayer = async () => {\n try {\n const [geotiffModule, projModule] = await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MULTICOG_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MULTICOG_PEER_INSTALL,\n ),\n ]);\n\n MultiCOGLayerClass.value = markRaw(geotiffModule.MultiCOGLayer);\n epsgResolverFn.value = projModule.epsgResolver;\n\n const layer = createLayer();\n if (layer) {\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-raster] Error loading MultiCOGLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed',\n );\n }\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.composite,\n props.renderPipeline,\n props.opacity,\n props.visible,\n props.debug,\n props.debugOpacity,\n props.debugLevel,\n props.maxError,\n ],\n () => {\n const layer = createLayer();\n if (layer) {\n updateLayer(props.id, layer);\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAiCE,MAAM,EACJ,sqBA4DF,IAAM,EAAQ,EAaR,EAAO,EAiBP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAqB,EAEzB,IAAI,EACA,EAAiB,EAErB,IAAI,EAEA,MAAoB,CACxB,GAAI,CAAC,EAAmB,MAAO,OAAO,KAEtC,IAAM,EAAsC,CAC1C,GAAI,EAAM,EAAM,EAAE,EAClB,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,SAAU,EAAM,EAAM,QAAQ,EAC9B,cAAe,EAAM,EAAM,aAAa,EACxC,MAAO,EAAM,EAAM,KAAK,EACxB,aAAc,EAAM,EAAM,YAAY,EACtC,WAAY,EAAM,EAAM,UAAU,EAClC,SAAU,EAAM,EAAM,QAAQ,CAChC,EAyCA,OAvCI,EAAe,QACjB,EAAW,aAAe,EAAe,OAGvC,EAAM,YACR,EAAW,UAAY,EAAM,EAAM,SAAS,GAE1C,EAAM,iBACR,EAAW,eAAiB,EAAM,EAAM,cAAc,GAEpD,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,mBAAqB,IAAA,KAC7B,EAAW,iBAAmB,EAAM,EAAM,gBAAgB,GACxD,EAAM,cAAgB,IACxB,EAAW,YAAc,EAAM,EAAM,WAAW,GAC9C,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,qBAAuB,mBAC/B,EAAW,mBAAqB,EAAM,EAAM,kBAAkB,GAC5D,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAE5C,EAAW,eACT,EACA,IASG,CACH,EAAK,cAAe,EAAS,CAAO,CACtC,EAGO,EAAQ,IADG,EAAmB,MAAM,CAC5B,CAAK,CACtB,EAEM,EAAkB,SAAY,CAClC,GAAI,CACF,GAAM,CAAC,EAAe,GAAc,MAAM,QAAQ,IAAI,CACpD,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAED,EAAmB,MAAQ,EAAQ,EAAc,aAAa,EAC9D,EAAe,MAAQ,EAAW,aAElC,IAAM,EAAQ,EAAY,EACtB,GACF,EAAS,CAAK,CAElB,OAAS,EAAO,CACd,QAAQ,MAAM,gDAAiD,CAAK,EACpE,QAAQ,MACN,oFACF,CACF,CACF,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,UACN,EAAM,eACN,EAAM,QACN,EAAM,QACN,EAAM,MACN,EAAM,aACN,EAAM,WACN,EAAM,QACR,MACM,CACJ,IAAM,EAAQ,EAAY,EACtB,GACF,EAAY,EAAM,GAAI,CAAK,CAE/B,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}