@12-apps/ui 6.32.0 → 6.33.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 (358) hide show
  1. package/NATIVE.md +1 -1
  2. package/components-guidelines.md +38 -2
  3. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +6 -6
  4. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
  5. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
  6. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +4 -3
  7. package/dist/_internal/components/data-display/Carousel/Carousel.js +7 -6
  8. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +3 -2
  9. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +3 -2
  10. package/dist/_internal/components/data-display/Chart/Chart.js +6 -5
  11. package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -6
  12. package/dist/_internal/components/data-display/Chart/chart-context.js +4 -3
  13. package/dist/_internal/components/data-display/Chart/chart-internals.js +3 -2
  14. package/dist/_internal/components/data-display/Chart/chart-renderers.js +5 -4
  15. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  16. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +21 -21
  17. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +35 -35
  18. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +4 -4
  19. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +8 -8
  20. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +4 -4
  21. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +9 -9
  23. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +4 -4
  24. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +20 -20
  25. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +8 -8
  26. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +1 -1
  27. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +1 -1
  28. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +3 -3
  29. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +11 -11
  30. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +2 -2
  31. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  32. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
  33. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +8 -8
  34. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +4 -4
  35. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +15 -14
  36. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
  37. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  38. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  39. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +5 -5
  40. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
  41. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
  42. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  43. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  44. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +3 -3
  45. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
  46. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +2 -1
  47. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -3
  48. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +3 -2
  49. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  50. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  51. package/dist/_internal/components/data-display/index.js +43 -42
  52. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
  53. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  54. package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
  55. package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
  56. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +1 -1
  57. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +2 -2
  58. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
  59. package/dist/_internal/components/feedback/index.js +13 -13
  60. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
  61. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
  62. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
  63. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +2 -2
  64. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +4 -4
  65. package/dist/_internal/components/form/Command/Command.js +5 -4
  66. package/dist/_internal/components/form/Command/Command.styles.js +3 -2
  67. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +3 -3
  68. package/dist/_internal/components/form/Label/Label.js +4 -3
  69. package/dist/_internal/components/form/Label/Label.styles.js +3 -2
  70. package/dist/_internal/components/form/Menubar/Menubar.item.js +4 -3
  71. package/dist/_internal/components/form/Menubar/Menubar.js +6 -5
  72. package/dist/_internal/components/form/Menubar/Menubar.styles.js +3 -2
  73. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +5 -4
  74. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  75. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
  76. package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
  77. package/dist/_internal/components/form/UploadButton/UploadButton.parts.js +1 -1
  78. package/dist/_internal/components/form/index.js +26 -25
  79. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +5 -5
  80. package/dist/_internal/components/form/total-form/Fields/index.js +9 -9
  81. package/dist/_internal/components/index.js +92 -91
  82. package/dist/_internal/components/layout/Box/Box.js +5 -4
  83. package/dist/_internal/components/layout/Separator/Separator.js +2 -2
  84. package/dist/_internal/components/layout/Separator/Separator.styles.js +3 -1
  85. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js +1 -1
  86. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +3 -3
  87. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js +2 -2
  88. package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
  89. package/dist/_internal/components/layout/Stack/Stack.js +6 -5
  90. package/dist/_internal/components/layout/index.js +7 -7
  91. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +8 -7
  92. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +3 -2
  93. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
  94. package/dist/_internal/components/navigation/index.js +11 -10
  95. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
  96. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
  97. package/dist/_internal/components/utility/index.js +4 -4
  98. package/dist/_internal/icons/Icon.js +5 -4
  99. package/dist/_internal/provider/UiProvider.js +4 -3
  100. package/dist/_internal/provider/mui-bridge.js +3 -2
  101. package/dist/_internal/provider/use-ui-theme.js +4 -3
  102. package/dist/_internal/social-login-button/social-login-button.js +3 -3
  103. package/dist/_internal/tokens/relative.js +16 -0
  104. package/dist/_internal/tokens/relative.js.map +1 -0
  105. package/dist/charts.js +7 -6
  106. package/dist/{chunk-WQSL6MCA.js → chunk-23FCBIUN.js} +4 -4
  107. package/dist/{chunk-HTZYFGYE.js → chunk-25R3ITGZ.js} +5 -5
  108. package/dist/{chunk-HZXCTLNI.js → chunk-3IYB3XY2.js} +2 -2
  109. package/dist/{chunk-EIGELK2H.js → chunk-3P4THDBM.js} +4 -4
  110. package/dist/{chunk-WMALDOF5.js → chunk-3QNSTLGC.js} +2 -2
  111. package/dist/{chunk-SJIBPRPB.js → chunk-3T2I6BYA.js} +4 -4
  112. package/dist/{chunk-OP6F3NXX.js → chunk-4IVOHL32.js} +2 -2
  113. package/dist/{chunk-NFLY5JMP.js → chunk-4LMY5I5E.js} +2 -2
  114. package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
  115. package/dist/{chunk-2W4GTZDP.js → chunk-4V7FNB7R.js} +2 -2
  116. package/dist/{chunk-A2QZXV2K.js → chunk-4YMIQ5DM.js} +2 -2
  117. package/dist/{chunk-YCNKH5P6.js → chunk-56MKBXSH.js} +3 -3
  118. package/dist/{chunk-MSXNA3UH.js → chunk-57C636A6.js} +3 -3
  119. package/dist/{chunk-KG4VNCNO.js → chunk-5SCZZFZR.js} +4 -4
  120. package/dist/{chunk-C6R4LVUX.js → chunk-6AN23E37.js} +2 -2
  121. package/dist/{chunk-OOGKAFBU.js → chunk-6ANWFGLL.js} +4 -4
  122. package/dist/{chunk-BM4LH7VQ.js → chunk-7N4V3ARN.js} +4 -4
  123. package/dist/{chunk-YD77RANW.js → chunk-7VN7LFBA.js} +5 -5
  124. package/dist/{chunk-7JO3ES5P.js → chunk-A4JH5FAL.js} +2 -2
  125. package/dist/{chunk-VI7YYAXV.js → chunk-AJVYJZHI.js} +3 -3
  126. package/dist/{chunk-EZOVSZ5B.js → chunk-ANNDLY3M.js} +4 -4
  127. package/dist/{chunk-PXH24VIP.js → chunk-B6IURHSZ.js} +4 -4
  128. package/dist/{chunk-TCLBB7U4.js → chunk-BM4CGQED.js} +3 -3
  129. package/dist/{chunk-JAYWTSXX.js → chunk-C423YJGN.js} +7 -7
  130. package/dist/{chunk-IFPTVHYR.js → chunk-CAHWCSRE.js} +8 -4
  131. package/dist/chunk-CAHWCSRE.js.map +1 -0
  132. package/dist/{chunk-E6D2Y5EK.js → chunk-CMN26J5Y.js} +2 -2
  133. package/dist/{chunk-RP3W6IQO.js → chunk-CPNSVIIB.js} +5 -5
  134. package/dist/{chunk-O4C5LUTJ.js → chunk-EDJDASXE.js} +4 -4
  135. package/dist/{chunk-BUXSHLQM.js → chunk-EE44OC4M.js} +3 -3
  136. package/dist/{chunk-ENUWZ3HW.js → chunk-EEAQBPOW.js} +2 -2
  137. package/dist/{chunk-TC3EPGGJ.js → chunk-EUDIQQWE.js} +2 -2
  138. package/dist/{chunk-5U4SJ2DA.js → chunk-FHA4G5XF.js} +4 -4
  139. package/dist/{chunk-R2I3LUUH.js → chunk-FTCCYWF4.js} +2 -2
  140. package/dist/{chunk-4D7YIU34.js → chunk-G3KSCJS7.js} +7 -7
  141. package/dist/{chunk-IYSQRTIX.js → chunk-G73SDZ3T.js} +2 -2
  142. package/dist/{chunk-YZKA7UJK.js → chunk-GCWF5AQE.js} +2 -2
  143. package/dist/{chunk-X4GALW6I.js → chunk-GJKBWVU2.js} +2 -2
  144. package/dist/{chunk-WROCSDVL.js → chunk-GSFNH4C5.js} +5 -5
  145. package/dist/{chunk-AZUFGKMQ.js → chunk-HJOABXKN.js} +4 -4
  146. package/dist/{chunk-3AOOI2NR.js → chunk-HR7YTBR7.js} +4 -4
  147. package/dist/{chunk-56S7A2XT.js → chunk-IFAEKIT2.js} +5 -5
  148. package/dist/{chunk-MGP5LLEK.js → chunk-IGO5DC7D.js} +4 -4
  149. package/dist/{chunk-NLBIG5LU.js → chunk-IZBDSPTW.js} +2 -2
  150. package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
  151. package/dist/{chunk-Q2GZMDZL.js → chunk-JO5GSRYQ.js} +3 -3
  152. package/dist/{chunk-DZXN3QCX.js → chunk-JRHZZTVV.js} +5 -5
  153. package/dist/{chunk-DVEYD27F.js → chunk-JXNT5TUP.js} +2 -2
  154. package/dist/{chunk-M7HX3HKW.js → chunk-K2XK45HG.js} +6 -6
  155. package/dist/{chunk-JPNPXNFH.js → chunk-K7BBMXY7.js} +2 -2
  156. package/dist/{chunk-2DJIS2WQ.js → chunk-KCBAPMLH.js} +2 -2
  157. package/dist/{chunk-HQZRWOSS.js → chunk-KJHQYPKT.js} +2 -2
  158. package/dist/{chunk-DAQ2ZDU2.js → chunk-LE7IHEU4.js} +2 -2
  159. package/dist/{chunk-3Z23QTCP.js → chunk-LLR42S6B.js} +5 -5
  160. package/dist/{chunk-B4BU5CS6.js → chunk-LZHXF66R.js} +2 -2
  161. package/dist/{chunk-C5WSPGMP.js → chunk-MDR4WJOV.js} +2 -2
  162. package/dist/{chunk-U3ON6YW3.js → chunk-NNAACCN2.js} +2 -2
  163. package/dist/{chunk-D6HDJVQW.js → chunk-O4PKQ46C.js} +31 -20
  164. package/dist/chunk-O4PKQ46C.js.map +1 -0
  165. package/dist/{chunk-5KZR3RXL.js → chunk-OFVYNUYV.js} +2 -2
  166. package/dist/{chunk-DDTPMZOB.js → chunk-PI5G6N6Q.js} +3 -3
  167. package/dist/{chunk-7MM2I34E.js → chunk-PJ7NKK33.js} +3 -3
  168. package/dist/{chunk-IGAXQRRZ.js → chunk-PLEZDLVU.js} +2 -2
  169. package/dist/{chunk-XY6KOMRN.js → chunk-PPTF5X7K.js} +6 -6
  170. package/dist/{chunk-Q2NOONAN.js → chunk-PRVK3U6U.js} +4 -2
  171. package/dist/{chunk-Q2NOONAN.js.map → chunk-PRVK3U6U.js.map} +1 -1
  172. package/dist/{chunk-MCZ7536N.js → chunk-Q4CAZ2TP.js} +7 -6
  173. package/dist/chunk-Q4CAZ2TP.js.map +1 -0
  174. package/dist/{chunk-XO27IMBE.js → chunk-QWCMLOYC.js} +2 -2
  175. package/dist/{chunk-NBBFFPTA.js → chunk-R2G4MVPY.js} +2 -2
  176. package/dist/{chunk-5KEMPCW4.js → chunk-RGCRXDGZ.js} +8 -4
  177. package/dist/{chunk-5KEMPCW4.js.map → chunk-RGCRXDGZ.js.map} +1 -1
  178. package/dist/{chunk-KCFCEWF7.js → chunk-RJXRZW66.js} +2 -2
  179. package/dist/{chunk-3CN2GBIK.js → chunk-RPMAWM6F.js} +2 -2
  180. package/dist/{chunk-HEVST4CS.js → chunk-SGGDMTKP.js} +2 -2
  181. package/dist/{chunk-H4NWU2ZN.js → chunk-TK36COCP.js} +2 -2
  182. package/dist/{chunk-5NH24MF5.js → chunk-TUYN6XZI.js} +5 -5
  183. package/dist/{chunk-BGYLL467.js → chunk-TXHJX2NG.js} +4 -4
  184. package/dist/{chunk-X4HGBK4G.js → chunk-U7Q2Y6WG.js} +2 -2
  185. package/dist/{chunk-GSWDQ3ZX.js → chunk-UMQN3BVV.js} +2 -2
  186. package/dist/{chunk-3NA7AO6H.js → chunk-URWNRC2P.js} +5 -5
  187. package/dist/{chunk-JSANSHGF.js → chunk-UTSGY3ON.js} +8 -5
  188. package/dist/chunk-UTSGY3ON.js.map +1 -0
  189. package/dist/{chunk-AZ2KKHID.js → chunk-VF2XC76U.js} +2 -2
  190. package/dist/{chunk-T5MOGJ56.js → chunk-VQBINZB7.js} +2 -2
  191. package/dist/{chunk-V3WWNKHU.js → chunk-W7HSGZGW.js} +6 -6
  192. package/dist/{chunk-T53L42XW.js → chunk-WJH743NG.js} +8 -8
  193. package/dist/{chunk-6ZZNV2PA.js → chunk-X2IJI2BG.js} +2 -2
  194. package/dist/{chunk-7NFRTAEU.js → chunk-X2QLWUND.js} +2 -2
  195. package/dist/{chunk-3DO5MFXA.js → chunk-XCP5L665.js} +1 -1
  196. package/dist/chunk-XCP5L665.js.map +1 -0
  197. package/dist/{chunk-TN55JKIU.js → chunk-XI2BXMBX.js} +2 -2
  198. package/dist/{chunk-TTW4MAOJ.js → chunk-XPOQZI5X.js} +4 -4
  199. package/dist/{chunk-H3TNIGMI.js → chunk-XYXTEGIM.js} +2 -2
  200. package/dist/{chunk-GLWW2XCP.js → chunk-YJ4HM25H.js} +2 -2
  201. package/dist/chunk-YKCAJ2TN.js +47 -0
  202. package/dist/chunk-YKCAJ2TN.js.map +1 -0
  203. package/dist/{chunk-2UYR2OOE.js → chunk-YRUCIKPO.js} +4 -4
  204. package/dist/{chunk-5SBJO37T.js → chunk-ZA4U5GDU.js} +3 -3
  205. package/dist/{chunk-XM6WEANW.js → chunk-ZNJ4RLZT.js} +4 -4
  206. package/dist/data-display/AsyncStateContainer.js +6 -6
  207. package/dist/data-display/CardKit.js +10 -10
  208. package/dist/data-display/Carousel.js +7 -6
  209. package/dist/data-display/Chart.js +7 -6
  210. package/dist/data-display/DataGrid.js +2 -2
  211. package/dist/data-display/DataViews.js +38 -38
  212. package/dist/data-display/EmptyState.js +2 -2
  213. package/dist/data-display/FleetMap.js +15 -14
  214. package/dist/data-display/InteractiveTooltip.js +2 -2
  215. package/dist/data-display/LazyImage.js +3 -3
  216. package/dist/data-display/Lightbox.js +5 -5
  217. package/dist/data-display/LoadingState.js +3 -3
  218. package/dist/data-display/MapPreview.js +3 -3
  219. package/dist/data-display/SectionOnboarding.js +3 -3
  220. package/dist/data-display/Sheet.js +4 -3
  221. package/dist/data-display/StatCard.js +3 -3
  222. package/dist/data-display/Table.js +2 -2
  223. package/dist/feedback/ConfirmAction.js +6 -6
  224. package/dist/feedback/Dialog.js +3 -3
  225. package/dist/feedback/NotificationStatusNotice.js +2 -2
  226. package/dist/feedback/StackedModal.js +2 -2
  227. package/dist/form/AddressAutocomplete.js +5 -5
  228. package/dist/form/CategorySelect.js +4 -4
  229. package/dist/form/Command.js +5 -4
  230. package/dist/form/DateRangePicker.js +5 -5
  231. package/dist/form/Label.js +4 -3
  232. package/dist/form/Menubar.js +6 -5
  233. package/dist/form/PhoneInput.js +3 -3
  234. package/dist/form/UploadButton.js +2 -2
  235. package/dist/form/total-form.js +10 -10
  236. package/dist/icons.js +5 -4
  237. package/dist/layout/Box.js +5 -4
  238. package/dist/layout/ContentToolbar.js +3 -3
  239. package/dist/layout/Separator.js +2 -2
  240. package/dist/layout/SettingsLayout.js +3 -3
  241. package/dist/layout/Skeleton.js +2 -2
  242. package/dist/layout/Stack.js +6 -5
  243. package/dist/navigation/AppHeader.js +9 -8
  244. package/dist/navigation/CommandPalette.js +2 -2
  245. package/dist/provider.js +5 -4
  246. package/dist/social-login-button.js +3 -3
  247. package/dist/tokens.js +14 -2
  248. package/dist/types/components/feedback/Dialog/Dialog.d.ts.map +1 -1
  249. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
  250. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts.map +1 -1
  251. package/dist/types/components/layout/Separator/Separator.d.ts.map +1 -1
  252. package/dist/types/components/layout/Separator/Separator.styles.d.ts +10 -0
  253. package/dist/types/components/layout/Separator/Separator.styles.d.ts.map +1 -1
  254. package/dist/types/components/layout/SettingsLayout/SettingsLayout.items.d.ts.map +1 -1
  255. package/dist/types/tokens/relative.d.ts +55 -0
  256. package/dist/types/tokens/relative.d.ts.map +1 -0
  257. package/dist/types/tokens/scales.d.ts +1 -0
  258. package/dist/types/tokens/scales.d.ts.map +1 -1
  259. package/dist/utility/InfiniteScroll.js +2 -2
  260. package/dist/utility/InstallPrompt.js +2 -2
  261. package/package.json +1 -1
  262. package/src/components/feedback/Dialog/Dialog.styles.ts +7 -3
  263. package/src/components/feedback/Dialog/Dialog.tsx +40 -14
  264. package/src/components/form/UploadButton/UploadButton.parts.tsx +15 -4
  265. package/src/components/layout/Separator/Separator.styles.ts +20 -5
  266. package/src/components/layout/Separator/Separator.tsx +7 -4
  267. package/src/components/layout/SettingsLayout/SettingsLayout.items.tsx +3 -1
  268. package/src/tokens/relative.ts +107 -0
  269. package/src/tokens/scales.ts +2 -0
  270. package/dist/chunk-3DO5MFXA.js.map +0 -1
  271. package/dist/chunk-D6HDJVQW.js.map +0 -1
  272. package/dist/chunk-IFPTVHYR.js.map +0 -1
  273. package/dist/chunk-JSANSHGF.js.map +0 -1
  274. package/dist/chunk-MCZ7536N.js.map +0 -1
  275. /package/dist/{chunk-WQSL6MCA.js.map → chunk-23FCBIUN.js.map} +0 -0
  276. /package/dist/{chunk-HTZYFGYE.js.map → chunk-25R3ITGZ.js.map} +0 -0
  277. /package/dist/{chunk-HZXCTLNI.js.map → chunk-3IYB3XY2.js.map} +0 -0
  278. /package/dist/{chunk-EIGELK2H.js.map → chunk-3P4THDBM.js.map} +0 -0
  279. /package/dist/{chunk-WMALDOF5.js.map → chunk-3QNSTLGC.js.map} +0 -0
  280. /package/dist/{chunk-SJIBPRPB.js.map → chunk-3T2I6BYA.js.map} +0 -0
  281. /package/dist/{chunk-OP6F3NXX.js.map → chunk-4IVOHL32.js.map} +0 -0
  282. /package/dist/{chunk-NFLY5JMP.js.map → chunk-4LMY5I5E.js.map} +0 -0
  283. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
  284. /package/dist/{chunk-2W4GTZDP.js.map → chunk-4V7FNB7R.js.map} +0 -0
  285. /package/dist/{chunk-A2QZXV2K.js.map → chunk-4YMIQ5DM.js.map} +0 -0
  286. /package/dist/{chunk-YCNKH5P6.js.map → chunk-56MKBXSH.js.map} +0 -0
  287. /package/dist/{chunk-MSXNA3UH.js.map → chunk-57C636A6.js.map} +0 -0
  288. /package/dist/{chunk-KG4VNCNO.js.map → chunk-5SCZZFZR.js.map} +0 -0
  289. /package/dist/{chunk-C6R4LVUX.js.map → chunk-6AN23E37.js.map} +0 -0
  290. /package/dist/{chunk-OOGKAFBU.js.map → chunk-6ANWFGLL.js.map} +0 -0
  291. /package/dist/{chunk-BM4LH7VQ.js.map → chunk-7N4V3ARN.js.map} +0 -0
  292. /package/dist/{chunk-YD77RANW.js.map → chunk-7VN7LFBA.js.map} +0 -0
  293. /package/dist/{chunk-7JO3ES5P.js.map → chunk-A4JH5FAL.js.map} +0 -0
  294. /package/dist/{chunk-VI7YYAXV.js.map → chunk-AJVYJZHI.js.map} +0 -0
  295. /package/dist/{chunk-EZOVSZ5B.js.map → chunk-ANNDLY3M.js.map} +0 -0
  296. /package/dist/{chunk-PXH24VIP.js.map → chunk-B6IURHSZ.js.map} +0 -0
  297. /package/dist/{chunk-TCLBB7U4.js.map → chunk-BM4CGQED.js.map} +0 -0
  298. /package/dist/{chunk-JAYWTSXX.js.map → chunk-C423YJGN.js.map} +0 -0
  299. /package/dist/{chunk-E6D2Y5EK.js.map → chunk-CMN26J5Y.js.map} +0 -0
  300. /package/dist/{chunk-RP3W6IQO.js.map → chunk-CPNSVIIB.js.map} +0 -0
  301. /package/dist/{chunk-O4C5LUTJ.js.map → chunk-EDJDASXE.js.map} +0 -0
  302. /package/dist/{chunk-BUXSHLQM.js.map → chunk-EE44OC4M.js.map} +0 -0
  303. /package/dist/{chunk-ENUWZ3HW.js.map → chunk-EEAQBPOW.js.map} +0 -0
  304. /package/dist/{chunk-TC3EPGGJ.js.map → chunk-EUDIQQWE.js.map} +0 -0
  305. /package/dist/{chunk-5U4SJ2DA.js.map → chunk-FHA4G5XF.js.map} +0 -0
  306. /package/dist/{chunk-R2I3LUUH.js.map → chunk-FTCCYWF4.js.map} +0 -0
  307. /package/dist/{chunk-4D7YIU34.js.map → chunk-G3KSCJS7.js.map} +0 -0
  308. /package/dist/{chunk-IYSQRTIX.js.map → chunk-G73SDZ3T.js.map} +0 -0
  309. /package/dist/{chunk-YZKA7UJK.js.map → chunk-GCWF5AQE.js.map} +0 -0
  310. /package/dist/{chunk-X4GALW6I.js.map → chunk-GJKBWVU2.js.map} +0 -0
  311. /package/dist/{chunk-WROCSDVL.js.map → chunk-GSFNH4C5.js.map} +0 -0
  312. /package/dist/{chunk-AZUFGKMQ.js.map → chunk-HJOABXKN.js.map} +0 -0
  313. /package/dist/{chunk-3AOOI2NR.js.map → chunk-HR7YTBR7.js.map} +0 -0
  314. /package/dist/{chunk-56S7A2XT.js.map → chunk-IFAEKIT2.js.map} +0 -0
  315. /package/dist/{chunk-MGP5LLEK.js.map → chunk-IGO5DC7D.js.map} +0 -0
  316. /package/dist/{chunk-NLBIG5LU.js.map → chunk-IZBDSPTW.js.map} +0 -0
  317. /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
  318. /package/dist/{chunk-Q2GZMDZL.js.map → chunk-JO5GSRYQ.js.map} +0 -0
  319. /package/dist/{chunk-DZXN3QCX.js.map → chunk-JRHZZTVV.js.map} +0 -0
  320. /package/dist/{chunk-DVEYD27F.js.map → chunk-JXNT5TUP.js.map} +0 -0
  321. /package/dist/{chunk-M7HX3HKW.js.map → chunk-K2XK45HG.js.map} +0 -0
  322. /package/dist/{chunk-JPNPXNFH.js.map → chunk-K7BBMXY7.js.map} +0 -0
  323. /package/dist/{chunk-2DJIS2WQ.js.map → chunk-KCBAPMLH.js.map} +0 -0
  324. /package/dist/{chunk-HQZRWOSS.js.map → chunk-KJHQYPKT.js.map} +0 -0
  325. /package/dist/{chunk-DAQ2ZDU2.js.map → chunk-LE7IHEU4.js.map} +0 -0
  326. /package/dist/{chunk-3Z23QTCP.js.map → chunk-LLR42S6B.js.map} +0 -0
  327. /package/dist/{chunk-B4BU5CS6.js.map → chunk-LZHXF66R.js.map} +0 -0
  328. /package/dist/{chunk-C5WSPGMP.js.map → chunk-MDR4WJOV.js.map} +0 -0
  329. /package/dist/{chunk-U3ON6YW3.js.map → chunk-NNAACCN2.js.map} +0 -0
  330. /package/dist/{chunk-5KZR3RXL.js.map → chunk-OFVYNUYV.js.map} +0 -0
  331. /package/dist/{chunk-DDTPMZOB.js.map → chunk-PI5G6N6Q.js.map} +0 -0
  332. /package/dist/{chunk-7MM2I34E.js.map → chunk-PJ7NKK33.js.map} +0 -0
  333. /package/dist/{chunk-IGAXQRRZ.js.map → chunk-PLEZDLVU.js.map} +0 -0
  334. /package/dist/{chunk-XY6KOMRN.js.map → chunk-PPTF5X7K.js.map} +0 -0
  335. /package/dist/{chunk-XO27IMBE.js.map → chunk-QWCMLOYC.js.map} +0 -0
  336. /package/dist/{chunk-NBBFFPTA.js.map → chunk-R2G4MVPY.js.map} +0 -0
  337. /package/dist/{chunk-KCFCEWF7.js.map → chunk-RJXRZW66.js.map} +0 -0
  338. /package/dist/{chunk-3CN2GBIK.js.map → chunk-RPMAWM6F.js.map} +0 -0
  339. /package/dist/{chunk-HEVST4CS.js.map → chunk-SGGDMTKP.js.map} +0 -0
  340. /package/dist/{chunk-H4NWU2ZN.js.map → chunk-TK36COCP.js.map} +0 -0
  341. /package/dist/{chunk-5NH24MF5.js.map → chunk-TUYN6XZI.js.map} +0 -0
  342. /package/dist/{chunk-BGYLL467.js.map → chunk-TXHJX2NG.js.map} +0 -0
  343. /package/dist/{chunk-X4HGBK4G.js.map → chunk-U7Q2Y6WG.js.map} +0 -0
  344. /package/dist/{chunk-GSWDQ3ZX.js.map → chunk-UMQN3BVV.js.map} +0 -0
  345. /package/dist/{chunk-3NA7AO6H.js.map → chunk-URWNRC2P.js.map} +0 -0
  346. /package/dist/{chunk-AZ2KKHID.js.map → chunk-VF2XC76U.js.map} +0 -0
  347. /package/dist/{chunk-T5MOGJ56.js.map → chunk-VQBINZB7.js.map} +0 -0
  348. /package/dist/{chunk-V3WWNKHU.js.map → chunk-W7HSGZGW.js.map} +0 -0
  349. /package/dist/{chunk-T53L42XW.js.map → chunk-WJH743NG.js.map} +0 -0
  350. /package/dist/{chunk-6ZZNV2PA.js.map → chunk-X2IJI2BG.js.map} +0 -0
  351. /package/dist/{chunk-7NFRTAEU.js.map → chunk-X2QLWUND.js.map} +0 -0
  352. /package/dist/{chunk-TN55JKIU.js.map → chunk-XI2BXMBX.js.map} +0 -0
  353. /package/dist/{chunk-TTW4MAOJ.js.map → chunk-XPOQZI5X.js.map} +0 -0
  354. /package/dist/{chunk-H3TNIGMI.js.map → chunk-XYXTEGIM.js.map} +0 -0
  355. /package/dist/{chunk-GLWW2XCP.js.map → chunk-YJ4HM25H.js.map} +0 -0
  356. /package/dist/{chunk-2UYR2OOE.js.map → chunk-YRUCIKPO.js.map} +0 -0
  357. /package/dist/{chunk-5SBJO37T.js.map → chunk-ZA4U5GDU.js.map} +0 -0
  358. /package/dist/{chunk-XM6WEANW.js.map → chunk-ZNJ4RLZT.js.map} +0 -0
@@ -92,6 +92,25 @@ type SeparatorStyleArgs = Required<
92
92
  > &
93
93
  Pick<SeparatorProps, 'color' | 'margin' | 'length'>;
94
94
 
95
+ /**
96
+ * The separator's margin, on the axis it separates along only: above and below
97
+ * a horizontal rule, either side of a vertical one. A margin given as a string
98
+ * carries its own units; a number is pixels.
99
+ *
100
+ * The LABELLED separator uses this too. It used to hand the number straight to
101
+ * `sx.margin`, where a number is SPACING UNITS — `md`'s 16 drew 128px on all
102
+ * four sides, against 16px above and below for the unlabelled one.
103
+ */
104
+ export const separatorBlockMargin = (
105
+ size: SeparatorSize,
106
+ margin: number | string | undefined,
107
+ isHorizontal: boolean,
108
+ ): string => {
109
+ const value = separatorMargin(size, margin);
110
+ const length = typeof value === 'string' ? value : `${value}px`;
111
+ return isHorizontal ? `${length} 0` : `0 ${length}`;
112
+ };
113
+
95
114
  export const separatorStyles = (
96
115
  theme: Theme,
97
116
  { variant, orientation, size, color, margin, length }: SeparatorStyleArgs,
@@ -100,14 +119,10 @@ export const separatorStyles = (
100
119
  const thickness = separatorThickness(size);
101
120
  const resolvedColor = color || theme.palette.divider;
102
121
 
103
- // A margin given as a string carries its own units; a number is pixels.
104
- const marginValue = separatorMargin(size, margin);
105
- const marginStr = typeof marginValue === 'string' ? marginValue : `${marginValue}px`;
106
-
107
122
  const baseStyles: CSSObject = {
108
123
  display: 'flex',
109
124
  alignItems: 'center',
110
- margin: isHorizontal ? `${marginStr} 0` : `0 ${marginStr}`,
125
+ margin: separatorBlockMargin(size, margin, isHorizontal),
111
126
  width: isHorizontal ? length || '100%' : `${thickness}px`,
112
127
  height: isHorizontal ? `${thickness}px` : length || '100%',
113
128
  boxSizing: 'border-box',
@@ -3,7 +3,7 @@ import Typography from '@mui/material/Typography/index.js';
3
3
  import { useTheme } from '@mui/material/styles/index.js';
4
4
  import React from 'react';
5
5
 
6
- import { separatorMargin, separatorStyles } from './Separator.styles';
6
+ import { separatorBlockMargin, separatorStyles } from './Separator.styles';
7
7
  import type { SeparatorProps } from './Separator.types';
8
8
 
9
9
  export const Separator: React.FC<SeparatorProps> = ({
@@ -22,6 +22,9 @@ export const Separator: React.FC<SeparatorProps> = ({
22
22
 
23
23
  if (children) {
24
24
  const isHorizontal = orientation === 'horizontal';
25
+ // The rules either side of the label sit INSIDE the row, which carries the
26
+ // margin; their own would add it a second time.
27
+ const ruleStyles = { ...styles, margin: 0 };
25
28
 
26
29
  return (
27
30
  <Box
@@ -33,12 +36,12 @@ export const Separator: React.FC<SeparatorProps> = ({
33
36
  sx={{
34
37
  display: 'flex',
35
38
  alignItems: 'center',
36
- margin: separatorMargin(size, margin),
39
+ margin: separatorBlockMargin(size, margin, isHorizontal),
37
40
  flexDirection: isHorizontal ? 'row' : 'column',
38
41
  gap: theme.spacing(2),
39
42
  }}
40
43
  >
41
- <Box sx={styles} />
44
+ <Box sx={ruleStyles} />
42
45
  {/*
43
46
  No background behind the label. The two rules and the words are a FLEX
44
47
  ROW — the rules stop where the label starts — so there is nothing for a
@@ -53,7 +56,7 @@ export const Separator: React.FC<SeparatorProps> = ({
53
56
  >
54
57
  {children}
55
58
  </Typography>
56
- <Box sx={styles} />
59
+ <Box sx={ruleStyles} />
57
60
  </Box>
58
61
  );
59
62
  }
@@ -166,7 +166,9 @@ function indexListSx(shape: RailShape) {
166
166
  return (theme: import('@mui/material').Theme) => ({
167
167
  display: 'grid',
168
168
  gridTemplateColumns: '1fr',
169
- columnGap: 8,
169
+ // One spacing unit (8px). This is an `sx` callback, where a bare 8 is
170
+ // EIGHT units — it drew a 64px gutter between the two columns.
171
+ columnGap: 1,
170
172
  [theme.breakpoints.up('sm')]: { gridTemplateColumns: '1fr 1fr' },
171
173
  [atLeastRail(theme, shape.breakpoint)]: { gridTemplateColumns: '1fr' },
172
174
  });
@@ -0,0 +1,107 @@
1
+ import type { Theme } from '@mui/material/styles/index.js';
2
+
3
+ /**
4
+ * THE ONE WAY A COMPONENT WRITES A SIZE (FUT-2585).
5
+ *
6
+ * A density mode — a compact admin, a roomy kiosk — is one decision taken in
7
+ * the theme, and it only works if every size a component draws is RELATIVE to
8
+ * something the theme owns. Before this file the package said the same number
9
+ * four ways: `'14px'`, `'0.875rem'`, `fontSize: 14` and `px(14)` from a
10
+ * `*.metrics.ts` table, and none of the four moved with the theme. The audit
11
+ * that opened FUT-2585 counted 1,269 `NNpx` literals, 246 hand-typed `rem`
12
+ * literals and 24 reads of `theme.typography`.
13
+ *
14
+ * So there is one vocabulary: the px a design was drawn at, handed to the
15
+ * theme's own type scale. `rem(theme, 14)` is `theme.typography.pxToRem(14)` —
16
+ * `0.875rem` at MUI's defaults, which is what the origin host's theme
17
+ * runs on, so converting a literal changes nothing on screen. A host that sets
18
+ * `typography.fontSize` scales every size written through it (MUI multiplies
19
+ * by `fontSize / 14`), and so does a reader who raises the browser's base font
20
+ * — the rule the field height already follows (`./field-height.core.ts`).
21
+ * `htmlFontSize` is not a knob: it DECLARES what the root already is. Values
22
+ * that are relative another way stay so — `sx` spacing units and
23
+ * `theme.spacing()` follow the spacing unit — so a density mode sets the type
24
+ * scale, the spacing unit and `fieldHeight` together.
25
+ *
26
+ * Everything goes through it — font sizes, heights, widths, padding, offsets,
27
+ * radii, shadow offsets, blurs and keyframe distances — because a density mode
28
+ * that shrinks the box but not its shadow, or the text but not the gap beside
29
+ * it, is visibly half-applied. The one literal left is the 1px hairline
30
+ * border, which must stay one device pixel (`FIELD_BORDER_WIDTH`).
31
+ *
32
+ * `scripts/ui-tokens-gate.mjs` refuses a raw size or colour in a component, so
33
+ * this is enforced rather than hoped for.
34
+ */
35
+
36
+ /** A size drawn at `px` in the design, as rem through the theme's type scale. */
37
+ export function rem(theme: Theme, px: number): string {
38
+ return theme.typography.pxToRem(px);
39
+ }
40
+
41
+ /**
42
+ * {@link rem} as an `sx` value: `sx={{ width: sxRem(40) }}`.
43
+ *
44
+ * `sx` reads a NUMBER on `width` as pixels and on `padding` as spacing units,
45
+ * so a bare number there is never density-safe; a theme callback is.
46
+ */
47
+ export function sxRem(px: number): (theme: Theme) => string {
48
+ return (theme) => rem(theme, px);
49
+ }
50
+
51
+ /** A length list (`'0 8px 32px'`-shaped) with every entry through {@link rem}. */
52
+ export function rems(theme: Theme, ...px: number[]): string {
53
+ return px.map((value) => (value === 0 ? '0' : rem(theme, value))).join(' ');
54
+ }
55
+
56
+ const FALLBACK_ROOT_PX = 16;
57
+ let rootPxCache: number | null = null;
58
+ let watchingRoot = false;
59
+
60
+ /** Forget the measured root font size — for a test, or a host that changes it at runtime. */
61
+ export function resetRootFontCache(): void {
62
+ rootPxCache = null;
63
+ }
64
+
65
+ /**
66
+ * Drop the cache whenever the root's own style or class changes (a host
67
+ * toggling `html { font-size }` for a density) or the window resizes (a
68
+ * viewport-relative root). A browser-setting change is not observable from the
69
+ * page; it takes a reload, as it does for everything else measured in px.
70
+ */
71
+ function watchRoot(): void {
72
+ if (watchingRoot || typeof MutationObserver === 'undefined') return;
73
+ watchingRoot = true;
74
+ new MutationObserver(resetRootFontCache).observe(document.documentElement, {
75
+ attributes: true,
76
+ attributeFilter: ['style', 'class'],
77
+ });
78
+ if (typeof window !== 'undefined') window.addEventListener('resize', resetRootFontCache);
79
+ }
80
+
81
+ /**
82
+ * The document's root font size in px — what `1rem` actually renders at.
83
+ * Without a document (server render) it is the theme's declared
84
+ * `htmlFontSize`; a failed measurement is not cached, so a later call can
85
+ * still measure.
86
+ */
87
+ function rootFontPx(theme: Theme): number {
88
+ if (rootPxCache !== null) return rootPxCache;
89
+ const fallback = theme.typography.htmlFontSize ?? FALLBACK_ROOT_PX;
90
+ if (typeof document === 'undefined' || typeof getComputedStyle !== 'function') return fallback;
91
+ const measured = Number.parseFloat(getComputedStyle(document.documentElement).fontSize);
92
+ if (!(Number.isFinite(measured) && measured > 0)) return fallback;
93
+ rootPxCache = measured;
94
+ watchRoot();
95
+ return measured;
96
+ }
97
+
98
+ /**
99
+ * The pixels `rem(theme, px)` renders at, for layout that is computed in
100
+ * JavaScript — a virtualiser's row height, an overflow cost table, a cell size.
101
+ *
102
+ * CSS and JS have to agree: a virtualiser that still assumes 52px rows while
103
+ * the rows it positions have shrunk to 45 leaves a gap under every one of them.
104
+ */
105
+ export function remPx(theme: Theme, px: number): number {
106
+ return Number.parseFloat(rem(theme, px)) * rootFontPx(theme);
107
+ }
@@ -14,6 +14,8 @@ export { headingMetrics } from './typography';
14
14
  // host can build a `UiTheme` from the same module path a native one does.
15
15
  export * from './theme';
16
16
  export * from './color';
17
+ // The relative-size vocabulary every component writes its sizes in (FUT-2585).
18
+ export { rem, rems, remPx, resetRootFontCache, sxRem } from './relative';
17
19
  export { DEFAULT_FIELD_RADIUS, fieldRadius, fieldRadiusOverrides, fieldRadiusPx, fieldRootStyles } from './field-radius';
18
20
  export {
19
21
  asFieldSize,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tokens/scales.ts"],"sourcesContent":["import type { Theme } from '@mui/material/styles/index.js';\n\nimport type { ColorValue, MuiColor } from './vocabulary';\n\n/**\n * `@12-apps/ui/tokens` keeps its whole surface here. The vocabulary itself —\n * the size and colour unions and their runtime lists — lives in\n * `./vocabulary`, which imports nothing, so the native renderer can read it\n * without this file's MUI `Theme` import following it into `dist/types-native`.\n */\nexport * from './vocabulary';\nexport { headingMetrics } from './typography';\n// The renderer-neutral theme and the colour arithmetic behind it, so a web\n// host can build a `UiTheme` from the same module path a native one does.\nexport * from './theme';\nexport * from './color';\nexport { DEFAULT_FIELD_RADIUS, fieldRadius, fieldRadiusOverrides, fieldRadiusPx, fieldRootStyles } from './field-radius';\nexport {\n asFieldSize,\n DEFAULT_FIELD_HEIGHT,\n FIELD_BORDER_WIDTH,\n FIELD_HEIGHT_SCALE,\n fieldBorder,\n fieldControlStyles,\n fieldHeight,\n fieldHeightOverrides,\n fieldHeightPx,\n fieldHeightRem,\n fieldOverrides,\n fieldTextFieldStyles,\n} from './field-height';\n\nexport interface Accent {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport function accentFor(theme: Theme, color: ColorValue): Accent {\n if (color === 'neutral') {\n const grey = theme.palette.grey;\n return {\n // Explicit fallbacks: the ramp is indexed, and under\n // `noUncheckedIndexedAccess` every stop is `string | undefined`.\n main: grey[600] ?? '#757575',\n light: grey[400] ?? '#bdbdbd',\n dark: grey[800] ?? '#424242',\n // Grey 600 carries white text in both themes.\n contrastText: '#fff',\n };\n }\n // Past the `neutral` return, `paletteKey` can only produce a `MuiColor` — but\n // its signature still admits `'grey'`, and TS cannot narrow a return type by\n // the argument. Naming the key here keeps the accent branch honestly typed\n // instead of casting the hole shut.\n const key: MuiColor = color === 'danger' ? 'error' : color;\n return theme.palette[key];\n}\n"],"mappings":";AAuCO,SAAS,UAAU,OAAc,OAA2B;AACjE,MAAI,UAAU,WAAW;AACvB,UAAM,OAAO,MAAM,QAAQ;AAC3B,WAAO;AAAA;AAAA;AAAA,MAGL,MAAM,KAAK,GAAG,KAAK;AAAA,MACnB,OAAO,KAAK,GAAG,KAAK;AAAA,MACpB,MAAM,KAAK,GAAG,KAAK;AAAA;AAAA,MAEnB,cAAc;AAAA,IAChB;AAAA,EACF;AAKA,QAAM,MAAgB,UAAU,WAAW,UAAU;AACrD,SAAO,MAAM,QAAQ,GAAG;AAC1B;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/feedback/Dialog/Dialog.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport Backdrop from '@mui/material/Backdrop/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport MuiDialog from '@mui/material/Dialog/index.js';\nimport MuiDialogActions from '@mui/material/DialogActions/index.js';\nimport MuiDialogContent from '@mui/material/DialogContent/index.js';\nimport MuiDialogTitle from '@mui/material/DialogTitle/index.js';\nimport Drawer from '@mui/material/Drawer/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { hasSpacingSlot, withDialogDefaults } from './Dialog.helpers';\nimport {\n DIALOG_ACTIONS,\n DIALOG_BODY_PADDING_UNITS,\n DIALOG_CONTENT_PADDING_UNITS,\n DIALOG_HEADER_CHILDREN_PADDING_UNITS,\n DIALOG_TITLE,\n DIALOG_TITLED_BODY_PADDING_TOP_UNITS,\n} from './Dialog.metrics';\nimport { backdropSxOf, variantStylesOf } from './Dialog.styles';\nimport { childTestId, resolveTestId, slotTestId, withoutTestIdProps } from '../../../platform/test-id';\nimport type {\n DialogActionsProps,\n DialogContentProps,\n DialogHeaderProps,\n DialogProps,\n} from './Dialog.types';\n\n/**\n * The padding a dialog gives children that are not managing their own — and the\n * rule that takes it back when it turns out they are.\n *\n * `:has()` is doing what {@link hasSpacingSlot} cannot. A slot passed through a\n * COMPONENT (`<Body />` rendering a `DialogContent`) is invisible to any check\n * on element type: React does not know what a component renders until it has\n * rendered it, and by then the wrapper is already in the tree. The selector\n * asks the question one step later, of the DOM, where the answer exists.\n *\n * `display: contents` rather than `padding: 0`, because the padding is only\n * half of what a wrapper does. The other half is standing between the paper and\n * its children: MUI's `scroll=\"paper\"` makes the paper a flex column with\n * `overflow-y: auto`, so a `DialogContent` that is no longer its direct child\n * cannot be the thing that scrolls — the whole dialog scrolls instead and\n * carries the `DialogActions` off the bottom with it. An element with\n * `display: contents` generates no box at all: its children become the paper's\n * flex items, and its padding is never applied. Both halves, one declaration.\n *\n * A browser without `:has()` falls back to the padded box — the layout this\n * had before, not a broken one.\n */\nconst BODY_SX = {\n px: DIALOG_BODY_PADDING_UNITS.horizontal,\n pb: DIALOG_BODY_PADDING_UNITS.bottom,\n '&:has(> .MuiDialogContent-root), &:has(> .MuiDialogActions-root)': {\n display: 'contents',\n },\n} as const;\n\n/**\n * The dialog body. Consumers that pass raw children (no <DialogContent>) used\n * to render them flush against the paper edges — give them comfortable default\n * padding; <DialogContent>/<DialogActions> users keep managing their own\n * spacing.\n */\nfunction bodyOf(children: React.ReactNode, hasTitle: boolean): React.ReactNode {\n // Read lazily: both slots are declared below this function.\n if (hasSpacingSlot(children, [DialogContent, DialogActions])) return children;\n const pt = hasTitle\n ? DIALOG_BODY_PADDING_UNITS.topUnderTitle\n : DIALOG_BODY_PADDING_UNITS.top;\n return <Box sx={{ ...BODY_SX, pt }}>{children}</Box>;\n}\n\nexport const Dialog: React.FC<DialogProps> = (rawProps) => {\n const {\n children,\n variant,\n size,\n title,\n description,\n showCloseButton,\n backdrop,\n persistent,\n glass,\n gradient,\n glow,\n pulse,\n borderRadius,\n onClose,\n open,\n ...others\n } = withDialogDefaults(rawProps);\n const theme = useTheme();\n // Every spelling of the test id the shared contract allows, mapped to the one\n // the DOM reads, and stripped from what is spread — `testID` is React\n // Native's name for it and is not a DOM attribute. The native `Dialog` does\n // the same in reverse.\n const testId = resolveTestId(others, 'dialog');\n const props = withoutTestIdProps(others);\n const paperSx = variantStylesOf(theme, {\n variant, size, borderRadius, glass, gradient, glow, pulse,\n });\n\n const handleClose = (event: object, reason: 'backdropClick' | 'escapeKeyDown') => {\n if (persistent && (reason === 'backdropClick' || reason === 'escapeKeyDown')) {\n return;\n }\n onClose?.();\n };\n\n const header = title ? (\n <DialogHeader\n title={title}\n subtitle={description}\n showCloseButton={showCloseButton}\n onClose={onClose}\n dataTestId={testId}\n />\n ) : null;\n const body = bodyOf(children, Boolean(title));\n\n if (variant === 'drawer') {\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n data-testid={testId}\n {...props}\n >\n <Box sx={{ ...paperSx, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n {header}\n {body}\n </Box>\n </Drawer>\n );\n }\n\n return (\n <MuiDialog\n open={open}\n onClose={handleClose}\n fullScreen={variant === 'fullscreen'}\n BackdropComponent={backdrop ? Backdrop : undefined}\n BackdropProps={{ sx: backdropSxOf(theme, glass) }}\n PaperProps={{ sx: paperSx, 'data-testid': testId }}\n {...props}\n >\n {header}\n {body}\n </MuiDialog>\n );\n};\n\nexport const DialogHeader: React.FC<DialogHeaderProps> = ({\n children,\n title,\n subtitle,\n showCloseButton = true,\n onClose,\n ...others\n}) => {\n const props = withoutTestIdProps(others);\n\n if (children) {\n return (\n <Box\n data-testid={slotTestId(others, 'header', 'dialog')}\n sx={{\n p: DIALOG_HEADER_CHILDREN_PADDING_UNITS,\n borderBottom: '1px solid',\n borderColor: 'divider',\n }}\n >\n {children}\n </Box>\n );\n }\n\n return (\n <MuiDialogTitle\n data-testid={slotTestId(others, 'title', 'dialog')}\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n pb: subtitle\n ? DIALOG_TITLE.paddingBottomUnits.withSubtitle\n : DIALOG_TITLE.paddingBottomUnits.plain,\n }}\n {...props}\n >\n <Box>\n <Typography variant=\"h6\" component=\"div\">\n {title}\n </Typography>\n {subtitle && (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ mt: DIALOG_TITLE.subtitleGapUnits }}\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n {showCloseButton && onClose && (\n <IconButton\n aria-label=\"close\"\n onClick={onClose}\n data-testid={childTestId(others, 'close', 'dialog')}\n sx={{\n color: 'text.secondary',\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n </MuiDialogTitle>\n );\n};\n\n/**\n * Top padding for a body that sits directly under the title.\n *\n * MUI zeroes it there (`.MuiDialogTitle-root + &` on a non-`dividers` content),\n * assuming the title's own bottom padding is the whole gap. That assumption\n * breaks for a body opening with an outlined field: a filled field floats its\n * label ABOVE the input's border box, and `DialogContent` is `overflow-y: auto`\n * — a clipping box — so the label gets sliced in half (FUT-544: \"Tipo\" in the\n * \"Novo insumo\" dialog).\n *\n * Reserve the overhang rather than restore the full 24px: the title already\n * contributes its bottom padding, so a shrunk label's `translate(…, -9px)` is\n * all that is missing. 12px clears it and leaves the gap visually tight.\n */\nconst TITLED_BODY_PADDING_TOP = DIALOG_TITLED_BODY_PADDING_TOP_UNITS;\n\n/**\n * `.MuiDialogTitle-root + &` is `(0,2,0)`-specific and a plain `sx` entry is\n * `(0,1,0)`, so the padding above only survives the cascade by naming the class\n * again — `(0,3,0)`. Scoped to the title-following case so an untitled dialog\n * keeps MUI's roomier default.\n */\nconst TITLED_BODY_SELECTOR = '.MuiDialogTitle-root + &.MuiDialogContent-root';\n\nexport const DialogContent: React.FC<DialogContentProps> = ({\n children,\n dividers = false,\n dense = false,\n ...others\n}) => (\n <MuiDialogContent\n data-testid={slotTestId(others, 'content', 'dialog')}\n dividers={dividers}\n sx={{\n padding: dense ? DIALOG_CONTENT_PADDING_UNITS.dense : DIALOG_CONTENT_PADDING_UNITS.normal,\n [TITLED_BODY_SELECTOR]: { paddingTop: TITLED_BODY_PADDING_TOP },\n '&.MuiDialogContent-dividers': {\n borderTop: dividers ? '1px solid' : 'none',\n borderBottom: dividers ? '1px solid' : 'none',\n borderColor: 'divider',\n },\n }}\n {...withoutTestIdProps(others)}\n >\n {children}\n </MuiDialogContent>\n );\n\nexport const DialogActions: React.FC<DialogActionsProps> = ({\n children,\n alignment = 'right',\n spacing = DIALOG_ACTIONS.defaultSpacingUnits,\n ...others\n}) => {\n const getJustifyContent = () => {\n switch (alignment) {\n case 'left': return 'flex-start';\n case 'center': return 'center';\n case 'right': return 'flex-end';\n case 'space-between': return 'space-between';\n default: return 'flex-end';\n }\n };\n\n return (\n <MuiDialogActions\n data-testid={slotTestId(others, 'actions', 'dialog')}\n sx={{\n justifyContent: getJustifyContent(),\n gap: spacing,\n p: DIALOG_ACTIONS.paddingUnits,\n }}\n {...withoutTestIdProps(others)}\n >\n {children}\n </MuiDialogActions>\n );\n};"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Separator/Separator.styles.ts"],"sourcesContent":["import type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport type {\n SeparatorOrientation,\n SeparatorProps,\n SeparatorSize,\n SeparatorVariant,\n} from './Separator.types';\n\nconst THICKNESS_PX: Record<SeparatorSize, number> = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 6,\n};\n\nconst MARGIN_PX: Record<SeparatorSize, number> = {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n};\n\nconst separatorThickness = (size: SeparatorSize): number =>\n THICKNESS_PX[size] ?? THICKNESS_PX.md;\n\n/** An explicit `margin` wins; otherwise the size picks one. */\nexport const separatorMargin = (\n size: SeparatorSize,\n margin?: number | string,\n): number | string => margin ?? MARGIN_PX[size] ?? MARGIN_PX.md;\n\n// `gradient` paints a background rather than a border, so it draws its line as a\n// solid border of zero visual consequence.\nconst borderStyleFor = (variant: SeparatorVariant): 'dashed' | 'dotted' | 'solid' => {\n switch (variant) {\n case 'dashed':\n return 'dashed';\n case 'dotted':\n return 'dotted';\n default:\n return 'solid';\n }\n};\n\nconst gradientBackground = (\n variant: SeparatorVariant,\n orientation: SeparatorOrientation,\n color: string,\n): string | undefined => {\n if (variant !== 'gradient') return undefined;\n const angle = orientation === 'horizontal' ? '90deg' : '180deg';\n return `linear-gradient(${angle}, transparent 0%, ${color} 50%, transparent 100%)`;\n};\n\n// Only the leading edge carries the rule; the other three are zeroed explicitly so\n// a parent's border shorthand cannot leak through.\nconst borderEdges = (\n isHorizontal: boolean,\n thickness: number,\n style: 'dashed' | 'dotted' | 'solid',\n color: string,\n): CSSObject => {\n const leading = isHorizontal ? 'Top' : 'Left';\n const blank: CSSObject = {\n borderTopWidth: 0,\n borderBottomWidth: 0,\n borderLeftWidth: 0,\n borderRightWidth: 0,\n borderTopStyle: 'none',\n borderBottomStyle: 'none',\n borderLeftStyle: 'none',\n borderRightStyle: 'none',\n borderTopColor: 'transparent',\n borderBottomColor: 'transparent',\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n };\n\n return {\n ...blank,\n [`border${leading}Width`]: thickness,\n [`border${leading}Style`]: style,\n [`border${leading}Color`]: color,\n };\n};\n\ntype SeparatorStyleArgs = Required<\n Pick<SeparatorProps, 'variant' | 'orientation' | 'size'>\n> &\n Pick<SeparatorProps, 'color' | 'margin' | 'length'>;\n\nexport const separatorStyles = (\n theme: Theme,\n { variant, orientation, size, color, margin, length }: SeparatorStyleArgs,\n): CSSObject => {\n const isHorizontal = orientation === 'horizontal';\n const thickness = separatorThickness(size);\n const resolvedColor = color || theme.palette.divider;\n\n // A margin given as a string carries its own units; a number is pixels.\n const marginValue = separatorMargin(size, margin);\n const marginStr = typeof marginValue === 'string' ? marginValue : `${marginValue}px`;\n\n const baseStyles: CSSObject = {\n display: 'flex',\n alignItems: 'center',\n margin: isHorizontal ? `${marginStr} 0` : `0 ${marginStr}`,\n width: isHorizontal ? length || '100%' : `${thickness}px`,\n height: isHorizontal ? `${thickness}px` : length || '100%',\n boxSizing: 'border-box',\n };\n\n if (variant === 'gradient') {\n return {\n ...baseStyles,\n background: gradientBackground(variant, orientation, resolvedColor),\n };\n }\n\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n ...borderEdges(isHorizontal, thickness, borderStyleFor(variant), resolvedColor),\n };\n};\n"],"mappings":";AASA,IAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,YAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,qBAAqB,CAAC,SAC1B,aAAa,IAAI,KAAK,aAAa;AAG9B,IAAM,kBAAkB,CAC7B,MACA,WACoB,UAAU,UAAU,IAAI,KAAK,UAAU;AAI7D,IAAM,iBAAiB,CAAC,YAA6D;AACnF,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,qBAAqB,CACzB,SACA,aACA,UACuB;AACvB,MAAI,YAAY,WAAY,QAAO;AACnC,QAAM,QAAQ,gBAAgB,eAAe,UAAU;AACvD,SAAO,mBAAmB,KAAK,qBAAqB,KAAK;AAC3D;AAIA,IAAM,cAAc,CAClB,cACA,WACA,OACA,UACc;AACd,QAAM,UAAU,eAAe,QAAQ;AACvC,QAAM,QAAmB;AAAA,IACvB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,IAC3B,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,IAC3B,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,EAC7B;AACF;AAOO,IAAM,kBAAkB,CAC7B,OACA,EAAE,SAAS,aAAa,MAAM,OAAO,QAAQ,OAAO,MACtC;AACd,QAAM,eAAe,gBAAgB;AACrC,QAAM,YAAY,mBAAmB,IAAI;AACzC,QAAM,gBAAgB,SAAS,MAAM,QAAQ;AAG7C,QAAM,cAAc,gBAAgB,MAAM,MAAM;AAChD,QAAM,YAAY,OAAO,gBAAgB,WAAW,cAAc,GAAG,WAAW;AAEhF,QAAM,aAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ,eAAe,GAAG,SAAS,OAAO,KAAK,SAAS;AAAA,IACxD,OAAO,eAAe,UAAU,SAAS,GAAG,SAAS;AAAA,IACrD,QAAQ,eAAe,GAAG,SAAS,OAAO,UAAU;AAAA,IACpD,WAAW;AAAA,EACb;AAEA,MAAI,YAAY,YAAY;AAC1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,mBAAmB,SAAS,aAAa,aAAa;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB;AAAA,IACjB,GAAG,YAAY,cAAc,WAAW,eAAe,OAAO,GAAG,aAAa;AAAA,EAChF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/UploadButton/UploadButton.parts.tsx"],"sourcesContent":["import AttachFileOutlined from '@mui/icons-material/AttachFileOutlined';\nimport CloudUploadOutlined from '@mui/icons-material/CloudUploadOutlined';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport LinearProgress from '@mui/material/LinearProgress/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport type React from 'react';\n\nimport type { DragHandlers } from './UploadButton.hooks';\nimport type { UploadButtonCopy } from '../../../copy';\nimport type { UploadButtonProps } from './UploadButton.types';\n\n/** Shared shape for the two trigger variants. */\nexport interface TriggerProps {\n copy: UploadButtonCopy;\n label: string;\n icon?: React.ReactNode;\n disabled: boolean;\n className?: string;\n dataTestId?: string;\n describedBy?: string;\n onOpen: () => void;\n}\n\n/** The drag-and-drop surface. */\nexport function UploadDropzone({\n copy,\n label,\n icon,\n disabled,\n className,\n dataTestId,\n describedBy,\n onOpen,\n isDragOver,\n drag,\n}: TriggerProps & { isDragOver: boolean; drag: DragHandlers }): React.ReactElement {\n const theme = useTheme();\n return (\n <Box\n component=\"div\"\n {...drag}\n onClick={onOpen}\n sx={{\n border: `2px dashed ${isDragOver ? theme.palette.primary.main : theme.palette.divider}`,\n borderRadius: 2,\n padding: 3,\n textAlign: 'center',\n cursor: disabled ? 'not-allowed' : 'pointer',\n backgroundColor: isDragOver ? `${theme.palette.primary.main}0A` : 'transparent',\n transition: 'all 0.2s ease-in-out',\n ...(!disabled && {\n '&:hover': {\n borderColor: theme.palette.primary.main,\n backgroundColor: `${theme.palette.primary.main}05`,\n },\n }),\n opacity: disabled ? 0.6 : 1,\n }}\n className={className}\n data-testid={dataTestId}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n onOpen();\n }}\n aria-describedby={describedBy}\n aria-label={copy.dropzoneRole(label)}\n >\n <Box sx={{ mb: 2 }}>\n {icon || <CloudUploadOutlined sx={{ fontSize: 48, color: 'text.secondary' }} />}\n </Box>\n <Typography variant=\"body1\" sx={{ mb: 1 }}>\n {label}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {copy.dropzoneHint}\n </Typography>\n </Box>\n );\n}\n\n/** MUI variant for each non-dropzone appearance. */\nconst MUI_VARIANT = { outline: 'outlined', ghost: 'text' } as const;\n\n/** The plain-button trigger. */\nexport function UploadTrigger({\n copy,\n label,\n icon,\n disabled,\n className,\n dataTestId,\n describedBy,\n onOpen,\n variant,\n isUploading,\n}: TriggerProps & {\n variant: NonNullable<UploadButtonProps['variant']>;\n isUploading: boolean;\n}): React.ReactElement {\n const theme = useTheme();\n return (\n <Button\n variant={MUI_VARIANT[variant as keyof typeof MUI_VARIANT] ?? 'contained'}\n disabled={disabled || isUploading}\n onClick={onOpen}\n startIcon={icon || <AttachFileOutlined />}\n className={className}\n data-testid={dataTestId}\n aria-describedby={describedBy}\n sx={{\n ...(variant === 'ghost' && {\n '&:hover': { backgroundColor: `${theme.palette.primary.main}08` },\n }),\n }}\n >\n {isUploading ? copy.uploading : label}\n </Button>\n );\n}\n\n/** The screen-reader live region — drag, progress and error announcements. */\nfunction UploadAnnouncer({\n copy,\n announceDragOver,\n isUploading,\n progress,\n error,\n}: {\n copy: UploadButtonCopy;\n announceDragOver: boolean;\n isUploading: boolean;\n progress: number;\n error: string | null;\n}): React.ReactElement {\n return (\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n style={{\n position: 'absolute',\n left: '-10000px',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n }}\n >\n {announceDragOver && copy.dropReady}\n {isUploading && copy.uploadInProgress(Math.round(progress))}\n {error && copy.errorAnnouncement(error)}\n </div>\n );\n}\n\n/** Progress bar, helper text, error text and the live region. */\nexport function UploadFeedback({\n copy,\n isUploading,\n progress,\n helperText,\n helperId,\n error,\n errorId,\n announceDragOver,\n}: {\n copy: UploadButtonCopy;\n isUploading: boolean;\n progress: number;\n helperText?: string;\n helperId?: string;\n error: string | null;\n errorId?: string;\n announceDragOver: boolean;\n}): React.ReactElement {\n return (\n <>\n {isUploading && progress > 0 && (\n <Box sx={{ mt: 1 }}>\n <LinearProgress variant=\"determinate\" value={progress} sx={{ borderRadius: 1 }} />\n <Typography variant=\"caption\" sx={{ mt: 0.5, display: 'block' }}>\n {copy.percentUploaded(Math.round(progress))}\n </Typography>\n </Box>\n )}\n\n {helperText && !error && (\n <Typography\n id={helperId}\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: 'block', mt: 0.5 }}\n >\n {helperText}\n </Typography>\n )}\n\n {error && (\n <Typography\n id={errorId}\n variant=\"caption\"\n color=\"error\"\n sx={{ display: 'block', mt: 0.5 }}\n role=\"alert\"\n >\n {error}\n </Typography>\n )}\n\n <UploadAnnouncer\n copy={copy}\n announceDragOver={announceDragOver}\n isUploading={isUploading}\n progress={progress}\n error={error}\n />\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Separator/Separator.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { separatorMargin, separatorStyles } from './Separator.styles';\nimport type { SeparatorProps } from './Separator.types';\n\nexport const Separator: React.FC<SeparatorProps> = ({\n variant = 'solid',\n orientation = 'horizontal',\n size = 'md',\n color,\n margin,\n length,\n children,\n className,\n 'data-testid': dataTestId,\n}) => {\n const theme = useTheme();\n const styles = separatorStyles(theme, { variant, orientation, size, color, margin, length });\n\n if (children) {\n const isHorizontal = orientation === 'horizontal';\n\n return (\n <Box\n className={className}\n // The plain branch below has always carried the caller's hook; this one\n // silently dropped it, so a LABELLED separator was the one variant no\n // test could address except through its own words.\n data-testid={dataTestId}\n sx={{\n display: 'flex',\n alignItems: 'center',\n margin: separatorMargin(size, margin),\n flexDirection: isHorizontal ? 'row' : 'column',\n gap: theme.spacing(2),\n }}\n >\n <Box sx={styles} />\n {/*\n No background behind the label. The two rules and the words are a FLEX\n ROW — the rules stop where the label starts — so there is nothing for a\n background to mask, and painting one made the label a coloured pill on\n every surface that is not `background.default`. On a white card it read\n as a highlight nobody had asked for.\n */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ flexShrink: 0, padding: theme.spacing(0, 1) }}\n >\n {children}\n </Typography>\n <Box sx={styles} />\n </Box>\n );\n }\n\n return (\n <Box\n className={className}\n sx={styles}\n role=\"separator\"\n aria-orientation={orientation}\n data-testid={dataTestId}\n />\n );\n};\n"],"mappings":";;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AAwBnB,SAcE,KAdF;AAlBC,IAAM,YAAsC,CAAC;AAAA,EAClD,UAAU;AAAA,EACV,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,gBAAgB,OAAO,EAAE,SAAS,aAAa,MAAM,OAAO,QAAQ,OAAO,CAAC;AAE3F,MAAI,UAAU;AACZ,UAAM,eAAe,gBAAgB;AAErC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QAIA,eAAa;AAAA,QACb,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ,gBAAgB,MAAM,MAAM;AAAA,UACpC,eAAe,eAAe,QAAQ;AAAA,UACtC,KAAK,MAAM,QAAQ,CAAC;AAAA,QACtB;AAAA,QAEA;AAAA,8BAAC,OAAI,IAAI,QAAQ;AAAA,UAQjB;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,YAAY,GAAG,SAAS,MAAM,QAAQ,GAAG,CAAC,EAAE;AAAA,cAEjD;AAAA;AAAA,UACH;AAAA,UACA,oBAAC,OAAI,IAAI,QAAQ;AAAA;AAAA;AAAA,IACnB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,oBAAkB;AAAA,MAClB,eAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}