@geoql/v-maplibre 1.11.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 (204) hide show
  1. package/README.md +42 -15
  2. package/dist/arc-XYgM0NpD.js +2 -0
  3. package/dist/arc-XYgM0NpD.js.map +1 -0
  4. package/dist/{arrow-4ecDVUFv.js → arrow-B87Hvf8z.js} +1 -1
  5. package/dist/{arrow-4ecDVUFv.js.map → arrow-B87Hvf8z.js.map} +1 -1
  6. package/dist/bitmap-CEQZNyod.js +2 -0
  7. package/dist/bitmap-CEQZNyod.js.map +1 -0
  8. package/dist/cog-B3kQFMdO.js +2 -0
  9. package/dist/cog-B3kQFMdO.js.map +1 -0
  10. package/dist/column-6Alyevco.js +2 -0
  11. package/dist/column-6Alyevco.js.map +1 -0
  12. package/dist/contour-D5irVPeN.js +2 -0
  13. package/dist/contour-D5irVPeN.js.map +1 -0
  14. package/dist/deckgl.d.ts +47 -0
  15. package/dist/deckgl.js +2 -0
  16. package/dist/deckgl.js.map +1 -0
  17. package/dist/generic-DXw_QGDp.js +2 -0
  18. package/dist/generic-DXw_QGDp.js.map +1 -0
  19. package/dist/geoarrow-path-tBmjWKYC.js +2 -0
  20. package/dist/{geoarrow-path-B2LJ956d.js.map → geoarrow-path-tBmjWKYC.js.map} +1 -1
  21. package/dist/geoarrow-polygon-C2sWPrq6.js +2 -0
  22. package/dist/{geoarrow-polygon-C9mZ7552.js.map → geoarrow-polygon-C2sWPrq6.js.map} +1 -1
  23. package/dist/geoarrow-scatterplot-BvvHZc7E.js +2 -0
  24. package/dist/{geoarrow-scatterplot-CM5842q_.js.map → geoarrow-scatterplot-BvvHZc7E.js.map} +1 -1
  25. package/dist/geoarrow-solid-polygon-DPmDfwoY.js +2 -0
  26. package/dist/{geoarrow-solid-polygon-DIm9mciL.js.map → geoarrow-solid-polygon-DPmDfwoY.js.map} +1 -1
  27. package/dist/geoarrow-text-DEFcoF0G.js +2 -0
  28. package/dist/{geoarrow-text-ClY3q_nR.js.map → geoarrow-text-DEFcoF0G.js.map} +1 -1
  29. package/dist/geoarrow-trips-C9_EXHnn.js +2 -0
  30. package/dist/{geoarrow-trips-BqbIoMt8.js.map → geoarrow-trips-C9_EXHnn.js.map} +1 -1
  31. package/dist/geohash-vWnSK76U.js +2 -0
  32. package/dist/geohash-vWnSK76U.js.map +1 -0
  33. package/dist/geojson-CqnyNLW0.js +2 -0
  34. package/dist/geojson-CqnyNLW0.js.map +1 -0
  35. package/dist/geotiff.d.ts +50 -0
  36. package/dist/geotiff.js +2 -0
  37. package/dist/geotiff.js.map +1 -0
  38. package/dist/great-circle-Bz8TvCiM.js +2 -0
  39. package/dist/great-circle-Bz8TvCiM.js.map +1 -0
  40. package/dist/grid-B_D40N2N.js +2 -0
  41. package/dist/grid-B_D40N2N.js.map +1 -0
  42. package/dist/grid-cell-fa_NejcO.js +2 -0
  43. package/dist/grid-cell-fa_NejcO.js.map +1 -0
  44. package/dist/h3-cluster-Cg0CEA_m.js +2 -0
  45. package/dist/h3-cluster-Cg0CEA_m.js.map +1 -0
  46. package/dist/h3-hexagon-DkIZnQEf.js +2 -0
  47. package/dist/h3-hexagon-DkIZnQEf.js.map +1 -0
  48. package/dist/heatmap-D7R9nYug.js +2 -0
  49. package/dist/heatmap-D7R9nYug.js.map +1 -0
  50. package/dist/hexagon-Bl_UBlOT.js +2 -0
  51. package/dist/hexagon-Bl_UBlOT.js.map +1 -0
  52. package/dist/icon-Dm1fyRNM.js +2 -0
  53. package/dist/icon-Dm1fyRNM.js.map +1 -0
  54. package/dist/index-2D1oVTKr.d.ts +37 -0
  55. package/dist/index.d.ts +98 -477
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/lidar.d.ts +232 -0
  59. package/dist/lidar.js +2 -0
  60. package/dist/lidar.js.map +1 -0
  61. package/dist/line-B77d8tio.js +2 -0
  62. package/dist/line-B77d8tio.js.map +1 -0
  63. package/dist/mosaic-Bm1aKa0Q.js +43 -0
  64. package/dist/mosaic-Bm1aKa0Q.js.map +1 -0
  65. package/dist/multi-cog-D2ys9o3u.js +2 -0
  66. package/dist/multi-cog-D2ys9o3u.js.map +1 -0
  67. package/dist/mvt-BUVHps3s.js +2 -0
  68. package/dist/mvt-BUVHps3s.js.map +1 -0
  69. package/dist/path-CvxVK8wm.js +2 -0
  70. package/dist/path-CvxVK8wm.js.map +1 -0
  71. package/dist/point-cloud-CSsO2nuJ.js +2 -0
  72. package/dist/point-cloud-CSsO2nuJ.js.map +1 -0
  73. package/dist/polygon-DAVE4LXH.js +2 -0
  74. package/dist/polygon-DAVE4LXH.js.map +1 -0
  75. package/dist/quadkey-BAnxuF9T.js +2 -0
  76. package/dist/quadkey-BAnxuF9T.js.map +1 -0
  77. package/dist/s2-Bv5MIwa9.js +2 -0
  78. package/dist/s2-Bv5MIwa9.js.map +1 -0
  79. package/dist/scatterplot-aZig07ZM.js +2 -0
  80. package/dist/scatterplot-aZig07ZM.js.map +1 -0
  81. package/dist/scenegraph-WEtd4Tza.js +2 -0
  82. package/dist/scenegraph-WEtd4Tza.js.map +1 -0
  83. package/dist/screen-grid-Cp80FMUf.js +2 -0
  84. package/dist/screen-grid-Cp80FMUf.js.map +1 -0
  85. package/dist/simple-mesh-DT1BC-Mz.js +2 -0
  86. package/dist/simple-mesh-DT1BC-Mz.js.map +1 -0
  87. package/dist/solid-polygon-BxLiMNAC.js +2 -0
  88. package/dist/solid-polygon-BxLiMNAC.js.map +1 -0
  89. package/dist/starfield-Djc5vy6K.js +2 -0
  90. package/dist/starfield-Djc5vy6K.js.map +1 -0
  91. package/dist/starfield.d.ts +7 -0
  92. package/dist/starfield.js +2 -0
  93. package/dist/starfield.js.map +1 -0
  94. package/dist/symbols-DXKzIgbY.js +2 -0
  95. package/dist/symbols-DXKzIgbY.js.map +1 -0
  96. package/dist/terrain-CPKUswLf.js +2 -0
  97. package/dist/terrain-CPKUswLf.js.map +1 -0
  98. package/dist/text-Qf7B4QNZ.js +2 -0
  99. package/dist/text-Qf7B4QNZ.js.map +1 -0
  100. package/dist/tile-3d-CbQInXbC.js +2 -0
  101. package/dist/tile-3d-CbQInXbC.js.map +1 -0
  102. package/dist/tile-BxWRJ8QY.js +2 -0
  103. package/dist/tile-BxWRJ8QY.js.map +1 -0
  104. package/dist/trips-CwzuAg1k.js +2 -0
  105. package/dist/trips-CwzuAg1k.js.map +1 -0
  106. package/dist/useDeckOverlay-CI56uIKH.js +2 -0
  107. package/dist/useDeckOverlay-CI56uIKH.js.map +1 -0
  108. package/dist/useDeckOverlay-JoRzVQ7g.d.ts +43 -0
  109. package/dist/wind-particle-D3y-A-W4.js +2 -0
  110. package/dist/wind-particle-D3y-A-W4.js.map +1 -0
  111. package/dist/wind.d.ts +9 -0
  112. package/dist/wind.js +2 -0
  113. package/dist/wind.js.map +1 -0
  114. package/dist/wms-BEsf7XG6.js +2 -0
  115. package/dist/wms-BEsf7XG6.js.map +1 -0
  116. package/dist/zarr-BWbq3Uwq.js +2 -0
  117. package/dist/zarr-BWbq3Uwq.js.map +1 -0
  118. package/package.json +37 -17
  119. package/dist/arc-oPHfD4K7.js +0 -2
  120. package/dist/arc-oPHfD4K7.js.map +0 -1
  121. package/dist/bitmap-C04WgKea.js +0 -2
  122. package/dist/bitmap-C04WgKea.js.map +0 -1
  123. package/dist/cog-Cq7xvN9B.js +0 -2
  124. package/dist/cog-Cq7xvN9B.js.map +0 -1
  125. package/dist/column-Dx4A711w.js +0 -2
  126. package/dist/column-Dx4A711w.js.map +0 -1
  127. package/dist/contour-Dgvb_bGm.js +0 -2
  128. package/dist/contour-Dgvb_bGm.js.map +0 -1
  129. package/dist/generic-BKvcZn9n.js +0 -2
  130. package/dist/generic-BKvcZn9n.js.map +0 -1
  131. package/dist/geoarrow-path-B2LJ956d.js +0 -2
  132. package/dist/geoarrow-polygon-C9mZ7552.js +0 -2
  133. package/dist/geoarrow-scatterplot-CM5842q_.js +0 -2
  134. package/dist/geoarrow-solid-polygon-DIm9mciL.js +0 -2
  135. package/dist/geoarrow-text-ClY3q_nR.js +0 -2
  136. package/dist/geoarrow-trips-BqbIoMt8.js +0 -2
  137. package/dist/geohash-Pq83atW2.js +0 -2
  138. package/dist/geohash-Pq83atW2.js.map +0 -1
  139. package/dist/geojson-cOxJcO-8.js +0 -2
  140. package/dist/geojson-cOxJcO-8.js.map +0 -1
  141. package/dist/great-circle-C6GDbX1c.js +0 -2
  142. package/dist/great-circle-C6GDbX1c.js.map +0 -1
  143. package/dist/grid-BPfXfID8.js +0 -2
  144. package/dist/grid-BPfXfID8.js.map +0 -1
  145. package/dist/grid-cell-T0-xdlk_.js +0 -2
  146. package/dist/grid-cell-T0-xdlk_.js.map +0 -1
  147. package/dist/h3-cluster-BsvMbaYv.js +0 -2
  148. package/dist/h3-cluster-BsvMbaYv.js.map +0 -1
  149. package/dist/h3-hexagon-Cx1qlgKb.js +0 -2
  150. package/dist/h3-hexagon-Cx1qlgKb.js.map +0 -1
  151. package/dist/heatmap-ByafStP6.js +0 -2
  152. package/dist/heatmap-ByafStP6.js.map +0 -1
  153. package/dist/hexagon-CWRkTkkj.js +0 -2
  154. package/dist/hexagon-CWRkTkkj.js.map +0 -1
  155. package/dist/icon-WggKPJv7.js +0 -2
  156. package/dist/icon-WggKPJv7.js.map +0 -1
  157. package/dist/line-B5e9w1td.js +0 -2
  158. package/dist/line-B5e9w1td.js.map +0 -1
  159. package/dist/mosaic-Cl7rtAXN.js +0 -43
  160. package/dist/mosaic-Cl7rtAXN.js.map +0 -1
  161. package/dist/multi-cog-DAJbnElE.js +0 -2
  162. package/dist/multi-cog-DAJbnElE.js.map +0 -1
  163. package/dist/mvt-D0GYYs-Z.js +0 -2
  164. package/dist/mvt-D0GYYs-Z.js.map +0 -1
  165. package/dist/path-mcVHjyaA.js +0 -2
  166. package/dist/path-mcVHjyaA.js.map +0 -1
  167. package/dist/point-cloud-CNpLW-hf.js +0 -2
  168. package/dist/point-cloud-CNpLW-hf.js.map +0 -1
  169. package/dist/polygon-B5mGSTte.js +0 -2
  170. package/dist/polygon-B5mGSTte.js.map +0 -1
  171. package/dist/quadkey-DGHCEKmx.js +0 -2
  172. package/dist/quadkey-DGHCEKmx.js.map +0 -1
  173. package/dist/s2-MuPaEFbo.js +0 -2
  174. package/dist/s2-MuPaEFbo.js.map +0 -1
  175. package/dist/scatterplot-BBeJkOdi.js +0 -2
  176. package/dist/scatterplot-BBeJkOdi.js.map +0 -1
  177. package/dist/scenegraph-DTM4oQ_J.js +0 -2
  178. package/dist/scenegraph-DTM4oQ_J.js.map +0 -1
  179. package/dist/screen-grid-CxlQC4Kb.js +0 -2
  180. package/dist/screen-grid-CxlQC4Kb.js.map +0 -1
  181. package/dist/simple-mesh-BxLUvOJK.js +0 -2
  182. package/dist/simple-mesh-BxLUvOJK.js.map +0 -1
  183. package/dist/solid-polygon-DwQBLTy0.js +0 -2
  184. package/dist/solid-polygon-DwQBLTy0.js.map +0 -1
  185. package/dist/starfield-D0gIX-34.js +0 -2
  186. package/dist/starfield-D0gIX-34.js.map +0 -1
  187. package/dist/symbols-CFCXX1_B.js +0 -2
  188. package/dist/symbols-CFCXX1_B.js.map +0 -1
  189. package/dist/terrain-f-XAakfL.js +0 -2
  190. package/dist/terrain-f-XAakfL.js.map +0 -1
  191. package/dist/text-BOvG9JHc.js +0 -2
  192. package/dist/text-BOvG9JHc.js.map +0 -1
  193. package/dist/tile-3d-DG91zS0N.js +0 -2
  194. package/dist/tile-3d-DG91zS0N.js.map +0 -1
  195. package/dist/tile-AhmnAg8V.js +0 -2
  196. package/dist/tile-AhmnAg8V.js.map +0 -1
  197. package/dist/trips-DwzBmfe0.js +0 -2
  198. package/dist/trips-DwzBmfe0.js.map +0 -1
  199. package/dist/wind-particle-DW0nCMls.js +0 -2
  200. package/dist/wind-particle-DW0nCMls.js.map +0 -1
  201. package/dist/wms-vy1yMBNb.js +0 -2
  202. package/dist/wms-vy1yMBNb.js.map +0 -1
  203. package/dist/zarr-6SNoX07d.js +0 -2
  204. package/dist/zarr-6SNoX07d.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenegraph-WEtd4Tza.js","names":[],"sources":["../src/layers/deckgl/scenegraph/VLayerDeckglScenegraph.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Instance an animated GLTF scenegraph at many positions.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/mesh-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/mesh-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { ScenegraphLayer } from '@deck.gl/mesh-layers';\n import type { ScenegraphLayerProps } from '@deck.gl/mesh-layers';\n import type { Color, PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\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 scenegraph: string | object;\n getPosition: Accessor<D, Position>;\n getColor?: Accessor<D, Color>;\n getOrientation?: Accessor<D, [number, number, number]>;\n getScale?: Accessor<D, [number, number, number] | number>;\n getTranslation?: Accessor<D, [number, number, number]>;\n getTransformMatrix?: Accessor<D, number[]>;\n sizeScale?: number;\n sizeMinPixels?: number;\n sizeMaxPixels?: number;\n animator?: object;\n loaders?: object[];\n loadOptions?: object;\n opacity?: number;\n visible?: boolean;\n pickable?: boolean;\n autoHighlight?: boolean;\n highlightColor?: Color;\n beforeId?: string;\n // Animation and lighting options\n _animations?: Record<\n string,\n { playing?: boolean; speed?: number; startTime?: number }\n >;\n _lighting?: 'flat' | 'pbr';\n }\n\n const props = withDefaults(defineProps<Props>(), {\n sizeScale: 1,\n sizeMinPixels: 0,\n sizeMaxPixels: 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 // Build layer props object, excluding undefined optional props to avoid deck.gl bugs\n // where it tries to call undefined as a function (e.g., getTransformMatrix)\n const layerProps = {\n id: props.id,\n data: props.data,\n scenegraph: props.scenegraph,\n getPosition: props.getPosition,\n getColor: props.getColor ?? [255, 255, 255, 255],\n getOrientation: props.getOrientation ?? [0, 0, 0],\n getScale: props.getScale ?? [1, 1, 1],\n getTranslation: props.getTranslation ?? [0, 0, 0],\n sizeScale: props.sizeScale,\n sizeMinPixels: props.sizeMinPixels,\n sizeMaxPixels: props.sizeMaxPixels,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n // Only include optional props if defined\n ...(props.getTransformMatrix !== undefined && {\n getTransformMatrix: props.getTransformMatrix,\n }),\n ...(props.animator !== undefined && { animator: props.animator }),\n ...(props.loaders !== undefined && { loaders: props.loaders }),\n ...(props.loadOptions !== undefined && {\n loadOptions: props.loadOptions,\n }),\n ...(props.highlightColor !== undefined && {\n highlightColor: props.highlightColor,\n }),\n ...(props.beforeId !== undefined && { beforeId: props.beforeId }),\n ...(props._animations !== undefined && {\n _animations: props._animations,\n }),\n ...(props._lighting !== undefined && { _lighting: props._lighting }),\n };\n\n return new ScenegraphLayer(layerProps as ScenegraphLayerProps);\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.scenegraph,\n props.getPosition,\n props.getColor,\n props.getOrientation,\n props.getScale,\n props.sizeScale,\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":"qvBAkDE,IAAM,EAAQ,EAUR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MAwCG,IAAI,EAAgB,CApCzB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,WAAY,EAAM,WAClB,YAAa,EAAM,YACnB,SAAU,EAAM,UAAY,CAAC,IAAK,IAAK,IAAK,GAAG,EAC/C,eAAgB,EAAM,gBAAkB,CAAC,EAAG,EAAG,CAAC,EAChD,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,CAAC,EACpC,eAAgB,EAAM,gBAAkB,CAAC,EAAG,EAAG,CAAC,EAChD,UAAW,EAAM,UACjB,cAAe,EAAM,cACrB,cAAe,EAAM,cACrB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,EAElD,GAAI,EAAM,qBAAuB,IAAA,IAAa,CAC5C,mBAAoB,EAAM,kBAC5B,EACA,GAAI,EAAM,WAAa,IAAA,IAAa,CAAE,SAAU,EAAM,QAAS,EAC/D,GAAI,EAAM,UAAY,IAAA,IAAa,CAAE,QAAS,EAAM,OAAQ,EAC5D,GAAI,EAAM,cAAgB,IAAA,IAAa,CACrC,YAAa,EAAM,WACrB,EACA,GAAI,EAAM,iBAAmB,IAAA,IAAa,CACxC,eAAgB,EAAM,cACxB,EACA,GAAI,EAAM,WAAa,IAAA,IAAa,CAAE,SAAU,EAAM,QAAS,EAC/D,GAAI,EAAM,cAAgB,IAAA,IAAa,CACrC,YAAa,EAAM,WACrB,EACA,GAAI,EAAM,YAAc,IAAA,IAAa,CAAE,UAAW,EAAM,SAAU,CAGzC,CAAkC,EAGzD,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,WACN,EAAM,YACN,EAAM,SACN,EAAM,eACN,EAAM,SACN,EAAM,UACN,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"}
@@ -0,0 +1,2 @@
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{ScreenGridLayer as s}from"@deck.gl/aggregation-layers";const c=r({__name:`VLayerDeckglScreenGrid`,props:{id:{},data:{},getPosition:{},getWeight:{},cellSizePixels:{default:100},cellMarginPixels:{default:2},colorRange:{},colorDomain:{},gpuAggregation:{type:Boolean,default:!1},aggregation:{default:`SUM`},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,getPosition:l.getPosition,getWeight:l.getWeight??1,cellSizePixels:l.cellSizePixels,cellMarginPixels:l.cellMarginPixels,colorRange:l.colorRange,colorDomain:l.colorDomain,gpuAggregation:l.gpuAggregation,aggregation:l.aggregation,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.getPosition,l.cellSizePixels,l.colorRange,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglScreenGrid};
2
+ //# sourceMappingURL=screen-grid-Cp80FMUf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-grid-Cp80FMUf.js","names":[],"sources":["../src/layers/deckgl/screen-grid/VLayerDeckglScreenGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Aggregate point data into a screen-aligned grid (zoom-dependent).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/aggregation-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/aggregation-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { ScreenGridLayer } from '@deck.gl/aggregation-layers';\n import type { Color, PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\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 getPosition: Accessor<D, Position>;\n getWeight?: Accessor<D, number>;\n cellSizePixels?: number;\n cellMarginPixels?: number;\n colorRange?: Color[];\n colorDomain?: [number, number];\n gpuAggregation?: boolean;\n aggregation?: 'SUM' | 'MEAN' | 'MIN' | 'MAX';\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 cellSizePixels: 100,\n cellMarginPixels: 2,\n gpuAggregation: false,\n aggregation: 'SUM',\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 ScreenGridLayer({\n id: props.id,\n data: props.data,\n getPosition: props.getPosition,\n getWeight: props.getWeight ?? 1,\n cellSizePixels: props.cellSizePixels,\n cellMarginPixels: props.cellMarginPixels,\n colorRange: props.colorRange,\n colorDomain: props.colorDomain,\n gpuAggregation: props.gpuAggregation,\n aggregation: props.aggregation,\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 unknown as ConstructorParameters<typeof ScreenGridLayer>[0]);\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.getPosition,\n props.cellSizePixels,\n props.colorRange,\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":"mrBAsCE,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAgB,CACzB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,UAAW,EAAM,WAAa,EAC9B,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,WAAY,EAAM,WAClB,YAAa,EAAM,YACnB,eAAgB,EAAM,eACtB,YAAa,EAAM,YACnB,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,CAAgE,EAG5D,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,YACN,EAAM,eACN,EAAM,WACN,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"}
@@ -0,0 +1,2 @@
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{SimpleMeshLayer as s}from"@deck.gl/mesh-layers";const c=r({__name:`VLayerDeckglSimpleMesh`,props:{id:{},data:{},mesh:{},getPosition:{},getColor:{},getOrientation:{},getScale:{},getTranslation:{},getTransformMatrix:{},texture:{},sizeScale:{default:1},wireframe:{type:Boolean,default:!1},material:{type:[Boolean,Object]},loaders:{},loadOptions:{},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,mesh:l.mesh,getPosition:l.getPosition,getColor:l.getColor??[255,255,255,255],getOrientation:l.getOrientation??[0,0,0],getScale:l.getScale??[1,1,1],getTranslation:l.getTranslation??[0,0,0],sizeScale:l.sizeScale,wireframe:l.wireframe,opacity:l.opacity,visible:l.visible,pickable:l.pickable,autoHighlight:l.autoHighlight,onClick:e=>u(`click`,e),onHover:e=>u(`hover`,e),...l.getTransformMatrix!==void 0&&{getTransformMatrix:l.getTransformMatrix},...l.texture!==void 0&&{texture:l.texture},...l.material!==void 0&&{material:l.material},...l.loaders!==void 0&&{loaders:l.loaders},...l.loadOptions!==void 0&&{loadOptions:l.loadOptions},...l.highlightColor!==void 0&&{highlightColor:l.highlightColor},...l.beforeId!==void 0&&{beforeId:l.beforeId}}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.mesh,l.getPosition,l.getColor,l.getOrientation,l.getScale,l.sizeScale,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglSimpleMesh};
2
+ //# sourceMappingURL=simple-mesh-DT1BC-Mz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-mesh-DT1BC-Mz.js","names":[],"sources":["../src/layers/deckgl/simple-mesh/VLayerDeckglSimpleMesh.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Instance a single 3D mesh (GLTF / OBJ) at many positions.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/mesh-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/mesh-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { SimpleMeshLayer } from '@deck.gl/mesh-layers';\n import type { SimpleMeshLayerProps } from '@deck.gl/mesh-layers';\n import type { Color, PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\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 mesh: string | object;\n getPosition: Accessor<D, Position>;\n getColor?: Accessor<D, Color>;\n getOrientation?: Accessor<D, [number, number, number]>;\n getScale?: Accessor<D, [number, number, number] | number>;\n getTranslation?: Accessor<D, [number, number, number]>;\n getTransformMatrix?: Accessor<D, number[]>;\n texture?: string | object;\n sizeScale?: number;\n wireframe?: boolean;\n material?: boolean | object;\n loaders?: object[];\n loadOptions?: object;\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 sizeScale: 1,\n wireframe: false,\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 // Build layer props object, excluding undefined optional props to avoid deck.gl bugs\n // where it tries to call undefined as a function (e.g., getTransformMatrix)\n const layerProps = {\n id: props.id,\n data: props.data,\n mesh: props.mesh,\n getPosition: props.getPosition,\n getColor: props.getColor ?? [255, 255, 255, 255],\n getOrientation: props.getOrientation ?? [0, 0, 0],\n getScale: props.getScale ?? [1, 1, 1],\n getTranslation: props.getTranslation ?? [0, 0, 0],\n sizeScale: props.sizeScale,\n wireframe: props.wireframe,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n // Only include optional props if defined\n ...(props.getTransformMatrix !== undefined && {\n getTransformMatrix: props.getTransformMatrix,\n }),\n ...(props.texture !== undefined && { texture: props.texture }),\n ...(props.material !== undefined && { material: props.material }),\n ...(props.loaders !== undefined && { loaders: props.loaders }),\n ...(props.loadOptions !== undefined && {\n loadOptions: props.loadOptions,\n }),\n ...(props.highlightColor !== undefined && {\n highlightColor: props.highlightColor,\n }),\n ...(props.beforeId !== undefined && { beforeId: props.beforeId }),\n };\n\n return new SimpleMeshLayer(layerProps as SimpleMeshLayerProps);\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.mesh,\n props.getPosition,\n props.getColor,\n props.getOrientation,\n props.getScale,\n props.sizeScale,\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":"6tBA4CE,IAAM,EAAQ,EASR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MAoCG,IAAI,EAAgB,CAhCzB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,SAAU,EAAM,UAAY,CAAC,IAAK,IAAK,IAAK,GAAG,EAC/C,eAAgB,EAAM,gBAAkB,CAAC,EAAG,EAAG,CAAC,EAChD,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,CAAC,EACpC,eAAgB,EAAM,gBAAkB,CAAC,EAAG,EAAG,CAAC,EAChD,UAAW,EAAM,UACjB,UAAW,EAAM,UACjB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,EAElD,GAAI,EAAM,qBAAuB,IAAA,IAAa,CAC5C,mBAAoB,EAAM,kBAC5B,EACA,GAAI,EAAM,UAAY,IAAA,IAAa,CAAE,QAAS,EAAM,OAAQ,EAC5D,GAAI,EAAM,WAAa,IAAA,IAAa,CAAE,SAAU,EAAM,QAAS,EAC/D,GAAI,EAAM,UAAY,IAAA,IAAa,CAAE,QAAS,EAAM,OAAQ,EAC5D,GAAI,EAAM,cAAgB,IAAA,IAAa,CACrC,YAAa,EAAM,WACrB,EACA,GAAI,EAAM,iBAAmB,IAAA,IAAa,CACxC,eAAgB,EAAM,cACxB,EACA,GAAI,EAAM,WAAa,IAAA,IAAa,CAAE,SAAU,EAAM,QAAS,CAGtC,CAAkC,EAGzD,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,KACN,EAAM,YACN,EAAM,SACN,EAAM,eACN,EAAM,SACN,EAAM,UACN,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"}
@@ -0,0 +1,2 @@
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{SolidPolygonLayer as s}from"@deck.gl/layers";const c=r({__name:`VLayerDeckglSolidPolygon`,props:{id:{},data:{},getPolygon:{},getFillColor:{},getLineColor:{},getElevation:{},filled:{type:Boolean,default:!0},extruded:{type:Boolean,default:!1},wireframe:{type:Boolean,default:!1},elevationScale:{default:1},material:{type:[Boolean,Object]},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,getPolygon:l.getPolygon,getFillColor:l.getFillColor??[0,0,0,255],getLineColor:l.getLineColor??[0,0,0,255],getElevation:l.getElevation??1e3,filled:l.filled,extruded:l.extruded,wireframe:l.wireframe,elevationScale:l.elevationScale,material:l.material,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.getPolygon,l.getFillColor,l.getElevation,l.extruded,l.elevationScale,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglSolidPolygon};
2
+ //# sourceMappingURL=solid-polygon-BxLiMNAC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-polygon-BxLiMNAC.js","names":[],"sources":["../src/layers/deckgl/solid-polygon/VLayerDeckglSolidPolygon.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Triangulated solid polygons with extrusion (fastest filled polygons in deck.gl).\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 { SolidPolygonLayer } from '@deck.gl/layers';\n import type { SolidPolygonLayerProps } from '@deck.gl/layers';\n import type { Color, PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\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 getPolygon: Accessor<D, Position[] | Position[][]>;\n getFillColor?: Accessor<D, Color>;\n getLineColor?: Accessor<D, Color>;\n getElevation?: Accessor<D, number>;\n filled?: boolean;\n extruded?: boolean;\n wireframe?: boolean;\n elevationScale?: number;\n material?: boolean | object;\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 filled: true,\n extruded: false,\n wireframe: false,\n elevationScale: 1,\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 SolidPolygonLayer({\n id: props.id,\n data: props.data,\n getPolygon: props.getPolygon,\n getFillColor: props.getFillColor ?? [0, 0, 0, 255],\n getLineColor: props.getLineColor ?? [0, 0, 0, 255],\n getElevation: props.getElevation ?? 1000,\n filled: props.filled,\n extruded: props.extruded,\n wireframe: props.wireframe,\n elevationScale: props.elevationScale,\n material: props.material,\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 SolidPolygonLayerProps);\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.getPolygon,\n props.getFillColor,\n props.getElevation,\n props.extruded,\n props.elevationScale,\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":"qtBAwCE,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAkB,CAC3B,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,WAAY,EAAM,WAClB,aAAc,EAAM,cAAgB,CAAC,EAAG,EAAG,EAAG,GAAG,EACjD,aAAc,EAAM,cAAgB,CAAC,EAAG,EAAG,EAAG,GAAG,EACjD,aAAc,EAAM,cAAgB,IACpC,OAAQ,EAAM,OACd,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,eAAgB,EAAM,eACtB,SAAU,EAAM,SAChB,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,CAA2B,EAGvB,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,WACN,EAAM,aACN,EAAM,aACN,EAAM,SACN,EAAM,eACN,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"}
@@ -0,0 +1,2 @@
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{defineComponent as n,onBeforeUnmount as r,ref as i,renderSlot as a,watch as o}from"vue";import{MaplibreStarfieldLayer as s}from"@geoql/maplibre-gl-starfield";const c=n({__name:`VLayerStarfield`,props:{id:{default:`starfield`},starCount:{default:4e3},starSize:{default:2},starColor:{default:16777215},galaxyTextureUrl:{},galaxyBrightness:{default:.35},before:{},sunEnabled:{type:Boolean,default:!1},sunAzimuth:{default:180},sunAltitude:{default:45},sunSize:{default:100},sunColor:{default:16772778},sunIntensity:{default:1.5},autoFadeStars:{type:Boolean,default:!0},fadeAltitude:{}},setup(n){let c=n,l=e(t),u=i(!1),d=null,f=()=>l.value||null,p=()=>{let e=f();if(!(!e||!e.isStyleLoaded()))try{e.getLayer(c.id)&&e.removeLayer(c.id),d=new s({id:c.id,starCount:c.starCount,starSize:c.starSize,starColor:c.starColor,galaxyTextureUrl:c.galaxyTextureUrl,galaxyBrightness:c.galaxyBrightness,sunEnabled:c.sunEnabled,sunAzimuth:c.sunAzimuth,sunAltitude:c.sunAltitude,sunSize:c.sunSize,sunColor:c.sunColor,sunIntensity:c.sunIntensity,autoFadeStars:c.autoFadeStars,fadeAltitude:c.fadeAltitude}),e.addLayer(d,c.before||void 0)}catch(e){console.error(`Error adding starfield layer:`,e)}},m=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?u.value=!0:(u.value=!1,setTimeout(t,200))};t()})};return o(l,e=>{e&&(m(e),e.isStyleLoaded()&&(u.value=!0))},{immediate:!0}),o(u,e=>{e&&p()}),o(()=>[c.sunAzimuth,c.sunAltitude,c.fadeAltitude],([e,t,n])=>{d?.setSunPosition(e,t,n)}),o(()=>c.fadeAltitude,e=>{d?.setFadeAltitude(e)}),o(()=>c.sunEnabled,e=>{d?.setSunEnabled(e)}),o(()=>c.sunIntensity,e=>{d?.setSunIntensity(e)}),o(()=>c.sunSize,e=>{d?.setSunSize(e)}),r(()=>{let e=f();if(e){try{e.getLayer(c.id)&&e.removeLayer(c.id)}catch(e){console.error(`Error cleaning up starfield layer:`,e)}d=null}}),(e,t)=>a(e.$slots,`default`)}});export{c as StarfieldLayer};
2
+ //# sourceMappingURL=starfield-Djc5vy6K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starfield-Djc5vy6K.js","names":[],"sources":["../src/layers/maplibre/custom/starfield/VLayerStarfield.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Animated starfield overlay rendered as a custom MapLibre layer for night-time / space-themed basemaps.\n *\n * @requires `@geoql/maplibre-gl-starfield`\n *\n * Install with:\n * `pnpm add @geoql/maplibre-gl-starfield`\n */\n import { ref, watch, onBeforeUnmount } from 'vue';\n import type { Map } from 'maplibre-gl';\n import { MaplibreStarfieldLayer } from '@geoql/maplibre-gl-starfield';\n import { injectStrict, MapKey } from '../../../../utils';\n\n interface Props {\n id?: string;\n starCount?: number;\n starSize?: number;\n starColor?: number;\n galaxyTextureUrl?: string;\n galaxyBrightness?: number;\n before?: string;\n sunEnabled?: boolean;\n sunAzimuth?: number;\n sunAltitude?: number;\n sunSize?: number;\n sunColor?: number;\n sunIntensity?: number;\n autoFadeStars?: boolean;\n fadeAltitude?: number;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n id: 'starfield',\n starCount: 4000,\n starSize: 2.0,\n starColor: 0xffffff,\n galaxyBrightness: 0.35,\n sunEnabled: false,\n sunAzimuth: 180,\n sunAltitude: 45,\n sunSize: 100,\n sunColor: 0xffeeaa,\n sunIntensity: 1.5,\n autoFadeStars: true,\n });\n\n const map = injectStrict(MapKey);\n const loaded = ref(false);\n let layerInstance: MaplibreStarfieldLayer | null = null;\n\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.isStyleLoaded()) return;\n\n try {\n if (mapInstance.getLayer(props.id)) {\n mapInstance.removeLayer(props.id);\n }\n\n layerInstance = new MaplibreStarfieldLayer({\n id: props.id,\n starCount: props.starCount,\n starSize: props.starSize,\n starColor: props.starColor,\n galaxyTextureUrl: props.galaxyTextureUrl,\n galaxyBrightness: props.galaxyBrightness,\n sunEnabled: props.sunEnabled,\n sunAzimuth: props.sunAzimuth,\n sunAltitude: props.sunAltitude,\n sunSize: props.sunSize,\n sunColor: props.sunColor,\n sunIntensity: props.sunIntensity,\n autoFadeStars: props.autoFadeStars,\n fadeAltitude: props.fadeAltitude,\n });\n\n mapInstance.addLayer(layerInstance, props.before || undefined);\n } catch (error) {\n console.error('Error adding starfield layer:', error);\n }\n };\n\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n if (newMap.isStyleLoaded()) {\n loaded.value = true;\n }\n }\n },\n { immediate: true },\n );\n\n watch(loaded, (value) => {\n if (value) {\n addLayer();\n }\n });\n\n watch(\n () => [props.sunAzimuth, props.sunAltitude, props.fadeAltitude],\n ([az, alt, fade]) => {\n layerInstance?.setSunPosition(\n az as number,\n alt as number,\n fade as number | undefined,\n );\n },\n );\n watch(\n () => props.fadeAltitude,\n (fade) => {\n layerInstance?.setFadeAltitude(fade);\n },\n );\n\n watch(\n () => props.sunEnabled,\n (enabled) => {\n layerInstance?.setSunEnabled(enabled);\n },\n );\n\n watch(\n () => props.sunIntensity,\n (intensity) => {\n layerInstance?.setSunIntensity(intensity);\n },\n );\n\n watch(\n () => props.sunSize,\n (size) => {\n layerInstance?.setSunSize(size);\n },\n );\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.id)) {\n mapInstance.removeLayer(props.id);\n }\n } catch (error) {\n console.error('Error cleaning up starfield layer:', error);\n }\n layerInstance = null;\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"koBAgCE,IAAM,EAAQ,EAeR,EAAM,EAAa,CAAM,EACzB,EAAS,EAAI,EAAK,EACpB,EAA+C,KAE7C,MACG,EAAI,OAAS,KAGhB,MAAuB,CAC3B,IAAM,EAAc,EAAe,EAC/B,MAAC,GAAe,CAAC,EAAY,cAAc,GAE/C,GAAI,CACE,EAAY,SAAS,EAAM,EAAE,GAC/B,EAAY,YAAY,EAAM,EAAE,EAGlC,EAAgB,IAAI,EAAuB,CACzC,GAAI,EAAM,GACV,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,iBAAkB,EAAM,iBACxB,iBAAkB,EAAM,iBACxB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,YAAa,EAAM,YACnB,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,cAAe,EAAM,cACrB,aAAc,EAAM,YACtB,CAAC,EAED,EAAY,SAAS,EAAe,EAAM,QAAU,IAAA,EAAS,CAC/D,OAAS,EAAO,CACd,QAAQ,MAAM,gCAAiC,CAAK,CACtD,CACF,EAEM,EAAY,GAAqB,CAChC,GAEL,EAAY,GAAG,iBAAoB,CACjC,IAAM,MAAqB,CACpB,EAAY,cAAc,EAI7B,EAAO,MAAQ,IAHf,EAAO,MAAQ,GACf,WAAW,EAAc,GAAG,EAIhC,EACA,EAAa,CACf,CAAC,CACH,SAEA,EACE,EACC,GAAW,CACN,IACF,EAAS,CAAM,EACX,EAAO,cAAc,IACvB,EAAO,MAAQ,IAGrB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,EAAM,EAAS,GAAU,CACnB,GACF,EAAS,CAEb,CAAC,EAED,MACQ,CAAC,EAAM,WAAY,EAAM,YAAa,EAAM,YAAY,GAC7D,CAAC,EAAI,EAAK,KAAU,CACnB,GAAe,eACb,EACA,EACA,CACF,CACF,CACF,EACA,MACQ,EAAM,aACX,GAAS,CACR,GAAe,gBAAgB,CAAI,CACrC,CACF,EAEA,MACQ,EAAM,WACX,GAAY,CACX,GAAe,cAAc,CAAO,CACtC,CACF,EAEA,MACQ,EAAM,aACX,GAAc,CACb,GAAe,gBAAgB,CAAS,CAC1C,CACF,EAEA,MACQ,EAAM,QACX,GAAS,CACR,GAAe,WAAW,CAAI,CAChC,CACF,EAEA,MAAsB,CACpB,IAAM,EAAc,EAAe,EAC9B,KAEL,IAAI,CACE,EAAY,SAAS,EAAM,EAAE,GAC/B,EAAY,YAAY,EAAM,EAAE,CAEpC,OAAS,EAAO,CACd,QAAQ,MAAM,qCAAsC,CAAK,CAC3D,CACA,EAAgB,IADhB,CAEF,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
@@ -0,0 +1,7 @@
1
+ import { Component } from "vue";
2
+
3
+ //#region src/starfield.d.ts
4
+ declare const VLayerStarfield: Component;
5
+ //#endregion
6
+ export { VLayerStarfield };
7
+ //# sourceMappingURL=starfield.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{defineAsyncComponent as e}from"vue";const t=e(()=>import(`./starfield-Djc5vy6K.js`).then(e=>e.StarfieldLayer));export{t as VLayerStarfield};
2
+ //# sourceMappingURL=starfield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starfield.js","names":[],"sources":["../src/starfield.ts"],"sourcesContent":["/**\n * `@geoql/v-maplibre/starfield` subpath entry.\n *\n * Animated starfield background layer. Requires `@geoql/maplibre-gl-starfield`:\n *\n * `pnpm add @geoql/maplibre-gl-starfield`\n */\nimport { defineAsyncComponent, type Component } from 'vue';\n\nexport const VLayerStarfield: Component = defineAsyncComponent(() =>\n import('./layers/maplibre/custom/starfield').then((m) => m.StarfieldLayer),\n);\n"],"mappings":"2CASA,MAAa,EAA6B,MACxC,OAAO,2BAAsC,KAAM,GAAM,EAAE,cAAc,CAC3E"}
@@ -0,0 +1,2 @@
1
+ import{inject as e}from"vue";function t(t,n){let r=e(t,n);if(!r)throw Error(`Could not resolve ${t.description}`);return r}const n=Symbol(`Map`),r=Symbol(`Protocol`);export{r as n,t as r,n as t};
2
+ //# sourceMappingURL=symbols-DXKzIgbY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols-DXKzIgbY.js","names":[],"sources":["../src/utils/injects.ts","../src/utils/symbols.ts"],"sourcesContent":["import type { InjectionKey } from 'vue';\nimport { inject } from 'vue';\n\n/**\n * Dependency injection 🥳\n * @param {InjectionKey} key - The key to inject\n * @param {string | undefined} fallback - The fallback value\n * @returns {undefined} - The value\n */\nexport function injectStrict<T>(key: InjectionKey<T>, fallback?: T): T {\n const resolved = inject(key, fallback);\n if (!resolved) {\n throw new Error(`Could not resolve ${key.description}`);\n }\n return resolved;\n}\n","import type { Map } from 'maplibre-gl';\nimport type { Protocol } from 'pmtiles';\nimport type { InjectionKey, Ref } from 'vue';\n\nconst MapKey: InjectionKey<Ref<Map | null>> = Symbol('Map');\nconst PMTileProtocolKey: InjectionKey<Protocol | null> = Symbol('Protocol');\n\nexport { MapKey, PMTileProtocolKey };\nexport {\n DeckOverlayKey,\n DeckLayersKey,\n} from '../layers/deckgl/_shared/useDeckOverlay';\n"],"mappings":"6BASA,SAAgB,EAAgB,EAAsB,EAAiB,CACrE,IAAM,EAAW,EAAO,EAAK,CAAQ,EACrC,GAAI,CAAC,EACH,MAAU,MAAM,qBAAqB,EAAI,aAAa,EAExD,OAAO,CACT,CCXA,MAAM,EAAwC,OAAO,KAAK,EACpD,EAAmD,OAAO,UAAU"}
@@ -0,0 +1,2 @@
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{TerrainLayer as s}from"@deck.gl/geo-layers";const c=r({__name:`VLayerDeckglTerrain`,props:{id:{},elevationData:{},texture:{},meshMaxError:{default:4},elevationDecoder:{},bounds:{},loadOptions:{},workerUrl:{},color:{},wireframe:{type:Boolean,default:!1},material:{type:[Boolean,Object]},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},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,elevationData:l.elevationData,texture:l.texture,meshMaxError:l.meshMaxError,elevationDecoder:l.elevationDecoder,bounds:l.bounds,loadOptions:l.loadOptions,workerUrl:l.workerUrl,color:l.color??[255,255,255],wireframe:l.wireframe,material:l.material,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.elevationData,l.texture,l.meshMaxError,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglTerrain};
2
+ //# sourceMappingURL=terrain-CPKUswLf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain-CPKUswLf.js","names":[],"sources":["../src/layers/deckgl/terrain/VLayerDeckglTerrain.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render terrain meshes from elevation tiles (terrain-rgb / mapbox-rgb).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/geo-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { TerrainLayer } from '@deck.gl/geo-layers';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n interface Props {\n id: string;\n elevationData:\n | string\n | ((tileData: { x: number; y: number; z: number }) => string);\n texture?:\n | string\n | ((tileData: { x: number; y: number; z: number }) => string);\n meshMaxError?: number;\n elevationDecoder?: {\n rScaler: number;\n gScaler: number;\n bScaler: number;\n offset: number;\n };\n bounds?: [number, number, number, number];\n loadOptions?: object;\n workerUrl?: string;\n color?: Color;\n wireframe?: boolean;\n material?: boolean | object;\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 meshMaxError: 4.0,\n wireframe: false,\n opacity: 1,\n visible: true,\n pickable: false,\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 TerrainLayer({\n id: props.id,\n elevationData: props.elevationData,\n texture: props.texture,\n meshMaxError: props.meshMaxError,\n elevationDecoder: props.elevationDecoder,\n bounds: props.bounds,\n loadOptions: props.loadOptions,\n workerUrl: props.workerUrl,\n color: props.color ?? [255, 255, 255],\n wireframe: props.wireframe,\n material: props.material,\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 unknown as ConstructorParameters<typeof TerrainLayer>[0]);\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.elevationData,\n props.texture,\n props.meshMaxError,\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":"kqBA8CE,IAAM,EAAQ,EASR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAa,CACtB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,QAAS,EAAM,QACf,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,MAAO,EAAM,OAAS,CAAC,IAAK,IAAK,GAAG,EACpC,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,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,CAA6D,EAGzD,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,cACN,EAAM,QACN,EAAM,aACN,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"}
@@ -0,0 +1,2 @@
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{TextLayer as s}from"@deck.gl/layers";const c=r({__name:`VLayerDeckglText`,props:{id:{},data:{},getPosition:{},getText:{},getSize:{},getColor:{},getAngle:{},getTextAnchor:{},getAlignmentBaseline:{},getPixelOffset:{},getBackgroundColor:{},getBorderColor:{},getBorderWidth:{},background:{type:Boolean,default:!1},backgroundPadding:{},billboard:{type:Boolean,default:!0},sizeScale:{default:1},sizeUnits:{default:`pixels`},sizeMinPixels:{default:0},sizeMaxPixels:{default:2**53-1},characterSet:{default:`auto`},fontFamily:{default:`Monaco, monospace`},fontWeight:{default:`normal`},lineHeight:{default:1},fontSettings:{default:()=>({sdf:!0})},wordBreak:{default:`break-word`},maxWidth:{default:-1},outlineWidth:{default:0},outlineColor:{},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,getPosition:l.getPosition,getText:l.getText,getSize:l.getSize??32,getColor:l.getColor??[0,0,0,255],getAngle:l.getAngle??0,getTextAnchor:l.getTextAnchor??`middle`,getAlignmentBaseline:l.getAlignmentBaseline??`center`,getPixelOffset:l.getPixelOffset??[0,0],getBackgroundColor:l.getBackgroundColor,getBorderColor:l.getBorderColor,getBorderWidth:l.getBorderWidth,background:l.background,backgroundPadding:l.backgroundPadding,billboard:l.billboard,sizeScale:l.sizeScale,sizeUnits:l.sizeUnits,sizeMinPixels:l.sizeMinPixels,sizeMaxPixels:l.sizeMaxPixels,characterSet:l.characterSet,fontFamily:l.fontFamily,fontWeight:l.fontWeight,lineHeight:l.lineHeight,fontSettings:l.fontSettings,wordBreak:l.wordBreak,maxWidth:l.maxWidth,outlineWidth:l.outlineWidth,outlineColor:l.outlineColor,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.getPosition,l.getText,l.getSize,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 VLayerDeckglText};
2
+ //# sourceMappingURL=text-Qf7B4QNZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-Qf7B4QNZ.js","names":[],"sources":["../src/layers/deckgl/text/VLayerDeckglText.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render bitmap-font text labels at coordinate positions.\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 { TextLayer } from '@deck.gl/layers';\n import type { TextLayerProps } 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 getPosition: Accessor<D, Position>;\n getText: Accessor<D, string>;\n getSize?: Accessor<D, number>;\n getColor?: Accessor<D, Color>;\n getAngle?: Accessor<D, number>;\n getTextAnchor?: Accessor<D, 'start' | 'middle' | 'end'>;\n getAlignmentBaseline?: Accessor<D, 'top' | 'center' | 'bottom'>;\n getPixelOffset?: Accessor<D, [number, number]>;\n getBackgroundColor?: Accessor<D, Color>;\n getBorderColor?: Accessor<D, Color>;\n getBorderWidth?: Accessor<D, number>;\n background?: boolean;\n backgroundPadding?: [number, number] | [number, number, number, number];\n billboard?: boolean;\n sizeScale?: number;\n sizeUnits?: 'meters' | 'common' | 'pixels';\n sizeMinPixels?: number;\n sizeMaxPixels?: number;\n characterSet?: string | string[];\n fontFamily?: string;\n fontWeight?: string | number;\n lineHeight?: number;\n fontSettings?: {\n sdf?: boolean;\n fontSize?: number;\n buffer?: number;\n radius?: number;\n cutoff?: number;\n smoothing?: number;\n };\n wordBreak?: 'break-all' | 'break-word';\n maxWidth?: number;\n outlineWidth?: number;\n outlineColor?: Color;\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 background: false,\n billboard: true,\n sizeScale: 1,\n sizeUnits: 'pixels',\n sizeMinPixels: 0,\n sizeMaxPixels: Number.MAX_SAFE_INTEGER,\n characterSet: 'auto',\n fontFamily: 'Monaco, monospace',\n fontWeight: 'normal',\n lineHeight: 1,\n fontSettings: () => ({ sdf: true }),\n wordBreak: 'break-word',\n maxWidth: -1,\n outlineWidth: 0,\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 TextLayer({\n id: props.id,\n data: props.data,\n getPosition: props.getPosition,\n getText: props.getText,\n getSize: props.getSize ?? 32,\n getColor: props.getColor ?? [0, 0, 0, 255],\n getAngle: props.getAngle ?? 0,\n getTextAnchor: props.getTextAnchor ?? 'middle',\n getAlignmentBaseline: props.getAlignmentBaseline ?? 'center',\n getPixelOffset: props.getPixelOffset ?? [0, 0],\n getBackgroundColor: props.getBackgroundColor,\n getBorderColor: props.getBorderColor,\n getBorderWidth: props.getBorderWidth,\n background: props.background,\n backgroundPadding: props.backgroundPadding,\n billboard: props.billboard,\n sizeScale: props.sizeScale,\n sizeUnits: props.sizeUnits,\n sizeMinPixels: props.sizeMinPixels,\n sizeMaxPixels: props.sizeMaxPixels,\n characterSet: props.characterSet,\n fontFamily: props.fontFamily,\n fontWeight: props.fontWeight,\n lineHeight: props.lineHeight,\n fontSettings: props.fontSettings,\n wordBreak: props.wordBreak,\n maxWidth: props.maxWidth,\n outlineWidth: props.outlineWidth,\n outlineColor: props.outlineColor,\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 TextLayerProps);\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.getPosition,\n props.getText,\n props.getSize,\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":"kmCAkEE,IAAM,EAAQ,EAqBR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAU,CACnB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,QAAS,EAAM,QACf,QAAS,EAAM,SAAW,GAC1B,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,EAAG,GAAG,EACzC,SAAU,EAAM,UAAY,EAC5B,cAAe,EAAM,eAAiB,SACtC,qBAAsB,EAAM,sBAAwB,SACpD,eAAgB,EAAM,gBAAkB,CAAC,EAAG,CAAC,EAC7C,mBAAoB,EAAM,mBAC1B,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,WAAY,EAAM,WAClB,kBAAmB,EAAM,kBACzB,UAAW,EAAM,UACjB,UAAW,EAAM,UACjB,UAAW,EAAM,UACjB,cAAe,EAAM,cACrB,cAAe,EAAM,cACrB,aAAc,EAAM,aACpB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,aAAc,EAAM,aACpB,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,YACN,EAAM,QACN,EAAM,QACN,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"}
@@ -0,0 +1,2 @@
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{Tile3DLayer as s}from"@deck.gl/geo-layers";const c=r({__name:`VLayerDeckglTile3D`,props:{id:{},data:{},loader:{},loadOptions:{},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},highlightColor:{},opacity:{default:1},visible:{type:Boolean,default:!0},pointSize:{default:1},getPointColor:{},beforeId:{}},emits:[`click`,`hover`,`tilesetLoad`,`tileLoad`,`tileUnload`,`tileError`],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,pointSize:l.pointSize,opacity:l.opacity,visible:l.visible,pickable:l.pickable,autoHighlight:l.autoHighlight,beforeId:l.beforeId,onClick:e=>u(`click`,e),onHover:e=>u(`hover`,e),onTilesetLoad:e=>u(`tilesetLoad`,e),onTileLoad:e=>u(`tileLoad`,e),onTileUnload:e=>u(`tileUnload`,e),onTileError:(e,t,n)=>u(`tileError`,e,t,n),...l.loader!==void 0&&{loader:l.loader},...l.loadOptions!==void 0&&{loadOptions:l.loadOptions},...l.highlightColor!==void 0&&{highlightColor:l.highlightColor},...l.getPointColor!==void 0&&{getPointColor:l.getPointColor}}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.pointSize,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglTile3D};
2
+ //# sourceMappingURL=tile-3d-CbQInXbC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-3d-CbQInXbC.js","names":[],"sources":["../src/layers/deckgl/tile-3d/VLayerDeckglTile3D.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * 3D Tiles (Cesium / Google Photorealistic) viewer powered by loaders.gl.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/geo-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { Tile3DLayer } from '@deck.gl/geo-layers';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n interface Props {\n id: string;\n data: string;\n loader?: object;\n loadOptions?: object;\n pickable?: boolean;\n autoHighlight?: boolean;\n highlightColor?: Color;\n opacity?: number;\n visible?: boolean;\n pointSize?: number;\n getPointColor?: Color | ((d: unknown) => Color);\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n pointSize: 1,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n tilesetLoad: [tileset: unknown];\n tileLoad: [tile: unknown];\n tileUnload: [tile: unknown];\n tileError: [error: Error, url: string, tile: unknown];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const createLayer = () => {\n const layerProps = {\n id: props.id,\n data: props.data,\n pointSize: props.pointSize,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n beforeId: props.beforeId,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n onTilesetLoad: (tileset: unknown) => emit('tilesetLoad', tileset),\n onTileLoad: (tile: unknown) => emit('tileLoad', tile),\n onTileUnload: (tile: unknown) => emit('tileUnload', tile),\n onTileError: (error: Error, url: string, tile: unknown) =>\n emit('tileError', error, url, tile),\n // Only include optional props when defined to avoid deck.gl bugs\n ...(props.loader !== undefined && { loader: props.loader }),\n ...(props.loadOptions !== undefined && {\n loadOptions: props.loadOptions,\n }),\n ...(props.highlightColor !== undefined && {\n highlightColor: props.highlightColor,\n }),\n ...(props.getPointColor !== undefined && {\n getPointColor: props.getPointColor,\n }),\n };\n return new Tile3DLayer(\n layerProps as unknown as ConstructorParameters<typeof Tile3DLayer>[0],\n );\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 () => [props.data, props.pointSize, props.opacity, props.visible],\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":"6lBAgCE,IAAM,EAAQ,EAQR,EAAO,EASP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MA6BG,IAAI,EACT,CA5BA,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,SAAU,EAAM,SAChB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,cAAgB,GAAqB,EAAK,cAAe,CAAO,EAChE,WAAa,GAAkB,EAAK,WAAY,CAAI,EACpD,aAAe,GAAkB,EAAK,aAAc,CAAI,EACxD,aAAc,EAAc,EAAa,IACvC,EAAK,YAAa,EAAO,EAAK,CAAI,EAEpC,GAAI,EAAM,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAM,MAAO,EACzD,GAAI,EAAM,cAAgB,IAAA,IAAa,CACrC,YAAa,EAAM,WACrB,EACA,GAAI,EAAM,iBAAmB,IAAA,IAAa,CACxC,eAAgB,EAAM,cACxB,EACA,GAAI,EAAM,gBAAkB,IAAA,IAAa,CACvC,cAAe,EAAM,aACvB,CAGA,CACF,EAGI,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CAAC,EAAM,KAAM,EAAM,UAAW,EAAM,QAAS,EAAM,OAAO,MAC1D,EAAY,EAAM,GAAI,EAAY,CAAC,EACzC,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
@@ -0,0 +1,2 @@
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{TileLayer as s}from"@deck.gl/geo-layers";const c=r({__name:`VLayerDeckglTile`,props:{id:{},data:{},getTileData:{},renderSubLayers:{},tileSize:{default:512},maxZoom:{},minZoom:{default:0},maxCacheSize:{},maxCacheByteSize:{},refinementStrategy:{default:`best-available`},zRange:{},maxRequests:{default:6},extent:{},loadOptions:{},zoomOffset:{default:0},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},highlightColor:{},beforeId:{}},emits:[`click`,`hover`,`viewportLoad`,`tileLoad`,`tileUnload`,`tileError`],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,getTileData:l.getTileData,renderSubLayers:l.renderSubLayers,tileSize:l.tileSize,maxZoom:l.maxZoom,minZoom:l.minZoom,maxCacheSize:l.maxCacheSize,maxCacheByteSize:l.maxCacheByteSize,refinementStrategy:l.refinementStrategy,zRange:l.zRange,maxRequests:l.maxRequests,extent:l.extent,loadOptions:l.loadOptions,zoomOffset:l.zoomOffset,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),onViewportLoad:e=>u(`viewportLoad`,e),onTileLoad:e=>u(`tileLoad`,e),onTileUnload:e=>u(`tileUnload`,e),onTileError:(e,t)=>u(`tileError`,e,t)}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.tileSize,l.maxZoom,l.minZoom,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglTile};
2
+ //# sourceMappingURL=tile-BxWRJ8QY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-BxWRJ8QY.js","names":[],"sources":["../src/layers/deckgl/tile/VLayerDeckglTile.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Generic XYZ raster / vector tile viewer (deck.gl TileLayer).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/geo-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { TileLayer } from '@deck.gl/geo-layers';\n import type { TileLayerProps } from '@deck.gl/geo-layers';\n import type { Color, PickingInfo, Layer } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n interface TileData {\n x: number;\n y: number;\n z: number;\n url: string;\n signal: AbortSignal;\n bbox: {\n west: number;\n north: number;\n east: number;\n south: number;\n };\n }\n\n interface Props {\n id: string;\n data?: string | string[] | ((tileData: TileData) => Promise<unknown>);\n getTileData?: (tileData: TileData) => Promise<unknown>;\n renderSubLayers?: (props: object) => Layer | Layer[] | null;\n tileSize?: number;\n maxZoom?: number;\n minZoom?: number;\n maxCacheSize?: number;\n maxCacheByteSize?: number;\n refinementStrategy?: 'best-available' | 'no-overlap' | 'never';\n zRange?: [number, number];\n maxRequests?: number;\n extent?: [number, number, number, number];\n loadOptions?: object;\n zoomOffset?: 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 tileSize: 512,\n minZoom: 0,\n refinementStrategy: 'best-available',\n maxRequests: 6,\n zoomOffset: 0,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n viewportLoad: [tiles: unknown[]];\n tileLoad: [tile: unknown];\n tileUnload: [tile: unknown];\n tileError: [error: Error, tile: unknown];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const createLayer = () => {\n return new TileLayer({\n id: props.id,\n data: props.data,\n getTileData: props.getTileData,\n renderSubLayers: props.renderSubLayers,\n tileSize: props.tileSize,\n maxZoom: props.maxZoom,\n minZoom: props.minZoom,\n maxCacheSize: props.maxCacheSize,\n maxCacheByteSize: props.maxCacheByteSize,\n refinementStrategy: props.refinementStrategy,\n zRange: props.zRange,\n maxRequests: props.maxRequests,\n extent: props.extent,\n loadOptions: props.loadOptions,\n zoomOffset: props.zoomOffset,\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 onViewportLoad: (tiles: unknown[]) => emit('viewportLoad', tiles),\n onTileLoad: (tile: unknown) => emit('tileLoad', tile),\n onTileUnload: (tile: unknown) => emit('tileUnload', tile),\n onTileError: (error: Error, tile: unknown) =>\n emit('tileError', error, tile),\n } as TileLayerProps);\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.tileSize,\n props.maxZoom,\n props.minZoom,\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":"sxBAwDE,IAAM,EAAQ,EAYR,EAAO,EASP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAU,CACnB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,gBAAiB,EAAM,gBACvB,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,mBAAoB,EAAM,mBAC1B,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,WAAY,EAAM,WAClB,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,EAClD,eAAiB,GAAqB,EAAK,eAAgB,CAAK,EAChE,WAAa,GAAkB,EAAK,WAAY,CAAI,EACpD,aAAe,GAAkB,EAAK,aAAc,CAAI,EACxD,aAAc,EAAc,IAC1B,EAAK,YAAa,EAAO,CAAI,CACjC,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,SACN,EAAM,QACN,EAAM,QACN,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"}
@@ -0,0 +1,2 @@
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{TripsLayer as s}from"@deck.gl/geo-layers";const c=r({__name:`VLayerDeckglTrips`,props:{id:{},data:{},getPath:{},getTimestamps:{},getColor:{},getWidth:{},currentTime:{default:0},trailLength:{default:120},fadeTrail:{type:Boolean,default:!0},widthUnits:{default:`pixels`},widthScale:{default:1},widthMinPixels:{default:0},widthMaxPixels:{default:2**53-1},capRounded:{type:Boolean,default:!1},jointRounded:{type:Boolean,default:!1},billboard:{type:Boolean,default:!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,getPath:l.getPath,getTimestamps:l.getTimestamps,getColor:l.getColor??[253,128,93],getWidth:l.getWidth??1,currentTime:l.currentTime,trailLength:l.trailLength,fadeTrail:l.fadeTrail,widthUnits:l.widthUnits,widthScale:l.widthScale,widthMinPixels:l.widthMinPixels,widthMaxPixels:l.widthMaxPixels,capRounded:l.capRounded,jointRounded:l.jointRounded,billboard:l.billboard,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.currentTime,()=>m(l.id,h())),o(()=>[l.data,l.getPath,l.trailLength,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 VLayerDeckglTrips};
2
+ //# sourceMappingURL=trips-CwzuAg1k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trips-CwzuAg1k.js","names":[],"sources":["../src/layers/deckgl/trips/VLayerDeckglTrips.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Animated trail paths over time (vehicle / animal tracks).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/geo-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { TripsLayer } from '@deck.gl/geo-layers';\n import type { TripsLayerProps } from '@deck.gl/geo-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 getPath: Accessor<D, Position[]>;\n getTimestamps?: Accessor<D, number[]>;\n getColor?: Accessor<D, Color>;\n getWidth?: Accessor<D, number>;\n currentTime?: number;\n trailLength?: number;\n fadeTrail?: boolean;\n widthUnits?: 'meters' | 'common' | 'pixels';\n widthScale?: number;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n capRounded?: boolean;\n jointRounded?: boolean;\n billboard?: boolean;\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 currentTime: 0,\n trailLength: 120,\n fadeTrail: true,\n widthUnits: 'pixels',\n widthScale: 1,\n widthMinPixels: 0,\n widthMaxPixels: Number.MAX_SAFE_INTEGER,\n capRounded: false,\n jointRounded: false,\n billboard: false,\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 TripsLayer({\n id: props.id,\n data: props.data,\n getPath: props.getPath,\n getTimestamps: props.getTimestamps,\n getColor: props.getColor ?? [253, 128, 93],\n getWidth: props.getWidth ?? 1,\n currentTime: props.currentTime,\n trailLength: props.trailLength,\n fadeTrail: props.fadeTrail,\n widthUnits: props.widthUnits,\n widthScale: props.widthScale,\n widthMinPixels: props.widthMinPixels,\n widthMaxPixels: props.widthMaxPixels,\n capRounded: props.capRounded,\n jointRounded: props.jointRounded,\n billboard: props.billboard,\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 TripsLayerProps);\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 () => props.currentTime,\n () => updateLayer(props.id, createLayer()),\n );\n\n watch(\n () => [\n props.data,\n props.getPath,\n props.trailLength,\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":"o1BA8CE,IAAM,EAAQ,EAiBR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAW,CACpB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,QAAS,EAAM,QACf,cAAe,EAAM,cACrB,SAAU,EAAM,UAAY,CAAC,IAAK,IAAK,EAAE,EACzC,SAAU,EAAM,UAAY,EAC5B,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,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,CAAoB,EAGhB,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,EAAM,gBACN,EAAY,EAAM,GAAI,EAAY,CAAC,CAC3C,EAEA,MACQ,CACJ,EAAM,KACN,EAAM,QACN,EAAM,YACN,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"}
@@ -0,0 +1,2 @@
1
+ import{inject as e,onUnmounted as t,provide as n,ref as r,shallowRef as i,watch as a}from"vue";async function o(e,t,n){try{return await t()}catch(t){let r=n??`pnpm add ${e}`,i=t instanceof Error?t.message:String(t),a=Error(`[@geoql/v-maplibre] Missing optional peer dependency "${e}". Install it with: ${r}\nOriginal error: ${i}`);throw t instanceof Error&&t.stack&&(a.stack=`${a.message}\nCaused by: ${t.stack}`),a}}const s=Symbol(`DeckOverlay`),c=Symbol(`DeckLayers`);function l(l,u={}){let{interleaved:d=!1,globe:f=!1}=u,p=d||f,m=e=>{if(!f)return e;let t=e;return typeof t.clone==`function`?t.clone({parameters:{depthCompare:`always`,cullMode:`none`,...t.props?.parameters??{}}}):e},h=e(s,null),g=e(c,null);if(h&&g)return{overlay:h,isInitialized:r(!0),layers:r([]),initOverlay:()=>Promise.resolve(),...g};let _=i(null),v=r([]),y=r(!1),b=null,x=null;function S(e){x=e=>{if(!_.value)return;let t=_.value.pickObject({x:e.point.x,y:e.point.y,radius:5});if(!t?.layer)return;let n=t.layer.props.onClick;n&&n(t,e)},e.on(`click`,x)}function C(e){x&&e&&e.off(`click`,x),x=null}let w=[],T=()=>{let e=l.value;return!e||_.value?Promise.resolve():b||(b=o(`@deck.gl/mapbox`,()=>import(`@deck.gl/mapbox`),`pnpm add @deck.gl/core @deck.gl/mapbox`).then(({MapboxOverlay:t})=>{if(!_.value){if(D.size===0){b=null;return}if(f&&e.getProjection()?.type!==`globe`){let t=e.getCenter(),n=e.getZoom(),r=e.getPitch(),i=e.getBearing();e.setProjection({type:`globe`}),e.setCenter(t),e.setZoom(n),e.setPitch(r),e.setBearing(i)}for(_.value=new t({interleaved:p,layers:[],onError:e=>console.error(`[useDeckOverlay] deck onError:`,e)}),e.addControl(_.value),S(e),y.value=!0,O(),e.triggerRepaint();w.length>0;)w.shift()()}}).catch(e=>{console.error(`[deck.gl] Error initializing overlay:`,e),b=null}),b)},E=e=>e.id,D=new Map,O=()=>{v.value=[...D.values()],_.value&&(_.value.setProps({layers:v.value}),!p&&typeof l.value?.triggerRepaint==`function`&&l.value.triggerRepaint())},k=e=>{let t=m(e);D.set(E(t),t),_.value?O():(w.push(O),T())},A=e=>{D.delete(e),O()},j=(e,t)=>{D.has(e)?(D.set(e,m(t)),O()):k(t)},M=()=>[...D.values()];return a(l,e=>{if(!e||_.value||D.size===0)return;if(e.isStyleLoaded()){T();return}e.once(`style.load`,()=>T());let t=setInterval(()=>{if(_.value){clearInterval(t);return}e.isStyleLoaded()&&(clearInterval(t),T())},100);setTimeout(()=>clearInterval(t),1e4)},{immediate:!0}),n(s,_),n(c,{addLayer:k,removeLayer:A,updateLayer:j,getLayers:M}),t(()=>{if(C(l.value),_.value&&l.value)try{l.value.removeControl(_.value),_.value.finalize()}catch(e){console.error(`[deck.gl] Error cleaning up overlay:`,e)}_.value=null,v.value=[],y.value=!1,b=null}),{overlay:_,layers:v,isInitialized:y,initOverlay:T,addLayer:k,removeLayer:A,updateLayer:j,getLayers:M}}function u(){let t=e(c,null),n=e(s,null);if(!t)throw Error(`[deck.gl] useDeckLayers must be used within a component that has initialized useDeckOverlay`);return{...t,overlay:n}}export{o as a,l as i,s as n,u as r,c as t};
2
+ //# sourceMappingURL=useDeckOverlay-CI56uIKH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeckOverlay-CI56uIKH.js","names":[],"sources":["../src/utils/require-peer.ts","../src/layers/deckgl/_shared/useDeckOverlay.ts"],"sourcesContent":["/**\n * Wraps a dynamic `import()` of an optional peer dependency and converts the\n * opaque bundler `Cannot find module '…'` error into an actionable message\n * that names the package and includes a copy-pasteable install command.\n *\n * Use this **only** in non-Vue-SFC contexts (composables, lazy data loaders,\n * controls that already use `await import()`). Inside `<script setup>` of a\n * Vue component, prefer the existing top-level `import` statements — Vue\n * templates render synchronously and turning component-level imports into\n * dynamic ones changes the component contract.\n *\n * @example\n * ```ts\n * const { LidarControl } = await requirePeer(\n * 'maplibre-gl-lidar',\n * () => import('maplibre-gl-lidar'),\n * );\n * ```\n *\n * @example Custom install command (e.g. multi-package install)\n * ```ts\n * const mod = await requirePeer(\n * '@developmentseed/deck.gl-geotiff',\n * () => import('@developmentseed/deck.gl-geotiff'),\n * 'pnpm add @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj',\n * );\n * ```\n *\n * @param packageName - The npm package name (used in the error message).\n * @param loader - A thunk returning `import('<packageName>')`. Must be a thunk\n * so the bundler can split it and so the import is evaluated lazily.\n * @param installCommand - Optional override for the install hint. Defaults to\n * `pnpm add <packageName>`. Pass a custom command when several peer packages\n * must be installed together.\n * @returns The resolved module exports.\n * @throws Error with a descriptive message naming the package, the install\n * command, and the underlying loader error.\n */\nexport async function requirePeer<T>(\n packageName: string,\n loader: () => Promise<T>,\n installCommand?: string,\n): Promise<T> {\n try {\n return await loader();\n } catch (cause) {\n const install = installCommand ?? `pnpm add ${packageName}`;\n const reason = cause instanceof Error ? cause.message : String(cause);\n const error = new Error(\n `[@geoql/v-maplibre] Missing optional peer dependency \"${packageName}\". ` +\n `Install it with: ${install}\\nOriginal error: ${reason}`,\n );\n if (cause instanceof Error && cause.stack) {\n error.stack = `${error.message}\\nCaused by: ${cause.stack}`;\n }\n throw error;\n }\n}\n","import {\n inject,\n provide,\n ref,\n shallowRef,\n onUnmounted,\n watch,\n type InjectionKey,\n type Ref,\n type ShallowRef,\n} from 'vue';\nimport type { MapboxOverlay } from '@deck.gl/mapbox';\nimport type { Map, MapMouseEvent } from 'maplibre-gl';\nimport { requirePeer } from '../../../utils';\n\nexport const DeckOverlayKey: InjectionKey<ShallowRef<MapboxOverlay | null>> =\n Symbol('DeckOverlay');\n\nexport const DeckLayersKey: InjectionKey<{\n addLayer: (layer: unknown) => void;\n removeLayer: (layerId: string) => void;\n updateLayer: (layerId: string, layer: unknown) => void;\n getLayers: () => unknown[];\n}> = Symbol('DeckLayers');\n\ninterface UseDeckOverlayOptions {\n interleaved?: boolean;\n /**\n * Enable MapLibre globe projection. Implies `interleaved: true` (required for\n * deck.gl layers to share depth with the globe) and auto-injects\n * `parameters.cullMode = 'none'` on every layer so billboard-style layers\n * (Scatterplot / Trips / Icon / Text) don't clip off the sphere on pitch.\n */\n globe?: boolean;\n}\n\ninterface UseDeckOverlayReturn {\n overlay: ShallowRef<MapboxOverlay | null>;\n layers: Ref<unknown[]>;\n isInitialized: Ref<boolean>;\n initOverlay: () => Promise<void>;\n addLayer: (layer: unknown) => void;\n removeLayer: (layerId: string) => void;\n updateLayer: (layerId: string, layer: unknown) => void;\n getLayers: () => unknown[];\n}\n\nexport function useDeckOverlay(\n map: Ref<Map | null>,\n options: UseDeckOverlayOptions = {},\n): UseDeckOverlayReturn {\n const { interleaved = false, globe = false } = options;\n const useInterleaved = interleaved || globe;\n\n const applyGlobeParams = (layer: unknown): unknown => {\n if (!globe) return layer;\n const l = layer as {\n clone?: (props: Record<string, unknown>) => unknown;\n props?: { billboard?: boolean; parameters?: Record<string, unknown> };\n };\n if (typeof l.clone !== 'function') return layer;\n // Interleaved globe layers share MapLibre's depth buffer with the globe\n // sphere; deck shapes sit at the sphere-surface depth and z-fight it as the\n // camera moves, producing a motion-coupled diagonal hatch (deck.gl open bug\n // visgl/deck.gl#10206). The maintainer-confirmed workaround is\n // depthCompare:'always' (luma.gl v9 WebGPU-style key — NOT the legacy WebGL\n // depthTest/depthWrite, which deck.gl 9 silently ignores) so fragments\n // always pass the depth test instead of fighting the sphere. cullMode:'none'\n // keeps both faces so billboard path ribbons (TripsLayer) aren't culled\n // away on the globe.\n return l.clone({\n parameters: {\n depthCompare: 'always',\n cullMode: 'none',\n ...(l.props?.parameters ?? {}),\n },\n });\n };\n\n const existingOverlay = inject(DeckOverlayKey, null);\n const existingLayersRegistry = inject(DeckLayersKey, null);\n\n if (existingOverlay && existingLayersRegistry) {\n return {\n overlay: existingOverlay,\n isInitialized: ref(true),\n layers: ref([]),\n initOverlay: () => Promise.resolve(),\n ...existingLayersRegistry,\n };\n }\n\n const overlay = shallowRef<MapboxOverlay | null>(null);\n const layers = ref<unknown[]>([]);\n const isInitialized = ref(false);\n let initPromise: Promise<void> | null = null;\n let clickHandler: ((e: MapMouseEvent) => void) | null = null;\n\n /**\n * Workaround for deck.gl MapboxOverlay click events not reaching layer onClick\n * callbacks. The built-in path (_onPointerDown → _onEvent → getLastPickedObject)\n * fails to dispatch clicks. We register our own MapLibre click handler that uses\n * overlay.pickObject() for a fresh GPU pick and dispatches to the layer's onClick.\n */\n function registerClickHandler(mapInstance: Map): void {\n clickHandler = (e: MapMouseEvent) => {\n if (!overlay.value) return;\n const info = overlay.value.pickObject({\n x: e.point.x,\n y: e.point.y,\n radius: 5,\n });\n if (!info?.layer) return;\n\n const layerProps = info.layer.props as Record<string, unknown>;\n const onClick = layerProps.onClick as\n | ((i: unknown, ev: unknown) => boolean | void)\n | undefined;\n if (onClick) {\n onClick(info, e);\n }\n };\n mapInstance.on('click', clickHandler);\n }\n\n function removeClickHandler(mapInstance: Map | null): void {\n if (clickHandler && mapInstance) {\n mapInstance.off('click', clickHandler);\n }\n clickHandler = null;\n }\n\n // Queues syncLayers() calls made before overlay.value is set so they can be\n // flushed after initOverlay() resolves and overlay.value is assigned.\n const pendingSyncCalls: (() => void)[] = [];\n\n const initOverlay = (): Promise<void> => {\n const mapInstance = map.value;\n if (!mapInstance) return Promise.resolve();\n if (overlay.value) return Promise.resolve();\n if (initPromise) return initPromise;\n\n initPromise = requirePeer(\n '@deck.gl/mapbox',\n () => import('@deck.gl/mapbox'),\n 'pnpm add @deck.gl/core @deck.gl/mapbox',\n )\n .then(({ MapboxOverlay }) => {\n if (overlay.value) return;\n\n // If every layer was removed while the @deck.gl/mapbox import was still\n // in flight, there is nothing left to render — skip overlay construction\n // so a transient layer does not leave a peer-backed overlay behind\n // (issue #124). Reset initPromise so a later addLayer() can re-init\n // instead of being stranded on this resolved no-op promise.\n if (layerRegistry.size === 0) {\n initPromise = null;\n return;\n }\n\n if (globe && mapInstance.getProjection()?.type !== 'globe') {\n const center = mapInstance.getCenter();\n const zoom = mapInstance.getZoom();\n const pitch = mapInstance.getPitch();\n const bearing = mapInstance.getBearing();\n mapInstance.setProjection({ type: 'globe' });\n mapInstance.setCenter(center);\n mapInstance.setZoom(zoom);\n mapInstance.setPitch(pitch);\n mapInstance.setBearing(bearing);\n }\n\n overlay.value = new MapboxOverlay({\n interleaved: useInterleaved,\n layers: [],\n onError: (err: unknown) =>\n console.error('[useDeckOverlay] deck onError:', err),\n } as ConstructorParameters<typeof MapboxOverlay>[0]);\n\n mapInstance.addControl(overlay.value);\n registerClickHandler(mapInstance);\n isInitialized.value = true;\n\n // Flush any layers that registered before the overlay existed. Child\n // layer components mount before the parent VMap assigns map.value, so\n // their addLayer() calls land in the registry while overlay is null.\n // Without this flush they are silently dropped on first load and only\n // appear after a re-navigation warms the timing.\n syncLayers();\n mapInstance.triggerRepaint();\n\n // Flush any syncLayers() calls that raced ahead of initOverlay()\n // resolving (they called syncLayers() before overlay.value was set).\n while (pendingSyncCalls.length > 0) {\n pendingSyncCalls.shift()!();\n }\n })\n .catch((error) => {\n console.error('[deck.gl] Error initializing overlay:', error);\n initPromise = null;\n });\n\n return initPromise;\n };\n\n const getLayerId = (layer: unknown): string => {\n return (layer as { id: string }).id;\n };\n\n // Imperative id-keyed registry. A reactive array rebuilt via spread reads\n // races when N child layers mount in the same tick (all read the pre-write\n // value and clobber each other, leaving only the last layer). A Map mutated\n // in place is insertion-ordered and race-free, so every layer survives.\n const layerRegistry = new Map<string, unknown>();\n\n const syncLayers = () => {\n layers.value = [...layerRegistry.values()];\n if (overlay.value) {\n overlay.value.setProps({ layers: layers.value as never });\n // Only non-interleaved overlays need a forced composite. With\n // interleaved:false deck.gl renders to a SEPARATE canvas; setProps()\n // schedules a deck redraw but does NOT tell MapLibre to composite it, so a\n // fully-static overlay (no animation, no camera move) stays blank without\n // this triggerRepaint(). Interleaved overlays (globe) already draw inside\n // MapLibre's own render pass — forcing an extra repaint on every per-frame\n // updateLayer() races the compositor and produces flicker/smear on\n // animated layers, so it must be skipped there.\n // Guarded with typeof: test-env mock maps don't implement triggerRepaint.\n if (!useInterleaved && typeof map.value?.triggerRepaint === 'function') {\n map.value.triggerRepaint();\n }\n }\n };\n\n const addLayer = (rawLayer: unknown): void => {\n const layer = applyGlobeParams(rawLayer);\n layerRegistry.set(getLayerId(layer), layer);\n\n if (overlay.value) {\n syncLayers();\n } else {\n // Queue the call so initOverlay() can flush it after overlay.value is set.\n // Previously this did initOverlay().then(syncLayers), but that called\n // syncLayers() BEFORE overlay.value was assigned (race: the .then() fires\n // immediately if the promise is already resolved, AND the syncLayers() call\n // inside initOverlay's .then() also races ahead before overlay.value is set).\n // The queue ensures every syncLayers() call made before overlay exists\n // is replayed exactly once, after overlay.value is guaranteed to be set.\n pendingSyncCalls.push(syncLayers);\n initOverlay();\n }\n };\n\n const removeLayer = (layerId: string): void => {\n layerRegistry.delete(layerId);\n syncLayers();\n };\n\n const updateLayer = (layerId: string, rawLayer: unknown): void => {\n if (layerRegistry.has(layerId)) {\n layerRegistry.set(layerId, applyGlobeParams(rawLayer));\n syncLayers();\n } else {\n addLayer(rawLayer);\n }\n };\n\n const getLayers = (): unknown[] => {\n return [...layerRegistry.values()];\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance || overlay.value) return;\n // Only initialize the overlay when at least one deck.gl layer is\n // registered. addLayer() always populates layerRegistry before it queues\n // anything, so an empty registry means there is genuinely nothing to\n // render (this also covers the add-then-remove-before-map-ready case,\n // where a stale pendingSyncCalls entry would otherwise force a needless\n // init). Core-only consumers (VMap with no deck layers) never register a\n // layer, so they must NOT reach initOverlay() — it dynamically imports the\n // optional '@deck.gl/mapbox' peer, which is absent for core-only installs\n // and logs a caught console.error on every map load (issue #124). The lazy\n // addLayer() path still calls initOverlay() on the first real layer, so\n // deck consumers are unaffected; this watch only flushes layers that\n // registered before the map was ready.\n if (layerRegistry.size === 0) return;\n if (mapInstance.isStyleLoaded()) {\n initOverlay();\n return;\n }\n mapInstance.once('style.load', () => initOverlay());\n const interval = setInterval(() => {\n if (overlay.value) {\n clearInterval(interval);\n return;\n }\n if (mapInstance.isStyleLoaded()) {\n clearInterval(interval);\n initOverlay();\n }\n }, 100);\n setTimeout(() => clearInterval(interval), 10000);\n },\n { immediate: true },\n );\n\n provide(DeckOverlayKey, overlay);\n provide(DeckLayersKey, {\n addLayer,\n removeLayer,\n updateLayer,\n getLayers,\n });\n\n onUnmounted(() => {\n removeClickHandler(map.value);\n if (overlay.value && map.value) {\n try {\n map.value.removeControl(overlay.value);\n overlay.value.finalize();\n } catch (error) {\n console.error('[deck.gl] Error cleaning up overlay:', error);\n }\n }\n overlay.value = null;\n layers.value = [];\n isInitialized.value = false;\n initPromise = null;\n });\n\n return {\n overlay,\n layers,\n isInitialized,\n initOverlay,\n addLayer,\n removeLayer,\n updateLayer,\n getLayers,\n };\n}\n\nexport function useDeckLayers() {\n const registry = inject(DeckLayersKey, null);\n const overlay = inject(DeckOverlayKey, null);\n\n if (!registry) {\n throw new Error(\n '[deck.gl] useDeckLayers must be used within a component that has initialized useDeckOverlay',\n );\n }\n\n return {\n ...registry,\n overlay,\n };\n}\n"],"mappings":"+FAsCA,eAAsB,EACpB,EACA,EACA,EACY,CACZ,GAAI,CACF,OAAO,MAAM,EAAO,CACtB,OAAS,EAAO,CACd,IAAM,EAAU,GAAkB,YAAY,IACxC,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAC9D,EAAY,MAChB,yDAAyD,EAAY,sBAC/C,EAAQ,oBAAoB,GACpD,EAIA,MAHI,aAAiB,OAAS,EAAM,QAClC,EAAM,MAAQ,GAAG,EAAM,QAAQ,eAAe,EAAM,SAEhD,CACR,CACF,CC1CA,MAAa,EACX,OAAO,aAAa,EAET,EAKR,OAAO,YAAY,EAwBxB,SAAgB,EACd,EACA,EAAiC,CAAC,EACZ,CACtB,GAAM,CAAE,cAAc,GAAO,QAAQ,IAAU,EACzC,EAAiB,GAAe,EAEhC,EAAoB,GAA4B,CACpD,GAAI,CAAC,EAAO,OAAO,EACnB,IAAM,EAAI,EAcV,OAVI,OAAO,EAAE,OAAU,WAUhB,EAAE,MAAM,CACb,WAAY,CACV,aAAc,SACd,SAAU,OACV,GAAI,EAAE,OAAO,YAAc,CAAC,CAC9B,CACF,CAAC,EAhByC,CAiB5C,EAEM,EAAkB,EAAO,EAAgB,IAAI,EAC7C,EAAyB,EAAO,EAAe,IAAI,EAEzD,GAAI,GAAmB,EACrB,MAAO,CACL,QAAS,EACT,cAAe,EAAI,EAAI,EACvB,OAAQ,EAAI,CAAC,CAAC,EACd,gBAAmB,QAAQ,QAAQ,EACnC,GAAG,CACL,EAGF,IAAM,EAAU,EAAiC,IAAI,EAC/C,EAAS,EAAe,CAAC,CAAC,EAC1B,EAAgB,EAAI,EAAK,EAC3B,EAAoC,KACpC,EAAoD,KAQxD,SAAS,EAAqB,EAAwB,CACpD,EAAgB,GAAqB,CACnC,GAAI,CAAC,EAAQ,MAAO,OACpB,IAAM,EAAO,EAAQ,MAAM,WAAW,CACpC,EAAG,EAAE,MAAM,EACX,EAAG,EAAE,MAAM,EACX,OAAQ,CACV,CAAC,EACD,GAAI,CAAC,GAAM,MAAO,OAGlB,IAAM,EADa,EAAK,MAAM,MACH,QAGvB,GACF,EAAQ,EAAM,CAAC,CAEnB,EACA,EAAY,GAAG,QAAS,CAAY,CACtC,CAEA,SAAS,EAAmB,EAA+B,CACrD,GAAgB,GAClB,EAAY,IAAI,QAAS,CAAY,EAEvC,EAAe,IACjB,CAIA,IAAM,EAAmC,CAAC,EAEpC,MAAmC,CACvC,IAAM,EAAc,EAAI,MAiExB,MAhEI,CAAC,GACD,EAAQ,MAAc,QAAQ,QAAQ,EACtC,IAEJ,EAAc,EACZ,sBACM,OAAO,mBACb,wCACF,EACG,MAAM,CAAE,mBAAoB,CACvB,MAAQ,MAOZ,IAAI,EAAc,OAAS,EAAG,CAC5B,EAAc,KACd,MACF,CAEA,GAAI,GAAS,EAAY,cAAc,GAAG,OAAS,QAAS,CAC1D,IAAM,EAAS,EAAY,UAAU,EAC/B,EAAO,EAAY,QAAQ,EAC3B,EAAQ,EAAY,SAAS,EAC7B,EAAU,EAAY,WAAW,EACvC,EAAY,cAAc,CAAE,KAAM,OAAQ,CAAC,EAC3C,EAAY,UAAU,CAAM,EAC5B,EAAY,QAAQ,CAAI,EACxB,EAAY,SAAS,CAAK,EAC1B,EAAY,WAAW,CAAO,CAChC,CAuBA,IArBA,EAAQ,MAAQ,IAAI,EAAc,CAChC,YAAa,EACb,OAAQ,CAAC,EACT,QAAU,GACR,QAAQ,MAAM,iCAAkC,CAAG,CACvD,CAAmD,EAEnD,EAAY,WAAW,EAAQ,KAAK,EACpC,EAAqB,CAAW,EAChC,EAAc,MAAQ,GAOtB,EAAW,EACX,EAAY,eAAe,EAIpB,EAAiB,OAAS,GAC/B,EAAiB,MAAM,EAAG,CApC5B,CAsCF,CAAC,EACA,MAAO,GAAU,CAChB,QAAQ,MAAM,wCAAyC,CAAK,EAC5D,EAAc,IAChB,CAAC,EAEI,EACT,EAEM,EAAc,GACV,EAAyB,GAO7B,EAAgB,IAAI,IAEpB,MAAmB,CACvB,EAAO,MAAQ,CAAC,GAAG,EAAc,OAAO,CAAC,EACrC,EAAQ,QACV,EAAQ,MAAM,SAAS,CAAE,OAAQ,EAAO,KAAe,CAAC,EAUpD,CAAC,GAAkB,OAAO,EAAI,OAAO,gBAAmB,YAC1D,EAAI,MAAM,eAAe,EAG/B,EAEM,EAAY,GAA4B,CAC5C,IAAM,EAAQ,EAAiB,CAAQ,EACvC,EAAc,IAAI,EAAW,CAAK,EAAG,CAAK,EAEtC,EAAQ,MACV,EAAW,GASX,EAAiB,KAAK,CAAU,EAChC,EAAY,EAEhB,EAEM,EAAe,GAA0B,CAC7C,EAAc,OAAO,CAAO,EAC5B,EAAW,CACb,EAEM,GAAe,EAAiB,IAA4B,CAC5D,EAAc,IAAI,CAAO,GAC3B,EAAc,IAAI,EAAS,EAAiB,CAAQ,CAAC,EACrD,EAAW,GAEX,EAAS,CAAQ,CAErB,EAEM,MACG,CAAC,GAAG,EAAc,OAAO,CAAC,EAgEnC,OA7DA,EACE,EACC,GAAgB,CAcf,GAbI,CAAC,GAAe,EAAQ,OAaxB,EAAc,OAAS,EAAG,OAC9B,GAAI,EAAY,cAAc,EAAG,CAC/B,EAAY,EACZ,MACF,CACA,EAAY,KAAK,iBAAoB,EAAY,CAAC,EAClD,IAAM,EAAW,gBAAkB,CACjC,GAAI,EAAQ,MAAO,CACjB,cAAc,CAAQ,EACtB,MACF,CACI,EAAY,cAAc,IAC5B,cAAc,CAAQ,EACtB,EAAY,EAEhB,EAAG,GAAG,EACN,eAAiB,cAAc,CAAQ,EAAG,GAAK,CACjD,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,EAAQ,EAAgB,CAAO,EAC/B,EAAQ,EAAe,CACrB,WACA,cACA,cACA,WACF,CAAC,EAED,MAAkB,CAEhB,GADA,EAAmB,EAAI,KAAK,EACxB,EAAQ,OAAS,EAAI,MACvB,GAAI,CACF,EAAI,MAAM,cAAc,EAAQ,KAAK,EACrC,EAAQ,MAAM,SAAS,CACzB,OAAS,EAAO,CACd,QAAQ,MAAM,uCAAwC,CAAK,CAC7D,CAEF,EAAQ,MAAQ,KAChB,EAAO,MAAQ,CAAC,EAChB,EAAc,MAAQ,GACtB,EAAc,IAChB,CAAC,EAEM,CACL,UACA,SACA,gBACA,cACA,WACA,cACA,cACA,WACF,CACF,CAEA,SAAgB,GAAgB,CAC9B,IAAM,EAAW,EAAO,EAAe,IAAI,EACrC,EAAU,EAAO,EAAgB,IAAI,EAE3C,GAAI,CAAC,EACH,MAAU,MACR,6FACF,EAGF,MAAO,CACL,GAAG,EACH,SACF,CACF"}
@@ -0,0 +1,43 @@
1
+ import { InjectionKey, Ref, ShallowRef } from "vue";
2
+ import { Map } from "maplibre-gl";
3
+ import { MapboxOverlay } from "@deck.gl/mapbox";
4
+
5
+ //#region src/layers/deckgl/_shared/useDeckOverlay.d.ts
6
+ declare const DeckOverlayKey: InjectionKey<ShallowRef<MapboxOverlay | null>>;
7
+ declare const DeckLayersKey: InjectionKey<{
8
+ addLayer: (layer: unknown) => void;
9
+ removeLayer: (layerId: string) => void;
10
+ updateLayer: (layerId: string, layer: unknown) => void;
11
+ getLayers: () => unknown[];
12
+ }>;
13
+ interface UseDeckOverlayOptions {
14
+ interleaved?: boolean;
15
+ /**
16
+ * Enable MapLibre globe projection. Implies `interleaved: true` (required for
17
+ * deck.gl layers to share depth with the globe) and auto-injects
18
+ * `parameters.cullMode = 'none'` on every layer so billboard-style layers
19
+ * (Scatterplot / Trips / Icon / Text) don't clip off the sphere on pitch.
20
+ */
21
+ globe?: boolean;
22
+ }
23
+ interface UseDeckOverlayReturn {
24
+ overlay: ShallowRef<MapboxOverlay | null>;
25
+ layers: Ref<unknown[]>;
26
+ isInitialized: Ref<boolean>;
27
+ initOverlay: () => Promise<void>;
28
+ addLayer: (layer: unknown) => void;
29
+ removeLayer: (layerId: string) => void;
30
+ updateLayer: (layerId: string, layer: unknown) => void;
31
+ getLayers: () => unknown[];
32
+ }
33
+ declare function useDeckOverlay(map: Ref<Map | null>, options?: UseDeckOverlayOptions): UseDeckOverlayReturn;
34
+ declare function useDeckLayers(): {
35
+ overlay: ShallowRef<MapboxOverlay | null> | null;
36
+ addLayer: (layer: unknown) => void;
37
+ removeLayer: (layerId: string) => void;
38
+ updateLayer: (layerId: string, layer: unknown) => void;
39
+ getLayers: () => unknown[];
40
+ };
41
+ //#endregion
42
+ export { useDeckOverlay as i, DeckOverlayKey as n, useDeckLayers as r, DeckLayersKey as t };
43
+ //# sourceMappingURL=useDeckOverlay-JoRzVQ7g.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{r as e,t}from"./symbols-DXKzIgbY.js";import{i as n}from"./useDeckOverlay-CI56uIKH.js";import{computed as r,defineComponent as i,onBeforeUnmount as a,ref as o,renderSlot as s,watch as c}from"vue";import{WindParticleLayer as l,generateWindTexture as u}from"maplibre-gl-wind";const d=i({__name:`VLayerWindParticle`,props:{id:{},imageUrl:{},windData:{},bounds:{default:()=>[-180,-90,180,90]},uMin:{default:-50},uMax:{default:50},vMin:{default:-50},vMax:{default:50},numParticles:{default:8192},maxAge:{default:30},speedFactor:{default:50},color:{default:()=>[255,255,255,200]},colorRamp:{default:()=>[[0,[59,130,189,255]],[.1,[102,194,165,255]],[.2,[171,221,164,255]],[.3,[230,245,152,255]],[.4,[254,224,139,255]],[.5,[253,174,97,255]],[.6,[244,109,67,255]],[1,[213,62,79,255]]]},speedRange:{default:()=>[0,30]},width:{default:1.5},animate:{type:Boolean,default:!0},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},beforeId:{}},emits:[`click`,`hover`,`loaded`,`error`],setup(i,{emit:d}){let f=i,p=d,m=e(t),{addLayer:h,removeLayer:g,updateLayer:_}=n(m),v=o(!1),y=o(null),b=o({uMin:f.uMin,uMax:f.uMax,vMin:f.vMin,vMax:f.vMax}),x=r(()=>{let e=b.value.uMax-b.value.uMin,t=b.value.vMax-b.value.vMin;return[Math.min(e,t)*-1,Math.max(e,t)]}),S=()=>y.value?new l({id:f.id,image:y.value,bounds:f.bounds,imageUnscale:x.value,numParticles:f.numParticles,maxAge:f.maxAge,speedFactor:f.speedFactor,color:f.color,colorRamp:f.colorRamp,speedRange:f.speedRange,width:f.width,animate:f.animate,wrapLongitude:!0,opacity:f.opacity,visible:f.visible,pickable:f.pickable,beforeId:f.beforeId,onClick:e=>p(`click`,e),onHover:e=>p(`hover`,e)}):null,C=e=>{try{let t=u(e,{width:360,height:180,bounds:f.bounds});return b.value={uMin:t.uMin,uMax:t.uMax,vMin:t.vMin,vMax:t.vMax},y.value=t.canvas.toDataURL(`image/png`),!0}catch(e){return p(`error`,e instanceof Error?e:Error(String(e))),!1}},w=()=>{if(f.windData&&f.windData.length>0){if(!C(f.windData))return}else if(f.imageUrl)y.value=f.imageUrl,b.value={uMin:f.uMin,uMax:f.uMax,vMin:f.vMin,vMax:f.vMax};else return;let e=S();e&&(h(e),v.value=!0,p(`loaded`))},T=()=>{if(!v.value)return;let e=S();e&&_(f.id,e)};return c(m,e=>{e&&w()},{immediate:!0}),c(()=>f.windData,e=>{e&&e.length>0&&C(e)&&T()},{deep:!0}),c(()=>f.imageUrl,e=>{e&&!f.windData&&(y.value=e,b.value={uMin:f.uMin,uMax:f.uMax,vMin:f.vMin,vMax:f.vMax},T())}),c(()=>[f.numParticles,f.maxAge,f.speedFactor,f.color,f.colorRamp,f.speedRange,f.width,f.animate,f.opacity,f.visible],()=>{T()},{deep:!0}),a(()=>{g(f.id)}),(e,t)=>s(e.$slots,`default`)}});export{d as VLayerWindParticle};
2
+ //# sourceMappingURL=wind-particle-D3y-A-W4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wind-particle-D3y-A-W4.js","names":[],"sources":["../src/layers/deckgl/wind-particle/VLayerWindParticle.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * GPU-animated wind/current particle field on top of a vector field texture.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `maplibre-gl-wind`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox maplibre-gl-wind`\n */\n import { ref, computed, onBeforeUnmount, watch } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n import { WindParticleLayer, generateWindTexture } from 'maplibre-gl-wind';\n import type { ColorStop, WindDataPoint } from 'maplibre-gl-wind';\n import type { Color } from '../_shared/types';\n\n interface Props {\n id: string;\n imageUrl?: string;\n windData?: WindDataPoint[];\n bounds?: [number, number, number, number];\n uMin?: number;\n uMax?: number;\n vMin?: number;\n vMax?: number;\n numParticles?: number;\n maxAge?: number;\n speedFactor?: number;\n color?: Color;\n colorRamp?: ColorStop[];\n speedRange?: [number, number];\n width?: number;\n animate?: boolean;\n opacity?: number;\n visible?: boolean;\n pickable?: boolean;\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n bounds: () => [-180, -90, 180, 90],\n uMin: -50,\n uMax: 50,\n vMin: -50,\n vMax: 50,\n numParticles: 8192,\n maxAge: 30,\n speedFactor: 50,\n color: () => [255, 255, 255, 200] as Color,\n colorRamp: () =>\n [\n [0.0, [59, 130, 189, 255]],\n [0.1, [102, 194, 165, 255]],\n [0.2, [171, 221, 164, 255]],\n [0.3, [230, 245, 152, 255]],\n [0.4, [254, 224, 139, 255]],\n [0.5, [253, 174, 97, 255]],\n [0.6, [244, 109, 67, 255]],\n [1.0, [213, 62, 79, 255]],\n ] as ColorStop[],\n speedRange: () => [0, 30],\n width: 1.5,\n animate: true,\n opacity: 1,\n visible: true,\n pickable: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n loaded: [];\n error: [error: Error];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const isLayerAdded = ref(false);\n const currentImageUrl = ref<string | null>(null);\n const windMetadata = ref({\n uMin: props.uMin,\n uMax: props.uMax,\n vMin: props.vMin,\n vMax: props.vMax,\n });\n\n const imageUnscale = computed(() => {\n const uRange = windMetadata.value.uMax - windMetadata.value.uMin;\n const vRange = windMetadata.value.vMax - windMetadata.value.vMin;\n return [Math.min(uRange, vRange) * -1, Math.max(uRange, vRange)];\n });\n\n const createLayer = () => {\n if (!currentImageUrl.value) return null;\n\n return new WindParticleLayer({\n id: props.id,\n image: currentImageUrl.value,\n bounds: props.bounds,\n imageUnscale: imageUnscale.value,\n numParticles: props.numParticles,\n maxAge: props.maxAge,\n speedFactor: props.speedFactor,\n color: props.color,\n colorRamp: props.colorRamp,\n speedRange: props.speedRange,\n width: props.width,\n animate: props.animate,\n wrapLongitude: true,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n beforeId: props.beforeId,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n });\n };\n\n const processWindData = (data: WindDataPoint[]) => {\n try {\n const result = generateWindTexture(data, {\n width: 360,\n height: 180,\n bounds: props.bounds,\n });\n\n windMetadata.value = {\n uMin: result.uMin,\n uMax: result.uMax,\n vMin: result.vMin,\n vMax: result.vMax,\n };\n\n currentImageUrl.value = result.canvas.toDataURL('image/png');\n return true;\n } catch (err) {\n emit('error', err instanceof Error ? err : new Error(String(err)));\n return false;\n }\n };\n\n const initializeLayer = () => {\n if (props.windData && props.windData.length > 0) {\n if (!processWindData(props.windData)) return;\n } else if (props.imageUrl) {\n currentImageUrl.value = props.imageUrl;\n windMetadata.value = {\n uMin: props.uMin,\n uMax: props.uMax,\n vMin: props.vMin,\n vMax: props.vMax,\n };\n } else {\n return;\n }\n\n const layer = createLayer();\n if (layer) {\n addLayer(layer);\n isLayerAdded.value = true;\n emit('loaded');\n }\n };\n\n const updateWindLayer = () => {\n if (!isLayerAdded.value) return;\n\n const layer = createLayer();\n if (layer) {\n updateLayer(props.id, layer);\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 () => props.windData,\n (newData) => {\n if (newData && newData.length > 0) {\n if (processWindData(newData)) {\n updateWindLayer();\n }\n }\n },\n { deep: true },\n );\n\n watch(\n () => props.imageUrl,\n (newUrl) => {\n if (newUrl && !props.windData) {\n currentImageUrl.value = newUrl;\n windMetadata.value = {\n uMin: props.uMin,\n uMax: props.uMax,\n vMin: props.vMin,\n vMax: props.vMax,\n };\n updateWindLayer();\n }\n },\n );\n\n watch(\n () => [\n props.numParticles,\n props.maxAge,\n props.speedFactor,\n props.color,\n props.colorRamp,\n props.speedRange,\n props.width,\n props.animate,\n props.opacity,\n props.visible,\n ],\n () => {\n updateWindLayer();\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":"sgCA0CE,IAAM,EAAQ,EA6BR,EAAO,EAOP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAe,EAAI,EAAK,EACxB,EAAkB,EAAmB,IAAI,EACzC,EAAe,EAAI,CACvB,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,IACd,CAAC,EAEK,EAAe,MAAe,CAClC,IAAM,EAAS,EAAa,MAAM,KAAO,EAAa,MAAM,KACtD,EAAS,EAAa,MAAM,KAAO,EAAa,MAAM,KAC5D,MAAO,CAAC,KAAK,IAAI,EAAQ,CAAM,EAAI,GAAI,KAAK,IAAI,EAAQ,CAAM,CAAC,CACjE,CAAC,EAEK,MACC,EAAgB,MAEd,IAAI,EAAkB,CAC3B,GAAI,EAAM,GACV,MAAO,EAAgB,MACvB,OAAQ,EAAM,OACd,aAAc,EAAa,MAC3B,aAAc,EAAM,aACpB,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,MAAO,EAAM,MACb,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,MAAO,EAAM,MACb,QAAS,EAAM,QACf,cAAe,GACf,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,SAAU,EAAM,SAChB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,CACpD,CAAC,EAtBkC,KAyB/B,EAAmB,GAA0B,CACjD,GAAI,CACF,IAAM,EAAS,EAAoB,EAAM,CACvC,MAAO,IACP,OAAQ,IACR,OAAQ,EAAM,MAChB,CAAC,EAUD,MARA,GAAa,MAAQ,CACnB,KAAM,EAAO,KACb,KAAM,EAAO,KACb,KAAM,EAAO,KACb,KAAM,EAAO,IACf,EAEA,EAAgB,MAAQ,EAAO,OAAO,UAAU,WAAW,EACpD,EACT,OAAS,EAAK,CAEZ,OADA,EAAK,QAAS,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAC1D,EACT,CACF,EAEM,MAAwB,CAC5B,GAAI,EAAM,UAAY,EAAM,SAAS,OAAS,MACxC,CAAC,EAAgB,EAAM,QAAQ,EAAG,MAAA,MACjC,GAAI,EAAM,SACf,EAAgB,MAAQ,EAAM,SAC9B,EAAa,MAAQ,CACnB,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,IACd,OAEA,OAGF,IAAM,EAAQ,EAAY,EACtB,IACF,EAAS,CAAK,EACd,EAAa,MAAQ,GACrB,EAAK,QAAQ,EAEjB,EAEM,MAAwB,CAC5B,GAAI,CAAC,EAAa,MAAO,OAEzB,IAAM,EAAQ,EAAY,EACtB,GACF,EAAY,EAAM,GAAI,CAAK,CAE/B,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,EAAM,SACX,GAAY,CACP,GAAW,EAAQ,OAAS,GAC1B,EAAgB,CAAO,GACzB,EAAgB,CAGtB,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MACQ,EAAM,SACX,GAAW,CACN,GAAU,CAAC,EAAM,WACnB,EAAgB,MAAQ,EACxB,EAAa,MAAQ,CACnB,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,KAAM,EAAM,IACd,EACA,EAAgB,EAEpB,CACF,EAEA,MACQ,CACJ,EAAM,aACN,EAAM,OACN,EAAM,YACN,EAAM,MACN,EAAM,UACN,EAAM,WACN,EAAM,MACN,EAAM,QACN,EAAM,QACN,EAAM,OACR,MACM,CACJ,EAAgB,CAClB,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
package/dist/wind.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { i as useDeckOverlay, n as DeckOverlayKey, r as useDeckLayers, t as DeckLayersKey } from "./useDeckOverlay-JoRzVQ7g.js";
2
+ import { Component } from "vue";
3
+ import { ColorStop, GenerateWindTextureOptions, WindDataPoint, WindTextureResult } from "maplibre-gl-wind";
4
+
5
+ //#region src/layers/deckgl/wind.d.ts
6
+ declare const VLayerWindParticle: Component;
7
+ //#endregion
8
+ export { type ColorStop, DeckLayersKey, DeckOverlayKey, type GenerateWindTextureOptions, VLayerWindParticle, type WindDataPoint, type WindTextureResult, useDeckLayers, useDeckOverlay };
9
+ //# sourceMappingURL=wind.d.ts.map
package/dist/wind.js ADDED
@@ -0,0 +1,2 @@
1
+ import{i as e,n as t,r as n,t as r}from"./useDeckOverlay-CI56uIKH.js";import{defineAsyncComponent as i}from"vue";const a=i(()=>import(`./wind-particle-D3y-A-W4.js`).then(e=>e.VLayerWindParticle));export{r as DeckLayersKey,t as DeckOverlayKey,a as VLayerWindParticle,n as useDeckLayers,e as useDeckOverlay};
2
+ //# sourceMappingURL=wind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wind.js","names":[],"sources":["../src/layers/deckgl/wind.ts"],"sourcesContent":["import { defineAsyncComponent, type Component } from 'vue';\n\nexport const VLayerWindParticle: Component = defineAsyncComponent(() =>\n import('./wind-particle').then((m) => m.VLayerWindParticle),\n);\nexport type {\n WindDataPoint,\n WindTextureResult,\n GenerateWindTextureOptions,\n ColorStop,\n} from './wind-particle';\n"],"mappings":"iHAEA,MAAa,EAAgC,MAC3C,OAAO,+BAAmB,KAAM,GAAM,EAAE,kBAAkB,CAC5D"}
@@ -0,0 +1,2 @@
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{_WMSLayer as s}from"@deck.gl/geo-layers";const c=r({__name:`VLayerDeckglWMS`,props:{id:{},data:{},serviceType:{default:`wms`},layers:{},srs:{default:`EPSG:4326`},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},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,serviceType:l.serviceType,layers:l.layers,srs:l.srs,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.layers,l.srs,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglWMS};
2
+ //# sourceMappingURL=wms-BEsf7XG6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wms-BEsf7XG6.js","names":[],"sources":["../src/layers/deckgl/wms/VLayerDeckglWMS.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Consume WMS endpoints as deck.gl tiles.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/geo-layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { _WMSLayer as WMSLayer } from '@deck.gl/geo-layers';\n import type { WMSLayerProps } from '@deck.gl/geo-layers';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n interface Props {\n id: string;\n data: string;\n serviceType?: 'wms' | 'template';\n layers?: string[];\n srs?: string;\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 serviceType: 'wms',\n srs: 'EPSG:4326',\n opacity: 1,\n visible: true,\n pickable: false,\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 WMSLayer({\n id: props.id,\n data: props.data,\n serviceType: props.serviceType,\n layers: props.layers,\n srs: props.srs,\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 WMSLayerProps);\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 () => [props.data, props.layers, props.srs, props.opacity, props.visible],\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":"siBAgCE,IAAM,EAAQ,EASR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAS,CAClB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,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,CAAkB,EAGd,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CAAC,EAAM,KAAM,EAAM,OAAQ,EAAM,IAAK,EAAM,QAAS,EAAM,OAAO,MAClE,EAAY,EAAM,GAAI,EAAY,CAAC,EACzC,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
@@ -0,0 +1,2 @@
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-raster @developmentseed/deck.gl-zarr @developmentseed/proj zarrita`,f=i({__name:`VLayerZarr`,props:{id:{},node:{},variable:{},selection:{},metadata:{},getTileData:{},renderTile:{},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},beforeId:{}},emits:[`click`,`hover`],setup(i,{emit:f}){let p=i,m=e(t),{addLayer:h,removeLayer:g,updateLayer:_}=r(m),v=c(null),y=c(null),b=()=>{if(!v.value)return null;let e={id:l(p.id),node:l(p.node),selection:l(p.selection),getTileData:p.getTileData,renderTile:p.renderTile,opacity:l(p.opacity),visible:l(p.visible),pickable:l(p.pickable)};return y.value&&(e.epsgResolver=y.value),p.variable!==void 0&&(e.variable=l(p.variable)),p.metadata!==void 0&&(e.metadata=l(p.metadata)),p.beforeId!==void 0&&(e.beforeId=l(p.beforeId)),a(new v.value(e))},x=async()=>{try{let[e,t]=await Promise.all([n(`@developmentseed/deck.gl-zarr`,()=>import(`@developmentseed/deck.gl-zarr`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);v.value=a(e.ZarrLayer),y.value=t.epsgResolver;let r=b();r&&h(r)}catch(e){console.error(`[deck.gl-raster] Error loading ZarrLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-zarr, @developmentseed/proj, and zarrita are installed`)}};return u(m,e=>{e&&x()},{immediate:!0}),u(()=>[p.node,p.variable,p.selection,p.metadata,p.opacity,p.visible,p.renderTile,p.getTileData],()=>{let e=b();e&&_(p.id,e)},{deep:!0}),o(()=>{g(p.id)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerZarr};
2
+ //# sourceMappingURL=zarr-BWbq3Uwq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zarr-BWbq3Uwq.js","names":[],"sources":["../src/layers/deckgl/zarr/VLayerZarr.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * GeoZarr tile renderer with optional reprojection (caller supplies the store).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/deck.gl-zarr`\n * @requires `@developmentseed/proj`\n * @requires `zarrita`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @developmentseed/deck.gl-raster @developmentseed/deck.gl-zarr @developmentseed/proj zarrita`\n */\n /**\n * VLayerZarr — GeoZarr tile rendering with reprojection.\n *\n * Wraps @developmentseed/deck.gl-zarr ZarrLayer.\n * The caller MUST open the zarr store with zarrita and pass the opened\n * Array/Group as `node`, plus `selection` for non-spatial dims, plus\n * `getTileData` + `renderTile` callbacks. This wrapper is intentionally\n * thin — ZarrLayer is data-format / shader-pipeline agnostic by design.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/dynamical-zarr-ecmwf/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import type {\n MinimalTileData,\n RenderTileResult,\n } from '@developmentseed/deck.gl-raster';\n import type {\n GetTileDataOptions,\n SliceInput,\n } from '@developmentseed/deck.gl-zarr';\n import type * as zarr from 'zarrita';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n const ZARR_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-raster @developmentseed/deck.gl-zarr @developmentseed/proj zarrita';\n\n interface Props {\n id: string;\n /**\n * Pre-opened zarrita Array OR Group. The caller builds the store\n * (e.g. zarr.FetchStore + withConsolidatedMetadata) and opens it.\n */\n node: zarr.Array<zarr.DataType, zarr.Readable> | zarr.Group<zarr.Readable>;\n /**\n * Optional path to a variable within the store. Only used when `node`\n * is a Group. Ignored for direct Array nodes.\n */\n variable?: string;\n /**\n * Selection for non-spatial dims. One entry per non-spatial dim.\n * Use a number to pin to an index, `zarr.Slice` for a range, or `null`\n * for zarrita's default. For pure spatial arrays, pass `{}`.\n */\n selection: Record<string, SliceInput>;\n /**\n * Optional raw group attrs override. Use when the data source lacks\n * GeoZarr metadata and you want to inject it.\n */\n metadata?: unknown;\n /**\n * Tile fetcher. Receives the zarr Array for the chosen zoom level and\n * a pre-built sliceSpec. Must return a tile-shaped `DataT`.\n */\n getTileData: (\n arr: zarr.Array<zarr.DataType, zarr.Readable>,\n options: GetTileDataOptions,\n ) => Promise<MinimalTileData>;\n /**\n * Convert a loaded tile into a `RenderTileResult` (either `{ image }`\n * or `{ renderPipeline }`).\n */\n renderTile: (data: MinimalTileData) => RenderTileResult;\n /** Layer opacity (0-1). */\n opacity?: number;\n /** Layer visibility. */\n visible?: boolean;\n /** Enable picking. */\n pickable?: boolean;\n /** Insert layer before this layer id. */\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n opacity: 1,\n visible: true,\n pickable: 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 ZarrLayerClass = shallowRef<\n typeof import('@developmentseed/deck.gl-zarr').ZarrLayer | null\n >(null);\n const epsgResolverFn = shallowRef<\n typeof import('@developmentseed/proj').epsgResolver | null\n >(null);\n\n const createLayer = () => {\n if (!ZarrLayerClass.value) return null;\n\n const layerProps: Record<string, unknown> = {\n id: toRaw(props.id),\n node: toRaw(props.node),\n selection: toRaw(props.selection),\n getTileData: props.getTileData,\n renderTile: props.renderTile,\n opacity: toRaw(props.opacity),\n visible: toRaw(props.visible),\n pickable: toRaw(props.pickable),\n };\n\n if (epsgResolverFn.value) {\n layerProps.epsgResolver = epsgResolverFn.value;\n }\n if (props.variable !== undefined) {\n layerProps.variable = toRaw(props.variable);\n }\n if (props.metadata !== undefined) {\n layerProps.metadata = toRaw(props.metadata);\n }\n if (props.beforeId !== undefined) {\n layerProps.beforeId = toRaw(props.beforeId);\n }\n\n const layer = new ZarrLayerClass.value(layerProps);\n return markRaw(layer);\n };\n\n const initializeLayer = async () => {\n try {\n const [zarrModule, projModule] = await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-zarr',\n () => import('@developmentseed/deck.gl-zarr'),\n ZARR_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n ZARR_PEER_INSTALL,\n ),\n ]);\n\n ZarrLayerClass.value = markRaw(zarrModule.ZarrLayer);\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 ZarrLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-zarr, @developmentseed/proj, and zarrita 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.node,\n props.variable,\n props.selection,\n props.metadata,\n props.opacity,\n props.visible,\n // Callbacks must be watched too: ZarrLayer captures `renderTile` and\n // `getTileData` at construction time, so consumers that swap closures\n // (e.g. AEF Mosaic rebuilding the SampleAefRgb shader pipeline with\n // new band indices) need the layer rebuilt to take effect.\n props.renderTile,\n props.getTileData,\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":"kOAuCE,MAAM,EACJ,qZAgDF,IAAM,EAAQ,EAWR,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAiB,EAErB,IAAI,EACA,EAAiB,EAErB,IAAI,EAEA,MAAoB,CACxB,GAAI,CAAC,EAAe,MAAO,OAAO,KAElC,IAAM,EAAsC,CAC1C,GAAI,EAAM,EAAM,EAAE,EAClB,KAAM,EAAM,EAAM,IAAI,EACtB,UAAW,EAAM,EAAM,SAAS,EAChC,YAAa,EAAM,YACnB,WAAY,EAAM,WAClB,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,SAAU,EAAM,EAAM,QAAQ,CAChC,EAgBA,OAdI,EAAe,QACjB,EAAW,aAAe,EAAe,OAEvC,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAExC,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAExC,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAIrC,EAAQ,IADG,EAAe,MAAM,CACxB,CAAK,CACtB,EAEM,EAAkB,SAAY,CAClC,GAAI,CACF,GAAM,CAAC,EAAY,GAAc,MAAM,QAAQ,IAAI,CACjD,EACE,oCACM,OAAO,iCACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAED,EAAe,MAAQ,EAAQ,EAAW,SAAS,EACnD,EAAe,MAAQ,EAAW,aAElC,IAAM,EAAQ,EAAY,EACtB,GACF,EAAS,CAAK,CAElB,OAAS,EAAO,CACd,QAAQ,MAAM,4CAA6C,CAAK,EAChE,QAAQ,MACN,2FACF,CACF,CACF,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,KACN,EAAM,SACN,EAAM,UACN,EAAM,SACN,EAAM,QACN,EAAM,QAKN,EAAM,WACN,EAAM,WACR,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoql/v-maplibre",
3
- "version": "1.11.0",
3
+ "version": "2.0.1",
4
4
  "private": false,
5
5
  "description": "Vue 3 components for MapLibre GL - reactive map components with full TypeScript support",
6
6
  "keywords": [
@@ -49,6 +49,26 @@
49
49
  "types": "./dist/index.d.ts",
50
50
  "import": "./dist/index.js"
51
51
  },
52
+ "./deck.gl": {
53
+ "types": "./dist/deckgl.d.ts",
54
+ "import": "./dist/deckgl.js"
55
+ },
56
+ "./geotiff": {
57
+ "types": "./dist/geotiff.d.ts",
58
+ "import": "./dist/geotiff.js"
59
+ },
60
+ "./wind": {
61
+ "types": "./dist/wind.d.ts",
62
+ "import": "./dist/wind.js"
63
+ },
64
+ "./starfield": {
65
+ "types": "./dist/starfield.d.ts",
66
+ "import": "./dist/starfield.js"
67
+ },
68
+ "./lidar": {
69
+ "types": "./dist/lidar.d.ts",
70
+ "import": "./dist/lidar.js"
71
+ },
52
72
  "./style.css": "./dist/v-maplibre.css",
53
73
  "./v-maplibre.css": "./dist/v-maplibre.css",
54
74
  "./dist/style.css": "./dist/v-maplibre.css",
@@ -74,12 +94,12 @@
74
94
  "pmtiles": "^4.4.1"
75
95
  },
76
96
  "devDependencies": {
77
- "@deck.gl/aggregation-layers": "^9.3.2",
78
- "@deck.gl/core": "^9.3.2",
79
- "@deck.gl/geo-layers": "^9.3.2",
80
- "@deck.gl/layers": "^9.3.2",
81
- "@deck.gl/mapbox": "^9.3.2",
82
- "@deck.gl/mesh-layers": "^9.3.2",
97
+ "@deck.gl/aggregation-layers": "^9.3.4",
98
+ "@deck.gl/core": "^9.3.4",
99
+ "@deck.gl/geo-layers": "^9.3.4",
100
+ "@deck.gl/layers": "^9.3.4",
101
+ "@deck.gl/mapbox": "^9.3.4",
102
+ "@deck.gl/mesh-layers": "^9.3.4",
83
103
  "@developmentseed/deck.gl-geotiff": "^0.7.0",
84
104
  "@developmentseed/deck.gl-raster": "^0.7.0",
85
105
  "@developmentseed/deck.gl-zarr": "^0.7.0",
@@ -89,21 +109,21 @@
89
109
  "@luma.gl/core": "^9.3.3",
90
110
  "@luma.gl/engine": "^9.3.3",
91
111
  "@luma.gl/shadertools": "^9.3.3",
92
- "@tsdown/css": "^0.22.0",
93
- "@types/node": "^25.9.1",
112
+ "@tsdown/css": "^0.22.2",
113
+ "@types/node": "^25.9.3",
94
114
  "@vitejs/plugin-vue": "^6.0.7",
95
- "@vitest/coverage-v8": "^5.0.0-beta.3",
96
- "@vue/test-utils": "^2.4.10",
115
+ "@vitest/coverage-v8": "^5.0.0-beta.4",
116
+ "@vue/test-utils": "^2.4.11",
97
117
  "apache-arrow": "^21.1.0",
98
- "happy-dom": "^20.9.0",
99
- "maplibre-gl-lidar": "^0.13.0",
118
+ "happy-dom": "^20.10.3",
119
+ "maplibre-gl-lidar": "^0.15.0",
100
120
  "maplibre-gl-wind": "^0.2.0",
101
121
  "three": "^0.184.0",
102
122
  "typescript": "^6.0.3",
103
123
  "unplugin-vue": "^7.2.0",
104
- "vite-plus": "^0.1.22",
105
- "vue": "^3.5.34",
106
- "vue-tsc": "^3.3.1",
124
+ "vite-plus": "^0.1.24",
125
+ "vue": "^3.5.38",
126
+ "vue-tsc": "^3.3.5",
107
127
  "zarrita": "^0.7.3"
108
128
  },
109
129
  "peerDependencies": {
@@ -179,5 +199,5 @@
179
199
  "optional": true
180
200
  }
181
201
  },
182
- "packageManager": "pnpm@11.2.1"
202
+ "packageManager": "pnpm@11.6.0"
183
203
  }
@@ -1,2 +0,0 @@
1
- import{c as e,o as t,t as n}from"./symbols-CFCXX1_B.js";import{defineComponent as r,onBeforeUnmount as i,onMounted as a,renderSlot as o,watch as s}from"vue";import{ArcLayer as c}from"@deck.gl/layers";const l=r({__name:`VLayerDeckglArc`,props:{id:{},data:{},getSourcePosition:{},getTargetPosition:{},getSourceColor:{},getTargetColor:{},getWidth:{},getHeight:{},getTilt:{},greatCircle:{type:Boolean,default:!1},numSegments:{default:50},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:l}){let u=r,d=l,f=e(n),{addLayer:p,removeLayer:m,updateLayer:h}=t(f),g=()=>new c({id:u.id,data:u.data,getSourcePosition:u.getSourcePosition,getTargetPosition:u.getTargetPosition,getSourceColor:u.getSourceColor??[255,140,0],getTargetColor:u.getTargetColor??[0,200,255],getWidth:u.getWidth??1,getHeight:u.getHeight??1,getTilt:u.getTilt??0,greatCircle:u.greatCircle,numSegments:u.numSegments,widthUnits:u.widthUnits,widthScale:u.widthScale,widthMinPixels:u.widthMinPixels,widthMaxPixels:u.widthMaxPixels,opacity:u.opacity,visible:u.visible,pickable:u.pickable,autoHighlight:u.autoHighlight,highlightColor:u.highlightColor,beforeId:u.beforeId,onClick:e=>d(`click`,e),onHover:e=>d(`hover`,e)}),_=()=>{p(g())};return a(()=>{f.value?.isStyleLoaded()?_():f.value?.once(`style.load`,_)}),s(()=>[u.data,u.getSourcePosition,u.getTargetPosition,u.getSourceColor,u.getTargetColor,u.opacity,u.visible],()=>h(u.id,g()),{deep:!0}),i(()=>{m(u.id)}),(e,t)=>o(e.$slots,`default`)}});export{l as VLayerDeckglArc};
2
- //# sourceMappingURL=arc-oPHfD4K7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arc-oPHfD4K7.js","names":[],"sources":["../src/layers/deckgl/arc/VLayerDeckglArc.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render curved 3D arcs 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 { onMounted, onBeforeUnmount, watch } from 'vue';\n import { ArcLayer } from '@deck.gl/layers';\n import type { ArcLayerProps } from '@deck.gl/layers';\n import type { Color, PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\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 getSourceColor?: Accessor<D, Color>;\n getTargetColor?: Accessor<D, Color>;\n getWidth?: Accessor<D, number>;\n getHeight?: Accessor<D, number>;\n getTilt?: Accessor<D, number>;\n greatCircle?: boolean;\n numSegments?: 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 greatCircle: false,\n numSegments: 50,\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 ArcLayer({\n id: props.id,\n data: props.data,\n getSourcePosition: props.getSourcePosition,\n getTargetPosition: props.getTargetPosition,\n getSourceColor: props.getSourceColor ?? [255, 140, 0],\n getTargetColor: props.getTargetColor ?? [0, 200, 255],\n getWidth: props.getWidth ?? 1,\n getHeight: props.getHeight ?? 1,\n getTilt: props.getTilt ?? 0,\n greatCircle: props.greatCircle,\n numSegments: props.numSegments,\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 ArcLayerProps);\n };\n\n const initializeLayer = () => {\n addLayer(createLayer());\n };\n\n onMounted(() => {\n if (map.value?.isStyleLoaded()) {\n initializeLayer();\n } else {\n map.value?.once('style.load', initializeLayer);\n }\n });\n\n watch(\n () => [\n props.data,\n props.getSourcePosition,\n props.getTargetPosition,\n props.getSourceColor,\n props.getTargetColor,\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":"6uBA4CE,IAAM,EAAQ,EAaR,EAAO,EAKP,EAAM,EAAa,EAAM,CACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,EAAG,CAE3D,MACG,IAAI,EAAS,CAClB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,kBAAmB,EAAM,kBACzB,kBAAmB,EAAM,kBACzB,eAAgB,EAAM,gBAAkB,CAAC,IAAK,IAAK,EAAC,CACpD,eAAgB,EAAM,gBAAkB,CAAC,EAAG,IAAK,IAAG,CACpD,SAAU,EAAM,UAAY,EAC5B,UAAW,EAAM,WAAa,EAC9B,QAAS,EAAM,SAAW,EAC1B,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,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,EAAI,CAClD,QAAU,GAAsB,EAAK,QAAS,EAAI,CAClC,CAAA,CAGd,MAAwB,CAC5B,EAAS,GAAa,CAAA,SAGxB,MAAgB,CACV,EAAI,OAAO,eAAc,CAC3B,GAAgB,CAEhB,EAAI,OAAO,KAAK,aAAc,EAAe,EAEhD,CAED,MACQ,CACJ,EAAM,KACN,EAAM,kBACN,EAAM,kBACN,EAAM,eACN,EAAM,eACN,EAAM,QACN,EAAM,QACR,KACM,EAAY,EAAM,GAAI,GAAa,CAAA,CACzC,CAAE,KAAM,GACV,CAAA,CAEA,MAAsB,CACpB,EAAY,EAAM,GAAE,EACrB,QAID,EAAa,EAAA,OAAA,UAAA"}