@maydon_tech/react-native-nitro-maps 0.1.3 → 0.2.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 (218) hide show
  1. package/LICENSE +1 -1
  2. package/NitroMap.podspec +1 -1
  3. package/README.md +82 -9
  4. package/android/CMakeLists.txt +4 -1
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
  7. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
  8. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
  9. package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
  10. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
  11. package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
  12. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
  13. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
  14. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
  15. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
  16. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
  17. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
  18. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
  19. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
  20. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
  21. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
  22. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
  23. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
  24. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
  25. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
  26. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
  27. package/ios/Clustering/ClusterIconRenderer.swift +3 -3
  28. package/ios/Location/NitroLocationManager.swift +116 -0
  29. package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
  30. package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
  31. package/ios/NitroMap.swift +279 -13
  32. package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
  33. package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
  34. package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
  35. package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
  36. package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
  37. package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
  38. package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
  39. package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
  40. package/ios/Providers/MapProviderFactory.swift +17 -0
  41. package/ios/Providers/MapProviderProtocol.swift +48 -1
  42. package/ios/Shared/ClusterConfig+Factory.swift +2 -2
  43. package/ios/Shared/MapStyleProvider.swift +6 -4
  44. package/ios/Shared/MarkerSelectionHandler.swift +4 -1
  45. package/ios/Utils/ColorValueExtension.swift +46 -67
  46. package/lib/module/components/ImageMarker.js +39 -29
  47. package/lib/module/components/ImageMarker.js.map +1 -1
  48. package/lib/module/components/Marker.js +118 -0
  49. package/lib/module/components/Marker.js.map +1 -0
  50. package/lib/module/components/NitroCircle.js +92 -0
  51. package/lib/module/components/NitroCircle.js.map +1 -0
  52. package/lib/module/components/NitroMap.js +216 -76
  53. package/lib/module/components/NitroMap.js.map +1 -1
  54. package/lib/module/components/NitroPolygon.js +135 -0
  55. package/lib/module/components/NitroPolygon.js.map +1 -0
  56. package/lib/module/components/NitroPolyline.js +115 -0
  57. package/lib/module/components/NitroPolyline.js.map +1 -0
  58. package/lib/module/components/PriceMarker.js +16 -29
  59. package/lib/module/components/PriceMarker.js.map +1 -1
  60. package/lib/module/context/NitroMapContext.js.map +1 -1
  61. package/lib/module/hooks/useNitroCircle.js +18 -0
  62. package/lib/module/hooks/useNitroCircle.js.map +1 -0
  63. package/lib/module/hooks/useNitroMarker.js +26 -9
  64. package/lib/module/hooks/useNitroMarker.js.map +1 -1
  65. package/lib/module/hooks/useNitroOverlay.js +59 -0
  66. package/lib/module/hooks/useNitroOverlay.js.map +1 -0
  67. package/lib/module/hooks/useNitroPolygon.js +18 -0
  68. package/lib/module/hooks/useNitroPolygon.js.map +1 -0
  69. package/lib/module/hooks/useNitroPolyline.js +18 -0
  70. package/lib/module/hooks/useNitroPolyline.js.map +1 -0
  71. package/lib/module/index.js +5 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/types/overlay.js +4 -0
  74. package/lib/module/types/overlay.js.map +1 -0
  75. package/lib/module/types/theme.js +4 -0
  76. package/lib/module/types/theme.js.map +1 -0
  77. package/lib/module/utils/colors.js +41 -13
  78. package/lib/module/utils/colors.js.map +1 -1
  79. package/lib/module/utils/validation.js +45 -0
  80. package/lib/module/utils/validation.js.map +1 -0
  81. package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
  82. package/lib/typescript/src/components/Marker.d.ts +34 -0
  83. package/lib/typescript/src/components/Marker.d.ts.map +1 -0
  84. package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
  85. package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
  86. package/lib/typescript/src/components/NitroMap.d.ts +60 -3
  87. package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
  88. package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
  89. package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
  90. package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
  91. package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
  92. package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
  93. package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
  94. package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
  95. package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
  97. package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
  98. package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
  99. package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
  101. package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
  103. package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
  104. package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
  105. package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
  106. package/lib/typescript/src/index.d.ts +15 -2
  107. package/lib/typescript/src/index.d.ts.map +1 -1
  108. package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
  109. package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
  110. package/lib/typescript/src/types/map.d.ts +34 -4
  111. package/lib/typescript/src/types/map.d.ts.map +1 -1
  112. package/lib/typescript/src/types/marker.d.ts +24 -36
  113. package/lib/typescript/src/types/marker.d.ts.map +1 -1
  114. package/lib/typescript/src/types/overlay.d.ts +75 -0
  115. package/lib/typescript/src/types/overlay.d.ts.map +1 -0
  116. package/lib/typescript/src/types/theme.d.ts +93 -0
  117. package/lib/typescript/src/types/theme.d.ts.map +1 -0
  118. package/lib/typescript/src/utils/colors.d.ts +6 -8
  119. package/lib/typescript/src/utils/colors.d.ts.map +1 -1
  120. package/lib/typescript/src/utils/validation.d.ts +12 -0
  121. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  122. package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
  123. package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
  124. package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
  125. package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
  126. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  127. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
  128. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
  129. package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
  130. package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
  131. package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
  132. package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
  133. package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
  134. package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
  135. package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
  148. package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
  149. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
  150. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
  151. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
  152. package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
  153. package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
  154. package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
  155. package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
  156. package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
  157. package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
  158. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
  160. package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
  161. package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
  162. package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
  163. package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
  164. package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
  165. package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
  166. package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
  167. package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
  168. package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
  169. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
  170. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
  171. package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
  172. package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
  173. package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
  174. package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
  175. package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
  176. package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
  177. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
  178. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
  179. package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
  180. package/package.json +36 -5
  181. package/src/components/ImageMarker.tsx +58 -42
  182. package/src/components/Marker.tsx +161 -0
  183. package/src/components/NitroCircle.tsx +183 -0
  184. package/src/components/NitroMap.tsx +328 -78
  185. package/src/components/NitroPolygon.tsx +229 -0
  186. package/src/components/NitroPolyline.tsx +208 -0
  187. package/src/components/PriceMarker.tsx +23 -48
  188. package/src/context/NitroMapContext.tsx +4 -0
  189. package/src/hooks/useNitroCircle.ts +25 -0
  190. package/src/hooks/useNitroMarker.ts +49 -10
  191. package/src/hooks/useNitroOverlay.ts +68 -0
  192. package/src/hooks/useNitroPolygon.ts +25 -0
  193. package/src/hooks/useNitroPolyline.ts +25 -0
  194. package/src/index.tsx +23 -2
  195. package/src/specs/NitroMap.nitro.ts +294 -5
  196. package/src/types/map.ts +36 -4
  197. package/src/types/marker.ts +24 -44
  198. package/src/types/overlay.ts +77 -0
  199. package/src/types/theme.ts +101 -0
  200. package/src/utils/colors.ts +48 -16
  201. package/src/utils/validation.ts +69 -0
  202. package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
  203. package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
  204. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
  205. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
  206. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
  207. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
  208. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
  209. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
  210. package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
  211. package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
  212. package/cpp/QuadTree.hpp +0 -246
  213. package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
  214. package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
  215. package/ios/Providers/GoogleMapProvider.swift +0 -924
  216. package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
  217. package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
  218. package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +0 -88
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ // src/components/NitroPolyline.tsx
4
+ import { memo, useCallback, useEffect, useRef } from 'react';
5
+ import { useNitroPolyline } from "../hooks/useNitroPolyline.js";
6
+ import { parseColor, areColorsEqual, Colors } from "../utils/colors.js";
7
+ import { validateCoordinates } from "../utils/validation.js";
8
+
9
+ /**
10
+ * Props for the NitroPolyline component
11
+ */
12
+
13
+ // ID generator — monotonic counter, unique within a JS runtime session
14
+ let polylineIdCounter = 0;
15
+ const generatePolylineId = () => `polyline_${++polylineIdCounter}`;
16
+
17
+ // Default stroke color (black)
18
+ const defaultStrokeColor = Colors.black;
19
+
20
+ // ============ Custom Memo Comparison ============
21
+ const arePropsEqual = (prev, next) => {
22
+ // Compare primitives
23
+ if (prev.id !== next.id || prev.strokeWidth !== next.strokeWidth || prev.geodesic !== next.geodesic || prev.dashed !== next.dashed || prev.zIndex !== next.zIndex || prev.tappable !== next.tappable || prev.accessibilityLabel !== next.accessibilityLabel) {
24
+ return false;
25
+ }
26
+
27
+ // Compare strokeColor
28
+ if (!areColorsEqual(prev.strokeColor, next.strokeColor)) {
29
+ return false;
30
+ }
31
+
32
+ // Compare coordinates array (deep)
33
+ const prevCoords = prev.coordinates;
34
+ const nextCoords = next.coordinates;
35
+ if (prevCoords.length !== nextCoords.length) return false;
36
+ for (let i = 0; i < prevCoords.length; i++) {
37
+ if (prevCoords[i].latitude !== nextCoords[i].latitude || prevCoords[i].longitude !== nextCoords[i].longitude) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ };
43
+
44
+ /**
45
+ * NitroPolyline - Draw a line connecting multiple geographic points on the map
46
+ *
47
+ * @example Basic route line
48
+ * ```tsx
49
+ * <NitroPolyline
50
+ * coordinates={[
51
+ * { latitude: 41.29, longitude: 69.24 },
52
+ * { latitude: 41.31, longitude: 69.28 },
53
+ * ]}
54
+ * strokeColor="#4285F4"
55
+ * strokeWidth={4}
56
+ * />
57
+ * ```
58
+ *
59
+ * @example Geodesic dashed line
60
+ * ```tsx
61
+ * <NitroPolyline
62
+ * coordinates={routeCoordinates}
63
+ * strokeColor="#FF0000"
64
+ * strokeWidth={2}
65
+ * geodesic={true}
66
+ * dashed={true}
67
+ * />
68
+ * ```
69
+ */
70
+ export const NitroPolyline = /*#__PURE__*/memo(function NitroPolyline({
71
+ id,
72
+ coordinates,
73
+ strokeColor,
74
+ strokeWidth = 1,
75
+ geodesic = false,
76
+ dashed = false,
77
+ zIndex = 0,
78
+ tappable = false,
79
+ accessibilityLabel
80
+ }) {
81
+ useEffect(() => {
82
+ if (__DEV__) {
83
+ if (coordinates.length < 2) {
84
+ console.warn('NitroPolyline: at least 2 coordinates are required to render a visible line. ' + `Received ${coordinates.length}.`);
85
+ }
86
+ validateCoordinates(coordinates, 'NitroPolyline');
87
+ }
88
+ // eslint-disable-next-line react-hooks/exhaustive-deps
89
+ }, []);
90
+
91
+ // Generate stable ID
92
+ const polylineId = useRef(id || generatePolylineId()).current;
93
+
94
+ // Build polyline data
95
+ const buildPolylineData = useCallback(() => ({
96
+ id: polylineId,
97
+ coordinates,
98
+ strokeColor: parseColor(strokeColor) ?? defaultStrokeColor,
99
+ strokeWidth,
100
+ geodesic,
101
+ dashed,
102
+ zIndex,
103
+ tappable,
104
+ accessibilityLabel
105
+ }), [polylineId, coordinates, strokeColor, strokeWidth, geodesic, dashed, zIndex, tappable, accessibilityLabel]);
106
+
107
+ // Use polyline lifecycle hook
108
+ useNitroPolyline(buildPolylineData);
109
+
110
+ // Render nothing — polyline is rendered natively
111
+ return null;
112
+ }, arePropsEqual);
113
+ export { arePropsEqual as arePolylinePropsEqual };
114
+ export default NitroPolyline;
115
+ //# sourceMappingURL=NitroPolyline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["memo","useCallback","useEffect","useRef","useNitroPolyline","parseColor","areColorsEqual","Colors","validateCoordinates","polylineIdCounter","generatePolylineId","defaultStrokeColor","black","arePropsEqual","prev","next","id","strokeWidth","geodesic","dashed","zIndex","tappable","accessibilityLabel","strokeColor","prevCoords","coordinates","nextCoords","length","i","latitude","longitude","NitroPolyline","__DEV__","console","warn","polylineId","current","buildPolylineData","arePolylinePropsEqual"],"sourceRoot":"../../../src","sources":["components/NitroPolyline.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  // src/components/PriceMarker.tsx
4
- import { memo, useCallback, useMemo } from 'react';
5
- import { useNitroMarker } from "../hooks/useNitroMarker.js";
6
- import { parseColor } from "../utils/colors.js";
4
+ import { memo, useCallback } from 'react';
5
+ import { useNitroMarker, useMarkerHandlers } from "../hooks/useNitroMarker.js";
6
+ import { parseColor, areColorsEqual } from "../utils/colors.js";
7
7
 
8
8
  /**
9
9
  * Props for the PriceMarker component
@@ -12,7 +12,7 @@ import { parseColor } from "../utils/colors.js";
12
12
  // ============ Custom Memo Comparison ============
13
13
  const arePropsEqual = (prevProps, nextProps) => {
14
14
  // Compare primitive props
15
- if (prevProps.id !== nextProps.id || prevProps.price !== nextProps.price || prevProps.currency !== nextProps.currency || prevProps.selected !== nextProps.selected || prevProps.title !== nextProps.title || prevProps.description !== nextProps.description || prevProps.draggable !== nextProps.draggable || prevProps.opacity !== nextProps.opacity || prevProps.rotation !== nextProps.rotation || prevProps.zIndex !== nextProps.zIndex || prevProps.clusteringEnabled !== nextProps.clusteringEnabled || prevProps.animation !== nextProps.animation || prevProps.fontSize !== nextProps.fontSize || prevProps.cornerRadius !== nextProps.cornerRadius || prevProps.paddingHorizontal !== nextProps.paddingHorizontal || prevProps.paddingVertical !== nextProps.paddingVertical || prevProps.shadowOpacity !== nextProps.shadowOpacity) {
15
+ if (prevProps.id !== nextProps.id || prevProps.price !== nextProps.price || prevProps.currency !== nextProps.currency || prevProps.selected !== nextProps.selected || prevProps.title !== nextProps.title || prevProps.description !== nextProps.description || prevProps.draggable !== nextProps.draggable || prevProps.opacity !== nextProps.opacity || prevProps.rotation !== nextProps.rotation || prevProps.zIndex !== nextProps.zIndex || prevProps.clusteringEnabled !== nextProps.clusteringEnabled || prevProps.animation !== nextProps.animation || prevProps.animationDuration !== nextProps.animationDuration || prevProps.animateOnReappear !== nextProps.animateOnReappear || prevProps.fontSize !== nextProps.fontSize || prevProps.paddingHorizontal !== nextProps.paddingHorizontal || prevProps.paddingVertical !== nextProps.paddingVertical || prevProps.shadowOpacity !== nextProps.shadowOpacity || prevProps.accessibilityLabel !== nextProps.accessibilityLabel) {
16
16
  return false;
17
17
  }
18
18
 
@@ -25,21 +25,7 @@ const arePropsEqual = (prevProps, nextProps) => {
25
25
  if (prevProps.anchor?.x !== nextProps.anchor?.x || prevProps.anchor?.y !== nextProps.anchor?.y) {
26
26
  return false;
27
27
  }
28
-
29
- // Compare colors (handles both hex strings and MarkerColor objects)
30
- const compareColors = (a, b) => {
31
- if (!a && !b) return true;
32
- if (!a || !b) return false;
33
- // If both are strings, compare directly
34
- if (typeof a === 'string' && typeof b === 'string') return a === b;
35
- // If types differ, not equal
36
- if (typeof a !== typeof b) return false;
37
- // Both are MarkerColor objects
38
- const aColor = a;
39
- const bColor = b;
40
- return aColor.r === bColor.r && aColor.g === bColor.g && aColor.b === bColor.b && aColor.a === bColor.a;
41
- };
42
- if (!compareColors(prevProps.backgroundColor, nextProps.backgroundColor) || !compareColors(prevProps.textColor, nextProps.textColor) || !compareColors(prevProps.selectedBackgroundColor, nextProps.selectedBackgroundColor) || !compareColors(prevProps.selectedTextColor, nextProps.selectedTextColor)) {
28
+ if (!areColorsEqual(prevProps.backgroundColor, nextProps.backgroundColor) || !areColorsEqual(prevProps.textColor, nextProps.textColor) || !areColorsEqual(prevProps.selectedBackgroundColor, nextProps.selectedBackgroundColor) || !areColorsEqual(prevProps.selectedTextColor, nextProps.selectedTextColor)) {
43
29
  return false;
44
30
  }
45
31
  return true;
@@ -79,7 +65,7 @@ export const PriceMarker = /*#__PURE__*/memo(function PriceMarker({
79
65
  backgroundColor,
80
66
  textColor,
81
67
  fontSize = 14,
82
- // cornerRadius prop kept for backwards compatibility but not used
68
+ // cornerRadius was removed not forwarded to native
83
69
  selectedBackgroundColor,
84
70
  selectedTextColor,
85
71
  paddingHorizontal,
@@ -98,6 +84,9 @@ export const PriceMarker = /*#__PURE__*/memo(function PriceMarker({
98
84
  },
99
85
  clusteringEnabled = true,
100
86
  animation = 'none',
87
+ animationDuration = 0.3,
88
+ animateOnReappear = true,
89
+ accessibilityLabel,
101
90
  // Events
102
91
  onPress,
103
92
  onDragStart,
@@ -126,13 +115,8 @@ export const PriceMarker = /*#__PURE__*/memo(function PriceMarker({
126
115
  };
127
116
  }, [price, currency, selected, backgroundColor, textColor, fontSize, selectedBackgroundColor, selectedTextColor, paddingHorizontal, paddingVertical, shadowOpacity]);
128
117
 
129
- // Memoize handlers
130
- const handlers = useMemo(() => ({
131
- onPress,
132
- onDragStart,
133
- onDrag,
134
- onDragEnd
135
- }), [onPress, onDragStart, onDrag, onDragEnd]);
118
+ // Memoize handlers via shared hook
119
+ const handlers = useMarkerHandlers(onPress, onDragStart, onDrag, onDragEnd);
136
120
 
137
121
  // Build full marker data
138
122
  const buildMarkerData = useCallback(markerId => ({
@@ -147,8 +131,11 @@ export const PriceMarker = /*#__PURE__*/memo(function PriceMarker({
147
131
  anchor,
148
132
  clusteringEnabled,
149
133
  config: buildMarkerConfig(),
150
- animation
151
- }), [coordinate, title, description, draggable, opacity, rotation, zIndex, anchor, clusteringEnabled, buildMarkerConfig, animation]);
134
+ accessibilityLabel,
135
+ animation,
136
+ animationDuration,
137
+ animateOnReappear
138
+ }), [coordinate, title, description, draggable, opacity, rotation, zIndex, anchor, clusteringEnabled, buildMarkerConfig, accessibilityLabel, animation, animationDuration, animateOnReappear]);
152
139
 
153
140
  // Use shared marker hook
154
141
  useNitroMarker({
@@ -1 +1 @@
1
- {"version":3,"names":["memo","useCallback","useMemo","useNitroMarker","parseColor","arePropsEqual","prevProps","nextProps","id","price","currency","selected","title","description","draggable","opacity","rotation","zIndex","clusteringEnabled","animation","fontSize","cornerRadius","paddingHorizontal","paddingVertical","shadowOpacity","coordinate","latitude","longitude","anchor","x","y","compareColors","a","b","aColor","bColor","r","g","backgroundColor","textColor","selectedBackgroundColor","selectedTextColor","PriceMarker","onPress","onDragStart","onDrag","onDragEnd","buildMarkerConfig","style","priceMarker","handlers","buildMarkerData","markerId","config","idPrefix","providedId"],"sourceRoot":"../../../src","sources":["components/PriceMarker.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["memo","useCallback","useNitroMarker","useMarkerHandlers","parseColor","areColorsEqual","arePropsEqual","prevProps","nextProps","id","price","currency","selected","title","description","draggable","opacity","rotation","zIndex","clusteringEnabled","animation","animationDuration","animateOnReappear","fontSize","paddingHorizontal","paddingVertical","shadowOpacity","accessibilityLabel","coordinate","latitude","longitude","anchor","x","y","backgroundColor","textColor","selectedBackgroundColor","selectedTextColor","PriceMarker","onPress","onDragStart","onDrag","onDragEnd","buildMarkerConfig","style","priceMarker","handlers","buildMarkerData","markerId","config","idPrefix","providedId"],"sourceRoot":"../../../src","sources":["components/PriceMarker.tsx"],"mappings":";;AAAA;AACA,SAASA,IAAI,EAAEC,WAAW,QAAQ,OAAO;AACzC,SACEC,cAAc,EACdC,iBAAiB,QAEZ,4BAAyB;AAChC,SAASC,UAAU,EAAEC,cAAc,QAAyB,oBAAiB;;AAE7E;AACA;AACA;;AAiEA;AACA,MAAMC,aAAa,GAAGA,CACpBC,SAA2B,EAC3BC,SAA2B,KACf;EACZ;EACA,IACED,SAAS,CAACE,EAAE,KAAKD,SAAS,CAACC,EAAE,IAC7BF,SAAS,CAACG,KAAK,KAAKF,SAAS,CAACE,KAAK,IACnCH,SAAS,CAACI,QAAQ,KAAKH,SAAS,CAACG,QAAQ,IACzCJ,SAAS,CAACK,QAAQ,KAAKJ,SAAS,CAACI,QAAQ,IACzCL,SAAS,CAACM,KAAK,KAAKL,SAAS,CAACK,KAAK,IACnCN,SAAS,CAACO,WAAW,KAAKN,SAAS,CAACM,WAAW,IAC/CP,SAAS,CAACQ,SAAS,KAAKP,SAAS,CAACO,SAAS,IAC3CR,SAAS,CAACS,OAAO,KAAKR,SAAS,CAACQ,OAAO,IACvCT,SAAS,CAACU,QAAQ,KAAKT,SAAS,CAACS,QAAQ,IACzCV,SAAS,CAACW,MAAM,KAAKV,SAAS,CAACU,MAAM,IACrCX,SAAS,CAACY,iBAAiB,KAAKX,SAAS,CAACW,iBAAiB,IAC3DZ,SAAS,CAACa,SAAS,KAAKZ,SAAS,CAACY,SAAS,IAC3Cb,SAAS,CAACc,iBAAiB,KAAKb,SAAS,CAACa,iBAAiB,IAC3Dd,SAAS,CAACe,iBAAiB,KAAKd,SAAS,CAACc,iBAAiB,IAC3Df,SAAS,CAACgB,QAAQ,KAAKf,SAAS,CAACe,QAAQ,IACzChB,SAAS,CAACiB,iBAAiB,KAAKhB,SAAS,CAACgB,iBAAiB,IAC3DjB,SAAS,CAACkB,eAAe,KAAKjB,SAAS,CAACiB,eAAe,IACvDlB,SAAS,CAACmB,aAAa,KAAKlB,SAAS,CAACkB,aAAa,IACnDnB,SAAS,CAACoB,kBAAkB,KAAKnB,SAAS,CAACmB,kBAAkB,EAC7D;IACA,OAAO,KAAK;EACd;;EAEA;EACA,IACEpB,SAAS,CAACqB,UAAU,EAAEC,QAAQ,KAAKrB,SAAS,CAACoB,UAAU,EAAEC,QAAQ,IACjEtB,SAAS,CAACqB,UAAU,EAAEE,SAAS,KAAKtB,SAAS,CAACoB,UAAU,EAAEE,SAAS,EACnE;IACA,OAAO,KAAK;EACd;;EAEA;EACA,IACEvB,SAAS,CAACwB,MAAM,EAAEC,CAAC,KAAKxB,SAAS,CAACuB,MAAM,EAAEC,CAAC,IAC3CzB,SAAS,CAACwB,MAAM,EAAEE,CAAC,KAAKzB,SAAS,CAACuB,MAAM,EAAEE,CAAC,EAC3C;IACA,OAAO,KAAK;EACd;EAEA,IACE,CAAC5B,cAAc,CAACE,SAAS,CAAC2B,eAAe,EAAE1B,SAAS,CAAC0B,eAAe,CAAC,IACrE,CAAC7B,cAAc,CAACE,SAAS,CAAC4B,SAAS,EAAE3B,SAAS,CAAC2B,SAAS,CAAC,IACzD,CAAC9B,cAAc,CACbE,SAAS,CAAC6B,uBAAuB,EACjC5B,SAAS,CAAC4B,uBACZ,CAAC,IACD,CAAC/B,cAAc,CAACE,SAAS,CAAC8B,iBAAiB,EAAE7B,SAAS,CAAC6B,iBAAiB,CAAC,EACzE;IACA,OAAO,KAAK;EACd;EAEA,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,WAAW,gBAAGtC,IAAI,CAAC,SAASsC,WAAWA,CAAC;EACnD;EACAV,UAAU;EACVlB,KAAK;EAEL;EACAD,EAAE;EAEF;EACAE,QAAQ;EACRC,QAAQ,GAAG,KAAK;EAChBsB,eAAe;EACfC,SAAS;EACTZ,QAAQ,GAAG,EAAE;EACb;EACAa,uBAAuB;EACvBC,iBAAiB;EACjBb,iBAAiB;EACjBC,eAAe;EACfC,aAAa;EAEb;EACAb,KAAK;EACLC,WAAW;EACXC,SAAS,GAAG,KAAK;EACjBC,OAAO,GAAG,CAAC;EACXC,QAAQ,GAAG,CAAC;EACZC,MAAM,GAAG,CAAC;EACVa,MAAM,GAAG;IAAEC,CAAC,EAAE,GAAG;IAAEC,CAAC,EAAE;EAAI,CAAC;EAC3Bd,iBAAiB,GAAG,IAAI;EACxBC,SAAS,GAAG,MAAM;EAClBC,iBAAiB,GAAG,GAAG;EACvBC,iBAAiB,GAAG,IAAI;EACxBK,kBAAkB;EAElB;EACAY,OAAO;EACPC,WAAW;EACXC,MAAM;EACNC;AACgB,CAAC,EAAE;EACnB;EACA,MAAMC,iBAAiB,GAAG1C,WAAW,CAAC,MAAM;IAC1C;IACA,OAAO;MACL2C,KAAK,EAAE,aAAsB;MAC7BC,WAAW,EAAE;QACXnC,KAAK;QACLC,QAAQ,EAAEA,QAAQ,IAAI,EAAE;QAAE;QAC1BC,QAAQ;QACRsB,eAAe,EAAE9B,UAAU,CAAC8B,eAAe,CAAC;QAC5CE,uBAAuB,EAAEhC,UAAU,CAACgC,uBAAuB,CAAC;QAC5DD,SAAS,EAAE/B,UAAU,CAAC+B,SAAS,CAAC;QAChCE,iBAAiB,EAAEjC,UAAU,CAACiC,iBAAiB,CAAC;QAChDd,QAAQ;QACRC,iBAAiB;QACjBC,eAAe;QACfC;MACF;IACF,CAAC;EACH,CAAC,EAAE,CACDhB,KAAK,EACLC,QAAQ,EACRC,QAAQ,EACRsB,eAAe,EACfC,SAAS,EACTZ,QAAQ,EACRa,uBAAuB,EACvBC,iBAAiB,EACjBb,iBAAiB,EACjBC,eAAe,EACfC,aAAa,CACd,CAAC;;EAEF;EACA,MAAMoB,QAAQ,GAAG3C,iBAAiB,CAACoC,OAAO,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,CAAC;;EAE3E;EACA,MAAMK,eAAe,GAAG9C,WAAW,CAChC+C,QAAgB,KAAM;IACrBvC,EAAE,EAAEuC,QAAQ;IACZpB,UAAU;IACVf,KAAK;IACLC,WAAW;IACXC,SAAS;IACTC,OAAO;IACPC,QAAQ;IACRC,MAAM;IACNa,MAAM;IACNZ,iBAAiB;IACjB8B,MAAM,EAAEN,iBAAiB,CAAC,CAAC;IAC3BhB,kBAAkB;IAClBP,SAAS;IACTC,iBAAiB;IACjBC;EACF,CAAC,CAAC,EACF,CACEM,UAAU,EACVf,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,QAAQ,EACRC,MAAM,EACNa,MAAM,EACNZ,iBAAiB,EACjBwB,iBAAiB,EACjBhB,kBAAkB,EAClBP,SAAS,EACTC,iBAAiB,EACjBC,iBAAiB,CAErB,CAAC;;EAED;EACApB,cAAc,CAAC;IACbgD,QAAQ,EAAE,cAAc;IACxBC,UAAU,EAAE1C,EAAE;IACdqC,QAAQ;IACRC;EACF,CAAC,CAAC;;EAEF;EACA,OAAO,IAAI;AACb,CAAC,EAAEzC,aAAa,CAAC;AAEjB,eAAegC,WAAW","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","NitroMapContext","displayName"],"sourceRoot":"../../../src","sources":["context/NitroMapContext.tsx"],"mappings":";;AAAA;AACA,SAASA,aAAa,QAAQ,OAAO;;AAIrC;;AAQA;;AAeA;AACA,OAAO,MAAMC,eAAe,gBAAGD,aAAa,CAA8B,IAAI,CAAC;;AAE/E;AACAC,eAAe,CAACC,WAAW,GAAG,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["createContext","NitroMapContext","displayName"],"sourceRoot":"../../../src","sources":["context/NitroMapContext.tsx"],"mappings":";;AAAA;AACA,SAASA,aAAa,QAAQ,OAAO;;AAIrC;;AAQA;;AAmBA;AACA,OAAO,MAAMC,eAAe,gBAAGD,aAAa,CAA8B,IAAI,CAAC;;AAE/E;AACAC,eAAe,CAACC,WAAW,GAAG,iBAAiB","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ // src/hooks/useNitroCircle.ts
4
+ import { useCallback } from 'react';
5
+ import { useNitroOverlay } from "./useNitroOverlay.js";
6
+ /**
7
+ * Hook for circle lifecycle management.
8
+ * Adds circle on mount, updates on prop changes, removes on unmount.
9
+ */
10
+ export function useNitroCircle(buildCircleData) {
11
+ const getMethods = useCallback(mapRef => ({
12
+ add: data => mapRef.addCircle(data),
13
+ update: data => mapRef.updateCircle(data),
14
+ remove: id => mapRef.removeCircle(id)
15
+ }), []);
16
+ useNitroOverlay(buildCircleData, getMethods);
17
+ }
18
+ //# sourceMappingURL=useNitroCircle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useNitroOverlay","useNitroCircle","buildCircleData","getMethods","mapRef","add","data","addCircle","update","updateCircle","remove","id","removeCircle"],"sourceRoot":"../../../src","sources":["hooks/useNitroCircle.ts"],"mappings":";;AAAA;AACA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,eAAe,QAAQ,sBAAmB;AAGnD;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAACC,eAAiC,EAAQ;EACtE,MAAMC,UAAU,GAAGJ,WAAW,CAC3BK,MAIA,KAAM;IACLC,GAAG,EAAGC,IAAgB,IAAKF,MAAM,CAACG,SAAS,CAACD,IAAI,CAAC;IACjDE,MAAM,EAAGF,IAAgB,IAAKF,MAAM,CAACK,YAAY,CAACH,IAAI,CAAC;IACvDI,MAAM,EAAGC,EAAU,IAAKP,MAAM,CAACQ,YAAY,CAACD,EAAE;EAChD,CAAC,CAAC,EACF,EACF,CAAC;EAEDX,eAAe,CAACE,eAAe,EAAEC,UAAU,CAAC;AAC9C","ignoreList":[]}
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  // src/hooks/useNitroMarker.ts
4
- import { useContext, useEffect, useRef, useCallback } from 'react';
4
+ import { useContext, useEffect, useRef, useMemo } from 'react';
5
5
  import { NitroMapContext } from "../context/NitroMapContext.js";
6
+ import { validateCoordinate } from "../utils/validation.js";
6
7
 
7
8
  /**
8
9
  * Base marker data structure for internal use
@@ -12,9 +13,10 @@ import { NitroMapContext } from "../context/NitroMapContext.js";
12
13
  * Props shared by all marker components
13
14
  */
14
15
 
15
- // ID generator
16
+ // Module-level monotonic counter for generating unique marker IDs.
17
+ // Monotonically increasing — guaranteed unique within a JS runtime session.
16
18
  let markerIdCounter = 0;
17
- const generateMarkerId = prefix => `${prefix}_${++markerIdCounter}_${Date.now()}`;
19
+ const generateMarkerId = prefix => `${prefix}_${++markerIdCounter}`;
18
20
 
19
21
  /**
20
22
  * Hook options for useNitroMarker
@@ -42,7 +44,9 @@ export function useNitroMarker({
42
44
  // ============ Register Event Handlers ============
43
45
  useEffect(() => {
44
46
  if (!mapContext) {
45
- console.warn(`${idPrefix} must be used inside NitroMap`);
47
+ if (__DEV__) {
48
+ console.warn(`${idPrefix} must be used inside NitroMap`);
49
+ }
46
50
  return;
47
51
  }
48
52
 
@@ -53,7 +57,8 @@ export function useNitroMarker({
53
57
  return () => {
54
58
  mapContext.unregisterMarkerHandler(markerId);
55
59
  };
56
- // We intentionally depend on individual handler properties instead of the handlers object
60
+ // Handlers are spread into individual deps so the effect re-runs
61
+ // only when a specific handler changes, not when the object ref changes.
57
62
  // eslint-disable-next-line react-hooks/exhaustive-deps
58
63
  }, [markerId, mapContext, handlers.onPress, handlers.onDragStart, handlers.onDrag, handlers.onDragEnd, idPrefix]);
59
64
 
@@ -65,15 +70,25 @@ export function useNitroMarker({
65
70
  return;
66
71
  }
67
72
 
73
+ // Track marker ID for duplicate detection
74
+ mapContext?.trackMarkerId(markerId);
75
+
76
+ // Validate coordinate in dev mode
77
+ const markerData = buildMarkerData(markerId);
78
+ validateCoordinate(markerData.coordinate, `marker "${markerId}"`);
79
+
68
80
  // Add marker on mount
69
- mapRef.addMarker(buildMarkerData(markerId));
81
+ mapRef.addMarker(markerData);
70
82
  isAddedRef.current = true;
71
83
 
72
84
  // Remove marker only on unmount
73
85
  return () => {
86
+ mapContext?.untrackMarkerId(markerId);
74
87
  mapRef?.removeMarker(markerId);
75
88
  isAddedRef.current = false;
76
89
  };
90
+ // buildMarkerData is intentionally excluded — we only want mount/unmount behavior.
91
+ // Updates are handled by the third useEffect below.
77
92
  // eslint-disable-next-line react-hooks/exhaustive-deps
78
93
  }, [mapRef, markerId]); // mapRef is now properly tracked
79
94
 
@@ -85,7 +100,9 @@ export function useNitroMarker({
85
100
  }
86
101
 
87
102
  // Update marker with new data
88
- mapContext.mapRef.updateMarker(buildMarkerData(markerId));
103
+ const updatedData = buildMarkerData(markerId);
104
+ validateCoordinate(updatedData.coordinate, `marker "${markerId}"`);
105
+ mapContext.mapRef.updateMarker(updatedData);
89
106
  }, [mapContext, buildMarkerData, markerId]);
90
107
  return markerId;
91
108
  }
@@ -94,11 +111,11 @@ export function useNitroMarker({
94
111
  * Create stable handlers object that won't cause unnecessary re-renders
95
112
  */
96
113
  export function useMarkerHandlers(onPress, onDragStart, onDrag, onDragEnd) {
97
- return useCallback(() => ({
114
+ return useMemo(() => ({
98
115
  onPress,
99
116
  onDragStart,
100
117
  onDrag,
101
118
  onDragEnd
102
- }), [onPress, onDragStart, onDrag, onDragEnd])();
119
+ }), [onPress, onDragStart, onDrag, onDragEnd]);
103
120
  }
104
121
  //# sourceMappingURL=useNitroMarker.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useContext","useEffect","useRef","useCallback","NitroMapContext","markerIdCounter","generateMarkerId","prefix","Date","now","useNitroMarker","idPrefix","providedId","handlers","buildMarkerData","markerId","current","mapContext","isAddedRef","console","warn","registerMarkerHandler","unregisterMarkerHandler","onPress","onDragStart","onDrag","onDragEnd","mapRef","addMarker","removeMarker","updateMarker","useMarkerHandlers"],"sourceRoot":"../../../src","sources":["hooks/useNitroMarker.ts"],"mappings":";;AAAA;AACA,SAASA,UAAU,EAAEC,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAClE,SACEC,eAAe,QAEV,+BAA4B;;AAInC;AACA;AACA;;AAgBA;AACA;AACA;;AAgDA;AACA,IAAIC,eAAe,GAAG,CAAC;AACvB,MAAMC,gBAAgB,GAAIC,MAAc,IACtC,GAAGA,MAAM,IAAI,EAAEF,eAAe,IAAIG,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;;AAEhD;AACA;AACA;;AAeA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAC;EAC7BC,QAAQ;EACRC,UAAU;EACVC,QAAQ;EACRC;AACqB,CAAC,EAAU;EAChC;EACA,MAAMC,QAAQ,GAAGb,MAAM,CAACU,UAAU,IAAIN,gBAAgB,CAACK,QAAQ,CAAC,CAAC,CAACK,OAAO;;EAEzE;EACA,MAAMC,UAAU,GAAGjB,UAAU,CAACI,eAAe,CAAC;;EAE9C;EACA,MAAMc,UAAU,GAAGhB,MAAM,CAAC,KAAK,CAAC;;EAEhC;EACAD,SAAS,CAAC,MAAM;IACd,IAAI,CAACgB,UAAU,EAAE;MACfE,OAAO,CAACC,IAAI,CAAC,GAAGT,QAAQ,+BAA+B,CAAC;MACxD;IACF;;IAEA;IACAM,UAAU,CAACI,qBAAqB,CAACN,QAAQ,EAAEF,QAAQ,CAAC;;IAEpD;IACA,OAAO,MAAM;MACXI,UAAU,CAACK,uBAAuB,CAACP,QAAQ,CAAC;IAC9C,CAAC;IACD;IACA;EACF,CAAC,EAAE,CACDA,QAAQ,EACRE,UAAU,EACVJ,QAAQ,CAACU,OAAO,EAChBV,QAAQ,CAACW,WAAW,EACpBX,QAAQ,CAACY,MAAM,EACfZ,QAAQ,CAACa,SAAS,EAClBf,QAAQ,CACT,CAAC;;EAEF;EACA;EACA,MAAMgB,MAAM,GAAGV,UAAU,EAAEU,MAAM;EAEjC1B,SAAS,CAAC,MAAM;IACd,IAAI,CAAC0B,MAAM,EAAE;MACX;IACF;;IAEA;IACAA,MAAM,CAACC,SAAS,CAACd,eAAe,CAACC,QAAQ,CAAC,CAAC;IAC3CG,UAAU,CAACF,OAAO,GAAG,IAAI;;IAEzB;IACA,OAAO,MAAM;MACXW,MAAM,EAAEE,YAAY,CAACd,QAAQ,CAAC;MAC9BG,UAAU,CAACF,OAAO,GAAG,KAAK;IAC5B,CAAC;IACD;EACF,CAAC,EAAE,CAACW,MAAM,EAAEZ,QAAQ,CAAC,CAAC,CAAC,CAAC;;EAExB;EACAd,SAAS,CAAC,MAAM;IACd;IACA,IAAI,CAACiB,UAAU,CAACF,OAAO,IAAI,CAACC,UAAU,EAAEU,MAAM,EAAE;MAC9C;IACF;;IAEA;IACAV,UAAU,CAACU,MAAM,CAACG,YAAY,CAAChB,eAAe,CAACC,QAAQ,CAAC,CAAC;EAC3D,CAAC,EAAE,CAACE,UAAU,EAAEH,eAAe,EAAEC,QAAQ,CAAC,CAAC;EAE3C,OAAOA,QAAQ;AACjB;;AAEA;AACA;AACA;AACA,OAAO,SAASgB,iBAAiBA,CAC/BR,OAAoB,EACpBC,WAA8C,EAC9CC,MAAyC,EACzCC,SAA4C,EAC5B;EAChB,OAAOvB,WAAW,CAChB,OAAO;IACLoB,OAAO;IACPC,WAAW;IACXC,MAAM;IACNC;EACF,CAAC,CAAC,EACF,CAACH,OAAO,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,CAC1C,CAAC,CAAC,CAAC;AACL","ignoreList":[]}
1
+ {"version":3,"names":["useContext","useEffect","useRef","useMemo","NitroMapContext","validateCoordinate","markerIdCounter","generateMarkerId","prefix","useNitroMarker","idPrefix","providedId","handlers","buildMarkerData","markerId","current","mapContext","isAddedRef","__DEV__","console","warn","registerMarkerHandler","unregisterMarkerHandler","onPress","onDragStart","onDrag","onDragEnd","mapRef","trackMarkerId","markerData","coordinate","addMarker","untrackMarkerId","removeMarker","updatedData","updateMarker","useMarkerHandlers"],"sourceRoot":"../../../src","sources":["hooks/useNitroMarker.ts"],"mappings":";;AAAA;AACA,SAASA,UAAU,EAAEC,SAAS,EAAEC,MAAM,EAAEC,OAAO,QAAQ,OAAO;AAC9D,SACEC,eAAe,QAEV,+BAA4B;AAGnC,SAASC,kBAAkB,QAAQ,wBAAqB;;AAExD;AACA;AACA;;AAmBA;AACA;AACA;;AAoEA;AACA;AACA,IAAIC,eAAe,GAAG,CAAC;AACvB,MAAMC,gBAAgB,GAAIC,MAAc,IAAK,GAAGA,MAAM,IAAI,EAAEF,eAAe,EAAE;;AAE7E;AACA;AACA;;AAeA;AACA;AACA;AACA;AACA,OAAO,SAASG,cAAcA,CAAC;EAC7BC,QAAQ;EACRC,UAAU;EACVC,QAAQ;EACRC;AACqB,CAAC,EAAU;EAChC;EACA,MAAMC,QAAQ,GAAGZ,MAAM,CAACS,UAAU,IAAIJ,gBAAgB,CAACG,QAAQ,CAAC,CAAC,CAACK,OAAO;;EAEzE;EACA,MAAMC,UAAU,GAAGhB,UAAU,CAACI,eAAe,CAAC;;EAE9C;EACA,MAAMa,UAAU,GAAGf,MAAM,CAAC,KAAK,CAAC;;EAEhC;EACAD,SAAS,CAAC,MAAM;IACd,IAAI,CAACe,UAAU,EAAE;MACf,IAAIE,OAAO,EAAE;QACXC,OAAO,CAACC,IAAI,CAAC,GAAGV,QAAQ,+BAA+B,CAAC;MAC1D;MACA;IACF;;IAEA;IACAM,UAAU,CAACK,qBAAqB,CAACP,QAAQ,EAAEF,QAAQ,CAAC;;IAEpD;IACA,OAAO,MAAM;MACXI,UAAU,CAACM,uBAAuB,CAACR,QAAQ,CAAC;IAC9C,CAAC;IACD;IACA;IACA;EACF,CAAC,EAAE,CACDA,QAAQ,EACRE,UAAU,EACVJ,QAAQ,CAACW,OAAO,EAChBX,QAAQ,CAACY,WAAW,EACpBZ,QAAQ,CAACa,MAAM,EACfb,QAAQ,CAACc,SAAS,EAClBhB,QAAQ,CACT,CAAC;;EAEF;EACA;EACA,MAAMiB,MAAM,GAAGX,UAAU,EAAEW,MAAM;EAEjC1B,SAAS,CAAC,MAAM;IACd,IAAI,CAAC0B,MAAM,EAAE;MACX;IACF;;IAEA;IACAX,UAAU,EAAEY,aAAa,CAACd,QAAQ,CAAC;;IAEnC;IACA,MAAMe,UAAU,GAAGhB,eAAe,CAACC,QAAQ,CAAC;IAC5CT,kBAAkB,CAACwB,UAAU,CAACC,UAAU,EAAE,WAAWhB,QAAQ,GAAG,CAAC;;IAEjE;IACAa,MAAM,CAACI,SAAS,CAACF,UAAU,CAAC;IAC5BZ,UAAU,CAACF,OAAO,GAAG,IAAI;;IAEzB;IACA,OAAO,MAAM;MACXC,UAAU,EAAEgB,eAAe,CAAClB,QAAQ,CAAC;MACrCa,MAAM,EAAEM,YAAY,CAACnB,QAAQ,CAAC;MAC9BG,UAAU,CAACF,OAAO,GAAG,KAAK;IAC5B,CAAC;IACD;IACA;IACA;EACF,CAAC,EAAE,CAACY,MAAM,EAAEb,QAAQ,CAAC,CAAC,CAAC,CAAC;;EAExB;EACAb,SAAS,CAAC,MAAM;IACd;IACA,IAAI,CAACgB,UAAU,CAACF,OAAO,IAAI,CAACC,UAAU,EAAEW,MAAM,EAAE;MAC9C;IACF;;IAEA;IACA,MAAMO,WAAW,GAAGrB,eAAe,CAACC,QAAQ,CAAC;IAC7CT,kBAAkB,CAAC6B,WAAW,CAACJ,UAAU,EAAE,WAAWhB,QAAQ,GAAG,CAAC;IAClEE,UAAU,CAACW,MAAM,CAACQ,YAAY,CAACD,WAAW,CAAC;EAC7C,CAAC,EAAE,CAAClB,UAAU,EAAEH,eAAe,EAAEC,QAAQ,CAAC,CAAC;EAE3C,OAAOA,QAAQ;AACjB;;AAEA;AACA;AACA;AACA,OAAO,SAASsB,iBAAiBA,CAC/Bb,OAAoB,EACpBC,WAA8C,EAC9CC,MAAyC,EACzCC,SAA4C,EAC5B;EAChB,OAAOvB,OAAO,CACZ,OAAO;IACLoB,OAAO;IACPC,WAAW;IACXC,MAAM;IACNC;EACF,CAAC,CAAC,EACF,CAACH,OAAO,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,CAC1C,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ // src/hooks/useNitroOverlay.ts
4
+ import { useContext, useEffect, useRef } from 'react';
5
+ import { NitroMapContext } from "../context/NitroMapContext.js";
6
+
7
+ /**
8
+ * Overlay method names used by the generic hook.
9
+ * Maps each overlay type to its add/update/remove native methods.
10
+ */
11
+
12
+ /**
13
+ * Generic hook for overlay lifecycle management (polyline, polygon, circle).
14
+ * Adds overlay on mount, updates on prop changes, removes on unmount.
15
+ *
16
+ * Eliminates copy-paste between useNitroPolyline/useNitroPolygon/useNitroCircle.
17
+ *
18
+ * @param buildData - Memoized function that builds the overlay data object.
19
+ * @param getMethods - Function that extracts add/update/remove methods from the map ref.
20
+ */
21
+ export function useNitroOverlay(buildData, getMethods) {
22
+ const mapContext = useContext(NitroMapContext);
23
+ const isAddedRef = useRef(false);
24
+ const idRef = useRef(null);
25
+ const isInitialMount = useRef(true);
26
+ const mapRef = mapContext?.mapRef;
27
+
28
+ // Add on mount, remove on unmount.
29
+ // buildData is intentionally excluded from deps — we only want mount/unmount behavior.
30
+ // Updates are handled by the second useEffect below.
31
+ useEffect(() => {
32
+ if (!mapRef) return;
33
+ const data = buildData();
34
+ const methods = getMethods(mapRef);
35
+ idRef.current = data.id;
36
+ methods.add(data);
37
+ isAddedRef.current = true;
38
+ return () => {
39
+ if (idRef.current) {
40
+ methods.remove(idRef.current);
41
+ }
42
+ isAddedRef.current = false;
43
+ };
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ }, [mapRef]);
46
+
47
+ // Update when props change (buildData reference changes on prop changes via useCallback).
48
+ // Skip the initial mount — the first useEffect already added the overlay.
49
+ useEffect(() => {
50
+ if (isInitialMount.current) {
51
+ isInitialMount.current = false;
52
+ return;
53
+ }
54
+ if (!isAddedRef.current || !mapContext?.mapRef) return;
55
+ const methods = getMethods(mapContext.mapRef);
56
+ methods.update(buildData());
57
+ }, [mapContext, buildData, getMethods]);
58
+ }
59
+ //# sourceMappingURL=useNitroOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useEffect","useRef","NitroMapContext","useNitroOverlay","buildData","getMethods","mapContext","isAddedRef","idRef","isInitialMount","mapRef","data","methods","current","id","add","remove","update"],"sourceRoot":"../../../src","sources":["hooks/useNitroOverlay.ts"],"mappings":";;AAAA;AACA,SAASA,UAAU,EAAEC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACrD,SAASC,eAAe,QAAQ,+BAA4B;;AAG5D;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,SAAkB,EAClBC,UAA0D,EACpD;EACN,MAAMC,UAAU,GAAGP,UAAU,CAACG,eAAe,CAAC;EAC9C,MAAMK,UAAU,GAAGN,MAAM,CAAC,KAAK,CAAC;EAChC,MAAMO,KAAK,GAAGP,MAAM,CAAgB,IAAI,CAAC;EACzC,MAAMQ,cAAc,GAAGR,MAAM,CAAC,IAAI,CAAC;EAEnC,MAAMS,MAAM,GAAGJ,UAAU,EAAEI,MAAM;;EAEjC;EACA;EACA;EACAV,SAAS,CAAC,MAAM;IACd,IAAI,CAACU,MAAM,EAAE;IAEb,MAAMC,IAAI,GAAGP,SAAS,CAAC,CAAC;IACxB,MAAMQ,OAAO,GAAGP,UAAU,CAACK,MAAM,CAAC;IAClCF,KAAK,CAACK,OAAO,GAAGF,IAAI,CAACG,EAAE;IACvBF,OAAO,CAACG,GAAG,CAACJ,IAAI,CAAC;IACjBJ,UAAU,CAACM,OAAO,GAAG,IAAI;IAEzB,OAAO,MAAM;MACX,IAAIL,KAAK,CAACK,OAAO,EAAE;QACjBD,OAAO,CAACI,MAAM,CAACR,KAAK,CAACK,OAAO,CAAC;MAC/B;MACAN,UAAU,CAACM,OAAO,GAAG,KAAK;IAC5B,CAAC;IACD;EACF,CAAC,EAAE,CAACH,MAAM,CAAC,CAAC;;EAEZ;EACA;EACAV,SAAS,CAAC,MAAM;IACd,IAAIS,cAAc,CAACI,OAAO,EAAE;MAC1BJ,cAAc,CAACI,OAAO,GAAG,KAAK;MAC9B;IACF;IACA,IAAI,CAACN,UAAU,CAACM,OAAO,IAAI,CAACP,UAAU,EAAEI,MAAM,EAAE;IAChD,MAAME,OAAO,GAAGP,UAAU,CAACC,UAAU,CAACI,MAAM,CAAC;IAC7CE,OAAO,CAACK,MAAM,CAACb,SAAS,CAAC,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACE,UAAU,EAAEF,SAAS,EAAEC,UAAU,CAAC,CAAC;AACzC","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ // src/hooks/useNitroPolygon.ts
4
+ import { useCallback } from 'react';
5
+ import { useNitroOverlay } from "./useNitroOverlay.js";
6
+ /**
7
+ * Hook for polygon lifecycle management.
8
+ * Adds polygon on mount, updates on prop changes, removes on unmount.
9
+ */
10
+ export function useNitroPolygon(buildPolygonData) {
11
+ const getMethods = useCallback(mapRef => ({
12
+ add: data => mapRef.addPolygon(data),
13
+ update: data => mapRef.updatePolygon(data),
14
+ remove: id => mapRef.removePolygon(id)
15
+ }), []);
16
+ useNitroOverlay(buildPolygonData, getMethods);
17
+ }
18
+ //# sourceMappingURL=useNitroPolygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useNitroOverlay","useNitroPolygon","buildPolygonData","getMethods","mapRef","add","data","addPolygon","update","updatePolygon","remove","id","removePolygon"],"sourceRoot":"../../../src","sources":["hooks/useNitroPolygon.ts"],"mappings":";;AAAA;AACA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,eAAe,QAAQ,sBAAmB;AAGnD;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAACC,gBAAmC,EAAQ;EACzE,MAAMC,UAAU,GAAGJ,WAAW,CAC3BK,MAIA,KAAM;IACLC,GAAG,EAAGC,IAAiB,IAAKF,MAAM,CAACG,UAAU,CAACD,IAAI,CAAC;IACnDE,MAAM,EAAGF,IAAiB,IAAKF,MAAM,CAACK,aAAa,CAACH,IAAI,CAAC;IACzDI,MAAM,EAAGC,EAAU,IAAKP,MAAM,CAACQ,aAAa,CAACD,EAAE;EACjD,CAAC,CAAC,EACF,EACF,CAAC;EAEDX,eAAe,CAACE,gBAAgB,EAAEC,UAAU,CAAC;AAC/C","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ // src/hooks/useNitroPolyline.ts
4
+ import { useCallback } from 'react';
5
+ import { useNitroOverlay } from "./useNitroOverlay.js";
6
+ /**
7
+ * Hook for polyline lifecycle management.
8
+ * Adds polyline on mount, updates on prop changes, removes on unmount.
9
+ */
10
+ export function useNitroPolyline(buildPolylineData) {
11
+ const getMethods = useCallback(mapRef => ({
12
+ add: data => mapRef.addPolyline(data),
13
+ update: data => mapRef.updatePolyline(data),
14
+ remove: id => mapRef.removePolyline(id)
15
+ }), []);
16
+ useNitroOverlay(buildPolylineData, getMethods);
17
+ }
18
+ //# sourceMappingURL=useNitroPolyline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useNitroOverlay","useNitroPolyline","buildPolylineData","getMethods","mapRef","add","data","addPolyline","update","updatePolyline","remove","id","removePolyline"],"sourceRoot":"../../../src","sources":["hooks/useNitroPolyline.ts"],"mappings":";;AAAA;AACA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,eAAe,QAAQ,sBAAmB;AAGnD;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,iBAAqC,EAAQ;EAC5E,MAAMC,UAAU,GAAGJ,WAAW,CAC3BK,MAIA,KAAM;IACLC,GAAG,EAAGC,IAAkB,IAAKF,MAAM,CAACG,WAAW,CAACD,IAAI,CAAC;IACrDE,MAAM,EAAGF,IAAkB,IAAKF,MAAM,CAACK,cAAc,CAACH,IAAI,CAAC;IAC3DI,MAAM,EAAGC,EAAU,IAAKP,MAAM,CAACQ,cAAc,CAACD,EAAE;EAClD,CAAC,CAAC,EACF,EACF,CAAC;EAEDX,eAAe,CAACE,iBAAiB,EAAEC,UAAU,CAAC;AAChD","ignoreList":[]}
@@ -8,9 +8,14 @@ export { NitroMap, default } from "./components/NitroMap.js";
8
8
  // New specialized marker components
9
9
  export { PriceMarker } from "./components/PriceMarker.js";
10
10
  export { ImageMarker } from "./components/ImageMarker.js";
11
+ export { Marker } from "./components/Marker.js";
12
+ export { NitroPolyline } from "./components/NitroPolyline.js";
13
+ export { NitroPolygon } from "./components/NitroPolygon.js";
14
+ export { NitroCircle } from "./components/NitroCircle.js";
11
15
 
12
16
  // ============ Types ============
13
17
 
18
+ export { NitroMapContext } from "./context/NitroMapContext.js";
14
19
  export { NitroMapInitialize, IsNitroMapInitialized, getDefaultProvider } from "./modules/index.js";
15
20
 
16
21
  // Marker component props
@@ -1 +1 @@
1
- {"version":3,"names":["NitroMap","default","PriceMarker","ImageMarker","NitroMapInitialize","IsNitroMapInitialized","getDefaultProvider","rgb","hex","Colors"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;;AAEA;AACA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,0BAAuB;;AAEzD;AACA,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,WAAW,QAAQ,6BAA0B;;AAEtD;;AAqCA,SACEC,kBAAkB,EAClBC,qBAAqB,EACrBC,kBAAkB,QAEb,oBAAW;;AAElB;;AAKA;AACA;AACA,SAASC,GAAG,EAAEC,GAAG,EAAEC,MAAM,QAAQ,mBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["NitroMap","default","PriceMarker","ImageMarker","Marker","NitroPolyline","NitroPolygon","NitroCircle","NitroMapContext","NitroMapInitialize","IsNitroMapInitialized","getDefaultProvider","rgb","hex","Colors"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;;AAEA;AACA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,0BAAuB;;AAEzD;AACA,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,MAAM,QAAQ,wBAAqB;AAC5C,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,YAAY,QAAQ,8BAA2B;AACxD,SAASC,WAAW,QAAQ,6BAA0B;;AAEtD;;AAGA,SAASC,eAAe,QAAQ,8BAA2B;AA+C3D,SACEC,kBAAkB,EAClBC,qBAAqB,EACrBC,kBAAkB,QAEb,oBAAW;;AAElB;;AASA;AACA;AACA,SAASC,GAAG,EAAEC,GAAG,EAAEC,MAAM,QAAQ,mBAAgB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/overlay.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/theme.ts"],"mappings":"","ignoreList":[]}
@@ -43,18 +43,6 @@ export const parseColor = (color, defaultAlpha = 255) => {
43
43
  return undefined;
44
44
  };
45
45
 
46
- /**
47
- * Parse a ColorValue with a fallback default color
48
- * @param color - Color value (hex string or MarkerColor)
49
- * @param fallback - Fallback MarkerColor if parsing fails
50
- * @returns MarkerColor object
51
- * @internal
52
- */
53
- export const parseColorWithFallback = (color, fallback) => {
54
- const parsed = parseColor(color);
55
- return parsed ?? fallback;
56
- };
57
-
58
46
  /**
59
47
  * Create a MarkerColor from RGB values
60
48
  * @param r - Red component (0-255)
@@ -88,7 +76,18 @@ export const rgb = (r, g, b, a = 255) => ({
88
76
  * ```
89
77
  */
90
78
  export const hex = (hexStr, alpha = 255) => {
91
- // Try 6-char hex first (#RRGGBB or RRGGBB)
79
+ // Try 8-char hex first (#RRGGBBAA or RRGGBBAA)
80
+ const result8 = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexStr);
81
+ if (result8) {
82
+ return {
83
+ r: parseInt(result8[1], 16),
84
+ g: parseInt(result8[2], 16),
85
+ b: parseInt(result8[3], 16),
86
+ a: parseInt(result8[4], 16)
87
+ };
88
+ }
89
+
90
+ // Try 6-char hex (#RRGGBB or RRGGBB)
92
91
  const result6 = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexStr);
93
92
  if (result6) {
94
93
  return {
@@ -99,6 +98,17 @@ export const hex = (hexStr, alpha = 255) => {
99
98
  };
100
99
  }
101
100
 
101
+ // Try 4-char hex (#RGBA or RGBA)
102
+ const result4 = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i.exec(hexStr);
103
+ if (result4) {
104
+ return {
105
+ r: parseInt(result4[1] + result4[1], 16),
106
+ g: parseInt(result4[2] + result4[2], 16),
107
+ b: parseInt(result4[3] + result4[3], 16),
108
+ a: parseInt(result4[4] + result4[4], 16)
109
+ };
110
+ }
111
+
102
112
  // Try 3-char hex (#RGB or RGB)
103
113
  const result3 = /^#?([a-f\d])([a-f\d])([a-f\d])$/i.exec(hexStr);
104
114
  if (result3) {
@@ -111,6 +121,9 @@ export const hex = (hexStr, alpha = 255) => {
111
121
  }
112
122
 
113
123
  // Fallback to black
124
+ if (__DEV__) {
125
+ console.warn(`hex(): invalid hex color string "${hexStr}". Falling back to black.`);
126
+ }
114
127
  return {
115
128
  r: 0,
116
129
  g: 0,
@@ -144,4 +157,19 @@ export const Colors = {
144
157
  /** Light gray (240, 240, 240) */
145
158
  lightGray: rgb(240, 240, 240)
146
159
  };
160
+
161
+ /**
162
+ * Compare two ColorValue values for equality.
163
+ * Handles both hex strings and MarkerColor objects.
164
+ * @internal Used by component memo comparators to avoid duplication.
165
+ */
166
+ export const areColorsEqual = (a, b) => {
167
+ if (a === b) return true;
168
+ if (!a || !b) return false;
169
+ if (typeof a !== typeof b) return false;
170
+ if (typeof a === 'string' && typeof b === 'string') return a === b;
171
+ const ca = a;
172
+ const cb = b;
173
+ return ca.r === cb.r && ca.g === cb.g && ca.b === cb.b && ca.a === cb.a;
174
+ };
147
175
  //# sourceMappingURL=colors.js.map