@defra/interactive-map 0.0.3-alpha → 0.0.5-alpha

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 (407) hide show
  1. package/README.md +16 -57
  2. package/dist/css/index.css +1 -1
  3. package/dist/esm/im-core.js +1 -1
  4. package/dist/esm/index.js +1 -1
  5. package/dist/umd/im-core.js +1 -1
  6. package/dist/umd/index.js +1 -1
  7. package/docs/api/button-definition.md +176 -0
  8. package/docs/api/context.md +124 -0
  9. package/docs/api/control-definition.md +72 -0
  10. package/docs/api/icon-definition.md +28 -0
  11. package/docs/api/map-style-config.md +76 -0
  12. package/docs/api/marker-config.md +51 -0
  13. package/docs/api/panel-definition.md +117 -0
  14. package/docs/api/slots.md +25 -0
  15. package/docs/api.md +721 -0
  16. package/docs/architecture.md +139 -0
  17. package/docs/building-a-plugin.md +149 -0
  18. package/docs/getting-started.md +46 -0
  19. package/docs/govuk-prototype.md +0 -0
  20. package/docs/plugins/interact.md +205 -0
  21. package/docs/plugins/map-styles.md +84 -0
  22. package/docs/plugins/plugin-context.md +67 -0
  23. package/docs/plugins/plugin-descriptor.md +71 -0
  24. package/docs/plugins/plugin-manifest.md +118 -0
  25. package/docs/plugins/scale-bar.md +62 -0
  26. package/docs/plugins/search.md +162 -0
  27. package/docs/plugins.md +116 -0
  28. package/govuk-prototype-kit.config.json +7 -7
  29. package/package.json +16 -2
  30. package/plugins/beta/datasets/dist/esm/im-datasets-plugin.js +2 -0
  31. package/plugins/beta/datasets/dist/esm/index.js +2 -0
  32. package/plugins/beta/datasets/dist/umd/im-datasets-plugin.js +2 -0
  33. package/plugins/beta/datasets/dist/umd/index.js +2 -0
  34. package/plugins/beta/datasets/src/datasets.js +113 -0
  35. package/plugins/beta/datasets/src/fetch/createDynamicSource.js +206 -0
  36. package/plugins/beta/datasets/src/fetch/fetchGeoJSON.js +38 -0
  37. package/plugins/{datasets → beta/datasets}/src/handleSetMapStyle.js +8 -1
  38. package/plugins/{datasets → beta/datasets}/src/manifest.js +1 -1
  39. package/plugins/{datasets → beta/datasets}/src/mapLayers.js +42 -4
  40. package/plugins/{datasets → beta/datasets}/src/panels/Key.jsx +1 -1
  41. package/plugins/beta/datasets/src/utils/bbox.js +115 -0
  42. package/plugins/beta/draw-ml/dist/css/index.css +1 -0
  43. package/plugins/beta/draw-ml/dist/esm/im-draw-ml-plugin.js +1 -0
  44. package/plugins/beta/draw-ml/dist/esm/index.js +2 -0
  45. package/plugins/beta/draw-ml/dist/umd/im-draw-ml-plugin.js +1 -0
  46. package/plugins/beta/draw-ml/dist/umd/index.js +2 -0
  47. package/plugins/beta/draw-ml/src/api/addFeature.js +27 -0
  48. package/plugins/{draw-ml → beta/draw-ml}/src/api/editFeature.js +17 -6
  49. package/plugins/beta/draw-ml/src/api/merge.js +9 -0
  50. package/plugins/beta/draw-ml/src/api/newLine.js +68 -0
  51. package/plugins/beta/draw-ml/src/api/newPolygon.js +68 -0
  52. package/plugins/beta/draw-ml/src/api/split.js +81 -0
  53. package/plugins/{draw-ml → beta/draw-ml}/src/defaults.js +3 -0
  54. package/plugins/beta/draw-ml/src/draw.scss +32 -0
  55. package/plugins/beta/draw-ml/src/events.js +171 -0
  56. package/plugins/beta/draw-ml/src/manifest.js +132 -0
  57. package/plugins/{draw-ml → beta/draw-ml}/src/mapboxDraw.js +51 -2
  58. package/plugins/{draw-ml → beta/draw-ml}/src/mapboxSnap.js +18 -12
  59. package/plugins/beta/draw-ml/src/modes/createDrawMode.js +497 -0
  60. package/plugins/beta/draw-ml/src/modes/drawLineMode.js +18 -0
  61. package/plugins/beta/draw-ml/src/modes/drawPolygonMode.js +16 -0
  62. package/plugins/beta/draw-ml/src/modes/editVertex/geometryHelpers.js +135 -0
  63. package/plugins/beta/draw-ml/src/modes/editVertex/helpers.js +2 -0
  64. package/plugins/beta/draw-ml/src/modes/editVertex/touchHandlers.js +134 -0
  65. package/plugins/beta/draw-ml/src/modes/editVertex/undoHandlers.js +133 -0
  66. package/plugins/beta/draw-ml/src/modes/editVertex/vertexOperations.js +141 -0
  67. package/plugins/beta/draw-ml/src/modes/editVertex/vertexQueries.js +121 -0
  68. package/plugins/beta/draw-ml/src/modes/editVertexMode.js +437 -0
  69. package/plugins/{draw-ml → beta/draw-ml}/src/reducer.js +30 -2
  70. package/plugins/{draw-ml → beta/draw-ml}/src/styles.js +66 -36
  71. package/plugins/beta/draw-ml/src/undoStack.js +50 -0
  72. package/plugins/beta/draw-ml/src/utils/debounce.js +16 -0
  73. package/plugins/beta/draw-ml/src/utils/flattenStyleProperties.js +49 -0
  74. package/plugins/beta/draw-ml/src/utils/spatial.js +258 -0
  75. package/plugins/beta/frame/dist/esm/im-frame-plugin.js +1 -0
  76. package/plugins/beta/frame/dist/esm/index.js +2 -0
  77. package/plugins/beta/frame/dist/umd/im-frame-plugin.js +1 -0
  78. package/plugins/beta/frame/dist/umd/index.js +2 -0
  79. package/plugins/{frame → beta/frame}/src/Frame.jsx +1 -1
  80. package/plugins/{map-styles → beta/map-styles}/dist/css/index.css +1 -1
  81. package/plugins/beta/map-styles/dist/esm/im-map-styles-plugin.js +1 -0
  82. package/plugins/beta/map-styles/dist/esm/index.js +2 -0
  83. package/plugins/beta/map-styles/dist/umd/im-map-styles-plugin.js +1 -0
  84. package/plugins/beta/map-styles/dist/umd/index.js +2 -0
  85. package/plugins/{map-styles → beta/map-styles}/src/MapStyles.jsx +1 -1
  86. package/plugins/{map-styles → beta/map-styles}/src/manifest.js +8 -10
  87. package/plugins/{map-styles → beta/map-styles}/src/mapStyles.scss +4 -1
  88. package/plugins/beta/scale-bar/dist/esm/im-scale-bar-plugin.js +1 -0
  89. package/plugins/beta/scale-bar/dist/esm/index.js +2 -0
  90. package/plugins/beta/scale-bar/dist/umd/im-scale-bar-plugin.js +1 -0
  91. package/plugins/beta/scale-bar/dist/umd/index.js +2 -0
  92. package/plugins/beta/use-location/dist/esm/im-use-location-plugin.js +1 -0
  93. package/plugins/beta/use-location/dist/esm/index.js +2 -0
  94. package/plugins/beta/use-location/dist/umd/im-use-location-plugin.js +1 -0
  95. package/plugins/beta/use-location/dist/umd/index.js +2 -0
  96. package/plugins/interact/dist/css/index.css +1 -1
  97. package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
  98. package/plugins/interact/dist/esm/index.js +1 -1
  99. package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
  100. package/plugins/interact/dist/umd/index.js +1 -1
  101. package/plugins/interact/src/InteractInit.jsx +1 -1
  102. package/plugins/interact/src/InteractInit.test.js +97 -0
  103. package/plugins/interact/src/api/clear.test.js +18 -0
  104. package/plugins/interact/src/api/disable.test.js +12 -0
  105. package/plugins/interact/src/api/enable.test.js +48 -0
  106. package/plugins/interact/src/api/selectFeature.test.js +33 -0
  107. package/plugins/interact/src/api/unselectFeature.test.js +33 -0
  108. package/plugins/interact/src/defaults.js +2 -0
  109. package/plugins/interact/src/events.js +37 -52
  110. package/plugins/interact/src/events.test.js +186 -0
  111. package/plugins/interact/src/hooks/useHighlightSync.js +1 -1
  112. package/plugins/interact/src/hooks/useHighlightSync.test.js +212 -0
  113. package/plugins/interact/src/hooks/useInteractionHandlers.js +80 -41
  114. package/plugins/interact/src/hooks/useInteractionHandlers.test.js +316 -0
  115. package/plugins/interact/src/index.test.js +22 -0
  116. package/plugins/interact/src/interact.scss +6 -0
  117. package/plugins/interact/src/manifest.js +1 -1
  118. package/plugins/interact/src/manifest.test.js +94 -0
  119. package/plugins/interact/src/reducer.js +28 -21
  120. package/plugins/interact/src/reducer.test.js +155 -0
  121. package/plugins/interact/src/utils/buildStylesMap.test.js +57 -0
  122. package/plugins/interact/src/utils/featureQueries.js +2 -2
  123. package/plugins/interact/src/utils/featureQueries.test.js +56 -0
  124. package/plugins/interact/src/utils/spatial.js +95 -0
  125. package/plugins/interact/src/utils/spatial.test.js +93 -0
  126. package/plugins/search/dist/css/index.css +1 -1
  127. package/plugins/search/dist/esm/im-search-plugin.js +1 -1
  128. package/plugins/search/dist/esm/index.js +1 -1
  129. package/plugins/search/dist/umd/im-search-plugin.js +1 -1
  130. package/plugins/search/dist/umd/index.js +1 -1
  131. package/plugins/search/src/Search.jsx +2 -2
  132. package/plugins/search/src/components/Form/Form.jsx +1 -1
  133. package/plugins/search/src/components/Suggestions/Suggestions.jsx +5 -5
  134. package/plugins/search/src/datasets.js +1 -1
  135. package/plugins/search/src/defaults.js +3 -0
  136. package/plugins/search/src/events/fetchSuggestions.js +48 -53
  137. package/plugins/search/src/events/formHandlers.js +3 -2
  138. package/plugins/search/src/events/index.js +1 -1
  139. package/plugins/search/src/events/inputHandlers.js +3 -1
  140. package/plugins/search/src/events/suggestionHandlers.js +12 -3
  141. package/plugins/search/src/search.scss +4 -1
  142. package/plugins/search/src/utils/parseOsNamesResults.js +15 -19
  143. package/providers/{esri → beta/esri}/src/esriProvider.js +1 -1
  144. package/providers/{esri → beta/esri}/src/index.js +1 -1
  145. package/providers/{esri → beta/esri}/src/mapEvents.js +2 -2
  146. package/providers/beta/open-names/dist/esm/im-reverse-geocode.js +2 -0
  147. package/providers/beta/open-names/dist/esm/index.js +2 -0
  148. package/providers/beta/open-names/dist/umd/im-reverse-geocode.js +2 -0
  149. package/providers/beta/open-names/dist/umd/im-reverse-geocode.js.LICENSE.txt +1 -0
  150. package/providers/beta/open-names/dist/umd/index.js +2 -0
  151. package/providers/beta/open-names/dist/umd/index.js.LICENSE.txt +1 -0
  152. package/providers/maplibre/dist/esm/im-maplibre-framework.js +1 -1
  153. package/providers/maplibre/dist/esm/im-maplibre-framework.js.LICENSE.txt +1 -1
  154. package/providers/maplibre/dist/esm/im-maplibre-provider.js +1 -1
  155. package/providers/maplibre/dist/esm/index.js +1 -1
  156. package/providers/maplibre/dist/umd/im-maplibre-framework.js +1 -1
  157. package/providers/maplibre/dist/umd/im-maplibre-framework.js.LICENSE.txt +1 -1
  158. package/providers/maplibre/dist/umd/im-maplibre-provider.js +1 -1
  159. package/providers/maplibre/dist/umd/index.js +1 -1
  160. package/providers/maplibre/src/defaults.js +3 -2
  161. package/providers/maplibre/src/index.js +36 -20
  162. package/providers/maplibre/src/maplibreProvider.js +140 -11
  163. package/providers/maplibre/src/utils/detectWebgl.js +1 -2
  164. package/providers/maplibre/src/utils/highlightFeatures.js +78 -67
  165. package/providers/maplibre/src/utils/labels.js +174 -120
  166. package/providers/maplibre/src/utils/maplibreFixes.js +2 -2
  167. package/providers/maplibre/src/utils/queryFeatures.js +146 -0
  168. package/providers/maplibre/src/utils/spatial.js +14 -17
  169. package/sonar-project.properties +40 -3
  170. package/src/App/components/Actions/Actions.jsx +2 -2
  171. package/src/App/components/Actions/Actions.module.scss +2 -2
  172. package/src/App/components/KeyboardHelp/KeyboardHelp.jsx +3 -1
  173. package/src/App/components/KeyboardHelp/KeyboardHelp.test.jsx +9 -0
  174. package/src/App/components/Logo/Logo.jsx +1 -1
  175. package/src/App/components/MapButton/MapButton.jsx +217 -41
  176. package/src/App/components/MapButton/MapButton.module.scss +32 -21
  177. package/src/App/components/MapButton/MapButton.test.jsx +128 -84
  178. package/src/App/components/Markers/Markers.jsx +1 -1
  179. package/src/App/components/Markers/Markers.module.scss +0 -5
  180. package/src/App/components/Panel/Panel.jsx +75 -45
  181. package/src/App/components/Panel/Panel.module.scss +18 -24
  182. package/src/App/components/Panel/Panel.test.jsx +18 -0
  183. package/src/App/components/PopupMenu/PopupMenu.jsx +246 -0
  184. package/src/App/components/PopupMenu/PopupMenu.module.scss +70 -0
  185. package/src/App/components/PopupMenu/PopupMenu.test.jsx +304 -0
  186. package/src/App/components/Tooltip/Tooltip.jsx +4 -2
  187. package/src/App/components/Tooltip/getTooltipPosition.js +1 -1
  188. package/src/App/components/Viewport/MapController.jsx +1 -1
  189. package/src/App/components/Viewport/MapStatus.jsx +1 -1
  190. package/src/App/components/Viewport/Viewport.jsx +2 -2
  191. package/src/App/components/Viewport/Viewport.module.scss +2 -2
  192. package/src/App/controls/keyboardActions.js +3 -2
  193. package/src/App/controls/keyboardShortcuts.js +4 -2
  194. package/src/App/hooks/useButtonStateEvaluator.js +58 -45
  195. package/src/App/hooks/useButtonStateEvaluator.test.js +36 -3
  196. package/src/App/hooks/useCrossHairAPI.js +49 -47
  197. package/src/App/hooks/useFocusVisible.js +2 -2
  198. package/src/App/hooks/useInterfaceAPI.js +36 -1
  199. package/src/App/hooks/useKeyboardHint.js +1 -1
  200. package/src/App/hooks/useKeyboardShortcuts.js +4 -2
  201. package/src/App/hooks/useMapAnnouncements.js +34 -32
  202. package/src/App/hooks/useMapEvents.js +12 -1
  203. package/src/App/hooks/useMapProviderOverrides.js +3 -3
  204. package/src/App/hooks/useMapStateSync.js +7 -1
  205. package/src/App/hooks/useMapURLSync.js +6 -1
  206. package/src/App/hooks/useMarkersAPI.js +88 -50
  207. package/src/App/hooks/useMediaQueryDispatch.test.js +48 -0
  208. package/src/App/hooks/useModalPanelBehaviour.js +46 -40
  209. package/src/App/hooks/useResizeObserver.js +2 -2
  210. package/src/App/initialiseApp.js +45 -38
  211. package/src/App/layout/Layout.jsx +6 -4
  212. package/src/App/layout/layout.module.scss +13 -17
  213. package/src/App/registry/keyboardShortcutRegistry.js +12 -2
  214. package/src/App/registry/keyboardShortcutRegistry.test.js +28 -0
  215. package/src/App/registry/mergeManifests.js +1 -1
  216. package/src/App/registry/panelRegistry.js +1 -1
  217. package/src/App/registry/panelRegistry.test.js +30 -1
  218. package/src/App/registry/pluginRegistry.js +14 -51
  219. package/src/App/registry/pluginRegistry.test.js +54 -6
  220. package/src/App/renderer/HtmlElementHost.jsx +186 -0
  221. package/src/App/renderer/HtmlElementHost.test.jsx +231 -0
  222. package/src/App/renderer/mapButtons.js +12 -9
  223. package/src/App/renderer/mapButtons.test.js +6 -4
  224. package/src/App/renderer/mapControls.js +6 -0
  225. package/src/App/renderer/mapControls.test.js +10 -2
  226. package/src/App/renderer/mapPanels.js +39 -26
  227. package/src/App/renderer/mapPanels.test.js +29 -0
  228. package/src/App/renderer/pluginWrapper.test.js +28 -0
  229. package/src/App/renderer/slotHelpers.js +60 -0
  230. package/src/App/renderer/slotHelpers.test.js +82 -0
  231. package/src/App/store/AppProvider.jsx +3 -0
  232. package/src/App/store/AppProvider.test.jsx +40 -0
  233. package/src/App/store/PluginProvider.jsx +7 -5
  234. package/src/App/store/appActionsMap.js +46 -1
  235. package/src/App/store/appActionsMap.test.js +21 -0
  236. package/src/App/store/appReducer.js +1 -0
  237. package/src/App/store/mapActionsMap.js +12 -24
  238. package/src/App/store/mapReducer.js +1 -1
  239. package/src/InteractiveMap/InteractiveMap.js +194 -13
  240. package/src/InteractiveMap/InteractiveMap.test.js +164 -2
  241. package/src/InteractiveMap/behaviourController.js +12 -2
  242. package/src/InteractiveMap/behaviourController.test.js +82 -1
  243. package/src/InteractiveMap/deviceChecker.js +1 -1
  244. package/src/InteractiveMap/deviceChecker.test.js +2 -2
  245. package/src/InteractiveMap/historyManager.js +41 -5
  246. package/src/InteractiveMap/historyManager.test.js +37 -6
  247. package/src/InteractiveMap/polyfills.js +39 -0
  248. package/src/InteractiveMap/polyfills.test.js +127 -0
  249. package/src/config/appConfig.js +5 -5
  250. package/src/config/appConfig.test.js +107 -42
  251. package/src/config/defaults.js +30 -20
  252. package/src/config/events.js +110 -4
  253. package/src/index.js +5 -2
  254. package/src/index.umd.js +1 -1
  255. package/src/scss/main.scss +1 -0
  256. package/src/scss/settings/_dimensions.scss +6 -2
  257. package/src/scss/tools/_border-focus.scss +20 -4
  258. package/src/services/eventBus.test.js +24 -1
  259. package/src/test-utils.js +1 -0
  260. package/src/types.js +590 -0
  261. package/src/utils/detectBreakpoint.js +78 -77
  262. package/src/utils/detectBreakpoint.test.js +50 -4
  263. package/src/utils/detectInterfaceType.js +4 -4
  264. package/src/utils/getIsFullscreen.js +3 -1
  265. package/src/utils/getSafeZoneInset.js +23 -7
  266. package/src/utils/getSafeZoneInset.test.js +18 -0
  267. package/src/utils/mapStateSync.js +3 -3
  268. package/src/utils/queryString.js +1 -1
  269. package/src/utils/stringToKebab.js +1 -1
  270. package/src/utils/toggleInertElements.js +37 -12
  271. package/webpack.dev.mjs +3 -4
  272. package/webpack.esm.mjs +8 -8
  273. package/webpack.umd.mjs +8 -8
  274. package/plugins/datasets/dist/esm/im-datasets-plugin.js +0 -1
  275. package/plugins/datasets/dist/esm/index.js +0 -2
  276. package/plugins/datasets/dist/umd/im-datasets-plugin.js +0 -1
  277. package/plugins/datasets/dist/umd/index.js +0 -2
  278. package/plugins/datasets/src/datasets.js +0 -60
  279. package/plugins/datasets/src/utils/bbox.js +0 -4
  280. package/plugins/draw-ml/dist/css/index.css +0 -1
  281. package/plugins/draw-ml/dist/esm/im-draw-ml-plugin.js +0 -1
  282. package/plugins/draw-ml/dist/esm/index.js +0 -2
  283. package/plugins/draw-ml/dist/umd/im-draw-ml-plugin.js +0 -1
  284. package/plugins/draw-ml/dist/umd/index.js +0 -2
  285. package/plugins/draw-ml/src/api/addFeature.js +0 -15
  286. package/plugins/draw-ml/src/api/newPolygon.js +0 -43
  287. package/plugins/draw-ml/src/draw.scss +0 -9
  288. package/plugins/draw-ml/src/events.js +0 -127
  289. package/plugins/draw-ml/src/manifest.js +0 -100
  290. package/plugins/draw-ml/src/modes/drawVertexMode.js +0 -275
  291. package/plugins/draw-ml/src/modes/editVertexMode.js +0 -426
  292. package/plugins/draw-ml/src/utils.js +0 -102
  293. package/plugins/frame/dist/esm/im-frame-plugin.js +0 -1
  294. package/plugins/frame/dist/esm/index.js +0 -2
  295. package/plugins/frame/dist/umd/im-frame-plugin.js +0 -1
  296. package/plugins/frame/dist/umd/index.js +0 -2
  297. package/plugins/map-styles/dist/esm/im-map-styles-plugin.js +0 -1
  298. package/plugins/map-styles/dist/esm/index.js +0 -2
  299. package/plugins/map-styles/dist/umd/im-map-styles-plugin.js +0 -1
  300. package/plugins/map-styles/dist/umd/index.js +0 -2
  301. package/plugins/scale-bar/dist/esm/im-scale-bar-plugin.js +0 -1
  302. package/plugins/scale-bar/dist/esm/index.js +0 -2
  303. package/plugins/scale-bar/dist/umd/im-scale-bar-plugin.js +0 -1
  304. package/plugins/scale-bar/dist/umd/index.js +0 -2
  305. package/plugins/search/src/utils/fetchDataset.js +0 -23
  306. package/plugins/use-location/dist/esm/im-use-location-plugin.js +0 -1
  307. package/plugins/use-location/dist/esm/index.js +0 -2
  308. package/plugins/use-location/dist/umd/im-use-location-plugin.js +0 -1
  309. package/plugins/use-location/dist/umd/index.js +0 -2
  310. package/providers/maplibre/dist/esm/im-maplibre-legacy-framework.js +0 -1
  311. package/providers/maplibre/dist/umd/im-maplibre-legacy-framework.js +0 -1
  312. package/providers/open-names/dist/esm/im-reverse-geocode.js +0 -2
  313. package/providers/open-names/dist/esm/index.js +0 -2
  314. package/providers/open-names/dist/umd/im-reverse-geocode.js +0 -2
  315. package/providers/open-names/dist/umd/index.js +0 -2
  316. /package/docs/architecture/{ARCHITECTURE_DIAGRAMS.md → architecture-diagrams.md} +0 -0
  317. /package/plugins/{datasets → beta/datasets}/dist/css/index.css +0 -0
  318. /package/plugins/{datasets/dist/esm/index.js.LICENSE.txt → beta/datasets/dist/esm/im-datasets-plugin.js.LICENSE.txt} +0 -0
  319. /package/plugins/{datasets/dist/umd → beta/datasets/dist/esm}/index.js.LICENSE.txt +0 -0
  320. /package/plugins/{draw-ml/dist/esm/index.js.LICENSE.txt → beta/datasets/dist/umd/im-datasets-plugin.js.LICENSE.txt} +0 -0
  321. /package/plugins/{draw-ml → beta/datasets}/dist/umd/index.js.LICENSE.txt +0 -0
  322. /package/plugins/{datasets → beta/datasets}/src/DatasetsInit.jsx +0 -0
  323. /package/plugins/{datasets → beta/datasets}/src/api/addDataset.js +0 -0
  324. /package/plugins/{datasets → beta/datasets}/src/api/hideDataset.js +0 -0
  325. /package/plugins/{datasets → beta/datasets}/src/api/hideFeatures.js +0 -0
  326. /package/plugins/{datasets → beta/datasets}/src/api/removeDataset.js +0 -0
  327. /package/plugins/{datasets → beta/datasets}/src/api/showDataset.js +0 -0
  328. /package/plugins/{datasets → beta/datasets}/src/api/showFeatures.js +0 -0
  329. /package/plugins/{datasets → beta/datasets}/src/datasets.scss +0 -0
  330. /package/plugins/{datasets → beta/datasets}/src/defaults.js +0 -0
  331. /package/plugins/{datasets → beta/datasets}/src/index.js +0 -0
  332. /package/plugins/{datasets → beta/datasets}/src/panels/Key.module.scss +0 -0
  333. /package/plugins/{datasets → beta/datasets}/src/panels/Layers.jsx +0 -0
  334. /package/plugins/{datasets → beta/datasets}/src/panels/Layers.module.scss +0 -0
  335. /package/plugins/{datasets → beta/datasets}/src/reducer.js +0 -0
  336. /package/plugins/{datasets → beta/datasets}/src/utils/debounce.js +0 -0
  337. /package/plugins/{datasets → beta/datasets}/src/utils/filters.js +0 -0
  338. /package/plugins/{draw-es → beta/draw-es}/src/DrawInit.jsx +0 -0
  339. /package/plugins/{draw-es → beta/draw-es}/src/api/addFeature.js +0 -0
  340. /package/plugins/{draw-es → beta/draw-es}/src/api/deleteFeature.js +0 -0
  341. /package/plugins/{draw-es → beta/draw-es}/src/api/editFeature.js +0 -0
  342. /package/plugins/{draw-es → beta/draw-es}/src/api/newPolygon.js +0 -0
  343. /package/plugins/{draw-es → beta/draw-es}/src/events.js +0 -0
  344. /package/plugins/{draw-es → beta/draw-es}/src/graphic.js +0 -0
  345. /package/plugins/{draw-es → beta/draw-es}/src/index.js +0 -0
  346. /package/plugins/{draw-es → beta/draw-es}/src/manifest.js +0 -0
  347. /package/plugins/{draw-es → beta/draw-es}/src/reducer.js +0 -0
  348. /package/plugins/{draw-es → beta/draw-es}/src/sketchViewModel.js +0 -0
  349. /package/plugins/{frame → beta/draw-ml}/dist/esm/index.js.LICENSE.txt +0 -0
  350. /package/plugins/{frame → beta/draw-ml}/dist/umd/index.js.LICENSE.txt +0 -0
  351. /package/plugins/{draw-ml → beta/draw-ml}/src/DrawInit.jsx +0 -0
  352. /package/plugins/{draw-ml → beta/draw-ml}/src/api/deleteFeature.js +0 -0
  353. /package/plugins/{draw-ml → beta/draw-ml}/src/index.js +0 -0
  354. /package/plugins/{draw-ml → beta/draw-ml}/src/modes/disabledMode.js +0 -0
  355. /package/plugins/{draw-ml/src → beta/draw-ml/src/utils}/snapHelpers.js +0 -0
  356. /package/plugins/{frame → beta/frame}/dist/css/index.css +0 -0
  357. /package/plugins/{map-styles → beta/frame}/dist/esm/index.js.LICENSE.txt +0 -0
  358. /package/plugins/{map-styles → beta/frame}/dist/umd/index.js.LICENSE.txt +0 -0
  359. /package/plugins/{frame → beta/frame}/package.json +0 -0
  360. /package/plugins/{frame → beta/frame}/src/FrameInit.jsx +0 -0
  361. /package/plugins/{frame → beta/frame}/src/api/addFrame.js +0 -0
  362. /package/plugins/{frame → beta/frame}/src/api/editFeature.js +0 -0
  363. /package/plugins/{frame → beta/frame}/src/config.js +0 -0
  364. /package/plugins/{frame → beta/frame}/src/frame.scss +0 -0
  365. /package/plugins/{frame → beta/frame}/src/index.js +0 -0
  366. /package/plugins/{frame → beta/frame}/src/manifest.js +0 -0
  367. /package/plugins/{frame → beta/frame}/src/reducer.js +0 -0
  368. /package/plugins/{frame → beta/frame}/src/utils.js +0 -0
  369. /package/plugins/{scale-bar → beta/map-styles}/dist/esm/index.js.LICENSE.txt +0 -0
  370. /package/plugins/{scale-bar → beta/map-styles}/dist/umd/index.js.LICENSE.txt +0 -0
  371. /package/plugins/{map-styles → beta/map-styles}/src/MapStylesInit.jsx +0 -0
  372. /package/plugins/{map-styles → beta/map-styles}/src/config.js +0 -0
  373. /package/plugins/{map-styles → beta/map-styles}/src/index.js +0 -0
  374. /package/plugins/{scale-bar → beta/scale-bar}/dist/css/index.css +0 -0
  375. /package/plugins/{use-location → beta/scale-bar}/dist/esm/index.js.LICENSE.txt +0 -0
  376. /package/plugins/{use-location → beta/scale-bar}/dist/umd/index.js.LICENSE.txt +0 -0
  377. /package/plugins/{scale-bar → beta/scale-bar}/package.json +0 -0
  378. /package/plugins/{scale-bar → beta/scale-bar}/src/ScaleBar.jsx +0 -0
  379. /package/plugins/{scale-bar → beta/scale-bar}/src/ScaleBar.test.jsx +0 -0
  380. /package/plugins/{scale-bar → beta/scale-bar}/src/index.js +0 -0
  381. /package/plugins/{scale-bar → beta/scale-bar}/src/index.test.js +0 -0
  382. /package/plugins/{scale-bar → beta/scale-bar}/src/manifest.js +0 -0
  383. /package/plugins/{scale-bar → beta/scale-bar}/src/scaleBar.scss +0 -0
  384. /package/plugins/{scale-bar → beta/scale-bar}/src/utils.js +0 -0
  385. /package/plugins/{scale-bar → beta/scale-bar}/src/utils.test.js +0 -0
  386. /package/{providers/open-names → plugins/beta/use-location}/dist/esm/index.js.LICENSE.txt +0 -0
  387. /package/{providers/open-names → plugins/beta/use-location}/dist/umd/index.js.LICENSE.txt +0 -0
  388. /package/plugins/{use-location → beta/use-location}/src/UseLocation.jsx +0 -0
  389. /package/plugins/{use-location → beta/use-location}/src/UseLocationInit.jsx +0 -0
  390. /package/plugins/{use-location → beta/use-location}/src/defaults.js +0 -0
  391. /package/plugins/{use-location → beta/use-location}/src/events.js +0 -0
  392. /package/plugins/{use-location → beta/use-location}/src/index.js +0 -0
  393. /package/plugins/{use-location → beta/use-location}/src/manifest.js +0 -0
  394. /package/plugins/{use-location → beta/use-location}/src/reducer.js +0 -0
  395. /package/providers/{esri → beta/esri}/src/appEvents.js +0 -0
  396. /package/providers/{esri → beta/esri}/src/defaults.js +0 -0
  397. /package/providers/{esri → beta/esri}/src/esriProvider.scss +0 -0
  398. /package/providers/{esri → beta/esri}/src/utils/coords.js +0 -0
  399. /package/providers/{esri → beta/esri}/src/utils/detectWebGL.js +0 -0
  400. /package/providers/{esri → beta/esri}/src/utils/esriFixes.js +0 -0
  401. /package/providers/{esri → beta/esri}/src/utils/query.js +0 -0
  402. /package/providers/{esri → beta/esri}/src/utils/spatial.js +0 -0
  403. /package/providers/{open-names → beta/open-names}/dist/esm/im-reverse-geocode.js.LICENSE.txt +0 -0
  404. /package/providers/{open-names/dist/umd/im-reverse-geocode.js.LICENSE.txt → beta/open-names/dist/esm/index.js.LICENSE.txt} +0 -0
  405. /package/providers/{open-names → beta/open-names}/src/index.js +0 -0
  406. /package/providers/{open-names → beta/open-names}/src/reverseGeocode.js +0 -0
  407. /package/providers/{open-names → beta/open-names}/src/utils/mapToLocationModel.js +0 -0
@@ -1,32 +1,42 @@
1
+ /**
2
+ * Default configuration options for InteractiveMap.
3
+ *
4
+ * These values are used when no corresponding option is provided by the consumer.
5
+ * See {@link InteractiveMapConfig} in types.js for full property documentation.
6
+ *
7
+ * @type {Partial<import('../types.js').InteractiveMapConfig>}
8
+ */
1
9
  const defaults = {
2
- mapViewParamKey: 'mv',
3
- behaviour: 'buttonFirst',
4
- backgroundColor: 'var(--background-color)',
5
- maxMobileWidth: 640,
6
- minDesktopWidth: 835,
7
- hybridWidth: null, // Defaults to maxMobileWidth if not set
8
- containerHeight: '600px',
9
- mapSize: 'small',
10
10
  appColorScheme: 'light',
11
11
  autoColorScheme: false,
12
- mapLabel: 'Interactive map',
13
- buttonText: 'Map view',
12
+ backgroundColor: 'var(--background-color)',
13
+ behaviour: 'buttonFirst',
14
14
  buttonClass: 'im-c-open-map-button',
15
+ buttonText: 'Map view',
16
+ containerHeight: '600px',
15
17
  deviceNotSupportedText: 'Your device is not supported. A map is available with a more up-to-date browser or device.',
18
+ enableFullscreen: false,
19
+ enableZoomControls: false,
16
20
  genericErrorText: 'There was a problem loading the map. Please try again later.',
21
+ hasExitButton: false,
22
+ hybridWidth: null, // Defaults to maxMobileWidth if not set
17
23
  keyboardHintText: '<span class="im-u-visually-hidden">Press </span><kbd>Alt</kbd> + <kbd>K</kbd> <span class="im-u-visually-hidden">to view </span>keyboard shortcuts',
18
- pageTitle: 'Map view',
19
- zoomDelta: 1,
20
- nudgeZoomDelta: 0.1,
21
- panDelta: 100,
22
- nudgePanDelta: 5,
24
+ mapLabel: 'Interactive map',
23
25
  mapProvider: null,
24
- reverseGeocode: null,
25
- markerShape: 'pin',
26
+ mapSize: 'small',
27
+ mapViewParamKey: 'mv',
28
+ maxMobileWidth: 640,
29
+ minDesktopWidth: 835,
26
30
  markerColor: '#ff0000',
27
- enableFullscreen: false,
28
- enableZoomControls: false,
29
- readMapText: true
31
+ markerShape: 'pin',
32
+ nudgePanDelta: 5,
33
+ nudgeZoomDelta: 0.1,
34
+ panDelta: 100,
35
+ pageTitle: 'Map view',
36
+ preserveStateOnClose: false,
37
+ readMapText: false,
38
+ reverseGeocodeProvider: null,
39
+ zoomDelta: 1
30
40
  }
31
41
 
32
42
  export default defaults
@@ -1,39 +1,145 @@
1
+ /**
2
+ * Event constants for the Interactive Map event bus.
3
+ *
4
+ * Events are grouped into:
5
+ * - **App commands**: Internal use, but may be used by plugin authors.
6
+ * - **App responses**: Subscribe to these with `on()` to react to app state changes.
7
+ * - **Map commands**: Internal use, but may be used by plugin authors.
8
+ * - **Map responses**: Subscribe to these with `on()` to react to map state changes.
9
+ *
10
+ * @example
11
+ * // Subscribe to app ready event
12
+ * map.on(EVENTS.APP_READY, () => {
13
+ * console.log('Map is ready!')
14
+ * })
15
+ *
16
+ * // Subscribe to panel events
17
+ * map.on(EVENTS.APP_PANEL_OPENED, ({ panelId }) => {
18
+ * console.log('Panel opened:', panelId)
19
+ * })
20
+ */
1
21
  export const EVENTS = {
2
- // App commands
22
+ // ============================================
23
+ // App commands (internal / plugin authors)
24
+ // ============================================
25
+
26
+ /** @internal Add a marker. Payload: { id, coords, options } */
3
27
  APP_ADD_MARKER: 'app:addmarker',
28
+ /** @internal Remove a marker. Payload: id */
4
29
  APP_REMOVE_MARKER: 'app:removemarker',
30
+ /** @internal Set application mode. Payload: mode */
5
31
  APP_SET_MODE: 'app:setmode',
32
+ /** @internal Revert to previous mode. */
6
33
  APP_REVERT_MODE: 'app:revertmode',
34
+ /** @internal Add a button. Payload: { id, config } */
7
35
  APP_ADD_BUTTON: 'app:addbutton',
36
+ /** @internal Set a buttons state. Payload: { id, prop, value? } */
37
+ APP_TOGGLE_BUTTON_STATE: 'app:togglebuttonstate',
38
+ /** @internal Add a panel. Payload: { id, config } */
8
39
  APP_ADD_PANEL: 'app:addpanel',
40
+ /** @internal Remove a panel. Payload: id */
9
41
  APP_REMOVE_PANEL: 'app:removepanel',
42
+ /** @internal Show a panel. Payload: id */
10
43
  APP_SHOW_PANEL: 'app:showpanel',
44
+ /** @internal Hide a panel. Payload: id */
11
45
  APP_HIDE_PANEL: 'app:hidepanel',
46
+ /** @internal Add a control. Payload: { id, config } */
12
47
  APP_ADD_CONTROL: 'app:addcontrol',
13
48
 
14
- // App responses
49
+ // ============================================
50
+ // App responses (end-user / subscribe)
51
+ // ============================================
52
+
53
+ /**
54
+ * Emitted when the app is fully initialized and ready for interaction.
55
+ * Use this to perform actions that require the map to be available.
56
+ *
57
+ * @example
58
+ * map.on(EVENTS.APP_READY, () => {
59
+ * map.addMarker('home', [-0.1276, 51.5074])
60
+ * })
61
+ */
15
62
  APP_READY: 'app:ready',
63
+
64
+ /**
65
+ * Emitted when a panel is opened.
66
+ * Payload: { panelId: string }
67
+ *
68
+ * @example
69
+ * map.on(EVENTS.APP_PANEL_OPENED, ({ panelId }) => {
70
+ * console.log('Panel opened:', panelId)
71
+ * })
72
+ */
16
73
  APP_PANEL_OPENED: 'app:panelopened',
74
+
75
+ /**
76
+ * Emitted when a panel is closed.
77
+ * Payload: { panelId: string }
78
+ *
79
+ * @example
80
+ * map.on(EVENTS.APP_PANEL_CLOSED, ({ panelId }) => {
81
+ * console.log('Panel closed:', panelId)
82
+ * })
83
+ */
17
84
  APP_PANEL_CLOSED: 'app:panelclosed',
18
85
 
19
- // Map commands
86
+ // ============================================
87
+ // Map commands (internal / plugin authors)
88
+ // ============================================
89
+
90
+ /** @internal Set map style. Payload: styleId */
20
91
  MAP_SET_STYLE: 'map:setstyle',
92
+ /** @internal Set map size. Payload: { width, height } */
21
93
  MAP_SET_SIZE: 'map:setsize',
94
+ /** @internal Set pixel ratio. Payload: pixelRatio */
22
95
  MAP_SET_PIXEL_RATIO: 'map:setpixelratio',
23
96
 
24
- // Map responses
97
+ // ============================================
98
+ // Map responses (advanced / subscribe)
99
+ // ============================================
100
+
101
+ /** @internal Emitted when map styles are initialized. */
25
102
  MAP_INIT_MAP_STYLES: 'map:initmapstyles',
103
+
104
+ /** Emitted when the map style changes. Payload: { styleId: string } */
26
105
  MAP_STYLE_CHANGE: 'map:stylechange',
106
+
107
+ /** Emitted when the map style has fully loaded. */
27
108
  MAP_LOADED: 'map:loaded',
109
+
110
+ /** Emitted when the map is ready for interaction. Payload: { map } */
28
111
  MAP_READY: 'map:ready',
112
+
113
+ /** Emitted once after the map first becomes idle following initial load. */
29
114
  MAP_FIRST_IDLE: 'map:firstidle',
115
+
116
+ /** Emitted when map movement starts (pan, zoom, or rotation). */
30
117
  MAP_MOVE_START: 'map:movestart',
118
+
119
+ /** Emitted continuously during map movement. Payload: { center, zoom, bounds, resolution } */
31
120
  MAP_MOVE: 'map:move',
121
+
122
+ /** Emitted when map movement ends. Payload: { center, zoom, bounds, resolution } */
32
123
  MAP_MOVE_END: 'map:moveend',
124
+
125
+ /** Emitted when map state is updated. Payload: { center, zoom, bounds, resolution } */
33
126
  MAP_STATE_UPDATED: 'map:stateupdated',
127
+
128
+ /** Emitted when map data (tiles, features) changes. */
34
129
  MAP_DATA_CHANGE: 'map:datachange',
130
+
131
+ /** Emitted on each map render frame. Use sparingly as this fires frequently. */
35
132
  MAP_RENDER: 'map:render',
133
+
134
+ /**
135
+ * Emitted when the map is clicked.
136
+ * Payload: { coords: [number, number], point: { x, y }, features: any[] }
137
+ */
36
138
  MAP_CLICK: 'map:click',
139
+
140
+ /** Emitted when the user exits the map (e.g., via the close button). */
37
141
  MAP_EXIT: 'map:exit',
142
+
143
+ /** Emitted when the map is destroyed. Payload: { mapId: string } */
38
144
  MAP_DESTROY: 'map:destroy'
39
145
  }
package/src/index.js CHANGED
@@ -1,3 +1,6 @@
1
- import InteractiveMap from './InteractiveMap/InteractiveMap.js'
1
+ // Export the main class
2
+ export { default } from './InteractiveMap/InteractiveMap.js'
3
+ export { default as InteractiveMap } from './InteractiveMap/InteractiveMap.js'
2
4
 
3
- export default InteractiveMap
5
+ // Export events
6
+ export { EVENTS } from './config/events.js'
package/src/index.umd.js CHANGED
@@ -6,7 +6,7 @@ import * as JSXRuntime from 'react/jsx-runtime'
6
6
 
7
7
  import InteractiveMap from './index.js'
8
8
 
9
- const g = typeof window !== 'undefined' ? window : globalThis
9
+ const g = typeof window === 'undefined' ? globalThis : window
10
10
 
11
11
  // Create `defra` namespace if missing
12
12
  g.defra = g.defra || {}
@@ -21,6 +21,7 @@
21
21
  @use '../App/components/Panel/Panel.module';
22
22
  @use '../App/components/Viewport/Viewport.module';
23
23
  @use '../App/components/Tooltip/Tooltip.module';
24
+ @use '../App/components/PopupMenu/PopupMenu.module';
24
25
  @use '../App/components/Attributions/Attributions.module';
25
26
  @use '../App/components/Logo/Logo.module';
26
27
  @use '../App/components/CrossHair/CrossHair.module';
@@ -12,8 +12,8 @@
12
12
 
13
13
  // Borders and focus
14
14
  --app-border-width: 1px;
15
- --button-border-radius: 0px; // 4px;
16
- --panel-border-radius: 0px; // 8px;
15
+ --button-border-radius: 4px;
16
+ --panel-border-radius: 8px;
17
17
  --focus-border-width: 3px;
18
18
  --focus-outline-width: 3px;
19
19
 
@@ -37,6 +37,10 @@
37
37
  --banner-max-desktop-width: 400px;
38
38
  --banner-collapse-margin: 14px;
39
39
 
40
+ // Popup menu
41
+ --popup-menu-min-width: 200px;
42
+ --popup-menu-max-width: 300px;
43
+
40
44
  // Action bar (Needs to fit evently if tools are in right hand column)
41
45
  --action-bar-max-width: calc(100% - (var(--button-size) * 2) - (var(--primary-gap) * 4));
42
46
 
@@ -136,10 +136,26 @@
136
136
 
137
137
  // Apply clip-path only to ::before for the shadow
138
138
  &::before {
139
- $clip-top: if($has-bottom, 0, -20px);
140
- $clip-right: if($has-left, 0, -20px);
141
- $clip-bottom: if($has-top, 0, -20px);
142
- $clip-left: if($has-right, 0, -20px);
139
+ $clip-top: -20px;
140
+ $clip-right: -20px;
141
+ $clip-bottom: -20px;
142
+ $clip-left: -20px;
143
+
144
+ @if $has-bottom {
145
+ $clip-top: 0;
146
+ }
147
+
148
+ @if $has-left {
149
+ $clip-right: 0;
150
+ }
151
+
152
+ @if $has-top {
153
+ $clip-bottom: 0;
154
+ }
155
+
156
+ @if $has-right {
157
+ $clip-left: 0;
158
+ }
143
159
 
144
160
  clip-path: inset(#{$clip-top} #{$clip-right} #{$clip-bottom} #{$clip-left});
145
161
  }
@@ -1,5 +1,5 @@
1
1
  // src/services/eventBus.test.js
2
- import eventBus from './eventBus.js'
2
+ import eventBus, { createEventBus } from './eventBus.js'
3
3
 
4
4
  describe('EventBus singleton', () => {
5
5
  beforeEach(() => {
@@ -93,3 +93,26 @@ describe('EventBus singleton', () => {
93
93
  expect(eventBus.events).toEqual({})
94
94
  })
95
95
  })
96
+
97
+ describe('createEventBus factory', () => {
98
+ /**
99
+ * Test to ensure coverage for the factory function (Line 50).
100
+ * Validates that createEventBus returns a fresh, working EventBus instance.
101
+ */
102
+ it('creates a new, independent EventBus instance', () => {
103
+ const newBus = createEventBus()
104
+ const handler = jest.fn()
105
+
106
+ // Verify it is an instance of the same logic
107
+ expect(newBus).toHaveProperty('on')
108
+ expect(newBus).toHaveProperty('emit')
109
+
110
+ // Verify it is independent of the singleton
111
+ newBus.on('instanceTest', handler)
112
+ eventBus.emit('instanceTest', 'data') // Emit on singleton
113
+ expect(handler).not.toHaveBeenCalled()
114
+
115
+ newBus.emit('instanceTest', 'data') // Emit on the new instance
116
+ expect(handler).toHaveBeenCalledWith('data')
117
+ })
118
+ })
package/src/test-utils.js CHANGED
@@ -48,6 +48,7 @@ export const createMockAppState = (overrides = {}) => {
48
48
  disabledButtons: new Set(),
49
49
  hiddenButtons: new Set(),
50
50
  pressedButtons: new Set(),
51
+ expandedButtons: new Set(),
51
52
  buttonConfig: registries.buttonRegistry.getButtonConfig(),
52
53
  panelConfig: registries.panelRegistry.getPanelConfig(),
53
54
  controlConfig: registries.controlRegistry.getControlConfig(),