@12-apps/ui 6.56.0 → 6.57.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/NATIVE.md +2 -2
- package/components-catalog.md +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +5 -5
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +12 -12
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +3 -3
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +5 -5
- package/dist/_internal/components/data-display/Progress/Progress.js +1 -1
- package/dist/_internal/components/data-display/index.js +1 -1
- package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
- package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +1 -1
- package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
- package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +1 -1
- package/dist/_internal/components/feedback/index.js +4 -4
- package/dist/_internal/components/index.js +15 -15
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +3 -3
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +6 -6
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +6 -6
- package/dist/_internal/components/layout/index.js +9 -9
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -3
- package/dist/_internal/components/navigation/index.js +3 -3
- package/dist/_internal/icons/Icon.js +2 -2
- package/dist/_internal/icons/paths.generated.js +1 -1
- package/dist/{chunk-4EJBLJZK.js → chunk-2KGYTJCN.js} +50 -29
- package/dist/chunk-2KGYTJCN.js.map +1 -0
- package/dist/{chunk-MQSI57HY.js → chunk-45PGSVOH.js} +2 -2
- package/dist/{chunk-CLC4VIOF.js → chunk-4PYEDDYV.js} +2 -2
- package/dist/{chunk-JWXGZ4VM.js → chunk-6J27G2HT.js} +2 -2
- package/dist/{chunk-WGFHZNFR.js → chunk-AEIJSEVV.js} +4 -1
- package/dist/{chunk-WGFHZNFR.js.map → chunk-AEIJSEVV.js.map} +1 -1
- package/dist/{chunk-3S44O3WI.js → chunk-BJMNAPKH.js} +4 -4
- package/dist/{chunk-6E4XNOAC.js → chunk-CCCILWYZ.js} +4 -4
- package/dist/{chunk-Y2HCYT5W.js → chunk-GRRW5NSR.js} +2 -2
- package/dist/{chunk-NZZ2BTIK.js → chunk-H7R6UKOE.js} +2 -2
- package/dist/{chunk-DSDZIBLQ.js → chunk-ICSXPZXT.js} +2 -2
- package/dist/{chunk-AL3Z24VG.js → chunk-ILQVNZ5B.js} +2 -2
- package/dist/{chunk-5PN5MY2X.js → chunk-INQO5AYV.js} +3 -3
- package/dist/{chunk-2DV64INT.js → chunk-KEDZTZCV.js} +2 -2
- package/dist/{chunk-ZJC5COCE.js → chunk-N4MR4EMC.js} +3 -3
- package/dist/{chunk-KMW7GGX6.js → chunk-OGBLNORM.js} +2 -2
- package/dist/{chunk-44JLXXWQ.js → chunk-PPITQH3C.js} +2 -2
- package/dist/{chunk-JC244QQF.js → chunk-SEWUYHSG.js} +2 -2
- package/dist/{chunk-XTHDWW4M.js → chunk-VAY6KESM.js} +7 -4
- package/dist/chunk-VAY6KESM.js.map +1 -0
- package/dist/{chunk-5XZEGI35.js → chunk-X7HCS3HP.js} +3 -3
- package/dist/{chunk-6ZLP7BA7.js → chunk-XC7YHO7Z.js} +3 -1
- package/dist/{chunk-6ZLP7BA7.js.map → chunk-XC7YHO7Z.js.map} +1 -1
- package/dist/{chunk-T2S7NIUG.js → chunk-XE4JVTM6.js} +2 -2
- package/dist/{chunk-SIWXMNQT.js → chunk-YDTCM5F6.js} +4 -4
- package/dist/{chunk-BQGWY577.js → chunk-ZCUVZ5PR.js} +3 -3
- package/dist/data-display/DataViews.js +12 -12
- package/dist/data-display/Progress.js +1 -1
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/StackedModal.js +2 -2
- package/dist/icons.js +2 -2
- package/dist/layout/SettingCard.js +9 -9
- package/dist/native/chunks/{chunk-QGTZGL7P.js → chunk-BUFQXX27.js} +2 -2
- package/dist/native/chunks/{chunk-EZO2KJF7.js → chunk-JFKH5YHF.js} +3 -1
- package/dist/native/chunks/{chunk-EZO2KJF7.js.map → chunk-JFKH5YHF.js.map} +1 -1
- package/dist/native/data-display/Alert.js +1 -1
- package/dist/native/data-display/Avatar.js +1 -1
- package/dist/native/data-display/Badge.js +1 -1
- package/dist/native/data-display/Chip.js +1 -1
- package/dist/native/data-display/EmptyState.js +2 -2
- package/dist/native/data-display/ErrorState.js +1 -1
- package/dist/native/data-display/FleetMap.js +2 -2
- package/dist/native/data-display/Progress.js +11 -5
- package/dist/native/data-display/Progress.js.map +1 -1
- package/dist/native/feedback/Dialog.js +2 -1
- package/dist/native/feedback/Dialog.js.map +1 -1
- package/dist/native/form/Checkbox.js +1 -1
- package/dist/native/form/Select.js +1 -1
- package/dist/native/icons.js +1 -1
- package/dist/navigation/AppHeader.js +3 -3
- package/dist/types/components/data-display/Progress/Progress.base.d.ts +8 -0
- package/dist/types/components/data-display/Progress/Progress.base.d.ts.map +1 -1
- package/dist/types/components/data-display/Progress/Progress.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/Dialog.base.d.ts +2 -1
- package/dist/types/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
- package/dist/types/icons/paths.generated.d.ts +2 -0
- package/dist/types/icons/paths.generated.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Progress/Progress.base.d.ts +8 -0
- package/dist/types-native/components/data-display/Progress/Progress.base.d.ts.map +1 -1
- package/dist/types-native/components/data-display/Progress/Progress.native.d.ts.map +1 -1
- package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts +2 -1
- package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
- package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts.map +1 -1
- package/dist/types-native/icons/paths.generated.d.ts +2 -0
- package/dist/types-native/icons/paths.generated.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/Progress/Progress.base.ts +10 -0
- package/src/components/data-display/Progress/Progress.md +23 -0
- package/src/components/data-display/Progress/Progress.native.tsx +35 -25
- package/src/components/data-display/Progress/Progress.tsx +8 -5
- package/src/components/feedback/Dialog/Dialog.base.ts +2 -1
- package/src/components/feedback/Dialog/Dialog.look.native.ts +1 -0
- package/src/components/feedback/Dialog/Dialog.md +25 -1
- package/src/components/feedback/Dialog/Dialog.styles.ts +3 -0
- package/src/components/feedback/StackedModal/StackedModal.md +17 -2
- package/src/components/feedback/StackedModal/StackedModal.parts.tsx +19 -3
- package/src/icons/Icon.md +4 -0
- package/src/icons/glyphs.json +2 -0
- package/src/icons/paths.generated.ts +2 -0
- package/dist/chunk-4EJBLJZK.js.map +0 -1
- package/dist/chunk-XTHDWW4M.js.map +0 -1
- /package/dist/{chunk-MQSI57HY.js.map → chunk-45PGSVOH.js.map} +0 -0
- /package/dist/{chunk-CLC4VIOF.js.map → chunk-4PYEDDYV.js.map} +0 -0
- /package/dist/{chunk-JWXGZ4VM.js.map → chunk-6J27G2HT.js.map} +0 -0
- /package/dist/{chunk-3S44O3WI.js.map → chunk-BJMNAPKH.js.map} +0 -0
- /package/dist/{chunk-6E4XNOAC.js.map → chunk-CCCILWYZ.js.map} +0 -0
- /package/dist/{chunk-Y2HCYT5W.js.map → chunk-GRRW5NSR.js.map} +0 -0
- /package/dist/{chunk-NZZ2BTIK.js.map → chunk-H7R6UKOE.js.map} +0 -0
- /package/dist/{chunk-DSDZIBLQ.js.map → chunk-ICSXPZXT.js.map} +0 -0
- /package/dist/{chunk-AL3Z24VG.js.map → chunk-ILQVNZ5B.js.map} +0 -0
- /package/dist/{chunk-5PN5MY2X.js.map → chunk-INQO5AYV.js.map} +0 -0
- /package/dist/{chunk-2DV64INT.js.map → chunk-KEDZTZCV.js.map} +0 -0
- /package/dist/{chunk-ZJC5COCE.js.map → chunk-N4MR4EMC.js.map} +0 -0
- /package/dist/{chunk-KMW7GGX6.js.map → chunk-OGBLNORM.js.map} +0 -0
- /package/dist/{chunk-44JLXXWQ.js.map → chunk-PPITQH3C.js.map} +0 -0
- /package/dist/{chunk-JC244QQF.js.map → chunk-SEWUYHSG.js.map} +0 -0
- /package/dist/{chunk-5XZEGI35.js.map → chunk-X7HCS3HP.js.map} +0 -0
- /package/dist/{chunk-T2S7NIUG.js.map → chunk-XE4JVTM6.js.map} +0 -0
- /package/dist/{chunk-SIWXMNQT.js.map → chunk-YDTCM5F6.js.map} +0 -0
- /package/dist/{chunk-BQGWY577.js.map → chunk-ZCUVZ5PR.js.map} +0 -0
- /package/dist/native/chunks/{chunk-QGTZGL7P.js.map → chunk-BUFQXX27.js.map} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
1
2
|
import type { ColorValue, SizeValue } from '../../../tokens/vocabulary';
|
|
2
3
|
/**
|
|
3
4
|
* THE CONTRACT BOTH RENDERERS HONOUR — and nothing else.
|
|
@@ -37,6 +38,13 @@ export interface ProgressBaseProps {
|
|
|
37
38
|
* Custom label text
|
|
38
39
|
*/
|
|
39
40
|
label?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Custom content in the circular dial's center, independent of its value or
|
|
43
|
+
* animation. Replaces the visual label when non-null; ignored by other
|
|
44
|
+
* variants. Compose non-interactive content and name the progressbar with
|
|
45
|
+
* `aria-label` separately. Omit or pass null to keep `showLabel`/`label`.
|
|
46
|
+
*/
|
|
47
|
+
centerContent?: ReactNode;
|
|
40
48
|
/**
|
|
41
49
|
* Number of segments for segmented variant
|
|
42
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Progress.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Progress/Progress.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AACzF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"Progress.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Progress/Progress.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AACzF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Progress.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Progress/Progress.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAKL,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Progress.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Progress/Progress.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAKL,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AA2TtB;;;GAGG;AACH,eAAO,MAAM,QAAQ;;8BAyDnB,CAAC"}
|
|
@@ -11,13 +11,14 @@ import type { SizeValue } from '../../../tokens/vocabulary';
|
|
|
11
11
|
* either side: MUI's own `onClose` reason argument is dropped by `Dialog.tsx`
|
|
12
12
|
* before it reaches the caller, so both renderers pass a bare `() => void`.
|
|
13
13
|
*/
|
|
14
|
-
export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer';
|
|
14
|
+
export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer' | 'bottom-sheet';
|
|
15
15
|
export type DialogSize = SizeValue;
|
|
16
16
|
export type DialogBorderRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
17
17
|
export type DialogActionsAlignment = 'left' | 'center' | 'right' | 'space-between';
|
|
18
18
|
export interface DialogBaseProps {
|
|
19
19
|
open: boolean;
|
|
20
20
|
children: ReactNode;
|
|
21
|
+
/** `bottom-sheet` keeps the default paper and inset, aligned to the bottom. */
|
|
21
22
|
variant?: DialogVariant;
|
|
22
23
|
size?: DialogSize;
|
|
23
24
|
title?: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/Dialog/Dialog.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Dialog.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/Dialog/Dialog.base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,GAAG,cAAc,CAAC;AAC3F,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AACnC,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,eAAe,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.look.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/Dialog/Dialog.look.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAanF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;;;;;;;GAQG;AAEH,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE/E;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAIxD;AAYD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"Dialog.look.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/Dialog/Dialog.look.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAanF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;;;;;;;GAQG;AAEH,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE/E;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAIxD;AAYD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AA2DD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAI5G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,GAAG,UAAU,CAyBxE"}
|
|
@@ -44,6 +44,8 @@ export declare const ICON_PATHS: {
|
|
|
44
44
|
readonly Settings: readonly ["M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"];
|
|
45
45
|
readonly Visibility: readonly ["M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"];
|
|
46
46
|
readonly VisibilityOff: readonly ["M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z"];
|
|
47
|
+
readonly VolumeOff: readonly ["M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63m2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71M4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9zM12 4 9.91 6.09 12 8.18z"];
|
|
48
|
+
readonly VolumeUp: readonly ["M3 9v6h4l5 5V4L7 9zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02M14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77"];
|
|
47
49
|
readonly Warning: readonly ["M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"];
|
|
48
50
|
readonly WarningAmber: readonly ["M12 5.99 19.53 19H4.47zM12 2 1 21h22z", "M13 16h-2v2h2zm0-6h-2v5h2z"];
|
|
49
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"paths.generated.d.ts","sourceRoot":"","sources":["../../../src/icons/paths.generated.ts"],"names":[],"mappings":"AAOA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
1
3
|
import type { ColorValue, SizeValue } from '../../../tokens/vocabulary';
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -46,6 +48,14 @@ export interface ProgressBaseProps {
|
|
|
46
48
|
*/
|
|
47
49
|
label?: string;
|
|
48
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Custom content in the circular dial's center, independent of its value or
|
|
53
|
+
* animation. Replaces the visual label when non-null; ignored by other
|
|
54
|
+
* variants. Compose non-interactive content and name the progressbar with
|
|
55
|
+
* `aria-label` separately. Omit or pass null to keep `showLabel`/`label`.
|
|
56
|
+
*/
|
|
57
|
+
centerContent?: ReactNode;
|
|
58
|
+
|
|
49
59
|
/**
|
|
50
60
|
* Number of segments for segmented variant
|
|
51
61
|
*/
|
|
@@ -98,6 +98,28 @@ Show loading without specific progress value:
|
|
|
98
98
|
<Progress variant="circular" />
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
+
## Custom circular center
|
|
102
|
+
|
|
103
|
+
`centerContent` renders non-interactive React content in the center of a circular
|
|
104
|
+
dial, outside its rotating/animated ring. It works for determinate and
|
|
105
|
+
indeterminate progress and does not require `showLabel`. A non-null value
|
|
106
|
+
replaces the visual label; `null`/`undefined` keep the existing `label` and
|
|
107
|
+
`showLabel` behavior. Other variants ignore it.
|
|
108
|
+
|
|
109
|
+
Compose the content with shared typography/layout components. Native also wraps
|
|
110
|
+
raw strings/numbers (including fragments) in its caption Text style. The slot
|
|
111
|
+
does not name the progressbar: continue to supply an `aria-label` describing
|
|
112
|
+
what the value represents. The value/role semantics remain unchanged.
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
<Progress
|
|
116
|
+
variant="circular"
|
|
117
|
+
value={50}
|
|
118
|
+
aria-label="Task progress"
|
|
119
|
+
centerContent={<Typography variant="caption">Step 2 of 4</Typography>}
|
|
120
|
+
/>
|
|
121
|
+
```
|
|
122
|
+
|
|
101
123
|
## Props
|
|
102
124
|
|
|
103
125
|
| Prop | Type | Default | Description |
|
|
@@ -109,6 +131,7 @@ Show loading without specific progress value:
|
|
|
109
131
|
| `glow` | `boolean` | `false` | Enable glow effect |
|
|
110
132
|
| `pulse` | `boolean` | `false` | Enable pulse animation |
|
|
111
133
|
| `showLabel` | `boolean` | `false` | Display progress percentage |
|
|
134
|
+
| `centerContent` | `ReactNode` | - | Circular center content; replaces the visual label when non-null |
|
|
112
135
|
| `label` | `string` | - | Custom label text |
|
|
113
136
|
| `segments` | `number` | `8` | Number of segments (segmented variant) |
|
|
114
137
|
| `thickness` | `number` | - | Circle thickness (circular variant) |
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
} from './Progress.metrics';
|
|
35
35
|
import type { ProgressProps, ProgressSize, ProgressVariant } from './Progress.types.native';
|
|
36
36
|
import { useLoopedProgress } from '../../../platform/animation';
|
|
37
|
+
import { renderTextChildren } from '../../../platform/text-children';
|
|
37
38
|
import { useUiTheme } from '../../../provider/use-ui-theme.native';
|
|
38
39
|
import type { ColorValue } from '../../../tokens/vocabulary';
|
|
39
40
|
|
|
@@ -233,7 +234,8 @@ function CircularView({
|
|
|
233
234
|
rest,
|
|
234
235
|
thickness,
|
|
235
236
|
circularSize,
|
|
236
|
-
|
|
237
|
+
centerContent,
|
|
238
|
+
}: ViewArgs & { thickness: number; circularSize?: number; centerContent?: React.ReactNode }): React.JSX.Element {
|
|
237
239
|
const theme = useUiTheme();
|
|
238
240
|
const indeterminate = value === undefined;
|
|
239
241
|
const pulseStyle = usePulseStyle(pulse);
|
|
@@ -243,31 +245,37 @@ function CircularView({
|
|
|
243
245
|
|
|
244
246
|
return (
|
|
245
247
|
<View ref={containerRef} testID={testID} style={[styles.inline, style]}>
|
|
246
|
-
<
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
<
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
248
|
+
<View style={[box, styles.inline]}>
|
|
249
|
+
<Animated.View
|
|
250
|
+
testID={elementTestID}
|
|
251
|
+
role="progressbar"
|
|
252
|
+
{...valueAria(value)}
|
|
253
|
+
style={[box, glow ? circularGlowStyle(theme, color) : null, pulseStyle]}
|
|
254
|
+
{...rest}
|
|
255
|
+
>
|
|
256
|
+
<Animated.View style={[box, spin]}>
|
|
257
|
+
<CircularDial
|
|
258
|
+
diameter={diameter}
|
|
259
|
+
thickness={thickness}
|
|
260
|
+
stroke={progressPalette(theme, color).main}
|
|
261
|
+
dashOffset={
|
|
262
|
+
indeterminate
|
|
263
|
+
? circularCircumference(thickness) * (1 - CIRCULAR_INDETERMINATE.arc)
|
|
264
|
+
: circularDashOffset(displayValue, thickness)
|
|
265
|
+
}
|
|
266
|
+
/>
|
|
267
|
+
</Animated.View>
|
|
264
268
|
</Animated.View>
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
269
|
+
{centerContent != null ? (
|
|
270
|
+
<View testID={`${testID}-center`} style={[StyleSheet.absoluteFill, styles.centre]}>
|
|
271
|
+
{renderTextChildren(centerContent, labelStyle(theme, size, true))}
|
|
272
|
+
</View>
|
|
273
|
+
) : showLabel && !indeterminate ? (
|
|
274
|
+
<View style={[StyleSheet.absoluteFill, styles.centre]}>
|
|
275
|
+
<ProgressLabel size={size} label={displayLabel} testID={`${testID}-label`} muted />
|
|
276
|
+
</View>
|
|
277
|
+
) : null}
|
|
278
|
+
</View>
|
|
271
279
|
</View>
|
|
272
280
|
);
|
|
273
281
|
}
|
|
@@ -328,6 +336,7 @@ export const Progress = React.forwardRef<View, ProgressProps>((rawProps, ref) =>
|
|
|
328
336
|
pulse,
|
|
329
337
|
showLabel,
|
|
330
338
|
label,
|
|
339
|
+
centerContent,
|
|
331
340
|
segments,
|
|
332
341
|
thickness,
|
|
333
342
|
circularSize,
|
|
@@ -365,6 +374,7 @@ export const Progress = React.forwardRef<View, ProgressProps>((rawProps, ref) =>
|
|
|
365
374
|
elementTestID={elementId ?? `${base}-circular`}
|
|
366
375
|
thickness={thickness}
|
|
367
376
|
circularSize={circularSize}
|
|
377
|
+
centerContent={centerContent}
|
|
368
378
|
/>
|
|
369
379
|
);
|
|
370
380
|
}
|
|
@@ -137,7 +137,7 @@ const ProgressLabel: React.FC<{ size: ProgressSize; label: string; testId: strin
|
|
|
137
137
|
|
|
138
138
|
const CircularView = React.forwardRef<
|
|
139
139
|
HTMLDivElement,
|
|
140
|
-
ViewProps & { thickness: number; circularSize?: number }
|
|
140
|
+
ViewProps & { thickness: number; circularSize?: number; centerContent?: React.ReactNode }
|
|
141
141
|
>(
|
|
142
142
|
(
|
|
143
143
|
{
|
|
@@ -152,6 +152,7 @@ const CircularView = React.forwardRef<
|
|
|
152
152
|
dataTestId,
|
|
153
153
|
thickness,
|
|
154
154
|
circularSize,
|
|
155
|
+
centerContent,
|
|
155
156
|
...props
|
|
156
157
|
},
|
|
157
158
|
ref,
|
|
@@ -172,8 +173,9 @@ const CircularView = React.forwardRef<
|
|
|
172
173
|
data-testid={`${dataTestId}-circular`}
|
|
173
174
|
{...props}
|
|
174
175
|
/>
|
|
175
|
-
{showLabel && value !== undefined && (
|
|
176
|
+
{(centerContent != null || (showLabel && value !== undefined)) && (
|
|
176
177
|
<Box
|
|
178
|
+
data-testid={centerContent != null ? `${dataTestId}-center` : undefined}
|
|
177
179
|
sx={{
|
|
178
180
|
top: 0,
|
|
179
181
|
left: 0,
|
|
@@ -185,7 +187,7 @@ const CircularView = React.forwardRef<
|
|
|
185
187
|
justifyContent: 'center',
|
|
186
188
|
}}
|
|
187
189
|
>
|
|
188
|
-
<Typography
|
|
190
|
+
{centerContent ?? <Typography
|
|
189
191
|
variant="caption"
|
|
190
192
|
component="div"
|
|
191
193
|
color="text.secondary"
|
|
@@ -193,7 +195,7 @@ const CircularView = React.forwardRef<
|
|
|
193
195
|
data-testid={`${dataTestId}-label`}
|
|
194
196
|
>
|
|
195
197
|
{displayLabel}
|
|
196
|
-
</Typography>
|
|
198
|
+
</Typography>}
|
|
197
199
|
</Box>
|
|
198
200
|
)}
|
|
199
201
|
</Box>
|
|
@@ -263,6 +265,7 @@ export const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
|
|
|
263
265
|
pulse,
|
|
264
266
|
showLabel,
|
|
265
267
|
label,
|
|
268
|
+
centerContent,
|
|
266
269
|
segments,
|
|
267
270
|
thickness,
|
|
268
271
|
circularSize,
|
|
@@ -290,7 +293,7 @@ export const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
|
|
|
290
293
|
|
|
291
294
|
if (variant === 'circular') {
|
|
292
295
|
return (
|
|
293
|
-
<CircularView ref={ref} {...shared} thickness={thickness} circularSize={circularSize} />
|
|
296
|
+
<CircularView ref={ref} {...shared} thickness={thickness} circularSize={circularSize} centerContent={centerContent} />
|
|
294
297
|
);
|
|
295
298
|
}
|
|
296
299
|
|
|
@@ -13,7 +13,7 @@ import type { SizeValue } from '../../../tokens/vocabulary';
|
|
|
13
13
|
* either side: MUI's own `onClose` reason argument is dropped by `Dialog.tsx`
|
|
14
14
|
* before it reaches the caller, so both renderers pass a bare `() => void`.
|
|
15
15
|
*/
|
|
16
|
-
export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer';
|
|
16
|
+
export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer' | 'bottom-sheet';
|
|
17
17
|
export type DialogSize = SizeValue;
|
|
18
18
|
export type DialogBorderRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
19
19
|
export type DialogActionsAlignment = 'left' | 'center' | 'right' | 'space-between';
|
|
@@ -21,6 +21,7 @@ export type DialogActionsAlignment = 'left' | 'center' | 'right' | 'space-betwee
|
|
|
21
21
|
export interface DialogBaseProps {
|
|
22
22
|
open: boolean;
|
|
23
23
|
children: ReactNode;
|
|
24
|
+
/** `bottom-sheet` keeps the default paper and inset, aligned to the bottom. */
|
|
24
25
|
variant?: DialogVariant;
|
|
25
26
|
size?: DialogSize;
|
|
26
27
|
title?: ReactNode;
|
|
@@ -117,6 +117,7 @@ function variantPaper(theme: UiTheme, a: DialogLookArgs, radius: number): ViewSt
|
|
|
117
117
|
function overlayFor(theme: UiTheme, variant: DialogVariant): ViewStyle {
|
|
118
118
|
if (variant === 'fullscreen') return { flex: 1 };
|
|
119
119
|
if (variant === 'drawer') return { flex: 1, alignItems: 'flex-end' };
|
|
120
|
+
if (variant === 'bottom-sheet') return { ...centredOverlay(theme), justifyContent: 'flex-end' };
|
|
120
121
|
return centredOverlay(theme);
|
|
121
122
|
}
|
|
122
123
|
|
|
@@ -26,7 +26,7 @@ The Dialog component provides a powerful, flexible modal dialog system with mult
|
|
|
26
26
|
|------|------|---------|-------------|
|
|
27
27
|
| `open` | `boolean` | (required) | Controls dialog visibility |
|
|
28
28
|
| `onClose` | `() => void` | `undefined` | Callback when dialog is closed |
|
|
29
|
-
| `variant` | `'default' \| 'glass' \| 'fullscreen' \| 'drawer'` | `'default'` | Visual style variant of the dialog |
|
|
29
|
+
| `variant` | `'default' \| 'glass' \| 'fullscreen' \| 'drawer' \| 'bottom-sheet'` | `'default'` | Visual style variant of the dialog |
|
|
30
30
|
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Dialog size (xs: 400px, sm: 600px, md: 800px, lg: 1000px, xl: 1200px) |
|
|
31
31
|
| `title` | `ReactNode` | `undefined` | Dialog title content |
|
|
32
32
|
| `description` | `string` | `undefined` | Dialog subtitle/description text |
|
|
@@ -584,3 +584,27 @@ slot behaviour, make it a direct child.
|
|
|
584
584
|
- **Modal** - Lower-level modal component
|
|
585
585
|
- **Popover** - Lightweight overlay for contextual content
|
|
586
586
|
- **Sheet** - Bottom sheet component for mobile-first experiences
|
|
587
|
+
|
|
588
|
+
## Bottom-anchored confirmation surface
|
|
589
|
+
|
|
590
|
+
`variant="bottom-sheet"` uses the default dialog paper at the bottom of the
|
|
591
|
+
viewport. Its height follows the content, its width remains capped by `size`,
|
|
592
|
+
and its margins and all four corners continue to use the theme. This is an
|
|
593
|
+
inset modal surface, not a draggable sheet; no swipe-to-dismiss is implied.
|
|
594
|
+
It retains the existing native Modal inset behavior; this variant does not add
|
|
595
|
+
a separate safe-area provider or change platform system-bar settings.
|
|
596
|
+
|
|
597
|
+
It shares the existing modal lifecycle, focus handling, backdrop/Escape or
|
|
598
|
+
native Back dismissal, `persistent`, title, content and action slots. Native
|
|
599
|
+
keyboard overlap lifts the bottom edge by the same amount as other inset
|
|
600
|
+
dialogs, keeping the body scrollable and action slot visible. Put vertically
|
|
601
|
+
stacked full-width actions in shared layout components inside `DialogContent`
|
|
602
|
+
or `DialogActions`; the variant does not reorder or resize caller actions.
|
|
603
|
+
|
|
604
|
+
```tsx
|
|
605
|
+
<Dialog open={open} variant="bottom-sheet" size="xs" title="End session?"
|
|
606
|
+
showCloseButton={false} onClose={onClose}>
|
|
607
|
+
<DialogContent>Save the completed work before leaving.</DialogContent>
|
|
608
|
+
<DialogActions>{actions}</DialogActions>
|
|
609
|
+
</Dialog>
|
|
610
|
+
```
|
|
@@ -185,6 +185,9 @@ export function variantStylesOf(theme: Theme, opts: VariantStyleOptions): SxProp
|
|
|
185
185
|
default:
|
|
186
186
|
return {
|
|
187
187
|
...baseStylesOf(theme, opts),
|
|
188
|
+
// An auto cross-axis margin consumes the space above the paper while
|
|
189
|
+
// preserving the same themed bottom/side inset and modal focus path.
|
|
190
|
+
...(opts.variant === 'bottom-sheet' ? { marginTop: 'auto' } : {}),
|
|
188
191
|
...decorations,
|
|
189
192
|
...defaultVariantStyles(theme, opts),
|
|
190
193
|
...NO_FOCUS_OUTLINE,
|
|
@@ -164,6 +164,21 @@ const { stack, push, pop, clear } = useModalStack();
|
|
|
164
164
|
- Semantic HTML structure
|
|
165
165
|
- Accessible loading states
|
|
166
166
|
|
|
167
|
+
### The title is one heading
|
|
168
|
+
|
|
169
|
+
With a `navigationTitle`, the panel has exactly ONE heading: the title, an
|
|
170
|
+
`h2`, carrying the id the dialog's `aria-labelledby` points at (the
|
|
171
|
+
`aria-labelledby` prop's value, or `modal-title-<modalId>`). The bar around it
|
|
172
|
+
(the ✕ or back button and the header actions) is a plain `div`, so the dialog's
|
|
173
|
+
accessible name is the title alone, and a screen reader announces it once.
|
|
174
|
+
|
|
175
|
+
Until 6.56.0 the bar was itself MUI's `DialogTitle` `h2` with the title nested
|
|
176
|
+
in it as a second `h2`: the same words read twice, a heading inside a heading,
|
|
177
|
+
and a dialog named by everything in the bar ("close Title Save").
|
|
178
|
+
|
|
179
|
+
Without a `navigationTitle` the bar is still MUI's `h2` and holds the id, as
|
|
180
|
+
before. Give such a panel its own `aria-labelledby` if it needs a name.
|
|
181
|
+
|
|
167
182
|
## Testing
|
|
168
183
|
|
|
169
184
|
The StackedModal component provides comprehensive test IDs for all interactive elements through the `dataTestId` prop. When provided, it generates consistent test IDs for all child elements.
|
|
@@ -175,8 +190,8 @@ When you provide `dataTestId="my-modal"`, the following test IDs are automatical
|
|
|
175
190
|
| Element | Test ID | Description |
|
|
176
191
|
|---------|---------|-------------|
|
|
177
192
|
| Modal Container | `my-modal` | The root dialog element |
|
|
178
|
-
| Header | `my-modal-header` | The modal header
|
|
179
|
-
| Title | `my-modal-title` | The navigation title
|
|
193
|
+
| Header | `my-modal-header` | The modal header bar (a `div` when there is a title) |
|
|
194
|
+
| Title | `my-modal-title` | The navigation title — the panel's one `h2` |
|
|
180
195
|
| Close Button | `my-modal-close-button` | The close button (when no modals stacked) |
|
|
181
196
|
| Back Button | `my-modal-back-button` | The back button (when modals are stacked) |
|
|
182
197
|
| Header Actions | `my-modal-header-actions` | Container for header actions (desktop) |
|
|
@@ -9,7 +9,7 @@ import IconButton from '@mui/material/IconButton/index.js';
|
|
|
9
9
|
import Skeleton from '@mui/material/Skeleton/index.js';
|
|
10
10
|
import Typography from '@mui/material/Typography/index.js';
|
|
11
11
|
import { styled, useTheme } from '@mui/material/styles/index.js';
|
|
12
|
-
import type { FC, ReactNode } from 'react';
|
|
12
|
+
import type { ElementType, FC, ReactNode } from 'react';
|
|
13
13
|
import React from 'react';
|
|
14
14
|
import { rem } from '../../../tokens/relative';
|
|
15
15
|
import { safeAreaBottom } from '../../../utils/viewport';
|
|
@@ -21,9 +21,10 @@ import {
|
|
|
21
21
|
titleStyles,
|
|
22
22
|
} from './StackedModal.styles';
|
|
23
23
|
|
|
24
|
+
// `component` typed through: the bar is a `div` when it holds a title (`ModalHeader`).
|
|
24
25
|
const StyledDialogTitle = styled(DialogTitle, {
|
|
25
26
|
shouldForwardProp: (prop) => prop !== 'rtl',
|
|
26
|
-
})<{ rtl?: boolean }>(({ theme, rtl }) => titleStyles(theme, rtl));
|
|
27
|
+
})<{ rtl?: boolean; component?: ElementType }>(({ theme, rtl }) => titleStyles(theme, rtl));
|
|
27
28
|
|
|
28
29
|
const DialogTitleLeft = styled(Box)(({ theme }) => titleLeftStyles(theme));
|
|
29
30
|
const DialogTitleRight = styled(Box)(({ theme }) => titleRightStyles(theme));
|
|
@@ -186,7 +187,21 @@ export const ModalHeader: FC<ModalHeaderProps> = ({
|
|
|
186
187
|
rtl,
|
|
187
188
|
dataTestId,
|
|
188
189
|
}) => (
|
|
189
|
-
|
|
190
|
+
// The BAR is not a heading: it holds the ✕ or back button and the header
|
|
191
|
+
// actions. The title inside it is the panel's one heading and carries the id
|
|
192
|
+
// the dialog's `aria-labelledby` names, so the dialog is named by the title
|
|
193
|
+
// alone — not "close Title Save" — and a screen reader hears it once.
|
|
194
|
+
//
|
|
195
|
+
// The bar's id is stated, never left to MUI: `DialogTitle` falls back to the
|
|
196
|
+
// Dialog's `aria-labelledby` and would claim the title's id a second time.
|
|
197
|
+
// With NO title the bar is drawn exactly as it always was — MUI's own `h2`,
|
|
198
|
+
// holding the id — so an untitled panel keeps its markup and its name.
|
|
199
|
+
<StyledDialogTitle
|
|
200
|
+
component={navigationTitle ? 'div' : 'h2'}
|
|
201
|
+
id={navigationTitle ? `${titleId}-bar` : titleId}
|
|
202
|
+
rtl={rtl}
|
|
203
|
+
data-testid={testId(dataTestId, 'header')}
|
|
204
|
+
>
|
|
190
205
|
<DialogTitleLeft>
|
|
191
206
|
<HeaderLeadingButton
|
|
192
207
|
canGoBack={canGoBack}
|
|
@@ -199,6 +214,7 @@ export const ModalHeader: FC<ModalHeaderProps> = ({
|
|
|
199
214
|
/>
|
|
200
215
|
{navigationTitle && (
|
|
201
216
|
<Typography
|
|
217
|
+
id={titleId}
|
|
202
218
|
variant="h6"
|
|
203
219
|
component="h2"
|
|
204
220
|
noWrap
|
package/src/icons/Icon.md
CHANGED
|
@@ -26,3 +26,7 @@ list in `src/icons/glyphs.json`. Adding a glyph is one line there and
|
|
|
26
26
|
Inside the package, a ported component draws its own glyphs through this
|
|
27
27
|
component rather than importing `@mui/icons-material` directly, so its native
|
|
28
28
|
twin can draw the same one.
|
|
29
|
+
|
|
30
|
+
The shared glyph catalog includes `VolumeUp` and `VolumeOff` for sound controls,
|
|
31
|
+
using the same generated Material paths on web and native. Name the enclosing
|
|
32
|
+
control with its action; leave the icon decorative when that control owns the label.
|
package/src/icons/glyphs.json
CHANGED
|
@@ -51,6 +51,8 @@ export const ICON_PATHS = {
|
|
|
51
51
|
Settings: ["M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"],
|
|
52
52
|
Visibility: ["M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"],
|
|
53
53
|
VisibilityOff: ["M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z"],
|
|
54
|
+
VolumeOff: ["M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63m2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71M4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9zM12 4 9.91 6.09 12 8.18z"],
|
|
55
|
+
VolumeUp: ["M3 9v6h4l5 5V4L7 9zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02M14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77"],
|
|
54
56
|
Warning: ["M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"],
|
|
55
57
|
WarningAmber: ["M12 5.99 19.53 19H4.47zM12 2 1 21h22z","M13 16h-2v2h2zm0-6h-2v5h2z"],
|
|
56
58
|
} as const;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/StackedModal/StackedModal.parts.tsx"],"sourcesContent":["import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport DialogActions from '@mui/material/DialogActions/index.js';\nimport DialogContent from '@mui/material/DialogContent/index.js';\nimport DialogTitle from '@mui/material/DialogTitle/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Skeleton from '@mui/material/Skeleton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { styled, useTheme } from '@mui/material/styles/index.js';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\nimport { rem } from '../../../tokens/relative';\nimport { safeAreaBottom } from '../../../utils/viewport';\nimport {\n loadingOverlayStyles,\n modalContentStyles,\n titleLeftStyles,\n titleRightStyles,\n titleStyles,\n} from './StackedModal.styles';\n\nconst StyledDialogTitle = styled(DialogTitle, {\n shouldForwardProp: (prop) => prop !== 'rtl',\n})<{ rtl?: boolean }>(({ theme, rtl }) => titleStyles(theme, rtl));\n\nconst DialogTitleLeft = styled(Box)(({ theme }) => titleLeftStyles(theme));\nconst DialogTitleRight = styled(Box)(({ theme }) => titleRightStyles(theme));\nconst LoadingOverlay = styled(Box)(({ theme }) => loadingOverlayStyles(theme));\n\n/**\n * The padded content wrapper callers put inside a StackedModal. The explicit\n * `typeof DialogContent` annotation keeps its type nameable across package\n * boundaries (TS2742) now that it is re-exported from the barrel.\n */\nexport const StackedModalContent: typeof DialogContent = styled(DialogContent)(({ theme }) =>\n modalContentStyles(theme),\n) as typeof DialogContent;\n\n/** Sub-element test IDs derive from the modal's own, or stay off when it has none. */\nexport const testId = (base: string | undefined, suffix: string): string | undefined =>\n base ? `${base}-${suffix}` : undefined;\n\n/**\n * A wrapper marking the subtree that should render as modal actions — the\n * StackedModal pulls it out of `children` and places it by device.\n */\nexport const StackedModalActions: FC<{ children?: ReactNode }> = ({ children }) => <>{children}</>;\n\n/** Separates the `StackedModalActions` subtree from the rest of the content. */\nconst splitModalChildren = (children: ReactNode): { content: ReactNode; actions: ReactNode } => {\n let actions: ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement<{ children?: ReactNode }>(child) && child.type === StackedModalActions) {\n actions = child.props.children;\n }\n });\n\n const content = React.Children.toArray(children).filter(\n (child) => !(React.isValidElement(child) && child.type === StackedModalActions),\n );\n\n return { content, actions };\n};\n\n/**\n * Works out what renders where: a `StackedModalActions` child wins over the\n * `actions` prop, and on phones those actions move out of the header into a\n * pinned bottom bar.\n */\nexport const resolveModalContent = (\n children: ReactNode,\n actions: ReactNode,\n isMobile: boolean,\n): {\n content: ReactNode;\n modalActions: ReactNode;\n headerActions: ReactNode;\n hasMobileActions: boolean;\n} => {\n const { content, actions: childActions } = splitModalChildren(children);\n const modalActions = childActions ?? actions;\n return {\n content,\n modalActions,\n headerActions: isMobile ? null : modalActions,\n hasMobileActions: Boolean(isMobile && modalActions),\n };\n};\n\n/** The panel's own ARIA ids, unless the caller wired it to its own labels. */\nexport const modalAriaIds = (\n modalId: string,\n ariaLabelledBy?: string,\n ariaDescribedBy?: string,\n): { titleId: string; descId: string } => ({\n titleId: ariaLabelledBy || `modal-title-${modalId}`,\n descId: ariaDescribedBy || `modal-desc-${modalId}`,\n});\n\nexport const ModalLoadingOverlay: FC<{ loadingText?: string; dataTestId?: string }> = ({\n loadingText,\n dataTestId,\n}) => {\n const theme = useTheme();\n return (\n <LoadingOverlay data-testid={testId(dataTestId, 'loading-overlay')}>\n <CircularProgress size={rem(theme, 40)} data-testid={testId(dataTestId, 'loading-spinner')} />\n {loadingText && (\n <Typography variant=\"body2\" sx={{ mt: 2 }} data-testid={testId(dataTestId, 'loading-text')}>\n {loadingText}\n </Typography>\n )}\n </LoadingOverlay>\n );\n};\n\ninterface ModalHeaderProps {\n titleId: string;\n navigationTitle?: ReactNode;\n /** Deeper than the first panel, so the leading button goes back instead of closing. */\n canGoBack: boolean;\n onBack: () => void;\n /** The back arrow's accessible name — it carries a glyph only. REQUIRED. */\n backLabel: string;\n onClose: () => void;\n /** Renders the bar without its ✕ — the panel's content owns the dismiss. */\n hideClose?: boolean;\n /** Header actions — desktop only; on phones they move to the footer. */\n headerActions?: ReactNode;\n rtl?: boolean;\n dataTestId?: string;\n}\n\n/**\n * The bar's leading control: back at depth ≥2, otherwise close — and nothing at\n * all when the panel's content carries its own ✕ (`hideClose`).\n */\nconst HeaderLeadingButton: FC<\n Pick<\n ModalHeaderProps,\n 'canGoBack' | 'onBack' | 'backLabel' | 'onClose' | 'hideClose' | 'rtl' | 'dataTestId'\n >\n> = ({ canGoBack, onBack, backLabel, onClose, hideClose, rtl, dataTestId }) => {\n if (canGoBack) {\n return (\n <IconButton\n edge=\"start\"\n color=\"inherit\"\n onClick={onBack}\n aria-label={backLabel}\n size=\"small\"\n sx={{ transform: rtl ? 'rotate(180deg)' : 'none' }}\n data-testid={testId(dataTestId, 'back-button')}\n >\n <ChevronLeftIcon />\n </IconButton>\n );\n }\n if (hideClose) return null;\n return (\n <IconButton\n edge=\"start\"\n color=\"inherit\"\n onClick={onClose}\n aria-label=\"close\"\n size=\"small\"\n data-testid={testId(dataTestId, 'close-button')}\n >\n <CloseIcon />\n </IconButton>\n );\n};\n\nexport const ModalHeader: FC<ModalHeaderProps> = ({\n titleId,\n navigationTitle,\n canGoBack,\n onBack,\n onClose,\n hideClose,\n backLabel,\n headerActions,\n rtl,\n dataTestId,\n}) => (\n <StyledDialogTitle id={titleId} rtl={rtl} data-testid={testId(dataTestId, 'header')}>\n <DialogTitleLeft>\n <HeaderLeadingButton\n canGoBack={canGoBack}\n onBack={onBack}\n backLabel={backLabel}\n onClose={onClose}\n hideClose={hideClose}\n rtl={rtl}\n dataTestId={dataTestId}\n />\n {navigationTitle && (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n noWrap\n sx={{ ml: canGoBack || !hideClose ? 1 : 0 }}\n data-testid={testId(dataTestId, 'title')}\n >\n {navigationTitle}\n </Typography>\n )}\n </DialogTitleLeft>\n <DialogTitleRight data-testid={testId(dataTestId, 'header-actions')}>\n {headerActions}\n </DialogTitleRight>\n </StyledDialogTitle>\n);\n\nconst ContentSkeleton: FC = () => {\n const theme = useTheme();\n return (\n <Box sx={{ p: 3 }}>\n <Skeleton variant=\"text\" width=\"60%\" height={rem(theme, 32)} />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"rectangular\" height={rem(theme, 200)} sx={{ mt: 2 }} />\n </Box>\n );\n};\n\ninterface ModalBodyProps {\n descId: string;\n showSkeleton: boolean;\n /** When there is no action bar, the body is what reaches the bottom of the panel. */\n endsPanel: boolean;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const ModalBody: FC<ModalBodyProps> = ({\n descId,\n showSkeleton,\n endsPanel,\n dataTestId,\n children,\n}) => (\n <Box\n id={descId}\n sx={{\n position: 'relative',\n flex: 1,\n overflow: 'auto',\n // iOS momentum scrolling, and no scroll-chaining to the page behind —\n // without `contain`, an overscroll at the end of the list rubber-bands the\n // whole panel and springs back before the last row can be tapped.\n WebkitOverflowScrolling: 'touch',\n overscrollBehavior: 'contain',\n // The content itself ends the panel when there is no action bar, so it has\n // to clear the home indicator on its own.\n ...(endsPanel ? safeAreaBottom(0) : {}),\n }}\n data-testid={testId(dataTestId, 'content')}\n >\n {showSkeleton ? <ContentSkeleton /> : children}\n </Box>\n);\n\n/** The phone-only pinned action bar; on desktop the actions live in the header. */\nexport const ModalFooter: FC<{ dataTestId?: string; children?: ReactNode }> = ({\n dataTestId,\n children,\n}) => (\n <DialogActions\n sx={{\n borderTop: (theme) => `1px solid ${theme.palette.divider}`,\n padding: 2,\n // Never let the action row sit under the iOS home indicator.\n flexShrink: 0,\n ...safeAreaBottom(16),\n }}\n data-testid={testId(dataTestId, 'footer')}\n >\n {children}\n </DialogActions>\n);\n\ninterface PanelContentsProps extends ModalHeaderProps {\n showSkeleton: boolean;\n loadingText?: string;\n descId: string;\n content: ReactNode;\n /** The resolved actions, already placed in the header or destined for the footer. */\n modalActions: ReactNode;\n hasMobileActions: boolean;\n}\n\n/** Everything inside the sliding panel: the loading veil, header, body and action bar. */\nexport const ModalPanelContents: FC<PanelContentsProps> = ({\n showSkeleton,\n loadingText,\n descId,\n content,\n modalActions,\n hasMobileActions,\n ...header\n}) => (\n <>\n {showSkeleton && (\n <ModalLoadingOverlay loadingText={loadingText} dataTestId={header.dataTestId} />\n )}\n <ModalHeader {...header} />\n <ModalBody\n descId={descId}\n showSkeleton={showSkeleton}\n endsPanel={!hasMobileActions}\n dataTestId={header.dataTestId}\n >\n {content}\n </ModalBody>\n {hasMobileActions && (\n <ModalFooter dataTestId={header.dataTestId}>{modalActions}</ModalFooter>\n )}\n </>\n);\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Progress/Progress.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport LinearProgress from '@mui/material/LinearProgress/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled, useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { progressLabelText, resolveProgressProps } from './Progress.helpers';\nimport {\n barEmphasisStyles,\n barVariantStyles,\n circularEmphasisStyles,\n getColorFromTheme,\n getSizeStyles,\n pulseAnimation,\n} from './Progress.styles';\nimport type { ProgressProps, ProgressSize, ProgressVariant } from './Progress.types';\nimport { rem, rems } from '../../../tokens/relative';\n\nconst StyledLinearProgress = styled(LinearProgress, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'customSize', 'customColor', 'glow', 'pulse'].includes(prop as string),\n})<{\n customVariant?: ProgressVariant;\n customSize?: ProgressSize;\n customColor?: string;\n glow?: boolean;\n pulse?: boolean;\n}>(({ theme, customVariant, customSize, customColor = 'primary', glow, pulse }) => {\n const colorPalette = getColorFromTheme(theme, customColor);\n const sizeStyles = getSizeStyles(customSize);\n\n return {\n height: rem(theme, sizeStyles.heightPx),\n borderRadius: rem(theme, sizeStyles.heightPx / 2),\n backgroundColor: alpha(colorPalette.main, 0.1),\n\n '& .MuiLinearProgress-bar': {\n borderRadius: 'inherit',\n transition: 'all 0.3s ease',\n ...barVariantStyles(theme, customVariant, colorPalette),\n ...barEmphasisStyles(theme, colorPalette, glow, pulse),\n },\n };\n});\n\nconst StyledCircularProgress = styled(CircularProgress, {\n shouldForwardProp: (prop) => !['customColor', 'glow', 'pulse'].includes(prop as string),\n})<{\n customColor?: string;\n glow?: boolean;\n pulse?: boolean;\n}>(({ theme, customColor = 'primary', glow, pulse }) => {\n const colorPalette = getColorFromTheme(theme, customColor);\n\n return {\n color: colorPalette.main,\n ...circularEmphasisStyles(theme, colorPalette, glow, pulse),\n };\n});\n\nconst SegmentedProgress: React.FC<{\n value?: number;\n segments: number;\n color: string;\n size: ProgressSize;\n glow: boolean;\n pulse: boolean;\n dataTestId?: string;\n}> = ({ value = 0, segments, color, size, glow, pulse, dataTestId }) => {\n const theme = useTheme();\n const colorPalette = getColorFromTheme(theme, color);\n const sizeStyles = getSizeStyles(size);\n const filledSegments = Math.floor((value / 100) * segments);\n\n return (\n <Box sx={{ display: 'flex', gap: 0.5, width: '100%' }} data-testid={`${dataTestId}-segments-container`}>\n {Array.from({ length: segments }, (_, index) => (\n <Box\n key={index}\n data-testid={`${dataTestId}-segment-${index}`}\n sx={{\n flex: 1,\n height: rem(theme, sizeStyles.heightPx),\n // In `sx` a numeric radius is a multiple of `shape.borderRadius` — relative already.\n borderRadius: sizeStyles.heightPx / 2,\n backgroundColor:\n index < filledSegments ? colorPalette.main : alpha(colorPalette.main, 0.1),\n transition: 'all 0.3s ease',\n ...(glow &&\n index < filledSegments && {\n boxShadow: `${rems(theme, 0, 0, 6, 1)} ${alpha(colorPalette.main, 0.4)}`,\n }),\n ...(pulse &&\n index < filledSegments && {\n animation: `${pulseAnimation} 2s infinite`,\n }),\n }}\n />\n ))}\n </Box>\n );\n};\n\ninterface ViewProps {\n size: ProgressSize;\n color: string;\n glow: boolean;\n pulse: boolean;\n showLabel: boolean;\n displayValue: number;\n displayLabel: string;\n /** Absent means indeterminate — the bar animates rather than reporting progress. */\n value?: number;\n dataTestId: string;\n}\n\nconst ProgressLabel: React.FC<{ size: ProgressSize; label: string; testId: string }> = ({\n size,\n label,\n testId,\n}) => (\n <Typography\n variant=\"caption\"\n sx={{\n display: 'block',\n textAlign: 'center',\n mt: 1,\n fontSize: getSizeStyles(size).fontSize,\n fontWeight: 600,\n }}\n data-testid={testId}\n >\n {label}\n </Typography>\n);\n\nconst CircularView = React.forwardRef<\n HTMLDivElement,\n ViewProps & { thickness: number; circularSize?: number }\n>(\n (\n {\n size,\n color,\n glow,\n pulse,\n showLabel,\n displayValue,\n displayLabel,\n value,\n dataTestId,\n thickness,\n circularSize,\n ...props\n },\n ref,\n ) => {\n const theme = useTheme();\n const sizeStyles = getSizeStyles(size);\n\n return (\n <Box ref={ref} sx={{ position: 'relative', display: 'inline-flex' }} data-testid={dataTestId}>\n <StyledCircularProgress\n variant={value !== undefined ? 'determinate' : 'indeterminate'}\n value={displayValue}\n size={rem(theme, circularSize || sizeStyles.circularSizePx)}\n thickness={thickness}\n customColor={color}\n glow={glow}\n pulse={pulse}\n data-testid={`${dataTestId}-circular`}\n {...props}\n />\n {showLabel && value !== undefined && (\n <Box\n sx={{\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography\n variant=\"caption\"\n component=\"div\"\n color=\"text.secondary\"\n sx={{ fontSize: sizeStyles.fontSize, fontWeight: 600 }}\n data-testid={`${dataTestId}-label`}\n >\n {displayLabel}\n </Typography>\n </Box>\n )}\n </Box>\n );\n },\n);\n\nCircularView.displayName = 'ProgressCircularView';\n\nconst SegmentedView = React.forwardRef<HTMLDivElement, ViewProps & { segments: number }>(\n (\n { size, color, glow, pulse, showLabel, displayValue, displayLabel, dataTestId, segments, value: _value, ...props },\n ref,\n ) => (\n <Box ref={ref} sx={{ width: '100%' }} data-testid={dataTestId} {...props}>\n <SegmentedProgress\n value={displayValue}\n segments={segments}\n color={color}\n size={size}\n glow={glow}\n pulse={pulse}\n dataTestId={dataTestId}\n />\n {showLabel && (\n <ProgressLabel size={size} label={displayLabel} testId={`${dataTestId}-label`} />\n )}\n </Box>\n ),\n);\n\nSegmentedView.displayName = 'ProgressSegmentedView';\n\nconst LinearView = React.forwardRef<HTMLDivElement, ViewProps & { variant: ProgressVariant }>(\n (\n { size, color, glow, pulse, showLabel, displayValue, displayLabel, value, dataTestId, variant, ...props },\n ref,\n ) => (\n <Box ref={ref} sx={{ width: '100%' }} data-testid={dataTestId}>\n <StyledLinearProgress\n variant={value !== undefined ? 'determinate' : 'indeterminate'}\n value={displayValue}\n customVariant={variant}\n customSize={size}\n customColor={color}\n glow={glow}\n pulse={pulse}\n data-testid={`${dataTestId}-linear`}\n {...props}\n />\n {showLabel && (\n <ProgressLabel size={size} label={displayLabel} testId={`${dataTestId}-label`} />\n )}\n </Box>\n ),\n);\n\nLinearView.displayName = 'ProgressLinearView';\n\nexport const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (rawProps, ref) => {\n const {\n variant,\n size,\n color,\n glow,\n pulse,\n showLabel,\n label,\n segments,\n thickness,\n circularSize,\n value,\n dataTestId,\n testID,\n ...props\n } = resolveProgressProps(rawProps);\n const displayValue = value || 0;\n const shared = {\n size,\n color,\n glow,\n pulse,\n showLabel,\n displayValue,\n displayLabel: progressLabelText(label, showLabel, displayValue),\n value,\n // `testID` is React Native's spelling of the same id and names the\n // component too; `data-testid` is left in `props`, on its way to the\n // element the caller means to address, where it has always landed.\n dataTestId: testID ?? dataTestId,\n ...props,\n };\n\n if (variant === 'circular') {\n return (\n <CircularView ref={ref} {...shared} thickness={thickness} circularSize={circularSize} />\n );\n }\n\n if (variant === 'segmented') {\n return <SegmentedView ref={ref} {...shared} segments={segments} />;\n }\n\n return <LinearView ref={ref} {...shared} variant={variant} />;\n },\n);\n\nProgress.displayName = 'Progress';\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
|