@12-apps/ui 6.44.3 → 6.45.1

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 (425) hide show
  1. package/NATIVE.md +1 -1
  2. package/components-catalog.md +13 -4
  3. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
  4. package/dist/_internal/components/data-display/Avatar/Avatar.js +2 -2
  5. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  6. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +1 -1
  7. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +1 -1
  8. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  9. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  10. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  11. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  12. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  13. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  14. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +37 -37
  15. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +53 -53
  16. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +4 -4
  17. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +5 -5
  18. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +11 -11
  19. package/dist/_internal/components/data-display/DataViews/base-card.js +5 -5
  20. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
  21. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  22. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +1 -1
  23. package/dist/_internal/components/data-display/DataViews/base-list-card.js +7 -7
  24. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +8 -8
  25. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +1 -1
  26. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +15 -15
  27. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +4 -4
  28. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +33 -33
  29. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +14 -14
  30. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +12 -12
  31. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +13 -13
  32. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
  33. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +3 -3
  34. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
  35. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +16 -16
  36. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
  37. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
  38. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +3 -3
  39. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +10 -10
  40. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +6 -6
  41. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +11 -11
  42. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
  43. package/dist/_internal/components/data-display/HoverCard/HoverCard.hooks.js +1 -1
  44. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +3 -3
  45. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  46. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
  47. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  48. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  49. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +5 -5
  50. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  51. package/dist/_internal/components/data-display/index.js +35 -35
  52. package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
  53. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +6 -6
  54. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
  55. package/dist/_internal/components/feedback/index.js +14 -14
  56. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
  57. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
  58. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
  59. package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
  60. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  61. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  62. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +2 -2
  63. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +5 -5
  64. package/dist/_internal/components/form/CepField/CepField.js +3 -3
  65. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  66. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
  67. package/dist/_internal/components/form/Command/Command.js +2 -2
  68. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +7 -7
  69. package/dist/_internal/components/form/Input/Input.js +2 -2
  70. package/dist/_internal/components/form/Menubar/Menubar.js +2 -2
  71. package/dist/_internal/components/form/NumberField/NumberField.js +3 -3
  72. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
  73. package/dist/_internal/components/form/Switch/Switch.js +5 -5
  74. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  75. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  76. package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
  77. package/dist/_internal/components/form/index.js +35 -35
  78. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +6 -6
  79. package/dist/_internal/components/form/total-form/Fields/CepField.js +4 -4
  80. package/dist/_internal/components/form/total-form/Fields/TextField.js +3 -3
  81. package/dist/_internal/components/form/total-form/Fields/index.js +12 -12
  82. package/dist/_internal/components/index.js +130 -112
  83. package/dist/_internal/components/layout/Card/Card.js +2 -2
  84. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +7 -7
  85. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +6 -6
  86. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +7 -7
  87. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +4 -4
  88. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +3 -3
  89. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +2 -2
  90. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  91. package/dist/_internal/components/layout/index.js +19 -19
  92. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +4 -4
  93. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  94. package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
  95. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +45 -0
  96. package/dist/_internal/components/navigation/SectionNav/SectionNav.helpers.js +14 -0
  97. package/dist/_internal/components/navigation/SectionNav/SectionNav.helpers.js.map +1 -0
  98. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +45 -0
  99. package/dist/_internal/components/navigation/SectionNav/SectionNav.js.map +1 -0
  100. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +46 -0
  101. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js.map +1 -0
  102. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +39 -0
  103. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js.map +1 -0
  104. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +39 -0
  105. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js.map +1 -0
  106. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +41 -0
  107. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js.map +1 -0
  108. package/dist/_internal/components/navigation/SectionNav/SectionNav.types.js +1 -0
  109. package/dist/_internal/components/navigation/SectionNav/SectionNav.types.js.map +1 -0
  110. package/dist/_internal/components/navigation/SectionNav/__stories__/fixtures.js +127 -0
  111. package/dist/_internal/components/navigation/SectionNav/__stories__/fixtures.js.map +1 -0
  112. package/dist/_internal/components/navigation/index.js +39 -12
  113. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
  114. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
  115. package/dist/_internal/components/utility/index.js +8 -8
  116. package/dist/_internal/en-US.navigation.js +5 -3
  117. package/dist/_internal/pt-BR.navigation.js +5 -3
  118. package/dist/_internal/social-login-button/social-login-button.js +3 -3
  119. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  120. package/dist/charts.js +6 -6
  121. package/dist/{chunk-J6TIK47Z.js → chunk-2HPNN5XA.js} +2 -2
  122. package/dist/{chunk-BEGTLELZ.js → chunk-2K2B5QM2.js} +5 -5
  123. package/dist/chunk-2OP2FYB3.js +174 -0
  124. package/dist/chunk-2OP2FYB3.js.map +1 -0
  125. package/dist/chunk-3WCUGTRH.js +240 -0
  126. package/dist/chunk-3WCUGTRH.js.map +1 -0
  127. package/dist/{chunk-3I77A65F.js → chunk-442FSG7G.js} +4 -4
  128. package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
  129. package/dist/{chunk-26QYVCDK.js → chunk-525AOF6I.js} +2 -2
  130. package/dist/chunk-5AK2EZG5.js +1 -0
  131. package/dist/chunk-5AK2EZG5.js.map +1 -0
  132. package/dist/{chunk-5752357K.js → chunk-5KGABAQB.js} +4 -4
  133. package/dist/{chunk-SDKOOVEX.js → chunk-6GAZAJXB.js} +4 -4
  134. package/dist/{chunk-EO6LCGGQ.js → chunk-6J32H2RN.js} +2 -2
  135. package/dist/chunk-6OLJ2RAT.js +62 -0
  136. package/dist/chunk-6OLJ2RAT.js.map +1 -0
  137. package/dist/{chunk-7XDET7PL.js → chunk-6OQHZVK6.js} +4 -4
  138. package/dist/{chunk-F3AYISXT.js → chunk-6PU3JYVY.js} +4 -4
  139. package/dist/{chunk-RRAWJQIO.js → chunk-A64MQ7GW.js} +2 -2
  140. package/dist/{chunk-ADSA76T7.js → chunk-AG3DY5TH.js} +2 -2
  141. package/dist/{chunk-CIBTYBBN.js → chunk-AJ4MRDKM.js} +3 -3
  142. package/dist/{chunk-RJ35IXFD.js → chunk-B7HYM3QB.js} +2 -2
  143. package/dist/{chunk-X3C3VTYS.js → chunk-BEX3FLHB.js} +2 -2
  144. package/dist/{chunk-C5RTSOXD.js → chunk-BUAFRLSB.js} +2 -2
  145. package/dist/{chunk-DH6SL3SY.js → chunk-DSDNGTH6.js} +6 -6
  146. package/dist/{chunk-AUQRGZE7.js → chunk-EDZYPHZT.js} +7 -2
  147. package/dist/chunk-EDZYPHZT.js.map +1 -0
  148. package/dist/{chunk-JZ7ZRZTF.js → chunk-EJMSSDLM.js} +2 -2
  149. package/dist/{chunk-62OGPVCL.js → chunk-EPZ7B35I.js} +7 -2
  150. package/dist/chunk-EPZ7B35I.js.map +1 -0
  151. package/dist/{chunk-GP4BJI3F.js → chunk-ETCS6OBJ.js} +4 -4
  152. package/dist/{chunk-MVR4GURP.js → chunk-EU76OQGR.js} +2 -2
  153. package/dist/{chunk-DHW5UMUG.js → chunk-FNLD2KCQ.js} +4 -4
  154. package/dist/{chunk-XRUW7DMH.js → chunk-FPKVHR5L.js} +2 -2
  155. package/dist/{chunk-HKBJZX3C.js → chunk-FQ637IDM.js} +7 -7
  156. package/dist/{chunk-DDL6W7JS.js → chunk-FRD7U6QO.js} +5 -5
  157. package/dist/{chunk-YCHOWWRE.js → chunk-G6T7KRQ3.js} +2 -2
  158. package/dist/{chunk-EKBUM7HK.js → chunk-GYZUJ7HH.js} +4 -4
  159. package/dist/{chunk-ZQ7IESR7.js → chunk-H7HEB4UC.js} +5 -5
  160. package/dist/{chunk-JYLBVHG2.js → chunk-HAPELHNW.js} +7 -7
  161. package/dist/{chunk-HNFZLXZI.js → chunk-HBP2OU4Q.js} +5 -5
  162. package/dist/{chunk-K7FSTB2K.js → chunk-HSNOWYEE.js} +2 -2
  163. package/dist/chunk-HYEOKBFV.js +73 -0
  164. package/dist/chunk-HYEOKBFV.js.map +1 -0
  165. package/dist/{chunk-GI63FQEJ.js → chunk-HYNDC3FP.js} +4 -4
  166. package/dist/{chunk-ZBVU2YWV.js → chunk-IITZA6U2.js} +9 -9
  167. package/dist/{chunk-BZFRBG2H.js → chunk-IIXMTC65.js} +4 -4
  168. package/dist/{chunk-JFLFZLOA.js → chunk-IJAUHR3M.js} +4 -4
  169. package/dist/{chunk-K5CCQBNN.js → chunk-ILKNYENU.js} +4 -4
  170. package/dist/{chunk-DJIFXJ4C.js → chunk-IPI3OU2P.js} +4 -4
  171. package/dist/{chunk-6JGATEOF.js → chunk-IWYTOCCV.js} +3 -3
  172. package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
  173. package/dist/{chunk-DE6A46AE.js → chunk-JFL5WT3S.js} +5 -5
  174. package/dist/{chunk-CYPBF3BI.js → chunk-JO4UMHWR.js} +3 -3
  175. package/dist/{chunk-LRFXCZB4.js → chunk-JWNOM5QT.js} +4 -4
  176. package/dist/{chunk-NU55QUMO.js → chunk-K45ML7M7.js} +2 -2
  177. package/dist/{chunk-OAVRXSAS.js → chunk-K7PWC44N.js} +2 -2
  178. package/dist/{chunk-CMV6BRQ3.js → chunk-KN3WYEH2.js} +57 -38
  179. package/dist/chunk-KN3WYEH2.js.map +1 -0
  180. package/dist/{chunk-ZGCPDA3F.js → chunk-KQS4ZJGS.js} +5 -5
  181. package/dist/{chunk-PAICZOL5.js → chunk-KTX7XME6.js} +4 -4
  182. package/dist/{chunk-KPZ53JY6.js → chunk-L3APNYI5.js} +3 -3
  183. package/dist/{chunk-GKNMKPR6.js → chunk-L6Q2A32O.js} +5 -5
  184. package/dist/{chunk-IG26N6J2.js → chunk-MD3ND6DT.js} +3 -3
  185. package/dist/{chunk-DTLKF4AX.js → chunk-MQ277OLB.js} +9 -9
  186. package/dist/{chunk-BA6Z52QN.js → chunk-NF4GHTZ4.js} +2 -2
  187. package/dist/{chunk-MSAAOQAD.js → chunk-NFA7STJA.js} +4 -4
  188. package/dist/{chunk-7HZTYK7U.js → chunk-NLYNRE7L.js} +4 -4
  189. package/dist/{chunk-HOIHO2YQ.js → chunk-NRI2TZDS.js} +2 -2
  190. package/dist/{chunk-VQUPB7F7.js → chunk-O25RFGPX.js} +4 -4
  191. package/dist/{chunk-Z3HSRNJT.js → chunk-OARM5RX4.js} +5 -5
  192. package/dist/{chunk-JDEKR77O.js → chunk-OERKNBKK.js} +2 -2
  193. package/dist/{chunk-WN5PNP6F.js → chunk-OP5JR5Q5.js} +4 -4
  194. package/dist/{chunk-XP522FFM.js → chunk-PARTZ7XI.js} +2 -2
  195. package/dist/{chunk-BHE44AQE.js → chunk-PCHUIDMT.js} +2 -2
  196. package/dist/{chunk-NYFGFELX.js → chunk-PGPPN63I.js} +6 -6
  197. package/dist/{chunk-Y2CMWGIU.js → chunk-PKXCQKPB.js} +2 -2
  198. package/dist/{chunk-6B3QXFF5.js → chunk-PNWGQAXQ.js} +2 -2
  199. package/dist/{chunk-IO2X6DVH.js → chunk-PSX7DAMV.js} +4 -4
  200. package/dist/{chunk-OL2BEJZR.js → chunk-Q2LQVYXY.js} +2 -2
  201. package/dist/chunk-R26KYJHK.js +1 -0
  202. package/dist/chunk-R26KYJHK.js.map +1 -0
  203. package/dist/chunk-R73CRAAI.js +1 -0
  204. package/dist/chunk-R73CRAAI.js.map +1 -0
  205. package/dist/{chunk-VKFZQSQC.js → chunk-RPFQQP5S.js} +6 -6
  206. package/dist/chunk-SENCNTMV.js +55 -0
  207. package/dist/chunk-SENCNTMV.js.map +1 -0
  208. package/dist/{chunk-X4VWYWFK.js → chunk-SJY4DDG7.js} +4 -4
  209. package/dist/{chunk-DYCTIOER.js → chunk-SRZY6QG3.js} +5 -5
  210. package/dist/chunk-TCFBCTZD.js +168 -0
  211. package/dist/chunk-TCFBCTZD.js.map +1 -0
  212. package/dist/{chunk-44USLRMT.js → chunk-TPPFWETI.js} +6 -6
  213. package/dist/{chunk-XXL4PM4M.js → chunk-TWVRPT7J.js} +2 -2
  214. package/dist/{chunk-SM4MT4YC.js → chunk-U2UT2NDH.js} +3 -3
  215. package/dist/{chunk-5MW7OYBM.js → chunk-UJOFRJLX.js} +2 -2
  216. package/dist/{chunk-O6IF4BZT.js → chunk-UUJ7J7NE.js} +3 -3
  217. package/dist/{chunk-5JCGBCFJ.js → chunk-V2GHNHP6.js} +2 -2
  218. package/dist/{chunk-WQ3KTELX.js → chunk-V4R6Q5ED.js} +8 -8
  219. package/dist/{chunk-B3QWQG62.js → chunk-V54LG3QG.js} +2 -2
  220. package/dist/{chunk-6B4UTB4O.js → chunk-VDSQ5H4Y.js} +3 -3
  221. package/dist/chunk-VHVI3D4R.js +26 -0
  222. package/dist/chunk-VHVI3D4R.js.map +1 -0
  223. package/dist/{chunk-AEKHSORY.js → chunk-VOBVYVPN.js} +5 -5
  224. package/dist/{chunk-B2WBDMHE.js → chunk-VPH47OIV.js} +4 -4
  225. package/dist/{chunk-JSOJKHEI.js → chunk-WHYVVKRS.js} +2 -2
  226. package/dist/{chunk-KUKY5GEX.js → chunk-WU2KXA6I.js} +2 -2
  227. package/dist/{chunk-VNOXUWK7.js → chunk-X5F4FRH7.js} +4 -4
  228. package/dist/{chunk-EOEYOPOS.js → chunk-YKALXHCS.js} +11 -11
  229. package/dist/{chunk-BKBELIUR.js → chunk-YWQ7QCWR.js} +6 -6
  230. package/dist/{chunk-VNWZWQF3.js → chunk-Z3USLQQT.js} +69 -24
  231. package/dist/chunk-Z3USLQQT.js.map +1 -0
  232. package/dist/data-display/AsyncStateContainer.js +4 -4
  233. package/dist/data-display/Avatar.js +2 -2
  234. package/dist/data-display/Badge.js +3 -2
  235. package/dist/data-display/CardKit.js +11 -11
  236. package/dist/data-display/Carousel.js +2 -2
  237. package/dist/data-display/Chart.js +6 -6
  238. package/dist/data-display/DataGrid.js +2 -2
  239. package/dist/data-display/DataViews.js +65 -65
  240. package/dist/data-display/FleetMap.js +11 -11
  241. package/dist/data-display/HoverCard.js +3 -3
  242. package/dist/data-display/LazyImage.js +3 -3
  243. package/dist/data-display/Lightbox.js +3 -3
  244. package/dist/data-display/LoadingState.js +3 -3
  245. package/dist/data-display/MapPreview.js +5 -5
  246. package/dist/data-display/StatCard.js +3 -3
  247. package/dist/en-US.js +8 -6
  248. package/dist/feedback/ConfirmAction.js +3 -3
  249. package/dist/feedback/Dialog.js +3 -3
  250. package/dist/feedback/StackedModal.js +6 -6
  251. package/dist/feedback/TutorialOverlay.js +2 -2
  252. package/dist/form/AddressAutocomplete.js +5 -5
  253. package/dist/form/Calendar.js +4 -4
  254. package/dist/form/CategorySelect.js +5 -5
  255. package/dist/form/CepField.js +3 -3
  256. package/dist/form/Checkbox.js +2 -2
  257. package/dist/form/CodeEditor.js +2 -2
  258. package/dist/form/Command.js +2 -2
  259. package/dist/form/DateRangePicker.js +9 -9
  260. package/dist/form/Input.js +2 -2
  261. package/dist/form/Menubar.js +2 -2
  262. package/dist/form/NumberField.js +3 -3
  263. package/dist/form/RichTextEditor.js +2 -2
  264. package/dist/form/Switch.js +5 -5
  265. package/dist/form/UploadButton.js +2 -2
  266. package/dist/form/total-form.js +18 -18
  267. package/dist/layout/Card.js +2 -2
  268. package/dist/layout/ContentToolbar.js +4 -4
  269. package/dist/layout/SettingCard.js +11 -11
  270. package/dist/layout/SettingsLayout.js +4 -4
  271. package/dist/layout/Skeleton.js +2 -2
  272. package/dist/locales.js +15 -8
  273. package/dist/locales.js.map +1 -1
  274. package/dist/navigation/AppHeader.js +6 -6
  275. package/dist/navigation/CommandPalette.js +2 -2
  276. package/dist/navigation/Pagination.js +2 -2
  277. package/dist/navigation/SectionNav.js +52 -0
  278. package/dist/navigation/SectionNav.js.map +1 -0
  279. package/dist/pt-BR.js +4 -2
  280. package/dist/social-login-button.js +3 -3
  281. package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
  282. package/dist/types/components/data-display/HoverCard/HoverCard.hooks.d.ts +2 -8
  283. package/dist/types/components/data-display/HoverCard/HoverCard.hooks.d.ts.map +1 -1
  284. package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts +14 -0
  285. package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts.map +1 -0
  286. package/dist/types/components/navigation/SectionNav/SectionNav.d.ts +16 -0
  287. package/dist/types/components/navigation/SectionNav/SectionNav.d.ts.map +1 -0
  288. package/dist/types/components/navigation/SectionNav/SectionNav.helpers.d.ts +32 -0
  289. package/dist/types/components/navigation/SectionNav/SectionNav.helpers.d.ts.map +1 -0
  290. package/dist/types/components/navigation/SectionNav/SectionNav.parts.d.ts +42 -0
  291. package/dist/types/components/navigation/SectionNav/SectionNav.parts.d.ts.map +1 -0
  292. package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts +29 -0
  293. package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts.map +1 -0
  294. package/dist/types/components/navigation/SectionNav/SectionNav.rail.d.ts +13 -0
  295. package/dist/types/components/navigation/SectionNav/SectionNav.rail.d.ts.map +1 -0
  296. package/dist/types/components/navigation/SectionNav/SectionNav.sheet.d.ts +20 -0
  297. package/dist/types/components/navigation/SectionNav/SectionNav.sheet.d.ts.map +1 -0
  298. package/dist/types/components/navigation/SectionNav/SectionNav.types.d.ts +102 -0
  299. package/dist/types/components/navigation/SectionNav/SectionNav.types.d.ts.map +1 -0
  300. package/dist/types/components/navigation/SectionNav/__stories__/fixtures.d.ts +20 -0
  301. package/dist/types/components/navigation/SectionNav/__stories__/fixtures.d.ts.map +1 -0
  302. package/dist/types/components/navigation/SectionNav/index.d.ts +7 -0
  303. package/dist/types/components/navigation/SectionNav/index.d.ts.map +1 -0
  304. package/dist/types/components/navigation/index.d.ts +1 -0
  305. package/dist/types/components/navigation/index.d.ts.map +1 -1
  306. package/dist/types/copy/navigation.d.ts +10 -0
  307. package/dist/types/copy/navigation.d.ts.map +1 -1
  308. package/dist/types/en-US.navigation.d.ts +2 -1
  309. package/dist/types/en-US.navigation.d.ts.map +1 -1
  310. package/dist/types/locales.d.ts +2 -1
  311. package/dist/types/locales.d.ts.map +1 -1
  312. package/dist/types/pt-BR.navigation.d.ts +2 -1
  313. package/dist/types/pt-BR.navigation.d.ts.map +1 -1
  314. package/dist/user-avatar.js +5 -5
  315. package/dist/utility/InfiniteScroll.js +2 -2
  316. package/dist/utility/InstallPrompt.js +2 -2
  317. package/package.json +5 -1
  318. package/src/components/data-display/HoverCard/HoverCard.hooks.ts +173 -33
  319. package/src/components/data-display/HoverCard/HoverCard.md +1 -0
  320. package/src/components/data-display/HoverCard/HoverCard.tsx +38 -16
  321. package/src/components/navigation/SectionNav/SectionNav.bar.tsx +258 -0
  322. package/src/components/navigation/SectionNav/SectionNav.helpers.ts +51 -0
  323. package/src/components/navigation/SectionNav/SectionNav.md +91 -0
  324. package/src/components/navigation/SectionNav/SectionNav.parts.tsx +88 -0
  325. package/src/components/navigation/SectionNav/SectionNav.primary.tsx +81 -0
  326. package/src/components/navigation/SectionNav/SectionNav.rail.tsx +208 -0
  327. package/src/components/navigation/SectionNav/SectionNav.sheet.tsx +206 -0
  328. package/src/components/navigation/SectionNav/SectionNav.tsx +56 -0
  329. package/src/components/navigation/SectionNav/SectionNav.types.ts +108 -0
  330. package/src/components/navigation/SectionNav/__stories__/fixtures.tsx +111 -0
  331. package/src/components/navigation/SectionNav/index.ts +13 -0
  332. package/src/components/navigation/index.ts +1 -0
  333. package/src/copy/navigation.ts +11 -0
  334. package/src/en-US.navigation.ts +6 -0
  335. package/src/locales.ts +5 -0
  336. package/src/pt-BR.navigation.ts +6 -0
  337. package/dist/chunk-62OGPVCL.js.map +0 -1
  338. package/dist/chunk-AUQRGZE7.js.map +0 -1
  339. package/dist/chunk-CMV6BRQ3.js.map +0 -1
  340. package/dist/chunk-OJSVHBQO.js +0 -1
  341. package/dist/chunk-VNWZWQF3.js.map +0 -1
  342. /package/dist/{chunk-OJSVHBQO.js.map → _internal/components/navigation/SectionNav/SectionNav.bar.js.map} +0 -0
  343. /package/dist/{chunk-J6TIK47Z.js.map → chunk-2HPNN5XA.js.map} +0 -0
  344. /package/dist/{chunk-BEGTLELZ.js.map → chunk-2K2B5QM2.js.map} +0 -0
  345. /package/dist/{chunk-3I77A65F.js.map → chunk-442FSG7G.js.map} +0 -0
  346. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
  347. /package/dist/{chunk-26QYVCDK.js.map → chunk-525AOF6I.js.map} +0 -0
  348. /package/dist/{chunk-5752357K.js.map → chunk-5KGABAQB.js.map} +0 -0
  349. /package/dist/{chunk-SDKOOVEX.js.map → chunk-6GAZAJXB.js.map} +0 -0
  350. /package/dist/{chunk-EO6LCGGQ.js.map → chunk-6J32H2RN.js.map} +0 -0
  351. /package/dist/{chunk-7XDET7PL.js.map → chunk-6OQHZVK6.js.map} +0 -0
  352. /package/dist/{chunk-F3AYISXT.js.map → chunk-6PU3JYVY.js.map} +0 -0
  353. /package/dist/{chunk-RRAWJQIO.js.map → chunk-A64MQ7GW.js.map} +0 -0
  354. /package/dist/{chunk-ADSA76T7.js.map → chunk-AG3DY5TH.js.map} +0 -0
  355. /package/dist/{chunk-CIBTYBBN.js.map → chunk-AJ4MRDKM.js.map} +0 -0
  356. /package/dist/{chunk-RJ35IXFD.js.map → chunk-B7HYM3QB.js.map} +0 -0
  357. /package/dist/{chunk-X3C3VTYS.js.map → chunk-BEX3FLHB.js.map} +0 -0
  358. /package/dist/{chunk-C5RTSOXD.js.map → chunk-BUAFRLSB.js.map} +0 -0
  359. /package/dist/{chunk-DH6SL3SY.js.map → chunk-DSDNGTH6.js.map} +0 -0
  360. /package/dist/{chunk-JZ7ZRZTF.js.map → chunk-EJMSSDLM.js.map} +0 -0
  361. /package/dist/{chunk-GP4BJI3F.js.map → chunk-ETCS6OBJ.js.map} +0 -0
  362. /package/dist/{chunk-MVR4GURP.js.map → chunk-EU76OQGR.js.map} +0 -0
  363. /package/dist/{chunk-DHW5UMUG.js.map → chunk-FNLD2KCQ.js.map} +0 -0
  364. /package/dist/{chunk-XRUW7DMH.js.map → chunk-FPKVHR5L.js.map} +0 -0
  365. /package/dist/{chunk-HKBJZX3C.js.map → chunk-FQ637IDM.js.map} +0 -0
  366. /package/dist/{chunk-DDL6W7JS.js.map → chunk-FRD7U6QO.js.map} +0 -0
  367. /package/dist/{chunk-YCHOWWRE.js.map → chunk-G6T7KRQ3.js.map} +0 -0
  368. /package/dist/{chunk-EKBUM7HK.js.map → chunk-GYZUJ7HH.js.map} +0 -0
  369. /package/dist/{chunk-ZQ7IESR7.js.map → chunk-H7HEB4UC.js.map} +0 -0
  370. /package/dist/{chunk-JYLBVHG2.js.map → chunk-HAPELHNW.js.map} +0 -0
  371. /package/dist/{chunk-HNFZLXZI.js.map → chunk-HBP2OU4Q.js.map} +0 -0
  372. /package/dist/{chunk-K7FSTB2K.js.map → chunk-HSNOWYEE.js.map} +0 -0
  373. /package/dist/{chunk-GI63FQEJ.js.map → chunk-HYNDC3FP.js.map} +0 -0
  374. /package/dist/{chunk-ZBVU2YWV.js.map → chunk-IITZA6U2.js.map} +0 -0
  375. /package/dist/{chunk-BZFRBG2H.js.map → chunk-IIXMTC65.js.map} +0 -0
  376. /package/dist/{chunk-JFLFZLOA.js.map → chunk-IJAUHR3M.js.map} +0 -0
  377. /package/dist/{chunk-K5CCQBNN.js.map → chunk-ILKNYENU.js.map} +0 -0
  378. /package/dist/{chunk-DJIFXJ4C.js.map → chunk-IPI3OU2P.js.map} +0 -0
  379. /package/dist/{chunk-6JGATEOF.js.map → chunk-IWYTOCCV.js.map} +0 -0
  380. /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
  381. /package/dist/{chunk-DE6A46AE.js.map → chunk-JFL5WT3S.js.map} +0 -0
  382. /package/dist/{chunk-CYPBF3BI.js.map → chunk-JO4UMHWR.js.map} +0 -0
  383. /package/dist/{chunk-LRFXCZB4.js.map → chunk-JWNOM5QT.js.map} +0 -0
  384. /package/dist/{chunk-NU55QUMO.js.map → chunk-K45ML7M7.js.map} +0 -0
  385. /package/dist/{chunk-OAVRXSAS.js.map → chunk-K7PWC44N.js.map} +0 -0
  386. /package/dist/{chunk-ZGCPDA3F.js.map → chunk-KQS4ZJGS.js.map} +0 -0
  387. /package/dist/{chunk-PAICZOL5.js.map → chunk-KTX7XME6.js.map} +0 -0
  388. /package/dist/{chunk-KPZ53JY6.js.map → chunk-L3APNYI5.js.map} +0 -0
  389. /package/dist/{chunk-GKNMKPR6.js.map → chunk-L6Q2A32O.js.map} +0 -0
  390. /package/dist/{chunk-IG26N6J2.js.map → chunk-MD3ND6DT.js.map} +0 -0
  391. /package/dist/{chunk-DTLKF4AX.js.map → chunk-MQ277OLB.js.map} +0 -0
  392. /package/dist/{chunk-BA6Z52QN.js.map → chunk-NF4GHTZ4.js.map} +0 -0
  393. /package/dist/{chunk-MSAAOQAD.js.map → chunk-NFA7STJA.js.map} +0 -0
  394. /package/dist/{chunk-7HZTYK7U.js.map → chunk-NLYNRE7L.js.map} +0 -0
  395. /package/dist/{chunk-HOIHO2YQ.js.map → chunk-NRI2TZDS.js.map} +0 -0
  396. /package/dist/{chunk-VQUPB7F7.js.map → chunk-O25RFGPX.js.map} +0 -0
  397. /package/dist/{chunk-Z3HSRNJT.js.map → chunk-OARM5RX4.js.map} +0 -0
  398. /package/dist/{chunk-JDEKR77O.js.map → chunk-OERKNBKK.js.map} +0 -0
  399. /package/dist/{chunk-WN5PNP6F.js.map → chunk-OP5JR5Q5.js.map} +0 -0
  400. /package/dist/{chunk-XP522FFM.js.map → chunk-PARTZ7XI.js.map} +0 -0
  401. /package/dist/{chunk-BHE44AQE.js.map → chunk-PCHUIDMT.js.map} +0 -0
  402. /package/dist/{chunk-NYFGFELX.js.map → chunk-PGPPN63I.js.map} +0 -0
  403. /package/dist/{chunk-Y2CMWGIU.js.map → chunk-PKXCQKPB.js.map} +0 -0
  404. /package/dist/{chunk-6B3QXFF5.js.map → chunk-PNWGQAXQ.js.map} +0 -0
  405. /package/dist/{chunk-IO2X6DVH.js.map → chunk-PSX7DAMV.js.map} +0 -0
  406. /package/dist/{chunk-OL2BEJZR.js.map → chunk-Q2LQVYXY.js.map} +0 -0
  407. /package/dist/{chunk-VKFZQSQC.js.map → chunk-RPFQQP5S.js.map} +0 -0
  408. /package/dist/{chunk-X4VWYWFK.js.map → chunk-SJY4DDG7.js.map} +0 -0
  409. /package/dist/{chunk-DYCTIOER.js.map → chunk-SRZY6QG3.js.map} +0 -0
  410. /package/dist/{chunk-44USLRMT.js.map → chunk-TPPFWETI.js.map} +0 -0
  411. /package/dist/{chunk-XXL4PM4M.js.map → chunk-TWVRPT7J.js.map} +0 -0
  412. /package/dist/{chunk-SM4MT4YC.js.map → chunk-U2UT2NDH.js.map} +0 -0
  413. /package/dist/{chunk-5MW7OYBM.js.map → chunk-UJOFRJLX.js.map} +0 -0
  414. /package/dist/{chunk-O6IF4BZT.js.map → chunk-UUJ7J7NE.js.map} +0 -0
  415. /package/dist/{chunk-5JCGBCFJ.js.map → chunk-V2GHNHP6.js.map} +0 -0
  416. /package/dist/{chunk-WQ3KTELX.js.map → chunk-V4R6Q5ED.js.map} +0 -0
  417. /package/dist/{chunk-B3QWQG62.js.map → chunk-V54LG3QG.js.map} +0 -0
  418. /package/dist/{chunk-6B4UTB4O.js.map → chunk-VDSQ5H4Y.js.map} +0 -0
  419. /package/dist/{chunk-AEKHSORY.js.map → chunk-VOBVYVPN.js.map} +0 -0
  420. /package/dist/{chunk-B2WBDMHE.js.map → chunk-VPH47OIV.js.map} +0 -0
  421. /package/dist/{chunk-JSOJKHEI.js.map → chunk-WHYVVKRS.js.map} +0 -0
  422. /package/dist/{chunk-KUKY5GEX.js.map → chunk-WU2KXA6I.js.map} +0 -0
  423. /package/dist/{chunk-VNOXUWK7.js.map → chunk-X5F4FRH7.js.map} +0 -0
  424. /package/dist/{chunk-EOEYOPOS.js.map → chunk-YKALXHCS.js.map} +0 -0
  425. /package/dist/{chunk-BKBELIUR.js.map → chunk-YWQ7QCWR.js.map} +0 -0
@@ -0,0 +1,102 @@
1
+ import type { ElementType, ReactNode } from 'react';
2
+ import type { SectionNavCopy } from '../../../copy';
3
+ /**
4
+ * One place the section leads to — a bar slot on a phone, a row in the rail.
5
+ */
6
+ export interface SectionNavDestination {
7
+ /** Stable key. Also the suffix of the slot's `data-testid`. */
8
+ id: string;
9
+ label: string;
10
+ icon: ReactNode;
11
+ href: string;
12
+ /**
13
+ * How many things behind this destination wait on the viewer. `0` and
14
+ * `undefined` render no badge — "nothing waiting" and "not known yet" are
15
+ * different claims and neither is a number.
16
+ */
17
+ badge?: number;
18
+ /** The destination the viewer is on. The host decides; the nav never reads the URL. */
19
+ active?: boolean;
20
+ }
21
+ /**
22
+ * One entry inside a menu — a sheet tile on a phone, a row in the rail.
23
+ *
24
+ * An entry either LEADS somewhere (`href`, rendered through `linkComponent`)
25
+ * or DOES something (`onSelect`). Give it one or the other.
26
+ */
27
+ export interface SectionNavEntry {
28
+ id: string;
29
+ label: string;
30
+ /** A second line under the label. Shown by `list` groups and in the rail. */
31
+ description?: string;
32
+ icon: ReactNode;
33
+ href?: string;
34
+ onSelect?: () => void;
35
+ badge?: number;
36
+ active?: boolean;
37
+ }
38
+ /** A titled run of entries inside a menu. */
39
+ export interface SectionNavGroup {
40
+ id: string;
41
+ /** Heading above the entries. Omit for a group that needs none. */
42
+ title?: string;
43
+ /**
44
+ * How the phone sheet draws the entries: `grid` is three tiles across,
45
+ * `list` one row each with its description. The rail always lists.
46
+ * Defaults to `list`.
47
+ */
48
+ layout?: 'grid' | 'list';
49
+ entries: SectionNavEntry[];
50
+ }
51
+ /**
52
+ * A menu the nav opens: the centred primary action, or the "more" slot.
53
+ *
54
+ * On a phone it opens as a bottom sheet over the page. In the rail there is
55
+ * room for everything, so its groups are listed under `title` instead of
56
+ * hiding behind a trigger.
57
+ */
58
+ export interface SectionNavMenu {
59
+ /** The trigger's accessible name, and the visible label of the "more" slot. */
60
+ label: string;
61
+ icon: ReactNode;
62
+ /** The sheet's heading, and the rail section's. */
63
+ title: string;
64
+ groups: SectionNavGroup[];
65
+ }
66
+ /** The way out of the section, drawn at the top of the rail. */
67
+ export interface SectionNavBack {
68
+ label: string;
69
+ href: string;
70
+ icon?: ReactNode;
71
+ }
72
+ export interface SectionNavProps {
73
+ /**
74
+ * `bar` — a bottom tab bar for a phone: the destinations, `more` as the last
75
+ * slot, and `primary` as a raised button in the middle.
76
+ *
77
+ * `rail` — a vertical list for a wide screen, with `back` and `heading` on
78
+ * top and every menu's entries listed rather than folded away.
79
+ */
80
+ layout: 'bar' | 'rail';
81
+ /** The navigation landmark's accessible name. */
82
+ label: string;
83
+ destinations: SectionNavDestination[];
84
+ /** The raised action in the middle of the bar. */
85
+ primary?: SectionNavMenu;
86
+ /** The last slot of the bar. Its badge is the sum of its entries' badges. */
87
+ more?: SectionNavMenu;
88
+ /** Rail only: the way back out of the section. */
89
+ back?: SectionNavBack;
90
+ /** Rail only: a heading above the destinations. */
91
+ heading?: string;
92
+ /**
93
+ * The component every `href` renders through — a router's link adapter that
94
+ * takes `href`. Omitted, a plain `<a>` is used and navigation reloads.
95
+ */
96
+ linkComponent?: ElementType;
97
+ /** The nav's own words. REQUIRED — the component carries none. */
98
+ copy: SectionNavCopy;
99
+ /** Prefix for every `data-testid`. Defaults to `"section-nav"`. */
100
+ dataTestId?: string;
101
+ }
102
+ //# sourceMappingURL=SectionNav.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionNav.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/navigation/SectionNav/SectionNav.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,kDAAkD;IAClD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,kDAAkD;IAClD,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,kEAAkE;IAClE,IAAI,EAAE,cAAc,CAAC;IACrB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import type { SectionNavDestination, SectionNavMenu } from '../SectionNav.types';
3
+ /**
4
+ * The stories' example section, shared by the showcase and the interaction
5
+ * tests. Kept out of the `*.stories.tsx` files because Storybook reads every
6
+ * named export there as a story.
7
+ */
8
+ /** A restaurant's shift, as the example section: the floor, the board, the waiter's round. */
9
+ export declare const DESTINATIONS: SectionNavDestination[];
10
+ export declare const PRIMARY: SectionNavMenu;
11
+ export declare const MORE: SectionNavMenu;
12
+ /** A phone-sized frame with the bar at its foot, the way a host docks it. */
13
+ export declare function PhoneFrame({ children }: {
14
+ children: React.ReactNode;
15
+ }): React.ReactElement;
16
+ /** A desktop-column-sized frame for the rail. */
17
+ export declare function RailFrame({ children }: {
18
+ children: React.ReactNode;
19
+ }): React.ReactElement;
20
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/SectionNav/__stories__/fixtures.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEjF;;;;GAIG;AAEH,8FAA8F;AAC9F,eAAO,MAAM,YAAY,EAAE,qBAAqB,EAI/C,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,cA6BrB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,cAiBlB,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,CAoB1F;AAGD,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,CAEzF"}
@@ -0,0 +1,7 @@
1
+ export { SectionNav } from './SectionNav';
2
+ export { sectionNavBarInset } from './SectionNav.bar';
3
+ export { RaisedActionButton } from './SectionNav.primary';
4
+ export type { RaisedActionButtonProps } from './SectionNav.primary';
5
+ export type { SectionNavBack, SectionNavDestination, SectionNavEntry, SectionNavGroup, SectionNavMenu, SectionNavProps, } from './SectionNav.types';
6
+ export type { SectionNavCopy } from '../../../copy';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/navigation/SectionNav/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -5,5 +5,6 @@ export * from './ContextMenu';
5
5
  export * from './DropdownMenu';
6
6
  export * from './NavigationMenu';
7
7
  export * from './Pagination';
8
+ export * from './SectionNav';
8
9
  export * from './Tabs';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC"}
@@ -16,6 +16,16 @@ export interface CommandPaletteCopy {
16
16
  recent: string;
17
17
  tryAnotherTerm: string;
18
18
  }
19
+ /**
20
+ * `SectionNav`'s own words — only the chrome it draws around the host's
21
+ * destinations. Every destination and menu label is the host's, per prop.
22
+ */
23
+ export interface SectionNavCopy {
24
+ /** The open primary trigger's accessible name, and the sheet's close button. */
25
+ close: string;
26
+ /** A badge's accessible name — "3 pending", for a count of 3. */
27
+ badge: (count: number) => string;
28
+ }
19
29
  /** The breadcrumb's overflow control, in its two spellings. */
20
30
  export interface BreadcrumbCopy {
21
31
  showMore: string;
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/copy/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/copy/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAClC;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -2,7 +2,8 @@
2
2
  * The en-US pack for the navigation family. Split the same way
3
3
  * `pt-BR.navigation.ts` is — see `en-US.ts` for why.
4
4
  */
5
- import type { BreadcrumbCopy, CommandPaletteCopy } from './copy';
5
+ import type { BreadcrumbCopy, CommandPaletteCopy, SectionNavCopy } from './copy';
6
6
  export declare const EN_US_COMMAND_PALETTE_COPY: CommandPaletteCopy;
7
7
  export declare const EN_US_BREADCRUMB_COPY: BreadcrumbCopy;
8
+ export declare const EN_US_SECTION_NAV_COPY: SectionNavCopy;
8
9
  //# sourceMappingURL=en-US.navigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.navigation.d.ts","sourceRoot":"","sources":["../../src/en-US.navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,0BAA0B,EAAE,kBAQxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAGnC,CAAC"}
1
+ {"version":3,"file":"en-US.navigation.d.ts","sourceRoot":"","sources":["../../src/en-US.navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACf,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,0BAA0B,EAAE,kBAQxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAGnC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAGpC,CAAC"}
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import type { DataViewsCopy } from './components/data-display/DataViews/data-views-copy';
21
21
  import type { SavedViewsLabels } from './components/layout/ContentToolbar/ContentToolbar.types';
22
- import type { AddressAutocompleteCopy, AutocompleteCopy, BreadcrumbCopy, CarouselCopy, CategorySelectCopy, CepFieldCopy, ChromeCopy, CodeEditorCopy, CommandPaletteCopy, ConfirmActionCopy, DataGridCopy, DataStateCopy, InstallPromptCopy, LightboxCopy, MapPreviewCopy, PasswordStrengthCopy, PhoneInputCopy, RichEditorToolbarCopy, SectionOnboardingCopy, SettingCardCopy, SettingSwitchCopy, SocialLoginCopy, TableFilterCopy, TimingDiagramCopy, TutorialCopy, UploadButtonCopy, UserAvatarCopy } from "./copy";
22
+ import type { AddressAutocompleteCopy, AutocompleteCopy, BreadcrumbCopy, CarouselCopy, CategorySelectCopy, CepFieldCopy, ChromeCopy, CodeEditorCopy, CommandPaletteCopy, SectionNavCopy, ConfirmActionCopy, DataGridCopy, DataStateCopy, InstallPromptCopy, LightboxCopy, MapPreviewCopy, PasswordStrengthCopy, PhoneInputCopy, RichEditorToolbarCopy, SectionOnboardingCopy, SettingCardCopy, SettingSwitchCopy, SocialLoginCopy, TableFilterCopy, TimingDiagramCopy, TutorialCopy, UploadButtonCopy, UserAvatarCopy } from "./copy";
23
23
  type LocalePack<T> = {
24
24
  readonly 'pt-BR': T;
25
25
  readonly 'en-US': T;
@@ -45,6 +45,7 @@ export declare const TABLE_FILTER_COPY: LocalePack<TableFilterCopy>;
45
45
  export declare const SETTING_CARD_COPY: LocalePack<SettingCardCopy>;
46
46
  export declare const SETTING_SWITCH_COPY: LocalePack<SettingSwitchCopy>;
47
47
  export declare const COMMAND_PALETTE_COPY: LocalePack<CommandPaletteCopy>;
48
+ export declare const SECTION_NAV_COPY: LocalePack<SectionNavCopy>;
48
49
  export declare const BREADCRUMB_COPY: LocalePack<BreadcrumbCopy>;
49
50
  export declare const SECTION_ONBOARDING_COPY: LocalePack<SectionOnboardingCopy>;
50
51
  export declare const CONFIRM_ACTION_COPY: LocalePack<ConfirmActionCopy>;
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/locales.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yDAAyD,CAAC;AAChG,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,QAAQ,CAAC;AAIhB,KAAK,UAAU,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAKlE,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,eAAe,2BAG3B,CAAC;AACF,eAAO,MAAM,cAAc,0BAAuE,CAAC;AACnG,eAAO,MAAM,eAAe,2BAG3B,CAAC;AAGF,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,WAAW,wBAA+D,CAAC;AAGxF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,yBAAyB,qCAGrC,CAAC;AACF,eAAO,MAAM,iBAAiB,8BAG7B,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,sBAAsB,kCAGlC,CAAC;AACF,eAAO,MAAM,wBAAwB,mCAGpC,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,kBAAkB,8BAG9B,CAAC;AAGF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AAGF,eAAO,MAAM,oBAAoB,gCAGhC,CAAC;AACF,eAAO,MAAM,eAAe,4BAG3B,CAAC;AAGF,eAAO,MAAM,uBAAuB,mCAGnC,CAAC;AACF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,oBAAoB,gCAGhC,CAAC;AACF,eAAO,MAAM,cAAc,0BAAuE,CAAC;AACnG,eAAO,MAAM,kBAAkB,8BAG9B,CAAC;AAGF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/locales.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yDAAyD,CAAC;AAChG,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,QAAQ,CAAC;AAIhB,KAAK,UAAU,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAKlE,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,eAAe,2BAG3B,CAAC;AACF,eAAO,MAAM,cAAc,0BAAuE,CAAC;AACnG,eAAO,MAAM,eAAe,2BAG3B,CAAC;AAGF,eAAO,MAAM,aAAa,0BAAqE,CAAC;AAChG,eAAO,MAAM,WAAW,wBAA+D,CAAC;AAGxF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,yBAAyB,qCAGrC,CAAC;AACF,eAAO,MAAM,iBAAiB,8BAG7B,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,sBAAsB,kCAGlC,CAAC;AACF,eAAO,MAAM,wBAAwB,mCAGpC,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,kBAAkB,8BAG9B,CAAC;AAGF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,iBAAiB,6BAG7B,CAAC;AACF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AAGF,eAAO,MAAM,oBAAoB,gCAGhC,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC;AACF,eAAO,MAAM,eAAe,4BAG3B,CAAC;AAGF,eAAO,MAAM,uBAAuB,mCAGnC,CAAC;AACF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,oBAAoB,gCAGhC,CAAC;AACF,eAAO,MAAM,cAAc,0BAAuE,CAAC;AACnG,eAAO,MAAM,kBAAkB,8BAG9B,CAAC;AAGF,eAAO,MAAM,mBAAmB,+BAG/B,CAAC;AACF,eAAO,MAAM,gBAAgB,4BAG5B,CAAC"}
@@ -2,7 +2,8 @@
2
2
  * The pt-BR pack for the navigation family. Split out of `pt-BR.ts`, which is a
3
3
  * barrel over this folder — see that file for why.
4
4
  */
5
- import type { BreadcrumbCopy, CommandPaletteCopy } from './copy';
5
+ import type { BreadcrumbCopy, CommandPaletteCopy, SectionNavCopy } from './copy';
6
6
  export declare const PT_BR_COMMAND_PALETTE_COPY: CommandPaletteCopy;
7
7
  export declare const PT_BR_BREADCRUMB_COPY: BreadcrumbCopy;
8
+ export declare const PT_BR_SECTION_NAV_COPY: SectionNavCopy;
8
9
  //# sourceMappingURL=pt-BR.navigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.navigation.d.ts","sourceRoot":"","sources":["../../src/pt-BR.navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,0BAA0B,EAAE,kBAMxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAGnC,CAAC"}
1
+ {"version":3,"file":"pt-BR.navigation.d.ts","sourceRoot":"","sources":["../../src/pt-BR.navigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACf,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,0BAA0B,EAAE,kBAMxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAGnC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAGpC,CAAC"}
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-O6IF4BZT.js";
4
+ } from "./chunk-UUJ7J7NE.js";
5
5
  import "./chunk-UDQSIRAP.js";
6
- import "./chunk-NYFGFELX.js";
7
- import "./chunk-3ZVUNSFF.js";
6
+ import "./chunk-PGPPN63I.js";
8
7
  import "./chunk-TNQDSTIA.js";
9
8
  import "./chunk-6ZZGK5DT.js";
9
+ import "./chunk-3ZVUNSFF.js";
10
10
  import "./chunk-MTEQEPNY.js";
11
11
  import "./chunk-VUHLNYAE.js";
12
12
  import "./chunk-2GSIEDGN.js";
13
- import "./chunk-WN5PNP6F.js";
14
- import "./chunk-FKUYRQSP.js";
13
+ import "./chunk-OP5JR5Q5.js";
15
14
  import "./chunk-76X6JRVI.js";
15
+ import "./chunk-FKUYRQSP.js";
16
16
  import "./chunk-JH7EEJEQ.js";
17
17
  import "./chunk-BA4RHQ3B.js";
18
18
  import "./chunk-K6LNHHSH.js";
@@ -1,9 +1,9 @@
1
1
  import "../chunk-H7NA4TXY.js";
2
2
  import {
3
3
  InfiniteScroll
4
- } from "../chunk-HNFZLXZI.js";
5
- import "../chunk-Y2X7LYIN.js";
4
+ } from "../chunk-HBP2OU4Q.js";
6
5
  import "../chunk-5KNDAC24.js";
6
+ import "../chunk-Y2X7LYIN.js";
7
7
  import "../chunk-YKCAJ2TN.js";
8
8
  import "../chunk-PZ5AY32C.js";
9
9
  export {
@@ -1,11 +1,11 @@
1
1
  import "../chunk-3QQVEYOR.js";
2
2
  import {
3
3
  InstallPrompt
4
- } from "../chunk-5ZOJLYD2.js";
5
- import "../chunk-GY62N32G.js";
4
+ } from "../chunk-JE6RZ5L6.js";
6
5
  import {
7
6
  usePwaInstall
8
7
  } from "../chunk-5GMHJ7Y5.js";
8
+ import "../chunk-GY62N32G.js";
9
9
  import "../chunk-WXYLH3QZ.js";
10
10
  import {
11
11
  PWA_INSTALL_AVAILABLE_EVENT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.44.3",
3
+ "version": "6.45.1",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -608,6 +608,10 @@
608
608
  "types": "./dist/types/components/navigation/Pagination/index.d.ts",
609
609
  "default": "./dist/navigation/Pagination.js"
610
610
  },
611
+ "./navigation/SectionNav": {
612
+ "types": "./dist/types/components/navigation/SectionNav/index.d.ts",
613
+ "default": "./dist/navigation/SectionNav.js"
614
+ },
611
615
  "./navigation/Tabs": {
612
616
  "types": "./dist/types/components/navigation/Tabs/index.d.ts",
613
617
  "default": "./dist/navigation/Tabs.js"
@@ -105,29 +105,148 @@ const useEscapeKey = (active: boolean, onEscape: () => void) => {
105
105
  * backdrop, which `pointer-events: none` on the popover root (so the page
106
106
  * under an open card stays usable) takes out of play. So this listens on the
107
107
  * document itself, in the CAPTURE phase, where a `stopPropagation` further in
108
- * cannot swallow it. It only observes: no `preventDefault`, so the tap or
109
- * click still reaches whatever it landed on. Attached while open, removed on
110
- * close and on unmount.
108
+ * — including one a nested control (or something entirely unrelated to the
109
+ * card) calls on its OWN bubble — cannot swallow it (FUT-2776 adversarial
110
+ * review: a bubble-phase listener here was tried and reverted; see below).
111
+ * It only observes: no `preventDefault`, so the tap or click still reaches
112
+ * whatever it landed on. Attached while open, removed on close and on
113
+ * unmount.
114
+ *
115
+ * That capture placement is exactly what makes the decision impossible to
116
+ * make SYNCHRONOUSLY: `document` is the outermost node on the capture path,
117
+ * so this handler fires before React's own capture dispatch even starts —
118
+ * before `useCardOwnership`'s marker on the card's content root (also
119
+ * capture, but on a node further down the same tree) has had a chance to run
120
+ * for this same event. So the decision is deferred — but NOT to a microtask:
121
+ * a microtask here reads the marker before it is set for TRUSTED input (a
122
+ * real press, or Playwright's `page.mouse`), which is the very bug this hook
123
+ * exists to fix (FUT-2776, third-review adversarial probe, measured with
124
+ * real Chromium and `page.mouse.down()`):
125
+ *
126
+ * TRUSTED: doc-capture-sync → doc-capture-microtask (marker unset) → inner-capture (sets marker)
127
+ * SCRIPT: doc-capture-sync → inner-capture (sets marker) → doc-capture-microtask (marker set)
128
+ *
129
+ * Chromium runs any microtasks queued by a capture-phase listener BEFORE
130
+ * dispatching to the next listener on the path when the event is trusted —
131
+ * so a microtask queued here runs before `useCardOwnership`'s capture
132
+ * listener further down the tree ever gets a turn, and the ownership check
133
+ * always reads empty. A script-dispatched event (`fireEvent`, `userEvent` in
134
+ * jsdom, or in a Storybook `play` function) instead completes its WHOLE
135
+ * capture-then-bubble dispatch before any microtask runs — which is why
136
+ * every test under the microtask version passed and the bug still shipped.
137
+ * A macrotask (`setTimeout(0)`) is not part of the event dispatch under
138
+ * EITHER kind of input, so it always runs after the whole dispatch — marker
139
+ * included — regardless of trusted vs. script. That ordering is what this
140
+ * hook now relies on.
141
+ *
142
+ * `sessionRef` replaces a plain boolean: it is a fresh object assigned each
143
+ * time the card opens (this effect's mount), so a `setTimeout` callback
144
+ * queued for a press during one open session can tell whether it is still
145
+ * that SAME session by comparing against the ref, not just whether the card
146
+ * happens to be open again — the card closing and reopening while a stale
147
+ * timeout is still pending must not let that timeout act on the new session.
148
+ * Every scheduled timeout is also tracked so a close or unmount can cancel
149
+ * whatever is still pending, rather than letting it fire against a card that
150
+ * is no longer there to close.
111
151
  */
112
152
  const useClickAway = (
113
153
  active: boolean,
114
154
  inside: () => ReadonlyArray<Element | null>,
155
+ ownsEvent: (event: Event) => boolean,
115
156
  onAway: () => void,
116
157
  ) => {
158
+ const sessionRef = React.useRef<object | null>(null);
159
+ const pendingRef = React.useRef<Set<number>>(new Set());
160
+
117
161
  React.useEffect(() => {
118
- if (!active) return;
162
+ if (!active) return undefined;
163
+
164
+ const session = {};
165
+ sessionRef.current = session;
119
166
 
120
167
  const handlePointerDown = (event: globalThis.PointerEvent) => {
121
- const target = event.target as Node | null;
122
- if (target && inside().some((el) => el?.contains(target))) return;
123
- onAway();
168
+ const timeoutId = window.setTimeout(() => {
169
+ pendingRef.current.delete(timeoutId);
170
+ // Stale: this session closed (or a newer one opened) before this
171
+ // press's decision could run.
172
+ if (sessionRef.current !== session) return;
173
+
174
+ const target = event.target as Node | null;
175
+ const ownedByReactTree = ownsEvent(event);
176
+ const ownedByDom = Boolean(target) && inside().some((el) => el?.contains(target));
177
+ if (ownedByReactTree || ownedByDom) return;
178
+ onAway();
179
+ }, 0);
180
+ pendingRef.current.add(timeoutId);
124
181
  };
125
182
 
126
183
  document.addEventListener('pointerdown', handlePointerDown, true);
127
- return () => document.removeEventListener('pointerdown', handlePointerDown, true);
128
- }, [active, inside, onAway]);
184
+ return () => {
185
+ sessionRef.current = null;
186
+ pendingRef.current.forEach((id) => window.clearTimeout(id));
187
+ pendingRef.current.clear();
188
+ document.removeEventListener('pointerdown', handlePointerDown, true);
189
+ };
190
+ }, [active, inside, ownsEvent, onAway]);
129
191
  };
130
192
 
193
+ /**
194
+ * Whether the pointerdown `useClickAway` is about to look at started inside
195
+ * the card's OWN React tree — a MUI `Select`'s menu, a nested `Popover`, a
196
+ * `DropdownMenu` the card's `content` renders — even when that control's DOM
197
+ * node is not a descendant of the card's box at all, because it portalled
198
+ * itself out near `document.body` (FUT-2776).
199
+ *
200
+ * React re-parents a portal's events to bubble AND capture through its OWNING
201
+ * React tree, not the DOM tree it renders into (see the React docs on
202
+ * `createPortal`), so an `onPointerDownCapture` on the card's own content root
203
+ * still fires for a press inside a portal the card's content renders, and
204
+ * NEVER fires for a press inside an unrelated one mounted by something that
205
+ * is not a descendant of the card in the REACT tree — ownership, not timing.
206
+ * That is the whole fix: the ORIGINAL approach (a `MutationObserver` on
207
+ * `document.body`) treated ANY element appended to the body while the card
208
+ * was open as inside, so an unrelated Snackbar, dev overlay or Popover that
209
+ * happened to mount at the same time stopped closing the card too.
210
+ *
211
+ * Tracked per NATIVE EVENT OBJECT in a `WeakSet`, not a boolean flag: a
212
+ * boolean stayed `true` forever once a press set it whose NATIVE propagation
213
+ * then got stopped before reaching `useClickAway`'s own (bubble-phase, in
214
+ * that earlier revision) listener — common for anything that treats the
215
+ * press as its own gesture — so the marker never got consumed, and the
216
+ * NEXT, genuinely outside press read a STALE `true` and stayed open
217
+ * (FUT-2776, caught on adversarial review of the first fix here). Keying on
218
+ * the event itself instead needs no consuming step and cannot go stale: a
219
+ * `WeakSet` entry only ever answers for the ONE dispatch that created it,
220
+ * and nothing outside this closure keeps a reference to a past pointerdown
221
+ * once `useClickAway`'s deferred (`setTimeout(0)`, not a microtask — see that
222
+ * hook for why) check for it has run, so the entry is simply garbage from
223
+ * then on.
224
+ */
225
+ const useCardOwnership = () => {
226
+ const ownedEventsRef = React.useRef<WeakSet<Event>>(new WeakSet());
227
+
228
+ const markInside = React.useCallback((event: React.PointerEvent<HTMLElement>) => {
229
+ ownedEventsRef.current.add(event.nativeEvent);
230
+ }, []);
231
+
232
+ const ownsEvent = React.useCallback(
233
+ (event: Event) => ownedEventsRef.current.has(event),
234
+ [],
235
+ );
236
+
237
+ return { markInside, ownsEvent };
238
+ };
239
+
240
+ /** The trigger and the card's own box — a plain DOM containment check. */
241
+ const useInsideCard = (
242
+ anchorEl: HTMLElement | null,
243
+ contentRef: React.MutableRefObject<HTMLDivElement | null>,
244
+ ) =>
245
+ React.useCallback(
246
+ () => [anchorEl, contentRef.current],
247
+ [anchorEl, contentRef],
248
+ );
249
+
131
250
  /** Whatever is still pending when the card unmounts is cancelled with it. */
132
251
  const useClearOnUnmount = (...refs: TimerRef[]) => {
133
252
  React.useEffect(
@@ -146,34 +265,22 @@ interface HoverCardTimingInput {
146
265
  onClose?: () => void;
147
266
  }
148
267
 
268
+ type VisibilityInput = Omit<HoverCardTimingInput, 'touchEnabled'>;
269
+
149
270
  /**
150
- * When the card is open, and the delays that decide it.
271
+ * The open/close state and its two timers, split out of `useHoverCard` so
272
+ * that composing it with click-away, escape and ownership reads as one flat
273
+ * list rather than one long function.
151
274
  *
152
- * Three timers are in play: the enter delay before opening, the exit delay
153
- * before closing (so the pointer can travel from the trigger onto the card
154
- * without dismissing it), and the long-press timer on touch. Each cancels the
155
- * others' pending work, which is why they live together.
275
+ * The enter delay before opening and the exit delay before closing (so the
276
+ * pointer can travel from the trigger onto the card without dismissing it)
277
+ * each cancel the other's pending work, which is why they live together.
156
278
  */
157
- export const useHoverCard = ({
158
- disabled,
159
- touchEnabled,
160
- enterDelay,
161
- exitDelay,
162
- onOpen,
163
- onClose,
164
- }: HoverCardTimingInput) => {
279
+ const useCardVisibility = ({ disabled, enterDelay, exitDelay, onOpen, onClose }: VisibilityInput) => {
165
280
  const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);
166
281
  const [isOpen, setIsOpen] = React.useState(false);
167
- const [isTouchDevice, setIsTouchDevice] = React.useState(false);
168
282
  const enterTimeoutRef = React.useRef<number | undefined>(undefined);
169
283
  const exitTimeoutRef = React.useRef<number | undefined>(undefined);
170
- /** The card's own box, inside the popover paper: a press here is not "away". */
171
- const contentRef = React.useRef<HTMLDivElement | null>(null);
172
-
173
- // Probed in an effect, not during render, so SSR and hydration stay intact.
174
- React.useEffect(() => {
175
- setIsTouchDevice('ontouchstart' in window);
176
- }, []);
177
284
 
178
285
  const openCard = React.useCallback(
179
286
  (trigger: HTMLElement) => {
@@ -216,6 +323,29 @@ export const useHoverCard = ({
216
323
  onClose?.();
217
324
  }, [onClose]);
218
325
 
326
+ return { anchorEl, isOpen, openCard, closeCard, handleClose, enterTimeoutRef, exitTimeoutRef };
327
+ };
328
+
329
+ export const useHoverCard = ({
330
+ disabled,
331
+ touchEnabled,
332
+ enterDelay,
333
+ exitDelay,
334
+ onOpen,
335
+ onClose,
336
+ }: HoverCardTimingInput) => {
337
+ const [isTouchDevice, setIsTouchDevice] = React.useState(false);
338
+ /** The card's own box, inside the popover paper: a press here is not "away". */
339
+ const contentRef = React.useRef<HTMLDivElement | null>(null);
340
+
341
+ const { anchorEl, isOpen, openCard, closeCard, handleClose, enterTimeoutRef, exitTimeoutRef } =
342
+ useCardVisibility({ disabled, enterDelay, exitDelay, onOpen, onClose });
343
+
344
+ // Probed in an effect, not during render, so SSR and hydration stay intact.
345
+ React.useEffect(() => {
346
+ setIsTouchDevice('ontouchstart' in window);
347
+ }, []);
348
+
219
349
  const { triggerHandlers, cardHandlers } = useHoverHandlers({
220
350
  isTouchDevice,
221
351
  touchEnabled,
@@ -225,11 +355,21 @@ export const useHoverCard = ({
225
355
  exitTimeoutRef,
226
356
  });
227
357
 
228
- const insideCard = React.useCallback(() => [anchorEl, contentRef.current], [anchorEl]);
358
+ const insideCard = useInsideCard(anchorEl, contentRef);
359
+ const { markInside, ownsEvent } = useCardOwnership();
229
360
 
230
361
  useEscapeKey(isOpen, handleClose);
231
- useClickAway(isOpen, insideCard, handleClose);
362
+ useClickAway(isOpen, insideCard, ownsEvent, handleClose);
232
363
  useClearOnUnmount(enterTimeoutRef, exitTimeoutRef);
233
364
 
234
- return { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers, contentRef };
365
+ return {
366
+ anchorEl,
367
+ isOpen,
368
+ handleClose,
369
+ triggerHandlers,
370
+ cardHandlers,
371
+ contentRef,
372
+ /** Wire onto the card's content root as `onPointerDownCapture` (FUT-2776). */
373
+ onContentPointerDownCapture: markInside,
374
+ };
235
375
  };
@@ -108,6 +108,7 @@ The HoverCard component displays additional information in a card-style popup wh
108
108
 
109
109
  - The component supports keyboard navigation (Escape key to close)
110
110
  - The card is dismissed by moving the pointer off the trigger and the card (after `exitDelay`), by Escape, or by a tap or click anywhere outside them. The outside press still reaches what it landed on: the page under an open card stays usable
111
+ - Nested portal content is supported: if `children` opens something of its own in a portal — a MUI `Select`'s menu, a nested `Popover`, a `DropdownMenu` — a press inside it counts as inside the card too, so picking an option there does not dismiss the card. No extra wiring is needed for this; it works for anything the card's OWN content renders, portalled or not — ownership is by React tree membership, not by when something happened to mount to `document.body`, so an unrelated portal (a Snackbar, a dev overlay, another component's Popover) that mounts while the card is open is not treated as inside it, and a press there still closes the card like any other outside press
111
112
  - Proper ARIA attributes are applied to the popover
112
113
  - Focus management is handled automatically
113
114
  - Touch support for mobile devices can be enabled/disabled