@12-apps/ui 6.25.0 → 6.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/_internal/components/data-display/Alert/Alert.helpers.js +5 -1
  2. package/dist/_internal/components/data-display/Alert/Alert.js +5 -5
  3. package/dist/_internal/components/data-display/Alert/Alert.metrics.js +2 -2
  4. package/dist/_internal/components/data-display/Alert/Alert.styles.js +4 -4
  5. package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
  6. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  7. package/dist/_internal/components/data-display/Badge/Badge.animations.js +3 -3
  8. package/dist/_internal/components/data-display/Badge/Badge.js +7 -7
  9. package/dist/_internal/components/data-display/Badge/Badge.metrics.js +2 -2
  10. package/dist/_internal/components/data-display/Badge/Badge.styles.js +5 -5
  11. package/dist/_internal/components/data-display/Badge/Badge.variants.js +3 -3
  12. package/dist/_internal/components/data-display/Badge/BadgeContent.js +6 -6
  13. package/dist/_internal/components/data-display/Banner/Banner.js +4 -4
  14. package/dist/_internal/components/data-display/Banner/Banner.styles.js +3 -3
  15. package/dist/_internal/components/data-display/CardKit/CardKebab.js +4 -4
  16. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +6 -6
  17. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +10 -10
  18. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +4 -4
  19. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +1 -1
  20. package/dist/_internal/components/data-display/Carousel/Carousel.js +1 -1
  21. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +1 -1
  22. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +1 -1
  23. package/dist/_internal/components/data-display/Chart/Chart.js +5 -5
  24. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  25. package/dist/_internal/components/data-display/Chart/chart-context.js +3 -3
  26. package/dist/_internal/components/data-display/Chart/chart-internals.js +1 -1
  27. package/dist/_internal/components/data-display/Chart/chart-renderers.js +4 -4
  28. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +4 -4
  29. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +37 -37
  30. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +55 -54
  31. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +6 -6
  32. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
  33. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +12 -11
  34. package/dist/_internal/components/data-display/DataViews/base-card.js +9 -9
  35. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +12 -12
  36. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
  37. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +8 -8
  38. package/dist/_internal/components/data-display/DataViews/base-list-card.js +16 -16
  39. package/dist/_internal/components/data-display/DataViews/card-surface.js +4 -4
  40. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +5 -5
  41. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +4 -4
  42. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +5 -5
  43. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +11 -11
  44. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +6 -6
  45. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +6 -6
  46. package/dist/_internal/components/data-display/DataViews/data-views-export.js +6 -6
  47. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +6 -6
  48. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -12
  49. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +4 -4
  50. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +34 -34
  51. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +4 -4
  52. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +13 -13
  53. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +2 -2
  54. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
  55. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +7 -7
  56. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
  57. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +6 -6
  58. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +15 -15
  59. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +19 -18
  60. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +14 -14
  61. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +6 -6
  62. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
  63. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +4 -4
  64. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
  65. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  66. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +4 -4
  67. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +11 -11
  68. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +8 -8
  69. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +13 -13
  70. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +2 -2
  71. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +1 -1
  72. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  73. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  74. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
  75. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  76. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  77. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  78. package/dist/_internal/components/data-display/Progress/Progress.js +4 -4
  79. package/dist/_internal/components/data-display/Progress/Progress.metrics.js +2 -2
  80. package/dist/_internal/components/data-display/Progress/Progress.styles.js +3 -3
  81. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +1 -1
  82. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
  83. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +1 -1
  84. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  85. package/dist/_internal/components/data-display/index.js +44 -44
  86. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +4 -4
  87. package/dist/_internal/components/feedback/index.js +4 -4
  88. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +2 -2
  89. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
  90. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
  91. package/dist/_internal/components/form/Button/Button.js +3 -3
  92. package/dist/_internal/components/form/Button/Button.styles.js +2 -2
  93. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
  94. package/dist/_internal/components/form/Calendar/Calendar.js +3 -3
  95. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +1 -1
  96. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +4 -4
  97. package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
  98. package/dist/_internal/components/form/Command/Command.js +4 -4
  99. package/dist/_internal/components/form/Command/Command.styles.js +1 -1
  100. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
  101. package/dist/_internal/components/form/Label/Label.js +1 -1
  102. package/dist/_internal/components/form/Label/Label.styles.js +1 -1
  103. package/dist/_internal/components/form/Menubar/Menubar.item.js +1 -1
  104. package/dist/_internal/components/form/Menubar/Menubar.js +1 -1
  105. package/dist/_internal/components/form/Menubar/Menubar.styles.js +1 -1
  106. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +1 -1
  107. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
  108. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
  109. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
  110. package/dist/_internal/components/form/Switch/Switch.ids.js +8 -0
  111. package/dist/_internal/components/form/Switch/Switch.ids.js.map +1 -0
  112. package/dist/_internal/components/form/Switch/Switch.js +6 -5
  113. package/dist/_internal/components/form/Switch/Switch.metrics.js +5 -1
  114. package/dist/_internal/components/form/Switch/Switch.parts.js +6 -8
  115. package/dist/_internal/components/form/Switch/Switch.styles.js +5 -3
  116. package/dist/_internal/components/form/index.js +34 -33
  117. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +5 -5
  118. package/dist/_internal/components/form/total-form/Fields/index.js +6 -6
  119. package/dist/_internal/components/form/total-form/SubmitButton.js +4 -4
  120. package/dist/_internal/components/index.js +83 -82
  121. package/dist/_internal/components/layout/Box/Box.js +4 -4
  122. package/dist/_internal/components/layout/Stack/Stack.js +5 -5
  123. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +7 -7
  124. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +1 -1
  125. package/dist/_internal/components/navigation/index.js +7 -7
  126. package/dist/_internal/components/typography/Heading/Heading.js +4 -4
  127. package/dist/_internal/components/typography/Heading/Heading.metrics.js +2 -2
  128. package/dist/_internal/components/typography/Heading/Heading.styles.js +3 -3
  129. package/dist/_internal/components/typography/Paragraph/Paragraph.js +2 -2
  130. package/dist/_internal/components/typography/Text/Text.js +3 -3
  131. package/dist/_internal/components/typography/Text/Text.metrics.js +2 -2
  132. package/dist/_internal/components/typography/index.js +7 -7
  133. package/dist/_internal/icons/Icon.js +4 -4
  134. package/dist/_internal/provider/UiProvider.js +3 -3
  135. package/dist/_internal/provider/mui-bridge.js +2 -2
  136. package/dist/_internal/provider/use-ui-theme.js +3 -3
  137. package/dist/_internal/social-login-button/social-login-button.js +9 -9
  138. package/dist/_internal/tokens/theme.js +3 -1
  139. package/dist/_internal/user-avatar/user-avatar.js +8 -8
  140. package/dist/charts.js +6 -6
  141. package/dist/{chunk-2GI7ANEL.js → chunk-22X7TT6Z.js} +4 -4
  142. package/dist/{chunk-WR5JFDQ5.js → chunk-27BL3DNT.js} +8 -8
  143. package/dist/{chunk-E55CJV65.js → chunk-2KVQIGVE.js} +2 -2
  144. package/dist/{chunk-BB2OUERT.js → chunk-2LSCK45B.js} +7 -4
  145. package/dist/chunk-2LSCK45B.js.map +1 -0
  146. package/dist/{chunk-W3FAKT3D.js → chunk-2SWQ6HIK.js} +4 -4
  147. package/dist/{chunk-ISW5K72V.js → chunk-2ZRZTGWP.js} +5 -5
  148. package/dist/{chunk-I5SBTNV2.js → chunk-3GB6KWHH.js} +2 -2
  149. package/dist/{chunk-ZEG2LNBY.js → chunk-3PJLT5FX.js} +2 -2
  150. package/dist/{chunk-57Z2ND3N.js → chunk-3VZT2FAI.js} +4 -4
  151. package/dist/{chunk-MLCFODJO.js → chunk-3W2IS5RH.js} +5 -1
  152. package/dist/{chunk-MLCFODJO.js.map → chunk-3W2IS5RH.js.map} +1 -1
  153. package/dist/{chunk-PFDM2OIP.js → chunk-45OHGD2B.js} +4 -4
  154. package/dist/{chunk-BH5BXLGI.js → chunk-4A2Q22HO.js} +3 -3
  155. package/dist/{chunk-46UPILLK.js → chunk-4ETQRBZC.js} +4 -4
  156. package/dist/{chunk-WM6Y2S6W.js → chunk-5QUSX3TC.js} +5 -5
  157. package/dist/{chunk-AVGTTWTE.js → chunk-65DLYC4S.js} +4 -4
  158. package/dist/{chunk-TVPPA4RD.js → chunk-65METCKT.js} +16 -16
  159. package/dist/{chunk-OQFSYMHJ.js → chunk-67ALTEWH.js} +2 -2
  160. package/dist/{chunk-OGGHD64H.js → chunk-6SK3MTYJ.js} +2 -2
  161. package/dist/{chunk-OE2ZVL67.js → chunk-6VHCSPKK.js} +3 -3
  162. package/dist/{chunk-WAPJ2DL3.js → chunk-72T5PAW7.js} +4 -4
  163. package/dist/{chunk-SLVQ33AN.js → chunk-77DF5LKI.js} +2 -2
  164. package/dist/{chunk-7KWBGMQC.js → chunk-77OXG6DH.js} +5 -5
  165. package/dist/{chunk-Y3KRUT7O.js → chunk-7AIHK2XM.js} +2 -2
  166. package/dist/{chunk-MHV5Y5MR.js → chunk-7KEGJH3Q.js} +3 -3
  167. package/dist/{chunk-KMXAPYU2.js → chunk-7NEUPEV5.js} +2 -2
  168. package/dist/{chunk-67L7HMEP.js → chunk-7Z2AQEC5.js} +2 -2
  169. package/dist/{chunk-PQECNGDE.js → chunk-AGYGNNOM.js} +2 -2
  170. package/dist/{chunk-ZTF5C2GA.js → chunk-B5SW7I5W.js} +2 -2
  171. package/dist/{chunk-TXHJX2NG.js → chunk-BGYLL467.js} +4 -4
  172. package/dist/{chunk-R7R3LOKW.js → chunk-CA7TA36R.js} +2 -2
  173. package/dist/{chunk-FPFUXRD2.js → chunk-CKJI7JO5.js} +2 -2
  174. package/dist/{chunk-HMV4QMXS.js → chunk-CMN26J5Y.js} +4 -4
  175. package/dist/{chunk-KVEHH4SA.js → chunk-DB2MAYPK.js} +2 -2
  176. package/dist/{chunk-2ECT4IY2.js → chunk-DIHVWBQV.js} +36 -17
  177. package/dist/chunk-DIHVWBQV.js.map +1 -0
  178. package/dist/{chunk-V4FKHLEB.js → chunk-DTIB5KWP.js} +3 -3
  179. package/dist/{chunk-MESRKY67.js → chunk-DW6GBMLQ.js} +3 -3
  180. package/dist/{chunk-JO6BBSGY.js → chunk-DWJBOR47.js} +3 -3
  181. package/dist/{chunk-YW5T6KZ5.js → chunk-DYESJJ3Q.js} +9 -9
  182. package/dist/{chunk-TZDDL3DR.js → chunk-ECMJ5VPW.js} +2 -2
  183. package/dist/{chunk-OH3YGJT5.js → chunk-EMNGIYH6.js} +5 -5
  184. package/dist/{chunk-CZJLWCEG.js → chunk-EPNCYUQ7.js} +4 -4
  185. package/dist/{chunk-JZXWCEH5.js → chunk-EQA4VQEO.js} +2 -2
  186. package/dist/{chunk-3N6EK6K5.js → chunk-ERX4XIYC.js} +2 -2
  187. package/dist/{chunk-TTLI6PF7.js → chunk-FF3R67WD.js} +5 -5
  188. package/dist/{chunk-WNMYWQ7D.js → chunk-FOF2RAVQ.js} +12 -10
  189. package/dist/chunk-FOF2RAVQ.js.map +1 -0
  190. package/dist/{chunk-KLREH4X6.js → chunk-G2JPUHEJ.js} +2 -2
  191. package/dist/{chunk-4J5EN4FQ.js → chunk-GBX5ACPF.js} +5 -5
  192. package/dist/{chunk-ZZMZF7PZ.js → chunk-GQJ4NCZ6.js} +3 -3
  193. package/dist/{chunk-IPVYEPXO.js → chunk-GSTRPZS4.js} +5 -5
  194. package/dist/{chunk-HFXTAEYY.js → chunk-GTLJYAEG.js} +2 -2
  195. package/dist/{chunk-M4LFDGI6.js → chunk-GYQT47YZ.js} +2 -2
  196. package/dist/{chunk-JSH3HFDQ.js → chunk-H3BQFEN5.js} +2 -2
  197. package/dist/{chunk-OV4WREMW.js → chunk-HKB5C2KY.js} +7 -7
  198. package/dist/{chunk-BLBOYCOV.js → chunk-HKV4MQ2W.js} +5 -5
  199. package/dist/{chunk-4MGFUPQT.js → chunk-HOJL2GKW.js} +4 -4
  200. package/dist/{chunk-HR7YTBR7.js → chunk-IASDP44E.js} +4 -4
  201. package/dist/{chunk-YMRI5QKG.js → chunk-IV5QQLCS.js} +2 -2
  202. package/dist/{chunk-JUHUKZGU.js → chunk-JD3D6Y4U.js} +2 -2
  203. package/dist/{chunk-FR67FG2U.js → chunk-JFRKBSWI.js} +35 -25
  204. package/dist/chunk-JFRKBSWI.js.map +1 -0
  205. package/dist/{chunk-AXTLFK4T.js → chunk-KAV63FBG.js} +2 -2
  206. package/dist/{chunk-2PBGVMM2.js → chunk-KOFO6QZY.js} +2 -2
  207. package/dist/{chunk-RP5FK3SO.js → chunk-L7LCSZ3H.js} +3 -3
  208. package/dist/{chunk-MNXVXW4T.js → chunk-L7S6N67X.js} +2 -2
  209. package/dist/{chunk-N3QUEBNS.js → chunk-L7VH6IMR.js} +14 -1
  210. package/dist/chunk-L7VH6IMR.js.map +1 -0
  211. package/dist/{chunk-JXPHU3K5.js → chunk-LGJ2H4AH.js} +5 -5
  212. package/dist/{chunk-W4YWU7LQ.js → chunk-LO2B7FDQ.js} +2 -2
  213. package/dist/{chunk-PWR7K5OP.js → chunk-LV4UTYAD.js} +2 -2
  214. package/dist/{chunk-OG2FP6SE.js → chunk-M4NFXC5R.js} +4 -4
  215. package/dist/{chunk-ZPIMPOHV.js → chunk-M7E66OSC.js} +4 -4
  216. package/dist/{chunk-OGGPQVIG.js → chunk-MDTSMJ7C.js} +3 -3
  217. package/dist/{chunk-YDI6IJ6F.js → chunk-MI2MVH3I.js} +4 -4
  218. package/dist/{chunk-6ZY5XU4J.js → chunk-MQPT254A.js} +4 -4
  219. package/dist/{chunk-EWT3WMVY.js → chunk-MYH7VISV.js} +5 -5
  220. package/dist/{chunk-7NSX7A5H.js → chunk-N5PY7IXI.js} +3 -3
  221. package/dist/{chunk-BHIGHSXA.js → chunk-NNXZ5RK5.js} +4 -4
  222. package/dist/{chunk-EQ7PWGBN.js → chunk-O7HLQTB7.js} +3 -3
  223. package/dist/{chunk-DW5FRWRQ.js → chunk-OAWEUKUC.js} +2 -2
  224. package/dist/{chunk-O4VCZTK4.js → chunk-OGHW7RQC.js} +2 -2
  225. package/dist/{chunk-XR6WBW23.js → chunk-OVGASVPW.js} +2 -2
  226. package/dist/{chunk-HEBQS7QP.js → chunk-OXYR2HVK.js} +3 -3
  227. package/dist/{chunk-TNVO2DTB.js → chunk-P7FQUGED.js} +5 -5
  228. package/dist/{chunk-343TTIHD.js → chunk-PENJBKPH.js} +3 -3
  229. package/dist/{chunk-2RQINU5T.js → chunk-PKFFJAQ6.js} +2 -2
  230. package/dist/{chunk-M4LQRQFL.js → chunk-PW2WLDX3.js} +2 -2
  231. package/dist/{chunk-WRDPWEIC.js → chunk-Q3GSDSK2.js} +6 -6
  232. package/dist/{chunk-SYJMI2NP.js → chunk-Q3OFOOO7.js} +2 -2
  233. package/dist/{chunk-GGI7GM5O.js → chunk-QE2C35TO.js} +4 -4
  234. package/dist/{chunk-NQN5Z36J.js → chunk-QLI7ES7Z.js} +10 -1
  235. package/dist/chunk-QLI7ES7Z.js.map +1 -0
  236. package/dist/{chunk-CT5K725B.js → chunk-QQLGSMGE.js} +2 -2
  237. package/dist/{chunk-7MN6I5NK.js → chunk-QXFPTRHB.js} +3 -3
  238. package/dist/{chunk-CZPU5TW3.js → chunk-RFZU5BTG.js} +2 -2
  239. package/dist/{chunk-JB67KPGM.js → chunk-RRO2EOJB.js} +4 -4
  240. package/dist/{chunk-MZQTHSLN.js → chunk-S7HRED4D.js} +2 -2
  241. package/dist/{chunk-NYEA7JAI.js → chunk-SC72DRTX.js} +6 -6
  242. package/dist/{chunk-JWW2Z3RH.js → chunk-SMZBGHR2.js} +7 -7
  243. package/dist/{chunk-EZSEAYYT.js → chunk-SSWZHR46.js} +5 -5
  244. package/dist/{chunk-NA7MIEG6.js → chunk-SZETT7QV.js} +2 -2
  245. package/dist/chunk-SZS7VZJN.js +25 -0
  246. package/dist/chunk-SZS7VZJN.js.map +1 -0
  247. package/dist/{chunk-2HPP6RVC.js → chunk-TQOPF7LD.js} +2 -2
  248. package/dist/{chunk-OLVZ6TOV.js → chunk-TUO47RL2.js} +4 -4
  249. package/dist/{chunk-N5IVVLTH.js → chunk-UG76BO5K.js} +79 -19
  250. package/dist/chunk-UG76BO5K.js.map +1 -0
  251. package/dist/{chunk-4IVDVZZ2.js → chunk-UGL6SJN6.js} +3 -3
  252. package/dist/{chunk-QJRDDVZ2.js → chunk-V5P5Q6HM.js} +3 -3
  253. package/dist/{chunk-73NJCGQG.js → chunk-VIK3HAUQ.js} +2 -2
  254. package/dist/{chunk-KM5O4ICK.js → chunk-VK4ULJFH.js} +2 -2
  255. package/dist/{chunk-QYNCPS5W.js → chunk-WBKWIFXA.js} +6 -6
  256. package/dist/{chunk-X4Z62ZQY.js → chunk-WETAIIKC.js} +2 -2
  257. package/dist/{chunk-GMTM6EN7.js → chunk-WKF54CCK.js} +7 -7
  258. package/dist/{chunk-KT6HWAEN.js → chunk-WZUNBSS7.js} +2 -2
  259. package/dist/{chunk-Y2B3I3IH.js → chunk-X5RDHO6G.js} +2 -2
  260. package/dist/{chunk-TXKZEKJN.js → chunk-XNOSTV5F.js} +2 -2
  261. package/dist/{chunk-7JXLGOM2.js → chunk-Y55ILY2F.js} +3 -3
  262. package/dist/{chunk-HI2OFZSZ.js → chunk-YPILHGEO.js} +2 -2
  263. package/dist/{chunk-V3PLFYKO.js → chunk-ZAJO2B75.js} +2 -2
  264. package/dist/data-display/Alert.js +5 -5
  265. package/dist/data-display/Avatar.js +3 -3
  266. package/dist/data-display/Badge.js +7 -7
  267. package/dist/data-display/Banner.js +4 -4
  268. package/dist/data-display/CardKit.js +14 -14
  269. package/dist/data-display/Carousel.js +1 -1
  270. package/dist/data-display/Chart.js +6 -6
  271. package/dist/data-display/DataViews.js +69 -68
  272. package/dist/data-display/DescriptionItem.js +4 -4
  273. package/dist/data-display/FleetMap.js +13 -13
  274. package/dist/data-display/Lightbox.js +1 -1
  275. package/dist/data-display/MapPreview.js +7 -7
  276. package/dist/data-display/Progress.js +4 -4
  277. package/dist/data-display/Sheet.js +4 -4
  278. package/dist/data-display/Table.js +2 -2
  279. package/dist/feedback/ConfirmAction.js +4 -4
  280. package/dist/form/AddressAutocomplete.js +5 -5
  281. package/dist/form/Autocomplete.js +2 -2
  282. package/dist/form/Button.js +3 -3
  283. package/dist/form/Calendar.js +3 -3
  284. package/dist/form/CategorySelect.js +4 -4
  285. package/dist/form/Checkbox.js +2 -2
  286. package/dist/form/Command.js +4 -4
  287. package/dist/form/DateRangePicker.js +10 -10
  288. package/dist/form/Label.js +1 -1
  289. package/dist/form/Menubar.js +1 -1
  290. package/dist/form/PhoneInput.js +3 -3
  291. package/dist/form/RichTextEditor.js +2 -2
  292. package/dist/form/Switch.js +6 -5
  293. package/dist/form/total-form.js +10 -10
  294. package/dist/icons.js +4 -4
  295. package/dist/layout/Box.js +4 -4
  296. package/dist/layout/Stack.js +5 -5
  297. package/dist/native/chunks/{chunk-2R2R35C5.js → chunk-2SBTJSQE.js} +5 -5
  298. package/dist/native/chunks/{chunk-WL5LXVCK.js → chunk-6L4UZBQP.js} +3 -3
  299. package/dist/native/chunks/{chunk-LEMMXZFN.js → chunk-MP3UDWTT.js} +10 -1
  300. package/dist/native/chunks/{chunk-LEMMXZFN.js.map → chunk-MP3UDWTT.js.map} +1 -1
  301. package/dist/native/chunks/{chunk-GW7TQ7HO.js → chunk-QEQZ5AF6.js} +3 -3
  302. package/dist/native/chunks/{chunk-7LTVGW23.js → chunk-UII3IFLP.js} +2 -2
  303. package/dist/native/chunks/{chunk-75JQYVDZ.js → chunk-UYREIOEM.js} +2 -2
  304. package/dist/native/chunks/{chunk-GWGIWQO7.js → chunk-XI7HTAVN.js} +2 -2
  305. package/dist/native/chunks/{chunk-QYUD3S6F.js → chunk-ZOP7UAZK.js} +2 -2
  306. package/dist/native/data-display/Alert.js +21 -6
  307. package/dist/native/data-display/Alert.js.map +1 -1
  308. package/dist/native/data-display/Avatar.js +3 -3
  309. package/dist/native/data-display/Badge.js +3 -3
  310. package/dist/native/data-display/Chip.js +3 -3
  311. package/dist/native/data-display/EmptyState.js +5 -5
  312. package/dist/native/data-display/ErrorState.js +4 -4
  313. package/dist/native/data-display/FleetMap.js +6 -6
  314. package/dist/native/data-display/LoadingState.js +2 -2
  315. package/dist/native/data-display/Progress.js +2 -2
  316. package/dist/native/feedback/Dialog.js +3 -3
  317. package/dist/native/form/Button.js +3 -3
  318. package/dist/native/form/Checkbox.js +3 -3
  319. package/dist/native/form/Input.js +3 -3
  320. package/dist/native/form/Select.js +4 -4
  321. package/dist/native/form/Switch.js +26 -8
  322. package/dist/native/form/Switch.js.map +1 -1
  323. package/dist/native/icons.js +3 -3
  324. package/dist/native/layout/Box.js +3 -3
  325. package/dist/native/layout/Card.js +2 -2
  326. package/dist/native/layout/Container.js +2 -2
  327. package/dist/native/layout/Skeleton.js +3 -3
  328. package/dist/native/layout/Spacer.js +2 -2
  329. package/dist/native/layout/Stack.js +3 -3
  330. package/dist/native/provider.js +2 -2
  331. package/dist/native/tokens.js +3 -1
  332. package/dist/native/typography/Heading.js +2 -2
  333. package/dist/native/typography/Paragraph.js +2 -2
  334. package/dist/native/typography/Text.js +2 -2
  335. package/dist/navigation/AppHeader.js +7 -7
  336. package/dist/provider.js +4 -4
  337. package/dist/social-login-button.js +9 -9
  338. package/dist/tokens.js +3 -1
  339. package/dist/types/components/data-display/Alert/Alert.base.d.ts +28 -2
  340. package/dist/types/components/data-display/Alert/Alert.base.d.ts.map +1 -1
  341. package/dist/types/components/data-display/Alert/Alert.helpers.d.ts +39 -0
  342. package/dist/types/components/data-display/Alert/Alert.helpers.d.ts.map +1 -1
  343. package/dist/types/components/form/Button/Button.styles.d.ts.map +1 -1
  344. package/dist/types/components/form/Switch/Switch.d.ts.map +1 -1
  345. package/dist/types/components/form/Switch/Switch.ids.d.ts +42 -0
  346. package/dist/types/components/form/Switch/Switch.ids.d.ts.map +1 -0
  347. package/dist/types/components/form/Switch/Switch.metrics.d.ts +19 -0
  348. package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  349. package/dist/types/components/form/Switch/Switch.parts.d.ts +31 -11
  350. package/dist/types/components/form/Switch/Switch.parts.d.ts.map +1 -1
  351. package/dist/types/components/form/Switch/Switch.styles.d.ts +6 -0
  352. package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
  353. package/dist/types/tokens/theme.d.ts +38 -0
  354. package/dist/types/tokens/theme.d.ts.map +1 -1
  355. package/dist/types-native/components/data-display/Alert/Alert.base.d.ts +28 -2
  356. package/dist/types-native/components/data-display/Alert/Alert.base.d.ts.map +1 -1
  357. package/dist/types-native/components/data-display/Alert/Alert.helpers.d.ts +39 -0
  358. package/dist/types-native/components/data-display/Alert/Alert.helpers.d.ts.map +1 -1
  359. package/dist/types-native/components/data-display/Alert/Alert.native.d.ts.map +1 -1
  360. package/dist/types-native/components/form/Switch/Switch.look.native.d.ts +26 -2
  361. package/dist/types-native/components/form/Switch/Switch.look.native.d.ts.map +1 -1
  362. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +19 -0
  363. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  364. package/dist/types-native/components/form/Switch/Switch.native.d.ts.map +1 -1
  365. package/dist/types-native/tokens/theme.d.ts +38 -0
  366. package/dist/types-native/tokens/theme.d.ts.map +1 -1
  367. package/dist/typography/Heading.js +4 -4
  368. package/dist/typography/Paragraph.js +2 -2
  369. package/dist/typography/Text.js +3 -3
  370. package/dist/user-avatar.js +8 -8
  371. package/package.json +1 -1
  372. package/src/components/data-display/Alert/Alert.base.ts +29 -2
  373. package/src/components/data-display/Alert/Alert.helpers.ts +50 -0
  374. package/src/components/data-display/Alert/Alert.md +29 -1
  375. package/src/components/data-display/Alert/Alert.native.tsx +8 -4
  376. package/src/components/data-display/Alert/Alert.tsx +5 -5
  377. package/src/components/form/Button/Button.md +8 -0
  378. package/src/components/form/Button/Button.styles.ts +24 -3
  379. package/src/components/form/Switch/Switch.ids.ts +63 -0
  380. package/src/components/form/Switch/Switch.look.native.ts +45 -2
  381. package/src/components/form/Switch/Switch.md +34 -9
  382. package/src/components/form/Switch/Switch.metrics.ts +21 -0
  383. package/src/components/form/Switch/Switch.native.tsx +19 -6
  384. package/src/components/form/Switch/Switch.parts.tsx +150 -17
  385. package/src/components/form/Switch/Switch.styles.ts +59 -6
  386. package/src/components/form/Switch/Switch.tsx +32 -30
  387. package/src/tokens/theme.ts +50 -0
  388. package/dist/chunk-2ECT4IY2.js.map +0 -1
  389. package/dist/chunk-BB2OUERT.js.map +0 -1
  390. package/dist/chunk-FR67FG2U.js.map +0 -1
  391. package/dist/chunk-N3QUEBNS.js.map +0 -1
  392. package/dist/chunk-N5IVVLTH.js.map +0 -1
  393. package/dist/chunk-NQN5Z36J.js.map +0 -1
  394. package/dist/chunk-WNMYWQ7D.js.map +0 -1
  395. /package/dist/{chunk-2GI7ANEL.js.map → chunk-22X7TT6Z.js.map} +0 -0
  396. /package/dist/{chunk-WR5JFDQ5.js.map → chunk-27BL3DNT.js.map} +0 -0
  397. /package/dist/{chunk-E55CJV65.js.map → chunk-2KVQIGVE.js.map} +0 -0
  398. /package/dist/{chunk-W3FAKT3D.js.map → chunk-2SWQ6HIK.js.map} +0 -0
  399. /package/dist/{chunk-ISW5K72V.js.map → chunk-2ZRZTGWP.js.map} +0 -0
  400. /package/dist/{chunk-I5SBTNV2.js.map → chunk-3GB6KWHH.js.map} +0 -0
  401. /package/dist/{chunk-ZEG2LNBY.js.map → chunk-3PJLT5FX.js.map} +0 -0
  402. /package/dist/{chunk-57Z2ND3N.js.map → chunk-3VZT2FAI.js.map} +0 -0
  403. /package/dist/{chunk-PFDM2OIP.js.map → chunk-45OHGD2B.js.map} +0 -0
  404. /package/dist/{chunk-BH5BXLGI.js.map → chunk-4A2Q22HO.js.map} +0 -0
  405. /package/dist/{chunk-46UPILLK.js.map → chunk-4ETQRBZC.js.map} +0 -0
  406. /package/dist/{chunk-WM6Y2S6W.js.map → chunk-5QUSX3TC.js.map} +0 -0
  407. /package/dist/{chunk-AVGTTWTE.js.map → chunk-65DLYC4S.js.map} +0 -0
  408. /package/dist/{chunk-TVPPA4RD.js.map → chunk-65METCKT.js.map} +0 -0
  409. /package/dist/{chunk-OQFSYMHJ.js.map → chunk-67ALTEWH.js.map} +0 -0
  410. /package/dist/{chunk-OGGHD64H.js.map → chunk-6SK3MTYJ.js.map} +0 -0
  411. /package/dist/{chunk-OE2ZVL67.js.map → chunk-6VHCSPKK.js.map} +0 -0
  412. /package/dist/{chunk-WAPJ2DL3.js.map → chunk-72T5PAW7.js.map} +0 -0
  413. /package/dist/{chunk-SLVQ33AN.js.map → chunk-77DF5LKI.js.map} +0 -0
  414. /package/dist/{chunk-7KWBGMQC.js.map → chunk-77OXG6DH.js.map} +0 -0
  415. /package/dist/{chunk-Y3KRUT7O.js.map → chunk-7AIHK2XM.js.map} +0 -0
  416. /package/dist/{chunk-MHV5Y5MR.js.map → chunk-7KEGJH3Q.js.map} +0 -0
  417. /package/dist/{chunk-KMXAPYU2.js.map → chunk-7NEUPEV5.js.map} +0 -0
  418. /package/dist/{chunk-67L7HMEP.js.map → chunk-7Z2AQEC5.js.map} +0 -0
  419. /package/dist/{chunk-PQECNGDE.js.map → chunk-AGYGNNOM.js.map} +0 -0
  420. /package/dist/{chunk-ZTF5C2GA.js.map → chunk-B5SW7I5W.js.map} +0 -0
  421. /package/dist/{chunk-TXHJX2NG.js.map → chunk-BGYLL467.js.map} +0 -0
  422. /package/dist/{chunk-R7R3LOKW.js.map → chunk-CA7TA36R.js.map} +0 -0
  423. /package/dist/{chunk-FPFUXRD2.js.map → chunk-CKJI7JO5.js.map} +0 -0
  424. /package/dist/{chunk-HMV4QMXS.js.map → chunk-CMN26J5Y.js.map} +0 -0
  425. /package/dist/{chunk-KVEHH4SA.js.map → chunk-DB2MAYPK.js.map} +0 -0
  426. /package/dist/{chunk-V4FKHLEB.js.map → chunk-DTIB5KWP.js.map} +0 -0
  427. /package/dist/{chunk-MESRKY67.js.map → chunk-DW6GBMLQ.js.map} +0 -0
  428. /package/dist/{chunk-JO6BBSGY.js.map → chunk-DWJBOR47.js.map} +0 -0
  429. /package/dist/{chunk-YW5T6KZ5.js.map → chunk-DYESJJ3Q.js.map} +0 -0
  430. /package/dist/{chunk-TZDDL3DR.js.map → chunk-ECMJ5VPW.js.map} +0 -0
  431. /package/dist/{chunk-OH3YGJT5.js.map → chunk-EMNGIYH6.js.map} +0 -0
  432. /package/dist/{chunk-CZJLWCEG.js.map → chunk-EPNCYUQ7.js.map} +0 -0
  433. /package/dist/{chunk-JZXWCEH5.js.map → chunk-EQA4VQEO.js.map} +0 -0
  434. /package/dist/{chunk-3N6EK6K5.js.map → chunk-ERX4XIYC.js.map} +0 -0
  435. /package/dist/{chunk-TTLI6PF7.js.map → chunk-FF3R67WD.js.map} +0 -0
  436. /package/dist/{chunk-KLREH4X6.js.map → chunk-G2JPUHEJ.js.map} +0 -0
  437. /package/dist/{chunk-4J5EN4FQ.js.map → chunk-GBX5ACPF.js.map} +0 -0
  438. /package/dist/{chunk-ZZMZF7PZ.js.map → chunk-GQJ4NCZ6.js.map} +0 -0
  439. /package/dist/{chunk-IPVYEPXO.js.map → chunk-GSTRPZS4.js.map} +0 -0
  440. /package/dist/{chunk-HFXTAEYY.js.map → chunk-GTLJYAEG.js.map} +0 -0
  441. /package/dist/{chunk-M4LFDGI6.js.map → chunk-GYQT47YZ.js.map} +0 -0
  442. /package/dist/{chunk-JSH3HFDQ.js.map → chunk-H3BQFEN5.js.map} +0 -0
  443. /package/dist/{chunk-OV4WREMW.js.map → chunk-HKB5C2KY.js.map} +0 -0
  444. /package/dist/{chunk-BLBOYCOV.js.map → chunk-HKV4MQ2W.js.map} +0 -0
  445. /package/dist/{chunk-4MGFUPQT.js.map → chunk-HOJL2GKW.js.map} +0 -0
  446. /package/dist/{chunk-HR7YTBR7.js.map → chunk-IASDP44E.js.map} +0 -0
  447. /package/dist/{chunk-YMRI5QKG.js.map → chunk-IV5QQLCS.js.map} +0 -0
  448. /package/dist/{chunk-JUHUKZGU.js.map → chunk-JD3D6Y4U.js.map} +0 -0
  449. /package/dist/{chunk-AXTLFK4T.js.map → chunk-KAV63FBG.js.map} +0 -0
  450. /package/dist/{chunk-2PBGVMM2.js.map → chunk-KOFO6QZY.js.map} +0 -0
  451. /package/dist/{chunk-RP5FK3SO.js.map → chunk-L7LCSZ3H.js.map} +0 -0
  452. /package/dist/{chunk-MNXVXW4T.js.map → chunk-L7S6N67X.js.map} +0 -0
  453. /package/dist/{chunk-JXPHU3K5.js.map → chunk-LGJ2H4AH.js.map} +0 -0
  454. /package/dist/{chunk-W4YWU7LQ.js.map → chunk-LO2B7FDQ.js.map} +0 -0
  455. /package/dist/{chunk-PWR7K5OP.js.map → chunk-LV4UTYAD.js.map} +0 -0
  456. /package/dist/{chunk-OG2FP6SE.js.map → chunk-M4NFXC5R.js.map} +0 -0
  457. /package/dist/{chunk-ZPIMPOHV.js.map → chunk-M7E66OSC.js.map} +0 -0
  458. /package/dist/{chunk-OGGPQVIG.js.map → chunk-MDTSMJ7C.js.map} +0 -0
  459. /package/dist/{chunk-YDI6IJ6F.js.map → chunk-MI2MVH3I.js.map} +0 -0
  460. /package/dist/{chunk-6ZY5XU4J.js.map → chunk-MQPT254A.js.map} +0 -0
  461. /package/dist/{chunk-EWT3WMVY.js.map → chunk-MYH7VISV.js.map} +0 -0
  462. /package/dist/{chunk-7NSX7A5H.js.map → chunk-N5PY7IXI.js.map} +0 -0
  463. /package/dist/{chunk-BHIGHSXA.js.map → chunk-NNXZ5RK5.js.map} +0 -0
  464. /package/dist/{chunk-EQ7PWGBN.js.map → chunk-O7HLQTB7.js.map} +0 -0
  465. /package/dist/{chunk-DW5FRWRQ.js.map → chunk-OAWEUKUC.js.map} +0 -0
  466. /package/dist/{chunk-O4VCZTK4.js.map → chunk-OGHW7RQC.js.map} +0 -0
  467. /package/dist/{chunk-XR6WBW23.js.map → chunk-OVGASVPW.js.map} +0 -0
  468. /package/dist/{chunk-HEBQS7QP.js.map → chunk-OXYR2HVK.js.map} +0 -0
  469. /package/dist/{chunk-TNVO2DTB.js.map → chunk-P7FQUGED.js.map} +0 -0
  470. /package/dist/{chunk-343TTIHD.js.map → chunk-PENJBKPH.js.map} +0 -0
  471. /package/dist/{chunk-2RQINU5T.js.map → chunk-PKFFJAQ6.js.map} +0 -0
  472. /package/dist/{chunk-M4LQRQFL.js.map → chunk-PW2WLDX3.js.map} +0 -0
  473. /package/dist/{chunk-WRDPWEIC.js.map → chunk-Q3GSDSK2.js.map} +0 -0
  474. /package/dist/{chunk-SYJMI2NP.js.map → chunk-Q3OFOOO7.js.map} +0 -0
  475. /package/dist/{chunk-GGI7GM5O.js.map → chunk-QE2C35TO.js.map} +0 -0
  476. /package/dist/{chunk-CT5K725B.js.map → chunk-QQLGSMGE.js.map} +0 -0
  477. /package/dist/{chunk-7MN6I5NK.js.map → chunk-QXFPTRHB.js.map} +0 -0
  478. /package/dist/{chunk-CZPU5TW3.js.map → chunk-RFZU5BTG.js.map} +0 -0
  479. /package/dist/{chunk-JB67KPGM.js.map → chunk-RRO2EOJB.js.map} +0 -0
  480. /package/dist/{chunk-MZQTHSLN.js.map → chunk-S7HRED4D.js.map} +0 -0
  481. /package/dist/{chunk-NYEA7JAI.js.map → chunk-SC72DRTX.js.map} +0 -0
  482. /package/dist/{chunk-JWW2Z3RH.js.map → chunk-SMZBGHR2.js.map} +0 -0
  483. /package/dist/{chunk-EZSEAYYT.js.map → chunk-SSWZHR46.js.map} +0 -0
  484. /package/dist/{chunk-NA7MIEG6.js.map → chunk-SZETT7QV.js.map} +0 -0
  485. /package/dist/{chunk-2HPP6RVC.js.map → chunk-TQOPF7LD.js.map} +0 -0
  486. /package/dist/{chunk-OLVZ6TOV.js.map → chunk-TUO47RL2.js.map} +0 -0
  487. /package/dist/{chunk-4IVDVZZ2.js.map → chunk-UGL6SJN6.js.map} +0 -0
  488. /package/dist/{chunk-QJRDDVZ2.js.map → chunk-V5P5Q6HM.js.map} +0 -0
  489. /package/dist/{chunk-73NJCGQG.js.map → chunk-VIK3HAUQ.js.map} +0 -0
  490. /package/dist/{chunk-KM5O4ICK.js.map → chunk-VK4ULJFH.js.map} +0 -0
  491. /package/dist/{chunk-QYNCPS5W.js.map → chunk-WBKWIFXA.js.map} +0 -0
  492. /package/dist/{chunk-X4Z62ZQY.js.map → chunk-WETAIIKC.js.map} +0 -0
  493. /package/dist/{chunk-GMTM6EN7.js.map → chunk-WKF54CCK.js.map} +0 -0
  494. /package/dist/{chunk-KT6HWAEN.js.map → chunk-WZUNBSS7.js.map} +0 -0
  495. /package/dist/{chunk-Y2B3I3IH.js.map → chunk-X5RDHO6G.js.map} +0 -0
  496. /package/dist/{chunk-TXKZEKJN.js.map → chunk-XNOSTV5F.js.map} +0 -0
  497. /package/dist/{chunk-7JXLGOM2.js.map → chunk-Y55ILY2F.js.map} +0 -0
  498. /package/dist/{chunk-HI2OFZSZ.js.map → chunk-YPILHGEO.js.map} +0 -0
  499. /package/dist/{chunk-V3PLFYKO.js.map → chunk-ZAJO2B75.js.map} +0 -0
  500. /package/dist/native/chunks/{chunk-2R2R35C5.js.map → chunk-2SBTJSQE.js.map} +0 -0
  501. /package/dist/native/chunks/{chunk-WL5LXVCK.js.map → chunk-6L4UZBQP.js.map} +0 -0
  502. /package/dist/native/chunks/{chunk-GW7TQ7HO.js.map → chunk-QEQZ5AF6.js.map} +0 -0
  503. /package/dist/native/chunks/{chunk-7LTVGW23.js.map → chunk-UII3IFLP.js.map} +0 -0
  504. /package/dist/native/chunks/{chunk-75JQYVDZ.js.map → chunk-UYREIOEM.js.map} +0 -0
  505. /package/dist/native/chunks/{chunk-GWGIWQO7.js.map → chunk-XI7HTAVN.js.map} +0 -0
  506. /package/dist/native/chunks/{chunk-QYUD3S6F.js.map → chunk-ZOP7UAZK.js.map} +0 -0
@@ -201,6 +201,14 @@ var MODE_DEFAULTS = {
201
201
  function contrastText(background) {
202
202
  return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD ? LIGHT_TEXT_PRIMARY : DARK_TEXT_PRIMARY;
203
203
  }
204
+ function inkOver(fills, fallback) {
205
+ try {
206
+ const worstCase = (ink) => Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));
207
+ return worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY) ? LIGHT_TEXT_PRIMARY : DARK_TEXT_PRIMARY;
208
+ } catch {
209
+ return fallback;
210
+ }
211
+ }
204
212
  function augmentColor(seed) {
205
213
  const partial = typeof seed === "string" ? { main: seed } : seed;
206
214
  const main = partial.main ?? partial.light ?? partial.dark;
@@ -305,6 +313,7 @@ export {
305
313
  GREY,
306
314
  DEFAULT_BRAND,
307
315
  contrastText,
316
+ inkOver,
308
317
  augmentColor,
309
318
  NEUTRAL,
310
319
  TYPE_SIZES,
@@ -314,4 +323,4 @@ export {
314
323
  createUiTheme,
315
324
  DEFAULT_UI_THEME
316
325
  };
317
- //# sourceMappingURL=chunk-LEMMXZFN.js.map
326
+ //# sourceMappingURL=chunk-MP3UDWTT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tokens/color.ts","../../../src/tokens/heading-scale.ts","../../../src/tokens/css-units.ts","../../../src/tokens/theme.ts"],"sourcesContent":["/**\n * COLOUR ARITHMETIC WITH NO RENDERER BEHIND IT.\n *\n * Every shade the web components paint comes out of MUI's colour manipulator:\n * `lighten(main, 0.2)` is a palette's `light`, `darken(main, 0.3)` its `dark`,\n * `alpha(main, 0.1)` the hover wash on an outline button. A native component\n * that wants the SAME pixel has to run the SAME arithmetic, and it cannot\n * import it — `@mui/material/styles` drags emotion and the DOM in behind it.\n *\n * So the arithmetic lives here, once, with nothing behind it. It is a faithful\n * port of `@mui/system/colorManipulator` (MIT), down to the truncation:\n * `lighten('#6366F1', 0.2)` is `rgb(130, 132, 243)` on both sides because both\n * TRUNCATE 132.6 rather than round it. A port that rounded would be one pixel\n * of tint away from the web on every button, forever, and nothing would flag it.\n *\n * `color()` space strings are deliberately unsupported: nothing in this package\n * emits one, and a smaller surface is a smaller thing to keep identical.\n */\n\nexport type ColorFormat = 'rgb' | 'rgba' | 'hsl' | 'hsla';\n\nexport interface DecomposedColor {\n type: ColorFormat;\n values: number[];\n}\n\nconst FORMATS: readonly ColorFormat[] = ['rgb', 'rgba', 'hsl', 'hsla'];\n\nconst clamp = (value: number, min = 0, max = 1): number => Math.min(Math.max(min, value), max);\n\n/** `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa` to its `rgb()` / `rgba()` string. */\nexport function hexToRgb(color: string): string {\n const hex = color.slice(1);\n const pair = new RegExp(`.{1,${hex.length >= 6 ? 2 : 1}}`, 'g');\n let channels: string[] | null = hex.match(pair);\n if (channels && channels[0]?.length === 1) {\n channels = channels.map((channel) => channel + channel);\n }\n if (!channels) return '';\n\n const parts = channels.map((channel, index) =>\n index < 3 ? parseInt(channel, 16) : Math.round((parseInt(channel, 16) / 255) * 1000) / 1000,\n );\n return `rgb${channels.length === 4 ? 'a' : ''}(${parts.join(', ')})`;\n}\n\n/** Any supported colour string to its type and numeric channels. */\nexport function decomposeColor(color: string): DecomposedColor {\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n\n const marker = color.indexOf('(');\n const type = color.substring(0, marker) as ColorFormat;\n if (!FORMATS.includes(type)) {\n throw new Error(\n `@12-apps/ui: unsupported colour \"${color}\". Use #nnn, #nnnnnn, rgb(), rgba(), hsl() or hsla().`,\n );\n }\n\n const values = color\n .substring(marker + 1, color.length - 1)\n .split(',')\n .map((value) => parseFloat(value));\n\n return { type, values };\n}\n\n/** The inverse of {@link decomposeColor}, with MUI's channel truncation. */\nexport function recomposeColor({ type, values }: DecomposedColor): string {\n const parts: Array<number | string> = type.startsWith('rgb')\n ? values.map((value, index) => (index < 3 ? Math.trunc(value) : value))\n : [values[0] ?? 0, `${values[1] ?? 0}%`, `${values[2] ?? 0}%`, ...values.slice(3)];\n\n return `${type}(${parts.join(', ')})`;\n}\n\n/** An `hsl()` / `hsla()` string to its `rgb()` / `rgba()` equivalent. */\nexport function hslToRgb(color: string): string {\n const { type, values } = decomposeColor(color);\n const h = values[0] ?? 0;\n const s = (values[1] ?? 0) / 100;\n const l = (values[2] ?? 0) / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number, k = (n + h / 30) % 12): number =>\n l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n if (type === 'hsla') {\n return recomposeColor({ type: 'rgba', values: [...rgb, values[3] ?? 1] });\n }\n return recomposeColor({ type: 'rgb', values: rgb });\n}\n\n/** Relative luminance (WCAG 2.0), to three decimals like MUI. */\nexport function getLuminance(color: string): number {\n const decomposed = decomposeColor(color);\n const channels = decomposed.type.startsWith('hsl')\n ? decomposeColor(hslToRgb(color)).values\n : decomposed.values;\n\n const [r, g, b] = channels.slice(0, 3).map((value) => {\n const c = value / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n\n return Number((0.2126 * (r ?? 0) + 0.7152 * (g ?? 0) + 0.0722 * (b ?? 0)).toFixed(3));\n}\n\n/** WCAG contrast ratio between two colours, 1 to 21. */\nexport function getContrastRatio(foreground: string, background: string): number {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/** The colour with its alpha channel set to `value` (0 to 1). */\nexport function alpha(color: string, value: number): string {\n const decomposed = decomposeColor(color);\n const type: ColorFormat = decomposed.type.endsWith('a')\n ? decomposed.type\n : (`${decomposed.type}a` as ColorFormat);\n const values = decomposed.values.slice(0, 3);\n values[3] = clamp(value);\n return recomposeColor({ type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards black. */\nexport function darken(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) * (1 - amount);\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) * (1 - amount);\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards white. */\nexport function lighten(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) + (100 - (values[2] ?? 0)) * amount;\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) + (255 - (values[index] ?? 0)) * amount;\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** Darken a light colour or lighten a dark one, by `coefficient`. */\nexport function emphasize(color: string, coefficient = 0.15): string {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n","\n/**\n * THE THIRD VOCABULARY: the type scale.\n *\n * `scales.ts` opens by saying the package had both halves of every argument at\n * once until the size and colour vocabularies were declared in one place and\n * every component derived from them. The type scale was the one that never got\n * that treatment — it lived as a private `LEVELS` table inside\n * `Heading.styles.ts`, which is exactly the shape that file exists to refuse.\n *\n * Two things follow from it being private, and the second is the expensive one.\n *\n * **It could not be re-themed.** `Heading` read `theme.typography.h1.fontFamily`\n * from the theme and then ignored the theme for every other metric, so a host\n * calling `createTheme({ typography: { h1: { fontSize: '2rem' } } })` changed\n * `<Typography variant=\"h1\">` and left `<Heading level=\"h1\">` at 48px. A design\n * system whose type scale cannot be set by the design is not a system.\n *\n * **And the numbers were a landing page's.** `h1` at 3rem and `h2` at 2.5rem are\n * hero metrics. Dropped into an operations console they put a 48px title\n * directly above 14px body copy — a 3.4x jump with nothing in between — so\n * product teams stopped reaching for the component. Measured in one consuming\n * repo: `<Heading>` appeared four times in the entire codebase while raw\n * `fontSize` appeared in dozens of files. The component was not disliked, it was\n * unusable at app scale, and every host paid for that in hand-rolled CSS.\n *\n * So the defaults below are an APP scale, and `display` keeps the hero size for\n * the screens that actually want one. A marketing page asks for `display`; a\n * console asks for `h1` and gets something it can put on a page.\n */\n\n/**\n * A step on the scale.\n *\n * `display` is a SIZE, not a rank — see `Heading`, which renders it as `h1` so\n * the document still gets exactly one level-one heading.\n */\nexport type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'display';\n\n/**\n * The runtime list, declared beside the union for the reason `SIZE_VALUES`\n * gives: a story's `argTypes.options` spelled by hand drifts from the type, and\n * the direction it drifts is \"documents less than the component accepts\".\n */\nexport const HEADING_LEVELS = [\n 'display',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n] as const satisfies readonly HeadingLevel[];\n\n/** Everything one step of the scale decides. */\nexport interface HeadingMetrics {\n fontSize: string;\n lineHeight: number;\n letterSpacing?: string;\n /**\n * The weight this step carries when the caller asks for `normal`. A heading's\n * \"normal\" is not body text's 400 — it is the weight the step is meant to\n * carry, which gets heavier as the step gets larger.\n */\n normalWeight: number;\n}\n\n/**\n * The house default, in CODE rather than in a component.\n *\n * ~1.15x per step from a 1rem `h6`, which keeps six distinguishable ranks inside\n * the range an application actually uses. The old table ran 1.125rem → 4rem and\n * spent its top three steps above anything a product screen wants.\n */\nexport const HEADING_SCALE: Record<HeadingLevel, HeadingMetrics> = {\n // The hero size the old `h1` was really offering, under the name that says so.\n display: { fontSize: '3rem', lineHeight: 1.05, letterSpacing: '-0.03em', normalWeight: 800 },\n h1: { fontSize: '2rem', lineHeight: 1.2, letterSpacing: '-0.02em', normalWeight: 700 },\n h2: { fontSize: '1.75rem', lineHeight: 1.25, letterSpacing: '-0.015em', normalWeight: 700 },\n h3: { fontSize: '1.5rem', lineHeight: 1.3, letterSpacing: '-0.01em', normalWeight: 600 },\n h4: { fontSize: '1.25rem', lineHeight: 1.35, letterSpacing: '-0.005em', normalWeight: 600 },\n h5: { fontSize: '1.125rem', lineHeight: 1.4, normalWeight: 600 },\n h6: { fontSize: '1rem', lineHeight: 1.5, normalWeight: 600 },\n};\n\n/** A host's overrides: any subset of the steps, any subset of each step's metrics. */\nexport type HeadingScaleOverrides = Partial<Record<HeadingLevel, Partial<HeadingMetrics>>>;\n","/**\n * THE ONE READER OF CSS LENGTHS.\n *\n * `HEADING_SCALE` and a host's MUI overrides speak CSS — `'2rem'`, `'-0.02em'`\n * — and both `tokens/theme.ts` and `provider/mui-bridge.ts` need them as\n * numbers. Two private parsers drifted (one multiplied `em` by 16, one did\n * not), so there is one, here, with the rule spelled out: a length becomes px\n * against a 16px root, a tracking value becomes em.\n */\n\nconst ROOT_PX = 16;\n\n/** `'1.5rem'` → 24, `'1.5em'` → 24, `'20px'` → 20, `20` → 20, unparseable → `fallback`. */\nexport function cssLengthToPx(value: string | number | undefined, fallback: number): number {\n if (typeof value === 'number') return value;\n if (value === undefined) return fallback;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return fallback;\n return value.endsWith('rem') || value.endsWith('em') ? parsed * ROOT_PX : parsed;\n}\n\n/** `'-0.02em'` → -0.02, `'0.5px'` → 0.5 / 16, `undefined` → `undefined` (\"normal\"). */\nexport function cssTrackingToEm(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return undefined;\n return value.endsWith('px') ? parsed / ROOT_PX : parsed;\n}\n","import { darken, getContrastRatio, lighten } from './color';\nimport { cssLengthToPx, cssTrackingToEm } from './css-units';\nimport { HEADING_SCALE, type HeadingLevel } from './heading-scale';\n\nimport type { SizeValue } from './vocabulary';\n\n/**\n * THE THEME BOTH RENDERERS READ.\n *\n * On the web every component styles itself from MUI's `Theme`, which is built\n * by the host (`@12-apps/app-shell`'s `createAppTheme` in the origin apps) and\n * reaches a component through emotion's context. React Native has no emotion,\n * no CSS and no MUI, so a native `Button` needs the same decisions — the\n * palette, the spacing unit, the radius, the type scale — from somewhere that\n * does not import a renderer.\n *\n * This is that somewhere. `UiTheme` is a plain object of numbers and colour\n * strings. `createUiTheme` derives it the way MUI's `createPalette` derives its\n * own: a `light` shade is `lighten(main, 0.2)`, a `dark` shade `darken(main,\n * 0.3)`, `contrastText` flips at a 3:1 ratio against `rgba(0, 0, 0, 0.87)`.\n * Same seeds in, same shades out, on both sides — that is the whole basis for\n * a native button being the web button's colour and not a near miss.\n *\n * Numbers are in px on the web and dp on native; both are the CSS-pixel unit\n * a design is drawn in, so a `fontSize: 16` here IS `1rem` in a web style\n * and `16` in a `StyleSheet`. The web components keep their `rem` strings and\n * derive them from these numbers where the two meet (see `px()` below and the\n * `*.metrics.ts` file beside each ported component).\n *\n * `danger` and `neutral` are this package's names (see `./scales`); `danger`\n * is MUI's `error` and `neutral` is drawn from the grey ramp the way\n * `Button.styles.ts` has always drawn it.\n */\n\nexport type UiThemeMode = 'light' | 'dark';\n\nexport interface UiPaletteColor {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport type UiGreyStep = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport interface UiPalette {\n mode: UiThemeMode;\n primary: UiPaletteColor;\n secondary: UiPaletteColor;\n success: UiPaletteColor;\n warning: UiPaletteColor;\n info: UiPaletteColor;\n danger: UiPaletteColor;\n neutral: UiPaletteColor;\n text: { primary: string; secondary: string; disabled: string };\n background: { default: string; paper: string };\n divider: string;\n action: {\n active: string;\n hover: string;\n selected: string;\n disabled: string;\n disabledBackground: string;\n focus: string;\n };\n grey: Record<UiGreyStep, string>;\n}\n\n/** One step of the body scale: `fontSize` in px, `lineHeight` as a ratio. */\nexport interface UiTypeStep {\n fontSize: number;\n lineHeight: number;\n}\n\nexport type UiFontWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n\nexport interface UiHeadingStep extends UiTypeStep {\n /** In em, so it scales with the step. `undefined` is \"normal\". */\n letterSpacing?: number;\n normalWeight: number;\n}\n\nexport interface UiTypography {\n /**\n * Native has no fallback stacks: a font is either installed and named, or\n * `undefined` and the platform's own. The web default is MUI's Roboto stack.\n */\n fontFamily: string | undefined;\n monospaceFontFamily: string | undefined;\n sizes: Record<SizeValue, UiTypeStep>;\n weights: Record<UiFontWeight, number>;\n heading: Record<HeadingLevel, UiHeadingStep>;\n}\n\nexport interface UiTheme {\n mode: UiThemeMode;\n palette: UiPalette;\n /** MUI's `theme.spacing(n)`: `n` units of {@link UiTheme.spacingUnit}, in px. */\n spacing: (units: number) => number;\n spacingUnit: number;\n /** `md` is MUI's `shape.borderRadius`; the others are its halves and doubles. */\n radius: { sm: number; md: number; lg: number; xl: number; full: number };\n typography: UiTypography;\n zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };\n}\n\n/** A seed for one palette slot: a hex `main`, or any subset of the four shades. */\nexport type UiPaletteSeed = string | Partial<UiPaletteColor>;\n\nexport interface UiThemeOptions {\n mode?: UiThemeMode;\n palette?: Partial<{\n primary: UiPaletteSeed;\n secondary: UiPaletteSeed;\n success: UiPaletteSeed;\n warning: UiPaletteSeed;\n info: UiPaletteSeed;\n danger: UiPaletteSeed;\n background: Partial<UiPalette['background']>;\n }>;\n typography?: Partial<Pick<UiTypography, 'fontFamily' | 'monospaceFontFamily'>>;\n spacingUnit?: number;\n}\n\nconst ROOT_FONT_PX = 16;\n\n/** The px value as the rem string the web components write. */\nexport const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;\n\n/** MUI's `createPalette` defaults, exactly. */\nconst TONAL_OFFSET = 0.2;\nconst CONTRAST_THRESHOLD = 3;\nconst DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';\nconst LIGHT_TEXT_PRIMARY = '#fff';\n\nexport const GREY: Record<UiGreyStep, string> = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n};\n\n/**\n * The platform's own seeds. The pair `@12-apps/ui`'s Storybook preview and\n * `@12-apps/app-shell`'s `DEFAULT_THEME_TOKENS` both carry — keep the three in\n * step if the design tokens change.\n */\nexport const DEFAULT_BRAND: Record<UiThemeMode, { primary: string; secondary: string }> = {\n light: { primary: '#6366F1', secondary: '#8B5CF6' },\n dark: { primary: '#818CF8', secondary: '#A78BFA' },\n};\n\n/** MUI's semantic defaults per mode. These are declared shades, not derived. */\nconst SEMANTIC_DEFAULTS: Record<\n UiThemeMode,\n Record<'success' | 'warning' | 'info' | 'danger', UiPaletteColor>\n> = {\n light: {\n success: { main: '#2e7d32', light: '#4caf50', dark: '#1b5e20', contrastText: '#fff' },\n warning: { main: '#ed6c02', light: '#ff9800', dark: '#e65100', contrastText: '#fff' },\n info: { main: '#0288d1', light: '#03a9f4', dark: '#01579b', contrastText: '#fff' },\n danger: { main: '#d32f2f', light: '#ef5350', dark: '#c62828', contrastText: '#fff' },\n },\n dark: {\n success: { main: '#66bb6a', light: '#81c784', dark: '#388e3c', contrastText: DARK_TEXT_PRIMARY },\n warning: { main: '#ffa726', light: '#ffb74d', dark: '#f57c00', contrastText: DARK_TEXT_PRIMARY },\n info: { main: '#29b6f6', light: '#4fc3f7', dark: '#0288d1', contrastText: DARK_TEXT_PRIMARY },\n danger: { main: '#f44336', light: '#e57373', dark: '#d32f2f', contrastText: '#fff' },\n },\n};\n\nconst MODE_DEFAULTS: Record<\n UiThemeMode,\n Pick<UiPalette, 'text' | 'background' | 'divider' | 'action'>\n> = {\n light: {\n text: { primary: DARK_TEXT_PRIMARY, secondary: 'rgba(0, 0, 0, 0.6)', disabled: 'rgba(0, 0, 0, 0.38)' },\n background: { default: '#fff', paper: '#fff' },\n divider: 'rgba(0, 0, 0, 0.12)',\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n focus: 'rgba(0, 0, 0, 0.12)',\n },\n },\n dark: {\n text: { primary: '#fff', secondary: 'rgba(255, 255, 255, 0.7)', disabled: 'rgba(255, 255, 255, 0.5)' },\n background: { default: '#121212', paper: '#121212' },\n divider: 'rgba(255, 255, 255, 0.12)',\n action: {\n active: '#fff',\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n focus: 'rgba(255, 255, 255, 0.12)',\n },\n },\n};\n\n/**\n * MUI's `getContrastText`: white where white reads at 3:1 on the colour, the\n * light mode's dark ink otherwise. (MUI's source spells the white as the DARK\n * palette's `text.primary`, which is what made it easy to read backwards.)\n */\nexport function contrastText(background: string): string {\n return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n}\n\n/**\n * MUI's `augmentColor` for a custom colour: derive whatever shade the seed\n * left out. `light` is one tonal offset up, `dark` one and a half down.\n */\nexport function augmentColor(seed: UiPaletteSeed): UiPaletteColor {\n const partial = typeof seed === 'string' ? { main: seed } : seed;\n const main = partial.main ?? partial.light ?? partial.dark;\n if (!main) {\n throw new Error('@12-apps/ui: a palette seed needs at least a `main` colour.');\n }\n return {\n main,\n light: partial.light ?? lighten(main, TONAL_OFFSET),\n dark: partial.dark ?? darken(main, TONAL_OFFSET * 1.5),\n contrastText: partial.contrastText ?? contrastText(main),\n };\n}\n\nconst semantic = (\n mode: UiThemeMode,\n key: 'success' | 'warning' | 'info' | 'danger',\n seed: UiPaletteSeed | undefined,\n): UiPaletteColor => (seed === undefined ? SEMANTIC_DEFAULTS[mode][key] : augmentColor(seed));\n\n/** `neutral` as `accentFor` in `./scales` has always drawn it: three greys and white. */\nexport const NEUTRAL: UiPaletteColor = {\n main: GREY[600],\n light: GREY[400],\n dark: GREY[800],\n contrastText: '#fff',\n};\n\n/** The body scale `Text` renders, in px. `Text.tsx`'s rem map is this, divided by 16. */\nexport const TYPE_SIZES: Record<SizeValue, UiTypeStep> = {\n xs: { fontSize: 12, lineHeight: 1.2 },\n sm: { fontSize: 14, lineHeight: 1.3 },\n md: { fontSize: 16, lineHeight: 1.5 },\n lg: { fontSize: 18, lineHeight: 1.4 },\n xl: { fontSize: 20, lineHeight: 1.3 },\n};\n\nexport const FONT_WEIGHTS: Record<UiFontWeight, number> = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n};\n\n// `HEADING_SCALE` speaks CSS, this theme speaks numbers; `./css-units` is the\n// one place that conversion is written.\nconst HEADING_STEPS = Object.fromEntries(\n Object.entries(HEADING_SCALE).map(([level, metrics]) => [\n level,\n {\n fontSize: cssLengthToPx(metrics.fontSize, ROOT_FONT_PX),\n lineHeight: metrics.lineHeight,\n letterSpacing: cssTrackingToEm(metrics.letterSpacing),\n normalWeight: metrics.normalWeight,\n },\n ]),\n) as Record<HeadingLevel, UiHeadingStep>;\n\nexport const WEB_FONT_FAMILY = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nexport const WEB_MONOSPACE_FONT_FAMILY = 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace';\n\n/**\n * Build the theme. Every field is derived here so a host that changes one\n * seed gets every dependent shade recomputed, on both renderers, identically.\n */\nexport function createUiTheme(options: UiThemeOptions = {}): UiTheme {\n const mode = options.mode ?? 'light';\n const seeds = options.palette ?? {};\n const brand = DEFAULT_BRAND[mode];\n const defaults = MODE_DEFAULTS[mode];\n const spacingUnit = options.spacingUnit ?? 8;\n\n const palette: UiPalette = {\n mode,\n primary: augmentColor(seeds.primary ?? brand.primary),\n secondary: augmentColor(seeds.secondary ?? brand.secondary),\n success: semantic(mode, 'success', seeds.success),\n warning: semantic(mode, 'warning', seeds.warning),\n info: semantic(mode, 'info', seeds.info),\n danger: semantic(mode, 'danger', seeds.danger),\n neutral: NEUTRAL,\n text: defaults.text,\n background: { ...defaults.background, ...seeds.background },\n divider: defaults.divider,\n action: defaults.action,\n grey: GREY,\n };\n\n return {\n mode,\n palette,\n spacing: (units: number) => units * spacingUnit,\n spacingUnit,\n radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999 },\n typography: {\n fontFamily: options.typography?.fontFamily,\n monospaceFontFamily: options.typography?.monospaceFontFamily,\n sizes: TYPE_SIZES,\n weights: FONT_WEIGHTS,\n heading: HEADING_STEPS,\n },\n zIndex: { appBar: 1100, drawer: 1200, modal: 1300, snackbar: 1400, tooltip: 1500 },\n };\n}\n\n/** The palette slot a house colour name resolves to. */\nexport type UiPaletteKey = 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'danger' | 'neutral';\n\nexport const DEFAULT_UI_THEME: UiTheme = createUiTheme();\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/tokens/color.ts","../../../src/tokens/heading-scale.ts","../../../src/tokens/css-units.ts","../../../src/tokens/theme.ts"],"sourcesContent":["/**\n * COLOUR ARITHMETIC WITH NO RENDERER BEHIND IT.\n *\n * Every shade the web components paint comes out of MUI's colour manipulator:\n * `lighten(main, 0.2)` is a palette's `light`, `darken(main, 0.3)` its `dark`,\n * `alpha(main, 0.1)` the hover wash on an outline button. A native component\n * that wants the SAME pixel has to run the SAME arithmetic, and it cannot\n * import it — `@mui/material/styles` drags emotion and the DOM in behind it.\n *\n * So the arithmetic lives here, once, with nothing behind it. It is a faithful\n * port of `@mui/system/colorManipulator` (MIT), down to the truncation:\n * `lighten('#6366F1', 0.2)` is `rgb(130, 132, 243)` on both sides because both\n * TRUNCATE 132.6 rather than round it. A port that rounded would be one pixel\n * of tint away from the web on every button, forever, and nothing would flag it.\n *\n * `color()` space strings are deliberately unsupported: nothing in this package\n * emits one, and a smaller surface is a smaller thing to keep identical.\n */\n\nexport type ColorFormat = 'rgb' | 'rgba' | 'hsl' | 'hsla';\n\nexport interface DecomposedColor {\n type: ColorFormat;\n values: number[];\n}\n\nconst FORMATS: readonly ColorFormat[] = ['rgb', 'rgba', 'hsl', 'hsla'];\n\nconst clamp = (value: number, min = 0, max = 1): number => Math.min(Math.max(min, value), max);\n\n/** `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa` to its `rgb()` / `rgba()` string. */\nexport function hexToRgb(color: string): string {\n const hex = color.slice(1);\n const pair = new RegExp(`.{1,${hex.length >= 6 ? 2 : 1}}`, 'g');\n let channels: string[] | null = hex.match(pair);\n if (channels && channels[0]?.length === 1) {\n channels = channels.map((channel) => channel + channel);\n }\n if (!channels) return '';\n\n const parts = channels.map((channel, index) =>\n index < 3 ? parseInt(channel, 16) : Math.round((parseInt(channel, 16) / 255) * 1000) / 1000,\n );\n return `rgb${channels.length === 4 ? 'a' : ''}(${parts.join(', ')})`;\n}\n\n/** Any supported colour string to its type and numeric channels. */\nexport function decomposeColor(color: string): DecomposedColor {\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n\n const marker = color.indexOf('(');\n const type = color.substring(0, marker) as ColorFormat;\n if (!FORMATS.includes(type)) {\n throw new Error(\n `@12-apps/ui: unsupported colour \"${color}\". Use #nnn, #nnnnnn, rgb(), rgba(), hsl() or hsla().`,\n );\n }\n\n const values = color\n .substring(marker + 1, color.length - 1)\n .split(',')\n .map((value) => parseFloat(value));\n\n return { type, values };\n}\n\n/** The inverse of {@link decomposeColor}, with MUI's channel truncation. */\nexport function recomposeColor({ type, values }: DecomposedColor): string {\n const parts: Array<number | string> = type.startsWith('rgb')\n ? values.map((value, index) => (index < 3 ? Math.trunc(value) : value))\n : [values[0] ?? 0, `${values[1] ?? 0}%`, `${values[2] ?? 0}%`, ...values.slice(3)];\n\n return `${type}(${parts.join(', ')})`;\n}\n\n/** An `hsl()` / `hsla()` string to its `rgb()` / `rgba()` equivalent. */\nexport function hslToRgb(color: string): string {\n const { type, values } = decomposeColor(color);\n const h = values[0] ?? 0;\n const s = (values[1] ?? 0) / 100;\n const l = (values[2] ?? 0) / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number, k = (n + h / 30) % 12): number =>\n l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n if (type === 'hsla') {\n return recomposeColor({ type: 'rgba', values: [...rgb, values[3] ?? 1] });\n }\n return recomposeColor({ type: 'rgb', values: rgb });\n}\n\n/** Relative luminance (WCAG 2.0), to three decimals like MUI. */\nexport function getLuminance(color: string): number {\n const decomposed = decomposeColor(color);\n const channels = decomposed.type.startsWith('hsl')\n ? decomposeColor(hslToRgb(color)).values\n : decomposed.values;\n\n const [r, g, b] = channels.slice(0, 3).map((value) => {\n const c = value / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n\n return Number((0.2126 * (r ?? 0) + 0.7152 * (g ?? 0) + 0.0722 * (b ?? 0)).toFixed(3));\n}\n\n/** WCAG contrast ratio between two colours, 1 to 21. */\nexport function getContrastRatio(foreground: string, background: string): number {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/** The colour with its alpha channel set to `value` (0 to 1). */\nexport function alpha(color: string, value: number): string {\n const decomposed = decomposeColor(color);\n const type: ColorFormat = decomposed.type.endsWith('a')\n ? decomposed.type\n : (`${decomposed.type}a` as ColorFormat);\n const values = decomposed.values.slice(0, 3);\n values[3] = clamp(value);\n return recomposeColor({ type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards black. */\nexport function darken(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) * (1 - amount);\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) * (1 - amount);\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards white. */\nexport function lighten(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) + (100 - (values[2] ?? 0)) * amount;\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) + (255 - (values[index] ?? 0)) * amount;\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** Darken a light colour or lighten a dark one, by `coefficient`. */\nexport function emphasize(color: string, coefficient = 0.15): string {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n","\n/**\n * THE THIRD VOCABULARY: the type scale.\n *\n * `scales.ts` opens by saying the package had both halves of every argument at\n * once until the size and colour vocabularies were declared in one place and\n * every component derived from them. The type scale was the one that never got\n * that treatment — it lived as a private `LEVELS` table inside\n * `Heading.styles.ts`, which is exactly the shape that file exists to refuse.\n *\n * Two things follow from it being private, and the second is the expensive one.\n *\n * **It could not be re-themed.** `Heading` read `theme.typography.h1.fontFamily`\n * from the theme and then ignored the theme for every other metric, so a host\n * calling `createTheme({ typography: { h1: { fontSize: '2rem' } } })` changed\n * `<Typography variant=\"h1\">` and left `<Heading level=\"h1\">` at 48px. A design\n * system whose type scale cannot be set by the design is not a system.\n *\n * **And the numbers were a landing page's.** `h1` at 3rem and `h2` at 2.5rem are\n * hero metrics. Dropped into an operations console they put a 48px title\n * directly above 14px body copy — a 3.4x jump with nothing in between — so\n * product teams stopped reaching for the component. Measured in one consuming\n * repo: `<Heading>` appeared four times in the entire codebase while raw\n * `fontSize` appeared in dozens of files. The component was not disliked, it was\n * unusable at app scale, and every host paid for that in hand-rolled CSS.\n *\n * So the defaults below are an APP scale, and `display` keeps the hero size for\n * the screens that actually want one. A marketing page asks for `display`; a\n * console asks for `h1` and gets something it can put on a page.\n */\n\n/**\n * A step on the scale.\n *\n * `display` is a SIZE, not a rank — see `Heading`, which renders it as `h1` so\n * the document still gets exactly one level-one heading.\n */\nexport type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'display';\n\n/**\n * The runtime list, declared beside the union for the reason `SIZE_VALUES`\n * gives: a story's `argTypes.options` spelled by hand drifts from the type, and\n * the direction it drifts is \"documents less than the component accepts\".\n */\nexport const HEADING_LEVELS = [\n 'display',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n] as const satisfies readonly HeadingLevel[];\n\n/** Everything one step of the scale decides. */\nexport interface HeadingMetrics {\n fontSize: string;\n lineHeight: number;\n letterSpacing?: string;\n /**\n * The weight this step carries when the caller asks for `normal`. A heading's\n * \"normal\" is not body text's 400 — it is the weight the step is meant to\n * carry, which gets heavier as the step gets larger.\n */\n normalWeight: number;\n}\n\n/**\n * The house default, in CODE rather than in a component.\n *\n * ~1.15x per step from a 1rem `h6`, which keeps six distinguishable ranks inside\n * the range an application actually uses. The old table ran 1.125rem → 4rem and\n * spent its top three steps above anything a product screen wants.\n */\nexport const HEADING_SCALE: Record<HeadingLevel, HeadingMetrics> = {\n // The hero size the old `h1` was really offering, under the name that says so.\n display: { fontSize: '3rem', lineHeight: 1.05, letterSpacing: '-0.03em', normalWeight: 800 },\n h1: { fontSize: '2rem', lineHeight: 1.2, letterSpacing: '-0.02em', normalWeight: 700 },\n h2: { fontSize: '1.75rem', lineHeight: 1.25, letterSpacing: '-0.015em', normalWeight: 700 },\n h3: { fontSize: '1.5rem', lineHeight: 1.3, letterSpacing: '-0.01em', normalWeight: 600 },\n h4: { fontSize: '1.25rem', lineHeight: 1.35, letterSpacing: '-0.005em', normalWeight: 600 },\n h5: { fontSize: '1.125rem', lineHeight: 1.4, normalWeight: 600 },\n h6: { fontSize: '1rem', lineHeight: 1.5, normalWeight: 600 },\n};\n\n/** A host's overrides: any subset of the steps, any subset of each step's metrics. */\nexport type HeadingScaleOverrides = Partial<Record<HeadingLevel, Partial<HeadingMetrics>>>;\n","/**\n * THE ONE READER OF CSS LENGTHS.\n *\n * `HEADING_SCALE` and a host's MUI overrides speak CSS — `'2rem'`, `'-0.02em'`\n * — and both `tokens/theme.ts` and `provider/mui-bridge.ts` need them as\n * numbers. Two private parsers drifted (one multiplied `em` by 16, one did\n * not), so there is one, here, with the rule spelled out: a length becomes px\n * against a 16px root, a tracking value becomes em.\n */\n\nconst ROOT_PX = 16;\n\n/** `'1.5rem'` → 24, `'1.5em'` → 24, `'20px'` → 20, `20` → 20, unparseable → `fallback`. */\nexport function cssLengthToPx(value: string | number | undefined, fallback: number): number {\n if (typeof value === 'number') return value;\n if (value === undefined) return fallback;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return fallback;\n return value.endsWith('rem') || value.endsWith('em') ? parsed * ROOT_PX : parsed;\n}\n\n/** `'-0.02em'` → -0.02, `'0.5px'` → 0.5 / 16, `undefined` → `undefined` (\"normal\"). */\nexport function cssTrackingToEm(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return undefined;\n return value.endsWith('px') ? parsed / ROOT_PX : parsed;\n}\n","import { darken, getContrastRatio, lighten } from './color';\nimport { cssLengthToPx, cssTrackingToEm } from './css-units';\nimport { HEADING_SCALE, type HeadingLevel } from './heading-scale';\n\nimport type { SizeValue } from './vocabulary';\n\n/**\n * THE THEME BOTH RENDERERS READ.\n *\n * On the web every component styles itself from MUI's `Theme`, which is built\n * by the host (`@12-apps/app-shell`'s `createAppTheme` in the origin apps) and\n * reaches a component through emotion's context. React Native has no emotion,\n * no CSS and no MUI, so a native `Button` needs the same decisions — the\n * palette, the spacing unit, the radius, the type scale — from somewhere that\n * does not import a renderer.\n *\n * This is that somewhere. `UiTheme` is a plain object of numbers and colour\n * strings. `createUiTheme` derives it the way MUI's `createPalette` derives its\n * own: a `light` shade is `lighten(main, 0.2)`, a `dark` shade `darken(main,\n * 0.3)`, `contrastText` flips at a 3:1 ratio against `rgba(0, 0, 0, 0.87)`.\n * Same seeds in, same shades out, on both sides — that is the whole basis for\n * a native button being the web button's colour and not a near miss.\n *\n * Numbers are in px on the web and dp on native; both are the CSS-pixel unit\n * a design is drawn in, so a `fontSize: 16` here IS `1rem` in a web style\n * and `16` in a `StyleSheet`. The web components keep their `rem` strings and\n * derive them from these numbers where the two meet (see `px()` below and the\n * `*.metrics.ts` file beside each ported component).\n *\n * `danger` and `neutral` are this package's names (see `./scales`); `danger`\n * is MUI's `error` and `neutral` is drawn from the grey ramp the way\n * `Button.styles.ts` has always drawn it.\n */\n\nexport type UiThemeMode = 'light' | 'dark';\n\nexport interface UiPaletteColor {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport type UiGreyStep = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport interface UiPalette {\n mode: UiThemeMode;\n primary: UiPaletteColor;\n secondary: UiPaletteColor;\n success: UiPaletteColor;\n warning: UiPaletteColor;\n info: UiPaletteColor;\n danger: UiPaletteColor;\n neutral: UiPaletteColor;\n text: { primary: string; secondary: string; disabled: string };\n background: { default: string; paper: string };\n divider: string;\n action: {\n active: string;\n hover: string;\n selected: string;\n disabled: string;\n disabledBackground: string;\n focus: string;\n };\n grey: Record<UiGreyStep, string>;\n}\n\n/** One step of the body scale: `fontSize` in px, `lineHeight` as a ratio. */\nexport interface UiTypeStep {\n fontSize: number;\n lineHeight: number;\n}\n\nexport type UiFontWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n\nexport interface UiHeadingStep extends UiTypeStep {\n /** In em, so it scales with the step. `undefined` is \"normal\". */\n letterSpacing?: number;\n normalWeight: number;\n}\n\nexport interface UiTypography {\n /**\n * Native has no fallback stacks: a font is either installed and named, or\n * `undefined` and the platform's own. The web default is MUI's Roboto stack.\n */\n fontFamily: string | undefined;\n monospaceFontFamily: string | undefined;\n sizes: Record<SizeValue, UiTypeStep>;\n weights: Record<UiFontWeight, number>;\n heading: Record<HeadingLevel, UiHeadingStep>;\n}\n\nexport interface UiTheme {\n mode: UiThemeMode;\n palette: UiPalette;\n /** MUI's `theme.spacing(n)`: `n` units of {@link UiTheme.spacingUnit}, in px. */\n spacing: (units: number) => number;\n spacingUnit: number;\n /** `md` is MUI's `shape.borderRadius`; the others are its halves and doubles. */\n radius: { sm: number; md: number; lg: number; xl: number; full: number };\n typography: UiTypography;\n zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };\n}\n\n/** A seed for one palette slot: a hex `main`, or any subset of the four shades. */\nexport type UiPaletteSeed = string | Partial<UiPaletteColor>;\n\nexport interface UiThemeOptions {\n mode?: UiThemeMode;\n palette?: Partial<{\n primary: UiPaletteSeed;\n secondary: UiPaletteSeed;\n success: UiPaletteSeed;\n warning: UiPaletteSeed;\n info: UiPaletteSeed;\n danger: UiPaletteSeed;\n background: Partial<UiPalette['background']>;\n }>;\n typography?: Partial<Pick<UiTypography, 'fontFamily' | 'monospaceFontFamily'>>;\n spacingUnit?: number;\n}\n\nconst ROOT_FONT_PX = 16;\n\n/** The px value as the rem string the web components write. */\nexport const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;\n\n/** MUI's `createPalette` defaults, exactly. */\nconst TONAL_OFFSET = 0.2;\nconst CONTRAST_THRESHOLD = 3;\nconst DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';\nconst LIGHT_TEXT_PRIMARY = '#fff';\n\nexport const GREY: Record<UiGreyStep, string> = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n};\n\n/**\n * The platform's own seeds. The pair `@12-apps/ui`'s Storybook preview and\n * `@12-apps/app-shell`'s `DEFAULT_THEME_TOKENS` both carry — keep the three in\n * step if the design tokens change.\n */\nexport const DEFAULT_BRAND: Record<UiThemeMode, { primary: string; secondary: string }> = {\n light: { primary: '#6366F1', secondary: '#8B5CF6' },\n dark: { primary: '#818CF8', secondary: '#A78BFA' },\n};\n\n/** MUI's semantic defaults per mode. These are declared shades, not derived. */\nconst SEMANTIC_DEFAULTS: Record<\n UiThemeMode,\n Record<'success' | 'warning' | 'info' | 'danger', UiPaletteColor>\n> = {\n light: {\n success: { main: '#2e7d32', light: '#4caf50', dark: '#1b5e20', contrastText: '#fff' },\n warning: { main: '#ed6c02', light: '#ff9800', dark: '#e65100', contrastText: '#fff' },\n info: { main: '#0288d1', light: '#03a9f4', dark: '#01579b', contrastText: '#fff' },\n danger: { main: '#d32f2f', light: '#ef5350', dark: '#c62828', contrastText: '#fff' },\n },\n dark: {\n success: { main: '#66bb6a', light: '#81c784', dark: '#388e3c', contrastText: DARK_TEXT_PRIMARY },\n warning: { main: '#ffa726', light: '#ffb74d', dark: '#f57c00', contrastText: DARK_TEXT_PRIMARY },\n info: { main: '#29b6f6', light: '#4fc3f7', dark: '#0288d1', contrastText: DARK_TEXT_PRIMARY },\n danger: { main: '#f44336', light: '#e57373', dark: '#d32f2f', contrastText: '#fff' },\n },\n};\n\nconst MODE_DEFAULTS: Record<\n UiThemeMode,\n Pick<UiPalette, 'text' | 'background' | 'divider' | 'action'>\n> = {\n light: {\n text: { primary: DARK_TEXT_PRIMARY, secondary: 'rgba(0, 0, 0, 0.6)', disabled: 'rgba(0, 0, 0, 0.38)' },\n background: { default: '#fff', paper: '#fff' },\n divider: 'rgba(0, 0, 0, 0.12)',\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n focus: 'rgba(0, 0, 0, 0.12)',\n },\n },\n dark: {\n text: { primary: '#fff', secondary: 'rgba(255, 255, 255, 0.7)', disabled: 'rgba(255, 255, 255, 0.5)' },\n background: { default: '#121212', paper: '#121212' },\n divider: 'rgba(255, 255, 255, 0.12)',\n action: {\n active: '#fff',\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n focus: 'rgba(255, 255, 255, 0.12)',\n },\n },\n};\n\n/**\n * MUI's `getContrastText`: white where white reads at 3:1 on the colour, the\n * light mode's dark ink otherwise. (MUI's source spells the white as the DARK\n * palette's `text.primary`, which is what made it easy to read backwards.)\n */\nexport function contrastText(background: string): string {\n return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n}\n\n/**\n * The ink that reads on EVERY one of these fills (FUT-1924).\n *\n * {@link contrastText} answers for one fill, which is all MUI's `augmentColor`\n * ever needs: a solid button is a single flat colour. Two components paint the\n * label over something that is not one colour — `Button`'s `gradient` variant\n * runs between two stops, and `Switch`'s thumb travels the whole length of a\n * checked track — and both of them stated `#fff` outright instead, which is\n * white-on-pale the moment a white-labelled host hands the library a pale\n * brand. Audited across the library, those two were the only places a hardcoded\n * white sat over a surface the TENANT chooses.\n *\n * **This deliberately does not follow `contrastText`'s rule.** MUI's is a\n * threshold that PREFERS white — white wherever white clears 3:1 — which is a\n * brand-feel decision, and it is kept for every existing caller so nothing\n * already legible moves. Here the fills can disagree: over MUI's own success\n * pair white is 2.78:1 on `#4caf50` and dark ink 2.66:1 on `#1b5e20`, so\n * neither meets any threshold and asking whether one does is the wrong\n * question. The answer is whichever ink has the better WORST case across the\n * fills — which is also not what either fill says on its own, since\n * `contrastText('#4caf50')` is dark ink.\n *\n * A gradient wide enough that neither ink clears 4.5:1 anywhere is a palette\n * problem this cannot fix — it returns the less bad ink and does not pretend\n * otherwise.\n *\n * `Math.min` is the claim, and it is worth knowing that no test can prove it\n * against `Math.max` today: the two candidate inks sit at opposite ends of the\n * luminance range, so ranking them by their best fill and by their worst gives\n * the same winner for every possible pair (checked exhaustively). Worst case is\n * still what this MEANS, and the moment a third ink or one that is not an\n * extreme is offered, the two stop agreeing.\n *\n * `fallback` is returned when a fill cannot be decomposed: {@link getContrastRatio}\n * throws on a format it does not know, and a throw inside an emotion style\n * function takes the render down with it.\n */\nexport function inkOver(fills: readonly string[], fallback: string): string {\n try {\n const worstCase = (ink: string): number =>\n Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));\n\n return worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n } catch {\n return fallback;\n }\n}\n\n/**\n * MUI's `augmentColor` for a custom colour: derive whatever shade the seed\n * left out. `light` is one tonal offset up, `dark` one and a half down.\n */\nexport function augmentColor(seed: UiPaletteSeed): UiPaletteColor {\n const partial = typeof seed === 'string' ? { main: seed } : seed;\n const main = partial.main ?? partial.light ?? partial.dark;\n if (!main) {\n throw new Error('@12-apps/ui: a palette seed needs at least a `main` colour.');\n }\n return {\n main,\n light: partial.light ?? lighten(main, TONAL_OFFSET),\n dark: partial.dark ?? darken(main, TONAL_OFFSET * 1.5),\n contrastText: partial.contrastText ?? contrastText(main),\n };\n}\n\nconst semantic = (\n mode: UiThemeMode,\n key: 'success' | 'warning' | 'info' | 'danger',\n seed: UiPaletteSeed | undefined,\n): UiPaletteColor => (seed === undefined ? SEMANTIC_DEFAULTS[mode][key] : augmentColor(seed));\n\n/** `neutral` as `accentFor` in `./scales` has always drawn it: three greys and white. */\nexport const NEUTRAL: UiPaletteColor = {\n main: GREY[600],\n light: GREY[400],\n dark: GREY[800],\n contrastText: '#fff',\n};\n\n/** The body scale `Text` renders, in px. `Text.tsx`'s rem map is this, divided by 16. */\nexport const TYPE_SIZES: Record<SizeValue, UiTypeStep> = {\n xs: { fontSize: 12, lineHeight: 1.2 },\n sm: { fontSize: 14, lineHeight: 1.3 },\n md: { fontSize: 16, lineHeight: 1.5 },\n lg: { fontSize: 18, lineHeight: 1.4 },\n xl: { fontSize: 20, lineHeight: 1.3 },\n};\n\nexport const FONT_WEIGHTS: Record<UiFontWeight, number> = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n};\n\n// `HEADING_SCALE` speaks CSS, this theme speaks numbers; `./css-units` is the\n// one place that conversion is written.\nconst HEADING_STEPS = Object.fromEntries(\n Object.entries(HEADING_SCALE).map(([level, metrics]) => [\n level,\n {\n fontSize: cssLengthToPx(metrics.fontSize, ROOT_FONT_PX),\n lineHeight: metrics.lineHeight,\n letterSpacing: cssTrackingToEm(metrics.letterSpacing),\n normalWeight: metrics.normalWeight,\n },\n ]),\n) as Record<HeadingLevel, UiHeadingStep>;\n\nexport const WEB_FONT_FAMILY = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nexport const WEB_MONOSPACE_FONT_FAMILY = 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace';\n\n/**\n * Build the theme. Every field is derived here so a host that changes one\n * seed gets every dependent shade recomputed, on both renderers, identically.\n */\nexport function createUiTheme(options: UiThemeOptions = {}): UiTheme {\n const mode = options.mode ?? 'light';\n const seeds = options.palette ?? {};\n const brand = DEFAULT_BRAND[mode];\n const defaults = MODE_DEFAULTS[mode];\n const spacingUnit = options.spacingUnit ?? 8;\n\n const palette: UiPalette = {\n mode,\n primary: augmentColor(seeds.primary ?? brand.primary),\n secondary: augmentColor(seeds.secondary ?? brand.secondary),\n success: semantic(mode, 'success', seeds.success),\n warning: semantic(mode, 'warning', seeds.warning),\n info: semantic(mode, 'info', seeds.info),\n danger: semantic(mode, 'danger', seeds.danger),\n neutral: NEUTRAL,\n text: defaults.text,\n background: { ...defaults.background, ...seeds.background },\n divider: defaults.divider,\n action: defaults.action,\n grey: GREY,\n };\n\n return {\n mode,\n palette,\n spacing: (units: number) => units * spacingUnit,\n spacingUnit,\n radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999 },\n typography: {\n fontFamily: options.typography?.fontFamily,\n monospaceFontFamily: options.typography?.monospaceFontFamily,\n sizes: TYPE_SIZES,\n weights: FONT_WEIGHTS,\n heading: HEADING_STEPS,\n },\n zIndex: { appBar: 1100, drawer: 1200, modal: 1300, snackbar: 1400, tooltip: 1500 },\n };\n}\n\n/** The palette slot a house colour name resolves to. */\nexport type UiPaletteKey = 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'danger' | 'neutral';\n\nexport const DEFAULT_UI_THEME: UiTheme = createUiTheme();\n"],"mappings":"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","names":[]}
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-AR5O4BEY.js";
8
8
  import {
9
9
  useUiTheme
10
- } from "./chunk-GWGIWQO7.js";
10
+ } from "./chunk-XI7HTAVN.js";
11
11
  import {
12
12
  alpha
13
- } from "./chunk-LEMMXZFN.js";
13
+ } from "./chunk-MP3UDWTT.js";
14
14
 
15
15
  // src/components/layout/Skeleton/Skeleton.native.tsx
16
16
  import * as React from "react";
@@ -212,4 +212,4 @@ Skeleton.displayName = "Skeleton";
212
212
  export {
213
213
  Skeleton
214
214
  };
215
- //# sourceMappingURL=chunk-GW7TQ7HO.js.map
215
+ //# sourceMappingURL=chunk-QEQZ5AF6.js.map
@@ -10,7 +10,7 @@ import {
10
10
  hslToRgb,
11
11
  lighten,
12
12
  recomposeColor
13
- } from "./chunk-LEMMXZFN.js";
13
+ } from "./chunk-MP3UDWTT.js";
14
14
 
15
15
  // src/components/form/Input/Input.metrics.ts
16
16
  var muiVariantFor = (variant) => {
@@ -348,4 +348,4 @@ export {
348
348
  labelStyle,
349
349
  helperStyle
350
350
  };
351
- //# sourceMappingURL=chunk-7LTVGW23.js.map
351
+ //# sourceMappingURL=chunk-UII3IFLP.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-AR5O4BEY.js";
4
4
  import {
5
5
  useUiTheme
6
- } from "./chunk-GWGIWQO7.js";
6
+ } from "./chunk-XI7HTAVN.js";
7
7
 
8
8
  // src/components/layout/Box/Box.base.ts
9
9
  var BOX_BASE_KEYS = [
@@ -133,4 +133,4 @@ export {
133
133
  resolveBoxLayout,
134
134
  Box
135
135
  };
136
- //# sourceMappingURL=chunk-75JQYVDZ.js.map
136
+ //# sourceMappingURL=chunk-UYREIOEM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DEFAULT_UI_THEME
3
- } from "./chunk-LEMMXZFN.js";
3
+ } from "./chunk-MP3UDWTT.js";
4
4
 
5
5
  // src/provider/use-ui-theme.native.ts
6
6
  import * as React2 from "react";
@@ -18,4 +18,4 @@ export {
18
18
  UiThemeContext,
19
19
  useUiTheme
20
20
  };
21
- //# sourceMappingURL=chunk-GWGIWQO7.js.map
21
+ //# sourceMappingURL=chunk-XI7HTAVN.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-AR5O4BEY.js";
7
7
  import {
8
8
  useUiTheme
9
- } from "./chunk-GWGIWQO7.js";
9
+ } from "./chunk-XI7HTAVN.js";
10
10
 
11
11
  // src/icons/Icon.types.ts
12
12
  var ICON_SIZES = {
@@ -111,4 +111,4 @@ export {
111
111
  ICON_NAMES,
112
112
  Icon
113
113
  };
114
- //# sourceMappingURL=chunk-QYUD3S6F.js.map
114
+ //# sourceMappingURL=chunk-ZOP7UAZK.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "../chunks/chunk-5GJ5OG5R.js";
7
7
  import {
8
8
  Icon
9
- } from "../chunks/chunk-QYUD3S6F.js";
9
+ } from "../chunks/chunk-ZOP7UAZK.js";
10
10
  import {
11
11
  muiTypeStyle
12
12
  } from "../chunks/chunk-2UFNPDYT.js";
@@ -17,13 +17,13 @@ import {
17
17
  } from "../chunks/chunk-AR5O4BEY.js";
18
18
  import {
19
19
  useUiTheme
20
- } from "../chunks/chunk-GWGIWQO7.js";
20
+ } from "../chunks/chunk-XI7HTAVN.js";
21
21
  import {
22
22
  alpha,
23
23
  contrastText,
24
24
  darken,
25
25
  lighten
26
- } from "../chunks/chunk-LEMMXZFN.js";
26
+ } from "../chunks/chunk-MP3UDWTT.js";
27
27
 
28
28
  // src/components/data-display/Alert/Alert.native.tsx
29
29
  import * as React from "react";
@@ -53,6 +53,17 @@ var definedProps = (props) => Object.fromEntries(
53
53
  );
54
54
  var resolveAlertProps = (props) => ({ ...ALERT_DEFAULTS, ...definedProps(props) });
55
55
  var defaultAriaLive = (variant) => variant === "danger" ? "assertive" : "polite";
56
+ var ANNOUNCE_ROLE = {
57
+ assertive: "alert",
58
+ polite: "status"
59
+ };
60
+ var resolveAnnouncement = (props, variant) => {
61
+ const announce = props.announce;
62
+ return {
63
+ role: props.role ?? (announce === void 0 ? ALERT_DEFAULTS.role : ANNOUNCE_ROLE[announce]),
64
+ "aria-live": props["aria-live"] ?? announce ?? defaultAriaLive(variant)
65
+ };
66
+ };
56
67
  var testIdFor = (base, suffix) => base ? `${base}-${suffix}` : `alert-${suffix}`;
57
68
  var VARIANT_ICON = {
58
69
  info: "Info",
@@ -327,7 +338,10 @@ var Alert = React.forwardRef((alertProps, ref) => {
327
338
  description,
328
339
  children,
329
340
  animate,
330
- role,
341
+ // `role`, `announce` and `aria-live` all leave here and are resolved
342
+ // TOGETHER below, off `alertProps` — see `resolveAnnouncement`.
343
+ role: _role,
344
+ announce: _announce,
331
345
  "aria-atomic": ariaAtomic,
332
346
  "aria-live": _ariaLive,
333
347
  closable,
@@ -341,13 +355,14 @@ var Alert = React.forwardRef((alertProps, ref) => {
341
355
  const look = alertLook(theme, { variant, color, glow, pulse });
342
356
  const fadeIn = useFadeIn(animate);
343
357
  const dismiss = useDismiss(onClose);
358
+ const announcement = resolveAnnouncement(alertProps, variant);
344
359
  if (dismiss.gone) return null;
345
360
  return /* @__PURE__ */ jsx(Collapse, { open: dismiss.open, onCollapsed: dismiss.onCollapsed, children: /* @__PURE__ */ jsxs(
346
361
  Animated.View,
347
362
  {
348
363
  ref,
349
- role,
350
- "aria-live": alertProps["aria-live"] ?? defaultAriaLive(variant),
364
+ role: announcement.role,
365
+ "aria-live": announcement["aria-live"],
351
366
  ...webAria({ "aria-atomic": ariaAtomic }),
352
367
  tabIndex: 0,
353
368
  testID: testId,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/data-display/Alert/Alert.native.tsx","../../../src/components/data-display/Alert/Alert.helpers.ts","../../../src/components/data-display/Alert/Alert.metrics.ts","../../../src/components/data-display/Alert/Alert.look.native.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n Easing,\n type LayoutChangeEvent,\n Platform,\n Pressable,\n type Role,\n StyleSheet,\n Text as RNText,\n View,\n type ViewStyle,\n} from 'react-native';\n\nimport { defaultAriaLive, resolveAlertProps, testIdFor, VARIANT_ICON } from './Alert.helpers';\nimport {\n actionSlotStyle,\n alertLook,\n closeButtonStyle,\n descriptionStyle,\n iconSlotStyle,\n messageSlotStyle,\n messageTextStyle,\n titleStyle,\n} from './Alert.look.native';\nimport { CLOSE_BUTTON, CLOSE_DELAY_MS, COLLAPSE_MS, FADE_IN, ICON_SLOT, ICON_SPIN, PULSE } from './Alert.metrics';\nimport type { AlertProps, AlertVariant } from './Alert.types.native';\nimport { Icon } from '../../../icons/Icon.native';\nimport { webAria } from '../../../platform/aria';\nimport { renderTextChildren } from '../../../platform/text-children';\nimport { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\n\ntype AnimatedStyle = Animated.WithAnimatedValue<ViewStyle>;\nconst nativeDriver = Platform.OS !== 'web';\n\n/** A 0→1 progress that starts on mount when `animate` is set, else sits at 1. */\nfunction useProgress(animate: boolean, duration: number): Animated.Value {\n const progress = React.useRef(new Animated.Value(animate ? 0 : 1)).current;\n React.useEffect(() => {\n if (!animate) return undefined;\n const timing = Animated.timing(progress, { toValue: 1, duration, easing: Easing.out(Easing.ease), useNativeDriver: nativeDriver });\n timing.start();\n return () => timing.stop();\n }, [animate, duration, progress]);\n return progress;\n}\n\n/** The web's `fadeInScale` keyframes: in from 0 opacity, 0.95 scale and 10px above, over 300ms. */\nfunction useFadeIn(animate: boolean): AnimatedStyle | undefined {\n const progress = useProgress(animate, FADE_IN.ms);\n if (!animate) return undefined;\n return {\n opacity: progress,\n transform: [\n { scale: progress.interpolate({ inputRange: [0, 1], outputRange: [FADE_IN.scale, 1] }) },\n { translateY: progress.interpolate({ inputRange: [0, 1], outputRange: [-FADE_IN.lift, 0] }) },\n ],\n };\n}\n\n/** The web's `iconRotate` keyframes: one full turn, 0.8 → 1.1 → 1, over 600ms. */\nfunction useIconSpin(animate: boolean): AnimatedStyle | undefined {\n const progress = useProgress(animate, ICON_SPIN.ms);\n if (!animate) return undefined;\n return {\n transform: [\n { rotate: progress.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] }) },\n { scale: progress.interpolate({ inputRange: [0, 0.5, 1], outputRange: [ICON_SPIN.from, ICON_SPIN.mid, 1] }) },\n ],\n };\n}\n\n/** The web's `::after` pulse: a wash of the hue over the card, fading out every two seconds, behind the words. */\nfunction Pulse({ color, radius, testID }: { color: string; radius: number; testID: string }): React.JSX.Element {\n const progress = React.useRef(new Animated.Value(0)).current;\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(progress, { toValue: 1, duration: PULSE.ms, easing: Easing.linear, useNativeDriver: nativeDriver }),\n );\n loop.start();\n return () => loop.stop();\n }, [progress]);\n return (\n <Animated.View\n testID={testID}\n aria-hidden\n style={[\n StyleSheet.absoluteFill,\n {\n pointerEvents: 'none',\n borderRadius: radius,\n backgroundColor: color,\n opacity: progress.interpolate({ inputRange: [0, 0.7, 1], outputRange: [PULSE.alpha, 0, 0] }),\n },\n ]}\n />\n );\n}\n\n/**\n * MUI's `Collapse`: open, it is a plain wrapper with its overflow visible (so\n * a glow can escape); closing, it clips and shrinks over 300ms, then says so.\n */\nfunction Collapse({ open, onCollapsed, children }: { open: boolean; onCollapsed: () => void; children: React.ReactNode }): React.JSX.Element {\n const [height, setHeight] = React.useState<number | null>(null);\n const progress = React.useRef(new Animated.Value(1)).current;\n React.useEffect(() => {\n if (open) return undefined;\n const timing = Animated.timing(progress, { toValue: 0, duration: COLLAPSE_MS, easing: Easing.inOut(Easing.ease), useNativeDriver: false });\n timing.start(({ finished }) => {\n if (finished) onCollapsed();\n });\n return () => timing.stop();\n }, [open, onCollapsed, progress]);\n const onLayout = (event: LayoutChangeEvent): void => {\n if (open) setHeight(event.nativeEvent.layout.height);\n };\n const shrink: AnimatedStyle = height == null ? {} : { maxHeight: progress.interpolate({ inputRange: [0, 1], outputRange: [0, height] }) };\n return (\n <Animated.View style={[{ overflow: open ? 'visible' : 'hidden', opacity: progress }, shrink]}>\n <View onLayout={onLayout}>{children}</View>\n </Animated.View>\n );\n}\n\ninterface IconSlotProps {\n variant: AlertVariant;\n icon: React.ReactNode;\n color: string;\n animate: boolean;\n testID: string;\n}\n\n/** The icon slot; `glass` and `gradient` have no glyph of their own, so theirs is empty unless an `icon` is given — as on the web. */\nfunction IconSlot({ variant, icon, color, animate, testID }: IconSlotProps): React.JSX.Element {\n const theme = useUiTheme();\n const spin = useIconSpin(animate);\n const glyph = VARIANT_ICON[variant];\n return (\n <Animated.View testID={testID} style={[iconSlotStyle(theme), spin]}>\n {icon || (glyph ? <Icon name={glyph} size={ICON_SLOT.size} color={color} /> : null)}\n </Animated.View>\n );\n}\n\nfunction CloseButton({ label, ink, onPress, testID }: { label: string | undefined; ink: string; onPress: () => void; testID: string }): React.JSX.Element {\n const theme = useUiTheme();\n return (\n <Pressable role=\"button\" aria-label={label} testID={testID} onPress={onPress} style={({ pressed }) => closeButtonStyle(theme, pressed)}>\n <Icon name=\"Close\" size={CLOSE_BUTTON.iconSize} color={ink} />\n </Pressable>\n );\n}\n\ninterface ContentProps {\n title?: string;\n description?: string;\n children?: React.ReactNode;\n ink: string;\n testId: string;\n}\n\nfunction AlertContent({ title, description, children, ink, testId }: ContentProps): React.JSX.Element {\n const theme = useUiTheme();\n return (\n <View style={messageSlotStyle(theme)}>\n {title ? (\n <RNText testID={testIdFor(testId, 'title')} style={titleStyle(theme, ink, Boolean(description))}>\n {title}\n </RNText>\n ) : null}\n {description ? (\n <RNText testID={testIdFor(testId, 'message')} style={descriptionStyle(theme, ink)}>\n {description}\n </RNText>\n ) : null}\n {renderTextChildren(children, messageTextStyle(theme, ink))}\n </View>\n );\n}\n\n/** The dismiss sequence the web runs: mark closing, fire `onClose` 200ms in, stay until the collapse has run. */\nfunction useDismiss(onClose: (() => void) | undefined): { open: boolean; gone: boolean; close: () => void; onCollapsed: () => void } {\n const [closing, setClosing] = React.useState(false);\n const [gone, setGone] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n React.useEffect(() => () => {\n if (timer.current) clearTimeout(timer.current);\n }, []);\n const close = (): void => {\n setClosing(true);\n timer.current = setTimeout(() => onClose?.(), CLOSE_DELAY_MS);\n };\n const onCollapsed = React.useCallback(() => setGone(true), []);\n return { open: !closing, gone, close, onCollapsed };\n}\n\nexport const Alert = React.forwardRef<View, AlertProps>((alertProps, ref) => {\n const {\n variant, color, glow, pulse, icon, showIcon, onClose, title, description, children, animate, role,\n 'aria-atomic': ariaAtomic, 'aria-live': _ariaLive, closable, closeLabel, style, ...others\n } = resolveAlertProps(alertProps);\n const theme = useUiTheme();\n const testId = resolveTestId(others, 'alert') as string;\n const rest = withoutTestIdProps(others);\n const look = alertLook(theme, { variant, color, glow, pulse });\n const fadeIn = useFadeIn(animate);\n const dismiss = useDismiss(onClose);\n\n if (dismiss.gone) return null;\n return (\n <Collapse open={dismiss.open} onCollapsed={dismiss.onCollapsed}>\n <Animated.View\n ref={ref}\n role={role as Role}\n aria-live={alertProps['aria-live'] ?? defaultAriaLive(variant)}\n {...webAria({ 'aria-atomic': ariaAtomic })}\n tabIndex={0}\n testID={testId}\n style={[look.root, fadeIn, style]}\n {...rest}\n >\n {pulse ? <Pulse color={look.palette.main} radius={look.root.borderRadius as number} testID={testIdFor(testId, 'pulse')} /> : null}\n {showIcon ? <IconSlot variant={variant} icon={icon} color={look.iconColor} animate={animate} testID={testIdFor(testId, 'icon')} /> : null}\n <AlertContent title={title} description={description} ink={look.ink} testId={testId}>\n {children}\n </AlertContent>\n {closable ? (\n <View style={actionSlotStyle(theme)}>\n <CloseButton label={closeLabel} ink={look.ink} onPress={dismiss.close} testID={testIdFor(testId, 'close')} />\n </View>\n ) : null}\n </Animated.View>\n </Collapse>\n );\n});\n\nAlert.displayName = 'Alert';\n","import type { AlertBaseFields, AlertVariant } from './Alert.base';\nimport type { IconName } from '../../../icons/Icon.types';\n\ntype AlertDefaultedKeys = 'variant' | 'glow' | 'pulse' | 'showIcon' | 'animate' | 'role' | 'aria-atomic';\n\nexport const ALERT_DEFAULTS: Required<Pick<AlertBaseFields, AlertDefaultedKeys>> & { closable: false } = {\n variant: 'info',\n glow: false,\n pulse: false,\n showIcon: true,\n closable: false,\n animate: true,\n role: 'alert',\n 'aria-atomic': 'true',\n};\n\n/**\n * Generic over the renderer's own props: the web and the native `Alert` pass\n * different extras through, and both come back out untouched.\n */\nexport type ResolvedAlertProps<P extends AlertBaseFields> = P &\n Required<Pick<AlertBaseFields, AlertDefaultedKeys>>;\n\n// Strips explicitly-undefined props before the merge so `prop={undefined}` still\n// falls back to the default, the way a destructuring default would.\nconst definedProps = <P extends AlertBaseFields>(props: P): Partial<P> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<P>;\n\n// Through `unknown`: `closable: false` in the defaults belongs to the dismiss\n// union rather than to `AlertBaseFields`, so TypeScript cannot see the merge as\n// comparable to `P` although every field of `P` survives it untouched.\nexport const resolveAlertProps = <P extends AlertBaseFields>(props: P): ResolvedAlertProps<P> =>\n ({ ...ALERT_DEFAULTS, ...definedProps(props) }) as unknown as ResolvedAlertProps<P>;\n\n/** `danger` announces itself; everything else waits its turn. */\nexport const defaultAriaLive = (variant: AlertVariant): 'polite' | 'assertive' =>\n variant === 'danger' ? 'assertive' : 'polite';\n\nexport const testIdFor = (base: string | undefined, suffix: string): string =>\n base ? `${base}-${suffix}` : `alert-${suffix}`;\n\n/**\n * The glyph each semantic variant carries, by the shared icon set's name.\n * `glass` and `gradient` carry none of their own: the web renders an empty\n * icon slot for them unless the caller passes an `icon`, and so does native.\n */\nexport const VARIANT_ICON: Partial<Record<AlertVariant, IconName>> = {\n info: 'Info',\n success: 'CheckCircle',\n warning: 'Warning',\n danger: 'Error',\n};\n","import type { AlertVariant } from './Alert.base';\nimport { alpha, darken, lighten } from '../../../tokens/color';\nimport { contrastText, type UiGreyStep, type UiTheme } from '../../../tokens/theme';\n\n/**\n * THE NUMBERS BOTH `Alert` RENDERERS DRAW WITH.\n *\n * `Alert.styles.tsx` / `Alert.tsx` (MUI) and `Alert.native.tsx` (React\n * Native) read this one table. Spacing is in SPACING UNITS where the web\n * writes `theme.spacing(n)`; durations are ms (the web turns them into `s`\n * through {@link seconds} so its emitted CSS is byte-for-byte what it was);\n * everything else is px, a ratio or an alpha. The hover, active and focus\n * numbers are here too although only the DOM can honour them — a number the\n * web draws with belongs in the table whether or not native can reach it.\n */\n\n/** The root: 12px corners, 14px 16px of padding, one 300ms curve for everything. */\nexport const ALERT_RADIUS_UNITS = 1.5;\nexport const ALERT_PADDING_UNITS = { vertical: 1.75, horizontal: 2 } as const;\nexport const ALERT_TRANSITION_MS = 300;\nexport const ALERT_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n/** Mount: the web's `fadeInScale` keyframes and the icon's `iconRotate`. */\nexport const FADE_IN = { ms: 300, scale: 0.95, lift: 10 } as const;\nexport const ICON_SPIN = { ms: 600, from: 0.8, mid: 1.1 } as const;\n/** Dismiss: MUI `Collapse` runs 300ms; `onClose` fires 200ms in. */\nexport const COLLAPSE_MS = 300;\nexport const CLOSE_DELAY_MS = 200;\n\n/** The message column: 8px between title, description and children; 0.95rem body on 1.5. */\nexport const MESSAGE_GAP_UNITS = 1;\nexport const MESSAGE_FONT_SIZE = 15.2;\nexport const MESSAGE_LINE_HEIGHT = 1.5;\n/** A control inside the message gets an edge: 4px above, a hairline at 0.45 of the hue. */\nexport const MESSAGE_BUTTON = { marginTopUnits: 0.5, borderAlpha: 0.45 } as const;\n\n/** The title: 1.05rem at 600; MUI's `AlertTitle` lifts it 2px; 4px below it when a description follows. */\nexport const TITLE = { fontSize: 16.8, fontWeight: 600, marginTop: -2, marginBottomUnits: 0.5 } as const;\n/** The description: 0.925rem, slightly faded. */\nexport const DESCRIPTION = { fontSize: 14.8, opacity: 0.9 } as const;\n\n/** The icon slot: MUI's 22px glyph at 0.9, 14px from the words, 2px down (MUI's 7px stays below). */\nexport const ICON_SLOT = { size: 22, opacity: 0.9, marginRightUnits: 1.75, paddingTopUnits: 0.25, paddingBottom: 7 } as const;\n/** The action slot: MUI's `4px 0 0 16px` with the 16px ours, pushed right, 8px into the padding. */\nexport const ACTION_SLOT = { paddingLeftUnits: 2, paddingTop: 4, marginRight: -8 } as const;\n/** The close button: MUI's small `IconButton` (5px padding, 18px glyph) at 0.7. */\nexport const CLOSE_BUTTON = { padding: 5, iconSize: 18, opacity: 0.7, washAlpha: 0.1 } as const;\n\n/**\n * A semantic Alert's surface and ink: an OPAQUE tint of the hue with a dark\n * ink of the same hue — MUI's own `standard` recipe, at its ratios. See\n * `semanticSurface` in `Alert.styles.tsx` for why not `alpha(main, 0.1)`.\n */\nexport const SEMANTIC_SURFACE = { tint: { light: 0.9, dark: 0.8 }, ink: 0.6, borderAlpha: 0.35 } as const;\n/** `glass`: 85% paper under a 20px blur, a 0.4 divider hairline. */\nexport const GLASS = { backgroundAlpha: 0.85, borderAlpha: 0.4, blur: 20, saturatePercent: 180 } as const;\n/**\n * `gradient`: light→dark at 0.9 along 135°, a 0.2 white shimmer sweeping 1000px every 3s.\n *\n * It carries no hover of its own, and that is load-bearing rather than an\n * omission. `alertVariantStyles` is spread AFTER the root's `'&:hover'` in the\n * same object literal, so a second `'&:hover'` key does not merge with it — it\n * REPLACES it. While this variant had one, `gradient` was the only alert that\n * brightened on hover while every other variant darkened, and the only one to\n * lose the shimmer reveal the root's hover performs.\n */\nexport const GRADIENT = {\n angleDeg: 135,\n stopAlpha: 0.9,\n shimmerAlpha: 0.2,\n shimmerMs: 3000,\n shimmerTravel: 1000,\n} as const;\n\n/** Emphasis: the glow's shadow and brightness, the pulse's wash. */\nexport const GLOW = { blur: 20, spread: 5, alpha: 0.3, brightness: 1.05 } as const;\nexport const PULSE = { alpha: 0.2, ms: 2000, spread: 10 } as const;\n\n/**\n * Pointer states — DOM only, kept so the web derives them.\n *\n * HOVER and ACTIVE carry NO geometry, and that is the point rather than an\n * omission. They used to lift the card 3px, scale it 1.01, grow a 20px shadow\n * and spin the icon 10deg at 1.15 — four things moving at once on a surface\n * that is not a control, which made a page of alerts twitch under the pointer.\n *\n * Both are a TINT now: a flat inset layer over the surface. Two mechanisms\n * came before it and each failed on a case the next had to fix. Dropping the\n * element's `opacity` composites toward the PAGE, so it inverted the hover on\n * a light tint (L* 95.0 idle, 89.1 hovered, 91.1 pressed) and vanished on a\n * dark one. A `filter: brightness()` fixed the direction but is MULTIPLICATIVE,\n * so it moved a near-black `glass` by four counts (ΔE76 1.71, under the JND)\n * and Banner's 10%-alpha wash by ΔE76 0.44. A layer is additive: it reads the\n * same on an opaque tint, a translucent wash and a gradient, and because it\n * paints above the background and below the content the ink keeps its own\n * contrast.\n */\nexport const HOVER = { tintAlpha: 0.06 } as const;\n\n/**\n * The press: a 20% tint LAYER, eased back fast.\n *\n * The layer is the point. The first attempt dropped the whole element's\n * opacity, which composites toward the PAGE and so behaves differently on\n * every surface it is asked about. Measured: over a light page it made a light\n * tint LIGHTER (L* 95.0 idle, 89.1 hovered, 91.1 pressed), so pushing the\n * surface looked like the pointer leaving; over a dark page it landed back on\n * the idle surface (ΔE76 0.82 on `glass`); on `gradient` it washed white body\n * copy to 2.31:1, under AA; and it diluted the ink during a text-selection\n * drag. A `brightness()` step instead of it fixed the direction but not the\n * reach — a multiplier does nothing to a near-black `glass` in dark mode\n * (ΔE76 1.71) and nothing to Banner's 10%-alpha wash (ΔE76 0.44), because it\n * scales only what the element already paints.\n *\n * An inset shadow at 100vmax is a flat tint over the whole surface: ADDITIVE,\n * so it reads the same on an opaque tint, a translucent wash and a gradient;\n * painted above the background and below the content, so the ink keeps its\n * own contrast; and animatable, which `background-image` is not.\n *\n * `ms` is 250 and not the 1000 first asked for, and the reason is that ONE\n * property carries both states. CSS runs a transition from the DESTINATION\n * state's declaration, and entering hover and releasing a press share that\n * destination — so they cannot have different durations without a second\n * animatable property, and both free pseudo-elements are already spent on the\n * `gradient` shimmer and the `pulse` wash. At 1000ms the hover inherited the\n * second: crossing an alert in 300ms peaked at a ≈ 0.024, under the JND, and\n * for ~360ms the alert you had just LEFT was darker than the one under the\n * pointer. A fast press-return is the smaller loss, and it is the call the\n * product owner made when shown both.\n */\nexport const ACTIVE = { tintAlpha: 0.2, ms: 250 } as const;\n\nexport const FOCUS = { ringWidth: 2, ringAlpha: 1, offset: 2 } as const;\n\n/** `neutral` has no palette slot; the web has always drawn it from three greys. */\nexport const NEUTRAL_GREY: Record<'main' | 'light' | 'dark', UiGreyStep> = { main: 500, light: 300, dark: 700 };\n\n/** A duration as the CSS the web has always emitted: `2000` → `2s`, `300` → `0.3s`. */\nexport const seconds = (ms: number): string => `${ms / 1000}s`;\n\n/** The palette shape the web's `getColorFromTheme` returns — a main plus optional shades. */\nexport interface AlertPalette {\n main: string;\n light?: string;\n dark?: string;\n}\n\n/**\n * The renderer-free twin of the web's `getColorFromTheme`: a variant or\n * colour name to its palette, `neutral` from the greys, anything unknown\n * (`glass`, `gradient`) to `info`.\n */\nexport function alertPalette(theme: UiTheme, key: string | undefined): AlertPalette {\n switch (key) {\n case 'info':\n case 'success':\n case 'warning':\n case 'danger':\n case 'primary':\n case 'secondary':\n return theme.palette[key];\n case 'neutral':\n return {\n main: theme.palette.grey[NEUTRAL_GREY.main],\n light: theme.palette.grey[NEUTRAL_GREY.light],\n dark: theme.palette.grey[NEUTRAL_GREY.dark],\n };\n default:\n return theme.palette.info;\n }\n}\n\n/** What a variant paints: its fill, its ink, its hairline if any, and the colour of its glyph. */\nexport interface AlertSurface {\n backgroundColor: string;\n color: string;\n borderColor?: string;\n iconColor: string;\n}\n\nexport const SEMANTIC_VARIANTS: ReadonlySet<AlertVariant> = new Set(['info', 'success', 'warning', 'danger']);\n\n/** The opaque tint and same-hue ink, inverted for dark mode; the hairline keeps its alpha. */\nexport function semanticSurface(theme: UiTheme, palette: AlertPalette): AlertSurface {\n const dark = theme.mode === 'dark';\n return {\n backgroundColor: dark\n ? darken(palette.main, SEMANTIC_SURFACE.tint.dark)\n : lighten(palette.main, SEMANTIC_SURFACE.tint.light),\n color: dark ? lighten(palette.main, SEMANTIC_SURFACE.ink) : darken(palette.main, SEMANTIC_SURFACE.ink),\n borderColor: alpha(palette.main, SEMANTIC_SURFACE.borderAlpha),\n iconColor: palette.main,\n };\n}\n\nexport function glassSurface(theme: UiTheme): AlertSurface {\n return {\n backgroundColor: alpha(theme.palette.background.paper, GLASS.backgroundAlpha),\n color: theme.palette.text.primary,\n borderColor: alpha(theme.palette.divider, GLASS.borderAlpha),\n iconColor: theme.palette.primary.main,\n };\n}\n\n/** The gradient's two stops; a renderer with no gradient fill paints `from`. */\nexport function gradientStops(palette: AlertPalette): { from: string; to: string } {\n return {\n from: alpha(palette.light || palette.main, GRADIENT.stopAlpha),\n to: alpha(palette.dark || palette.main, GRADIENT.stopAlpha),\n };\n}\n\nexport function gradientSurface(palette: AlertPalette): AlertSurface {\n const ink = contrastText(palette.main);\n return { backgroundColor: gradientStops(palette).from, color: ink, iconColor: ink };\n}\n\n/** The surface for a variant, `glass` and `gradient` included. */\nexport function alertSurface(theme: UiTheme, variant: AlertVariant, palette: AlertPalette): AlertSurface {\n if (variant === 'glass') return glassSurface(theme);\n if (variant === 'gradient') return gradientSurface(palette);\n return semanticSurface(theme, palette);\n}\n","import type { TextStyle, ViewStyle } from 'react-native';\n\nimport type { AlertVariant } from './Alert.base';\nimport {\n ACTION_SLOT,\n ALERT_PADDING_UNITS,\n ALERT_RADIUS_UNITS,\n type AlertPalette,\n alertPalette,\n alertSurface,\n CLOSE_BUTTON,\n DESCRIPTION,\n GLOW,\n ICON_SLOT,\n MESSAGE_FONT_SIZE,\n MESSAGE_GAP_UNITS,\n MESSAGE_LINE_HEIGHT,\n TITLE,\n} from './Alert.metrics';\nimport { alpha } from '../../../tokens/color';\nimport { muiTypeStyle } from '../../../tokens/mui-type';\nimport type { UiTheme } from '../../../tokens/theme';\nimport type { ColorValue } from '../../../tokens/vocabulary';\n\n/**\n * THE PAINT, KEPT APART FROM THE STRUCTURE.\n *\n * `Alert.native.tsx` reads as what renders where; this file reads as\n * arithmetic — the same palette slots, alphas and px the web's\n * `Alert.styles.tsx` derives from `Alert.metrics.ts`.\n */\n\nexport interface AlertLookArgs {\n variant: AlertVariant;\n color: ColorValue | undefined;\n glow: boolean;\n pulse: boolean;\n}\n\nexport interface AlertLook {\n palette: AlertPalette;\n /** What the words are set in. */\n ink: string;\n iconColor: string;\n root: ViewStyle;\n}\n\n/**\n * The root's paint. The web keeps `overflow: hidden` (its pulse wash is\n * clipped to the card, as it is here); only the glow opens it, because a\n * view's own shadow is clipped by its own overflow on a device.\n */\nexport function alertLook(theme: UiTheme, a: AlertLookArgs): AlertLook {\n const palette = alertPalette(theme, a.color ?? a.variant);\n const surface = alertSurface(theme, a.variant, palette);\n const root: ViewStyle = {\n flexDirection: 'row',\n paddingVertical: theme.spacing(ALERT_PADDING_UNITS.vertical),\n paddingHorizontal: theme.spacing(ALERT_PADDING_UNITS.horizontal),\n borderRadius: theme.spacing(ALERT_RADIUS_UNITS),\n overflow: a.glow ? 'visible' : 'hidden',\n backgroundColor: surface.backgroundColor,\n ...(surface.borderColor ? { borderWidth: 1, borderColor: surface.borderColor } : {}),\n ...(a.glow\n ? {\n boxShadow: `0 0 ${GLOW.blur}px ${GLOW.spread}px ${alpha(palette.main, GLOW.alpha)}`,\n filter: `brightness(${GLOW.brightness})`,\n }\n : {}),\n };\n return { palette, ink: surface.color, iconColor: surface.iconColor, root };\n}\n\n/** The message column: 8px between its lines, allowed to shrink so long text wraps beside the icon. */\nexport const messageSlotStyle = (theme: UiTheme): ViewStyle => ({\n flexDirection: 'column',\n gap: theme.spacing(MESSAGE_GAP_UNITS),\n flexShrink: 1,\n minWidth: 0,\n});\n\n/** A string child: MUI's `body2` letter-spacing at 0.95rem on the message's 1.5. */\nexport const messageTextStyle = (theme: UiTheme, ink: string): TextStyle => ({\n ...muiTypeStyle(theme, 'body2', MESSAGE_FONT_SIZE),\n lineHeight: MESSAGE_FONT_SIZE * MESSAGE_LINE_HEIGHT,\n color: ink,\n});\n\n/** MUI's `AlertTitle` (a `body1` Typography) at 1.05rem and 600, lifted 2px, 4px above a description. */\nexport const titleStyle = (theme: UiTheme, ink: string, hasDescription: boolean): TextStyle => ({\n ...muiTypeStyle(theme, 'body1', TITLE.fontSize),\n fontWeight: `${TITLE.fontWeight}`,\n color: ink,\n marginTop: TITLE.marginTop,\n marginBottom: hasDescription ? theme.spacing(TITLE.marginBottomUnits) : 0,\n});\n\n/** The description: 0.925rem on the message's 1.5, faded to 0.9. */\nexport const descriptionStyle = (theme: UiTheme, ink: string): TextStyle => ({\n ...muiTypeStyle(theme, 'body2', DESCRIPTION.fontSize),\n lineHeight: DESCRIPTION.fontSize * MESSAGE_LINE_HEIGHT,\n color: ink,\n opacity: DESCRIPTION.opacity,\n});\n\n/** MUI's `.MuiAlert-icon` with the web's overrides: first-line aligned, 14px from the words, 2px down. */\nexport const iconSlotStyle = (theme: UiTheme): ViewStyle => ({\n alignSelf: 'flex-start',\n alignItems: 'center',\n marginRight: theme.spacing(ICON_SLOT.marginRightUnits),\n paddingTop: theme.spacing(ICON_SLOT.paddingTopUnits),\n paddingBottom: ICON_SLOT.paddingBottom,\n opacity: ICON_SLOT.opacity,\n});\n\n/** MUI's `.MuiAlert-action`: top-aligned, pushed to the right edge, 16px off the text. */\nexport const actionSlotStyle = (theme: UiTheme): ViewStyle => ({\n alignItems: 'flex-start',\n paddingTop: ACTION_SLOT.paddingTop,\n paddingLeft: theme.spacing(ACTION_SLOT.paddingLeftUnits),\n marginLeft: 'auto',\n marginRight: ACTION_SLOT.marginRight,\n});\n\n/** MUI's small `IconButton` at 0.7; pressed stands in for the web's hover (full opacity, a faint wash). */\nexport const closeButtonStyle = (theme: UiTheme, pressed: boolean): ViewStyle => ({\n padding: CLOSE_BUTTON.padding,\n borderRadius: theme.radius.full,\n opacity: pressed ? 1 : CLOSE_BUTTON.opacity,\n backgroundColor: pressed ? alpha(theme.palette.action.hover, CLOSE_BUTTON.washAlpha) : 'transparent',\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/data-display/Alert/Alert.native.tsx","../../../src/components/data-display/Alert/Alert.helpers.ts","../../../src/components/data-display/Alert/Alert.metrics.ts","../../../src/components/data-display/Alert/Alert.look.native.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n Easing,\n type LayoutChangeEvent,\n Platform,\n Pressable,\n type Role,\n StyleSheet,\n Text as RNText,\n View,\n type ViewStyle,\n} from 'react-native';\n\nimport { resolveAlertProps, resolveAnnouncement, testIdFor, VARIANT_ICON } from './Alert.helpers';\nimport {\n actionSlotStyle,\n alertLook,\n closeButtonStyle,\n descriptionStyle,\n iconSlotStyle,\n messageSlotStyle,\n messageTextStyle,\n titleStyle,\n} from './Alert.look.native';\nimport { CLOSE_BUTTON, CLOSE_DELAY_MS, COLLAPSE_MS, FADE_IN, ICON_SLOT, ICON_SPIN, PULSE } from './Alert.metrics';\nimport type { AlertProps, AlertVariant } from './Alert.types.native';\nimport { Icon } from '../../../icons/Icon.native';\nimport { webAria } from '../../../platform/aria';\nimport { renderTextChildren } from '../../../platform/text-children';\nimport { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\n\ntype AnimatedStyle = Animated.WithAnimatedValue<ViewStyle>;\nconst nativeDriver = Platform.OS !== 'web';\n\n/** A 0→1 progress that starts on mount when `animate` is set, else sits at 1. */\nfunction useProgress(animate: boolean, duration: number): Animated.Value {\n const progress = React.useRef(new Animated.Value(animate ? 0 : 1)).current;\n React.useEffect(() => {\n if (!animate) return undefined;\n const timing = Animated.timing(progress, { toValue: 1, duration, easing: Easing.out(Easing.ease), useNativeDriver: nativeDriver });\n timing.start();\n return () => timing.stop();\n }, [animate, duration, progress]);\n return progress;\n}\n\n/** The web's `fadeInScale` keyframes: in from 0 opacity, 0.95 scale and 10px above, over 300ms. */\nfunction useFadeIn(animate: boolean): AnimatedStyle | undefined {\n const progress = useProgress(animate, FADE_IN.ms);\n if (!animate) return undefined;\n return {\n opacity: progress,\n transform: [\n { scale: progress.interpolate({ inputRange: [0, 1], outputRange: [FADE_IN.scale, 1] }) },\n { translateY: progress.interpolate({ inputRange: [0, 1], outputRange: [-FADE_IN.lift, 0] }) },\n ],\n };\n}\n\n/** The web's `iconRotate` keyframes: one full turn, 0.8 → 1.1 → 1, over 600ms. */\nfunction useIconSpin(animate: boolean): AnimatedStyle | undefined {\n const progress = useProgress(animate, ICON_SPIN.ms);\n if (!animate) return undefined;\n return {\n transform: [\n { rotate: progress.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'] }) },\n { scale: progress.interpolate({ inputRange: [0, 0.5, 1], outputRange: [ICON_SPIN.from, ICON_SPIN.mid, 1] }) },\n ],\n };\n}\n\n/** The web's `::after` pulse: a wash of the hue over the card, fading out every two seconds, behind the words. */\nfunction Pulse({ color, radius, testID }: { color: string; radius: number; testID: string }): React.JSX.Element {\n const progress = React.useRef(new Animated.Value(0)).current;\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(progress, { toValue: 1, duration: PULSE.ms, easing: Easing.linear, useNativeDriver: nativeDriver }),\n );\n loop.start();\n return () => loop.stop();\n }, [progress]);\n return (\n <Animated.View\n testID={testID}\n aria-hidden\n style={[\n StyleSheet.absoluteFill,\n {\n pointerEvents: 'none',\n borderRadius: radius,\n backgroundColor: color,\n opacity: progress.interpolate({ inputRange: [0, 0.7, 1], outputRange: [PULSE.alpha, 0, 0] }),\n },\n ]}\n />\n );\n}\n\n/**\n * MUI's `Collapse`: open, it is a plain wrapper with its overflow visible (so\n * a glow can escape); closing, it clips and shrinks over 300ms, then says so.\n */\nfunction Collapse({ open, onCollapsed, children }: { open: boolean; onCollapsed: () => void; children: React.ReactNode }): React.JSX.Element {\n const [height, setHeight] = React.useState<number | null>(null);\n const progress = React.useRef(new Animated.Value(1)).current;\n React.useEffect(() => {\n if (open) return undefined;\n const timing = Animated.timing(progress, { toValue: 0, duration: COLLAPSE_MS, easing: Easing.inOut(Easing.ease), useNativeDriver: false });\n timing.start(({ finished }) => {\n if (finished) onCollapsed();\n });\n return () => timing.stop();\n }, [open, onCollapsed, progress]);\n const onLayout = (event: LayoutChangeEvent): void => {\n if (open) setHeight(event.nativeEvent.layout.height);\n };\n const shrink: AnimatedStyle = height == null ? {} : { maxHeight: progress.interpolate({ inputRange: [0, 1], outputRange: [0, height] }) };\n return (\n <Animated.View style={[{ overflow: open ? 'visible' : 'hidden', opacity: progress }, shrink]}>\n <View onLayout={onLayout}>{children}</View>\n </Animated.View>\n );\n}\n\ninterface IconSlotProps {\n variant: AlertVariant;\n icon: React.ReactNode;\n color: string;\n animate: boolean;\n testID: string;\n}\n\n/** The icon slot; `glass` and `gradient` have no glyph of their own, so theirs is empty unless an `icon` is given — as on the web. */\nfunction IconSlot({ variant, icon, color, animate, testID }: IconSlotProps): React.JSX.Element {\n const theme = useUiTheme();\n const spin = useIconSpin(animate);\n const glyph = VARIANT_ICON[variant];\n return (\n <Animated.View testID={testID} style={[iconSlotStyle(theme), spin]}>\n {icon || (glyph ? <Icon name={glyph} size={ICON_SLOT.size} color={color} /> : null)}\n </Animated.View>\n );\n}\n\nfunction CloseButton({ label, ink, onPress, testID }: { label: string | undefined; ink: string; onPress: () => void; testID: string }): React.JSX.Element {\n const theme = useUiTheme();\n return (\n <Pressable role=\"button\" aria-label={label} testID={testID} onPress={onPress} style={({ pressed }) => closeButtonStyle(theme, pressed)}>\n <Icon name=\"Close\" size={CLOSE_BUTTON.iconSize} color={ink} />\n </Pressable>\n );\n}\n\ninterface ContentProps {\n title?: string;\n description?: string;\n children?: React.ReactNode;\n ink: string;\n testId: string;\n}\n\nfunction AlertContent({ title, description, children, ink, testId }: ContentProps): React.JSX.Element {\n const theme = useUiTheme();\n return (\n <View style={messageSlotStyle(theme)}>\n {title ? (\n <RNText testID={testIdFor(testId, 'title')} style={titleStyle(theme, ink, Boolean(description))}>\n {title}\n </RNText>\n ) : null}\n {description ? (\n <RNText testID={testIdFor(testId, 'message')} style={descriptionStyle(theme, ink)}>\n {description}\n </RNText>\n ) : null}\n {renderTextChildren(children, messageTextStyle(theme, ink))}\n </View>\n );\n}\n\n/** The dismiss sequence the web runs: mark closing, fire `onClose` 200ms in, stay until the collapse has run. */\nfunction useDismiss(onClose: (() => void) | undefined): { open: boolean; gone: boolean; close: () => void; onCollapsed: () => void } {\n const [closing, setClosing] = React.useState(false);\n const [gone, setGone] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n React.useEffect(() => () => {\n if (timer.current) clearTimeout(timer.current);\n }, []);\n const close = (): void => {\n setClosing(true);\n timer.current = setTimeout(() => onClose?.(), CLOSE_DELAY_MS);\n };\n const onCollapsed = React.useCallback(() => setGone(true), []);\n return { open: !closing, gone, close, onCollapsed };\n}\n\nexport const Alert = React.forwardRef<View, AlertProps>((alertProps, ref) => {\n const {\n variant, color, glow, pulse, icon, showIcon, onClose, title, description, children, animate,\n // `role`, `announce` and `aria-live` all leave here and are resolved\n // TOGETHER below, off `alertProps` — see `resolveAnnouncement`.\n role: _role, announce: _announce,\n 'aria-atomic': ariaAtomic, 'aria-live': _ariaLive, closable, closeLabel, style, ...others\n } = resolveAlertProps(alertProps);\n const theme = useUiTheme();\n const testId = resolveTestId(others, 'alert') as string;\n const rest = withoutTestIdProps(others);\n const look = alertLook(theme, { variant, color, glow, pulse });\n const fadeIn = useFadeIn(animate);\n const dismiss = useDismiss(onClose);\n const announcement = resolveAnnouncement(alertProps, variant);\n\n if (dismiss.gone) return null;\n return (\n <Collapse open={dismiss.open} onCollapsed={dismiss.onCollapsed}>\n <Animated.View\n ref={ref}\n role={announcement.role as Role}\n aria-live={announcement['aria-live']}\n {...webAria({ 'aria-atomic': ariaAtomic })}\n tabIndex={0}\n testID={testId}\n style={[look.root, fadeIn, style]}\n {...rest}\n >\n {pulse ? <Pulse color={look.palette.main} radius={look.root.borderRadius as number} testID={testIdFor(testId, 'pulse')} /> : null}\n {showIcon ? <IconSlot variant={variant} icon={icon} color={look.iconColor} animate={animate} testID={testIdFor(testId, 'icon')} /> : null}\n <AlertContent title={title} description={description} ink={look.ink} testId={testId}>\n {children}\n </AlertContent>\n {closable ? (\n <View style={actionSlotStyle(theme)}>\n <CloseButton label={closeLabel} ink={look.ink} onPress={dismiss.close} testID={testIdFor(testId, 'close')} />\n </View>\n ) : null}\n </Animated.View>\n </Collapse>\n );\n});\n\nAlert.displayName = 'Alert';\n","import type { AlertBaseFields, AlertVariant } from './Alert.base';\nimport type { IconName } from '../../../icons/Icon.types';\n\ntype AlertDefaultedKeys = 'variant' | 'glow' | 'pulse' | 'showIcon' | 'animate' | 'role' | 'aria-atomic';\n\nexport const ALERT_DEFAULTS: Required<Pick<AlertBaseFields, AlertDefaultedKeys>> & { closable: false } = {\n variant: 'info',\n glow: false,\n pulse: false,\n showIcon: true,\n closable: false,\n animate: true,\n role: 'alert',\n 'aria-atomic': 'true',\n};\n\n/**\n * Generic over the renderer's own props: the web and the native `Alert` pass\n * different extras through, and both come back out untouched.\n */\nexport type ResolvedAlertProps<P extends AlertBaseFields> = P &\n Required<Pick<AlertBaseFields, AlertDefaultedKeys>>;\n\n// Strips explicitly-undefined props before the merge so `prop={undefined}` still\n// falls back to the default, the way a destructuring default would.\nconst definedProps = <P extends AlertBaseFields>(props: P): Partial<P> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<P>;\n\n// Through `unknown`: `closable: false` in the defaults belongs to the dismiss\n// union rather than to `AlertBaseFields`, so TypeScript cannot see the merge as\n// comparable to `P` although every field of `P` survives it untouched.\nexport const resolveAlertProps = <P extends AlertBaseFields>(props: P): ResolvedAlertProps<P> =>\n ({ ...ALERT_DEFAULTS, ...definedProps(props) }) as unknown as ResolvedAlertProps<P>;\n\n/** `danger` announces itself; everything else waits its turn. */\nexport const defaultAriaLive = (variant: AlertVariant): 'polite' | 'assertive' =>\n variant === 'danger' ? 'assertive' : 'polite';\n\n/**\n * The ARIA role each `announce` level is spelled with.\n *\n * Both roles carry an IMPLICIT live setting, and that implicit one is what\n * assistive tech acts on — `alert` is assertive, `status` is polite. Pairing\n * them here is what stops `role` and `aria-live` from contradicting each\n * other, which they do by default: every alert is `role=\"alert\"` regardless of\n * variant, so an `info` alert asks to be polite in one attribute and to\n * interrupt in the other.\n */\nexport const ANNOUNCE_ROLE: Record<NonNullable<AlertBaseFields['announce']>, string> = {\n assertive: 'alert',\n polite: 'status',\n};\n\n/**\n * The two attributes that decide whether an alert interrupts, resolved TOGETHER.\n *\n * Both renderers therefore let `role` and `announce` leave their destructure\n * unused (`_role`, `_announce`) and call this instead — the first because the\n * defaults have already answered it, the second because it must never reach\n * the DOM.\n *\n * Reads the caller's own props rather than the defaulted ones, because the\n * whole question is which of them the caller actually spelled:\n * {@link ALERT_DEFAULTS} supplies `role: 'alert'` for everything, so after the\n * merge there is no longer any difference between an alert that asked to\n * interrupt and one that never mentioned it.\n *\n * Precedence, most specific first — an explicit `role` or `aria-live` beats\n * `announce`, so a call site that already spells either by hand is untouched:\n *\n * 1. `role` / `aria-live` as given;\n * 2. {@link AlertBaseFields.announce}, which supplies both;\n * 3. today's behaviour — `ALERT_DEFAULTS.role` and {@link defaultAriaLive}.\n *\n * With none of the three named, the result is byte-for-byte what it was before\n * `announce` existed.\n */\nexport const resolveAnnouncement = (\n props: Pick<AlertBaseFields, 'announce' | 'role' | 'aria-live'>,\n variant: AlertVariant,\n): { role: string; 'aria-live': 'polite' | 'assertive' | 'off' } => {\n const announce = props.announce;\n return {\n role: props.role ?? (announce === undefined ? ALERT_DEFAULTS.role : ANNOUNCE_ROLE[announce]),\n 'aria-live': props['aria-live'] ?? announce ?? defaultAriaLive(variant),\n };\n};\n\nexport const testIdFor = (base: string | undefined, suffix: string): string =>\n base ? `${base}-${suffix}` : `alert-${suffix}`;\n\n/**\n * The glyph each semantic variant carries, by the shared icon set's name.\n * `glass` and `gradient` carry none of their own: the web renders an empty\n * icon slot for them unless the caller passes an `icon`, and so does native.\n */\nexport const VARIANT_ICON: Partial<Record<AlertVariant, IconName>> = {\n info: 'Info',\n success: 'CheckCircle',\n warning: 'Warning',\n danger: 'Error',\n};\n","import type { AlertVariant } from './Alert.base';\nimport { alpha, darken, lighten } from '../../../tokens/color';\nimport { contrastText, type UiGreyStep, type UiTheme } from '../../../tokens/theme';\n\n/**\n * THE NUMBERS BOTH `Alert` RENDERERS DRAW WITH.\n *\n * `Alert.styles.tsx` / `Alert.tsx` (MUI) and `Alert.native.tsx` (React\n * Native) read this one table. Spacing is in SPACING UNITS where the web\n * writes `theme.spacing(n)`; durations are ms (the web turns them into `s`\n * through {@link seconds} so its emitted CSS is byte-for-byte what it was);\n * everything else is px, a ratio or an alpha. The hover, active and focus\n * numbers are here too although only the DOM can honour them — a number the\n * web draws with belongs in the table whether or not native can reach it.\n */\n\n/** The root: 12px corners, 14px 16px of padding, one 300ms curve for everything. */\nexport const ALERT_RADIUS_UNITS = 1.5;\nexport const ALERT_PADDING_UNITS = { vertical: 1.75, horizontal: 2 } as const;\nexport const ALERT_TRANSITION_MS = 300;\nexport const ALERT_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';\n\n/** Mount: the web's `fadeInScale` keyframes and the icon's `iconRotate`. */\nexport const FADE_IN = { ms: 300, scale: 0.95, lift: 10 } as const;\nexport const ICON_SPIN = { ms: 600, from: 0.8, mid: 1.1 } as const;\n/** Dismiss: MUI `Collapse` runs 300ms; `onClose` fires 200ms in. */\nexport const COLLAPSE_MS = 300;\nexport const CLOSE_DELAY_MS = 200;\n\n/** The message column: 8px between title, description and children; 0.95rem body on 1.5. */\nexport const MESSAGE_GAP_UNITS = 1;\nexport const MESSAGE_FONT_SIZE = 15.2;\nexport const MESSAGE_LINE_HEIGHT = 1.5;\n/** A control inside the message gets an edge: 4px above, a hairline at 0.45 of the hue. */\nexport const MESSAGE_BUTTON = { marginTopUnits: 0.5, borderAlpha: 0.45 } as const;\n\n/** The title: 1.05rem at 600; MUI's `AlertTitle` lifts it 2px; 4px below it when a description follows. */\nexport const TITLE = { fontSize: 16.8, fontWeight: 600, marginTop: -2, marginBottomUnits: 0.5 } as const;\n/** The description: 0.925rem, slightly faded. */\nexport const DESCRIPTION = { fontSize: 14.8, opacity: 0.9 } as const;\n\n/** The icon slot: MUI's 22px glyph at 0.9, 14px from the words, 2px down (MUI's 7px stays below). */\nexport const ICON_SLOT = { size: 22, opacity: 0.9, marginRightUnits: 1.75, paddingTopUnits: 0.25, paddingBottom: 7 } as const;\n/** The action slot: MUI's `4px 0 0 16px` with the 16px ours, pushed right, 8px into the padding. */\nexport const ACTION_SLOT = { paddingLeftUnits: 2, paddingTop: 4, marginRight: -8 } as const;\n/** The close button: MUI's small `IconButton` (5px padding, 18px glyph) at 0.7. */\nexport const CLOSE_BUTTON = { padding: 5, iconSize: 18, opacity: 0.7, washAlpha: 0.1 } as const;\n\n/**\n * A semantic Alert's surface and ink: an OPAQUE tint of the hue with a dark\n * ink of the same hue — MUI's own `standard` recipe, at its ratios. See\n * `semanticSurface` in `Alert.styles.tsx` for why not `alpha(main, 0.1)`.\n */\nexport const SEMANTIC_SURFACE = { tint: { light: 0.9, dark: 0.8 }, ink: 0.6, borderAlpha: 0.35 } as const;\n/** `glass`: 85% paper under a 20px blur, a 0.4 divider hairline. */\nexport const GLASS = { backgroundAlpha: 0.85, borderAlpha: 0.4, blur: 20, saturatePercent: 180 } as const;\n/**\n * `gradient`: light→dark at 0.9 along 135°, a 0.2 white shimmer sweeping 1000px every 3s.\n *\n * It carries no hover of its own, and that is load-bearing rather than an\n * omission. `alertVariantStyles` is spread AFTER the root's `'&:hover'` in the\n * same object literal, so a second `'&:hover'` key does not merge with it — it\n * REPLACES it. While this variant had one, `gradient` was the only alert that\n * brightened on hover while every other variant darkened, and the only one to\n * lose the shimmer reveal the root's hover performs.\n */\nexport const GRADIENT = {\n angleDeg: 135,\n stopAlpha: 0.9,\n shimmerAlpha: 0.2,\n shimmerMs: 3000,\n shimmerTravel: 1000,\n} as const;\n\n/** Emphasis: the glow's shadow and brightness, the pulse's wash. */\nexport const GLOW = { blur: 20, spread: 5, alpha: 0.3, brightness: 1.05 } as const;\nexport const PULSE = { alpha: 0.2, ms: 2000, spread: 10 } as const;\n\n/**\n * Pointer states — DOM only, kept so the web derives them.\n *\n * HOVER and ACTIVE carry NO geometry, and that is the point rather than an\n * omission. They used to lift the card 3px, scale it 1.01, grow a 20px shadow\n * and spin the icon 10deg at 1.15 — four things moving at once on a surface\n * that is not a control, which made a page of alerts twitch under the pointer.\n *\n * Both are a TINT now: a flat inset layer over the surface. Two mechanisms\n * came before it and each failed on a case the next had to fix. Dropping the\n * element's `opacity` composites toward the PAGE, so it inverted the hover on\n * a light tint (L* 95.0 idle, 89.1 hovered, 91.1 pressed) and vanished on a\n * dark one. A `filter: brightness()` fixed the direction but is MULTIPLICATIVE,\n * so it moved a near-black `glass` by four counts (ΔE76 1.71, under the JND)\n * and Banner's 10%-alpha wash by ΔE76 0.44. A layer is additive: it reads the\n * same on an opaque tint, a translucent wash and a gradient, and because it\n * paints above the background and below the content the ink keeps its own\n * contrast.\n */\nexport const HOVER = { tintAlpha: 0.06 } as const;\n\n/**\n * The press: a 20% tint LAYER, eased back fast.\n *\n * The layer is the point. The first attempt dropped the whole element's\n * opacity, which composites toward the PAGE and so behaves differently on\n * every surface it is asked about. Measured: over a light page it made a light\n * tint LIGHTER (L* 95.0 idle, 89.1 hovered, 91.1 pressed), so pushing the\n * surface looked like the pointer leaving; over a dark page it landed back on\n * the idle surface (ΔE76 0.82 on `glass`); on `gradient` it washed white body\n * copy to 2.31:1, under AA; and it diluted the ink during a text-selection\n * drag. A `brightness()` step instead of it fixed the direction but not the\n * reach — a multiplier does nothing to a near-black `glass` in dark mode\n * (ΔE76 1.71) and nothing to Banner's 10%-alpha wash (ΔE76 0.44), because it\n * scales only what the element already paints.\n *\n * An inset shadow at 100vmax is a flat tint over the whole surface: ADDITIVE,\n * so it reads the same on an opaque tint, a translucent wash and a gradient;\n * painted above the background and below the content, so the ink keeps its\n * own contrast; and animatable, which `background-image` is not.\n *\n * `ms` is 250 and not the 1000 first asked for, and the reason is that ONE\n * property carries both states. CSS runs a transition from the DESTINATION\n * state's declaration, and entering hover and releasing a press share that\n * destination — so they cannot have different durations without a second\n * animatable property, and both free pseudo-elements are already spent on the\n * `gradient` shimmer and the `pulse` wash. At 1000ms the hover inherited the\n * second: crossing an alert in 300ms peaked at a ≈ 0.024, under the JND, and\n * for ~360ms the alert you had just LEFT was darker than the one under the\n * pointer. A fast press-return is the smaller loss, and it is the call the\n * product owner made when shown both.\n */\nexport const ACTIVE = { tintAlpha: 0.2, ms: 250 } as const;\n\nexport const FOCUS = { ringWidth: 2, ringAlpha: 1, offset: 2 } as const;\n\n/** `neutral` has no palette slot; the web has always drawn it from three greys. */\nexport const NEUTRAL_GREY: Record<'main' | 'light' | 'dark', UiGreyStep> = { main: 500, light: 300, dark: 700 };\n\n/** A duration as the CSS the web has always emitted: `2000` → `2s`, `300` → `0.3s`. */\nexport const seconds = (ms: number): string => `${ms / 1000}s`;\n\n/** The palette shape the web's `getColorFromTheme` returns — a main plus optional shades. */\nexport interface AlertPalette {\n main: string;\n light?: string;\n dark?: string;\n}\n\n/**\n * The renderer-free twin of the web's `getColorFromTheme`: a variant or\n * colour name to its palette, `neutral` from the greys, anything unknown\n * (`glass`, `gradient`) to `info`.\n */\nexport function alertPalette(theme: UiTheme, key: string | undefined): AlertPalette {\n switch (key) {\n case 'info':\n case 'success':\n case 'warning':\n case 'danger':\n case 'primary':\n case 'secondary':\n return theme.palette[key];\n case 'neutral':\n return {\n main: theme.palette.grey[NEUTRAL_GREY.main],\n light: theme.palette.grey[NEUTRAL_GREY.light],\n dark: theme.palette.grey[NEUTRAL_GREY.dark],\n };\n default:\n return theme.palette.info;\n }\n}\n\n/** What a variant paints: its fill, its ink, its hairline if any, and the colour of its glyph. */\nexport interface AlertSurface {\n backgroundColor: string;\n color: string;\n borderColor?: string;\n iconColor: string;\n}\n\nexport const SEMANTIC_VARIANTS: ReadonlySet<AlertVariant> = new Set(['info', 'success', 'warning', 'danger']);\n\n/** The opaque tint and same-hue ink, inverted for dark mode; the hairline keeps its alpha. */\nexport function semanticSurface(theme: UiTheme, palette: AlertPalette): AlertSurface {\n const dark = theme.mode === 'dark';\n return {\n backgroundColor: dark\n ? darken(palette.main, SEMANTIC_SURFACE.tint.dark)\n : lighten(palette.main, SEMANTIC_SURFACE.tint.light),\n color: dark ? lighten(palette.main, SEMANTIC_SURFACE.ink) : darken(palette.main, SEMANTIC_SURFACE.ink),\n borderColor: alpha(palette.main, SEMANTIC_SURFACE.borderAlpha),\n iconColor: palette.main,\n };\n}\n\nexport function glassSurface(theme: UiTheme): AlertSurface {\n return {\n backgroundColor: alpha(theme.palette.background.paper, GLASS.backgroundAlpha),\n color: theme.palette.text.primary,\n borderColor: alpha(theme.palette.divider, GLASS.borderAlpha),\n iconColor: theme.palette.primary.main,\n };\n}\n\n/** The gradient's two stops; a renderer with no gradient fill paints `from`. */\nexport function gradientStops(palette: AlertPalette): { from: string; to: string } {\n return {\n from: alpha(palette.light || palette.main, GRADIENT.stopAlpha),\n to: alpha(palette.dark || palette.main, GRADIENT.stopAlpha),\n };\n}\n\nexport function gradientSurface(palette: AlertPalette): AlertSurface {\n const ink = contrastText(palette.main);\n return { backgroundColor: gradientStops(palette).from, color: ink, iconColor: ink };\n}\n\n/** The surface for a variant, `glass` and `gradient` included. */\nexport function alertSurface(theme: UiTheme, variant: AlertVariant, palette: AlertPalette): AlertSurface {\n if (variant === 'glass') return glassSurface(theme);\n if (variant === 'gradient') return gradientSurface(palette);\n return semanticSurface(theme, palette);\n}\n","import type { TextStyle, ViewStyle } from 'react-native';\n\nimport type { AlertVariant } from './Alert.base';\nimport {\n ACTION_SLOT,\n ALERT_PADDING_UNITS,\n ALERT_RADIUS_UNITS,\n type AlertPalette,\n alertPalette,\n alertSurface,\n CLOSE_BUTTON,\n DESCRIPTION,\n GLOW,\n ICON_SLOT,\n MESSAGE_FONT_SIZE,\n MESSAGE_GAP_UNITS,\n MESSAGE_LINE_HEIGHT,\n TITLE,\n} from './Alert.metrics';\nimport { alpha } from '../../../tokens/color';\nimport { muiTypeStyle } from '../../../tokens/mui-type';\nimport type { UiTheme } from '../../../tokens/theme';\nimport type { ColorValue } from '../../../tokens/vocabulary';\n\n/**\n * THE PAINT, KEPT APART FROM THE STRUCTURE.\n *\n * `Alert.native.tsx` reads as what renders where; this file reads as\n * arithmetic — the same palette slots, alphas and px the web's\n * `Alert.styles.tsx` derives from `Alert.metrics.ts`.\n */\n\nexport interface AlertLookArgs {\n variant: AlertVariant;\n color: ColorValue | undefined;\n glow: boolean;\n pulse: boolean;\n}\n\nexport interface AlertLook {\n palette: AlertPalette;\n /** What the words are set in. */\n ink: string;\n iconColor: string;\n root: ViewStyle;\n}\n\n/**\n * The root's paint. The web keeps `overflow: hidden` (its pulse wash is\n * clipped to the card, as it is here); only the glow opens it, because a\n * view's own shadow is clipped by its own overflow on a device.\n */\nexport function alertLook(theme: UiTheme, a: AlertLookArgs): AlertLook {\n const palette = alertPalette(theme, a.color ?? a.variant);\n const surface = alertSurface(theme, a.variant, palette);\n const root: ViewStyle = {\n flexDirection: 'row',\n paddingVertical: theme.spacing(ALERT_PADDING_UNITS.vertical),\n paddingHorizontal: theme.spacing(ALERT_PADDING_UNITS.horizontal),\n borderRadius: theme.spacing(ALERT_RADIUS_UNITS),\n overflow: a.glow ? 'visible' : 'hidden',\n backgroundColor: surface.backgroundColor,\n ...(surface.borderColor ? { borderWidth: 1, borderColor: surface.borderColor } : {}),\n ...(a.glow\n ? {\n boxShadow: `0 0 ${GLOW.blur}px ${GLOW.spread}px ${alpha(palette.main, GLOW.alpha)}`,\n filter: `brightness(${GLOW.brightness})`,\n }\n : {}),\n };\n return { palette, ink: surface.color, iconColor: surface.iconColor, root };\n}\n\n/** The message column: 8px between its lines, allowed to shrink so long text wraps beside the icon. */\nexport const messageSlotStyle = (theme: UiTheme): ViewStyle => ({\n flexDirection: 'column',\n gap: theme.spacing(MESSAGE_GAP_UNITS),\n flexShrink: 1,\n minWidth: 0,\n});\n\n/** A string child: MUI's `body2` letter-spacing at 0.95rem on the message's 1.5. */\nexport const messageTextStyle = (theme: UiTheme, ink: string): TextStyle => ({\n ...muiTypeStyle(theme, 'body2', MESSAGE_FONT_SIZE),\n lineHeight: MESSAGE_FONT_SIZE * MESSAGE_LINE_HEIGHT,\n color: ink,\n});\n\n/** MUI's `AlertTitle` (a `body1` Typography) at 1.05rem and 600, lifted 2px, 4px above a description. */\nexport const titleStyle = (theme: UiTheme, ink: string, hasDescription: boolean): TextStyle => ({\n ...muiTypeStyle(theme, 'body1', TITLE.fontSize),\n fontWeight: `${TITLE.fontWeight}`,\n color: ink,\n marginTop: TITLE.marginTop,\n marginBottom: hasDescription ? theme.spacing(TITLE.marginBottomUnits) : 0,\n});\n\n/** The description: 0.925rem on the message's 1.5, faded to 0.9. */\nexport const descriptionStyle = (theme: UiTheme, ink: string): TextStyle => ({\n ...muiTypeStyle(theme, 'body2', DESCRIPTION.fontSize),\n lineHeight: DESCRIPTION.fontSize * MESSAGE_LINE_HEIGHT,\n color: ink,\n opacity: DESCRIPTION.opacity,\n});\n\n/** MUI's `.MuiAlert-icon` with the web's overrides: first-line aligned, 14px from the words, 2px down. */\nexport const iconSlotStyle = (theme: UiTheme): ViewStyle => ({\n alignSelf: 'flex-start',\n alignItems: 'center',\n marginRight: theme.spacing(ICON_SLOT.marginRightUnits),\n paddingTop: theme.spacing(ICON_SLOT.paddingTopUnits),\n paddingBottom: ICON_SLOT.paddingBottom,\n opacity: ICON_SLOT.opacity,\n});\n\n/** MUI's `.MuiAlert-action`: top-aligned, pushed to the right edge, 16px off the text. */\nexport const actionSlotStyle = (theme: UiTheme): ViewStyle => ({\n alignItems: 'flex-start',\n paddingTop: ACTION_SLOT.paddingTop,\n paddingLeft: theme.spacing(ACTION_SLOT.paddingLeftUnits),\n marginLeft: 'auto',\n marginRight: ACTION_SLOT.marginRight,\n});\n\n/** MUI's small `IconButton` at 0.7; pressed stands in for the web's hover (full opacity, a faint wash). */\nexport const closeButtonStyle = (theme: UiTheme, pressed: boolean): ViewStyle => ({\n padding: CLOSE_BUTTON.padding,\n borderRadius: theme.radius.full,\n opacity: pressed ? 1 : CLOSE_BUTTON.opacity,\n backgroundColor: pressed ? alpha(theme.palette.action.hover, CLOSE_BUTTON.washAlpha) : 'transparent',\n});\n"],"mappings":"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","names":[]}
@@ -6,15 +6,15 @@ import {
6
6
  } from "../chunks/chunk-5GJ5OG5R.js";
7
7
  import {
8
8
  Icon
9
- } from "../chunks/chunk-QYUD3S6F.js";
9
+ } from "../chunks/chunk-ZOP7UAZK.js";
10
10
  import "../chunks/chunk-5WLOVHKK.js";
11
11
  import "../chunks/chunk-AR5O4BEY.js";
12
12
  import {
13
13
  useUiTheme
14
- } from "../chunks/chunk-GWGIWQO7.js";
14
+ } from "../chunks/chunk-XI7HTAVN.js";
15
15
  import {
16
16
  alpha
17
- } from "../chunks/chunk-LEMMXZFN.js";
17
+ } from "../chunks/chunk-MP3UDWTT.js";
18
18
 
19
19
  // src/components/data-display/Avatar/Avatar.native.tsx
20
20
  import * as React2 from "react";
@@ -9,18 +9,18 @@ import {
9
9
  } from "../chunks/chunk-5GJ5OG5R.js";
10
10
  import {
11
11
  Icon
12
- } from "../chunks/chunk-QYUD3S6F.js";
12
+ } from "../chunks/chunk-ZOP7UAZK.js";
13
13
  import "../chunks/chunk-5WLOVHKK.js";
14
14
  import {
15
15
  resolveTestId
16
16
  } from "../chunks/chunk-AR5O4BEY.js";
17
17
  import {
18
18
  useUiTheme
19
- } from "../chunks/chunk-GWGIWQO7.js";
19
+ } from "../chunks/chunk-XI7HTAVN.js";
20
20
  import {
21
21
  alpha,
22
22
  contrastText
23
- } from "../chunks/chunk-LEMMXZFN.js";
23
+ } from "../chunks/chunk-MP3UDWTT.js";
24
24
 
25
25
  // src/components/data-display/Badge/Badge.native.tsx
26
26
  import * as React from "react";
@@ -3,15 +3,15 @@ import {
3
3
  } from "../chunks/chunk-MJVSQXOD.js";
4
4
  import {
5
5
  Icon
6
- } from "../chunks/chunk-QYUD3S6F.js";
6
+ } from "../chunks/chunk-ZOP7UAZK.js";
7
7
  import "../chunks/chunk-5WLOVHKK.js";
8
8
  import "../chunks/chunk-AR5O4BEY.js";
9
9
  import {
10
10
  useUiTheme
11
- } from "../chunks/chunk-GWGIWQO7.js";
11
+ } from "../chunks/chunk-XI7HTAVN.js";
12
12
  import {
13
13
  alpha
14
- } from "../chunks/chunk-LEMMXZFN.js";
14
+ } from "../chunks/chunk-MP3UDWTT.js";
15
15
 
16
16
  // src/components/data-display/Chip/Chip.native.tsx
17
17
  import * as React from "react";