@12-apps/ui 6.84.0 → 6.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (682) hide show
  1. package/NATIVE.md +1 -1
  2. package/components-catalog.md +7 -0
  3. package/dist/_internal/components/data-display/Alert/Alert.js +2 -2
  4. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
  5. package/dist/_internal/components/data-display/Badge/Badge.js +3 -3
  6. package/dist/_internal/components/data-display/Badge/Badge.styles.js +3 -3
  7. package/dist/_internal/components/data-display/Badge/BadgeContent.js +3 -3
  8. package/dist/_internal/components/data-display/CardKit/CardKebab.js +5 -5
  9. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -3
  10. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +9 -9
  11. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
  12. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +7 -7
  13. package/dist/_internal/components/data-display/Carousel/Carousel.js +10 -10
  14. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +6 -6
  15. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +3 -3
  16. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  17. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  18. package/dist/_internal/components/data-display/Chart/chart-context.js +3 -3
  19. package/dist/_internal/components/data-display/Chart/chart-internals.js +3 -3
  20. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  21. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +1 -1
  22. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +64 -64
  23. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +78 -78
  24. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +5 -5
  25. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +6 -6
  26. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +8 -8
  27. package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
  28. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  29. package/dist/_internal/components/data-display/DataViews/base-list-card.js +5 -5
  30. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +3 -3
  31. package/dist/_internal/components/data-display/DataViews/data-views-card-body.js +6 -6
  32. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +19 -19
  33. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +6 -6
  34. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +3 -3
  35. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +6 -6
  36. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -5
  37. package/dist/_internal/components/data-display/DataViews/data-views-export.js +5 -5
  38. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +31 -31
  39. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +9 -9
  40. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +5 -5
  41. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +61 -61
  42. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +34 -34
  43. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +28 -28
  44. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +31 -31
  45. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +3 -3
  46. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +5 -5
  47. package/dist/_internal/components/data-display/DataViews/data-views-quick-chip.js +3 -3
  48. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +7 -7
  49. package/dist/_internal/components/data-display/DataViews/data-views-search.js +3 -3
  50. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +5 -5
  51. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +17 -17
  52. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +20 -20
  53. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +16 -16
  54. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
  55. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
  56. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +22 -22
  57. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +17 -17
  58. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
  59. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +24 -24
  60. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +4 -4
  61. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +5 -5
  62. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
  63. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
  64. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
  65. package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +2 -2
  66. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  67. package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +4 -4
  68. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  69. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +8 -8
  70. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +4 -4
  71. package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +3 -3
  72. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  73. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +16 -16
  74. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +3 -3
  75. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  76. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  77. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  78. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  79. package/dist/_internal/components/data-display/RegionMap/RegionMap.fixtures.js +51 -0
  80. package/dist/_internal/components/data-display/RegionMap/RegionMap.fixtures.js.map +1 -0
  81. package/dist/_internal/components/data-display/RegionMap/RegionMap.helpers.js +38 -0
  82. package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +9 -0
  83. package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js.map +1 -0
  84. package/dist/_internal/components/data-display/RegionMap/RegionMap.js +37 -0
  85. package/dist/_internal/components/data-display/RegionMap/RegionMap.js.map +1 -0
  86. package/dist/_internal/components/data-display/RegionMap/RegionMap.types.js +1 -0
  87. package/dist/_internal/components/data-display/RegionMap/RegionMap.types.js.map +1 -0
  88. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +10 -0
  89. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js.map +1 -0
  90. package/dist/_internal/components/data-display/RegionMap/RegionMapLegend.js +9 -0
  91. package/dist/_internal/components/data-display/RegionMap/RegionMapLegend.js.map +1 -0
  92. package/dist/_internal/components/data-display/RegionMap/RegionMapList.js +34 -0
  93. package/dist/_internal/components/data-display/RegionMap/RegionMapList.js.map +1 -0
  94. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +3 -3
  95. package/dist/_internal/components/data-display/Sheet/Sheet.js +6 -6
  96. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +3 -3
  97. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  98. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  99. package/dist/_internal/components/data-display/index.js +91 -74
  100. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +5 -5
  101. package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
  102. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +7 -7
  103. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +10 -10
  104. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +9 -9
  105. package/dist/_internal/components/feedback/index.js +21 -21
  106. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +8 -8
  107. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +6 -6
  108. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +4 -4
  109. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +4 -4
  110. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +3 -3
  111. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +4 -4
  112. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +3 -3
  113. package/dist/_internal/components/form/Button/Button.js +4 -4
  114. package/dist/_internal/components/form/Button/Button.styles.js +3 -3
  115. package/dist/_internal/components/form/Calendar/Calendar.js +5 -5
  116. package/dist/_internal/components/form/Calendar/CalendarSelectorsMonth.js +3 -3
  117. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +8 -8
  118. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +4 -4
  119. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +4 -4
  120. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +5 -5
  121. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +4 -4
  122. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +11 -11
  123. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +3 -3
  124. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +4 -4
  125. package/dist/_internal/components/form/CepField/CepField.js +6 -6
  126. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  127. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +3 -3
  128. package/dist/_internal/components/form/Command/Command.js +3 -3
  129. package/dist/_internal/components/form/Command/Command.styles.js +3 -3
  130. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +3 -3
  131. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +5 -5
  132. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +12 -12
  133. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +4 -4
  134. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +5 -5
  135. package/dist/_internal/components/form/Input/Input.factory.js +4 -4
  136. package/dist/_internal/components/form/Input/Input.js +5 -5
  137. package/dist/_internal/components/form/Input/Input.styles.js +3 -3
  138. package/dist/_internal/components/form/InputOTP/InputOTP.js +4 -4
  139. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +3 -3
  140. package/dist/_internal/components/form/Label/Label.js +3 -3
  141. package/dist/_internal/components/form/Label/Label.styles.js +3 -3
  142. package/dist/_internal/components/form/Menubar/Menubar.item.js +3 -3
  143. package/dist/_internal/components/form/Menubar/Menubar.js +7 -7
  144. package/dist/_internal/components/form/Menubar/Menubar.styles.js +3 -3
  145. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +5 -5
  146. package/dist/_internal/components/form/NumberField/NumberField.js +6 -6
  147. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  148. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +5 -5
  149. package/dist/_internal/components/form/PickerSheet/PickerSheet.js +6 -6
  150. package/dist/_internal/components/form/PickerSheet/PickerSheet.parts.js +4 -4
  151. package/dist/_internal/components/form/PickerSheet/PickerSheet.styles.js +3 -3
  152. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +5 -5
  153. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +3 -3
  154. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +4 -4
  155. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
  156. package/dist/_internal/components/form/Select/Select.js +6 -6
  157. package/dist/_internal/components/form/Select/Select.menu.js +4 -4
  158. package/dist/_internal/components/form/Select/Select.searchable.js +4 -4
  159. package/dist/_internal/components/form/Select/Select.styles.js +3 -3
  160. package/dist/_internal/components/form/Textarea/Textarea.js +3 -3
  161. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +4 -4
  162. package/dist/_internal/components/form/Toggle/Toggle.js +4 -4
  163. package/dist/_internal/components/form/Toggle/Toggle.styles.js +3 -3
  164. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +3 -3
  165. package/dist/_internal/components/form/index.js +59 -59
  166. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +12 -12
  167. package/dist/_internal/components/form/total-form/Fields/CepField.js +7 -7
  168. package/dist/_internal/components/form/total-form/Fields/SelectField.js +7 -7
  169. package/dist/_internal/components/form/total-form/Fields/TextField.js +6 -6
  170. package/dist/_internal/components/form/total-form/Fields/ToggleField.js +4 -4
  171. package/dist/_internal/components/form/total-form/Fields/index.js +31 -31
  172. package/dist/_internal/components/form/total-form/SubmitButton.js +5 -5
  173. package/dist/_internal/components/index.js +222 -205
  174. package/dist/_internal/components/layout/Box/Box.js +6 -6
  175. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +3 -3
  176. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +3 -3
  177. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +4 -4
  178. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +3 -3
  179. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +3 -3
  180. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +3 -3
  181. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +3 -3
  182. package/dist/_internal/components/layout/Screen/Screen.js +7 -7
  183. package/dist/_internal/components/layout/SettingCard/SettingCard.js +11 -11
  184. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +9 -9
  185. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +10 -10
  186. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +10 -10
  187. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +12 -12
  188. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +11 -11
  189. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +12 -12
  190. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
  191. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  192. package/dist/_internal/components/layout/Stack/Stack.js +7 -7
  193. package/dist/_internal/components/layout/TableFilter/TableFilter.js +3 -3
  194. package/dist/_internal/components/layout/index.js +34 -34
  195. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +9 -9
  196. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +3 -3
  197. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  198. package/dist/_internal/components/navigation/Pagination/Pagination.js +4 -4
  199. package/dist/_internal/components/navigation/Pagination/PaginationParts.js +3 -3
  200. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +3 -3
  201. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +4 -4
  202. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +3 -3
  203. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +3 -3
  204. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +3 -3
  205. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +3 -3
  206. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +3 -3
  207. package/dist/_internal/components/navigation/SectionNav/__stories__/fixtures.js +3 -3
  208. package/dist/_internal/components/navigation/Tabs/Tabs.js +2 -2
  209. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +2 -2
  210. package/dist/_internal/components/navigation/index.js +18 -18
  211. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +3 -3
  212. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +3 -3
  213. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +3 -3
  214. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +3 -3
  215. package/dist/_internal/components/utility/index.js +16 -16
  216. package/dist/_internal/en-US.data-display.js +2 -2
  217. package/dist/_internal/icons/Icon.js +6 -6
  218. package/dist/_internal/provider/UiProvider.js +5 -5
  219. package/dist/_internal/provider/mui-bridge.js +4 -4
  220. package/dist/_internal/provider/use-ui-theme.js +5 -5
  221. package/dist/_internal/pt-BR.data-display.js +2 -2
  222. package/dist/_internal/social-login-button/social-login-button.js +5 -5
  223. package/dist/_internal/tokens/density.js +3 -3
  224. package/dist/_internal/tokens/field-height.js +2 -2
  225. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  226. package/dist/charts.js +14 -14
  227. package/dist/{chunk-3RHU2Y2N.js → chunk-2DDCRHJE.js} +2 -2
  228. package/dist/{chunk-6ONQTXFM.js → chunk-2GDPZ53K.js} +2 -2
  229. package/dist/{chunk-X3EB67O2.js → chunk-2VRJ577J.js} +4 -4
  230. package/dist/{chunk-QSRZOXQI.js → chunk-2WVHZIWP.js} +2 -2
  231. package/dist/{chunk-6OYB3MRF.js → chunk-33AVAYCR.js} +3 -3
  232. package/dist/{chunk-62SXUU5U.js → chunk-3DPPDGOF.js} +5 -5
  233. package/dist/{chunk-RXKFPXVH.js → chunk-3IX2TP4I.js} +2 -2
  234. package/dist/chunk-3OL2TSEJ.js +80 -0
  235. package/dist/chunk-3OL2TSEJ.js.map +1 -0
  236. package/dist/{chunk-BTGXHQX3.js → chunk-4JNC5AEF.js} +2 -2
  237. package/dist/{chunk-6MOJK2QT.js → chunk-4SQ2WCZA.js} +2 -2
  238. package/dist/{chunk-QHFAKEZZ.js → chunk-4V37DAMA.js} +3 -3
  239. package/dist/{chunk-PWXDMP7G.js → chunk-52RHAAIH.js} +10 -10
  240. package/dist/{chunk-E3E4L7MH.js → chunk-56GWNA5V.js} +5 -5
  241. package/dist/{chunk-I54LHHZS.js → chunk-5CP5Z3YU.js} +2 -2
  242. package/dist/{chunk-L6UTYEUS.js → chunk-5S5K73I6.js} +3 -3
  243. package/dist/{chunk-RBW5QQXW.js → chunk-5XTPEA3O.js} +2 -2
  244. package/dist/{chunk-LOGSJH2Q.js → chunk-5ZC7CNU4.js} +2 -2
  245. package/dist/{chunk-V4JMZZGH.js → chunk-6A4PTK5Q.js} +5 -5
  246. package/dist/{chunk-2P5ZBBTL.js → chunk-6GICMRDX.js} +5 -5
  247. package/dist/{chunk-QOTMQLMW.js → chunk-6OISIUZM.js} +3 -3
  248. package/dist/{chunk-34FX3NRZ.js → chunk-6PTP5NID.js} +2 -2
  249. package/dist/{chunk-3XZZSHE5.js → chunk-6VTOGR36.js} +5 -5
  250. package/dist/{chunk-RLDTV5I2.js → chunk-6WHIJPEF.js} +2 -2
  251. package/dist/{chunk-D7SOXI2K.js → chunk-72HOUWAW.js} +2 -2
  252. package/dist/{chunk-2D4WKET2.js → chunk-75FHDUJW.js} +5 -5
  253. package/dist/{chunk-66QQ7YQN.js → chunk-75I42HHE.js} +2 -2
  254. package/dist/{chunk-AAREDFH6.js → chunk-7TKQIZ3K.js} +2 -2
  255. package/dist/{chunk-WPFVQVQC.js → chunk-7VUXSNVZ.js} +5 -5
  256. package/dist/chunk-A63WU4UZ.js +226 -0
  257. package/dist/chunk-A63WU4UZ.js.map +1 -0
  258. package/dist/chunk-ABRUOINB.js +1 -0
  259. package/dist/chunk-ABRUOINB.js.map +1 -0
  260. package/dist/{chunk-UERGWYGY.js → chunk-ABRVOPC2.js} +3 -3
  261. package/dist/{chunk-M74YHHJE.js → chunk-ACBHZG3Z.js} +5 -5
  262. package/dist/chunk-ACFKPE2T.js +1 -0
  263. package/dist/chunk-ACFKPE2T.js.map +1 -0
  264. package/dist/{chunk-GPTNZ57P.js → chunk-ARMKSYEQ.js} +3 -3
  265. package/dist/{chunk-MHFXJRLD.js → chunk-AT6UKTH4.js} +2 -2
  266. package/dist/{chunk-O4G7QKDU.js → chunk-AWUFS2ZC.js} +7 -7
  267. package/dist/{chunk-YWJCMGTE.js → chunk-BECKKDYG.js} +2 -2
  268. package/dist/{chunk-64UNVW6D.js → chunk-BP3ZKIPE.js} +4 -4
  269. package/dist/{chunk-ENRB6PIN.js → chunk-BRHRK7BK.js} +2 -2
  270. package/dist/chunk-BRZKOUEL.js +115 -0
  271. package/dist/chunk-BRZKOUEL.js.map +1 -0
  272. package/dist/{chunk-Z47SYKRX.js → chunk-C74PDNTF.js} +3 -3
  273. package/dist/{chunk-KEBYZ2MO.js → chunk-CARUHKZW.js} +11 -11
  274. package/dist/{chunk-3HSLEUVW.js → chunk-CBO46LJH.js} +5 -5
  275. package/dist/{chunk-EMSMJRP3.js → chunk-CESGZRVQ.js} +4 -4
  276. package/dist/{chunk-LODYTVOO.js → chunk-CFDWKQZT.js} +2 -2
  277. package/dist/chunk-COOSJKZL.js +197 -0
  278. package/dist/chunk-COOSJKZL.js.map +1 -0
  279. package/dist/{chunk-TPAMLIN7.js → chunk-CPZGFIFH.js} +2 -2
  280. package/dist/{chunk-UIWVSZ6I.js → chunk-CSGBHYW6.js} +2 -2
  281. package/dist/{chunk-JW7MN4DG.js → chunk-D34PZJH3.js} +2 -2
  282. package/dist/{chunk-WT7VZDTI.js → chunk-DDNUPFPE.js} +5 -5
  283. package/dist/{chunk-LZ5PGB7U.js → chunk-DYRZRY2T.js} +5 -5
  284. package/dist/{chunk-73BMQ3VC.js → chunk-ENJOBJPK.js} +2 -2
  285. package/dist/{chunk-U36BXXQ7.js → chunk-EP3DRILI.js} +2 -2
  286. package/dist/{chunk-W2JYXZC2.js → chunk-FCLON3MO.js} +3 -3
  287. package/dist/{chunk-I5NTADBO.js → chunk-FEKWKWGK.js} +4 -4
  288. package/dist/{chunk-33MMQHYU.js → chunk-FJ3UZ4RC.js} +2 -2
  289. package/dist/{chunk-LNIK7FJO.js → chunk-FORQEHRQ.js} +2 -2
  290. package/dist/{chunk-N3W6FZOC.js → chunk-FQGPYP2M.js} +4 -4
  291. package/dist/{chunk-MAHY7PK3.js → chunk-FQMLTCXT.js} +4 -4
  292. package/dist/{chunk-BDJIP4HG.js → chunk-FRUDRDJX.js} +4 -4
  293. package/dist/{chunk-MO4FFK62.js → chunk-FXECKKPW.js} +3 -3
  294. package/dist/{chunk-UWVVKUCG.js → chunk-FZEDQNUN.js} +3 -3
  295. package/dist/{chunk-6LMYQJZP.js → chunk-GCBWZ3MX.js} +2 -2
  296. package/dist/{chunk-YASSCBWN.js → chunk-GHP5JLL3.js} +2 -2
  297. package/dist/{chunk-3S352ZSG.js → chunk-GLR5MSU3.js} +2 -2
  298. package/dist/chunk-GMRQPNG3.js +80 -0
  299. package/dist/chunk-GMRQPNG3.js.map +1 -0
  300. package/dist/{chunk-ATJTGQYE.js → chunk-GOQOVKUZ.js} +3 -3
  301. package/dist/{chunk-REMODSVN.js → chunk-HDTFLW42.js} +2 -2
  302. package/dist/{chunk-SFVHZAGE.js → chunk-HG2YLNGJ.js} +2 -2
  303. package/dist/{chunk-OKDAHCYE.js → chunk-HJJR2WGL.js} +2 -2
  304. package/dist/{chunk-J34VGMA5.js → chunk-HNEZWVDR.js} +2 -2
  305. package/dist/{chunk-MGFTHOPG.js → chunk-HUXAIQC5.js} +2 -2
  306. package/dist/{chunk-OUI5IPS6.js → chunk-HWPQKHN2.js} +6 -6
  307. package/dist/{chunk-PGVGCDPD.js → chunk-I7JUAHUO.js} +3 -3
  308. package/dist/{chunk-LC6ND4ET.js → chunk-IBOFASAZ.js} +2 -2
  309. package/dist/{chunk-TNDTEI6D.js → chunk-IDRVQVDL.js} +2 -2
  310. package/dist/{chunk-4PUCT3RX.js → chunk-IEAPXS57.js} +2 -2
  311. package/dist/{chunk-NQCTANF3.js → chunk-IF5UY3CT.js} +4 -4
  312. package/dist/{chunk-OQ554425.js → chunk-IFX5KP65.js} +4 -4
  313. package/dist/{chunk-VQBY73QH.js → chunk-IMCSY2SI.js} +6 -6
  314. package/dist/{chunk-BARTUKJU.js → chunk-IU2WSJ4F.js} +2 -2
  315. package/dist/{chunk-GVSRBFP3.js → chunk-IYDXKLCE.js} +7 -7
  316. package/dist/{chunk-5NT2M2JI.js → chunk-JKIKHWD2.js} +4 -4
  317. package/dist/{chunk-IKXCAYFH.js → chunk-JVTZ7FWR.js} +2 -2
  318. package/dist/{chunk-DPHSJLMN.js → chunk-JZQYVGPV.js} +2 -2
  319. package/dist/{chunk-3W2B7IZG.js → chunk-K6WY2CHG.js} +2 -2
  320. package/dist/{chunk-RWCQ6TEM.js → chunk-KR4TN3OF.js} +2 -2
  321. package/dist/{chunk-SUCVFEPT.js → chunk-KRPDBVUB.js} +5 -5
  322. package/dist/{chunk-LRIPJ2D5.js → chunk-KRYOT3KB.js} +2 -2
  323. package/dist/{chunk-3V3Z4EML.js → chunk-L4FWEI2P.js} +5 -5
  324. package/dist/{chunk-I3OKAQ5L.js → chunk-L7HNQRFS.js} +7 -7
  325. package/dist/{chunk-J7C7FPVO.js → chunk-LABIUXDM.js} +2 -2
  326. package/dist/{chunk-V2UJEICC.js → chunk-LH3YT5NL.js} +8 -8
  327. package/dist/{chunk-GM7BG3SD.js → chunk-LLPPIO3K.js} +3 -3
  328. package/dist/{chunk-RCTHCXS6.js → chunk-LRQT4MQO.js} +2 -2
  329. package/dist/{chunk-LTSVYILY.js → chunk-LXMFHD7M.js} +4 -4
  330. package/dist/{chunk-72OG3AGH.js → chunk-LYB6YYTG.js} +2 -2
  331. package/dist/{chunk-DRJL3JHR.js → chunk-LZJHHMOF.js} +2 -2
  332. package/dist/{chunk-Y4KR4LT2.js → chunk-MIUPTZS6.js} +2 -2
  333. package/dist/{chunk-XXUTD74L.js → chunk-MK6UXAWY.js} +3 -3
  334. package/dist/{chunk-BIUT3K6A.js → chunk-MKNW4FRR.js} +6 -6
  335. package/dist/{chunk-NZDIO5UG.js → chunk-MVNFUIJS.js} +5 -5
  336. package/dist/{chunk-APBIQH4G.js → chunk-N5OEDOJT.js} +7 -7
  337. package/dist/{chunk-UAOE3ZPC.js → chunk-NEYZV6V5.js} +6 -6
  338. package/dist/{chunk-ZXHODKHH.js → chunk-NKHNUTTY.js} +3 -3
  339. package/dist/{chunk-JL4I7OQE.js → chunk-NOF2FF4K.js} +2 -2
  340. package/dist/{chunk-WOSUYOAU.js → chunk-NQYC7V5N.js} +5 -5
  341. package/dist/{chunk-2XI4R6UO.js → chunk-NTRWUDP6.js} +2 -2
  342. package/dist/{chunk-ZCCKIWZU.js → chunk-NYA26GV2.js} +2 -2
  343. package/dist/{chunk-N3LW5ER5.js → chunk-NZBEE2PR.js} +3 -3
  344. package/dist/{chunk-RUQNKOSP.js → chunk-OPY2AGAU.js} +4 -4
  345. package/dist/{chunk-FYJDI5BW.js → chunk-OQN2FHEL.js} +3 -3
  346. package/dist/{chunk-WNIL2KTB.js → chunk-OQW4OERS.js} +3 -3
  347. package/dist/{chunk-KG7OTJ26.js → chunk-OZYUE2BI.js} +2 -2
  348. package/dist/{chunk-Y3TD7HOY.js → chunk-P4Q7JK4L.js} +2 -2
  349. package/dist/{chunk-W676GY42.js → chunk-P772HCHI.js} +4 -4
  350. package/dist/chunk-PBRCKHN3.js +75 -0
  351. package/dist/chunk-PBRCKHN3.js.map +1 -0
  352. package/dist/{chunk-4AJY7HMH.js → chunk-PD7MKJCM.js} +5 -5
  353. package/dist/{chunk-ICKR3QTG.js → chunk-PGHSNG33.js} +4 -4
  354. package/dist/{chunk-ZNJGEDCE.js → chunk-PGYYDSNX.js} +2 -2
  355. package/dist/{chunk-KXTNTDRD.js → chunk-PPEHBI5O.js} +2 -2
  356. package/dist/{chunk-5RPT32EL.js → chunk-PVIQDBUN.js} +2 -2
  357. package/dist/{chunk-N3ZOZWP5.js → chunk-Q3HYEAVQ.js} +2 -2
  358. package/dist/{chunk-HKQQ2NED.js → chunk-Q4GAPZDA.js} +2 -2
  359. package/dist/{chunk-VUBFCHXL.js → chunk-Q7XLTN2D.js} +3 -3
  360. package/dist/{chunk-YQIT3ET7.js → chunk-QAH3XILB.js} +3 -3
  361. package/dist/{chunk-YH7G44WL.js → chunk-QLJU7UUI.js} +2 -2
  362. package/dist/{chunk-TVMSXL3R.js → chunk-QO7UJXXO.js} +2 -2
  363. package/dist/{chunk-EXTES7LP.js → chunk-QZOQVJ5L.js} +4 -4
  364. package/dist/{chunk-QQHZBJMU.js → chunk-RGVNXES5.js} +4 -4
  365. package/dist/{chunk-MWPD2BXO.js → chunk-RHVJ3L4U.js} +2 -2
  366. package/dist/{chunk-YV4O7KDR.js → chunk-S6HIZQIG.js} +5 -5
  367. package/dist/{chunk-MQVIYTH5.js → chunk-SAKSIN7E.js} +2 -2
  368. package/dist/{chunk-4HBCWKIX.js → chunk-SGFRSRAL.js} +2 -2
  369. package/dist/{chunk-WLLUARTC.js → chunk-T2G4LDU5.js} +2 -2
  370. package/dist/{chunk-37G7M2GJ.js → chunk-T6QVM5Q5.js} +5 -5
  371. package/dist/{chunk-BLNFOP2O.js → chunk-T6YTDEY4.js} +4 -4
  372. package/dist/{chunk-QTLM2YY2.js → chunk-TI4FGQYV.js} +2 -2
  373. package/dist/{chunk-6HMDUUVJ.js → chunk-TRYR424I.js} +4 -4
  374. package/dist/{chunk-74KCGLOU.js → chunk-U2ILXZDG.js} +2 -2
  375. package/dist/{chunk-TR7ZA67L.js → chunk-U2QV4TTZ.js} +2 -2
  376. package/dist/{chunk-GNDIVKWF.js → chunk-U3HGQHEO.js} +3 -3
  377. package/dist/{chunk-3YFDGFEK.js → chunk-U4WAAZXJ.js} +2 -2
  378. package/dist/{chunk-UQUN2NGE.js → chunk-UAFSEZ2E.js} +2 -2
  379. package/dist/{chunk-D5Y4PNC5.js → chunk-ULAZDF6D.js} +2 -2
  380. package/dist/{chunk-3OWFUFZL.js → chunk-UMI3GYWI.js} +6 -6
  381. package/dist/{chunk-Q7QQXNL7.js → chunk-UT545JBQ.js} +3 -3
  382. package/dist/{chunk-JXK53XJW.js → chunk-UTUYXH72.js} +5 -5
  383. package/dist/{chunk-E72INDBL.js → chunk-UXOFA3ZP.js} +4 -4
  384. package/dist/{chunk-PDSZN26U.js → chunk-V6KQ5R4T.js} +11 -11
  385. package/dist/{chunk-FLJ3RIRP.js → chunk-VEKTKCSB.js} +5 -5
  386. package/dist/{chunk-UJACXYC2.js → chunk-VHGHF537.js} +3 -3
  387. package/dist/{chunk-OFXCSLGX.js → chunk-VLH3IMJG.js} +2 -2
  388. package/dist/{chunk-AKBL7S7A.js → chunk-VPGDYI63.js} +5 -5
  389. package/dist/{chunk-6DGNMASB.js → chunk-VPH3TENY.js} +2 -2
  390. package/dist/{chunk-45AON4CS.js → chunk-VYQZ5U3N.js} +2 -2
  391. package/dist/{chunk-GXSHLMT4.js → chunk-WDSJ6SVY.js} +2 -2
  392. package/dist/{chunk-JMDT3GQ3.js → chunk-WMAS6DZR.js} +3 -3
  393. package/dist/{chunk-XE7QBHXN.js → chunk-WTOA52EQ.js} +2 -2
  394. package/dist/{chunk-ILNAPS44.js → chunk-XMWTVDQN.js} +20 -20
  395. package/dist/{chunk-JIAIPOEV.js → chunk-XNMU32XC.js} +2 -2
  396. package/dist/{chunk-PEMXXFXL.js → chunk-XQJPR57I.js} +2 -2
  397. package/dist/{chunk-54F7QIV2.js → chunk-XW44IFYE.js} +5 -5
  398. package/dist/{chunk-I2KAN3YB.js → chunk-Y3LK6ZQG.js} +2 -2
  399. package/dist/{chunk-7AC2UGTU.js → chunk-Y46R26TE.js} +3 -3
  400. package/dist/{chunk-GQ2T44BC.js → chunk-YEKPQAOW.js} +2 -2
  401. package/dist/{chunk-YC2QYRNE.js → chunk-YGWLMTPB.js} +2 -2
  402. package/dist/{chunk-H56CRMCM.js → chunk-YHPSPFU5.js} +9 -9
  403. package/dist/{chunk-F6LZHF4O.js → chunk-YTDUIU7X.js} +2 -2
  404. package/dist/{chunk-CO7GH3W7.js → chunk-YWXCLPCX.js} +2 -2
  405. package/dist/{chunk-RIPG3QIN.js → chunk-Z445LLFN.js} +4 -4
  406. package/dist/{chunk-M7HYNXCU.js → chunk-ZAPP32GD.js} +2 -2
  407. package/dist/{chunk-C2OX3C7L.js → chunk-ZLVRCQPG.js} +7 -7
  408. package/dist/{chunk-SGAHME6W.js → chunk-ZVZTQF7E.js} +4 -4
  409. package/dist/data-display/Alert.js +2 -2
  410. package/dist/data-display/AsyncStateContainer.js +4 -4
  411. package/dist/data-display/Badge.js +3 -3
  412. package/dist/data-display/CardKit.js +10 -10
  413. package/dist/data-display/Carousel.js +10 -10
  414. package/dist/data-display/Chart.js +14 -14
  415. package/dist/data-display/DataGrid.js +1 -1
  416. package/dist/data-display/DataViews.js +88 -88
  417. package/dist/data-display/FleetMap.js +24 -24
  418. package/dist/data-display/LazyImage.js +5 -5
  419. package/dist/data-display/Lightbox.js +6 -6
  420. package/dist/data-display/LoadingState.js +3 -3
  421. package/dist/data-display/MapPreview.js +16 -16
  422. package/dist/data-display/Progress.js +2 -2
  423. package/dist/data-display/RegionMap.js +45 -0
  424. package/dist/data-display/RegionMap.js.map +1 -0
  425. package/dist/data-display/Sheet.js +6 -6
  426. package/dist/data-display/StatCard.js +3 -3
  427. package/dist/data-display/Table.js +2 -2
  428. package/dist/en-US.js +6 -6
  429. package/dist/feedback/ConfirmAction.js +5 -5
  430. package/dist/feedback/Modal.js +2 -2
  431. package/dist/feedback/NotificationStatusNotice.js +7 -7
  432. package/dist/feedback/SequenceResolver.js +10 -10
  433. package/dist/form/AddressAutocomplete.js +8 -8
  434. package/dist/form/Autocomplete.js +4 -4
  435. package/dist/form/Button.js +4 -4
  436. package/dist/form/Calendar.js +5 -5
  437. package/dist/form/CategorySelect.js +11 -11
  438. package/dist/form/CepField.js +6 -6
  439. package/dist/form/Checkbox.js +2 -2
  440. package/dist/form/CodeEditor.js +3 -3
  441. package/dist/form/Command.js +3 -3
  442. package/dist/form/CreatableSelect.js +3 -3
  443. package/dist/form/DateRangePicker.js +12 -12
  444. package/dist/form/Input/outlined.js +5 -5
  445. package/dist/form/Input.js +5 -5
  446. package/dist/form/InputOTP.js +4 -4
  447. package/dist/form/Label.js +3 -3
  448. package/dist/form/MenuSelect.js +4 -4
  449. package/dist/form/Menubar.js +7 -7
  450. package/dist/form/NumberField.js +6 -6
  451. package/dist/form/PhoneInput.js +5 -5
  452. package/dist/form/PickerSheet.js +6 -6
  453. package/dist/form/RadioGroup.js +5 -5
  454. package/dist/form/RichTextEditor.js +2 -2
  455. package/dist/form/Select.js +6 -6
  456. package/dist/form/Textarea.js +3 -3
  457. package/dist/form/Toggle.js +4 -4
  458. package/dist/form/ToggleGroup.js +3 -3
  459. package/dist/form/total-form.js +34 -34
  460. package/dist/icons.js +6 -6
  461. package/dist/layout/Box.js +6 -6
  462. package/dist/layout/ContentToolbar.js +12 -12
  463. package/dist/layout/Screen.js +7 -7
  464. package/dist/layout/SettingCard.js +15 -15
  465. package/dist/layout/SettingsLayout.js +2 -2
  466. package/dist/layout/Skeleton.js +2 -2
  467. package/dist/layout/Stack.js +7 -7
  468. package/dist/layout/TableFilter.js +3 -3
  469. package/dist/locales.js +14 -14
  470. package/dist/navigation/AppHeader.js +9 -9
  471. package/dist/navigation/CommandPalette.js +2 -2
  472. package/dist/navigation/Pagination.js +4 -4
  473. package/dist/navigation/SectionNav.js +4 -4
  474. package/dist/navigation/Tabs.js +2 -2
  475. package/dist/provider.js +6 -6
  476. package/dist/pt-BR.js +8 -8
  477. package/dist/social-login-button.js +5 -5
  478. package/dist/tokens.js +4 -4
  479. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +25 -0
  480. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -0
  481. package/dist/types/components/data-display/RegionMap/RegionMap.fixtures.d.ts +27 -0
  482. package/dist/types/components/data-display/RegionMap/RegionMap.fixtures.d.ts.map +1 -0
  483. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts +110 -0
  484. package/dist/types/components/data-display/RegionMap/RegionMap.helpers.d.ts.map +1 -0
  485. package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts +28 -0
  486. package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts.map +1 -0
  487. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +116 -0
  488. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -0
  489. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +28 -0
  490. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -0
  491. package/dist/types/components/data-display/RegionMap/RegionMapLegend.d.ts +12 -0
  492. package/dist/types/components/data-display/RegionMap/RegionMapLegend.d.ts.map +1 -0
  493. package/dist/types/components/data-display/RegionMap/RegionMapList.d.ts +20 -0
  494. package/dist/types/components/data-display/RegionMap/RegionMapList.d.ts.map +1 -0
  495. package/dist/types/components/data-display/RegionMap/index.d.ts +5 -0
  496. package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -0
  497. package/dist/types/components/data-display/index.d.ts +1 -0
  498. package/dist/types/components/data-display/index.d.ts.map +1 -1
  499. package/dist/user-avatar.js +5 -5
  500. package/dist/utility/WorkflowStep.js +3 -3
  501. package/package.json +5 -1
  502. package/src/components/data-display/RegionMap/RegionMap.fixtures.ts +67 -0
  503. package/src/components/data-display/RegionMap/RegionMap.helpers.ts +338 -0
  504. package/src/components/data-display/RegionMap/RegionMap.hooks.ts +125 -0
  505. package/src/components/data-display/RegionMap/RegionMap.md +144 -0
  506. package/src/components/data-display/RegionMap/RegionMap.tsx +88 -0
  507. package/src/components/data-display/RegionMap/RegionMap.types.ts +117 -0
  508. package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +299 -0
  509. package/src/components/data-display/RegionMap/RegionMapLegend.tsx +81 -0
  510. package/src/components/data-display/RegionMap/RegionMapList.tsx +167 -0
  511. package/src/components/data-display/RegionMap/index.ts +13 -0
  512. package/src/components/data-display/RegionMap/tests.md +22 -0
  513. package/src/components/data-display/RegionMap/track.md +13 -0
  514. package/src/components/data-display/index.ts +1 -0
  515. package/dist/chunk-CDCTLPMD.js +0 -1
  516. /package/dist/{chunk-CDCTLPMD.js.map → _internal/components/data-display/RegionMap/RegionMap.helpers.js.map} +0 -0
  517. /package/dist/{chunk-3RHU2Y2N.js.map → chunk-2DDCRHJE.js.map} +0 -0
  518. /package/dist/{chunk-6ONQTXFM.js.map → chunk-2GDPZ53K.js.map} +0 -0
  519. /package/dist/{chunk-X3EB67O2.js.map → chunk-2VRJ577J.js.map} +0 -0
  520. /package/dist/{chunk-QSRZOXQI.js.map → chunk-2WVHZIWP.js.map} +0 -0
  521. /package/dist/{chunk-6OYB3MRF.js.map → chunk-33AVAYCR.js.map} +0 -0
  522. /package/dist/{chunk-62SXUU5U.js.map → chunk-3DPPDGOF.js.map} +0 -0
  523. /package/dist/{chunk-RXKFPXVH.js.map → chunk-3IX2TP4I.js.map} +0 -0
  524. /package/dist/{chunk-BTGXHQX3.js.map → chunk-4JNC5AEF.js.map} +0 -0
  525. /package/dist/{chunk-6MOJK2QT.js.map → chunk-4SQ2WCZA.js.map} +0 -0
  526. /package/dist/{chunk-QHFAKEZZ.js.map → chunk-4V37DAMA.js.map} +0 -0
  527. /package/dist/{chunk-PWXDMP7G.js.map → chunk-52RHAAIH.js.map} +0 -0
  528. /package/dist/{chunk-E3E4L7MH.js.map → chunk-56GWNA5V.js.map} +0 -0
  529. /package/dist/{chunk-I54LHHZS.js.map → chunk-5CP5Z3YU.js.map} +0 -0
  530. /package/dist/{chunk-L6UTYEUS.js.map → chunk-5S5K73I6.js.map} +0 -0
  531. /package/dist/{chunk-RBW5QQXW.js.map → chunk-5XTPEA3O.js.map} +0 -0
  532. /package/dist/{chunk-LOGSJH2Q.js.map → chunk-5ZC7CNU4.js.map} +0 -0
  533. /package/dist/{chunk-V4JMZZGH.js.map → chunk-6A4PTK5Q.js.map} +0 -0
  534. /package/dist/{chunk-2P5ZBBTL.js.map → chunk-6GICMRDX.js.map} +0 -0
  535. /package/dist/{chunk-QOTMQLMW.js.map → chunk-6OISIUZM.js.map} +0 -0
  536. /package/dist/{chunk-34FX3NRZ.js.map → chunk-6PTP5NID.js.map} +0 -0
  537. /package/dist/{chunk-3XZZSHE5.js.map → chunk-6VTOGR36.js.map} +0 -0
  538. /package/dist/{chunk-RLDTV5I2.js.map → chunk-6WHIJPEF.js.map} +0 -0
  539. /package/dist/{chunk-D7SOXI2K.js.map → chunk-72HOUWAW.js.map} +0 -0
  540. /package/dist/{chunk-2D4WKET2.js.map → chunk-75FHDUJW.js.map} +0 -0
  541. /package/dist/{chunk-66QQ7YQN.js.map → chunk-75I42HHE.js.map} +0 -0
  542. /package/dist/{chunk-AAREDFH6.js.map → chunk-7TKQIZ3K.js.map} +0 -0
  543. /package/dist/{chunk-WPFVQVQC.js.map → chunk-7VUXSNVZ.js.map} +0 -0
  544. /package/dist/{chunk-UERGWYGY.js.map → chunk-ABRVOPC2.js.map} +0 -0
  545. /package/dist/{chunk-M74YHHJE.js.map → chunk-ACBHZG3Z.js.map} +0 -0
  546. /package/dist/{chunk-GPTNZ57P.js.map → chunk-ARMKSYEQ.js.map} +0 -0
  547. /package/dist/{chunk-MHFXJRLD.js.map → chunk-AT6UKTH4.js.map} +0 -0
  548. /package/dist/{chunk-O4G7QKDU.js.map → chunk-AWUFS2ZC.js.map} +0 -0
  549. /package/dist/{chunk-YWJCMGTE.js.map → chunk-BECKKDYG.js.map} +0 -0
  550. /package/dist/{chunk-64UNVW6D.js.map → chunk-BP3ZKIPE.js.map} +0 -0
  551. /package/dist/{chunk-ENRB6PIN.js.map → chunk-BRHRK7BK.js.map} +0 -0
  552. /package/dist/{chunk-Z47SYKRX.js.map → chunk-C74PDNTF.js.map} +0 -0
  553. /package/dist/{chunk-KEBYZ2MO.js.map → chunk-CARUHKZW.js.map} +0 -0
  554. /package/dist/{chunk-3HSLEUVW.js.map → chunk-CBO46LJH.js.map} +0 -0
  555. /package/dist/{chunk-EMSMJRP3.js.map → chunk-CESGZRVQ.js.map} +0 -0
  556. /package/dist/{chunk-LODYTVOO.js.map → chunk-CFDWKQZT.js.map} +0 -0
  557. /package/dist/{chunk-TPAMLIN7.js.map → chunk-CPZGFIFH.js.map} +0 -0
  558. /package/dist/{chunk-UIWVSZ6I.js.map → chunk-CSGBHYW6.js.map} +0 -0
  559. /package/dist/{chunk-JW7MN4DG.js.map → chunk-D34PZJH3.js.map} +0 -0
  560. /package/dist/{chunk-WT7VZDTI.js.map → chunk-DDNUPFPE.js.map} +0 -0
  561. /package/dist/{chunk-LZ5PGB7U.js.map → chunk-DYRZRY2T.js.map} +0 -0
  562. /package/dist/{chunk-73BMQ3VC.js.map → chunk-ENJOBJPK.js.map} +0 -0
  563. /package/dist/{chunk-U36BXXQ7.js.map → chunk-EP3DRILI.js.map} +0 -0
  564. /package/dist/{chunk-W2JYXZC2.js.map → chunk-FCLON3MO.js.map} +0 -0
  565. /package/dist/{chunk-I5NTADBO.js.map → chunk-FEKWKWGK.js.map} +0 -0
  566. /package/dist/{chunk-33MMQHYU.js.map → chunk-FJ3UZ4RC.js.map} +0 -0
  567. /package/dist/{chunk-LNIK7FJO.js.map → chunk-FORQEHRQ.js.map} +0 -0
  568. /package/dist/{chunk-N3W6FZOC.js.map → chunk-FQGPYP2M.js.map} +0 -0
  569. /package/dist/{chunk-MAHY7PK3.js.map → chunk-FQMLTCXT.js.map} +0 -0
  570. /package/dist/{chunk-BDJIP4HG.js.map → chunk-FRUDRDJX.js.map} +0 -0
  571. /package/dist/{chunk-MO4FFK62.js.map → chunk-FXECKKPW.js.map} +0 -0
  572. /package/dist/{chunk-UWVVKUCG.js.map → chunk-FZEDQNUN.js.map} +0 -0
  573. /package/dist/{chunk-6LMYQJZP.js.map → chunk-GCBWZ3MX.js.map} +0 -0
  574. /package/dist/{chunk-YASSCBWN.js.map → chunk-GHP5JLL3.js.map} +0 -0
  575. /package/dist/{chunk-3S352ZSG.js.map → chunk-GLR5MSU3.js.map} +0 -0
  576. /package/dist/{chunk-ATJTGQYE.js.map → chunk-GOQOVKUZ.js.map} +0 -0
  577. /package/dist/{chunk-REMODSVN.js.map → chunk-HDTFLW42.js.map} +0 -0
  578. /package/dist/{chunk-SFVHZAGE.js.map → chunk-HG2YLNGJ.js.map} +0 -0
  579. /package/dist/{chunk-OKDAHCYE.js.map → chunk-HJJR2WGL.js.map} +0 -0
  580. /package/dist/{chunk-J34VGMA5.js.map → chunk-HNEZWVDR.js.map} +0 -0
  581. /package/dist/{chunk-MGFTHOPG.js.map → chunk-HUXAIQC5.js.map} +0 -0
  582. /package/dist/{chunk-OUI5IPS6.js.map → chunk-HWPQKHN2.js.map} +0 -0
  583. /package/dist/{chunk-PGVGCDPD.js.map → chunk-I7JUAHUO.js.map} +0 -0
  584. /package/dist/{chunk-LC6ND4ET.js.map → chunk-IBOFASAZ.js.map} +0 -0
  585. /package/dist/{chunk-TNDTEI6D.js.map → chunk-IDRVQVDL.js.map} +0 -0
  586. /package/dist/{chunk-4PUCT3RX.js.map → chunk-IEAPXS57.js.map} +0 -0
  587. /package/dist/{chunk-NQCTANF3.js.map → chunk-IF5UY3CT.js.map} +0 -0
  588. /package/dist/{chunk-OQ554425.js.map → chunk-IFX5KP65.js.map} +0 -0
  589. /package/dist/{chunk-VQBY73QH.js.map → chunk-IMCSY2SI.js.map} +0 -0
  590. /package/dist/{chunk-BARTUKJU.js.map → chunk-IU2WSJ4F.js.map} +0 -0
  591. /package/dist/{chunk-GVSRBFP3.js.map → chunk-IYDXKLCE.js.map} +0 -0
  592. /package/dist/{chunk-5NT2M2JI.js.map → chunk-JKIKHWD2.js.map} +0 -0
  593. /package/dist/{chunk-IKXCAYFH.js.map → chunk-JVTZ7FWR.js.map} +0 -0
  594. /package/dist/{chunk-DPHSJLMN.js.map → chunk-JZQYVGPV.js.map} +0 -0
  595. /package/dist/{chunk-3W2B7IZG.js.map → chunk-K6WY2CHG.js.map} +0 -0
  596. /package/dist/{chunk-RWCQ6TEM.js.map → chunk-KR4TN3OF.js.map} +0 -0
  597. /package/dist/{chunk-SUCVFEPT.js.map → chunk-KRPDBVUB.js.map} +0 -0
  598. /package/dist/{chunk-LRIPJ2D5.js.map → chunk-KRYOT3KB.js.map} +0 -0
  599. /package/dist/{chunk-3V3Z4EML.js.map → chunk-L4FWEI2P.js.map} +0 -0
  600. /package/dist/{chunk-I3OKAQ5L.js.map → chunk-L7HNQRFS.js.map} +0 -0
  601. /package/dist/{chunk-J7C7FPVO.js.map → chunk-LABIUXDM.js.map} +0 -0
  602. /package/dist/{chunk-V2UJEICC.js.map → chunk-LH3YT5NL.js.map} +0 -0
  603. /package/dist/{chunk-GM7BG3SD.js.map → chunk-LLPPIO3K.js.map} +0 -0
  604. /package/dist/{chunk-RCTHCXS6.js.map → chunk-LRQT4MQO.js.map} +0 -0
  605. /package/dist/{chunk-LTSVYILY.js.map → chunk-LXMFHD7M.js.map} +0 -0
  606. /package/dist/{chunk-72OG3AGH.js.map → chunk-LYB6YYTG.js.map} +0 -0
  607. /package/dist/{chunk-DRJL3JHR.js.map → chunk-LZJHHMOF.js.map} +0 -0
  608. /package/dist/{chunk-Y4KR4LT2.js.map → chunk-MIUPTZS6.js.map} +0 -0
  609. /package/dist/{chunk-XXUTD74L.js.map → chunk-MK6UXAWY.js.map} +0 -0
  610. /package/dist/{chunk-BIUT3K6A.js.map → chunk-MKNW4FRR.js.map} +0 -0
  611. /package/dist/{chunk-NZDIO5UG.js.map → chunk-MVNFUIJS.js.map} +0 -0
  612. /package/dist/{chunk-APBIQH4G.js.map → chunk-N5OEDOJT.js.map} +0 -0
  613. /package/dist/{chunk-UAOE3ZPC.js.map → chunk-NEYZV6V5.js.map} +0 -0
  614. /package/dist/{chunk-ZXHODKHH.js.map → chunk-NKHNUTTY.js.map} +0 -0
  615. /package/dist/{chunk-JL4I7OQE.js.map → chunk-NOF2FF4K.js.map} +0 -0
  616. /package/dist/{chunk-WOSUYOAU.js.map → chunk-NQYC7V5N.js.map} +0 -0
  617. /package/dist/{chunk-2XI4R6UO.js.map → chunk-NTRWUDP6.js.map} +0 -0
  618. /package/dist/{chunk-ZCCKIWZU.js.map → chunk-NYA26GV2.js.map} +0 -0
  619. /package/dist/{chunk-N3LW5ER5.js.map → chunk-NZBEE2PR.js.map} +0 -0
  620. /package/dist/{chunk-RUQNKOSP.js.map → chunk-OPY2AGAU.js.map} +0 -0
  621. /package/dist/{chunk-FYJDI5BW.js.map → chunk-OQN2FHEL.js.map} +0 -0
  622. /package/dist/{chunk-WNIL2KTB.js.map → chunk-OQW4OERS.js.map} +0 -0
  623. /package/dist/{chunk-KG7OTJ26.js.map → chunk-OZYUE2BI.js.map} +0 -0
  624. /package/dist/{chunk-Y3TD7HOY.js.map → chunk-P4Q7JK4L.js.map} +0 -0
  625. /package/dist/{chunk-W676GY42.js.map → chunk-P772HCHI.js.map} +0 -0
  626. /package/dist/{chunk-4AJY7HMH.js.map → chunk-PD7MKJCM.js.map} +0 -0
  627. /package/dist/{chunk-ICKR3QTG.js.map → chunk-PGHSNG33.js.map} +0 -0
  628. /package/dist/{chunk-ZNJGEDCE.js.map → chunk-PGYYDSNX.js.map} +0 -0
  629. /package/dist/{chunk-KXTNTDRD.js.map → chunk-PPEHBI5O.js.map} +0 -0
  630. /package/dist/{chunk-5RPT32EL.js.map → chunk-PVIQDBUN.js.map} +0 -0
  631. /package/dist/{chunk-N3ZOZWP5.js.map → chunk-Q3HYEAVQ.js.map} +0 -0
  632. /package/dist/{chunk-HKQQ2NED.js.map → chunk-Q4GAPZDA.js.map} +0 -0
  633. /package/dist/{chunk-VUBFCHXL.js.map → chunk-Q7XLTN2D.js.map} +0 -0
  634. /package/dist/{chunk-YQIT3ET7.js.map → chunk-QAH3XILB.js.map} +0 -0
  635. /package/dist/{chunk-YH7G44WL.js.map → chunk-QLJU7UUI.js.map} +0 -0
  636. /package/dist/{chunk-TVMSXL3R.js.map → chunk-QO7UJXXO.js.map} +0 -0
  637. /package/dist/{chunk-EXTES7LP.js.map → chunk-QZOQVJ5L.js.map} +0 -0
  638. /package/dist/{chunk-QQHZBJMU.js.map → chunk-RGVNXES5.js.map} +0 -0
  639. /package/dist/{chunk-MWPD2BXO.js.map → chunk-RHVJ3L4U.js.map} +0 -0
  640. /package/dist/{chunk-YV4O7KDR.js.map → chunk-S6HIZQIG.js.map} +0 -0
  641. /package/dist/{chunk-MQVIYTH5.js.map → chunk-SAKSIN7E.js.map} +0 -0
  642. /package/dist/{chunk-4HBCWKIX.js.map → chunk-SGFRSRAL.js.map} +0 -0
  643. /package/dist/{chunk-WLLUARTC.js.map → chunk-T2G4LDU5.js.map} +0 -0
  644. /package/dist/{chunk-37G7M2GJ.js.map → chunk-T6QVM5Q5.js.map} +0 -0
  645. /package/dist/{chunk-BLNFOP2O.js.map → chunk-T6YTDEY4.js.map} +0 -0
  646. /package/dist/{chunk-QTLM2YY2.js.map → chunk-TI4FGQYV.js.map} +0 -0
  647. /package/dist/{chunk-6HMDUUVJ.js.map → chunk-TRYR424I.js.map} +0 -0
  648. /package/dist/{chunk-74KCGLOU.js.map → chunk-U2ILXZDG.js.map} +0 -0
  649. /package/dist/{chunk-TR7ZA67L.js.map → chunk-U2QV4TTZ.js.map} +0 -0
  650. /package/dist/{chunk-GNDIVKWF.js.map → chunk-U3HGQHEO.js.map} +0 -0
  651. /package/dist/{chunk-3YFDGFEK.js.map → chunk-U4WAAZXJ.js.map} +0 -0
  652. /package/dist/{chunk-UQUN2NGE.js.map → chunk-UAFSEZ2E.js.map} +0 -0
  653. /package/dist/{chunk-D5Y4PNC5.js.map → chunk-ULAZDF6D.js.map} +0 -0
  654. /package/dist/{chunk-3OWFUFZL.js.map → chunk-UMI3GYWI.js.map} +0 -0
  655. /package/dist/{chunk-Q7QQXNL7.js.map → chunk-UT545JBQ.js.map} +0 -0
  656. /package/dist/{chunk-JXK53XJW.js.map → chunk-UTUYXH72.js.map} +0 -0
  657. /package/dist/{chunk-E72INDBL.js.map → chunk-UXOFA3ZP.js.map} +0 -0
  658. /package/dist/{chunk-PDSZN26U.js.map → chunk-V6KQ5R4T.js.map} +0 -0
  659. /package/dist/{chunk-FLJ3RIRP.js.map → chunk-VEKTKCSB.js.map} +0 -0
  660. /package/dist/{chunk-UJACXYC2.js.map → chunk-VHGHF537.js.map} +0 -0
  661. /package/dist/{chunk-OFXCSLGX.js.map → chunk-VLH3IMJG.js.map} +0 -0
  662. /package/dist/{chunk-AKBL7S7A.js.map → chunk-VPGDYI63.js.map} +0 -0
  663. /package/dist/{chunk-6DGNMASB.js.map → chunk-VPH3TENY.js.map} +0 -0
  664. /package/dist/{chunk-45AON4CS.js.map → chunk-VYQZ5U3N.js.map} +0 -0
  665. /package/dist/{chunk-GXSHLMT4.js.map → chunk-WDSJ6SVY.js.map} +0 -0
  666. /package/dist/{chunk-JMDT3GQ3.js.map → chunk-WMAS6DZR.js.map} +0 -0
  667. /package/dist/{chunk-XE7QBHXN.js.map → chunk-WTOA52EQ.js.map} +0 -0
  668. /package/dist/{chunk-ILNAPS44.js.map → chunk-XMWTVDQN.js.map} +0 -0
  669. /package/dist/{chunk-JIAIPOEV.js.map → chunk-XNMU32XC.js.map} +0 -0
  670. /package/dist/{chunk-PEMXXFXL.js.map → chunk-XQJPR57I.js.map} +0 -0
  671. /package/dist/{chunk-54F7QIV2.js.map → chunk-XW44IFYE.js.map} +0 -0
  672. /package/dist/{chunk-I2KAN3YB.js.map → chunk-Y3LK6ZQG.js.map} +0 -0
  673. /package/dist/{chunk-7AC2UGTU.js.map → chunk-Y46R26TE.js.map} +0 -0
  674. /package/dist/{chunk-GQ2T44BC.js.map → chunk-YEKPQAOW.js.map} +0 -0
  675. /package/dist/{chunk-YC2QYRNE.js.map → chunk-YGWLMTPB.js.map} +0 -0
  676. /package/dist/{chunk-H56CRMCM.js.map → chunk-YHPSPFU5.js.map} +0 -0
  677. /package/dist/{chunk-F6LZHF4O.js.map → chunk-YTDUIU7X.js.map} +0 -0
  678. /package/dist/{chunk-CO7GH3W7.js.map → chunk-YWXCLPCX.js.map} +0 -0
  679. /package/dist/{chunk-RIPG3QIN.js.map → chunk-Z445LLFN.js.map} +0 -0
  680. /package/dist/{chunk-M7HYNXCU.js.map → chunk-ZAPP32GD.js.map} +0 -0
  681. /package/dist/{chunk-C2OX3C7L.js.map → chunk-ZLVRCQPG.js.map} +0 -0
  682. /package/dist/{chunk-SGAHME6W.js.map → chunk-ZVZTQF7E.js.map} +0 -0
@@ -0,0 +1,144 @@
1
+ # RegionMap
2
+
3
+ A hand-drawn map of named **areas** around a centre — polygons with holes,
4
+ drawn as inline SVG — where a tap toggles an area's `excluded` state.
5
+
6
+ Product-free. An area is a bairro, a delivery zone, a sales territory or a
7
+ parking sector alike; coordinates are plain latitude/longitude, and every word
8
+ arrives through `copy`. Built for a delivery host's "which neighbourhoods does this store not
9
+ deliver to", and deliberately not named after it.
10
+
11
+ ## Use cases
12
+
13
+ - Picking which neighbourhoods inside a delivery radius are left out.
14
+ - Marking territories, zones or sectors on/off around a point.
15
+ - Showing a read-only picture of which areas are in and out (omit `onToggle`).
16
+
17
+ ## Decisions that shape the API
18
+
19
+ ### No tiles, no key, nothing fetched
20
+
21
+ The question is "which of THESE areas", not "what is this street called", so
22
+ the drawing is the areas themselves over a plain background. That keeps it
23
+ free of a tile provider, an API key and a network request, and it renders the
24
+ same in a test as on a phone. `MapPreview` is the component for a real map.
25
+
26
+ ### The list is the accessible way in
27
+
28
+ The drawing is ONE `role="img"` with `copy.mapLabel`; its areas are not tab
29
+ stops. Real areas are many and some are far too small to tap on a phone (IBGE
30
+ outlines 11 of the 48 bairros inside a 3 km ring in one Belo Horizonte
31
+ neighbourhood at under 0.1 km²). Every area is also a toggle button in the list
32
+ beneath (`aria-pressed`, plus its state in words from `copy.rowState`), which
33
+ is what a keyboard and a screen reader use, and what reaches a sliver no finger
34
+ can. `listMode` decides how it is offered:
35
+ `shown` (a computer), `collapsed` behind one button that names the count (a
36
+ phone), or `none` for a host that renders its own.
37
+
38
+ The list holds only the areas in reach: an `outside` area is drawn faded on the
39
+ map for context but has no row unless `listed: true`, and the count matches the
40
+ rows. `listSort: 'name'` orders it by name; `detail` carries a distance or a
41
+ size tag ("tiny") for an area too small to tap.
42
+
43
+ ### Excluded is hatched AND named, never only coloured
44
+
45
+ An excluded area gets a hatch, a darker edge and its name on the map, and a
46
+ pressed, filled row with a check in the list, whose inverted colours hold under
47
+ hover and keyboard focus, with a focus ring. Colour is never the only signal,
48
+ and the error colour is never used: leaving an area out is a choice, not a
49
+ failure. The highlighted areas (`highlightedIds`, e.g. a search's hits — several
50
+ at once) use the primary colour and are named too.
51
+
52
+ ### Our hit test, not only the browser's
53
+
54
+ A MOUSE click on an area's path is that area: the browser hit-tests the
55
+ even-odd fill, and areas are drawn largest first, so an area in another's hole
56
+ is on top. A finger's (or pen's) tap goes to `hitRegion`: the SMALLEST area
57
+ within ~2% of the view (about 8 px on a phone), the ones holding the tap
58
+ included — so a strip a few metres wide beside a big area can be hit from the
59
+ map, and the big one stays easy to hit everywhere else. A tap on empty map
60
+ toggles nothing. An area too thin even for that is on the list.
61
+
62
+ ### A toggle is cheap
63
+
64
+ Geometry is projected once per `rings` array identity and centre, so a host
65
+ that rebuilds its region objects on every toggle (`{ ...area, excluded }`) but
66
+ keeps their `rings` re-projects nothing. The base areas are a memoised layer: a
67
+ toggle re-renders only the hatch, highlight and label layers. Measured on 102
68
+ areas of 300 vertices each at 4× CPU throttle: 18–46 ms from tap to commit.
69
+
70
+ ### Strokes and type stay their size at every width
71
+
72
+ Strokes use `vector-effect: non-scaling-stroke`, and labels are HTML laid over
73
+ the drawing at theme sizes, moved in by their measured width so none is
74
+ clipped at an edge — the map reads the same at 320 px and at 1600 px. The
75
+ drawing is square; `maxHeight` caps it on a wide screen, and where it sits in a
76
+ wider box is the host's call.
77
+
78
+ ## Props
79
+
80
+ | prop | type | default | what it does |
81
+ |---|---|---|---|
82
+ | `regions` | `readonly RegionMapRegion[]` | — | the areas; drawn when any part is in view |
83
+ | `center` | `{ latitude, longitude } \| null` | — | centre, dot and circles; `null` centres on the areas, no dot |
84
+ | `circles` | `readonly { radiusMetres }[]` | `[]` | dashed circles; the view fits the largest |
85
+ | `onToggle` | `(id: string) => void` | — | a tap or a list press; omit for read-only |
86
+ | `highlightedIds` | `readonly string[]` | `[]` | areas to point at (a search's hits), outlined and named |
87
+ | `copy` | `RegionMapCopy` | — | every word |
88
+ | `listMode` | `'shown' \| 'collapsed' \| 'none'` | `'collapsed'` | how the list is offered |
89
+ | `listSort` | `'given' \| 'name'` | `'given'` | the list's order |
90
+ | `maxHeight` | `string` | — | the drawing's largest height, any CSS length |
91
+ | `className` | `string` | — | on the root |
92
+ | `dataTestId` | `string` | `'region-map'` | every child test id derives from it |
93
+
94
+ ### `RegionMapRegion`
95
+
96
+ ```ts
97
+ {
98
+ id: string;
99
+ name: string;
100
+ rings: readonly (readonly [latitude, longitude])[][]; // even-odd: holes are rings
101
+ excluded?: boolean;
102
+ outside?: boolean; // drawn faded (context beyond the circles); still tappable
103
+ listed?: boolean; // has a list row; defaults to !outside
104
+ detail?: string; // pre-formatted, on the list row: "2.7 km away", "tiny"
105
+ }
106
+ ```
107
+
108
+ ### `RegionMapCopy`
109
+
110
+ `mapLabel`, `legendExcluded`, `legendCircle(radiusMetres)`, `legendCenter`,
111
+ `listLabel`, `showList(count)` (the count of LISTED areas), `hideList`, and
112
+ `rowState: { excluded, outside }` — a row's state in words, for a screen reader.
113
+
114
+ ## Helpers
115
+
116
+ - `decodePolyline(encoded, precision = 1e5)` — Google's encoded polyline into
117
+ `[latitude, longitude]` points; outlines usually travel this way.
118
+ - `hitRegion(regions, point, tolerance)` and `projectionAt(center)` — the hit
119
+ test and projection the component uses, for a host that draws its own layer.
120
+
121
+ ## Example
122
+
123
+ ```tsx
124
+ <RegionMap
125
+ regions={bairros.map((b) => ({
126
+ id: b.code,
127
+ name: b.name,
128
+ rings: b.outline.split(';').flatMap((p) => p.split(',')).map((r) => decodePolyline(r)),
129
+ excluded: excluded.has(b.code),
130
+ detail: b.distanceLabel,
131
+ }))}
132
+ center={store}
133
+ circles={rings.map((r) => ({ radiusMetres: r.maxDistanceMetres }))}
134
+ onToggle={toggle}
135
+ highlightedIds={searchHits}
136
+ copy={copy}
137
+ listMode={isPhone ? 'collapsed' : 'shown'}
138
+ />
139
+ ```
140
+
141
+ ## Not here (yet)
142
+
143
+ - Zoom and pan. The list covers the areas too small to tap.
144
+ - A React Native build.
@@ -0,0 +1,88 @@
1
+ import Box from '@mui/material/Box/index.js';
2
+ import { useTheme } from '@mui/material/styles/index.js';
3
+ import React from 'react';
4
+
5
+ import { useRegionMap } from './RegionMap.hooks';
6
+ import type { RegionMapProps } from './RegionMap.types';
7
+ import { RegionMapDrawing } from './RegionMapDrawing';
8
+ import { RegionMapLegend } from './RegionMapLegend';
9
+ import { RegionMapList } from './RegionMapList';
10
+
11
+ /** One empty list, so the default does not change identity per render. */
12
+ const NO_IDS: readonly string[] = [];
13
+
14
+ /**
15
+ * A hand-drawn map of named areas around a centre; a tap toggles an area.
16
+ *
17
+ * Drawn as inline SVG over a plain background — no tile server, no API key,
18
+ * nothing fetched — because the question it answers is "which of THESE areas",
19
+ * not "what is the street called". Four choices shape it:
20
+ *
21
+ * - **The list is the accessible way in.** The drawing is one `role="img"`
22
+ * with a name; its areas are not tab stops (dozens of them, many too small to
23
+ * tap on a phone). Every area is also a toggle button in the list beneath,
24
+ * with `aria-pressed`, which is what a keyboard and a screen reader use —
25
+ * and what reaches a sliver no finger can.
26
+ * - **Excluded is hatched AND named, never only coloured,** and never in the
27
+ * error colour: leaving an area out is a choice, not a failure.
28
+ * - **The hit test is ours, not only the browser's.** A mouse click on a path
29
+ * is that path. A finger's tap takes the SMALLEST area within a few pixels'
30
+ * worth of metres (`hitRegion`), so a sliver beside a big area can be hit
31
+ * from the map; one too thin even for that is still on the list.
32
+ * - **A toggle is cheap.** Geometry is projected once per `rings` identity,
33
+ * and the base layer is memoised, so a tap re-renders the hatch and labels.
34
+ */
35
+ export function RegionMap({
36
+ regions,
37
+ center,
38
+ circles,
39
+ onToggle,
40
+ highlightedIds = NO_IDS,
41
+ copy,
42
+ listMode = 'collapsed',
43
+ listSort = 'given',
44
+ maxHeight,
45
+ className,
46
+ dataTestId = 'region-map',
47
+ }: RegionMapProps): React.JSX.Element | null {
48
+ const theme = useTheme();
49
+ const model = useRegionMap({ regions, center, circles, onToggle });
50
+ const { view } = model;
51
+ if (view === null && regions.length === 0) return null;
52
+ return (
53
+ <Box className={className} data-testid={dataTestId}>
54
+ {view && (
55
+ <>
56
+ <RegionMapDrawing
57
+ model={{ ...model, view }}
58
+ showCenter={center !== null}
59
+ highlightedIds={highlightedIds}
60
+ maxHeight={maxHeight}
61
+ label={copy.mapLabel}
62
+ tappable={onToggle !== undefined}
63
+ testId={dataTestId}
64
+ theme={theme}
65
+ />
66
+ <RegionMapLegend
67
+ copy={copy}
68
+ outermostMetres={model.outermostMetres}
69
+ showCenter={center !== null}
70
+ theme={theme}
71
+ testId={dataTestId}
72
+ />
73
+ </>
74
+ )}
75
+ {listMode !== 'none' && (
76
+ <RegionMapList
77
+ regions={regions}
78
+ copy={copy}
79
+ mode={listMode}
80
+ sort={listSort}
81
+ onToggle={onToggle}
82
+ testId={dataTestId}
83
+ theme={theme}
84
+ />
85
+ )}
86
+ </Box>
87
+ );
88
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * The contract of `RegionMap` — a hand-drawn map of named areas (polygons with
3
+ * holes) around a centre, where a tap toggles an area's `excluded` state.
4
+ *
5
+ * Product-free: an area is a bairro, a delivery zone, a sales territory or a
6
+ * parking sector alike. Coordinates are plain WGS 84 latitude/longitude, and
7
+ * every word arrives through `copy`.
8
+ */
9
+
10
+ /** A latitude/longitude pair, in that order. */
11
+ export type RegionMapPoint = readonly [latitude: number, longitude: number];
12
+
13
+ /** One closed ring: the first point repeated last is allowed, not required. */
14
+ export type RegionMapRing = readonly RegionMapPoint[];
15
+
16
+ /** One named area. */
17
+ export interface RegionMapRegion {
18
+ /** Stable id — what `onToggle` reports. */
19
+ id: string;
20
+ /** The area's name: its label on the map and its row in the list. */
21
+ name: string;
22
+ /**
23
+ * Every ring of every polygon of the area, holes included. Inside is decided
24
+ * by the EVEN-ODD rule over all of them, so a hole is just a ring inside its
25
+ * polygon, and a multi-part area is several outer rings.
26
+ */
27
+ rings: readonly RegionMapRing[];
28
+ /** Drawn hatched, labelled, and pressed in the list. */
29
+ excluded?: boolean;
30
+ /**
31
+ * Drawn faded, for an area shown for context beyond the circles (a ring may
32
+ * grow). Still tappable on the map; left off the list unless `listed`.
33
+ */
34
+ outside?: boolean;
35
+ /**
36
+ * Whether the area has a row in the list. Defaults to `!outside`, so the
37
+ * list — and its count — covers the areas inside the circles while the map
38
+ * still draws the faded context around them.
39
+ */
40
+ listed?: boolean;
41
+ /**
42
+ * Pre-formatted secondary text on the list row, e.g. "2.7 km away", or a
43
+ * size tag such as "tiny" for an area too small to tap.
44
+ */
45
+ detail?: string;
46
+ }
47
+
48
+ /** A circle drawn around the centre, e.g. a delivery ring. */
49
+ export interface RegionMapCircle {
50
+ radiusMetres: number;
51
+ }
52
+
53
+ /** Every word the map prints or announces. */
54
+ export interface RegionMapCopy {
55
+ /** The drawing's accessible name (`role="img"`). */
56
+ mapLabel: string;
57
+ /** The legend entry for a hatched (excluded) area. */
58
+ legendExcluded: string;
59
+ /** The legend entry for the outermost circle, given its radius in metres. */
60
+ legendCircle: (radiusMetres: number) => string;
61
+ /** The legend entry for the centre's dot. */
62
+ legendCenter: string;
63
+ /** The list's accessible name and its heading when shown. */
64
+ listLabel: string;
65
+ /** The button that reveals the list, given how many areas it holds. */
66
+ showList: (count: number) => string;
67
+ /** The button that hides it again. */
68
+ hideList: string;
69
+ /**
70
+ * A list row's state, read after its name by a screen reader: "excluded"
71
+ * for an excluded area (pressed, filled, checked), "outside" for a listed
72
+ * `outside` one (faded). Neither is shown; the row's look carries it.
73
+ */
74
+ rowState: { excluded: string; outside: string };
75
+ }
76
+
77
+ /** The order of the list: as given (e.g. nearest first), or by name. */
78
+ export type RegionMapListSort = 'given' | 'name';
79
+
80
+ /**
81
+ * How the accessible list of areas — one toggle button each — is offered.
82
+ *
83
+ * - `shown`: always under the map (a computer, where there is room);
84
+ * - `collapsed`: behind one button (a phone) — still a keyboard's way in;
85
+ * - `none`: not rendered. Only for a host that offers its own list.
86
+ */
87
+ export type RegionMapListMode = 'shown' | 'collapsed' | 'none';
88
+
89
+ export interface RegionMapProps {
90
+ regions: readonly RegionMapRegion[];
91
+ /**
92
+ * Where the map is centred, and where the dot and the circles are drawn.
93
+ * `null` with no regions renders NOTHING rather than a map of `0, 0`.
94
+ */
95
+ center: { latitude: number; longitude: number } | null;
96
+ /** Circles around the centre; the view fits the largest. */
97
+ circles?: readonly RegionMapCircle[];
98
+ /**
99
+ * A tap on an area, or a press of its list button. Omit it and the map is
100
+ * read-only: nothing is tappable and the list rows are not buttons.
101
+ */
102
+ onToggle?: (id: string) => void;
103
+ /**
104
+ * Areas to point at — e.g. a search's results — outlined and labelled. More
105
+ * than one at once: a search lists several hits.
106
+ */
107
+ highlightedIds?: readonly string[];
108
+ copy: RegionMapCopy;
109
+ listMode?: RegionMapListMode;
110
+ /** The list's order; `'given'` keeps the order of `regions`. */
111
+ listSort?: RegionMapListSort;
112
+ /** The drawing's largest height, any CSS length; it stays square inside it. */
113
+ maxHeight?: string;
114
+ className?: string;
115
+ /** Every child TEST id derives from it. */
116
+ dataTestId?: string;
117
+ }
@@ -0,0 +1,299 @@
1
+ import Box from '@mui/material/Box/index.js';
2
+ import Typography from '@mui/material/Typography/index.js';
3
+ import { alpha, type Theme } from '@mui/material/styles/index.js';
4
+ import React from 'react';
5
+
6
+ import { rem, remPx } from '../../../tokens/relative';
7
+
8
+ import { labelPosition, type AreaGeometry, type DrawnRegion, type PlaneBox } from './RegionMap.helpers';
9
+ import type { RegionMapModel } from './RegionMap.hooks';
10
+
11
+ export interface RegionMapDrawingProps {
12
+ model: RegionMapModel & { view: PlaneBox };
13
+ showCenter: boolean;
14
+ highlightedIds: readonly string[];
15
+ maxHeight: string | undefined;
16
+ label: string;
17
+ tappable: boolean;
18
+ testId: string;
19
+ theme: Theme;
20
+ }
21
+
22
+ /**
23
+ * The drawing: one `role="img"`, square, with HTML labels laid over it.
24
+ *
25
+ * Strokes are `non-scaling-stroke` and labels are HTML at theme sizes, so the
26
+ * picture reads the same at 320 px and 1600 px; `maxHeight` caps it on a wide
27
+ * screen. Where it sits in a wider box is the host's call.
28
+ *
29
+ * The base areas are a memoised layer: a toggle changes `excluded`, not the
30
+ * geometry, so only the hatch, highlight and label layers re-render.
31
+ */
32
+ export function RegionMapDrawing({
33
+ model,
34
+ showCenter,
35
+ highlightedIds,
36
+ maxHeight,
37
+ label,
38
+ tappable,
39
+ testId,
40
+ theme,
41
+ }: RegionMapDrawingProps): React.JSX.Element {
42
+ const hatchId = `${React.useId().replace(/:/g, '')}-hatch`;
43
+ const { view, drawn } = model;
44
+ const wanted = new Set(highlightedIds);
45
+ const highlighted = drawn.filter((d) => wanted.has(d.id));
46
+ const labelled = [...drawn.filter((d) => d.excluded), ...highlighted.filter((d) => !d.excluded)];
47
+ const base = drawn.map((d) => ({ id: d.id, name: d.name, geometry: d.geometry, outside: d.outside === true }));
48
+ return (
49
+ <Box
50
+ sx={{
51
+ position: 'relative',
52
+ width: '100%',
53
+ maxWidth: maxHeight,
54
+ maxHeight,
55
+ aspectRatio: '1 / 1',
56
+ border: 1,
57
+ borderColor: 'divider',
58
+ borderRadius: 1,
59
+ overflow: 'hidden',
60
+ bgcolor: 'background.paper',
61
+ }}
62
+ data-testid={`${testId}-canvas`}
63
+ >
64
+ <svg
65
+ viewBox={`${view.minX} ${view.minY} ${view.spanX} ${view.spanY}`}
66
+ role="img"
67
+ aria-label={label}
68
+ onPointerDown={model.onPointerDown}
69
+ onClick={model.onClick}
70
+ style={{ display: 'block', width: '100%', height: '100%', cursor: tappable ? 'pointer' : 'default' }}
71
+ >
72
+ <Hatch id={hatchId} pitch={view.spanX / 70} theme={theme} />
73
+ <BaseAreas areas={base} testId={testId} theme={theme} />
74
+ <ExcludedAreas drawn={drawn} hatchId={hatchId} testId={testId} theme={theme} />
75
+ <Circles radii={model.radii} theme={theme} />
76
+ {highlighted.map((d) => (
77
+ <path
78
+ key={`h-${d.id}`}
79
+ d={d.geometry.path}
80
+ fillRule="evenodd"
81
+ vectorEffect="non-scaling-stroke"
82
+ fill={alpha(theme.palette.primary.main, 0.3)}
83
+ stroke={theme.palette.primary.main}
84
+ strokeWidth={2.5}
85
+ pointerEvents="none"
86
+ data-testid={`${testId}-highlight-${d.id}`}
87
+ />
88
+ ))}
89
+ {showCenter && (
90
+ <circle
91
+ cx={0}
92
+ cy={0}
93
+ r={view.spanX / 90}
94
+ fill={theme.palette.primary.main}
95
+ stroke={theme.palette.background.paper}
96
+ strokeWidth={2}
97
+ vectorEffect="non-scaling-stroke"
98
+ pointerEvents="none"
99
+ data-testid={`${testId}-center`}
100
+ />
101
+ )}
102
+ </svg>
103
+ {labelled.map((d) => (
104
+ <AreaLabel key={`l-${d.id}`} area={d} view={view} testId={testId} theme={theme} />
105
+ ))}
106
+ </Box>
107
+ );
108
+ }
109
+
110
+ /** The hatch an excluded area is filled with: lines, not a colour. */
111
+ function Hatch({ id, pitch, theme }: { id: string; pitch: number; theme: Theme }): React.JSX.Element {
112
+ return (
113
+ <defs>
114
+ <pattern id={id} width={pitch} height={pitch} patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
115
+ <rect width={pitch} height={pitch} fill={alpha(theme.palette.text.primary, 0.1)} />
116
+ <rect width={pitch / 3} height={pitch} fill={theme.palette.text.secondary} />
117
+ </pattern>
118
+ </defs>
119
+ );
120
+ }
121
+
122
+ interface BaseArea {
123
+ id: string;
124
+ name: string;
125
+ geometry: AreaGeometry;
126
+ outside: boolean;
127
+ }
128
+
129
+ interface BaseAreasProps {
130
+ areas: readonly BaseArea[];
131
+ testId: string;
132
+ theme: Theme;
133
+ }
134
+
135
+ /** Same areas, same geometry objects, same look: nothing to re-render. */
136
+ function sameBase(a: BaseAreasProps, b: BaseAreasProps): boolean {
137
+ if (a.theme !== b.theme || a.testId !== b.testId || a.areas.length !== b.areas.length) return false;
138
+ return a.areas.every((area, i) => {
139
+ const other = b.areas[i]!;
140
+ return (
141
+ area.id === other.id &&
142
+ area.geometry === other.geometry &&
143
+ area.outside === other.outside &&
144
+ area.name === other.name
145
+ );
146
+ });
147
+ }
148
+
149
+ /** Every area's fill and border — the tap targets. Memoised: see `sameBase`. */
150
+ const BaseAreas = React.memo(function BaseAreas({ areas, testId, theme }: BaseAreasProps): React.JSX.Element {
151
+ const { palette } = theme;
152
+ return (
153
+ <>
154
+ {areas.map((d) => (
155
+ <path
156
+ key={d.id}
157
+ d={d.geometry.path}
158
+ fillRule="evenodd"
159
+ vectorEffect="non-scaling-stroke"
160
+ fill={d.outside ? palette.background.paper : palette.action.hover}
161
+ stroke={palette.divider}
162
+ strokeWidth={1}
163
+ data-region-id={d.id}
164
+ data-testid={`${testId}-area-${d.id}`}
165
+ >
166
+ <title>{d.name}</title>
167
+ </path>
168
+ ))}
169
+ </>
170
+ );
171
+ }, sameBase);
172
+
173
+ /** The hatch over every excluded area. */
174
+ function ExcludedAreas({
175
+ drawn,
176
+ hatchId,
177
+ testId,
178
+ theme,
179
+ }: {
180
+ drawn: readonly DrawnRegion[];
181
+ hatchId: string;
182
+ testId: string;
183
+ theme: Theme;
184
+ }): React.JSX.Element {
185
+ return (
186
+ <>
187
+ {drawn
188
+ .filter((d) => d.excluded)
189
+ .map((d) => (
190
+ <path
191
+ key={`x-${d.id}`}
192
+ d={d.geometry.path}
193
+ fillRule="evenodd"
194
+ vectorEffect="non-scaling-stroke"
195
+ fill={`url(#${hatchId})`}
196
+ stroke={theme.palette.text.secondary}
197
+ strokeWidth={1.5}
198
+ pointerEvents="none"
199
+ data-testid={`${testId}-excluded-${d.id}`}
200
+ />
201
+ ))}
202
+ </>
203
+ );
204
+ }
205
+
206
+ /** The dashed circles around the centre. */
207
+ function Circles({ radii, theme }: { radii: readonly number[]; theme: Theme }): React.JSX.Element {
208
+ return (
209
+ <>
210
+ {radii.map((radius) => (
211
+ <circle
212
+ key={radius}
213
+ cx={0}
214
+ cy={0}
215
+ r={radius}
216
+ fill="none"
217
+ stroke={theme.palette.info.main}
218
+ strokeWidth={1.75}
219
+ strokeDasharray="7 5"
220
+ vectorEffect="non-scaling-stroke"
221
+ pointerEvents="none"
222
+ />
223
+ ))}
224
+ </>
225
+ );
226
+ }
227
+
228
+ /** Where a label's centre may go along one axis so the whole label stays in view. */
229
+ function clampCentre(wanted: number, half: number, span: number, gap: number): number {
230
+ if (span <= 2 * (half + gap)) return span / 2;
231
+ return Math.min(span - half - gap, Math.max(half + gap, wanted));
232
+ }
233
+
234
+ /**
235
+ * An area's name over the drawing, at the theme's type size whatever the
236
+ * width — and moved in by its own measured size, so it is never clipped at
237
+ * the drawing's edge.
238
+ */
239
+ function AreaLabel({
240
+ area,
241
+ view,
242
+ testId,
243
+ theme,
244
+ }: {
245
+ area: DrawnRegion;
246
+ view: PlaneBox;
247
+ testId: string;
248
+ theme: Theme;
249
+ }): React.JSX.Element {
250
+ const at = labelPosition(area.geometry.rings, view);
251
+ const ref = React.useRef<HTMLSpanElement>(null);
252
+ const gap = remPx(theme, 4);
253
+ // Measured by a ResizeObserver, never in a layout effect: the observer's
254
+ // first call comes after the browser's own layout, so mounting a label on a
255
+ // tap forces no synchronous reflow of the drawing.
256
+ React.useEffect(() => {
257
+ const label = ref.current;
258
+ const box = label?.parentElement;
259
+ if (!label || !box || typeof ResizeObserver === 'undefined') return undefined;
260
+ const observer = new ResizeObserver(() => {
261
+ const width = box.clientWidth;
262
+ const height = box.clientHeight;
263
+ if (width === 0 || height === 0) return;
264
+ const x = clampCentre(at.fractionX * width, label.offsetWidth / 2, width, gap);
265
+ const y = clampCentre(at.fractionY * height, label.offsetHeight / 2, height, gap);
266
+ label.style.left = `${(x / width) * 100}%`;
267
+ label.style.top = `${(y / height) * 100}%`;
268
+ });
269
+ observer.observe(box);
270
+ observer.observe(label);
271
+ return () => observer.disconnect();
272
+ }, [at.fractionX, at.fractionY, gap]);
273
+ const halo = `0 0 ${rem(theme, 3)} ${theme.palette.background.paper}`;
274
+ return (
275
+ <Typography
276
+ ref={ref}
277
+ component="span"
278
+ aria-hidden
279
+ data-testid={`${testId}-label-${area.id}`}
280
+ // Position as an inline style, not `sx`: a per-label class would insert
281
+ // a new CSS rule (and a style recalculation) on every tap.
282
+ style={{ left: `${(at.fractionX * 100).toFixed(2)}%`, top: `${(at.fractionY * 100).toFixed(2)}%` }}
283
+ sx={{
284
+ position: 'absolute',
285
+ transform: 'translate(-50%, -50%)',
286
+ fontSize: rem(theme, 11),
287
+ fontWeight: 700,
288
+ lineHeight: 1.1,
289
+ textAlign: 'center',
290
+ maxWidth: '45%',
291
+ color: 'text.primary',
292
+ pointerEvents: 'none',
293
+ textShadow: `${halo}, ${halo}`,
294
+ }}
295
+ >
296
+ {area.name}
297
+ </Typography>
298
+ );
299
+ }