@12-apps/ui 6.43.0 → 6.44.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 (416) hide show
  1. package/NATIVE.md +1 -1
  2. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
  3. package/dist/_internal/components/data-display/Badge/Badge.js +6 -5
  4. package/dist/_internal/components/data-display/Badge/Badge.styles.js +4 -3
  5. package/dist/_internal/components/data-display/Badge/BadgeContent.js +5 -4
  6. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
  7. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
  8. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +5 -4
  9. package/dist/_internal/components/data-display/Carousel/Carousel.js +8 -7
  10. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +4 -3
  11. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +4 -3
  12. package/dist/_internal/components/data-display/Chart/Chart.js +7 -6
  13. package/dist/_internal/components/data-display/Chart/SpecChart.js +8 -7
  14. package/dist/_internal/components/data-display/Chart/chart-context.js +5 -4
  15. package/dist/_internal/components/data-display/Chart/chart-internals.js +4 -3
  16. package/dist/_internal/components/data-display/Chart/chart-renderers.js +6 -5
  17. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +4 -3
  18. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +3 -2
  19. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +32 -31
  20. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +45 -44
  21. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  22. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
  23. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
  24. package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
  25. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -5
  26. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  27. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +5 -4
  28. package/dist/_internal/components/data-display/DataViews/base-list-card.js +10 -9
  29. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +8 -8
  30. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +5 -4
  31. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +4 -3
  32. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -12
  33. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +8 -7
  34. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +31 -30
  35. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +12 -12
  36. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +3 -2
  37. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +9 -9
  38. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +10 -10
  39. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +4 -3
  40. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +8 -7
  41. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +10 -10
  42. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +7 -6
  43. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +4 -3
  44. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  45. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
  46. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +5 -5
  47. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +4 -4
  48. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +13 -12
  49. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  50. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +2 -2
  51. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  52. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +3 -3
  53. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
  54. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +3 -2
  55. package/dist/_internal/components/data-display/Sheet/Sheet.js +5 -4
  56. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +4 -3
  57. package/dist/_internal/components/data-display/Table/Table.js +4 -3
  58. package/dist/_internal/components/data-display/index.js +38 -37
  59. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
  60. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  61. package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
  62. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  63. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +6 -6
  64. package/dist/_internal/components/feedback/index.js +14 -14
  65. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +1 -1
  66. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +1 -1
  67. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +3 -3
  68. package/dist/_internal/components/form/Autocomplete/useAutocomplete.js +1 -1
  69. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +3 -3
  70. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +6 -6
  71. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  72. package/dist/_internal/components/form/Command/Command.js +5 -4
  73. package/dist/_internal/components/form/Command/Command.styles.js +4 -3
  74. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +2 -2
  75. package/dist/_internal/components/form/Label/Label.js +5 -4
  76. package/dist/_internal/components/form/Label/Label.styles.js +4 -3
  77. package/dist/_internal/components/form/Menubar/Menubar.item.js +5 -4
  78. package/dist/_internal/components/form/Menubar/Menubar.js +7 -6
  79. package/dist/_internal/components/form/Menubar/Menubar.styles.js +4 -3
  80. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +6 -5
  81. package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
  82. package/dist/_internal/components/form/index.js +21 -20
  83. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +7 -7
  84. package/dist/_internal/components/form/total-form/Fields/index.js +11 -11
  85. package/dist/_internal/components/index.js +100 -99
  86. package/dist/_internal/components/layout/Box/Box.js +6 -5
  87. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
  88. package/dist/_internal/components/layout/SettingCard/SettingCard.js +8 -7
  89. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +7 -6
  90. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +8 -7
  91. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +10 -9
  92. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +9 -8
  93. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +10 -9
  94. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +4 -4
  95. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +3 -3
  96. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +2 -2
  97. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.scroll.js +1 -1
  98. package/dist/_internal/components/layout/Stack/Stack.js +7 -6
  99. package/dist/_internal/components/layout/index.js +20 -19
  100. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +8 -7
  101. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +4 -3
  102. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  103. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
  104. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
  105. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
  106. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
  107. package/dist/_internal/components/navigation/index.js +16 -15
  108. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
  109. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +6 -3
  110. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +7 -6
  111. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +5 -4
  112. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +6 -5
  113. package/dist/_internal/components/utility/index.js +9 -8
  114. package/dist/_internal/icons/Icon.js +6 -5
  115. package/dist/_internal/provider/UiProvider.js +5 -4
  116. package/dist/_internal/provider/mui-bridge.js +4 -3
  117. package/dist/_internal/provider/use-ui-theme.js +5 -4
  118. package/dist/_internal/tokens/density-overrides.js +11 -0
  119. package/dist/_internal/tokens/density-overrides.js.map +1 -0
  120. package/dist/_internal/tokens/density.js +3 -1
  121. package/dist/charts.js +8 -7
  122. package/dist/{chunk-DJKVSUXH.js → chunk-2GG5W6LR.js} +10 -2
  123. package/dist/chunk-2GG5W6LR.js.map +1 -0
  124. package/dist/{chunk-442FSG7G.js → chunk-3I77A65F.js} +4 -4
  125. package/dist/{chunk-R2FUQV24.js → chunk-4MGUBSAL.js} +2 -2
  126. package/dist/{chunk-YIWVHEPW.js → chunk-4T5LD2NV.js} +2 -2
  127. package/dist/{chunk-4CHYMTBT.js → chunk-4WCDMCIS.js} +4 -4
  128. package/dist/chunk-532XOWZ5.js +59 -0
  129. package/dist/chunk-532XOWZ5.js.map +1 -0
  130. package/dist/{chunk-5KGABAQB.js → chunk-5752357K.js} +4 -4
  131. package/dist/{chunk-JSGVYOMN.js → chunk-5MW7OYBM.js} +2 -2
  132. package/dist/{chunk-RWRPF24F.js → chunk-5OS5AMC2.js} +2 -2
  133. package/dist/{chunk-I6MVJWUO.js → chunk-6B3QXFF5.js} +2 -2
  134. package/dist/{chunk-MLUUF7OZ.js → chunk-6B4UTB4O.js} +2 -2
  135. package/dist/{chunk-FBUCXTA4.js → chunk-6DMUVVON.js} +2 -2
  136. package/dist/{chunk-G7RYAWPZ.js → chunk-6HTCCWUM.js} +2 -2
  137. package/dist/{chunk-77BKKPCI.js → chunk-6KLDYVRY.js} +2 -2
  138. package/dist/{chunk-6Z6PUG4C.js → chunk-6LYRFS5S.js} +5 -5
  139. package/dist/{chunk-KJID4PRD.js → chunk-6S25ZCEW.js} +34 -45
  140. package/dist/chunk-6S25ZCEW.js.map +1 -0
  141. package/dist/{chunk-K4A3JDYQ.js → chunk-6ZWOVUNB.js} +2 -2
  142. package/dist/{chunk-3RUCLKAK.js → chunk-7HZTYK7U.js} +4 -4
  143. package/dist/{chunk-BKZERHNC.js → chunk-7XDET7PL.js} +3 -3
  144. package/dist/{chunk-OD3L6GX5.js → chunk-A7OQBAR7.js} +2 -2
  145. package/dist/{chunk-2MLS6KU4.js → chunk-AEKHSORY.js} +2 -2
  146. package/dist/{chunk-5DAVXZPY.js → chunk-B2WBDMHE.js} +2 -2
  147. package/dist/{chunk-GZT7MLLO.js → chunk-B2ZITMYG.js} +2 -2
  148. package/dist/{chunk-54HTXJJ2.js → chunk-BHE44AQE.js} +2 -2
  149. package/dist/{chunk-TBMGYQJF.js → chunk-BKBELIUR.js} +2 -2
  150. package/dist/{chunk-OOB3YWPX.js → chunk-BZFRBG2H.js} +4 -4
  151. package/dist/{chunk-PICOOZLX.js → chunk-C5RTSOXD.js} +3 -3
  152. package/dist/{chunk-GO6XDMBB.js → chunk-CEJTGG6J.js} +2 -2
  153. package/dist/{chunk-ZGWEFOW6.js → chunk-CKAVTWXP.js} +4 -4
  154. package/dist/{chunk-ANYOSBNA.js → chunk-CSXK7LH7.js} +2 -2
  155. package/dist/{chunk-U6DOF5CR.js → chunk-CU7ELD43.js} +2 -2
  156. package/dist/{chunk-XO4ZUHVH.js → chunk-CYPBF3BI.js} +2 -2
  157. package/dist/{chunk-EO5IEWFI.js → chunk-DE6A46AE.js} +6 -6
  158. package/dist/{chunk-JMEPGXJG.js → chunk-DHW5UMUG.js} +2 -2
  159. package/dist/{chunk-3EPA2A4M.js → chunk-DJIFXJ4C.js} +5 -5
  160. package/dist/{chunk-CM2Q7IH3.js → chunk-DTLKF4AX.js} +6 -6
  161. package/dist/{chunk-C6JUGWAU.js → chunk-DYCTIOER.js} +4 -4
  162. package/dist/{chunk-LCWGNDTH.js → chunk-EKBUM7HK.js} +4 -4
  163. package/dist/{chunk-NYT3UVOH.js → chunk-EOEYOPOS.js} +7 -7
  164. package/dist/{chunk-7LILFS72.js → chunk-EOKPFMJD.js} +2 -2
  165. package/dist/{chunk-ZSTSISM6.js → chunk-FHWXRHMA.js} +1 -1
  166. package/dist/{chunk-ZSTSISM6.js.map → chunk-FHWXRHMA.js.map} +1 -1
  167. package/dist/{chunk-4PRZLII7.js → chunk-FOM7OMJR.js} +5 -5
  168. package/dist/{chunk-QSNLIWEB.js → chunk-FTV5R2UZ.js} +2 -2
  169. package/dist/{chunk-NDHDBOUH.js → chunk-FWPFCK4D.js} +4 -4
  170. package/dist/{chunk-ON4TRXCM.js → chunk-GHJ2FIJO.js} +3 -3
  171. package/dist/{chunk-GANW7FXQ.js → chunk-GKNMKPR6.js} +2 -2
  172. package/dist/{chunk-LGCRL7DK.js → chunk-GP4BJI3F.js} +2 -2
  173. package/dist/{chunk-652PYSML.js → chunk-HDVEE4NQ.js} +14 -6
  174. package/dist/chunk-HDVEE4NQ.js.map +1 -0
  175. package/dist/{chunk-4MKVGSHX.js → chunk-HN3PZTUK.js} +5 -5
  176. package/dist/{chunk-HBP2OU4Q.js → chunk-HNFZLXZI.js} +5 -5
  177. package/dist/{chunk-5FHPZOYK.js → chunk-HOIHO2YQ.js} +2 -2
  178. package/dist/{chunk-3AOOI2NR.js → chunk-HR7YTBR7.js} +4 -4
  179. package/dist/{chunk-PGV2FLE3.js → chunk-IG26N6J2.js} +2 -2
  180. package/dist/{chunk-G2WERTWZ.js → chunk-IGGXKT5B.js} +2 -2
  181. package/dist/{chunk-XLXMJ6X2.js → chunk-IO2X6DVH.js} +3 -3
  182. package/dist/{chunk-3CLBGHTL.js → chunk-ITBUKGG3.js} +2 -2
  183. package/dist/{chunk-6IRJAIS4.js → chunk-IXWIJCS3.js} +2 -2
  184. package/dist/{chunk-TMW7RBW7.js → chunk-J6TIK47Z.js} +2 -2
  185. package/dist/{chunk-G4TKMUOL.js → chunk-JDEKR77O.js} +7 -7
  186. package/dist/{chunk-Y2C2S4R7.js → chunk-JHW62I7Z.js} +7 -5
  187. package/dist/chunk-JHW62I7Z.js.map +1 -0
  188. package/dist/{chunk-ITFFA3H2.js → chunk-JYLBVHG2.js} +3 -3
  189. package/dist/{chunk-G7XHJPLO.js → chunk-JZ7ZRZTF.js} +4 -4
  190. package/dist/{chunk-YTVXT5TD.js → chunk-K5CCQBNN.js} +6 -6
  191. package/dist/{chunk-AOFI3GDS.js → chunk-KMC6WP66.js} +5 -5
  192. package/dist/{chunk-K62RHTFB.js → chunk-KNAWZM7F.js} +2 -2
  193. package/dist/{chunk-4Z2HIHA5.js → chunk-KRA75CKC.js} +2 -2
  194. package/dist/{chunk-RHKT2XW2.js → chunk-KUKY5GEX.js} +3 -3
  195. package/dist/{chunk-HUAQQ5ZL.js → chunk-LHHV6NXO.js} +2 -2
  196. package/dist/{chunk-BJGUDLWZ.js → chunk-LRFXCZB4.js} +2 -2
  197. package/dist/{chunk-U6W2RY3Z.js → chunk-MLQYIJTO.js} +5 -5
  198. package/dist/{chunk-GPHURU2K.js → chunk-MSAAOQAD.js} +7 -7
  199. package/dist/{chunk-3MJHHPRW.js → chunk-MVR4GURP.js} +2 -2
  200. package/dist/{chunk-PRLYYKMG.js → chunk-MW7S7WZM.js} +2 -2
  201. package/dist/{chunk-ERY6D2OV.js → chunk-MWPXKZ7O.js} +4 -4
  202. package/dist/{chunk-ZUME25DS.js → chunk-NM2FLCPV.js} +3 -3
  203. package/dist/{chunk-UP7SSTCZ.js → chunk-OAVRXSAS.js} +7 -7
  204. package/dist/{chunk-VYA4QWQL.js → chunk-PJVZY2SA.js} +2 -2
  205. package/dist/{chunk-SDBBJ6FG.js → chunk-PUYJVQ7X.js} +2 -2
  206. package/dist/{chunk-IUD6N52Q.js → chunk-PXGURBIU.js} +4 -4
  207. package/dist/{chunk-PNDYAIKM.js → chunk-Q5J37WOE.js} +2 -2
  208. package/dist/{chunk-DCT2PKMQ.js → chunk-QGB3DOMV.js} +2 -2
  209. package/dist/{chunk-GT2RCOHM.js → chunk-QLAFJZDS.js} +31 -13
  210. package/dist/chunk-QLAFJZDS.js.map +1 -0
  211. package/dist/{chunk-YGYQC7MT.js → chunk-QOLIBVGS.js} +4 -4
  212. package/dist/{chunk-TDXEO2UI.js → chunk-RJ35IXFD.js} +2 -2
  213. package/dist/{chunk-P6Q2O3TU.js → chunk-RNVR3RGV.js} +2 -2
  214. package/dist/{chunk-SNW5MJ6I.js → chunk-RPKWTFJ2.js} +2 -2
  215. package/dist/{chunk-NPPJ3IJP.js → chunk-RRAWJQIO.js} +2 -2
  216. package/dist/{chunk-H3GYVR7S.js → chunk-SM4MT4YC.js} +3 -3
  217. package/dist/{chunk-5B7BTLN4.js → chunk-SOCZLOPJ.js} +2 -2
  218. package/dist/{chunk-RXNIOPOA.js → chunk-TM5QQJTF.js} +8 -2
  219. package/dist/{chunk-RXNIOPOA.js.map → chunk-TM5QQJTF.js.map} +1 -1
  220. package/dist/{chunk-Z4O3F6KU.js → chunk-U4QUDFPJ.js} +4 -4
  221. package/dist/{chunk-KWU62UPM.js → chunk-UHGQ74E3.js} +2 -2
  222. package/dist/{chunk-Z6LTEJ7F.js → chunk-VKFZQSQC.js} +4 -4
  223. package/dist/{chunk-MBNXCCRG.js → chunk-VQUPB7F7.js} +7 -7
  224. package/dist/{chunk-CNR5RFKC.js → chunk-VVFV4MXS.js} +2 -2
  225. package/dist/{chunk-ALOUJ3CE.js → chunk-WQ3KTELX.js} +5 -5
  226. package/dist/{chunk-FY6PONLA.js → chunk-WSYPM3SR.js} +2 -2
  227. package/dist/{chunk-QMELMQPA.js → chunk-X4VWYWFK.js} +2 -2
  228. package/dist/{chunk-5PJM772Y.js → chunk-XLQYOBHP.js} +4 -4
  229. package/dist/{chunk-TCMH3FXD.js → chunk-XTDJ2D5A.js} +2 -2
  230. package/dist/{chunk-F5GXWK6B.js → chunk-Y2CMWGIU.js} +3 -3
  231. package/dist/{chunk-SJGYMI6Y.js → chunk-Y4ET3NRC.js} +2 -2
  232. package/dist/{chunk-7OO3BELX.js → chunk-Y6RSQEOU.js} +3 -2
  233. package/dist/{chunk-7OO3BELX.js.map → chunk-Y6RSQEOU.js.map} +1 -1
  234. package/dist/{chunk-FIO55AKI.js → chunk-YCHOWWRE.js} +3 -3
  235. package/dist/{chunk-MM5XSAVE.js → chunk-YDIRPKYI.js} +2 -2
  236. package/dist/{chunk-44Z72DDM.js → chunk-YF3VD2KD.js} +2 -2
  237. package/dist/{chunk-BR2T72JI.js → chunk-YWJZPN5C.js} +11 -1
  238. package/dist/chunk-YWJZPN5C.js.map +1 -0
  239. package/dist/{chunk-Z4DKVLYG.js → chunk-Z3HSRNJT.js} +4 -4
  240. package/dist/{chunk-5PTCT3LF.js → chunk-ZQ7IESR7.js} +2 -2
  241. package/dist/data-display/AsyncStateContainer.js +3 -3
  242. package/dist/data-display/Badge.js +6 -5
  243. package/dist/data-display/CardKit.js +10 -10
  244. package/dist/data-display/Carousel.js +8 -7
  245. package/dist/data-display/Chart.js +8 -7
  246. package/dist/data-display/DataGrid.js +4 -3
  247. package/dist/data-display/DataViews.js +54 -53
  248. package/dist/data-display/EmptyState.js +2 -2
  249. package/dist/data-display/FleetMap.js +13 -12
  250. package/dist/data-display/InteractiveTooltip.js +2 -2
  251. package/dist/data-display/Lightbox.js +2 -2
  252. package/dist/data-display/MapPreview.js +3 -3
  253. package/dist/data-display/SectionOnboarding.js +3 -3
  254. package/dist/data-display/Sheet.js +5 -4
  255. package/dist/data-display/Table.js +4 -3
  256. package/dist/feedback/ConfirmAction.js +6 -6
  257. package/dist/feedback/Dialog.js +2 -2
  258. package/dist/feedback/StackedModal.js +6 -6
  259. package/dist/form/AddressAutocomplete.js +1 -1
  260. package/dist/form/Autocomplete.js +3 -3
  261. package/dist/form/CategorySelect.js +6 -6
  262. package/dist/form/Checkbox.js +2 -2
  263. package/dist/form/Command.js +5 -4
  264. package/dist/form/DateRangePicker.js +2 -2
  265. package/dist/form/Label.js +5 -4
  266. package/dist/form/Menubar.js +7 -6
  267. package/dist/form/UploadButton.js +2 -2
  268. package/dist/form/total-form.js +9 -9
  269. package/dist/icons.js +6 -5
  270. package/dist/layout/Box.js +6 -5
  271. package/dist/layout/ContentToolbar.js +3 -3
  272. package/dist/layout/ScrollArea.js +2 -2
  273. package/dist/layout/SettingCard.js +15 -14
  274. package/dist/layout/SettingsLayout.js +4 -4
  275. package/dist/layout/Stack.js +7 -6
  276. package/dist/navigation/AppHeader.js +9 -8
  277. package/dist/navigation/CommandPalette.js +2 -2
  278. package/dist/navigation/NavigationMenu.js +5 -5
  279. package/dist/provider.js +6 -5
  280. package/dist/tokens.js +8 -2
  281. package/dist/types/components/form/Autocomplete/useAutocomplete.d.ts.map +1 -1
  282. package/dist/types/components/layout/SettingsLayout/SettingsSectionChips.scroll.d.ts.map +1 -1
  283. package/dist/types/components/utility/WorkflowStep/WorkflowStep.d.ts.map +1 -1
  284. package/dist/types/components/utility/WorkflowStep/WorkflowStep.helpers.d.ts +15 -0
  285. package/dist/types/components/utility/WorkflowStep/WorkflowStep.helpers.d.ts.map +1 -1
  286. package/dist/types/components/utility/WorkflowStep/WorkflowStep.parts.d.ts +7 -1
  287. package/dist/types/components/utility/WorkflowStep/WorkflowStep.parts.d.ts.map +1 -1
  288. package/dist/types/components/utility/WorkflowStep/WorkflowStep.types.d.ts +10 -0
  289. package/dist/types/components/utility/WorkflowStep/WorkflowStep.types.d.ts.map +1 -1
  290. package/dist/types/components/utility/WorkflowStep/WorkflowStepRow.d.ts.map +1 -1
  291. package/dist/types/provider/mui-bridge.d.ts.map +1 -1
  292. package/dist/types/tokens/density-overrides.d.ts +6 -0
  293. package/dist/types/tokens/density-overrides.d.ts.map +1 -0
  294. package/dist/types/tokens/density.d.ts +9 -6
  295. package/dist/types/tokens/density.d.ts.map +1 -1
  296. package/dist/types/tokens/scales.d.ts +1 -0
  297. package/dist/types/tokens/scales.d.ts.map +1 -1
  298. package/dist/utility/InfiniteScroll.js +2 -2
  299. package/dist/utility/WorkflowStep.js +7 -6
  300. package/package.json +1 -1
  301. package/src/components/form/Autocomplete/useAutocomplete.ts +17 -0
  302. package/src/components/layout/SettingsLayout/SettingsSectionChips.scroll.ts +52 -16
  303. package/src/components/utility/WorkflowStep/WorkflowStep.helpers.ts +25 -0
  304. package/src/components/utility/WorkflowStep/WorkflowStep.parts.tsx +46 -49
  305. package/src/components/utility/WorkflowStep/WorkflowStep.tsx +5 -3
  306. package/src/components/utility/WorkflowStep/WorkflowStep.types.ts +10 -0
  307. package/src/components/utility/WorkflowStep/WorkflowStepRow.tsx +1 -0
  308. package/src/provider/mui-bridge.ts +9 -4
  309. package/src/tokens/density-overrides.ts +177 -0
  310. package/src/tokens/density.ts +15 -7
  311. package/src/tokens/scales.ts +4 -0
  312. package/dist/chunk-652PYSML.js.map +0 -1
  313. package/dist/chunk-BR2T72JI.js.map +0 -1
  314. package/dist/chunk-DJKVSUXH.js.map +0 -1
  315. package/dist/chunk-GT2RCOHM.js.map +0 -1
  316. package/dist/chunk-KJID4PRD.js.map +0 -1
  317. package/dist/chunk-Y2C2S4R7.js.map +0 -1
  318. /package/dist/{chunk-442FSG7G.js.map → chunk-3I77A65F.js.map} +0 -0
  319. /package/dist/{chunk-R2FUQV24.js.map → chunk-4MGUBSAL.js.map} +0 -0
  320. /package/dist/{chunk-YIWVHEPW.js.map → chunk-4T5LD2NV.js.map} +0 -0
  321. /package/dist/{chunk-4CHYMTBT.js.map → chunk-4WCDMCIS.js.map} +0 -0
  322. /package/dist/{chunk-5KGABAQB.js.map → chunk-5752357K.js.map} +0 -0
  323. /package/dist/{chunk-JSGVYOMN.js.map → chunk-5MW7OYBM.js.map} +0 -0
  324. /package/dist/{chunk-RWRPF24F.js.map → chunk-5OS5AMC2.js.map} +0 -0
  325. /package/dist/{chunk-I6MVJWUO.js.map → chunk-6B3QXFF5.js.map} +0 -0
  326. /package/dist/{chunk-MLUUF7OZ.js.map → chunk-6B4UTB4O.js.map} +0 -0
  327. /package/dist/{chunk-FBUCXTA4.js.map → chunk-6DMUVVON.js.map} +0 -0
  328. /package/dist/{chunk-G7RYAWPZ.js.map → chunk-6HTCCWUM.js.map} +0 -0
  329. /package/dist/{chunk-77BKKPCI.js.map → chunk-6KLDYVRY.js.map} +0 -0
  330. /package/dist/{chunk-6Z6PUG4C.js.map → chunk-6LYRFS5S.js.map} +0 -0
  331. /package/dist/{chunk-K4A3JDYQ.js.map → chunk-6ZWOVUNB.js.map} +0 -0
  332. /package/dist/{chunk-3RUCLKAK.js.map → chunk-7HZTYK7U.js.map} +0 -0
  333. /package/dist/{chunk-BKZERHNC.js.map → chunk-7XDET7PL.js.map} +0 -0
  334. /package/dist/{chunk-OD3L6GX5.js.map → chunk-A7OQBAR7.js.map} +0 -0
  335. /package/dist/{chunk-2MLS6KU4.js.map → chunk-AEKHSORY.js.map} +0 -0
  336. /package/dist/{chunk-5DAVXZPY.js.map → chunk-B2WBDMHE.js.map} +0 -0
  337. /package/dist/{chunk-GZT7MLLO.js.map → chunk-B2ZITMYG.js.map} +0 -0
  338. /package/dist/{chunk-54HTXJJ2.js.map → chunk-BHE44AQE.js.map} +0 -0
  339. /package/dist/{chunk-TBMGYQJF.js.map → chunk-BKBELIUR.js.map} +0 -0
  340. /package/dist/{chunk-OOB3YWPX.js.map → chunk-BZFRBG2H.js.map} +0 -0
  341. /package/dist/{chunk-PICOOZLX.js.map → chunk-C5RTSOXD.js.map} +0 -0
  342. /package/dist/{chunk-GO6XDMBB.js.map → chunk-CEJTGG6J.js.map} +0 -0
  343. /package/dist/{chunk-ZGWEFOW6.js.map → chunk-CKAVTWXP.js.map} +0 -0
  344. /package/dist/{chunk-ANYOSBNA.js.map → chunk-CSXK7LH7.js.map} +0 -0
  345. /package/dist/{chunk-U6DOF5CR.js.map → chunk-CU7ELD43.js.map} +0 -0
  346. /package/dist/{chunk-XO4ZUHVH.js.map → chunk-CYPBF3BI.js.map} +0 -0
  347. /package/dist/{chunk-EO5IEWFI.js.map → chunk-DE6A46AE.js.map} +0 -0
  348. /package/dist/{chunk-JMEPGXJG.js.map → chunk-DHW5UMUG.js.map} +0 -0
  349. /package/dist/{chunk-3EPA2A4M.js.map → chunk-DJIFXJ4C.js.map} +0 -0
  350. /package/dist/{chunk-CM2Q7IH3.js.map → chunk-DTLKF4AX.js.map} +0 -0
  351. /package/dist/{chunk-C6JUGWAU.js.map → chunk-DYCTIOER.js.map} +0 -0
  352. /package/dist/{chunk-LCWGNDTH.js.map → chunk-EKBUM7HK.js.map} +0 -0
  353. /package/dist/{chunk-NYT3UVOH.js.map → chunk-EOEYOPOS.js.map} +0 -0
  354. /package/dist/{chunk-7LILFS72.js.map → chunk-EOKPFMJD.js.map} +0 -0
  355. /package/dist/{chunk-4PRZLII7.js.map → chunk-FOM7OMJR.js.map} +0 -0
  356. /package/dist/{chunk-QSNLIWEB.js.map → chunk-FTV5R2UZ.js.map} +0 -0
  357. /package/dist/{chunk-NDHDBOUH.js.map → chunk-FWPFCK4D.js.map} +0 -0
  358. /package/dist/{chunk-ON4TRXCM.js.map → chunk-GHJ2FIJO.js.map} +0 -0
  359. /package/dist/{chunk-GANW7FXQ.js.map → chunk-GKNMKPR6.js.map} +0 -0
  360. /package/dist/{chunk-LGCRL7DK.js.map → chunk-GP4BJI3F.js.map} +0 -0
  361. /package/dist/{chunk-4MKVGSHX.js.map → chunk-HN3PZTUK.js.map} +0 -0
  362. /package/dist/{chunk-HBP2OU4Q.js.map → chunk-HNFZLXZI.js.map} +0 -0
  363. /package/dist/{chunk-5FHPZOYK.js.map → chunk-HOIHO2YQ.js.map} +0 -0
  364. /package/dist/{chunk-3AOOI2NR.js.map → chunk-HR7YTBR7.js.map} +0 -0
  365. /package/dist/{chunk-PGV2FLE3.js.map → chunk-IG26N6J2.js.map} +0 -0
  366. /package/dist/{chunk-G2WERTWZ.js.map → chunk-IGGXKT5B.js.map} +0 -0
  367. /package/dist/{chunk-XLXMJ6X2.js.map → chunk-IO2X6DVH.js.map} +0 -0
  368. /package/dist/{chunk-3CLBGHTL.js.map → chunk-ITBUKGG3.js.map} +0 -0
  369. /package/dist/{chunk-6IRJAIS4.js.map → chunk-IXWIJCS3.js.map} +0 -0
  370. /package/dist/{chunk-TMW7RBW7.js.map → chunk-J6TIK47Z.js.map} +0 -0
  371. /package/dist/{chunk-G4TKMUOL.js.map → chunk-JDEKR77O.js.map} +0 -0
  372. /package/dist/{chunk-ITFFA3H2.js.map → chunk-JYLBVHG2.js.map} +0 -0
  373. /package/dist/{chunk-G7XHJPLO.js.map → chunk-JZ7ZRZTF.js.map} +0 -0
  374. /package/dist/{chunk-YTVXT5TD.js.map → chunk-K5CCQBNN.js.map} +0 -0
  375. /package/dist/{chunk-AOFI3GDS.js.map → chunk-KMC6WP66.js.map} +0 -0
  376. /package/dist/{chunk-K62RHTFB.js.map → chunk-KNAWZM7F.js.map} +0 -0
  377. /package/dist/{chunk-4Z2HIHA5.js.map → chunk-KRA75CKC.js.map} +0 -0
  378. /package/dist/{chunk-RHKT2XW2.js.map → chunk-KUKY5GEX.js.map} +0 -0
  379. /package/dist/{chunk-HUAQQ5ZL.js.map → chunk-LHHV6NXO.js.map} +0 -0
  380. /package/dist/{chunk-BJGUDLWZ.js.map → chunk-LRFXCZB4.js.map} +0 -0
  381. /package/dist/{chunk-U6W2RY3Z.js.map → chunk-MLQYIJTO.js.map} +0 -0
  382. /package/dist/{chunk-GPHURU2K.js.map → chunk-MSAAOQAD.js.map} +0 -0
  383. /package/dist/{chunk-3MJHHPRW.js.map → chunk-MVR4GURP.js.map} +0 -0
  384. /package/dist/{chunk-PRLYYKMG.js.map → chunk-MW7S7WZM.js.map} +0 -0
  385. /package/dist/{chunk-ERY6D2OV.js.map → chunk-MWPXKZ7O.js.map} +0 -0
  386. /package/dist/{chunk-ZUME25DS.js.map → chunk-NM2FLCPV.js.map} +0 -0
  387. /package/dist/{chunk-UP7SSTCZ.js.map → chunk-OAVRXSAS.js.map} +0 -0
  388. /package/dist/{chunk-VYA4QWQL.js.map → chunk-PJVZY2SA.js.map} +0 -0
  389. /package/dist/{chunk-SDBBJ6FG.js.map → chunk-PUYJVQ7X.js.map} +0 -0
  390. /package/dist/{chunk-IUD6N52Q.js.map → chunk-PXGURBIU.js.map} +0 -0
  391. /package/dist/{chunk-PNDYAIKM.js.map → chunk-Q5J37WOE.js.map} +0 -0
  392. /package/dist/{chunk-DCT2PKMQ.js.map → chunk-QGB3DOMV.js.map} +0 -0
  393. /package/dist/{chunk-YGYQC7MT.js.map → chunk-QOLIBVGS.js.map} +0 -0
  394. /package/dist/{chunk-TDXEO2UI.js.map → chunk-RJ35IXFD.js.map} +0 -0
  395. /package/dist/{chunk-P6Q2O3TU.js.map → chunk-RNVR3RGV.js.map} +0 -0
  396. /package/dist/{chunk-SNW5MJ6I.js.map → chunk-RPKWTFJ2.js.map} +0 -0
  397. /package/dist/{chunk-NPPJ3IJP.js.map → chunk-RRAWJQIO.js.map} +0 -0
  398. /package/dist/{chunk-H3GYVR7S.js.map → chunk-SM4MT4YC.js.map} +0 -0
  399. /package/dist/{chunk-5B7BTLN4.js.map → chunk-SOCZLOPJ.js.map} +0 -0
  400. /package/dist/{chunk-Z4O3F6KU.js.map → chunk-U4QUDFPJ.js.map} +0 -0
  401. /package/dist/{chunk-KWU62UPM.js.map → chunk-UHGQ74E3.js.map} +0 -0
  402. /package/dist/{chunk-Z6LTEJ7F.js.map → chunk-VKFZQSQC.js.map} +0 -0
  403. /package/dist/{chunk-MBNXCCRG.js.map → chunk-VQUPB7F7.js.map} +0 -0
  404. /package/dist/{chunk-CNR5RFKC.js.map → chunk-VVFV4MXS.js.map} +0 -0
  405. /package/dist/{chunk-ALOUJ3CE.js.map → chunk-WQ3KTELX.js.map} +0 -0
  406. /package/dist/{chunk-FY6PONLA.js.map → chunk-WSYPM3SR.js.map} +0 -0
  407. /package/dist/{chunk-QMELMQPA.js.map → chunk-X4VWYWFK.js.map} +0 -0
  408. /package/dist/{chunk-5PJM772Y.js.map → chunk-XLQYOBHP.js.map} +0 -0
  409. /package/dist/{chunk-TCMH3FXD.js.map → chunk-XTDJ2D5A.js.map} +0 -0
  410. /package/dist/{chunk-F5GXWK6B.js.map → chunk-Y2CMWGIU.js.map} +0 -0
  411. /package/dist/{chunk-SJGYMI6Y.js.map → chunk-Y4ET3NRC.js.map} +0 -0
  412. /package/dist/{chunk-FIO55AKI.js.map → chunk-YCHOWWRE.js.map} +0 -0
  413. /package/dist/{chunk-MM5XSAVE.js.map → chunk-YDIRPKYI.js.map} +0 -0
  414. /package/dist/{chunk-44Z72DDM.js.map → chunk-YF3VD2KD.js.map} +0 -0
  415. /package/dist/{chunk-Z4DKVLYG.js.map → chunk-Z3HSRNJT.js.map} +0 -0
  416. /package/dist/{chunk-5PTCT3LF.js.map → chunk-ZQ7IESR7.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import "../chunk-H7NA4TXY.js";
2
2
  import {
3
3
  InfiniteScroll
4
- } from "../chunk-HBP2OU4Q.js";
5
- import "../chunk-5KNDAC24.js";
4
+ } from "../chunk-HNFZLXZI.js";
6
5
  import "../chunk-Y2X7LYIN.js";
6
+ import "../chunk-5KNDAC24.js";
7
7
  import "../chunk-YKCAJ2TN.js";
8
8
  import "../chunk-PZ5AY32C.js";
9
9
  export {
@@ -1,13 +1,14 @@
1
1
  import "../chunk-IO36MEBD.js";
2
2
  import {
3
3
  WorkflowStep
4
- } from "../chunk-Y2C2S4R7.js";
5
- import "../chunk-7OO3BELX.js";
6
- import "../chunk-KJID4PRD.js";
7
- import "../chunk-RXNIOPOA.js";
8
- import "../chunk-ZSTSISM6.js";
4
+ } from "../chunk-JHW62I7Z.js";
5
+ import "../chunk-Y6RSQEOU.js";
6
+ import "../chunk-6S25ZCEW.js";
7
+ import "../chunk-TM5QQJTF.js";
8
+ import "../chunk-FHWXRHMA.js";
9
9
  import "../chunk-7ZPUN7TV.js";
10
- import "../chunk-DJKVSUXH.js";
10
+ import "../chunk-2GG5W6LR.js";
11
+ import "../chunk-532XOWZ5.js";
11
12
  import "../chunk-PT6TCWIW.js";
12
13
  import "../chunk-M47ZOUGF.js";
13
14
  import "../chunk-7FDU3FIN.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.43.0",
3
+ "version": "6.44.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -245,6 +245,14 @@ function runSelectItem<T>(item: T, p: AutocompleteProps<T>, s: AutocompleteState
245
245
  // commitMultiSelect already clears inputValue and resets the flag itself,
246
246
  // so the empty-input branch of the filter effect keeps the list closed.
247
247
  const isSingleSelectPick = isLink || !p.multiple;
248
+ // Cancel a still-pending keystroke debounce BEFORE dispatching the pick, so
249
+ // no branch below — including `openLink`, which never touches `onChange`
250
+ // at all — can leave it armed to fire the STALE pre-pick text later
251
+ // (FUT-2779 #1). `commitSingleSelect`/`commitMultiSelect` already clear it
252
+ // as a side effect of calling the same `debouncedOnChange`; this makes it
253
+ // unconditional so a `link` pick (which skips `onChange` entirely) is
254
+ // covered too.
255
+ if (s.debounceRef.current) window.clearTimeout(s.debounceRef.current);
248
256
  commitPick(item, isLink ? (url as string) : null, p, s, onChange);
249
257
  s.setOpen(false);
250
258
  s.setActiveIndex(-1);
@@ -347,6 +355,15 @@ export function useAutocomplete<T>(p: AutocompleteProps<T>): AutocompleteView<T>
347
355
  if (!s.open || s.filteredSuggestions.length === 0) s.setActiveIndex(-1);
348
356
  setDeliberateClose(s, false);
349
357
  },
358
+ // Unconditionally reopens on a non-empty input, unguarded by
359
+ // `userClosedDropdownRef` — plausible on a touch device that blurs the
360
+ // input on `touchstart` before a tap's own `click`/`mousedown` reaches the
361
+ // option (FUT-2779 #2). Checked under Playwright touch emulation
362
+ // (`hasTouch`/`isMobile` context, both the `.tap()` API and raw CDP
363
+ // `Input.dispatchTouchEvent` at the option's coordinates) against this
364
+ // Chromium build: `document.activeElement` never left the input across
365
+ // the touch, so the reopen never happened — not reproduced, left
366
+ // unguarded per the ticket's decision rather than fixed blind.
350
367
  onFocus: (): void => {
351
368
  s.setIsInputFocused(true);
352
369
  setDeliberateClose(s, false);
@@ -39,6 +39,13 @@ const SCROLL_DELTA_EPSILON = 2;
39
39
  */
40
40
  const POINTER_MOVE_EPSILON = 2;
41
41
 
42
+ /**
43
+ * How long a key, sideways wheel or pan stays armed through a scroll the strip
44
+ * made itself (FUT-2848): a busy thread can finish a re-centre before the key's
45
+ * scroll ticks once. Past this it lapses, so a later clamp is not the visitor.
46
+ */
47
+ const NUDGE_FRESH_MS = 1000;
48
+
42
49
  interface VisitorScrollWatch {
43
50
  /** True once the visitor has moved the strip themselves. */
44
51
  hasScrolled: () => boolean;
@@ -79,6 +86,9 @@ interface WatchState {
79
86
  pointer: boolean;
80
87
  touch: boolean;
81
88
  nudged: boolean;
89
+ /** When `nudged` was set (`Date.now()` ms), and whether it outlived an own verdict. */
90
+ nudgedAt: number;
91
+ nudgeKept: boolean;
82
92
  undecided: boolean;
83
93
  scrolled: boolean;
84
94
  aimed: number;
@@ -177,6 +187,11 @@ export function toRawScrollLeft(strip: HTMLElement, physical: number): number {
177
187
  return physical;
178
188
  }
179
189
 
190
+ /** Whether the gesture that armed `nudged` happened within {@link NUDGE_FRESH_MS}. */
191
+ function nudgeIsFresh(state: WatchState): boolean {
192
+ return Date.now() - state.nudgedAt <= NUDGE_FRESH_MS;
193
+ }
194
+
180
195
  /** Whether the strip came to rest where it last aimed itself — clamped as the browser would. */
181
196
  function restsOnAim(strip: HTMLElement, aimed: number): boolean {
182
197
  const reachable = Math.min(aimed, strip.scrollWidth - strip.clientWidth);
@@ -222,15 +237,18 @@ function createGestureListeners(state: WatchState): { onStrip: Listeners; onView
222
237
  state.touch = false;
223
238
  state.touchDownAt = Number.NaN;
224
239
  };
225
- const onPointerCancel = (): void => {
240
+ const nudge = (): void => {
226
241
  state.nudged = true;
227
- onPointerUp();
242
+ state.nudgedAt = Date.now();
243
+ state.nudgeKept = false;
228
244
  };
229
- const onKeydown = (): void => {
230
- state.nudged = true;
245
+ const onPointerCancel = (): void => {
246
+ nudge();
247
+ onPointerUp();
231
248
  };
249
+ const onKeydown = nudge;
232
250
  const onWheel = (event: Event): void => {
233
- if (horizontalDelta(event) !== 0) state.nudged = true;
251
+ if (horizontalDelta(event) !== 0) nudge();
234
252
  };
235
253
  return {
236
254
  onStrip: [
@@ -252,6 +270,31 @@ function createGestureListeners(state: WatchState): { onStrip: Listeners; onView
252
270
  };
253
271
  }
254
272
 
273
+ /**
274
+ * Judge the scroll under judgement once the strip rests. Only a scroll UNDER
275
+ * JUDGEMENT disarms: Chromium can fire `scrollend` for the strip's own scroll
276
+ * cut off by another BEFORE that one's first `scroll`, and disarming there
277
+ * would hand the visitor's scroll to nobody.
278
+ */
279
+ function settleJudgement(strip: HTMLElement, state: WatchState): void {
280
+ if (!state.undecided) return;
281
+ state.undecided = false;
282
+ const own = restsOnAim(strip, state.aimed);
283
+ if (!own) state.scrolled = true;
284
+ // The strip's own scroll does not use up a gesture armed moments ago: the
285
+ // scroll that gesture causes may still be on its way (FUT-2848).
286
+ state.nudgeKept = own && nudgeIsFresh(state);
287
+ if (!state.nudgeKept) state.nudged = false;
288
+ state.settled();
289
+ }
290
+
291
+ /** A gesture kept through the strip's own scroll lapses once stale (FUT-2848). */
292
+ function dropStaleNudge(state: WatchState): void {
293
+ if (!state.nudgeKept || nudgeIsFresh(state)) return;
294
+ state.nudged = false;
295
+ state.nudgeKept = false;
296
+ }
297
+
255
298
  /**
256
299
  * Tell a scroll the VISITOR made from every other one.
257
300
  *
@@ -291,6 +334,8 @@ export function watchVisitorScroll(strip: HTMLElement): VisitorScrollWatch {
291
334
  pointer: false,
292
335
  touch: false,
293
336
  nudged: false,
337
+ nudgedAt: Number.NaN,
338
+ nudgeKept: false,
294
339
  undecided: false,
295
340
  scrolled: false,
296
341
  aimed: Number.NaN,
@@ -302,17 +347,7 @@ export function watchVisitorScroll(strip: HTMLElement): VisitorScrollWatch {
302
347
  touchDownAt: Number.NaN,
303
348
  touchMoved: false,
304
349
  };
305
- const settle = (): void => {
306
- // Only a scroll that was UNDER JUDGEMENT disarms. Chromium can end the
307
- // strip's own smooth scroll with a `scrollend` when another scroll cuts it
308
- // off, fired BEFORE that scroll's first `scroll` (seen with an instant one);
309
- // disarming there would hand the visitor's scroll to nobody.
310
- if (!state.undecided) return;
311
- state.undecided = false;
312
- state.nudged = false;
313
- if (!restsOnAim(strip, state.aimed)) state.scrolled = true;
314
- state.settled();
315
- };
350
+ const settle = (): void => settleJudgement(strip, state);
316
351
  const onScroll = (): void => {
317
352
  const now = physicalScrollLeft(strip);
318
353
  const movedFarEnough = Math.abs(now - state.lastScrollLeft) > SCROLL_DELTA_EPSILON;
@@ -324,6 +359,7 @@ export function watchVisitorScroll(strip: HTMLElement): VisitorScrollWatch {
324
359
  // arm under a delta-only check (`pointerMoved`/`touchMoved` rules that out);
325
360
  // a pointer that drifts a sub-epsilon amount while resting would arm under
326
361
  // a moved-only check with no delta floor (`movedFarEnough` rules that out).
362
+ dropStaleNudge(state);
327
363
  const pointerDrag = state.pointer && state.pointerMoved && movedFarEnough;
328
364
  const touchDrag = state.touch && state.touchMoved && movedFarEnough;
329
365
  // `nudged` (a keypress, a sideways wheel, the browser taking the pointer
@@ -172,3 +172,28 @@ export const progressValueText = (
172
172
  const step = steps[currentStep];
173
173
  return step === undefined ? position : `${position}: ${step.title}`;
174
174
  };
175
+
176
+ export interface ProgressValueRange {
177
+ max?: number;
178
+ now?: number;
179
+ }
180
+
181
+ /**
182
+ * The progressbar's `aria-valuemax`/`aria-valuenow` pair (FUT-2773). With no
183
+ * steps at all there is no meaningful range to report — a `role="progressbar"`
184
+ * with zero steps has nothing to measure, and WAI-ARIA's own value attributes
185
+ * are optional for exactly this case (an indeterminate progressbar omits
186
+ * `aria-valuenow`) — so both are left out rather than asserting the invalid
187
+ * range `aria-valuemax={-1}` with `aria-valuenow={0}`. Otherwise `currentStep`
188
+ * is clamped to `[0, steps.length - 1]` so the reported value never falls
189
+ * outside `[aria-valuemin, aria-valuemax]`, however far `currentStep` strays.
190
+ */
191
+ export const progressValueRange = (
192
+ steps: readonly WorkflowStepItem[],
193
+ currentStep: number,
194
+ ): ProgressValueRange => {
195
+ if (steps.length === 0) return {};
196
+
197
+ const max = steps.length - 1;
198
+ return { max, now: Math.min(Math.max(currentStep, 0), max) };
199
+ };
@@ -123,14 +123,17 @@ const StepContent = styled(Box, {
123
123
  orientation: WorkflowStepProps['orientation'];
124
124
  interactive: boolean;
125
125
  disabled: boolean;
126
- }>(({ theme, orientation, interactive, disabled }) => ({
126
+ }>(({ theme, orientation, disabled }) => ({
127
127
  display: 'flex',
128
128
  flexDirection: 'column',
129
129
  alignItems: orientation === 'vertical' ? 'flex-start' : 'center',
130
130
  textAlign: orientation === 'vertical' ? 'left' : 'center',
131
131
  marginTop: orientation === 'vertical' ? theme.spacing(1) : theme.spacing(0.5),
132
132
  marginLeft: orientation === 'horizontal' ? theme.spacing(1) : 0,
133
- cursor: interactive && !disabled ? 'pointer' : 'default',
133
+ // Inert (FUT-2773): the content block has no click handling of its own —
134
+ // the indicator is the step's one interactive element — so its cursor
135
+ // never claims to be clickable, whatever `interactive` says.
136
+ cursor: 'default',
134
137
  minWidth: 0,
135
138
  flex: 1,
136
139
 
@@ -160,26 +163,27 @@ const StepContent = styled(Box, {
160
163
  }));
161
164
 
162
165
  const StepConnector = styled(Box, {
163
- shouldForwardProp: (prop) => !['orientation', 'isCompleted', 'color', 'variant'].includes(prop as string),
166
+ shouldForwardProp: (prop) => !['orientation', 'isCompleted', 'color', 'variant', 'animated'].includes(prop as string),
164
167
  })<{
165
168
  orientation: WorkflowStepProps['orientation'];
166
169
  isCompleted: boolean;
167
170
  color: WorkflowStepProps['color'];
168
171
  variant: WorkflowStepProps['variant'];
169
- }>(({ theme, orientation, isCompleted, color, variant }) => {
172
+ animated: boolean;
173
+ }>(({ theme, orientation, isCompleted, color, variant, animated }) => {
170
174
  const connectorColor = isCompleted ? stepPalette(theme, color).main : neutralTones(theme).track;
171
175
 
172
176
  return {
173
177
  flex: 1,
174
178
  position: 'relative',
175
-
179
+
176
180
  ...(orientation === 'horizontal' && {
177
181
  height: rem(theme, 2),
178
182
  backgroundColor: connectorColor,
179
183
  margin: `0 ${theme.spacing(1)}`,
180
184
  minWidth: theme.spacing(2),
181
185
  }),
182
-
186
+
183
187
  ...(orientation === 'vertical' && {
184
188
  width: rem(theme, 2),
185
189
  backgroundColor: connectorColor,
@@ -191,9 +195,11 @@ const StepConnector = styled(Box, {
191
195
  top: '100%',
192
196
  }),
193
197
 
194
- transition: theme.transitions.create('background-color', {
195
- duration: theme.transitions.duration.short,
196
- }),
198
+ transition: animated
199
+ ? theme.transitions.create('background-color', {
200
+ duration: theme.transitions.duration.short,
201
+ })
202
+ : 'none',
197
203
 
198
204
  ...(variant === 'minimal' && {
199
205
  opacity: 0.6,
@@ -223,6 +229,8 @@ const StepIndicatorComponent = forwardRef<HTMLDivElement, StepIndicatorProps>(({
223
229
  onClick,
224
230
  'data-testid': dataTestId,
225
231
  }, ref) => {
232
+ const isDisabled = Boolean(disabled || step.disabled);
233
+
226
234
  const handleClick = useCallback(() => {
227
235
  if (interactive && !disabled && onClick) {
228
236
  onClick(index, step);
@@ -265,13 +273,14 @@ const StepIndicatorComponent = forwardRef<HTMLDivElement, StepIndicatorProps>(({
265
273
  isError={isError}
266
274
  interactive={interactive}
267
275
  animated={animated}
268
- disabled={Boolean(disabled || step.disabled)}
276
+ disabled={isDisabled}
269
277
  onClick={handleClick}
270
278
  onKeyDown={handleKeyDown}
271
279
  role={interactive ? 'button' : undefined}
272
- tabIndex={interactive && !disabled && !step.disabled ? 0 : -1}
280
+ tabIndex={!interactive ? undefined : isDisabled ? -1 : 0}
273
281
  aria-label={`Step ${index + 1}: ${step.title}`}
274
282
  aria-current={isActive ? 'step' : undefined}
283
+ aria-disabled={interactive && isDisabled ? true : undefined}
275
284
  data-testid={dataTestId}
276
285
  >
277
286
  {renderIndicatorContent()}
@@ -289,6 +298,10 @@ const StepConnectorComponent = forwardRef<HTMLDivElement, StepConnectorProps>(({
289
298
  orientation,
290
299
  variant,
291
300
  color,
301
+ // Defaults to the connector's own prior, unconditional behaviour (FUT-2773):
302
+ // an external caller building a `StepConnectorProps` value that predates
303
+ // this field keeps the transition it always had.
304
+ animated = true,
292
305
  'data-testid': dataTestId,
293
306
  }, ref) => (
294
307
  <StepConnector
@@ -297,6 +310,7 @@ const StepConnectorComponent = forwardRef<HTMLDivElement, StepConnectorProps>(({
297
310
  isCompleted={isCompleted}
298
311
  color={color}
299
312
  variant={variant}
313
+ animated={animated}
300
314
  data-testid={dataTestId}
301
315
  />
302
316
  ));
@@ -304,51 +318,34 @@ const StepConnectorComponent = forwardRef<HTMLDivElement, StepConnectorProps>(({
304
318
  StepConnectorComponent.displayName = 'StepConnector';
305
319
 
306
320
  /**
307
- * Step content component
321
+ * Step content component.
322
+ *
323
+ * Inert on purpose (FUT-2773): the indicator is the step's one focusable
324
+ * `role="button"` element — it already carries `aria-label="Step N: <title>"`
325
+ * — so the title/description block gets no `role`, `tabIndex`, click or key
326
+ * handling of its own. Two independently-interactive elements per step gave
327
+ * assistive tech two tab stops for what a caller means as a single control.
308
328
  */
309
329
  const StepContentComponent = forwardRef<HTMLDivElement, StepContentProps>(({
310
330
  step,
311
- index,
312
331
  orientation,
313
332
  interactive,
314
333
  disabled,
315
- onClick,
316
334
  'data-testid': dataTestId,
317
- }, ref) => {
318
- const handleClick = useCallback(() => {
319
- if (interactive && !disabled && onClick) {
320
- onClick(index, step);
321
- }
322
- }, [interactive, disabled, onClick, index, step]);
323
-
324
- const handleKeyDown = useCallback((event: React.KeyboardEvent) => {
325
- if (interactive && !disabled && (event.key === 'Enter' || event.key === ' ')) {
326
- event.preventDefault();
327
- if (onClick) {
328
- onClick(index, step);
329
- }
330
- }
331
- }, [interactive, disabled, onClick, index, step]);
332
-
333
- return (
334
- <StepContent
335
- ref={ref}
336
- orientation={orientation}
337
- interactive={interactive}
338
- disabled={Boolean(disabled || step.disabled)}
339
- onClick={handleClick}
340
- onKeyDown={handleKeyDown}
341
- role={interactive ? 'button' : undefined}
342
- tabIndex={interactive && !disabled && !step.disabled ? 0 : -1}
343
- data-testid={dataTestId}
344
- >
345
- <div className="step-title">{step.title}</div>
346
- {step.description && (
347
- <div className="step-description">{step.description}</div>
348
- )}
349
- </StepContent>
350
- );
351
- });
335
+ }, ref) => (
336
+ <StepContent
337
+ ref={ref}
338
+ orientation={orientation}
339
+ interactive={interactive}
340
+ disabled={Boolean(disabled || step.disabled)}
341
+ data-testid={dataTestId}
342
+ >
343
+ <div className="step-title">{step.title}</div>
344
+ {step.description && (
345
+ <div className="step-description">{step.description}</div>
346
+ )}
347
+ </StepContent>
348
+ ));
352
349
 
353
350
  StepContentComponent.displayName = 'StepContent';
354
351
 
@@ -2,7 +2,7 @@ import Box from '@mui/material/Box/index.js';
2
2
  import { styled } from '@mui/material/styles/index.js';
3
3
  import React, { forwardRef, useCallback, useMemo } from 'react';
4
4
 
5
- import { progressValueText, resolveWorkflowStepProps, withDerivedStatus } from './WorkflowStep.helpers';
5
+ import { progressValueRange, progressValueText, resolveWorkflowStepProps, withDerivedStatus } from './WorkflowStep.helpers';
6
6
  import { StepRow } from './WorkflowStepRow';
7
7
  import type { WorkflowStepItem, WorkflowStepProps } from './WorkflowStep.types';
8
8
 
@@ -62,6 +62,8 @@ export const WorkflowStep = forwardRef<HTMLDivElement, WorkflowStepProps>((rawPr
62
62
  [steps, currentStep],
63
63
  );
64
64
 
65
+ const { max: valueMax, now: valueNow } = progressValueRange(steps, currentStep);
66
+
65
67
  return (
66
68
  <StepContainer
67
69
  ref={ref}
@@ -71,8 +73,8 @@ export const WorkflowStep = forwardRef<HTMLDivElement, WorkflowStepProps>((rawPr
71
73
  style={style}
72
74
  role="progressbar"
73
75
  aria-valuemin={0}
74
- aria-valuemax={steps.length - 1}
75
- aria-valuenow={currentStep}
76
+ aria-valuemax={valueMax}
77
+ aria-valuenow={valueNow}
76
78
  aria-valuetext={progressValueText(steps, currentStep)}
77
79
  data-testid={dataTestId}
78
80
  {...other}
@@ -117,6 +117,14 @@ export interface StepConnectorProps {
117
117
  orientation: WorkflowStepOrientation;
118
118
  variant: WorkflowStepVariant;
119
119
  color: WorkflowStepColor;
120
+ /**
121
+ * Gates the connector's colour transition (FUT-2773), the same way the
122
+ * indicator's already did. Optional and defaults to `true` — the
123
+ * connector's own prior, unconditional behaviour — so an external caller
124
+ * that already builds a `StepConnectorProps`-typed value without this
125
+ * field keeps rendering exactly as it did before this field existed.
126
+ */
127
+ animated?: boolean;
120
128
  'data-testid'?: string;
121
129
  }
122
130
 
@@ -125,10 +133,12 @@ export interface StepConnectorProps {
125
133
  */
126
134
  export interface StepContentProps {
127
135
  step: WorkflowStepItem;
136
+ /** @deprecated Unused since FUT-2773 — the content block is inert and no longer keyed off it. */
128
137
  index: number;
129
138
  orientation: WorkflowStepOrientation;
130
139
  interactive: boolean;
131
140
  disabled: boolean;
141
+ /** @deprecated Unused since FUT-2773 — the content block is inert and never calls this itself; the indicator is the step's one interactive element. */
132
142
  onClick?: (index: number, step: WorkflowStepItem) => void;
133
143
  'data-testid'?: string;
134
144
  }
@@ -88,6 +88,7 @@ export const StepRow: React.FC<StepRowProps> = ({
88
88
  orientation={orientation}
89
89
  variant={variant}
90
90
  color={color}
91
+ animated={animated}
91
92
  data-testid={`${dataTestId}-connector-${index}`}
92
93
  />
93
94
  )}
@@ -1,6 +1,7 @@
1
1
  import type { PaletteColor, Theme, ThemeOptions } from '@mui/material/styles/index.js';
2
2
 
3
3
  import { cssLengthToPx, cssTrackingToEm } from '../tokens/css-units';
4
+ import { chipDensityOverrides, iconButtonDensityOverrides } from '../tokens/density-overrides';
4
5
  import { densityFontSize, resolveDensityFactor } from '../tokens/density';
5
6
  import { resolveFieldHeight } from '../tokens/field-height.core';
6
7
  import { fieldOverrides, mergeMuiComponents } from '../tokens/field-height';
@@ -144,10 +145,14 @@ export function muiThemeOptionsFrom(ui: UiTheme): ThemeOptions {
144
145
  shape: { borderRadius: ui.radius.md },
145
146
  fieldRadius: ui.radius.field,
146
147
  fieldHeight: ui.fieldHeight,
147
- // Additive: children 2–4 (FUT-2766–2768) each add one more source here as
148
- // their own geometry overrides land — this PR wires the merge helper to
149
- // `fieldOverrides` alone, since no geometry override exists yet.
150
- components: mergeMuiComponents(fieldOverrides(ui.radius.field, ui.fieldHeight)),
148
+ // Additive: children 3/4 (FUT-2767/2768) each add one more source here as
149
+ // their own geometry overrides land — this PR (FUT-2766) adds IconButton's
150
+ // and Chip's.
151
+ components: mergeMuiComponents(
152
+ fieldOverrides(ui.radius.field, ui.fieldHeight),
153
+ iconButtonDensityOverrides(),
154
+ chipDensityOverrides(),
155
+ ),
151
156
  spacing: ui.spacingUnit,
152
157
  density: ui.density,
153
158
  typography: {