@12-apps/ui 6.62.0 → 6.63.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 (171) hide show
  1. package/dist/_internal/components/data-display/CardKit/CardKebab.js +3 -3
  2. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +3 -3
  3. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +3 -3
  4. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +22 -22
  5. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +28 -28
  6. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  7. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +4 -4
  8. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
  9. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +4 -4
  10. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +4 -4
  11. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +3 -3
  12. package/dist/_internal/components/data-display/DataViews/data-views-export.js +3 -3
  13. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +5 -5
  14. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +5 -5
  15. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +3 -3
  16. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +19 -19
  17. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +4 -4
  18. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +3 -3
  19. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +3 -3
  20. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +8 -8
  21. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +7 -7
  23. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +3 -3
  24. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +5 -5
  25. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  26. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +3 -3
  27. package/dist/_internal/components/feedback/StackedModal/StackedModal.hooks.js +1 -1
  28. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +4 -4
  29. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +2 -2
  30. package/dist/_internal/components/feedback/StackedModal/StackedModal.styles.js +1 -1
  31. package/dist/_internal/components/feedback/index.js +8 -8
  32. package/dist/_internal/components/form/Button/Button.js +2 -2
  33. package/dist/_internal/components/form/Button/Button.styles.js +1 -1
  34. package/dist/_internal/components/form/index.js +2 -2
  35. package/dist/_internal/components/form/total-form/SubmitButton.js +3 -3
  36. package/dist/_internal/components/index.js +16 -16
  37. package/dist/_internal/components/layout/SettingCard/SettingCard.js +5 -5
  38. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +3 -3
  39. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +4 -4
  40. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +4 -4
  41. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +6 -6
  42. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +5 -5
  43. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +6 -6
  44. package/dist/_internal/components/layout/index.js +9 -9
  45. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -3
  46. package/dist/_internal/components/navigation/index.js +3 -3
  47. package/dist/_internal/social-login-button/social-login-button.js +3 -3
  48. package/dist/_internal/user-avatar/user-avatar.js +3 -3
  49. package/dist/{chunk-CFAIMOFE.js → chunk-265RW6VX.js} +2 -2
  50. package/dist/{chunk-VZCZAHMX.js → chunk-2XOL4HJU.js} +4 -4
  51. package/dist/{chunk-4PYEDDYV.js → chunk-3AQ25I6D.js} +2 -2
  52. package/dist/{chunk-BTJFOPCQ.js → chunk-3FLJ4ZWZ.js} +2 -2
  53. package/dist/{chunk-XE4JVTM6.js → chunk-4HHCVL5D.js} +2 -2
  54. package/dist/{chunk-EFLRNSE6.js → chunk-5COIBRIP.js} +3 -3
  55. package/dist/{chunk-NFCAXQ3F.js → chunk-5P4GWCBS.js} +3 -3
  56. package/dist/{chunk-PZPTTAO5.js → chunk-64BEEFLJ.js} +7 -7
  57. package/dist/{chunk-KEDZTZCV.js → chunk-6FZ3PJXR.js} +2 -2
  58. package/dist/{chunk-YDTCM5F6.js → chunk-AGUK7VQP.js} +4 -4
  59. package/dist/{chunk-ZCUVZ5PR.js → chunk-C622UXU6.js} +2 -2
  60. package/dist/{chunk-CCCILWYZ.js → chunk-DOROD5GQ.js} +3 -3
  61. package/dist/{chunk-SKOAJPOS.js → chunk-EP674QTM.js} +3 -3
  62. package/dist/{chunk-USZMUOI6.js → chunk-F5LDJ52M.js} +3 -3
  63. package/dist/{chunk-INQO5AYV.js → chunk-GF5VDLCC.js} +3 -3
  64. package/dist/{chunk-2KGYTJCN.js → chunk-GLKUN3DL.js} +4 -3
  65. package/dist/{chunk-2KGYTJCN.js.map → chunk-GLKUN3DL.js.map} +1 -1
  66. package/dist/{chunk-6NWFX2XJ.js → chunk-GOIFPE2E.js} +2 -2
  67. package/dist/{chunk-PKGBW7KS.js → chunk-HM6T6EQR.js} +3 -3
  68. package/dist/{chunk-EXAXD7FA.js → chunk-JQBODXRV.js} +2 -2
  69. package/dist/{chunk-T2UP4XJF.js → chunk-JTIKY2D3.js} +20 -13
  70. package/dist/{chunk-T2UP4XJF.js.map → chunk-JTIKY2D3.js.map} +1 -1
  71. package/dist/{chunk-6J27G2HT.js → chunk-KYFRZX5C.js} +2 -2
  72. package/dist/{chunk-NQZNV3VR.js → chunk-LCVBED7G.js} +2 -2
  73. package/dist/{chunk-GRRW5NSR.js → chunk-NHAB477Y.js} +3 -3
  74. package/dist/{chunk-X7HCS3HP.js → chunk-PSYX2KEQ.js} +3 -3
  75. package/dist/{chunk-3UQMIFPA.js → chunk-QNXCCBRW.js} +2 -2
  76. package/dist/{chunk-ZUQX7XHJ.js → chunk-RG3GJTSK.js} +4 -4
  77. package/dist/{chunk-OGBLNORM.js → chunk-RQ2NKSIA.js} +19 -5
  78. package/dist/chunk-RQ2NKSIA.js.map +1 -0
  79. package/dist/{chunk-JA6GKU65.js → chunk-SAVNRXHT.js} +2 -2
  80. package/dist/{chunk-WQBHJXXW.js → chunk-TSHX4Q6M.js} +2 -2
  81. package/dist/{chunk-G3QKH23Y.js → chunk-TSMF7K37.js} +4 -2
  82. package/dist/chunk-TSMF7K37.js.map +1 -0
  83. package/dist/{chunk-XGIJGIN3.js → chunk-U5NRT6JR.js} +2 -2
  84. package/dist/{chunk-QJWIX4YZ.js → chunk-VE7QYG3W.js} +2 -2
  85. package/dist/{chunk-4JZ6XDVA.js → chunk-VLRHESS2.js} +2 -2
  86. package/dist/{chunk-JE6FNSQV.js → chunk-W4O3BTD5.js} +2 -2
  87. package/dist/{chunk-PPITQH3C.js → chunk-WA36P74Q.js} +2 -2
  88. package/dist/{chunk-UZCQHNXC.js → chunk-WM44LYFN.js} +2 -2
  89. package/dist/{chunk-NBM3YJ4P.js → chunk-X6WC5QBY.js} +2 -2
  90. package/dist/{chunk-L4HUZCKV.js → chunk-XOCWAQOA.js} +2 -2
  91. package/dist/{chunk-NEHCU3EZ.js → chunk-XSIVM4VO.js} +5 -2
  92. package/dist/{chunk-NEHCU3EZ.js.map → chunk-XSIVM4VO.js.map} +1 -1
  93. package/dist/{chunk-5NOCDQJD.js → chunk-YLSBEWPJ.js} +2 -2
  94. package/dist/{chunk-H7R6UKOE.js → chunk-YWIVVKCJ.js} +2 -2
  95. package/dist/data-display/CardKit.js +4 -4
  96. package/dist/data-display/DataViews.js +28 -28
  97. package/dist/feedback/ConfirmAction.js +3 -3
  98. package/dist/feedback/NotificationStatusNotice.js +3 -3
  99. package/dist/feedback/StackedModal.js +4 -4
  100. package/dist/form/Button.js +2 -2
  101. package/dist/form/total-form.js +3 -3
  102. package/dist/layout/SettingCard.js +9 -9
  103. package/dist/native/chunks/{chunk-MU5EIZSP.js → chunk-2MFMON74.js} +21 -11
  104. package/dist/native/chunks/chunk-2MFMON74.js.map +1 -0
  105. package/dist/native/chunks/{chunk-BUFQXX27.js → chunk-CNTOS6KK.js} +2 -2
  106. package/dist/native/data-display/EmptyState.js +2 -2
  107. package/dist/native/data-display/ErrorState.js +1 -1
  108. package/dist/native/data-display/FleetMap.js +2 -2
  109. package/dist/native/form/Button.js +1 -1
  110. package/dist/navigation/AppHeader.js +3 -3
  111. package/dist/social-login-button.js +3 -3
  112. package/dist/types/components/feedback/StackedModal/StackedModal.d.ts.map +1 -1
  113. package/dist/types/components/feedback/StackedModal/StackedModal.hooks.d.ts +6 -0
  114. package/dist/types/components/feedback/StackedModal/StackedModal.hooks.d.ts.map +1 -1
  115. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts +2 -0
  116. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  117. package/dist/types/components/feedback/StackedModal/StackedModal.styles.d.ts.map +1 -1
  118. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts +12 -0
  119. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts.map +1 -1
  120. package/dist/types/components/form/Button/Button.styles.d.ts.map +1 -1
  121. package/dist/types-native/components/form/Button/Button.native.d.ts.map +1 -1
  122. package/dist/user-avatar.js +3 -3
  123. package/package.json +1 -1
  124. package/src/components/feedback/StackedModal/StackedModal.hooks.ts +11 -1
  125. package/src/components/feedback/StackedModal/StackedModal.md +28 -1
  126. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +4 -1
  127. package/src/components/feedback/StackedModal/StackedModal.styles.ts +4 -1
  128. package/src/components/feedback/StackedModal/StackedModal.tsx +22 -3
  129. package/src/components/feedback/StackedModal/StackedModal.types.ts +12 -0
  130. package/src/components/form/Button/Button.native.tsx +28 -13
  131. package/src/components/form/Button/Button.styles.ts +19 -12
  132. package/dist/chunk-G3QKH23Y.js.map +0 -1
  133. package/dist/chunk-OGBLNORM.js.map +0 -1
  134. package/dist/native/chunks/chunk-MU5EIZSP.js.map +0 -1
  135. /package/dist/{chunk-CFAIMOFE.js.map → chunk-265RW6VX.js.map} +0 -0
  136. /package/dist/{chunk-VZCZAHMX.js.map → chunk-2XOL4HJU.js.map} +0 -0
  137. /package/dist/{chunk-4PYEDDYV.js.map → chunk-3AQ25I6D.js.map} +0 -0
  138. /package/dist/{chunk-BTJFOPCQ.js.map → chunk-3FLJ4ZWZ.js.map} +0 -0
  139. /package/dist/{chunk-XE4JVTM6.js.map → chunk-4HHCVL5D.js.map} +0 -0
  140. /package/dist/{chunk-EFLRNSE6.js.map → chunk-5COIBRIP.js.map} +0 -0
  141. /package/dist/{chunk-NFCAXQ3F.js.map → chunk-5P4GWCBS.js.map} +0 -0
  142. /package/dist/{chunk-PZPTTAO5.js.map → chunk-64BEEFLJ.js.map} +0 -0
  143. /package/dist/{chunk-KEDZTZCV.js.map → chunk-6FZ3PJXR.js.map} +0 -0
  144. /package/dist/{chunk-YDTCM5F6.js.map → chunk-AGUK7VQP.js.map} +0 -0
  145. /package/dist/{chunk-ZCUVZ5PR.js.map → chunk-C622UXU6.js.map} +0 -0
  146. /package/dist/{chunk-CCCILWYZ.js.map → chunk-DOROD5GQ.js.map} +0 -0
  147. /package/dist/{chunk-SKOAJPOS.js.map → chunk-EP674QTM.js.map} +0 -0
  148. /package/dist/{chunk-USZMUOI6.js.map → chunk-F5LDJ52M.js.map} +0 -0
  149. /package/dist/{chunk-INQO5AYV.js.map → chunk-GF5VDLCC.js.map} +0 -0
  150. /package/dist/{chunk-6NWFX2XJ.js.map → chunk-GOIFPE2E.js.map} +0 -0
  151. /package/dist/{chunk-PKGBW7KS.js.map → chunk-HM6T6EQR.js.map} +0 -0
  152. /package/dist/{chunk-EXAXD7FA.js.map → chunk-JQBODXRV.js.map} +0 -0
  153. /package/dist/{chunk-6J27G2HT.js.map → chunk-KYFRZX5C.js.map} +0 -0
  154. /package/dist/{chunk-NQZNV3VR.js.map → chunk-LCVBED7G.js.map} +0 -0
  155. /package/dist/{chunk-GRRW5NSR.js.map → chunk-NHAB477Y.js.map} +0 -0
  156. /package/dist/{chunk-X7HCS3HP.js.map → chunk-PSYX2KEQ.js.map} +0 -0
  157. /package/dist/{chunk-3UQMIFPA.js.map → chunk-QNXCCBRW.js.map} +0 -0
  158. /package/dist/{chunk-ZUQX7XHJ.js.map → chunk-RG3GJTSK.js.map} +0 -0
  159. /package/dist/{chunk-JA6GKU65.js.map → chunk-SAVNRXHT.js.map} +0 -0
  160. /package/dist/{chunk-WQBHJXXW.js.map → chunk-TSHX4Q6M.js.map} +0 -0
  161. /package/dist/{chunk-XGIJGIN3.js.map → chunk-U5NRT6JR.js.map} +0 -0
  162. /package/dist/{chunk-QJWIX4YZ.js.map → chunk-VE7QYG3W.js.map} +0 -0
  163. /package/dist/{chunk-4JZ6XDVA.js.map → chunk-VLRHESS2.js.map} +0 -0
  164. /package/dist/{chunk-JE6FNSQV.js.map → chunk-W4O3BTD5.js.map} +0 -0
  165. /package/dist/{chunk-PPITQH3C.js.map → chunk-WA36P74Q.js.map} +0 -0
  166. /package/dist/{chunk-UZCQHNXC.js.map → chunk-WM44LYFN.js.map} +0 -0
  167. /package/dist/{chunk-NBM3YJ4P.js.map → chunk-X6WC5QBY.js.map} +0 -0
  168. /package/dist/{chunk-L4HUZCKV.js.map → chunk-XOCWAQOA.js.map} +0 -0
  169. /package/dist/{chunk-5NOCDQJD.js.map → chunk-YLSBEWPJ.js.map} +0 -0
  170. /package/dist/{chunk-H7R6UKOE.js.map → chunk-YWIVVKCJ.js.map} +0 -0
  171. /package/dist/native/chunks/{chunk-BUFQXX27.js.map → chunk-CNTOS6KK.js.map} +0 -0
@@ -125,18 +125,25 @@ var VARIANT_STYLES = {
125
125
  boxShadow: theme.shadows[8]
126
126
  }
127
127
  }),
128
- // A NEUTRAL outline is a field-row control ("Mais", "Exibir"), so it rests on
129
- // the one field border; a coloured outline keeps its colour, which is the
130
- // point of asking for one.
131
- outline: (theme, palette, color) => ({
132
- backgroundColor: "transparent",
133
- color: palette.main,
134
- border: color === "neutral" ? fieldBorder(theme) : `1px solid ${palette.main}`,
135
- "&:hover": {
136
- backgroundColor: alpha(palette.main, 0.1),
137
- borderColor: palette.dark
138
- }
139
- }),
128
+ // A NEUTRAL outline is a field-row control ("Mais", "Exibir", "Cancelar"), so
129
+ // it rests on the one field border and writes in the theme's own text ink —
130
+ // a ROLE, which turns with the mode. It used to write in grey 700, a step on
131
+ // a ramp MUI keeps the same in dark: dark on dark, 2.18:1 on a dark bar, so a
132
+ // live "Descartar" read as disabled. A coloured outline keeps its colour,
133
+ // which is the point of asking for one.
134
+ // Its hover draws from the same role, so it does not dim to grey 800 on a dark ground.
135
+ outline: (theme, palette, color) => {
136
+ const ink = color === "neutral" ? theme.palette.text.primary : palette.main;
137
+ return {
138
+ backgroundColor: "transparent",
139
+ color: ink,
140
+ border: color === "neutral" ? fieldBorder(theme) : `1px solid ${palette.main}`,
141
+ "&:hover": {
142
+ backgroundColor: alpha(ink, 0.1),
143
+ borderColor: color === "neutral" ? theme.palette.text.secondary : palette.dark
144
+ }
145
+ };
146
+ },
140
147
  ghost: (theme, palette) => ({
141
148
  backgroundColor: "transparent",
142
149
  color: quietInk(theme, palette),
@@ -217,4 +224,4 @@ export {
217
224
  buttonVariantStyles,
218
225
  buttonEmphasisStyles
219
226
  };
220
- //# sourceMappingURL=chunk-T2UP4XJF.js.map
227
+ //# sourceMappingURL=chunk-JTIKY2D3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/form/Button/Button.styles.ts"],"sourcesContent":["import { alpha, darken, keyframes, lighten } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { BUTTON_SIZES, ICON_ONLY_PADDING as ICON_ONLY_PADDING_PX } from './Button.metrics';\nimport { asFieldSize, fieldBorder, fieldHeight } from '../../../tokens/field-height';\nimport { absoluteInk, controlNeutral } from '../../../tokens/ink';\nimport { rem, rems } from '../../../tokens/relative';\nimport { inkOver } from '../../../tokens/theme';\n\n// The pulse ring, its spread through the theme's type scale.\nconst pulseAnimation = (theme: Theme) => keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 ${rem(theme, 15)} currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\ninterface ColorPalette {\n main: string;\n dark: string;\n light: string;\n contrastText: string;\n}\n\nconst shade = (\n palette: ColorPalette | undefined,\n key: 'dark' | 'light',\n fallback: ColorPalette,\n): string => palette?.[key] || palette?.main || fallback[key];\n\n/** `neutral` has no MUI palette entry, so its four shades come from grey. */\nconst neutralPalette = (theme: Theme): ColorPalette => controlNeutral(theme);\n\nexport const getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') return neutralPalette(theme);\n\n const colorMap: Record<string, ColorPalette> = {\n primary: theme.palette.primary as ColorPalette,\n secondary: theme.palette.secondary as ColorPalette,\n success: theme.palette.success as ColorPalette,\n warning: theme.palette.warning as ColorPalette,\n info: theme.palette.info as ColorPalette,\n danger: theme.palette.error as ColorPalette,\n };\n\n const fallback = theme.palette.primary as ColorPalette;\n const palette = colorMap[color] || fallback;\n\n // Ensure palette has required properties\n return {\n main: palette?.main || fallback.main,\n dark: shade(palette, 'dark', fallback),\n light: shade(palette, 'light', fallback),\n contrastText: palette?.contrastText || absoluteInk(theme).white,\n };\n};\n\n/** A size's padding and its type in design px, read through the type scale. */\ninterface WebButtonSize {\n paddingYPx: number;\n paddingXPx: number;\n fontPx: number;\n}\n\n// Derived from `Button.metrics.ts`, which the native `Button` reads too — one\n// table, so a size cannot differ between the renderers.\nconst SIZE_MAP: Record<string, WebButtonSize> = Object.fromEntries(\n Object.entries(BUTTON_SIZES).map(([size, m]) => [\n size,\n { paddingYPx: m.paddingVertical, paddingXPx: m.paddingHorizontal, fontPx: m.fontSize },\n ]),\n);\n\n/** What an unrecognised size falls back to, named so indexing can never be undefined. */\nconst DEFAULT_SIZE: WebButtonSize = SIZE_MAP.md as WebButtonSize;\n\nconst sizeOf = (size: string): WebButtonSize => SIZE_MAP[size] ?? DEFAULT_SIZE;\n\n/**\n * A BUTTON THAT IS ONLY AN ICON IS SQUARE.\n *\n * MUI puts a 64px `min-width` on every button, which is right for a label and\n * wrong for a glyph: three dots in a 64px slab reads as a button that failed to\n * load its text, and at the end of a dense row it claims space the row needs.\n * The horizontal padding goes too — a square of padding round a square glyph —\n * and so does the gap MUI reserves beside a start/end icon, since there is\n * nothing on the other side of it.\n *\n * Derived, not declared: a button with an `icon` and no children can only be an\n * icon button, so no consumer has to opt in and none can forget to.\n */\nconst iconOnlyPadding = (theme: Theme, size: string): string => {\n const bySize: Record<string, number> = ICON_ONLY_PADDING_PX;\n return rem(theme, bySize[size] ?? ICON_ONLY_PADDING_PX.md);\n};\n\nconst iconOnlySize = (theme: Theme, size: string): CSSObject => ({\n minWidth: 0,\n padding: iconOnlyPadding(theme, size),\n fontSize: rem(theme, sizeOf(size).fontPx),\n '& .MuiButton-startIcon, & .MuiButton-endIcon': { margin: 0 },\n});\n\n/**\n * The size styles for a button, square when it carries nothing but an icon.\n *\n * The HEIGHT is the theme's field height for the size (`tokens/field-height`),\n * so a button stands level with the field beside it: the vertical padding goes\n * and the label is centred in a box at least that tall — a label that wraps\n * still grows it. An icon-only button is that height on every side.\n */\nexport const buttonSize =\n (size: string, iconOnly: boolean) =>\n (theme: Theme): CSSObject => {\n const height = fieldHeight(theme, asFieldSize(size));\n if (iconOnly) return { ...iconOnlySize(theme, size), padding: 0, minWidth: height, minHeight: height };\n const { paddingYPx, paddingXPx, fontPx } = sizeOf(size);\n return { padding: rems(theme, paddingYPx, paddingXPx), fontSize: rem(theme, fontPx), minHeight: height, paddingTop: 0, paddingBottom: 0 };\n };\n\n/**\n * MUI centres icons with a negative margin that fights our own padding, so the\n * flex alignment is restated here rather than fought with `!important`.\n */\nexport const iconAlignmentStyles = (theme: Theme): CSSObject => ({\n '& .MuiButton-startIcon, & .MuiButton-endIcon': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: 0,\n verticalAlign: 'middle',\n '& > *': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 0,\n },\n },\n '& .MuiButton-startIcon': {\n marginRight: theme.spacing(0.5),\n },\n '& .MuiButton-endIcon': {\n marginLeft: theme.spacing(0.5),\n },\n});\n\n// Gradients run between two related hues; the named colours pick a specific pair,\n// anything else runs from its own main to its own dark.\nconst GRADIENT_PAIRS: Record<string, (theme: Theme) => [string, string]> = {\n primary: (theme) => [theme.palette.primary.main, theme.palette.secondary.main],\n secondary: (theme) => [theme.palette.secondary.main, theme.palette.primary.main],\n success: (theme) => [theme.palette.success.light, theme.palette.success.dark],\n warning: (theme) => [theme.palette.warning.light, theme.palette.warning.dark],\n danger: (theme) => [theme.palette.error.light, theme.palette.error.dark],\n};\n\nconst gradientStops = (theme: Theme, color: string, palette: ColorPalette): [string, string] =>\n GRADIENT_PAIRS[color]?.(theme) ?? [palette.main, palette.dark];\n\nconst gradientFor = (theme: Theme, color: string, palette: ColorPalette): string => {\n const [from, to] = gradientStops(theme, color, palette);\n return `linear-gradient(135deg, ${from} 0%, ${to} 100%)`;\n};\n\n/**\n * The label colour for `gradient`, which used to be `#fff` outright (FUT-1924).\n *\n * Every other filled variant reads `palette.contrastText`, derived from `main`\n * — so a white-labelled host handing the library a pale brand got dark ink on\n * its solid buttons and white ink on its gradient one. That store had exactly\n * one button in the library whose label it could not read, in LIGHT mode,\n * before dark mode existed anywhere.\n *\n * `contrastText` is still not the right thing to read, and that is why this\n * goes through {@link inkOver}: a gradient is TWO fills, the named pairs run\n * light-to-dark, and an ink chosen against `main` says nothing about the end\n * the gradient actually reaches. Both stops go in, and the ink has to survive\n * the worse of them.\n */\nconst gradientInk = (theme: Theme, color: string, palette: ColorPalette): string =>\n inkOver(gradientStops(theme, color, palette), palette.contrastText || absoluteInk(theme).white);\n\n/**\n * The label colour for the two variants that paint no background of their own.\n *\n * `ghost` and `text` used `palette.main` directly, which is the same mistake\n * the Alert made with its body text: a palette's `main` is chosen to sit UNDER\n * white — it is the fill of a solid button — and it is not chosen to be read AS\n * text. `#6366F1`, the default primary, is 3.6:1 on white and worse on any\n * tinted surface, so a \"Cancelar\" or an \"Agora não\" placed on a coloured panel\n * turned into a smudge. That is precisely where these two variants belong: they\n * exist to be the quiet option NEXT to a solid one, so they are the buttons\n * most likely to be sitting on something other than plain paper.\n *\n * One step darker (lighter, on a dark theme) keeps the hue the caller asked for\n * and buys the contrast back. `main` still drives the hover wash and every\n * bordered variant, so nothing that was already legible moves.\n */\nconst quietInk = (theme: Theme, palette: ColorPalette): string =>\n theme.palette.mode === 'dark' ? lighten(palette.main, 0.35) : darken(palette.main, 0.3);\n\nconst VARIANT_STYLES: Record<\n string,\n (theme: Theme, palette: ColorPalette, color: string) => CSSObject\n> = {\n solid: (theme, palette) => ({\n backgroundColor: palette.main,\n color: palette.contrastText || absoluteInk(theme).white,\n '&:hover': {\n backgroundColor: palette.dark,\n transform: `translateY(${rem(theme, -2)})`,\n boxShadow: theme.shadows[8],\n },\n }),\n // A NEUTRAL outline is a field-row control (\"Mais\", \"Exibir\"), so it rests on\n // the one field border; a coloured outline keeps its colour, which is the\n // point of asking for one.\n outline: (theme, palette, color) => ({\n backgroundColor: 'transparent',\n color: palette.main,\n border: color === 'neutral' ? fieldBorder(theme) : `1px solid ${palette.main}`,\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n borderColor: palette.dark,\n },\n }),\n ghost: (theme, palette) => ({\n backgroundColor: 'transparent',\n color: quietInk(theme, palette),\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n },\n }),\n text: (theme, palette) => ({\n backgroundColor: 'transparent',\n color: quietInk(theme, palette),\n border: `none`,\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n },\n '&.active': {\n backgroundColor: alpha(palette.main, 0.1),\n color: quietInk(theme, palette),\n },\n }),\n glass: (theme, palette) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n color: palette.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.background.paper, 0.2),\n transform: `translateY(${rem(theme, -2)})`,\n },\n }),\n gradient: (theme, palette, color) => ({\n background: gradientFor(theme, color, palette),\n color: gradientInk(theme, color, palette),\n '&:hover': {\n filter: 'brightness(1.1)',\n transform: `translateY(${rem(theme, -2)})`,\n boxShadow: theme.shadows[12],\n },\n }),\n};\n\nexport const buttonVariantStyles = (\n theme: Theme,\n variant: string | undefined,\n palette: ColorPalette,\n color: string,\n): CSSObject => VARIANT_STYLES[variant ?? '']?.(theme, palette, color) ?? {};\n\n// Glow effect - applied with !important to override variant shadows\nconst glowStyles = (theme: Theme, palette: ColorPalette): CSSObject => ({\n boxShadow: `${rems(theme, 0, 0, 20, 5)} ${alpha(palette.main, 0.6)}, ${rems(theme, 0, 0, 40, 10)} ${alpha(palette.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&:hover': {\n boxShadow: `${rems(theme, 0, 0, 25, 8)} ${alpha(palette.main, 0.7)}, ${rems(theme, 0, 0, 50, 15)} ${alpha(palette.main, 0.4)} !important`,\n filter: 'brightness(1.1)',\n transform: `translateY(${rem(theme, -2)}) scale(1.02)`,\n },\n});\n\n// Pulse animation using pseudo-element\nconst pulseStyles = (theme: Theme, palette: ColorPalette): CSSObject => ({\n position: 'relative',\n overflow: 'visible',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n transform: 'translate(-50%, -50%)',\n backgroundColor: palette.main,\n opacity: 0.3,\n animation: `${pulseAnimation(theme)} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\n/**\n * glow and pulse are independent flags. The three combinations used to be spelled\n * out one by one, but each is just the union of whichever flags are set.\n */\nexport const buttonEmphasisStyles = (\n theme: Theme,\n palette: ColorPalette,\n glow?: boolean,\n pulse?: boolean,\n): CSSObject => ({\n ...(glow ? glowStyles(theme, palette) : {}),\n ...(pulse ? pulseStyles(theme, palette) : {}),\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/components/form/Button/Button.styles.ts"],"sourcesContent":["import { alpha, darken, keyframes, lighten } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { BUTTON_SIZES, ICON_ONLY_PADDING as ICON_ONLY_PADDING_PX } from './Button.metrics';\nimport { asFieldSize, fieldBorder, fieldHeight } from '../../../tokens/field-height';\nimport { absoluteInk, controlNeutral } from '../../../tokens/ink';\nimport { rem, rems } from '../../../tokens/relative';\nimport { inkOver } from '../../../tokens/theme';\n\n// The pulse ring, its spread through the theme's type scale.\nconst pulseAnimation = (theme: Theme) => keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 ${rem(theme, 15)} currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\ninterface ColorPalette {\n main: string;\n dark: string;\n light: string;\n contrastText: string;\n}\n\nconst shade = (\n palette: ColorPalette | undefined,\n key: 'dark' | 'light',\n fallback: ColorPalette,\n): string => palette?.[key] || palette?.main || fallback[key];\n\n/** `neutral` has no MUI palette entry, so its four shades come from grey. */\nconst neutralPalette = (theme: Theme): ColorPalette => controlNeutral(theme);\n\nexport const getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') return neutralPalette(theme);\n\n const colorMap: Record<string, ColorPalette> = {\n primary: theme.palette.primary as ColorPalette,\n secondary: theme.palette.secondary as ColorPalette,\n success: theme.palette.success as ColorPalette,\n warning: theme.palette.warning as ColorPalette,\n info: theme.palette.info as ColorPalette,\n danger: theme.palette.error as ColorPalette,\n };\n\n const fallback = theme.palette.primary as ColorPalette;\n const palette = colorMap[color] || fallback;\n\n // Ensure palette has required properties\n return {\n main: palette?.main || fallback.main,\n dark: shade(palette, 'dark', fallback),\n light: shade(palette, 'light', fallback),\n contrastText: palette?.contrastText || absoluteInk(theme).white,\n };\n};\n\n/** A size's padding and its type in design px, read through the type scale. */\ninterface WebButtonSize {\n paddingYPx: number;\n paddingXPx: number;\n fontPx: number;\n}\n\n// Derived from `Button.metrics.ts`, which the native `Button` reads too — one\n// table, so a size cannot differ between the renderers.\nconst SIZE_MAP: Record<string, WebButtonSize> = Object.fromEntries(\n Object.entries(BUTTON_SIZES).map(([size, m]) => [\n size,\n { paddingYPx: m.paddingVertical, paddingXPx: m.paddingHorizontal, fontPx: m.fontSize },\n ]),\n);\n\n/** What an unrecognised size falls back to, named so indexing can never be undefined. */\nconst DEFAULT_SIZE: WebButtonSize = SIZE_MAP.md as WebButtonSize;\n\nconst sizeOf = (size: string): WebButtonSize => SIZE_MAP[size] ?? DEFAULT_SIZE;\n\n/**\n * A BUTTON THAT IS ONLY AN ICON IS SQUARE.\n *\n * MUI puts a 64px `min-width` on every button, which is right for a label and\n * wrong for a glyph: three dots in a 64px slab reads as a button that failed to\n * load its text, and at the end of a dense row it claims space the row needs.\n * The horizontal padding goes too — a square of padding round a square glyph —\n * and so does the gap MUI reserves beside a start/end icon, since there is\n * nothing on the other side of it.\n *\n * Derived, not declared: a button with an `icon` and no children can only be an\n * icon button, so no consumer has to opt in and none can forget to.\n */\nconst iconOnlyPadding = (theme: Theme, size: string): string => {\n const bySize: Record<string, number> = ICON_ONLY_PADDING_PX;\n return rem(theme, bySize[size] ?? ICON_ONLY_PADDING_PX.md);\n};\n\nconst iconOnlySize = (theme: Theme, size: string): CSSObject => ({\n minWidth: 0,\n padding: iconOnlyPadding(theme, size),\n fontSize: rem(theme, sizeOf(size).fontPx),\n '& .MuiButton-startIcon, & .MuiButton-endIcon': { margin: 0 },\n});\n\n/**\n * The size styles for a button, square when it carries nothing but an icon.\n *\n * The HEIGHT is the theme's field height for the size (`tokens/field-height`),\n * so a button stands level with the field beside it: the vertical padding goes\n * and the label is centred in a box at least that tall — a label that wraps\n * still grows it. An icon-only button is that height on every side.\n */\nexport const buttonSize =\n (size: string, iconOnly: boolean) =>\n (theme: Theme): CSSObject => {\n const height = fieldHeight(theme, asFieldSize(size));\n if (iconOnly) return { ...iconOnlySize(theme, size), padding: 0, minWidth: height, minHeight: height };\n const { paddingYPx, paddingXPx, fontPx } = sizeOf(size);\n return { padding: rems(theme, paddingYPx, paddingXPx), fontSize: rem(theme, fontPx), minHeight: height, paddingTop: 0, paddingBottom: 0 };\n };\n\n/**\n * MUI centres icons with a negative margin that fights our own padding, so the\n * flex alignment is restated here rather than fought with `!important`.\n */\nexport const iconAlignmentStyles = (theme: Theme): CSSObject => ({\n '& .MuiButton-startIcon, & .MuiButton-endIcon': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: 0,\n verticalAlign: 'middle',\n '& > *': {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 0,\n },\n },\n '& .MuiButton-startIcon': {\n marginRight: theme.spacing(0.5),\n },\n '& .MuiButton-endIcon': {\n marginLeft: theme.spacing(0.5),\n },\n});\n\n// Gradients run between two related hues; the named colours pick a specific pair,\n// anything else runs from its own main to its own dark.\nconst GRADIENT_PAIRS: Record<string, (theme: Theme) => [string, string]> = {\n primary: (theme) => [theme.palette.primary.main, theme.palette.secondary.main],\n secondary: (theme) => [theme.palette.secondary.main, theme.palette.primary.main],\n success: (theme) => [theme.palette.success.light, theme.palette.success.dark],\n warning: (theme) => [theme.palette.warning.light, theme.palette.warning.dark],\n danger: (theme) => [theme.palette.error.light, theme.palette.error.dark],\n};\n\nconst gradientStops = (theme: Theme, color: string, palette: ColorPalette): [string, string] =>\n GRADIENT_PAIRS[color]?.(theme) ?? [palette.main, palette.dark];\n\nconst gradientFor = (theme: Theme, color: string, palette: ColorPalette): string => {\n const [from, to] = gradientStops(theme, color, palette);\n return `linear-gradient(135deg, ${from} 0%, ${to} 100%)`;\n};\n\n/**\n * The label colour for `gradient`, which used to be `#fff` outright (FUT-1924).\n *\n * Every other filled variant reads `palette.contrastText`, derived from `main`\n * — so a white-labelled host handing the library a pale brand got dark ink on\n * its solid buttons and white ink on its gradient one. That store had exactly\n * one button in the library whose label it could not read, in LIGHT mode,\n * before dark mode existed anywhere.\n *\n * `contrastText` is still not the right thing to read, and that is why this\n * goes through {@link inkOver}: a gradient is TWO fills, the named pairs run\n * light-to-dark, and an ink chosen against `main` says nothing about the end\n * the gradient actually reaches. Both stops go in, and the ink has to survive\n * the worse of them.\n */\nconst gradientInk = (theme: Theme, color: string, palette: ColorPalette): string =>\n inkOver(gradientStops(theme, color, palette), palette.contrastText || absoluteInk(theme).white);\n\n/**\n * The label colour for the two variants that paint no background of their own.\n *\n * `ghost` and `text` used `palette.main` directly, which is the same mistake\n * the Alert made with its body text: a palette's `main` is chosen to sit UNDER\n * white — it is the fill of a solid button — and it is not chosen to be read AS\n * text. `#6366F1`, the default primary, is 3.6:1 on white and worse on any\n * tinted surface, so a \"Cancelar\" or an \"Agora não\" placed on a coloured panel\n * turned into a smudge. That is precisely where these two variants belong: they\n * exist to be the quiet option NEXT to a solid one, so they are the buttons\n * most likely to be sitting on something other than plain paper.\n *\n * One step darker (lighter, on a dark theme) keeps the hue the caller asked for\n * and buys the contrast back. `main` still drives the hover wash and every\n * bordered variant, so nothing that was already legible moves.\n */\nconst quietInk = (theme: Theme, palette: ColorPalette): string =>\n theme.palette.mode === 'dark' ? lighten(palette.main, 0.35) : darken(palette.main, 0.3);\n\nconst VARIANT_STYLES: Record<\n string,\n (theme: Theme, palette: ColorPalette, color: string) => CSSObject\n> = {\n solid: (theme, palette) => ({\n backgroundColor: palette.main,\n color: palette.contrastText || absoluteInk(theme).white,\n '&:hover': {\n backgroundColor: palette.dark,\n transform: `translateY(${rem(theme, -2)})`,\n boxShadow: theme.shadows[8],\n },\n }),\n // A NEUTRAL outline is a field-row control (\"Mais\", \"Exibir\", \"Cancelar\"), so\n // it rests on the one field border and writes in the theme's own text ink —\n // a ROLE, which turns with the mode. It used to write in grey 700, a step on\n // a ramp MUI keeps the same in dark: dark on dark, 2.18:1 on a dark bar, so a\n // live \"Descartar\" read as disabled. A coloured outline keeps its colour,\n // which is the point of asking for one.\n // Its hover draws from the same role, so it does not dim to grey 800 on a dark ground.\n outline: (theme, palette, color) => {\n const ink = color === 'neutral' ? theme.palette.text.primary : palette.main;\n return {\n backgroundColor: 'transparent',\n color: ink,\n border: color === 'neutral' ? fieldBorder(theme) : `1px solid ${palette.main}`,\n '&:hover': {\n backgroundColor: alpha(ink, 0.1),\n borderColor: color === 'neutral' ? theme.palette.text.secondary : palette.dark,\n },\n };\n },\n ghost: (theme, palette) => ({\n backgroundColor: 'transparent',\n color: quietInk(theme, palette),\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n },\n }),\n text: (theme, palette) => ({\n backgroundColor: 'transparent',\n color: quietInk(theme, palette),\n border: `none`,\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n },\n '&.active': {\n backgroundColor: alpha(palette.main, 0.1),\n color: quietInk(theme, palette),\n },\n }),\n glass: (theme, palette) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n color: palette.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.background.paper, 0.2),\n transform: `translateY(${rem(theme, -2)})`,\n },\n }),\n gradient: (theme, palette, color) => ({\n background: gradientFor(theme, color, palette),\n color: gradientInk(theme, color, palette),\n '&:hover': {\n filter: 'brightness(1.1)',\n transform: `translateY(${rem(theme, -2)})`,\n boxShadow: theme.shadows[12],\n },\n }),\n};\n\nexport const buttonVariantStyles = (\n theme: Theme,\n variant: string | undefined,\n palette: ColorPalette,\n color: string,\n): CSSObject => VARIANT_STYLES[variant ?? '']?.(theme, palette, color) ?? {};\n\n// Glow effect - applied with !important to override variant shadows\nconst glowStyles = (theme: Theme, palette: ColorPalette): CSSObject => ({\n boxShadow: `${rems(theme, 0, 0, 20, 5)} ${alpha(palette.main, 0.6)}, ${rems(theme, 0, 0, 40, 10)} ${alpha(palette.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&:hover': {\n boxShadow: `${rems(theme, 0, 0, 25, 8)} ${alpha(palette.main, 0.7)}, ${rems(theme, 0, 0, 50, 15)} ${alpha(palette.main, 0.4)} !important`,\n filter: 'brightness(1.1)',\n transform: `translateY(${rem(theme, -2)}) scale(1.02)`,\n },\n});\n\n// Pulse animation using pseudo-element\nconst pulseStyles = (theme: Theme, palette: ColorPalette): CSSObject => ({\n position: 'relative',\n overflow: 'visible',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n transform: 'translate(-50%, -50%)',\n backgroundColor: palette.main,\n opacity: 0.3,\n animation: `${pulseAnimation(theme)} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\n/**\n * glow and pulse are independent flags. The three combinations used to be spelled\n * out one by one, but each is just the union of whichever flags are set.\n */\nexport const buttonEmphasisStyles = (\n theme: Theme,\n palette: ColorPalette,\n glow?: boolean,\n pulse?: boolean,\n): CSSObject => ({\n ...(glow ? glowStyles(theme, palette) : {}),\n ...(pulse ? pulseStyles(theme, palette) : {}),\n});\n"],"mappings":"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","names":[]}
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-WEBEOBN5.js";
26
26
  import {
27
27
  Button
28
- } from "./chunk-JE6FNSQV.js";
28
+ } from "./chunk-W4O3BTD5.js";
29
29
  import {
30
30
  Text
31
31
  } from "./chunk-AJBRO76D.js";
@@ -268,4 +268,4 @@ function SaveViewModal({
268
268
  export {
269
269
  SaveViewModal
270
270
  };
271
- //# sourceMappingURL=chunk-6J27G2HT.js.map
271
+ //# sourceMappingURL=chunk-KYFRZX5C.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-6DPAWXZ3.js";
10
10
  import {
11
11
  Button
12
- } from "./chunk-JE6FNSQV.js";
12
+ } from "./chunk-W4O3BTD5.js";
13
13
  import {
14
14
  rem,
15
15
  sxRem
@@ -166,4 +166,4 @@ export {
166
166
  togglePillValues,
167
167
  cardGridTracks
168
168
  };
169
- //# sourceMappingURL=chunk-NQZNV3VR.js.map
169
+ //# sourceMappingURL=chunk-LCVBED7G.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KHG57NAE.js";
4
4
  import {
5
5
  createConfirmButton
6
- } from "./chunk-L4HUZCKV.js";
6
+ } from "./chunk-XOCWAQOA.js";
7
7
  import {
8
8
  Dialog,
9
9
  DialogContent
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-WEBEOBN5.js";
17
17
  import {
18
18
  Button
19
- } from "./chunk-JE6FNSQV.js";
19
+ } from "./chunk-W4O3BTD5.js";
20
20
  import {
21
21
  Text
22
22
  } from "./chunk-AJBRO76D.js";
@@ -128,4 +128,4 @@ function ManageViewsDialog({
128
128
  export {
129
129
  ManageViewsDialog
130
130
  };
131
- //# sourceMappingURL=chunk-GRRW5NSR.js.map
131
+ //# sourceMappingURL=chunk-NHAB477Y.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  SaveViewModal
3
- } from "./chunk-6J27G2HT.js";
3
+ } from "./chunk-KYFRZX5C.js";
4
4
  import {
5
5
  ManageViewsDialog
6
- } from "./chunk-GRRW5NSR.js";
6
+ } from "./chunk-NHAB477Y.js";
7
7
  import {
8
8
  useDataViewsCopy
9
9
  } from "./chunk-KHG57NAE.js";
@@ -121,4 +121,4 @@ export {
121
121
  ViewsMenuSlot,
122
122
  ViewDialogs
123
123
  };
124
- //# sourceMappingURL=chunk-X7HCS3HP.js.map
124
+ //# sourceMappingURL=chunk-PSYX2KEQ.js.map
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-J2QIICWP.js";
14
14
  import {
15
15
  Button
16
- } from "./chunk-JE6FNSQV.js";
16
+ } from "./chunk-W4O3BTD5.js";
17
17
  import {
18
18
  Text
19
19
  } from "./chunk-AJBRO76D.js";
@@ -217,4 +217,4 @@ export {
217
217
  SocialLoginButton,
218
218
  SocialLoginContainer
219
219
  };
220
- //# sourceMappingURL=chunk-3UQMIFPA.js.map
220
+ //# sourceMappingURL=chunk-QNXCCBRW.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  DeleteViewDialog
3
- } from "./chunk-H7R6UKOE.js";
3
+ } from "./chunk-YWIVVKCJ.js";
4
4
  import {
5
5
  DataViewsGrid
6
- } from "./chunk-USZMUOI6.js";
6
+ } from "./chunk-F5LDJ52M.js";
7
7
  import {
8
8
  viewStateKey
9
9
  } from "./chunk-ZOLAYP2D.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  ViewDialogs,
16
16
  ViewMutationErrorAlert
17
- } from "./chunk-X7HCS3HP.js";
17
+ } from "./chunk-PSYX2KEQ.js";
18
18
  import {
19
19
  useSavedViewsController
20
20
  } from "./chunk-HR7YTBR7.js";
@@ -166,4 +166,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
166
166
  export {
167
167
  DataViewsTableBase
168
168
  };
169
- //# sourceMappingURL=chunk-ZUQX7XHJ.js.map
169
+ //# sourceMappingURL=chunk-RG3GJTSK.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  usePanelChrome
3
- } from "./chunk-G3QKH23Y.js";
3
+ } from "./chunk-TSMF7K37.js";
4
4
  import {
5
5
  ModalPanelContents,
6
6
  modalAriaIds,
7
7
  resolveModalContent
8
- } from "./chunk-2KGYTJCN.js";
8
+ } from "./chunk-GLKUN3DL.js";
9
9
  import {
10
10
  STYLE_ONLY_PROPS,
11
11
  dialogRootStyles
12
- } from "./chunk-NEHCU3EZ.js";
12
+ } from "./chunk-XSIVM4VO.js";
13
13
 
14
14
  // src/components/feedback/StackedModal/StackedModal.tsx
15
15
  import Dialog from "@mui/material/Dialog/index.js";
16
16
  import Slide from "@mui/material/Slide/index.js";
17
17
  import { styled } from "@mui/material/styles/index.js";
18
- import { forwardRef, useId } from "react";
18
+ import { forwardRef, useEffect, useId } from "react";
19
19
  import { jsx } from "react/jsx-runtime";
20
20
  var StyledDialog = styled(Dialog, {
21
21
  shouldForwardProp: (prop) => !STYLE_ONLY_PROPS.includes(prop)
@@ -49,6 +49,16 @@ var withDefaults = (props) => {
49
49
  }
50
50
  return resolved;
51
51
  };
52
+ var useUnnamedDialogWarning = (unnamed) => {
53
+ useEffect(() => {
54
+ const development = typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
55
+ if (unnamed && development) {
56
+ console.warn(
57
+ "StackedModal: `hideHeader` without `aria-labelledby` leaves the dialog unnamed. Point `aria-labelledby` at your content header's title."
58
+ );
59
+ }
60
+ }, [unnamed]);
61
+ };
52
62
  var StackedModalPanel = (props) => {
53
63
  const {
54
64
  open,
@@ -57,6 +67,7 @@ var StackedModalPanel = (props) => {
57
67
  navigationTitle,
58
68
  backLabel,
59
69
  hideClose,
70
+ hideHeader,
60
71
  children,
61
72
  actions,
62
73
  modalId,
@@ -84,6 +95,7 @@ var StackedModalPanel = (props) => {
84
95
  zIndex,
85
96
  isMobile,
86
97
  canGoBack,
98
+ isRoot,
87
99
  handleBack,
88
100
  handleClose
89
101
  } = usePanelChrome({
@@ -102,6 +114,7 @@ var StackedModalPanel = (props) => {
102
114
  isMobile
103
115
  );
104
116
  const { titleId, descId } = modalAriaIds(modalId, ariaLabelledBy, ariaDescribedBy);
117
+ useUnnamedDialogWarning(Boolean(hideHeader) && !ariaLabelledBy);
105
118
  return /* @__PURE__ */ jsx(
106
119
  StyledDialog,
107
120
  {
@@ -135,6 +148,7 @@ var StackedModalPanel = (props) => {
135
148
  descId,
136
149
  navigationTitle,
137
150
  hideClose,
151
+ hideHeader: Boolean(hideHeader) && isRoot,
138
152
  canGoBack,
139
153
  onBack: handleBack,
140
154
  onClose,
@@ -158,4 +172,4 @@ var StackedModal = (props) => {
158
172
  export {
159
173
  StackedModal
160
174
  };
161
- //# sourceMappingURL=chunk-OGBLNORM.js.map
175
+ //# sourceMappingURL=chunk-RQ2NKSIA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/feedback/StackedModal/StackedModal.tsx"],"sourcesContent":["import Dialog from '@mui/material/Dialog/index.js';\nimport Slide from '@mui/material/Slide/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport type { TransitionProps } from '@mui/material/transitions/index.js';\nimport type { FC } from 'react';\nimport React, { forwardRef, useEffect, useId } from 'react';\nimport { usePanelChrome } from './StackedModal.hooks';\nimport { modalAriaIds, ModalPanelContents, resolveModalContent } from './StackedModal.parts';\nimport type { PanelStyleProps } from './StackedModal.styles';\nimport { dialogRootStyles, STYLE_ONLY_PROPS } from './StackedModal.styles';\nimport type { StackedModalProps } from './StackedModal.types';\n\nconst StyledDialog = styled(Dialog, {\n shouldForwardProp: (prop) => !STYLE_ONLY_PROPS.includes(prop as string),\n})<PanelStyleProps>(({ theme, ...props }) => dialogRootStyles(theme, props));\n\n/** Panels slide in from the right on every device. */\nconst SlideTransition = forwardRef<HTMLDivElement, TransitionProps>(\n function SlideTransition(props, ref) {\n return (\n <Slide direction=\"left\" ref={ref} {...props}>\n {props.children as React.ReactElement}\n </Slide>\n );\n },\n);\n\nconst DEFAULTS: Partial<StackedModalProps> = {\n open: false,\n glass: false,\n navigationTitle: '',\n closeOnClickOutside: true,\n closeOnEsc: true,\n loading: false,\n loadingText: 'Loading...',\n maxWidth: false,\n disableBackdrop: false,\n disableFocusTrap: false,\n keepMounted: false,\n rtl: false,\n};\n\n/**\n * Fills in the defaults for props the caller left `undefined`. A table plus one\n * loop, rather than a default per destructured prop — each of those is a branch,\n * and fifteen of them put the component over the complexity bar on their own.\n */\nconst withDefaults = (props: StackedModalProps): StackedModalProps => {\n const resolved = { ...props };\n for (const [key, value] of Object.entries(DEFAULTS)) {\n const prop = key as keyof StackedModalProps;\n if (resolved[prop] === undefined) {\n Object.assign(resolved, { [prop]: value });\n }\n }\n return resolved;\n};\n\n/** The modal's props once defaults are applied and its stack identity is settled. */\ntype ResolvedProps = StackedModalProps & { modalId: string };\n\n/**\n * `hideHeader` removes the bar that names the dialog; without an\n * `aria-labelledby` of the caller's own, the dialog has no accessible name.\n */\nconst useUnnamedDialogWarning = (unnamed: boolean): void => {\n useEffect(() => {\n const development = typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n if (unnamed && development) {\n // eslint-disable-next-line no-console -- a config warning has no other channel.\n console.warn(\n 'StackedModal: `hideHeader` without `aria-labelledby` leaves the dialog unnamed. ' +\n \"Point `aria-labelledby` at your content header's title.\",\n );\n }\n }, [unnamed]);\n};\n\nconst StackedModalPanel: FC<ResolvedProps> = (props) => {\n const {\n open, onClose, glass, navigationTitle, backLabel, hideClose, hideHeader, children, actions, modalId,\n closeOnClickOutside, closeOnEsc, loading, loadingText, fullScreen, maxWidth, size, disableBackdrop,\n disableFocusTrap, keepMounted, rtl, dataTestId,\n 'aria-labelledby': ariaLabelledBy, 'aria-describedby': ariaDescribedBy, ...otherProps\n } = props;\n\n const {\n dialogRef, modalRole, isAnimating, showSkeleton, zIndex, isMobile, canGoBack, isRoot,\n handleBack, handleClose,\n } = usePanelChrome({\n open, modalId, loading, closeOnEsc, closeOnClickOutside, disableFocusTrap, onClose,\n });\n\n // Don't render if in background (performance optimization)\n if (modalRole === 'background' && !keepMounted) return null;\n\n const { content, modalActions, headerActions, hasMobileActions } = resolveModalContent(\n children,\n actions,\n isMobile,\n );\n const { titleId, descId } = modalAriaIds(modalId, ariaLabelledBy, ariaDescribedBy);\n useUnnamedDialogWarning(Boolean(hideHeader) && !ariaLabelledBy);\n\n return (\n <StyledDialog\n ref={dialogRef}\n open={Boolean(open)}\n onClose={handleClose}\n fullScreen={fullScreen ?? isMobile}\n modalRole={modalRole}\n isAnimating={isAnimating}\n glass={glass}\n rtl={rtl}\n customMaxWidth={maxWidth}\n panelSize={size}\n TransitionComponent={SlideTransition}\n maxWidth={maxWidth}\n disableEscapeKeyDown={!closeOnEsc}\n hideBackdrop={disableBackdrop}\n keepMounted={keepMounted}\n aria-labelledby={titleId}\n aria-describedby={descId}\n data-testid={dataTestId}\n sx={{ zIndex }}\n {...otherProps}\n >\n <ModalPanelContents\n backLabel={backLabel}\n showSkeleton={showSkeleton}\n loadingText={loadingText}\n titleId={titleId}\n descId={descId}\n navigationTitle={navigationTitle}\n hideClose={hideClose}\n hideHeader={Boolean(hideHeader) && isRoot}\n canGoBack={canGoBack}\n onBack={handleBack}\n onClose={onClose}\n headerActions={headerActions}\n content={content}\n modalActions={modalActions}\n hasMobileActions={hasMobileActions}\n rtl={rtl}\n dataTestId={dataTestId}\n />\n </StyledDialog>\n );\n};\n\nexport const StackedModal: FC<StackedModalProps> = (props) => {\n // A modal with no caller-supplied id still needs a STABLE one — it keys this\n // panel's entry in the stack, so a value that changed per render (as a\n // `Math.random()` default does) would re-register it on every pass.\n const fallbackId = useId();\n const resolved = withDefaults(props);\n return <StackedModalPanel {...resolved} modalId={resolved.modalId ?? fallbackId} />;\n};\n\n// Re-exported so `./StackedModal` stays the single public entry point for the\n// component and its stack primitives, as the barrel and existing imports expect.\nexport {\n ModalStackProvider,\n ModalStackProvider as StackedModalProvider,\n useModalStack,\n useModalStack as useStackedModal,\n} from './modal-stack';\nexport { StackedModalActions, StackedModalContent } from './StackedModal.parts';\n"],"mappings":"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","names":["SlideTransition"]}
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-6DPAWXZ3.js";
7
7
  import {
8
8
  Button
9
- } from "./chunk-JE6FNSQV.js";
9
+ } from "./chunk-W4O3BTD5.js";
10
10
  import {
11
11
  Text
12
12
  } from "./chunk-AJBRO76D.js";
@@ -167,4 +167,4 @@ function DataViewsExportMenu({
167
167
  export {
168
168
  DataViewsExportMenu
169
169
  };
170
- //# sourceMappingURL=chunk-JA6GKU65.js.map
170
+ //# sourceMappingURL=chunk-SAVNRXHT.js.map
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-TP3XKS72.js";
12
12
  import {
13
13
  Button
14
- } from "./chunk-JE6FNSQV.js";
14
+ } from "./chunk-W4O3BTD5.js";
15
15
 
16
16
  // src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.tsx
17
17
  import Box from "@mui/material/Box/index.js";
@@ -106,4 +106,4 @@ NotificationStatusNotice.displayName = "NotificationStatusNotice";
106
106
  export {
107
107
  NotificationStatusNotice
108
108
  };
109
- //# sourceMappingURL=chunk-WQBHJXXW.js.map
109
+ //# sourceMappingURL=chunk-TSHX4Q6M.js.map
@@ -72,7 +72,7 @@ var useStackRegistration = (open, modalId) => {
72
72
  var usePanelChrome = (options) => {
73
73
  const { open, modalId, loading, closeOnEsc, closeOnClickOutside, disableFocusTrap, onClose } = options;
74
74
  const dialogRef = useRef(null);
75
- const { currentDepth } = useModalStack();
75
+ const { currentDepth, stack } = useModalStack();
76
76
  const { modalRole, isAnimating } = useModalRole(Boolean(open), modalId);
77
77
  const showSkeleton = useSkeleton(Boolean(loading));
78
78
  const zIndex = usePanelZIndex(modalId, FALLBACK_Z_INDEX);
@@ -80,6 +80,7 @@ var usePanelChrome = (options) => {
80
80
  const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
81
81
  const isPrimary = modalRole === "primary";
82
82
  const canGoBack = currentDepth > 1;
83
+ const isRoot = (stack[0]?.id ?? modalId) === modalId;
83
84
  useFocusTrap(dialogRef, Boolean(open) && isPrimary, disableFocusTrap);
84
85
  useEscapeToClose(Boolean(open && closeOnEsc) && isPrimary, onClose);
85
86
  const { handleBack, handleClose } = useCloseHandlers({
@@ -97,6 +98,7 @@ var usePanelChrome = (options) => {
97
98
  zIndex,
98
99
  isMobile,
99
100
  canGoBack,
101
+ isRoot,
100
102
  handleBack,
101
103
  handleClose
102
104
  };
@@ -142,4 +144,4 @@ var useModalRole = (open, modalId) => {
142
144
  export {
143
145
  usePanelChrome
144
146
  };
145
- //# sourceMappingURL=chunk-G3QKH23Y.js.map
147
+ //# sourceMappingURL=chunk-TSMF7K37.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/feedback/StackedModal/StackedModal.hooks.ts"],"sourcesContent":["import { useTheme } from '@mui/material/styles/index.js';\nimport useMediaQuery from '@mui/material/useMediaQuery/index.js';\nimport type { RefObject } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useModalStack } from './modal-stack';\nimport type { ModalPanelRole } from './StackedModal.types';\n\nconst FOCUSABLE = 'a[href], button, textarea, input, select, [tabindex]:not([tabindex=\"-1\"])';\n/** MUI Dialog's own default, used when the modal isn't registered in the stack yet. */\nconst FALLBACK_Z_INDEX = 1300;\n/** Matches the panel's slide duration, so role swaps animate rather than jump. */\nconst ROLE_TRANSITION_MS = 300;\n\n/** Keeps Tab cycling inside the open panel instead of escaping to the page behind. */\nconst useFocusTrap = (\n ref: RefObject<HTMLElement | null>,\n isActive: boolean,\n disabled?: boolean,\n): void => {\n useEffect(() => {\n if (!isActive || disabled || !ref.current) return;\n\n const element = ref.current;\n const focusable = element.querySelectorAll(FOCUSABLE);\n const first = focusable[0] as HTMLElement | undefined;\n const last = focusable[focusable.length - 1] as HTMLElement | undefined;\n\n window.setTimeout(() => first?.focus(), 100);\n\n const handleTabKey = (e: globalThis.KeyboardEvent): void => {\n if (e.key !== 'Tab') return;\n const atEdge = e.shiftKey ? first : last;\n if (document.activeElement !== atEdge) return;\n e.preventDefault();\n (e.shiftKey ? last : first)?.focus();\n };\n\n element.addEventListener('keydown', handleTabKey);\n return () => element.removeEventListener('keydown', handleTabKey);\n }, [ref, isActive, disabled]);\n};\n\n/** Closes the panel on Escape — only while it is the top one. */\nconst useEscapeToClose = (active: boolean, onClose: () => void): void => {\n useEffect(() => {\n if (!active) return;\n\n const handleEsc = (e: globalThis.KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n onClose();\n };\n\n window.addEventListener('keydown', handleEsc);\n return () => window.removeEventListener('keydown', handleEsc);\n }, [active, onClose]);\n};\n\n/** Holds the skeleton a beat past `loading` so the swap to content isn't a flash. */\nconst useSkeleton = (loading: boolean): boolean => {\n const [showSkeleton, setShowSkeleton] = useState(loading);\n\n useEffect(() => {\n if (loading) {\n setShowSkeleton(true);\n return;\n }\n const timer = window.setTimeout(() => setShowSkeleton(false), 200);\n return () => window.clearTimeout(timer);\n }, [loading]);\n\n return showSkeleton;\n};\n\n/** Registers the modal in the stack while open, and unregisters it after it slides out. */\nconst useStackRegistration = (open: boolean, modalId: string): void => {\n const { pushModal, popModal, isModalInStack } = useModalStack();\n const hasRegisteredRef = useRef(false);\n\n useEffect(() => {\n if (open && !hasRegisteredRef.current) {\n pushModal(modalId);\n hasRegisteredRef.current = true;\n } else if (!open) {\n hasRegisteredRef.current = false;\n }\n }, [open, modalId, pushModal]);\n\n useEffect(() => {\n if (open || !isModalInStack(modalId)) return;\n const timer = window.setTimeout(() => popModal(modalId), ROLE_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [open, modalId, popModal, isModalInStack]);\n};\n\ninterface PanelChromeOptions {\n open?: boolean;\n modalId: string;\n loading?: boolean;\n closeOnEsc?: boolean;\n closeOnClickOutside?: boolean;\n disableFocusTrap?: boolean;\n onClose: () => void;\n}\n\ninterface PanelChrome {\n dialogRef: RefObject<HTMLDivElement | null>;\n modalRole: ModalPanelRole;\n isAnimating: boolean;\n showSkeleton: boolean;\n zIndex: number;\n isMobile: boolean;\n canGoBack: boolean;\n /**\n * This panel is the bottom of the stack. Read from ITS position, not from the\n * depth: once a child opens, the depth says \"can go back\" for every panel,\n * the receding root included.\n */\n isRoot: boolean;\n handleBack: () => void;\n handleClose: (event: object, reason: 'backdropClick' | 'escapeKeyDown') => void;\n}\n\n/**\n * Everything the panel needs to render itself: its place in the stack, the\n * viewport it is on, and the handlers that dismiss it. Bundled into one hook so\n * the component stays a description of the markup.\n */\nexport const usePanelChrome = (options: PanelChromeOptions): PanelChrome => {\n const { open, modalId, loading, closeOnEsc, closeOnClickOutside, disableFocusTrap, onClose } =\n options;\n\n const dialogRef = useRef<HTMLDivElement>(null);\n const { currentDepth, stack } = useModalStack();\n const { modalRole, isAnimating } = useModalRole(Boolean(open), modalId);\n const showSkeleton = useSkeleton(Boolean(loading));\n const zIndex = usePanelZIndex(modalId, FALLBACK_Z_INDEX);\n\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const isPrimary = modalRole === 'primary';\n const canGoBack = currentDepth > 1;\n // Not yet pushed (its first render) and something already below it: NOT the\n // root — so a child never renders a frame without its back arrow.\n const isRoot = (stack[0]?.id ?? modalId) === modalId;\n\n useFocusTrap(dialogRef, Boolean(open) && isPrimary, disableFocusTrap);\n useEscapeToClose(Boolean(open && closeOnEsc) && isPrimary, onClose);\n\n const { handleBack, handleClose } = useCloseHandlers({\n isPrimary,\n closeOnClickOutside,\n closeOnEsc,\n canGoBack,\n onClose,\n });\n\n return {\n dialogRef,\n modalRole,\n isAnimating,\n showSkeleton,\n zIndex,\n isMobile,\n canGoBack,\n isRoot,\n handleBack,\n handleClose,\n };\n};\n\ninterface CloseHandlerOptions {\n /** Only the top panel responds to a backdrop click or Escape. */\n isPrimary: boolean;\n closeOnClickOutside?: boolean;\n closeOnEsc?: boolean;\n /** Deeper than one panel, so the leading control goes back rather than closing. */\n canGoBack: boolean;\n onClose: () => void;\n}\n\n/** The panel's dismissal handlers, honouring which gestures the caller allows. */\nconst useCloseHandlers = ({\n isPrimary,\n closeOnClickOutside,\n closeOnEsc,\n canGoBack,\n onClose,\n}: CloseHandlerOptions): {\n handleBack: () => void;\n handleClose: (event: object, reason: 'backdropClick' | 'escapeKeyDown') => void;\n} => ({\n handleBack: () => {\n if (canGoBack) onClose();\n },\n handleClose: (_event, reason) => {\n if (!isPrimary) return;\n if (reason === 'backdropClick' && !closeOnClickOutside) return;\n if (reason === 'escapeKeyDown' && !closeOnEsc) return;\n onClose();\n },\n});\n\n/** The z-index this panel was assigned when it joined the stack. */\nconst usePanelZIndex = (modalId: string, fallback: number): number => {\n const { stack } = useModalStack();\n return stack.find((m) => m.id === modalId)?.zIndex ?? fallback;\n};\n\n/**\n * This modal's role in the stack, plus whether it is mid-transition between two\n * roles (which drives the expand/contract animation).\n */\nconst useModalRole = (\n open: boolean,\n modalId: string,\n): { modalRole: ModalPanelRole; isAnimating: boolean } => {\n const { stack } = useModalStack();\n const [modalRole, setModalRole] = useState<ModalPanelRole>('primary');\n const [isAnimating, setIsAnimating] = useState(false);\n\n useStackRegistration(open, modalId);\n\n useEffect(() => {\n if (!open) return;\n\n const newRole = stack.find((m) => m.id === modalId)?.role;\n if (!newRole || newRole === modalRole) return;\n\n setIsAnimating(true);\n setModalRole(newRole);\n const timer = window.setTimeout(() => setIsAnimating(false), ROLE_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [stack, modalId, open, modalRole]);\n\n return { modalRole, isAnimating };\n};\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-2X2G75MV.js";
4
4
  import {
5
5
  Button
6
- } from "./chunk-JE6FNSQV.js";
6
+ } from "./chunk-W4O3BTD5.js";
7
7
 
8
8
  // src/components/data-display/CardKit/CardKebab.tsx
9
9
  import { jsx } from "react/jsx-runtime";
@@ -25,4 +25,4 @@ function CardKebab({
25
25
  export {
26
26
  CardKebab
27
27
  };
28
- //# sourceMappingURL=chunk-XGIJGIN3.js.map
28
+ //# sourceMappingURL=chunk-U5NRT6JR.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-6DPAWXZ3.js";
11
11
  import {
12
12
  Button
13
- } from "./chunk-JE6FNSQV.js";
13
+ } from "./chunk-W4O3BTD5.js";
14
14
  import {
15
15
  Text
16
16
  } from "./chunk-AJBRO76D.js";
@@ -184,4 +184,4 @@ function MoreFilters({
184
184
  export {
185
185
  MoreFilters
186
186
  };
187
- //# sourceMappingURL=chunk-QJWIX4YZ.js.map
187
+ //# sourceMappingURL=chunk-VE7QYG3W.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-J2QIICWP.js";
7
7
  import {
8
8
  Button
9
- } from "./chunk-JE6FNSQV.js";
9
+ } from "./chunk-W4O3BTD5.js";
10
10
  import {
11
11
  Text
12
12
  } from "./chunk-AJBRO76D.js";
@@ -74,4 +74,4 @@ export {
74
74
  UserAvatar,
75
75
  UserMenu
76
76
  };
77
- //# sourceMappingURL=chunk-4JZ6XDVA.js.map
77
+ //# sourceMappingURL=chunk-VLRHESS2.js.map
@@ -4,7 +4,7 @@ import {
4
4
  buttonVariantStyles,
5
5
  getColorFromTheme,
6
6
  iconAlignmentStyles
7
- } from "./chunk-T2UP4XJF.js";
7
+ } from "./chunk-JTIKY2D3.js";
8
8
  import {
9
9
  BUTTON_ICON_GLYPH_SIZE
10
10
  } from "./chunk-G2FUZALJ.js";
@@ -128,4 +128,4 @@ var Button = ButtonRoot;
128
128
  export {
129
129
  Button
130
130
  };
131
- //# sourceMappingURL=chunk-JE6FNSQV.js.map
131
+ //# sourceMappingURL=chunk-W4O3BTD5.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  partTestId
3
- } from "./chunk-4PYEDDYV.js";
3
+ } from "./chunk-3AQ25I6D.js";
4
4
  import {
5
5
  SETTING_CARD_OPEN_ATTR,
6
6
  withCallerSx
@@ -79,4 +79,4 @@ export {
79
79
  settingGridStyles,
80
80
  SettingGrid
81
81
  };
82
- //# sourceMappingURL=chunk-PPITQH3C.js.map
82
+ //# sourceMappingURL=chunk-WA36P74Q.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GridToolbar
3
- } from "./chunk-VZCZAHMX.js";
3
+ } from "./chunk-2XOL4HJU.js";
4
4
 
5
5
  // src/components/data-display/DataViews/data-views-shell-toolbar.tsx
6
6
  import { jsx } from "react/jsx-runtime";
@@ -66,4 +66,4 @@ function ShellToolbar({
66
66
  export {
67
67
  ShellToolbar
68
68
  };
69
- //# sourceMappingURL=chunk-UZCQHNXC.js.map
69
+ //# sourceMappingURL=chunk-WM44LYFN.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-QLJU7UUI.js";
5
5
  import {
6
6
  MoreFilters
7
- } from "./chunk-QJWIX4YZ.js";
7
+ } from "./chunk-VE7QYG3W.js";
8
8
  import {
9
9
  PillControl
10
10
  } from "./chunk-GWUJIO6Z.js";
@@ -220,4 +220,4 @@ function FilterSlots({
220
220
  export {
221
221
  InlineFilterControls
222
222
  };
223
- //# sourceMappingURL=chunk-NBM3YJ4P.js.map
223
+ //# sourceMappingURL=chunk-X6WC5QBY.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-G26Y2CCT.js";
4
4
  import {
5
5
  Button
6
- } from "./chunk-JE6FNSQV.js";
6
+ } from "./chunk-W4O3BTD5.js";
7
7
 
8
8
  // src/components/feedback/ConfirmAction/ConfirmButton.tsx
9
9
  function createConfirmButton(copy, errorText) {
@@ -18,4 +18,4 @@ function createConfirmButton(copy, errorText) {
18
18
  export {
19
19
  createConfirmButton
20
20
  };
21
- //# sourceMappingURL=chunk-L4HUZCKV.js.map
21
+ //# sourceMappingURL=chunk-XOCWAQOA.js.map
@@ -122,7 +122,10 @@ var panelStyles = (theme, props) => {
122
122
  };
123
123
  var dialogRootStyles = (theme, props) => ({
124
124
  direction: props.rtl ? "rtl" : "ltr",
125
- "& .MuiBackdrop-root": backdropStyles(theme, props.modalRole),
125
+ // The dialog's OWN backdrop only: a descendant selector also reached the
126
+ // backdrop of any sheet or drawer rendered inside the panel, and blurred the
127
+ // very panel that sheet sits on.
128
+ "& > .MuiBackdrop-root": backdropStyles(theme, props.modalRole),
126
129
  "& .MuiDialog-container": { alignItems: "flex-start", justifyContent: "flex-end" },
127
130
  "& .MuiDialog-paper": panelStyles(theme, props),
128
131
  ...KEYFRAMES
@@ -180,4 +183,4 @@ export {
180
183
  loadingOverlayStyles,
181
184
  modalContentStyles
182
185
  };
183
- //# sourceMappingURL=chunk-NEHCU3EZ.js.map
186
+ //# sourceMappingURL=chunk-XSIVM4VO.js.map