@12-apps/ui 6.89.2 → 6.91.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 (390) hide show
  1. package/components-catalog.md +2 -2
  2. package/dist/_internal/components/data-display/Alert/Alert.js +3 -3
  3. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
  4. package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
  5. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  6. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +4 -4
  7. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
  8. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +4 -3
  9. package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -4
  10. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +3 -2
  11. package/dist/_internal/components/data-display/Chart/Chart.js +5 -5
  12. package/dist/_internal/components/data-display/Chart/SpecChart.js +8 -8
  13. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  14. package/dist/_internal/components/data-display/Chart/chart-renderers.js +4 -4
  15. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  16. package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
  17. package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
  18. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  19. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +56 -31
  20. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +64 -39
  21. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +7 -7
  23. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +5 -5
  24. package/dist/_internal/components/data-display/DataViews/base-list-card.js +9 -9
  25. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +5 -3
  26. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +1 -1
  27. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +31 -6
  28. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +8 -8
  29. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +53 -28
  30. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +36 -11
  31. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +32 -7
  32. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +33 -8
  33. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +1 -1
  34. package/dist/_internal/components/data-display/DataViews/data-views-preset-chips.js +10 -3
  35. package/dist/_internal/components/data-display/DataViews/data-views-range-bounds.js +47 -0
  36. package/dist/_internal/components/data-display/DataViews/data-views-range-calendar.js +36 -0
  37. package/dist/_internal/components/data-display/DataViews/data-views-range-calendar.js.map +1 -0
  38. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +32 -6
  39. package/dist/_internal/components/data-display/DataViews/data-views-range-summary.js +12 -0
  40. package/dist/_internal/components/data-display/DataViews/data-views-range-summary.js.map +1 -0
  41. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +3 -3
  42. package/dist/_internal/components/data-display/DataViews/data-views-still-anchor.js +9 -0
  43. package/dist/_internal/components/data-display/DataViews/data-views-still-anchor.js.map +1 -0
  44. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +5 -5
  45. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +2 -2
  46. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +4 -4
  47. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  48. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
  49. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +13 -12
  50. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +12 -11
  51. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -1
  52. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js.map +1 -1
  53. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +15 -15
  54. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  55. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +7 -7
  56. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
  57. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
  58. package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +2 -2
  59. package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +4 -3
  60. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +6 -5
  61. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +5 -4
  62. package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +3 -2
  63. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +11 -10
  64. package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +2 -1
  65. package/dist/_internal/components/data-display/RegionMap/RegionMap.js +4 -3
  66. package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js +19 -0
  67. package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js.map +1 -0
  68. package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +1 -1
  69. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
  70. package/dist/_internal/components/data-display/index.js +67 -61
  71. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +4 -4
  72. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +6 -6
  73. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +5 -5
  74. package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +4 -4
  75. package/dist/_internal/components/feedback/index.js +7 -7
  76. package/dist/_internal/components/form/Calendar/Calendar.js +5 -5
  77. package/dist/_internal/components/form/Calendar/CalendarDay.js +1 -1
  78. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  79. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  80. package/dist/_internal/components/form/Calendar/CalendarSelectorsMonth.js +4 -4
  81. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +3 -3
  82. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +10 -10
  83. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +2 -2
  84. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +3 -3
  85. package/dist/_internal/components/form/index.js +24 -24
  86. package/dist/_internal/components/index.js +102 -96
  87. package/dist/_internal/components/layout/SettingCard/SettingCard.js +8 -8
  88. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +4 -4
  89. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +7 -7
  90. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +5 -5
  91. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +9 -9
  92. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +8 -8
  93. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +9 -9
  94. package/dist/_internal/components/layout/index.js +12 -12
  95. package/dist/_internal/en-US.data-display.js +2 -1
  96. package/dist/_internal/pt-BR.data-display.js +2 -1
  97. package/dist/_internal/user-avatar/user-avatar.js +4 -4
  98. package/dist/charts.js +11 -11
  99. package/dist/{chunk-FJ3UZ4RC.js → chunk-2FKWKLSC.js} +5 -3
  100. package/dist/chunk-2FKWKLSC.js.map +1 -0
  101. package/dist/{chunk-K2VDRODL.js → chunk-3IDL7NK7.js} +2 -2
  102. package/dist/{chunk-6ATXOJVQ.js → chunk-3JZ3KEQQ.js} +4 -4
  103. package/dist/{chunk-XHIBFBNP.js → chunk-3ZRK3BRN.js} +4 -2
  104. package/dist/chunk-3ZRK3BRN.js.map +1 -0
  105. package/dist/{chunk-EOIRU62W.js → chunk-42D7KBDH.js} +2 -2
  106. package/dist/{chunk-LXIPBHNJ.js → chunk-42TOCPXB.js} +5 -5
  107. package/dist/{chunk-WAO7UQRS.js → chunk-4KWDNGMA.js} +3 -3
  108. package/dist/{chunk-X5OGIT2F.js → chunk-4L54KUZV.js} +22 -4
  109. package/dist/chunk-4L54KUZV.js.map +1 -0
  110. package/dist/{chunk-JIEVKHOH.js → chunk-4QR7LM5F.js} +2 -2
  111. package/dist/{chunk-WJMSND5Q.js → chunk-5E2CRRD4.js} +5 -5
  112. package/dist/{chunk-ZDAAHCIS.js → chunk-5HADIIWN.js} +3 -3
  113. package/dist/{chunk-BP3ZKIPE.js → chunk-64UNVW6D.js} +4 -4
  114. package/dist/{chunk-TRYR424I.js → chunk-6LOWZCH7.js} +15 -1
  115. package/dist/chunk-6LOWZCH7.js.map +1 -0
  116. package/dist/{chunk-6WHIJPEF.js → chunk-6PU5P7QT.js} +2 -2
  117. package/dist/{chunk-7F6D73NL.js → chunk-76DX2IMH.js} +2 -2
  118. package/dist/chunk-7CUZTWKW.js +52 -0
  119. package/dist/chunk-7CUZTWKW.js.map +1 -0
  120. package/dist/{chunk-5RSK5M6M.js → chunk-7NP2JHGM.js} +63 -126
  121. package/dist/chunk-7NP2JHGM.js.map +1 -0
  122. package/dist/{chunk-YNZUYZ2O.js → chunk-A3DDEKLV.js} +2 -2
  123. package/dist/{chunk-FEKWKWGK.js → chunk-ARGVUTTL.js} +15 -1
  124. package/dist/chunk-ARGVUTTL.js.map +1 -0
  125. package/dist/{chunk-BMTIBQQC.js → chunk-BBBHPK2Q.js} +6 -6
  126. package/dist/{chunk-DYHOBKPU.js → chunk-BLZDSCIZ.js} +6 -6
  127. package/dist/{chunk-EUR2ORTN.js → chunk-CSJ7WNXU.js} +2 -2
  128. package/dist/{chunk-OWRQOYUE.js → chunk-DA3D5X5Z.js} +5 -5
  129. package/dist/{chunk-LV6AD6XC.js → chunk-DBI6AMNY.js} +4 -4
  130. package/dist/{chunk-3YFDGFEK.js → chunk-DVX4HDNP.js} +2 -2
  131. package/dist/chunk-DY2I6LMX.js +1 -0
  132. package/dist/chunk-DY2I6LMX.js.map +1 -0
  133. package/dist/{chunk-QKOJ4637.js → chunk-E6K2UZGR.js} +3 -3
  134. package/dist/{chunk-7XSCEHGA.js → chunk-EOQ6EKTS.js} +7 -7
  135. package/dist/chunk-FORAVDJF.js +164 -0
  136. package/dist/chunk-FORAVDJF.js.map +1 -0
  137. package/dist/chunk-FWAY2SAI.js +72 -0
  138. package/dist/chunk-FWAY2SAI.js.map +1 -0
  139. package/dist/{chunk-Q2ERGAQO.js → chunk-FYAW5GBF.js} +33 -6
  140. package/dist/chunk-FYAW5GBF.js.map +1 -0
  141. package/dist/{chunk-GMRQPNG3.js → chunk-G2NVBCF7.js} +20 -25
  142. package/dist/chunk-G2NVBCF7.js.map +1 -0
  143. package/dist/{chunk-Z5WUSI47.js → chunk-G3JFESKD.js} +6 -6
  144. package/dist/{chunk-3EIRRLCQ.js → chunk-HC6OZ7QK.js} +2 -2
  145. package/dist/{chunk-SKIAWOUC.js → chunk-HOPRZEBM.js} +3 -3
  146. package/dist/{chunk-OBA75Y5O.js → chunk-HS662RLW.js} +61 -33
  147. package/dist/chunk-HS662RLW.js.map +1 -0
  148. package/dist/{chunk-O63ZROSY.js → chunk-IWSTMVCA.js} +7 -7
  149. package/dist/chunk-J2AVWIMM.js +60 -0
  150. package/dist/chunk-J2AVWIMM.js.map +1 -0
  151. package/dist/{chunk-7QKIL5YF.js → chunk-J2GDA64N.js} +4 -4
  152. package/dist/{chunk-TZC6KIK2.js → chunk-JG733RMP.js} +5 -5
  153. package/dist/{chunk-CW5Z67NA.js → chunk-JH2XLVWM.js} +2 -2
  154. package/dist/{chunk-TYXFFNPM.js → chunk-JKZPGCN7.js} +11 -11
  155. package/dist/{chunk-QRRWLLXW.js → chunk-JN2IANXD.js} +3 -3
  156. package/dist/{chunk-HQCZT6TO.js → chunk-JVOEVTCZ.js} +5 -5
  157. package/dist/{chunk-GBB23QLL.js → chunk-KJKD6Y6V.js} +3 -3
  158. package/dist/{chunk-XLU5WFSY.js → chunk-L3PDY7CJ.js} +2 -2
  159. package/dist/{chunk-S6D7NOV7.js → chunk-L6JAALMX.js} +3 -3
  160. package/dist/{chunk-72HOUWAW.js → chunk-L6YTVXGN.js} +5 -3
  161. package/dist/{chunk-72HOUWAW.js.map → chunk-L6YTVXGN.js.map} +1 -1
  162. package/dist/chunk-LZNUBQ5I.js +181 -0
  163. package/dist/chunk-LZNUBQ5I.js.map +1 -0
  164. package/dist/{chunk-BECKKDYG.js → chunk-M2M4IDFU.js} +2 -2
  165. package/dist/{chunk-AMLHEKSV.js → chunk-M3XJVD5G.js} +5 -5
  166. package/dist/{chunk-CSGBHYW6.js → chunk-M5Y42AZ4.js} +2 -2
  167. package/dist/chunk-MICX23P4.js +122 -0
  168. package/dist/chunk-MICX23P4.js.map +1 -0
  169. package/dist/{chunk-5CP5Z3YU.js → chunk-MPWA55CF.js} +4 -4
  170. package/dist/{chunk-CJUK32UH.js → chunk-MYTV353T.js} +5 -5
  171. package/dist/{chunk-BO6MT2S2.js → chunk-MZAYIG2I.js} +7 -6
  172. package/dist/chunk-MZAYIG2I.js.map +1 -0
  173. package/dist/{chunk-AKE6KVQG.js → chunk-NGXL4R54.js} +5 -1
  174. package/dist/chunk-NGXL4R54.js.map +1 -0
  175. package/dist/{chunk-BEHT4IHH.js → chunk-NKEFH3RS.js} +6 -6
  176. package/dist/{chunk-NI67M453.js → chunk-PGANINQD.js} +5 -5
  177. package/dist/{chunk-RCTHCXS6.js → chunk-PJNIJIE6.js} +2 -2
  178. package/dist/{chunk-E2UOEI7N.js → chunk-Q3SILZTQ.js} +2 -2
  179. package/dist/{chunk-SB2SEGR6.js → chunk-QHIWV55K.js} +3 -3
  180. package/dist/{chunk-DHAXUVMR.js → chunk-QN7FVZQD.js} +4 -4
  181. package/dist/{chunk-5S5K73I6.js → chunk-QSOCOXVL.js} +3 -3
  182. package/dist/{chunk-NQCTANF3.js → chunk-QVDEGBME.js} +7 -7
  183. package/dist/{chunk-BQBEN44R.js → chunk-RDCIST7P.js} +2 -2
  184. package/dist/{chunk-HUXAIQC5.js → chunk-RZ3P4X2I.js} +2 -2
  185. package/dist/{chunk-QLJU7UUI.js → chunk-T7OIVPCO.js} +38 -3
  186. package/dist/chunk-T7OIVPCO.js.map +1 -0
  187. package/dist/{chunk-U2ILXZDG.js → chunk-TB5CRHTF.js} +2 -2
  188. package/dist/{chunk-X2GWR75Q.js → chunk-TSEBMVYY.js} +3 -3
  189. package/dist/{chunk-OKRITX4S.js → chunk-U2AEM3K4.js} +7 -7
  190. package/dist/{chunk-EXVCVXFX.js → chunk-U2QXQ7D4.js} +6 -6
  191. package/dist/{chunk-K6FCSB6T.js → chunk-U2SAW6DH.js} +2 -2
  192. package/dist/{chunk-DAHSKQBV.js → chunk-UMOHHWXY.js} +2 -2
  193. package/dist/{chunk-YDIC6LSP.js → chunk-VCQFDQM3.js} +27 -7
  194. package/dist/chunk-VCQFDQM3.js.map +1 -0
  195. package/dist/{chunk-P772HCHI.js → chunk-W676GY42.js} +4 -4
  196. package/dist/{chunk-BAQ3ITZV.js → chunk-WCF56ZCD.js} +2 -2
  197. package/dist/{chunk-6D5AMANO.js → chunk-WH3LUOCQ.js} +2 -2
  198. package/dist/{chunk-T2G4LDU5.js → chunk-WLLUARTC.js} +2 -2
  199. package/dist/{chunk-5BVAUUWL.js → chunk-X37NTEVS.js} +2 -2
  200. package/dist/{chunk-5KK3I42O.js → chunk-XILMDEGZ.js} +13 -10
  201. package/dist/chunk-XILMDEGZ.js.map +1 -0
  202. package/dist/{chunk-MW7P2C2C.js → chunk-YGQM6GFQ.js} +2 -2
  203. package/dist/{chunk-WW3F7DCX.js → chunk-Z2WZDVGG.js} +2 -2
  204. package/dist/{chunk-WNNA6YYE.js → chunk-Z7T4EFEC.js} +7 -4
  205. package/dist/chunk-Z7T4EFEC.js.map +1 -0
  206. package/dist/{chunk-LOLYBFYY.js → chunk-ZCNR4DN5.js} +5 -5
  207. package/dist/{chunk-COKPPU42.js → chunk-ZIHSCBMN.js} +12 -12
  208. package/dist/data-display/Alert.js +3 -3
  209. package/dist/data-display/AsyncStateContainer.js +3 -3
  210. package/dist/data-display/Avatar.js +3 -3
  211. package/dist/data-display/CardKit.js +15 -15
  212. package/dist/data-display/Carousel.js +5 -4
  213. package/dist/data-display/Chart.js +11 -11
  214. package/dist/data-display/Chip.js +3 -3
  215. package/dist/data-display/DataGrid.js +2 -2
  216. package/dist/data-display/DataViews.js +75 -50
  217. package/dist/data-display/DayRuler.js +4 -4
  218. package/dist/data-display/EmptyState.js +2 -2
  219. package/dist/data-display/FleetMap.js +15 -15
  220. package/dist/data-display/InteractiveTooltip.js +2 -2
  221. package/dist/data-display/Lightbox.js +7 -7
  222. package/dist/data-display/MapPreview.js +11 -10
  223. package/dist/data-display/RegionMap.js +11 -5
  224. package/dist/data-display/SectionOnboarding.js +3 -3
  225. package/dist/en-US.js +1 -1
  226. package/dist/feedback/NotificationStatusNotice.js +4 -4
  227. package/dist/feedback/SequenceResolver.js +6 -6
  228. package/dist/form/Calendar.js +5 -5
  229. package/dist/form/DateRangePicker.js +10 -10
  230. package/dist/layout/SettingCard.js +12 -12
  231. package/dist/locales.js +5 -5
  232. package/dist/pt-BR.js +1 -1
  233. package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts +15 -1
  234. package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts.map +1 -1
  235. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +35 -0
  236. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  237. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +7 -1
  238. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  239. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  240. package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts +5 -3
  241. package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts.map +1 -1
  242. package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts +10 -2
  243. package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts.map +1 -1
  244. package/dist/types/components/data-display/DataViews/data-views-preset-chips.d.ts +10 -0
  245. package/dist/types/components/data-display/DataViews/data-views-preset-chips.d.ts.map +1 -1
  246. package/dist/types/components/data-display/DataViews/data-views-range-bounds.d.ts +35 -0
  247. package/dist/types/components/data-display/DataViews/data-views-range-bounds.d.ts.map +1 -0
  248. package/dist/types/components/data-display/DataViews/data-views-range-calendar.d.ts +35 -0
  249. package/dist/types/components/data-display/DataViews/data-views-range-calendar.d.ts.map +1 -0
  250. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts +2 -11
  251. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  252. package/dist/types/components/data-display/DataViews/data-views-range-summary.d.ts +21 -0
  253. package/dist/types/components/data-display/DataViews/data-views-range-summary.d.ts.map +1 -0
  254. package/dist/types/components/data-display/DataViews/data-views-still-anchor.d.ts +45 -0
  255. package/dist/types/components/data-display/DataViews/data-views-still-anchor.d.ts.map +1 -0
  256. package/dist/types/components/data-display/LazyImage/LazyImage.hooks.d.ts +1 -1
  257. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +4 -1
  258. package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -1
  259. package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts +4 -2
  260. package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts.map +1 -1
  261. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +40 -0
  262. package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -1
  263. package/dist/types/components/data-display/RegionMap/RegionMap.view.d.ts +36 -0
  264. package/dist/types/components/data-display/RegionMap/RegionMap.view.d.ts.map +1 -0
  265. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +4 -1
  266. package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
  267. package/dist/types/components/data-display/RegionMap/index.d.ts +3 -2
  268. package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -1
  269. package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
  270. package/dist/types/components/form/Calendar/CalendarDay.d.ts +2 -0
  271. package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
  272. package/dist/types/components/form/Calendar/CalendarDayCell.d.ts +2 -0
  273. package/dist/types/components/form/Calendar/CalendarDayCell.d.ts.map +1 -1
  274. package/dist/types/components/form/Calendar/CalendarMonth.d.ts +5 -0
  275. package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
  276. package/dist/types/en-US.data-display.d.ts.map +1 -1
  277. package/dist/types/pt-BR.data-display.d.ts.map +1 -1
  278. package/dist/user-avatar.js +4 -4
  279. package/package.json +1 -1
  280. package/src/components/data-display/DataViews/RESPONSIVE-BEHAVIOUR.md +59 -0
  281. package/src/components/data-display/DataViews/data-views-bar-controls.tsx +56 -1
  282. package/src/components/data-display/DataViews/data-views-copy.ts +36 -0
  283. package/src/components/data-display/DataViews/data-views-day-input.tsx +9 -1
  284. package/src/components/data-display/DataViews/data-views-inline-bar.tsx +5 -3
  285. package/src/components/data-display/DataViews/data-views-more-fields.tsx +1 -0
  286. package/src/components/data-display/DataViews/data-views-more-filters.tsx +82 -29
  287. package/src/components/data-display/DataViews/data-views-number-input.tsx +19 -9
  288. package/src/components/data-display/DataViews/data-views-preset-chips.tsx +165 -16
  289. package/src/components/data-display/DataViews/data-views-range-bounds.tsx +223 -0
  290. package/src/components/data-display/DataViews/data-views-range-calendar.tsx +185 -0
  291. package/src/components/data-display/DataViews/data-views-range-pill.tsx +71 -154
  292. package/src/components/data-display/DataViews/data-views-range-summary.tsx +66 -0
  293. package/src/components/data-display/DataViews/data-views-still-anchor.ts +93 -0
  294. package/src/components/data-display/RegionMap/RegionMap.hooks.ts +24 -33
  295. package/src/components/data-display/RegionMap/RegionMap.md +27 -0
  296. package/src/components/data-display/RegionMap/RegionMap.tsx +7 -1
  297. package/src/components/data-display/RegionMap/RegionMap.types.ts +41 -0
  298. package/src/components/data-display/RegionMap/RegionMap.view.ts +105 -0
  299. package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +11 -0
  300. package/src/components/data-display/RegionMap/index.ts +5 -1
  301. package/src/components/data-display/RegionMap/tests.md +10 -2
  302. package/src/components/form/Calendar/Calendar.md +17 -2
  303. package/src/components/form/Calendar/Calendar.tsx +56 -3
  304. package/src/components/form/Calendar/CalendarDay.tsx +33 -3
  305. package/src/components/form/Calendar/CalendarDayCell.tsx +4 -0
  306. package/src/components/form/Calendar/CalendarMonth.tsx +27 -5
  307. package/src/en-US.data-display.ts +12 -0
  308. package/src/pt-BR.data-display.ts +12 -0
  309. package/dist/chunk-5KK3I42O.js.map +0 -1
  310. package/dist/chunk-5RSK5M6M.js.map +0 -1
  311. package/dist/chunk-7D7CJRL7.js +0 -78
  312. package/dist/chunk-7D7CJRL7.js.map +0 -1
  313. package/dist/chunk-ACFKPE2T.js +0 -1
  314. package/dist/chunk-AKE6KVQG.js.map +0 -1
  315. package/dist/chunk-BO6MT2S2.js.map +0 -1
  316. package/dist/chunk-FEKWKWGK.js.map +0 -1
  317. package/dist/chunk-FJ3UZ4RC.js.map +0 -1
  318. package/dist/chunk-GMRQPNG3.js.map +0 -1
  319. package/dist/chunk-OBA75Y5O.js.map +0 -1
  320. package/dist/chunk-Q2ERGAQO.js.map +0 -1
  321. package/dist/chunk-QLJU7UUI.js.map +0 -1
  322. package/dist/chunk-TRYR424I.js.map +0 -1
  323. package/dist/chunk-WNNA6YYE.js.map +0 -1
  324. package/dist/chunk-X5OGIT2F.js.map +0 -1
  325. package/dist/chunk-XHIBFBNP.js.map +0 -1
  326. package/dist/chunk-YDIC6LSP.js.map +0 -1
  327. /package/dist/{chunk-ACFKPE2T.js.map → _internal/components/data-display/DataViews/data-views-range-bounds.js.map} +0 -0
  328. /package/dist/{chunk-K2VDRODL.js.map → chunk-3IDL7NK7.js.map} +0 -0
  329. /package/dist/{chunk-6ATXOJVQ.js.map → chunk-3JZ3KEQQ.js.map} +0 -0
  330. /package/dist/{chunk-EOIRU62W.js.map → chunk-42D7KBDH.js.map} +0 -0
  331. /package/dist/{chunk-LXIPBHNJ.js.map → chunk-42TOCPXB.js.map} +0 -0
  332. /package/dist/{chunk-WAO7UQRS.js.map → chunk-4KWDNGMA.js.map} +0 -0
  333. /package/dist/{chunk-JIEVKHOH.js.map → chunk-4QR7LM5F.js.map} +0 -0
  334. /package/dist/{chunk-WJMSND5Q.js.map → chunk-5E2CRRD4.js.map} +0 -0
  335. /package/dist/{chunk-ZDAAHCIS.js.map → chunk-5HADIIWN.js.map} +0 -0
  336. /package/dist/{chunk-BP3ZKIPE.js.map → chunk-64UNVW6D.js.map} +0 -0
  337. /package/dist/{chunk-6WHIJPEF.js.map → chunk-6PU5P7QT.js.map} +0 -0
  338. /package/dist/{chunk-7F6D73NL.js.map → chunk-76DX2IMH.js.map} +0 -0
  339. /package/dist/{chunk-YNZUYZ2O.js.map → chunk-A3DDEKLV.js.map} +0 -0
  340. /package/dist/{chunk-BMTIBQQC.js.map → chunk-BBBHPK2Q.js.map} +0 -0
  341. /package/dist/{chunk-DYHOBKPU.js.map → chunk-BLZDSCIZ.js.map} +0 -0
  342. /package/dist/{chunk-EUR2ORTN.js.map → chunk-CSJ7WNXU.js.map} +0 -0
  343. /package/dist/{chunk-OWRQOYUE.js.map → chunk-DA3D5X5Z.js.map} +0 -0
  344. /package/dist/{chunk-LV6AD6XC.js.map → chunk-DBI6AMNY.js.map} +0 -0
  345. /package/dist/{chunk-3YFDGFEK.js.map → chunk-DVX4HDNP.js.map} +0 -0
  346. /package/dist/{chunk-QKOJ4637.js.map → chunk-E6K2UZGR.js.map} +0 -0
  347. /package/dist/{chunk-7XSCEHGA.js.map → chunk-EOQ6EKTS.js.map} +0 -0
  348. /package/dist/{chunk-Z5WUSI47.js.map → chunk-G3JFESKD.js.map} +0 -0
  349. /package/dist/{chunk-3EIRRLCQ.js.map → chunk-HC6OZ7QK.js.map} +0 -0
  350. /package/dist/{chunk-SKIAWOUC.js.map → chunk-HOPRZEBM.js.map} +0 -0
  351. /package/dist/{chunk-O63ZROSY.js.map → chunk-IWSTMVCA.js.map} +0 -0
  352. /package/dist/{chunk-7QKIL5YF.js.map → chunk-J2GDA64N.js.map} +0 -0
  353. /package/dist/{chunk-TZC6KIK2.js.map → chunk-JG733RMP.js.map} +0 -0
  354. /package/dist/{chunk-CW5Z67NA.js.map → chunk-JH2XLVWM.js.map} +0 -0
  355. /package/dist/{chunk-TYXFFNPM.js.map → chunk-JKZPGCN7.js.map} +0 -0
  356. /package/dist/{chunk-QRRWLLXW.js.map → chunk-JN2IANXD.js.map} +0 -0
  357. /package/dist/{chunk-HQCZT6TO.js.map → chunk-JVOEVTCZ.js.map} +0 -0
  358. /package/dist/{chunk-GBB23QLL.js.map → chunk-KJKD6Y6V.js.map} +0 -0
  359. /package/dist/{chunk-XLU5WFSY.js.map → chunk-L3PDY7CJ.js.map} +0 -0
  360. /package/dist/{chunk-S6D7NOV7.js.map → chunk-L6JAALMX.js.map} +0 -0
  361. /package/dist/{chunk-BECKKDYG.js.map → chunk-M2M4IDFU.js.map} +0 -0
  362. /package/dist/{chunk-AMLHEKSV.js.map → chunk-M3XJVD5G.js.map} +0 -0
  363. /package/dist/{chunk-CSGBHYW6.js.map → chunk-M5Y42AZ4.js.map} +0 -0
  364. /package/dist/{chunk-5CP5Z3YU.js.map → chunk-MPWA55CF.js.map} +0 -0
  365. /package/dist/{chunk-CJUK32UH.js.map → chunk-MYTV353T.js.map} +0 -0
  366. /package/dist/{chunk-BEHT4IHH.js.map → chunk-NKEFH3RS.js.map} +0 -0
  367. /package/dist/{chunk-NI67M453.js.map → chunk-PGANINQD.js.map} +0 -0
  368. /package/dist/{chunk-RCTHCXS6.js.map → chunk-PJNIJIE6.js.map} +0 -0
  369. /package/dist/{chunk-E2UOEI7N.js.map → chunk-Q3SILZTQ.js.map} +0 -0
  370. /package/dist/{chunk-SB2SEGR6.js.map → chunk-QHIWV55K.js.map} +0 -0
  371. /package/dist/{chunk-DHAXUVMR.js.map → chunk-QN7FVZQD.js.map} +0 -0
  372. /package/dist/{chunk-5S5K73I6.js.map → chunk-QSOCOXVL.js.map} +0 -0
  373. /package/dist/{chunk-NQCTANF3.js.map → chunk-QVDEGBME.js.map} +0 -0
  374. /package/dist/{chunk-BQBEN44R.js.map → chunk-RDCIST7P.js.map} +0 -0
  375. /package/dist/{chunk-HUXAIQC5.js.map → chunk-RZ3P4X2I.js.map} +0 -0
  376. /package/dist/{chunk-U2ILXZDG.js.map → chunk-TB5CRHTF.js.map} +0 -0
  377. /package/dist/{chunk-X2GWR75Q.js.map → chunk-TSEBMVYY.js.map} +0 -0
  378. /package/dist/{chunk-OKRITX4S.js.map → chunk-U2AEM3K4.js.map} +0 -0
  379. /package/dist/{chunk-EXVCVXFX.js.map → chunk-U2QXQ7D4.js.map} +0 -0
  380. /package/dist/{chunk-K6FCSB6T.js.map → chunk-U2SAW6DH.js.map} +0 -0
  381. /package/dist/{chunk-DAHSKQBV.js.map → chunk-UMOHHWXY.js.map} +0 -0
  382. /package/dist/{chunk-P772HCHI.js.map → chunk-W676GY42.js.map} +0 -0
  383. /package/dist/{chunk-BAQ3ITZV.js.map → chunk-WCF56ZCD.js.map} +0 -0
  384. /package/dist/{chunk-6D5AMANO.js.map → chunk-WH3LUOCQ.js.map} +0 -0
  385. /package/dist/{chunk-T2G4LDU5.js.map → chunk-WLLUARTC.js.map} +0 -0
  386. /package/dist/{chunk-5BVAUUWL.js.map → chunk-X37NTEVS.js.map} +0 -0
  387. /package/dist/{chunk-MW7P2C2C.js.map → chunk-YGQM6GFQ.js.map} +0 -0
  388. /package/dist/{chunk-WW3F7DCX.js.map → chunk-Z2WZDVGG.js.map} +0 -0
  389. /package/dist/{chunk-LOLYBFYY.js.map → chunk-ZCNR4DN5.js.map} +0 -0
  390. /package/dist/{chunk-COKPPU42.js.map → chunk-ZIHSCBMN.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RAIL_GAP_PX
3
- } from "./chunk-BMTIBQQC.js";
3
+ } from "./chunk-BBBHPK2Q.js";
4
4
  import {
5
5
  COMPACT_BREAK,
6
6
  META_BREAK
@@ -257,4 +257,4 @@ export {
257
257
  ListCardActions,
258
258
  ListCardTail
259
259
  };
260
- //# sourceMappingURL=chunk-EUR2ORTN.js.map
260
+ //# sourceMappingURL=chunk-CSJ7WNXU.js.map
@@ -1,9 +1,9 @@
1
+ import {
2
+ FleetBody
3
+ } from "./chunk-WCF56ZCD.js";
1
4
  import {
2
5
  useFleetMap
3
6
  } from "./chunk-ZCPSND5Y.js";
4
- import {
5
- FleetBody
6
- } from "./chunk-BAQ3ITZV.js";
7
7
  import {
8
8
  FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
9
9
  FLEET_DEFAULT_STALE_AFTER_SECONDS,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-PUFA7FQ7.js";
15
15
  import {
16
16
  EmptyState
17
- } from "./chunk-LXIPBHNJ.js";
17
+ } from "./chunk-42TOCPXB.js";
18
18
  import {
19
19
  rem
20
20
  } from "./chunk-YKCAJ2TN.js";
@@ -117,4 +117,4 @@ export {
117
117
  FleetMap,
118
118
  FleetMap_default
119
119
  };
120
- //# sourceMappingURL=chunk-OWRQOYUE.js.map
120
+ //# sourceMappingURL=chunk-DA3D5X5Z.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- DataViewsDisplayPanel
3
- } from "./chunk-6HXNFNOB.js";
4
1
  import {
5
2
  DataViewsExportMenu
6
3
  } from "./chunk-4NG3LTRX.js";
4
+ import {
5
+ DataViewsDisplayPanel
6
+ } from "./chunk-6HXNFNOB.js";
7
7
  import {
8
8
  STICKY_BAR_ATTR
9
9
  } from "./chunk-4IE66GY2.js";
@@ -143,4 +143,4 @@ function GridToolbar(props) {
143
143
  export {
144
144
  GridToolbar
145
145
  };
146
- //# sourceMappingURL=chunk-LV6AD6XC.js.map
146
+ //# sourceMappingURL=chunk-DBI6AMNY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCardActions
3
- } from "./chunk-RCTHCXS6.js";
3
+ } from "./chunk-PJNIJIE6.js";
4
4
  import {
5
5
  ConfirmActionDialog
6
6
  } from "./chunk-7W5X3KQ2.js";
@@ -50,4 +50,4 @@ function useRemoveConfirm({
50
50
  export {
51
51
  useRemoveConfirm
52
52
  };
53
- //# sourceMappingURL=chunk-3YFDGFEK.js.map
53
+ //# sourceMappingURL=chunk-DVX4HDNP.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-DY2I6LMX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  rowGutters
3
- } from "./chunk-DAHSKQBV.js";
3
+ } from "./chunk-UMOHHWXY.js";
4
4
  import {
5
5
  cellRailsTemplate
6
- } from "./chunk-BMTIBQQC.js";
6
+ } from "./chunk-BBBHPK2Q.js";
7
7
  import {
8
8
  cellTracks,
9
9
  compactCellTracks,
@@ -55,4 +55,4 @@ export {
55
55
  useRowLayout,
56
56
  StandaloneContainer
57
57
  };
58
- //# sourceMappingURL=chunk-QKOJ4637.js.map
58
+ //# sourceMappingURL=chunk-E6K2UZGR.js.map
@@ -1,9 +1,3 @@
1
- import {
2
- pulseAnimation,
3
- rotateAnimation,
4
- scaleInAnimation,
5
- shimmerAnimation
6
- } from "./chunk-MTEQEPNY.js";
7
1
  import {
8
2
  ACTIVE_SCALE,
9
3
  AVATAR_SIZES,
@@ -23,6 +17,12 @@ import {
23
17
  SPINNER,
24
18
  STATUS_DOT
25
19
  } from "./chunk-6ZZGK5DT.js";
20
+ import {
21
+ pulseAnimation,
22
+ rotateAnimation,
23
+ scaleInAnimation,
24
+ shimmerAnimation
25
+ } from "./chunk-MTEQEPNY.js";
26
26
  import {
27
27
  absoluteInk,
28
28
  controlNeutral,
@@ -277,4 +277,4 @@ function AvatarView(props) {
277
277
  export {
278
278
  AvatarView
279
279
  };
280
- //# sourceMappingURL=chunk-7XSCEHGA.js.map
280
+ //# sourceMappingURL=chunk-EOQ6EKTS.js.map
@@ -0,0 +1,164 @@
1
+ import {
2
+ RangePresets
3
+ } from "./chunk-LZNUBQ5I.js";
4
+ import {
5
+ NumberBoundInput
6
+ } from "./chunk-2FKWKLSC.js";
7
+ import {
8
+ useOutsideResetKey
9
+ } from "./chunk-YOPMXGHY.js";
10
+ import {
11
+ presetsFor
12
+ } from "./chunk-CBOB5AV6.js";
13
+ import {
14
+ DayRangeCalendar
15
+ } from "./chunk-MICX23P4.js";
16
+ import {
17
+ isRangeInverted
18
+ } from "./chunk-GCZJH4XL.js";
19
+ import {
20
+ useDataViewsCopy
21
+ } from "./chunk-KHG57NAE.js";
22
+ import {
23
+ DayBoundInput
24
+ } from "./chunk-L6YTVXGN.js";
25
+ import {
26
+ sxRem
27
+ } from "./chunk-YKCAJ2TN.js";
28
+
29
+ // src/components/data-display/DataViews/data-views-range-bounds.tsx
30
+ import Box from "@mui/material/Box/index.js";
31
+ import Typography from "@mui/material/Typography/index.js";
32
+ import { useState } from "react";
33
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
34
+ function BoundField({
35
+ field,
36
+ label,
37
+ value,
38
+ onChange,
39
+ testId,
40
+ fill
41
+ }) {
42
+ const copy = useDataViewsCopy();
43
+ if (field.kind === "day") {
44
+ return /* @__PURE__ */ jsx(
45
+ DayBoundInput,
46
+ {
47
+ fill: true,
48
+ mask: copy.filters.dayMask,
49
+ invalidMessage: copy.filters.dayInvalid,
50
+ label,
51
+ value: value == null ? void 0 : String(value),
52
+ onChange,
53
+ testId
54
+ }
55
+ );
56
+ }
57
+ return /* @__PURE__ */ jsx(
58
+ NumberBoundInput,
59
+ {
60
+ fill,
61
+ label,
62
+ value,
63
+ unit: field.unit,
64
+ onChange,
65
+ testId
66
+ }
67
+ );
68
+ }
69
+ function BoundCell({ grow, children }) {
70
+ if (!grow) return /* @__PURE__ */ jsx(Fragment, { children });
71
+ return /* @__PURE__ */ jsx(Box, { sx: { flex: "1 1 0", minWidth: 0 }, children });
72
+ }
73
+ function RangeNote({
74
+ day,
75
+ inverted,
76
+ testId
77
+ }) {
78
+ const copy = useDataViewsCopy();
79
+ if (inverted) {
80
+ return /* @__PURE__ */ jsx(
81
+ Typography,
82
+ {
83
+ component: "p",
84
+ "data-testid": `${testId}-inverted`,
85
+ sx: { mt: 0.75, fontSize: sxRem(12), color: "error.main" },
86
+ children: copy.filters.rangeInvalid
87
+ }
88
+ );
89
+ }
90
+ if (!day) return null;
91
+ return /* @__PURE__ */ jsx(
92
+ Typography,
93
+ {
94
+ component: "p",
95
+ "data-testid": `${testId}-inclusive`,
96
+ sx: { mt: { xs: 0.25, sm: 0.75 }, fontSize: sxRem(12), color: "text.secondary" },
97
+ children: copy.filters.rangeInclusiveNote
98
+ }
99
+ );
100
+ }
101
+ function RangeBounds({
102
+ field,
103
+ value,
104
+ onChange,
105
+ testId,
106
+ calendarMonths = 1,
107
+ showCalendar = true,
108
+ fillRow = false
109
+ }) {
110
+ const copy = useDataViewsCopy();
111
+ const { key, emitted } = useOutsideResetKey(value);
112
+ const [typed, setTyped] = useState(0);
113
+ const typedChange = (range) => {
114
+ setTyped((n) => n + 1);
115
+ onChange(emitted(range));
116
+ };
117
+ const day = field.kind === "day";
118
+ return /* @__PURE__ */ jsxs(Box, { "data-testid": `${testId}-panel`, children: [
119
+ /* @__PURE__ */ jsx(Box, { sx: { "&:not(:empty)": { mb: { xs: 1, sm: 1.5 } } }, children: /* @__PURE__ */ jsx(RangePresets, { presets: presetsFor(field, copy), value, onChange, testId }) }),
120
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "flex-start", gap: 1.5 }, children: [
121
+ /* @__PURE__ */ jsx(BoundCell, { grow: day || fillRow, children: /* @__PURE__ */ jsx(
122
+ BoundField,
123
+ {
124
+ field,
125
+ label: copy.filters.rangeStart,
126
+ value: value.min,
127
+ onChange: (min) => typedChange({ ...value, min }),
128
+ testId: `${testId}-min`,
129
+ fill: fillRow
130
+ },
131
+ `min-${key}`
132
+ ) }),
133
+ /* @__PURE__ */ jsx(BoundCell, { grow: day || fillRow, children: /* @__PURE__ */ jsx(
134
+ BoundField,
135
+ {
136
+ field,
137
+ label: copy.filters.rangeEnd,
138
+ value: value.max,
139
+ onChange: (max) => typedChange({ ...value, max }),
140
+ testId: `${testId}-max`,
141
+ fill: fillRow
142
+ },
143
+ `max-${key}`
144
+ ) })
145
+ ] }),
146
+ /* @__PURE__ */ jsx(RangeNote, { day, inverted: isRangeInverted(value), testId }),
147
+ day && showCalendar && /* @__PURE__ */ jsx(
148
+ DayRangeCalendar,
149
+ {
150
+ fieldLabel: field.label,
151
+ value,
152
+ onChange: (range) => onChange(emitted(range)),
153
+ months: calendarMonths,
154
+ viewKey: `${key}-${typed}`,
155
+ testId
156
+ }
157
+ )
158
+ ] });
159
+ }
160
+
161
+ export {
162
+ RangeBounds
163
+ };
164
+ //# sourceMappingURL=chunk-FORAVDJF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/DataViews/data-views-range-bounds.tsx"],"sourcesContent":["'use client';\n\n/**\n * The `De`/`Até` pair of a range filter, its preset chips, the line under it\n * and — for a day range — the calendar under that (FUT-4144). Shared by the\n * pill's popover, the slide-in panel and the \"Mais\" sheet, so the three cannot\n * drift on what a bound accepts or how it clears.\n */\nimport Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport { useDataViewsCopy } from './data-views-copy-context';\nimport { DayBoundInput } from './data-views-day-input';\nimport { NumberBoundInput } from './data-views-number-input';\nimport { RangePresets } from './data-views-preset-chips';\nimport { DayRangeCalendar } from './data-views-range-calendar';\nimport { presetsFor } from './data-views-range-presets';\nimport { useOutsideResetKey } from './data-views-range-reset';\nimport { isRangeInverted } from './data-views-range-values';\nimport type { RangeFieldConfig, RangeValue } from './data-views-types';\nimport { sxRem } from '../../../tokens/relative';\n\n/**\n * One end of the range. A day keeps its `AAAA-MM-DD` string verbatim (the form\n * both the field and the backend speak) and is typed through the masked\n * `dd/mm/aaaa` field rather than a native date input — see\n * {@link DayBoundInput} for why. A number parses, and an unparseable/blank\n * entry CLEARS the bound rather than writing `NaN`.\n */\nfunction BoundField<T extends Record<string, unknown>>({\n field,\n label,\n value,\n onChange,\n testId,\n fill,\n}: {\n field: RangeFieldConfig<T>;\n label: string;\n value: number | string | undefined;\n onChange: (bound: number | string | undefined) => void;\n testId: string;\n /** A number box takes its cell's width; a day box always does. */\n fill: boolean;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === 'day') {\n return (\n <DayBoundInput\n fill\n mask={copy.filters.dayMask}\n invalidMessage={copy.filters.dayInvalid}\n label={label}\n value={value == null ? undefined : String(value)}\n onChange={onChange}\n testId={testId}\n />\n );\n }\n return (\n <NumberBoundInput\n fill={fill}\n label={label}\n value={value}\n unit={field.unit}\n onChange={onChange}\n testId={testId}\n />\n );\n}\n\n\n/** One box of the pair: an equal share of the row for a day, as it was for a number. */\nfunction BoundCell({ grow, children }: { grow: boolean; children: React.ReactNode }): React.JSX.Element {\n if (!grow) return <>{children}</>;\n return <Box sx={{ flex: '1 1 0', minWidth: 0 }}>{children}</Box>;\n}\n\n/**\n * The line under the pair: why an inverted window matches nothing, or — for a\n * day range — that BOTH days are in the result. Saying so is FUT-668's other\n * half: the bounds compare as ISO strings precisely so `até` keeps its whole\n * day, and nothing on screen would otherwise tell the merchant that.\n */\nfunction RangeNote({\n day,\n inverted,\n testId,\n}: {\n day: boolean;\n inverted: boolean;\n testId: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (inverted) {\n return (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inverted`}\n sx={{ mt: 0.75, fontSize: sxRem(12), color: 'error.main' }}\n >\n {copy.filters.rangeInvalid}\n </Typography>\n );\n }\n if (!day) return null;\n return (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inclusive`}\n // `text.secondary`, not `disabled`: the note is read, and disabled grey\n // at 12px is 2.68:1 (FUT-4144 UI review).\n sx={{ mt: { xs: 0.25, sm: 0.75 }, fontSize: sxRem(12), color: 'text.secondary' }}\n >\n {copy.filters.rangeInclusiveNote}\n </Typography>\n );\n}\n\n/** Props of {@link RangeBounds}. */\ninterface RangeBoundsProps<T extends Record<string, unknown>> {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n /**\n * Months the day calendar shows side by side (FUT-4144). Two where the\n * popover has the room; one, with the month/year selectors, on a phone and\n * in the panels.\n */\n calendarMonths?: 1 | 2;\n /**\n * Whether the day calendar is mounted. A host that keeps the pair mounted\n * while hidden (the slide-in panel) passes its open state, so a closed panel\n * holds no calendar of its own.\n */\n showCalendar?: boolean;\n /**\n * A NUMBER pair splits the row equally too, as a day pair always does. Set\n * by the panels, whose width is the row's; the pill's popover sizes itself to\n * its content and keeps the boxes' own width.\n */\n fillRow?: boolean;\n}\n\n/**\n * The `De`/`Até` pair for a range — shared by the pill's popover and the\n * slide-in panel's day fields, so the two surfaces cannot drift on what a bound\n * accepts or how it clears.\n */\nexport function RangeBounds<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n calendarMonths = 1,\n showCalendar = true,\n fillRow = false,\n}: RangeBoundsProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { key, emitted } = useOutsideResetKey(value);\n // Moves the calendar to a TYPED day. A typed write is the fields' own, so\n // the outside key above does not see it; a tap on the calendar moves\n // neither, which is what keeps it still under the finger.\n const [typed, setTyped] = useState(0);\n const typedChange = (range: RangeValue) => {\n setTyped((n) => n + 1);\n onChange(emitted(range));\n };\n const day = field.kind === 'day';\n return (\n <Box data-testid={`${testId}-panel`}>\n {/* Above the inputs, not below: the presets are the answer for most\n merchants, and the two date pickers are the escape hatch. */}\n <Box sx={{ '&:not(:empty)': { mb: { xs: 1, sm: 1.5 } } }}>\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n {/* Top-aligned: a day that does not exist grows ITS field by a message\n line, and centring would push the other box half a line down. The two\n boxes are one height, so with no message this is the same row. */}\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n {/* A day pair shares the row equally, so it spans the calendar under\n it; a number pair keeps its own widths. */}\n <BoundCell grow={day || fillRow}>\n <BoundField\n key={`min-${key}`}\n field={field}\n label={copy.filters.rangeStart}\n value={value.min}\n onChange={(min) => typedChange({ ...value, min })}\n testId={`${testId}-min`}\n fill={fillRow}\n />\n </BoundCell>\n <BoundCell grow={day || fillRow}>\n <BoundField\n key={`max-${key}`}\n field={field}\n label={copy.filters.rangeEnd}\n value={value.max}\n onChange={(max) => typedChange({ ...value, max })}\n testId={`${testId}-max`}\n fill={fillRow}\n />\n </BoundCell>\n </Box>\n <RangeNote day={day} inverted={isRangeInverted(value)} testId={testId} />\n {/* Under the boxes and the note, with no button to reach it: the typed\n path stays as short as it was, and a period is two taps (FUT-4144). */}\n {day && showCalendar && (\n <DayRangeCalendar\n fieldLabel={field.label}\n value={value}\n onChange={(range) => onChange(emitted(range))}\n months={calendarMonths}\n viewKey={`${key}-${typed}`}\n testId={testId}\n />\n )}\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,72 @@
1
+ import {
2
+ extent,
3
+ planeBounds,
4
+ projectRings,
5
+ projectionAt,
6
+ viewBoxFor
7
+ } from "./chunk-COOSJKZL.js";
8
+
9
+ // src/components/data-display/RegionMap/RegionMap.view.ts
10
+ function unionBox(boxes) {
11
+ const real = boxes.filter((box) => box !== null);
12
+ const xs = extent(real.flatMap((b) => [b.minX, b.minX + b.spanX]));
13
+ const ys = extent(real.flatMap((b) => [b.minY, b.minY + b.spanY]));
14
+ if (xs === null || ys === null) return null;
15
+ return { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min };
16
+ }
17
+ function boundsOfRings(rings) {
18
+ const points = rings.flat();
19
+ const lats = extent(points.map(([latitude]) => latitude));
20
+ const lngs = extent(points.map(([, longitude]) => longitude));
21
+ if (lats === null || lngs === null) return null;
22
+ return { south: lats.min, west: lngs.min, north: lats.max, east: lngs.max };
23
+ }
24
+ function reachBox(reach, projection) {
25
+ if ("radiusMetres" in reach) {
26
+ const r = reach.radiusMetres;
27
+ return Number.isFinite(r) && r > 0 ? { minX: -r, minY: -r, spanX: r * 2, spanY: r * 2 } : null;
28
+ }
29
+ const { south, west, north, east } = reach.bounds;
30
+ const a = projection.project([north, west]);
31
+ const b = projection.project([south, east]);
32
+ return unionBox([{ minX: a.x, minY: a.y, spanX: 0, spanY: 0 }, { minX: b.x, minY: b.y, spanX: 0, spanY: 0 }]);
33
+ }
34
+ function farthestEdge(box) {
35
+ return Math.max(Math.abs(box.minX), Math.abs(box.minX + box.spanX), Math.abs(box.minY), Math.abs(box.minY + box.spanY));
36
+ }
37
+ function viewWithin(outermostMetres, reach, areaBoxes) {
38
+ if (outermostMetres !== null) {
39
+ return viewBoxFor(Math.max(outermostMetres, reach === null ? 0 : farthestEdge(reach)), null);
40
+ }
41
+ return viewBoxFor(null, unionBox([...areaBoxes(), reach]));
42
+ }
43
+ function centreOf(regions) {
44
+ const bounds = boundsOfRings(regions.flatMap((r) => r.rings));
45
+ if (bounds === null) return null;
46
+ return { latitude: (bounds.south + bounds.north) / 2, longitude: (bounds.west + bounds.east) / 2 };
47
+ }
48
+ function regionMapView({
49
+ regions,
50
+ center,
51
+ circles = [],
52
+ reach
53
+ }) {
54
+ const origin = center ?? centreOf(regions);
55
+ if (origin === null) return null;
56
+ const projection = projectionAt(origin);
57
+ return viewWithin(
58
+ extent(circles.map((c) => c.radiusMetres))?.max ?? null,
59
+ reach === void 0 ? null : reachBox(reach, projection),
60
+ () => regions.map((r) => planeBounds(projectRings(r.rings, projection)))
61
+ );
62
+ }
63
+
64
+ export {
65
+ unionBox,
66
+ boundsOfRings,
67
+ reachBox,
68
+ viewWithin,
69
+ centreOf,
70
+ regionMapView
71
+ };
72
+ //# sourceMappingURL=chunk-FWAY2SAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.view.ts"],"sourcesContent":["import {\n extent,\n planeBounds,\n projectionAt,\n projectRings,\n viewBoxFor,\n type PlaneBox,\n type Projection,\n} from './RegionMap.helpers';\nimport type {\n RegionMapBounds,\n RegionMapCircle,\n RegionMapReach,\n RegionMapRegion,\n RegionMapRing,\n} from './RegionMap.types';\n\n// What `RegionMap` shows: its view, given the circles, the areas and a host's\n// `reach` — pure, so a host laying HTML over the drawing computes the same one.\n\n/** The smallest box holding every given box, or null with none. */\nexport function unionBox(boxes: readonly (PlaneBox | null)[]): PlaneBox | null {\n const real = boxes.filter((box): box is PlaneBox => box !== null);\n const xs = extent(real.flatMap((b) => [b.minX, b.minX + b.spanX]));\n const ys = extent(real.flatMap((b) => [b.minY, b.minY + b.spanY]));\n if (xs === null || ys === null) return null;\n return { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min };\n}\n\n/** The latitude/longitude box around some outlines — a `reach` no radius describes. */\nexport function boundsOfRings(rings: readonly RegionMapRing[]): RegionMapBounds | null {\n const points = rings.flat();\n const lats = extent(points.map(([latitude]) => latitude));\n const lngs = extent(points.map(([, longitude]) => longitude));\n if (lats === null || lngs === null) return null;\n return { south: lats.min, west: lngs.min, north: lats.max, east: lngs.max };\n}\n\n/** A `reach` as a box in projected metres (a radius is a square around the centre). */\nexport function reachBox(reach: RegionMapReach, projection: Projection): PlaneBox | null {\n if ('radiusMetres' in reach) {\n const r = reach.radiusMetres;\n return Number.isFinite(r) && r > 0 ? { minX: -r, minY: -r, spanX: r * 2, spanY: r * 2 } : null;\n }\n const { south, west, north, east } = reach.bounds;\n const a = projection.project([north, west]);\n const b = projection.project([south, east]);\n return unionBox([{ minX: a.x, minY: a.y, spanX: 0, spanY: 0 }, { minX: b.x, minY: b.y, spanX: 0, spanY: 0 }]);\n}\n\n/** How far the box reaches from the centre along either axis — the half-side of a centred square holding it. */\nfunction farthestEdge(box: PlaneBox): number {\n return Math.max(Math.abs(box.minX), Math.abs(box.minX + box.spanX), Math.abs(box.minY), Math.abs(box.minY + box.spanY));\n}\n\n/**\n * The view, given what it must fit: the outermost circle and the `reach` with\n * the margin on top, still centred on the centre; else every area and the\n * reach together. Without a reach it is exactly `viewBoxFor`'s.\n */\nexport function viewWithin(\n outermostMetres: number | null,\n reach: PlaneBox | null,\n areaBoxes: () => readonly (PlaneBox | null)[],\n): PlaneBox | null {\n if (outermostMetres !== null) {\n return viewBoxFor(Math.max(outermostMetres, reach === null ? 0 : farthestEdge(reach)), null);\n }\n return viewBoxFor(null, unionBox([...areaBoxes(), reach]));\n}\n\n/** The middle of every area, for a map with no centre of its own. */\nexport function centreOf(regions: readonly RegionMapRegion[]): { latitude: number; longitude: number } | null {\n const bounds = boundsOfRings(regions.flatMap((r) => r.rings));\n if (bounds === null) return null;\n return { latitude: (bounds.south + bounds.north) / 2, longitude: (bounds.west + bounds.east) / 2 };\n}\n\n/**\n * The square `RegionMap` shows for these props, in projected metres around\n * `center` (or the areas' middle) — for a host that lays its own HTML over the\n * drawing at the same scale: a point `p` sits at\n * `(p.x - view.minX) / view.spanX` across. With circles the view is centred,\n * so its half-side is `view.spanX / 2`.\n */\nexport function regionMapView({\n regions,\n center,\n circles = [],\n reach,\n}: {\n regions: readonly RegionMapRegion[];\n center: { latitude: number; longitude: number } | null;\n circles?: readonly RegionMapCircle[];\n reach?: RegionMapReach;\n}): PlaneBox | null {\n const origin = center ?? centreOf(regions);\n if (origin === null) return null;\n const projection = projectionAt(origin);\n return viewWithin(\n extent(circles.map((c) => c.radiusMetres))?.max ?? null,\n reach === undefined ? null : reachBox(reach, projection),\n () => regions.map((r) => planeBounds(projectRings(r.rings, projection))),\n );\n}\n"],"mappings":"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","names":[]}
@@ -4,15 +4,18 @@ import {
4
4
  import {
5
5
  useCalendar
6
6
  } from "./chunk-TPMT3J32.js";
7
+ import {
8
+ navigateFocus
9
+ } from "./chunk-LZOCNAUA.js";
7
10
  import {
8
11
  resolveCalendarProps
9
12
  } from "./chunk-I4K5JMS4.js";
10
13
  import {
11
14
  CalendarSelectorsMonth
12
- } from "./chunk-5BVAUUWL.js";
15
+ } from "./chunk-X37NTEVS.js";
13
16
  import {
14
17
  CalendarMonth
15
- } from "./chunk-YDIC6LSP.js";
18
+ } from "./chunk-VCQFDQM3.js";
16
19
  import {
17
20
  resolveLabels
18
21
  } from "./chunk-LL2BWQPM.js";
@@ -27,7 +30,7 @@ import {
27
30
  // src/components/form/Calendar/Calendar.tsx
28
31
  import Box from "@mui/material/Box/index.js";
29
32
  import Paper from "@mui/material/Paper/index.js";
30
- import React, { useCallback, useRef } from "react";
33
+ import React, { useCallback, useEffect, useRef } from "react";
31
34
  import { jsx, jsxs } from "react/jsx-runtime";
32
35
  var containerSx = (monthsToShow) => ({
33
36
  p: 3,
@@ -43,6 +46,7 @@ var containerSx = (monthsToShow) => ({
43
46
  });
44
47
  var buildDayContext = (props, calendar) => ({
45
48
  selectionMode: props.selectionMode,
49
+ locale: props.locale,
46
50
  value: props.value,
47
51
  range: props.range,
48
52
  showOutsideDays: props.showOutsideDays,
@@ -68,6 +72,23 @@ var useRootRef = (forwarded) => {
68
72
  );
69
73
  return { rootRef, setRoot };
70
74
  };
75
+ var OWN_MONTH_STOP = '[role="gridcell"][tabindex="0"][data-in-month="true"]';
76
+ var ANY_STOP = '[role="gridcell"][tabindex="0"]';
77
+ var useFollowDayFocus = (rootRef, focusedDate, firstDayOfWeek) => {
78
+ const movedFrom = useRef(null);
79
+ useEffect(() => {
80
+ const from = movedFrom.current;
81
+ movedFrom.current = null;
82
+ if (from === null || from === focusedDate.getTime()) return;
83
+ const root = rootRef.current;
84
+ (root?.querySelector(OWN_MONTH_STOP) ?? root?.querySelector(ANY_STOP))?.focus();
85
+ }, [rootRef, focusedDate]);
86
+ return (event) => {
87
+ const onDay = event.target.getAttribute("role") === "gridcell";
88
+ const moves = navigateFocus(event.key, focusedDate, { firstDayOfWeek, shiftKey: event.shiftKey }) !== null;
89
+ movedFrom.current = onDay && moves ? focusedDate.getTime() : null;
90
+ };
91
+ };
71
92
  var Calendar = React.forwardRef((componentProps, ref) => {
72
93
  const props = resolveCalendarProps(componentProps);
73
94
  const { monthsToShow, locale, renderHeader, renderFooter, className, ariaLabel } = props;
@@ -76,6 +97,8 @@ var Calendar = React.forwardRef((componentProps, ref) => {
76
97
  const bounds = { minDate: props.minDate, maxDate: props.maxDate };
77
98
  const picker = useCalendarPicker({ rootRef, bounds, ...calendar });
78
99
  const dayContext = buildDayContext(props, calendar);
100
+ const noteKeyTarget = useFollowDayFocus(rootRef, calendar.focusedDate, props.firstDayOfWeek);
101
+ const labels = resolveLabels(EN_US_UI_LABELS.calendar, props.labels);
79
102
  const firstMonth = calendar.monthMatrices[0];
80
103
  return /* @__PURE__ */ jsxs(
81
104
  Paper,
@@ -85,7 +108,10 @@ var Calendar = React.forwardRef((componentProps, ref) => {
85
108
  role: "application",
86
109
  "aria-label": ariaLabel,
87
110
  tabIndex: 0,
88
- onKeyDown: picker.view === "days" ? calendar.handleKeyDown : void 0,
111
+ onKeyDown: picker.view === "days" ? (event) => {
112
+ noteKeyTarget(event);
113
+ calendar.handleKeyDown(event);
114
+ } : void 0,
89
115
  "data-testid": "calendar-container",
90
116
  sx: containerSx(monthsToShow),
91
117
  children: [
@@ -97,7 +123,7 @@ var Calendar = React.forwardRef((componentProps, ref) => {
97
123
  weekdayNames: calendar.weekdayNames,
98
124
  dayContext,
99
125
  bounds,
100
- labels: resolveLabels(EN_US_UI_LABELS.calendar, props.labels),
126
+ labels,
101
127
  picker,
102
128
  onPreviousMonth: () => {
103
129
  picker.showDays();
@@ -117,6 +143,7 @@ var Calendar = React.forwardRef((componentProps, ref) => {
117
143
  locale,
118
144
  weekdayNames: calendar.weekdayNames,
119
145
  renderHeader,
146
+ labels: props.labels ? labels : void 0,
120
147
  onPreviousMonth: calendar.goToPreviousMonth,
121
148
  onNextMonth: calendar.goToNextMonth,
122
149
  dayContext
@@ -135,4 +162,4 @@ export {
135
162
  Calendar,
136
163
  Calendar_default
137
164
  };
138
- //# sourceMappingURL=chunk-Q2ERGAQO.js.map
165
+ //# sourceMappingURL=chunk-FYAW5GBF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form/Calendar/Calendar.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { EN_US_UI_LABELS } from '../../../en-US.labels';\nimport { rem, sxRem } from '../../../tokens/relative';\nimport { resolveLabels } from '../../../utils/resolve-labels';\n\nimport { resolveCalendarProps } from './Calendar.helpers';\nimport { useCalendar } from './Calendar.hooks';\nimport { navigateFocus } from './Calendar.keyboard';\nimport { useCalendarPicker } from './Calendar.picker';\nimport type { CalendarProps, ResolvedCalendarProps } from './Calendar.types';\nimport type { DayCellContext } from './CalendarDayCell';\nimport { CalendarMonth } from './CalendarMonth';\nimport { CalendarSelectorsMonth } from './CalendarSelectorsMonth';\n\nconst containerSx = (monthsToShow: number): SxProps<Theme> => ({\n p: 3,\n display: 'flex',\n flexDirection: monthsToShow > 1 ? 'row' : 'column',\n gap: 3,\n outline: 'none',\n '&:focus-within': {\n outline: (theme: Theme) => `${rem(theme, 2)} solid`,\n outlineColor: 'primary.main',\n outlineOffset: sxRem(2),\n },\n});\n\ntype CalendarState = ReturnType<typeof useCalendar>;\n\nconst buildDayContext = (props: ResolvedCalendarProps, calendar: CalendarState): DayCellContext => ({\n selectionMode: props.selectionMode,\n locale: props.locale,\n value: props.value,\n range: props.range,\n showOutsideDays: props.showOutsideDays,\n renderDay: props.renderDay,\n dayClassName: props.dayClassName,\n hoveredDate: calendar.hoveredDate,\n focusedDate: calendar.focusedDate,\n today: calendar.today,\n isDisabled: calendar.isDisabled,\n onSelect: calendar.handleDateClick,\n onHover: calendar.handleDateMouseEnter,\n onHoverEnd: calendar.handleDateMouseLeave,\n});\n\n// The container is the forwarded ref's AND the picker's: focus falls back to it.\nconst useRootRef = (forwarded: React.ForwardedRef<HTMLDivElement>) => {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRoot = useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof forwarded === 'function') forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded],\n );\n return { rootRef, setRoot };\n};\n\n/** The tab stop as a day of its OWN month — side by side, an outside copy of it comes first in the DOM. */\nconst OWN_MONTH_STOP = '[role=\"gridcell\"][tabindex=\"0\"][data-in-month=\"true\"]';\nconst ANY_STOP = '[role=\"gridcell\"][tabindex=\"0\"]';\n\n/**\n * Keeps the keyboard's place visible when it is on a DAY.\n *\n * The arrows move the grid's one tab stop (`focusedDate`), and that is enough\n * while the container holds focus. But a reader who tabbed onto a day, or\n * clicked one, has focus on that day's button: the tab stop moved and focus\n * stayed behind on a cell that is no longer it, so the ring sat on the old day\n * and a month change unmounted it under the reader.\n *\n * So a NAVIGATION key pressed on a day notes where the tab stop was, and once\n * it has moved, focus follows it to the day in its own month. Any other key —\n * Enter, Tab, Escape — clears the note: Enter re-sets the same day and must\n * leave focus alone, and a stale note would pull focus into the grid on the\n * next mouse pick.\n */\nconst useFollowDayFocus = (\n rootRef: React.RefObject<HTMLDivElement | null>,\n focusedDate: Date,\n firstDayOfWeek: number,\n) => {\n const movedFrom = useRef<number | null>(null);\n useEffect(() => {\n const from = movedFrom.current;\n movedFrom.current = null;\n if (from === null || from === focusedDate.getTime()) return;\n const root = rootRef.current;\n (root?.querySelector<HTMLElement>(OWN_MONTH_STOP) ?? root?.querySelector<HTMLElement>(ANY_STOP))?.focus();\n }, [rootRef, focusedDate]);\n return (event: React.KeyboardEvent) => {\n const onDay = (event.target as HTMLElement).getAttribute('role') === 'gridcell';\n const moves = navigateFocus(event.key, focusedDate, { firstDayOfWeek, shiftKey: event.shiftKey }) !== null;\n movedFrom.current = onDay && moves ? focusedDate.getTime() : null;\n };\n};\n\nexport const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>((componentProps, ref) => {\n const props = resolveCalendarProps(componentProps);\n const { monthsToShow, locale, renderHeader, renderFooter, className, ariaLabel } = props;\n\n const calendar = useCalendar(props);\n const { rootRef, setRoot } = useRootRef(ref);\n const bounds = { minDate: props.minDate, maxDate: props.maxDate };\n const picker = useCalendarPicker({ rootRef, bounds, ...calendar });\n const dayContext = buildDayContext(props, calendar);\n const noteKeyTarget = useFollowDayFocus(rootRef, calendar.focusedDate, props.firstDayOfWeek);\n const labels = resolveLabels(EN_US_UI_LABELS.calendar, props.labels);\n // The selectors caption always resolves to one month (see the helpers).\n const firstMonth = calendar.monthMatrices[0];\n\n return (\n <Paper\n ref={setRoot}\n className={className}\n role=\"application\"\n aria-label={ariaLabel}\n tabIndex={0}\n // The day keys belong to the days: with a month or year grid open there\n // is no focused day on screen to move.\n onKeyDown={\n picker.view === 'days'\n ? (event) => {\n noteKeyTarget(event);\n calendar.handleKeyDown(event);\n }\n : undefined\n }\n data-testid=\"calendar-container\"\n sx={containerSx(monthsToShow)}\n >\n <Box ref={calendar.gridRef} sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}>\n {props.captionLayout === 'selectors' && firstMonth ? (\n <CalendarSelectorsMonth\n matrix={firstMonth}\n locale={locale}\n weekdayNames={calendar.weekdayNames}\n dayContext={dayContext}\n bounds={bounds}\n labels={labels}\n picker={picker}\n onPreviousMonth={() => {\n picker.showDays();\n calendar.goToPreviousMonth();\n }}\n onNextMonth={() => {\n picker.showDays();\n calendar.goToNextMonth();\n }}\n />\n ) : (\n calendar.monthMatrices.map((matrix, index) => (\n <CalendarMonth\n key={`month-${matrix.year}-${matrix.month}`}\n matrix={matrix}\n monthIndex={index}\n monthsToShow={monthsToShow}\n locale={locale}\n weekdayNames={calendar.weekdayNames}\n renderHeader={renderHeader}\n // Only a host that passed `labels` gets named arrows: without\n // them the arrows caption stays exactly as it always was.\n labels={props.labels ? labels : undefined}\n onPreviousMonth={calendar.goToPreviousMonth}\n onNextMonth={calendar.goToNextMonth}\n dayContext={dayContext}\n />\n ))\n )}\n </Box>\n\n {renderFooter && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>{renderFooter}</Box>\n )}\n </Paper>\n );\n});\n\nCalendar.displayName = 'Calendar';\n\nexport default Calendar;\n"],"mappings":"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","names":[]}
@@ -1,22 +1,19 @@
1
+ import {
2
+ centreOf,
3
+ reachBox,
4
+ viewWithin
5
+ } from "./chunk-FWAY2SAI.js";
1
6
  import {
2
7
  drawOrder,
3
8
  extent,
4
9
  geometryCache,
5
10
  hitRegion,
6
- projectionAt,
7
- viewBoxFor
11
+ projectionAt
8
12
  } from "./chunk-COOSJKZL.js";
9
13
 
10
14
  // src/components/data-display/RegionMap/RegionMap.hooks.ts
11
15
  import React from "react";
12
16
  var TOLERANCE_SHARE = 1 / 45;
13
- function centreOf(regions) {
14
- const points = regions.flatMap((r) => r.rings.flat());
15
- const lats = extent(points.map(([lat]) => lat));
16
- const lngs = extent(points.map(([, lng]) => lng));
17
- if (lats === null || lngs === null) return null;
18
- return { latitude: (lats.min + lats.max) / 2, longitude: (lngs.min + lngs.max) / 2 };
19
- }
20
17
  function svgPoint(event) {
21
18
  const svg = event.currentTarget;
22
19
  const matrix = typeof svg.getScreenCTM === "function" ? svg.getScreenCTM() : null;
@@ -24,14 +21,6 @@ function svgPoint(event) {
24
21
  const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());
25
22
  return { x: point.x, y: point.y };
26
23
  }
27
- function viewOf(outermostMetres, drawable) {
28
- if (outermostMetres !== null) return viewBoxFor(outermostMetres, null);
29
- const boxes = drawable().filter((box) => box !== null);
30
- const xs = extent(boxes.flatMap((b) => [b.minX, b.minX + b.spanX]));
31
- const ys = extent(boxes.flatMap((b) => [b.minY, b.minY + b.spanY]));
32
- if (xs === null || ys === null) return null;
33
- return viewBoxFor(null, { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min });
34
- }
35
24
  function tappedRegion(event, pointer, drawn, view) {
36
25
  const targetId = event.target.getAttribute("data-region-id");
37
26
  if (pointer === "mouse" && targetId) return targetId;
@@ -46,21 +35,27 @@ function tappedRegion(event, pointer, drawn, view) {
46
35
  function useGeometry(origin) {
47
36
  const lat = origin?.latitude ?? null;
48
37
  const lng = origin?.longitude ?? null;
49
- return React.useMemo(
50
- () => lat === null || lng === null ? null : geometryCache(projectionAt({ latitude: lat, longitude: lng })),
51
- [lat, lng]
52
- );
38
+ return React.useMemo(() => {
39
+ if (lat === null || lng === null) return { projection: null, geometryOf: null };
40
+ const projection = projectionAt({ latitude: lat, longitude: lng });
41
+ return { projection, geometryOf: geometryCache(projection) };
42
+ }, [lat, lng]);
53
43
  }
54
44
  function useRegionMap({
55
45
  regions,
56
46
  center,
57
47
  circles = [],
48
+ reach,
58
49
  onToggle
59
50
  }) {
60
- const geometryOf = useGeometry(center ?? centreOf(regions));
51
+ const { projection, geometryOf } = useGeometry(center ?? centreOf(regions));
61
52
  const radii = circles.map((c) => c.radiusMetres);
62
53
  const outermostMetres = extent(radii)?.max ?? null;
63
- const view = geometryOf === null ? null : viewOf(outermostMetres, () => regions.map((r) => geometryOf(r.rings).bounds));
54
+ const view = projection === null || geometryOf === null ? null : viewWithin(
55
+ outermostMetres,
56
+ reach === void 0 ? null : reachBox(reach, projection),
57
+ () => regions.map((r) => geometryOf(r.rings).bounds)
58
+ );
64
59
  const drawn = geometryOf && view ? drawOrder(regions, geometryOf, view) : [];
65
60
  const pointerType = React.useRef("mouse");
66
61
  const onPointerDown = (event) => {
@@ -71,10 +66,10 @@ function useRegionMap({
71
66
  const hit = tappedRegion(event, pointerType.current, drawn, view);
72
67
  if (hit) onToggle(hit);
73
68
  };
74
- return { view, drawn, radii, outermostMetres, onPointerDown, onClick };
69
+ return { view, projection, drawn, radii, outermostMetres, onPointerDown, onClick };
75
70
  }
76
71
 
77
72
  export {
78
73
  useRegionMap
79
74
  };
80
- //# sourceMappingURL=chunk-GMRQPNG3.js.map
75
+ //# sourceMappingURL=chunk-G2NVBCF7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.hooks.ts"],"sourcesContent":["import React from 'react';\n\nimport {\n drawOrder,\n extent,\n geometryCache,\n hitRegion,\n projectionAt,\n type DrawnRegion,\n type PlaneBox,\n type Projection,\n} from './RegionMap.helpers';\nimport type { RegionMapProps } from './RegionMap.types';\nimport { centreOf, reachBox, viewWithin } from './RegionMap.view';\n\n/** What the drawing needs, derived from the props. */\nexport interface RegionMapModel {\n /** The square shown, or null when there is nothing to centre on. */\n view: PlaneBox | null;\n /** The projection drawn with, or null when there is nothing to centre on. */\n projection: Projection | null;\n drawn: DrawnRegion[];\n /** Radii drawn, in metres; empty without circles. */\n radii: number[];\n outermostMetres: number | null;\n /** The tap handlers for the drawing's `<svg>`. */\n onPointerDown: (event: React.PointerEvent<SVGSVGElement>) => void;\n onClick: (event: React.MouseEvent<SVGSVGElement>) => void;\n}\n\n/** A tap reaches an area this close: a share of the view (~8 px on a phone). */\nconst TOLERANCE_SHARE = 1 / 45;\n\n/** The click, in the drawing's own coordinates — or null where it cannot be read. */\nfunction svgPoint(event: React.MouseEvent<SVGSVGElement>): { x: number; y: number } | null {\n const svg = event.currentTarget;\n const matrix = typeof svg.getScreenCTM === 'function' ? svg.getScreenCTM() : null;\n if (!matrix || typeof DOMPoint === 'undefined') return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n}\n\n/** Which area a click or tap means — see `useRegionMap`. */\nfunction tappedRegion(\n event: React.MouseEvent<SVGSVGElement>,\n pointer: string,\n drawn: readonly DrawnRegion[],\n view: PlaneBox,\n): string | null {\n const targetId = (event.target as Element).getAttribute('data-region-id');\n if (pointer === 'mouse' && targetId) return targetId;\n const point = svgPoint(event);\n if (point === null) return targetId;\n return hitRegion(\n drawn.map((d) => ({ id: d.id, geometry: d.geometry })),\n point,\n view.spanX * TOLERANCE_SHARE,\n );\n}\n\n/** The projection and geometry cache for a centre, or nulls without one. */\nfunction useGeometry(origin: { latitude: number; longitude: number } | null): {\n projection: Projection | null;\n geometryOf: ReturnType<typeof geometryCache> | null;\n} {\n const lat = origin?.latitude ?? null;\n const lng = origin?.longitude ?? null;\n return React.useMemo(() => {\n if (lat === null || lng === null) return { projection: null, geometryOf: null };\n const projection = projectionAt({ latitude: lat, longitude: lng });\n return { projection, geometryOf: geometryCache(projection) };\n }, [lat, lng]);\n}\n\n/**\n * The projection, the view, the areas in draw order and the tap handlers.\n *\n * Geometry is projected once per `rings` identity and centre\n * (`geometryCache`), so a toggle — which changes `excluded`, not `rings` —\n * re-projects nothing.\n *\n * A MOUSE click on a path is that path's area: a pointer is precise. Any\n * other tap — a finger, a pen — goes to `hitRegion`: the smallest area within\n * a few pixels, so a sliver beside a big area is reachable from the map.\n */\nexport function useRegionMap({\n regions,\n center,\n circles = [],\n reach,\n onToggle,\n}: Pick<RegionMapProps, 'regions' | 'center' | 'circles' | 'reach' | 'onToggle'>): RegionMapModel {\n const { projection, geometryOf } = useGeometry(center ?? centreOf(regions));\n const radii = circles.map((c) => c.radiusMetres);\n const outermostMetres = extent(radii)?.max ?? null;\n const view =\n projection === null || geometryOf === null\n ? null\n : viewWithin(outermostMetres, reach === undefined ? null : reachBox(reach, projection), () =>\n regions.map((r) => geometryOf(r.rings).bounds),\n );\n const drawn = geometryOf && view ? drawOrder(regions, geometryOf, view) : [];\n const pointerType = React.useRef<string>('mouse');\n\n const onPointerDown = (event: React.PointerEvent<SVGSVGElement>): void => {\n pointerType.current = event.pointerType || 'mouse';\n };\n\n const onClick = (event: React.MouseEvent<SVGSVGElement>): void => {\n if (!onToggle || view === null) return;\n const hit = tappedRegion(event, pointerType.current, drawn, view);\n if (hit) onToggle(hit);\n };\n\n return { view, projection, drawn, radii, outermostMetres, onPointerDown, onClick };\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,WAAW;AA+BlB,IAAM,kBAAkB,IAAI;AAG5B,SAAS,SAAS,OAAyE;AACzF,QAAM,MAAM,MAAM;AAClB,QAAM,SAAS,OAAO,IAAI,iBAAiB,aAAa,IAAI,aAAa,IAAI;AAC7E,MAAI,CAAC,UAAU,OAAO,aAAa,YAAa,QAAO;AACvD,QAAM,QAAQ,IAAI,SAAS,MAAM,SAAS,MAAM,OAAO,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACzF,SAAO,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE;AAClC;AAGA,SAAS,aACP,OACA,SACA,OACA,MACe;AACf,QAAM,WAAY,MAAM,OAAmB,aAAa,gBAAgB;AACxE,MAAI,YAAY,WAAW,SAAU,QAAO;AAC5C,QAAM,QAAQ,SAAS,KAAK;AAC5B,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO;AAAA,IACL,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,SAAS,EAAE;AAAA,IACrD;AAAA,IACA,KAAK,QAAQ;AAAA,EACf;AACF;AAGA,SAAS,YAAY,QAGnB;AACA,QAAM,MAAM,QAAQ,YAAY;AAChC,QAAM,MAAM,QAAQ,aAAa;AACjC,SAAO,MAAM,QAAQ,MAAM;AACzB,QAAI,QAAQ,QAAQ,QAAQ,KAAM,QAAO,EAAE,YAAY,MAAM,YAAY,KAAK;AAC9E,UAAM,aAAa,aAAa,EAAE,UAAU,KAAK,WAAW,IAAI,CAAC;AACjE,WAAO,EAAE,YAAY,YAAY,cAAc,UAAU,EAAE;AAAA,EAC7D,GAAG,CAAC,KAAK,GAAG,CAAC;AACf;AAaO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AACF,GAAkG;AAChG,QAAM,EAAE,YAAY,WAAW,IAAI,YAAY,UAAU,SAAS,OAAO,CAAC;AAC1E,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,YAAY;AAC/C,QAAM,kBAAkB,OAAO,KAAK,GAAG,OAAO;AAC9C,QAAM,OACJ,eAAe,QAAQ,eAAe,OAClC,OACA;AAAA,IAAW;AAAA,IAAiB,UAAU,SAAY,OAAO,SAAS,OAAO,UAAU;AAAA,IAAG,MACpF,QAAQ,IAAI,CAAC,MAAM,WAAW,EAAE,KAAK,EAAE,MAAM;AAAA,EAC/C;AACN,QAAM,QAAQ,cAAc,OAAO,UAAU,SAAS,YAAY,IAAI,IAAI,CAAC;AAC3E,QAAM,cAAc,MAAM,OAAe,OAAO;AAEhD,QAAM,gBAAgB,CAAC,UAAmD;AACxE,gBAAY,UAAU,MAAM,eAAe;AAAA,EAC7C;AAEA,QAAM,UAAU,CAAC,UAAiD;AAChE,QAAI,CAAC,YAAY,SAAS,KAAM;AAChC,UAAM,MAAM,aAAa,OAAO,YAAY,SAAS,OAAO,IAAI;AAChE,QAAI,IAAK,UAAS,GAAG;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,YAAY,OAAO,OAAO,iBAAiB,eAAe,QAAQ;AACnF;","names":[]}