@12-apps/ui 6.56.0 → 6.56.1

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 (27) hide show
  1. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +5 -5
  2. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +6 -6
  3. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +3 -3
  4. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +4 -4
  5. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
  6. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +1 -1
  7. package/dist/_internal/components/feedback/index.js +2 -2
  8. package/dist/_internal/components/index.js +2 -2
  9. package/dist/{chunk-4EJBLJZK.js → chunk-2KGYTJCN.js} +50 -29
  10. package/dist/chunk-2KGYTJCN.js.map +1 -0
  11. package/dist/{chunk-MQSI57HY.js → chunk-45PGSVOH.js} +2 -2
  12. package/dist/{chunk-3S44O3WI.js → chunk-C3BRCCHG.js} +2 -2
  13. package/dist/{chunk-DSDZIBLQ.js → chunk-ICSXPZXT.js} +2 -2
  14. package/dist/{chunk-ZJC5COCE.js → chunk-N4MR4EMC.js} +3 -3
  15. package/dist/{chunk-KMW7GGX6.js → chunk-OGBLNORM.js} +2 -2
  16. package/dist/data-display/DataViews.js +6 -6
  17. package/dist/feedback/StackedModal.js +2 -2
  18. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  19. package/package.json +1 -1
  20. package/src/components/feedback/StackedModal/StackedModal.md +17 -2
  21. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +19 -3
  22. package/dist/chunk-4EJBLJZK.js.map +0 -1
  23. /package/dist/{chunk-MQSI57HY.js.map → chunk-45PGSVOH.js.map} +0 -0
  24. /package/dist/{chunk-3S44O3WI.js.map → chunk-C3BRCCHG.js.map} +0 -0
  25. /package/dist/{chunk-DSDZIBLQ.js.map → chunk-ICSXPZXT.js.map} +0 -0
  26. /package/dist/{chunk-ZJC5COCE.js.map → chunk-N4MR4EMC.js.map} +0 -0
  27. /package/dist/{chunk-KMW7GGX6.js.map → chunk-OGBLNORM.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  DataViewsGrid
4
- } from "../../../../chunk-DSDZIBLQ.js";
5
- import "../../../../chunk-MQSI57HY.js";
6
- import "../../../../chunk-ZJC5COCE.js";
4
+ } from "../../../../chunk-ICSXPZXT.js";
5
+ import "../../../../chunk-45PGSVOH.js";
6
+ import "../../../../chunk-N4MR4EMC.js";
7
7
  import "../../../../chunk-6NWFX2XJ.js";
8
8
  import "../../../../chunk-MKAA3YIJ.js";
9
9
  import "../../../../chunk-QLJU7UUI.js";
@@ -93,10 +93,10 @@ import "../../../../chunk-PN4HVM43.js";
93
93
  import "../../../../chunk-C3UKR3NT.js";
94
94
  import "../../../../chunk-D6KL74KI.js";
95
95
  import "../../../../chunk-CN46HGXE.js";
96
- import "../../../../chunk-KMW7GGX6.js";
96
+ import "../../../../chunk-OGBLNORM.js";
97
97
  import "../../../../chunk-G3QKH23Y.js";
98
98
  import "../../../../chunk-JZRSHDNY.js";
99
- import "../../../../chunk-4EJBLJZK.js";
99
+ import "../../../../chunk-2KGYTJCN.js";
100
100
  import "../../../../chunk-NEHCU3EZ.js";
101
101
  import "../../../../chunk-L5CPOEDP.js";
102
102
  import "../../../../chunk-LWZ2K225.js";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  DataViewsTableBase
4
- } from "../../../../chunk-3S44O3WI.js";
4
+ } from "../../../../chunk-C3BRCCHG.js";
5
5
  import "../../../../chunk-NZZ2BTIK.js";
6
- import "../../../../chunk-DSDZIBLQ.js";
6
+ import "../../../../chunk-ICSXPZXT.js";
7
7
  import "../../../../chunk-ZOLAYP2D.js";
8
- import "../../../../chunk-MQSI57HY.js";
9
- import "../../../../chunk-ZJC5COCE.js";
8
+ import "../../../../chunk-45PGSVOH.js";
9
+ import "../../../../chunk-N4MR4EMC.js";
10
10
  import "../../../../chunk-6NWFX2XJ.js";
11
11
  import "../../../../chunk-MKAA3YIJ.js";
12
12
  import "../../../../chunk-QLJU7UUI.js";
@@ -128,10 +128,10 @@ import "../../../../chunk-AL5E624U.js";
128
128
  import "../../../../chunk-Z2JH5KW5.js";
129
129
  import "../../../../chunk-LV7LSPBF.js";
130
130
  import "../../../../chunk-CN46HGXE.js";
131
- import "../../../../chunk-KMW7GGX6.js";
131
+ import "../../../../chunk-OGBLNORM.js";
132
132
  import "../../../../chunk-G3QKH23Y.js";
133
133
  import "../../../../chunk-JZRSHDNY.js";
134
- import "../../../../chunk-4EJBLJZK.js";
134
+ import "../../../../chunk-2KGYTJCN.js";
135
135
  import "../../../../chunk-NEHCU3EZ.js";
136
136
  import "../../../../chunk-L5CPOEDP.js";
137
137
  import "../../../../chunk-LWZ2K225.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  FilterDialog,
4
4
  GridFilterPanel
5
- } from "../../../../chunk-ZJC5COCE.js";
5
+ } from "../../../../chunk-N4MR4EMC.js";
6
6
  import "../../../../chunk-GWUJIO6Z.js";
7
7
  import "../../../../chunk-YXIVQFNW.js";
8
8
  import "../../../../chunk-7D7CJRL7.js";
@@ -43,10 +43,10 @@ import "../../../../chunk-PN4HVM43.js";
43
43
  import "../../../../chunk-C3UKR3NT.js";
44
44
  import "../../../../chunk-D6KL74KI.js";
45
45
  import "../../../../chunk-CN46HGXE.js";
46
- import "../../../../chunk-KMW7GGX6.js";
46
+ import "../../../../chunk-OGBLNORM.js";
47
47
  import "../../../../chunk-G3QKH23Y.js";
48
48
  import "../../../../chunk-JZRSHDNY.js";
49
- import "../../../../chunk-4EJBLJZK.js";
49
+ import "../../../../chunk-2KGYTJCN.js";
50
50
  import "../../../../chunk-NEHCU3EZ.js";
51
51
  import "../../../../chunk-AKZWDZCZ.js";
52
52
  import "../../../../chunk-RGVNXES5.js";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  GridShell
4
- } from "../../../../chunk-MQSI57HY.js";
5
- import "../../../../chunk-ZJC5COCE.js";
4
+ } from "../../../../chunk-45PGSVOH.js";
5
+ import "../../../../chunk-N4MR4EMC.js";
6
6
  import "../../../../chunk-6NWFX2XJ.js";
7
7
  import "../../../../chunk-MKAA3YIJ.js";
8
8
  import "../../../../chunk-QLJU7UUI.js";
@@ -86,10 +86,10 @@ import "../../../../chunk-PN4HVM43.js";
86
86
  import "../../../../chunk-C3UKR3NT.js";
87
87
  import "../../../../chunk-D6KL74KI.js";
88
88
  import "../../../../chunk-CN46HGXE.js";
89
- import "../../../../chunk-KMW7GGX6.js";
89
+ import "../../../../chunk-OGBLNORM.js";
90
90
  import "../../../../chunk-G3QKH23Y.js";
91
91
  import "../../../../chunk-JZRSHDNY.js";
92
- import "../../../../chunk-4EJBLJZK.js";
92
+ import "../../../../chunk-2KGYTJCN.js";
93
93
  import "../../../../chunk-NEHCU3EZ.js";
94
94
  import "../../../../chunk-L5CPOEDP.js";
95
95
  import "../../../../chunk-LWZ2K225.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StackedModal
3
- } from "../../../../chunk-KMW7GGX6.js";
3
+ } from "../../../../chunk-OGBLNORM.js";
4
4
  import "../../../../chunk-G3QKH23Y.js";
5
5
  import {
6
6
  ModalStackProvider,
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  StackedModalActions,
11
11
  StackedModalContent
12
- } from "../../../../chunk-4EJBLJZK.js";
12
+ } from "../../../../chunk-2KGYTJCN.js";
13
13
  import "../../../../chunk-NEHCU3EZ.js";
14
14
  import "../../../../chunk-AKZWDZCZ.js";
15
15
  import "../../../../chunk-SSX5ITPM.js";
@@ -9,7 +9,7 @@ import {
9
9
  modalAriaIds,
10
10
  resolveModalContent,
11
11
  testId
12
- } from "../../../../chunk-4EJBLJZK.js";
12
+ } from "../../../../chunk-2KGYTJCN.js";
13
13
  import "../../../../chunk-NEHCU3EZ.js";
14
14
  import "../../../../chunk-AKZWDZCZ.js";
15
15
  import "../../../../chunk-SSX5ITPM.js";
@@ -68,7 +68,7 @@ import "../../../chunk-LV7LSPBF.js";
68
68
  import "../../../chunk-CN46HGXE.js";
69
69
  import {
70
70
  StackedModal
71
- } from "../../../chunk-KMW7GGX6.js";
71
+ } from "../../../chunk-OGBLNORM.js";
72
72
  import "../../../chunk-G3QKH23Y.js";
73
73
  import {
74
74
  ModalStackProvider,
@@ -77,7 +77,7 @@ import {
77
77
  import {
78
78
  StackedModalActions,
79
79
  StackedModalContent
80
- } from "../../../chunk-4EJBLJZK.js";
80
+ } from "../../../chunk-2KGYTJCN.js";
81
81
  import "../../../chunk-NEHCU3EZ.js";
82
82
  import "../../../chunk-TP3XKS72.js";
83
83
  import "../../../chunk-PAO2IWU5.js";
@@ -684,7 +684,7 @@ import "../../chunk-LV7LSPBF.js";
684
684
  import "../../chunk-CN46HGXE.js";
685
685
  import {
686
686
  StackedModal
687
- } from "../../chunk-KMW7GGX6.js";
687
+ } from "../../chunk-OGBLNORM.js";
688
688
  import "../../chunk-G3QKH23Y.js";
689
689
  import {
690
690
  ModalStackProvider,
@@ -693,7 +693,7 @@ import {
693
693
  import {
694
694
  StackedModalActions,
695
695
  StackedModalContent
696
- } from "../../chunk-4EJBLJZK.js";
696
+ } from "../../chunk-2KGYTJCN.js";
697
697
  import "../../chunk-NEHCU3EZ.js";
698
698
  import "../../chunk-L5CPOEDP.js";
699
699
  import {
@@ -114,34 +114,55 @@ var ModalHeader = ({
114
114
  headerActions,
115
115
  rtl,
116
116
  dataTestId
117
- }) => /* @__PURE__ */ jsxs(StyledDialogTitle, { id: titleId, rtl, "data-testid": testId(dataTestId, "header"), children: [
118
- /* @__PURE__ */ jsxs(DialogTitleLeft, { children: [
119
- /* @__PURE__ */ jsx(
120
- HeaderLeadingButton,
121
- {
122
- canGoBack,
123
- onBack,
124
- backLabel,
125
- onClose,
126
- hideClose,
127
- rtl,
128
- dataTestId
129
- }
130
- ),
131
- navigationTitle && /* @__PURE__ */ jsx(
132
- Typography,
133
- {
134
- variant: "h6",
135
- component: "h2",
136
- noWrap: true,
137
- sx: { ml: canGoBack || !hideClose ? 1 : 0 },
138
- "data-testid": testId(dataTestId, "title"),
139
- children: navigationTitle
140
- }
141
- )
142
- ] }),
143
- /* @__PURE__ */ jsx(DialogTitleRight, { "data-testid": testId(dataTestId, "header-actions"), children: headerActions })
144
- ] });
117
+ }) => (
118
+ // The BAR is not a heading: it holds the ✕ or back button and the header
119
+ // actions. The title inside it is the panel's one heading and carries the id
120
+ // the dialog's `aria-labelledby` names, so the dialog is named by the title
121
+ // alone — not "close Title Save" — and a screen reader hears it once.
122
+ //
123
+ // The bar's id is stated, never left to MUI: `DialogTitle` falls back to the
124
+ // Dialog's `aria-labelledby` and would claim the title's id a second time.
125
+ // With NO title the bar is drawn exactly as it always was — MUI's own `h2`,
126
+ // holding the id — so an untitled panel keeps its markup and its name.
127
+ /* @__PURE__ */ jsxs(
128
+ StyledDialogTitle,
129
+ {
130
+ component: navigationTitle ? "div" : "h2",
131
+ id: navigationTitle ? `${titleId}-bar` : titleId,
132
+ rtl,
133
+ "data-testid": testId(dataTestId, "header"),
134
+ children: [
135
+ /* @__PURE__ */ jsxs(DialogTitleLeft, { children: [
136
+ /* @__PURE__ */ jsx(
137
+ HeaderLeadingButton,
138
+ {
139
+ canGoBack,
140
+ onBack,
141
+ backLabel,
142
+ onClose,
143
+ hideClose,
144
+ rtl,
145
+ dataTestId
146
+ }
147
+ ),
148
+ navigationTitle && /* @__PURE__ */ jsx(
149
+ Typography,
150
+ {
151
+ id: titleId,
152
+ variant: "h6",
153
+ component: "h2",
154
+ noWrap: true,
155
+ sx: { ml: canGoBack || !hideClose ? 1 : 0 },
156
+ "data-testid": testId(dataTestId, "title"),
157
+ children: navigationTitle
158
+ }
159
+ )
160
+ ] }),
161
+ /* @__PURE__ */ jsx(DialogTitleRight, { "data-testid": testId(dataTestId, "header-actions"), children: headerActions })
162
+ ]
163
+ }
164
+ )
165
+ );
145
166
  var ContentSkeleton = () => {
146
167
  const theme = useTheme();
147
168
  return /* @__PURE__ */ jsxs(Box, { sx: { p: 3 }, children: [
@@ -231,4 +252,4 @@ export {
231
252
  ModalFooter,
232
253
  ModalPanelContents
233
254
  };
234
- //# sourceMappingURL=chunk-4EJBLJZK.js.map
255
+ //# sourceMappingURL=chunk-2KGYTJCN.js.map
@@ -0,0 +1 @@
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 { ElementType, 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\n// `component` typed through: the bar is a `div` when it holds a title (`ModalHeader`).\nconst StyledDialogTitle = styled(DialogTitle, {\n shouldForwardProp: (prop) => prop !== 'rtl',\n})<{ rtl?: boolean; component?: ElementType }>(({ 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 // The BAR is not a heading: it holds the ✕ or back button and the header\n // actions. The title inside it is the panel's one heading and carries the id\n // the dialog's `aria-labelledby` names, so the dialog is named by the title\n // alone — not \"close Title Save\" — and a screen reader hears it once.\n //\n // The bar's id is stated, never left to MUI: `DialogTitle` falls back to the\n // Dialog's `aria-labelledby` and would claim the title's id a second time.\n // With NO title the bar is drawn exactly as it always was — MUI's own `h2`,\n // holding the id — so an untitled panel keeps its markup and its name.\n <StyledDialogTitle\n component={navigationTitle ? 'div' : 'h2'}\n id={navigationTitle ? `${titleId}-bar` : titleId}\n rtl={rtl}\n data-testid={testId(dataTestId, 'header')}\n >\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 id={titleId}\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,7 +1,7 @@
1
1
  import {
2
2
  FilterDialog,
3
3
  GridFilterPanel
4
- } from "./chunk-ZJC5COCE.js";
4
+ } from "./chunk-N4MR4EMC.js";
5
5
  import {
6
6
  DataViewsEmpty
7
7
  } from "./chunk-6NWFX2XJ.js";
@@ -238,4 +238,4 @@ function GridShell(props) {
238
238
  export {
239
239
  GridShell
240
240
  };
241
- //# sourceMappingURL=chunk-MQSI57HY.js.map
241
+ //# sourceMappingURL=chunk-45PGSVOH.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-NZZ2BTIK.js";
4
4
  import {
5
5
  DataViewsGrid
6
- } from "./chunk-DSDZIBLQ.js";
6
+ } from "./chunk-ICSXPZXT.js";
7
7
  import {
8
8
  viewStateKey
9
9
  } from "./chunk-ZOLAYP2D.js";
@@ -178,4 +178,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
178
178
  export {
179
179
  DataViewsTableBase
180
180
  };
181
- //# sourceMappingURL=chunk-3S44O3WI.js.map
181
+ //# sourceMappingURL=chunk-C3BRCCHG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GridShell
3
- } from "./chunk-MQSI57HY.js";
3
+ } from "./chunk-45PGSVOH.js";
4
4
  import {
5
5
  useDataViewsState
6
6
  } from "./chunk-2W2MWEP2.js";
@@ -27,4 +27,4 @@ function DataViewsGrid(props) {
27
27
  export {
28
28
  DataViewsGrid
29
29
  };
30
- //# sourceMappingURL=chunk-DSDZIBLQ.js.map
30
+ //# sourceMappingURL=chunk-ICSXPZXT.js.map
@@ -12,10 +12,10 @@ import {
12
12
  } from "./chunk-7LOCLC24.js";
13
13
  import {
14
14
  StackedModal
15
- } from "./chunk-KMW7GGX6.js";
15
+ } from "./chunk-OGBLNORM.js";
16
16
  import {
17
17
  StackedModalContent
18
- } from "./chunk-4EJBLJZK.js";
18
+ } from "./chunk-2KGYTJCN.js";
19
19
  import {
20
20
  sxRem
21
21
  } from "./chunk-YKCAJ2TN.js";
@@ -157,4 +157,4 @@ export {
157
157
  GridFilterPanel,
158
158
  FilterDialog
159
159
  };
160
- //# sourceMappingURL=chunk-ZJC5COCE.js.map
160
+ //# sourceMappingURL=chunk-N4MR4EMC.js.map
@@ -5,7 +5,7 @@ import {
5
5
  ModalPanelContents,
6
6
  modalAriaIds,
7
7
  resolveModalContent
8
- } from "./chunk-4EJBLJZK.js";
8
+ } from "./chunk-2KGYTJCN.js";
9
9
  import {
10
10
  STYLE_ONLY_PROPS,
11
11
  dialogRootStyles
@@ -158,4 +158,4 @@ var StackedModal = (props) => {
158
158
  export {
159
159
  StackedModal
160
160
  };
161
- //# sourceMappingURL=chunk-KMW7GGX6.js.map
161
+ //# sourceMappingURL=chunk-OGBLNORM.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  DataViewsTableBase
3
- } from "../chunk-3S44O3WI.js";
3
+ } from "../chunk-C3BRCCHG.js";
4
4
  import "../chunk-NZZ2BTIK.js";
5
5
  import {
6
6
  DataViewsGrid
7
- } from "../chunk-DSDZIBLQ.js";
7
+ } from "../chunk-ICSXPZXT.js";
8
8
  import {
9
9
  BaseListCard
10
10
  } from "../chunk-LJKWWXZD.js";
@@ -22,8 +22,8 @@ import {
22
22
  useDragItem
23
23
  } from "../chunk-K4EKTMTC.js";
24
24
  import "../chunk-ZOLAYP2D.js";
25
- import "../chunk-MQSI57HY.js";
26
- import "../chunk-ZJC5COCE.js";
25
+ import "../chunk-45PGSVOH.js";
26
+ import "../chunk-N4MR4EMC.js";
27
27
  import "../chunk-6NWFX2XJ.js";
28
28
  import "../chunk-MKAA3YIJ.js";
29
29
  import "../chunk-QLJU7UUI.js";
@@ -171,10 +171,10 @@ import "../chunk-AL5E624U.js";
171
171
  import "../chunk-Z2JH5KW5.js";
172
172
  import "../chunk-LV7LSPBF.js";
173
173
  import "../chunk-CN46HGXE.js";
174
- import "../chunk-KMW7GGX6.js";
174
+ import "../chunk-OGBLNORM.js";
175
175
  import "../chunk-G3QKH23Y.js";
176
176
  import "../chunk-JZRSHDNY.js";
177
- import "../chunk-4EJBLJZK.js";
177
+ import "../chunk-2KGYTJCN.js";
178
178
  import "../chunk-NEHCU3EZ.js";
179
179
  import "../chunk-L5CPOEDP.js";
180
180
  import "../chunk-LWZ2K225.js";
@@ -1,7 +1,7 @@
1
1
  import "../chunk-CN46HGXE.js";
2
2
  import {
3
3
  StackedModal
4
- } from "../chunk-KMW7GGX6.js";
4
+ } from "../chunk-OGBLNORM.js";
5
5
  import "../chunk-G3QKH23Y.js";
6
6
  import {
7
7
  ModalStackProvider,
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  StackedModalActions,
12
12
  StackedModalContent
13
- } from "../chunk-4EJBLJZK.js";
13
+ } from "../chunk-2KGYTJCN.js";
14
14
  import "../chunk-NEHCU3EZ.js";
15
15
  import "../chunk-AKZWDZCZ.js";
16
16
  import "../chunk-SSX5ITPM.js";
@@ -1 +1 @@
1
- {"version":3,"file":"StackedModal.parts.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/StackedModal/StackedModal.parts.tsx"],"names":[],"mappings":"AAKA,OAAO,aAAa,MAAM,sCAAsC,CAAC;AAMjE,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAoB3C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,OAAO,aAEhB,CAAC;AAE1B,sFAAsF;AACtF,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,GAAG,SAAS,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,SACnC,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAqC,CAAC;AAmBnG;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,SAAS,EACnB,SAAS,SAAS,EAClB,UAAU,OAAO,KAChB;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAU3B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,iBAAiB,MAAM,EACvB,kBAAkB,MAAM,KACvB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAGlC,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAejF,CAAC;AAEF,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,uFAAuF;IACvF,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0CD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAuC5C,CAAC;AAcF,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CA0BxC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAgBzE,CAAC;AAEF,UAAU,kBAAmB,SAAQ,gBAAgB;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,qFAAqF;IACrF,YAAY,EAAE,SAAS,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,0FAA0F;AAC1F,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CA0BrD,CAAC"}
1
+ {"version":3,"file":"StackedModal.parts.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/StackedModal/StackedModal.parts.tsx"],"names":[],"mappings":"AAKA,OAAO,aAAa,MAAM,sCAAsC,CAAC;AAMjE,OAAO,KAAK,EAAe,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBxD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,OAAO,aAEhB,CAAC;AAE1B,sFAAsF;AACtF,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,GAAG,SAAS,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,SACnC,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAqC,CAAC;AAmBnG;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,SAAS,EACnB,SAAS,SAAS,EAClB,UAAU,OAAO,KAChB;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAU3B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,iBAAiB,MAAM,EACvB,kBAAkB,MAAM,KACvB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAGlC,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAejF,CAAC;AAEF,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,uFAAuF;IACvF,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0CD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAsD5C,CAAC;AAcF,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CA0BxC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAgBzE,CAAC;AAEF,UAAU,kBAAmB,SAAQ,gBAAgB;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,qFAAqF;IACrF,YAAY,EAAE,SAAS,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,0FAA0F;AAC1F,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CA0BrD,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.56.1",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -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
@@ -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":[]}