@12-apps/ui 6.27.0 → 6.27.2
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.
- package/dist/_internal/components/data-display/Alert/Alert.js +5 -4
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +4 -3
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
- package/dist/_internal/components/data-display/Avatar/Avatar.js +5 -4
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +3 -2
- package/dist/_internal/components/data-display/Badge/Badge.animations.js +4 -3
- package/dist/_internal/components/data-display/Badge/Badge.js +8 -7
- package/dist/_internal/components/data-display/Badge/Badge.metrics.js +3 -2
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +6 -5
- package/dist/_internal/components/data-display/Badge/Badge.variants.js +4 -3
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +7 -6
- package/dist/_internal/components/data-display/Banner/Banner.js +5 -4
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +4 -3
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +5 -4
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +6 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +10 -9
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -4
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +2 -1
- package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -4
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +2 -1
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +2 -1
- package/dist/_internal/components/data-display/Chart/Chart.js +2 -1
- package/dist/_internal/components/data-display/Chart/SpecChart.js +5 -4
- package/dist/_internal/components/data-display/Chart/chart-context.js +2 -1
- package/dist/_internal/components/data-display/Chart/chart-internals.js +2 -1
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -1
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +5 -4
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +42 -41
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +61 -60
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +9 -8
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +10 -9
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +15 -14
- package/dist/_internal/components/data-display/DataViews/base-card.js +11 -10
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +12 -11
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +4 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +8 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +17 -16
- package/dist/_internal/components/data-display/DataViews/card-surface.js +5 -4
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +5 -4
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +10 -9
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +5 -4
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +7 -6
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +7 -6
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -11
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +5 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +38 -37
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +5 -4
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +17 -16
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +9 -8
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +7 -6
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +15 -14
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +22 -21
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +14 -13
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +7 -6
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +5 -4
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +8 -7
- package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +5 -4
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +15 -15
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +11 -11
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +18 -17
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +4 -4
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +10 -10
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/Progress/Progress.js +5 -4
- package/dist/_internal/components/data-display/Progress/Progress.metrics.js +3 -2
- package/dist/_internal/components/data-display/Progress/Progress.styles.js +4 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +2 -1
- package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +2 -1
- package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.js +2 -2
- package/dist/_internal/components/data-display/index.js +64 -63
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +5 -4
- package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
- package/dist/_internal/components/feedback/index.js +9 -8
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +6 -6
- package/dist/_internal/components/form/Button/Button.js +4 -3
- package/dist/_internal/components/form/Button/Button.styles.js +3 -2
- package/dist/_internal/components/form/Calendar/Calendar.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +6 -6
- package/dist/_internal/components/form/CepField/CepField.js +3 -3
- package/dist/_internal/components/form/Checkbox/Checkbox.js +3 -2
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
- package/dist/_internal/components/form/Command/Command.js +4 -3
- package/dist/_internal/components/form/Command/Command.styles.js +2 -1
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +3 -3
- package/dist/_internal/components/form/Input/Input.js +2 -2
- package/dist/_internal/components/form/Label/Label.js +2 -1
- package/dist/_internal/components/form/Label/Label.styles.js +2 -1
- package/dist/_internal/components/form/Menubar/Menubar.item.js +2 -1
- package/dist/_internal/components/form/Menubar/Menubar.js +2 -1
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +2 -1
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -1
- package/dist/_internal/components/form/Switch/Switch.js +5 -4
- package/dist/_internal/components/form/Switch/Switch.parts.js +4 -3
- package/dist/_internal/components/form/Switch/Switch.styles.js +3 -2
- package/dist/_internal/components/form/index.js +24 -23
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +7 -7
- package/dist/_internal/components/form/total-form/Fields/CepField.js +4 -4
- package/dist/_internal/components/form/total-form/Fields/TextField.js +3 -3
- package/dist/_internal/components/form/total-form/Fields/index.js +15 -15
- package/dist/_internal/components/form/total-form/SubmitButton.js +5 -4
- package/dist/_internal/components/index.js +112 -111
- package/dist/_internal/components/layout/Box/Box.js +5 -4
- package/dist/_internal/components/layout/Card/Card.js +2 -2
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +4 -4
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +2 -2
- package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +6 -5
- package/dist/_internal/components/layout/index.js +9 -9
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +9 -8
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +2 -1
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
- package/dist/_internal/components/navigation/Tabs/Tabs.js +2 -2
- package/dist/_internal/components/navigation/index.js +18 -17
- package/dist/_internal/components/typography/Heading/Heading.js +5 -4
- package/dist/_internal/components/typography/Heading/Heading.metrics.js +3 -2
- package/dist/_internal/components/typography/Heading/Heading.styles.js +4 -3
- package/dist/_internal/components/typography/Paragraph/Paragraph.js +3 -2
- package/dist/_internal/components/typography/Text/Text.js +4 -3
- package/dist/_internal/components/typography/Text/Text.metrics.js +3 -2
- package/dist/_internal/components/typography/index.js +8 -7
- package/dist/_internal/icons/Icon.js +5 -4
- package/dist/_internal/provider/UiProvider.js +4 -3
- package/dist/_internal/provider/mui-bridge.js +3 -2
- package/dist/_internal/provider/use-ui-theme.js +4 -3
- package/dist/_internal/social-login-button/social-login-button.js +12 -11
- package/dist/_internal/tokens/ink-over.js +17 -0
- package/dist/_internal/tokens/ink-over.js.map +1 -0
- package/dist/_internal/tokens/theme.js +5 -3
- package/dist/_internal/user-avatar/user-avatar.js +12 -11
- package/dist/charts.js +13 -12
- package/dist/{chunk-Q3GSDSK2.js → chunk-236QP424.js} +2 -2
- package/dist/{chunk-JFRKBSWI.js → chunk-237NDIT2.js} +2 -2
- package/dist/chunk-2BYKTBDL.js +33 -0
- package/dist/chunk-2BYKTBDL.js.map +1 -0
- package/dist/{chunk-TQOPF7LD.js → chunk-2L2NWXWJ.js} +2 -2
- package/dist/{chunk-M4NFXC5R.js → chunk-2WSU6OGE.js} +5 -5
- package/dist/{chunk-SZETT7QV.js → chunk-35UG2QDB.js} +2 -2
- package/dist/{chunk-72T5PAW7.js → chunk-3BPDHWVF.js} +9 -9
- package/dist/{chunk-EOHKZGOZ.js → chunk-3PUOLOEP.js} +2 -2
- package/dist/{chunk-ECMJ5VPW.js → chunk-3TFUAKWJ.js} +2 -2
- package/dist/{chunk-4ETQRBZC.js → chunk-46UPILLK.js} +4 -4
- package/dist/{chunk-6VHCSPKK.js → chunk-4H4Y2SX3.js} +3 -3
- package/dist/{chunk-L7S6N67X.js → chunk-4OSGKO7E.js} +2 -2
- package/dist/{chunk-UG76BO5K.js → chunk-5KFZGB5U.js} +2 -2
- package/dist/{chunk-FF3R67WD.js → chunk-5UC2RNOY.js} +4 -4
- package/dist/{chunk-65METCKT.js → chunk-6R567DH4.js} +17 -17
- package/dist/{chunk-G2JPUHEJ.js → chunk-AIBNBWQU.js} +2 -2
- package/dist/{chunk-AIRWM7KK.js → chunk-AVI3XHRQ.js} +4 -4
- package/dist/{chunk-IE7ISTLQ.js → chunk-B443IIQG.js} +4 -4
- package/dist/{chunk-WETAIIKC.js → chunk-BBYCZZBH.js} +2 -2
- package/dist/{chunk-CKJI7JO5.js → chunk-BEWD734I.js} +2 -2
- package/dist/{chunk-RRX6ZTNX.js → chunk-BLT5ZBVL.js} +2 -2
- package/dist/{chunk-MDTSMJ7C.js → chunk-BYMWW65P.js} +3 -3
- package/dist/{chunk-Q3OFOOO7.js → chunk-C5EFVSBN.js} +2 -2
- package/dist/{chunk-Y55ILY2F.js → chunk-C5YBXQTK.js} +3 -3
- package/dist/{chunk-YANLN6HP.js → chunk-D6HDJVQW.js} +5 -5
- package/dist/{chunk-QXFPTRHB.js → chunk-DACURY25.js} +3 -3
- package/dist/{chunk-DIHVWBQV.js → chunk-DEE6IPGI.js} +32 -6
- package/dist/chunk-DEE6IPGI.js.map +1 -0
- package/dist/{chunk-ZA4U5GDU.js → chunk-DORPR2YP.js} +2 -2
- package/dist/{chunk-6YLAVHV4.js → chunk-DTKMBI7B.js} +4 -4
- package/dist/{chunk-JXNT5TUP.js → chunk-DVEYD27F.js} +2 -2
- package/dist/{chunk-CMN26J5Y.js → chunk-E6D2Y5EK.js} +2 -2
- package/dist/{chunk-HKB5C2KY.js → chunk-EMAX7RPN.js} +5 -5
- package/dist/{chunk-ZAJO2B75.js → chunk-EPRA5QLB.js} +2 -2
- package/dist/{chunk-ERX4XIYC.js → chunk-EUKYQXYU.js} +2 -2
- package/dist/{chunk-C3CMEDSO.js → chunk-EVXFEXBS.js} +2 -2
- package/dist/{chunk-OGHW7RQC.js → chunk-EZMCWRXO.js} +2 -2
- package/dist/{chunk-DYESJJ3Q.js → chunk-EZNTM6PT.js} +4 -4
- package/dist/{chunk-67ALTEWH.js → chunk-FGKKLHKY.js} +2 -2
- package/dist/{chunk-SC72DRTX.js → chunk-FJGHP2QW.js} +7 -7
- package/dist/{chunk-45OHGD2B.js → chunk-FJQ5CH4Q.js} +4 -4
- package/dist/{chunk-OXYR2HVK.js → chunk-FOKBP6HR.js} +10 -10
- package/dist/{chunk-22X7TT6Z.js → chunk-FR6AJSMT.js} +5 -5
- package/dist/{chunk-QE2C35TO.js → chunk-FUT7HGWZ.js} +5 -5
- package/dist/{chunk-TUO47RL2.js → chunk-FVPN4YKW.js} +4 -4
- package/dist/{chunk-ZDWU52DJ.js → chunk-G5ZVD5IJ.js} +2 -2
- package/dist/{chunk-NPN7JTRM.js → chunk-GH2DC7PS.js} +4 -4
- package/dist/{chunk-77DF5LKI.js → chunk-GJUIZ5FN.js} +2 -2
- package/dist/{chunk-YJ4HM25H.js → chunk-GLWW2XCP.js} +2 -2
- package/dist/{chunk-7AIHK2XM.js → chunk-H53YNR23.js} +6 -6
- package/dist/{chunk-GT7C6TSM.js → chunk-HDNK7BAX.js} +3 -3
- package/dist/{chunk-7NEUPEV5.js → chunk-HQB5XNK5.js} +2 -2
- package/dist/{chunk-NNXZ5RK5.js → chunk-IQ7WZ3RN.js} +4 -4
- package/dist/{chunk-7KEGJH3Q.js → chunk-IVVOIDE5.js} +3 -3
- package/dist/{chunk-SSWZHR46.js → chunk-J3ZP6EUS.js} +5 -5
- package/dist/{chunk-YPILHGEO.js → chunk-J6CSPDC7.js} +2 -2
- package/dist/{chunk-RRO2EOJB.js → chunk-JB67KPGM.js} +4 -4
- package/dist/{chunk-KAV63FBG.js → chunk-JLBHH2JU.js} +2 -2
- package/dist/{chunk-V5P5Q6HM.js → chunk-JOXBCXVL.js} +8 -8
- package/dist/{chunk-LO2B7FDQ.js → chunk-JPVDZXXX.js} +2 -2
- package/dist/{chunk-P7FQUGED.js → chunk-JRWPI4XF.js} +5 -5
- package/dist/{chunk-OVGASVPW.js → chunk-JVVTSSS4.js} +2 -2
- package/dist/{chunk-IASDP44E.js → chunk-K4N3V7YE.js} +4 -4
- package/dist/{chunk-L7LCSZ3H.js → chunk-K7DCYV5Q.js} +3 -3
- package/dist/{chunk-O7HLQTB7.js → chunk-KCAGCDCQ.js} +3 -3
- package/dist/{chunk-B5SW7I5W.js → chunk-L4D6YLLU.js} +2 -2
- package/dist/{chunk-FOF2RAVQ.js → chunk-L6TCIZFR.js} +4 -4
- package/dist/{chunk-7Z2AQEC5.js → chunk-LCXXPIG3.js} +2 -2
- package/dist/{chunk-5QUSX3TC.js → chunk-LQRJCEFO.js} +5 -5
- package/dist/{chunk-MQPT254A.js → chunk-LSJY4LWZ.js} +4 -4
- package/dist/{chunk-27BL3DNT.js → chunk-MC2WCZK5.js} +13 -13
- package/dist/{chunk-CA7TA36R.js → chunk-MGPA6KTM.js} +2 -2
- package/dist/{chunk-GQJ4NCZ6.js → chunk-MNSW33DU.js} +4 -4
- package/dist/{chunk-MYH7VISV.js → chunk-MSUSZLRE.js} +5 -5
- package/dist/{chunk-WKF54CCK.js → chunk-MVJYIHPH.js} +5 -5
- package/dist/{chunk-EQA4VQEO.js → chunk-NGM5XKAS.js} +2 -2
- package/dist/{chunk-PKFFJAQ6.js → chunk-NGVGTMHT.js} +2 -2
- package/dist/{chunk-3GB6KWHH.js → chunk-NUB4T3RQ.js} +2 -2
- package/dist/{chunk-GTLJYAEG.js → chunk-NWQWUYOV.js} +2 -2
- package/dist/{chunk-4A2Q22HO.js → chunk-O42ZA3TW.js} +3 -3
- package/dist/{chunk-DTIB5KWP.js → chunk-OJCK5RNJ.js} +3 -3
- package/dist/{chunk-OAWEUKUC.js → chunk-OLQDB346.js} +2 -2
- package/dist/{chunk-4IVOHL32.js → chunk-OP6F3NXX.js} +2 -2
- package/dist/{chunk-DWJBOR47.js → chunk-P3NRT6GV.js} +4 -4
- package/dist/{chunk-GBX5ACPF.js → chunk-PCYGUOWJ.js} +4 -4
- package/dist/{chunk-3PJLT5FX.js → chunk-PFZAUMJA.js} +5 -3
- package/dist/{chunk-3PJLT5FX.js.map → chunk-PFZAUMJA.js.map} +1 -1
- package/dist/{chunk-N5PY7IXI.js → chunk-PJTSGHTY.js} +2 -2
- package/dist/{chunk-AGYGNNOM.js → chunk-PQECNGDE.js} +2 -2
- package/dist/{chunk-XNOSTV5F.js → chunk-PTP3CZL4.js} +2 -2
- package/dist/{chunk-X5RDHO6G.js → chunk-QPDDS6DQ.js} +2 -2
- package/dist/{chunk-6SK3MTYJ.js → chunk-QSKJLMNS.js} +4 -4
- package/dist/{chunk-GYQT47YZ.js → chunk-QTZ7I6QS.js} +2 -2
- package/dist/{chunk-WBKWIFXA.js → chunk-QYNCPS5W.js} +6 -6
- package/dist/{chunk-FGK2C7JR.js → chunk-RVGG5YJY.js} +2 -2
- package/dist/{chunk-7FOOLP5H.js → chunk-RXSGHPCR.js} +4 -4
- package/dist/{chunk-LUMF63BM.js → chunk-SFAP5EH5.js} +4 -4
- package/dist/{chunk-DW6GBMLQ.js → chunk-SLMA4UQS.js} +3 -3
- package/dist/{chunk-JD3D6Y4U.js → chunk-SOJQEJAE.js} +7 -7
- package/dist/{chunk-QLI7ES7Z.js → chunk-SONWG2RT.js} +5 -18
- package/dist/chunk-SONWG2RT.js.map +1 -0
- package/dist/{chunk-BBC4KT5G.js → chunk-SQV3HPTZ.js} +23 -5
- package/dist/chunk-SQV3HPTZ.js.map +1 -0
- package/dist/{chunk-LGJ2H4AH.js → chunk-SUWIHCD6.js} +8 -8
- package/dist/{chunk-IV5QQLCS.js → chunk-T2VO32Z2.js} +2 -2
- package/dist/{chunk-VK4ULJFH.js → chunk-T5WNNEP5.js} +2 -2
- package/dist/{chunk-FRW4SYZD.js → chunk-TEE6HNHS.js} +4 -4
- package/dist/{chunk-2LSCK45B.js → chunk-TSEWUY4V.js} +5 -3
- package/dist/{chunk-2LSCK45B.js.map → chunk-TSEWUY4V.js.map} +1 -1
- package/dist/{chunk-DTC224UJ.js → chunk-TX3ZHO5R.js} +5 -5
- package/dist/{chunk-H3BQFEN5.js → chunk-UC6A6ASM.js} +2 -2
- package/dist/{chunk-GSTRPZS4.js → chunk-UKPZVX3J.js} +2 -2
- package/dist/{chunk-EPNCYUQ7.js → chunk-UN5INW6K.js} +4 -4
- package/dist/{chunk-UGL6SJN6.js → chunk-UQNB2W2I.js} +3 -3
- package/dist/{chunk-P7IVAMAU.js → chunk-V7F53GEO.js} +7 -7
- package/dist/{chunk-ZC7RQDZ5.js → chunk-VESIQYBF.js} +5 -5
- package/dist/{chunk-2KVQIGVE.js → chunk-VKH7AENA.js} +2 -2
- package/dist/{chunk-SMZBGHR2.js → chunk-VRKS5K4N.js} +5 -5
- package/dist/{chunk-PW2WLDX3.js → chunk-VVXA7T2M.js} +2 -2
- package/dist/{chunk-2SWQ6HIK.js → chunk-W3FAKT3D.js} +4 -4
- package/dist/{chunk-QQLGSMGE.js → chunk-W5CW7JFZ.js} +2 -2
- package/dist/{chunk-HOJL2GKW.js → chunk-WC3W36AM.js} +4 -4
- package/dist/{chunk-3VZT2FAI.js → chunk-WC5XYWTE.js} +3 -3
- package/dist/{chunk-RFZU5BTG.js → chunk-WYDGPJ3Z.js} +4 -4
- package/dist/{chunk-KOFO6QZY.js → chunk-XGOWREVV.js} +2 -2
- package/dist/{chunk-DF2FFYZ7.js → chunk-XSJWN3WH.js} +7 -7
- package/dist/{chunk-DB2MAYPK.js → chunk-XV2TDULR.js} +2 -2
- package/dist/{chunk-4OHRZW7U.js → chunk-XXE6NTJB.js} +4 -4
- package/dist/{chunk-4G3FGCWX.js → chunk-XXJRT6BP.js} +2 -2
- package/dist/{chunk-LV4UTYAD.js → chunk-XYDW5RQB.js} +2 -2
- package/dist/{chunk-QRX5BYUQ.js → chunk-Y6KPZQPI.js} +4 -4
- package/dist/{chunk-7VN7LFBA.js → chunk-YD77RANW.js} +5 -5
- package/dist/{chunk-77OXG6DH.js → chunk-YFY3YVV6.js} +7 -7
- package/dist/{chunk-PENJBKPH.js → chunk-YTYROOLY.js} +3 -3
- package/dist/data-display/Alert.js +5 -4
- package/dist/data-display/AsyncStateContainer.js +4 -4
- package/dist/data-display/Avatar.js +5 -4
- package/dist/data-display/Badge.js +8 -7
- package/dist/data-display/Banner.js +5 -4
- package/dist/data-display/CardKit.js +11 -10
- package/dist/data-display/Carousel.js +5 -4
- package/dist/data-display/Chart.js +13 -12
- package/dist/data-display/DataViews.js +80 -79
- package/dist/data-display/DescriptionItem.js +5 -4
- package/dist/data-display/FleetMap.js +18 -17
- package/dist/data-display/LazyImage.js +3 -3
- package/dist/data-display/Lightbox.js +4 -4
- package/dist/data-display/LoadingState.js +3 -3
- package/dist/data-display/MapPreview.js +10 -10
- package/dist/data-display/Progress.js +5 -4
- package/dist/data-display/Sheet.js +4 -3
- package/dist/data-display/StatCard.js +3 -3
- package/dist/data-display/Table.js +2 -2
- package/dist/feedback/ConfirmAction.js +5 -4
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/TutorialOverlay.js +2 -2
- package/dist/form/AddressAutocomplete.js +6 -6
- package/dist/form/Button.js +4 -3
- package/dist/form/Calendar.js +2 -2
- package/dist/form/CategorySelect.js +8 -8
- package/dist/form/CepField.js +3 -3
- package/dist/form/Checkbox.js +3 -2
- package/dist/form/CodeEditor.js +2 -2
- package/dist/form/Command.js +4 -3
- package/dist/form/DateRangePicker.js +3 -3
- package/dist/form/Input.js +2 -2
- package/dist/form/Label.js +2 -1
- package/dist/form/Menubar.js +2 -1
- package/dist/form/Switch.js +5 -4
- package/dist/form/total-form.js +20 -19
- package/dist/icons.js +5 -4
- package/dist/layout/Box.js +5 -4
- package/dist/layout/Card.js +2 -2
- package/dist/layout/ContentToolbar.js +3 -3
- package/dist/layout/ScrollArea.js +2 -2
- package/dist/layout/SettingsLayout.js +6 -6
- package/dist/layout/Skeleton.js +2 -2
- package/dist/layout/Stack.js +6 -5
- package/dist/native/chunks/{chunk-XI7HTAVN.js → chunk-2HLEFYJ5.js} +2 -2
- package/dist/native/chunks/{chunk-UYREIOEM.js → chunk-6XDMYJBW.js} +2 -2
- package/dist/native/chunks/{chunk-6L4UZBQP.js → chunk-BEPOBULQ.js} +3 -3
- package/dist/native/chunks/{chunk-ZOP7UAZK.js → chunk-CO47ZRXO.js} +2 -2
- package/dist/native/chunks/{chunk-UII3IFLP.js → chunk-NVPXIJ2O.js} +2 -2
- package/dist/native/chunks/{chunk-2SBTJSQE.js → chunk-SOQVMWLQ.js} +5 -5
- package/dist/native/chunks/{chunk-MP3UDWTT.js → chunk-YQDDM6ZW.js} +24 -17
- package/dist/native/chunks/chunk-YQDDM6ZW.js.map +1 -0
- package/dist/native/chunks/{chunk-QEQZ5AF6.js → chunk-YXM4NR2B.js} +3 -3
- package/dist/native/data-display/Alert.js +3 -3
- package/dist/native/data-display/Avatar.js +3 -3
- package/dist/native/data-display/Badge.js +3 -3
- package/dist/native/data-display/Chip.js +3 -3
- package/dist/native/data-display/EmptyState.js +5 -5
- package/dist/native/data-display/ErrorState.js +4 -4
- package/dist/native/data-display/FleetMap.js +6 -6
- package/dist/native/data-display/LoadingState.js +2 -2
- package/dist/native/data-display/Progress.js +2 -2
- package/dist/native/feedback/Dialog.js +3 -3
- package/dist/native/form/Button.js +3 -3
- package/dist/native/form/Checkbox.js +3 -3
- package/dist/native/form/Input.js +3 -3
- package/dist/native/form/Select.js +4 -4
- package/dist/native/form/Switch.js +2 -2
- package/dist/native/icons.js +3 -3
- package/dist/native/layout/Box.js +3 -3
- package/dist/native/layout/Card.js +2 -2
- package/dist/native/layout/Container.js +2 -2
- package/dist/native/layout/Skeleton.js +3 -3
- package/dist/native/layout/Spacer.js +2 -2
- package/dist/native/layout/Stack.js +3 -3
- package/dist/native/provider.js +2 -2
- package/dist/native/tokens.js +1 -1
- package/dist/native/typography/Heading.js +2 -2
- package/dist/native/typography/Paragraph.js +2 -2
- package/dist/native/typography/Text.js +2 -2
- package/dist/navigation/AppHeader.js +11 -10
- package/dist/navigation/NavigationMenu.js +5 -5
- package/dist/navigation/Tabs.js +2 -2
- package/dist/provider.js +5 -4
- package/dist/social-login-button.js +12 -11
- package/dist/tokens.js +5 -3
- package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
- package/dist/types/tokens/ink-over.d.ts +12 -0
- package/dist/types/tokens/ink-over.d.ts.map +1 -0
- package/dist/types/tokens/theme.d.ts +2 -44
- package/dist/types/tokens/theme.d.ts.map +1 -1
- package/dist/types-native/tokens/ink-over.d.ts +12 -0
- package/dist/types-native/tokens/ink-over.d.ts.map +1 -0
- package/dist/types-native/tokens/theme.d.ts +2 -44
- package/dist/types-native/tokens/theme.d.ts.map +1 -1
- package/dist/typography/Heading.js +5 -4
- package/dist/typography/Paragraph.js +3 -2
- package/dist/typography/Text.js +4 -3
- package/dist/user-avatar.js +12 -11
- package/package.json +1 -1
- package/src/components/form/Switch/Switch.styles.ts +29 -3
- package/src/components/navigation/Tabs/Tabs.tsx +46 -1
- package/src/tokens/ink-over.ts +142 -0
- package/src/tokens/theme.ts +10 -65
- package/dist/chunk-BBC4KT5G.js.map +0 -1
- package/dist/chunk-DIHVWBQV.js.map +0 -1
- package/dist/chunk-QLI7ES7Z.js.map +0 -1
- package/dist/native/chunks/chunk-MP3UDWTT.js.map +0 -1
- /package/dist/{chunk-Q3GSDSK2.js.map → chunk-236QP424.js.map} +0 -0
- /package/dist/{chunk-JFRKBSWI.js.map → chunk-237NDIT2.js.map} +0 -0
- /package/dist/{chunk-TQOPF7LD.js.map → chunk-2L2NWXWJ.js.map} +0 -0
- /package/dist/{chunk-M4NFXC5R.js.map → chunk-2WSU6OGE.js.map} +0 -0
- /package/dist/{chunk-SZETT7QV.js.map → chunk-35UG2QDB.js.map} +0 -0
- /package/dist/{chunk-72T5PAW7.js.map → chunk-3BPDHWVF.js.map} +0 -0
- /package/dist/{chunk-EOHKZGOZ.js.map → chunk-3PUOLOEP.js.map} +0 -0
- /package/dist/{chunk-ECMJ5VPW.js.map → chunk-3TFUAKWJ.js.map} +0 -0
- /package/dist/{chunk-4ETQRBZC.js.map → chunk-46UPILLK.js.map} +0 -0
- /package/dist/{chunk-6VHCSPKK.js.map → chunk-4H4Y2SX3.js.map} +0 -0
- /package/dist/{chunk-L7S6N67X.js.map → chunk-4OSGKO7E.js.map} +0 -0
- /package/dist/{chunk-UG76BO5K.js.map → chunk-5KFZGB5U.js.map} +0 -0
- /package/dist/{chunk-FF3R67WD.js.map → chunk-5UC2RNOY.js.map} +0 -0
- /package/dist/{chunk-65METCKT.js.map → chunk-6R567DH4.js.map} +0 -0
- /package/dist/{chunk-G2JPUHEJ.js.map → chunk-AIBNBWQU.js.map} +0 -0
- /package/dist/{chunk-AIRWM7KK.js.map → chunk-AVI3XHRQ.js.map} +0 -0
- /package/dist/{chunk-IE7ISTLQ.js.map → chunk-B443IIQG.js.map} +0 -0
- /package/dist/{chunk-WETAIIKC.js.map → chunk-BBYCZZBH.js.map} +0 -0
- /package/dist/{chunk-CKJI7JO5.js.map → chunk-BEWD734I.js.map} +0 -0
- /package/dist/{chunk-RRX6ZTNX.js.map → chunk-BLT5ZBVL.js.map} +0 -0
- /package/dist/{chunk-MDTSMJ7C.js.map → chunk-BYMWW65P.js.map} +0 -0
- /package/dist/{chunk-Q3OFOOO7.js.map → chunk-C5EFVSBN.js.map} +0 -0
- /package/dist/{chunk-Y55ILY2F.js.map → chunk-C5YBXQTK.js.map} +0 -0
- /package/dist/{chunk-YANLN6HP.js.map → chunk-D6HDJVQW.js.map} +0 -0
- /package/dist/{chunk-QXFPTRHB.js.map → chunk-DACURY25.js.map} +0 -0
- /package/dist/{chunk-ZA4U5GDU.js.map → chunk-DORPR2YP.js.map} +0 -0
- /package/dist/{chunk-6YLAVHV4.js.map → chunk-DTKMBI7B.js.map} +0 -0
- /package/dist/{chunk-JXNT5TUP.js.map → chunk-DVEYD27F.js.map} +0 -0
- /package/dist/{chunk-CMN26J5Y.js.map → chunk-E6D2Y5EK.js.map} +0 -0
- /package/dist/{chunk-HKB5C2KY.js.map → chunk-EMAX7RPN.js.map} +0 -0
- /package/dist/{chunk-ZAJO2B75.js.map → chunk-EPRA5QLB.js.map} +0 -0
- /package/dist/{chunk-ERX4XIYC.js.map → chunk-EUKYQXYU.js.map} +0 -0
- /package/dist/{chunk-C3CMEDSO.js.map → chunk-EVXFEXBS.js.map} +0 -0
- /package/dist/{chunk-OGHW7RQC.js.map → chunk-EZMCWRXO.js.map} +0 -0
- /package/dist/{chunk-DYESJJ3Q.js.map → chunk-EZNTM6PT.js.map} +0 -0
- /package/dist/{chunk-67ALTEWH.js.map → chunk-FGKKLHKY.js.map} +0 -0
- /package/dist/{chunk-SC72DRTX.js.map → chunk-FJGHP2QW.js.map} +0 -0
- /package/dist/{chunk-45OHGD2B.js.map → chunk-FJQ5CH4Q.js.map} +0 -0
- /package/dist/{chunk-OXYR2HVK.js.map → chunk-FOKBP6HR.js.map} +0 -0
- /package/dist/{chunk-22X7TT6Z.js.map → chunk-FR6AJSMT.js.map} +0 -0
- /package/dist/{chunk-QE2C35TO.js.map → chunk-FUT7HGWZ.js.map} +0 -0
- /package/dist/{chunk-TUO47RL2.js.map → chunk-FVPN4YKW.js.map} +0 -0
- /package/dist/{chunk-ZDWU52DJ.js.map → chunk-G5ZVD5IJ.js.map} +0 -0
- /package/dist/{chunk-NPN7JTRM.js.map → chunk-GH2DC7PS.js.map} +0 -0
- /package/dist/{chunk-77DF5LKI.js.map → chunk-GJUIZ5FN.js.map} +0 -0
- /package/dist/{chunk-YJ4HM25H.js.map → chunk-GLWW2XCP.js.map} +0 -0
- /package/dist/{chunk-7AIHK2XM.js.map → chunk-H53YNR23.js.map} +0 -0
- /package/dist/{chunk-GT7C6TSM.js.map → chunk-HDNK7BAX.js.map} +0 -0
- /package/dist/{chunk-7NEUPEV5.js.map → chunk-HQB5XNK5.js.map} +0 -0
- /package/dist/{chunk-NNXZ5RK5.js.map → chunk-IQ7WZ3RN.js.map} +0 -0
- /package/dist/{chunk-7KEGJH3Q.js.map → chunk-IVVOIDE5.js.map} +0 -0
- /package/dist/{chunk-SSWZHR46.js.map → chunk-J3ZP6EUS.js.map} +0 -0
- /package/dist/{chunk-YPILHGEO.js.map → chunk-J6CSPDC7.js.map} +0 -0
- /package/dist/{chunk-RRO2EOJB.js.map → chunk-JB67KPGM.js.map} +0 -0
- /package/dist/{chunk-KAV63FBG.js.map → chunk-JLBHH2JU.js.map} +0 -0
- /package/dist/{chunk-V5P5Q6HM.js.map → chunk-JOXBCXVL.js.map} +0 -0
- /package/dist/{chunk-LO2B7FDQ.js.map → chunk-JPVDZXXX.js.map} +0 -0
- /package/dist/{chunk-P7FQUGED.js.map → chunk-JRWPI4XF.js.map} +0 -0
- /package/dist/{chunk-OVGASVPW.js.map → chunk-JVVTSSS4.js.map} +0 -0
- /package/dist/{chunk-IASDP44E.js.map → chunk-K4N3V7YE.js.map} +0 -0
- /package/dist/{chunk-L7LCSZ3H.js.map → chunk-K7DCYV5Q.js.map} +0 -0
- /package/dist/{chunk-O7HLQTB7.js.map → chunk-KCAGCDCQ.js.map} +0 -0
- /package/dist/{chunk-B5SW7I5W.js.map → chunk-L4D6YLLU.js.map} +0 -0
- /package/dist/{chunk-FOF2RAVQ.js.map → chunk-L6TCIZFR.js.map} +0 -0
- /package/dist/{chunk-7Z2AQEC5.js.map → chunk-LCXXPIG3.js.map} +0 -0
- /package/dist/{chunk-5QUSX3TC.js.map → chunk-LQRJCEFO.js.map} +0 -0
- /package/dist/{chunk-MQPT254A.js.map → chunk-LSJY4LWZ.js.map} +0 -0
- /package/dist/{chunk-27BL3DNT.js.map → chunk-MC2WCZK5.js.map} +0 -0
- /package/dist/{chunk-CA7TA36R.js.map → chunk-MGPA6KTM.js.map} +0 -0
- /package/dist/{chunk-GQJ4NCZ6.js.map → chunk-MNSW33DU.js.map} +0 -0
- /package/dist/{chunk-MYH7VISV.js.map → chunk-MSUSZLRE.js.map} +0 -0
- /package/dist/{chunk-WKF54CCK.js.map → chunk-MVJYIHPH.js.map} +0 -0
- /package/dist/{chunk-EQA4VQEO.js.map → chunk-NGM5XKAS.js.map} +0 -0
- /package/dist/{chunk-PKFFJAQ6.js.map → chunk-NGVGTMHT.js.map} +0 -0
- /package/dist/{chunk-3GB6KWHH.js.map → chunk-NUB4T3RQ.js.map} +0 -0
- /package/dist/{chunk-GTLJYAEG.js.map → chunk-NWQWUYOV.js.map} +0 -0
- /package/dist/{chunk-4A2Q22HO.js.map → chunk-O42ZA3TW.js.map} +0 -0
- /package/dist/{chunk-DTIB5KWP.js.map → chunk-OJCK5RNJ.js.map} +0 -0
- /package/dist/{chunk-OAWEUKUC.js.map → chunk-OLQDB346.js.map} +0 -0
- /package/dist/{chunk-4IVOHL32.js.map → chunk-OP6F3NXX.js.map} +0 -0
- /package/dist/{chunk-DWJBOR47.js.map → chunk-P3NRT6GV.js.map} +0 -0
- /package/dist/{chunk-GBX5ACPF.js.map → chunk-PCYGUOWJ.js.map} +0 -0
- /package/dist/{chunk-N5PY7IXI.js.map → chunk-PJTSGHTY.js.map} +0 -0
- /package/dist/{chunk-AGYGNNOM.js.map → chunk-PQECNGDE.js.map} +0 -0
- /package/dist/{chunk-XNOSTV5F.js.map → chunk-PTP3CZL4.js.map} +0 -0
- /package/dist/{chunk-X5RDHO6G.js.map → chunk-QPDDS6DQ.js.map} +0 -0
- /package/dist/{chunk-6SK3MTYJ.js.map → chunk-QSKJLMNS.js.map} +0 -0
- /package/dist/{chunk-GYQT47YZ.js.map → chunk-QTZ7I6QS.js.map} +0 -0
- /package/dist/{chunk-WBKWIFXA.js.map → chunk-QYNCPS5W.js.map} +0 -0
- /package/dist/{chunk-FGK2C7JR.js.map → chunk-RVGG5YJY.js.map} +0 -0
- /package/dist/{chunk-7FOOLP5H.js.map → chunk-RXSGHPCR.js.map} +0 -0
- /package/dist/{chunk-LUMF63BM.js.map → chunk-SFAP5EH5.js.map} +0 -0
- /package/dist/{chunk-DW6GBMLQ.js.map → chunk-SLMA4UQS.js.map} +0 -0
- /package/dist/{chunk-JD3D6Y4U.js.map → chunk-SOJQEJAE.js.map} +0 -0
- /package/dist/{chunk-LGJ2H4AH.js.map → chunk-SUWIHCD6.js.map} +0 -0
- /package/dist/{chunk-IV5QQLCS.js.map → chunk-T2VO32Z2.js.map} +0 -0
- /package/dist/{chunk-VK4ULJFH.js.map → chunk-T5WNNEP5.js.map} +0 -0
- /package/dist/{chunk-FRW4SYZD.js.map → chunk-TEE6HNHS.js.map} +0 -0
- /package/dist/{chunk-DTC224UJ.js.map → chunk-TX3ZHO5R.js.map} +0 -0
- /package/dist/{chunk-H3BQFEN5.js.map → chunk-UC6A6ASM.js.map} +0 -0
- /package/dist/{chunk-GSTRPZS4.js.map → chunk-UKPZVX3J.js.map} +0 -0
- /package/dist/{chunk-EPNCYUQ7.js.map → chunk-UN5INW6K.js.map} +0 -0
- /package/dist/{chunk-UGL6SJN6.js.map → chunk-UQNB2W2I.js.map} +0 -0
- /package/dist/{chunk-P7IVAMAU.js.map → chunk-V7F53GEO.js.map} +0 -0
- /package/dist/{chunk-ZC7RQDZ5.js.map → chunk-VESIQYBF.js.map} +0 -0
- /package/dist/{chunk-2KVQIGVE.js.map → chunk-VKH7AENA.js.map} +0 -0
- /package/dist/{chunk-SMZBGHR2.js.map → chunk-VRKS5K4N.js.map} +0 -0
- /package/dist/{chunk-PW2WLDX3.js.map → chunk-VVXA7T2M.js.map} +0 -0
- /package/dist/{chunk-2SWQ6HIK.js.map → chunk-W3FAKT3D.js.map} +0 -0
- /package/dist/{chunk-QQLGSMGE.js.map → chunk-W5CW7JFZ.js.map} +0 -0
- /package/dist/{chunk-HOJL2GKW.js.map → chunk-WC3W36AM.js.map} +0 -0
- /package/dist/{chunk-3VZT2FAI.js.map → chunk-WC5XYWTE.js.map} +0 -0
- /package/dist/{chunk-RFZU5BTG.js.map → chunk-WYDGPJ3Z.js.map} +0 -0
- /package/dist/{chunk-KOFO6QZY.js.map → chunk-XGOWREVV.js.map} +0 -0
- /package/dist/{chunk-DF2FFYZ7.js.map → chunk-XSJWN3WH.js.map} +0 -0
- /package/dist/{chunk-DB2MAYPK.js.map → chunk-XV2TDULR.js.map} +0 -0
- /package/dist/{chunk-4OHRZW7U.js.map → chunk-XXE6NTJB.js.map} +0 -0
- /package/dist/{chunk-4G3FGCWX.js.map → chunk-XXJRT6BP.js.map} +0 -0
- /package/dist/{chunk-LV4UTYAD.js.map → chunk-XYDW5RQB.js.map} +0 -0
- /package/dist/{chunk-QRX5BYUQ.js.map → chunk-Y6KPZQPI.js.map} +0 -0
- /package/dist/{chunk-7VN7LFBA.js.map → chunk-YD77RANW.js.map} +0 -0
- /package/dist/{chunk-77OXG6DH.js.map → chunk-YFY3YVV6.js.map} +0 -0
- /package/dist/{chunk-PENJBKPH.js.map → chunk-YTYROOLY.js.map} +0 -0
- /package/dist/native/chunks/{chunk-XI7HTAVN.js.map → chunk-2HLEFYJ5.js.map} +0 -0
- /package/dist/native/chunks/{chunk-UYREIOEM.js.map → chunk-6XDMYJBW.js.map} +0 -0
- /package/dist/native/chunks/{chunk-6L4UZBQP.js.map → chunk-BEPOBULQ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-ZOP7UAZK.js.map → chunk-CO47ZRXO.js.map} +0 -0
- /package/dist/native/chunks/{chunk-UII3IFLP.js.map → chunk-NVPXIJ2O.js.map} +0 -0
- /package/dist/native/chunks/{chunk-2SBTJSQE.js.map → chunk-SOQVMWLQ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-QEQZ5AF6.js.map → chunk-YXM4NR2B.js.map} +0 -0
|
@@ -59,6 +59,47 @@ const TABS_DEFAULTS: Partial<TabsProps> = {
|
|
|
59
59
|
disabled: false,
|
|
60
60
|
loading: false };
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* The props this component OWNS and MUI's `Tabs` does not understand (12-86).
|
|
64
|
+
*
|
|
65
|
+
* `rest` below is spread onto the DOM node, so anything left in it that React
|
|
66
|
+
* cannot place on an element is reported — five `does not recognize the … prop`
|
|
67
|
+
* warnings and three `Received false for a non-boolean attribute`, on every
|
|
68
|
+
* render, in the browser console and in every host's jsdom output.
|
|
69
|
+
*
|
|
70
|
+
* An explicit list rather than `Object.keys(TABS_DEFAULTS)`, because the two
|
|
71
|
+
* sets differ in both directions: `items`, `closeTabLabel`, `tabPanelProps` and
|
|
72
|
+
* `loadingComponent` have no default and still must not reach the DOM, while
|
|
73
|
+
* `orientation`, `centered` and `indicatorColor` are real MUI props that must.
|
|
74
|
+
* An omission rather than more destructuring, so a prop added to `TabsProps`
|
|
75
|
+
* costs a line here instead of an unused `_name` binding.
|
|
76
|
+
*
|
|
77
|
+
* Deliberately NOT here: `onFocus` and `onBlur`. They are ordinary DOM handlers
|
|
78
|
+
* that reach the element through `rest` and nowhere else, so listing them would
|
|
79
|
+
* silently stop them working.
|
|
80
|
+
*/
|
|
81
|
+
const OWN_PROPS = new Set<string>([
|
|
82
|
+
'items',
|
|
83
|
+
'closeTabLabel',
|
|
84
|
+
'color',
|
|
85
|
+
'size',
|
|
86
|
+
'fullWidth',
|
|
87
|
+
'scrollable',
|
|
88
|
+
'scrollButtons',
|
|
89
|
+
'sticky',
|
|
90
|
+
'stickyOffset',
|
|
91
|
+
'animateContent',
|
|
92
|
+
'animationDuration',
|
|
93
|
+
'persistContent',
|
|
94
|
+
'tabPanelProps',
|
|
95
|
+
'loading',
|
|
96
|
+
'loadingComponent',
|
|
97
|
+
]);
|
|
98
|
+
|
|
99
|
+
/** `props` with every {@link OWN_PROPS} key dropped — what is left is passthrough. */
|
|
100
|
+
const domPassthrough = (props: Record<string, unknown>): Record<string, unknown> =>
|
|
101
|
+
Object.fromEntries(Object.entries(props).filter(([key]) => !OWN_PROPS.has(key)));
|
|
102
|
+
|
|
62
103
|
// Strips explicitly-undefined props before the merge, so `prop={undefined}`
|
|
63
104
|
// still falls back to the default as a destructuring default would.
|
|
64
105
|
const definedProps = (props: TabsProps): Partial<TabsProps> =>
|
|
@@ -251,7 +292,11 @@ export const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(
|
|
|
251
292
|
<Box className={className} ref={ref} data-testid={dataTestId || 'tabs'}>
|
|
252
293
|
<TabsBar
|
|
253
294
|
{...resolved}
|
|
254
|
-
|
|
295
|
+
// The destructuring above drops the props this component USES;
|
|
296
|
+
// `domPassthrough` drops the ones it merely OWNS. Both have to go:
|
|
297
|
+
// `rest` is spread onto the DOM node, and the second group is where
|
|
298
|
+
// 12-86's warnings came from.
|
|
299
|
+
rest={domPassthrough(rest as unknown as Record<string, unknown>)}
|
|
255
300
|
onChange={handleChange}
|
|
256
301
|
onCloseTab={handleTabClose}
|
|
257
302
|
/>
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PRODUCT'S TWO INKS, AND THE TWO RULES FOR CHOOSING BETWEEN THEM.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `theme.ts` when that file reached the 400-line cap, and the seam
|
|
5
|
+
* is a real one rather than a place the knife happened to land: everything here
|
|
6
|
+
* answers one question — given a surface, which of the two inks goes on it —
|
|
7
|
+
* and nothing here builds a palette. `theme.ts` keeps the tables and the
|
|
8
|
+
* factories and imports the answers.
|
|
9
|
+
*
|
|
10
|
+
* Both functions stay exported from `theme.ts` as well, because both were
|
|
11
|
+
* published from there and a caller should not have to learn about this file.
|
|
12
|
+
*/
|
|
13
|
+
import { getContrastRatio } from './color';
|
|
14
|
+
|
|
15
|
+
/** MUI's `createPalette` contrast defaults, exactly. */
|
|
16
|
+
export const CONTRAST_THRESHOLD = 3;
|
|
17
|
+
export const DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';
|
|
18
|
+
export const LIGHT_TEXT_PRIMARY = '#fff';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* MUI's `getContrastText`: white where white reads at 3:1 on the colour, the
|
|
22
|
+
* light mode's dark ink otherwise. (MUI's source spells the white as the DARK
|
|
23
|
+
* palette's `text.primary`, which is what made it easy to read backwards.)
|
|
24
|
+
*/
|
|
25
|
+
export function contrastText(background: string): string {
|
|
26
|
+
return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD
|
|
27
|
+
? LIGHT_TEXT_PRIMARY
|
|
28
|
+
: DARK_TEXT_PRIMARY;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The ink that reads on EVERY one of these fills (FUT-1924).
|
|
33
|
+
*
|
|
34
|
+
* {@link contrastText} answers for one fill, which is all MUI's `augmentColor`
|
|
35
|
+
* ever needs: a solid button is a single flat colour. Two components paint the
|
|
36
|
+
* label over something that is not one colour — `Button`'s `gradient` variant
|
|
37
|
+
* runs between two stops, and `Switch`'s thumb travels the whole length of a
|
|
38
|
+
* checked track — and both of them stated `#fff` outright instead, which is
|
|
39
|
+
* white-on-pale the moment a white-labelled host hands the library a pale
|
|
40
|
+
* brand. Audited across the library, those two were the only places a hardcoded
|
|
41
|
+
* white sat over a surface the TENANT chooses.
|
|
42
|
+
*
|
|
43
|
+
* **This deliberately does not follow `contrastText`'s rule.** MUI's is a
|
|
44
|
+
* threshold that PREFERS white — white wherever white clears 3:1 — which is a
|
|
45
|
+
* brand-feel decision, and it is kept for every existing caller so nothing
|
|
46
|
+
* already legible moves. Here the fills can disagree: over MUI's own success
|
|
47
|
+
* pair white is 2.78:1 on `#4caf50` and dark ink 2.66:1 on `#1b5e20`, so
|
|
48
|
+
* neither meets any threshold and asking whether one does is the wrong
|
|
49
|
+
* question. The answer is whichever ink has the better WORST case across the
|
|
50
|
+
* fills — which is also not what either fill says on its own, since
|
|
51
|
+
* `contrastText('#4caf50')` is dark ink.
|
|
52
|
+
*
|
|
53
|
+
* A gradient wide enough that neither ink clears 4.5:1 anywhere is a palette
|
|
54
|
+
* problem this cannot fix — it returns the less bad ink and does not pretend
|
|
55
|
+
* otherwise.
|
|
56
|
+
*
|
|
57
|
+
* **It no longer takes the better ink for free (FUT-2066).** "Better worst
|
|
58
|
+
* case" decides WHICH ink wins; {@link INK_CHANGE_MARGIN} decides whether the
|
|
59
|
+
* win is big enough to repaint a brand over. The two rows that moved when this
|
|
60
|
+
* function landed were `warning` — 2.16:1 white on an orange, the defect — and
|
|
61
|
+
* `danger`, bought for a quarter of a point. Only the first survives the
|
|
62
|
+
* margin, which is the whole point: one of them was a fix and the other was
|
|
63
|
+
* churn, and nothing in the old rule could tell them apart.
|
|
64
|
+
*
|
|
65
|
+
* `Math.min` is the claim, and it is worth knowing that no test can prove it
|
|
66
|
+
* against `Math.max` today: the two candidate inks sit at opposite ends of the
|
|
67
|
+
* luminance range, so ranking them by their best fill and by their worst gives
|
|
68
|
+
* the same winner for every possible pair (checked exhaustively). Worst case is
|
|
69
|
+
* still what this MEANS, and the moment a third ink or one that is not an
|
|
70
|
+
* extreme is offered, the two stop agreeing.
|
|
71
|
+
*
|
|
72
|
+
* `incumbent` is the palette's own `contrastText` for this role — what both
|
|
73
|
+
* call sites already passed, under the name `fallback`. It is still returned
|
|
74
|
+
* when a fill cannot be decomposed ({@link getContrastRatio} throws on a format
|
|
75
|
+
* it does not know, and a throw inside an emotion style function takes the
|
|
76
|
+
* render down with it), so nothing about that path changed; it has simply
|
|
77
|
+
* stopped being only a last resort.
|
|
78
|
+
*/
|
|
79
|
+
/**
|
|
80
|
+
* HOW MUCH BETTER THE OTHER INK HAS TO BE BEFORE A BRAND IS REPAINTED (FUT-2066).
|
|
81
|
+
*
|
|
82
|
+
* Half a contrast point. The rule this guards is "take the better worst case",
|
|
83
|
+
* and on MUI's own stock palette that rule repainted `danger`'s gradient button
|
|
84
|
+
* from white-on-red to black-on-red for **0.25 of a point** — 3.49 against 3.74,
|
|
85
|
+
* with neither ink clearing AA either way. A rule that churns a brand for a
|
|
86
|
+
* rounding difference will churn it again on the next palette tweak, and the
|
|
87
|
+
* consumer who has to explain why their destructive button changed colour has
|
|
88
|
+
* no better answer than "it rounded the other way".
|
|
89
|
+
*
|
|
90
|
+
* The number sits in a wide measured band rather than on a cliff. Walking the
|
|
91
|
+
* five gradient pairs `Button.styles.ts` paints, the only two gaps that exist
|
|
92
|
+
* are `danger`'s **0.25** — the churn — and `warning`'s **3.38**, white at
|
|
93
|
+
* 2.16:1 on an orange against dark ink at 5.54:1, which is the defect FUT-1924
|
|
94
|
+
* exists for. Anything in `[0.3, 3.38]` separates them; 0.5 is the round number
|
|
95
|
+
* nearest the bottom of that band, so the next palette move has to be
|
|
96
|
+
* substantially larger than a rounding difference before this fires.
|
|
97
|
+
*
|
|
98
|
+
* FUT-2066 recorded this as undecidable, on a measurement that turns out to be
|
|
99
|
+
* wrong: it reports the incumbent for `success` as DARK ink and concludes that
|
|
100
|
+
* a margin would hold it at 2.66 where the current rule gets 2.78. The gradient
|
|
101
|
+
* runs `success.light → success.dark`, but `contrastText` answers for
|
|
102
|
+
* `success.MAIN` — `#2e7d32`, not the `#4caf50` the table names — and white on
|
|
103
|
+
* `#2e7d32` is 5.7:1, so the incumbent is white and a margin leaves that row
|
|
104
|
+
* exactly where it is. With that row corrected the objection goes away and the
|
|
105
|
+
* shape the ticket proposed is simply right.
|
|
106
|
+
*/
|
|
107
|
+
const INK_CHANGE_MARGIN = 0.5;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The contrast below which the incumbent is not worth keeping at any margin.
|
|
111
|
+
*
|
|
112
|
+
* MUI's own `contrastThreshold`, and the same number for the same reason: below
|
|
113
|
+
* 3:1 an ink is not a brand decision, it is text nobody can read. `warning` is
|
|
114
|
+
* caught by this AND by {@link INK_CHANGE_MARGIN} — white sits at 2.16:1 on
|
|
115
|
+
* that orange — which is deliberate: the one row that has to move should not
|
|
116
|
+
* depend on which clause fires.
|
|
117
|
+
*/
|
|
118
|
+
const INK_CHANGE_FLOOR = CONTRAST_THRESHOLD;
|
|
119
|
+
|
|
120
|
+
export function inkOver(fills: readonly string[], incumbent: string): string {
|
|
121
|
+
try {
|
|
122
|
+
const worstCase = (ink: string): number =>
|
|
123
|
+
Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));
|
|
124
|
+
|
|
125
|
+
const better =
|
|
126
|
+
worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)
|
|
127
|
+
? LIGHT_TEXT_PRIMARY
|
|
128
|
+
: DARK_TEXT_PRIMARY;
|
|
129
|
+
|
|
130
|
+
// The incumbent is the palette's OWN answer for this role, which is what
|
|
131
|
+
// makes "keep it unless the gain is material" a statement about churn
|
|
132
|
+
// rather than about arithmetic. It arrives as the same argument that used
|
|
133
|
+
// to be the parse-failure fallback, because it always was `contrastText`
|
|
134
|
+
// at both call sites — the parameter has stopped being a last resort and
|
|
135
|
+
// started being the thing being defended.
|
|
136
|
+
const held = worstCase(incumbent);
|
|
137
|
+
const gain = worstCase(better) - held;
|
|
138
|
+
return gain >= INK_CHANGE_MARGIN || held < INK_CHANGE_FLOOR ? better : incumbent;
|
|
139
|
+
} catch {
|
|
140
|
+
return incumbent;
|
|
141
|
+
}
|
|
142
|
+
}
|
package/src/tokens/theme.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import { darken,
|
|
1
|
+
import { darken, lighten } from './color';
|
|
2
|
+
import { contrastText, DARK_TEXT_PRIMARY, inkOver } from './ink-over';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
RE-EXPORTED rather than moved out of the public surface. Both were published
|
|
6
|
+
from here, and `ink-over.ts` exists because this file reached the 400-line cap
|
|
7
|
+
— a caller should not have to learn that.
|
|
8
|
+
*/
|
|
9
|
+
export { contrastText, inkOver };
|
|
2
10
|
import { cssLengthToPx, cssTrackingToEm } from './css-units';
|
|
3
11
|
import { HEADING_SCALE, type HeadingLevel } from './heading-scale';
|
|
4
12
|
|
|
@@ -127,11 +135,8 @@ const ROOT_FONT_PX = 16;
|
|
|
127
135
|
/** The px value as the rem string the web components write. */
|
|
128
136
|
export const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;
|
|
129
137
|
|
|
130
|
-
/** MUI's `createPalette`
|
|
138
|
+
/** MUI's `createPalette` default tonal offset, exactly. */
|
|
131
139
|
const TONAL_OFFSET = 0.2;
|
|
132
|
-
const CONTRAST_THRESHOLD = 3;
|
|
133
|
-
const DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';
|
|
134
|
-
const LIGHT_TEXT_PRIMARY = '#fff';
|
|
135
140
|
|
|
136
141
|
export const GREY: Record<UiGreyStep, string> = {
|
|
137
142
|
50: '#fafafa',
|
|
@@ -207,66 +212,6 @@ const MODE_DEFAULTS: Record<
|
|
|
207
212
|
},
|
|
208
213
|
};
|
|
209
214
|
|
|
210
|
-
/**
|
|
211
|
-
* MUI's `getContrastText`: white where white reads at 3:1 on the colour, the
|
|
212
|
-
* light mode's dark ink otherwise. (MUI's source spells the white as the DARK
|
|
213
|
-
* palette's `text.primary`, which is what made it easy to read backwards.)
|
|
214
|
-
*/
|
|
215
|
-
export function contrastText(background: string): string {
|
|
216
|
-
return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD
|
|
217
|
-
? LIGHT_TEXT_PRIMARY
|
|
218
|
-
: DARK_TEXT_PRIMARY;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* The ink that reads on EVERY one of these fills (FUT-1924).
|
|
223
|
-
*
|
|
224
|
-
* {@link contrastText} answers for one fill, which is all MUI's `augmentColor`
|
|
225
|
-
* ever needs: a solid button is a single flat colour. Two components paint the
|
|
226
|
-
* label over something that is not one colour — `Button`'s `gradient` variant
|
|
227
|
-
* runs between two stops, and `Switch`'s thumb travels the whole length of a
|
|
228
|
-
* checked track — and both of them stated `#fff` outright instead, which is
|
|
229
|
-
* white-on-pale the moment a white-labelled host hands the library a pale
|
|
230
|
-
* brand. Audited across the library, those two were the only places a hardcoded
|
|
231
|
-
* white sat over a surface the TENANT chooses.
|
|
232
|
-
*
|
|
233
|
-
* **This deliberately does not follow `contrastText`'s rule.** MUI's is a
|
|
234
|
-
* threshold that PREFERS white — white wherever white clears 3:1 — which is a
|
|
235
|
-
* brand-feel decision, and it is kept for every existing caller so nothing
|
|
236
|
-
* already legible moves. Here the fills can disagree: over MUI's own success
|
|
237
|
-
* pair white is 2.78:1 on `#4caf50` and dark ink 2.66:1 on `#1b5e20`, so
|
|
238
|
-
* neither meets any threshold and asking whether one does is the wrong
|
|
239
|
-
* question. The answer is whichever ink has the better WORST case across the
|
|
240
|
-
* fills — which is also not what either fill says on its own, since
|
|
241
|
-
* `contrastText('#4caf50')` is dark ink.
|
|
242
|
-
*
|
|
243
|
-
* A gradient wide enough that neither ink clears 4.5:1 anywhere is a palette
|
|
244
|
-
* problem this cannot fix — it returns the less bad ink and does not pretend
|
|
245
|
-
* otherwise.
|
|
246
|
-
*
|
|
247
|
-
* `Math.min` is the claim, and it is worth knowing that no test can prove it
|
|
248
|
-
* against `Math.max` today: the two candidate inks sit at opposite ends of the
|
|
249
|
-
* luminance range, so ranking them by their best fill and by their worst gives
|
|
250
|
-
* the same winner for every possible pair (checked exhaustively). Worst case is
|
|
251
|
-
* still what this MEANS, and the moment a third ink or one that is not an
|
|
252
|
-
* extreme is offered, the two stop agreeing.
|
|
253
|
-
*
|
|
254
|
-
* `fallback` is returned when a fill cannot be decomposed: {@link getContrastRatio}
|
|
255
|
-
* throws on a format it does not know, and a throw inside an emotion style
|
|
256
|
-
* function takes the render down with it.
|
|
257
|
-
*/
|
|
258
|
-
export function inkOver(fills: readonly string[], fallback: string): string {
|
|
259
|
-
try {
|
|
260
|
-
const worstCase = (ink: string): number =>
|
|
261
|
-
Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));
|
|
262
|
-
|
|
263
|
-
return worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)
|
|
264
|
-
? LIGHT_TEXT_PRIMARY
|
|
265
|
-
: DARK_TEXT_PRIMARY;
|
|
266
|
-
} catch {
|
|
267
|
-
return fallback;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
215
|
|
|
271
216
|
/**
|
|
272
217
|
* MUI's `augmentColor` for a custom colour: derive whatever shade the seed
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/Tabs/Tabs.tsx"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport Badge from '@mui/material/Badge/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport MuiTab from '@mui/material/Tab/index.js';\nimport MuiTabs from '@mui/material/Tabs/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { CustomTabPanel } from './TabsPanel';\nimport { tabsRootStyles } from './Tabs.styles';\nimport type { TabItem, TabsProps } from './Tabs.types';\n\nconst StyledTabs = styled(MuiTabs, {\n shouldForwardProp: (prop) => !['customVariant', 'size', 'showDividers'].includes(prop as string) })<{ customVariant?: string; size?: string; showDividers?: boolean }>(\n ({ theme, customVariant, size, showDividers }) => ({\n ...tabsRootStyles({ theme, customVariant, size, showDividers }) }),\n);\n\nconst CloseButton = styled(Box)(({ theme }) => ({\n marginLeft: theme.spacing(0.5),\n padding: theme.spacing(0.25),\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n borderRadius: '50%',\n color: theme.palette.action.active,\n '&:hover': {\n backgroundColor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main } }));\n\nconst BadgeWrapper = styled(Badge)(() => ({\n '& .MuiBadge-badge': {\n right: -6,\n top: 4,\n fontSize: '0.75rem',\n minWidth: 16,\n height: 16,\n padding: 0 } }));\n\nconst TABS_DEFAULTS: Partial<TabsProps> = {\n variant: 'default',\n size: 'md',\n color: 'primary',\n fullWidth: false,\n orientation: 'horizontal',\n showDividers: false,\n centered: false,\n scrollable: false,\n scrollButtons: 'auto',\n sticky: false,\n stickyOffset: 0,\n animateContent: false,\n animationDuration: 300,\n persistContent: false,\n disabled: false,\n loading: false };\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}`\n// still falls back to the default as a destructuring default would.\nconst definedProps = (props: TabsProps): Partial<TabsProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TabsProps>;\n\n// Once the row is scrollable every accepted scrollButtons value ends up as\n// MUI's 'auto'. That is exactly what the previous nested ternary did — it mapped\n// 'on'/'off'/'desktop' to 'auto', and its remaining branch could only ever be\n// 'auto' anyway — so the behaviour is preserved here rather than quietly\n// changed. Worth knowing that scrollButtons=\"off\" therefore still shows buttons.\nconst resolveScrollButtons = (scrollable?: boolean): 'auto' | false =>\n scrollable ? 'auto' : false;\n\nconst buildTabsSx = ({\n fullWidth,\n sticky,\n stickyOffset,\n indicatorColor,\n disabled }: {\n fullWidth?: boolean;\n sticky?: boolean;\n stickyOffset?: number;\n indicatorColor?: string;\n disabled?: boolean;\n}) => ({\n ...(fullWidth && { width: '100%' }),\n // Pin the tab list while panels scroll beneath it. Opaque background + bottom\n // divider so scrolled content does not show through.\n ...(sticky && {\n position: 'sticky',\n top: stickyOffset,\n zIndex: 2,\n backgroundColor: 'background.default',\n borderBottom: 1,\n borderColor: 'divider' }),\n ...(indicatorColor && {\n '& .MuiTabs-indicator': { backgroundColor: indicatorColor } }),\n ...(disabled && { opacity: 0.6, pointerEvents: 'none' }) });\n\n// A tab's label: icon, text, optional close affordance, optionally badged.\nconst TabLabel: React.FC<{\n item: TabItem;\n closeTabLabel: string;\n onClose: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n}> = ({ item, closeTabLabel, onClose }) => {\n const content = (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {item.icon}\n <span>{item.label}</span>\n {item.closable && (\n <CloseButton\n onClick={(e) => onClose(e, item.id)}\n role=\"button\"\n tabIndex={0}\n aria-label={closeTabLabel}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n onClose(e, item.id);\n }}\n >\n <Close fontSize=\"inherit\" />\n </CloseButton>\n )}\n </Box>\n );\n\n if (item.badge === undefined) return content;\n\n return (\n <BadgeWrapper badgeContent={item.badge} color=\"error\">\n {content}\n </BadgeWrapper>\n );\n};\n\ntype ResolvedTabs = TabsProps;\n\n// The tab strip. Kept in this file because StyledTabs cannot cross a module\n// boundary (TS2742).\nconst TabsBar: React.FC<\n ResolvedTabs & {\n rest: Record<string, unknown>;\n onChange: (event: React.SyntheticEvent, newValue: string) => void;\n onCloseTab: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n }\n> = ({ rest, items, value, onChange, onCloseTab, dataTestId, ...p }) => (\n <StyledTabs\n {...rest}\n value={value}\n onChange={onChange}\n customVariant={p.variant}\n size={p.size}\n showDividers={p.showDividers}\n orientation={p.orientation}\n centered={p.centered}\n // MUI only scrolls when its own `variant` is `scrollable`; map our\n // `scrollable` flag onto it so overflowing tab rows actually scroll.\n variant={p.scrollable ? 'scrollable' : 'standard'}\n data-testid={dataTestId ? `${dataTestId}-list` : 'tabs-list'}\n scrollButtons={resolveScrollButtons(p.scrollable)}\n allowScrollButtonsMobile={p.scrollable}\n textColor={p.color}\n indicatorColor={p.color}\n sx={buildTabsSx({\n fullWidth: p.fullWidth,\n sticky: p.sticky,\n stickyOffset: p.stickyOffset,\n indicatorColor: p.indicatorColor,\n disabled: p.disabled })}\n >\n {items.map((item, index) => (\n <MuiTab\n key={item.id}\n value={item.id}\n label={<TabLabel closeTabLabel={p.closeTabLabel} item={item} onClose={onCloseTab} />}\n disabled={item.disabled || p.disabled}\n className={item.className}\n id={`tab-${item.id}`}\n aria-controls={`tabpanel-${item.id}`}\n aria-disabled={item.disabled || p.disabled}\n data-testid={dataTestId ? `${dataTestId}-tab-${index}` : `tabs-tab-${index}`}\n />\n ))}\n </StyledTabs>\n);\n\nconst TabsPanels: React.FC<ResolvedTabs> = ({\n items,\n value,\n variant,\n animateContent,\n animationDuration,\n persistContent,\n loading,\n loadingComponent,\n tabPanelProps,\n dataTestId }) => (\n <Box sx={{ mt: variant === 'enclosed' ? 0 : 2 }}>\n {items.map((item, index) => (\n <CustomTabPanel\n key={item.id}\n id={item.id}\n value={value}\n animate={animateContent}\n animationDuration={animationDuration}\n persist={persistContent}\n loading={loading}\n loadingComponent={loadingComponent}\n className={tabPanelProps?.className}\n dataTestId={dataTestId}\n index={index}\n >\n {item.content}\n </CustomTabPanel>\n ))}\n </Box>\n);\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (tabsProps, ref) => {\n const resolved = { ...TABS_DEFAULTS, ...definedProps(tabsProps) } as TabsProps;\n const {\n // Destructured only to keep it OUT of `rest`, which is spread onto the\n // DOM node — `{...resolved}` below is what actually carries it to\n // `TabsBar`. Same reason as `value` on the next line.\n closeTabLabel: _closeTabLabel,\n value: _value,\n onChange,\n onTabClose,\n className,\n disabled,\n showDividers,\n variant,\n dataTestId,\n ...rest\n } = resolved;\n\n const handleChange = (event: React.SyntheticEvent, newValue: string) => {\n if (!disabled) onChange(event, newValue);\n };\n\n const handleTabClose = (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => {\n event.stopPropagation();\n onTabClose?.(tabId);\n };\n\n return (\n <Box className={className} ref={ref} data-testid={dataTestId || 'tabs'}>\n <TabsBar\n {...resolved}\n rest={rest as unknown as Record<string, unknown>}\n onChange={handleChange}\n onCloseTab={handleTabClose}\n />\n\n {showDividers && variant !== 'enclosed' && <Divider />}\n\n <TabsPanels {...resolved} />\n </Box>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/Switch/Switch.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport {\n bounceAnimation,\n glowAnimation,\n pulseAnimation,\n rippleAnimation,\n shimmerAnimation,\n spinAnimation,\n} from './Switch.animations';\nimport {\n DISABLED,\n IOS_BASE_OFFSET,\n IOS_THUMB_SHADOW,\n IOS_TRAVEL_INSET,\n SWITCH_GLASS,\n SWITCH_GLOW,\n NEUTRAL_CONTRAST,\n NEUTRAL_FALLBACK,\n NEUTRAL_GREY,\n SWITCH_FOCUS_RING,\n SWITCH_GRADIENT,\n SWITCH_HOVER,\n SWITCH_PULSE,\n SWITCH_RIPPLE,\n SWITCH_SPINNER,\n SWITCH_TRANSITION,\n RESTING_THUMB,\n THUMB_ELEVATION,\n THUMB_RADIUS,\n TRACK_LABEL,\n TRACK_RADIUS,\n geometryOf,\n iosTrackShadow,\n lookOf,\n seconds,\n showsTrackLabels,\n trackColor,\n type SwitchGeometry,\n type SwitchLook,\n} from './Switch.metrics';\nimport type { SwitchVariant } from './Switch.base';\n\nimport { inkOver, px } from '../../../tokens/theme';\nimport type { ColorValue, SizeValue } from '../../../tokens/vocabulary';\n\n// Every number below comes from `./Switch.metrics`, which the native renderer\n// reads too — see its header. The palette and the shadows stay on the MUI\n// theme so a host that re-themes either keeps moving the web.\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?.[NEUTRAL_GREY.main] || NEUTRAL_FALLBACK.main,\n dark: theme.palette.grey?.[NEUTRAL_GREY.dark] || NEUTRAL_FALLBACK.dark,\n light: theme.palette.grey?.[NEUTRAL_GREY.light] || NEUTRAL_FALLBACK.light,\n contrastText: NEUTRAL_CONTRAST,\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. `danger` is this\n * component's name for the error palette; the rest map straight through.\n */\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const colorMap: Record<string, ColorPalette | undefined> = {\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 const palette = colorMap[color] ?? theme.palette.primary;\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 || NEUTRAL_CONTRAST,\n };\n};\n\nexport interface SwitchFlags {\n customVariant?: SwitchVariant;\n customColor?: ColorValue;\n customSize?: SizeValue;\n glow?: boolean;\n glass?: boolean;\n gradient?: boolean;\n trackWidth?: number;\n trackHeight?: number;\n onText?: string;\n offText?: string;\n loading?: boolean;\n ripple?: boolean;\n pulse?: boolean;\n}\n\nconst thumbShadow = (theme: Theme, look: SwitchLook): string =>\n look === 'ios' ? IOS_THUMB_SHADOW : (theme.shadows[THUMB_ELEVATION[look]] ?? 'none');\n\n/** The ripple that expands from the thumb on hover. */\nconst rippleOverlay = (palette: ColorPalette): CSSObject => ({\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n background: alpha(palette.main, SWITCH_RIPPLE.alpha),\n animation: `${rippleAnimation} ${seconds(SWITCH_RIPPLE.ms)} ease-out`,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n});\n\n/**\n * The ink on the CHECKED track — the thumb, the `on` wording and any on-icon\n * (FUT-1924).\n *\n * All three stated `#fff`, and the checked track is `palette.main`: the one\n * surface in this component the TENANT picks. A store with a pale brand got a\n * white thumb on a pale green bar, which does not read as a knob at all — the\n * switch looks OFF while it is on, so this is a state a user misreads rather\n * than a colour they dislike.\n *\n * The `gradient` flag paints the track `light → main → dark`, so the fills the\n * thumb travels over are handed over together and {@link inkOver} takes the\n * worst of them.\n *\n * The RESTING track is not here on purpose: it is `theme.palette.action.disabled`\n * washed over the page, which no tenant chooses, and a white thumb on it is the\n * conventional look in both modes.\n */\nconst checkedInk = (flags: SwitchFlags, palette: ColorPalette): string => {\n const fills = flags.gradient\n ? [palette.light || palette.main, palette.main, palette.dark || palette.main]\n : [palette.main];\n\n return inkOver(fills, palette.contrastText || NEUTRAL_CONTRAST);\n};\n\n/** The checked track: the filled bar behind the thumb once the switch is on. */\nconst checkedTrack = (flags: SwitchFlags, palette: ColorPalette): CSSObject => ({\n backgroundColor: palette.main,\n opacity: 1,\n border: 0,\n position: 'relative',\n overflow: 'hidden',\n ...(flags.glow && {\n animation: `${glowAnimation} ${seconds(SWITCH_GLOW.ms)} ease-in-out infinite`,\n boxShadow: `0 0 ${SWITCH_GLOW.blur}px ${alpha(palette.main, SWITCH_GLOW.alpha)}, inset 0 0 ${SWITCH_GLOW.insetBlur}px ${alpha(palette.main, SWITCH_GLOW.insetAlpha)}`,\n }),\n ...(flags.gradient && {\n background: `linear-gradient(${SWITCH_GRADIENT.checked.angleDeg}deg, ${palette.light || palette.main} ${SWITCH_GRADIENT.checked.stops[0]}%, ${palette.main} ${SWITCH_GRADIENT.checked.stops[1]}%, ${palette.dark || palette.main} ${SWITCH_GRADIENT.checked.stops[2]}%)`,\n backgroundSize: '200% 100%',\n animation: `${shimmerAnimation} ${seconds(SWITCH_GRADIENT.shimmerMs)} ease infinite`,\n }),\n});\n\nconst switchBaseSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n geometry: SwitchGeometry,\n look: SwitchLook,\n): CSSObject => {\n const { width, thumbSize, padding } = geometry;\n const isIos = look === 'ios';\n\n return {\n padding,\n margin: 0,\n transitionDuration: `${SWITCH_TRANSITION.ms}ms`,\n transitionTimingFunction: SWITCH_TRANSITION.easing,\n ...(isIos && { transform: `translateX(${IOS_BASE_OFFSET}px)` }),\n '&:hover': {\n '& .MuiSwitch-thumb': {\n transform: flags.loading ? 'none' : `scale(${SWITCH_HOVER.thumbScale})`,\n boxShadow: `${theme.shadows[SWITCH_HOVER.elevation]}, 0 0 ${SWITCH_HOVER.blur}px ${alpha(palette.main, SWITCH_HOVER.alpha)}`,\n },\n ...(flags.ripple && { '&::after': rippleOverlay(palette) }),\n },\n '&.Mui-checked': {\n // The thumb travels the track minus its own width and both paddings; the\n // iOS look insets differently, so it gets its own distance.\n transform: `translateX(${width - thumbSize - padding * 2}px)`,\n color: checkedInk(flags, palette),\n '& .MuiSwitch-thumb': {\n animation: flags.loading ? 'none' : `${bounceAnimation} ${seconds(SWITCH_TRANSITION.ms)} ease-out`,\n // `glass` draws its own translucent thumb and means to show the track\n // through it, so it keeps the fill it chose.\n ...(flags.glass ? {} : { backgroundColor: checkedInk(flags, palette) }),\n },\n '& + .MuiSwitch-track': checkedTrack(flags, palette),\n '&.Mui-disabled + .MuiSwitch-track': { opacity: DISABLED.checkedTrackOpacity },\n ...(isIos && { transform: `translateX(${width - thumbSize - IOS_TRAVEL_INSET}px)` }),\n },\n '&.Mui-focusVisible .MuiSwitch-thumb': {\n color: palette.main,\n border: `${SWITCH_FOCUS_RING.width}px solid ${alpha(palette.main, SWITCH_FOCUS_RING.alpha)}`,\n },\n '&.Mui-disabled .MuiSwitch-thumb': { color: theme.palette.grey[DISABLED.thumbGrey] },\n '&.Mui-disabled + .MuiSwitch-track': { opacity: DISABLED.trackOpacity },\n };\n};\n\nconst thumbSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n thumbSize: number,\n look: SwitchLook,\n): CSSObject => ({\n width: thumbSize,\n height: thumbSize,\n borderRadius: THUMB_RADIUS[look](thumbSize),\n // `.Mui-checked` above replaces this for the brand-filled track; see\n // {@link RESTING_THUMB} for why the resting one stays white.\n backgroundColor: RESTING_THUMB,\n boxShadow: thumbShadow(theme, look),\n transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...(flags.glass && {\n backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.thumbAlpha),\n backdropFilter: `blur(${SWITCH_GLASS.thumbBlur}px)`,\n border: `1px solid ${alpha(theme.palette.divider, SWITCH_GLASS.borderAlpha)}`,\n }),\n ...(flags.pulse && { animation: `${pulseAnimation} ${seconds(SWITCH_PULSE.ms)} ease-in-out infinite` }),\n ...(flags.loading && {\n // A spinner drawn inside the thumb rather than over the whole control.\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n width: thumbSize * SWITCH_SPINNER.sizeRatio,\n height: thumbSize * SWITCH_SPINNER.sizeRatio,\n border: `${SWITCH_SPINNER.borderWidth}px solid ${palette.main}`,\n borderTop: `${SWITCH_SPINNER.borderWidth}px solid transparent`,\n borderRadius: '50%',\n animation: `${spinAnimation} ${seconds(SWITCH_SPINNER.ms)} linear infinite`,\n },\n }),\n ...(look === 'material' && {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n backgroundColor: palette.main,\n opacity: 0,\n transform: 'scale(0)',\n transition: 'all 0.3s ease',\n },\n }),\n});\n\n/** The on/off wording the `label` variant prints inside the track. */\nconst trackLabels = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n onText?: string,\n offText?: string,\n): CSSObject => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: theme.spacing(TRACK_LABEL.insetUnits),\n paddingRight: theme.spacing(TRACK_LABEL.insetUnits),\n fontSize: px(TRACK_LABEL.fontSize),\n fontWeight: TRACK_LABEL.fontWeight,\n color: theme.palette.text.secondary,\n '&::before, &::after': {\n content: '\"\"',\n position: 'absolute',\n fontSize: px(TRACK_LABEL.fontSize),\n fontWeight: TRACK_LABEL.fontWeight,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n },\n ...(onText && {\n '&::before': {\n content: `\"${onText}\"`,\n left: theme.spacing(TRACK_LABEL.insetUnits),\n // The `on` word sits at the end the thumb travels TO, which is the\n // filled half of the track once checked.\n color: checkedInk(flags, palette),\n },\n }),\n ...(offText && {\n '&::after': {\n content: `\"${offText}\"`,\n right: theme.spacing(TRACK_LABEL.insetUnits),\n color: theme.palette.text.secondary,\n },\n }),\n});\n\nconst trackSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n height: number,\n look: SwitchLook,\n): CSSObject => {\n const { glass, gradient, onText, offText, customVariant } = flags;\n\n return {\n borderRadius: TRACK_RADIUS[look](height),\n backgroundColor: trackColor(\n { black: theme.palette.common.black, disabled: theme.palette.action.disabled },\n look,\n ),\n opacity: 1,\n transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,\n position: 'relative',\n boxShadow: look === 'ios' ? iosTrackShadow() : 'none',\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.trackAlpha),\n backdropFilter: `blur(${SWITCH_GLASS.trackBlur}px)`,\n border: `1px solid ${alpha(theme.palette.divider, SWITCH_GLASS.borderAlpha)}`,\n }),\n ...(gradient &&\n !glass && {\n background: `linear-gradient(${SWITCH_GRADIENT.resting.angleDeg}deg, ${alpha(palette.light || palette.main, SWITCH_GRADIENT.resting.lightAlpha)}, ${alpha(palette.main, SWITCH_GRADIENT.resting.mainAlpha)})`,\n }),\n ...(showsTrackLabels(customVariant, onText, offText) &&\n trackLabels(theme, flags, palette, onText, offText)),\n };\n};\n\n/**\n * The same checked-track ink, for the two ICONS the control overlays on the\n * track — which are drawn as components rather than styles, so they cannot\n * reach {@link checkedInk} directly.\n */\nexport const onTrackInk = (theme: Theme, flags: SwitchFlags): string =>\n checkedInk(flags, getColorFromTheme(theme, flags.customColor ?? 'primary'));\n\nexport const switchSx = (theme: Theme, flags: SwitchFlags): CSSObject => {\n const palette = getColorFromTheme(theme, flags.customColor ?? 'primary');\n const geometry = geometryOf(flags.customSize, flags.trackWidth, flags.trackHeight);\n const look = lookOf(flags.customVariant);\n\n return {\n width: geometry.width,\n height: geometry.height,\n padding: 0,\n overflow: 'visible',\n '& .MuiSwitch-switchBase': switchBaseSx(theme, flags, palette, geometry, look),\n '& .MuiSwitch-thumb': thumbSx(theme, flags, palette, geometry.thumbSize, look),\n '& .MuiSwitch-track': trackSx(theme, flags, palette, geometry.height, look),\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokens/theme.ts"],"sourcesContent":["import { darken, getContrastRatio, lighten } from './color';\nimport { cssLengthToPx, cssTrackingToEm } from './css-units';\nimport { HEADING_SCALE, type HeadingLevel } from './heading-scale';\n\nimport type { SizeValue } from './vocabulary';\n\n/**\n * THE THEME BOTH RENDERERS READ.\n *\n * On the web every component styles itself from MUI's `Theme`, which is built\n * by the host (`@12-apps/app-shell`'s `createAppTheme` in the origin apps) and\n * reaches a component through emotion's context. React Native has no emotion,\n * no CSS and no MUI, so a native `Button` needs the same decisions — the\n * palette, the spacing unit, the radius, the type scale — from somewhere that\n * does not import a renderer.\n *\n * This is that somewhere. `UiTheme` is a plain object of numbers and colour\n * strings. `createUiTheme` derives it the way MUI's `createPalette` derives its\n * own: a `light` shade is `lighten(main, 0.2)`, a `dark` shade `darken(main,\n * 0.3)`, `contrastText` flips at a 3:1 ratio against `rgba(0, 0, 0, 0.87)`.\n * Same seeds in, same shades out, on both sides — that is the whole basis for\n * a native button being the web button's colour and not a near miss.\n *\n * Numbers are in px on the web and dp on native; both are the CSS-pixel unit\n * a design is drawn in, so a `fontSize: 16` here IS `1rem` in a web style\n * and `16` in a `StyleSheet`. The web components keep their `rem` strings and\n * derive them from these numbers where the two meet (see `px()` below and the\n * `*.metrics.ts` file beside each ported component).\n *\n * `danger` and `neutral` are this package's names (see `./scales`); `danger`\n * is MUI's `error` and `neutral` is drawn from the grey ramp the way\n * `Button.styles.ts` has always drawn it.\n */\n\nexport type UiThemeMode = 'light' | 'dark';\n\nexport interface UiPaletteColor {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport type UiGreyStep = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport interface UiPalette {\n mode: UiThemeMode;\n primary: UiPaletteColor;\n secondary: UiPaletteColor;\n success: UiPaletteColor;\n warning: UiPaletteColor;\n info: UiPaletteColor;\n danger: UiPaletteColor;\n neutral: UiPaletteColor;\n text: { primary: string; secondary: string; disabled: string };\n background: { default: string; paper: string };\n divider: string;\n action: {\n active: string;\n hover: string;\n selected: string;\n disabled: string;\n disabledBackground: string;\n focus: string;\n };\n grey: Record<UiGreyStep, string>;\n}\n\n/** One step of the body scale: `fontSize` in px, `lineHeight` as a ratio. */\nexport interface UiTypeStep {\n fontSize: number;\n lineHeight: number;\n}\n\nexport type UiFontWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n\nexport interface UiHeadingStep extends UiTypeStep {\n /** In em, so it scales with the step. `undefined` is \"normal\". */\n letterSpacing?: number;\n normalWeight: number;\n}\n\nexport interface UiTypography {\n /**\n * Native has no fallback stacks: a font is either installed and named, or\n * `undefined` and the platform's own. The web default is MUI's Roboto stack.\n */\n fontFamily: string | undefined;\n monospaceFontFamily: string | undefined;\n sizes: Record<SizeValue, UiTypeStep>;\n weights: Record<UiFontWeight, number>;\n heading: Record<HeadingLevel, UiHeadingStep>;\n}\n\nexport interface UiTheme {\n mode: UiThemeMode;\n palette: UiPalette;\n /** MUI's `theme.spacing(n)`: `n` units of {@link UiTheme.spacingUnit}, in px. */\n spacing: (units: number) => number;\n spacingUnit: number;\n /** `md` is MUI's `shape.borderRadius`; the others are its halves and doubles. */\n radius: { sm: number; md: number; lg: number; xl: number; full: number };\n typography: UiTypography;\n zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };\n}\n\n/** A seed for one palette slot: a hex `main`, or any subset of the four shades. */\nexport type UiPaletteSeed = string | Partial<UiPaletteColor>;\n\nexport interface UiThemeOptions {\n mode?: UiThemeMode;\n palette?: Partial<{\n primary: UiPaletteSeed;\n secondary: UiPaletteSeed;\n success: UiPaletteSeed;\n warning: UiPaletteSeed;\n info: UiPaletteSeed;\n danger: UiPaletteSeed;\n background: Partial<UiPalette['background']>;\n }>;\n typography?: Partial<Pick<UiTypography, 'fontFamily' | 'monospaceFontFamily'>>;\n spacingUnit?: number;\n}\n\nconst ROOT_FONT_PX = 16;\n\n/** The px value as the rem string the web components write. */\nexport const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;\n\n/** MUI's `createPalette` defaults, exactly. */\nconst TONAL_OFFSET = 0.2;\nconst CONTRAST_THRESHOLD = 3;\nconst DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';\nconst LIGHT_TEXT_PRIMARY = '#fff';\n\nexport const GREY: Record<UiGreyStep, string> = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n};\n\n/**\n * The platform's own seeds. The pair `@12-apps/ui`'s Storybook preview and\n * `@12-apps/app-shell`'s `DEFAULT_THEME_TOKENS` both carry — keep the three in\n * step if the design tokens change.\n */\nexport const DEFAULT_BRAND: Record<UiThemeMode, { primary: string; secondary: string }> = {\n light: { primary: '#6366F1', secondary: '#8B5CF6' },\n dark: { primary: '#818CF8', secondary: '#A78BFA' },\n};\n\n/** MUI's semantic defaults per mode. These are declared shades, not derived. */\nconst SEMANTIC_DEFAULTS: Record<\n UiThemeMode,\n Record<'success' | 'warning' | 'info' | 'danger', UiPaletteColor>\n> = {\n light: {\n success: { main: '#2e7d32', light: '#4caf50', dark: '#1b5e20', contrastText: '#fff' },\n warning: { main: '#ed6c02', light: '#ff9800', dark: '#e65100', contrastText: '#fff' },\n info: { main: '#0288d1', light: '#03a9f4', dark: '#01579b', contrastText: '#fff' },\n danger: { main: '#d32f2f', light: '#ef5350', dark: '#c62828', contrastText: '#fff' },\n },\n dark: {\n success: { main: '#66bb6a', light: '#81c784', dark: '#388e3c', contrastText: DARK_TEXT_PRIMARY },\n warning: { main: '#ffa726', light: '#ffb74d', dark: '#f57c00', contrastText: DARK_TEXT_PRIMARY },\n info: { main: '#29b6f6', light: '#4fc3f7', dark: '#0288d1', contrastText: DARK_TEXT_PRIMARY },\n danger: { main: '#f44336', light: '#e57373', dark: '#d32f2f', contrastText: '#fff' },\n },\n};\n\nconst MODE_DEFAULTS: Record<\n UiThemeMode,\n Pick<UiPalette, 'text' | 'background' | 'divider' | 'action'>\n> = {\n light: {\n text: { primary: DARK_TEXT_PRIMARY, secondary: 'rgba(0, 0, 0, 0.6)', disabled: 'rgba(0, 0, 0, 0.38)' },\n background: { default: '#fff', paper: '#fff' },\n divider: 'rgba(0, 0, 0, 0.12)',\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n focus: 'rgba(0, 0, 0, 0.12)',\n },\n },\n dark: {\n text: { primary: '#fff', secondary: 'rgba(255, 255, 255, 0.7)', disabled: 'rgba(255, 255, 255, 0.5)' },\n background: { default: '#121212', paper: '#121212' },\n divider: 'rgba(255, 255, 255, 0.12)',\n action: {\n active: '#fff',\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n focus: 'rgba(255, 255, 255, 0.12)',\n },\n },\n};\n\n/**\n * MUI's `getContrastText`: white where white reads at 3:1 on the colour, the\n * light mode's dark ink otherwise. (MUI's source spells the white as the DARK\n * palette's `text.primary`, which is what made it easy to read backwards.)\n */\nexport function contrastText(background: string): string {\n return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n}\n\n/**\n * The ink that reads on EVERY one of these fills (FUT-1924).\n *\n * {@link contrastText} answers for one fill, which is all MUI's `augmentColor`\n * ever needs: a solid button is a single flat colour. Two components paint the\n * label over something that is not one colour — `Button`'s `gradient` variant\n * runs between two stops, and `Switch`'s thumb travels the whole length of a\n * checked track — and both of them stated `#fff` outright instead, which is\n * white-on-pale the moment a white-labelled host hands the library a pale\n * brand. Audited across the library, those two were the only places a hardcoded\n * white sat over a surface the TENANT chooses.\n *\n * **This deliberately does not follow `contrastText`'s rule.** MUI's is a\n * threshold that PREFERS white — white wherever white clears 3:1 — which is a\n * brand-feel decision, and it is kept for every existing caller so nothing\n * already legible moves. Here the fills can disagree: over MUI's own success\n * pair white is 2.78:1 on `#4caf50` and dark ink 2.66:1 on `#1b5e20`, so\n * neither meets any threshold and asking whether one does is the wrong\n * question. The answer is whichever ink has the better WORST case across the\n * fills — which is also not what either fill says on its own, since\n * `contrastText('#4caf50')` is dark ink.\n *\n * A gradient wide enough that neither ink clears 4.5:1 anywhere is a palette\n * problem this cannot fix — it returns the less bad ink and does not pretend\n * otherwise.\n *\n * `Math.min` is the claim, and it is worth knowing that no test can prove it\n * against `Math.max` today: the two candidate inks sit at opposite ends of the\n * luminance range, so ranking them by their best fill and by their worst gives\n * the same winner for every possible pair (checked exhaustively). Worst case is\n * still what this MEANS, and the moment a third ink or one that is not an\n * extreme is offered, the two stop agreeing.\n *\n * `fallback` is returned when a fill cannot be decomposed: {@link getContrastRatio}\n * throws on a format it does not know, and a throw inside an emotion style\n * function takes the render down with it.\n */\nexport function inkOver(fills: readonly string[], fallback: string): string {\n try {\n const worstCase = (ink: string): number =>\n Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));\n\n return worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n } catch {\n return fallback;\n }\n}\n\n/**\n * MUI's `augmentColor` for a custom colour: derive whatever shade the seed\n * left out. `light` is one tonal offset up, `dark` one and a half down.\n */\nexport function augmentColor(seed: UiPaletteSeed): UiPaletteColor {\n const partial = typeof seed === 'string' ? { main: seed } : seed;\n const main = partial.main ?? partial.light ?? partial.dark;\n if (!main) {\n throw new Error('@12-apps/ui: a palette seed needs at least a `main` colour.');\n }\n return {\n main,\n light: partial.light ?? lighten(main, TONAL_OFFSET),\n dark: partial.dark ?? darken(main, TONAL_OFFSET * 1.5),\n contrastText: partial.contrastText ?? contrastText(main),\n };\n}\n\nconst semantic = (\n mode: UiThemeMode,\n key: 'success' | 'warning' | 'info' | 'danger',\n seed: UiPaletteSeed | undefined,\n): UiPaletteColor => (seed === undefined ? SEMANTIC_DEFAULTS[mode][key] : augmentColor(seed));\n\n/** `neutral` as `accentFor` in `./scales` has always drawn it: three greys and white. */\nexport const NEUTRAL: UiPaletteColor = {\n main: GREY[600],\n light: GREY[400],\n dark: GREY[800],\n contrastText: '#fff',\n};\n\n/** The body scale `Text` renders, in px. `Text.tsx`'s rem map is this, divided by 16. */\nexport const TYPE_SIZES: Record<SizeValue, UiTypeStep> = {\n xs: { fontSize: 12, lineHeight: 1.2 },\n sm: { fontSize: 14, lineHeight: 1.3 },\n md: { fontSize: 16, lineHeight: 1.5 },\n lg: { fontSize: 18, lineHeight: 1.4 },\n xl: { fontSize: 20, lineHeight: 1.3 },\n};\n\nexport const FONT_WEIGHTS: Record<UiFontWeight, number> = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n};\n\n// `HEADING_SCALE` speaks CSS, this theme speaks numbers; `./css-units` is the\n// one place that conversion is written.\nconst HEADING_STEPS = Object.fromEntries(\n Object.entries(HEADING_SCALE).map(([level, metrics]) => [\n level,\n {\n fontSize: cssLengthToPx(metrics.fontSize, ROOT_FONT_PX),\n lineHeight: metrics.lineHeight,\n letterSpacing: cssTrackingToEm(metrics.letterSpacing),\n normalWeight: metrics.normalWeight,\n },\n ]),\n) as Record<HeadingLevel, UiHeadingStep>;\n\nexport const WEB_FONT_FAMILY = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nexport const WEB_MONOSPACE_FONT_FAMILY = 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace';\n\n/**\n * Build the theme. Every field is derived here so a host that changes one\n * seed gets every dependent shade recomputed, on both renderers, identically.\n */\nexport function createUiTheme(options: UiThemeOptions = {}): UiTheme {\n const mode = options.mode ?? 'light';\n const seeds = options.palette ?? {};\n const brand = DEFAULT_BRAND[mode];\n const defaults = MODE_DEFAULTS[mode];\n const spacingUnit = options.spacingUnit ?? 8;\n\n const palette: UiPalette = {\n mode,\n primary: augmentColor(seeds.primary ?? brand.primary),\n secondary: augmentColor(seeds.secondary ?? brand.secondary),\n success: semantic(mode, 'success', seeds.success),\n warning: semantic(mode, 'warning', seeds.warning),\n info: semantic(mode, 'info', seeds.info),\n danger: semantic(mode, 'danger', seeds.danger),\n neutral: NEUTRAL,\n text: defaults.text,\n background: { ...defaults.background, ...seeds.background },\n divider: defaults.divider,\n action: defaults.action,\n grey: GREY,\n };\n\n return {\n mode,\n palette,\n spacing: (units: number) => units * spacingUnit,\n spacingUnit,\n radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999 },\n typography: {\n fontFamily: options.typography?.fontFamily,\n monospaceFontFamily: options.typography?.monospaceFontFamily,\n sizes: TYPE_SIZES,\n weights: FONT_WEIGHTS,\n heading: HEADING_STEPS,\n },\n zIndex: { appBar: 1100, drawer: 1200, modal: 1300, snackbar: 1400, tooltip: 1500 },\n };\n}\n\n/** The palette slot a house colour name resolves to. */\nexport type UiPaletteKey = 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'danger' | 'neutral';\n\nexport const DEFAULT_UI_THEME: UiTheme = createUiTheme();\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tokens/color.ts","../../../src/tokens/heading-scale.ts","../../../src/tokens/css-units.ts","../../../src/tokens/theme.ts"],"sourcesContent":["/**\n * COLOUR ARITHMETIC WITH NO RENDERER BEHIND IT.\n *\n * Every shade the web components paint comes out of MUI's colour manipulator:\n * `lighten(main, 0.2)` is a palette's `light`, `darken(main, 0.3)` its `dark`,\n * `alpha(main, 0.1)` the hover wash on an outline button. A native component\n * that wants the SAME pixel has to run the SAME arithmetic, and it cannot\n * import it — `@mui/material/styles` drags emotion and the DOM in behind it.\n *\n * So the arithmetic lives here, once, with nothing behind it. It is a faithful\n * port of `@mui/system/colorManipulator` (MIT), down to the truncation:\n * `lighten('#6366F1', 0.2)` is `rgb(130, 132, 243)` on both sides because both\n * TRUNCATE 132.6 rather than round it. A port that rounded would be one pixel\n * of tint away from the web on every button, forever, and nothing would flag it.\n *\n * `color()` space strings are deliberately unsupported: nothing in this package\n * emits one, and a smaller surface is a smaller thing to keep identical.\n */\n\nexport type ColorFormat = 'rgb' | 'rgba' | 'hsl' | 'hsla';\n\nexport interface DecomposedColor {\n type: ColorFormat;\n values: number[];\n}\n\nconst FORMATS: readonly ColorFormat[] = ['rgb', 'rgba', 'hsl', 'hsla'];\n\nconst clamp = (value: number, min = 0, max = 1): number => Math.min(Math.max(min, value), max);\n\n/** `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa` to its `rgb()` / `rgba()` string. */\nexport function hexToRgb(color: string): string {\n const hex = color.slice(1);\n const pair = new RegExp(`.{1,${hex.length >= 6 ? 2 : 1}}`, 'g');\n let channels: string[] | null = hex.match(pair);\n if (channels && channels[0]?.length === 1) {\n channels = channels.map((channel) => channel + channel);\n }\n if (!channels) return '';\n\n const parts = channels.map((channel, index) =>\n index < 3 ? parseInt(channel, 16) : Math.round((parseInt(channel, 16) / 255) * 1000) / 1000,\n );\n return `rgb${channels.length === 4 ? 'a' : ''}(${parts.join(', ')})`;\n}\n\n/** Any supported colour string to its type and numeric channels. */\nexport function decomposeColor(color: string): DecomposedColor {\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n\n const marker = color.indexOf('(');\n const type = color.substring(0, marker) as ColorFormat;\n if (!FORMATS.includes(type)) {\n throw new Error(\n `@12-apps/ui: unsupported colour \"${color}\". Use #nnn, #nnnnnn, rgb(), rgba(), hsl() or hsla().`,\n );\n }\n\n const values = color\n .substring(marker + 1, color.length - 1)\n .split(',')\n .map((value) => parseFloat(value));\n\n return { type, values };\n}\n\n/** The inverse of {@link decomposeColor}, with MUI's channel truncation. */\nexport function recomposeColor({ type, values }: DecomposedColor): string {\n const parts: Array<number | string> = type.startsWith('rgb')\n ? values.map((value, index) => (index < 3 ? Math.trunc(value) : value))\n : [values[0] ?? 0, `${values[1] ?? 0}%`, `${values[2] ?? 0}%`, ...values.slice(3)];\n\n return `${type}(${parts.join(', ')})`;\n}\n\n/** An `hsl()` / `hsla()` string to its `rgb()` / `rgba()` equivalent. */\nexport function hslToRgb(color: string): string {\n const { type, values } = decomposeColor(color);\n const h = values[0] ?? 0;\n const s = (values[1] ?? 0) / 100;\n const l = (values[2] ?? 0) / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number, k = (n + h / 30) % 12): number =>\n l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n if (type === 'hsla') {\n return recomposeColor({ type: 'rgba', values: [...rgb, values[3] ?? 1] });\n }\n return recomposeColor({ type: 'rgb', values: rgb });\n}\n\n/** Relative luminance (WCAG 2.0), to three decimals like MUI. */\nexport function getLuminance(color: string): number {\n const decomposed = decomposeColor(color);\n const channels = decomposed.type.startsWith('hsl')\n ? decomposeColor(hslToRgb(color)).values\n : decomposed.values;\n\n const [r, g, b] = channels.slice(0, 3).map((value) => {\n const c = value / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n\n return Number((0.2126 * (r ?? 0) + 0.7152 * (g ?? 0) + 0.0722 * (b ?? 0)).toFixed(3));\n}\n\n/** WCAG contrast ratio between two colours, 1 to 21. */\nexport function getContrastRatio(foreground: string, background: string): number {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/** The colour with its alpha channel set to `value` (0 to 1). */\nexport function alpha(color: string, value: number): string {\n const decomposed = decomposeColor(color);\n const type: ColorFormat = decomposed.type.endsWith('a')\n ? decomposed.type\n : (`${decomposed.type}a` as ColorFormat);\n const values = decomposed.values.slice(0, 3);\n values[3] = clamp(value);\n return recomposeColor({ type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards black. */\nexport function darken(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) * (1 - amount);\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) * (1 - amount);\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** The colour moved `coefficient` (0 to 1) of the way towards white. */\nexport function lighten(color: string, coefficient: number): string {\n const decomposed = decomposeColor(color);\n const amount = clamp(coefficient);\n const values = [...decomposed.values];\n\n if (decomposed.type.startsWith('hsl')) {\n values[2] = (values[2] ?? 0) + (100 - (values[2] ?? 0)) * amount;\n } else {\n for (let index = 0; index < 3; index += 1) {\n values[index] = (values[index] ?? 0) + (255 - (values[index] ?? 0)) * amount;\n }\n }\n return recomposeColor({ type: decomposed.type, values });\n}\n\n/** Darken a light colour or lighten a dark one, by `coefficient`. */\nexport function emphasize(color: string, coefficient = 0.15): string {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n","\n/**\n * THE THIRD VOCABULARY: the type scale.\n *\n * `scales.ts` opens by saying the package had both halves of every argument at\n * once until the size and colour vocabularies were declared in one place and\n * every component derived from them. The type scale was the one that never got\n * that treatment — it lived as a private `LEVELS` table inside\n * `Heading.styles.ts`, which is exactly the shape that file exists to refuse.\n *\n * Two things follow from it being private, and the second is the expensive one.\n *\n * **It could not be re-themed.** `Heading` read `theme.typography.h1.fontFamily`\n * from the theme and then ignored the theme for every other metric, so a host\n * calling `createTheme({ typography: { h1: { fontSize: '2rem' } } })` changed\n * `<Typography variant=\"h1\">` and left `<Heading level=\"h1\">` at 48px. A design\n * system whose type scale cannot be set by the design is not a system.\n *\n * **And the numbers were a landing page's.** `h1` at 3rem and `h2` at 2.5rem are\n * hero metrics. Dropped into an operations console they put a 48px title\n * directly above 14px body copy — a 3.4x jump with nothing in between — so\n * product teams stopped reaching for the component. Measured in one consuming\n * repo: `<Heading>` appeared four times in the entire codebase while raw\n * `fontSize` appeared in dozens of files. The component was not disliked, it was\n * unusable at app scale, and every host paid for that in hand-rolled CSS.\n *\n * So the defaults below are an APP scale, and `display` keeps the hero size for\n * the screens that actually want one. A marketing page asks for `display`; a\n * console asks for `h1` and gets something it can put on a page.\n */\n\n/**\n * A step on the scale.\n *\n * `display` is a SIZE, not a rank — see `Heading`, which renders it as `h1` so\n * the document still gets exactly one level-one heading.\n */\nexport type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'display';\n\n/**\n * The runtime list, declared beside the union for the reason `SIZE_VALUES`\n * gives: a story's `argTypes.options` spelled by hand drifts from the type, and\n * the direction it drifts is \"documents less than the component accepts\".\n */\nexport const HEADING_LEVELS = [\n 'display',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n] as const satisfies readonly HeadingLevel[];\n\n/** Everything one step of the scale decides. */\nexport interface HeadingMetrics {\n fontSize: string;\n lineHeight: number;\n letterSpacing?: string;\n /**\n * The weight this step carries when the caller asks for `normal`. A heading's\n * \"normal\" is not body text's 400 — it is the weight the step is meant to\n * carry, which gets heavier as the step gets larger.\n */\n normalWeight: number;\n}\n\n/**\n * The house default, in CODE rather than in a component.\n *\n * ~1.15x per step from a 1rem `h6`, which keeps six distinguishable ranks inside\n * the range an application actually uses. The old table ran 1.125rem → 4rem and\n * spent its top three steps above anything a product screen wants.\n */\nexport const HEADING_SCALE: Record<HeadingLevel, HeadingMetrics> = {\n // The hero size the old `h1` was really offering, under the name that says so.\n display: { fontSize: '3rem', lineHeight: 1.05, letterSpacing: '-0.03em', normalWeight: 800 },\n h1: { fontSize: '2rem', lineHeight: 1.2, letterSpacing: '-0.02em', normalWeight: 700 },\n h2: { fontSize: '1.75rem', lineHeight: 1.25, letterSpacing: '-0.015em', normalWeight: 700 },\n h3: { fontSize: '1.5rem', lineHeight: 1.3, letterSpacing: '-0.01em', normalWeight: 600 },\n h4: { fontSize: '1.25rem', lineHeight: 1.35, letterSpacing: '-0.005em', normalWeight: 600 },\n h5: { fontSize: '1.125rem', lineHeight: 1.4, normalWeight: 600 },\n h6: { fontSize: '1rem', lineHeight: 1.5, normalWeight: 600 },\n};\n\n/** A host's overrides: any subset of the steps, any subset of each step's metrics. */\nexport type HeadingScaleOverrides = Partial<Record<HeadingLevel, Partial<HeadingMetrics>>>;\n","/**\n * THE ONE READER OF CSS LENGTHS.\n *\n * `HEADING_SCALE` and a host's MUI overrides speak CSS — `'2rem'`, `'-0.02em'`\n * — and both `tokens/theme.ts` and `provider/mui-bridge.ts` need them as\n * numbers. Two private parsers drifted (one multiplied `em` by 16, one did\n * not), so there is one, here, with the rule spelled out: a length becomes px\n * against a 16px root, a tracking value becomes em.\n */\n\nconst ROOT_PX = 16;\n\n/** `'1.5rem'` → 24, `'1.5em'` → 24, `'20px'` → 20, `20` → 20, unparseable → `fallback`. */\nexport function cssLengthToPx(value: string | number | undefined, fallback: number): number {\n if (typeof value === 'number') return value;\n if (value === undefined) return fallback;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return fallback;\n return value.endsWith('rem') || value.endsWith('em') ? parsed * ROOT_PX : parsed;\n}\n\n/** `'-0.02em'` → -0.02, `'0.5px'` → 0.5 / 16, `undefined` → `undefined` (\"normal\"). */\nexport function cssTrackingToEm(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) return undefined;\n return value.endsWith('px') ? parsed / ROOT_PX : parsed;\n}\n","import { darken, getContrastRatio, lighten } from './color';\nimport { cssLengthToPx, cssTrackingToEm } from './css-units';\nimport { HEADING_SCALE, type HeadingLevel } from './heading-scale';\n\nimport type { SizeValue } from './vocabulary';\n\n/**\n * THE THEME BOTH RENDERERS READ.\n *\n * On the web every component styles itself from MUI's `Theme`, which is built\n * by the host (`@12-apps/app-shell`'s `createAppTheme` in the origin apps) and\n * reaches a component through emotion's context. React Native has no emotion,\n * no CSS and no MUI, so a native `Button` needs the same decisions — the\n * palette, the spacing unit, the radius, the type scale — from somewhere that\n * does not import a renderer.\n *\n * This is that somewhere. `UiTheme` is a plain object of numbers and colour\n * strings. `createUiTheme` derives it the way MUI's `createPalette` derives its\n * own: a `light` shade is `lighten(main, 0.2)`, a `dark` shade `darken(main,\n * 0.3)`, `contrastText` flips at a 3:1 ratio against `rgba(0, 0, 0, 0.87)`.\n * Same seeds in, same shades out, on both sides — that is the whole basis for\n * a native button being the web button's colour and not a near miss.\n *\n * Numbers are in px on the web and dp on native; both are the CSS-pixel unit\n * a design is drawn in, so a `fontSize: 16` here IS `1rem` in a web style\n * and `16` in a `StyleSheet`. The web components keep their `rem` strings and\n * derive them from these numbers where the two meet (see `px()` below and the\n * `*.metrics.ts` file beside each ported component).\n *\n * `danger` and `neutral` are this package's names (see `./scales`); `danger`\n * is MUI's `error` and `neutral` is drawn from the grey ramp the way\n * `Button.styles.ts` has always drawn it.\n */\n\nexport type UiThemeMode = 'light' | 'dark';\n\nexport interface UiPaletteColor {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport type UiGreyStep = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport interface UiPalette {\n mode: UiThemeMode;\n primary: UiPaletteColor;\n secondary: UiPaletteColor;\n success: UiPaletteColor;\n warning: UiPaletteColor;\n info: UiPaletteColor;\n danger: UiPaletteColor;\n neutral: UiPaletteColor;\n text: { primary: string; secondary: string; disabled: string };\n background: { default: string; paper: string };\n divider: string;\n action: {\n active: string;\n hover: string;\n selected: string;\n disabled: string;\n disabledBackground: string;\n focus: string;\n };\n grey: Record<UiGreyStep, string>;\n}\n\n/** One step of the body scale: `fontSize` in px, `lineHeight` as a ratio. */\nexport interface UiTypeStep {\n fontSize: number;\n lineHeight: number;\n}\n\nexport type UiFontWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n\nexport interface UiHeadingStep extends UiTypeStep {\n /** In em, so it scales with the step. `undefined` is \"normal\". */\n letterSpacing?: number;\n normalWeight: number;\n}\n\nexport interface UiTypography {\n /**\n * Native has no fallback stacks: a font is either installed and named, or\n * `undefined` and the platform's own. The web default is MUI's Roboto stack.\n */\n fontFamily: string | undefined;\n monospaceFontFamily: string | undefined;\n sizes: Record<SizeValue, UiTypeStep>;\n weights: Record<UiFontWeight, number>;\n heading: Record<HeadingLevel, UiHeadingStep>;\n}\n\nexport interface UiTheme {\n mode: UiThemeMode;\n palette: UiPalette;\n /** MUI's `theme.spacing(n)`: `n` units of {@link UiTheme.spacingUnit}, in px. */\n spacing: (units: number) => number;\n spacingUnit: number;\n /** `md` is MUI's `shape.borderRadius`; the others are its halves and doubles. */\n radius: { sm: number; md: number; lg: number; xl: number; full: number };\n typography: UiTypography;\n zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };\n}\n\n/** A seed for one palette slot: a hex `main`, or any subset of the four shades. */\nexport type UiPaletteSeed = string | Partial<UiPaletteColor>;\n\nexport interface UiThemeOptions {\n mode?: UiThemeMode;\n palette?: Partial<{\n primary: UiPaletteSeed;\n secondary: UiPaletteSeed;\n success: UiPaletteSeed;\n warning: UiPaletteSeed;\n info: UiPaletteSeed;\n danger: UiPaletteSeed;\n background: Partial<UiPalette['background']>;\n }>;\n typography?: Partial<Pick<UiTypography, 'fontFamily' | 'monospaceFontFamily'>>;\n spacingUnit?: number;\n}\n\nconst ROOT_FONT_PX = 16;\n\n/** The px value as the rem string the web components write. */\nexport const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;\n\n/** MUI's `createPalette` defaults, exactly. */\nconst TONAL_OFFSET = 0.2;\nconst CONTRAST_THRESHOLD = 3;\nconst DARK_TEXT_PRIMARY = 'rgba(0, 0, 0, 0.87)';\nconst LIGHT_TEXT_PRIMARY = '#fff';\n\nexport const GREY: Record<UiGreyStep, string> = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n};\n\n/**\n * The platform's own seeds. The pair `@12-apps/ui`'s Storybook preview and\n * `@12-apps/app-shell`'s `DEFAULT_THEME_TOKENS` both carry — keep the three in\n * step if the design tokens change.\n */\nexport const DEFAULT_BRAND: Record<UiThemeMode, { primary: string; secondary: string }> = {\n light: { primary: '#6366F1', secondary: '#8B5CF6' },\n dark: { primary: '#818CF8', secondary: '#A78BFA' },\n};\n\n/** MUI's semantic defaults per mode. These are declared shades, not derived. */\nconst SEMANTIC_DEFAULTS: Record<\n UiThemeMode,\n Record<'success' | 'warning' | 'info' | 'danger', UiPaletteColor>\n> = {\n light: {\n success: { main: '#2e7d32', light: '#4caf50', dark: '#1b5e20', contrastText: '#fff' },\n warning: { main: '#ed6c02', light: '#ff9800', dark: '#e65100', contrastText: '#fff' },\n info: { main: '#0288d1', light: '#03a9f4', dark: '#01579b', contrastText: '#fff' },\n danger: { main: '#d32f2f', light: '#ef5350', dark: '#c62828', contrastText: '#fff' },\n },\n dark: {\n success: { main: '#66bb6a', light: '#81c784', dark: '#388e3c', contrastText: DARK_TEXT_PRIMARY },\n warning: { main: '#ffa726', light: '#ffb74d', dark: '#f57c00', contrastText: DARK_TEXT_PRIMARY },\n info: { main: '#29b6f6', light: '#4fc3f7', dark: '#0288d1', contrastText: DARK_TEXT_PRIMARY },\n danger: { main: '#f44336', light: '#e57373', dark: '#d32f2f', contrastText: '#fff' },\n },\n};\n\nconst MODE_DEFAULTS: Record<\n UiThemeMode,\n Pick<UiPalette, 'text' | 'background' | 'divider' | 'action'>\n> = {\n light: {\n text: { primary: DARK_TEXT_PRIMARY, secondary: 'rgba(0, 0, 0, 0.6)', disabled: 'rgba(0, 0, 0, 0.38)' },\n background: { default: '#fff', paper: '#fff' },\n divider: 'rgba(0, 0, 0, 0.12)',\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n focus: 'rgba(0, 0, 0, 0.12)',\n },\n },\n dark: {\n text: { primary: '#fff', secondary: 'rgba(255, 255, 255, 0.7)', disabled: 'rgba(255, 255, 255, 0.5)' },\n background: { default: '#121212', paper: '#121212' },\n divider: 'rgba(255, 255, 255, 0.12)',\n action: {\n active: '#fff',\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n focus: 'rgba(255, 255, 255, 0.12)',\n },\n },\n};\n\n/**\n * MUI's `getContrastText`: white where white reads at 3:1 on the colour, the\n * light mode's dark ink otherwise. (MUI's source spells the white as the DARK\n * palette's `text.primary`, which is what made it easy to read backwards.)\n */\nexport function contrastText(background: string): string {\n return getContrastRatio(background, LIGHT_TEXT_PRIMARY) >= CONTRAST_THRESHOLD\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n}\n\n/**\n * The ink that reads on EVERY one of these fills (FUT-1924).\n *\n * {@link contrastText} answers for one fill, which is all MUI's `augmentColor`\n * ever needs: a solid button is a single flat colour. Two components paint the\n * label over something that is not one colour — `Button`'s `gradient` variant\n * runs between two stops, and `Switch`'s thumb travels the whole length of a\n * checked track — and both of them stated `#fff` outright instead, which is\n * white-on-pale the moment a white-labelled host hands the library a pale\n * brand. Audited across the library, those two were the only places a hardcoded\n * white sat over a surface the TENANT chooses.\n *\n * **This deliberately does not follow `contrastText`'s rule.** MUI's is a\n * threshold that PREFERS white — white wherever white clears 3:1 — which is a\n * brand-feel decision, and it is kept for every existing caller so nothing\n * already legible moves. Here the fills can disagree: over MUI's own success\n * pair white is 2.78:1 on `#4caf50` and dark ink 2.66:1 on `#1b5e20`, so\n * neither meets any threshold and asking whether one does is the wrong\n * question. The answer is whichever ink has the better WORST case across the\n * fills — which is also not what either fill says on its own, since\n * `contrastText('#4caf50')` is dark ink.\n *\n * A gradient wide enough that neither ink clears 4.5:1 anywhere is a palette\n * problem this cannot fix — it returns the less bad ink and does not pretend\n * otherwise.\n *\n * `Math.min` is the claim, and it is worth knowing that no test can prove it\n * against `Math.max` today: the two candidate inks sit at opposite ends of the\n * luminance range, so ranking them by their best fill and by their worst gives\n * the same winner for every possible pair (checked exhaustively). Worst case is\n * still what this MEANS, and the moment a third ink or one that is not an\n * extreme is offered, the two stop agreeing.\n *\n * `fallback` is returned when a fill cannot be decomposed: {@link getContrastRatio}\n * throws on a format it does not know, and a throw inside an emotion style\n * function takes the render down with it.\n */\nexport function inkOver(fills: readonly string[], fallback: string): string {\n try {\n const worstCase = (ink: string): number =>\n Math.min(...fills.map((fill) => getContrastRatio(ink, fill)));\n\n return worstCase(LIGHT_TEXT_PRIMARY) >= worstCase(DARK_TEXT_PRIMARY)\n ? LIGHT_TEXT_PRIMARY\n : DARK_TEXT_PRIMARY;\n } catch {\n return fallback;\n }\n}\n\n/**\n * MUI's `augmentColor` for a custom colour: derive whatever shade the seed\n * left out. `light` is one tonal offset up, `dark` one and a half down.\n */\nexport function augmentColor(seed: UiPaletteSeed): UiPaletteColor {\n const partial = typeof seed === 'string' ? { main: seed } : seed;\n const main = partial.main ?? partial.light ?? partial.dark;\n if (!main) {\n throw new Error('@12-apps/ui: a palette seed needs at least a `main` colour.');\n }\n return {\n main,\n light: partial.light ?? lighten(main, TONAL_OFFSET),\n dark: partial.dark ?? darken(main, TONAL_OFFSET * 1.5),\n contrastText: partial.contrastText ?? contrastText(main),\n };\n}\n\nconst semantic = (\n mode: UiThemeMode,\n key: 'success' | 'warning' | 'info' | 'danger',\n seed: UiPaletteSeed | undefined,\n): UiPaletteColor => (seed === undefined ? SEMANTIC_DEFAULTS[mode][key] : augmentColor(seed));\n\n/** `neutral` as `accentFor` in `./scales` has always drawn it: three greys and white. */\nexport const NEUTRAL: UiPaletteColor = {\n main: GREY[600],\n light: GREY[400],\n dark: GREY[800],\n contrastText: '#fff',\n};\n\n/** The body scale `Text` renders, in px. `Text.tsx`'s rem map is this, divided by 16. */\nexport const TYPE_SIZES: Record<SizeValue, UiTypeStep> = {\n xs: { fontSize: 12, lineHeight: 1.2 },\n sm: { fontSize: 14, lineHeight: 1.3 },\n md: { fontSize: 16, lineHeight: 1.5 },\n lg: { fontSize: 18, lineHeight: 1.4 },\n xl: { fontSize: 20, lineHeight: 1.3 },\n};\n\nexport const FONT_WEIGHTS: Record<UiFontWeight, number> = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n};\n\n// `HEADING_SCALE` speaks CSS, this theme speaks numbers; `./css-units` is the\n// one place that conversion is written.\nconst HEADING_STEPS = Object.fromEntries(\n Object.entries(HEADING_SCALE).map(([level, metrics]) => [\n level,\n {\n fontSize: cssLengthToPx(metrics.fontSize, ROOT_FONT_PX),\n lineHeight: metrics.lineHeight,\n letterSpacing: cssTrackingToEm(metrics.letterSpacing),\n normalWeight: metrics.normalWeight,\n },\n ]),\n) as Record<HeadingLevel, UiHeadingStep>;\n\nexport const WEB_FONT_FAMILY = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nexport const WEB_MONOSPACE_FONT_FAMILY = 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace';\n\n/**\n * Build the theme. Every field is derived here so a host that changes one\n * seed gets every dependent shade recomputed, on both renderers, identically.\n */\nexport function createUiTheme(options: UiThemeOptions = {}): UiTheme {\n const mode = options.mode ?? 'light';\n const seeds = options.palette ?? {};\n const brand = DEFAULT_BRAND[mode];\n const defaults = MODE_DEFAULTS[mode];\n const spacingUnit = options.spacingUnit ?? 8;\n\n const palette: UiPalette = {\n mode,\n primary: augmentColor(seeds.primary ?? brand.primary),\n secondary: augmentColor(seeds.secondary ?? brand.secondary),\n success: semantic(mode, 'success', seeds.success),\n warning: semantic(mode, 'warning', seeds.warning),\n info: semantic(mode, 'info', seeds.info),\n danger: semantic(mode, 'danger', seeds.danger),\n neutral: NEUTRAL,\n text: defaults.text,\n background: { ...defaults.background, ...seeds.background },\n divider: defaults.divider,\n action: defaults.action,\n grey: GREY,\n };\n\n return {\n mode,\n palette,\n spacing: (units: number) => units * spacingUnit,\n spacingUnit,\n radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999 },\n typography: {\n fontFamily: options.typography?.fontFamily,\n monospaceFontFamily: options.typography?.monospaceFontFamily,\n sizes: TYPE_SIZES,\n weights: FONT_WEIGHTS,\n heading: HEADING_STEPS,\n },\n zIndex: { appBar: 1100, drawer: 1200, modal: 1300, snackbar: 1400, tooltip: 1500 },\n };\n}\n\n/** The palette slot a house colour name resolves to. */\nexport type UiPaletteKey = 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'danger' | 'neutral';\n\nexport const DEFAULT_UI_THEME: UiTheme = createUiTheme();\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|