@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.
Files changed (134) hide show
  1. package/NATIVE.md +2 -2
  2. package/components-catalog.md +2 -2
  3. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +5 -5
  4. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +12 -12
  5. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  6. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +3 -3
  7. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
  8. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +3 -3
  9. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +4 -4
  10. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +5 -5
  11. package/dist/_internal/components/data-display/Progress/Progress.js +1 -1
  12. package/dist/_internal/components/data-display/index.js +1 -1
  13. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  14. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +1 -1
  15. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
  16. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +1 -1
  17. package/dist/_internal/components/feedback/index.js +4 -4
  18. package/dist/_internal/components/index.js +15 -15
  19. package/dist/_internal/components/layout/SettingCard/SettingCard.js +5 -5
  20. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +3 -3
  21. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +4 -4
  22. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +4 -4
  23. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +6 -6
  24. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +5 -5
  25. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +6 -6
  26. package/dist/_internal/components/layout/index.js +9 -9
  27. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -3
  28. package/dist/_internal/components/navigation/index.js +3 -3
  29. package/dist/_internal/icons/Icon.js +2 -2
  30. package/dist/_internal/icons/paths.generated.js +1 -1
  31. package/dist/{chunk-4EJBLJZK.js → chunk-2KGYTJCN.js} +50 -29
  32. package/dist/chunk-2KGYTJCN.js.map +1 -0
  33. package/dist/{chunk-MQSI57HY.js → chunk-45PGSVOH.js} +2 -2
  34. package/dist/{chunk-CLC4VIOF.js → chunk-4PYEDDYV.js} +2 -2
  35. package/dist/{chunk-JWXGZ4VM.js → chunk-6J27G2HT.js} +2 -2
  36. package/dist/{chunk-WGFHZNFR.js → chunk-AEIJSEVV.js} +4 -1
  37. package/dist/{chunk-WGFHZNFR.js.map → chunk-AEIJSEVV.js.map} +1 -1
  38. package/dist/{chunk-3S44O3WI.js → chunk-BJMNAPKH.js} +4 -4
  39. package/dist/{chunk-6E4XNOAC.js → chunk-CCCILWYZ.js} +4 -4
  40. package/dist/{chunk-Y2HCYT5W.js → chunk-GRRW5NSR.js} +2 -2
  41. package/dist/{chunk-NZZ2BTIK.js → chunk-H7R6UKOE.js} +2 -2
  42. package/dist/{chunk-DSDZIBLQ.js → chunk-ICSXPZXT.js} +2 -2
  43. package/dist/{chunk-AL3Z24VG.js → chunk-ILQVNZ5B.js} +2 -2
  44. package/dist/{chunk-5PN5MY2X.js → chunk-INQO5AYV.js} +3 -3
  45. package/dist/{chunk-2DV64INT.js → chunk-KEDZTZCV.js} +2 -2
  46. package/dist/{chunk-ZJC5COCE.js → chunk-N4MR4EMC.js} +3 -3
  47. package/dist/{chunk-KMW7GGX6.js → chunk-OGBLNORM.js} +2 -2
  48. package/dist/{chunk-44JLXXWQ.js → chunk-PPITQH3C.js} +2 -2
  49. package/dist/{chunk-JC244QQF.js → chunk-SEWUYHSG.js} +2 -2
  50. package/dist/{chunk-XTHDWW4M.js → chunk-VAY6KESM.js} +7 -4
  51. package/dist/chunk-VAY6KESM.js.map +1 -0
  52. package/dist/{chunk-5XZEGI35.js → chunk-X7HCS3HP.js} +3 -3
  53. package/dist/{chunk-6ZLP7BA7.js → chunk-XC7YHO7Z.js} +3 -1
  54. package/dist/{chunk-6ZLP7BA7.js.map → chunk-XC7YHO7Z.js.map} +1 -1
  55. package/dist/{chunk-T2S7NIUG.js → chunk-XE4JVTM6.js} +2 -2
  56. package/dist/{chunk-SIWXMNQT.js → chunk-YDTCM5F6.js} +4 -4
  57. package/dist/{chunk-BQGWY577.js → chunk-ZCUVZ5PR.js} +3 -3
  58. package/dist/data-display/DataViews.js +12 -12
  59. package/dist/data-display/Progress.js +1 -1
  60. package/dist/feedback/Dialog.js +2 -2
  61. package/dist/feedback/StackedModal.js +2 -2
  62. package/dist/icons.js +2 -2
  63. package/dist/layout/SettingCard.js +9 -9
  64. package/dist/native/chunks/{chunk-QGTZGL7P.js → chunk-BUFQXX27.js} +2 -2
  65. package/dist/native/chunks/{chunk-EZO2KJF7.js → chunk-JFKH5YHF.js} +3 -1
  66. package/dist/native/chunks/{chunk-EZO2KJF7.js.map → chunk-JFKH5YHF.js.map} +1 -1
  67. package/dist/native/data-display/Alert.js +1 -1
  68. package/dist/native/data-display/Avatar.js +1 -1
  69. package/dist/native/data-display/Badge.js +1 -1
  70. package/dist/native/data-display/Chip.js +1 -1
  71. package/dist/native/data-display/EmptyState.js +2 -2
  72. package/dist/native/data-display/ErrorState.js +1 -1
  73. package/dist/native/data-display/FleetMap.js +2 -2
  74. package/dist/native/data-display/Progress.js +11 -5
  75. package/dist/native/data-display/Progress.js.map +1 -1
  76. package/dist/native/feedback/Dialog.js +2 -1
  77. package/dist/native/feedback/Dialog.js.map +1 -1
  78. package/dist/native/form/Checkbox.js +1 -1
  79. package/dist/native/form/Select.js +1 -1
  80. package/dist/native/icons.js +1 -1
  81. package/dist/navigation/AppHeader.js +3 -3
  82. package/dist/types/components/data-display/Progress/Progress.base.d.ts +8 -0
  83. package/dist/types/components/data-display/Progress/Progress.base.d.ts.map +1 -1
  84. package/dist/types/components/data-display/Progress/Progress.d.ts.map +1 -1
  85. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts +2 -1
  86. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
  87. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
  88. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  89. package/dist/types/icons/paths.generated.d.ts +2 -0
  90. package/dist/types/icons/paths.generated.d.ts.map +1 -1
  91. package/dist/types-native/components/data-display/Progress/Progress.base.d.ts +8 -0
  92. package/dist/types-native/components/data-display/Progress/Progress.base.d.ts.map +1 -1
  93. package/dist/types-native/components/data-display/Progress/Progress.native.d.ts.map +1 -1
  94. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts +2 -1
  95. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
  96. package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts.map +1 -1
  97. package/dist/types-native/icons/paths.generated.d.ts +2 -0
  98. package/dist/types-native/icons/paths.generated.d.ts.map +1 -1
  99. package/package.json +1 -1
  100. package/src/components/data-display/Progress/Progress.base.ts +10 -0
  101. package/src/components/data-display/Progress/Progress.md +23 -0
  102. package/src/components/data-display/Progress/Progress.native.tsx +35 -25
  103. package/src/components/data-display/Progress/Progress.tsx +8 -5
  104. package/src/components/feedback/Dialog/Dialog.base.ts +2 -1
  105. package/src/components/feedback/Dialog/Dialog.look.native.ts +1 -0
  106. package/src/components/feedback/Dialog/Dialog.md +25 -1
  107. package/src/components/feedback/Dialog/Dialog.styles.ts +3 -0
  108. package/src/components/feedback/StackedModal/StackedModal.md +17 -2
  109. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +19 -3
  110. package/src/icons/Icon.md +4 -0
  111. package/src/icons/glyphs.json +2 -0
  112. package/src/icons/paths.generated.ts +2 -0
  113. package/dist/chunk-4EJBLJZK.js.map +0 -1
  114. package/dist/chunk-XTHDWW4M.js.map +0 -1
  115. /package/dist/{chunk-MQSI57HY.js.map → chunk-45PGSVOH.js.map} +0 -0
  116. /package/dist/{chunk-CLC4VIOF.js.map → chunk-4PYEDDYV.js.map} +0 -0
  117. /package/dist/{chunk-JWXGZ4VM.js.map → chunk-6J27G2HT.js.map} +0 -0
  118. /package/dist/{chunk-3S44O3WI.js.map → chunk-BJMNAPKH.js.map} +0 -0
  119. /package/dist/{chunk-6E4XNOAC.js.map → chunk-CCCILWYZ.js.map} +0 -0
  120. /package/dist/{chunk-Y2HCYT5W.js.map → chunk-GRRW5NSR.js.map} +0 -0
  121. /package/dist/{chunk-NZZ2BTIK.js.map → chunk-H7R6UKOE.js.map} +0 -0
  122. /package/dist/{chunk-DSDZIBLQ.js.map → chunk-ICSXPZXT.js.map} +0 -0
  123. /package/dist/{chunk-AL3Z24VG.js.map → chunk-ILQVNZ5B.js.map} +0 -0
  124. /package/dist/{chunk-5PN5MY2X.js.map → chunk-INQO5AYV.js.map} +0 -0
  125. /package/dist/{chunk-2DV64INT.js.map → chunk-KEDZTZCV.js.map} +0 -0
  126. /package/dist/{chunk-ZJC5COCE.js.map → chunk-N4MR4EMC.js.map} +0 -0
  127. /package/dist/{chunk-KMW7GGX6.js.map → chunk-OGBLNORM.js.map} +0 -0
  128. /package/dist/{chunk-44JLXXWQ.js.map → chunk-PPITQH3C.js.map} +0 -0
  129. /package/dist/{chunk-JC244QQF.js.map → chunk-SEWUYHSG.js.map} +0 -0
  130. /package/dist/{chunk-5XZEGI35.js.map → chunk-X7HCS3HP.js.map} +0 -0
  131. /package/dist/{chunk-T2S7NIUG.js.map → chunk-XE4JVTM6.js.map} +0 -0
  132. /package/dist/{chunk-SIWXMNQT.js.map → chunk-YDTCM5F6.js.map} +0 -0
  133. /package/dist/{chunk-BQGWY577.js.map → chunk-ZCUVZ5PR.js.map} +0 -0
  134. /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;AAmTtB;;;GAGG;AACH,eAAO,MAAM,QAAQ;;8BAuDnB,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;AAC1E,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,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
+ {"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;AA0DD;;;;;;;;;;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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Cb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C,eAAO,MAAM,UAAU,EAA8B,SAAS,QAAQ,EAAE,CAAC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.56.0",
3
+ "version": "6.57.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -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
- }: ViewArgs & { thickness: number; circularSize?: number }): React.JSX.Element {
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
- <Animated.View
247
- testID={elementTestID}
248
- role="progressbar"
249
- {...valueAria(value)}
250
- style={[box, glow ? circularGlowStyle(theme, color) : null, pulseStyle]}
251
- {...rest}
252
- >
253
- <Animated.View style={[box, spin]}>
254
- <CircularDial
255
- diameter={diameter}
256
- thickness={thickness}
257
- stroke={progressPalette(theme, color).main}
258
- dashOffset={
259
- indeterminate
260
- ? circularCircumference(thickness) * (1 - CIRCULAR_INDETERMINATE.arc)
261
- : circularDashOffset(displayValue, thickness)
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
- </Animated.View>
266
- {showLabel && !indeterminate ? (
267
- <View style={[StyleSheet.absoluteFill, styles.centre]}>
268
- <ProgressLabel size={size} label={displayLabel} testID={`${testID}-label`} muted />
269
- </View>
270
- ) : null}
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 container |
179
- | Title | `my-modal-title` | The navigation title text |
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
- <StyledDialogTitle id={titleId} rtl={rtl} data-testid={testId(dataTestId, 'header')}>
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.
@@ -43,6 +43,8 @@
43
43
  "Settings",
44
44
  "Visibility",
45
45
  "VisibilityOff",
46
+ "VolumeOff",
47
+ "VolumeUp",
46
48
  "Warning",
47
49
  "WarningAmber"
48
50
  ]
@@ -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":[]}