@12-apps/ui 6.52.1 → 6.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components-catalog.md +1 -1
- package/dist/_internal/components/data-display/AlertDialog/AlertDialog.js +2 -1
- package/dist/_internal/components/data-display/AlertDialog/AlertDialog.parts.js +9 -0
- package/dist/_internal/components/data-display/AlertDialog/AlertDialog.parts.js.map +1 -0
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +7 -6
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +7 -6
- package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +24 -24
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +33 -32
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +2 -2
- 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 +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +21 -21
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +11 -11
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +10 -10
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +9 -8
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +4 -4
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +3 -3
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +5 -5
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.js +3 -1
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +2 -2
- package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
- package/dist/_internal/components/data-display/index.js +29 -28
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +4 -3
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.parts.js +3 -2
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +5 -4
- package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +4 -3
- package/dist/_internal/components/feedback/index.js +8 -7
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +2 -2
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
- package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
- package/dist/_internal/components/form/Calendar/Calendar.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +4 -4
- package/dist/_internal/components/form/Command/Command.js +3 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
- package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
- package/dist/_internal/components/form/index.js +22 -22
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/index.js +9 -9
- package/dist/_internal/components/index.js +72 -70
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +9 -4
- package/dist/_internal/components/layout/SettingCard/SettingCard.metrics.js +1 -1
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +3 -3
- package/dist/_internal/components/layout/SettingCard/SettingCard.styles.js +6 -2
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +63 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +10 -5
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +9 -4
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +10 -5
- package/dist/_internal/components/layout/index.js +18 -13
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +5 -5
- package/dist/_internal/components/navigation/index.js +5 -5
- package/dist/_internal/en-US.data-display.js +2 -2
- package/dist/_internal/en-US.layout.js +1 -1
- package/dist/_internal/pt-BR.data-display.js +2 -2
- package/dist/_internal/pt-BR.layout.js +1 -1
- package/dist/_internal/user-avatar/user-avatar.js +4 -4
- package/dist/charts.js +6 -6
- package/dist/{chunk-GXQDWHPN.js → chunk-2CJZLL5Y.js} +2 -2
- package/dist/{chunk-57VL5UX7.js → chunk-2JTZWQ25.js} +6 -4
- package/dist/chunk-2JTZWQ25.js.map +1 -0
- package/dist/{chunk-STTULW2K.js → chunk-2KVWOTEQ.js} +5 -5
- package/dist/{chunk-ISW5K72V.js → chunk-2ZRZTGWP.js} +5 -5
- package/dist/{chunk-QOLIBVGS.js → chunk-3CIIB74Y.js} +2 -2
- package/dist/{chunk-33L26P4J.js → chunk-3ZKGNEP2.js} +5 -3
- package/dist/{chunk-33L26P4J.js.map → chunk-3ZKGNEP2.js.map} +1 -1
- package/dist/{chunk-2OTBMU5Z.js → chunk-44LYXLW7.js} +7 -7
- package/dist/{chunk-OG6LYQ7C.js → chunk-4PFKMNLP.js} +8 -68
- package/dist/chunk-4PFKMNLP.js.map +1 -0
- package/dist/{chunk-LYVTJLCF.js → chunk-56JF5PZK.js} +4 -4
- package/dist/{chunk-5KGABAQB.js → chunk-5752357K.js} +4 -4
- package/dist/{chunk-SPZAEMGW.js → chunk-5WX6U34F.js} +4 -4
- package/dist/{chunk-QHXMNSOZ.js → chunk-6L6VXRLJ.js} +2 -2
- package/dist/{chunk-VVFASSFY.js → chunk-6VGB4OX2.js} +3 -3
- package/dist/{chunk-FRP7NM6X.js → chunk-6WZUKV55.js} +2 -2
- package/dist/{chunk-QEINKMMX.js → chunk-7C763T3K.js} +2 -2
- package/dist/{chunk-PARTZ7XI.js → chunk-7JKDB5J5.js} +4 -4
- package/dist/{chunk-G5XHAN56.js → chunk-7WWPKA7Y.js} +3 -3
- package/dist/{chunk-3U7WKBMH.js → chunk-AA2X5GOT.js} +5 -3
- package/dist/{chunk-3U7WKBMH.js.map → chunk-AA2X5GOT.js.map} +1 -1
- package/dist/{chunk-QYV7KLEN.js → chunk-ASGSC5UA.js} +5 -5
- package/dist/{chunk-7GQ2ZZBQ.js → chunk-BCTRC6AR.js} +2 -2
- package/dist/{chunk-XSHWEUDB.js → chunk-BE5Z36XZ.js} +4 -4
- package/dist/{chunk-IC7GHPMK.js → chunk-BFRVMCQM.js} +7 -2
- package/dist/chunk-BFRVMCQM.js.map +1 -0
- package/dist/{chunk-PM7SI4YT.js → chunk-BJOKL5PQ.js} +5 -5
- package/dist/{chunk-PGPPN63I.js → chunk-EMEXXAQI.js} +2 -2
- package/dist/{chunk-JUHNEYCH.js → chunk-GCH7CLM4.js} +2 -2
- package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
- package/dist/{chunk-LZQQ4JXY.js → chunk-HGVPPJKE.js} +8 -8
- package/dist/{chunk-HCEJT65A.js → chunk-HKD4TDZP.js} +2 -2
- package/dist/{chunk-XNBX3M35.js → chunk-HLCEKWFS.js} +4 -4
- package/dist/{chunk-4MGFUPQT.js → chunk-HOJL2GKW.js} +4 -4
- package/dist/{chunk-V5ZLUJV7.js → chunk-HRMB72E4.js} +2 -2
- package/dist/{chunk-3GVMUASU.js → chunk-HV7HIMMY.js} +2 -2
- package/dist/{chunk-CSDVRHUX.js → chunk-HWBKMUMV.js} +4 -4
- package/dist/{chunk-KN3WYEH2.js → chunk-IA6F7DU6.js} +4 -4
- package/dist/{chunk-BE5FGUJS.js → chunk-IM5SR7G2.js} +2 -2
- package/dist/chunk-IQQX3NDO.js +96 -0
- package/dist/chunk-IQQX3NDO.js.map +1 -0
- package/dist/{chunk-PJVDIUT2.js → chunk-IRNKHHQM.js} +3 -3
- package/dist/{chunk-4XET5MWR.js → chunk-KKE4SHRS.js} +2 -2
- package/dist/{chunk-ZTTFLIPH.js → chunk-L624DFJV.js} +2 -2
- package/dist/{chunk-OYT7YXQL.js → chunk-MGPN5TZE.js} +5 -5
- package/dist/{chunk-ERY6D2OV.js → chunk-MWPXKZ7O.js} +4 -4
- package/dist/{chunk-SCCE6VWY.js → chunk-N2Z7NHD5.js} +2 -2
- package/dist/chunk-N4R6T5K7.js +95 -0
- package/dist/chunk-N4R6T5K7.js.map +1 -0
- package/dist/{chunk-GNHXFJRR.js → chunk-N6EEY7V3.js} +2 -2
- package/dist/{chunk-OEBHWQSX.js → chunk-OESAYTNG.js} +9 -4
- package/dist/chunk-OESAYTNG.js.map +1 -0
- package/dist/{chunk-4WCDMCIS.js → chunk-PI3GPLE2.js} +2 -2
- package/dist/{chunk-XAUKQZJK.js → chunk-QX4LMVL2.js} +2 -2
- package/dist/{chunk-S5UY5U73.js → chunk-QYJ25FWM.js} +20 -2
- package/dist/{chunk-S5UY5U73.js.map → chunk-QYJ25FWM.js.map} +1 -1
- package/dist/{chunk-6PYX6V3R.js → chunk-RJXVVLBO.js} +4 -4
- package/dist/{chunk-FRCBJLV5.js → chunk-RKKYSSAV.js} +5 -5
- package/dist/{chunk-WF7BZT6V.js → chunk-RR6BIHFX.js} +2 -2
- package/dist/{chunk-NGAU6PNB.js → chunk-RRVQVQF7.js} +5 -5
- package/dist/{chunk-FWPFCK4D.js → chunk-S6G3CJFP.js} +2 -2
- package/dist/{chunk-F33YKDO2.js → chunk-TEST2NBS.js} +5 -5
- package/dist/{chunk-BJZOBG24.js → chunk-UJHXEOU3.js} +2 -2
- package/dist/{chunk-NKJSYZEU.js → chunk-V32626FV.js} +4 -4
- package/dist/{chunk-MLDA44NW.js → chunk-VGXSPUTD.js} +3 -3
- package/dist/{chunk-U4QUDFPJ.js → chunk-VKVOP4OK.js} +2 -2
- package/dist/{chunk-CTXF22BU.js → chunk-VODKYDC4.js} +5 -5
- package/dist/{chunk-DWJH3KXN.js → chunk-WAKGVAOB.js} +4 -4
- package/dist/{chunk-3DO5AJCG.js → chunk-WE2LNTR6.js} +12 -5
- package/dist/chunk-WE2LNTR6.js.map +1 -0
- package/dist/{chunk-SZA44EFA.js → chunk-WOEVBEGJ.js} +4 -4
- package/dist/{chunk-EOTV5BLM.js → chunk-WOP2DRMC.js} +2 -2
- package/dist/{chunk-E6JRPGMN.js → chunk-X3DVZNZH.js} +2 -2
- package/dist/{chunk-MLQYIJTO.js → chunk-XM7QCNZQ.js} +9 -3
- package/dist/chunk-XM7QCNZQ.js.map +1 -0
- package/dist/{chunk-P35CTP6L.js → chunk-Y3WB66XT.js} +7 -7
- package/dist/{chunk-DI46ZEWP.js → chunk-Y5QDXG5N.js} +20 -4
- package/dist/chunk-Y5QDXG5N.js.map +1 -0
- package/dist/{chunk-TNQDSTIA.js → chunk-Y6C4MYZE.js} +7 -7
- package/dist/{chunk-TBZKUZNW.js → chunk-ZPWU7Z6O.js} +3 -3
- package/dist/{chunk-QQSRZUT4.js → chunk-ZXEDKRRT.js} +4 -4
- package/dist/data-display/AlertDialog.js +2 -1
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/CardKit.js +14 -13
- package/dist/data-display/Chart.js +6 -6
- package/dist/data-display/DataViews.js +42 -41
- package/dist/data-display/FleetMap.js +5 -5
- package/dist/data-display/HoverCard.js +2 -2
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/Lightbox.js +3 -3
- package/dist/data-display/MapPreview.js +2 -2
- package/dist/data-display/Progress.js +2 -2
- package/dist/data-display/Sheet.js +4 -4
- package/dist/en-US.js +2 -2
- package/dist/feedback/ConfirmAction.js +8 -7
- package/dist/form/AddressAutocomplete.js +5 -5
- package/dist/form/Autocomplete.js +2 -2
- package/dist/form/Calendar.js +3 -3
- package/dist/form/CategorySelect.js +4 -4
- package/dist/form/Command.js +3 -3
- package/dist/form/DateRangePicker.js +10 -10
- package/dist/form/UploadButton.js +2 -2
- package/dist/form/total-form.js +7 -7
- package/dist/layout/ContentToolbar.js +3 -3
- package/dist/layout/ScrollArea.js +2 -2
- package/dist/layout/SettingCard.js +13 -8
- package/dist/locales.js +4 -4
- package/dist/navigation/AppHeader.js +5 -5
- package/dist/pt-BR.js +2 -2
- package/dist/types/components/data-display/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/types/components/data-display/AlertDialog/AlertDialog.parts.d.ts +13 -0
- package/dist/types/components/data-display/AlertDialog/AlertDialog.parts.d.ts.map +1 -0
- package/dist/types/components/data-display/AlertDialog/AlertDialog.types.d.ts +16 -3
- package/dist/types/components/data-display/AlertDialog/AlertDialog.types.d.ts.map +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts.map +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.d.ts +18 -0
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.metrics.d.ts +5 -0
- package/dist/types/components/layout/SettingCard/SettingCard.metrics.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.parts.d.ts +2 -0
- package/dist/types/components/layout/SettingCard/SettingCard.parts.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.styles.d.ts +9 -2
- package/dist/types/components/layout/SettingCard/SettingCard.styles.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.summary.d.ts +33 -0
- package/dist/types/components/layout/SettingCard/SettingCard.summary.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingSwitch.d.ts.map +1 -1
- package/dist/types/copy/layout.d.ts +8 -0
- package/dist/types/copy/layout.d.ts.map +1 -1
- package/dist/types/en-US.layout.d.ts.map +1 -1
- package/dist/types/pt-BR.layout.d.ts.map +1 -1
- package/dist/user-avatar.js +4 -4
- package/package.json +1 -1
- package/src/components/data-display/AlertDialog/AlertDialog.md +30 -0
- package/src/components/data-display/AlertDialog/AlertDialog.parts.tsx +180 -0
- package/src/components/data-display/AlertDialog/AlertDialog.tsx +5 -85
- package/src/components/data-display/AlertDialog/AlertDialog.types.ts +17 -3
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.ts +36 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +7 -2
- package/src/components/layout/SettingCard/SettingCard.md +1 -1
- package/src/components/layout/SettingCard/SettingCard.metrics.ts +5 -0
- package/src/components/layout/SettingCard/SettingCard.parts.tsx +4 -0
- package/src/components/layout/SettingCard/SettingCard.styles.ts +17 -5
- package/src/components/layout/SettingCard/SettingCard.summary.tsx +100 -0
- package/src/components/layout/SettingCard/SettingCard.tsx +6 -2
- package/src/components/layout/SettingCard/SettingSwitch.tsx +11 -2
- package/src/components/layout/SettingCard/SettingToggle.md +1 -1
- package/src/copy/layout.ts +8 -0
- package/src/en-US.layout.ts +2 -0
- package/src/pt-BR.layout.ts +2 -0
- package/dist/chunk-3DO5AJCG.js.map +0 -1
- package/dist/chunk-57VL5UX7.js.map +0 -1
- package/dist/chunk-DI46ZEWP.js.map +0 -1
- package/dist/chunk-IC7GHPMK.js.map +0 -1
- package/dist/chunk-MLQYIJTO.js.map +0 -1
- package/dist/chunk-OEBHWQSX.js.map +0 -1
- package/dist/chunk-OG6LYQ7C.js.map +0 -1
- /package/dist/{chunk-GXQDWHPN.js.map → chunk-2CJZLL5Y.js.map} +0 -0
- /package/dist/{chunk-STTULW2K.js.map → chunk-2KVWOTEQ.js.map} +0 -0
- /package/dist/{chunk-ISW5K72V.js.map → chunk-2ZRZTGWP.js.map} +0 -0
- /package/dist/{chunk-QOLIBVGS.js.map → chunk-3CIIB74Y.js.map} +0 -0
- /package/dist/{chunk-2OTBMU5Z.js.map → chunk-44LYXLW7.js.map} +0 -0
- /package/dist/{chunk-LYVTJLCF.js.map → chunk-56JF5PZK.js.map} +0 -0
- /package/dist/{chunk-5KGABAQB.js.map → chunk-5752357K.js.map} +0 -0
- /package/dist/{chunk-SPZAEMGW.js.map → chunk-5WX6U34F.js.map} +0 -0
- /package/dist/{chunk-QHXMNSOZ.js.map → chunk-6L6VXRLJ.js.map} +0 -0
- /package/dist/{chunk-VVFASSFY.js.map → chunk-6VGB4OX2.js.map} +0 -0
- /package/dist/{chunk-FRP7NM6X.js.map → chunk-6WZUKV55.js.map} +0 -0
- /package/dist/{chunk-QEINKMMX.js.map → chunk-7C763T3K.js.map} +0 -0
- /package/dist/{chunk-PARTZ7XI.js.map → chunk-7JKDB5J5.js.map} +0 -0
- /package/dist/{chunk-G5XHAN56.js.map → chunk-7WWPKA7Y.js.map} +0 -0
- /package/dist/{chunk-QYV7KLEN.js.map → chunk-ASGSC5UA.js.map} +0 -0
- /package/dist/{chunk-7GQ2ZZBQ.js.map → chunk-BCTRC6AR.js.map} +0 -0
- /package/dist/{chunk-XSHWEUDB.js.map → chunk-BE5Z36XZ.js.map} +0 -0
- /package/dist/{chunk-PM7SI4YT.js.map → chunk-BJOKL5PQ.js.map} +0 -0
- /package/dist/{chunk-PGPPN63I.js.map → chunk-EMEXXAQI.js.map} +0 -0
- /package/dist/{chunk-JUHNEYCH.js.map → chunk-GCH7CLM4.js.map} +0 -0
- /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
- /package/dist/{chunk-LZQQ4JXY.js.map → chunk-HGVPPJKE.js.map} +0 -0
- /package/dist/{chunk-HCEJT65A.js.map → chunk-HKD4TDZP.js.map} +0 -0
- /package/dist/{chunk-XNBX3M35.js.map → chunk-HLCEKWFS.js.map} +0 -0
- /package/dist/{chunk-4MGFUPQT.js.map → chunk-HOJL2GKW.js.map} +0 -0
- /package/dist/{chunk-V5ZLUJV7.js.map → chunk-HRMB72E4.js.map} +0 -0
- /package/dist/{chunk-3GVMUASU.js.map → chunk-HV7HIMMY.js.map} +0 -0
- /package/dist/{chunk-CSDVRHUX.js.map → chunk-HWBKMUMV.js.map} +0 -0
- /package/dist/{chunk-KN3WYEH2.js.map → chunk-IA6F7DU6.js.map} +0 -0
- /package/dist/{chunk-BE5FGUJS.js.map → chunk-IM5SR7G2.js.map} +0 -0
- /package/dist/{chunk-PJVDIUT2.js.map → chunk-IRNKHHQM.js.map} +0 -0
- /package/dist/{chunk-4XET5MWR.js.map → chunk-KKE4SHRS.js.map} +0 -0
- /package/dist/{chunk-ZTTFLIPH.js.map → chunk-L624DFJV.js.map} +0 -0
- /package/dist/{chunk-OYT7YXQL.js.map → chunk-MGPN5TZE.js.map} +0 -0
- /package/dist/{chunk-ERY6D2OV.js.map → chunk-MWPXKZ7O.js.map} +0 -0
- /package/dist/{chunk-SCCE6VWY.js.map → chunk-N2Z7NHD5.js.map} +0 -0
- /package/dist/{chunk-GNHXFJRR.js.map → chunk-N6EEY7V3.js.map} +0 -0
- /package/dist/{chunk-4WCDMCIS.js.map → chunk-PI3GPLE2.js.map} +0 -0
- /package/dist/{chunk-XAUKQZJK.js.map → chunk-QX4LMVL2.js.map} +0 -0
- /package/dist/{chunk-6PYX6V3R.js.map → chunk-RJXVVLBO.js.map} +0 -0
- /package/dist/{chunk-FRCBJLV5.js.map → chunk-RKKYSSAV.js.map} +0 -0
- /package/dist/{chunk-WF7BZT6V.js.map → chunk-RR6BIHFX.js.map} +0 -0
- /package/dist/{chunk-NGAU6PNB.js.map → chunk-RRVQVQF7.js.map} +0 -0
- /package/dist/{chunk-FWPFCK4D.js.map → chunk-S6G3CJFP.js.map} +0 -0
- /package/dist/{chunk-F33YKDO2.js.map → chunk-TEST2NBS.js.map} +0 -0
- /package/dist/{chunk-BJZOBG24.js.map → chunk-UJHXEOU3.js.map} +0 -0
- /package/dist/{chunk-NKJSYZEU.js.map → chunk-V32626FV.js.map} +0 -0
- /package/dist/{chunk-MLDA44NW.js.map → chunk-VGXSPUTD.js.map} +0 -0
- /package/dist/{chunk-U4QUDFPJ.js.map → chunk-VKVOP4OK.js.map} +0 -0
- /package/dist/{chunk-CTXF22BU.js.map → chunk-VODKYDC4.js.map} +0 -0
- /package/dist/{chunk-DWJH3KXN.js.map → chunk-WAKGVAOB.js.map} +0 -0
- /package/dist/{chunk-SZA44EFA.js.map → chunk-WOEVBEGJ.js.map} +0 -0
- /package/dist/{chunk-EOTV5BLM.js.map → chunk-WOP2DRMC.js.map} +0 -0
- /package/dist/{chunk-E6JRPGMN.js.map → chunk-X3DVZNZH.js.map} +0 -0
- /package/dist/{chunk-P35CTP6L.js.map → chunk-Y3WB66XT.js.map} +0 -0
- /package/dist/{chunk-TNQDSTIA.js.map → chunk-Y6C4MYZE.js.map} +0 -0
- /package/dist/{chunk-TBZKUZNW.js.map → chunk-ZPWU7Z6O.js.map} +0 -0
- /package/dist/{chunk-QQSRZUT4.js.map → chunk-ZXEDKRRT.js.map} +0 -0
|
@@ -29,9 +29,16 @@ export declare const headerStyles: (theme: Theme) => CSSObject;
|
|
|
29
29
|
* take the page's text colour onto its own surface.
|
|
30
30
|
*/
|
|
31
31
|
export declare const titleStyles: (theme: Theme) => CSSObject;
|
|
32
|
-
/** The
|
|
32
|
+
/** The most lines a card's summary shows before the rest goes behind the [i]. */
|
|
33
|
+
export declare const SUMMARY_MAX_LINES = 2;
|
|
34
|
+
/**
|
|
35
|
+
* Two lines at most, cut with an ellipsis. Visual only: the whole sentence stays
|
|
36
|
+
* in the DOM, so a switch that is `aria-describedby` it still reads all of it.
|
|
37
|
+
*/
|
|
38
|
+
export declare const clampStyles: CSSObject;
|
|
39
|
+
/** A closed card's value: two lines at most, the rest behind the [i]. */
|
|
33
40
|
export declare const summaryStyles: (theme: Theme) => CSSObject;
|
|
34
|
-
/** A switch card's explanation
|
|
41
|
+
/** A switch card's explanation; `SettingSwitchBlock` clamps it (see `clampStyles`). */
|
|
35
42
|
export declare const descriptionStyles: (theme: Theme) => CSSObject;
|
|
36
43
|
/** The inactive group's hint: a glyph and the sentence, so it does not read as a second summary. */
|
|
37
44
|
export declare const hintStyles: (theme: Theme) => CSSObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingCard.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingCard/SettingCard.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAO/E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,+FAA+F;AAC/F,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,CAAC,KAAK,CAAC,EACnB,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,KAC7B,OAAO,CAAC,KAAK,CAAgE,CAAC;AAEjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,EAAE,MAAM,OAAO,KAAG,SAgB1D,CAAC;AAEH,mEAAmE;AACnE,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,SAMxC,CAAC;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,SAK1C,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,KAAG,SAOzC,CAAC;AAEH,
|
|
1
|
+
{"version":3,"file":"SettingCard.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingCard/SettingCard.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAO/E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,+FAA+F;AAC/F,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,CAAC,KAAK,CAAC,EACnB,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,KAC7B,OAAO,CAAC,KAAK,CAAgE,CAAC;AAEjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,EAAE,MAAM,OAAO,KAAG,SAgB1D,CAAC;AAEH,mEAAmE;AACnE,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,SAMxC,CAAC;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,SAK1C,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,KAAG,SAOzC,CAAC;AAEH,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,SAKzB,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,SAK3C,CAAC;AAEH,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,KAAG,SAI/C,CAAC;AAEH,oGAAoG;AACpG,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,SAOxC,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,KAAG,SAIzC,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,SAM3C,CAAC;AAEH,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,SAIxC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,QAAQ,OAAO,KAAG,SAQ/D,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Whether a clamped element is hiding text — measured, never guessed from the
|
|
4
|
+
* string's length, because what fits depends on the width the card is GIVEN.
|
|
5
|
+
* Re-measured whenever the element resizes, so a card that widens drops its [i].
|
|
6
|
+
*/
|
|
7
|
+
export declare const useClamped: (content?: unknown) => {
|
|
8
|
+
ref: (node: HTMLElement | null) => void;
|
|
9
|
+
clamped: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* The [i] beside a card's title while its summary is cut: hover shows the whole
|
|
13
|
+
* text, a click or tap pins it — so it works on a phone, where there is no hover.
|
|
14
|
+
*/
|
|
15
|
+
export declare const SummaryInfo: React.FC<{
|
|
16
|
+
label: string;
|
|
17
|
+
summary: React.ReactNode;
|
|
18
|
+
dataTestId?: string;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* The summary's measuring ref, and the [i] for the header while it is cut —
|
|
22
|
+
* `null` when there is no summary, it fits, or `show` is false (an open card).
|
|
23
|
+
*/
|
|
24
|
+
export declare const useSummaryInfo: ({ summary, show, label, dataTestId, }: {
|
|
25
|
+
summary: React.ReactNode;
|
|
26
|
+
show?: boolean;
|
|
27
|
+
label: string;
|
|
28
|
+
dataTestId?: string;
|
|
29
|
+
}) => {
|
|
30
|
+
ref: (node: HTMLElement | null) => void;
|
|
31
|
+
info: React.ReactNode;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=SettingCard.summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingCard.summary.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingCard/SettingCard.summary.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAStE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,UAAU,OAAO,KAAG;IAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAkBzG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAuClG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,uCAK5B;IACD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG;IAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;CAInE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingSwitch.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingCard/SettingSwitch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAKrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingSwitch.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingCard/SettingSwitch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAKrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,wFAAwF;AACxF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,kBAAkB,EAClB,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,CAC/G,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1B,mFAAmF;AACnF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,QAAO,gBAQtC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CACvC,uBAAuB,GAAG;IAAE,GAAG,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;CAAE,CAsD9F,CAAC"}
|
|
@@ -31,6 +31,12 @@ export interface SettingCardCopy {
|
|
|
31
31
|
learnMore: string;
|
|
32
32
|
/** Shown when the save rejected and the host's `formatError` gave no sentence of its own. */
|
|
33
33
|
saveFailed: string;
|
|
34
|
+
/**
|
|
35
|
+
* The accessible name of the [i] beside the title while the summary is cut to
|
|
36
|
+
* two lines. Optional so a host's own copy object keeps compiling; without it
|
|
37
|
+
* the [i] is named after the card's title.
|
|
38
|
+
*/
|
|
39
|
+
moreInfo?: string;
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* What a switch that saves the moment it flips says about that save — shared
|
|
@@ -41,5 +47,7 @@ export interface SettingSwitchCopy {
|
|
|
41
47
|
saving: string;
|
|
42
48
|
/** Shown when the save rejected and the host's `formatError` gave no sentence of its own. */
|
|
43
49
|
saveFailed: string;
|
|
50
|
+
/** The [i]'s accessible name — see `SettingCardCopy.moreInfo`. */
|
|
51
|
+
moreInfo?: string;
|
|
44
52
|
}
|
|
45
53
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/copy/layout.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/copy/layout.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en-US.layout.d.ts","sourceRoot":"","sources":["../../src/en-US.layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"en-US.layout.d.ts","sourceRoot":"","sources":["../../src/en-US.layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAQrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAIvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pt-BR.layout.d.ts","sourceRoot":"","sources":["../../src/pt-BR.layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"pt-BR.layout.d.ts","sourceRoot":"","sources":["../../src/pt-BR.layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAQrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAIvC,CAAC"}
|
package/dist/user-avatar.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UserAvatar,
|
|
3
3
|
UserMenu
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WOP2DRMC.js";
|
|
5
5
|
import "./chunk-UDQSIRAP.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-EMEXXAQI.js";
|
|
7
|
+
import "./chunk-Y6C4MYZE.js";
|
|
8
|
+
import "./chunk-MTEQEPNY.js";
|
|
8
9
|
import "./chunk-6ZZGK5DT.js";
|
|
9
10
|
import "./chunk-3ZVUNSFF.js";
|
|
10
|
-
import "./chunk-MTEQEPNY.js";
|
|
11
11
|
import "./chunk-VUHLNYAE.js";
|
|
12
12
|
import "./chunk-2GSIEDGN.js";
|
|
13
13
|
import "./chunk-WN5PNP6F.js";
|
package/package.json
CHANGED
|
@@ -34,6 +34,7 @@ The AlertDialog component provides a modal dialog for alerts, confirmations, and
|
|
|
34
34
|
| `showCancel` | `boolean` | true | Whether to show the cancel button |
|
|
35
35
|
| `confirmDisabled` | `boolean` | false | Whether the confirm button is disabled |
|
|
36
36
|
| `loading` | `boolean` | false | Shows loading state on confirm button |
|
|
37
|
+
| `emphasis` | `'confirm' \| 'cancel'` | 'confirm' | Which button is filled and takes the primary slot (right, or top when the row stacks). Use `cancel` when the confirm is the loss, e.g. "discard what you wrote?": the confirm becomes the neutral outline, both buttons grow to share the row, and focus opens on the cancel. Ignored when `showCancel` is false |
|
|
37
38
|
|
|
38
39
|
### Visual Props
|
|
39
40
|
|
|
@@ -124,6 +125,35 @@ function DeleteConfirmation() {
|
|
|
124
125
|
/>
|
|
125
126
|
```
|
|
126
127
|
|
|
128
|
+
### Steering Toward Cancel
|
|
129
|
+
|
|
130
|
+
When confirming throws work away, make keeping it the primary action: the
|
|
131
|
+
filled cancel takes the primary slot and the confirm becomes the neutral
|
|
132
|
+
outline — primary and neutral, even on the destructive variant.
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
<AlertDialog
|
|
136
|
+
open={open}
|
|
137
|
+
variant="destructive"
|
|
138
|
+
emphasis="cancel"
|
|
139
|
+
initialFocus="cancel"
|
|
140
|
+
title="Discard this order?"
|
|
141
|
+
description="You have already written 3 items."
|
|
142
|
+
confirmText="Discard"
|
|
143
|
+
cancelText="Keep writing"
|
|
144
|
+
onConfirm={handleDiscard}
|
|
145
|
+
onCancel={() => setOpen(false)}
|
|
146
|
+
onClose={() => setOpen(false)}
|
|
147
|
+
/>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Button Layout
|
|
151
|
+
|
|
152
|
+
The action row wraps whole buttons and never breaks a label inside one. A pair
|
|
153
|
+
that fits keeps its natural widths, pushed to the right; a pair that does not
|
|
154
|
+
stacks, with the primary on top. With `emphasis="cancel"` the two buttons also
|
|
155
|
+
grow to share the row, so stacked they take its full width.
|
|
156
|
+
|
|
127
157
|
### Without Cancel Button
|
|
128
158
|
|
|
129
159
|
```tsx
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The AlertDialog's action row, kept apart from the dialog shell so each stays
|
|
3
|
+
* inside the complexity budget: which button is filled, where each one sits,
|
|
4
|
+
* and how the row wraps.
|
|
5
|
+
*/
|
|
6
|
+
import type { ButtonProps } from '@mui/material/Button/index.js';
|
|
7
|
+
import Button from '@mui/material/Button/index.js';
|
|
8
|
+
import CircularProgress from '@mui/material/CircularProgress/index.js';
|
|
9
|
+
import DialogActions from '@mui/material/DialogActions/index.js';
|
|
10
|
+
import { styled, useTheme } from '@mui/material/styles/index.js';
|
|
11
|
+
import React from 'react';
|
|
12
|
+
|
|
13
|
+
import { rem } from '../../../tokens/relative';
|
|
14
|
+
|
|
15
|
+
import type { AlertDialogProps } from './AlertDialog.types';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The action row WRAPS WHOLE BUTTONS; it never breaks a label inside one. A pair
|
|
19
|
+
* that did not fit side by side used to squeeze the longer label onto two
|
|
20
|
+
* lines, so one button stood twice as tall as its neighbour. Now the row breaks
|
|
21
|
+
* instead. `wrap-reverse` puts the LAST button — the primary, whichever
|
|
22
|
+
* `emphasis` picks — on top when it stacks, the same slot it holds on the right
|
|
23
|
+
* when the row fits. A pair that fits is laid out exactly as before: natural
|
|
24
|
+
* widths, pushed to the right.
|
|
25
|
+
*
|
|
26
|
+
* `fill` — set only by `emphasis="cancel"` — lets the buttons grow to share the
|
|
27
|
+
* row, and so to take the full width of their line once it stacks. It is not
|
|
28
|
+
* the default because growing also stretches a pair that fits, which would
|
|
29
|
+
* redraw every existing dialog's footer.
|
|
30
|
+
*
|
|
31
|
+
* Rendered with `disableSpacing`: MUI's own spacing is a left margin on every
|
|
32
|
+
* button after the first, which would indent a button that wrapped onto a line
|
|
33
|
+
* of its own. The gaps below replace it, at the same 16px across.
|
|
34
|
+
*/
|
|
35
|
+
const StyledDialogActions = styled(DialogActions, {
|
|
36
|
+
shouldForwardProp: (prop) => prop !== 'fill',
|
|
37
|
+
})<{ fill: boolean }>(({ theme, fill }) => ({
|
|
38
|
+
padding: theme.spacing(2, 3, 3, 3),
|
|
39
|
+
flexWrap: 'wrap-reverse',
|
|
40
|
+
columnGap: theme.spacing(2),
|
|
41
|
+
rowGap: theme.spacing(1),
|
|
42
|
+
...(fill && { '& > .MuiButton-root': { flexGrow: 1 } }),
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
const confirmButtonColor = (variant: AlertDialogProps['variant']): 'error' | 'primary' =>
|
|
46
|
+
variant === 'destructive' ? 'error' : 'primary';
|
|
47
|
+
|
|
48
|
+
interface ButtonLook {
|
|
49
|
+
variant: ButtonProps['variant'];
|
|
50
|
+
color: ButtonProps['color'];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* How each button is drawn, by `emphasis`: the emphasised one is filled, the
|
|
55
|
+
* other a NEUTRAL outline. Primary / neutral both ways round — a confirm that
|
|
56
|
+
* steps down drops the variant's colour too, so the one filled button is the
|
|
57
|
+
* only coloured thing in the row and the eye has a single place to land.
|
|
58
|
+
*/
|
|
59
|
+
const buttonLooks = (
|
|
60
|
+
emphasis: AlertDialogProps['emphasis'],
|
|
61
|
+
variant: AlertDialogProps['variant'],
|
|
62
|
+
): { cancel: ButtonLook; confirm: ButtonLook } =>
|
|
63
|
+
emphasis === 'cancel'
|
|
64
|
+
? {
|
|
65
|
+
cancel: { variant: 'contained', color: 'primary' },
|
|
66
|
+
confirm: { variant: 'outlined', color: 'inherit' },
|
|
67
|
+
}
|
|
68
|
+
: {
|
|
69
|
+
cancel: { variant: 'outlined', color: 'inherit' },
|
|
70
|
+
confirm: { variant: 'contained', color: confirmButtonColor(variant) },
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The emphasis that applies: `cancel` only while the cancel is shown. A hidden
|
|
75
|
+
* cancel with the confirm stepped down would leave a dialog with no primary.
|
|
76
|
+
*/
|
|
77
|
+
const effectiveEmphasis = (
|
|
78
|
+
emphasis: AlertDialogProps['emphasis'],
|
|
79
|
+
showCancel: boolean,
|
|
80
|
+
): NonNullable<AlertDialogProps['emphasis']> =>
|
|
81
|
+
emphasis === 'cancel' && showCancel ? 'cancel' : 'confirm';
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Whether the cancel owns focus on open: what `initialFocus` says, and when it
|
|
85
|
+
* says nothing, the emphasised button — so Enter on a steered question keeps
|
|
86
|
+
* the work instead of completing the loss.
|
|
87
|
+
*/
|
|
88
|
+
const focusesCancel = (
|
|
89
|
+
initialFocus: AlertDialogProps['initialFocus'],
|
|
90
|
+
emphasis: NonNullable<AlertDialogProps['emphasis']>,
|
|
91
|
+
): boolean => (initialFocus ?? emphasis) === 'cancel';
|
|
92
|
+
|
|
93
|
+
/** The two buttons in slot order: the emphasised one LAST, the primary slot. */
|
|
94
|
+
const inSlotOrder = (
|
|
95
|
+
emphasis: AlertDialogProps['emphasis'],
|
|
96
|
+
cancel: React.ReactNode,
|
|
97
|
+
confirm: React.ReactNode,
|
|
98
|
+
): React.ReactNode[] => (emphasis === 'cancel' ? [confirm, cancel] : [cancel, confirm]);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Action row: the optional cancel button and the (variant-coloured) confirm,
|
|
102
|
+
* with the emphasised one LAST — the primary slot, on the right or, once the
|
|
103
|
+
* row stacks, on top. DOM order is the tab order, so it follows the same rule.
|
|
104
|
+
*/
|
|
105
|
+
export function AlertDialogFooter({
|
|
106
|
+
variant,
|
|
107
|
+
cancelText = 'Cancel',
|
|
108
|
+
confirmText = 'Confirm',
|
|
109
|
+
showCancel = true,
|
|
110
|
+
loading = false,
|
|
111
|
+
confirmDisabled = false,
|
|
112
|
+
initialFocus,
|
|
113
|
+
emphasis: asked,
|
|
114
|
+
onCancel,
|
|
115
|
+
onConfirm,
|
|
116
|
+
dataTestId,
|
|
117
|
+
}: Pick<
|
|
118
|
+
AlertDialogProps,
|
|
119
|
+
| 'variant'
|
|
120
|
+
| 'cancelText'
|
|
121
|
+
| 'confirmText'
|
|
122
|
+
| 'showCancel'
|
|
123
|
+
| 'loading'
|
|
124
|
+
| 'confirmDisabled'
|
|
125
|
+
| 'initialFocus'
|
|
126
|
+
| 'emphasis'
|
|
127
|
+
> & {
|
|
128
|
+
onCancel: () => void;
|
|
129
|
+
onConfirm: () => void;
|
|
130
|
+
dataTestId: string;
|
|
131
|
+
}): React.ReactElement {
|
|
132
|
+
const theme = useTheme();
|
|
133
|
+
const emphasis = effectiveEmphasis(asked, showCancel);
|
|
134
|
+
const look = buttonLooks(emphasis, variant);
|
|
135
|
+
const cancelFocused = focusesCancel(initialFocus, emphasis);
|
|
136
|
+
const cancel = showCancel && (
|
|
137
|
+
<Button
|
|
138
|
+
key="cancel"
|
|
139
|
+
onClick={onCancel}
|
|
140
|
+
variant={look.cancel.variant}
|
|
141
|
+
color={look.cancel.color}
|
|
142
|
+
disabled={loading}
|
|
143
|
+
autoFocus={cancelFocused}
|
|
144
|
+
data-testid={`${dataTestId}-cancel-button`}
|
|
145
|
+
>
|
|
146
|
+
{cancelText}
|
|
147
|
+
</Button>
|
|
148
|
+
);
|
|
149
|
+
const confirm = (
|
|
150
|
+
<Button
|
|
151
|
+
key="confirm"
|
|
152
|
+
onClick={onConfirm}
|
|
153
|
+
variant={look.confirm.variant}
|
|
154
|
+
color={look.confirm.color}
|
|
155
|
+
disabled={confirmDisabled || loading}
|
|
156
|
+
startIcon={
|
|
157
|
+
loading ? (
|
|
158
|
+
<CircularProgress
|
|
159
|
+
size={rem(theme, 16)}
|
|
160
|
+
color="inherit"
|
|
161
|
+
data-testid={`${dataTestId}-loading-spinner`}
|
|
162
|
+
/>
|
|
163
|
+
) : undefined
|
|
164
|
+
}
|
|
165
|
+
autoFocus={!cancelFocused}
|
|
166
|
+
data-testid={`${dataTestId}-confirm-button`}
|
|
167
|
+
>
|
|
168
|
+
{confirmText}
|
|
169
|
+
</Button>
|
|
170
|
+
);
|
|
171
|
+
return (
|
|
172
|
+
<StyledDialogActions
|
|
173
|
+
disableSpacing
|
|
174
|
+
fill={emphasis === 'cancel'}
|
|
175
|
+
data-testid={`${dataTestId}-actions`}
|
|
176
|
+
>
|
|
177
|
+
{inSlotOrder(emphasis, cancel, confirm)}
|
|
178
|
+
</StyledDialogActions>
|
|
179
|
+
);
|
|
180
|
+
}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import Close from '@mui/icons-material/Close';
|
|
2
2
|
import Error from '@mui/icons-material/Error';
|
|
3
3
|
import Info from '@mui/icons-material/Info';
|
|
4
|
-
import type { ButtonProps } from '@mui/material/Button/index.js';
|
|
5
|
-
import Button from '@mui/material/Button/index.js';
|
|
6
|
-
import CircularProgress from '@mui/material/CircularProgress/index.js';
|
|
7
4
|
import Dialog from '@mui/material/Dialog/index.js';
|
|
8
|
-
import DialogActions from '@mui/material/DialogActions/index.js';
|
|
9
5
|
import DialogContent from '@mui/material/DialogContent/index.js';
|
|
10
6
|
import DialogContentText from '@mui/material/DialogContentText/index.js';
|
|
11
7
|
import DialogTitle from '@mui/material/DialogTitle/index.js';
|
|
12
8
|
import IconButton from '@mui/material/IconButton/index.js';
|
|
13
9
|
import Typography from '@mui/material/Typography/index.js';
|
|
14
|
-
import { alpha, keyframes, styled
|
|
10
|
+
import { alpha, keyframes, styled } from '@mui/material/styles/index.js';
|
|
15
11
|
import type { Theme } from '@mui/material/styles/index.js';
|
|
16
12
|
import React from 'react';
|
|
17
13
|
|
|
18
14
|
import { neutralTones } from '../../../tokens/ink';
|
|
19
15
|
|
|
16
|
+
import { AlertDialogFooter } from './AlertDialog.parts';
|
|
20
17
|
import type { AlertDialogProps } from './AlertDialog.types';
|
|
21
18
|
import { rem, rems } from '../../../tokens/relative';
|
|
22
19
|
|
|
@@ -140,11 +137,6 @@ const StyledDialogContent = styled(DialogContent)(({ theme }) => ({
|
|
|
140
137
|
paddingBottom: theme.spacing(2),
|
|
141
138
|
}));
|
|
142
139
|
|
|
143
|
-
const StyledDialogActions = styled(DialogActions)(({ theme }) => ({
|
|
144
|
-
padding: theme.spacing(2, 3, 3, 3),
|
|
145
|
-
gap: theme.spacing(1),
|
|
146
|
-
}));
|
|
147
|
-
|
|
148
140
|
const CloseButton = styled(IconButton)(({ theme }) => ({
|
|
149
141
|
position: 'absolute',
|
|
150
142
|
right: theme.spacing(1),
|
|
@@ -208,11 +200,6 @@ function ariaSlotProps(
|
|
|
208
200
|
};
|
|
209
201
|
}
|
|
210
202
|
|
|
211
|
-
/** Both variants render a filled confirm; only the colour distinguishes them. */
|
|
212
|
-
const CONFIRM_BUTTON_VARIANT: ButtonProps['variant'] = 'contained';
|
|
213
|
-
const confirmButtonColor = (variant: AlertDialogProps['variant']): 'error' | 'primary' =>
|
|
214
|
-
variant === 'destructive' ? 'error' : 'primary';
|
|
215
|
-
|
|
216
203
|
/** Title row: the variant icon (unless explicitly suppressed with `null`) + the title. */
|
|
217
204
|
function AlertDialogHeader({
|
|
218
205
|
title,
|
|
@@ -238,70 +225,6 @@ function AlertDialogHeader({
|
|
|
238
225
|
);
|
|
239
226
|
}
|
|
240
227
|
|
|
241
|
-
/** Action row: the optional cancel button and the (variant-coloured) confirm. */
|
|
242
|
-
function AlertDialogFooter({
|
|
243
|
-
variant,
|
|
244
|
-
cancelText = 'Cancel',
|
|
245
|
-
confirmText = 'Confirm',
|
|
246
|
-
showCancel = true,
|
|
247
|
-
loading = false,
|
|
248
|
-
confirmDisabled = false,
|
|
249
|
-
initialFocus = 'confirm',
|
|
250
|
-
onCancel,
|
|
251
|
-
onConfirm,
|
|
252
|
-
dataTestId,
|
|
253
|
-
}: Pick<
|
|
254
|
-
AlertDialogProps,
|
|
255
|
-
| 'variant'
|
|
256
|
-
| 'cancelText'
|
|
257
|
-
| 'confirmText'
|
|
258
|
-
| 'showCancel'
|
|
259
|
-
| 'loading'
|
|
260
|
-
| 'confirmDisabled'
|
|
261
|
-
| 'initialFocus'
|
|
262
|
-
> & {
|
|
263
|
-
onCancel: () => void;
|
|
264
|
-
onConfirm: () => void;
|
|
265
|
-
dataTestId: string;
|
|
266
|
-
}): React.ReactElement {
|
|
267
|
-
const theme = useTheme();
|
|
268
|
-
return (
|
|
269
|
-
<StyledDialogActions data-testid={`${dataTestId}-actions`}>
|
|
270
|
-
{showCancel && (
|
|
271
|
-
<Button
|
|
272
|
-
onClick={onCancel}
|
|
273
|
-
variant="outlined"
|
|
274
|
-
color="inherit"
|
|
275
|
-
disabled={loading}
|
|
276
|
-
autoFocus={initialFocus === 'cancel'}
|
|
277
|
-
data-testid={`${dataTestId}-cancel-button`}
|
|
278
|
-
>
|
|
279
|
-
{cancelText}
|
|
280
|
-
</Button>
|
|
281
|
-
)}
|
|
282
|
-
<Button
|
|
283
|
-
onClick={onConfirm}
|
|
284
|
-
variant={CONFIRM_BUTTON_VARIANT}
|
|
285
|
-
color={confirmButtonColor(variant)}
|
|
286
|
-
disabled={confirmDisabled || loading}
|
|
287
|
-
startIcon={
|
|
288
|
-
loading ? (
|
|
289
|
-
<CircularProgress
|
|
290
|
-
size={rem(theme, 16)}
|
|
291
|
-
color="inherit"
|
|
292
|
-
data-testid={`${dataTestId}-loading-spinner`}
|
|
293
|
-
/>
|
|
294
|
-
) : undefined
|
|
295
|
-
}
|
|
296
|
-
autoFocus={initialFocus !== 'cancel'}
|
|
297
|
-
data-testid={`${dataTestId}-confirm-button`}
|
|
298
|
-
>
|
|
299
|
-
{confirmText}
|
|
300
|
-
</Button>
|
|
301
|
-
</StyledDialogActions>
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
228
|
export const AlertDialog = React.forwardRef<HTMLDivElement, AlertDialogProps>(
|
|
306
229
|
({
|
|
307
230
|
variant = 'default',
|
|
@@ -318,6 +241,7 @@ export const AlertDialog = React.forwardRef<HTMLDivElement, AlertDialogProps>(
|
|
|
318
241
|
loading,
|
|
319
242
|
confirmDisabled,
|
|
320
243
|
initialFocus,
|
|
244
|
+
emphasis,
|
|
321
245
|
children,
|
|
322
246
|
onClose,
|
|
323
247
|
'data-testid': dataTestId = 'alert-dialog',
|
|
@@ -348,12 +272,7 @@ export const AlertDialog = React.forwardRef<HTMLDivElement, AlertDialogProps>(
|
|
|
348
272
|
<Close />
|
|
349
273
|
</CloseButton>
|
|
350
274
|
|
|
351
|
-
<AlertDialogHeader
|
|
352
|
-
title={title}
|
|
353
|
-
icon={icon}
|
|
354
|
-
variant={variant}
|
|
355
|
-
dataTestId={dataTestId}
|
|
356
|
-
/>
|
|
275
|
+
<AlertDialogHeader title={title} icon={icon} variant={variant} dataTestId={dataTestId} />
|
|
357
276
|
|
|
358
277
|
<StyledDialogContent data-testid={`${dataTestId}-content`}>
|
|
359
278
|
{description && (
|
|
@@ -375,6 +294,7 @@ export const AlertDialog = React.forwardRef<HTMLDivElement, AlertDialogProps>(
|
|
|
375
294
|
loading={loading}
|
|
376
295
|
confirmDisabled={confirmDisabled}
|
|
377
296
|
initialFocus={initialFocus}
|
|
297
|
+
emphasis={emphasis}
|
|
378
298
|
onCancel={handleCancel}
|
|
379
299
|
onConfirm={() => onConfirm?.()}
|
|
380
300
|
dataTestId={dataTestId}
|
|
@@ -68,12 +68,26 @@ export interface AlertDialogProps extends Omit<MuiDialogProps, 'variant'> {
|
|
|
68
68
|
confirmDisabled?: boolean;
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
|
-
* Which button owns focus when the dialog opens. Defaults to
|
|
72
|
-
*
|
|
73
|
-
*
|
|
71
|
+
* Which button owns focus when the dialog opens. Defaults to the emphasised
|
|
72
|
+
* one — `confirm`, unless `emphasis="cancel"` — which is right for an
|
|
73
|
+
* acknowledgement; a destructive dialog should pass `cancel` so a stray Enter
|
|
74
|
+
* on the trigger cannot complete the action.
|
|
74
75
|
*/
|
|
75
76
|
initialFocus?: 'confirm' | 'cancel';
|
|
76
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Which button is the filled, primary one. Defaults to `confirm`. Pass
|
|
80
|
+
* `cancel` when backing out is the action to steer toward — a "discard what
|
|
81
|
+
* you wrote?" question, where the confirm is the loss: cancel is then filled
|
|
82
|
+
* and takes the primary slot (right, or on top once the row stacks), and the
|
|
83
|
+
* confirm steps down to the neutral outline cancel normally wears — primary
|
|
84
|
+
* and neutral, whatever the variant. The two buttons then grow to share the
|
|
85
|
+
* row, so once it stacks each takes its full width; focus opens on the cancel
|
|
86
|
+
* unless `initialFocus` says otherwise. With `showCancel={false}` it has no
|
|
87
|
+
* effect: the confirm keeps its default, filled look.
|
|
88
|
+
*/
|
|
89
|
+
emphasis?: 'confirm' | 'cancel';
|
|
90
|
+
|
|
77
91
|
/**
|
|
78
92
|
* Optional data-testid attribute for testing
|
|
79
93
|
*/
|
|
@@ -97,3 +97,39 @@ export const usePinnedTooltip = ({ clickable, onPin, onUnpin }: PinOptions) => {
|
|
|
97
97
|
|
|
98
98
|
return { isPinned, isControlledOpen, wrapperRef, handleClick };
|
|
99
99
|
};
|
|
100
|
+
|
|
101
|
+
type OnOpen = NonNullable<InteractiveTooltipProps['onOpen']>;
|
|
102
|
+
type OnClose = NonNullable<InteractiveTooltipProps['onClose']>;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The hover half of the tooltip's open state, so the MUI Tooltip is controlled
|
|
106
|
+
* from its first render (FUT-3013). It used to receive `open={undefined}` while
|
|
107
|
+
* hovering and a boolean once pinned, which MUI reports as a component switching
|
|
108
|
+
* from uncontrolled to controlled on the first click. The caller's own
|
|
109
|
+
* onOpen/onClose still run.
|
|
110
|
+
*
|
|
111
|
+
* Unpinning also closes it: the hover listeners are off while pinned, so a
|
|
112
|
+
* hover state left `true` from before the pin would otherwise keep the tooltip
|
|
113
|
+
* open after the click outside that unpinned it.
|
|
114
|
+
*/
|
|
115
|
+
export const useHoverOpen = (
|
|
116
|
+
isPinned: boolean,
|
|
117
|
+
onOpen?: OnOpen,
|
|
118
|
+
onClose?: OnClose,
|
|
119
|
+
): { open: boolean; onOpen: OnOpen; onClose: OnClose } => {
|
|
120
|
+
const [open, setOpen] = useState(false);
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (!isPinned) setOpen(false);
|
|
123
|
+
}, [isPinned]);
|
|
124
|
+
return {
|
|
125
|
+
open,
|
|
126
|
+
onOpen: (event) => {
|
|
127
|
+
setOpen(true);
|
|
128
|
+
onOpen?.(event);
|
|
129
|
+
},
|
|
130
|
+
onClose: (event) => {
|
|
131
|
+
setOpen(false);
|
|
132
|
+
onClose?.(event);
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
};
|
|
@@ -2,7 +2,7 @@ import MuiTooltip from '@mui/material/Tooltip/index.js';
|
|
|
2
2
|
import { styled } from '@mui/material/styles/index.js';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
|
|
5
|
-
import { resolveTooltipProps, usePinnedTooltip } from './InteractiveTooltip.hooks';
|
|
5
|
+
import { resolveTooltipProps, useHoverOpen, usePinnedTooltip } from './InteractiveTooltip.hooks';
|
|
6
6
|
import {
|
|
7
7
|
arrowColor,
|
|
8
8
|
emphasisStyles,
|
|
@@ -58,6 +58,8 @@ export const InteractiveTooltip = React.forwardRef<HTMLDivElement, InteractiveTo
|
|
|
58
58
|
onUnpin,
|
|
59
59
|
className,
|
|
60
60
|
children,
|
|
61
|
+
onOpen,
|
|
62
|
+
onClose,
|
|
61
63
|
...props
|
|
62
64
|
} = resolveTooltipProps(rawProps);
|
|
63
65
|
|
|
@@ -66,6 +68,7 @@ export const InteractiveTooltip = React.forwardRef<HTMLDivElement, InteractiveTo
|
|
|
66
68
|
onPin,
|
|
67
69
|
onUnpin,
|
|
68
70
|
});
|
|
71
|
+
const hover = useHoverOpen(isPinned, onOpen, onClose);
|
|
69
72
|
|
|
70
73
|
// Determine which content to show
|
|
71
74
|
const tooltipContent = isPinned ? pinnedContent : hoverContent;
|
|
@@ -94,7 +97,9 @@ export const InteractiveTooltip = React.forwardRef<HTMLDivElement, InteractiveTo
|
|
|
94
97
|
glow={glow}
|
|
95
98
|
pulse={pulse}
|
|
96
99
|
title={tooltipContent}
|
|
97
|
-
open={isPinned ? isControlledOpen :
|
|
100
|
+
open={isPinned ? isControlledOpen : hover.open}
|
|
101
|
+
onOpen={hover.onOpen}
|
|
102
|
+
onClose={hover.onClose}
|
|
98
103
|
enterDelay={isPinned ? 0 : 100}
|
|
99
104
|
leaveDelay={0}
|
|
100
105
|
disableHoverListener={isPinned}
|
|
@@ -51,7 +51,7 @@ const [draft, setDraft] = useState<number | null>(saved);
|
|
|
51
51
|
| `title` | `string` | **required** | The setting's name. A heading, and the accessible name of the card's region. |
|
|
52
52
|
| `onSave` | `() => void \| Promise<unknown>` | **required** | Persist the draft. See *Saving* below. |
|
|
53
53
|
| `children` | `ReactNode` | **required** | The form. Rendered only while open. |
|
|
54
|
-
| `summary` | `ReactNode` | — |
|
|
54
|
+
| `summary` | `ReactNode` | — | What a closed card shows under its title: two lines at most, then an ellipsis. While it is cut, an [i] beside the title shows the whole text (hover, or a click/tap that pins it). |
|
|
55
55
|
| `status` | `{ label: string; color?: ColorValue }` | — | The pill beside the title. `label` is always shown, so colour never carries the meaning alone. |
|
|
56
56
|
| `learnMore` | `ReactNode` | — | Longer explanation behind a disclosure in the open card. Omit for no disclosure. |
|
|
57
57
|
| `onCancel` | `() => void` | — | The card closed without saving. Reset the host's draft here. |
|
|
@@ -13,6 +13,11 @@ export const SETTING_CARD = {
|
|
|
13
13
|
groupRuleWidth: 2,
|
|
14
14
|
/** The narrowest a grid column gets by default. */
|
|
15
15
|
gridMinColumnWidth: 320,
|
|
16
|
+
/** The widest the [i]'s full-summary tooltip gets. */
|
|
17
|
+
infoMaxWidth: 360,
|
|
18
|
+
/** The [i]'s keyboard focus ring: its width, and its gap from the glyph. */
|
|
19
|
+
infoFocusRingWidth: 2,
|
|
20
|
+
infoFocusRingOffset: 2,
|
|
16
21
|
} as const;
|
|
17
22
|
|
|
18
23
|
/** The grid's default gap, in theme SPACING units (not px): what `sx`'s `gap: 2` means. */
|