@12-apps/ui 6.24.5 → 6.24.6

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 (31) hide show
  1. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +2 -2
  2. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
  3. package/dist/_internal/components/data-display/Sheet/Sheet.parts.js +1 -1
  4. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +1 -1
  5. package/dist/_internal/components/data-display/index.js +4 -4
  6. package/dist/_internal/components/index.js +5 -5
  7. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +5 -5
  8. package/dist/_internal/components/navigation/index.js +5 -5
  9. package/dist/{chunk-OTH7H3IP.js → chunk-4J5EN4FQ.js} +4 -4
  10. package/dist/{chunk-6JZE4IIN.js → chunk-7MR2JCJW.js} +36 -13
  11. package/dist/chunk-7MR2JCJW.js.map +1 -0
  12. package/dist/{chunk-GVA5CYKP.js → chunk-BUQ2JUND.js} +2 -2
  13. package/dist/{chunk-M2K7BPHX.js → chunk-JBMBFYFA.js} +8 -3
  14. package/dist/chunk-JBMBFYFA.js.map +1 -0
  15. package/dist/{chunk-POUWN4PX.js → chunk-U437KFDI.js} +1 -1
  16. package/dist/chunk-U437KFDI.js.map +1 -0
  17. package/dist/data-display/Sheet.js +4 -4
  18. package/dist/navigation/AppHeader.js +5 -5
  19. package/dist/types/components/data-display/Sheet/Sheet.body.d.ts.map +1 -1
  20. package/dist/types/components/data-display/Sheet/Sheet.parts.d.ts.map +1 -1
  21. package/dist/types/components/data-display/Sheet/Sheet.styles.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/src/components/data-display/Sheet/Sheet.body.tsx +6 -1
  24. package/src/components/data-display/Sheet/Sheet.md +4 -2
  25. package/src/components/data-display/Sheet/Sheet.parts.tsx +4 -0
  26. package/src/components/data-display/Sheet/Sheet.styles.ts +77 -17
  27. package/dist/chunk-6JZE4IIN.js.map +0 -1
  28. package/dist/chunk-M2K7BPHX.js.map +0 -1
  29. package/dist/chunk-POUWN4PX.js.map +0 -1
  30. /package/dist/{chunk-OTH7H3IP.js.map → chunk-4J5EN4FQ.js.map} +0 -0
  31. /package/dist/{chunk-GVA5CYKP.js.map → chunk-BUQ2JUND.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SheetBody
3
- } from "../../../../chunk-M2K7BPHX.js";
4
- import "../../../../chunk-POUWN4PX.js";
3
+ } from "../../../../chunk-JBMBFYFA.js";
4
+ import "../../../../chunk-U437KFDI.js";
5
5
  import "../../../../chunk-F52N6ACD.js";
6
6
  import "../../../../chunk-HPK33ACY.js";
7
7
  import "../../../../chunk-V5IOLAIS.js";
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  Sheet
3
- } from "../../../../chunk-OTH7H3IP.js";
4
- import "../../../../chunk-M2K7BPHX.js";
5
- import "../../../../chunk-6JZE4IIN.js";
3
+ } from "../../../../chunk-4J5EN4FQ.js";
4
+ import "../../../../chunk-JBMBFYFA.js";
5
+ import "../../../../chunk-7MR2JCJW.js";
6
6
  import {
7
7
  SheetContent,
8
8
  SheetFooter,
9
9
  SheetHeader,
10
10
  SheetOverlay
11
- } from "../../../../chunk-POUWN4PX.js";
11
+ } from "../../../../chunk-U437KFDI.js";
12
12
  import "../../../../chunk-OLZTGVBT.js";
13
13
  import "../../../../chunk-CRN4KKNI.js";
14
14
  import "../../../../chunk-F52N6ACD.js";
@@ -3,7 +3,7 @@ import {
3
3
  SheetFooter,
4
4
  SheetHeader,
5
5
  SheetOverlay
6
- } from "../../../../chunk-POUWN4PX.js";
6
+ } from "../../../../chunk-U437KFDI.js";
7
7
  import "../../../../chunk-F52N6ACD.js";
8
8
  import "../../../../chunk-HPK33ACY.js";
9
9
  import "../../../../chunk-PZ5AY32C.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  panelSx
3
- } from "../../../../chunk-6JZE4IIN.js";
3
+ } from "../../../../chunk-7MR2JCJW.js";
4
4
  import "../../../../chunk-F52N6ACD.js";
5
5
  import "../../../../chunk-V5IOLAIS.js";
6
6
  import "../../../../chunk-7ZPUN7TV.js";
@@ -16,15 +16,15 @@ import "../../../chunk-ZEG2LNBY.js";
16
16
  import "../../../chunk-ITACE45O.js";
17
17
  import {
18
18
  Sheet
19
- } from "../../../chunk-OTH7H3IP.js";
20
- import "../../../chunk-M2K7BPHX.js";
21
- import "../../../chunk-6JZE4IIN.js";
19
+ } from "../../../chunk-4J5EN4FQ.js";
20
+ import "../../../chunk-JBMBFYFA.js";
21
+ import "../../../chunk-7MR2JCJW.js";
22
22
  import {
23
23
  SheetContent,
24
24
  SheetFooter,
25
25
  SheetHeader,
26
26
  SheetOverlay
27
- } from "../../../chunk-POUWN4PX.js";
27
+ } from "../../../chunk-U437KFDI.js";
28
28
  import "../../../chunk-OLZTGVBT.js";
29
29
  import "../../../chunk-CRN4KKNI.js";
30
30
  import "../../../chunk-F52N6ACD.js";
@@ -94,7 +94,7 @@ import {
94
94
  } from "../../chunk-H37GIAAM.js";
95
95
  import {
96
96
  AppHeaderDetails
97
- } from "../../chunk-GVA5CYKP.js";
97
+ } from "../../chunk-BUQ2JUND.js";
98
98
  import {
99
99
  brandGradient,
100
100
  highlightOf,
@@ -393,15 +393,15 @@ import "../../chunk-ZEG2LNBY.js";
393
393
  import "../../chunk-ITACE45O.js";
394
394
  import {
395
395
  Sheet
396
- } from "../../chunk-OTH7H3IP.js";
397
- import "../../chunk-M2K7BPHX.js";
398
- import "../../chunk-6JZE4IIN.js";
396
+ } from "../../chunk-4J5EN4FQ.js";
397
+ import "../../chunk-JBMBFYFA.js";
398
+ import "../../chunk-7MR2JCJW.js";
399
399
  import {
400
400
  SheetContent,
401
401
  SheetFooter,
402
402
  SheetHeader,
403
403
  SheetOverlay
404
- } from "../../chunk-POUWN4PX.js";
404
+ } from "../../chunk-U437KFDI.js";
405
405
  import "../../chunk-OLZTGVBT.js";
406
406
  import "../../chunk-CRN4KKNI.js";
407
407
  import "../../chunk-F52N6ACD.js";
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import {
3
3
  AppHeaderDetails
4
- } from "../../../../chunk-GVA5CYKP.js";
5
- import "../../../../chunk-OTH7H3IP.js";
6
- import "../../../../chunk-M2K7BPHX.js";
7
- import "../../../../chunk-6JZE4IIN.js";
8
- import "../../../../chunk-POUWN4PX.js";
4
+ } from "../../../../chunk-BUQ2JUND.js";
5
+ import "../../../../chunk-4J5EN4FQ.js";
6
+ import "../../../../chunk-JBMBFYFA.js";
7
+ import "../../../../chunk-7MR2JCJW.js";
8
+ import "../../../../chunk-U437KFDI.js";
9
9
  import "../../../../chunk-OLZTGVBT.js";
10
10
  import "../../../../chunk-CRN4KKNI.js";
11
11
  import "../../../../chunk-F52N6ACD.js";
@@ -18,7 +18,7 @@ import {
18
18
  } from "../../../chunk-H37GIAAM.js";
19
19
  import {
20
20
  AppHeaderDetails
21
- } from "../../../chunk-GVA5CYKP.js";
21
+ } from "../../../chunk-BUQ2JUND.js";
22
22
  import {
23
23
  brandGradient,
24
24
  highlightOf,
@@ -51,10 +51,10 @@ import "../../../chunk-Q444G5X7.js";
51
51
  import "../../../chunk-7FOOLP5H.js";
52
52
  import "../../../chunk-FYLCSCMR.js";
53
53
  import "../../../chunk-3L5OZCGA.js";
54
- import "../../../chunk-OTH7H3IP.js";
55
- import "../../../chunk-M2K7BPHX.js";
56
- import "../../../chunk-6JZE4IIN.js";
57
- import "../../../chunk-POUWN4PX.js";
54
+ import "../../../chunk-4J5EN4FQ.js";
55
+ import "../../../chunk-JBMBFYFA.js";
56
+ import "../../../chunk-7MR2JCJW.js";
57
+ import "../../../chunk-U437KFDI.js";
58
58
  import "../../../chunk-OLZTGVBT.js";
59
59
  import "../../../chunk-CRN4KKNI.js";
60
60
  import "../../../chunk-F52N6ACD.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  SheetBody
3
- } from "./chunk-M2K7BPHX.js";
3
+ } from "./chunk-JBMBFYFA.js";
4
4
  import {
5
5
  panelSx
6
- } from "./chunk-6JZE4IIN.js";
6
+ } from "./chunk-7MR2JCJW.js";
7
7
  import {
8
8
  SheetOverlay
9
- } from "./chunk-POUWN4PX.js";
9
+ } from "./chunk-U437KFDI.js";
10
10
  import {
11
11
  useSheetDrag,
12
12
  useSheetOpen
@@ -124,4 +124,4 @@ var Sheet = (props) => {
124
124
  export {
125
125
  Sheet
126
126
  };
127
- //# sourceMappingURL=chunk-OTH7H3IP.js.map
127
+ //# sourceMappingURL=chunk-4J5EN4FQ.js.map
@@ -19,24 +19,35 @@ var HORIZONTAL_SIZES = {
19
19
  full: "100%"
20
20
  };
21
21
  var VERTICAL_SIZES = {
22
- xs: 200,
23
- sm: 300,
24
- md: 400,
25
- lg: 500,
26
- xl: 600,
27
- full: "100%"
22
+ xs: "min(200px, 100%)",
23
+ sm: "min(300px, 100%)",
24
+ md: "min(400px, 100%)",
25
+ lg: "min(500px, 100%)",
26
+ xl: "min(600px, 100%)"
28
27
  };
28
+ var VERTICAL_MAX_WIDTH = "min(100%, 640px)";
29
29
  var sizeStyles = ({
30
30
  position,
31
31
  size,
32
32
  isDraggableVariant,
33
- isVerticalSheet,
34
33
  currentHeight
35
34
  }) => {
36
- if (isDraggableVariant && isVerticalSheet && currentHeight !== null) {
37
- return { height: currentHeight };
35
+ if (isHorizontalPosition(position)) {
36
+ return { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md };
37
+ }
38
+ if (size === "full") return { width: "100%", height: "100%" };
39
+ const cross = { width: VERTICAL_MAX_WIDTH, marginInline: "auto" };
40
+ if (isDraggableVariant && currentHeight !== null) {
41
+ return { ...cross, height: currentHeight };
38
42
  }
39
- return isHorizontalPosition(position) ? { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md } : { height: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md };
43
+ return {
44
+ ...cross,
45
+ // A CEILING, not a height — see `VERTICAL_SIZES`. `height: auto` is stated
46
+ // rather than left off so the rule survives a caller who set a height on a
47
+ // previous render, and it is what lets the panel hug what it holds.
48
+ height: "auto",
49
+ maxHeight: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md
50
+ };
40
51
  };
41
52
  var toRgbTriplet = (hexColor) => {
42
53
  const hex = hexColor.replace("#", "");
@@ -151,10 +162,22 @@ var variantStyles = (input) => {
151
162
  var panelSx = (input) => {
152
163
  const { position, size, isDraggableVariant, isVerticalSheet, currentHeight, fullHeight, style } = input;
153
164
  return {
154
- ...sizeStyles({ position, size, isDraggableVariant, isVerticalSheet, currentHeight }),
165
+ // The DEFAULT, so the glow and the elevated shadow are not clipped by the
166
+ // panel they hang off. It used to be stated last, which made it a rule
167
+ // nothing could override — including `gradient`, whose own `overflow:
168
+ // hidden` is what keeps its shimmer inside the panel. That was invisible
169
+ // while every vertical sheet was full-bleed, because the sweep starts at
170
+ // `left: -100%` and a full-width panel put it off-screen; a 640px one puts
171
+ // it on the backdrop beside the sheet.
172
+ overflow: "visible",
173
+ ...sizeStyles({ position, size, isDraggableVariant, currentHeight }),
174
+ // A COLUMN, so `maxHeight` above can be a ceiling rather than a height: the
175
+ // body is then a flex item that shrinks against it, and the scrolling falls
176
+ // to `SheetContent` where it belongs. Without this the panel would clip a
177
+ // long sheet instead of scrolling it.
178
+ ...isVerticalSheet ? { display: "flex", flexDirection: "column" } : {},
155
179
  ...variantStyles(input),
156
180
  ...style,
157
- overflow: "visible",
158
181
  // Expand only the cross axis so the chosen `size` still governs the main
159
182
  // axis: side sheets keep their (responsive) width and go full-height;
160
183
  // top/bottom sheets keep their height and go full-width.
@@ -165,4 +188,4 @@ var panelSx = (input) => {
165
188
  export {
166
189
  panelSx
167
190
  };
168
- //# sourceMappingURL=chunk-6JZE4IIN.js.map
191
+ //# sourceMappingURL=chunk-7MR2JCJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport type React from 'react';\n\nimport { glowAnimation, pulseAnimation, shimmerAnimation } from './Sheet.animations';\nimport type { SheetProps } from './Sheet.types';\nimport { accentFor } from '../../../tokens/scales';\n\ntype Position = NonNullable<SheetProps['position']>;\ntype Variant = NonNullable<SheetProps['variant']>;\ntype Size = NonNullable<SheetProps['size']>;\ntype Color = NonNullable<SheetProps['color']>;\n\nconst isHorizontalPosition = (position: Position) => position === 'left' || position === 'right';\n\n/**\n * Horizontal (left/right) sheets are viewport-aware: a px floor keeps the panel\n * usable, `…vw` lets the larger presets grow on wide screens (lg ≥32%, xl ≥40%\n * of the viewport), and the outer `min(92vw, …)` guarantees the panel never\n * overflows a small screen.\n */\nconst HORIZONTAL_SIZES: Record<Size, string> = {\n xs: 'min(92vw, 240px)',\n sm: 'min(92vw, 320px)',\n md: 'min(92vw, 400px)',\n lg: 'min(92vw, max(560px, 32vw))',\n xl: 'min(92vw, max(720px, 40vw))',\n full: '100%',\n};\n\n/**\n * `size` governs a vertical sheet's MAIN axis, and it is a CEILING rather than\n * a height: the panel is as tall as what it holds, and starts scrolling only\n * once that would pass the preset.\n *\n * It was a fixed `height`, which meant a short sheet reserved the rest of the\n * preset as dead space — a `md` sheet holding three lines and a button drew a\n * 400px panel and floated them in it. `min(…, 100%)` keeps the ceiling under\n * the viewport, which is also what MUI's own bottom paper asks for.\n *\n * `full` is absent on purpose: it is not a ceiling, it is the whole viewport,\n * and `sizeStyles` answers it before it gets here.\n */\nconst VERTICAL_SIZES: Record<Exclude<Size, 'full'>, string> = {\n xs: 'min(200px, 100%)',\n sm: 'min(300px, 100%)',\n md: 'min(400px, 100%)',\n lg: 'min(500px, 100%)',\n xl: 'min(600px, 100%)',\n};\n\n/**\n * How wide a top/bottom sheet is allowed to get — its CROSS axis, so it is one\n * rule rather than one per `size` preset.\n *\n * A bottom sheet spanning the full width is a phone layout, and it was the only\n * layout this component had: on a desktop a panel holding a sentence and one\n * button was drawn 1900px wide, with the content stranded in the middle of it.\n * 640px is Material's own ceiling for a bottom sheet above the handset\n * breakpoint, and below it `100%` gives the phone back exactly what it had.\n *\n * `fullHeight` is the documented opt-out — it expands a vertical sheet along\n * this axis — and it becomes meaningful here for the first time: it used to\n * name the behaviour every bottom sheet already had.\n */\nconst VERTICAL_MAX_WIDTH = 'min(100%, 640px)';\n\ninterface SizeStyleInput {\n position: Position;\n size: Size;\n isDraggableVariant: boolean;\n currentHeight: number | null;\n}\n\nconst sizeStyles = ({\n position,\n size,\n isDraggableVariant,\n currentHeight,\n}: SizeStyleInput) => {\n if (isHorizontalPosition(position)) {\n return { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md };\n }\n\n // `full` is not a size on the scale — it is THE WHOLE VIEWPORT, on both axes,\n // and it has to stay that: a consumer using it for a phone takeover would\n // otherwise get a content-hugging 640px card out of a catalog bump, with\n // nothing in the API left to ask for what they had. So it is answered before\n // either rule below touches it.\n if (size === 'full') return { width: '100%', height: '100%' };\n\n // The cross axis is the same rule whatever the preset, and the draggable\n // variant needs it too — dragging moves the panel's height, never its width.\n // `marginInline` is what centres it: MUI pins the bottom paper `left: 0;\n // right: 0`, so a definite width plus auto margins resolves to the middle.\n const cross = { width: VERTICAL_MAX_WIDTH, marginInline: 'auto' };\n\n // The draggable variant owns its own height: the snap point decides it, so a\n // preset would fight the drag.\n if (isDraggableVariant && currentHeight !== null) {\n return { ...cross, height: currentHeight };\n }\n\n return {\n ...cross,\n // A CEILING, not a height — see `VERTICAL_SIZES`. `height: auto` is stated\n // rather than left off so the rule survives a caller who set a height on a\n // previous render, and it is what lets the panel hug what it holds.\n height: 'auto',\n maxHeight: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md,\n };\n};\n\n/** `r, g, b` for a hex colour, so it can feed an `rgba(var(--x), a)` custom property. */\nconst toRgbTriplet = (hexColor: string) => {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `${r}, ${g}, ${b}`;\n};\n\nconst roundedStyles = (theme: Theme, position: Position) => {\n const radius = theme.spacing(2);\n const byPosition: Record<Position, string> = {\n top: `0 0 ${radius} ${radius}`,\n bottom: `${radius} ${radius} 0 0`,\n left: `0 ${radius} ${radius} 0`,\n right: `${radius} 0 0 ${radius}`,\n };\n return { borderRadius: byPosition[position] };\n};\n\ninterface VariantStyleInput {\n theme: Theme;\n variant: Variant;\n color: Color;\n position: Position;\n elevation: number;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n rounded: boolean;\n disabled: boolean;\n isDragging: boolean;\n isAnimating: boolean;\n isDraggableVariant: boolean;\n isVerticalSheet: boolean;\n}\n\ntype SurfaceInput = VariantStyleInput & { accent: string };\n\n/**\n * Each variant's own additions to the shared surface — never the shared part\n * itself. Every arm of the old switch re-spread the same base, glow, pulse and\n * rounded objects before adding these few rules; `variantStyles` applies that\n * prefix once and lets the table hold only what actually differs.\n */\nconst SURFACES: Record<Variant, (input: SurfaceInput) => Record<string, unknown>> = {\n draggable: ({ theme, elevation, accent }) => ({\n boxShadow: `\n ${theme.shadows[Math.min(elevation + 4, 24)]},\n 0 -2px 10px 0 ${alpha(theme.palette.common.black, 0.1)}\n `,\n border: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n borderTop: `2px solid ${alpha(accent, 0.3)}`,\n transition: theme.transitions.create(['transform', 'box-shadow', 'border-color'], {\n duration: theme.transitions.duration.shorter,\n easing: theme.transitions.easing.easeInOut,\n }),\n '&:hover': { borderTopColor: alpha(accent, 0.5) },\n }),\n\n glass: ({ theme, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.75 : 0.95),\n backdropFilter: 'blur(24px) saturate(180%)',\n WebkitBackdropFilter: 'blur(24px) saturate(180%)',\n border: `1px solid ${alpha(theme.palette.divider, 0.15)}`,\n boxShadow: `\n 0 8px 32px 0 ${alpha(theme.palette.common.black, 0.15)},\n inset 0 0 0 1px ${alpha(theme.palette.common.white, 0.1)}\n `,\n }),\n\n gradient: ({ theme, color, gradient, accent }) => ({\n background: gradient\n ? `linear-gradient(\n 135deg,\n ${theme.palette.background.paper} 0%,\n ${alpha(accent, 0.08)} 50%,\n ${alpha(accentFor(theme, color)?.dark || accent, 0.12)} 100%\n )`\n : theme.palette.background.paper,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n '&::before': gradient ? shimmerOverlay(theme) : {},\n }),\n\n elevated: ({ theme, elevation }) => ({\n boxShadow: `\n ${theme.shadows[elevation]},\n 0 20px 40px -15px ${alpha(theme.palette.common.black, 0.15)}\n `,\n transform: 'translateZ(0)',\n willChange: 'transform',\n }),\n\n minimal: () => ({ boxShadow: 'none', border: 'none' }),\n\n default: () => ({}),\n};\n\n/** The sweep of light the gradient variant runs across itself. */\nconst shimmerOverlay = (theme: Theme) => ({\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '-100%',\n width: '100%',\n height: '100%',\n background: `linear-gradient(\n 90deg,\n transparent,\n ${alpha(theme.palette.common.white, 0.2)},\n transparent\n )`,\n animation: `${shimmerAnimation} 3s infinite`,\n});\n\n/**\n * The parts of the surface that do not depend on the variant: the paper colour,\n * the transition suppression while a drag or spring is driving the panel, the\n * disabled and cursor states, and the two colour custom properties the glow and\n * pulse keyframes read.\n */\nconst baseSurface = (input: VariantStyleInput, accent: string) => {\n const { theme, disabled, isDragging, isAnimating, isDraggableVariant, isVerticalSheet } = input;\n const colorRgb = toRgbTriplet(accent);\n\n return {\n backgroundColor: theme.palette.background.paper,\n // A transition would fight the per-frame height writes while a drag or a\n // snap animation is driving the panel.\n transition:\n !isDragging && !isAnimating\n ? theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n easing: theme.transitions.easing.easeInOut,\n })\n : 'none',\n opacity: disabled ? 0.5 : 1,\n pointerEvents: disabled ? ('none' as const) : ('auto' as const),\n cursor: isDraggableVariant && isVerticalSheet ? 'grab' : 'auto',\n '--pulse-color': colorRgb,\n '--glow-color': colorRgb,\n ...(isDragging && { cursor: 'grabbing' }),\n };\n};\n\nconst variantStyles = (input: VariantStyleInput) => {\n const { theme, variant, color, position, glow, pulse, rounded } = input;\n const accent = accentFor(theme, color)?.main || theme.palette.primary.main;\n\n return {\n ...baseSurface(input, accent),\n // glow first, then pulse: with both set the pulse keyframes win the shared\n // `animation` slot, which is the order the original spread produced.\n ...(glow && { animation: `${glowAnimation} 2s ease-in-out infinite`, filter: 'brightness(1.05)' }),\n ...(pulse && { animation: `${pulseAnimation} 2s infinite`, position: 'relative' as const }),\n ...(rounded && roundedStyles(theme, position)),\n ...(SURFACES[variant] ?? SURFACES.default)({ ...input, accent }),\n };\n};\n\ninterface PanelSxInput extends VariantStyleInput {\n size: Size;\n currentHeight: number | null;\n fullHeight: boolean;\n style?: React.CSSProperties;\n}\n\n/**\n * The drawer paper's complete `sx`: its size, its variant surface, the caller's\n * own `style`, and the full-height rule.\n *\n * Built here rather than in the component so the component holds no style\n * branches of its own — the cross-axis rule below is four on its own.\n */\nexport const panelSx = (input: PanelSxInput): CSSObject => {\n const { position, size, isDraggableVariant, isVerticalSheet, currentHeight, fullHeight, style } =\n input;\n\n return {\n // The DEFAULT, so the glow and the elevated shadow are not clipped by the\n // panel they hang off. It used to be stated last, which made it a rule\n // nothing could override — including `gradient`, whose own `overflow:\n // hidden` is what keeps its shimmer inside the panel. That was invisible\n // while every vertical sheet was full-bleed, because the sweep starts at\n // `left: -100%` and a full-width panel put it off-screen; a 640px one puts\n // it on the backdrop beside the sheet.\n overflow: 'visible',\n ...sizeStyles({ position, size, isDraggableVariant, currentHeight }),\n // A COLUMN, so `maxHeight` above can be a ceiling rather than a height: the\n // body is then a flex item that shrinks against it, and the scrolling falls\n // to `SheetContent` where it belongs. Without this the panel would clip a\n // long sheet instead of scrolling it.\n ...(isVerticalSheet ? { display: 'flex', flexDirection: 'column' } : {}),\n ...variantStyles(input),\n ...style,\n // Expand only the cross axis so the chosen `size` still governs the main\n // axis: side sheets keep their (responsive) width and go full-height;\n // top/bottom sheets keep their height and go full-width.\n ...(fullHeight &&\n !isDraggableVariant &&\n (isHorizontalPosition(position) ? { height: '100%' } : { width: '100%' })),\n };\n};\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Sheet
3
- } from "./chunk-OTH7H3IP.js";
3
+ } from "./chunk-4J5EN4FQ.js";
4
4
  import {
5
5
  Dialog
6
6
  } from "./chunk-YANLN6HP.js";
@@ -162,4 +162,4 @@ AppHeaderDetails.displayName = "AppHeaderDetails";
162
162
  export {
163
163
  AppHeaderDetails
164
164
  };
165
- //# sourceMappingURL=chunk-GVA5CYKP.js.map
165
+ //# sourceMappingURL=chunk-BUQ2JUND.js.map
@@ -2,7 +2,7 @@ import {
2
2
  SheetContent,
3
3
  SheetFooter,
4
4
  SheetHeader
5
- } from "./chunk-POUWN4PX.js";
5
+ } from "./chunk-U437KFDI.js";
6
6
  import {
7
7
  muiColor
8
8
  } from "./chunk-7ZPUN7TV.js";
@@ -55,7 +55,12 @@ var SheetBody = (props) => {
55
55
  onBlur,
56
56
  "data-testid": testId,
57
57
  sx: {
58
- height: "100%",
58
+ // A vertical sheet's panel is a column whose height is its CONTENT, up
59
+ // to the `size` ceiling — so this fills what the panel has rather than
60
+ // asking for a percentage of it, and `minHeight: 0` is what lets it
61
+ // shrink past its content so `SheetContent` scrolls instead of the
62
+ // panel overflowing. A side sheet's panel is full-height already.
63
+ ...isVerticalSheet ? { flex: "1 1 auto", minHeight: 0 } : { height: "100%" },
59
64
  display: "flex",
60
65
  flexDirection: "column",
61
66
  position: "relative",
@@ -86,4 +91,4 @@ var SheetBody = (props) => {
86
91
  export {
87
92
  SheetBody
88
93
  };
89
- //# sourceMappingURL=chunk-M2K7BPHX.js.map
94
+ //# sourceMappingURL=chunk-JBMBFYFA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.body.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport React from 'react';\n\nimport { SheetContent, SheetFooter, SheetHeader } from './Sheet.parts';\nimport type { SheetProps } from './Sheet.types';\nimport { muiColor } from '../../../tokens/scales';\n\nexport interface SheetBodyProps extends Pick<\n SheetProps,\n | 'title'\n | 'description'\n | 'showCloseButton'\n | 'showHandle'\n | 'header'\n | 'footer'\n | 'loading'\n | 'color'\n | 'children'\n | 'onClick'\n | 'onFocus'\n | 'onBlur'\n> {\n testId: string;\n isDragging: boolean;\n isVerticalSheet: boolean;\n isDraggableVariant: boolean;\n onClose: () => void;\n onDragStart: (e: React.MouseEvent | React.TouchEvent) => void;\n}\n\n/**\n * The header earns its place if it would show anything at all — a grab handle,\n * either piece of text, the close button, or caller-supplied content.\n */\nconst needsHeader = (props: SheetBodyProps) =>\n Boolean(\n props.showHandle ||\n props.title ||\n props.description ||\n props.showCloseButton ||\n props.header,\n );\n\n/** The centred spinner shown in place of the children while `loading`. */\nconst SheetLoading: React.FC<Pick<SheetBodyProps, 'color'>> = ({ color }) => (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 200,\n }}\n >\n <CircularProgress color={color === undefined ? undefined : muiColor(color, 'inherit')} />\n </Box>\n);\n\n/**\n * What the sheet contains, independent of which drawer is carrying it. The\n * swipeable and plain branches render exactly this — they differ only in the\n * MUI component and its swipe props, so the contents are built once.\n */\nexport const SheetBody: React.FC<SheetBodyProps> = (props) => {\n const {\n title,\n description,\n showCloseButton,\n showHandle,\n header,\n footer,\n loading,\n color,\n children,\n onClick,\n onFocus,\n onBlur,\n testId,\n isDragging,\n isVerticalSheet,\n isDraggableVariant,\n onClose,\n onDragStart,\n } = props;\n\n return (\n <Box\n onClick={onClick}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={testId}\n sx={{\n // A vertical sheet's panel is a column whose height is its CONTENT, up\n // to the `size` ceiling — so this fills what the panel has rather than\n // asking for a percentage of it, and `minHeight: 0` is what lets it\n // shrink past its content so `SheetContent` scrolls instead of the\n // panel overflowing. A side sheet's panel is full-height already.\n ...(isVerticalSheet ? { flex: '1 1 auto', minHeight: 0 } : { height: '100%' }),\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n userSelect: isDragging ? 'none' : 'auto',\n }}\n >\n {needsHeader(props) && (\n <SheetHeader\n title={title}\n description={description}\n showCloseButton={showCloseButton}\n onClose={onClose}\n showHandle={showHandle && isVerticalSheet}\n isDraggable={isDraggableVariant && isVerticalSheet}\n onDragStart={onDragStart}\n dataTestId={`${testId}-header`}\n >\n {header}\n </SheetHeader>\n )}\n\n <SheetContent padded dataTestId={`${testId}-content`}>\n {loading ? <SheetLoading color={color} /> : children}\n </SheetContent>\n\n {footer && (\n <SheetFooter sticky divider dataTestId={`${testId}-footer`}>\n {footer}\n </SheetFooter>\n )}\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,sBAAsB;AAqDzB,cAgCA,YAhCA;AAnBJ,IAAM,cAAc,CAAC,UACnB;AAAA,EACE,MAAM,cACN,MAAM,SACN,MAAM,eACN,MAAM,mBACN,MAAM;AACR;AAGF,IAAM,eAAwD,CAAC,EAAE,MAAM,MACrE;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IAEA,8BAAC,oBAAiB,OAAO,UAAU,SAAY,SAAY,SAAS,OAAO,SAAS,GAAG;AAAA;AACzF;AAQK,IAAM,YAAsC,CAAC,UAAU;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMF,GAAI,kBAAkB,EAAE,MAAM,YAAY,WAAW,EAAE,IAAI,EAAE,QAAQ,OAAO;AAAA,QAC5E,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,YAAY,aAAa,SAAS;AAAA,MACpC;AAAA,MAEC;AAAA,oBAAY,KAAK,KAChB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,cAAc;AAAA,YAC1B,aAAa,sBAAsB;AAAA,YACnC;AAAA,YACA,YAAY,GAAG,MAAM;AAAA,YAEpB;AAAA;AAAA,QACH;AAAA,QAGF,oBAAC,gBAAa,QAAM,MAAC,YAAY,GAAG,MAAM,YACvC,oBAAU,oBAAC,gBAAa,OAAc,IAAK,UAC9C;AAAA,QAEC,UACC,oBAAC,eAAY,QAAM,MAAC,SAAO,MAAC,YAAY,GAAG,MAAM,WAC9C,kBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -203,4 +203,4 @@ export {
203
203
  SheetFooter,
204
204
  SheetOverlay
205
205
  };
206
- //# sourceMappingURL=chunk-POUWN4PX.js.map
206
+ //# sourceMappingURL=chunk-U437KFDI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.parts.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport Backdrop from '@mui/material/Backdrop/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { shimmerAnimation } from './Sheet.animations';\nimport type {\n SheetContentProps,\n SheetFooterProps,\n SheetHeaderProps,\n SheetOverlayProps,\n} from './Sheet.types';\n\n/**\n * The grab handle's own styling. A draggable handle is deliberately larger and\n * tinted, so the affordance reads as draggable before the user tries it; a\n * decorative one stays a neutral bar.\n */\nconst handleSx = (theme: Theme, isDraggable: boolean) => ({\n width: isDraggable ? 48 : 32,\n height: isDraggable ? 6 : 4,\n backgroundColor: alpha(theme.palette.text.primary, 0.3),\n borderRadius: 3,\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.short,\n easing: theme.transitions.easing.easeInOut,\n }),\n position: 'relative',\n overflow: 'hidden',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '-100%',\n width: '100%',\n height: '100%',\n background: `linear-gradient(\n 90deg,\n transparent,\n ${alpha(theme.palette.common.white, 0.3)},\n transparent\n )`,\n animation: isDraggable ? `${shimmerAnimation} 2s infinite` : 'none',\n },\n ...(isDraggable && {\n backgroundColor: alpha(theme.palette.primary.main, 0.4),\n boxShadow: `0 2px 4px ${alpha(theme.palette.primary.main, 0.2)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n transform: 'scaleX(1.15) scaleY(1.2)',\n boxShadow: `0 3px 6px ${alpha(theme.palette.primary.main, 0.3)}`,\n },\n }),\n});\n\nconst SheetHandle: React.FC<{ isDraggable: boolean }> = ({ isDraggable }) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n mb: 1,\n // The handle is decoration on a draggable header: the drag listeners sit\n // on the header itself, so letting the bar swallow the press would open\n // a dead zone in the middle of the grab target.\n pointerEvents: isDraggable ? 'none' : 'auto',\n }}\n >\n <Box sx={handleSx(theme, isDraggable)} />\n </Box>\n );\n};\n\nconst HEADER_DEFAULTS: Partial<SheetHeaderProps> = {\n isDraggable: false,\n dataTestId: 'sheet-header',\n};\n\nexport const SheetHeader: React.FC<SheetHeaderProps> = (props) => {\n const {\n title,\n description,\n showCloseButton,\n onClose,\n showHandle,\n isDraggable,\n onDragStart,\n className,\n style,\n children,\n dataTestId,\n } = withDefaults(props, HEADER_DEFAULTS);\n\n return (\n <Box\n className={className}\n data-testid={dataTestId}\n sx={{\n p: 2,\n pb: showHandle ? 1 : 2,\n cursor: isDraggable ? 'grab' : 'auto',\n '&:active': isDraggable ? { cursor: 'grabbing' } : {},\n ...style,\n }}\n onMouseDown={isDraggable ? onDragStart : undefined}\n onTouchStart={isDraggable ? onDragStart : undefined}\n >\n {showHandle && <SheetHandle isDraggable={Boolean(isDraggable)} />}\n\n <Box sx={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between' }}>\n <Box sx={{ flex: 1 }}>\n {title && (\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }} data-testid={`${dataTestId}-title`}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {description}\n </Typography>\n )}\n {children}\n </Box>\n\n {showCloseButton && (\n <IconButton\n onClick={onClose}\n size=\"small\"\n sx={{ ml: 1, mt: -0.5 }}\n data-testid={`${dataTestId}-close-button`}\n >\n <CloseIcon data-testid={`${dataTestId}-close-icon`} />\n </IconButton>\n )}\n </Box>\n </Box>\n );\n};\n\nconst CONTENT_DEFAULTS: Partial<SheetContentProps> = {\n padded: true,\n dataTestId: 'sheet-content',\n};\n\nexport const SheetContent: React.FC<SheetContentProps> = (props) => {\n const { children, className, style, padded, dataTestId } = withDefaults(props, CONTENT_DEFAULTS);\n\n return (\n <Box\n className={className}\n data-testid={dataTestId}\n // No `minHeight: 0` here, deliberately: a flex item's automatic minimum\n // size only applies while its main-axis `overflow` is `visible`, and this\n // one is `auto`, so it already shrinks. `SheetBody` above is the item that\n // needs it stated.\n sx={{ flex: 1, overflow: 'auto', p: padded ? 2 : 0, ...style }}\n >\n {children}\n </Box>\n );\n};\n\nconst FOOTER_DEFAULTS: Partial<SheetFooterProps> = {\n sticky: false,\n divider: false,\n dataTestId: 'sheet-footer',\n};\n\nexport const SheetFooter: React.FC<SheetFooterProps> = (props) => {\n const { children, className, style, sticky, divider, dataTestId } = withDefaults(\n props,\n FOOTER_DEFAULTS,\n );\n\n return (\n <>\n {divider && <Divider />}\n <Box\n className={className}\n data-testid={dataTestId}\n sx={{\n p: 2,\n position: sticky ? 'sticky' : 'relative',\n bottom: sticky ? 0 : 'auto',\n backgroundColor: 'background.paper',\n borderTop: sticky ? '1px solid' : 'none',\n borderColor: 'divider',\n ...style,\n }}\n >\n {children}\n </Box>\n </>\n );\n};\n\nconst OVERLAY_DEFAULTS: Partial<SheetOverlayProps> = {\n open: false,\n blur: false,\n};\n\nexport const SheetOverlay: React.FC<SheetOverlayProps> = (props) => {\n const { open, onClick, className, style, blur } = withDefaults(props, OVERLAY_DEFAULTS);\n const theme = useTheme();\n\n return (\n <Fade in={open} timeout={300}>\n <Backdrop\n open={Boolean(open)}\n onClick={onClick}\n className={className}\n sx={{\n // One below the drawer: this backdrop replaces MUI's own (the drawer\n // is given a no-op BackdropComponent) and must sit under the panel.\n zIndex: theme.zIndex.drawer - 1,\n backgroundColor: alpha(theme.palette.common.black, blur ? 0.6 : 0.5),\n backdropFilter: blur ? 'blur(8px) saturate(180%)' : 'none',\n WebkitBackdropFilter: blur ? 'blur(8px) saturate(180%)' : 'none',\n ...style,\n }}\n />\n </Fade>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,15 +1,15 @@
1
1
  import "../chunk-ITACE45O.js";
2
2
  import {
3
3
  Sheet
4
- } from "../chunk-OTH7H3IP.js";
5
- import "../chunk-M2K7BPHX.js";
6
- import "../chunk-6JZE4IIN.js";
4
+ } from "../chunk-4J5EN4FQ.js";
5
+ import "../chunk-JBMBFYFA.js";
6
+ import "../chunk-7MR2JCJW.js";
7
7
  import {
8
8
  SheetContent,
9
9
  SheetFooter,
10
10
  SheetHeader,
11
11
  SheetOverlay
12
- } from "../chunk-POUWN4PX.js";
12
+ } from "../chunk-U437KFDI.js";
13
13
  import "../chunk-OLZTGVBT.js";
14
14
  import "../chunk-CRN4KKNI.js";
15
15
  import "../chunk-F52N6ACD.js";
@@ -12,16 +12,16 @@ import {
12
12
  } from "../chunk-H37GIAAM.js";
13
13
  import {
14
14
  AppHeaderDetails
15
- } from "../chunk-GVA5CYKP.js";
15
+ } from "../chunk-BUQ2JUND.js";
16
16
  import {
17
17
  brandGradient,
18
18
  highlightOf,
19
19
  initialsOf
20
20
  } from "../chunk-IQU4HKND.js";
21
- import "../chunk-OTH7H3IP.js";
22
- import "../chunk-M2K7BPHX.js";
23
- import "../chunk-6JZE4IIN.js";
24
- import "../chunk-POUWN4PX.js";
21
+ import "../chunk-4J5EN4FQ.js";
22
+ import "../chunk-JBMBFYFA.js";
23
+ import "../chunk-7MR2JCJW.js";
24
+ import "../chunk-U437KFDI.js";
25
25
  import "../chunk-OLZTGVBT.js";
26
26
  import "../chunk-CRN4KKNI.js";
27
27
  import "../chunk-F52N6ACD.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Sheet.body.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.body.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,UAAU,EACR,OAAO,GACP,aAAa,GACb,iBAAiB,GACjB,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,QAAQ,CACX;IACC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC/D;AA6BD;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA8D9C,CAAC"}
1
+ {"version":3,"file":"Sheet.body.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.body.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,UAAU,EACR,OAAO,GACP,aAAa,GACb,iBAAiB,GACjB,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,QAAQ,CACX;IACC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC/D;AA6BD;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAmE9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Sheet.parts.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.parts.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAqEvB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA2DlD,CAAC;AAOF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAYpD,CAAC;AAQF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0BlD,CAAC;AAOF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAsBpD,CAAC"}
1
+ {"version":3,"file":"Sheet.parts.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.parts.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAqEvB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA2DlD,CAAC;AAOF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAQF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0BlD,CAAC;AAOF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAsBpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Sheet.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.styles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,KAAK,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,KAAK,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,KAAK,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AA0E9C,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;CAC1B;AA8HD,UAAU,YAAa,SAAQ,iBAAiB;IAC9C,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,YAAY,KAAG,SAgB7C,CAAC"}
1
+ {"version":3,"file":"Sheet.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Sheet/Sheet.styles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,KAAK,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,KAAK,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,KAAK,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,KAAK,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AA0H9C,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;CAC1B;AA8HD,UAAU,YAAa,SAAQ,iBAAiB;IAC9C,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,YAAY,KAAG,SA4B7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.24.5",
3
+ "version": "6.24.6",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -90,7 +90,12 @@ export const SheetBody: React.FC<SheetBodyProps> = (props) => {
90
90
  onBlur={onBlur}
91
91
  data-testid={testId}
92
92
  sx={{
93
- height: '100%',
93
+ // A vertical sheet's panel is a column whose height is its CONTENT, up
94
+ // to the `size` ceiling — so this fills what the panel has rather than
95
+ // asking for a percentage of it, and `minHeight: 0` is what lets it
96
+ // shrink past its content so `SheetContent` scrolls instead of the
97
+ // panel overflowing. A side sheet's panel is full-height already.
98
+ ...(isVerticalSheet ? { flex: '1 1 auto', minHeight: 0 } : { height: '100%' }),
94
99
  display: 'flex',
95
100
  flexDirection: 'column',
96
101
  position: 'relative',
@@ -26,8 +26,10 @@ The Sheet component is ideal for:
26
26
  ### Positioning and Sizing
27
27
 
28
28
  - **position** ('top' | 'right' | 'bottom' | 'left'): Edge from which the sheet slides (default: 'bottom')
29
- - **size** ('xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'): Predefined size options (default: 'md'). For **side sheets** (`left`/`right`) the width is **viewport-aware**: a pixel floor keeps the panel usable while the larger presets grow with the screen — `lg` occupies ≥32% and `xl` ≥40% of the viewport on wide screens — and every preset is capped at `92vw` so it never overflows a small screen. `full` is always 100%. Vertical sheets (`top`/`bottom`) use fixed heights.
30
- - **fullHeight** (boolean): Expand the sheet along its **cross axis** — side sheets become full-height (keeping the `size` width); top/bottom sheets become full-width (keeping the `size` height)
29
+ - **size** ('xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'): Predefined size options (default: 'md'). For **side sheets** (`left`/`right`) the width is **viewport-aware**: a pixel floor keeps the panel usable while the larger presets grow with the screen — `lg` occupies ≥32% and `xl` ≥40% of the viewport on wide screens — and every preset is capped at `92vw` so it never overflows a small screen. `full` is always 100%. For **vertical sheets** (`top`/`bottom`) the preset is a **height ceiling, not a height**: the panel is as tall as its content and starts scrolling only once that would pass the preset, so a short sheet no longer reserves the rest of it as dead space.
30
+ - **fullHeight** (boolean): Expand the sheet along its **cross axis** — side sheets become full-height (keeping the `size` width); top/bottom sheets become full-width (keeping the `size` height ceiling). `size="full"` is the separate case: it means the whole viewport on **both** axes, for every position.
31
+
32
+ A vertical sheet's **width** is one rule rather than one per preset: `min(100%, 640px)`, centred. Full-bleed is a handset layout, and on a desktop it stranded a sentence and a button in a 1900px panel; 640px is Material's own ceiling for a bottom sheet above the handset breakpoint, and below it `100%` gives the phone back exactly what it had. `fullHeight` is the opt-out where a top/bottom sheet really does want the whole width.
31
33
 
32
34
  ### Visual Variants
33
35
 
@@ -159,6 +159,10 @@ export const SheetContent: React.FC<SheetContentProps> = (props) => {
159
159
  <Box
160
160
  className={className}
161
161
  data-testid={dataTestId}
162
+ // No `minHeight: 0` here, deliberately: a flex item's automatic minimum
163
+ // size only applies while its main-axis `overflow` is `visible`, and this
164
+ // one is `auto`, so it already shrinks. `SheetBody` above is the item that
165
+ // needs it stated.
162
166
  sx={{ flex: 1, overflow: 'auto', p: padded ? 2 : 0, ...style }}
163
167
  >
164
168
  {children}
@@ -17,7 +17,7 @@ const isHorizontalPosition = (position: Position) => position === 'left' || posi
17
17
  * Horizontal (left/right) sheets are viewport-aware: a px floor keeps the panel
18
18
  * usable, `…vw` lets the larger presets grow on wide screens (lg ≥32%, xl ≥40%
19
19
  * of the viewport), and the outer `min(92vw, …)` guarantees the panel never
20
- * overflows a small screen. Vertical presets stay fixed-height.
20
+ * overflows a small screen.
21
21
  */
22
22
  const HORIZONTAL_SIZES: Record<Size, string> = {
23
23
  xs: 'min(92vw, 240px)',
@@ -28,20 +28,47 @@ const HORIZONTAL_SIZES: Record<Size, string> = {
28
28
  full: '100%',
29
29
  };
30
30
 
31
- const VERTICAL_SIZES: Record<Size, number | string> = {
32
- xs: 200,
33
- sm: 300,
34
- md: 400,
35
- lg: 500,
36
- xl: 600,
37
- full: '100%',
31
+ /**
32
+ * `size` governs a vertical sheet's MAIN axis, and it is a CEILING rather than
33
+ * a height: the panel is as tall as what it holds, and starts scrolling only
34
+ * once that would pass the preset.
35
+ *
36
+ * It was a fixed `height`, which meant a short sheet reserved the rest of the
37
+ * preset as dead space — a `md` sheet holding three lines and a button drew a
38
+ * 400px panel and floated them in it. `min(…, 100%)` keeps the ceiling under
39
+ * the viewport, which is also what MUI's own bottom paper asks for.
40
+ *
41
+ * `full` is absent on purpose: it is not a ceiling, it is the whole viewport,
42
+ * and `sizeStyles` answers it before it gets here.
43
+ */
44
+ const VERTICAL_SIZES: Record<Exclude<Size, 'full'>, string> = {
45
+ xs: 'min(200px, 100%)',
46
+ sm: 'min(300px, 100%)',
47
+ md: 'min(400px, 100%)',
48
+ lg: 'min(500px, 100%)',
49
+ xl: 'min(600px, 100%)',
38
50
  };
39
51
 
52
+ /**
53
+ * How wide a top/bottom sheet is allowed to get — its CROSS axis, so it is one
54
+ * rule rather than one per `size` preset.
55
+ *
56
+ * A bottom sheet spanning the full width is a phone layout, and it was the only
57
+ * layout this component had: on a desktop a panel holding a sentence and one
58
+ * button was drawn 1900px wide, with the content stranded in the middle of it.
59
+ * 640px is Material's own ceiling for a bottom sheet above the handset
60
+ * breakpoint, and below it `100%` gives the phone back exactly what it had.
61
+ *
62
+ * `fullHeight` is the documented opt-out — it expands a vertical sheet along
63
+ * this axis — and it becomes meaningful here for the first time: it used to
64
+ * name the behaviour every bottom sheet already had.
65
+ */
66
+ const VERTICAL_MAX_WIDTH = 'min(100%, 640px)';
67
+
40
68
  interface SizeStyleInput {
41
69
  position: Position;
42
70
  size: Size;
43
71
  isDraggableVariant: boolean;
44
- isVerticalSheet: boolean;
45
72
  currentHeight: number | null;
46
73
  }
47
74
 
@@ -49,18 +76,39 @@ const sizeStyles = ({
49
76
  position,
50
77
  size,
51
78
  isDraggableVariant,
52
- isVerticalSheet,
53
79
  currentHeight,
54
80
  }: SizeStyleInput) => {
81
+ if (isHorizontalPosition(position)) {
82
+ return { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md };
83
+ }
84
+
85
+ // `full` is not a size on the scale — it is THE WHOLE VIEWPORT, on both axes,
86
+ // and it has to stay that: a consumer using it for a phone takeover would
87
+ // otherwise get a content-hugging 640px card out of a catalog bump, with
88
+ // nothing in the API left to ask for what they had. So it is answered before
89
+ // either rule below touches it.
90
+ if (size === 'full') return { width: '100%', height: '100%' };
91
+
92
+ // The cross axis is the same rule whatever the preset, and the draggable
93
+ // variant needs it too — dragging moves the panel's height, never its width.
94
+ // `marginInline` is what centres it: MUI pins the bottom paper `left: 0;
95
+ // right: 0`, so a definite width plus auto margins resolves to the middle.
96
+ const cross = { width: VERTICAL_MAX_WIDTH, marginInline: 'auto' };
97
+
55
98
  // The draggable variant owns its own height: the snap point decides it, so a
56
99
  // preset would fight the drag.
57
- if (isDraggableVariant && isVerticalSheet && currentHeight !== null) {
58
- return { height: currentHeight };
100
+ if (isDraggableVariant && currentHeight !== null) {
101
+ return { ...cross, height: currentHeight };
59
102
  }
60
103
 
61
- return isHorizontalPosition(position)
62
- ? { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md }
63
- : { height: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md };
104
+ return {
105
+ ...cross,
106
+ // A CEILING, not a height — see `VERTICAL_SIZES`. `height: auto` is stated
107
+ // rather than left off so the rule survives a caller who set a height on a
108
+ // previous render, and it is what lets the panel hug what it holds.
109
+ height: 'auto',
110
+ maxHeight: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md,
111
+ };
64
112
  };
65
113
 
66
114
  /** `r, g, b` for a hex colour, so it can feed an `rgba(var(--x), a)` custom property. */
@@ -244,10 +292,22 @@ export const panelSx = (input: PanelSxInput): CSSObject => {
244
292
  input;
245
293
 
246
294
  return {
247
- ...sizeStyles({ position, size, isDraggableVariant, isVerticalSheet, currentHeight }),
295
+ // The DEFAULT, so the glow and the elevated shadow are not clipped by the
296
+ // panel they hang off. It used to be stated last, which made it a rule
297
+ // nothing could override — including `gradient`, whose own `overflow:
298
+ // hidden` is what keeps its shimmer inside the panel. That was invisible
299
+ // while every vertical sheet was full-bleed, because the sweep starts at
300
+ // `left: -100%` and a full-width panel put it off-screen; a 640px one puts
301
+ // it on the backdrop beside the sheet.
302
+ overflow: 'visible',
303
+ ...sizeStyles({ position, size, isDraggableVariant, currentHeight }),
304
+ // A COLUMN, so `maxHeight` above can be a ceiling rather than a height: the
305
+ // body is then a flex item that shrinks against it, and the scrolling falls
306
+ // to `SheetContent` where it belongs. Without this the panel would clip a
307
+ // long sheet instead of scrolling it.
308
+ ...(isVerticalSheet ? { display: 'flex', flexDirection: 'column' } : {}),
248
309
  ...variantStyles(input),
249
310
  ...style,
250
- overflow: 'visible',
251
311
  // Expand only the cross axis so the chosen `size` still governs the main
252
312
  // axis: side sheets keep their (responsive) width and go full-height;
253
313
  // top/bottom sheets keep their height and go full-width.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport type React from 'react';\n\nimport { glowAnimation, pulseAnimation, shimmerAnimation } from './Sheet.animations';\nimport type { SheetProps } from './Sheet.types';\nimport { accentFor } from '../../../tokens/scales';\n\ntype Position = NonNullable<SheetProps['position']>;\ntype Variant = NonNullable<SheetProps['variant']>;\ntype Size = NonNullable<SheetProps['size']>;\ntype Color = NonNullable<SheetProps['color']>;\n\nconst isHorizontalPosition = (position: Position) => position === 'left' || position === 'right';\n\n/**\n * Horizontal (left/right) sheets are viewport-aware: a px floor keeps the panel\n * usable, `…vw` lets the larger presets grow on wide screens (lg ≥32%, xl ≥40%\n * of the viewport), and the outer `min(92vw, …)` guarantees the panel never\n * overflows a small screen. Vertical presets stay fixed-height.\n */\nconst HORIZONTAL_SIZES: Record<Size, string> = {\n xs: 'min(92vw, 240px)',\n sm: 'min(92vw, 320px)',\n md: 'min(92vw, 400px)',\n lg: 'min(92vw, max(560px, 32vw))',\n xl: 'min(92vw, max(720px, 40vw))',\n full: '100%',\n};\n\nconst VERTICAL_SIZES: Record<Size, number | string> = {\n xs: 200,\n sm: 300,\n md: 400,\n lg: 500,\n xl: 600,\n full: '100%',\n};\n\ninterface SizeStyleInput {\n position: Position;\n size: Size;\n isDraggableVariant: boolean;\n isVerticalSheet: boolean;\n currentHeight: number | null;\n}\n\nconst sizeStyles = ({\n position,\n size,\n isDraggableVariant,\n isVerticalSheet,\n currentHeight,\n}: SizeStyleInput) => {\n // The draggable variant owns its own height: the snap point decides it, so a\n // preset would fight the drag.\n if (isDraggableVariant && isVerticalSheet && currentHeight !== null) {\n return { height: currentHeight };\n }\n\n return isHorizontalPosition(position)\n ? { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md }\n : { height: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md };\n};\n\n/** `r, g, b` for a hex colour, so it can feed an `rgba(var(--x), a)` custom property. */\nconst toRgbTriplet = (hexColor: string) => {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `${r}, ${g}, ${b}`;\n};\n\nconst roundedStyles = (theme: Theme, position: Position) => {\n const radius = theme.spacing(2);\n const byPosition: Record<Position, string> = {\n top: `0 0 ${radius} ${radius}`,\n bottom: `${radius} ${radius} 0 0`,\n left: `0 ${radius} ${radius} 0`,\n right: `${radius} 0 0 ${radius}`,\n };\n return { borderRadius: byPosition[position] };\n};\n\ninterface VariantStyleInput {\n theme: Theme;\n variant: Variant;\n color: Color;\n position: Position;\n elevation: number;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n rounded: boolean;\n disabled: boolean;\n isDragging: boolean;\n isAnimating: boolean;\n isDraggableVariant: boolean;\n isVerticalSheet: boolean;\n}\n\ntype SurfaceInput = VariantStyleInput & { accent: string };\n\n/**\n * Each variant's own additions to the shared surface — never the shared part\n * itself. Every arm of the old switch re-spread the same base, glow, pulse and\n * rounded objects before adding these few rules; `variantStyles` applies that\n * prefix once and lets the table hold only what actually differs.\n */\nconst SURFACES: Record<Variant, (input: SurfaceInput) => Record<string, unknown>> = {\n draggable: ({ theme, elevation, accent }) => ({\n boxShadow: `\n ${theme.shadows[Math.min(elevation + 4, 24)]},\n 0 -2px 10px 0 ${alpha(theme.palette.common.black, 0.1)}\n `,\n border: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n borderTop: `2px solid ${alpha(accent, 0.3)}`,\n transition: theme.transitions.create(['transform', 'box-shadow', 'border-color'], {\n duration: theme.transitions.duration.shorter,\n easing: theme.transitions.easing.easeInOut,\n }),\n '&:hover': { borderTopColor: alpha(accent, 0.5) },\n }),\n\n glass: ({ theme, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.75 : 0.95),\n backdropFilter: 'blur(24px) saturate(180%)',\n WebkitBackdropFilter: 'blur(24px) saturate(180%)',\n border: `1px solid ${alpha(theme.palette.divider, 0.15)}`,\n boxShadow: `\n 0 8px 32px 0 ${alpha(theme.palette.common.black, 0.15)},\n inset 0 0 0 1px ${alpha(theme.palette.common.white, 0.1)}\n `,\n }),\n\n gradient: ({ theme, color, gradient, accent }) => ({\n background: gradient\n ? `linear-gradient(\n 135deg,\n ${theme.palette.background.paper} 0%,\n ${alpha(accent, 0.08)} 50%,\n ${alpha(accentFor(theme, color)?.dark || accent, 0.12)} 100%\n )`\n : theme.palette.background.paper,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n '&::before': gradient ? shimmerOverlay(theme) : {},\n }),\n\n elevated: ({ theme, elevation }) => ({\n boxShadow: `\n ${theme.shadows[elevation]},\n 0 20px 40px -15px ${alpha(theme.palette.common.black, 0.15)}\n `,\n transform: 'translateZ(0)',\n willChange: 'transform',\n }),\n\n minimal: () => ({ boxShadow: 'none', border: 'none' }),\n\n default: () => ({}),\n};\n\n/** The sweep of light the gradient variant runs across itself. */\nconst shimmerOverlay = (theme: Theme) => ({\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '-100%',\n width: '100%',\n height: '100%',\n background: `linear-gradient(\n 90deg,\n transparent,\n ${alpha(theme.palette.common.white, 0.2)},\n transparent\n )`,\n animation: `${shimmerAnimation} 3s infinite`,\n});\n\n/**\n * The parts of the surface that do not depend on the variant: the paper colour,\n * the transition suppression while a drag or spring is driving the panel, the\n * disabled and cursor states, and the two colour custom properties the glow and\n * pulse keyframes read.\n */\nconst baseSurface = (input: VariantStyleInput, accent: string) => {\n const { theme, disabled, isDragging, isAnimating, isDraggableVariant, isVerticalSheet } = input;\n const colorRgb = toRgbTriplet(accent);\n\n return {\n backgroundColor: theme.palette.background.paper,\n // A transition would fight the per-frame height writes while a drag or a\n // snap animation is driving the panel.\n transition:\n !isDragging && !isAnimating\n ? theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n easing: theme.transitions.easing.easeInOut,\n })\n : 'none',\n opacity: disabled ? 0.5 : 1,\n pointerEvents: disabled ? ('none' as const) : ('auto' as const),\n cursor: isDraggableVariant && isVerticalSheet ? 'grab' : 'auto',\n '--pulse-color': colorRgb,\n '--glow-color': colorRgb,\n ...(isDragging && { cursor: 'grabbing' }),\n };\n};\n\nconst variantStyles = (input: VariantStyleInput) => {\n const { theme, variant, color, position, glow, pulse, rounded } = input;\n const accent = accentFor(theme, color)?.main || theme.palette.primary.main;\n\n return {\n ...baseSurface(input, accent),\n // glow first, then pulse: with both set the pulse keyframes win the shared\n // `animation` slot, which is the order the original spread produced.\n ...(glow && { animation: `${glowAnimation} 2s ease-in-out infinite`, filter: 'brightness(1.05)' }),\n ...(pulse && { animation: `${pulseAnimation} 2s infinite`, position: 'relative' as const }),\n ...(rounded && roundedStyles(theme, position)),\n ...(SURFACES[variant] ?? SURFACES.default)({ ...input, accent }),\n };\n};\n\ninterface PanelSxInput extends VariantStyleInput {\n size: Size;\n currentHeight: number | null;\n fullHeight: boolean;\n style?: React.CSSProperties;\n}\n\n/**\n * The drawer paper's complete `sx`: its size, its variant surface, the caller's\n * own `style`, and the full-height rule.\n *\n * Built here rather than in the component so the component holds no style\n * branches of its own — the cross-axis rule below is four on its own.\n */\nexport const panelSx = (input: PanelSxInput): CSSObject => {\n const { position, size, isDraggableVariant, isVerticalSheet, currentHeight, fullHeight, style } =\n input;\n\n return {\n ...sizeStyles({ position, size, isDraggableVariant, isVerticalSheet, currentHeight }),\n ...variantStyles(input),\n ...style,\n overflow: 'visible',\n // Expand only the cross axis so the chosen `size` still governs the main\n // axis: side sheets keep their (responsive) width and go full-height;\n // top/bottom sheets keep their height and go full-width.\n ...(fullHeight &&\n !isDraggableVariant &&\n (isHorizontalPosition(position) ? { height: '100%' } : { width: '100%' })),\n };\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.body.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport React from 'react';\n\nimport { SheetContent, SheetFooter, SheetHeader } from './Sheet.parts';\nimport type { SheetProps } from './Sheet.types';\nimport { muiColor } from '../../../tokens/scales';\n\nexport interface SheetBodyProps extends Pick<\n SheetProps,\n | 'title'\n | 'description'\n | 'showCloseButton'\n | 'showHandle'\n | 'header'\n | 'footer'\n | 'loading'\n | 'color'\n | 'children'\n | 'onClick'\n | 'onFocus'\n | 'onBlur'\n> {\n testId: string;\n isDragging: boolean;\n isVerticalSheet: boolean;\n isDraggableVariant: boolean;\n onClose: () => void;\n onDragStart: (e: React.MouseEvent | React.TouchEvent) => void;\n}\n\n/**\n * The header earns its place if it would show anything at all — a grab handle,\n * either piece of text, the close button, or caller-supplied content.\n */\nconst needsHeader = (props: SheetBodyProps) =>\n Boolean(\n props.showHandle ||\n props.title ||\n props.description ||\n props.showCloseButton ||\n props.header,\n );\n\n/** The centred spinner shown in place of the children while `loading`. */\nconst SheetLoading: React.FC<Pick<SheetBodyProps, 'color'>> = ({ color }) => (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 200,\n }}\n >\n <CircularProgress color={color === undefined ? undefined : muiColor(color, 'inherit')} />\n </Box>\n);\n\n/**\n * What the sheet contains, independent of which drawer is carrying it. The\n * swipeable and plain branches render exactly this — they differ only in the\n * MUI component and its swipe props, so the contents are built once.\n */\nexport const SheetBody: React.FC<SheetBodyProps> = (props) => {\n const {\n title,\n description,\n showCloseButton,\n showHandle,\n header,\n footer,\n loading,\n color,\n children,\n onClick,\n onFocus,\n onBlur,\n testId,\n isDragging,\n isVerticalSheet,\n isDraggableVariant,\n onClose,\n onDragStart,\n } = props;\n\n return (\n <Box\n onClick={onClick}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={testId}\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n userSelect: isDragging ? 'none' : 'auto',\n }}\n >\n {needsHeader(props) && (\n <SheetHeader\n title={title}\n description={description}\n showCloseButton={showCloseButton}\n onClose={onClose}\n showHandle={showHandle && isVerticalSheet}\n isDraggable={isDraggableVariant && isVerticalSheet}\n onDragStart={onDragStart}\n dataTestId={`${testId}-header`}\n >\n {header}\n </SheetHeader>\n )}\n\n <SheetContent padded dataTestId={`${testId}-content`}>\n {loading ? <SheetLoading color={color} /> : children}\n </SheetContent>\n\n {footer && (\n <SheetFooter sticky divider dataTestId={`${testId}-footer`}>\n {footer}\n </SheetFooter>\n )}\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,sBAAsB;AAqDzB,cAgCA,YAhCA;AAnBJ,IAAM,cAAc,CAAC,UACnB;AAAA,EACE,MAAM,cACN,MAAM,SACN,MAAM,eACN,MAAM,mBACN,MAAM;AACR;AAGF,IAAM,eAAwD,CAAC,EAAE,MAAM,MACrE;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IAEA,8BAAC,oBAAiB,OAAO,UAAU,SAAY,SAAY,SAAS,OAAO,SAAS,GAAG;AAAA;AACzF;AAQK,IAAM,YAAsC,CAAC,UAAU;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,YAAY,aAAa,SAAS;AAAA,MACpC;AAAA,MAEC;AAAA,oBAAY,KAAK,KAChB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,cAAc;AAAA,YAC1B,aAAa,sBAAsB;AAAA,YACnC;AAAA,YACA,YAAY,GAAG,MAAM;AAAA,YAEpB;AAAA;AAAA,QACH;AAAA,QAGF,oBAAC,gBAAa,QAAM,MAAC,YAAY,GAAG,MAAM,YACvC,oBAAU,oBAAC,gBAAa,OAAc,IAAK,UAC9C;AAAA,QAEC,UACC,oBAAC,eAAY,QAAM,MAAC,SAAO,MAAC,YAAY,GAAG,MAAM,WAC9C,kBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Sheet/Sheet.parts.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport Backdrop from '@mui/material/Backdrop/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { shimmerAnimation } from './Sheet.animations';\nimport type {\n SheetContentProps,\n SheetFooterProps,\n SheetHeaderProps,\n SheetOverlayProps,\n} from './Sheet.types';\n\n/**\n * The grab handle's own styling. A draggable handle is deliberately larger and\n * tinted, so the affordance reads as draggable before the user tries it; a\n * decorative one stays a neutral bar.\n */\nconst handleSx = (theme: Theme, isDraggable: boolean) => ({\n width: isDraggable ? 48 : 32,\n height: isDraggable ? 6 : 4,\n backgroundColor: alpha(theme.palette.text.primary, 0.3),\n borderRadius: 3,\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.short,\n easing: theme.transitions.easing.easeInOut,\n }),\n position: 'relative',\n overflow: 'hidden',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '-100%',\n width: '100%',\n height: '100%',\n background: `linear-gradient(\n 90deg,\n transparent,\n ${alpha(theme.palette.common.white, 0.3)},\n transparent\n )`,\n animation: isDraggable ? `${shimmerAnimation} 2s infinite` : 'none',\n },\n ...(isDraggable && {\n backgroundColor: alpha(theme.palette.primary.main, 0.4),\n boxShadow: `0 2px 4px ${alpha(theme.palette.primary.main, 0.2)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n transform: 'scaleX(1.15) scaleY(1.2)',\n boxShadow: `0 3px 6px ${alpha(theme.palette.primary.main, 0.3)}`,\n },\n }),\n});\n\nconst SheetHandle: React.FC<{ isDraggable: boolean }> = ({ isDraggable }) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n mb: 1,\n // The handle is decoration on a draggable header: the drag listeners sit\n // on the header itself, so letting the bar swallow the press would open\n // a dead zone in the middle of the grab target.\n pointerEvents: isDraggable ? 'none' : 'auto',\n }}\n >\n <Box sx={handleSx(theme, isDraggable)} />\n </Box>\n );\n};\n\nconst HEADER_DEFAULTS: Partial<SheetHeaderProps> = {\n isDraggable: false,\n dataTestId: 'sheet-header',\n};\n\nexport const SheetHeader: React.FC<SheetHeaderProps> = (props) => {\n const {\n title,\n description,\n showCloseButton,\n onClose,\n showHandle,\n isDraggable,\n onDragStart,\n className,\n style,\n children,\n dataTestId,\n } = withDefaults(props, HEADER_DEFAULTS);\n\n return (\n <Box\n className={className}\n data-testid={dataTestId}\n sx={{\n p: 2,\n pb: showHandle ? 1 : 2,\n cursor: isDraggable ? 'grab' : 'auto',\n '&:active': isDraggable ? { cursor: 'grabbing' } : {},\n ...style,\n }}\n onMouseDown={isDraggable ? onDragStart : undefined}\n onTouchStart={isDraggable ? onDragStart : undefined}\n >\n {showHandle && <SheetHandle isDraggable={Boolean(isDraggable)} />}\n\n <Box sx={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between' }}>\n <Box sx={{ flex: 1 }}>\n {title && (\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }} data-testid={`${dataTestId}-title`}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {description}\n </Typography>\n )}\n {children}\n </Box>\n\n {showCloseButton && (\n <IconButton\n onClick={onClose}\n size=\"small\"\n sx={{ ml: 1, mt: -0.5 }}\n data-testid={`${dataTestId}-close-button`}\n >\n <CloseIcon data-testid={`${dataTestId}-close-icon`} />\n </IconButton>\n )}\n </Box>\n </Box>\n );\n};\n\nconst CONTENT_DEFAULTS: Partial<SheetContentProps> = {\n padded: true,\n dataTestId: 'sheet-content',\n};\n\nexport const SheetContent: React.FC<SheetContentProps> = (props) => {\n const { children, className, style, padded, dataTestId } = withDefaults(props, CONTENT_DEFAULTS);\n\n return (\n <Box\n className={className}\n data-testid={dataTestId}\n sx={{ flex: 1, overflow: 'auto', p: padded ? 2 : 0, ...style }}\n >\n {children}\n </Box>\n );\n};\n\nconst FOOTER_DEFAULTS: Partial<SheetFooterProps> = {\n sticky: false,\n divider: false,\n dataTestId: 'sheet-footer',\n};\n\nexport const SheetFooter: React.FC<SheetFooterProps> = (props) => {\n const { children, className, style, sticky, divider, dataTestId } = withDefaults(\n props,\n FOOTER_DEFAULTS,\n );\n\n return (\n <>\n {divider && <Divider />}\n <Box\n className={className}\n data-testid={dataTestId}\n sx={{\n p: 2,\n position: sticky ? 'sticky' : 'relative',\n bottom: sticky ? 0 : 'auto',\n backgroundColor: 'background.paper',\n borderTop: sticky ? '1px solid' : 'none',\n borderColor: 'divider',\n ...style,\n }}\n >\n {children}\n </Box>\n </>\n );\n};\n\nconst OVERLAY_DEFAULTS: Partial<SheetOverlayProps> = {\n open: false,\n blur: false,\n};\n\nexport const SheetOverlay: React.FC<SheetOverlayProps> = (props) => {\n const { open, onClick, className, style, blur } = withDefaults(props, OVERLAY_DEFAULTS);\n const theme = useTheme();\n\n return (\n <Fade in={open} timeout={300}>\n <Backdrop\n open={Boolean(open)}\n onClick={onClick}\n className={className}\n sx={{\n // One below the drawer: this backdrop replaces MUI's own (the drawer\n // is given a no-op BackdropComponent) and must sit under the panel.\n zIndex: theme.zIndex.drawer - 1,\n backgroundColor: alpha(theme.palette.common.black, blur ? 0.6 : 0.5),\n backdropFilter: blur ? 'blur(8px) saturate(180%)' : 'none',\n WebkitBackdropFilter: blur ? 'blur(8px) saturate(180%)' : 'none',\n ...style,\n }}\n />\n </Fade>\n );\n};\n"],"mappings":"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","names":[]}