@accelint/map-toolkit 1.5.0 → 3.0.0

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 (224) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +8 -1
  3. package/catalog-info.yaml +9 -6
  4. package/dist/camera/events.js +1 -1
  5. package/dist/camera/index.d.ts +1 -1
  6. package/dist/camera/index.js +1 -1
  7. package/dist/camera/store.d.ts +1 -1
  8. package/dist/camera/store.js +3 -5
  9. package/dist/camera/store.js.map +1 -1
  10. package/dist/camera/types.d.ts +1 -1
  11. package/dist/camera/types.js +1 -1
  12. package/dist/cursor-coordinates/constants.js +1 -1
  13. package/dist/cursor-coordinates/index.d.ts +1 -1
  14. package/dist/cursor-coordinates/index.js +1 -1
  15. package/dist/cursor-coordinates/store.d.ts +1 -1
  16. package/dist/cursor-coordinates/store.js +1 -1
  17. package/dist/cursor-coordinates/types.d.ts +1 -1
  18. package/dist/cursor-coordinates/types.js +1 -1
  19. package/dist/cursor-coordinates/use-cursor-coordinates.d.ts +1 -1
  20. package/dist/cursor-coordinates/use-cursor-coordinates.js +4 -9
  21. package/dist/cursor-coordinates/use-cursor-coordinates.js.map +1 -1
  22. package/dist/deckgl/base-map/constants.js +1 -1
  23. package/dist/deckgl/base-map/controls.d.ts +1 -1
  24. package/dist/deckgl/base-map/controls.js +1 -1
  25. package/dist/deckgl/base-map/events.js +1 -1
  26. package/dist/deckgl/base-map/index.d.ts +3 -3
  27. package/dist/deckgl/base-map/index.js +1 -1
  28. package/dist/deckgl/base-map/provider.d.ts +1 -1
  29. package/dist/deckgl/base-map/provider.js +1 -1
  30. package/dist/deckgl/base-map/types.d.ts +1 -1
  31. package/dist/deckgl/base-map/types.js +1 -1
  32. package/dist/deckgl/extensions/coffin-corner/coffin-corner-extension.d.ts +144 -0
  33. package/dist/deckgl/extensions/coffin-corner/coffin-corner-extension.js +535 -0
  34. package/dist/deckgl/extensions/coffin-corner/coffin-corner-extension.js.map +1 -0
  35. package/dist/deckgl/extensions/coffin-corner/index.d.ts +17 -0
  36. package/dist/deckgl/extensions/coffin-corner/index.js +19 -0
  37. package/dist/deckgl/extensions/coffin-corner/store.d.ts +96 -0
  38. package/dist/deckgl/extensions/coffin-corner/store.js +173 -0
  39. package/dist/deckgl/extensions/coffin-corner/store.js.map +1 -0
  40. package/dist/deckgl/extensions/coffin-corner/types.d.ts +76 -0
  41. package/dist/deckgl/extensions/coffin-corner/types.js +27 -0
  42. package/dist/deckgl/extensions/coffin-corner/types.js.map +1 -0
  43. package/dist/deckgl/extensions/coffin-corner/use-coffin-corner.d.ts +81 -0
  44. package/dist/deckgl/extensions/coffin-corner/use-coffin-corner.js +75 -0
  45. package/dist/deckgl/extensions/coffin-corner/use-coffin-corner.js.map +1 -0
  46. package/dist/deckgl/extensions/index.d.ts +15 -0
  47. package/dist/deckgl/extensions/index.js +16 -0
  48. package/dist/deckgl/index.d.ts +9 -4
  49. package/dist/deckgl/index.js +6 -2
  50. package/dist/deckgl/saved-viewports/index.d.ts +1 -1
  51. package/dist/deckgl/saved-viewports/index.js +1 -1
  52. package/dist/deckgl/saved-viewports/storage.d.ts +1 -1
  53. package/dist/deckgl/saved-viewports/storage.js +5 -10
  54. package/dist/deckgl/saved-viewports/storage.js.map +1 -1
  55. package/dist/deckgl/shapes/display-shape-layer/constants.js +70 -26
  56. package/dist/deckgl/shapes/display-shape-layer/constants.js.map +1 -1
  57. package/dist/deckgl/shapes/display-shape-layer/fiber.d.ts +1 -1
  58. package/dist/deckgl/shapes/display-shape-layer/fiber.js +1 -1
  59. package/dist/deckgl/shapes/display-shape-layer/index.d.ts +93 -38
  60. package/dist/deckgl/shapes/display-shape-layer/index.js +433 -187
  61. package/dist/deckgl/shapes/display-shape-layer/index.js.map +1 -1
  62. package/dist/deckgl/shapes/display-shape-layer/shape-label-layer.js +1 -1
  63. package/dist/deckgl/shapes/display-shape-layer/store.js +1 -1
  64. package/dist/deckgl/shapes/display-shape-layer/types.d.ts +116 -19
  65. package/dist/deckgl/shapes/display-shape-layer/types.js +1 -1
  66. package/dist/deckgl/shapes/display-shape-layer/use-select-shape.d.ts +1 -1
  67. package/dist/deckgl/shapes/display-shape-layer/use-select-shape.js +1 -1
  68. package/dist/deckgl/shapes/display-shape-layer/utils/display-style.js +66 -36
  69. package/dist/deckgl/shapes/display-shape-layer/utils/display-style.js.map +1 -1
  70. package/dist/deckgl/shapes/display-shape-layer/utils/elevation.js +407 -0
  71. package/dist/deckgl/shapes/display-shape-layer/utils/elevation.js.map +1 -0
  72. package/dist/deckgl/shapes/display-shape-layer/utils/icon-config.js +106 -0
  73. package/dist/deckgl/shapes/display-shape-layer/utils/icon-config.js.map +1 -0
  74. package/dist/deckgl/shapes/display-shape-layer/utils/labels.d.ts +1 -1
  75. package/dist/deckgl/shapes/display-shape-layer/utils/labels.js +28 -39
  76. package/dist/deckgl/shapes/display-shape-layer/utils/labels.js.map +1 -1
  77. package/dist/deckgl/shapes/display-shape-layer/utils/radius-label.js +53 -0
  78. package/dist/deckgl/shapes/display-shape-layer/utils/radius-label.js.map +1 -0
  79. package/dist/deckgl/shapes/draw-shape-layer/constants.js +1 -1
  80. package/dist/deckgl/shapes/draw-shape-layer/events.d.ts +1 -1
  81. package/dist/deckgl/shapes/draw-shape-layer/events.js +1 -1
  82. package/dist/deckgl/shapes/draw-shape-layer/fiber.js +1 -1
  83. package/dist/deckgl/shapes/draw-shape-layer/index.d.ts +8 -4
  84. package/dist/deckgl/shapes/draw-shape-layer/index.js +11 -17
  85. package/dist/deckgl/shapes/draw-shape-layer/index.js.map +1 -1
  86. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-circle-mode-with-tooltip.js +6 -5
  87. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-circle-mode-with-tooltip.js.map +1 -1
  88. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-ellipse-mode-with-tooltip.js +4 -3
  89. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-ellipse-mode-with-tooltip.js.map +1 -1
  90. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-line-string-mode-with-tooltip.js +6 -20
  91. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-line-string-mode-with-tooltip.js.map +1 -1
  92. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-polygon-mode-with-tooltip.js +6 -33
  93. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-polygon-mode-with-tooltip.js.map +1 -1
  94. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-rectangle-mode-with-tooltip.js +16 -12
  95. package/dist/deckgl/shapes/draw-shape-layer/modes/draw-rectangle-mode-with-tooltip.js.map +1 -1
  96. package/dist/deckgl/shapes/draw-shape-layer/modes/index.js +2 -32
  97. package/dist/deckgl/shapes/draw-shape-layer/modes/index.js.map +1 -1
  98. package/dist/deckgl/shapes/draw-shape-layer/store.js +1 -1
  99. package/dist/deckgl/shapes/draw-shape-layer/types.d.ts +3 -3
  100. package/dist/deckgl/shapes/draw-shape-layer/types.js +1 -1
  101. package/dist/deckgl/shapes/draw-shape-layer/use-draw-shape.d.ts +1 -1
  102. package/dist/deckgl/shapes/draw-shape-layer/use-draw-shape.js +1 -1
  103. package/dist/deckgl/shapes/draw-shape-layer/utils/feature-conversion.js +3 -8
  104. package/dist/deckgl/shapes/draw-shape-layer/utils/feature-conversion.js.map +1 -1
  105. package/dist/deckgl/shapes/edit-shape-layer/constants.js +17 -2
  106. package/dist/deckgl/shapes/edit-shape-layer/constants.js.map +1 -1
  107. package/dist/deckgl/shapes/edit-shape-layer/events.d.ts +1 -1
  108. package/dist/deckgl/shapes/edit-shape-layer/events.js +1 -1
  109. package/dist/deckgl/shapes/edit-shape-layer/fiber.d.ts +1 -1
  110. package/dist/deckgl/shapes/edit-shape-layer/fiber.js +1 -1
  111. package/dist/deckgl/shapes/edit-shape-layer/index.d.ts +12 -6
  112. package/dist/deckgl/shapes/edit-shape-layer/index.js +72 -27
  113. package/dist/deckgl/shapes/edit-shape-layer/index.js.map +1 -1
  114. package/dist/deckgl/shapes/edit-shape-layer/modes/base-transform-mode.js +4 -1
  115. package/dist/deckgl/shapes/edit-shape-layer/modes/base-transform-mode.js.map +1 -1
  116. package/dist/deckgl/shapes/edit-shape-layer/modes/bounding-transform-mode.js +4 -3
  117. package/dist/deckgl/shapes/edit-shape-layer/modes/bounding-transform-mode.js.map +1 -1
  118. package/dist/deckgl/shapes/edit-shape-layer/modes/circle-transform-mode.js +5 -3
  119. package/dist/deckgl/shapes/edit-shape-layer/modes/circle-transform-mode.js.map +1 -1
  120. package/dist/deckgl/shapes/edit-shape-layer/modes/index.js +1 -1
  121. package/dist/deckgl/shapes/edit-shape-layer/modes/point-translate-mode.js +1 -1
  122. package/dist/deckgl/shapes/edit-shape-layer/modes/point-translate-mode.js.map +1 -1
  123. package/dist/deckgl/shapes/edit-shape-layer/modes/rotate-mode-with-snap.js +1 -1
  124. package/dist/deckgl/shapes/edit-shape-layer/modes/rotate-mode-with-snap.js.map +1 -1
  125. package/dist/deckgl/shapes/edit-shape-layer/modes/scale-mode-with-free-transform.js +1 -1
  126. package/dist/deckgl/shapes/edit-shape-layer/modes/scale-mode-with-free-transform.js.map +1 -1
  127. package/dist/deckgl/shapes/edit-shape-layer/modes/vertex-transform-mode.js +1 -1
  128. package/dist/deckgl/shapes/edit-shape-layer/modes/vertex-transform-mode.js.map +1 -1
  129. package/dist/deckgl/shapes/edit-shape-layer/store.js +83 -14
  130. package/dist/deckgl/shapes/edit-shape-layer/store.js.map +1 -1
  131. package/dist/deckgl/shapes/edit-shape-layer/types.d.ts +18 -4
  132. package/dist/deckgl/shapes/edit-shape-layer/types.js +1 -1
  133. package/dist/deckgl/shapes/edit-shape-layer/use-edit-shape.d.ts +2 -2
  134. package/dist/deckgl/shapes/edit-shape-layer/use-edit-shape.js +8 -4
  135. package/dist/deckgl/shapes/edit-shape-layer/use-edit-shape.js.map +1 -1
  136. package/dist/deckgl/shapes/index.d.ts +5 -4
  137. package/dist/deckgl/shapes/index.js +3 -2
  138. package/dist/deckgl/shapes/shared/constants.d.ts +4 -3
  139. package/dist/deckgl/shapes/shared/constants.js +51 -11
  140. package/dist/deckgl/shapes/shared/constants.js.map +1 -1
  141. package/dist/deckgl/shapes/shared/events.d.ts +5 -1
  142. package/dist/deckgl/shapes/shared/events.js +1 -1
  143. package/dist/deckgl/shapes/shared/events.js.map +1 -1
  144. package/dist/deckgl/shapes/shared/hooks/use-shift-zoom-disable.js +19 -16
  145. package/dist/deckgl/shapes/shared/hooks/use-shift-zoom-disable.js.map +1 -1
  146. package/dist/deckgl/shapes/shared/types.d.ts +182 -54
  147. package/dist/deckgl/shapes/shared/types.js +155 -2
  148. package/dist/deckgl/shapes/shared/types.js.map +1 -1
  149. package/dist/deckgl/shapes/shared/utils/duplicate-shape.d.ts +56 -0
  150. package/dist/deckgl/shapes/shared/utils/duplicate-shape.js +131 -0
  151. package/dist/deckgl/shapes/shared/utils/duplicate-shape.js.map +1 -0
  152. package/dist/deckgl/shapes/shared/utils/geometry-measurements.js +29 -24
  153. package/dist/deckgl/shapes/shared/utils/geometry-measurements.js.map +1 -1
  154. package/dist/deckgl/shapes/shared/utils/layer-config.js +15 -9
  155. package/dist/deckgl/shapes/shared/utils/layer-config.js.map +1 -1
  156. package/dist/deckgl/shapes/shared/utils/mode-utils.js +50 -20
  157. package/dist/deckgl/shapes/shared/utils/mode-utils.js.map +1 -1
  158. package/dist/deckgl/shapes/shared/utils/pick-filtering.js +22 -15
  159. package/dist/deckgl/shapes/shared/utils/pick-filtering.js.map +1 -1
  160. package/dist/deckgl/shapes/shared/utils/style-utils.d.ts +38 -14
  161. package/dist/deckgl/shapes/shared/utils/style-utils.js +43 -32
  162. package/dist/deckgl/shapes/shared/utils/style-utils.js.map +1 -1
  163. package/dist/deckgl/symbol-layer/fiber.d.ts +4 -2
  164. package/dist/deckgl/symbol-layer/fiber.js +1 -1
  165. package/dist/deckgl/symbol-layer/fiber.js.map +1 -1
  166. package/dist/deckgl/symbol-layer/index.d.ts +1 -1
  167. package/dist/deckgl/symbol-layer/index.js +1 -1
  168. package/dist/deckgl/text-layer/character-sets.js +1 -1
  169. package/dist/deckgl/text-layer/default-settings.d.ts +1 -1
  170. package/dist/deckgl/text-layer/default-settings.js +1 -1
  171. package/dist/deckgl/text-layer/fiber.d.ts +1 -1
  172. package/dist/deckgl/text-layer/fiber.js +1 -1
  173. package/dist/deckgl/text-layer/index.d.ts +1 -1
  174. package/dist/deckgl/text-layer/index.js +1 -1
  175. package/dist/deckgl/text-settings.d.ts +3 -3
  176. package/dist/deckgl/text-settings.js +1 -1
  177. package/dist/map-cursor/events.js +1 -1
  178. package/dist/map-cursor/index.d.ts +1 -1
  179. package/dist/map-cursor/index.js +1 -1
  180. package/dist/map-cursor/store.d.ts +1 -1
  181. package/dist/map-cursor/store.js +1 -1
  182. package/dist/map-cursor/types.d.ts +1 -1
  183. package/dist/map-cursor/types.js +1 -1
  184. package/dist/map-cursor/use-map-cursor.d.ts +1 -1
  185. package/dist/map-cursor/use-map-cursor.js +1 -1
  186. package/dist/map-mode/events.js +1 -1
  187. package/dist/map-mode/index.d.ts +1 -1
  188. package/dist/map-mode/index.js +1 -1
  189. package/dist/map-mode/store.d.ts +1 -1
  190. package/dist/map-mode/store.js +3 -8
  191. package/dist/map-mode/store.js.map +1 -1
  192. package/dist/map-mode/types.d.ts +1 -1
  193. package/dist/map-mode/types.js +1 -1
  194. package/dist/map-mode/use-map-mode.d.ts +1 -1
  195. package/dist/map-mode/use-map-mode.js +1 -1
  196. package/dist/maplibre/hooks/use-maplibre.d.ts +1 -1
  197. package/dist/maplibre/hooks/use-maplibre.js +1 -1
  198. package/dist/maplibre/index.d.ts +1 -1
  199. package/dist/maplibre/index.js +1 -1
  200. package/dist/shared/cleanup.d.ts +1 -1
  201. package/dist/shared/cleanup.js +1 -1
  202. package/dist/shared/constants.js +1 -1
  203. package/dist/shared/create-map-store.d.ts +1 -1
  204. package/dist/shared/create-map-store.js +1 -1
  205. package/dist/shared/logger.js +31 -0
  206. package/dist/shared/logger.js.map +1 -0
  207. package/dist/shared/units.d.ts +15 -56
  208. package/dist/shared/units.js +2 -53
  209. package/dist/shared/units.js.map +1 -1
  210. package/dist/viewport/index.d.ts +3 -4
  211. package/dist/viewport/index.js +2 -3
  212. package/dist/viewport/store.d.ts +1 -1
  213. package/dist/viewport/store.js +1 -1
  214. package/dist/viewport/types.d.ts +9 -5
  215. package/dist/viewport/types.js +1 -1
  216. package/dist/viewport/utils.d.ts +4 -4
  217. package/dist/viewport/utils.js +17 -9
  218. package/dist/viewport/utils.js.map +1 -1
  219. package/dist/viewport/viewport-size.d.ts +7 -6
  220. package/dist/viewport/viewport-size.js +3 -3
  221. package/dist/viewport/viewport-size.js.map +1 -1
  222. package/package.json +29 -20
  223. package/dist/hotkey-manager/dist/react/use-hotkey.js +0 -39
  224. package/dist/hotkey-manager/dist/react/use-hotkey.js.map +0 -1
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at https://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+
14
+ 'use client';
15
+
16
+ import { coffinCornerStore } from "./store.js";
17
+ import { useEffect } from "react";
18
+
19
+ //#region src/deckgl/extensions/coffin-corner/use-coffin-corner.ts
20
+ /**
21
+ * Hook to manage coffin corner entity selection state.
22
+ *
23
+ * Automatically subscribes to map bus events for the given map and layer,
24
+ * so you don't need onClick/onHover callbacks on the layer.
25
+ *
26
+ * @param mapId - The BaseMap instance ID
27
+ * @param layerId - The deck.gl layer ID to listen for interactions on
28
+ * @param options - Optional configuration for entity ID extraction
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * import { useCoffinCorner } from '@accelint/map-toolkit/deckgl/extensions/coffin-corner';
33
+ *
34
+ * function MapWithIcons({ mapId }) {
35
+ * const { selectedId, hoveredId } = useCoffinCorner(mapId, 'base-icons');
36
+ *
37
+ * return (
38
+ * <iconLayer
39
+ * id="base-icons"
40
+ * pickable
41
+ * extensions={[coffinCornerExtension]}
42
+ * selectedEntityId={selectedId}
43
+ * hoveredEntityId={hoveredId}
44
+ * />
45
+ * );
46
+ * }
47
+ * ```
48
+ *
49
+ * @example Custom entity ID accessor
50
+ * ```tsx
51
+ * const { selectedId, hoveredId } = useCoffinCorner(mapId, 'geojson-icons', {
52
+ * getEntityId: (d) => d.properties?.shapeId,
53
+ * });
54
+ * ```
55
+ */
56
+ function useCoffinCorner(mapId, layerId, options) {
57
+ const { state, setSelectedId, deselect, setLayerId, setGetEntityId } = coffinCornerStore.use(mapId);
58
+ useEffect(() => {
59
+ setLayerId(layerId);
60
+ }, [setLayerId, layerId]);
61
+ const getEntityId = options?.getEntityId;
62
+ useEffect(() => {
63
+ if (getEntityId) setGetEntityId(getEntityId);
64
+ }, [setGetEntityId, getEntityId]);
65
+ return {
66
+ selectedId: state.selectedId,
67
+ hoveredId: state.hoveredId,
68
+ setSelectedId,
69
+ deselect
70
+ };
71
+ }
72
+
73
+ //#endregion
74
+ export { useCoffinCorner };
75
+ //# sourceMappingURL=use-coffin-corner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-coffin-corner.js","names":[],"sources":["../../../../src/deckgl/extensions/coffin-corner/use-coffin-corner.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n'use client';\n\nimport { useEffect } from 'react';\nimport { coffinCornerStore } from './store';\nimport type { UniqueId } from '@accelint/core';\nimport type { EntityId } from './types';\n\n/**\n * Return type for useCoffinCorner hook\n */\nexport type UseCoffinCornerReturn = {\n /** Currently selected entity ID, or undefined if nothing selected */\n selectedId: EntityId | undefined;\n /** Currently hovered entity ID, or undefined if nothing hovered */\n hoveredId: EntityId | undefined;\n /** Set the selected entity ID */\n setSelectedId: (id: EntityId | undefined) => void;\n /** Clear the current selection */\n deselect: () => void;\n};\n\n/**\n * Options for the useCoffinCorner hook.\n */\nexport type UseCoffinCornerOptions = {\n /**\n * Accessor to extract an entity ID from a picked data item.\n * Must match the `getEntityId` prop passed to the CoffinCornerExtension.\n * Should be a stable reference (module-level or `useCallback`) to avoid unnecessary store updates on every render.\n * @default (item) => item.id\n */\n // biome-ignore lint/suspicious/noExplicitAny: Data type is unknown at hook level.\n getEntityId?: (item: any) => EntityId;\n};\n\n/**\n * Hook to manage coffin corner entity selection state.\n *\n * Automatically subscribes to map bus events for the given map and layer,\n * so you don't need onClick/onHover callbacks on the layer.\n *\n * @param mapId - The BaseMap instance ID\n * @param layerId - The deck.gl layer ID to listen for interactions on\n * @param options - Optional configuration for entity ID extraction\n *\n * @example\n * ```tsx\n * import { useCoffinCorner } from '@accelint/map-toolkit/deckgl/extensions/coffin-corner';\n *\n * function MapWithIcons({ mapId }) {\n * const { selectedId, hoveredId } = useCoffinCorner(mapId, 'base-icons');\n *\n * return (\n * <iconLayer\n * id=\"base-icons\"\n * pickable\n * extensions={[coffinCornerExtension]}\n * selectedEntityId={selectedId}\n * hoveredEntityId={hoveredId}\n * />\n * );\n * }\n * ```\n *\n * @example Custom entity ID accessor\n * ```tsx\n * const { selectedId, hoveredId } = useCoffinCorner(mapId, 'geojson-icons', {\n * getEntityId: (d) => d.properties?.shapeId,\n * });\n * ```\n */\nexport function useCoffinCorner(\n mapId: UniqueId,\n layerId: string,\n options?: UseCoffinCornerOptions,\n): UseCoffinCornerReturn {\n const { state, setSelectedId, deselect, setLayerId, setGetEntityId } =\n coffinCornerStore.use(mapId);\n\n // Unlike a CompositeLayer, CoffinCornerExtension is a shader-only plugin\n // with no picking handlers. The store must filter raw map bus events by\n // layerId to know which clicks/hovers belong to this extension's layer.\n useEffect(() => {\n setLayerId(layerId);\n }, [setLayerId, layerId]);\n\n const getEntityId = options?.getEntityId;\n\n useEffect(() => {\n if (getEntityId) {\n setGetEntityId(getEntityId);\n }\n }, [setGetEntityId, getEntityId]);\n\n return {\n selectedId: state.selectedId,\n hoveredId: state.hoveredId,\n setSelectedId,\n deselect,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,SAAgB,gBACd,OACA,SACA,SACuB;CACvB,MAAM,EAAE,OAAO,eAAe,UAAU,YAAY,mBAClD,kBAAkB,IAAI,MAAM;AAK9B,iBAAgB;AACd,aAAW,QAAQ;IAClB,CAAC,YAAY,QAAQ,CAAC;CAEzB,MAAM,cAAc,SAAS;AAE7B,iBAAgB;AACd,MAAI,YACF,gBAAe,YAAY;IAE5B,CAAC,gBAAgB,YAAY,CAAC;AAEjC,QAAO;EACL,YAAY,MAAM;EAClB,WAAW,MAAM;EACjB;EACA;EACD"}
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at https://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { CoffinCornerExtensionProps } from "./coffin-corner/types.js";
14
+ import { CoffinCornerExtension } from "./coffin-corner/coffin-corner-extension.js";
15
+ export { CoffinCornerExtension, type CoffinCornerExtensionProps };
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at https://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+
14
+ import { CoffinCornerExtension } from "./coffin-corner/coffin-corner-extension.js";
15
+
16
+ export { CoffinCornerExtension };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -14,12 +14,17 @@ import { MapEvents, MapEventsNamespace } from "./base-map/events.js";
14
14
  import { BaseMapProps, MapClickEvent, MapClickPayload, MapControlPayload, MapDisablePanEvent, MapDisableZoomEvent, MapEnablePanEvent, MapEnableZoomEvent, MapEventType, MapHoverEvent, MapHoverPayload } from "./base-map/types.js";
15
15
  import { DARK_BASE_MAP_STYLE, LIGHT_BASE_MAP_STYLE, PARAMETERS } from "./base-map/constants.js";
16
16
  import { BaseMap } from "./base-map/index.js";
17
+ import { CoffinCornerDeselectedEvent, CoffinCornerEvent, CoffinCornerEventType, CoffinCornerEvents, CoffinCornerExtensionProps, CoffinCornerHoveredEvent, CoffinCornerSelectedEvent, EntityId } from "./extensions/coffin-corner/types.js";
18
+ import { CoffinCornerExtension } from "./extensions/coffin-corner/coffin-corner-extension.js";
19
+ import { clearSelection, coffinCornerStore, getHoveredEntityId, getSelectedEntityId } from "./extensions/coffin-corner/store.js";
20
+ import { UseCoffinCornerReturn, useCoffinCorner } from "./extensions/coffin-corner/use-coffin-corner.js";
21
+ import "./extensions/coffin-corner/index.js";
17
22
  import { SavedViewportOptions, createSavedViewport } from "./saved-viewports/index.js";
18
- import { CircleProperties, CircleRadius, EllipseProperties, Shape, ShapeFeature, ShapeFeatureProperties, ShapeFeatureType, ShapeFeatureTypeValues, ShapeId, StyleProperties } from "./shapes/shared/types.js";
19
- import { DisplayShapeLayerProps, StyledFeature, StyledFeatureProperties } from "./shapes/display-shape-layer/types.js";
23
+ import { CircleProperties, CircleRadius, EllipseProperties, Shape, ShapeFeature, ShapeFeatureProperties, ShapeFeatureType, ShapeId, StyleProperties, StyledFeature, StyledFeatureProperties } from "./shapes/shared/types.js";
24
+ import { DisplayShapeLayerProps } from "./shapes/display-shape-layer/types.js";
20
25
  import { DisplayShapeLayer } from "./shapes/display-shape-layer/index.js";
21
26
  import { DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, LINE_PATTERNS, LINE_WIDTHS, SHAPE_LAYER_IDS } from "./shapes/shared/constants.js";
22
27
  import { ShapeEventType, ShapeEvents } from "./shapes/shared/events.js";
23
28
  import "./shapes/index.js";
24
29
  import { SymbolLayer, SymbolLayerProps } from "./symbol-layer/index.js";
25
- export { BaseMap, type BaseMapProps, type CircleProperties, type CircleRadius, DARK_BASE_MAP_STYLE, DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, DisplayShapeLayer, type DisplayShapeLayerProps, type EllipseProperties, LIGHT_BASE_MAP_STYLE, LINE_PATTERNS, LINE_WIDTHS, type MapClickEvent, type MapClickPayload, type MapControlPayload, type MapDisablePanEvent, type MapDisableZoomEvent, type MapEnablePanEvent, type MapEnableZoomEvent, type MapEventType, MapEvents, MapEventsNamespace, type MapHoverEvent, type MapHoverPayload, PARAMETERS, SHAPE_LAYER_IDS, type SavedViewportOptions, type Shape, type ShapeEventType, ShapeEvents, type ShapeFeature, type ShapeFeatureProperties, ShapeFeatureType, type ShapeFeatureTypeValues, type ShapeId, type StyleProperties, type StyledFeature, type StyledFeatureProperties, SymbolLayer, type SymbolLayerProps, createSavedViewport };
30
+ export { BaseMap, type BaseMapProps, type CircleProperties, type CircleRadius, type CoffinCornerDeselectedEvent, type CoffinCornerEvent, type CoffinCornerEventType, CoffinCornerEvents, CoffinCornerExtension, type CoffinCornerExtensionProps, type CoffinCornerHoveredEvent, type CoffinCornerSelectedEvent, DARK_BASE_MAP_STYLE, DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, DisplayShapeLayer, type DisplayShapeLayerProps, type EllipseProperties, type EntityId, LIGHT_BASE_MAP_STYLE, LINE_PATTERNS, LINE_WIDTHS, type MapClickEvent, type MapClickPayload, type MapControlPayload, type MapDisablePanEvent, type MapDisableZoomEvent, type MapEnablePanEvent, type MapEnableZoomEvent, type MapEventType, MapEvents, MapEventsNamespace, type MapHoverEvent, type MapHoverPayload, PARAMETERS, SHAPE_LAYER_IDS, type SavedViewportOptions, type Shape, type ShapeEventType, ShapeEvents, type ShapeFeature, type ShapeFeatureProperties, ShapeFeatureType, type ShapeId, type StyleProperties, type StyledFeature, type StyledFeatureProperties, SymbolLayer, type SymbolLayerProps, type UseCoffinCornerReturn, clearSelection, coffinCornerStore, createSavedViewport, getHoveredEntityId, getSelectedEntityId, useCoffinCorner };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -17,8 +17,12 @@ import { ShapeFeatureType } from "./shapes/shared/types.js";
17
17
  import { DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, LINE_PATTERNS, LINE_WIDTHS, SHAPE_LAYER_IDS } from "./shapes/shared/constants.js";
18
18
  import { DARK_BASE_MAP_STYLE, LIGHT_BASE_MAP_STYLE, PARAMETERS } from "./base-map/constants.js";
19
19
  import { BaseMap } from "./base-map/index.js";
20
+ import { CoffinCornerExtension } from "./extensions/coffin-corner/coffin-corner-extension.js";
21
+ import { CoffinCornerEvents } from "./extensions/coffin-corner/types.js";
22
+ import { clearSelection, coffinCornerStore, getHoveredEntityId, getSelectedEntityId } from "./extensions/coffin-corner/store.js";
23
+ import { useCoffinCorner } from "./extensions/coffin-corner/use-coffin-corner.js";
20
24
  import { createSavedViewport } from "./saved-viewports/index.js";
21
25
  import { DisplayShapeLayer } from "./shapes/display-shape-layer/index.js";
22
26
  import { SymbolLayer } from "./symbol-layer/index.js";
23
27
 
24
- export { BaseMap, DARK_BASE_MAP_STYLE, DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, DisplayShapeLayer, LIGHT_BASE_MAP_STYLE, LINE_PATTERNS, LINE_WIDTHS, MapEvents, MapEventsNamespace, PARAMETERS, SHAPE_LAYER_IDS, ShapeEvents, ShapeFeatureType, SymbolLayer, createSavedViewport };
28
+ export { BaseMap, CoffinCornerEvents, CoffinCornerExtension, DARK_BASE_MAP_STYLE, DASH_ARRAYS, DEFAULT_COLORS, DEFAULT_STYLE_PROPERTIES, DisplayShapeLayer, LIGHT_BASE_MAP_STYLE, LINE_PATTERNS, LINE_WIDTHS, MapEvents, MapEventsNamespace, PARAMETERS, SHAPE_LAYER_IDS, ShapeEvents, ShapeFeatureType, SymbolLayer, clearSelection, coffinCornerStore, createSavedViewport, getHoveredEntityId, getSelectedEntityId, useCoffinCorner };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -11,15 +11,10 @@
11
11
  */
12
12
 
13
13
 
14
- import { getLogger } from "@accelint/logger";
14
+ import { createLoggerDomain } from "../../shared/logger.js";
15
15
 
16
16
  //#region src/deckgl/saved-viewports/storage.ts
17
- const logger = getLogger({
18
- enabled: process.env.NODE_ENV !== "production" && process.env.NODE_ENV !== "test",
19
- level: "warn",
20
- prefix: "[SavedViewports]",
21
- pretty: true
22
- });
17
+ const logger = createLoggerDomain("[SavedViewports]");
23
18
  /**
24
19
  * Base storage key for saved viewports in localStorage.
25
20
  */
@@ -41,8 +36,8 @@ const getContainerKey = (uniqueIdentifier) => uniqueIdentifier ? `${STORAGE_ID}-
41
36
  const getContainer = (containerKey) => {
42
37
  try {
43
38
  return JSON.parse(localStorage.getItem(containerKey) ?? "{}");
44
- } catch {
45
- logger.warn(`Failed to parse storage container for key: ${containerKey}, returning empty container.`);
39
+ } catch (err) {
40
+ logger.withError(err).error(`Failed to parse storage container for key: ${containerKey}, returning empty container.`);
46
41
  return {};
47
42
  }
48
43
  };
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","names":[],"sources":["../../../src/deckgl/saved-viewports/storage.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { getLogger } from '@accelint/logger';\nimport type { MapViewState } from '@deck.gl/core';\n\nconst logger = getLogger({\n enabled:\n process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test',\n level: 'warn',\n prefix: '[SavedViewports]',\n pretty: true,\n});\n\n/**\n * Base storage key for saved viewports in localStorage.\n */\nexport const STORAGE_ID = 'deckgl-saved-viewports';\n\n/**\n * Generates a storage key, optionally namespaced by unique identifier.\n *\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n * @returns Storage key string\n */\nconst getContainerKey = (uniqueIdentifier?: string) =>\n uniqueIdentifier ? `${STORAGE_ID}-${uniqueIdentifier}` : STORAGE_ID;\n\n/**\n * Retrieves the storage container from localStorage.\n * Returns empty object if parsing fails or key doesn't exist.\n *\n * @param containerKey - The storage key to retrieve\n * @returns Parsed storage container object\n */\nconst getContainer = (containerKey: string) => {\n try {\n return JSON.parse(localStorage.getItem(containerKey) ?? '{}');\n } catch {\n logger.warn(\n `Failed to parse storage container for key: ${containerKey}, returning empty container.`,\n );\n return {};\n }\n};\n\n/**\n * Persists a viewport state to localStorage.\n *\n * Saves the viewport under the given ID within a namespaced container.\n * If the container doesn't exist, creates it. If the ID already exists, overwrites it.\n *\n * @param id - Unique identifier for this viewport (typically a key combination ID)\n * @param obj - The MapViewState to persist\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n *\n * @example\n * ```typescript\n * import { persist } from '@accelint/map-toolkit/deckgl/saved-viewports/storage';\n *\n * const viewport = {\n * latitude: 38.9072,\n * longitude: -77.0369,\n * zoom: 10,\n * pitch: 0,\n * bearing: 0,\n * };\n *\n * persist('Digit1', viewport);\n * persist('Digit2', viewport, 'main-map');\n * ```\n */\nexport const persist = (\n id: string,\n obj: MapViewState,\n uniqueIdentifier?: string,\n) => {\n const containerKey = getContainerKey(uniqueIdentifier);\n const container = getContainer(containerKey);\n container[id] = obj;\n localStorage.setItem(containerKey, JSON.stringify(container));\n};\n\n/**\n * Retrieves a saved viewport state from localStorage.\n *\n * Returns the viewport associated with the given ID, or undefined if not found.\n * Logs a warning if the viewport doesn't exist.\n *\n * @param id - Unique identifier for the viewport to retrieve\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n * @returns The saved MapViewState or undefined if not found\n *\n * @example\n * ```typescript\n * import { retrieve } from '@accelint/map-toolkit/deckgl/saved-viewports/storage';\n *\n * const viewport = retrieve('Digit1');\n * if (viewport) {\n * console.log('Restored viewport:', viewport);\n * }\n *\n * const mainMapViewport = retrieve('Digit1', 'main-map');\n * ```\n */\nexport const retrieve = (id: string, uniqueIdentifier?: string) => {\n const containerKey = getContainerKey(uniqueIdentifier);\n const container = getContainer(containerKey);\n const obj = container[id];\n if (!obj) {\n logger.warn(`Object with id: ${id} does not exist`);\n }\n return obj;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAM,SAAS,UAAU;CACvB,SACE,QAAQ,IAAI,aAAa,gBAAgB,QAAQ,IAAI,aAAa;CACpE,OAAO;CACP,QAAQ;CACR,QAAQ;CACT,CAAC;;;;AAKF,MAAa,aAAa;;;;;;;AAQ1B,MAAM,mBAAmB,qBACvB,mBAAmB,GAAG,WAAW,GAAG,qBAAqB;;;;;;;;AAS3D,MAAM,gBAAgB,iBAAyB;AAC7C,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,QAAQ,aAAa,IAAI,KAAK;SACvD;AACN,SAAO,KACL,8CAA8C,aAAa,8BAC5D;AACD,SAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8Bb,MAAa,WACX,IACA,KACA,qBACG;CACH,MAAM,eAAe,gBAAgB,iBAAiB;CACtD,MAAM,YAAY,aAAa,aAAa;AAC5C,WAAU,MAAM;AAChB,cAAa,QAAQ,cAAc,KAAK,UAAU,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAyB/D,MAAa,YAAY,IAAY,qBAA8B;CAGjE,MAAM,MADY,aADG,gBAAgB,iBAAiB,CACV,CACtB;AACtB,KAAI,CAAC,IACH,QAAO,KAAK,mBAAmB,GAAG,iBAAiB;AAErD,QAAO"}
1
+ {"version":3,"file":"storage.js","names":[],"sources":["../../../src/deckgl/saved-viewports/storage.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { createLoggerDomain } from '@/shared/logger';\nimport type { MapViewState } from '@deck.gl/core';\n\nconst logger = createLoggerDomain('[SavedViewports]');\n\n/**\n * Base storage key for saved viewports in localStorage.\n */\nexport const STORAGE_ID = 'deckgl-saved-viewports';\n\n/**\n * Generates a storage key, optionally namespaced by unique identifier.\n *\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n * @returns Storage key string\n */\nconst getContainerKey = (uniqueIdentifier?: string) =>\n uniqueIdentifier ? `${STORAGE_ID}-${uniqueIdentifier}` : STORAGE_ID;\n\n/**\n * Retrieves the storage container from localStorage.\n * Returns empty object if parsing fails or key doesn't exist.\n *\n * @param containerKey - The storage key to retrieve\n * @returns Parsed storage container object\n */\nconst getContainer = (containerKey: string) => {\n try {\n return JSON.parse(localStorage.getItem(containerKey) ?? '{}');\n } catch (err) {\n logger\n .withError(err)\n .error(\n `Failed to parse storage container for key: ${containerKey}, returning empty container.`,\n );\n\n return {};\n }\n};\n\n/**\n * Persists a viewport state to localStorage.\n *\n * Saves the viewport under the given ID within a namespaced container.\n * If the container doesn't exist, creates it. If the ID already exists, overwrites it.\n *\n * @param id - Unique identifier for this viewport (typically a key combination ID)\n * @param obj - The MapViewState to persist\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n *\n * @example\n * ```typescript\n * import { persist } from '@accelint/map-toolkit/deckgl/saved-viewports/storage';\n *\n * const viewport = {\n * latitude: 38.9072,\n * longitude: -77.0369,\n * zoom: 10,\n * pitch: 0,\n * bearing: 0,\n * };\n *\n * persist('Digit1', viewport);\n * persist('Digit2', viewport, 'main-map');\n * ```\n */\nexport const persist = (\n id: string,\n obj: MapViewState,\n uniqueIdentifier?: string,\n) => {\n const containerKey = getContainerKey(uniqueIdentifier);\n const container = getContainer(containerKey);\n container[id] = obj;\n localStorage.setItem(containerKey, JSON.stringify(container));\n};\n\n/**\n * Retrieves a saved viewport state from localStorage.\n *\n * Returns the viewport associated with the given ID, or undefined if not found.\n * Logs a warning if the viewport doesn't exist.\n *\n * @param id - Unique identifier for the viewport to retrieve\n * @param uniqueIdentifier - Optional namespace for multiple map instances\n * @returns The saved MapViewState or undefined if not found\n *\n * @example\n * ```typescript\n * import { retrieve } from '@accelint/map-toolkit/deckgl/saved-viewports/storage';\n *\n * const viewport = retrieve('Digit1');\n * if (viewport) {\n * console.log('Restored viewport:', viewport);\n * }\n *\n * const mainMapViewport = retrieve('Digit1', 'main-map');\n * ```\n */\nexport const retrieve = (id: string, uniqueIdentifier?: string) => {\n const containerKey = getContainerKey(uniqueIdentifier);\n const container = getContainer(containerKey);\n const obj = container[id];\n if (!obj) {\n logger.warn(`Object with id: ${id} does not exist`);\n }\n return obj;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAM,SAAS,mBAAmB,mBAAmB;;;;AAKrD,MAAa,aAAa;;;;;;;AAQ1B,MAAM,mBAAmB,qBACvB,mBAAmB,GAAG,WAAW,GAAG,qBAAqB;;;;;;;;AAS3D,MAAM,gBAAgB,iBAAyB;AAC7C,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,QAAQ,aAAa,IAAI,KAAK;UACtD,KAAK;AACZ,SACG,UAAU,IAAI,CACd,MACC,8CAA8C,aAAa,8BAC5D;AAEH,SAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8Bb,MAAa,WACX,IACA,KACA,qBACG;CACH,MAAM,eAAe,gBAAgB,iBAAiB;CACtD,MAAM,YAAY,aAAa,aAAa;AAC5C,WAAU,MAAM;AAChB,cAAa,QAAQ,cAAc,KAAK,UAAU,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAyB/D,MAAa,YAAY,IAAY,qBAA8B;CAGjE,MAAM,MADY,aADG,gBAAgB,iBAAiB,CACV,CACtB;AACtB,KAAI,CAAC,IACH,QAAO,KAAK,mBAAmB,GAAG,iBAAiB;AAErD,QAAO"}
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -14,6 +14,8 @@
14
14
  'use client';
15
15
 
16
16
  import { DEFAULT_COLORS } from "../shared/constants.js";
17
+ import { CoffinCornerExtension } from "../../extensions/coffin-corner/coffin-corner-extension.js";
18
+ import { PathStyleExtension } from "@deck.gl/extensions";
17
19
 
18
20
  //#region src/deckgl/shapes/display-shape-layer/constants.ts
19
21
  /**
@@ -28,29 +30,6 @@ const MAP_INTERACTION = {
28
30
  ICON_HOVER_SIZE_INCREASE: 5
29
31
  };
30
32
  /**
31
- * Selection highlight configuration.
32
- *
33
- * Controls the appearance of selected shapes, including highlight color
34
- * and icon size adjustments for Point shapes.
35
- */
36
- const SELECTION_HIGHLIGHT = {
37
- COLOR: DEFAULT_COLORS.highlight,
38
- ICON_SIZE_INCREASE: 8
39
- };
40
- /**
41
- * Coffin corners configuration for Point selection/hover feedback.
42
- *
43
- * Coffin corners are bracket-like corners that appear around Point shapes
44
- * with icons to indicate hover and selection states. They provide visual
45
- * feedback without obscuring the icon itself.
46
- */
47
- const COFFIN_CORNERS = {
48
- HOVER_ICON: "coffin-corners-hover",
49
- SELECTED_ICON: "coffin-corners-selected",
50
- SELECTED_HOVER_ICON: "coffin-corners-selected-hover",
51
- SIZE: 38
52
- };
53
- /**
54
33
  * Default props for DisplayShapeLayer.
55
34
  *
56
35
  * Provides sensible defaults for interactive shape display with labels,
@@ -62,9 +41,74 @@ const DEFAULT_DISPLAY_PROPS = {
62
41
  showLabels: "always",
63
42
  showHighlight: false,
64
43
  applyBaseOpacity: true,
65
- highlightColor: SELECTION_HIGHLIGHT.COLOR
44
+ highlightColor: DEFAULT_COLORS.highlight
66
45
  };
46
+ /**
47
+ * Material settings for lighting effects on polygon shapes.
48
+ * Controls fill brightness for hover and selection overlay layers.
49
+ * Keys mirror BRIGHTNESS_FACTOR for consistency.
50
+ */
51
+ const MATERIAL_SETTINGS = {
52
+ NORMAL: {
53
+ ambient: .35,
54
+ diffuse: .6,
55
+ shininess: 32,
56
+ specularColor: [
57
+ 255,
58
+ 255,
59
+ 255
60
+ ]
61
+ },
62
+ HOVER_OR_SELECT: {
63
+ ambient: .6,
64
+ diffuse: .8,
65
+ shininess: 64,
66
+ specularColor: [
67
+ 255,
68
+ 255,
69
+ 255
70
+ ]
71
+ },
72
+ HOVER_AND_SELECT: {
73
+ ambient: .75,
74
+ diffuse: .95,
75
+ shininess: 80,
76
+ specularColor: [
77
+ 255,
78
+ 255,
79
+ 255
80
+ ]
81
+ }
82
+ };
83
+ /**
84
+ * Brightness multipliers for interaction state feedback.
85
+ * Applied via brightenColor() to line colors, curtains, and elevation indicators.
86
+ * - HOVER_OR_SELECT: shape is hovered or selected (single active state)
87
+ * - HOVER_AND_SELECT: shape is both hovered and selected simultaneously
88
+ */
89
+ const BRIGHTNESS_FACTOR = {
90
+ HOVER_OR_SELECT: 1.4,
91
+ HOVER_AND_SELECT: 1.7
92
+ };
93
+ /**
94
+ * Opacity multiplier for interaction overlay layers (hover, select).
95
+ * Applied to the shape's fill alpha — sits between the base opacity (0.2)
96
+ * and full opacity (1.0) so the overlay reads clearly without being too solid.
97
+ */
98
+ const OVERLAY_FILL_OPACITY = .25;
99
+ /** Reusable deck.gl PathStyleExtension enabling dash patterns on GeoJsonLayer lines. */
100
+ const DASH_EXTENSION = new PathStyleExtension({ dash: true });
101
+ const COFFIN_CORNER_EXTENSION = new CoffinCornerExtension();
102
+ /** Stable extensions array for GeoJsonLayer — avoids new reference per render triggering getShaders() re-evaluation. */
103
+ const DISPLAY_EXTENSIONS = [DASH_EXTENSION, COFFIN_CORNER_EXTENSION];
104
+ /** Readonly [r, g, b, a] tuple of DEFAULT_COLORS.highlight, pre-spread at module load for hot-path usage. */
105
+ const HIGHLIGHT_COLOR_TUPLE = [
106
+ DEFAULT_COLORS.highlight[0],
107
+ DEFAULT_COLORS.highlight[1],
108
+ DEFAULT_COLORS.highlight[2],
109
+ DEFAULT_COLORS.highlight[3] ?? 255
110
+ ];
67
111
 
68
112
  //#endregion
69
- export { COFFIN_CORNERS, DEFAULT_DISPLAY_PROPS, MAP_INTERACTION };
113
+ export { BRIGHTNESS_FACTOR, DEFAULT_DISPLAY_PROPS, DISPLAY_EXTENSIONS, HIGHLIGHT_COLOR_TUPLE, MAP_INTERACTION, MATERIAL_SETTINGS, OVERLAY_FILL_OPACITY };
70
114
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../../../src/deckgl/shapes/display-shape-layer/constants.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n'use client';\n\nimport { DEFAULT_COLORS } from '../shared/constants';\n\n/**\n * Map interaction constants.\n *\n * Values derived from ngc2 for consistency with existing UI patterns.\n * Controls sizing and interaction feedback for shape rendering.\n */\nexport const MAP_INTERACTION = {\n LINE_WIDTH_MIN_PIXELS: 1, // Minimum line width in pixels\n ICON_SIZE: 38, // Size of shape icons\n ICON_HOVER_SIZE_INCREASE: 5, // Additional pixels added on hover\n} as const;\n\n/**\n * Selection highlight configuration.\n *\n * Controls the appearance of selected shapes, including highlight color\n * and icon size adjustments for Point shapes.\n */\nexport const SELECTION_HIGHLIGHT = {\n /** Uses DEFAULT_COLORS.highlight from shared constants */\n COLOR: DEFAULT_COLORS.highlight,\n ICON_SIZE_INCREASE: 8, // Additional pixels for highlight icon\n} as const;\n\n/**\n * Coffin corners configuration for Point selection/hover feedback.\n *\n * Coffin corners are bracket-like corners that appear around Point shapes\n * with icons to indicate hover and selection states. They provide visual\n * feedback without obscuring the icon itself.\n */\nexport const COFFIN_CORNERS = {\n /** Icon name for hover state (white corners with background fill) */\n HOVER_ICON: 'coffin-corners-hover',\n /** Icon name for selected state (blue corners, no fill) */\n SELECTED_ICON: 'coffin-corners-selected',\n /** Icon name for selected+hover state (blue corners with background fill) */\n SELECTED_HOVER_ICON: 'coffin-corners-selected-hover',\n /** Size of the coffin corners icon */\n SIZE: 38,\n} as const;\n\n/**\n * Default props for DisplayShapeLayer.\n *\n * Provides sensible defaults for interactive shape display with labels,\n * standard opacity handling, and minimal visual feedback. These can be\n * overridden via layer props.\n */\nexport const DEFAULT_DISPLAY_PROPS = {\n pickable: true,\n showLabels: 'always' as const,\n showHighlight: false,\n applyBaseOpacity: true,\n highlightColor: SELECTION_HIGHLIGHT.COLOR,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,kBAAkB;CAC7B,uBAAuB;CACvB,WAAW;CACX,0BAA0B;CAC3B;;;;;;;AAQD,MAAa,sBAAsB;CAEjC,OAAO,eAAe;CACtB,oBAAoB;CACrB;;;;;;;;AASD,MAAa,iBAAiB;CAE5B,YAAY;CAEZ,eAAe;CAEf,qBAAqB;CAErB,MAAM;CACP;;;;;;;;AASD,MAAa,wBAAwB;CACnC,UAAU;CACV,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,gBAAgB,oBAAoB;CACrC"}
1
+ {"version":3,"file":"constants.js","names":["HIGHLIGHT_COLOR_TUPLE: Rgba255Tuple"],"sources":["../../../../src/deckgl/shapes/display-shape-layer/constants.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n'use client';\nimport { PathStyleExtension } from '@deck.gl/extensions';\nimport { CoffinCornerExtension } from '../../extensions/coffin-corner/coffin-corner-extension';\nimport { DEFAULT_COLORS } from '../shared/constants';\nimport type { Rgba255Tuple } from '@accelint/predicates';\n\n/**\n * Map interaction constants.\n *\n * Values derived from ngc2 for consistency with existing UI patterns.\n * Controls sizing and interaction feedback for shape rendering.\n */\nexport const MAP_INTERACTION = {\n LINE_WIDTH_MIN_PIXELS: 1,\n ICON_SIZE: 38,\n ICON_HOVER_SIZE_INCREASE: 5,\n} as const;\n\n/**\n * Default props for DisplayShapeLayer.\n *\n * Provides sensible defaults for interactive shape display with labels,\n * standard opacity handling, and minimal visual feedback. These can be\n * overridden via layer props.\n */\nexport const DEFAULT_DISPLAY_PROPS = {\n pickable: true,\n showLabels: 'always' as const,\n showHighlight: false,\n applyBaseOpacity: true,\n highlightColor: DEFAULT_COLORS.highlight,\n};\n\n/**\n * Material settings for lighting effects on polygon shapes.\n * Controls fill brightness for hover and selection overlay layers.\n * Keys mirror BRIGHTNESS_FACTOR for consistency.\n */\nexport const MATERIAL_SETTINGS = {\n // Normal state - standard lighting\n NORMAL: {\n ambient: 0.35,\n diffuse: 0.6,\n shininess: 32,\n specularColor: [255, 255, 255] as [number, number, number],\n },\n // Hovered or selected (single active state)\n HOVER_OR_SELECT: {\n ambient: 0.6,\n diffuse: 0.8,\n shininess: 64,\n specularColor: [255, 255, 255] as [number, number, number],\n },\n // Hovered and selected simultaneously - brighter\n HOVER_AND_SELECT: {\n ambient: 0.75,\n diffuse: 0.95,\n shininess: 80,\n specularColor: [255, 255, 255] as [number, number, number],\n },\n} as const;\n\n/**\n * Brightness multipliers for interaction state feedback.\n * Applied via brightenColor() to line colors, curtains, and elevation indicators.\n * - HOVER_OR_SELECT: shape is hovered or selected (single active state)\n * - HOVER_AND_SELECT: shape is both hovered and selected simultaneously\n */\nexport const BRIGHTNESS_FACTOR = {\n HOVER_OR_SELECT: 1.4,\n HOVER_AND_SELECT: 1.7,\n} as const;\n\n/**\n * Opacity multiplier for interaction overlay layers (hover, select).\n * Applied to the shape's fill alpha sits between the base opacity (0.2)\n * and full opacity (1.0) so the overlay reads clearly without being too solid.\n */\nexport const OVERLAY_FILL_OPACITY = 0.25;\n\n/** Reusable deck.gl PathStyleExtension enabling dash patterns on GeoJsonLayer lines. */\nexport const DASH_EXTENSION = new PathStyleExtension({ dash: true });\n\nexport const COFFIN_CORNER_EXTENSION = new CoffinCornerExtension();\n\n/** Stable extensions array for GeoJsonLayer — avoids new reference per render triggering getShaders() re-evaluation. */\nexport const DISPLAY_EXTENSIONS = [DASH_EXTENSION, COFFIN_CORNER_EXTENSION];\n\n/** Readonly [r, g, b, a] tuple of DEFAULT_COLORS.highlight, pre-spread at module load for hot-path usage. */\nexport const HIGHLIGHT_COLOR_TUPLE: Rgba255Tuple = [\n DEFAULT_COLORS.highlight[0],\n DEFAULT_COLORS.highlight[1],\n DEFAULT_COLORS.highlight[2],\n DEFAULT_COLORS.highlight[3] ?? 255,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,kBAAkB;CAC7B,uBAAuB;CACvB,WAAW;CACX,0BAA0B;CAC3B;;;;;;;;AASD,MAAa,wBAAwB;CACnC,UAAU;CACV,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,gBAAgB,eAAe;CAChC;;;;;;AAOD,MAAa,oBAAoB;CAE/B,QAAQ;EACN,SAAS;EACT,SAAS;EACT,WAAW;EACX,eAAe;GAAC;GAAK;GAAK;GAAI;EAC/B;CAED,iBAAiB;EACf,SAAS;EACT,SAAS;EACT,WAAW;EACX,eAAe;GAAC;GAAK;GAAK;GAAI;EAC/B;CAED,kBAAkB;EAChB,SAAS;EACT,SAAS;EACT,WAAW;EACX,eAAe;GAAC;GAAK;GAAK;GAAI;EAC/B;CACF;;;;;;;AAQD,MAAa,oBAAoB;CAC/B,iBAAiB;CACjB,kBAAkB;CACnB;;;;;;AAOD,MAAa,uBAAuB;;AAGpC,MAAa,iBAAiB,IAAI,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEpE,MAAa,0BAA0B,IAAI,uBAAuB;;AAGlE,MAAa,qBAAqB,CAAC,gBAAgB,wBAAwB;;AAG3E,MAAaA,wBAAsC;CACjD,eAAe,UAAU;CACzB,eAAe,UAAU;CACzB,eAAe,UAAU;CACzB,eAAe,UAAU,MAAM;CAChC"}
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.
2
+ * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
3
3
  * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License. You may obtain a copy
5
5
  * of the License at https://www.apache.org/licenses/LICENSE-2.0
@@ -10,23 +10,12 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { ShapeId } from "../shared/types.js";
14
- import { DisplayShapeLayerProps } from "./types.js";
13
+ import { DisplayShapeLayerProps, DisplayShapeLayerState } from "./types.js";
15
14
  import * as _deck_gl_core0 from "@deck.gl/core";
16
15
  import { CompositeLayer, Layer, PickingInfo } from "@deck.gl/core";
17
16
 
18
17
  //#region src/deckgl/shapes/display-shape-layer/index.d.ts
19
- /**
20
- * State type for DisplayShapeLayer
21
- */
22
- type DisplayShapeLayerState = {
23
- /** Index of currently hovered shape, undefined when not hovering */
24
- hoverIndex?: number;
25
- /** ID of the last hovered shape for event deduplication */
26
- lastHoveredId?: ShapeId | null;
27
- /** Allow additional properties from base layer state */
28
- [key: string]: unknown;
29
- };
18
+
30
19
  /**
31
20
  * DisplayShapeLayer - Read-only shapes visualization layer
32
21
  *
@@ -36,24 +25,28 @@ type DisplayShapeLayerState = {
36
25
  * ## Features
37
26
  * - **Multiple geometry types**: Point, LineString, Polygon, and Circle
38
27
  * - **Icon support**: Custom icons for Point geometries via icon atlases
39
- * - **Interactive selection**: Click handling with dotted border and optional highlight
40
- * - **Hover effects**: Border/outline width increases on hover for better UX
28
+ * - **Interactive selection**: Click handling with brightness overlay on polygon select, optional highlight outline for non-Point shapes (if showHighlight=true). Point geometries use coffin corner brackets instead.
29
+ * - **Hover effects**: Polygon fills brighten via material lighting; outline width increases by 2px on hover
41
30
  * - **Customizable labels**: Flexible label positioning with per-shape or global options
42
31
  * - **Style properties**: Full control over colors, border/outline patterns, and opacity
43
32
  * - **Event bus integration**: Automatically emits shape events via @accelint/bus
44
33
  * - **Multi-map support**: Events include map instance ID for isolation
45
34
  *
46
- * ## Selection Visual Feedback
47
- * When a shape is selected via `selectedShapeId`:
48
- * - The shape's border/outline pattern changes to dotted
49
- * - An optional highlight renders underneath (controlled by `showHighlight` prop)
35
+ * ## Interaction Philosophy
36
+ * Interactions never modify a shape's innate styling. Hover and selection are always
37
+ * additive overlays rendered apart from the main layer using opacity-scaled fill colors
38
+ * and material-based brightness the base shape is never altered.
50
39
  *
51
40
  * ## Layer Structure
52
- * Renders up to four sublayers (in order, bottom to top):
53
- * 1. **Highlight layer**: Selection highlight effect for non-icon-Point shapes (if showHighlight=true)
54
- * 2. **Coffin corners layer**: Selection/hover feedback for Point shapes with icons
55
- * 3. **Main GeoJsonLayer**: Shape geometries with styling and interaction
56
- * 4. **Label layer**: Text labels (if showLabels enabled)
41
+ * Renders sublayers in this order (bottom to top):
42
+ * 1. **Highlight layer**: Selection outline for non-polygon, non-Point shapes (when showHighlight enabled)
43
+ * 2. **Select layer**: Selection brightness overlay for polygon shapes
44
+ * 3. **Hover layer**: Hover brightness overlay for polygon shapes
45
+ * 4. **Elevation visualization**: Curtains (LineStrings) or wireframes (polygons) elevation only
46
+ * 5. **Elevation indicators**: Vertical strut lines for elevated non-polygon shapes — elevation only
47
+ * 6. **Main GeoJsonLayer**: Shape geometries with styling and interaction; includes CoffinCornerExtension
48
+ * which propagates to the icon/scatterplot sublayer for Point hover/select bracket feedback
49
+ * 7. **Label layer**: Text labels (if showLabels enabled)
57
50
  *
58
51
  * ## Icon Atlas Constraint
59
52
  * When using icons for Point geometries, all shapes in a single layer must share the
@@ -115,6 +108,12 @@ declare class DisplayShapeLayer extends CompositeLayer<DisplayShapeLayerProps> {
115
108
  state: DisplayShapeLayerState;
116
109
  /** Cache for transformed features to avoid recreating objects on every render */
117
110
  private featuresCache;
111
+ /** Cache for elevation classification and curtain features */
112
+ private elevationCache;
113
+ /** Cache for elevation indicator line segments */
114
+ private indicatorCache;
115
+ /** Cached coffin corner color tuple — avoids new array reference per render when highlight hasn't changed. */
116
+ private coffinCornerColorCache;
118
117
  static layerName: string;
119
118
  static defaultProps: {
120
119
  pickable: boolean;
@@ -127,6 +126,23 @@ declare class DisplayShapeLayer extends CompositeLayer<DisplayShapeLayerProps> {
127
126
  * Clean up state and caches when layer is destroyed
128
127
  */
129
128
  finalizeState(): void;
129
+ /**
130
+ * Resolved highlight color — uses prop if provided, falls back to default.
131
+ */
132
+ private get resolvedHighlight();
133
+ /**
134
+ * Coffin corner bracket color derived from resolvedHighlight with forced full opacity.
135
+ * Cached to avoid a new array reference per render triggering deck.gl prop-change detection.
136
+ */
137
+ private get coffinCornerColor();
138
+ /**
139
+ * Handle picking events from the main shapes layer
140
+ */
141
+ private handleMainLayerPick;
142
+ /**
143
+ * Handle picking events from curtain layers and map back to original LineString
144
+ */
145
+ private handleCurtainPick;
130
146
  /**
131
147
  * Override getPickingInfo to handle events from sublayers
132
148
  * This is the correct pattern for CompositeLayer event handling
@@ -138,7 +154,7 @@ declare class DisplayShapeLayer extends CompositeLayer<DisplayShapeLayerProps> {
138
154
  }: {
139
155
  info: PickingInfo;
140
156
  mode?: string;
141
- sourceLayer?: any;
157
+ sourceLayer?: Layer | null;
142
158
  }): {
143
159
  color: Uint8Array | null;
144
160
  layer: Layer | null;
@@ -165,29 +181,38 @@ declare class DisplayShapeLayer extends CompositeLayer<DisplayShapeLayerProps> {
165
181
  */
166
182
  private getShapeById;
167
183
  /**
168
- * Handle shape click
184
+ * Handle shape click — emits `shapes:selected` via bus and calls `onShapeClick` callback.
185
+ * @param info - deck.gl picking info from the clicked sublayer.
169
186
  */
170
187
  private handleShapeClick;
171
188
  /**
172
- * Handle shape hover
189
+ * Handle shape hover — emits `shapes:hovered` via bus (deduplicated by shapeId) and calls `onShapeHover` callback.
190
+ * @param info - deck.gl picking info from the hovered sublayer.
173
191
  */
174
192
  private handleShapeHover;
175
193
  /**
176
- * Render highlight sublayer (underneath main layer)
177
- * Note: Points with icons use coffin corners instead of highlight layer
194
+ * Get or compute elevation-derived data (feature classification + curtain features).
195
+ * Cached on features identity and applyBaseOpacity to avoid per-frame recomputation.
196
+ */
197
+ private getElevationData;
198
+ /**
199
+ * Render highlight sublayer (underneath main layer).
200
+ * Point geometries skip this layer — they use coffin corner brackets
201
+ * via CoffinCornerExtension on the main layer's icon/scatterplot sublayer instead.
178
202
  */
179
203
  private renderHighlightLayer;
180
204
  /**
181
- * Render coffin corners layer for Point geometries that have icons on hover/select
182
- * Coffin corners provide visual feedback for points instead of highlight layer
205
+ * Render selection overlay layer for polygon shapes.
206
+ * Mirrors renderHoverLayer but triggers on selectedShapeId instead of hover.
207
+ * When a shape is both selected and hovered, both layers stack for a brighter combined effect.
183
208
  */
184
- private renderCoffinCornersLayer;
209
+ private renderSelectLayer;
185
210
  /**
186
- * Extract icon configuration from features in a single pass.
187
- * Returns the first icon's atlas and mapping (all shapes share the same atlas).
188
- * Uses early return for O(1) best case when first feature has icons.
211
+ * Render hover layer for all polygon shapes (2D and 3D).
212
+ * Overlays the shape's base fill with brighter material lighting.
213
+ * Stacks with other interaction layers (e.g. selection highlight underneath).
189
214
  */
190
- private getIconConfig;
215
+ private renderHoverLayer;
191
216
  /**
192
217
  * Render main shapes layer
193
218
  */
@@ -201,7 +226,37 @@ declare class DisplayShapeLayer extends CompositeLayer<DisplayShapeLayerProps> {
201
226
  */
202
227
  private renderLabelsLayer;
203
228
  /**
204
- * Render all sublayers
229
+ * Render radius label layer for hovered circle shapes.
230
+ * Shows the circle's radius value converted to the configured display unit.
231
+ *
232
+ * Positioning relative to the shape's label:
233
+ * - When showLabels is 'always' or 'hover': appears below the label
234
+ * - When showLabels is 'never': appears in the label's position
235
+ */
236
+ private renderRadiusLabelLayer;
237
+ /**
238
+ * Render vertical elevation indicator lines for non-polygon shapes.
239
+ * Creates vertical "strut" lines from ground level to elevated features.
240
+ * For LineStrings, creates a "curtain" effect with vertical lines at each coordinate.
241
+ * Polygons use wireframe extrusion instead.
242
+ */
243
+ private renderElevationIndicatorLayer;
244
+ /**
245
+ * Create a single curtain GeoJsonLayer with shared configuration.
246
+ */
247
+ private createCurtainGeoJsonLayer;
248
+ /**
249
+ * Render curtain layers for elevated LineStrings.
250
+ * Creates three separate layers for main, hovered, and selected states.
251
+ */
252
+ private renderCurtainLayers;
253
+ /**
254
+ * Render elevation visualization layers (curtains for lines, wireframes for polygons).
255
+ */
256
+ private renderElevationVisualizationLayer;
257
+ /**
258
+ * Render all sublayers.
259
+ * @returns Ordered array of sublayers (highlight, select, hover, elevation, main, labels) from bottom to top.
205
260
  */
206
261
  renderLayers(): Layer[];
207
262
  }