@defra/interactive-map 0.0.37-alpha → 0.0.38-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 (244) hide show
  1. package/assets/templates/draw-tools.njk +4 -3
  2. package/dist/css/index.css +1 -1
  3. package/dist/esm/im-core.js +1 -1
  4. package/dist/esm/im-shell.js +1 -1
  5. package/dist/umd/im-core.js +1 -1
  6. package/dist/umd/index.js +1 -1
  7. package/docs/api.md +32 -0
  8. package/docs/examples/draw-tools.mdx +0 -4
  9. package/docs/plugins/draw.md +482 -0
  10. package/docs/plugins.md +2 -6
  11. package/govuk-prototype-kit.config.json +3 -2
  12. package/package.json +2 -4
  13. package/plugins/beta/draw-es/dist/esm/im-draw-es-plugin.js +1 -1
  14. package/plugins/beta/draw-ml/dist/esm/im-draw-ml-plugin.js +1 -1
  15. package/plugins/beta/draw-ml/dist/umd/im-draw-ml-plugin.js +1 -1
  16. package/plugins/beta/draw-ol/dist/esm/im-draw-ol-plugin.js +1 -1
  17. package/plugins/beta/map-styles/dist/css/index.css +1 -97
  18. package/plugins/datasets/dist/esm/im-datasets-plugin.js +1 -1
  19. package/plugins/datasets/dist/umd/im-datasets-plugin.js +1 -1
  20. package/plugins/draw/dist/esm/im-draw-ml-adapter.js +1 -0
  21. package/plugins/draw/dist/esm/im-draw-ol-adapter.js +1 -0
  22. package/plugins/draw/dist/esm/im-draw-plugin.js +1 -0
  23. package/plugins/draw/dist/esm/index.js +1 -0
  24. package/plugins/draw/dist/umd/im-draw-ml-adapter.js +1 -0
  25. package/plugins/draw/dist/umd/im-draw-ol-adapter.js +2 -0
  26. package/plugins/draw/dist/umd/im-draw-ol-adapter.js.LICENSE.txt +1 -0
  27. package/plugins/draw/dist/umd/im-draw-plugin.js +2 -0
  28. package/plugins/draw/dist/umd/im-draw-plugin.js.LICENSE.txt +1 -0
  29. package/plugins/draw/dist/umd/index.js +2 -0
  30. package/plugins/draw/dist/umd/index.js.LICENSE.txt +1 -0
  31. package/plugins/draw/src/DrawInit.jsx +89 -0
  32. package/plugins/draw/src/DrawInit.test.jsx +184 -0
  33. package/plugins/draw/src/adapterEvents.js +127 -0
  34. package/plugins/draw/src/adapterEvents.test.js +20 -0
  35. package/plugins/draw/src/adapters/adapterContract.test.js +48 -0
  36. package/plugins/draw/src/adapters/loadDrawAdapter.js +14 -0
  37. package/plugins/draw/src/adapters/loadDrawAdapter.test.js +53 -0
  38. package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.js +367 -0
  39. package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.test.js +799 -0
  40. package/plugins/draw/src/adapters/maplibre/defaults.js +1 -0
  41. package/plugins/draw/src/adapters/maplibre/drawEvents.js +35 -0
  42. package/plugins/draw/src/adapters/maplibre/mapboxDraw.js +126 -0
  43. package/plugins/draw/src/adapters/maplibre/mapboxDraw.test.js +268 -0
  44. package/plugins/draw/src/adapters/maplibre/mapboxSnap.js +39 -0
  45. package/plugins/draw/src/adapters/maplibre/mapboxSnap.test.js +91 -0
  46. package/plugins/draw/src/adapters/maplibre/modes/createDrawMode.js +58 -0
  47. package/plugins/draw/src/adapters/maplibre/modes/createDrawMode.test.js +53 -0
  48. package/plugins/draw/src/adapters/maplibre/modes/disabledMode.js +23 -0
  49. package/plugins/draw/src/adapters/maplibre/modes/disabledMode.test.js +21 -0
  50. package/plugins/draw/src/adapters/maplibre/modes/drawLineMode.js +15 -0
  51. package/plugins/draw/src/adapters/maplibre/modes/drawLineMode.test.js +37 -0
  52. package/plugins/draw/src/adapters/maplibre/modes/drawMode/__helpers__/harness.js +115 -0
  53. package/plugins/draw/src/adapters/maplibre/modes/drawMode/clickHandlers.js +193 -0
  54. package/plugins/draw/src/adapters/maplibre/modes/drawMode/clickHandlers.test.js +241 -0
  55. package/plugins/draw/src/adapters/maplibre/modes/drawMode/keyboardHandlers.js +78 -0
  56. package/plugins/draw/src/adapters/maplibre/modes/drawMode/keyboardHandlers.test.js +75 -0
  57. package/plugins/draw/src/adapters/maplibre/modes/drawMode/lifecycle.js +78 -0
  58. package/plugins/draw/src/adapters/maplibre/modes/drawMode/lifecycle.test.js +48 -0
  59. package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.js +103 -0
  60. package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.test.js +127 -0
  61. package/plugins/draw/src/adapters/maplibre/modes/drawMode/renderHelpers.js +59 -0
  62. package/plugins/draw/src/adapters/maplibre/modes/drawMode/renderHelpers.test.js +34 -0
  63. package/plugins/draw/src/adapters/maplibre/modes/drawMode/undoHandlers.js +193 -0
  64. package/plugins/draw/src/adapters/maplibre/modes/drawMode/undoHandlers.test.js +195 -0
  65. package/plugins/draw/src/adapters/maplibre/modes/drawPolygonMode.js +16 -0
  66. package/plugins/draw/src/adapters/maplibre/modes/drawPolygonMode.test.js +27 -0
  67. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/__helpers__/harness.js +107 -0
  68. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/geometryHelpers.js +139 -0
  69. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/geometryHelpers.test.js +46 -0
  70. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/helpers.js +2 -0
  71. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/helpers.test.js +17 -0
  72. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.js +151 -0
  73. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.test.js +123 -0
  74. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/pointerHandlers.js +161 -0
  75. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/pointerHandlers.test.js +98 -0
  76. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/touchHandlers.js +133 -0
  77. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/touchHandlers.test.js +105 -0
  78. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/undoHandlers.js +166 -0
  79. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/undoHandlers.test.js +133 -0
  80. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.js +210 -0
  81. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.test.js +167 -0
  82. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexQueries.js +121 -0
  83. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexQueries.test.js +73 -0
  84. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.js +249 -0
  85. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.test.js +153 -0
  86. package/plugins/draw/src/adapters/maplibre/snap/constants.js +2 -0
  87. package/plugins/draw/src/adapters/maplibre/snap/mapHandlers.js +39 -0
  88. package/plugins/draw/src/adapters/maplibre/snap/mapHandlers.test.js +106 -0
  89. package/plugins/draw/src/adapters/maplibre/snap/prototypePatches.js +148 -0
  90. package/plugins/draw/src/adapters/maplibre/snap/prototypePatches.test.js +238 -0
  91. package/plugins/draw/src/adapters/maplibre/snap/snapInstance.js +115 -0
  92. package/plugins/draw/src/adapters/maplibre/snap/snapInstance.test.js +151 -0
  93. package/plugins/draw/src/adapters/maplibre/snap/sourceData.js +34 -0
  94. package/plugins/draw/src/adapters/maplibre/snap/sourceData.test.js +62 -0
  95. package/plugins/draw/src/adapters/maplibre/styles.js +207 -0
  96. package/plugins/draw/src/adapters/maplibre/styles.test.js +155 -0
  97. package/plugins/draw/src/adapters/maplibre/utils/snapHelpers.js +202 -0
  98. package/plugins/draw/src/adapters/maplibre/utils/snapHelpers.test.js +253 -0
  99. package/plugins/draw/src/adapters/maplibre/utils/touchClickWorkaround.js +57 -0
  100. package/plugins/draw/src/adapters/maplibre/utils/touchClickWorkaround.test.js +106 -0
  101. package/plugins/draw/src/adapters/openlayers/OLDrawAdapter.js +117 -0
  102. package/plugins/draw/src/adapters/openlayers/OLDrawAdapter.test.js +159 -0
  103. package/plugins/draw/src/adapters/openlayers/__helpers__/harness.js +90 -0
  104. package/plugins/draw/src/adapters/openlayers/core/OLDrawManager.js +178 -0
  105. package/plugins/draw/src/adapters/openlayers/core/OLDrawManager.test.js +153 -0
  106. package/plugins/draw/src/adapters/openlayers/core/featureStore.js +69 -0
  107. package/plugins/draw/src/adapters/openlayers/core/featureStore.test.js +58 -0
  108. package/plugins/draw/src/adapters/openlayers/core/internalEvents.js +8 -0
  109. package/plugins/draw/src/adapters/openlayers/core/styles.js +155 -0
  110. package/plugins/draw/src/adapters/openlayers/core/styles.test.js +143 -0
  111. package/plugins/draw/src/adapters/openlayers/defaults.js +1 -0
  112. package/plugins/draw/src/adapters/openlayers/draw/DrawMode.js +272 -0
  113. package/plugins/draw/src/adapters/openlayers/draw/DrawMode.test.js +431 -0
  114. package/plugins/draw/src/adapters/openlayers/draw/drawInput.js +139 -0
  115. package/plugins/draw/src/adapters/openlayers/draw/drawInput.test.js +140 -0
  116. package/plugins/draw/src/adapters/openlayers/draw/vertexPlacement.js +144 -0
  117. package/plugins/draw/src/adapters/openlayers/draw/vertexPlacement.test.js +196 -0
  118. package/plugins/draw/src/adapters/openlayers/edit/EditMode.js +385 -0
  119. package/plugins/draw/src/adapters/openlayers/edit/EditMode.test.js +303 -0
  120. package/plugins/draw/src/adapters/openlayers/edit/activeVertexLayer.js +55 -0
  121. package/plugins/draw/src/adapters/openlayers/edit/activeVertexLayer.test.js +53 -0
  122. package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.js +157 -0
  123. package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.test.js +195 -0
  124. package/plugins/draw/src/adapters/openlayers/edit/midpointLayer.js +57 -0
  125. package/plugins/draw/src/adapters/openlayers/edit/midpointLayer.test.js +42 -0
  126. package/plugins/draw/src/adapters/openlayers/edit/modifyInteraction.js +83 -0
  127. package/plugins/draw/src/adapters/openlayers/edit/modifyInteraction.test.js +80 -0
  128. package/plugins/draw/src/adapters/openlayers/edit/nudge.js +118 -0
  129. package/plugins/draw/src/adapters/openlayers/edit/nudge.test.js +165 -0
  130. package/plugins/draw/src/adapters/openlayers/edit/pointerHandlers.js +79 -0
  131. package/plugins/draw/src/adapters/openlayers/edit/pointerHandlers.test.js +78 -0
  132. package/plugins/draw/src/adapters/openlayers/edit/selectionState.js +116 -0
  133. package/plugins/draw/src/adapters/openlayers/edit/selectionState.test.js +109 -0
  134. package/plugins/draw/src/adapters/openlayers/edit/touchHandler.js +184 -0
  135. package/plugins/draw/src/adapters/openlayers/edit/touchHandler.test.js +133 -0
  136. package/plugins/draw/src/adapters/openlayers/edit/undoOps.js +94 -0
  137. package/plugins/draw/src/adapters/openlayers/edit/undoOps.test.js +64 -0
  138. package/plugins/draw/src/adapters/openlayers/edit/vertexHitTest.js +74 -0
  139. package/plugins/draw/src/adapters/openlayers/edit/vertexHitTest.test.js +28 -0
  140. package/plugins/draw/src/adapters/openlayers/edit/vertexLayer.js +49 -0
  141. package/plugins/draw/src/adapters/openlayers/edit/vertexLayer.test.js +42 -0
  142. package/plugins/draw/src/adapters/openlayers/edit/vertexOps.js +100 -0
  143. package/plugins/draw/src/adapters/openlayers/edit/vertexOps.test.js +80 -0
  144. package/plugins/draw/src/adapters/openlayers/olDraw.js +40 -0
  145. package/plugins/draw/src/adapters/openlayers/olDraw.test.js +70 -0
  146. package/plugins/draw/src/adapters/openlayers/snap/snapEngine.js +220 -0
  147. package/plugins/draw/src/adapters/openlayers/snap/snapEngine.test.js +232 -0
  148. package/plugins/draw/src/adapters/openlayers/snap/snapGeometry.js +198 -0
  149. package/plugins/draw/src/adapters/openlayers/snap/snapGeometry.test.js +136 -0
  150. package/plugins/draw/src/adapters/openlayers/snap/snapIndicator.js +81 -0
  151. package/plugins/draw/src/adapters/openlayers/snap/snapIndicator.test.js +72 -0
  152. package/plugins/draw/src/adapters/openlayers/snap/snapInteraction.js +57 -0
  153. package/plugins/draw/src/adapters/openlayers/snap/snapInteraction.test.js +68 -0
  154. package/plugins/draw/src/adapters/openlayers/snap/snapManager.js +99 -0
  155. package/plugins/draw/src/adapters/openlayers/snap/snapManager.test.js +101 -0
  156. package/plugins/draw/src/adapters/openlayers/utils/geometryHelpers.js +103 -0
  157. package/plugins/draw/src/adapters/openlayers/utils/geometryHelpers.test.js +76 -0
  158. package/plugins/draw/src/adapters/openlayers/utils/olCoords.js +35 -0
  159. package/plugins/draw/src/adapters/openlayers/utils/olCoords.test.js +22 -0
  160. package/plugins/draw/src/adapters/openlayers/utils/sketchHelpers.js +22 -0
  161. package/plugins/draw/src/adapters/openlayers/utils/sketchHelpers.test.js +18 -0
  162. package/plugins/draw/src/adapters/openlayers/utils/touchTarget.js +8 -0
  163. package/plugins/draw/src/api/addFeature.js +22 -0
  164. package/plugins/draw/src/api/addFeature.test.js +41 -0
  165. package/plugins/draw/src/api/deleteFeature.js +11 -0
  166. package/plugins/draw/src/api/deleteFeature.test.js +24 -0
  167. package/plugins/draw/src/api/editFeature.js +54 -0
  168. package/plugins/draw/src/api/editFeature.test.js +134 -0
  169. package/plugins/draw/src/api/merge.js +30 -0
  170. package/plugins/draw/src/api/merge.test.js +57 -0
  171. package/plugins/draw/src/api/newLine.js +41 -0
  172. package/plugins/draw/src/api/newLine.test.js +93 -0
  173. package/plugins/draw/src/api/newPolygon.js +41 -0
  174. package/plugins/draw/src/api/newPolygon.test.js +93 -0
  175. package/plugins/draw/src/api/split.js +117 -0
  176. package/plugins/draw/src/api/split.test.js +204 -0
  177. package/plugins/draw/src/defaults.js +52 -0
  178. package/plugins/draw/src/defaults.test.js +18 -0
  179. package/plugins/draw/src/draw.scss +43 -0
  180. package/plugins/draw/src/events.js +237 -0
  181. package/plugins/draw/src/events.test.js +369 -0
  182. package/plugins/draw/src/index.js +10 -0
  183. package/plugins/draw/src/index.test.js +24 -0
  184. package/plugins/draw/src/manifest.js +170 -0
  185. package/plugins/draw/src/manifest.test.js +147 -0
  186. package/plugins/draw/src/reducer.js +69 -0
  187. package/plugins/draw/src/reducer.test.js +85 -0
  188. package/plugins/draw/src/utils/debounce.js +16 -0
  189. package/plugins/draw/src/utils/debounce.test.js +40 -0
  190. package/plugins/draw/src/utils/eventBus.js +36 -0
  191. package/plugins/draw/src/utils/eventBus.test.js +47 -0
  192. package/plugins/draw/src/utils/flattenStyleProperties.js +25 -0
  193. package/plugins/draw/src/utils/flattenStyleProperties.test.js +33 -0
  194. package/plugins/draw/src/utils/getValueForStyle.js +33 -0
  195. package/plugins/draw/src/utils/getValueForStyle.test.js +32 -0
  196. package/plugins/draw/src/utils/resolveColors.js +39 -0
  197. package/plugins/draw/src/utils/resolveColors.test.js +34 -0
  198. package/plugins/draw/src/utils/spatial.js +243 -0
  199. package/plugins/draw/src/utils/spatial.test.js +243 -0
  200. package/plugins/draw/src/utils/touchTarget.js +95 -0
  201. package/plugins/draw/src/utils/touchTarget.test.js +107 -0
  202. package/plugins/draw/src/utils/undoStack.js +31 -0
  203. package/plugins/draw/src/utils/undoStack.test.js +49 -0
  204. package/plugins/draw/src/validation/liveDrawChecks.js +120 -0
  205. package/plugins/draw/src/validation/liveDrawChecks.test.js +159 -0
  206. package/plugins/draw/src/validation/liveStroke.js +85 -0
  207. package/plugins/draw/src/validation/liveStroke.test.js +150 -0
  208. package/plugins/draw/src/validation/rules.areaError.test.js +12 -0
  209. package/plugins/draw/src/validation/rules.js +186 -0
  210. package/plugins/draw/src/validation/rules.test.js +120 -0
  211. package/plugins/draw/src/validation/validateGeometry.js +119 -0
  212. package/plugins/draw/src/validation/validateGeometry.test.js +200 -0
  213. package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
  214. package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
  215. package/plugins/interact/src/hooks/useInteractionHandlers.js +1 -1
  216. package/plugins/interact/src/hooks/useInteractionHandlers.test.js +1 -1
  217. package/plugins/interact/src/utils/buildStylesMap.js +1 -0
  218. package/plugins/search/dist/css/index.css +1 -317
  219. package/rollup.esm.mjs +35 -28
  220. package/sonar-project.properties +2 -2
  221. package/src/App/components/Attributions/Attributions.module.scss +1 -0
  222. package/src/App/components/Hints/Hints.module.scss +5 -4
  223. package/src/App/components/KeyboardHelp/KeyboardHelp.jsx +1 -1
  224. package/src/App/components/KeyboardHelp/KeyboardHelp.test.jsx +11 -0
  225. package/src/App/components/MoveControl/MoveControl.jsx +73 -9
  226. package/src/App/components/MoveControl/MoveControl.module.scss +12 -2
  227. package/src/App/components/MoveControl/MoveControl.test.jsx +136 -0
  228. package/src/App/hooks/useHintsAPI.js +67 -0
  229. package/src/App/hooks/useHintsAPI.test.js +145 -0
  230. package/src/App/renderer/PluginInits.jsx +4 -0
  231. package/src/App/renderer/PluginInits.test.jsx +7 -1
  232. package/src/InteractiveMap/InteractiveMap.js +20 -0
  233. package/src/InteractiveMap/InteractiveMap.test.js +7 -0
  234. package/src/config/events.js +4 -0
  235. package/src/scss/settings/_dimensions.scss +3 -0
  236. package/src/services/announcer.js +38 -3
  237. package/src/services/announcer.test.js +133 -1
  238. package/src/services/hints.js +3 -0
  239. package/src/services/hints.test.js +19 -0
  240. package/src/types.js +12 -0
  241. package/src/utils/detectInterfaceType.js +5 -1
  242. package/src/utils/isMac.js +15 -0
  243. package/src/utils/isMac.test.js +37 -0
  244. package/webpack.umd.mjs +1 -0
@@ -1,317 +1 @@
1
- .im-c-search-form {
2
- display: none;
3
- padding: 0;
4
- min-height: auto;
5
- border-radius: 0;
6
- filter: var(--search-drop-shadow);
7
- -webkit-transform: translate3d(0, 0, 0);
8
- -moz-transform: translate3d(0, 0, 0);
9
- -ms-transform: translate3d(0, 0, 0);
10
- transform: translate3d(0, 0, 0);
11
- }
12
- .im-c-search-form:before {
13
- border-radius: 0;
14
- box-shadow: none;
15
- }
16
-
17
- .im-o-app--mobile .im-c-search-form {
18
- position: absolute;
19
- left: 0;
20
- top: 0;
21
- right: 0;
22
- height: auto;
23
- overflow: visible;
24
- }
25
-
26
- .im-o-app--tablet .im-c-search-form,
27
- .im-o-app--desktop .im-c-search-form {
28
- position: relative;
29
- overflow: visible;
30
- border-radius: var(--button-border-radius);
31
- box-shadow: none;
32
- }
33
- .im-o-app--tablet .im-c-search-form:before,
34
- .im-o-app--desktop .im-c-search-form:before {
35
- border-radius: var(--button-border-radius);
36
- }
37
- .im-o-app--tablet .im-c-search-form .im-c-search-suggestions,
38
- .im-o-app--desktop .im-c-search-form .im-c-search-suggestions {
39
- position: absolute;
40
- top: calc(100% + 2px);
41
- left: 0;
42
- right: 0;
43
- z-index: 1;
44
- }
45
-
46
- .im-c-search__status {
47
- position: absolute;
48
- top: 100%;
49
- left: 0;
50
- right: 0;
51
- padding: var(--divider-gap) calc(var(--divider-gap) + 2px);
52
- background-color: var(--background-color);
53
- border-top: 1px solid var(--button-hover-color);
54
- border-bottom-left-radius: var(--button-border-radius);
55
- border-bottom-right-radius: var(--button-border-radius);
56
- }
57
-
58
- .im-o-app--mobile .im-c-search-form--default-expanded {
59
- position: relative;
60
- margin: calc(-1 * var(--primary-gap)) calc(-1 * var(--primary-gap)) 0;
61
- }
62
- .im-o-app--mobile .im-c-search-form--default-expanded .im-c-search-suggestions {
63
- position: absolute;
64
- top: 100%;
65
- width: 100%;
66
- left: 0;
67
- }
68
-
69
- .im-c-search-close-button {
70
- position: relative;
71
- }
72
- .im-c-search-close-button:before {
73
- box-shadow: none;
74
- }
75
- .im-c-search-close-button[data-focus-visible=true] {
76
- z-index: 1;
77
- }
78
- .im-c-search-close-button:hover {
79
- z-index: 1;
80
- }
81
-
82
- .im-c-search-submit-button {
83
- position: relative;
84
- }
85
- .im-c-search-submit-button:before {
86
- box-shadow: none;
87
- }
88
- .im-c-search-submit-button[data-focus-visible=true] {
89
- z-index: 1;
90
- }
91
-
92
- .im-c-search-suggestions {
93
- max-height: calc(100vh - 66px);
94
- overflow-y: auto;
95
- scroll-padding: 0;
96
- margin: 0;
97
- padding: 0;
98
- background-color: var(--background-color);
99
- list-style: none;
100
- }
101
-
102
- .im-c-search-suggestions__item {
103
- margin: 0;
104
- padding: calc(var(--divider-gap) + 2px) var(--primary-gap);
105
- position: relative;
106
- color: var(--secondary-text-color);
107
- border-top: 1px solid var(--button-hover-color);
108
- cursor: pointer;
109
- user-select: none;
110
- }
111
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
112
- .im-c-search-suggestions__item {
113
- color: Highlight;
114
- }
115
- }
116
- .im-c-search-suggestions__item mark {
117
- font-weight: bold;
118
- color: var(--foreground-color);
119
- background-color: transparent;
120
- pointer-events: none;
121
- }
122
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
123
- .im-c-search-suggestions__item mark {
124
- color: Highlight;
125
- }
126
- }
127
- @media (hover: hover) and (pointer: fine) {
128
- .im-c-search-suggestions__item:hover:not([aria-selected=true]) {
129
- background-color: var(--button-hover-color);
130
- }
131
- }
132
- .im-c-search-suggestions__item[aria-selected=true] {
133
- background-color: var(--button-hover-color);
134
- }
135
- .im-c-search-suggestions__item[aria-selected=true] mark {
136
- color: var(--fixed-foreground-color);
137
- }
138
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
139
- .im-c-search-suggestions__item[aria-selected=true] mark {
140
- color: Highlight;
141
- }
142
- }
143
- .im-c-search-suggestions__item:hover:not([aria-selected=true]) .im-c-search-suggestions__label {
144
- text-decoration: underline;
145
- text-underline-offset: 2px;
146
- text-decoration-thickness: 2px;
147
- text-decoration-color: var(--foreground-color);
148
- text-decoration-skip-ink: none;
149
- }
150
- .im-c-search-suggestions__item[aria-selected=true] .im-c-search-suggestions__label {
151
- outline: 3px solid rgba(0, 0, 0, 0);
152
- color: var(--focus-border-color);
153
- background-color: var(--focus-outline-color);
154
- box-shadow: 0 -2px var(--focus-outline-color), 0 4px var(--focus-border-color);
155
- text-decoration: none;
156
- }
157
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
158
- .im-c-search-suggestions__item[aria-selected=true] .im-c-search-suggestions__label {
159
- outline-color: Highlight;
160
- color: Highlight;
161
- }
162
- }
163
-
164
- .im-c-search-suggestions__label {
165
- display: block;
166
- overflow: hidden;
167
- white-space: nowrap;
168
- text-overflow: ellipsis;
169
- }
170
-
171
- .im-o-app--mobile .im-c-search-form--default-expanded .im-c-search-suggestions {
172
- box-shadow: var(--panel-box-shadow);
173
- clip-path: inset(0px 0px -20px 0px);
174
- }
175
-
176
- .im-o-app--tablet .im-c-search-suggestions,
177
- .im-o-app--desktop .im-c-search-suggestions {
178
- border-bottom-left-radius: var(--button-border-radius);
179
- border-bottom-right-radius: var(--button-border-radius);
180
- }
181
- .im-o-app--tablet .im-c-search-suggestions__item,
182
- .im-o-app--desktop .im-c-search-suggestions__item {
183
- padding: var(--divider-gap) calc(var(--divider-gap) + 2px);
184
- }
185
-
186
- :root {
187
- --search-drop-shadow: drop-shadow(0 -2px 20px rgba(0,0,0,.1)) drop-shadow(0 0 12px rgba(0,0,0,.1));
188
- }
189
-
190
- .im-c-search--collapsed {
191
- display: none;
192
- }
193
-
194
- .im-c-search__input-container {
195
- display: flex;
196
- position: relative;
197
- flex: 1 1 auto;
198
- min-height: auto;
199
- height: var(--button-size);
200
- }
201
- .im-c-search__input-container:before {
202
- content: "";
203
- z-index: 1;
204
- position: absolute;
205
- top: -2px;
206
- right: -2px;
207
- bottom: -2px;
208
- left: -2px;
209
- border-radius: var(--button-border-radius);
210
- border: 2px solid var(--foreground-color);
211
- pointer-events: none;
212
- }
213
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
214
- .im-c-search__input-container:before {
215
- border-color: ButtonText;
216
- }
217
- }
218
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
219
- .im-c-search__input-container:hover:not(:has(.im-c-search-close-button:hover)):before {
220
- border-color: Highlight;
221
- }
222
- }
223
- .im-c-search__input-container:after {
224
- position: absolute;
225
- content: "";
226
- pointer-events: none;
227
- z-index: 99;
228
- top: -1px;
229
- right: -1px;
230
- bottom: -1px;
231
- left: -1px;
232
- border: var(--focus-border-width) solid var(--focus-border-color);
233
- outline: var(--focus-box-shadow-width) solid var(--focus-outline-color);
234
- border-radius: calc(var(--button-border-radius) - 2px);
235
- opacity: 0;
236
- }
237
- @media (prefers-reduced-motion: no-preference) {
238
- .im-c-search__input-container:after {
239
- transition: opacity var(--duration) ease;
240
- }
241
- }
242
-
243
- .im-o-app .im-c-search__input {
244
- width: 100%;
245
- color: var(--foreground-color);
246
- background-color: transparent;
247
- font-size: 1rem;
248
- border: 0;
249
- padding: var(--divider-gap) calc(var(--divider-gap) + 2px);
250
- outline: 0;
251
- }
252
- .im-o-app .im-c-search__input:focus {
253
- outline: 3px solid transparent;
254
- box-shadow: none;
255
- }
256
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
257
- .im-o-app .im-c-search__input:focus {
258
- outline: none;
259
- }
260
- }
261
- .im-o-app .im-c-search__input::placeholder {
262
- color: var(--foreground-color);
263
- }
264
- .im-o-app .im-c-search__input::-webkit-search-cancel-button {
265
- -webkit-appearance: none;
266
- appearance: none;
267
- display: none;
268
- }
269
- .im-o-app .im-c-search__input::-moz-search-clear {
270
- display: none;
271
- }
272
-
273
- .im-c-search__hint {
274
- display: none;
275
- }
276
-
277
- .im-o-app--exclusive-control .im-o-app__top .im-c-button-wrapper,
278
- .im-o-app--exclusive-control .im-o-app__right .im-c-button-wrapper {
279
- opacity: 0;
280
- z-index: -1;
281
- }
282
- .im-o-app--exclusive-control .im-c-button-wrapper--search {
283
- position: absolute;
284
- pointer-events: none;
285
- }
286
- .im-o-app--exclusive-control .im-o-app__left-top .im-c-panel,
287
- .im-o-app--exclusive-control .im-o-app__left-bottom .im-c-panel,
288
- .im-o-app--exclusive-control .im-o-app__right-top .im-c-panel,
289
- .im-o-app--exclusive-control .im-o-app__right-bottom .im-c-panel {
290
- opacity: 0;
291
- z-index: -1;
292
- }
293
-
294
- .im-o-app--mobile .im-c-search__input-container {
295
- margin: var(--primary-gap);
296
- }
297
-
298
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
299
- .im-c-search__input-container--keyboard-focus-within:before {
300
- border-color: Highlight;
301
- }
302
- }
303
-
304
- .im-c-search__input-container--keyboard-focus-within:after {
305
- opacity: 1;
306
- }
307
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
308
- .im-c-search__input-container--keyboard-focus-within:after {
309
- opacity: 0;
310
- }
311
- }
312
-
313
- @media (-ms-high-contrast: active), screen and (forced-colors: active) {
314
- .im-c-search__input-container--keyboard-focus-within {
315
- outline: var(--focus-highlight-width) solid Highlight;
316
- }
317
- }
1
+ .im-c-search-form{display:none;padding:0;min-height:auto;border-radius:0;filter:var(--search-drop-shadow);-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.im-c-search-form:before{border-radius:0;box-shadow:none}.im-o-app--mobile .im-c-search-form{position:absolute;left:0;top:0;right:0;height:auto;overflow:visible}.im-o-app--tablet .im-c-search-form,.im-o-app--desktop .im-c-search-form{position:relative;overflow:visible;border-radius:var(--button-border-radius);box-shadow:none}.im-o-app--tablet .im-c-search-form:before,.im-o-app--desktop .im-c-search-form:before{border-radius:var(--button-border-radius)}.im-o-app--tablet .im-c-search-form .im-c-search-suggestions,.im-o-app--desktop .im-c-search-form .im-c-search-suggestions{position:absolute;top:calc(100% + 2px);left:0;right:0;z-index:1}.im-c-search__status{position:absolute;top:100%;left:0;right:0;padding:var(--divider-gap) calc(var(--divider-gap) + 2px);background-color:var(--background-color);border-top:1px solid var(--button-hover-color);border-bottom-left-radius:var(--button-border-radius);border-bottom-right-radius:var(--button-border-radius)}.im-o-app--mobile .im-c-search-form--default-expanded{position:relative;margin:calc(-1*var(--primary-gap)) calc(-1*var(--primary-gap)) 0}.im-o-app--mobile .im-c-search-form--default-expanded .im-c-search-suggestions{position:absolute;top:100%;width:100%;left:0}.im-c-search-close-button{position:relative}.im-c-search-close-button:before{box-shadow:none}.im-c-search-close-button[data-focus-visible=true]{z-index:1}.im-c-search-close-button:hover{z-index:1}.im-c-search-submit-button{position:relative}.im-c-search-submit-button:before{box-shadow:none}.im-c-search-submit-button[data-focus-visible=true]{z-index:1}.im-c-search-suggestions{max-height:calc(100vh - 66px);overflow-y:auto;scroll-padding:0;margin:0;padding:0;background-color:var(--background-color);list-style:none}.im-c-search-suggestions__item{margin:0;padding:calc(var(--divider-gap) + 2px) var(--primary-gap);position:relative;color:var(--secondary-text-color);border-top:1px solid var(--button-hover-color);cursor:pointer;user-select:none}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search-suggestions__item{color:Highlight}}.im-c-search-suggestions__item mark{font-weight:bold;color:var(--foreground-color);background-color:rgba(0,0,0,0);pointer-events:none}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search-suggestions__item mark{color:Highlight}}@media(hover: hover)and (pointer: fine){.im-c-search-suggestions__item:hover:not([aria-selected=true]){background-color:var(--button-hover-color)}}.im-c-search-suggestions__item[aria-selected=true]{background-color:var(--button-hover-color)}.im-c-search-suggestions__item[aria-selected=true] mark{color:var(--fixed-foreground-color)}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search-suggestions__item[aria-selected=true] mark{color:Highlight}}.im-c-search-suggestions__item:hover:not([aria-selected=true]) .im-c-search-suggestions__label{text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:2px;text-decoration-color:var(--foreground-color);text-decoration-skip-ink:none}.im-c-search-suggestions__item[aria-selected=true] .im-c-search-suggestions__label{outline:3px solid rgba(0,0,0,0);color:var(--focus-border-color);background-color:var(--focus-outline-color);box-shadow:0 -2px var(--focus-outline-color),0 4px var(--focus-border-color);text-decoration:none}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search-suggestions__item[aria-selected=true] .im-c-search-suggestions__label{outline-color:Highlight;color:Highlight}}.im-c-search-suggestions__label{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.im-o-app--mobile .im-c-search-form--default-expanded .im-c-search-suggestions{box-shadow:var(--panel-box-shadow);clip-path:inset(0px 0px -20px 0px)}.im-o-app--tablet .im-c-search-suggestions,.im-o-app--desktop .im-c-search-suggestions{border-bottom-left-radius:var(--button-border-radius);border-bottom-right-radius:var(--button-border-radius)}.im-o-app--tablet .im-c-search-suggestions__item,.im-o-app--desktop .im-c-search-suggestions__item{padding:var(--divider-gap) calc(var(--divider-gap) + 2px)}:root{--search-drop-shadow: drop-shadow(0 -2px 20px rgba(0,0,0,.1)) drop-shadow(0 0 12px rgba(0,0,0,.1))}.im-c-search--collapsed{display:none}.im-c-search__input-container{display:flex;position:relative;flex:1 1 auto;min-height:auto;height:var(--button-size)}.im-c-search__input-container:before{content:"";z-index:1;position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:var(--button-border-radius);border:2px solid var(--foreground-color);pointer-events:none}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search__input-container:before{border-color:ButtonText}}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search__input-container:hover:not(:has(.im-c-search-close-button:hover)):before{border-color:Highlight}}.im-c-search__input-container:after{position:absolute;content:"";pointer-events:none;z-index:99;top:-1px;right:-1px;bottom:-1px;left:-1px;border:var(--focus-border-width) solid var(--focus-border-color);outline:var(--focus-box-shadow-width) solid var(--focus-outline-color);border-radius:calc(var(--button-border-radius) - 2px);opacity:0}@media(prefers-reduced-motion: no-preference){.im-c-search__input-container:after{transition:opacity var(--duration) ease}}.im-o-app .im-c-search__input{width:100%;color:var(--foreground-color);background-color:rgba(0,0,0,0);font-size:1rem;border:0;padding:var(--divider-gap) calc(var(--divider-gap) + 2px);outline:0}.im-o-app .im-c-search__input:focus{outline:3px solid rgba(0,0,0,0);box-shadow:none}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-o-app .im-c-search__input:focus{outline:none}}.im-o-app .im-c-search__input::placeholder{color:var(--foreground-color)}.im-o-app .im-c-search__input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none;display:none}.im-o-app .im-c-search__input::-moz-search-clear{display:none}.im-c-search__hint{display:none}.im-o-app--exclusive-control .im-o-app__top .im-c-button-wrapper,.im-o-app--exclusive-control .im-o-app__right .im-c-button-wrapper{opacity:0;z-index:-1}.im-o-app--exclusive-control .im-c-button-wrapper--search{position:absolute;pointer-events:none}.im-o-app--exclusive-control .im-o-app__left-top .im-c-panel,.im-o-app--exclusive-control .im-o-app__left-bottom .im-c-panel,.im-o-app--exclusive-control .im-o-app__right-top .im-c-panel,.im-o-app--exclusive-control .im-o-app__right-bottom .im-c-panel{opacity:0;z-index:-1}.im-o-app--mobile .im-c-search__input-container{margin:var(--primary-gap)}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search__input-container--keyboard-focus-within:before{border-color:Highlight}}.im-c-search__input-container--keyboard-focus-within:after{opacity:1}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search__input-container--keyboard-focus-within:after{opacity:0}}@media(-ms-high-contrast: active),screen and (forced-colors: active){.im-c-search__input-container--keyboard-focus-within{outline:var(--focus-highlight-width) solid Highlight}}
package/rollup.esm.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import path, { dirname } from 'path'
2
- import { fileURLToPath } from 'url'
3
- import fs from 'fs'
1
+ import path, { dirname } from 'node:path'
2
+ import { fileURLToPath } from 'node:url'
3
+ import fs from 'node:fs'
4
4
 
5
5
  import { nodeResolve } from '@rollup/plugin-node-resolve'
6
6
  import commonjs from '@rollup/plugin-commonjs'
@@ -11,7 +11,7 @@ import terser from '@rollup/plugin-terser'
11
11
  import postcss from 'rollup-plugin-postcss'
12
12
  import { visualizer } from 'rollup-plugin-visualizer'
13
13
 
14
- const __dirname = dirname(fileURLToPath(import.meta.url))
14
+ const __dirname = dirname(fileURLToPath(import.meta.url)) // NOSONAR - Standard Node.js convention in bundler configs
15
15
 
16
16
  /**
17
17
  * Cleans output directories before each build starts.
@@ -69,7 +69,7 @@ const removeFullCssPlugin = (cssDir) => ({
69
69
  // rewritten by the alias plugin before Rollup's external check fires.
70
70
  const PREACT_EXTERNALS = [
71
71
  'preact',
72
- 'preact/compat',
72
+ 'preact/compat', // NOSONAR
73
73
  'preact/compat/client',
74
74
  'preact/hooks',
75
75
  'preact/jsx-runtime'
@@ -177,13 +177,12 @@ const createESMConfig = (entryPath, outDir, isCore = false, manualChunks = null,
177
177
  ...(isCore ? [removeFullCssPlugin(cssDir)] : []),
178
178
 
179
179
  // Only runs when ANALYZE=1 is set; writes stats to dist/stats/<name>.html
180
- ...(process.env.ANALYZE
181
- ? [visualizer({
182
- filename: path.resolve(__dirname, 'dist/stats', `${outDir.replace(/\//g, '-')}.html`),
180
+ ...(process.env.ANALYZE ? [visualizer({
181
+ filename: path.resolve(__dirname, 'dist/stats', `${outDir.replace(/\//g, '-')}.html`), // NOSONAR replaceAll() requires Chrome 84 or later
183
182
  open: false,
184
183
  gzipSize: true
185
184
  })]
186
- : [])
185
+ : [])
187
186
  ],
188
187
 
189
188
  output: {
@@ -219,83 +218,91 @@ const ALL_BUILDS = [
219
218
  entryPath: './providers/maplibre/src/index.js',
220
219
  outDir: 'providers/maplibre/dist/esm',
221
220
  // maplibre-gl is external; only the provider class itself becomes a chunk
222
- manualChunks: (id) => { if (id.includes('/maplibreProvider')) return 'im-maplibre-provider' }
221
+ manualChunks: (id) => id.includes('/maplibreProvider') ? 'im-maplibre-provider' : undefined
223
222
  },
224
223
  {
225
224
  entryPath: './providers/beta/open-names/src/index.js',
226
225
  outDir: 'providers/beta/open-names/dist/esm',
227
- manualChunks: (id) => { if (id.includes('/reverseGeocode')) return 'im-reverse-geocode' }
226
+ manualChunks: (id) => id.includes('/reverseGeocode') ? 'im-reverse-geocode' : undefined
228
227
  },
229
228
  {
230
229
  entryPath: './providers/beta/esri/src/index.js',
231
230
  outDir: 'providers/beta/esri/dist/esm',
232
- manualChunks: (id) => { if (id.includes('/esriProvider')) return 'im-esri-provider' }
231
+ manualChunks: (id) => id.includes('/esriProvider') ? 'im-esri-provider' : undefined
233
232
  },
234
233
  {
235
234
  entryPath: './providers/beta/openlayers/src/index.js',
236
235
  outDir: 'providers/beta/openlayers/dist/esm',
237
236
  extraExternals: [/^ol\//, 'proj4'],
238
- manualChunks: (id) => {
239
- if (id.includes('/openlayersProvider')) {
240
- return 'im-openlayers-provider'
241
- }
242
- }
237
+ manualChunks: (id) => id.includes('/openlayersProvider') ? 'im-openlayers-provider' : undefined
243
238
  },
244
239
 
245
240
  // Plugins — each lazy-loads ./manifest.js; manualChunks names that split chunk
246
241
  {
247
242
  entryPath: './plugins/beta/scale-bar/src/index.js',
248
243
  outDir: 'plugins/beta/scale-bar/dist/esm',
249
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-scale-bar-plugin' }
244
+ manualChunks: (id) => id.includes('/manifest') ? 'im-scale-bar-plugin' : undefined
250
245
  },
251
246
  {
252
247
  entryPath: './plugins/beta/use-location/src/index.js',
253
248
  outDir: 'plugins/beta/use-location/dist/esm',
254
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-use-location-plugin' }
249
+ manualChunks: (id) => id.includes('/manifest') ? 'im-use-location-plugin' : undefined
255
250
  },
256
251
  {
257
252
  entryPath: './plugins/search/src/index.js',
258
253
  outDir: 'plugins/search/dist/esm',
259
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-search-plugin' }
254
+ manualChunks: (id) => id.includes('/manifest') ? 'im-search-plugin' : undefined
260
255
  },
261
256
  {
262
257
  entryPath: './plugins/interact/src/index.js',
263
258
  outDir: 'plugins/interact/dist/esm',
264
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-interact-plugin' }
259
+ manualChunks: (id) => id.includes('/manifest') ? 'im-interact-plugin' : undefined
265
260
  },
266
261
  {
267
262
  entryPath: './plugins/datasets/src/index.js',
268
263
  outDir: 'plugins/datasets/dist/esm',
269
264
  manualChunks: (id) => {
270
- if (id.includes('/manifest')) return 'im-datasets-plugin'
271
- if (id.includes('maplibreLayerAdapter')) return 'im-datasets-ml-adapter'
265
+ if (id.includes('/manifest')) { return 'im-datasets-plugin' }
266
+ if (id.includes('maplibreLayerAdapter')) { return 'im-datasets-ml-adapter' }
267
+ return undefined
272
268
  }
273
269
  },
274
270
  {
275
271
  entryPath: './plugins/beta/map-styles/src/index.js',
276
272
  outDir: 'plugins/beta/map-styles/dist/esm',
277
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-map-styles-plugin' }
273
+ manualChunks: (id) => id.includes('/manifest') ? 'im-map-styles-plugin' : undefined
274
+ },
275
+ {
276
+ entryPath: './plugins/draw/src/index.js',
277
+ outDir: 'plugins/draw/dist/esm',
278
+ extraExternals: [/^ol\//],
279
+ manualChunks: (id) => {
280
+ if (id.includes('/manifest')) { return 'im-draw-plugin' }
281
+ if (id.includes('MaplibreDrawAdapter')) { return 'im-draw-ml-adapter' }
282
+ if (id.includes('OLDrawAdapter')) { return 'im-draw-ol-adapter' }
283
+ return undefined
284
+ }
278
285
  },
279
286
  {
280
287
  entryPath: './plugins/beta/draw-ml/src/index.js',
281
288
  outDir: 'plugins/beta/draw-ml/dist/esm',
282
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-draw-ml-plugin' }
289
+ manualChunks: (id) => id.includes('/manifest') ? 'im-draw-ml-plugin' : undefined
283
290
  },
284
291
  {
285
292
  entryPath: './plugins/beta/draw-es/src/index.js',
286
293
  outDir: 'plugins/beta/draw-es/dist/esm',
287
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-draw-es-plugin' }
294
+ manualChunks: (id) => id.includes('/manifest') ? 'im-draw-es-plugin' : undefined
288
295
  },
289
296
  {
290
297
  entryPath: './plugins/beta/draw-ol/src/index.js',
291
298
  outDir: 'plugins/beta/draw-ol/dist/esm',
292
299
  extraExternals: [/^ol\//],
293
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-draw-ol-plugin' }
300
+ manualChunks: (id) => id.includes('/manifest') ? 'im-draw-ol-plugin' : undefined
294
301
  },
295
302
  {
296
303
  entryPath: './plugins/beta/frame/src/index.js',
297
304
  outDir: 'plugins/beta/frame/dist/esm',
298
- manualChunks: (id) => { if (id.includes('/manifest')) return 'im-frame-plugin' }
305
+ manualChunks: (id) => id.includes('/manifest') ? 'im-frame-plugin' : undefined
299
306
  }
300
307
  ]
301
308
 
@@ -11,10 +11,10 @@ sonar.javascript.lcov.reportPaths=coverage/lcov.info
11
11
  sonar.sourceEncoding=UTF-8
12
12
 
13
13
  sonar.sources=src,plugins,providers
14
- sonar.exclusions=**/*.test.*,**/__mocks__/**,**/__stubs__/**,**/dist/**,**/node_modules/**,plugins/beta/**,providers/beta/**
14
+ sonar.exclusions=**/*.test.*,**/__mocks__/**,**/__stubs__/**,**/__helpers__/**,**/dist/**,**/node_modules/**,plugins/beta/**,providers/beta/**
15
15
  sonar.tests=src,plugins,providers
16
16
  sonar.test.inclusions=**/*.test.*,**/__mocks__/**,**/__stubs__/**
17
- sonar.cpd.exclusions=**/*.test.*,**/__mocks__/**,**/__stubs__/**
17
+ sonar.cpd.exclusions=**/*.test.*,**/__mocks__/**,**/__stubs__/**,**/__helpers__/**
18
18
 
19
19
  # Ignored rules
20
20
  sonar.issue.ignore.multicriteria=reactPropsJs,reactPropsJsx,preferGlobalThisJs,preferGlobalThisJsx,preferAtJs,preferAtJsx,replaceAllJs,replaceAllJsx,stringReplaceAllJs,stringReplaceAllJsx,pascalCaseFunctionsJs,pascalCaseFunctionsJsx,pascalCaseFunctionsTs,pascalCaseFunctionsTsx,cssScopingRootMixins
@@ -6,4 +6,5 @@
6
6
  white-space: nowrap;
7
7
  overflow: hidden;
8
8
  text-overflow: ellipsis;
9
+ pointer-events: auto;
9
10
  }
@@ -5,9 +5,12 @@
5
5
  .im-o-hints {
6
6
  position: absolute;
7
7
  bottom: var(--hint-bottom, var(--primary-gap));
8
- left: 50%;
9
- transform: translateX(-50%);
8
+ left: 0;
9
+ right: 0;
10
+ margin-inline: auto;
10
11
  z-index: 1001;
12
+ width: fit-content;
13
+ max-width: min(var(--hint-max-width), calc(100% - (2 * var(--primary-gap))));
11
14
  }
12
15
 
13
16
  // ===================================================
@@ -22,8 +25,6 @@
22
25
  }
23
26
 
24
27
  .im-c-hints__hint {
25
- text-wrap: nowrap;
26
-
27
28
  color: var(--tooltip-foreground-color);
28
29
  background-color: var(--tooltip-background-color);
29
30
  border-radius: var(--tooltip-border-radius);
@@ -46,7 +46,7 @@ export const KeyboardHelp = ({ context = 'viewport' }) => { // NOSONAR: project
46
46
  const allShortcuts = getKeyboardShortcuts(appConfig)
47
47
  const shortcuts = listboxIsActive
48
48
  ? allShortcuts
49
- : allShortcuts.filter(s => !s.group && s.context !== 'listbox')
49
+ : allShortcuts.filter(s => s.context !== 'listbox')
50
50
  const groupMap = buildGroupMap(shortcuts)
51
51
  const groupEntries = Object.entries(groupMap)
52
52
 
@@ -163,6 +163,17 @@ describe('KeyboardHelp — listboxIsActive filtering', () => {
163
163
  expect(screen.getByText('Move')).toBeInTheDocument()
164
164
  })
165
165
 
166
+ it('shows non-listbox grouped shortcuts (e.g. Drawing) when listboxIsActive is false', () => {
167
+ getKeyboardShortcuts.mockReturnValue([
168
+ ...VIEWPORT_SHORTCUTS,
169
+ { id: 'd1', group: 'Drawing', title: 'Add new point', command: '<kbd>Enter</kbd>' },
170
+ ...LISTBOX_SHORTCUTS
171
+ ])
172
+ render(<KeyboardHelp />)
173
+ expect(screen.getByRole('tab', { name: 'Drawing' })).toBeInTheDocument()
174
+ expect(screen.queryByRole('tab', { name: SELECT_FEATURES_GROUP })).not.toBeInTheDocument()
175
+ })
176
+
166
177
  it('renders as a flat list when only ungrouped shortcuts remain after filtering', () => {
167
178
  getKeyboardShortcuts.mockReturnValue([...VIEWPORT_SHORTCUTS, ...LISTBOX_SHORTCUTS])
168
179
  render(<KeyboardHelp />)