react-native-map4d-map-dtqg 0.1.4 → 0.1.6

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 (217) hide show
  1. package/README.md +58 -0
  2. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  3. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  4. package/android/.gradle/buildOutputCleanup/cache.properties +2 -2
  5. package/android/build.gradle +23 -2
  6. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapModule.java +39 -27
  7. package/ios/Map4dMap.h +12 -3
  8. package/ios/Map4dMap.m +108 -3
  9. package/ios/Map4dMapTurbo.mm +16 -0
  10. package/ios/RMFCircleManager.m +40 -68
  11. package/ios/RMFDirectionsRendererManager.m +26 -24
  12. package/ios/RMFMapViewManager.m +64 -149
  13. package/ios/RMFMarkerManager.m +36 -64
  14. package/ios/RMFPOIManager.m +40 -74
  15. package/ios/RMFPolygonManager.m +38 -60
  16. package/ios/RMFPolylineManager.m +36 -58
  17. package/ios/building/RMFBuildingManager.m +36 -64
  18. package/lib/commonjs/components/MFBanDoSo/constants.js +30 -0
  19. package/lib/commonjs/components/MFBanDoSo/constants.js.map +1 -0
  20. package/lib/commonjs/components/MFBanDoSo/helpers.js +200 -0
  21. package/lib/commonjs/components/MFBanDoSo/helpers.js.map +1 -0
  22. package/lib/commonjs/components/MFBanDoSo/propTypes.js +18 -0
  23. package/lib/commonjs/components/MFBanDoSo/propTypes.js.map +1 -0
  24. package/lib/commonjs/components/MFBanDoSo/styles.js +334 -0
  25. package/lib/commonjs/components/MFBanDoSo/styles.js.map +1 -0
  26. package/lib/commonjs/components/MFBanDoSo/ui.js +231 -0
  27. package/lib/commonjs/components/MFBanDoSo/ui.js.map +1 -0
  28. package/lib/commonjs/components/MFBanDoSo.js +201 -73
  29. package/lib/commonjs/components/MFBanDoSo.js.map +1 -1
  30. package/lib/commonjs/components/MFBuilding.js +15 -90
  31. package/lib/commonjs/components/MFBuilding.js.map +1 -1
  32. package/lib/commonjs/components/MFCircle.js +20 -88
  33. package/lib/commonjs/components/MFCircle.js.map +1 -1
  34. package/lib/commonjs/components/MFDirectionsRenderer.js +15 -93
  35. package/lib/commonjs/components/MFDirectionsRenderer.js.map +1 -1
  36. package/lib/commonjs/components/MFMapView.js +50 -147
  37. package/lib/commonjs/components/MFMapView.js.map +1 -1
  38. package/lib/commonjs/components/MFMarker.js +15 -101
  39. package/lib/commonjs/components/MFMarker.js.map +1 -1
  40. package/lib/commonjs/components/MFPOI.js +17 -92
  41. package/lib/commonjs/components/MFPOI.js.map +1 -1
  42. package/lib/commonjs/components/MFPolygon.js +15 -87
  43. package/lib/commonjs/components/MFPolygon.js.map +1 -1
  44. package/lib/commonjs/components/MFPolyline.js +17 -87
  45. package/lib/commonjs/components/MFPolyline.js.map +1 -1
  46. package/lib/commonjs/components/MFTileOverlay.js +7 -15
  47. package/lib/commonjs/components/MFTileOverlay.js.map +1 -1
  48. package/lib/commonjs/components/Map4dMapView.js +1 -4
  49. package/lib/commonjs/components/Map4dMapView.js.map +1 -1
  50. package/lib/commonjs/components/extends/AreaFocusManager.js +4 -38
  51. package/lib/commonjs/components/extends/AreaFocusManager.js.map +1 -1
  52. package/lib/commonjs/components/extends/AreaFocuser.js +1 -17
  53. package/lib/commonjs/components/extends/AreaFocuser.js.map +1 -1
  54. package/lib/commonjs/components/extends/BoundHelper.js +0 -6
  55. package/lib/commonjs/components/extends/BoundHelper.js.map +1 -1
  56. package/lib/commonjs/components/extends/area/AreaFocusAreas.js +0 -37
  57. package/lib/commonjs/components/extends/area/AreaFocusAreas.js.map +1 -1
  58. package/lib/commonjs/components/extends/area/AreaFocusGeometryUtils.js +1 -35
  59. package/lib/commonjs/components/extends/area/AreaFocusGeometryUtils.js.map +1 -1
  60. package/lib/commonjs/components/extends/area/AreaFocusSession.js +0 -18
  61. package/lib/commonjs/components/extends/area/AreaFocusSession.js.map +1 -1
  62. package/lib/commonjs/components/extends/area/AreaFocusTypes.js +2 -3
  63. package/lib/commonjs/components/extends/area/AreaFocusTypes.js.map +1 -1
  64. package/lib/commonjs/components/internal/DefaultRoadmapStyle.js +1 -2
  65. package/lib/commonjs/components/internal/DefaultRoadmapStyle.js.map +1 -1
  66. package/lib/commonjs/components/internal/GeojsonStyleUtils.js +20 -31
  67. package/lib/commonjs/components/internal/GeojsonStyleUtils.js.map +1 -1
  68. package/lib/commonjs/index.js +0 -11
  69. package/lib/commonjs/index.js.map +1 -1
  70. package/lib/commonjs/native/Map4dMapNativeModule.js +10 -0
  71. package/lib/commonjs/native/Map4dMapNativeModule.js.map +1 -0
  72. package/lib/commonjs/native/NativeModuleResolver.js +35 -0
  73. package/lib/commonjs/native/NativeModuleResolver.js.map +1 -0
  74. package/lib/commonjs/native/ViewManagerCommand.js +67 -0
  75. package/lib/commonjs/native/ViewManagerCommand.js.map +1 -0
  76. package/lib/commonjs/package.json +1 -0
  77. package/lib/commonjs/specs/NativeMap4dMap.js +9 -0
  78. package/lib/commonjs/specs/NativeMap4dMap.js.map +1 -0
  79. package/lib/module/components/MFBanDoSo/constants.js +25 -0
  80. package/lib/module/components/MFBanDoSo/constants.js.map +1 -0
  81. package/lib/module/components/MFBanDoSo/helpers.js +188 -0
  82. package/lib/module/components/MFBanDoSo/helpers.js.map +1 -0
  83. package/lib/module/components/MFBanDoSo/propTypes.js +14 -0
  84. package/lib/module/components/MFBanDoSo/propTypes.js.map +1 -0
  85. package/lib/module/components/MFBanDoSo/styles.js +332 -0
  86. package/lib/module/components/MFBanDoSo/styles.js.map +1 -0
  87. package/lib/module/components/MFBanDoSo/ui.js +224 -0
  88. package/lib/module/components/MFBanDoSo/ui.js.map +1 -0
  89. package/lib/module/components/MFBanDoSo.js +203 -63
  90. package/lib/module/components/MFBanDoSo.js.map +1 -1
  91. package/lib/module/components/MFBuilding.js +17 -82
  92. package/lib/module/components/MFBuilding.js.map +1 -1
  93. package/lib/module/components/MFCircle.js +22 -80
  94. package/lib/module/components/MFCircle.js.map +1 -1
  95. package/lib/module/components/MFDirectionsRenderer.js +16 -85
  96. package/lib/module/components/MFDirectionsRenderer.js.map +1 -1
  97. package/lib/module/components/MFMapView.js +51 -136
  98. package/lib/module/components/MFMapView.js.map +1 -1
  99. package/lib/module/components/MFMarker.js +17 -92
  100. package/lib/module/components/MFMarker.js.map +1 -1
  101. package/lib/module/components/MFPOI.js +19 -84
  102. package/lib/module/components/MFPOI.js.map +1 -1
  103. package/lib/module/components/MFPolygon.js +17 -79
  104. package/lib/module/components/MFPolygon.js.map +1 -1
  105. package/lib/module/components/MFPolyline.js +19 -79
  106. package/lib/module/components/MFPolyline.js.map +1 -1
  107. package/lib/module/components/MFTileOverlay.js +10 -9
  108. package/lib/module/components/MFTileOverlay.js.map +1 -1
  109. package/lib/module/components/Map4dMapView.js +2 -0
  110. package/lib/module/components/Map4dMapView.js.map +1 -1
  111. package/lib/module/components/extends/AreaFocusManager.js +6 -32
  112. package/lib/module/components/extends/AreaFocusManager.js.map +1 -1
  113. package/lib/module/components/extends/AreaFocuser.js +3 -15
  114. package/lib/module/components/extends/AreaFocuser.js.map +1 -1
  115. package/lib/module/components/extends/BoundHelper.js +2 -5
  116. package/lib/module/components/extends/BoundHelper.js.map +1 -1
  117. package/lib/module/components/extends/area/AreaFocusAreas.js +2 -33
  118. package/lib/module/components/extends/area/AreaFocusAreas.js.map +1 -1
  119. package/lib/module/components/extends/area/AreaFocusGeometryUtils.js +2 -32
  120. package/lib/module/components/extends/area/AreaFocusGeometryUtils.js.map +1 -1
  121. package/lib/module/components/extends/area/AreaFocusSession.js +2 -17
  122. package/lib/module/components/extends/area/AreaFocusSession.js.map +1 -1
  123. package/lib/module/components/extends/area/AreaFocusTypes.js +3 -0
  124. package/lib/module/components/extends/area/AreaFocusTypes.js.map +1 -1
  125. package/lib/module/components/internal/DefaultRoadmapStyle.js +2 -0
  126. package/lib/module/components/internal/DefaultRoadmapStyle.js.map +1 -1
  127. package/lib/module/components/internal/GeojsonStyleUtils.js +21 -28
  128. package/lib/module/components/internal/GeojsonStyleUtils.js.map +1 -1
  129. package/lib/module/index.js +2 -0
  130. package/lib/module/index.js.map +1 -1
  131. package/lib/module/native/Map4dMapNativeModule.js +5 -0
  132. package/lib/module/native/Map4dMapNativeModule.js.map +1 -0
  133. package/lib/module/native/NativeModuleResolver.js +29 -0
  134. package/lib/module/native/NativeModuleResolver.js.map +1 -0
  135. package/lib/module/native/ViewManagerCommand.js +61 -0
  136. package/lib/module/native/ViewManagerCommand.js.map +1 -0
  137. package/lib/module/specs/NativeMap4dMap.js +5 -0
  138. package/lib/module/specs/NativeMap4dMap.js.map +1 -0
  139. package/lib/typescript/components/MFBanDoSo/constants.d.ts +11 -0
  140. package/lib/typescript/components/MFBanDoSo/constants.d.ts.map +1 -0
  141. package/lib/typescript/components/MFBanDoSo/helpers.d.ts +14 -0
  142. package/lib/typescript/components/MFBanDoSo/helpers.d.ts.map +1 -0
  143. package/lib/typescript/components/MFBanDoSo/propTypes.d.ts +2 -0
  144. package/lib/typescript/components/MFBanDoSo/propTypes.d.ts.map +1 -0
  145. package/lib/typescript/components/MFBanDoSo/styles.d.ts +336 -0
  146. package/lib/typescript/components/MFBanDoSo/styles.d.ts.map +1 -0
  147. package/lib/typescript/components/MFBanDoSo/ui.d.ts +32 -0
  148. package/lib/typescript/components/MFBanDoSo/ui.d.ts.map +1 -0
  149. package/lib/typescript/components/MFBanDoSo.d.ts +38 -0
  150. package/lib/typescript/components/MFBanDoSo.d.ts.map +1 -0
  151. package/lib/typescript/components/MFBuilding.d.ts +24 -0
  152. package/lib/typescript/components/MFBuilding.d.ts.map +1 -0
  153. package/lib/typescript/components/MFCircle.d.ts +24 -0
  154. package/lib/typescript/components/MFCircle.d.ts.map +1 -0
  155. package/lib/typescript/components/MFDirectionsRenderer.d.ts +19 -0
  156. package/lib/typescript/components/MFDirectionsRenderer.d.ts.map +1 -0
  157. package/lib/typescript/components/MFMapView.d.ts +66 -0
  158. package/lib/typescript/components/MFMapView.d.ts.map +1 -0
  159. package/lib/typescript/components/MFMarker.d.ts +26 -0
  160. package/lib/typescript/components/MFMarker.d.ts.map +1 -0
  161. package/lib/typescript/components/MFPOI.d.ts +24 -0
  162. package/lib/typescript/components/MFPOI.d.ts.map +1 -0
  163. package/lib/typescript/components/MFPolygon.d.ts +24 -0
  164. package/lib/typescript/components/MFPolygon.d.ts.map +1 -0
  165. package/lib/typescript/components/MFPolyline.d.ts +24 -0
  166. package/lib/typescript/components/MFPolyline.d.ts.map +1 -0
  167. package/lib/typescript/components/MFTileOverlay.d.ts +12 -0
  168. package/lib/typescript/components/MFTileOverlay.d.ts.map +1 -0
  169. package/lib/typescript/components/Map4dMapView.d.ts +8 -7
  170. package/lib/typescript/components/Map4dMapView.d.ts.map +1 -0
  171. package/lib/typescript/components/extends/AreaFocusManager.d.ts +34 -0
  172. package/lib/typescript/components/extends/AreaFocusManager.d.ts.map +1 -0
  173. package/lib/typescript/components/extends/AreaFocuser.d.ts +15 -0
  174. package/lib/typescript/components/extends/AreaFocuser.d.ts.map +1 -0
  175. package/lib/typescript/components/extends/BoundHelper.d.ts +11 -0
  176. package/lib/typescript/components/extends/BoundHelper.d.ts.map +1 -0
  177. package/lib/typescript/components/extends/area/AreaFocusAreas.d.ts +58 -0
  178. package/lib/typescript/components/extends/area/AreaFocusAreas.d.ts.map +1 -0
  179. package/lib/typescript/components/extends/area/AreaFocusGeometryUtils.d.ts +19 -0
  180. package/lib/typescript/components/extends/area/AreaFocusGeometryUtils.d.ts.map +1 -0
  181. package/lib/typescript/components/extends/area/AreaFocusSession.d.ts +14 -0
  182. package/lib/typescript/components/extends/area/AreaFocusSession.d.ts.map +1 -0
  183. package/lib/typescript/components/extends/area/AreaFocusTypes.d.ts +40 -0
  184. package/lib/typescript/components/extends/area/AreaFocusTypes.d.ts.map +1 -0
  185. package/lib/typescript/components/internal/DefaultRoadmapStyle.d.ts +820 -0
  186. package/lib/typescript/components/internal/DefaultRoadmapStyle.d.ts.map +1 -0
  187. package/lib/typescript/components/internal/GeojsonStyleUtils.d.ts +3 -0
  188. package/lib/typescript/components/internal/GeojsonStyleUtils.d.ts.map +1 -0
  189. package/lib/typescript/index.d.ts +13 -0
  190. package/lib/typescript/index.d.ts.map +1 -0
  191. package/lib/typescript/native/Map4dMapNativeModule.d.ts +2 -0
  192. package/lib/typescript/native/Map4dMapNativeModule.d.ts.map +1 -0
  193. package/lib/typescript/native/NativeModuleResolver.d.ts +3 -0
  194. package/lib/typescript/native/NativeModuleResolver.d.ts.map +1 -0
  195. package/lib/typescript/native/ViewManagerCommand.d.ts +11 -0
  196. package/lib/typescript/native/ViewManagerCommand.d.ts.map +1 -0
  197. package/package.json +27 -11
  198. package/src/components/MFBanDoSo/constants.js +38 -0
  199. package/src/components/MFBanDoSo/helpers.js +273 -0
  200. package/src/components/MFBanDoSo/propTypes.js +14 -0
  201. package/src/components/MFBanDoSo/styles.js +323 -0
  202. package/src/components/MFBanDoSo/ui.js +261 -0
  203. package/src/components/MFBanDoSo.js +280 -78
  204. package/src/components/MFBuilding.js +8 -48
  205. package/src/components/MFCircle.js +8 -48
  206. package/src/components/MFDirectionsRenderer.js +8 -47
  207. package/src/components/MFMapView.js +31 -53
  208. package/src/components/MFMarker.js +9 -50
  209. package/src/components/MFPOI.js +8 -48
  210. package/src/components/MFPolygon.js +8 -48
  211. package/src/components/MFPolyline.js +8 -48
  212. package/src/components/internal/GeojsonStyleUtils.js +3 -0
  213. package/src/native/Map4dMapNativeModule.js +3 -0
  214. package/src/native/NativeModuleResolver.js +33 -0
  215. package/src/native/ViewManagerCommand.js +82 -0
  216. package/src/specs/NativeMap4dMap.js +12 -0
  217. package/ios/Map4dMapViewManager.m +0 -34
@@ -0,0 +1,323 @@
1
+ import { StyleSheet } from 'react-native';
2
+
3
+ // Workaround for a React Native Fabric/Android Yoga bug: an absolutely-positioned
4
+ // view stretched via top+bottom (e.g. StyleSheet.absoluteFillObject) can have its
5
+ // top offset silently dropped, collapsing the view to zero height pinned at the
6
+ // parent's bottom edge. Anchoring with top + height: '100%' instead avoids that
7
+ // code path. Do not replace this with absoluteFillObject/bottom-based stretching.
8
+ const fullFill = {
9
+ position: 'absolute',
10
+ top: 0,
11
+ left: 0,
12
+ right: 0,
13
+ height: '100%',
14
+ };
15
+
16
+ const styles = StyleSheet.create({
17
+ hiddenButton: {
18
+ display: 'none',
19
+ },
20
+ layerButton: {
21
+ position: 'absolute',
22
+ top: 16,
23
+ right: 12,
24
+ width: 42,
25
+ height: 42,
26
+ borderRadius: 21,
27
+ borderWidth: 1,
28
+ borderColor: '#d1d5db',
29
+ backgroundColor: '#ffffff',
30
+ alignItems: 'center',
31
+ justifyContent: 'center',
32
+ shadowColor: '#000000',
33
+ shadowOpacity: 0.14,
34
+ shadowRadius: 8,
35
+ shadowOffset: {
36
+ width: 0,
37
+ height: 3,
38
+ },
39
+ },
40
+ layerButtonActive: {
41
+ borderColor: '#3b82f6',
42
+ backgroundColor: '#eff6ff',
43
+ },
44
+ legendButton: {
45
+ top: 66,
46
+ },
47
+ layerIconBoxPrimary: {
48
+ position: 'absolute',
49
+ width: 12,
50
+ height: 12,
51
+ borderRadius: 3,
52
+ borderWidth: 1.4,
53
+ borderColor: '#6b7280',
54
+ backgroundColor: '#eef2f7',
55
+ transform: [{ translateX: -2 }, { translateY: -2 }],
56
+ },
57
+ layerIconBoxSecondary: {
58
+ position: 'absolute',
59
+ width: 12,
60
+ height: 12,
61
+ borderRadius: 3,
62
+ borderWidth: 1.4,
63
+ borderColor: '#4b5563',
64
+ backgroundColor: '#ffffff',
65
+ transform: [{ translateX: 2 }, { translateY: 2 }],
66
+ },
67
+ legendToggleIconRow: {
68
+ width: 16,
69
+ flexDirection: 'row',
70
+ alignItems: 'center',
71
+ marginVertical: 1,
72
+ },
73
+ legendToggleIconDot: {
74
+ width: 4,
75
+ height: 4,
76
+ borderRadius: 2,
77
+ backgroundColor: '#4b5563',
78
+ marginRight: 3,
79
+ },
80
+ legendToggleIconLine: {
81
+ flex: 1,
82
+ height: 2,
83
+ borderRadius: 1,
84
+ backgroundColor: '#6b7280',
85
+ },
86
+ selectorContainer: {
87
+ ...fullFill,
88
+ },
89
+ selectorBackdrop: {
90
+ ...fullFill,
91
+ backgroundColor: '#11182740',
92
+ },
93
+ selectorBackdropPressable: {
94
+ ...fullFill,
95
+ },
96
+ selectorPanel: {
97
+ position: 'absolute',
98
+ top: 0,
99
+ left: 0,
100
+ height: '100%',
101
+ width: '76%',
102
+ maxWidth: 320,
103
+ minWidth: 260,
104
+ backgroundColor: '#f3f4f6',
105
+ borderTopRightRadius: 14,
106
+ borderBottomRightRadius: 14,
107
+ paddingHorizontal: 14,
108
+ paddingTop: 18,
109
+ paddingBottom: 14,
110
+ shadowColor: '#000000',
111
+ shadowOpacity: 0.2,
112
+ shadowRadius: 14,
113
+ shadowOffset: {
114
+ width: 2,
115
+ height: 0,
116
+ },
117
+ },
118
+ selectorHeader: {
119
+ marginBottom: 10,
120
+ },
121
+ selectorTitle: {
122
+ fontSize: 15,
123
+ fontWeight: '700',
124
+ color: '#1f2937',
125
+ },
126
+ selectorList: {
127
+ flex: 1,
128
+ },
129
+ selectorGrid: {
130
+ paddingBottom: 10,
131
+ },
132
+ selectorGroupSection: {
133
+ marginBottom: 8,
134
+ },
135
+ selectorGroupHeader: {
136
+ flexDirection: 'row',
137
+ alignItems: 'center',
138
+ minHeight: 28,
139
+ paddingHorizontal: 0,
140
+ marginBottom: 6,
141
+ },
142
+ selectorGroupCheckAction: {
143
+ width: 18,
144
+ alignItems: 'center',
145
+ justifyContent: 'center',
146
+ marginRight: 10,
147
+ },
148
+ selectorGroupToggleAction: {
149
+ flex: 1,
150
+ minHeight: 28,
151
+ flexDirection: 'row',
152
+ alignItems: 'center',
153
+ marginLeft: 2,
154
+ paddingLeft: 2,
155
+ },
156
+ selectorGroupChevronTriangle: {
157
+ width: 0,
158
+ height: 0,
159
+ marginRight: 10,
160
+ },
161
+ selectorGroupChevronCollapsed: {
162
+ borderTopWidth: 5,
163
+ borderBottomWidth: 5,
164
+ borderLeftWidth: 7,
165
+ borderTopColor: 'transparent',
166
+ borderBottomColor: 'transparent',
167
+ borderLeftColor: '#374151',
168
+ },
169
+ selectorGroupChevronExpanded: {
170
+ borderLeftWidth: 5,
171
+ borderRightWidth: 5,
172
+ borderTopWidth: 7,
173
+ borderLeftColor: 'transparent',
174
+ borderRightColor: 'transparent',
175
+ borderTopColor: '#374151',
176
+ marginTop: 1,
177
+ },
178
+ selectorGroupTitle: {
179
+ flex: 1,
180
+ fontSize: 16,
181
+ fontWeight: '700',
182
+ color: '#374151',
183
+ },
184
+ selectorGroupBody: {
185
+ paddingLeft: 24,
186
+ paddingTop: 0,
187
+ },
188
+ selectorRow: {
189
+ flexDirection: 'row',
190
+ alignItems: 'center',
191
+ minHeight: 34,
192
+ marginBottom: 6,
193
+ paddingRight: 6,
194
+ },
195
+ selectorLabel: {
196
+ flex: 1,
197
+ fontSize: 15,
198
+ color: '#2f343a',
199
+ lineHeight: 22,
200
+ fontWeight: '500',
201
+ },
202
+ checkboxOuter: {
203
+ width: 18,
204
+ height: 18,
205
+ borderRadius: 4,
206
+ borderWidth: 1.5,
207
+ marginRight: 10,
208
+ marginTop: 2,
209
+ borderColor: '#b7bcc3',
210
+ alignItems: 'center',
211
+ justifyContent: 'center',
212
+ backgroundColor: '#ffffff',
213
+ },
214
+ checkboxOuterChecked: {
215
+ borderColor: '#2563eb',
216
+ backgroundColor: '#2563eb',
217
+ },
218
+ checkboxMark: {
219
+ fontSize: 11,
220
+ fontWeight: '700',
221
+ color: '#ffffff',
222
+ lineHeight: 11,
223
+ },
224
+ groupCheckOuter: {
225
+ width: 18,
226
+ height: 18,
227
+ borderRadius: 4,
228
+ borderWidth: 1.5,
229
+ borderColor: '#b7bcc3',
230
+ backgroundColor: '#ffffff',
231
+ alignItems: 'center',
232
+ justifyContent: 'center',
233
+ },
234
+ groupCheckOuterChecked: {
235
+ borderColor: '#2563eb',
236
+ backgroundColor: '#2563eb',
237
+ },
238
+ groupCheckOuterIndeterminate: {
239
+ borderColor: '#2563eb',
240
+ backgroundColor: '#ffffff',
241
+ },
242
+ groupCheckMark: {
243
+ fontSize: 11,
244
+ fontWeight: '700',
245
+ color: '#ffffff',
246
+ lineHeight: 11,
247
+ },
248
+ groupCheckIndeterminateMark: {
249
+ width: 8,
250
+ height: 8,
251
+ borderRadius: 1,
252
+ backgroundColor: '#2563eb',
253
+ },
254
+ legendContainer: {
255
+ ...fullFill,
256
+ },
257
+ legendPanel: {
258
+ position: 'absolute',
259
+ right: 12,
260
+ bottom: 20,
261
+ width: 160,
262
+ maxHeight: 240,
263
+ backgroundColor: '#FFFFFFF5',
264
+ borderRadius: 12,
265
+ paddingHorizontal: 10,
266
+ paddingVertical: 8,
267
+ shadowColor: '#000000',
268
+ shadowOpacity: 0.12,
269
+ shadowRadius: 10,
270
+ shadowOffset: {
271
+ width: 0,
272
+ height: 4,
273
+ },
274
+ },
275
+ legendTitle: {
276
+ fontSize: 13,
277
+ fontWeight: '600',
278
+ color: '#9ca3af',
279
+ marginBottom: 6,
280
+ },
281
+ legendDivider: {
282
+ height: 1,
283
+ backgroundColor: '#e5e7eb',
284
+ marginBottom: 6,
285
+ },
286
+ legendList: {
287
+ maxHeight: 188,
288
+ marginLeft: -10,
289
+ marginRight: -8,
290
+ },
291
+ legendListInner: {
292
+ paddingBottom: 2,
293
+ paddingHorizontal: 10,
294
+ },
295
+ legendRow: {
296
+ flexDirection: 'row',
297
+ alignItems: 'center',
298
+ minHeight: 24,
299
+ marginBottom: 3,
300
+ paddingRight: 2,
301
+ },
302
+ legendLabel: {
303
+ flex: 1,
304
+ fontSize: 13,
305
+ color: '#6b7280',
306
+ fontWeight: '500',
307
+ },
308
+ legendDot: {
309
+ width: 10,
310
+ height: 10,
311
+ borderRadius: 5,
312
+ borderWidth: 2,
313
+ marginRight: 8,
314
+ backgroundColor: '#9ca3af',
315
+ borderColor: '#9ca3af',
316
+ },
317
+ legendDotUnchecked: {
318
+ backgroundColor: '#ffffff',
319
+ borderColor: '#9ca3af',
320
+ },
321
+ });
322
+
323
+ export { styles };
@@ -0,0 +1,261 @@
1
+ import React, { useRef } from 'react';
2
+ import {
3
+ Animated,
4
+ PanResponder,
5
+ Pressable,
6
+ ScrollView,
7
+ Text,
8
+ View,
9
+ } from 'react-native';
10
+ import {
11
+ SELECTOR_DRAWER_TRANSLATE_X,
12
+ SELECTOR_SWIPE_ACTIVATION_DISTANCE,
13
+ SELECTOR_SWIPE_CLOSE_DISTANCE,
14
+ SELECTOR_SWIPE_CLOSE_VELOCITY,
15
+ } from './constants';
16
+ import { styles } from './styles';
17
+
18
+ function LayerButton({ show, isActive, onPress }) {
19
+ return (
20
+ <Pressable
21
+ style={[
22
+ styles.layerButton,
23
+ isActive && styles.layerButtonActive,
24
+ !show && styles.hiddenButton,
25
+ ]}
26
+ onPress={onPress}
27
+ pointerEvents={show ? 'auto' : 'none'}
28
+ >
29
+ <View style={styles.layerIconBoxPrimary} />
30
+ <View style={styles.layerIconBoxSecondary} />
31
+ </Pressable>
32
+ );
33
+ }
34
+
35
+ function LegendButton({ show, isActive, onPress }) {
36
+ return (
37
+ <Pressable
38
+ style={[
39
+ styles.layerButton,
40
+ styles.legendButton,
41
+ isActive && styles.layerButtonActive,
42
+ !show && styles.hiddenButton,
43
+ ]}
44
+ onPress={onPress}
45
+ pointerEvents={show ? 'auto' : 'none'}
46
+ >
47
+ <View style={styles.legendToggleIconRow}>
48
+ <View style={styles.legendToggleIconDot} />
49
+ <View style={styles.legendToggleIconLine} />
50
+ </View>
51
+ <View style={styles.legendToggleIconRow}>
52
+ <View style={styles.legendToggleIconDot} />
53
+ <View style={styles.legendToggleIconLine} />
54
+ </View>
55
+ </Pressable>
56
+ );
57
+ }
58
+
59
+ function SelectorDrawer({
60
+ show,
61
+ title,
62
+ groupSections,
63
+ expandedGroupKeys,
64
+ dragAnim,
65
+ backdropAnimatedStyle,
66
+ panelAnimatedStyle,
67
+ onClose,
68
+ onDragCancel,
69
+ onToggleGroup,
70
+ onToggleGroupChecked,
71
+ onToggleItem,
72
+ }) {
73
+ const panResponder = useRef(
74
+ PanResponder.create({
75
+ onMoveShouldSetPanResponder: (evt, gestureState) =>
76
+ Math.abs(gestureState.dx) > SELECTOR_SWIPE_ACTIVATION_DISTANCE &&
77
+ Math.abs(gestureState.dx) > Math.abs(gestureState.dy),
78
+ onPanResponderMove: (evt, gestureState) => {
79
+ const clampedDx = Math.min(0, gestureState.dx);
80
+ const nextValue = 1 + clampedDx / Math.abs(SELECTOR_DRAWER_TRANSLATE_X);
81
+ dragAnim.setValue(Math.max(0, Math.min(1, nextValue)));
82
+ },
83
+ onPanResponderRelease: (evt, gestureState) => {
84
+ const shouldClose =
85
+ gestureState.dx < -SELECTOR_SWIPE_CLOSE_DISTANCE ||
86
+ gestureState.vx < -SELECTOR_SWIPE_CLOSE_VELOCITY;
87
+
88
+ if (shouldClose) {
89
+ onClose();
90
+ } else {
91
+ onDragCancel();
92
+ }
93
+ },
94
+ onPanResponderTerminate: () => {
95
+ onDragCancel();
96
+ },
97
+ })
98
+ ).current;
99
+
100
+ if (!show) {
101
+ return null;
102
+ }
103
+
104
+ return (
105
+ <View style={styles.selectorContainer}>
106
+ <Animated.View style={[styles.selectorBackdrop, backdropAnimatedStyle]}>
107
+ <Pressable
108
+ style={styles.selectorBackdropPressable}
109
+ onPress={onClose}
110
+ />
111
+ </Animated.View>
112
+ <Animated.View
113
+ style={[styles.selectorPanel, panelAnimatedStyle]}
114
+ {...panResponder.panHandlers}
115
+ >
116
+ <View style={styles.selectorHeader}>
117
+ <Text style={styles.selectorTitle}>{title}</Text>
118
+ </View>
119
+ <ScrollView style={styles.selectorList} showsVerticalScrollIndicator={false}>
120
+ <View style={styles.selectorGrid}>
121
+ {groupSections.map((group) => {
122
+ const groupKey = group?.key || '__group__';
123
+ const groupTitle = group?.title || 'Khac';
124
+ const groupItems = Array.isArray(group?.items) ? group.items : [];
125
+ const isExpanded = expandedGroupKeys[groupKey] !== false;
126
+ const checkedCount = groupItems.reduce(
127
+ (acc, wrapped) => acc + (wrapped?.item?.checked !== false ? 1 : 0),
128
+ 0
129
+ );
130
+ const isGroupChecked = groupItems.length > 0 && checkedCount === groupItems.length;
131
+ const isGroupIndeterminate =
132
+ checkedCount > 0 && checkedCount < groupItems.length;
133
+
134
+ return (
135
+ <View key={groupKey} style={styles.selectorGroupSection}>
136
+ <View style={styles.selectorGroupHeader}>
137
+ <Pressable
138
+ style={styles.selectorGroupCheckAction}
139
+ onPress={() => onToggleGroupChecked(groupKey, !isGroupChecked)}
140
+ >
141
+ <View
142
+ style={[
143
+ styles.groupCheckOuter,
144
+ isGroupChecked && styles.groupCheckOuterChecked,
145
+ isGroupIndeterminate && styles.groupCheckOuterIndeterminate,
146
+ ]}
147
+ >
148
+ {isGroupChecked ? (
149
+ <Text style={styles.groupCheckMark}>✓</Text>
150
+ ) : isGroupIndeterminate ? (
151
+ <View style={styles.groupCheckIndeterminateMark} />
152
+ ) : null}
153
+ </View>
154
+ </Pressable>
155
+ <Pressable
156
+ style={styles.selectorGroupToggleAction}
157
+ onPress={() => onToggleGroup(groupKey)}
158
+ >
159
+ <View
160
+ style={[
161
+ styles.selectorGroupChevronTriangle,
162
+ isExpanded
163
+ ? styles.selectorGroupChevronExpanded
164
+ : styles.selectorGroupChevronCollapsed,
165
+ ]}
166
+ />
167
+ <Text style={styles.selectorGroupTitle} numberOfLines={1}>
168
+ {groupTitle}
169
+ </Text>
170
+ </Pressable>
171
+ </View>
172
+
173
+ {isExpanded ? (
174
+ <View style={styles.selectorGroupBody}>
175
+ {groupItems.map(({ item, index }) => {
176
+ const itemKey = item?.key ?? `index-${index}`;
177
+ const checked = item?.checked !== false;
178
+ const itemTitle = item?.title || item?.key || `Item ${index + 1}`;
179
+
180
+ return (
181
+ <Pressable
182
+ key={`${itemKey}-${index}`}
183
+ style={styles.selectorRow}
184
+ onPress={() => onToggleItem(itemKey, index)}
185
+ >
186
+ <View
187
+ style={[
188
+ styles.checkboxOuter,
189
+ checked && styles.checkboxOuterChecked,
190
+ ]}
191
+ >
192
+ {checked ? (
193
+ <Text style={styles.checkboxMark}>✓</Text>
194
+ ) : null}
195
+ </View>
196
+ <Text style={styles.selectorLabel}>
197
+ {itemTitle}
198
+ </Text>
199
+ </Pressable>
200
+ );
201
+ })}
202
+ </View>
203
+ ) : null}
204
+ </View>
205
+ );
206
+ })}
207
+ </View>
208
+ </ScrollView>
209
+ </Animated.View>
210
+ </View>
211
+ );
212
+ }
213
+
214
+ function LegendPanel({ show, title, items, getItemColor }) {
215
+ if (!show) {
216
+ return null;
217
+ }
218
+
219
+ return (
220
+ <View style={styles.legendContainer} pointerEvents="box-none">
221
+ <View style={styles.legendPanel}>
222
+ <Text style={styles.legendTitle}>{title}</Text>
223
+ <View style={styles.legendDivider} />
224
+ <ScrollView style={styles.legendList} showsVerticalScrollIndicator={true}>
225
+ <View style={styles.legendListInner}>
226
+ {items.map((item, index) => {
227
+ const checked = item?.checked !== false;
228
+ const itemTitle =
229
+ item?.title || item?.label || item?.name || item?.key || '';
230
+ const dotColor = getItemColor(item, index);
231
+ const hasDotColor =
232
+ typeof dotColor === 'string' && dotColor.trim().length > 0;
233
+
234
+ return (
235
+ <View
236
+ key={`${item?.key ?? `index-${index}`}-${index}`}
237
+ style={styles.legendRow}
238
+ >
239
+ <View
240
+ style={[
241
+ styles.legendDot,
242
+ hasDotColor
243
+ ? { backgroundColor: dotColor, borderColor: dotColor }
244
+ : null,
245
+ !checked && !hasDotColor ? styles.legendDotUnchecked : null,
246
+ ]}
247
+ />
248
+ <Text style={styles.legendLabel} numberOfLines={1}>
249
+ {itemTitle}
250
+ </Text>
251
+ </View>
252
+ );
253
+ })}
254
+ </View>
255
+ </ScrollView>
256
+ </View>
257
+ </View>
258
+ );
259
+ }
260
+
261
+ export { LayerButton, LegendButton, LegendPanel, SelectorDrawer };