@kushagradhawan/kookie-ui 0.1.32 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components.css +937 -458
- package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
- package/dist/cjs/components/_internal/base-button.js +1 -1
- package/dist/cjs/components/_internal/base-button.js.map +3 -3
- package/dist/cjs/components/chatbar.d.ts +202 -0
- package/dist/cjs/components/chatbar.d.ts.map +1 -0
- package/dist/cjs/components/chatbar.js +2 -0
- package/dist/cjs/components/chatbar.js.map +7 -0
- package/dist/cjs/components/icon-button.d.ts.map +1 -1
- package/dist/cjs/components/icon-button.js +2 -2
- package/dist/cjs/components/icon-button.js.map +3 -3
- package/dist/cjs/components/icons.d.ts +6 -1
- package/dist/cjs/components/icons.d.ts.map +1 -1
- package/dist/cjs/components/icons.js +1 -1
- package/dist/cjs/components/icons.js.map +3 -3
- package/dist/cjs/components/index.d.ts +3 -0
- package/dist/cjs/components/index.d.ts.map +1 -1
- package/dist/cjs/components/index.js +1 -1
- package/dist/cjs/components/index.js.map +3 -3
- package/dist/cjs/components/popover.d.ts +13 -1
- package/dist/cjs/components/popover.d.ts.map +1 -1
- package/dist/cjs/components/popover.js +1 -1
- package/dist/cjs/components/popover.js.map +3 -3
- package/dist/cjs/components/sheet.d.ts +82 -0
- package/dist/cjs/components/sheet.d.ts.map +1 -0
- package/dist/cjs/components/sheet.js +2 -0
- package/dist/cjs/components/sheet.js.map +7 -0
- package/dist/cjs/components/shell.d.ts +180 -0
- package/dist/cjs/components/shell.d.ts.map +1 -0
- package/dist/cjs/components/shell.js +2 -0
- package/dist/cjs/components/shell.js.map +7 -0
- package/dist/cjs/components/sidebar.d.ts +4 -33
- package/dist/cjs/components/sidebar.d.ts.map +1 -1
- package/dist/cjs/components/sidebar.js +1 -1
- package/dist/cjs/components/sidebar.js.map +3 -3
- package/dist/cjs/components/skeleton.d.ts.map +1 -1
- package/dist/cjs/components/skeleton.js +1 -1
- package/dist/cjs/components/skeleton.js.map +2 -2
- package/dist/cjs/helpers/inert.d.ts +1 -1
- package/dist/cjs/helpers/inert.d.ts.map +1 -1
- package/dist/cjs/helpers/inert.js +1 -1
- package/dist/cjs/helpers/inert.js.map +2 -2
- package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
- package/dist/esm/components/_internal/base-button.js +1 -1
- package/dist/esm/components/_internal/base-button.js.map +3 -3
- package/dist/esm/components/chatbar.d.ts +202 -0
- package/dist/esm/components/chatbar.d.ts.map +1 -0
- package/dist/esm/components/chatbar.js +2 -0
- package/dist/esm/components/chatbar.js.map +7 -0
- package/dist/esm/components/icon-button.d.ts.map +1 -1
- package/dist/esm/components/icon-button.js +2 -2
- package/dist/esm/components/icon-button.js.map +3 -3
- package/dist/esm/components/icons.d.ts +6 -1
- package/dist/esm/components/icons.d.ts.map +1 -1
- package/dist/esm/components/icons.js +1 -1
- package/dist/esm/components/icons.js.map +3 -3
- package/dist/esm/components/index.d.ts +3 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -1
- package/dist/esm/components/index.js.map +3 -3
- package/dist/esm/components/popover.d.ts +13 -1
- package/dist/esm/components/popover.d.ts.map +1 -1
- package/dist/esm/components/popover.js +1 -1
- package/dist/esm/components/popover.js.map +3 -3
- package/dist/esm/components/sheet.d.ts +82 -0
- package/dist/esm/components/sheet.d.ts.map +1 -0
- package/dist/esm/components/sheet.js +2 -0
- package/dist/esm/components/sheet.js.map +7 -0
- package/dist/esm/components/shell.d.ts +180 -0
- package/dist/esm/components/shell.d.ts.map +1 -0
- package/dist/esm/components/shell.js +2 -0
- package/dist/esm/components/shell.js.map +7 -0
- package/dist/esm/components/sidebar.d.ts +4 -33
- package/dist/esm/components/sidebar.d.ts.map +1 -1
- package/dist/esm/components/sidebar.js +1 -1
- package/dist/esm/components/sidebar.js.map +3 -3
- package/dist/esm/components/skeleton.d.ts.map +1 -1
- package/dist/esm/components/skeleton.js.map +2 -2
- package/dist/esm/helpers/inert.d.ts +1 -1
- package/dist/esm/helpers/inert.d.ts.map +1 -1
- package/dist/esm/helpers/inert.js +1 -1
- package/dist/esm/helpers/inert.js.map +2 -2
- package/package.json +2 -1
- package/src/components/_internal/base-button.tsx +8 -0
- package/src/components/_internal/base-card.css +18 -18
- package/src/components/_internal/base-dialog.css +11 -49
- package/src/components/_internal/base-menu.css +2 -2
- package/src/components/_internal/base-sidebar-menu.css +3 -3
- package/src/components/accordion.css +6 -6
- package/src/components/animations.css +65 -81
- package/src/components/callout.css +3 -3
- package/src/components/chatbar.css +214 -0
- package/src/components/chatbar.tsx +1181 -0
- package/src/components/icon-button.tsx +11 -0
- package/src/components/icons.tsx +97 -2
- package/src/components/image.css +3 -3
- package/src/components/index.css +3 -0
- package/src/components/index.tsx +3 -0
- package/src/components/popover.css +53 -8
- package/src/components/popover.tsx +180 -2
- package/src/components/scroll-area.css +3 -3
- package/src/components/segmented-control.css +3 -3
- package/src/components/sheet.css +90 -0
- package/src/components/sheet.tsx +247 -0
- package/src/components/shell.css +137 -0
- package/src/components/shell.tsx +1032 -0
- package/src/components/sidebar.css +55 -268
- package/src/components/sidebar.tsx +40 -262
- package/src/components/skeleton.tsx +1 -2
- package/src/components/text-area.css +6 -5
- package/src/components/tooltip.css +2 -2
- package/src/helpers/inert.ts +3 -3
- package/src/styles/tokens/constants.css +6 -3
- package/src/styles/tokens/index.css +1 -0
- package/src/styles/tokens/radius.css +7 -2
- package/src/styles/tokens/space.css +6 -0
- package/src/styles/tokens/transition.css +91 -46
- package/styles.css +998 -496
- package/tokens/base.css +57 -35
- package/tokens.css +61 -38
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sheet
|
|
5
|
+
*
|
|
6
|
+
* A side-placed overlay built on top of Radix Dialog. It inherits accessibility,
|
|
7
|
+
* focus management, overlay behavior, and sizing scales from the base dialog, and
|
|
8
|
+
* adds side placement and slide motion suited for navigation panels and drawers.
|
|
9
|
+
*
|
|
10
|
+
* Structure mirrors Dialog:
|
|
11
|
+
* - Root, Trigger, Content, Title, Description, Close
|
|
12
|
+
*
|
|
13
|
+
* Notes
|
|
14
|
+
* - Side: set with `side` on `Sheet.Content`. Aliases: `left` → `start`, `right` → `end`.
|
|
15
|
+
* - Sizing: reuses Dialog content prop defs (width/min/max/height/size). Default Dialog
|
|
16
|
+
* maxWidth clamping is removed for Sheets.
|
|
17
|
+
* - Material: use `material` (solid | translucent). Deprecated `panelBackground` falls back
|
|
18
|
+
* in dev with a warning.
|
|
19
|
+
* - A11y: provide an accessible name via `Sheet.Title` or `aria-label` on `Sheet.Content`.
|
|
20
|
+
*
|
|
21
|
+
* Example
|
|
22
|
+
* <Sheet.Root>
|
|
23
|
+
* <Sheet.Trigger>
|
|
24
|
+
* <Button>Open</Button>
|
|
25
|
+
* </Sheet.Trigger>
|
|
26
|
+
* <Sheet.Content side="end" width={{ initial: '280px', md: '360px' }}>
|
|
27
|
+
* <Sheet.Title>Details</Sheet.Title>
|
|
28
|
+
* ...
|
|
29
|
+
* <Sheet.Close>
|
|
30
|
+
* <Button>Close</Button>
|
|
31
|
+
* </Sheet.Close>
|
|
32
|
+
* </Sheet.Content>
|
|
33
|
+
* </Sheet.Root>
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import * as React from 'react';
|
|
37
|
+
import classNames from 'classnames';
|
|
38
|
+
import { Dialog as DialogPrimitive } from 'radix-ui';
|
|
39
|
+
|
|
40
|
+
import { dialogContentPropDefs } from './dialog.props.js';
|
|
41
|
+
import type { DialogContentOwnProps } from './dialog.props.js';
|
|
42
|
+
import { Theme } from './theme.js';
|
|
43
|
+
import { extractProps } from '../helpers/extract-props.js';
|
|
44
|
+
import { requireReactElement } from '../helpers/require-react-element.js';
|
|
45
|
+
|
|
46
|
+
import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Supported sides for the Sheet.
|
|
50
|
+
* Aliases are normalized RTL-aware: `left` → `start`, `right` → `end`.
|
|
51
|
+
*/
|
|
52
|
+
type SheetSide = 'start' | 'end' | 'top' | 'bottom' | 'left' | 'right';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Sheet is a side-placed overlay built on the Dialog primitive.
|
|
56
|
+
* It reuses Dialog's accessibility, focus, overlay, and size scales, while adding side placement and slide motion.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
// Root
|
|
60
|
+
/**
|
|
61
|
+
* Props for `Sheet.Root` (Radix Dialog root with `modal` forced on).
|
|
62
|
+
*/
|
|
63
|
+
interface SheetRootProps extends ComponentPropsWithout<typeof DialogPrimitive.Root, 'modal'> {}
|
|
64
|
+
const Root: React.FC<SheetRootProps> = (props) => <DialogPrimitive.Root {...props} modal />;
|
|
65
|
+
Root.displayName = 'Sheet.Root';
|
|
66
|
+
|
|
67
|
+
// Trigger
|
|
68
|
+
/** Element type for `Sheet.Trigger`. */
|
|
69
|
+
type SheetTriggerElement = React.ElementRef<typeof DialogPrimitive.Trigger>;
|
|
70
|
+
/** Props for `Sheet.Trigger` (expects a single element child). */
|
|
71
|
+
interface SheetTriggerProps
|
|
72
|
+
extends ComponentPropsWithout<typeof DialogPrimitive.Trigger, RemovedProps> {}
|
|
73
|
+
const Trigger = React.forwardRef<SheetTriggerElement, SheetTriggerProps>(
|
|
74
|
+
({ children, ...props }, ref) => (
|
|
75
|
+
<DialogPrimitive.Trigger {...props} ref={ref} asChild>
|
|
76
|
+
{requireReactElement(children)}
|
|
77
|
+
</DialogPrimitive.Trigger>
|
|
78
|
+
),
|
|
79
|
+
);
|
|
80
|
+
Trigger.displayName = 'Sheet.Trigger';
|
|
81
|
+
|
|
82
|
+
// Content
|
|
83
|
+
/** Element type for `Sheet.Content`. */
|
|
84
|
+
type SheetContentElement = React.ElementRef<typeof DialogPrimitive.Content>;
|
|
85
|
+
interface SheetContentProps
|
|
86
|
+
extends ComponentPropsWithout<typeof DialogPrimitive.Content, RemovedProps>,
|
|
87
|
+
DialogContentOwnProps {
|
|
88
|
+
/** Side where the Sheet should appear. `left`/`right` alias to `start`/`end`. */
|
|
89
|
+
side?: SheetSide;
|
|
90
|
+
/** Optional DOM container to portal into. Defaults to `document.body`. */
|
|
91
|
+
container?: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>['container'];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Renders the Sheet panel. Normalizes left/right to logical start/end and
|
|
96
|
+
* forwards dialog sizing props. Provide an accessible name via `Sheet.Title`
|
|
97
|
+
* or `aria-label`.
|
|
98
|
+
*/
|
|
99
|
+
const Content = React.forwardRef<SheetContentElement, SheetContentProps>(
|
|
100
|
+
(allProps, forwardedRef) => {
|
|
101
|
+
const {
|
|
102
|
+
side = 'start',
|
|
103
|
+
forceMount,
|
|
104
|
+
container,
|
|
105
|
+
className,
|
|
106
|
+
panelBackground: panelBackgroundProp,
|
|
107
|
+
material: materialProp,
|
|
108
|
+
...restProps
|
|
109
|
+
} = allProps;
|
|
110
|
+
const normalizedSideMap: Record<SheetSide, 'start' | 'end' | 'top' | 'bottom'> = {
|
|
111
|
+
left: 'start',
|
|
112
|
+
right: 'end',
|
|
113
|
+
start: 'start',
|
|
114
|
+
end: 'end',
|
|
115
|
+
top: 'top',
|
|
116
|
+
bottom: 'bottom',
|
|
117
|
+
};
|
|
118
|
+
const normalizedSide = normalizedSideMap[side];
|
|
119
|
+
// Reuse dialog content prop defs for size/width/height tokens, but handle
|
|
120
|
+
// material/panelBackground explicitly to avoid forwarding unknown DOM props.
|
|
121
|
+
const {
|
|
122
|
+
align: _alignPropDef,
|
|
123
|
+
panelBackground: panelBackgroundPropDef,
|
|
124
|
+
material: materialPropDef,
|
|
125
|
+
...propDefs
|
|
126
|
+
} = dialogContentPropDefs;
|
|
127
|
+
|
|
128
|
+
// Extract panelBackground and material together (remove from DOM props)
|
|
129
|
+
const { panelBackground: resolvedPanelBackground, material: resolvedMaterial } = extractProps(
|
|
130
|
+
{ panelBackground: panelBackgroundProp, material: materialProp },
|
|
131
|
+
{ panelBackground: panelBackgroundPropDef, material: materialPropDef },
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const materialValue = React.useMemo(() => {
|
|
135
|
+
if (resolvedMaterial !== undefined) {
|
|
136
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
137
|
+
console.warn(
|
|
138
|
+
'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return resolvedMaterial ?? resolvedPanelBackground;
|
|
143
|
+
}, [resolvedMaterial, resolvedPanelBackground]);
|
|
144
|
+
|
|
145
|
+
// Now extract remaining props using dialog defs so size/width/height classnames are applied
|
|
146
|
+
// Override dialog's default maxWidth (600px) to avoid clamping Sheet by default
|
|
147
|
+
// Match dialog.tsx: extract once and avoid leaking panel/material
|
|
148
|
+
const { default: _mwDefault, ...maxWidthWithoutDefault } = propDefs.maxWidth;
|
|
149
|
+
const sheetPropDefs = {
|
|
150
|
+
...propDefs,
|
|
151
|
+
maxWidth: maxWidthWithoutDefault,
|
|
152
|
+
} as typeof propDefs;
|
|
153
|
+
const { className: extractedClassName, ...contentProps } = extractProps(
|
|
154
|
+
restProps,
|
|
155
|
+
sheetPropDefs,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Dev-only a11y guard: ensure label is provided via Title or aria-label
|
|
159
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
160
|
+
const children = (contentProps as any).children as React.ReactNode;
|
|
161
|
+
const hasAriaLabel = typeof (contentProps as any)['aria-label'] === 'string';
|
|
162
|
+
let hasTitle = false;
|
|
163
|
+
if (children) {
|
|
164
|
+
for (const child of React.Children.toArray(children)) {
|
|
165
|
+
if (React.isValidElement(child) && child.type === Title) {
|
|
166
|
+
hasTitle = true;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (!hasTitle && !hasAriaLabel) {
|
|
172
|
+
console.warn(
|
|
173
|
+
'Sheet.Content: Missing accessible name. Include Sheet.Title as a child or provide aria-label.',
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
<DialogPrimitive.Portal container={container} forceMount={forceMount}>
|
|
180
|
+
<Theme asChild>
|
|
181
|
+
<DialogPrimitive.Overlay className="rt-BaseDialogOverlay rt-DialogOverlay rt-SheetOverlay">
|
|
182
|
+
<DialogPrimitive.Content
|
|
183
|
+
{...contentProps}
|
|
184
|
+
ref={forwardedRef}
|
|
185
|
+
className={classNames(
|
|
186
|
+
'rt-BaseDialogContent',
|
|
187
|
+
'rt-SheetContent',
|
|
188
|
+
className,
|
|
189
|
+
extractedClassName,
|
|
190
|
+
)}
|
|
191
|
+
data-side={normalizedSide}
|
|
192
|
+
data-material={materialValue}
|
|
193
|
+
data-panel-background={materialValue}
|
|
194
|
+
/>
|
|
195
|
+
</DialogPrimitive.Overlay>
|
|
196
|
+
</Theme>
|
|
197
|
+
</DialogPrimitive.Portal>
|
|
198
|
+
);
|
|
199
|
+
},
|
|
200
|
+
);
|
|
201
|
+
Content.displayName = 'Sheet.Content';
|
|
202
|
+
|
|
203
|
+
// Title/Description/Close re-export
|
|
204
|
+
type SheetTitleElement = React.ElementRef<typeof DialogPrimitive.Title>;
|
|
205
|
+
interface SheetTitleProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> {}
|
|
206
|
+
/** Accessible title for the Sheet. Required for non-decorative content. */
|
|
207
|
+
const Title = React.forwardRef<SheetTitleElement, SheetTitleProps>(
|
|
208
|
+
({ children, ...props }, ref) => (
|
|
209
|
+
<DialogPrimitive.Title {...props} ref={ref} asChild={false}>
|
|
210
|
+
{children}
|
|
211
|
+
</DialogPrimitive.Title>
|
|
212
|
+
),
|
|
213
|
+
);
|
|
214
|
+
Title.displayName = 'Sheet.Title';
|
|
215
|
+
|
|
216
|
+
type SheetDescriptionElement = React.ElementRef<typeof DialogPrimitive.Description>;
|
|
217
|
+
interface SheetDescriptionProps
|
|
218
|
+
extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> {}
|
|
219
|
+
/** Supplementary description text for Sheet content. */
|
|
220
|
+
const Description = React.forwardRef<SheetDescriptionElement, SheetDescriptionProps>(
|
|
221
|
+
({ children, ...props }, ref) => (
|
|
222
|
+
<DialogPrimitive.Description {...props} ref={ref} asChild={false}>
|
|
223
|
+
{children}
|
|
224
|
+
</DialogPrimitive.Description>
|
|
225
|
+
),
|
|
226
|
+
);
|
|
227
|
+
Description.displayName = 'Sheet.Description';
|
|
228
|
+
|
|
229
|
+
type SheetCloseElement = React.ElementRef<typeof DialogPrimitive.Close>;
|
|
230
|
+
interface SheetCloseProps
|
|
231
|
+
extends ComponentPropsWithout<typeof DialogPrimitive.Close, RemovedProps> {}
|
|
232
|
+
/** Close button for the Sheet. Expects a single element child rendered via `asChild`. */
|
|
233
|
+
const Close = React.forwardRef<SheetCloseElement, SheetCloseProps>(
|
|
234
|
+
({ children, ...props }, ref) => (
|
|
235
|
+
<DialogPrimitive.Close {...props} ref={ref} asChild>
|
|
236
|
+
{requireReactElement(children)}
|
|
237
|
+
</DialogPrimitive.Close>
|
|
238
|
+
),
|
|
239
|
+
);
|
|
240
|
+
Close.displayName = 'Sheet.Close';
|
|
241
|
+
|
|
242
|
+
export { Root, Trigger, Content, Title, Description, Close };
|
|
243
|
+
export type {
|
|
244
|
+
SheetRootProps as RootProps,
|
|
245
|
+
SheetTriggerProps as TriggerProps,
|
|
246
|
+
SheetContentProps as ContentProps,
|
|
247
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Shell Root
|
|
3
|
+
- Vertical app scaffold with sticky header and flexible body
|
|
4
|
+
- Avoid margins; rely on flex/grid gaps and padding tokens only
|
|
5
|
+
*/
|
|
6
|
+
.rt-ShellRoot {
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
block-size: 100vh;
|
|
11
|
+
/* Default sizing tokens for rail/panel widths */
|
|
12
|
+
--shell-sidebar-rail-width: var(--space-9, 64px);
|
|
13
|
+
--shell-sidebar-panel-width: 288px;
|
|
14
|
+
--shell-sidebar-combined-width: calc(
|
|
15
|
+
var(--shell-sidebar-rail-width) + var(--shell-sidebar-panel-width)
|
|
16
|
+
);
|
|
17
|
+
/* Overlay width hook - set by JS to one of the tokens above */
|
|
18
|
+
--shell-overlay-width: auto;
|
|
19
|
+
}
|
|
20
|
+
@supports (height: 100dvh) {
|
|
21
|
+
.rt-ShellRoot { block-size: 100dvh; }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Global Header (sticky) */
|
|
25
|
+
.rt-ShellHeader {
|
|
26
|
+
position: sticky;
|
|
27
|
+
top: 0;
|
|
28
|
+
inset-inline: 0;
|
|
29
|
+
z-index: var(--shell-z-header, 10);
|
|
30
|
+
block-size: var(--shell-header-height, 64px);
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
background-color: var(--color-panel);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Body: sidebars + content arranged inline with overflow confined */
|
|
37
|
+
.rt-ShellBody {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-direction: row;
|
|
40
|
+
align-items: stretch;
|
|
41
|
+
inline-size: 100%;
|
|
42
|
+
flex: 1 1 auto;
|
|
43
|
+
block-size: auto;
|
|
44
|
+
min-block-size: 0;
|
|
45
|
+
min-inline-size: 0;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Sidebar container (holds rail/panel or single-morph) */
|
|
50
|
+
.rt-ShellSidebar {
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: row;
|
|
53
|
+
align-items: stretch;
|
|
54
|
+
block-size: 100%;
|
|
55
|
+
min-block-size: 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Rail section (typically icon-sized navigation) */
|
|
59
|
+
.rt-ShellSidebarRail {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
align-items: center;
|
|
63
|
+
gap: var(--space-2);
|
|
64
|
+
padding-block: var(--space-2);
|
|
65
|
+
block-size: 100%;
|
|
66
|
+
min-block-size: 0;
|
|
67
|
+
overflow: hidden;
|
|
68
|
+
/* Staggered animation: width first, then content fade */
|
|
69
|
+
opacity: 0;
|
|
70
|
+
transition:
|
|
71
|
+
inline-size var(--motion-duration-small) var(--motion-ease-standard),
|
|
72
|
+
opacity var(--motion-duration-small) var(--motion-ease-standard) var(--motion-duration-small);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Panel section (detail/inspector). Transitions its inline-size */
|
|
76
|
+
.rt-ShellSidebarPanel {
|
|
77
|
+
display: block;
|
|
78
|
+
/* Staggered animation: width first, then content fade */
|
|
79
|
+
opacity: 0;
|
|
80
|
+
transition:
|
|
81
|
+
inline-size var(--motion-duration-small) var(--motion-ease-standard),
|
|
82
|
+
opacity var(--motion-duration-small) var(--motion-ease-standard) var(--motion-duration-small);
|
|
83
|
+
block-size: 100%;
|
|
84
|
+
min-block-size: 0;
|
|
85
|
+
overflow: hidden;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
/* Single-markup morph container */
|
|
91
|
+
.rt-ShellSidebarSingle {
|
|
92
|
+
/* Staggered animation: width first, then content fade */
|
|
93
|
+
opacity: 0;
|
|
94
|
+
transition:
|
|
95
|
+
inline-size var(--motion-duration-small) var(--motion-ease-standard),
|
|
96
|
+
opacity var(--motion-duration-small) var(--motion-ease-standard) var(--motion-duration-small);
|
|
97
|
+
block-size: 100%;
|
|
98
|
+
overflow: hidden;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Exit animation: fade out content first, then collapse width */
|
|
102
|
+
:where(.rt-ShellSidebarRail):not([data-visible]),
|
|
103
|
+
:where(.rt-ShellSidebarPanel):not([data-visible]),
|
|
104
|
+
:where(.rt-ShellSidebarSingle):not([data-visible]) {
|
|
105
|
+
opacity: 0;
|
|
106
|
+
/* Exit animation: fade out content first, then collapse width */
|
|
107
|
+
transition:
|
|
108
|
+
opacity var(--motion-duration-small) var(--motion-ease-standard),
|
|
109
|
+
inline-size var(--motion-duration-small) var(--motion-ease-standard) var(--motion-duration-small);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* When visible: show content after width settles */
|
|
113
|
+
[data-visible] {
|
|
114
|
+
opacity: 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@media (prefers-reduced-motion: reduce) {
|
|
118
|
+
.rt-ShellSidebarRail,
|
|
119
|
+
.rt-ShellSidebarPanel,
|
|
120
|
+
.rt-ShellSidebarSingle {
|
|
121
|
+
transition: none;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Content: the only scrollable area; min width protects content from collapsing */
|
|
126
|
+
.rt-ShellContent {
|
|
127
|
+
flex: 1 1 auto;
|
|
128
|
+
block-size: 100%;
|
|
129
|
+
min-block-size: 0;
|
|
130
|
+
min-inline-size: 0;
|
|
131
|
+
overflow: auto;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Overlay mode: disable panel animation only (keep rail/sidebar transitions) */
|
|
135
|
+
:where(.rt-SheetContent) :where(.rt-ShellSidebarPanel) {
|
|
136
|
+
transition: none !important;
|
|
137
|
+
}
|