@12-apps/ui 6.29.1 → 6.31.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 (908) hide show
  1. package/NATIVE.md +1 -1
  2. package/components-catalog.md +7 -0
  3. package/components-guidelines.md +31 -0
  4. package/dist/_internal/components/data-display/Alert/Alert.js +5 -4
  5. package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -2
  6. package/dist/_internal/components/data-display/Alert/Alert.styles.js +4 -3
  7. package/dist/_internal/components/data-display/Avatar/Avatar.js +6 -5
  8. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +5 -4
  9. package/dist/_internal/components/data-display/Badge/Badge.animations.js +3 -2
  10. package/dist/_internal/components/data-display/Badge/Badge.js +6 -5
  11. package/dist/_internal/components/data-display/Badge/Badge.metrics.js +3 -2
  12. package/dist/_internal/components/data-display/Badge/Badge.styles.js +4 -3
  13. package/dist/_internal/components/data-display/Badge/Badge.variants.js +3 -2
  14. package/dist/_internal/components/data-display/Badge/BadgeContent.js +5 -4
  15. package/dist/_internal/components/data-display/Banner/Banner.js +3 -2
  16. package/dist/_internal/components/data-display/Banner/Banner.styles.js +3 -2
  17. package/dist/_internal/components/data-display/CardKit/CardKebab.js +8 -6
  18. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +6 -5
  19. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +12 -10
  20. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +8 -6
  21. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +7 -5
  22. package/dist/_internal/components/data-display/Carousel/Carousel.js +10 -8
  23. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +6 -4
  24. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +6 -4
  25. package/dist/_internal/components/data-display/Chart/Chart.js +10 -8
  26. package/dist/_internal/components/data-display/Chart/SpecChart.js +13 -11
  27. package/dist/_internal/components/data-display/Chart/chart-context.js +7 -5
  28. package/dist/_internal/components/data-display/Chart/chart-internals.js +6 -4
  29. package/dist/_internal/components/data-display/Chart/chart-renderers.js +9 -7
  30. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  31. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  32. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +6 -5
  33. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +66 -64
  34. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +88 -86
  35. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +13 -11
  36. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +14 -12
  37. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +22 -20
  38. package/dist/_internal/components/data-display/DataViews/base-card.js +9 -8
  39. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +10 -9
  40. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +5 -4
  41. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +9 -8
  42. package/dist/_internal/components/data-display/DataViews/base-list-card.js +15 -14
  43. package/dist/_internal/components/data-display/DataViews/card-surface.js +3 -2
  44. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +3 -1
  45. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +20 -18
  46. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +6 -5
  47. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +9 -7
  48. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +3 -1
  49. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +13 -11
  50. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +6 -5
  51. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +10 -8
  52. package/dist/_internal/components/data-display/DataViews/data-views-export.js +10 -8
  53. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +26 -24
  54. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +17 -15
  55. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +8 -6
  56. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +62 -60
  57. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +6 -5
  58. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +37 -35
  59. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +19 -17
  60. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +23 -21
  61. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +3 -1
  62. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
  63. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +7 -5
  64. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  65. package/dist/_internal/components/data-display/DataViews/data-views-search.js +3 -1
  66. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +10 -8
  67. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +24 -22
  68. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +34 -32
  69. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +23 -21
  70. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +10 -8
  71. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  72. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +6 -5
  73. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +11 -9
  74. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  75. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +6 -5
  76. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +16 -14
  77. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +15 -13
  78. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
  79. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +21 -19
  80. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +4 -4
  81. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  82. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +4 -2
  83. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +2 -2
  84. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  85. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +14 -12
  86. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +3 -1
  87. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  88. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  89. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  90. package/dist/_internal/components/data-display/Progress/Progress.js +6 -5
  91. package/dist/_internal/components/data-display/Progress/Progress.metrics.js +4 -3
  92. package/dist/_internal/components/data-display/Progress/Progress.styles.js +5 -4
  93. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +5 -3
  94. package/dist/_internal/components/data-display/Sheet/Sheet.js +7 -5
  95. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +6 -4
  96. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  97. package/dist/_internal/components/data-display/index.js +61 -59
  98. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +8 -6
  99. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  100. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.js +12 -0
  101. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +26 -0
  102. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js.map +1 -0
  103. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.js +12 -0
  104. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.js.map +1 -0
  105. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.js +1 -0
  106. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.js.map +1 -0
  107. package/dist/_internal/components/feedback/index.js +35 -17
  108. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +2 -2
  109. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +11 -9
  110. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +6 -4
  111. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +4 -2
  112. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +4 -2
  113. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +3 -1
  114. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +4 -2
  115. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +3 -1
  116. package/dist/_internal/components/form/Button/Button.js +7 -5
  117. package/dist/_internal/components/form/Button/Button.metrics.js +1 -3
  118. package/dist/_internal/components/form/Button/Button.styles.js +5 -4
  119. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
  120. package/dist/_internal/components/form/Calendar/Calendar.js +6 -6
  121. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
  122. package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
  123. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +9 -7
  124. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +4 -2
  125. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +4 -2
  126. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +6 -4
  127. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +5 -3
  128. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +12 -10
  129. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +3 -1
  130. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +4 -2
  131. package/dist/_internal/components/form/CepField/CepField.js +6 -4
  132. package/dist/_internal/components/form/Checkbox/Checkbox.js +4 -3
  133. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +5 -3
  134. package/dist/_internal/components/form/Command/Command.js +7 -5
  135. package/dist/_internal/components/form/Command/Command.styles.js +6 -4
  136. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +3 -1
  137. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +5 -3
  138. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +14 -12
  139. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +4 -2
  140. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +5 -3
  141. package/dist/_internal/components/form/Input/Input.js +5 -3
  142. package/dist/_internal/components/form/Input/Input.metrics.js +1 -1
  143. package/dist/_internal/components/form/Input/Input.styles.js +6 -2
  144. package/dist/_internal/components/form/InputOTP/InputOTP.js +4 -2
  145. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +3 -1
  146. package/dist/_internal/components/form/Label/Label.js +7 -5
  147. package/dist/_internal/components/form/Label/Label.styles.js +6 -4
  148. package/dist/_internal/components/form/Menubar/Menubar.item.js +7 -5
  149. package/dist/_internal/components/form/Menubar/Menubar.js +10 -8
  150. package/dist/_internal/components/form/Menubar/Menubar.styles.js +6 -4
  151. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +8 -6
  152. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -1
  153. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +5 -3
  154. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +3 -1
  155. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +4 -2
  156. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +4 -2
  157. package/dist/_internal/components/form/Select/Select.js +4 -2
  158. package/dist/_internal/components/form/Select/Select.metrics.js +1 -1
  159. package/dist/_internal/components/form/Switch/Switch.js +8 -7
  160. package/dist/_internal/components/form/Switch/Switch.parts.js +6 -5
  161. package/dist/_internal/components/form/Switch/Switch.styles.js +5 -4
  162. package/dist/_internal/components/form/Textarea/Textarea.js +3 -1
  163. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +6 -2
  164. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js.map +1 -1
  165. package/dist/_internal/components/form/Toggle/Toggle.js +4 -2
  166. package/dist/_internal/components/form/Toggle/Toggle.styles.js +3 -1
  167. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +4 -1
  168. package/dist/_internal/components/form/index.js +89 -87
  169. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +13 -11
  170. package/dist/_internal/components/form/total-form/Fields/CepField.js +7 -5
  171. package/dist/_internal/components/form/total-form/Fields/SelectField.js +5 -3
  172. package/dist/_internal/components/form/total-form/Fields/TextField.js +6 -4
  173. package/dist/_internal/components/form/total-form/Fields/ToggleField.js +5 -2
  174. package/dist/_internal/components/form/total-form/Fields/index.js +27 -24
  175. package/dist/_internal/components/form/total-form/SubmitButton.js +8 -6
  176. package/dist/_internal/components/index.js +232 -218
  177. package/dist/_internal/components/layout/Box/Box.js +8 -6
  178. package/dist/_internal/components/layout/Card/Card.js +2 -2
  179. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +3 -1
  180. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js +3 -1
  181. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +3 -1
  182. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +4 -2
  183. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +3 -1
  184. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +3 -1
  185. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +3 -1
  186. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +1 -1
  187. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +4 -4
  188. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +2 -2
  189. package/dist/_internal/components/layout/Stack/Stack.js +9 -7
  190. package/dist/_internal/components/layout/TableFilter/TableFilter.js +3 -1
  191. package/dist/_internal/components/layout/index.js +32 -30
  192. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +14 -12
  193. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +6 -4
  194. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
  195. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +2 -2
  196. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +4 -4
  197. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +2 -2
  198. package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
  199. package/dist/_internal/components/navigation/Tabs/Tabs.js +2 -2
  200. package/dist/_internal/components/navigation/index.js +34 -32
  201. package/dist/_internal/components/typography/Heading/Heading.js +6 -5
  202. package/dist/_internal/components/typography/Heading/Heading.metrics.js +4 -3
  203. package/dist/_internal/components/typography/Heading/Heading.styles.js +5 -4
  204. package/dist/_internal/components/typography/Paragraph/Paragraph.js +4 -3
  205. package/dist/_internal/components/typography/Text/Text.js +5 -4
  206. package/dist/_internal/components/typography/Text/Text.metrics.js +4 -3
  207. package/dist/_internal/components/typography/index.js +9 -8
  208. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
  209. package/dist/_internal/components/utility/index.js +15 -15
  210. package/dist/_internal/en-US.data-display.js +2 -2
  211. package/dist/_internal/en-US.feedback.js +3 -1
  212. package/dist/_internal/icons/Icon.js +8 -6
  213. package/dist/_internal/provider/UiProvider.js +7 -5
  214. package/dist/_internal/provider/mui-bridge.js +6 -4
  215. package/dist/_internal/provider/use-ui-theme.js +7 -5
  216. package/dist/_internal/pt-BR.feedback.js +3 -1
  217. package/dist/_internal/social-login-button/social-login-button.js +16 -14
  218. package/dist/_internal/tokens/field-radius.core.js +8 -0
  219. package/dist/_internal/tokens/field-radius.core.js.map +1 -0
  220. package/dist/_internal/tokens/field-radius.js +18 -0
  221. package/dist/_internal/tokens/field-radius.js.map +1 -0
  222. package/dist/_internal/tokens/theme.js +3 -2
  223. package/dist/_internal/user-avatar/user-avatar.js +16 -14
  224. package/dist/charts.js +16 -14
  225. package/dist/{chunk-RXVPUW7V.js → chunk-26ORCF6J.js} +2 -2
  226. package/dist/chunk-26X4CZVR.js +7 -0
  227. package/dist/chunk-26X4CZVR.js.map +1 -0
  228. package/dist/{chunk-XZTOIEKI.js → chunk-272OV2KZ.js} +5 -2
  229. package/dist/chunk-272OV2KZ.js.map +1 -0
  230. package/dist/{chunk-THOPGHTY.js → chunk-2DFH74T4.js} +2 -2
  231. package/dist/{chunk-W5CW7JFZ.js → chunk-2N2KNXTF.js} +2 -2
  232. package/dist/{chunk-W3FAKT3D.js → chunk-2SWQ6HIK.js} +4 -4
  233. package/dist/{chunk-IVVOIDE5.js → chunk-2YOQLBEX.js} +3 -3
  234. package/dist/{chunk-DEE6IPGI.js → chunk-32MTYYGC.js} +10 -10
  235. package/dist/{chunk-GVDJQMFI.js → chunk-35GWNOLB.js} +2 -2
  236. package/dist/{chunk-MI2MVH3I.js → chunk-3BAFJMBH.js} +8 -5
  237. package/dist/chunk-3BAFJMBH.js.map +1 -0
  238. package/dist/chunk-3MEIGSDK.js +88 -0
  239. package/dist/chunk-3MEIGSDK.js.map +1 -0
  240. package/dist/{chunk-W4SDVTZC.js → chunk-3PT3SBJ7.js} +2 -2
  241. package/dist/{chunk-P3NRT6GV.js → chunk-3ZGQSWHJ.js} +5 -5
  242. package/dist/{chunk-PFLKPNBU.js → chunk-4DUHJIR2.js} +2 -2
  243. package/dist/{chunk-CJUOBTLL.js → chunk-4EL5ZSZ3.js} +6 -3
  244. package/dist/chunk-4EL5ZSZ3.js.map +1 -0
  245. package/dist/{chunk-46UPILLK.js → chunk-4ETQRBZC.js} +4 -4
  246. package/dist/{chunk-65DLYC4S.js → chunk-4LDRYLE2.js} +2 -2
  247. package/dist/{chunk-ON2CMKTI.js → chunk-4WT4PV4M.js} +2 -2
  248. package/dist/chunk-55E7GLVT.js +109 -0
  249. package/dist/chunk-55E7GLVT.js.map +1 -0
  250. package/dist/chunk-55FFONIV.js +11 -0
  251. package/dist/chunk-55FFONIV.js.map +1 -0
  252. package/dist/{chunk-AIBNBWQU.js → chunk-5EQFAFR3.js} +2 -2
  253. package/dist/{chunk-EVXFEXBS.js → chunk-5UGXAAZG.js} +2 -2
  254. package/dist/{chunk-DOMEYGTN.js → chunk-5YOFMMK3.js} +2 -2
  255. package/dist/{chunk-JE6RZ5L6.js → chunk-5ZOJLYD2.js} +4 -4
  256. package/dist/{chunk-J3JGO6Y6.js → chunk-65IHPI4S.js} +5 -1
  257. package/dist/chunk-65IHPI4S.js.map +1 -0
  258. package/dist/{chunk-NY2Y2SHA.js → chunk-67L5CMXP.js} +6 -6
  259. package/dist/{chunk-L6TCIZFR.js → chunk-6BGS5FND.js} +3 -3
  260. package/dist/{chunk-QPDDS6DQ.js → chunk-6PSAPCTE.js} +2 -2
  261. package/dist/{chunk-QSKJLMNS.js → chunk-6SK3MTYJ.js} +4 -4
  262. package/dist/{chunk-MGPA6KTM.js → chunk-6SNRPCSK.js} +2 -2
  263. package/dist/{chunk-WXD7MGBT.js → chunk-6SXZ7CF2.js} +6 -2
  264. package/dist/chunk-6SXZ7CF2.js.map +1 -0
  265. package/dist/{chunk-XELVDPKL.js → chunk-6VZYQC7T.js} +6 -6
  266. package/dist/chunk-6YIKVXAV.js +1 -0
  267. package/dist/chunk-6YIKVXAV.js.map +1 -0
  268. package/dist/{chunk-G5ZVD5IJ.js → chunk-7AR2R7TV.js} +4 -4
  269. package/dist/{chunk-B6IURHSZ.js → chunk-7DNQHMDO.js} +4 -4
  270. package/dist/{chunk-VLHGBFR6.js → chunk-7U36V4CU.js} +4 -4
  271. package/dist/{chunk-ZU3SWR4I.js → chunk-7YTLJUBX.js} +2 -2
  272. package/dist/{chunk-C5EFVSBN.js → chunk-A5FIYKAN.js} +2 -2
  273. package/dist/{chunk-SOCKK67R.js → chunk-AFZUPCBK.js} +6 -6
  274. package/dist/{chunk-PQECNGDE.js → chunk-AGYGNNOM.js} +2 -2
  275. package/dist/{chunk-AVI3XHRQ.js → chunk-AIRWM7KK.js} +4 -4
  276. package/dist/{chunk-T5WNNEP5.js → chunk-APMEXS3Y.js} +2 -2
  277. package/dist/chunk-ASHXIAJO.js +88 -0
  278. package/dist/chunk-ASHXIAJO.js.map +1 -0
  279. package/dist/{chunk-K7DCYV5Q.js → chunk-ATBT4RJZ.js} +2 -2
  280. package/dist/{chunk-JMVIIKII.js → chunk-BDVJ65GR.js} +6 -2
  281. package/dist/chunk-BDVJ65GR.js.map +1 -0
  282. package/dist/{chunk-QZBUGUOY.js → chunk-BHXFPZAA.js} +11 -8
  283. package/dist/chunk-BHXFPZAA.js.map +1 -0
  284. package/dist/{chunk-HKV4MQ2W.js → chunk-BKP7YW3Y.js} +2 -2
  285. package/dist/{chunk-UN5INW6K.js → chunk-BPYPUEM5.js} +3 -3
  286. package/dist/{chunk-SONWG2RT.js → chunk-BRAF4MFO.js} +9 -6
  287. package/dist/chunk-BRAF4MFO.js.map +1 -0
  288. package/dist/{chunk-BEWD734I.js → chunk-BRUJC7OG.js} +3 -3
  289. package/dist/{chunk-SLMA4UQS.js → chunk-BWSYSSF3.js} +3 -3
  290. package/dist/{chunk-FR6AJSMT.js → chunk-C2ZNAQMO.js} +5 -5
  291. package/dist/{chunk-TU6RNZUQ.js → chunk-C4NRFERD.js} +2 -2
  292. package/dist/{chunk-V7F53GEO.js → chunk-CATLG2RT.js} +7 -7
  293. package/dist/{chunk-LYMAMKJT.js → chunk-CEA4QA63.js} +2 -2
  294. package/dist/{chunk-XXDXW6TX.js → chunk-CIVLXOLG.js} +2 -2
  295. package/dist/{chunk-7TZ6OC5T.js → chunk-CJMU3G2J.js} +6 -6
  296. package/dist/{chunk-MVJYIHPH.js → chunk-CKW267ZK.js} +6 -6
  297. package/dist/{chunk-MRMNVGNX.js → chunk-CPA2YRVZ.js} +2 -2
  298. package/dist/{chunk-TSFFZ3AH.js → chunk-D5YGDCMP.js} +15 -15
  299. package/dist/{chunk-3TFUAKWJ.js → chunk-D6P5PSHU.js} +2 -2
  300. package/dist/{chunk-3W7IEWEL.js → chunk-D7Q42CRZ.js} +8 -2
  301. package/dist/chunk-D7Q42CRZ.js.map +1 -0
  302. package/dist/{chunk-DVE53B2L.js → chunk-DBXGRZBJ.js} +7 -7
  303. package/dist/{chunk-XSJWN3WH.js → chunk-DF2FFYZ7.js} +7 -7
  304. package/dist/{chunk-T7WU7JGC.js → chunk-DHQ6ASUD.js} +5 -5
  305. package/dist/{chunk-ZZOOSKSV.js → chunk-DV42HAVP.js} +12 -6
  306. package/dist/chunk-DV42HAVP.js.map +1 -0
  307. package/dist/{chunk-RBGOGTT2.js → chunk-DWZ7FLA7.js} +4 -4
  308. package/dist/{chunk-DVUPIVI2.js → chunk-DX36KZUV.js} +4 -4
  309. package/dist/{chunk-FVPN4YKW.js → chunk-EATFKTO3.js} +3 -3
  310. package/dist/{chunk-VRKS5K4N.js → chunk-EJJRJYB5.js} +4 -4
  311. package/dist/{chunk-TSEWUY4V.js → chunk-EN5Q5RPQ.js} +3 -3
  312. package/dist/{chunk-ZS44PY7T.js → chunk-ETSKBOXN.js} +5 -3
  313. package/dist/chunk-ETSKBOXN.js.map +1 -0
  314. package/dist/{chunk-EYC6ERJJ.js → chunk-ETU4LNU7.js} +3 -3
  315. package/dist/{chunk-UC6A6ASM.js → chunk-EYRSUVBC.js} +2 -2
  316. package/dist/{chunk-HLYPI5CO.js → chunk-F22WT7UX.js} +2 -2
  317. package/dist/{chunk-JPVDZXXX.js → chunk-F65LT7XV.js} +2 -2
  318. package/dist/{chunk-V5IOLAIS.js → chunk-F73D4EMA.js} +1 -1
  319. package/dist/chunk-F73D4EMA.js.map +1 -0
  320. package/dist/{chunk-J2K65BQQ.js → chunk-FC74EAW4.js} +4 -4
  321. package/dist/{chunk-TEE6HNHS.js → chunk-FRW4SYZD.js} +4 -4
  322. package/dist/{chunk-LCXXPIG3.js → chunk-G3WUOPWE.js} +2 -2
  323. package/dist/{chunk-S6YY2WWK.js → chunk-G5G4Q7G6.js} +13 -3
  324. package/dist/chunk-G5G4Q7G6.js.map +1 -0
  325. package/dist/{chunk-SQV3HPTZ.js → chunk-G76H5PEM.js} +4 -4
  326. package/dist/chunk-GDN2LUTZ.js +39 -0
  327. package/dist/chunk-GDN2LUTZ.js.map +1 -0
  328. package/dist/{chunk-DFK6QCXX.js → chunk-GEZYZ446.js} +1 -2
  329. package/dist/{chunk-DFK6QCXX.js.map → chunk-GEZYZ446.js.map} +1 -1
  330. package/dist/{chunk-XYDW5RQB.js → chunk-GKGA2ZCW.js} +2 -2
  331. package/dist/{chunk-KW7H5O3K.js → chunk-GLPHRHIT.js} +7 -7
  332. package/dist/{chunk-3PUOLOEP.js → chunk-GOKMLXZH.js} +2 -2
  333. package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
  334. package/dist/{chunk-B7NV6JFG.js → chunk-GUROYOKQ.js} +2 -2
  335. package/dist/{chunk-PVIAHB7D.js → chunk-H2RHA73H.js} +9 -9
  336. package/dist/{chunk-C5YBXQTK.js → chunk-H35CQ6DF.js} +3 -3
  337. package/dist/{chunk-ZUY65MFH.js → chunk-H7ZN2GW7.js} +6 -3
  338. package/dist/chunk-H7ZN2GW7.js.map +1 -0
  339. package/dist/{chunk-5WNQJ5KS.js → chunk-HEWJJ4VE.js} +6 -3
  340. package/dist/chunk-HEWJJ4VE.js.map +1 -0
  341. package/dist/{chunk-SHDIZSN5.js → chunk-HFBME3C5.js} +2 -2
  342. package/dist/{chunk-HS2OJI6L.js → chunk-HSVNFMXY.js} +8 -8
  343. package/dist/{chunk-WQFIV5WD.js → chunk-HZAPN7XD.js} +6 -2
  344. package/dist/chunk-HZAPN7XD.js.map +1 -0
  345. package/dist/{chunk-NWQWUYOV.js → chunk-I2IZ53QS.js} +2 -2
  346. package/dist/{chunk-K4N3V7YE.js → chunk-IASDP44E.js} +4 -4
  347. package/dist/{chunk-PCYGUOWJ.js → chunk-IAVAZ36T.js} +4 -4
  348. package/dist/{chunk-B443IIQG.js → chunk-IE7ISTLQ.js} +4 -4
  349. package/dist/{chunk-LKF5KQ2Q.js → chunk-IIUB4IOH.js} +4 -4
  350. package/dist/{chunk-UKPZVX3J.js → chunk-INH2BDHV.js} +9 -9
  351. package/dist/{chunk-PUBPZOQJ.js → chunk-IPE5FFFD.js} +2 -2
  352. package/dist/{chunk-HP2ODXNA.js → chunk-IPS55KWK.js} +2 -2
  353. package/dist/{chunk-J3ZP6EUS.js → chunk-IQFUV3BA.js} +2 -2
  354. package/dist/{chunk-A7LG3AXV.js → chunk-IRSI3BFF.js} +26 -13
  355. package/dist/chunk-IRSI3BFF.js.map +1 -0
  356. package/dist/{chunk-2ZRZTGWP.js → chunk-ISW5K72V.js} +5 -5
  357. package/dist/{chunk-OD4Z5G6G.js → chunk-J2RRZZXC.js} +2 -2
  358. package/dist/{chunk-FV36LFPX.js → chunk-JHOBW7OD.js} +6 -2
  359. package/dist/chunk-JHOBW7OD.js.map +1 -0
  360. package/dist/{chunk-BYMWW65P.js → chunk-JOPTI47I.js} +3 -3
  361. package/dist/chunk-JQRKXMSH.js +1 -0
  362. package/dist/chunk-JQRKXMSH.js.map +1 -0
  363. package/dist/{chunk-T2VO32Z2.js → chunk-JUHPNTDA.js} +10 -4
  364. package/dist/chunk-JUHPNTDA.js.map +1 -0
  365. package/dist/{chunk-J3D34ZBL.js → chunk-JVMNE5G4.js} +6 -2
  366. package/dist/chunk-JVMNE5G4.js.map +1 -0
  367. package/dist/{chunk-5LQ7PKMW.js → chunk-K6FCXPTS.js} +1 -3
  368. package/dist/chunk-K6FCXPTS.js.map +1 -0
  369. package/dist/{chunk-VKH7AENA.js → chunk-KJYD5OJ4.js} +2 -2
  370. package/dist/{chunk-HZVFAGLZ.js → chunk-L6UTYFAB.js} +6 -3
  371. package/dist/chunk-L6UTYFAB.js.map +1 -0
  372. package/dist/chunk-L7BRU4UF.js +39 -0
  373. package/dist/chunk-L7BRU4UF.js.map +1 -0
  374. package/dist/{chunk-RVGG5YJY.js → chunk-LG6DHNRD.js} +2 -2
  375. package/dist/{chunk-WC5XYWTE.js → chunk-LWAOL4BG.js} +2 -2
  376. package/dist/{chunk-MNSW33DU.js → chunk-MCAXIKQD.js} +4 -4
  377. package/dist/{chunk-H53YNR23.js → chunk-MRGPVPQC.js} +8 -8
  378. package/dist/{chunk-DBYFC6CF.js → chunk-MSKEFXXV.js} +5 -2
  379. package/dist/chunk-MSKEFXXV.js.map +1 -0
  380. package/dist/{chunk-EZNTM6PT.js → chunk-MYUZPUXQ.js} +3 -3
  381. package/dist/{chunk-SX3V2DLV.js → chunk-NFJUBPIN.js} +2 -2
  382. package/dist/{chunk-XGOWREVV.js → chunk-NJ6D37KV.js} +2 -2
  383. package/dist/{chunk-4H4Y2SX3.js → chunk-NLUZGT4U.js} +3 -3
  384. package/dist/{chunk-NGVGTMHT.js → chunk-NR2HXHBR.js} +2 -2
  385. package/dist/{chunk-HKKSZ7HG.js → chunk-O6DRUOUF.js} +2 -2
  386. package/dist/{chunk-YB6MDGPR.js → chunk-O7SE4PYT.js} +8 -3
  387. package/dist/chunk-O7SE4PYT.js.map +1 -0
  388. package/dist/{chunk-R6SSXEK2.js → chunk-OFMDFN3U.js} +2 -2
  389. package/dist/{chunk-EUKYQXYU.js → chunk-OHKEQ7QJ.js} +2 -2
  390. package/dist/{chunk-NUB4T3RQ.js → chunk-OIFBBDYX.js} +2 -2
  391. package/dist/{chunk-PFZAUMJA.js → chunk-OL7UQMBI.js} +2 -2
  392. package/dist/{chunk-O42ZA3TW.js → chunk-ORIFMVN4.js} +3 -3
  393. package/dist/{chunk-5KFZGB5U.js → chunk-P4BZ7YE6.js} +2 -2
  394. package/dist/{chunk-JRWPI4XF.js → chunk-P7FQUGED.js} +5 -5
  395. package/dist/{chunk-XBZ43VIV.js → chunk-PCONTSJJ.js} +10 -10
  396. package/dist/{chunk-XOCLWQON.js → chunk-PEMZ2ABQ.js} +4 -4
  397. package/dist/{chunk-UCU5FCYE.js → chunk-PS3EJLOC.js} +6 -2
  398. package/dist/chunk-PS3EJLOC.js.map +1 -0
  399. package/dist/{chunk-XXE6NTJB.js → chunk-Q544QEIN.js} +5 -3
  400. package/dist/chunk-Q544QEIN.js.map +1 -0
  401. package/dist/{chunk-VXTYVJDK.js → chunk-Q5BSNHN7.js} +2 -2
  402. package/dist/{chunk-IQ7WZ3RN.js → chunk-QKDFD4VT.js} +4 -4
  403. package/dist/{chunk-YTYROOLY.js → chunk-QNUWSXF2.js} +3 -3
  404. package/dist/{chunk-VESIQYBF.js → chunk-QP3KK4KO.js} +12 -12
  405. package/dist/{chunk-MSUSZLRE.js → chunk-QPMLACIK.js} +2 -2
  406. package/dist/{chunk-MHSTG7FF.js → chunk-R4SOPN6K.js} +8 -5
  407. package/dist/chunk-R4SOPN6K.js.map +1 -0
  408. package/dist/{chunk-TF4TPLF2.js → chunk-R7KR5FYJ.js} +2 -2
  409. package/dist/{chunk-237NDIT2.js → chunk-RCI6KVN6.js} +5 -5
  410. package/dist/{chunk-VIK3HAUQ.js → chunk-RDFPH47Y.js} +8 -2
  411. package/dist/chunk-RDFPH47Y.js.map +1 -0
  412. package/dist/{chunk-WYDGPJ3Z.js → chunk-RFZU5BTG.js} +4 -4
  413. package/dist/{chunk-PJTSGHTY.js → chunk-RIA34EUT.js} +2 -2
  414. package/dist/{chunk-JOXBCXVL.js → chunk-RMB4RTTM.js} +9 -9
  415. package/dist/{chunk-RNCQ5KHQ.js → chunk-RQFBLYYH.js} +2 -2
  416. package/dist/{chunk-4T6W43TO.js → chunk-RRDL7AGQ.js} +2 -2
  417. package/dist/{chunk-JB67KPGM.js → chunk-RRO2EOJB.js} +4 -4
  418. package/dist/{chunk-5UC2RNOY.js → chunk-RWIBPIPD.js} +3 -3
  419. package/dist/{chunk-QGAYEBMU.js → chunk-SAIKHWH7.js} +8 -8
  420. package/dist/{chunk-PZEC5CQA.js → chunk-SDSAQ5YS.js} +2 -2
  421. package/dist/{chunk-YFY3YVV6.js → chunk-SGV7QGYQ.js} +7 -7
  422. package/dist/{chunk-GJQYM3PM.js → chunk-SHQWIDD5.js} +4 -4
  423. package/dist/{chunk-OLQDB346.js → chunk-SMUZRLFZ.js} +2 -2
  424. package/dist/{chunk-QGBMCB76.js → chunk-SSJHEV5Z.js} +2 -2
  425. package/dist/{chunk-L2E7TY7P.js → chunk-SZB2Z6QN.js} +6 -2
  426. package/dist/chunk-SZB2Z6QN.js.map +1 -0
  427. package/dist/{chunk-MEWYA74E.js → chunk-SZZLABMO.js} +3 -3
  428. package/dist/{chunk-OJCK5RNJ.js → chunk-TLY2QMU5.js} +3 -3
  429. package/dist/{chunk-TTW4MAOJ.js → chunk-UCTJJYVC.js} +5 -5
  430. package/dist/{chunk-BLT5ZBVL.js → chunk-UEJQQVP2.js} +4 -4
  431. package/dist/{chunk-ALAJBLBE.js → chunk-UHWHTNUS.js} +5 -5
  432. package/dist/{chunk-EMAX7RPN.js → chunk-URK67BAE.js} +5 -5
  433. package/dist/{chunk-FGUESLDX.js → chunk-USPQZQBF.js} +5 -1
  434. package/dist/chunk-USPQZQBF.js.map +1 -0
  435. package/dist/{chunk-GH2DC7PS.js → chunk-V3RVRZAU.js} +5 -5
  436. package/dist/{chunk-624TFFLJ.js → chunk-V6YZ3PL5.js} +2 -2
  437. package/dist/{chunk-236QP424.js → chunk-VGSEI7PQ.js} +2 -2
  438. package/dist/{chunk-HDNK7BAX.js → chunk-VNEEXUWA.js} +3 -3
  439. package/dist/{chunk-EPRA5QLB.js → chunk-VUFMV5Q5.js} +2 -2
  440. package/dist/{chunk-LVCUJ7YU.js → chunk-VYMULXCJ.js} +6 -1
  441. package/dist/chunk-VYMULXCJ.js.map +1 -0
  442. package/dist/{chunk-QYNCPS5W.js → chunk-WBKWIFXA.js} +6 -6
  443. package/dist/{chunk-3BPDHWVF.js → chunk-WCLWFN3F.js} +9 -9
  444. package/dist/{chunk-6TSP45KC.js → chunk-WHLVMQNF.js} +5 -1
  445. package/dist/chunk-WHLVMQNF.js.map +1 -0
  446. package/dist/{chunk-FOKBP6HR.js → chunk-WI6GD4MV.js} +10 -10
  447. package/dist/{chunk-XXJRT6BP.js → chunk-WMALDOF5.js} +4 -4
  448. package/dist/{chunk-TOYEP23N.js → chunk-WONCE5GB.js} +7 -3
  449. package/dist/chunk-WONCE5GB.js.map +1 -0
  450. package/dist/{chunk-4OSGKO7E.js → chunk-WVJI3Z4P.js} +2 -2
  451. package/dist/{chunk-VVXA7T2M.js → chunk-WVQ47UTI.js} +2 -2
  452. package/dist/{chunk-GJUIZ5FN.js → chunk-X2R7QG5I.js} +7 -4
  453. package/dist/chunk-X2R7QG5I.js.map +1 -0
  454. package/dist/{chunk-TX3ZHO5R.js → chunk-XEUSTU7K.js} +8 -5
  455. package/dist/chunk-XEUSTU7K.js.map +1 -0
  456. package/dist/{chunk-6WIDZGXE.js → chunk-XMDH3MRV.js} +5 -2
  457. package/dist/chunk-XMDH3MRV.js.map +1 -0
  458. package/dist/{chunk-LSJY4LWZ.js → chunk-XPPEUGHG.js} +4 -4
  459. package/dist/{chunk-JVVTSSS4.js → chunk-XVM4ZIRE.js} +2 -2
  460. package/dist/{chunk-7MR2JCJW.js → chunk-Y2CSBXQT.js} +2 -2
  461. package/dist/{chunk-D6HDJVQW.js → chunk-YANLN6HP.js} +5 -5
  462. package/dist/{chunk-NGM5XKAS.js → chunk-YXQ2NJHF.js} +3 -3
  463. package/dist/{chunk-HQB5XNK5.js → chunk-ZCNCQGWK.js} +2 -2
  464. package/dist/{chunk-WC3W36AM.js → chunk-ZOUWHGV3.js} +4 -4
  465. package/dist/{chunk-2L2NWXWJ.js → chunk-ZVTJGWIV.js} +2 -2
  466. package/dist/data-display/Alert.js +5 -4
  467. package/dist/data-display/Avatar.js +6 -5
  468. package/dist/data-display/Badge.js +6 -5
  469. package/dist/data-display/Banner.js +3 -2
  470. package/dist/data-display/CardKit.js +15 -13
  471. package/dist/data-display/Carousel.js +10 -8
  472. package/dist/data-display/Chart.js +16 -14
  473. package/dist/data-display/DataGrid.js +2 -2
  474. package/dist/data-display/DataViews.js +107 -105
  475. package/dist/data-display/DescriptionItem.js +6 -5
  476. package/dist/data-display/FleetMap.js +21 -19
  477. package/dist/data-display/Lightbox.js +4 -4
  478. package/dist/data-display/MapPreview.js +14 -12
  479. package/dist/data-display/Progress.js +6 -5
  480. package/dist/data-display/Sheet.js +7 -5
  481. package/dist/data-display/Table.js +2 -2
  482. package/dist/en-US.js +7 -5
  483. package/dist/feedback/ConfirmAction.js +8 -6
  484. package/dist/feedback/Dialog.js +2 -2
  485. package/dist/feedback/NotificationStatusNotice.js +32 -0
  486. package/dist/feedback/NotificationStatusNotice.js.map +1 -0
  487. package/dist/form/AddressAutocomplete.js +11 -9
  488. package/dist/form/Autocomplete.js +4 -2
  489. package/dist/form/Button.js +7 -5
  490. package/dist/form/Calendar.js +6 -6
  491. package/dist/form/CategorySelect.js +12 -10
  492. package/dist/form/CepField.js +6 -4
  493. package/dist/form/Checkbox.js +4 -3
  494. package/dist/form/CodeEditor.js +5 -3
  495. package/dist/form/Command.js +7 -5
  496. package/dist/form/CreatableSelect.js +3 -1
  497. package/dist/form/DateRangePicker.js +14 -12
  498. package/dist/form/Input.js +5 -3
  499. package/dist/form/InputOTP.js +4 -2
  500. package/dist/form/Label.js +7 -5
  501. package/dist/form/Menubar.js +10 -8
  502. package/dist/form/PhoneInput.js +3 -1
  503. package/dist/form/RadioGroup.js +5 -3
  504. package/dist/form/RichTextEditor.js +4 -2
  505. package/dist/form/Select.js +4 -2
  506. package/dist/form/Switch.js +8 -7
  507. package/dist/form/Textarea.js +3 -1
  508. package/dist/form/Toggle.js +4 -2
  509. package/dist/form/ToggleGroup.js +4 -1
  510. package/dist/form/total-form.js +36 -34
  511. package/dist/icons.js +8 -6
  512. package/dist/layout/Box.js +8 -6
  513. package/dist/layout/Card.js +2 -2
  514. package/dist/layout/ContentToolbar.js +14 -12
  515. package/dist/layout/ScrollArea.js +1 -1
  516. package/dist/layout/SettingsLayout.js +6 -6
  517. package/dist/layout/Stack.js +9 -7
  518. package/dist/layout/TableFilter.js +3 -1
  519. package/dist/locales.js +10 -10
  520. package/dist/native/chunks/{chunk-2HLEFYJ5.js → chunk-7UEJ2FMQ.js} +2 -2
  521. package/dist/native/chunks/{chunk-6XDMYJBW.js → chunk-IVNAQJY6.js} +2 -2
  522. package/dist/native/chunks/{chunk-YXM4NR2B.js → chunk-LB65S6C7.js} +3 -3
  523. package/dist/native/chunks/{chunk-CO47ZRXO.js → chunk-S5SLTMPB.js} +2 -2
  524. package/dist/native/chunks/{chunk-BEPOBULQ.js → chunk-T3TYQMAH.js} +4 -5
  525. package/dist/native/chunks/chunk-T3TYQMAH.js.map +1 -0
  526. package/dist/native/chunks/{chunk-NVPXIJ2O.js → chunk-UKROAIPA.js} +4 -6
  527. package/dist/native/chunks/chunk-UKROAIPA.js.map +1 -0
  528. package/dist/native/chunks/{chunk-YQDDM6ZW.js → chunk-V72V2Q45.js} +6 -2
  529. package/dist/native/chunks/chunk-V72V2Q45.js.map +1 -0
  530. package/dist/native/chunks/{chunk-SOQVMWLQ.js → chunk-VAD5YVIZ.js} +5 -5
  531. package/dist/native/data-display/Alert.js +3 -3
  532. package/dist/native/data-display/Avatar.js +3 -3
  533. package/dist/native/data-display/Badge.js +3 -3
  534. package/dist/native/data-display/Chip.js +3 -3
  535. package/dist/native/data-display/EmptyState.js +5 -5
  536. package/dist/native/data-display/ErrorState.js +4 -4
  537. package/dist/native/data-display/FleetMap.js +6 -6
  538. package/dist/native/data-display/LoadingState.js +2 -2
  539. package/dist/native/data-display/Progress.js +2 -2
  540. package/dist/native/feedback/Dialog.js +3 -3
  541. package/dist/native/form/Button.js +3 -3
  542. package/dist/native/form/Checkbox.js +3 -3
  543. package/dist/native/form/Input.js +4 -5
  544. package/dist/native/form/Input.js.map +1 -1
  545. package/dist/native/form/Select.js +5 -6
  546. package/dist/native/form/Select.js.map +1 -1
  547. package/dist/native/form/Switch.js +2 -2
  548. package/dist/native/icons.js +3 -3
  549. package/dist/native/layout/Box.js +3 -3
  550. package/dist/native/layout/Card.js +2 -2
  551. package/dist/native/layout/Container.js +2 -2
  552. package/dist/native/layout/Skeleton.js +3 -3
  553. package/dist/native/layout/Spacer.js +2 -2
  554. package/dist/native/layout/Stack.js +3 -3
  555. package/dist/native/provider.js +2 -2
  556. package/dist/native/tokens.js +3 -1
  557. package/dist/native/typography/Heading.js +2 -2
  558. package/dist/native/typography/Paragraph.js +2 -2
  559. package/dist/native/typography/Text.js +2 -2
  560. package/dist/navigation/AppHeader.js +17 -15
  561. package/dist/navigation/CommandPalette.js +3 -3
  562. package/dist/navigation/NavigationMenu.js +4 -4
  563. package/dist/navigation/Pagination.js +2 -2
  564. package/dist/navigation/Tabs.js +2 -2
  565. package/dist/provider.js +8 -6
  566. package/dist/pt-BR.js +7 -5
  567. package/dist/social-login-button.js +16 -14
  568. package/dist/tokens.js +17 -3
  569. package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts.map +1 -1
  570. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  571. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  572. package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts.map +1 -1
  573. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  574. package/dist/types/components/data-display/DataViews/data-views-search.d.ts.map +1 -1
  575. package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
  576. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.d.ts +13 -0
  577. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.d.ts.map +1 -0
  578. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.d.ts +28 -0
  579. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.d.ts.map +1 -0
  580. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.d.ts +7 -0
  581. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.d.ts.map +1 -0
  582. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.d.ts +64 -0
  583. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.d.ts.map +1 -0
  584. package/dist/types/components/feedback/NotificationStatusNotice/index.d.ts +4 -0
  585. package/dist/types/components/feedback/NotificationStatusNotice/index.d.ts.map +1 -0
  586. package/dist/types/components/feedback/index.d.ts +1 -0
  587. package/dist/types/components/feedback/index.d.ts.map +1 -1
  588. package/dist/types/components/form/AddressAutocomplete/AddressTextField.d.ts.map +1 -1
  589. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts.map +1 -1
  590. package/dist/types/components/form/Button/Button.d.ts.map +1 -1
  591. package/dist/types/components/form/Button/Button.metrics.d.ts +0 -2
  592. package/dist/types/components/form/Button/Button.metrics.d.ts.map +1 -1
  593. package/dist/types/components/form/CategorySelect/CategoryPanelFoot.d.ts.map +1 -1
  594. package/dist/types/components/form/CategorySelect/CategoryPanelHead.d.ts.map +1 -1
  595. package/dist/types/components/form/CategorySelect/CategorySelect.styles.d.ts +4 -1
  596. package/dist/types/components/form/CategorySelect/CategorySelect.styles.d.ts.map +1 -1
  597. package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
  598. package/dist/types/components/form/CreatableSelect/CreatableSelect.d.ts.map +1 -1
  599. package/dist/types/components/form/Input/Input.d.ts.map +1 -1
  600. package/dist/types/components/form/Input/Input.metrics.d.ts +4 -2
  601. package/dist/types/components/form/Input/Input.metrics.d.ts.map +1 -1
  602. package/dist/types/components/form/Input/Input.styles.d.ts +6 -0
  603. package/dist/types/components/form/Input/Input.styles.d.ts.map +1 -1
  604. package/dist/types/components/form/InputOTP/InputOTP.styles.d.ts.map +1 -1
  605. package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
  606. package/dist/types/components/form/RadioGroup/RadioGroup.styles.d.ts.map +1 -1
  607. package/dist/types/components/form/RichTextEditor/RichTextEditor.d.ts.map +1 -1
  608. package/dist/types/components/form/Select/Select.d.ts.map +1 -1
  609. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  610. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
  611. package/dist/types/components/form/Toggle/Toggle.styles.d.ts.map +1 -1
  612. package/dist/types/components/form/ToggleGroup/ToggleGroup.d.ts.map +1 -1
  613. package/dist/types/components/layout/ContentToolbar/ColumnsMenu.d.ts.map +1 -1
  614. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
  615. package/dist/types/components/layout/ContentToolbar/FilterTrigger.d.ts.map +1 -1
  616. package/dist/types/components/layout/ContentToolbar/MultiSelectTriggers.d.ts.map +1 -1
  617. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
  618. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
  619. package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
  620. package/dist/types/copy/feedback.d.ts +43 -0
  621. package/dist/types/copy/feedback.d.ts.map +1 -1
  622. package/dist/types/en-US.feedback.d.ts +2 -1
  623. package/dist/types/en-US.feedback.d.ts.map +1 -1
  624. package/dist/types/provider/mui-bridge.d.ts.map +1 -1
  625. package/dist/types/pt-BR.feedback.d.ts +2 -1
  626. package/dist/types/pt-BR.feedback.d.ts.map +1 -1
  627. package/dist/types/tokens/field-radius.core.d.ts +26 -0
  628. package/dist/types/tokens/field-radius.core.d.ts.map +1 -0
  629. package/dist/types/tokens/field-radius.d.ts +60 -0
  630. package/dist/types/tokens/field-radius.d.ts.map +1 -0
  631. package/dist/types/tokens/scales.d.ts +1 -0
  632. package/dist/types/tokens/scales.d.ts.map +1 -1
  633. package/dist/types/tokens/theme.d.ts +8 -1
  634. package/dist/types/tokens/theme.d.ts.map +1 -1
  635. package/dist/types-native/components/form/Button/Button.metrics.d.ts +0 -2
  636. package/dist/types-native/components/form/Button/Button.metrics.d.ts.map +1 -1
  637. package/dist/types-native/components/form/Input/Input.look.native.d.ts.map +1 -1
  638. package/dist/types-native/components/form/Input/Input.metrics.d.ts +4 -2
  639. package/dist/types-native/components/form/Input/Input.metrics.d.ts.map +1 -1
  640. package/dist/types-native/components/form/Select/Select.native.d.ts.map +1 -1
  641. package/dist/types-native/tokens/field-radius.core.d.ts +26 -0
  642. package/dist/types-native/tokens/field-radius.core.d.ts.map +1 -0
  643. package/dist/types-native/tokens/index.native.d.ts +1 -0
  644. package/dist/types-native/tokens/index.native.d.ts.map +1 -1
  645. package/dist/types-native/tokens/theme.d.ts +8 -1
  646. package/dist/types-native/tokens/theme.d.ts.map +1 -1
  647. package/dist/typography/Heading.js +6 -5
  648. package/dist/typography/Paragraph.js +4 -3
  649. package/dist/typography/Text.js +5 -4
  650. package/dist/user-avatar.js +16 -14
  651. package/dist/utility/InstallPrompt.js +2 -2
  652. package/package.json +5 -1
  653. package/src/components/data-display/DataViews/data-views-bar-controls.tsx +4 -3
  654. package/src/components/data-display/DataViews/data-views-day-input.tsx +2 -1
  655. package/src/components/data-display/DataViews/data-views-more-fields.tsx +2 -1
  656. package/src/components/data-display/DataViews/data-views-number-input.tsx +2 -1
  657. package/src/components/data-display/DataViews/data-views-range-pill.tsx +2 -1
  658. package/src/components/data-display/DataViews/data-views-search.tsx +5 -3
  659. package/src/components/data-display/MapPreview/MapSearchBar.tsx +3 -1
  660. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.ts +80 -0
  661. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.md +106 -0
  662. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.ts +8 -0
  663. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.tsx +134 -0
  664. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.ts +83 -0
  665. package/src/components/feedback/NotificationStatusNotice/index.ts +16 -0
  666. package/src/components/feedback/NotificationStatusNotice/tests.md +24 -0
  667. package/src/components/feedback/NotificationStatusNotice/track.md +34 -0
  668. package/src/components/feedback/index.ts +1 -0
  669. package/src/components/form/AddressAutocomplete/AddressTextField.tsx +6 -1
  670. package/src/components/form/Autocomplete/Autocomplete.parts.tsx +2 -0
  671. package/src/components/form/Button/Button.metrics.ts +0 -2
  672. package/src/components/form/Button/Button.native.tsx +2 -2
  673. package/src/components/form/Button/Button.tsx +2 -1
  674. package/src/components/form/CategorySelect/CategoryPanelFoot.tsx +2 -1
  675. package/src/components/form/CategorySelect/CategoryPanelHead.tsx +2 -1
  676. package/src/components/form/CategorySelect/CategorySelect.styles.ts +6 -2
  677. package/src/components/form/CodeEditor/CodeEditor.tsx +2 -1
  678. package/src/components/form/CreatableSelect/CreatableSelect.tsx +2 -0
  679. package/src/components/form/Input/Input.look.native.ts +6 -3
  680. package/src/components/form/Input/Input.metrics.ts +4 -2
  681. package/src/components/form/Input/Input.native.tsx +2 -2
  682. package/src/components/form/Input/Input.styles.ts +14 -1
  683. package/src/components/form/Input/Input.tsx +2 -0
  684. package/src/components/form/InputOTP/InputOTP.styles.ts +2 -1
  685. package/src/components/form/PhoneInput/PhoneInput.tsx +6 -1
  686. package/src/components/form/RadioGroup/RadioGroup.styles.ts +11 -5
  687. package/src/components/form/RichTextEditor/RichTextEditor.tsx +2 -1
  688. package/src/components/form/Select/Select.native.tsx +1 -2
  689. package/src/components/form/Select/Select.tsx +3 -1
  690. package/src/components/form/Textarea/Textarea.tsx +2 -1
  691. package/src/components/form/Textarea/TextareaRichEditor.tsx +3 -2
  692. package/src/components/form/Toggle/Toggle.styles.ts +2 -1
  693. package/src/components/form/ToggleGroup/ToggleGroup.tsx +24 -12
  694. package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +2 -1
  695. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +2 -1
  696. package/src/components/layout/ContentToolbar/FilterTrigger.tsx +2 -0
  697. package/src/components/layout/ContentToolbar/MultiSelectTriggers.tsx +4 -2
  698. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +2 -1
  699. package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
  700. package/src/components/layout/TableFilter/TableFilter.tsx +2 -0
  701. package/src/copy/feedback.ts +28 -0
  702. package/src/en-US.feedback.ts +69 -0
  703. package/src/provider/mui-bridge.ts +4 -1
  704. package/src/pt-BR.feedback.ts +69 -0
  705. package/src/tokens/field-radius.core.ts +26 -0
  706. package/src/tokens/field-radius.ts +90 -0
  707. package/src/tokens/index.native.ts +1 -0
  708. package/src/tokens/scales.ts +1 -0
  709. package/src/tokens/theme.ts +10 -3
  710. package/dist/chunk-3W7IEWEL.js.map +0 -1
  711. package/dist/chunk-5LQ7PKMW.js.map +0 -1
  712. package/dist/chunk-5WNQJ5KS.js.map +0 -1
  713. package/dist/chunk-6TSP45KC.js.map +0 -1
  714. package/dist/chunk-6WIDZGXE.js.map +0 -1
  715. package/dist/chunk-A7LG3AXV.js.map +0 -1
  716. package/dist/chunk-CJUOBTLL.js.map +0 -1
  717. package/dist/chunk-DBYFC6CF.js.map +0 -1
  718. package/dist/chunk-E5ACI7EA.js +0 -22
  719. package/dist/chunk-E5ACI7EA.js.map +0 -1
  720. package/dist/chunk-FGUESLDX.js.map +0 -1
  721. package/dist/chunk-FV36LFPX.js.map +0 -1
  722. package/dist/chunk-GJUIZ5FN.js.map +0 -1
  723. package/dist/chunk-HZVFAGLZ.js.map +0 -1
  724. package/dist/chunk-IFLZNCAI.js +0 -22
  725. package/dist/chunk-IFLZNCAI.js.map +0 -1
  726. package/dist/chunk-J3D34ZBL.js.map +0 -1
  727. package/dist/chunk-J3JGO6Y6.js.map +0 -1
  728. package/dist/chunk-JMVIIKII.js.map +0 -1
  729. package/dist/chunk-L2E7TY7P.js.map +0 -1
  730. package/dist/chunk-LVCUJ7YU.js.map +0 -1
  731. package/dist/chunk-MHSTG7FF.js.map +0 -1
  732. package/dist/chunk-MI2MVH3I.js.map +0 -1
  733. package/dist/chunk-QZBUGUOY.js.map +0 -1
  734. package/dist/chunk-S6YY2WWK.js.map +0 -1
  735. package/dist/chunk-SO2J7ULY.js +0 -1
  736. package/dist/chunk-SONWG2RT.js.map +0 -1
  737. package/dist/chunk-T2VO32Z2.js.map +0 -1
  738. package/dist/chunk-TOYEP23N.js.map +0 -1
  739. package/dist/chunk-TX3ZHO5R.js.map +0 -1
  740. package/dist/chunk-UCU5FCYE.js.map +0 -1
  741. package/dist/chunk-V5IOLAIS.js.map +0 -1
  742. package/dist/chunk-VIK3HAUQ.js.map +0 -1
  743. package/dist/chunk-WQFIV5WD.js.map +0 -1
  744. package/dist/chunk-WXD7MGBT.js.map +0 -1
  745. package/dist/chunk-XXE6NTJB.js.map +0 -1
  746. package/dist/chunk-XZTOIEKI.js.map +0 -1
  747. package/dist/chunk-YB6MDGPR.js.map +0 -1
  748. package/dist/chunk-ZS44PY7T.js.map +0 -1
  749. package/dist/chunk-ZUY65MFH.js.map +0 -1
  750. package/dist/chunk-ZZOOSKSV.js.map +0 -1
  751. package/dist/native/chunks/chunk-BEPOBULQ.js.map +0 -1
  752. package/dist/native/chunks/chunk-NVPXIJ2O.js.map +0 -1
  753. package/dist/native/chunks/chunk-YQDDM6ZW.js.map +0 -1
  754. /package/dist/{chunk-SO2J7ULY.js.map → _internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.js.map} +0 -0
  755. /package/dist/{chunk-RXVPUW7V.js.map → chunk-26ORCF6J.js.map} +0 -0
  756. /package/dist/{chunk-THOPGHTY.js.map → chunk-2DFH74T4.js.map} +0 -0
  757. /package/dist/{chunk-W5CW7JFZ.js.map → chunk-2N2KNXTF.js.map} +0 -0
  758. /package/dist/{chunk-W3FAKT3D.js.map → chunk-2SWQ6HIK.js.map} +0 -0
  759. /package/dist/{chunk-IVVOIDE5.js.map → chunk-2YOQLBEX.js.map} +0 -0
  760. /package/dist/{chunk-DEE6IPGI.js.map → chunk-32MTYYGC.js.map} +0 -0
  761. /package/dist/{chunk-GVDJQMFI.js.map → chunk-35GWNOLB.js.map} +0 -0
  762. /package/dist/{chunk-W4SDVTZC.js.map → chunk-3PT3SBJ7.js.map} +0 -0
  763. /package/dist/{chunk-P3NRT6GV.js.map → chunk-3ZGQSWHJ.js.map} +0 -0
  764. /package/dist/{chunk-PFLKPNBU.js.map → chunk-4DUHJIR2.js.map} +0 -0
  765. /package/dist/{chunk-46UPILLK.js.map → chunk-4ETQRBZC.js.map} +0 -0
  766. /package/dist/{chunk-65DLYC4S.js.map → chunk-4LDRYLE2.js.map} +0 -0
  767. /package/dist/{chunk-ON2CMKTI.js.map → chunk-4WT4PV4M.js.map} +0 -0
  768. /package/dist/{chunk-AIBNBWQU.js.map → chunk-5EQFAFR3.js.map} +0 -0
  769. /package/dist/{chunk-EVXFEXBS.js.map → chunk-5UGXAAZG.js.map} +0 -0
  770. /package/dist/{chunk-DOMEYGTN.js.map → chunk-5YOFMMK3.js.map} +0 -0
  771. /package/dist/{chunk-JE6RZ5L6.js.map → chunk-5ZOJLYD2.js.map} +0 -0
  772. /package/dist/{chunk-NY2Y2SHA.js.map → chunk-67L5CMXP.js.map} +0 -0
  773. /package/dist/{chunk-L6TCIZFR.js.map → chunk-6BGS5FND.js.map} +0 -0
  774. /package/dist/{chunk-QPDDS6DQ.js.map → chunk-6PSAPCTE.js.map} +0 -0
  775. /package/dist/{chunk-QSKJLMNS.js.map → chunk-6SK3MTYJ.js.map} +0 -0
  776. /package/dist/{chunk-MGPA6KTM.js.map → chunk-6SNRPCSK.js.map} +0 -0
  777. /package/dist/{chunk-XELVDPKL.js.map → chunk-6VZYQC7T.js.map} +0 -0
  778. /package/dist/{chunk-G5ZVD5IJ.js.map → chunk-7AR2R7TV.js.map} +0 -0
  779. /package/dist/{chunk-B6IURHSZ.js.map → chunk-7DNQHMDO.js.map} +0 -0
  780. /package/dist/{chunk-VLHGBFR6.js.map → chunk-7U36V4CU.js.map} +0 -0
  781. /package/dist/{chunk-ZU3SWR4I.js.map → chunk-7YTLJUBX.js.map} +0 -0
  782. /package/dist/{chunk-C5EFVSBN.js.map → chunk-A5FIYKAN.js.map} +0 -0
  783. /package/dist/{chunk-SOCKK67R.js.map → chunk-AFZUPCBK.js.map} +0 -0
  784. /package/dist/{chunk-PQECNGDE.js.map → chunk-AGYGNNOM.js.map} +0 -0
  785. /package/dist/{chunk-AVI3XHRQ.js.map → chunk-AIRWM7KK.js.map} +0 -0
  786. /package/dist/{chunk-T5WNNEP5.js.map → chunk-APMEXS3Y.js.map} +0 -0
  787. /package/dist/{chunk-K7DCYV5Q.js.map → chunk-ATBT4RJZ.js.map} +0 -0
  788. /package/dist/{chunk-HKV4MQ2W.js.map → chunk-BKP7YW3Y.js.map} +0 -0
  789. /package/dist/{chunk-UN5INW6K.js.map → chunk-BPYPUEM5.js.map} +0 -0
  790. /package/dist/{chunk-BEWD734I.js.map → chunk-BRUJC7OG.js.map} +0 -0
  791. /package/dist/{chunk-SLMA4UQS.js.map → chunk-BWSYSSF3.js.map} +0 -0
  792. /package/dist/{chunk-FR6AJSMT.js.map → chunk-C2ZNAQMO.js.map} +0 -0
  793. /package/dist/{chunk-TU6RNZUQ.js.map → chunk-C4NRFERD.js.map} +0 -0
  794. /package/dist/{chunk-V7F53GEO.js.map → chunk-CATLG2RT.js.map} +0 -0
  795. /package/dist/{chunk-LYMAMKJT.js.map → chunk-CEA4QA63.js.map} +0 -0
  796. /package/dist/{chunk-XXDXW6TX.js.map → chunk-CIVLXOLG.js.map} +0 -0
  797. /package/dist/{chunk-7TZ6OC5T.js.map → chunk-CJMU3G2J.js.map} +0 -0
  798. /package/dist/{chunk-MVJYIHPH.js.map → chunk-CKW267ZK.js.map} +0 -0
  799. /package/dist/{chunk-MRMNVGNX.js.map → chunk-CPA2YRVZ.js.map} +0 -0
  800. /package/dist/{chunk-TSFFZ3AH.js.map → chunk-D5YGDCMP.js.map} +0 -0
  801. /package/dist/{chunk-3TFUAKWJ.js.map → chunk-D6P5PSHU.js.map} +0 -0
  802. /package/dist/{chunk-DVE53B2L.js.map → chunk-DBXGRZBJ.js.map} +0 -0
  803. /package/dist/{chunk-XSJWN3WH.js.map → chunk-DF2FFYZ7.js.map} +0 -0
  804. /package/dist/{chunk-T7WU7JGC.js.map → chunk-DHQ6ASUD.js.map} +0 -0
  805. /package/dist/{chunk-RBGOGTT2.js.map → chunk-DWZ7FLA7.js.map} +0 -0
  806. /package/dist/{chunk-DVUPIVI2.js.map → chunk-DX36KZUV.js.map} +0 -0
  807. /package/dist/{chunk-FVPN4YKW.js.map → chunk-EATFKTO3.js.map} +0 -0
  808. /package/dist/{chunk-VRKS5K4N.js.map → chunk-EJJRJYB5.js.map} +0 -0
  809. /package/dist/{chunk-TSEWUY4V.js.map → chunk-EN5Q5RPQ.js.map} +0 -0
  810. /package/dist/{chunk-EYC6ERJJ.js.map → chunk-ETU4LNU7.js.map} +0 -0
  811. /package/dist/{chunk-UC6A6ASM.js.map → chunk-EYRSUVBC.js.map} +0 -0
  812. /package/dist/{chunk-HLYPI5CO.js.map → chunk-F22WT7UX.js.map} +0 -0
  813. /package/dist/{chunk-JPVDZXXX.js.map → chunk-F65LT7XV.js.map} +0 -0
  814. /package/dist/{chunk-J2K65BQQ.js.map → chunk-FC74EAW4.js.map} +0 -0
  815. /package/dist/{chunk-TEE6HNHS.js.map → chunk-FRW4SYZD.js.map} +0 -0
  816. /package/dist/{chunk-LCXXPIG3.js.map → chunk-G3WUOPWE.js.map} +0 -0
  817. /package/dist/{chunk-SQV3HPTZ.js.map → chunk-G76H5PEM.js.map} +0 -0
  818. /package/dist/{chunk-XYDW5RQB.js.map → chunk-GKGA2ZCW.js.map} +0 -0
  819. /package/dist/{chunk-KW7H5O3K.js.map → chunk-GLPHRHIT.js.map} +0 -0
  820. /package/dist/{chunk-3PUOLOEP.js.map → chunk-GOKMLXZH.js.map} +0 -0
  821. /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
  822. /package/dist/{chunk-B7NV6JFG.js.map → chunk-GUROYOKQ.js.map} +0 -0
  823. /package/dist/{chunk-PVIAHB7D.js.map → chunk-H2RHA73H.js.map} +0 -0
  824. /package/dist/{chunk-C5YBXQTK.js.map → chunk-H35CQ6DF.js.map} +0 -0
  825. /package/dist/{chunk-SHDIZSN5.js.map → chunk-HFBME3C5.js.map} +0 -0
  826. /package/dist/{chunk-HS2OJI6L.js.map → chunk-HSVNFMXY.js.map} +0 -0
  827. /package/dist/{chunk-NWQWUYOV.js.map → chunk-I2IZ53QS.js.map} +0 -0
  828. /package/dist/{chunk-K4N3V7YE.js.map → chunk-IASDP44E.js.map} +0 -0
  829. /package/dist/{chunk-PCYGUOWJ.js.map → chunk-IAVAZ36T.js.map} +0 -0
  830. /package/dist/{chunk-B443IIQG.js.map → chunk-IE7ISTLQ.js.map} +0 -0
  831. /package/dist/{chunk-LKF5KQ2Q.js.map → chunk-IIUB4IOH.js.map} +0 -0
  832. /package/dist/{chunk-UKPZVX3J.js.map → chunk-INH2BDHV.js.map} +0 -0
  833. /package/dist/{chunk-PUBPZOQJ.js.map → chunk-IPE5FFFD.js.map} +0 -0
  834. /package/dist/{chunk-HP2ODXNA.js.map → chunk-IPS55KWK.js.map} +0 -0
  835. /package/dist/{chunk-J3ZP6EUS.js.map → chunk-IQFUV3BA.js.map} +0 -0
  836. /package/dist/{chunk-2ZRZTGWP.js.map → chunk-ISW5K72V.js.map} +0 -0
  837. /package/dist/{chunk-OD4Z5G6G.js.map → chunk-J2RRZZXC.js.map} +0 -0
  838. /package/dist/{chunk-BYMWW65P.js.map → chunk-JOPTI47I.js.map} +0 -0
  839. /package/dist/{chunk-VKH7AENA.js.map → chunk-KJYD5OJ4.js.map} +0 -0
  840. /package/dist/{chunk-RVGG5YJY.js.map → chunk-LG6DHNRD.js.map} +0 -0
  841. /package/dist/{chunk-WC5XYWTE.js.map → chunk-LWAOL4BG.js.map} +0 -0
  842. /package/dist/{chunk-MNSW33DU.js.map → chunk-MCAXIKQD.js.map} +0 -0
  843. /package/dist/{chunk-H53YNR23.js.map → chunk-MRGPVPQC.js.map} +0 -0
  844. /package/dist/{chunk-EZNTM6PT.js.map → chunk-MYUZPUXQ.js.map} +0 -0
  845. /package/dist/{chunk-SX3V2DLV.js.map → chunk-NFJUBPIN.js.map} +0 -0
  846. /package/dist/{chunk-XGOWREVV.js.map → chunk-NJ6D37KV.js.map} +0 -0
  847. /package/dist/{chunk-4H4Y2SX3.js.map → chunk-NLUZGT4U.js.map} +0 -0
  848. /package/dist/{chunk-NGVGTMHT.js.map → chunk-NR2HXHBR.js.map} +0 -0
  849. /package/dist/{chunk-HKKSZ7HG.js.map → chunk-O6DRUOUF.js.map} +0 -0
  850. /package/dist/{chunk-R6SSXEK2.js.map → chunk-OFMDFN3U.js.map} +0 -0
  851. /package/dist/{chunk-EUKYQXYU.js.map → chunk-OHKEQ7QJ.js.map} +0 -0
  852. /package/dist/{chunk-NUB4T3RQ.js.map → chunk-OIFBBDYX.js.map} +0 -0
  853. /package/dist/{chunk-PFZAUMJA.js.map → chunk-OL7UQMBI.js.map} +0 -0
  854. /package/dist/{chunk-O42ZA3TW.js.map → chunk-ORIFMVN4.js.map} +0 -0
  855. /package/dist/{chunk-5KFZGB5U.js.map → chunk-P4BZ7YE6.js.map} +0 -0
  856. /package/dist/{chunk-JRWPI4XF.js.map → chunk-P7FQUGED.js.map} +0 -0
  857. /package/dist/{chunk-XBZ43VIV.js.map → chunk-PCONTSJJ.js.map} +0 -0
  858. /package/dist/{chunk-XOCLWQON.js.map → chunk-PEMZ2ABQ.js.map} +0 -0
  859. /package/dist/{chunk-VXTYVJDK.js.map → chunk-Q5BSNHN7.js.map} +0 -0
  860. /package/dist/{chunk-IQ7WZ3RN.js.map → chunk-QKDFD4VT.js.map} +0 -0
  861. /package/dist/{chunk-YTYROOLY.js.map → chunk-QNUWSXF2.js.map} +0 -0
  862. /package/dist/{chunk-VESIQYBF.js.map → chunk-QP3KK4KO.js.map} +0 -0
  863. /package/dist/{chunk-MSUSZLRE.js.map → chunk-QPMLACIK.js.map} +0 -0
  864. /package/dist/{chunk-TF4TPLF2.js.map → chunk-R7KR5FYJ.js.map} +0 -0
  865. /package/dist/{chunk-237NDIT2.js.map → chunk-RCI6KVN6.js.map} +0 -0
  866. /package/dist/{chunk-WYDGPJ3Z.js.map → chunk-RFZU5BTG.js.map} +0 -0
  867. /package/dist/{chunk-PJTSGHTY.js.map → chunk-RIA34EUT.js.map} +0 -0
  868. /package/dist/{chunk-JOXBCXVL.js.map → chunk-RMB4RTTM.js.map} +0 -0
  869. /package/dist/{chunk-RNCQ5KHQ.js.map → chunk-RQFBLYYH.js.map} +0 -0
  870. /package/dist/{chunk-4T6W43TO.js.map → chunk-RRDL7AGQ.js.map} +0 -0
  871. /package/dist/{chunk-JB67KPGM.js.map → chunk-RRO2EOJB.js.map} +0 -0
  872. /package/dist/{chunk-5UC2RNOY.js.map → chunk-RWIBPIPD.js.map} +0 -0
  873. /package/dist/{chunk-QGAYEBMU.js.map → chunk-SAIKHWH7.js.map} +0 -0
  874. /package/dist/{chunk-PZEC5CQA.js.map → chunk-SDSAQ5YS.js.map} +0 -0
  875. /package/dist/{chunk-YFY3YVV6.js.map → chunk-SGV7QGYQ.js.map} +0 -0
  876. /package/dist/{chunk-GJQYM3PM.js.map → chunk-SHQWIDD5.js.map} +0 -0
  877. /package/dist/{chunk-OLQDB346.js.map → chunk-SMUZRLFZ.js.map} +0 -0
  878. /package/dist/{chunk-QGBMCB76.js.map → chunk-SSJHEV5Z.js.map} +0 -0
  879. /package/dist/{chunk-MEWYA74E.js.map → chunk-SZZLABMO.js.map} +0 -0
  880. /package/dist/{chunk-OJCK5RNJ.js.map → chunk-TLY2QMU5.js.map} +0 -0
  881. /package/dist/{chunk-TTW4MAOJ.js.map → chunk-UCTJJYVC.js.map} +0 -0
  882. /package/dist/{chunk-BLT5ZBVL.js.map → chunk-UEJQQVP2.js.map} +0 -0
  883. /package/dist/{chunk-ALAJBLBE.js.map → chunk-UHWHTNUS.js.map} +0 -0
  884. /package/dist/{chunk-EMAX7RPN.js.map → chunk-URK67BAE.js.map} +0 -0
  885. /package/dist/{chunk-GH2DC7PS.js.map → chunk-V3RVRZAU.js.map} +0 -0
  886. /package/dist/{chunk-624TFFLJ.js.map → chunk-V6YZ3PL5.js.map} +0 -0
  887. /package/dist/{chunk-236QP424.js.map → chunk-VGSEI7PQ.js.map} +0 -0
  888. /package/dist/{chunk-HDNK7BAX.js.map → chunk-VNEEXUWA.js.map} +0 -0
  889. /package/dist/{chunk-EPRA5QLB.js.map → chunk-VUFMV5Q5.js.map} +0 -0
  890. /package/dist/{chunk-QYNCPS5W.js.map → chunk-WBKWIFXA.js.map} +0 -0
  891. /package/dist/{chunk-3BPDHWVF.js.map → chunk-WCLWFN3F.js.map} +0 -0
  892. /package/dist/{chunk-FOKBP6HR.js.map → chunk-WI6GD4MV.js.map} +0 -0
  893. /package/dist/{chunk-XXJRT6BP.js.map → chunk-WMALDOF5.js.map} +0 -0
  894. /package/dist/{chunk-4OSGKO7E.js.map → chunk-WVJI3Z4P.js.map} +0 -0
  895. /package/dist/{chunk-VVXA7T2M.js.map → chunk-WVQ47UTI.js.map} +0 -0
  896. /package/dist/{chunk-LSJY4LWZ.js.map → chunk-XPPEUGHG.js.map} +0 -0
  897. /package/dist/{chunk-JVVTSSS4.js.map → chunk-XVM4ZIRE.js.map} +0 -0
  898. /package/dist/{chunk-7MR2JCJW.js.map → chunk-Y2CSBXQT.js.map} +0 -0
  899. /package/dist/{chunk-D6HDJVQW.js.map → chunk-YANLN6HP.js.map} +0 -0
  900. /package/dist/{chunk-NGM5XKAS.js.map → chunk-YXQ2NJHF.js.map} +0 -0
  901. /package/dist/{chunk-HQB5XNK5.js.map → chunk-ZCNCQGWK.js.map} +0 -0
  902. /package/dist/{chunk-WC3W36AM.js.map → chunk-ZOUWHGV3.js.map} +0 -0
  903. /package/dist/{chunk-2L2NWXWJ.js.map → chunk-ZVTJGWIV.js.map} +0 -0
  904. /package/dist/native/chunks/{chunk-2HLEFYJ5.js.map → chunk-7UEJ2FMQ.js.map} +0 -0
  905. /package/dist/native/chunks/{chunk-6XDMYJBW.js.map → chunk-IVNAQJY6.js.map} +0 -0
  906. /package/dist/native/chunks/{chunk-YXM4NR2B.js.map → chunk-LB65S6C7.js.map} +0 -0
  907. /package/dist/native/chunks/{chunk-CO47ZRXO.js.map → chunk-S5SLTMPB.js.map} +0 -0
  908. /package/dist/native/chunks/{chunk-SOQVMWLQ.js.map → chunk-VAD5YVIZ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/PhoneInput/PhoneInput.tsx"],"sourcesContent":["import ArrowDropDown from '@mui/icons-material/ArrowDropDown';\nimport PhoneIcon from '@mui/icons-material/Phone';\nimport Box from '@mui/material/Box/index.js';\nimport InputAdornment from '@mui/material/InputAdornment/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport TextField from '@mui/material/TextField/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled, useTheme } from '@mui/material/styles/index.js';\nimport type { FC} from 'react';\nimport React, { } from 'react';\n\nimport { countries } from './countries';\nimport { usePhoneInput } from './PhoneInput.hooks';\nimport type { CountryData,PhoneInputProps } from './PhoneInput.types';\nimport type { PhoneInputCopy } from '../../../copy';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\n\n// Country data with expanded support\n\n// Styled components\nconst GlassTextField = styled(TextField)(({ theme }) => ({\n '& .MuiOutlinedInput-root': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.8)} 0%, ${alpha(theme.palette.background.paper, 0.6)} 100%)`,\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${fieldEdge(theme)}`,\n transition: theme.transitions.create(['border-color', 'box-shadow', 'background']),\n '&:hover': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.7)} 100%)`,\n borderColor: theme.palette.primary.main },\n '&.Mui-focused': {\n background: theme.palette.background.paper,\n boxShadow: `0 0 0 2px ${alpha(theme.palette.primary.main, 0.25)}` },\n '& fieldset': {\n border: 'none' } },\n '& .MuiInputLabel-root': {\n '&.Mui-focused': {\n color: theme.palette.primary.main } } }));\n\nconst CountrySelector = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(0.5, 1),\n borderRadius: theme.shape.borderRadius,\n cursor: 'pointer',\n transition: theme.transitions.create(['background-color']),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08) } }));\n\nconst CountryMenu = styled(Menu)(({ theme }) => ({\n '& .MuiPaper-root': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.paper, 0.95)} 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n maxHeight: 400 } }));\n\n// Helper functions with enhanced validation\n// The text field itself with its two adornments. Split out so PhoneInput is\n// prop defaults, the hook call and composition.\nconst PhoneField: React.FC<{\n TextFieldComponent: React.ElementType;\n variant: PhoneInputProps['variant'];\n label?: React.ReactNode;\n placeholder?: string;\n value: string;\n validation: { hasError: boolean; helperText?: React.ReactNode };\n disabled: boolean;\n required: boolean;\n fullWidth: boolean;\n icon?: React.ReactNode;\n isValid: boolean;\n selectedCountry?: CountryData;\n anchorEl: HTMLElement | null;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus: () => void;\n onBlur: () => void;\n onCountryOpen: (event: React.MouseEvent<HTMLElement>) => void;\n onCountryOpenViaKeyboard: (element: HTMLElement) => void;\n copy: PhoneInputCopy;\n}> = ({\n TextFieldComponent,\n copy,\n variant,\n label,\n placeholder,\n value,\n validation,\n disabled,\n required,\n fullWidth,\n icon,\n isValid,\n selectedCountry,\n anchorEl,\n onChange,\n onFocus,\n onBlur,\n onCountryOpen,\n onCountryOpenViaKeyboard }) => (\n <TextFieldComponent\n variant={variant === 'glass' ? 'outlined' : variant}\n label={label}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n error={validation.hasError}\n helperText={validation.helperText}\n disabled={disabled}\n required={required}\n fullWidth={fullWidth}\n type=\"tel\"\n data-testid=\"phone-input-field\"\n InputProps={{\n startAdornment: (\n <CountryAdornment\n selectCountryLabel={copy.selectCountry}\n country={selectedCountry}\n menuOpen={Boolean(anchorEl)}\n onOpen={onCountryOpen}\n onOpenViaKeyboard={onCountryOpenViaKeyboard}\n />\n ),\n endAdornment: <ValidityAdornment icon={icon} isValid={isValid} /> }}\n sx={{\n '& input': {\n letterSpacing: '0.5px' } }}\n />\n);\n\nconst PHONE_INPUT_DEFAULTS = {\n variant: 'outlined',\n label: 'Phone Number',\n placeholder: 'Enter phone number',\n icon: <PhoneIcon />,\n defaultValue: '',\n countryCode: 'US',\n floating: false,\n error: false,\n disabled: false,\n required: false,\n fullWidth: true } satisfies Partial<PhoneInputProps>;\n\n// Drops explicitly-undefined props before the merge, so `prop={undefined}` falls\n// back to the default exactly as a destructuring default would. Eleven separate\n// destructuring defaults were most of this component's branch count.\nconst definedProps = (props: PhoneInputProps): Partial<PhoneInputProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<PhoneInputProps>;\n\nconst CountryAdornment: React.FC<{\n country?: CountryData;\n menuOpen: boolean;\n onOpen: (event: React.MouseEvent<HTMLElement>) => void;\n onOpenViaKeyboard: (element: HTMLElement) => void;\n selectCountryLabel: string;\n}> = ({ country, menuOpen, onOpen, onOpenViaKeyboard, selectCountryLabel }) => (\n <InputAdornment position=\"start\" data-testid=\"phone-input-start-adornment\">\n <CountrySelector\n onClick={onOpen}\n role=\"button\"\n aria-label={selectCountryLabel}\n aria-expanded={menuOpen}\n tabIndex={0}\n data-testid=\"country-selector\"\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n e.preventDefault();\n onOpenViaKeyboard(e.currentTarget as HTMLElement);\n }}\n >\n <Typography variant=\"h6\" component=\"span\" sx={{ mr: 0.5 }} data-testid=\"country-flag\">\n {country?.flag}\n </Typography>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ mr: 0.5 }}\n data-testid=\"country-dial-code\"\n >\n {country?.dial}\n </Typography>\n <ArrowDropDown fontSize=\"small\" data-testid=\"country-dropdown-icon\" />\n </CountrySelector>\n </InputAdornment>\n);\n\n// The trailing icon turns green once the number validates.\nconst ValidityAdornment: React.FC<{ icon?: React.ReactNode; isValid: boolean }> = ({\n icon,\n isValid }) => {\n const theme = useTheme();\n\n if (!icon) return null;\n\n return (\n <InputAdornment position=\"end\" data-testid=\"phone-input-end-adornment\">\n <Box\n sx={{\n color: isValid ? theme.palette.success.main : theme.palette.text.secondary,\n transition: 'color 0.3s ease' }}\n data-testid=\"phone-input-icon\"\n >\n {icon}\n </Box>\n </InputAdornment>\n );\n};\n\nconst CountryPicker: React.FC<{\n anchorEl: HTMLElement | null;\n selectedCode?: CountryData['code'];\n onClose: () => void;\n onSelect: (country: CountryData) => void;\n}> = ({ anchorEl, selectedCode, onClose, onSelect }) => {\n const theme = useTheme();\n\n return (\n <CountryMenu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left' }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left' }}\n data-testid=\"country-menu\"\n >\n {countries.map((country) => (\n <MenuItem\n key={country.code}\n onClick={() => onSelect(country)}\n selected={country.code === selectedCode}\n data-testid={`country-option-${country.code}`}\n sx={{\n '&:hover': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)` } }}\n >\n <ListItemIcon sx={{ minWidth: 36 }}>\n <Typography variant=\"h5\" component=\"span\">\n {country.flag}\n </Typography>\n </ListItemIcon>\n <ListItemText\n primary={country.name}\n secondary={country.dial}\n primaryTypographyProps={{ fontSize: '0.9rem' }}\n secondaryTypographyProps={{ fontSize: '0.8rem' }}\n />\n </MenuItem>\n ))}\n </CountryMenu>\n );\n};\n\n// The field shows an error either because the caller says so, or because what\n// has been typed does not validate and the user has moved on.\nconst resolveValidation = ({\n error,\n errorMessage,\n isValid,\n value,\n isFocused,\n helper,\n countryName,\n copy }: {\n error: boolean;\n errorMessage?: string;\n isValid: boolean;\n value: string;\n isFocused: boolean;\n helper?: React.ReactNode;\n countryName?: string;\n copy: PhoneInputCopy;\n}) => {\n const looksInvalid = !isValid && value !== '' && !isFocused;\n\n return {\n hasError: error || looksInvalid,\n helperText:\n errorMessage ||\n (looksInvalid ? copy.invalidNumber(countryName || copy.unknownCountry) : helper) };\n};\n\nexport const PhoneInput: FC<PhoneInputProps> = (props) => {\n const { copy } = props;\n const {\n variant,\n label,\n placeholder,\n icon,\n defaultValue,\n countryCode: initialCountryCode,\n floating,\n onChange,\n helper,\n error,\n errorMessage,\n disabled,\n required,\n fullWidth } = { ...PHONE_INPUT_DEFAULTS, ...definedProps(props) };\n const {\n value,\n selectedCountry,\n anchorEl,\n isValid,\n isFocused,\n setIsFocused,\n setAnchorEl,\n handleCountryClick,\n handleCountryClose,\n handleCountrySelect,\n handleChange,\n handleBlur } = usePhoneInput({ defaultValue, initialCountryCode, onChange });\n\n const validation = resolveValidation({\n error,\n errorMessage,\n isValid,\n value,\n isFocused,\n helper,\n countryName: selectedCountry?.name,\n copy });\n\n const TextFieldComponent = variant === 'glass' ? GlassTextField : TextField;\n\n return (\n <Box data-testid=\"phone-input-container\">\n <PhoneField\n copy={copy}\n TextFieldComponent={TextFieldComponent}\n variant={variant}\n label={floating ? undefined : label}\n placeholder={placeholder}\n value={value}\n validation={validation}\n disabled={disabled}\n required={required}\n fullWidth={fullWidth}\n icon={icon}\n isValid={isValid}\n selectedCountry={selectedCountry}\n anchorEl={anchorEl}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n onCountryOpen={handleCountryClick}\n onCountryOpenViaKeyboard={setAnchorEl}\n />\n\n <CountryPicker\n anchorEl={anchorEl}\n selectedCode={selectedCountry?.code}\n onClose={handleCountryClose}\n onSelect={handleCountrySelect}\n />\n </Box>\n );\n};\n\n// Export default\nexport default PhoneInput;\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ContentToolbar/SortByDropdown.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport ListSubheader from '@mui/material/ListSubheader/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport type {\n SortByDropdownProps,\n SortFieldDefinition,\n SortOrderOption,\n} from './ContentToolbar.types';\n\nfunction findActiveField<TField extends string>(\n fields: SortFieldDefinition<TField>[] | undefined,\n activeField: TField,\n): SortFieldDefinition<TField> | undefined {\n return fields?.find((field) => field.value === activeField);\n}\n\nfunction findActiveOrder(\n fieldDef: SortFieldDefinition | undefined,\n activeOrder: string | undefined,\n): SortOrderOption | undefined {\n const options = fieldDef?.orderOptions;\n if (!options?.length) return undefined;\n return options.find((option) => option.value === activeOrder) ?? options[0];\n}\n\nfunction resolveArrowDirection(option: SortOrderOption | undefined, indexInList: number): 'up' | 'down' {\n if (option?.arrowDirection) return option.arrowDirection;\n // A missing (<0) or first index sorts \"down\"; any later option sorts \"up\".\n return indexInList <= 0 ? 'down' : 'up';\n}\n\nfunction buildTriggerLabel(\n fieldDef: SortFieldDefinition | undefined,\n orderOption: SortOrderOption | undefined,\n): string {\n if (!fieldDef) return '';\n if (fieldDef.showOrderInTrigger === false || !orderOption) return fieldDef.label;\n if (fieldDef.triggerLabelStyle === 'range' && fieldDef.orderOptions?.length === 2) {\n const other = fieldDef.orderOptions.find((option) => option.value !== orderOption.value);\n if (other) return `${fieldDef.label} (${orderOption.label.toLowerCase()}-${other.label.toLowerCase()})`;\n }\n return `${fieldDef.label} (${orderOption.label.toLowerCase()})`;\n}\n\n/** The trigger's full label (md+), short label (mobile), and direction arrow. */\nfunction resolveTriggerParts(\n fieldDef: SortFieldDefinition | undefined,\n orderOption: SortOrderOption | undefined,\n orderOptions: SortOrderOption[],\n): { full: string; short: string; arrowSuffix: string } {\n const useRangeLabel = fieldDef?.triggerLabelStyle === 'range' && orderOptions.length === 2;\n const orderIndex = orderOptions.findIndex((option) => option.value === orderOption?.value);\n const arrow = resolveArrowDirection(orderOption, orderIndex);\n const arrowSuffix = orderOptions.length > 0 && !useRangeLabel ? ` ${arrow === 'down' ? '↓' : '↑'}` : '';\n const full = buildTriggerLabel(fieldDef, orderOption);\n return { full, short: fieldDef?.label ?? full, arrowSuffix };\n}\n\nconst sectionLabelSx = { px: 1, py: 0.75, fontSize: '0.75rem', fontWeight: 600, color: 'text.primary', lineHeight: 1.5 } as const;\n\n/** A fixed-width check slot (empty when unchecked) so labels align. */\nfunction SortCheck({ checked }: { checked: boolean }): React.JSX.Element {\n return (\n <Box component=\"span\" sx={{ display: 'flex', width: 16, flexShrink: 0, alignItems: 'center', justifyContent: 'center' }} aria-hidden>\n {checked ? <CheckIcon sx={{ fontSize: 14 }} /> : null}\n </Box>\n );\n}\n\n/** One `id`/`label` menu row with a leading check + testid. */\nfunction SortRow({\n value,\n label,\n checked,\n onSelect,\n}: {\n value: string;\n label: string;\n checked: boolean;\n onSelect: () => void;\n}): React.JSX.Element {\n return (\n <MenuItem data-testid={`sort-${value}-option`} onClick={onSelect} sx={{ gap: 1 }}>\n <SortCheck checked={checked} />\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n {label}\n </Box>\n </MenuItem>\n );\n}\n\ninterface SortMenuProps<TField extends string> {\n anchorEl: HTMLElement | null;\n open: boolean;\n close: () => void;\n orderOptions: SortOrderOption[];\n activeOrderValue: string | undefined;\n onOrderSelect: (value: string) => void;\n fields: SortFieldDefinition<TField>[];\n activeField: TField;\n onFieldSelect: (field: TField) => void;\n orderHeading: string;\n sortHeading: string;\n}\n\n/** The Order + Sort sections of the dropdown menu. */\nfunction SortMenu<TField extends string>({\n anchorEl,\n open,\n close,\n orderOptions,\n activeOrderValue,\n onOrderSelect,\n fields,\n activeField,\n onFieldSelect,\n orderHeading,\n sortHeading,\n}: SortMenuProps<TField>): React.JSX.Element {\n return (\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{ paper: { sx: { minWidth: 180 } } }}\n >\n {orderOptions.length > 0 && [\n <ListSubheader key=\"order-label\" sx={sectionLabelSx}>\n {orderHeading}\n </ListSubheader>,\n ...orderOptions.map((option) => (\n <SortRow\n key={`order-${option.value}`}\n value={option.value}\n label={option.label}\n checked={activeOrderValue === option.value}\n onSelect={() => onOrderSelect(option.value)}\n />\n )),\n <Divider key=\"order-divider\" />,\n ]}\n <ListSubheader sx={sectionLabelSx}>{sortHeading}</ListSubheader>\n {fields.map((field) => (\n <SortRow\n key={field.value}\n value={field.value}\n label={field.label}\n checked={activeField === field.value}\n onSelect={() => onFieldSelect(field.value)}\n />\n ))}\n </Menu>\n );\n}\n\n/**\n * Generic \"Sort By\" dropdown: a \"Sort By:\" label + a trigger whose menu has an\n * **Order** section (direction within the active field) and a **Sort** section\n * (which field). The Order section is hidden when the field defines no order\n * options. Faithful MUI port of the reference control.\n */\nexport function SortByDropdown<TField extends string = string>({\n fields,\n activeField,\n activeOrder,\n onFieldChange,\n onOrderChange,\n orderHeading,\n sortHeading,\n triggerPrefix,\n 'data-testid': testId,\n}: SortByDropdownProps<TField>): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const close = (): void => setAnchorEl(null);\n\n const safeFields = fields ?? [];\n const activeFieldDef = findActiveField(fields, activeField);\n const orderOptions = activeFieldDef?.orderOptions ?? [];\n const activeOrderOption = findActiveOrder(activeFieldDef, activeOrder);\n const trigger = resolveTriggerParts(activeFieldDef, activeOrderOption, orderOptions);\n\n function handleFieldChange(field: TField): void {\n // Switch field in ONE callback. Previously this also fired `onOrderChange`\n // to reset the order, but a consumer whose `onOrderChange` derives the field\n // from its own (now-stale) prop would re-apply the OLD field — silently\n // reverting the field change (e.g. picking \"E-mail\" snapped back to \"Nome\").\n // The field-change consumer owns the resulting order.\n onFieldChange(field);\n close();\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, fontSize: '0.875rem' }}>\n <Typography\n component=\"span\"\n sx={{ display: { xs: 'none', md: 'inline' }, color: 'text.secondary', fontSize: '0.875rem' }}\n >\n {triggerPrefix}\n </Typography>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n data-testid={testId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ minWidth: 0, height: 32, px: 1, gap: 0.5, color: 'text.primary', textTransform: 'none', fontWeight: 600 }}\n >\n {/* Full \"Nome (crescente)\" on md+; just the field name on mobile — the\n arrow already conveys the direction, so the parenthetical is dropped. */}\n <Box component=\"span\" sx={{ display: { xs: 'none', md: 'inline' } }}>\n {trigger.full}\n </Box>\n <Box component=\"span\" sx={{ display: { xs: 'inline', md: 'none' } }}>\n {trigger.short}\n </Box>\n {trigger.arrowSuffix}\n <ChevronDownIcon sx={{ fontSize: 14 }} />\n </Button>\n <SortMenu\n orderHeading={orderHeading}\n sortHeading={sortHeading}\n anchorEl={anchorEl}\n open={open}\n close={close}\n orderOptions={orderOptions}\n activeOrderValue={activeOrderOption?.value}\n onOrderSelect={(value) => {\n onOrderChange?.(value);\n close();\n }}\n fields={safeFields}\n activeField={activeField}\n onFieldSelect={handleFieldChange}\n />\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ContentToolbar/ViewSelector.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport GridIcon from '@mui/icons-material/GridViewOutlined';\nimport ListIcon from '@mui/icons-material/FormatListBulletedRounded';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Slider from '@mui/material/Slider/index.js';\n// `SvgIconComponent` is declared inline in @mui/icons-material's barrel and has\n// no module of its own, so the deep-import equivalent is its own definition:\n// `type SvgIconComponent = typeof SvgIcon`.\nimport type SvgIcon from '@mui/material/SvgIcon/index.js';\nimport React, { useState } from 'react';\n\nimport type { ViewMode, ViewSelectorProps } from './ContentToolbar.types';\n\nconst VIEW_OPTIONS: { value: ViewMode; label: string; icon: typeof SvgIcon }[] = [\n { value: 'grid', label: 'Grid View', icon: GridIcon },\n { value: 'list', label: 'List View', icon: ListIcon },\n];\n\n/**\n * View selector: a grid/list dropdown plus a card-size zoom slider (grid mode\n * only). Faithful MUI port of the reference toolbar's view control.\n */\nexport function ViewSelector({\n viewMode,\n onViewModeChange,\n zoom,\n onZoomChange,\n cardSizeLabel,\n}: ViewSelectorProps): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const activeOption = VIEW_OPTIONS.find((option) => option.value === viewMode) ?? VIEW_OPTIONS[0]!;\n const ActiveIcon = activeOption.icon;\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n {viewMode === 'grid' && (\n <Box sx={{ width: 96, display: 'flex', alignItems: 'center' }}>\n <Slider\n data-testid=\"resize-card-slider\"\n aria-label={cardSizeLabel}\n value={zoom[0] ?? 0}\n onChange={(_, value) => onZoomChange([value as number])}\n min={0}\n max={100}\n step={1}\n size=\"small\"\n />\n </Box>\n )}\n\n <Button\n data-testid=\"view-mode-btn\"\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n aria-label={activeOption.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ minWidth: 0, height: 32, px: 1, gap: 1, color: 'text.secondary' }}\n >\n <ActiveIcon sx={{ fontSize: 16 }} />\n <ChevronDownIcon sx={{ fontSize: 14 }} />\n </Button>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: { minWidth: 180 } } }}\n >\n {VIEW_OPTIONS.map((option) => {\n const OptionIcon = option.icon;\n const selected = viewMode === option.value;\n return (\n <MenuItem\n key={option.value}\n data-testid={`view-mode-${option.value}`}\n onClick={() => {\n onViewModeChange(option.value);\n setAnchorEl(null);\n }}\n sx={{ gap: 1.5 }}\n >\n <ListItemText>{option.label}</ListItemText>\n <OptionIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n <ListItemIcon sx={{ minWidth: 'auto !important' }}>\n <CheckIcon sx={{ fontSize: 16, color: selected ? 'text.primary' : 'transparent' }} />\n </ListItemIcon>\n </MenuItem>\n );\n })}\n </Menu>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/Input/Input.tsx"],"sourcesContent":["import CircularProgress from '@mui/material/CircularProgress/index.js';\nimport InputAdornment from '@mui/material/InputAdornment/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { INPUT_LOADING } from './Input.metrics';\nimport { TextFieldSlim } from './text-field-slim';\n\nimport {\n filledStyles,\n floatingLabelStyles,\n glowStyles,\n inputBaseStyles,\n muiVariantFor,\n outlinedStyles,\n pulseStyles,\n SIZE_MAP,\n} from './Input.styles';\nimport type { InputProps } from './Input.types';\nimport { splitTestId } from '../../../platform/test-id';\n\n/**\n * `TextFieldSlim`, not `TextField` — see `text-field-slim.tsx`. MUI's own\n * `TextField` imports `Select` unconditionally, and through it `Menu`,\n * `Popover`, `Modal` and seven more component modules, so every screen with one\n * text box shipped a dropdown it can never render. Same composition, same DOM,\n * same prop routing; the select branch is the only thing missing.\n */\nconst StyledTextField = styled(TextFieldSlim, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),\n})<{\n customVariant?: InputProps['variant'];\n floating?: boolean;\n glow?: boolean;\n pulse?: boolean;\n loading?: boolean;\n}>(({ theme, customVariant, floating, glow, pulse, loading }) => ({\n position: 'relative',\n opacity: loading ? INPUT_LOADING.opacity : 1,\n\n ...(glow ? glowStyles(theme) : {}),\n ...(pulse ? pulseStyles(theme) : {}),\n ...(floating ? floatingLabelStyles(theme) : {}),\n\n '& .MuiInputBase-root': {\n transition: 'all 0.3s ease',\n ...inputBaseStyles(theme, customVariant),\n },\n\n '& .MuiOutlinedInput-root': outlinedStyles(theme),\n '& .MuiFilledInput-root': filledStyles(theme),\n}));\n\n/** Only one adornment shows at a time: the spinner replaces the caller's while loading. */\nconst EndAdornment: React.FC<{ loading: boolean; endAdornment?: React.ReactNode }> = ({\n loading,\n endAdornment,\n}) => {\n if (loading) {\n return (\n <InputAdornment position=\"end\">\n <CircularProgress size={INPUT_LOADING.spinnerSize} />\n </InputAdornment>\n );\n }\n\n if (!endAdornment) return null;\n\n return <InputAdornment position=\"end\">{endAdornment}</InputAdornment>;\n};\n\n/** While loading the field is inert: no clicks, and disabled to assistive tech. */\nconst interactionProps = (\n loading: boolean,\n onClick: InputProps['onClick'],\n disabled?: boolean,\n) => ({\n disabled: loading || disabled,\n onClick: loading ? undefined : onClick,\n});\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n variant = 'outlined',\n size = 'md',\n label,\n error,\n helperText,\n startAdornment,\n endAdornment,\n fullWidth = true,\n floating = false,\n glow = false,\n pulse = false,\n loading = false,\n onClick,\n onFocus,\n onBlur,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { testId: dataTestId, rest: props } = splitTestId(rest);\n return (\n <StyledTextField\n ref={ref}\n variant={muiVariantFor(variant)}\n customVariant={variant}\n floating={floating}\n glow={glow}\n pulse={pulse}\n loading={loading}\n label={label}\n error={error}\n helperText={helperText}\n fullWidth={fullWidth}\n {...interactionProps(loading, onClick, props.disabled)}\n onFocus={onFocus}\n onBlur={onBlur}\n /*\n * `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).\n * Spread with the rest it lands on the FormControl DIV that the text\n * field renders as its root, which carries no role — so the field kept\n * no accessible name, and a source grep saying \"this input is labelled\"\n * disagreed with the DOM. The reports search box and the block-title\n * inputs were both named in source and anonymous to a screen reader.\n */\n inputProps={{\n 'data-testid': dataTestId,\n ...(ariaLabel === undefined ? {} : { 'aria-label': ariaLabel }),\n }}\n InputProps={{\n startAdornment: startAdornment && (\n <InputAdornment position=\"start\">{startAdornment}</InputAdornment>\n ),\n endAdornment: <EndAdornment loading={loading} endAdornment={endAdornment} />,\n }}\n {...SIZE_MAP[size]}\n {...props}\n />\n );\n },\n);\n\nInput.displayName = 'Input';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,sBAAsB;AAC7B,OAAO,oBAAoB;AAC3B,SAAS,cAAc;AACvB,OAAO,WAAW;AA2DV;AAlCR,IAAM,kBAAkB,OAAO,eAAe;AAAA,EAC5C,mBAAmB,CAAC,SAClB,CAAC,CAAC,iBAAiB,YAAY,QAAQ,SAAS,SAAS,EAAE,SAAS,IAAc;AACtF,CAAC,EAME,CAAC,EAAE,OAAO,eAAe,UAAU,MAAM,OAAO,QAAQ,OAAO;AAAA,EAChE,UAAU;AAAA,EACV,SAAS,UAAU,cAAc,UAAU;AAAA,EAE3C,GAAI,OAAO,WAAW,KAAK,IAAI,CAAC;AAAA,EAChC,GAAI,QAAQ,YAAY,KAAK,IAAI,CAAC;AAAA,EAClC,GAAI,WAAW,oBAAoB,KAAK,IAAI,CAAC;AAAA,EAE7C,wBAAwB;AAAA,IACtB,YAAY;AAAA,IACZ,GAAG,gBAAgB,OAAO,aAAa;AAAA,EACzC;AAAA,EAEA,4BAA4B,eAAe,KAAK;AAAA,EAChD,0BAA0B,aAAa,KAAK;AAC9C,EAAE;AAGF,IAAM,eAA+E,CAAC;AAAA,EACpF;AAAA,EACA;AACF,MAAM;AACJ,MAAI,SAAS;AACX,WACE,oBAAC,kBAAe,UAAS,OACvB,8BAAC,oBAAiB,MAAM,cAAc,aAAa,GACrD;AAAA,EAEJ;AAEA,MAAI,CAAC,aAAc,QAAO;AAE1B,SAAO,oBAAC,kBAAe,UAAS,OAAO,wBAAa;AACtD;AAGA,IAAM,mBAAmB,CACvB,SACA,SACA,cACI;AAAA,EACJ,UAAU,WAAW;AAAA,EACrB,SAAS,UAAU,SAAY;AACjC;AAEO,IAAM,QAAQ,MAAM;AAAA,EACzB,CACE;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,IAAI,YAAY,IAAI;AAC5D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAS,cAAc,OAAO;AAAA,QAC9B,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG,iBAAiB,SAAS,SAAS,MAAM,QAAQ;AAAA,QACrD;AAAA,QACA;AAAA,QASA,YAAY;AAAA,UACV,eAAe;AAAA,UACf,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,cAAc,UAAU;AAAA,QAC/D;AAAA,QACA,YAAY;AAAA,UACV,gBAAgB,kBACd,oBAAC,kBAAe,UAAS,SAAS,0BAAe;AAAA,UAEnD,cAAc,oBAAC,gBAAa,SAAkB,cAA4B;AAAA,QAC5E;AAAA,QACC,GAAG,SAAS,IAAI;AAAA,QAChB,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/InputOTP/InputOTP.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\n\ninterface ColorPalette {\n main: string;\n dark?: string;\n light?: string;\n contrastText?: string;\n}\n\n/** `neutral` is not a MUI palette entry, so it is built from the grey ramp. */\nconst neutralPalette = (theme: Theme): ColorPalette => ({\n main: theme.palette.grey[700],\n dark: theme.palette.grey[800],\n light: theme.palette.grey[500],\n contrastText: '#fff',\n});\n\n/** `danger` is this component's name for the error palette. */\nconst namedPalette = (theme: Theme, color: string): ColorPalette => {\n const colorMap: Record<string, ColorPalette> = {\n primary: theme.palette.primary,\n secondary: theme.palette.secondary,\n success: theme.palette.success,\n warning: theme.palette.warning,\n info: theme.palette.info,\n danger: theme.palette.error,\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const palette = namedPalette(theme, color);\n const { primary } = theme.palette;\n\n return {\n main: palette.main || primary.main,\n dark: palette.dark || palette.main || primary.dark,\n light: palette.light || palette.main || primary.light,\n contrastText: palette.contrastText || '#fff',\n };\n};\n\ntype SizeKey = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Each slot is a square, so width and height always match. */\nconst SIZES: Record<SizeKey, { side: string; fontSize: string }> = {\n xs: { side: '32px', fontSize: '0.75rem' },\n sm: { side: '40px', fontSize: '0.875rem' },\n md: { side: '48px', fontSize: '1rem' },\n lg: { side: '56px', fontSize: '1.125rem' },\n xl: { side: '64px', fontSize: '1.25rem' },\n};\n\nexport interface OtpSlotFlags {\n customColor?: string;\n customSize?: string;\n glass?: boolean;\n gradient?: boolean;\n}\n\nexport const otpSlotSx = (theme: Theme, flags: OtpSlotFlags): CSSObject => {\n const { customColor = 'primary', customSize = 'md', glass, gradient } = flags;\n const palette = getColorFromTheme(theme, customColor);\n const { side, fontSize } = SIZES[customSize as SizeKey] ?? SIZES.md;\n\n return {\n width: side,\n height: side,\n '& .MuiOutlinedInput-root': {\n width: side,\n height: side,\n fontSize,\n fontWeight: 600,\n textAlign: 'center',\n borderRadius: theme.spacing(1),\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n '& fieldset': { border: `1px solid ${fieldEdge(theme)}` },\n }),\n ...(gradient && {\n '&.Mui-focused fieldset': {\n background: `linear-gradient(135deg, ${palette.main}, ${palette.light})`,\n borderWidth: '2px',\n },\n }),\n '& input': { textAlign: 'center', padding: 0, fontWeight: 'inherit' },\n '&:hover fieldset': { borderColor: palette.main },\n '&.Mui-focused fieldset': { borderColor: palette.main, borderWidth: '2px' },\n },\n };\n};\n"],"mappings":";;;;;AAAA,SAAS,aAAa;AAatB,IAAM,iBAAiB,CAAC,WAAgC;AAAA,EACtD,MAAM,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC5B,MAAM,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC5B,OAAO,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC7B,cAAc;AAChB;AAGA,IAAM,eAAe,CAAC,OAAc,UAAgC;AAClE,QAAM,WAAyC;AAAA,IAC7C,SAAS,MAAM,QAAQ;AAAA,IACvB,WAAW,MAAM,QAAQ;AAAA,IACzB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,IACvB,MAAM,MAAM,QAAQ;AAAA,IACpB,QAAQ,MAAM,QAAQ;AAAA,EACxB;AAEA,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ;AAC1C;AAEA,IAAM,oBAAoB,CAAC,OAAc,UAAgC;AACvE,MAAI,UAAU,WAAW;AACvB,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU,aAAa,OAAO,KAAK;AACzC,QAAM,EAAE,QAAQ,IAAI,MAAM;AAE1B,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ,QAAQ;AAAA,IAC9B,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IAC9C,OAAO,QAAQ,SAAS,QAAQ,QAAQ,QAAQ;AAAA,IAChD,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;AAKA,IAAM,QAA6D;AAAA,EACjE,IAAI,EAAE,MAAM,QAAQ,UAAU,UAAU;AAAA,EACxC,IAAI,EAAE,MAAM,QAAQ,UAAU,WAAW;AAAA,EACzC,IAAI,EAAE,MAAM,QAAQ,UAAU,OAAO;AAAA,EACrC,IAAI,EAAE,MAAM,QAAQ,UAAU,WAAW;AAAA,EACzC,IAAI,EAAE,MAAM,QAAQ,UAAU,UAAU;AAC1C;AASO,IAAM,YAAY,CAAC,OAAc,UAAmC;AACzE,QAAM,EAAE,cAAc,WAAW,aAAa,MAAM,OAAO,SAAS,IAAI;AACxE,QAAM,UAAU,kBAAkB,OAAO,WAAW;AACpD,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,UAAqB,KAAK,MAAM;AAEjE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,4BAA4B;AAAA,MAC1B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,cAAc,MAAM,QAAQ,CAAC;AAAA,MAC7B,GAAI,SAAS;AAAA,QACX,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG;AAAA,QAC1D,gBAAgB;AAAA,QAChB,cAAc,EAAE,QAAQ,aAAa,UAAU,KAAK,CAAC,GAAG;AAAA,MAC1D;AAAA,MACA,GAAI,YAAY;AAAA,QACd,0BAA0B;AAAA,UACxB,YAAY,2BAA2B,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA,UACrE,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,WAAW,EAAE,WAAW,UAAU,SAAS,GAAG,YAAY,UAAU;AAAA,MACpE,oBAAoB,EAAE,aAAa,QAAQ,KAAK;AAAA,MAChD,0BAA0B,EAAE,aAAa,QAAQ,MAAM,aAAa,MAAM;AAAA,IAC5E;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ContentToolbar/MultiSelectTriggers.tsx"],"sourcesContent":["'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useId } from 'react';\n\nimport type { MultiSelectOption } from './ContentToolbar.types';\n\n/**\n * Trigger label from the current selection: `allLabel` when none/all are\n * selected, the single label when one, else \"first (+N)\". Uses Set iteration\n * order so the label reflects the first-clicked option.\n */\nexport function buildTriggerLabel<TValue extends string>(\n selected: ReadonlySet<TValue>,\n options: MultiSelectOption<TValue>[],\n allLabel: string,\n): string {\n const size = selected.size;\n if (size === 0 || size === options.length) return allLabel;\n const labelMap = new Map(options.map((option) => [option.value, option.label]));\n const firstValue = selected.values().next().value as TValue;\n const firstLabel = labelMap.get(firstValue) ?? allLabel;\n if (size === 1) return firstLabel;\n return `${firstLabel} (+${size - 1})`;\n}\n\nexport interface TriggerProps {\n label: string;\n triggerLabel: string;\n open: boolean;\n onOpen: (event: React.MouseEvent<HTMLElement>) => void;\n testId?: string;\n}\n\n/** Compact `Label:` text button for a horizontal toolbar (the default layout). */\nexport function InlineTrigger({ label, triggerLabel, open, onOpen, testId }: TriggerProps): React.JSX.Element {\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, fontSize: '0.875rem' }}>\n <Typography component=\"span\" sx={{ color: 'text.secondary', fontSize: '0.875rem' }}>\n {label}:\n </Typography>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n data-testid={testId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={onOpen}\n sx={{ minWidth: 0, height: 32, px: 1, gap: 0.5, color: 'text.primary', textTransform: 'none', fontWeight: 600 }}\n >\n {triggerLabel}\n <ChevronDownIcon sx={{ fontSize: 14 }} />\n </Button>\n </Box>\n );\n}\n\n/** Full-width, outlined select-style control with the label above (stacked layout). */\nexport function StackedTrigger({ label, triggerLabel, open, onOpen, testId }: TriggerProps): React.JSX.Element {\n // Name the button by label + value (aria-labelledby): a <button> isn't labelable.\n const baseId = useId();\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography id={`${baseId}-label`} component=\"label\" sx={{ fontSize: '0.75rem', fontWeight: 500, color: 'text.secondary' }}>\n {label}\n </Typography>\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n fullWidth\n data-testid={testId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-labelledby={`${baseId}-label ${baseId}-value`}\n onClick={onOpen}\n endIcon={<ChevronDownIcon sx={{ fontSize: 18, color: 'text.secondary' }} />}\n sx={{\n justifyContent: 'space-between',\n height: 40,\n px: 1.5,\n color: 'text.primary',\n textTransform: 'none',\n fontWeight: 400,\n fontSize: '0.875rem',\n borderColor: 'divider',\n bgcolor: 'background.paper',\n '&:hover': { borderColor: 'text.primary', bgcolor: 'background.paper' },\n }}\n >\n <Box\n component=\"span\" id={`${baseId}-value`}\n sx={{ flex: 1, minWidth: 0, textAlign: 'left', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {triggerLabel}\n </Box>\n </Button>\n </Box>\n );\n}\n\n/** Rounded outlined chip (`Label ▾`, `Label (N) ▾` when selected) for a filter row. */\n/** The pill's own props, above the component so the signature stays short. */\nexport type PillTriggerProps = TriggerProps & {\n selectedCount: number;\n onClear?: () => void;\n /**\n * The clear affordance's accessible name — the pill's own label is already\n * on screen, so this is the only thing a screen reader gets for the little\n * cross. REQUIRED: this package ships no default copy.\n */\n clearLabel: string;\n};\n\nexport function PillTrigger({\n label,\n open,\n onOpen,\n testId,\n selectedCount,\n onClear,\n clearLabel,\n}: PillTriggerProps): React.JSX.Element {\n const active = selectedCount > 0;\n return (\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n size=\"small\"\n data-testid={testId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={onOpen}\n // Clearing lives ON the pill: the filter and the way to remove it are one\n // control, so removing one does not mean finding it again in a second\n // list somewhere else on the page.\n startIcon={\n active && onClear ? (\n <Box\n component=\"span\"\n role=\"button\"\n tabIndex={0}\n aria-label={clearLabel}\n data-testid={testId ? `${testId}-clear` : undefined}\n onClick={(event: React.MouseEvent) => {\n // The pill's own click opens the menu; clearing must not.\n event.stopPropagation();\n onClear();\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n event.stopPropagation();\n onClear();\n }}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n cursor: 'pointer',\n color: 'primary.main',\n '&:hover': { bgcolor: 'primary.main', color: 'primary.contrastText' },\n }}\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </Box>\n ) : undefined\n }\n endIcon={<ChevronDownIcon sx={{ fontSize: 16 }} />}\n sx={{\n borderRadius: 999,\n height: 34,\n px: 1.5,\n color: 'text.primary',\n fontWeight: 600,\n fontSize: '0.8125rem',\n textTransform: 'none',\n borderColor: active ? 'primary.main' : 'divider',\n bgcolor: active ? 'action.selected' : 'background.paper',\n '&:hover': { borderColor: active ? 'primary.main' : 'text.primary', bgcolor: active ? 'action.selected' : 'action.hover' },\n }}\n >\n {label}\n {active ? ` (${selectedCount})` : ''}\n </Button>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/CategorySelect/CategorySelect.styles.ts"],"sourcesContent":["import { alpha, type CSSObject, type Theme } from '@mui/material/styles/index.js';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\n\n/**\n * The prototype's METRICS, verbatim.\n *\n * Every number here is lifted from the approved design and is intentionally\n * absolute rather than derived from `theme.spacing`: the design is specified on\n * a half-pixel type scale (13.5px rows, 1.5px checkbox borders) that an 8px\n * spacing grid cannot express without rounding the look away.\n *\n * COLOURS are the deliberate exception — they come from the theme, because a\n * tenant can white-label the palette (a hard-coded indigo would survive the\n * rebrand and the rest of the screen would not) and because the library ships a\n * dark mode. On the default light indigo theme the tokens below resolve to the\n * prototype's own values.\n */\nexport const METRICS = {\n triggerHeight: 38,\n triggerRadius: 10,\n panelWidth: 340,\n panelRadius: 14,\n listMaxHeight: 290,\n sheetListMaxHeight: 340,\n rowHeight: 36,\n sheetRowHeight: 42,\n rowRadius: 8,\n boxSize: 18,\n chevronButton: 22,\n /** Extra left padding per level of nesting. */\n rowIndentStep: 14,\n footerButton: 32,\n sheetFooterButton: 38,\n /** Below this width the panel becomes a bottom sheet. */\n sheetBreakpoint: 480,\n} as const;\n\n/** Accent family, derived so a white-labelled palette carries through. */\nconst accent = (theme: Theme) => ({\n main: theme.palette.primary.main,\n ink: theme.palette.primary.dark,\n soft: alpha(theme.palette.primary.main, 0.08),\n edge: alpha(theme.palette.primary.main, 0.28),\n ring: alpha(theme.palette.primary.main, 0.15),\n});\n\n/** The closed control. `selected` swaps it to the accent-tinted \"has filter\" skin. */\nexport const triggerSx = (theme: Theme, selected: boolean, open: boolean): CSSObject => {\n const brand = accent(theme);\n return {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n height: METRICS.triggerHeight,\n padding: '0 10px 0 12px',\n borderRadius: `${METRICS.triggerRadius}px`,\n border: `1px solid ${open || selected ? brand.edge : fieldEdge(theme)}`,\n background: selected ? brand.soft : theme.palette.background.paper,\n color: selected ? brand.ink : theme.palette.text.primary,\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n maxWidth: '100%',\n transition: 'border-color .12s, box-shadow .12s',\n boxShadow: open ? `0 0 0 3px ${brand.ring}` : 'none',\n '&:hover': { borderColor: open || selected ? brand.edge : theme.palette.text.disabled },\n '&:focus-visible': {\n outline: 'none',\n borderColor: brand.main,\n boxShadow: `0 0 0 3px ${alpha(brand.main, 0.18)}`,\n },\n '&:disabled': { opacity: 0.5, cursor: 'default' },\n };\n};\n\n/** The count pill inside the trigger. */\nexport const triggerCountSx = (theme: Theme): CSSObject => ({\n fontWeight: 600,\n fontSize: 11,\n lineHeight: 1,\n background: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n borderRadius: '999px',\n padding: '3px 6px',\n minWidth: 18,\n textAlign: 'center',\n});\n\n/** The trigger's inline clear (×) and the chevron. */\nexport const triggerClearSx: CSSObject = {\n width: 20,\n height: 20,\n flex: '0 0 auto',\n border: 0,\n background: 'transparent',\n borderRadius: '5px',\n display: 'grid',\n placeItems: 'center',\n cursor: 'pointer',\n color: 'inherit',\n opacity: 0.6,\n padding: 0,\n '&:hover': { background: alpha('#000', 0.08), opacity: 1 },\n};\n\nexport const triggerChevronSx = (open: boolean): CSSObject => ({\n width: 14,\n height: 14,\n flex: '0 0 auto',\n opacity: 0.55,\n transition: 'transform .15s',\n transform: open ? 'rotate(180deg)' : 'none',\n});\n\n/** The floating panel. */\nexport const panelSx = (theme: Theme): CSSObject => ({\n width: METRICS.panelWidth,\n maxWidth: '100%',\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: `${METRICS.panelRadius}px`,\n boxShadow: '0 1px 2px rgba(16,20,35,.05), 0 18px 40px -12px rgba(16,20,35,.28)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\n/** Bottom-sheet skin, applied under {@link METRICS.sheetBreakpoint}. */\nexport const sheetSx = (theme: Theme): CSSObject => ({\n width: '100%',\n maxWidth: 'none',\n borderRadius: '18px 18px 0 0',\n borderBottom: 0,\n position: 'relative',\n paddingTop: '4px',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: 7,\n left: '50%',\n transform: 'translateX(-50%)',\n width: 36,\n height: 4,\n borderRadius: '2px',\n background: theme.palette.divider,\n },\n});\n\nexport const panelHeadSx = (theme: Theme, sheet: boolean): CSSObject => ({\n padding: sheet ? '18px 10px 8px' : '10px 10px 8px',\n borderBottom: `1px solid ${theme.palette.divider}`,\n});\n\nexport const pinnedSx = (theme: Theme): CSSObject => ({\n padding: '9px 10px',\n borderBottom: `1px solid ${theme.palette.divider}`,\n background: alpha(theme.palette.primary.main, 0.03),\n});\n\nexport const pinnedLabelSx = (theme: Theme): CSSObject => ({\n fontWeight: 600,\n fontSize: 10,\n lineHeight: 1,\n letterSpacing: '.08em',\n textTransform: 'uppercase',\n color: theme.palette.text.secondary,\n marginBottom: '7px',\n});\n\nexport const chipWrapSx: CSSObject = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '5px',\n maxHeight: 74,\n overflow: 'auto',\n};\n\n/** A selected-category chip, in the pinned tray and the applied bar alike. */\nexport const chipSx = (theme: Theme): CSSObject => {\n const brand = accent(theme);\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '5px',\n fontSize: 12,\n background: brand.soft,\n color: brand.ink,\n border: `1px solid ${brand.edge}`,\n borderRadius: '7px',\n padding: '3px 4px 3px 8px',\n '& button': {\n border: 0,\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n padding: 0,\n width: 16,\n height: 16,\n borderRadius: '4px',\n display: 'grid',\n placeItems: 'center',\n opacity: 0.65,\n fontSize: 13,\n lineHeight: 1,\n '&:hover': { background: alpha(theme.palette.primary.main, 0.16), opacity: 1 },\n },\n };\n};\n\nexport const listSx = (sheet: boolean): CSSObject => ({\n overflow: 'auto',\n maxHeight: sheet ? METRICS.sheetListMaxHeight : METRICS.listMaxHeight,\n padding: '6px 6px 8px',\n scrollPadding: '8px 0',\n overscrollBehavior: 'contain',\n});\n\n/** A row. `active` is the KEYBOARD cursor — deliberately distinct from hover. */\nexport const rowSx = (theme: Theme, active: boolean, sheet: boolean): CSSObject => ({\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '0 8px',\n height: sheet ? METRICS.sheetRowHeight : METRICS.rowHeight,\n borderRadius: `${METRICS.rowRadius}px`,\n cursor: 'pointer',\n userSelect: 'none',\n position: 'relative',\n width: '100%',\n border: 0,\n textAlign: 'left',\n font: 'inherit',\n background: active ? alpha(theme.palette.primary.main, 0.08) : 'transparent',\n boxShadow: active ? `inset 0 0 0 1px ${alpha(theme.palette.primary.main, 0.3)}` : 'none',\n '&:hover': {\n background: active\n ? alpha(theme.palette.primary.main, 0.08)\n : theme.palette.action.hover,\n },\n '&:focus-visible': { outline: `2px solid ${theme.palette.primary.main}`, outlineOffset: 1 },\n});\n\n/**\n * How far a row sits in from the panel edge, by depth.\n *\n * One step per level, on top of {@link rowSx}'s own 8px gutter — depth 0 keeps\n * that gutter, and every level below it adds `METRICS.rowIndentStep`. Absolute\n * like the rest of this file: the step is the design's own 14px, not a spacing\n * multiple that would round it.\n */\nexport const rowIndent = (depth: number): CSSObject =>\n depth === 0 ? {} : { paddingLeft: `${depth * METRICS.rowIndentStep}px` };\n\nexport const rowNameSx = (theme: Theme, isCategory: boolean): CSSObject => ({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: 13.5,\n fontWeight: isCategory ? 600 : 450,\n color: isCategory ? theme.palette.text.primary : theme.palette.text.secondary,\n});\n\nexport const rowMetaSx = (theme: Theme, selected: boolean): CSSObject => ({\n font: '500 11px/1 ui-monospace, SFMono-Regular, Menlo, monospace',\n color: selected ? theme.palette.primary.main : theme.palette.text.secondary,\n fontWeight: selected ? 600 : 500,\n flex: '0 0 auto',\n});\n\n/** The query hit inside a row label. */\nexport const markSx: CSSObject = {\n background: '#fff2a8',\n color: 'inherit',\n borderRadius: '2px',\n padding: '0 1px',\n};\n\nexport const chevronButtonSx = (theme: Theme, open: boolean): CSSObject => ({\n width: METRICS.chevronButton,\n height: METRICS.chevronButton,\n flex: '0 0 auto',\n border: 0,\n background: 'transparent',\n borderRadius: '6px',\n display: 'grid',\n placeItems: 'center',\n cursor: 'pointer',\n color: theme.palette.text.secondary,\n padding: 0,\n '&:hover': { background: theme.palette.action.hover, color: theme.palette.text.primary },\n '& svg': { width: 12, height: 12, transition: 'transform .15s', transform: open ? 'rotate(90deg)' : 'none' },\n});\n\n/** The tri-state checkbox: unchecked, checked, or the partial bar. */\nexport const checkboxSx = (theme: Theme, state: 'off' | 'partial' | 'on'): CSSObject => ({\n width: METRICS.boxSize,\n height: METRICS.boxSize,\n flex: '0 0 auto',\n border: `1.5px solid ${state === 'off' ? theme.palette.divider : theme.palette.primary.main}`,\n borderRadius: '5px',\n background: state === 'off' ? theme.palette.background.paper : theme.palette.primary.main,\n display: 'grid',\n placeItems: 'center',\n transition: 'background .1s, border-color .1s',\n '& svg': { width: 12, height: 12, color: theme.palette.primary.contrastText },\n});\n\n/** The partial bar drawn inside a half-selected checkbox. */\nexport const checkboxBarSx = (theme: Theme): CSSObject => ({\n width: 9,\n height: 2,\n background: theme.palette.primary.contrastText,\n borderRadius: '1px',\n});\n\nexport const radioSx = (theme: Theme, on: boolean): CSSObject => ({\n width: METRICS.boxSize,\n height: METRICS.boxSize,\n flex: '0 0 auto',\n borderRadius: '50%',\n background: theme.palette.background.paper,\n border: on\n ? `5.5px solid ${theme.palette.primary.main}`\n : `1.5px solid ${theme.palette.divider}`,\n boxSizing: 'border-box',\n});\n\nexport const sectionHeadSx = (theme: Theme): CSSObject => ({\n fontWeight: 600,\n fontSize: 10,\n lineHeight: 1,\n letterSpacing: '.08em',\n textTransform: 'uppercase',\n color: theme.palette.text.secondary,\n padding: '9px 8px 6px',\n});\n\nexport const footerSx = (theme: Theme): CSSObject => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '9px 10px',\n borderTop: `1px solid ${theme.palette.divider}`,\n background: theme.palette.action.hover,\n});\n\nexport const emptySx = (theme: Theme): CSSObject => ({\n padding: '26px 18px',\n textAlign: 'center',\n color: theme.palette.text.secondary,\n '& strong': {\n display: 'block',\n color: theme.palette.text.primary,\n fontSize: 13.5,\n marginBottom: '4px',\n },\n '& p': { margin: '0 0 12px', fontSize: 12.5, lineHeight: 1.5 },\n});\n\n/** Skeleton row used while the catalogue loads. */\nexport const skeletonSx: CSSObject = {\n height: METRICS.rowHeight,\n margin: '4px 6px',\n borderRadius: `${METRICS.rowRadius}px`,\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/CategorySelect/CategoryPanelFoot.tsx"],"sourcesContent":["'use client';\n\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\n\nimport type { CategorySelectCopy } from '../../../copy';\nimport { footerSx, METRICS } from './CategorySelect.styles';\n\nconst buttonSx = (sheet: boolean) =>\n ({\n height: sheet ? METRICS.sheetFooterButton : METRICS.footerButton,\n padding: '0 13px',\n borderRadius: '8px',\n fontSize: 12.5,\n fontWeight: 600,\n textTransform: 'none',\n minWidth: 0,\n }) as const;\n\ninterface MultiFootProps {\n count: number;\n /** False once the draft matches what is already applied — Apply becomes Close. */\n changed: boolean;\n sheet: boolean;\n onClear: () => void;\n onApply: () => void;\n dataTestId: string;\n copy: CategorySelectCopy;\n}\n\n/**\n * Multi-select footer: the running count, Clear, and the Apply that publishes\n * the draft. The primary button reads \"Fechar\" when nothing changed, so it never\n * promises an update it would not make.\n */\nexport function CategoryMultiFoot({\n count,\n changed,\n sheet,\n onClear,\n onApply,\n dataTestId,\n copy,\n}: MultiFootProps): React.JSX.Element {\n return (\n <Box sx={footerSx} data-testid={`${dataTestId}-footer`}>\n <Box component=\"span\" sx={{ fontSize: 12, color: 'text.secondary' }}>\n {copy.footer.selectedCount(count)}\n </Box>\n <Box sx={{ display: 'flex', gap: '6px' }}>\n <Button\n variant=\"outlined\"\n disabled={count === 0}\n sx={buttonSx(sheet)}\n onClick={onClear}\n data-testid={`${dataTestId}-clear`}\n >\n {copy.footer.clear}\n </Button>\n <Button\n variant=\"contained\"\n sx={buttonSx(sheet)}\n onClick={onApply}\n data-testid={`${dataTestId}-apply`}\n >\n {changed ? copy.footer.apply : copy.footer.close}\n </Button>\n </Box>\n </Box>\n );\n}\n\n/** Single-select footer: a hint and a way out. Picking a row commits directly. */\nexport function CategorySingleFoot({\n sheet,\n onCancel,\n dataTestId,\n copy,\n}: {\n sheet: boolean;\n onCancel: () => void;\n dataTestId: string;\n copy: CategorySelectCopy;\n}): React.JSX.Element {\n return (\n <Box sx={footerSx} data-testid={`${dataTestId}-footer`}>\n <Box component=\"span\" sx={{ fontSize: 12, color: 'text.secondary' }}>\n {copy.footer.singleHint}\n </Box>\n <Button\n variant=\"outlined\"\n sx={buttonSx(sheet)}\n onClick={onCancel}\n data-testid={`${dataTestId}-cancel`}\n >\n {copy.footer.cancel}\n </Button>\n </Box>\n );\n}\n"],"mappings":";;;;;;AAEA,OAAO,SAAS;AAChB,OAAO,YAAY;AA2Cb,cAGA,YAHA;AAtCN,IAAM,WAAW,CAAC,WACf;AAAA,EACC,QAAQ,QAAQ,QAAQ,oBAAoB,QAAQ;AAAA,EACpD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AACZ;AAkBK,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsC;AACpC,SACE,qBAAC,OAAI,IAAI,UAAU,eAAa,GAAG,UAAU,WAC3C;AAAA,wBAAC,OAAI,WAAU,QAAO,IAAI,EAAE,UAAU,IAAI,OAAO,iBAAiB,GAC/D,eAAK,OAAO,cAAc,KAAK,GAClC;AAAA,IACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,MAAM,GACrC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,UAAU,UAAU;AAAA,UACpB,IAAI,SAAS,KAAK;AAAA,UAClB,SAAS;AAAA,UACT,eAAa,GAAG,UAAU;AAAA,UAEzB,eAAK,OAAO;AAAA;AAAA,MACf;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI,SAAS,KAAK;AAAA,UAClB,SAAS;AAAA,UACT,eAAa,GAAG,UAAU;AAAA,UAEzB,oBAAU,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,KACF;AAEJ;AAGO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKsB;AACpB,SACE,qBAAC,OAAI,IAAI,UAAU,eAAa,GAAG,UAAU,WAC3C;AAAA,wBAAC,OAAI,WAAU,QAAO,IAAI,EAAE,UAAU,IAAI,OAAO,iBAAiB,GAC/D,eAAK,OAAO,YACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,IAAI,SAAS,KAAK;AAAA,QAClB,SAAS;AAAA,QACT,eAAa,GAAG,UAAU;AAAA,QAEzB,eAAK,OAAO;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/RadioGroup/RadioGroup.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { glowAnimation, rippleAnimation, scaleAnimation, slideAnimation } from './RadioGroup.animations';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\n\ninterface ColorPalette {\n main: string;\n dark?: string;\n light?: string;\n contrastText?: string;\n}\n\n/**\n * `neutral` is not a MUI palette entry, so it is built from the grey ramp. The\n * literal fallbacks cover a theme whose grey ramp has been replaced with one\n * that omits these steps.\n */\nconst neutralPalette = (theme: Theme): ColorPalette => ({\n main: theme.palette.grey?.[700] || '#616161',\n dark: theme.palette.grey?.[800] || '#424242',\n light: theme.palette.grey?.[500] || '#9e9e9e',\n contrastText: '#fff',\n});\n\n/** `danger` is this component's name for the error palette; the rest map straight through. */\nconst namedPalette = (theme: Theme, color: string): ColorPalette => {\n const colorMap: Record<string, ColorPalette> = {\n primary: theme.palette.primary,\n secondary: theme.palette.secondary,\n success: theme.palette.success,\n warning: theme.palette.warning,\n info: theme.palette.info,\n danger: theme.palette.error,\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\n/**\n * Resolves a colour name to a full palette, filling any step the theme leaves\n * out from `main` and then from the primary palette. Split into three so the\n * fallback chains do not all count against one function.\n */\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const palette = namedPalette(theme, color);\n const { primary } = theme.palette;\n\n // namedPalette always yields a palette, so these need no optional chaining;\n // each step still falls back to `main` and then to primary when the theme\n // leaves it out.\n return {\n main: palette.main || primary.main,\n dark: palette.dark || palette.main || primary.dark,\n light: palette.light || palette.main || primary.light,\n contrastText: palette.contrastText || '#fff',\n };\n};\n\ntype SizeKey = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst pickSize = <T,>(map: Record<SizeKey, T>, size: string): T => map[size as SizeKey] ?? map.md;\n\nconst CARD_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '8px', minHeight: '60px' },\n sm: { padding: '12px', minHeight: '70px' },\n md: { padding: '16px', minHeight: '80px' },\n lg: { padding: '20px', minHeight: '90px' },\n xl: { padding: '24px', minHeight: '100px' },\n};\n\nconst BUTTON_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '6px 12px', fontSize: '0.75rem', minHeight: '32px' },\n sm: { padding: '8px 16px', fontSize: '0.875rem', minHeight: '36px' },\n md: { padding: '10px 20px', fontSize: '1rem', minHeight: '40px' },\n lg: { padding: '12px 24px', fontSize: '1.125rem', minHeight: '44px' },\n xl: { padding: '14px 28px', fontSize: '1.25rem', minHeight: '48px' },\n};\n\nconst SEGMENT_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '4px 8px', fontSize: '0.75rem' },\n sm: { padding: '6px 12px', fontSize: '0.875rem' },\n md: { padding: '8px 16px', fontSize: '1rem' },\n lg: { padding: '10px 20px', fontSize: '1.125rem' },\n xl: { padding: '12px 24px', fontSize: '1.25rem' },\n};\n\nexport interface SurfaceFlags {\n selected?: boolean;\n customColor?: string;\n glass?: boolean;\n gradient?: boolean;\n glow?: boolean;\n customSize?: string;\n animated?: boolean;\n}\n\nexport const formLabelSx = (theme: Theme, glass?: boolean, error?: boolean): CSSObject => ({\n marginBottom: theme.spacing(2),\n fontWeight: 600,\n color: error ? theme.palette.error.main : theme.palette.text.primary,\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(10px)',\n padding: '8px 12px',\n borderRadius: '8px',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n display: 'inline-block',\n }),\n});\n\n/** The card's resting surface, before glass/gradient/glow override parts of it. */\nconst cardBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): CSSObject => {\n const { selected, animated, customSize = 'md' } = flags;\n\n return {\n cursor: 'pointer',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,\n backgroundColor: selected ? alpha(palette.main, 0.05) : theme.palette.background.paper,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && { animation: `${slideAnimation} 0.4s ease-out` }),\n // A radial wash that grows from the centre as the card is selected or hovered.\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: selected ? '100%' : '0',\n height: selected ? '100%' : '0',\n background: `radial-gradient(circle, ${alpha(palette.main, 0.1)} 0%, transparent 70%)`,\n transform: 'translate(-50%, -50%)',\n transition: 'all 0.5s ease',\n borderRadius: '50%',\n },\n '&:hover': {\n borderColor: palette.main,\n backgroundColor: alpha(palette.main, 0.02),\n transform: 'translateY(-2px) scale(1.02)',\n boxShadow: `${theme.shadows[4]}, 0 10px 30px -5px ${alpha(palette.main, 0.2)}`,\n '&::before': { width: '120%', height: '120%' },\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(CARD_SIZES, customSize),\n };\n};\n\nexport const radioCardSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', glass, gradient, glow } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n ...cardBase(theme, flags, palette),\n ...(glass && {\n backgroundColor: selected\n ? alpha(palette.main, 0.1)\n : alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n }),\n ...(gradient &&\n selected && {\n background: `linear-gradient(135deg, ${alpha(palette.main, 0.1)}, ${alpha(palette.light || palette.main, 0.05)})`,\n borderColor: palette.main,\n }),\n ...(glow &&\n selected && {\n animation: `${glowAnimation} 2s ease-in-out infinite`,\n boxShadow: `0 0 15px ${alpha(palette.main, 0.4)}`,\n }),\n };\n};\n\n/** The pill button's resting surface, before glass/gradient override parts of it. */\nconst buttonBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): CSSObject => {\n const { selected, animated, customSize = 'md' } = flags;\n\n return {\n borderRadius: theme.spacing(1),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n fontWeight: 500,\n border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,\n backgroundColor: selected ? palette.main : 'transparent',\n color: selected ? palette.contrastText || '#fff' : theme.palette.text.primary,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && selected && { animation: `${scaleAnimation} 0.3s ease-out` }),\n // Sized to zero until pressed, when the ripple keyframes expand it.\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: 0,\n height: 0,\n borderRadius: '50%',\n backgroundColor: alpha(palette.contrastText || '#fff', 0.3),\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none' as const,\n },\n '&:active::after': {\n animation: `${rippleAnimation} 0.6s ease-out`,\n width: '100%',\n height: '100%',\n },\n '&:hover': {\n borderColor: palette.main,\n backgroundColor: selected ? palette.dark : alpha(palette.main, 0.1),\n transform: 'translateY(-1px) scale(1.02)',\n boxShadow: `0 4px 12px ${alpha(palette.main, 0.2)}`,\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(BUTTON_SIZES, customSize),\n };\n};\n\nexport const buttonRadioSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', glass, gradient } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n ...buttonBase(theme, flags, palette),\n ...(glass && {\n backgroundColor: selected\n ? alpha(palette.main, 0.8)\n : alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n }),\n ...(gradient &&\n selected && {\n background: `linear-gradient(135deg, ${palette.main}, ${palette.dark})`,\n border: 'none',\n }),\n };\n};\n\nexport const segmentContainerSx = (\n theme: Theme,\n glass?: boolean,\n customColor = 'primary',\n): CSSObject => {\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n padding: '4px',\n borderRadius: theme.spacing(1.5),\n backgroundColor: glass\n ? alpha(theme.palette.background.paper, 0.1)\n : alpha(palette.main, 0.05),\n backdropFilter: glass ? 'blur(20px)' : 'none',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n display: 'flex',\n gap: '2px',\n };\n};\n\n/**\n * An underline that grows from the centre outwards, and is already full width\n * when the segment is the selected one.\n */\nconst segmentUnderline = (color: string, selected: boolean): CSSObject => ({\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: selected ? 0 : '50%',\n width: selected ? '100%' : 0,\n height: '2px',\n backgroundColor: color,\n transition: 'all 0.3s ease',\n transform: selected ? 'translateX(0)' : 'translateX(-50%)',\n});\n\nexport const segmentButtonSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', customSize = 'md', animated } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n flex: 1,\n borderRadius: theme.spacing(1),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n fontWeight: 500,\n backgroundColor: selected ? theme.palette.background.paper : 'transparent',\n color: selected ? palette.main : theme.palette.text.secondary,\n boxShadow: selected\n ? `${theme.shadows[2]}, inset 0 1px 3px ${alpha(palette.main, 0.1)}`\n : 'none',\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && selected && { animation: `${scaleAnimation} 0.3s ease-out` }),\n '&::before': segmentUnderline(palette.main, Boolean(selected)),\n '&:hover': {\n backgroundColor: selected\n ? theme.palette.background.paper\n : alpha(theme.palette.action.hover, 0.08),\n color: palette.main,\n '&::before': { width: '100%', left: 0, transform: 'translateX(0)' },\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(SEGMENT_SIZES, customSize),\n };\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/form/Button/Button.native.tsx","../../../src/components/form/Button/Button.helpers.ts","../../../src/components/form/Button/Button.metrics.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Easing,\n Platform,\n Pressable,\n StyleSheet,\n View,\n type GestureResponderEvent,\n type PressableStateCallbackType,\n type StyleProp,\n type TextStyle,\n type ViewStyle,\n} from 'react-native';\n\nimport { resolveButtonProps } from './Button.helpers';\nimport {\n BUTTON_FONT_WEIGHT,\n BUTTON_ICON_GAP_UNITS,\n BUTTON_LINE_HEIGHT,\n BUTTON_RADIUS_UNITS,\n BUTTON_SIZES,\n BUTTON_SPINNER_SIZE,\n BUTTON_WASH_ALPHA,\n GLASS_BACKGROUND_ALPHA,\n GLASS_BACKGROUND_ALPHA_PRESSED,\n GLASS_BORDER_ALPHA,\n GLOW_INNER_ALPHA,\n GLOW_RADIUS,\n ICON_ONLY_PADDING,\n PULSE_ALPHA,\n PULSE_DURATION_MS,\n PULSE_SPREAD,\n buttonPalette,\n gradientStops,\n quietInk,\n} from './Button.metrics';\nimport type { ButtonProps, ButtonVariant } from './Button.types.native';\nimport { renderTextChildren } from '../../../platform/text-children';\nimport { childTestId, resolveTestId, withoutTestIdProps } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\nimport { alpha } from '../../../tokens/color';\nimport type { ColorValue, SizeValue } from '../../../tokens/vocabulary';\nimport type { UiPaletteColor, UiTheme } from '../../../tokens/theme';\n\n/** MUI's `min-width` for a button that carries a label. */\nconst MIN_WIDTH = 64;\n\ninterface Paint {\n container: ViewStyle;\n pressed: ViewStyle;\n label: TextStyle;\n}\n\n/**\n * What the web's `VARIANT_STYLES` paint, as three React Native styles: at rest,\n * while pressed (the web's `:hover`, which touch has no equivalent of), and the\n * label. Same palette arithmetic, same alphas.\n *\n * `gradient` is the one honest gap: React Native core has no gradient fill, so\n * it paints the gradient's first stop. A host wanting the real thing adds a\n * gradient library; the parity ledger records this.\n */\nfunction paintFor(\n theme: UiTheme,\n variant: ButtonVariant,\n color: ColorValue,\n palette: UiPaletteColor,\n active: boolean,\n): Paint {\n const wash = alpha(palette.main, BUTTON_WASH_ALPHA);\n switch (variant) {\n case 'outline':\n return {\n container: { backgroundColor: 'transparent', borderWidth: 1, borderColor: palette.main },\n pressed: { backgroundColor: wash, borderColor: palette.dark },\n label: { color: palette.main },\n };\n case 'ghost':\n return {\n container: { backgroundColor: 'transparent' },\n pressed: { backgroundColor: wash },\n label: { color: quietInk(theme, palette) },\n };\n case 'text':\n return {\n container: { backgroundColor: active ? wash : 'transparent' },\n pressed: { backgroundColor: wash },\n label: { color: quietInk(theme, palette) },\n };\n case 'glass':\n return {\n container: {\n backgroundColor: alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA),\n borderWidth: 1,\n borderColor: alpha(theme.palette.divider, GLASS_BORDER_ALPHA),\n },\n pressed: { backgroundColor: alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA_PRESSED) },\n label: { color: palette.main },\n };\n case 'gradient': {\n const [from, to] = gradientStops(theme, color, palette);\n return {\n container: { backgroundColor: from },\n pressed: { backgroundColor: to },\n label: { color: '#fff' },\n };\n }\n default:\n return {\n container: { backgroundColor: palette.main },\n pressed: { backgroundColor: palette.dark },\n label: { color: palette.contrastText || '#fff' },\n };\n }\n}\n\n/** MUI's disabled treatment per variant family, so a disabled button reads as one on both sides. */\nfunction disabledPaint(theme: UiTheme, variant: ButtonVariant): Paint {\n const filled = variant === 'solid' || variant === 'gradient' || variant === 'glass';\n return {\n container: filled\n ? { backgroundColor: theme.palette.action.disabledBackground, borderWidth: 0 }\n : variant === 'outline'\n ? { backgroundColor: 'transparent', borderWidth: 1, borderColor: theme.palette.action.disabledBackground }\n : { backgroundColor: 'transparent' },\n pressed: {},\n label: { color: theme.palette.action.disabled },\n };\n}\n\nfunction sizeStyle(theme: UiTheme, size: SizeValue, iconOnly: boolean, hasIcon: boolean): ViewStyle {\n const metrics = BUTTON_SIZES[size];\n if (iconOnly) {\n return { padding: ICON_ONLY_PADDING[size], minWidth: 0 };\n }\n return {\n paddingVertical: metrics.paddingVertical,\n paddingHorizontal: metrics.paddingHorizontal,\n minWidth: MIN_WIDTH,\n gap: hasIcon ? theme.spacing(BUTTON_ICON_GAP_UNITS) : undefined,\n };\n}\n\nfunction glowStyle(palette: UiPaletteColor): ViewStyle {\n return Platform.select<ViewStyle>({\n android: { elevation: 8 },\n default: {\n shadowColor: palette.main,\n shadowOpacity: GLOW_INNER_ALPHA,\n shadowRadius: GLOW_RADIUS,\n shadowOffset: { width: 0, height: 0 },\n },\n });\n}\n\n/** The web's `::after` pulse ring: a looped scale-and-fade behind the button. */\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\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(progress, {\n toValue: 1,\n duration: PULSE_DURATION_MS,\n easing: Easing.out(Easing.ease),\n useNativeDriver: Platform.OS !== 'web',\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [progress]);\n\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 transform: [\n { scale: progress.interpolate({ inputRange: [0, 0.7, 1], outputRange: [1, 1 + PULSE_SPREAD / 40, 1] }) },\n ],\n },\n ]}\n />\n );\n}\n\n\ntype ResolvedProps = ReturnType<typeof resolveButtonProps<ButtonProps>>;\n\ninterface ButtonLook {\n inactive: boolean;\n palette: UiPaletteColor;\n radius: number;\n label: TextStyle;\n container: (state: PressableStateCallbackType) => StyleProp<ViewStyle>;\n}\n\n/**\n * Everything the button paints, decided once per render from the resolved\n * props and the theme. Kept out of the component so the component reads as\n * structure — what renders where — and this reads as arithmetic.\n */\nfunction buttonLook(theme: UiTheme, props: ResolvedProps): ButtonLook {\n const { variant, color, size, loading, icon, children, glow, pulse, active, disabled, style } = props;\n const palette = buttonPalette(theme, color);\n const iconOnly = !loading && icon != null && children == null;\n const inactive = Boolean(disabled) || loading;\n const paint = inactive ? disabledPaint(theme, variant) : paintFor(theme, variant, color, palette, active);\n const radius = theme.spacing(BUTTON_RADIUS_UNITS);\n const metrics = BUTTON_SIZES[size];\n // The web button is `overflow: hidden` (its ripple needs it) unless the pulse\n // ring turns it visible; on native the glow's shadow needs it visible too,\n // because a view's own shadow is clipped by its own overflow there.\n const overflow: ViewStyle['overflow'] = pulse || glow ? 'visible' : 'hidden';\n const sized = sizeStyle(theme, size, iconOnly, icon != null && !loading);\n const glowing = glow && !inactive ? glowStyle(palette) : null;\n\n return {\n inactive,\n palette,\n radius,\n label: {\n fontFamily: theme.typography.fontFamily,\n fontSize: metrics.fontSize,\n lineHeight: metrics.fontSize * BUTTON_LINE_HEIGHT,\n fontWeight: String(BUTTON_FONT_WEIGHT) as TextStyle['fontWeight'],\n textAlign: 'center',\n ...paint.label,\n },\n container: (state) => [\n styles.base,\n { borderRadius: radius, overflow },\n sized,\n paint.container,\n state.pressed && !inactive ? paint.pressed : null,\n glowing,\n style,\n ],\n };\n}\n\n/** The spinner that replaces the label while loading; `role` comes from react-native's ActivityIndicator. */\nfunction Spinner({ color, testID }: { color: string; testID: string }): React.JSX.Element {\n return (\n <ActivityIndicator\n size={Platform.OS === 'ios' ? 'small' : BUTTON_SPINNER_SIZE}\n color={color}\n testID={testID}\n accessibilityLabel=\"loading\"\n />\n );\n}\n\nexport const Button = React.forwardRef<View, ButtonProps>((rawProps, ref) => {\n const resolved = resolveButtonProps(rawProps);\n const { loading, icon, iconPosition, pulse, ripple, children, onClick, onPress, ...others } = resolved;\n const theme = useUiTheme();\n const look = buttonLook(theme, resolved);\n\n // The shared stories pass `'data-testid'` as a plain prop; honour it here and\n // keep all three spellings off the element (react-native-web would drop them).\n const testId = resolveTestId(others, 'button');\n const idFor = (suffix: string) => childTestId(others, suffix, 'button');\n const rest = withoutTestIdProps(others);\n // `buttonLook` consumed these; they are not Pressable props.\n const { variant: _v, color: _c, size: _s, glow: _g, active: _a, disabled: _d, style: _st, ...pressable } = rest;\n\n const handlePress = (event: GestureResponderEvent): void => {\n onClick?.(event);\n onPress?.(event);\n };\n\n const iconNode =\n !loading && icon ? (\n <View style={styles.icon} testID={idFor('icon')}>\n {icon}\n </View>\n ) : null;\n\n return (\n <Pressable\n ref={ref}\n role=\"button\"\n aria-disabled={look.inactive}\n aria-busy={loading}\n disabled={look.inactive}\n onPress={handlePress}\n android_ripple={ripple && !look.inactive ? { color: alpha(look.palette.main, 0.2), borderless: false } : undefined}\n style={look.container}\n testID={testId}\n {...pressable}\n >\n {pulse && !look.inactive ? <Pulse color={look.palette.main} radius={look.radius} testID={idFor('pulse')} /> : null}\n {iconPosition === 'left' ? iconNode : null}\n {loading ? <Spinner color={look.label.color as string} testID={idFor('loading')} /> : renderTextChildren(children, look.label, 1)}\n {iconPosition === 'right' ? iconNode : null}\n </Pressable>\n );\n});\n\nButton.displayName = 'Button';\n\nconst styles = StyleSheet.create({\n base: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n alignSelf: 'flex-start',\n position: 'relative',\n },\n icon: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n","import type { ButtonBaseProps } from './Button.base';\n\ntype ButtonDefaultedKeys =\n | 'variant'\n | 'color'\n | 'size'\n | 'loading'\n | 'iconPosition'\n | 'glow'\n | 'pulse'\n | 'ripple'\n | 'active';\n\n/**\n * Generic over the renderer's own props: the web and the native `Button` pass\n * different handler types through, and both come back out untouched.\n */\ntype ResolvedButtonProps<P extends ButtonBaseProps> = P &\n Required<Pick<ButtonBaseProps, ButtonDefaultedKeys>>;\n\nconst BUTTON_DEFAULTS: Required<Pick<ButtonBaseProps, ButtonDefaultedKeys>> = {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n loading: false,\n iconPosition: 'left',\n glow: false,\n pulse: false,\n ripple: true,\n active: false,\n};\n\n// Strips explicitly-undefined props before the merge, so `size={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = <P extends ButtonBaseProps>(props: P): Partial<P> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<P>;\n\nexport const resolveButtonProps = <P extends ButtonBaseProps>(props: P): ResolvedButtonProps<P> =>\n ({ ...BUTTON_DEFAULTS, ...definedProps(props) }) as ResolvedButtonProps<P>;\n","import { darken, lighten } from '../../../tokens/color';\nimport type { ColorValue, SizeValue } from '../../../tokens/vocabulary';\nimport type { UiPaletteColor, UiTheme } from '../../../tokens/theme';\n\n/**\n * THE NUMBERS BOTH `Button` RENDERERS DRAW WITH.\n *\n * `Button.styles.ts` (web, emotion) and `Button.native.tsx` (React Native)\n * read this one table. The web turns the px into rem and the padding into a\n * shorthand string; native uses the numbers as they are. Neither restates a\n * value, which is what keeps a native `md` button 16px tall of padding and\n * 16px of type exactly like the web one.\n */\nexport interface ButtonSizeMetrics {\n paddingVertical: number;\n paddingHorizontal: number;\n fontSize: number;\n}\n\nexport const BUTTON_SIZES: Record<SizeValue, ButtonSizeMetrics> = {\n xs: { paddingVertical: 2, paddingHorizontal: 8, fontSize: 12 },\n sm: { paddingVertical: 6, paddingHorizontal: 12, fontSize: 14 },\n md: { paddingVertical: 8, paddingHorizontal: 16, fontSize: 16 },\n lg: { paddingVertical: 10, paddingHorizontal: 20, fontSize: 18 },\n xl: { paddingVertical: 12, paddingHorizontal: 24, fontSize: 20 },\n};\n\n/** A button that is only an icon is square: uniform padding, no min-width. */\nexport const ICON_ONLY_PADDING: Record<SizeValue, number> = {\n xs: 2,\n sm: 5,\n md: 7,\n lg: 9,\n xl: 11,\n};\n\n/**\n * The start/end icon slot's font-size, in px — MUI's `medium` value, pinned\n * (12-74).\n *\n * MUI sizes that slot off its OWN `size` prop, writing 18/20/22 onto the first\n * child of `.MuiButton-startIcon`. We never passed a `size`, so every button in\n * every size has always drawn medium's 20px; now that `size` IS forwarded — so\n * the rendered class finally names the size the button actually is — the number\n * would start moving with it.\n *\n * WHAT THAT ACTUALLY REACHES, measured in a browser rather than assumed: this\n * Button renders its own wrapper span around the icon (it carries the child\n * test id), so MUI's rule lands on the WRAPPER and reaches the glyph only when\n * the glyph takes its size by inheritance — `fontSize=\"inherit\"`, an em-sized\n * SVG, a text or emoji glyph. With the pin removed, such a glyph measured 18px\n * at `xs`/`sm` and 22px at `lg`/`xl` against the 20px it has always been. An\n * icon carrying an absolute size of its own does not move at all: a default\n * `SvgIcon` stayed 24×24 across all five.\n *\n * A silent resize of the inherited case is still a design decision arriving as\n * a side effect of a class-name fix, so it is pinned to what shipped before —\n * `Button.tsx` puts it on that same wrapper. Scaling the glyph with the button\n * is a ticket of its own.\n */\nexport const BUTTON_ICON_GLYPH_SIZE = 20;\n\nexport const BUTTON_FONT_WEIGHT = 500;\n/** `theme.spacing(1)`. */\nexport const BUTTON_RADIUS_UNITS = 1;\n/** Between the icon and the label: `theme.spacing(0.5)`. */\nexport const BUTTON_ICON_GAP_UNITS = 0.5;\nexport const BUTTON_SPINNER_SIZE = 16;\n/** MUI's `line-height` for button text. */\nexport const BUTTON_LINE_HEIGHT = 1.75;\n\n/** The wash behind an outline, ghost or text button while it is hovered or pressed. */\nexport const BUTTON_WASH_ALPHA = 0.1;\nexport const GLASS_BACKGROUND_ALPHA = 0.1;\nexport const GLASS_BACKGROUND_ALPHA_PRESSED = 0.2;\nexport const GLASS_BORDER_ALPHA = 0.2;\nexport const GLOW_INNER_ALPHA = 0.6;\nexport const GLOW_OUTER_ALPHA = 0.3;\nexport const GLOW_RADIUS = 20;\nexport const PULSE_ALPHA = 0.3;\nexport const PULSE_DURATION_MS = 2000;\nexport const PULSE_SPREAD = 15;\n\n/**\n * `neutral` has no palette slot of its own in MUI, so `Button.styles.ts` has\n * always drawn it from three greys. Same three greys here.\n */\nexport function buttonPalette(theme: UiTheme, color: ColorValue): UiPaletteColor {\n if (color === 'neutral') {\n return {\n main: theme.palette.grey[700],\n dark: theme.palette.grey[800],\n light: theme.palette.grey[500],\n contrastText: '#fff',\n };\n }\n return theme.palette[color];\n}\n\n/**\n * The label colour for `ghost` and `text`: one step darker than `main` in\n * light mode (lighter in dark), because `main` is chosen to sit UNDER white and\n * is not legible AS text on a tinted surface. See the web `quietInk`.\n */\nexport const quietInk = (theme: UiTheme, palette: UiPaletteColor): string =>\n theme.mode === 'dark' ? lighten(palette.main, 0.35) : darken(palette.main, 0.3);\n\n/** Gradients run between two related hues; the named colours pick a specific pair. */\nexport function gradientStops(\n theme: UiTheme,\n color: ColorValue,\n palette: UiPaletteColor,\n): [string, string] {\n switch (color) {\n case 'primary':\n return [theme.palette.primary.main, theme.palette.secondary.main];\n case 'secondary':\n return [theme.palette.secondary.main, theme.palette.primary.main];\n case 'success':\n case 'warning':\n return [theme.palette[color].light, theme.palette[color].dark];\n case 'danger':\n return [theme.palette.danger.light, theme.palette.danger.dark];\n default:\n return [palette.main, palette.dark];\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/form/Input/Input.metrics.ts","../../../src/components/form/field-pulse.native.tsx","../../../src/tokens/field-edge.core.ts","../../../src/components/form/Input/Input.look.native.ts"],"sourcesContent":["import type { InputVariant } from './Input.base';\nimport { decomposeColor, recomposeColor } from '../../../tokens/color';\nimport type { UiTheme } from '../../../tokens/theme';\nimport { SIZE_VALUES, type SizeValue } from '../../../tokens/vocabulary';\n\n/**\n * THE NUMBERS BOTH `Input` RENDERERS DRAW WITH.\n *\n * `Input.styles.ts` (web, emotion over MUI's `TextField`) and\n * `Input.native.tsx` (React Native) read this one table. The web turns the px\n * into the padding shorthands and rem it has always emitted; native uses the\n * numbers as they are.\n *\n * Two kinds of number live here, and the difference matters:\n *\n * - the ones `Input.styles.ts` writes itself — the size overrides, the glow,\n * the pulse, the glass and gradient alphas, the filled wash;\n * - the ones MUI supplies UNDER those overrides — `OutlinedInput`'s\n * `16.5px 14px`, `InputBase`'s 23px line box, `FormHelperText`'s 3px lift.\n * The web never writes them, but it draws them, so a native field that\n * wants the same box has to know them. They are MUI 6.5's own values,\n * copied with their source named; a host that re-themes MUI's components\n * moves the web only, which the parity ledger records.\n */\n\nexport interface InputInset {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/** MUI gives a text field two heights; the house scale has five. */\nexport type MuiInputSize = 'small' | 'medium';\nexport type MuiInputVariant = 'outlined' | 'filled' | 'standard';\n\n/** Our five variants map onto MUI's three; `glass` and `gradient` restyle an outline. */\nexport const muiVariantFor = (variant: InputVariant): MuiInputVariant => {\n switch (variant) {\n case 'underline':\n return 'standard';\n case 'glass':\n case 'gradient':\n return 'outlined';\n default:\n return variant;\n }\n};\n\n/** Which of MUI's two heights each step of the house scale asks for. */\nexport const INPUT_MUI_SIZE: Record<SizeValue, MuiInputSize> = {\n xs: 'small',\n sm: 'small',\n md: 'medium',\n lg: 'medium',\n xl: 'medium',\n};\n\n/**\n * The three steps MUI has no height for, as `padding` on the input itself.\n *\n * `sm` and `md` are absent on purpose — they ARE MUI's two heights, so they\n * fall through to {@link MUI_INPUT_PADDING} below rather than restating it.\n * (`lg`'s 16px is a hair under `md`'s 16.5px: the override is a round number\n * where MUI's is derived from a 56px box. Kept as written — this table is what\n * the web draws, not what it ought to draw.)\n */\nexport const INPUT_SIZE_OVERRIDES: Partial<Record<SizeValue, { vertical: number; horizontal: number }>> = {\n xs: { vertical: 6, horizontal: 10 },\n lg: { vertical: 16, horizontal: 14 },\n xl: { vertical: 20, horizontal: 16 },\n};\n\n/**\n * MUI's own input padding per variant and height (`OutlinedInput`,\n * `FilledInput`, `InputBase`). The filled insets are lopsided because the\n * floating label sits inside the box on the web.\n */\nexport const MUI_INPUT_PADDING: Record<MuiInputVariant, Record<MuiInputSize, InputInset>> = {\n outlined: {\n small: { top: 8.5, right: 14, bottom: 8.5, left: 14 },\n medium: { top: 16.5, right: 14, bottom: 16.5, left: 14 },\n },\n filled: {\n small: { top: 21, right: 12, bottom: 4, left: 12 },\n medium: { top: 25, right: 12, bottom: 8, left: 12 },\n },\n standard: {\n small: { top: 1, right: 0, bottom: 5, left: 0 },\n medium: { top: 4, right: 0, bottom: 5, left: 0 },\n },\n};\n\n/** The inset the value is drawn at: the size override where there is one, MUI's otherwise. */\nexport function inputPadding(variant: InputVariant, size: SizeValue): InputInset {\n const override = INPUT_SIZE_OVERRIDES[size];\n if (override) {\n return {\n top: override.vertical,\n right: override.horizontal,\n bottom: override.vertical,\n left: override.horizontal,\n };\n }\n return MUI_INPUT_PADDING[muiVariantFor(variant)][INPUT_MUI_SIZE[size]];\n}\n\n/** `theme.typography.body1` and `InputBase`'s `lineHeight: '1.4375em'`, in px. */\nexport const INPUT_FONT_SIZE = 16;\nexport const INPUT_LINE_HEIGHT = 23;\n\n/** MUI's `::placeholder` opacity, which multiplies the ink's own alpha. */\nexport const PLACEHOLDER_OPACITY = { light: 0.42, dark: 0.5 } as const;\n\n/**\n * The placeholder's colour: the field's ink faded by MUI's opacity.\n *\n * `alpha()` REPLACES an alpha channel, and `text.primary` already carries one\n * (`rgba(0, 0, 0, 0.87)`), so `alpha(ink, 0.42)` would be a different grey from\n * the one the browser composites. React Native has no per-placeholder opacity —\n * only `placeholderTextColor` — so the multiplication happens here.\n */\nexport function placeholderInk(theme: UiTheme): string {\n const opacity = theme.mode === 'dark' ? PLACEHOLDER_OPACITY.dark : PLACEHOLDER_OPACITY.light;\n const { type, values } = decomposeColor(theme.palette.text.primary);\n const [first = 0, second = 0, third = 0, own = 1] = values;\n return recomposeColor({\n type: type.startsWith('hsl') ? 'hsla' : 'rgba',\n values: [first, second, third, own * opacity],\n });\n}\n\n/** The outline: 1px at rest, 2px focused, as MUI's `notchedOutline` draws it. */\nexport const INPUT_BORDER = { rest: 1, focused: 2 } as const;\n\n/** `FilledInput`'s and `Input`'s resting underline, MUI's own two greys. */\nexport const UNDERLINE_COLOR = {\n light: 'rgba(0, 0, 0, 0.42)',\n dark: 'rgba(255, 255, 255, 0.7)',\n} as const;\n\n/**\n * The label. It floats into the border on the web and sits above the field on\n * native, but it is the SAME label: 16px body type at MUI's shrunk scale, and\n * left-aligned with the value it names ({@link inputPadding}'s `left`).\n *\n * The 4px gap is MUI's own: a standard field puts 16px between the control's\n * top and the input, and the shrunk label's 12px line box takes the first 12.\n */\nexport const INPUT_LABEL = { scale: 0.75, gap: 4 } as const;\n\n/** `FormHelperText`: `theme.typography.caption` lifted 3px, inset 14px when contained. */\nexport const HELPER_TEXT = {\n fontSize: 12,\n lineHeight: 1.66,\n marginTop: 3,\n marginTopSmall: 4,\n marginHorizontal: 14,\n} as const;\n\n/** `InputAdornment`: 8px between the glyph and the value, on whichever side it is. */\nexport const ADORNMENT_GAP = 8;\n\n/** `loading`: the field fades and MUI's 20px `CircularProgress` takes the end slot. */\nexport const INPUT_LOADING = { opacity: 0.7, spinnerSize: 20 } as const;\n\n/** `glow`: a halo of the primary hue, wider and stronger while focused. */\nexport const INPUT_GLOW = {\n rest: { blur: 15, alpha: 0.3 },\n focused: { blur: 20, alpha: 0.5 },\n} as const;\n\n/** `pulse`: a 56px bar behind the field, fading outward every two seconds. */\nexport const INPUT_PULSE = {\n height: 56,\n radiusUnits: 0.5,\n opacity: 0.3,\n ms: 2000,\n spread: 10,\n} as const;\n\n/** `floating`: where the label rests and where it shrinks to, on the web. */\nexport const FLOATING_LABEL = {\n rest: { x: 14, y: 16 },\n shrink: { x: 14, y: -9 },\n scale: 0.75,\n paddingX: 4,\n} as const;\n\n/** `glass`: a wash of paper under a blur, brighter as the field is engaged. */\nexport const INPUT_GLASS = {\n background: { rest: 0.1, hover: 0.15, focused: 0.2 },\n blur: 20,\n hoverBorderAlpha: 0.3,\n focusRing: { width: 2, alpha: 0.1 },\n} as const;\n\n/** `gradient`: a 135° fill between the two brand hues, inside a 2px masked ring. */\nexport const INPUT_GRADIENT = {\n angleDeg: 135,\n fill: { rest: 0.1, hover: 0.15, focused: 0.2 },\n borderWidth: 2,\n} as const;\n\n/** `filled`: MUI's own grey replaced by a wash of `action.hover`. */\nexport const FILLED_WASH = { rest: 0.04, hover: 0.08, focused: 0.12 } as const;\n\n/**\n * The `sx` the web spreads onto the `TextField` for a size: MUI's height, plus\n * the input padding for the three steps MUI has no height for.\n */\nexport interface InputSizeProps {\n size: MuiInputSize;\n sx?: { '& .MuiInputBase-input': { padding: string } };\n}\n\nconst sizeProps = (size: SizeValue): InputSizeProps => {\n const override = INPUT_SIZE_OVERRIDES[size];\n return {\n size: INPUT_MUI_SIZE[size],\n ...(override\n ? { sx: { '& .MuiInputBase-input': { padding: `${override.vertical}px ${override.horizontal}px` } } }\n : {}),\n };\n};\n\nexport const SIZE_MAP: Record<SizeValue, InputSizeProps> = Object.fromEntries(\n SIZE_VALUES.map((size) => [size, sizeProps(size)]),\n) as Record<SizeValue, InputSizeProps>;\n","import * as React from 'react';\nimport { Animated, Easing, Platform, StyleSheet } from 'react-native';\n\nimport { INPUT_PULSE } from './Input/Input.metrics';\n\n/**\n * THE BAR THAT PULSES BEHIND A FIELD.\n *\n * `Input.styles.ts` and `Select.tsx` declare the same `::after` — a 56px wash\n * of the primary hue at 0.3, growing a 10px box-shadow ring and fading out\n * every two seconds — so the native halves draw it from one component rather\n * than one each. The numbers stay in `Input.metrics.ts`, which `Select.metrics`\n * re-exports under its own name.\n *\n * React Native has no box-shadow spread, so the ring is a scale on the bar.\n */\nexport function FieldPulse({\n color,\n radius,\n testID,\n}: {\n color: string;\n radius: number;\n testID: string;\n}): React.JSX.Element {\n const progress = React.useRef(new Animated.Value(0)).current;\n\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(progress, {\n toValue: 1,\n duration: INPUT_PULSE.ms,\n easing: Easing.out(Easing.ease),\n useNativeDriver: Platform.OS !== 'web',\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [progress]);\n\n return (\n <Animated.View\n testID={testID}\n aria-hidden\n style={[\n styles.pulse,\n {\n borderRadius: radius,\n backgroundColor: color,\n opacity: progress.interpolate({\n inputRange: [0, 0.7, 1],\n outputRange: [INPUT_PULSE.opacity, 0, 0],\n }),\n transform: [\n { translateY: -INPUT_PULSE.height / 2 },\n {\n scale: progress.interpolate({\n inputRange: [0, 0.7, 1],\n outputRange: [1, 1 + INPUT_PULSE.spread / INPUT_PULSE.height, 1],\n }),\n },\n ],\n },\n ]}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n pulse: {\n position: 'absolute',\n top: '50%',\n left: 0,\n right: 0,\n height: INPUT_PULSE.height,\n pointerEvents: 'none',\n },\n});\n","import {\n darken,\n decomposeColor,\n getContrastRatio,\n getLuminance,\n hslToRgb,\n lighten,\n recomposeColor,\n} from './color';\n\n/**\n * THE FIELD EDGE, WITH NO RENDERER BEHIND IT.\n *\n * The argument for why an outlined control cannot draw its resting boundary\n * from `alpha(theme.palette.divider, 0.23)` is in `./field-edge.ts`, next to\n * the MUI-typed `fieldEdge` the web components call. This file is the WALK\n * itself, over two colour strings, so the native renderer can run it too:\n * `Input.native.tsx` and `Select.native.tsx` have no MUI `Theme` to pass and no\n * `@mui/material/styles` to import, and a second copy of the walk beside them\n * is a second answer to \"where is this field's border\" waiting to drift.\n *\n * `./color` is a faithful port of MUI's colour manipulator (asserted equal to\n * it in `./__tests__/color.test.ts`), so the string this returns is the string\n * the web has always emitted.\n */\n\n/**\n * WCAG 2.1 SC 1.4.11 — the contrast a control's own boundary owes the surface\n * behind it. See `./field-edge.ts` for why 3:1 and why it is a floor.\n */\nexport const MIN_UI_CONTRAST = 3;\n\n/** How far one step of the walk moves, and how many steps before it gives up. */\nconst STEP = 0.05;\nconst MAX_STEPS = 20;\n\n/** A colour's red, green, blue and alpha, with `hsl()` converted on the way. */\nfunction channels(colour: string): [number, number, number, number] {\n const decomposed = decomposeColor(colour);\n const rgb = decomposed.type.startsWith('hsl') ? decomposeColor(hslToRgb(colour)) : decomposed;\n const [r, g, b, a] = rgb.values;\n return [r ?? 0, g ?? 0, b ?? 0, a ?? 1];\n}\n\n/**\n * A colour as an opaque `rgb()`, with any translucency resolved against\n * `surface`.\n *\n * Needed because `getContrastRatio` reads the channels it is given and ignores\n * the alpha, so handing it an `rgba()` measures a colour nobody sees.\n */\nfunction flatten(colour: string, surface: string): string {\n const [r, g, b, alpha] = channels(colour);\n if (alpha >= 1) return recomposeColor({ type: 'rgb', values: [r, g, b] });\n\n const [baseR, baseG, baseB] = channels(surface);\n const blend = (fg: number, bg: number): number => Math.round(alpha * fg + (1 - alpha) * bg);\n return recomposeColor({\n type: 'rgb',\n values: [blend(r, baseR), blend(g, baseG), blend(b, baseB)],\n });\n}\n\n/**\n * The resting boundary a control draws on `surface`, from the theme's own\n * `divider` as the seed: the seed itself when it already clears\n * {@link MIN_UI_CONTRAST}, otherwise the nearest tone of it that does.\n */\nexport function resolveFieldEdge(divider: string, surface: string): string {\n const ground = flatten(surface, '#FFFFFF');\n const seed = flatten(divider, ground);\n if (getContrastRatio(seed, ground) >= MIN_UI_CONTRAST) return seed;\n\n // Away from the surface, whichever way that is — so one rule serves both\n // modes, and a dark card in a light theme is still handled by the pair rather\n // than by `palette.mode`.\n const away = getLuminance(ground) > 0.5 ? darken : lighten;\n for (let step = 1; step <= MAX_STEPS; step += 1) {\n // From the SEED each time rather than compounding the previous result, so\n // the walk lands on the nearest passing tone instead of overshooting past it.\n const candidate = away(seed, step * STEP);\n if (getContrastRatio(candidate, ground) >= MIN_UI_CONTRAST) return candidate;\n }\n // Unreachable for any real surface — black clears 21:1 on white and white\n // clears it on black — but a caller must never be handed `undefined`.\n return getLuminance(ground) > 0.5 ? '#000000' : '#FFFFFF';\n}\n","import type { TextStyle, ViewStyle } from 'react-native';\n\nimport type { InputVariant } from './Input.base';\nimport {\n FILLED_WASH,\n HELPER_TEXT,\n INPUT_MUI_SIZE,\n INPUT_BORDER,\n INPUT_FONT_SIZE,\n INPUT_GLASS,\n INPUT_GRADIENT,\n INPUT_LABEL,\n INPUT_LINE_HEIGHT,\n UNDERLINE_COLOR,\n inputPadding,\n placeholderInk,\n} from './Input.metrics';\nimport { alpha } from '../../../tokens/color';\nimport { resolveFieldEdge } from '../../../tokens/field-edge.core';\nimport type { UiTheme } from '../../../tokens/theme';\nimport type { SizeValue } from '../../../tokens/vocabulary';\n\n/**\n * WHAT A NATIVE `Input` PAINTS, AS ARITHMETIC.\n *\n * Kept out of `Input.native.tsx` so that file reads as structure — label, box,\n * value, helper — and this one reads as the decisions: which border, how thick,\n * what colour, and where the value sits inside it.\n */\nexport interface FieldState {\n focused: boolean;\n error: boolean;\n disabled: boolean;\n}\n\n/** Which edges a variant draws. `filled` and `underline` rule only the bottom. */\nconst BORDER_SIDES: Record<InputVariant, 'all' | 'bottom'> = {\n outlined: 'all',\n glass: 'all',\n gradient: 'all',\n filled: 'bottom',\n underline: 'bottom',\n};\n\n/**\n * Whether the web draws this border on an absolutely positioned element.\n *\n * MUI's `notchedOutline` fieldset and the `::before` / `::after` underlines\n * cost no height — the field is 56px tall WITH its border. `glass` and\n * `gradient` instead put a real `border` on the input root, which does add to\n * the box, so the web field is 2px and 4px taller respectively. React Native\n * has only the second kind, so the first three compensate below.\n */\nconst BORDER_IS_FREE: Record<InputVariant, boolean> = {\n outlined: true,\n filled: true,\n underline: true,\n glass: false,\n gradient: false,\n};\n\n/**\n * How thick. Only the outline family thickens on focus (MUI's `borderWidth: 2`\n * on `.Mui-focused .notchedOutline`); `glass` and `gradient` declare their own\n * constant border and change only its colour.\n */\nexport function borderWidthFor(variant: InputVariant, focused: boolean): number {\n if (variant === 'gradient') return INPUT_GRADIENT.borderWidth;\n if (variant === 'glass') return INPUT_BORDER.rest;\n return focused ? INPUT_BORDER.focused : INPUT_BORDER.rest;\n}\n\n/**\n * The width the border takes out of the horizontal inset — 0 where the web's\n * border adds to the box rather than floating over it. Exported because the\n * `Select` draws the same box and has to place its arrow inside the same edge.\n */\nexport function horizontalBorderInset(variant: InputVariant, focused: boolean): number {\n if (BORDER_SIDES[variant] !== 'all' || !BORDER_IS_FREE[variant]) return 0;\n return borderWidthFor(variant, focused);\n}\n\n/**\n * What colour. Error and disabled outrank focus, as they do in MUI's source\n * order; a resting `filled` keeps MUI's own underline grey because the web\n * override only replaces its background.\n */\nfunction borderColorFor(theme: UiTheme, variant: InputVariant, state: FieldState): string {\n if (state.disabled) return theme.palette.action.disabled;\n if (state.error) return theme.palette.danger.main;\n if (variant === 'gradient') {\n return state.focused ? theme.palette.primary.dark : theme.palette.primary.main;\n }\n if (state.focused) return theme.palette.primary.main;\n if (variant === 'filled') {\n return theme.mode === 'dark' ? UNDERLINE_COLOR.dark : UNDERLINE_COLOR.light;\n }\n return resolveFieldEdge(theme.palette.divider, theme.palette.background.paper);\n}\n\n/** The fill behind the value. `outlined` and `underline` have none. */\nfunction backgroundFor(theme: UiTheme, variant: InputVariant, state: FieldState): string | undefined {\n switch (variant) {\n case 'filled':\n return alpha(theme.palette.action.hover, state.focused ? FILLED_WASH.focused : FILLED_WASH.rest);\n case 'glass':\n return alpha(\n theme.palette.background.paper,\n state.focused ? INPUT_GLASS.background.focused : INPUT_GLASS.background.rest,\n );\n case 'gradient':\n // The first stop of the web's 135° fill; React Native core has no gradient.\n return alpha(\n theme.palette.primary.main,\n state.focused ? INPUT_GRADIENT.fill.focused : INPUT_GRADIENT.fill.rest,\n );\n default:\n return undefined;\n }\n}\n\n/** `filled` rounds its top two corners, `underline` none, the rest all four. */\nfunction radiusFor(theme: UiTheme, variant: InputVariant): ViewStyle {\n if (variant === 'underline') return {};\n if (variant === 'filled') {\n return { borderTopLeftRadius: theme.radius.md, borderTopRightRadius: theme.radius.md };\n }\n return { borderRadius: theme.radius.md };\n}\n\n/** The border as React Native writes it: a width per side, one colour, one style. */\nfunction borderStyle(variant: InputVariant, width: number, color: string, state: FieldState): ViewStyle {\n // MUI draws a disabled `filled` or `standard` underline dotted.\n const style: ViewStyle['borderStyle'] =\n state.disabled && BORDER_SIDES[variant] === 'bottom' ? 'dotted' : 'solid';\n const sides: ViewStyle =\n BORDER_SIDES[variant] === 'bottom' ? { borderBottomWidth: width } : { borderWidth: width };\n return { ...sides, borderColor: color, borderStyle: style };\n}\n\nexport interface FieldLook {\n /** The row the border is drawn on: fill, edges, corners and horizontal inset. */\n box: ViewStyle;\n /** The `TextInput` itself: type, ink and the vertical inset. */\n value: TextStyle;\n placeholder: string;\n}\n\n/**\n * The field, in absolute numbers.\n *\n * The horizontal inset sits on the ROW rather than on the `TextInput`, which is\n * what MUI does the moment an adornment appears (`paddingLeft: 14` moves to the\n * input root and the input's own goes to 0) — so one rule serves a field with\n * adornments and one without.\n *\n * Where the web's border costs no height, the inset gives the border back its\n * width, so the box is the height MUI draws (56px medium, 40px small) and the\n * value does not shift by a pixel when the focused border thickens.\n */\nexport function fieldLook(\n theme: UiTheme,\n variant: InputVariant,\n size: SizeValue,\n state: FieldState,\n): FieldLook {\n const padding = inputPadding(variant, size);\n const width = borderWidthFor(variant, state.focused);\n const inset = BORDER_IS_FREE[variant] ? width : 0;\n const sides = BORDER_SIDES[variant];\n const horizontal = sides === 'all' ? inset : 0;\n\n return {\n box: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: padding.left - horizontal,\n paddingRight: padding.right - horizontal,\n backgroundColor: backgroundFor(theme, variant, state),\n ...radiusFor(theme, variant),\n ...borderStyle(variant, width, borderColorFor(theme, variant, state), state),\n },\n value: {\n flex: 1,\n minWidth: 0,\n fontFamily: theme.typography.fontFamily,\n fontSize: INPUT_FONT_SIZE,\n lineHeight: INPUT_LINE_HEIGHT,\n color: state.disabled ? theme.palette.text.disabled : theme.palette.text.primary,\n paddingTop: padding.top - (sides === 'all' ? inset : 0),\n paddingBottom: padding.bottom - inset,\n paddingHorizontal: 0,\n },\n placeholder: placeholderInk(theme),\n };\n}\n\n/**\n * The label's ink. MUI's `FormLabel` is `text.secondary`, the focus colour is\n * the palette's `main`, and error and disabled are declared after it and win.\n */\nexport function labelStyle(theme: UiTheme, variant: InputVariant, size: SizeValue, state: FieldState): TextStyle {\n const ink = state.disabled\n ? theme.palette.text.disabled\n : state.error\n ? theme.palette.danger.main\n : state.focused\n ? theme.palette.primary.main\n : theme.palette.text.secondary;\n\n return {\n color: ink,\n fontFamily: theme.typography.fontFamily,\n fontSize: INPUT_FONT_SIZE * INPUT_LABEL.scale,\n marginBottom: INPUT_LABEL.gap,\n // Aligned with the value it names: the web's floating label and the input\n // share one left inset (14px outlined, 12px filled, 0 standard).\n marginLeft: inputPadding(variant, size).left,\n };\n}\n\n/**\n * `FormHelperText`: caption type, 3px below the field, inset 14px when\n * contained — and 4px below at MUI's `small` density, which `INPUT_MUI_SIZE`\n * selects for `xs` and `sm` (`FormHelperText.js`: `marginTop: 3`, then a\n * `size: 'small'` variant raising it to 4).\n */\nexport function helperStyle(\n theme: UiTheme,\n variant: InputVariant,\n size: SizeValue,\n state: FieldState,\n): TextStyle {\n return {\n color: state.disabled\n ? theme.palette.text.disabled\n : state.error\n ? theme.palette.danger.main\n : theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily,\n fontSize: HELPER_TEXT.fontSize,\n lineHeight: HELPER_TEXT.fontSize * HELPER_TEXT.lineHeight,\n marginTop: INPUT_MUI_SIZE[size] === 'small' ? HELPER_TEXT.marginTopSmall : HELPER_TEXT.marginTop,\n marginHorizontal: variant === 'underline' ? 0 : HELPER_TEXT.marginHorizontal,\n };\n}\n"],"mappings":"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","names":["alpha"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/tokens/color.ts","../../../src/tokens/ink-over.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 * THE PRODUCT'S TWO INKS, AND THE TWO RULES FOR CHOOSING BETWEEN THEM.\n *\n * Split out of `theme.ts` when that file reached the 400-line cap, and the seam\n * is a real one rather than a place the knife happened to land: everything here\n * answers one question — given a surface, which of the two inks goes on it —\n * and nothing here builds a palette. `theme.ts` keeps the tables and the\n * factories and imports the answers.\n *\n * Both functions stay exported from `theme.ts` as well, because both were\n * published from there and a caller should not have to learn about this file.\n */\nimport { getContrastRatio } from './color';\n\n/** MUI's `createPalette` contrast defaults, exactly. */\nexport const CONTRAST_THRESHOLD = 3;\nexport const DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';\nexport const LIGHT_TEXT_PRIMARY = '#fff';\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 * **It no longer takes the better ink for free (FUT-2066).** \"Better worst\n * case\" decides WHICH ink wins; {@link INK_CHANGE_MARGIN} decides whether the\n * win is big enough to repaint a brand over. The two rows that moved when this\n * function landed were `warning` — 2.16:1 white on an orange, the defect — and\n * `danger`, bought for a quarter of a point. Only the first survives the\n * margin, which is the whole point: one of them was a fix and the other was\n * churn, and nothing in the old rule could tell them apart.\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 * `incumbent` is the palette's own `contrastText` for this role — what both\n * call sites already passed, under the name `fallback`. It is still returned\n * when a fill cannot be decomposed ({@link getContrastRatio} throws on a format\n * it does not know, and a throw inside an emotion style function takes the\n * render down with it), so nothing about that path changed; it has simply\n * stopped being only a last resort.\n */\n/**\n * HOW MUCH BETTER THE OTHER INK HAS TO BE BEFORE A BRAND IS REPAINTED (FUT-2066).\n *\n * Half a contrast point. The rule this guards is \"take the better worst case\",\n * and on MUI's own stock palette that rule repainted `danger`'s gradient button\n * from white-on-red to black-on-red for **0.25 of a point** — 3.49 against 3.74,\n * with neither ink clearing AA either way. A rule that churns a brand for a\n * rounding difference will churn it again on the next palette tweak, and the\n * consumer who has to explain why their destructive button changed colour has\n * no better answer than \"it rounded the other way\".\n *\n * The number sits in a wide measured band rather than on a cliff. Walking the\n * five gradient pairs `Button.styles.ts` paints, the only two gaps that exist\n * are `danger`'s **0.25** — the churn — and `warning`'s **3.38**, white at\n * 2.16:1 on an orange against dark ink at 5.54:1, which is the defect FUT-1924\n * exists for. Anything in `[0.3, 3.38]` separates them; 0.5 is the round number\n * nearest the bottom of that band, so the next palette move has to be\n * substantially larger than a rounding difference before this fires.\n *\n * FUT-2066 recorded this as undecidable, on a measurement that turns out to be\n * wrong: it reports the incumbent for `success` as DARK ink and concludes that\n * a margin would hold it at 2.66 where the current rule gets 2.78. The gradient\n * runs `success.light → success.dark`, but `contrastText` answers for\n * `success.MAIN` — `#2e7d32`, not the `#4caf50` the table names — and white on\n * `#2e7d32` is 5.7:1, so the incumbent is white and a margin leaves that row\n * exactly where it is. With that row corrected the objection goes away and the\n * shape the ticket proposed is simply right.\n */\nconst INK_CHANGE_MARGIN = 0.5;\n\n/**\n * The contrast below which the incumbent is not worth keeping at any margin.\n *\n * MUI's own `contrastThreshold`, and the same number for the same reason: below\n * 3:1 an ink is not a brand decision, it is text nobody can read. `warning` is\n * caught by this AND by {@link INK_CHANGE_MARGIN} — white sits at 2.16:1 on\n * that orange — which is deliberate: the one row that has to move should not\n * depend on which clause fires.\n */\nconst INK_CHANGE_FLOOR = CONTRAST_THRESHOLD;\n\nexport function inkOver(fills: readonly string[], incumbent: string): string {\n try {\n const worstCase = (ink: string): number =>\n Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));\n\n const better =\n worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n\n // The incumbent is the palette's OWN answer for this role, which is what\n // makes \"keep it unless the gain is material\" a statement about churn\n // rather than about arithmetic. It arrives as the same argument that used\n // to be the parse-failure fallback, because it always was `contrastText`\n // at both call sites — the parameter has stopped being a last resort and\n // started being the thing being defended.\n const held = worstCase(incumbent);\n const gain = worstCase(better) - held;\n return gain >= INK_CHANGE_MARGIN || held < INK_CHANGE_FLOOR ? better : incumbent;\n } catch {\n return incumbent;\n }\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, lighten } from './color';\nimport { contrastText, DARK_TEXT_PRIMARY, inkOver } from './ink-over';\n\n/*\n RE-EXPORTED rather than moved out of the public surface. Both were published\n from here, and `ink-over.ts` exists because this file reached the 400-line cap\n — a caller should not have to learn that.\n*/\nexport { contrastText, inkOver };\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` default tonal offset, exactly. */\nconst TONAL_OFFSET = 0.2;\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/**\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":";AA0BA,IAAM,UAAkC,CAAC,OAAO,QAAQ,OAAO,MAAM;AAErE,IAAM,QAAQ,CAAC,OAAe,MAAM,GAAG,MAAM,MAAc,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,GAAG;AAGtF,SAAS,SAAS,OAAuB;AAC9C,QAAM,MAAM,MAAM,MAAM,CAAC;AACzB,QAAM,OAAO,IAAI,OAAO,OAAO,IAAI,UAAU,IAAI,IAAI,CAAC,KAAK,GAAG;AAC9D,MAAI,WAA4B,IAAI,MAAM,IAAI;AAC9C,MAAI,YAAY,SAAS,CAAC,GAAG,WAAW,GAAG;AACzC,eAAW,SAAS,IAAI,CAAC,YAAY,UAAU,OAAO;AAAA,EACxD;AACA,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,QAAQ,SAAS;AAAA,IAAI,CAAC,SAAS,UACnC,QAAQ,IAAI,SAAS,SAAS,EAAE,IAAI,KAAK,MAAO,SAAS,SAAS,EAAE,IAAI,MAAO,GAAI,IAAI;AAAA,EACzF;AACA,SAAO,MAAM,SAAS,WAAW,IAAI,MAAM,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC;AACnE;AAGO,SAAS,eAAe,OAAgC;AAC7D,MAAI,MAAM,OAAO,CAAC,MAAM,KAAK;AAC3B,WAAO,eAAe,SAAS,KAAK,CAAC;AAAA,EACvC;AAEA,QAAM,SAAS,MAAM,QAAQ,GAAG;AAChC,QAAM,OAAO,MAAM,UAAU,GAAG,MAAM;AACtC,MAAI,CAAC,QAAQ,SAAS,IAAI,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,oCAAoC,KAAK;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,SAAS,MACZ,UAAU,SAAS,GAAG,MAAM,SAAS,CAAC,EACtC,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC;AAEnC,SAAO,EAAE,MAAM,OAAO;AACxB;AAGO,SAAS,eAAe,EAAE,MAAM,OAAO,GAA4B;AACxE,QAAM,QAAgC,KAAK,WAAW,KAAK,IACvD,OAAO,IAAI,CAAC,OAAO,UAAW,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,KAAM,IACpE,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,MAAM,CAAC,CAAC;AAEnF,SAAO,GAAG,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC;AACpC;AAGO,SAAS,SAAS,OAAuB;AAC9C,QAAM,EAAE,MAAM,OAAO,IAAI,eAAe,KAAK;AAC7C,QAAM,IAAI,OAAO,CAAC,KAAK;AACvB,QAAM,KAAK,OAAO,CAAC,KAAK,KAAK;AAC7B,QAAM,KAAK,OAAO,CAAC,KAAK,KAAK;AAC7B,QAAM,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;AAC/B,QAAM,IAAI,CAAC,GAAW,KAAK,IAAI,IAAI,MAAM,OACvC,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE;AAEhD,QAAM,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC;AACnF,MAAI,SAAS,QAAQ;AACnB,WAAO,eAAe,EAAE,MAAM,QAAQ,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AAAA,EAC1E;AACA,SAAO,eAAe,EAAE,MAAM,OAAO,QAAQ,IAAI,CAAC;AACpD;AAGO,SAAS,aAAa,OAAuB;AAClD,QAAM,aAAa,eAAe,KAAK;AACvC,QAAM,WAAW,WAAW,KAAK,WAAW,KAAK,IAC7C,eAAe,SAAS,KAAK,CAAC,EAAE,SAChC,WAAW;AAEf,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU;AACpD,UAAM,IAAI,QAAQ;AAClB,WAAO,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AAAA,EAC7D,CAAC;AAED,SAAO,QAAQ,UAAU,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,IAAI,QAAQ,CAAC,CAAC;AACtF;AAGO,SAAS,iBAAiB,YAAoB,YAA4B;AAC/E,QAAM,OAAO,aAAa,UAAU;AACpC,QAAM,OAAO,aAAa,UAAU;AACpC,UAAQ,KAAK,IAAI,MAAM,IAAI,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI,IAAI;AACjE;AAGO,SAAS,MAAM,OAAe,OAAuB;AAC1D,QAAM,aAAa,eAAe,KAAK;AACvC,QAAM,OAAoB,WAAW,KAAK,SAAS,GAAG,IAClD,WAAW,OACV,GAAG,WAAW,IAAI;AACvB,QAAM,SAAS,WAAW,OAAO,MAAM,GAAG,CAAC;AAC3C,SAAO,CAAC,IAAI,MAAM,KAAK;AACvB,SAAO,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC;AAGO,SAAS,OAAO,OAAe,aAA6B;AACjE,QAAM,aAAa,eAAe,KAAK;AACvC,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,SAAS,CAAC,GAAG,WAAW,MAAM;AAEpC,MAAI,WAAW,KAAK,WAAW,KAAK,GAAG;AACrC,WAAO,CAAC,KAAK,OAAO,CAAC,KAAK,MAAM,IAAI;AAAA,EACtC,OAAO;AACL,aAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,aAAO,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,IAAI;AAAA,IAC9C;AAAA,EACF;AACA,SAAO,eAAe,EAAE,MAAM,WAAW,MAAM,OAAO,CAAC;AACzD;AAGO,SAAS,QAAQ,OAAe,aAA6B;AAClE,QAAM,aAAa,eAAe,KAAK;AACvC,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,SAAS,CAAC,GAAG,WAAW,MAAM;AAEpC,MAAI,WAAW,KAAK,WAAW,KAAK,GAAG;AACrC,WAAO,CAAC,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,OAAO,CAAC,KAAK,MAAM;AAAA,EAC5D,OAAO;AACL,aAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,aAAO,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM;AAAA,IACxE;AAAA,EACF;AACA,SAAO,eAAe,EAAE,MAAM,WAAW,MAAM,OAAO,CAAC;AACzD;AAGO,SAAS,UAAU,OAAe,cAAc,MAAc;AACnE,SAAO,aAAa,KAAK,IAAI,MAAM,OAAO,OAAO,WAAW,IAAI,QAAQ,OAAO,WAAW;AAC5F;;;ACnJO,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAO3B,SAAS,aAAa,YAA4B;AACvD,SAAO,iBAAiB,YAAY,kBAAkB,KAAK,qBACvD,qBACA;AACN;AA8EA,IAAM,oBAAoB;AAW1B,IAAM,mBAAmB;AAElB,SAAS,QAAQ,OAA0B,WAA2B;AAC3E,MAAI;AACF,UAAM,YAAY,CAAC,QACjB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC;AAE9D,UAAM,SACJ,UAAU,kBAAkB,KAAK,UAAU,iBAAiB,IACxD,qBACA;AAQN,UAAM,OAAO,UAAU,SAAS;AAChC,UAAM,OAAO,UAAU,MAAM,IAAI;AACjC,WAAO,QAAQ,qBAAqB,OAAO,mBAAmB,SAAS;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACjGO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBO,IAAM,gBAAsD;AAAA;AAAA,EAEjE,SAAS,EAAE,UAAU,QAAQ,YAAY,MAAM,eAAe,WAAW,cAAc,IAAI;AAAA,EAC3F,IAAI,EAAE,UAAU,QAAQ,YAAY,KAAK,eAAe,WAAW,cAAc,IAAI;AAAA,EACrF,IAAI,EAAE,UAAU,WAAW,YAAY,MAAM,eAAe,YAAY,cAAc,IAAI;AAAA,EAC1F,IAAI,EAAE,UAAU,UAAU,YAAY,KAAK,eAAe,WAAW,cAAc,IAAI;AAAA,EACvF,IAAI,EAAE,UAAU,WAAW,YAAY,MAAM,eAAe,YAAY,cAAc,IAAI;AAAA,EAC1F,IAAI,EAAE,UAAU,YAAY,YAAY,KAAK,cAAc,IAAI;AAAA,EAC/D,IAAI,EAAE,UAAU,QAAQ,YAAY,KAAK,cAAc,IAAI;AAC7D;;;ACzEA,IAAM,UAAU;AAGT,SAAS,cAAc,OAAoC,UAA0B;AAC1F,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAO,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,IAAI,IAAI,SAAS,UAAU;AAC5E;AAGO,SAAS,gBAAgB,OAA+C;AAC7E,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAO,MAAM,SAAS,IAAI,IAAI,SAAS,UAAU;AACnD;;;ACyGA,IAAM,eAAe;AAGd,IAAM,KAAK,CAAC,UAA0B,GAAG,QAAQ,YAAY;AAGpE,IAAM,eAAe;AAEd,IAAM,OAAmC;AAAA,EAC9C,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAOO,IAAM,gBAA6E;AAAA,EACxF,OAAO,EAAE,SAAS,WAAW,WAAW,UAAU;AAAA,EAClD,MAAM,EAAE,SAAS,WAAW,WAAW,UAAU;AACnD;AAGA,IAAM,oBAGF;AAAA,EACF,OAAO;AAAA,IACL,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,OAAO;AAAA,IACpF,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,OAAO;AAAA,IACpF,MAAM,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,OAAO;AAAA,IACjF,QAAQ,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,OAAO;AAAA,EACrF;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,kBAAkB;AAAA,IAC/F,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,kBAAkB;AAAA,IAC/F,MAAM,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,kBAAkB;AAAA,IAC5F,QAAQ,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,WAAW,cAAc,OAAO;AAAA,EACrF;AACF;AAEA,IAAM,gBAGF;AAAA,EACF,OAAO;AAAA,IACL,MAAM,EAAE,SAAS,mBAAmB,WAAW,sBAAsB,UAAU,sBAAsB;AAAA,IACrG,YAAY,EAAE,SAAS,QAAQ,OAAO,OAAO;AAAA,IAC7C,SAAS;AAAA,IACT,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,SAAS,QAAQ,WAAW,4BAA4B,UAAU,2BAA2B;AAAA,IACrG,YAAY,EAAE,SAAS,WAAW,OAAO,UAAU;AAAA,IACnD,SAAS;AAAA,IACT,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAOO,SAAS,aAAa,MAAqC;AAChE,QAAM,UAAU,OAAO,SAAS,WAAW,EAAE,MAAM,KAAK,IAAI;AAC5D,QAAM,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AACtD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,QAAQ,SAAS,QAAQ,MAAM,YAAY;AAAA,IAClD,MAAM,QAAQ,QAAQ,OAAO,MAAM,eAAe,GAAG;AAAA,IACrD,cAAc,QAAQ,gBAAgB,aAAa,IAAI;AAAA,EACzD;AACF;AAEA,IAAM,WAAW,CACf,MACA,KACA,SACoB,SAAS,SAAY,kBAAkB,IAAI,EAAE,GAAG,IAAI,aAAa,IAAI;AAGpF,IAAM,UAA0B;AAAA,EACrC,MAAM,KAAK,GAAG;AAAA,EACd,OAAO,KAAK,GAAG;AAAA,EACf,MAAM,KAAK,GAAG;AAAA,EACd,cAAc;AAChB;AAGO,IAAM,aAA4C;AAAA,EACvD,IAAI,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,EACpC,IAAI,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,EACpC,IAAI,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,EACpC,IAAI,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,EACpC,IAAI,EAAE,UAAU,IAAI,YAAY,IAAI;AACtC;AAEO,IAAM,eAA6C;AAAA,EACxD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACR;AAIA,IAAM,gBAAgB,OAAO;AAAA,EAC3B,OAAO,QAAQ,aAAa,EAAE,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM;AAAA,IACtD;AAAA,IACA;AAAA,MACE,UAAU,cAAc,QAAQ,UAAU,YAAY;AAAA,MACtD,YAAY,QAAQ;AAAA,MACpB,eAAe,gBAAgB,QAAQ,aAAa;AAAA,MACpD,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF,CAAC;AACH;AAEO,IAAM,kBAAkB;AACxB,IAAM,4BAA4B;AAMlC,SAAS,cAAc,UAA0B,CAAC,GAAY;AACnE,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,QAAQ,QAAQ,WAAW,CAAC;AAClC,QAAM,QAAQ,cAAc,IAAI;AAChC,QAAM,WAAW,cAAc,IAAI;AACnC,QAAM,cAAc,QAAQ,eAAe;AAE3C,QAAM,UAAqB;AAAA,IACzB;AAAA,IACA,SAAS,aAAa,MAAM,WAAW,MAAM,OAAO;AAAA,IACpD,WAAW,aAAa,MAAM,aAAa,MAAM,SAAS;AAAA,IAC1D,SAAS,SAAS,MAAM,WAAW,MAAM,OAAO;AAAA,IAChD,SAAS,SAAS,MAAM,WAAW,MAAM,OAAO;AAAA,IAChD,MAAM,SAAS,MAAM,QAAQ,MAAM,IAAI;AAAA,IACvC,QAAQ,SAAS,MAAM,UAAU,MAAM,MAAM;AAAA,IAC7C,SAAS;AAAA,IACT,MAAM,SAAS;AAAA,IACf,YAAY,EAAE,GAAG,SAAS,YAAY,GAAG,MAAM,WAAW;AAAA,IAC1D,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS;AAAA,IACjB,MAAM;AAAA,EACR;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,CAAC,UAAkB,QAAQ;AAAA,IACpC;AAAA,IACA,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,MAAM,KAAK;AAAA,IAClD,YAAY;AAAA,MACV,YAAY,QAAQ,YAAY;AAAA,MAChC,qBAAqB,QAAQ,YAAY;AAAA,MACzC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,QAAQ,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,EACnF;AACF;AAKO,IAAM,mBAA4B,cAAc;","names":[]}