@kushagradhawan/kookie-ui 0.1.122 → 0.1.124
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/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js.map +2 -2
- package/dist/cjs/components/_internal/shell-handles.js +1 -1
- package/dist/cjs/components/_internal/shell-handles.js.map +2 -2
- package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js.map +2 -2
- package/dist/cjs/components/_internal/shell-prop-helpers.js.map +2 -2
- package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js.map +2 -2
- package/dist/cjs/components/sheet.d.ts +3 -3
- package/dist/cjs/components/sheet.d.ts.map +1 -1
- package/dist/cjs/components/sheet.js +1 -1
- package/dist/cjs/components/sheet.js.map +2 -2
- package/dist/cjs/components/shell.context.d.ts +2 -0
- package/dist/cjs/components/shell.context.d.ts.map +1 -1
- package/dist/cjs/components/shell.context.js +1 -1
- package/dist/cjs/components/shell.context.js.map +2 -2
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +3 -3
- package/dist/cjs/components/shell.types.d.ts +11 -0
- package/dist/cjs/components/shell.types.d.ts.map +1 -1
- package/dist/cjs/components/shell.types.js +1 -1
- package/dist/cjs/components/shell.types.js.map +1 -1
- package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-bottom.js +1 -1
- package/dist/esm/components/_internal/shell-bottom.js.map +2 -2
- package/dist/esm/components/_internal/shell-handles.js +1 -1
- package/dist/esm/components/_internal/shell-handles.js.map +2 -2
- package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-inspector.js +1 -1
- package/dist/esm/components/_internal/shell-inspector.js.map +2 -2
- package/dist/esm/components/_internal/shell-prop-helpers.js.map +2 -2
- package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js.map +2 -2
- package/dist/esm/components/sheet.d.ts +3 -3
- package/dist/esm/components/sheet.d.ts.map +1 -1
- package/dist/esm/components/sheet.js +1 -1
- package/dist/esm/components/sheet.js.map +2 -2
- package/dist/esm/components/shell.context.d.ts +2 -0
- package/dist/esm/components/shell.context.d.ts.map +1 -1
- package/dist/esm/components/shell.context.js.map +2 -2
- package/dist/esm/components/shell.d.ts.map +1 -1
- package/dist/esm/components/shell.js +1 -1
- package/dist/esm/components/shell.js.map +3 -3
- package/dist/esm/components/shell.types.d.ts +11 -0
- package/dist/esm/components/shell.types.d.ts.map +1 -1
- package/dist/esm/components/shell.types.js.map +1 -1
- package/package.json +1 -1
- package/schemas/base-button.json +1 -1
- package/schemas/button.json +1 -1
- package/schemas/icon-button.json +1 -1
- package/schemas/index.json +6 -6
- package/schemas/toggle-button.json +1 -1
- package/schemas/toggle-icon-button.json +1 -1
- package/src/components/_internal/shell-bottom.tsx +5 -5
- package/src/components/_internal/shell-handles.tsx +26 -26
- package/src/components/_internal/shell-inspector.tsx +5 -5
- package/src/components/_internal/shell-prop-helpers.ts +1 -1
- package/src/components/_internal/shell-sidebar.tsx +10 -10
- package/src/components/sheet.tsx +6 -9
- package/src/components/shell.context.tsx +12 -10
- package/src/components/shell.tsx +21 -20
- package/src/components/shell.types.ts +13 -0
|
@@ -321,6 +321,6 @@
|
|
|
321
321
|
"title": "Toggle-icon-button Component Props",
|
|
322
322
|
"description": "Props schema for the toggle-icon-button component in Kookie UI",
|
|
323
323
|
"version": "1.0.0",
|
|
324
|
-
"generatedAt": "2026-01-
|
|
324
|
+
"generatedAt": "2026-01-11T18:27:18.411Z",
|
|
325
325
|
"source": "Zod schema"
|
|
326
326
|
}
|
|
@@ -7,7 +7,7 @@ import { useResponsivePresentation, useResponsiveInitialState } from '../shell.h
|
|
|
7
7
|
import { PaneResizeContext } from './shell-resize.js';
|
|
8
8
|
import { BottomHandle, PaneHandle } from './shell-handles.js';
|
|
9
9
|
import { _BREAKPOINTS } from '../shell.types.js';
|
|
10
|
-
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps } from '../shell.types.js';
|
|
10
|
+
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';
|
|
11
11
|
import { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';
|
|
12
12
|
import { normalizeToPx } from '../../helpers/normalize-to-px.js';
|
|
13
13
|
|
|
@@ -391,10 +391,10 @@ export const Bottom = React.forwardRef<HTMLDivElement, BottomPublicProps>((initi
|
|
|
391
391
|
data-inset={inset || undefined}
|
|
392
392
|
style={{
|
|
393
393
|
...style,
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}}
|
|
394
|
+
'--bottom-size': `${expandedSize}px`,
|
|
395
|
+
'--bottom-min-size': `${minSize}px`,
|
|
396
|
+
'--bottom-max-size': `${maxSize}px`,
|
|
397
|
+
} as CSSPropertiesWithVars}
|
|
398
398
|
>
|
|
399
399
|
<div className="rt-ShellBottomContent" data-visible={isExpanded || undefined}>
|
|
400
400
|
{contentChildren}
|
|
@@ -88,19 +88,19 @@ export const PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsW
|
|
|
88
88
|
try {
|
|
89
89
|
handleEl.releasePointerCapture(pointerId);
|
|
90
90
|
} catch {}
|
|
91
|
-
window.removeEventListener('pointermove', handleMove as
|
|
92
|
-
document.removeEventListener('pointermove', handleMove as
|
|
93
|
-
window.removeEventListener('mousemove', handleMove as
|
|
94
|
-
document.removeEventListener('mousemove', handleMove as
|
|
95
|
-
handleEl.removeEventListener('pointermove', handleMove as
|
|
96
|
-
window.removeEventListener('pointerup', handleUp as
|
|
97
|
-
document.removeEventListener('pointerup', handleUp as
|
|
98
|
-
window.removeEventListener('mouseup', handleUp as
|
|
99
|
-
document.removeEventListener('mouseup', handleUp as
|
|
100
|
-
window.removeEventListener('pointercancel', handleUp as
|
|
101
|
-
document.removeEventListener('pointercancel', handleUp as
|
|
102
|
-
window.removeEventListener('keydown', handleKey as
|
|
103
|
-
handleEl.removeEventListener('lostpointercapture', handleUp as
|
|
91
|
+
window.removeEventListener('pointermove', handleMove as EventListener);
|
|
92
|
+
document.removeEventListener('pointermove', handleMove as EventListener);
|
|
93
|
+
window.removeEventListener('mousemove', handleMove as EventListener);
|
|
94
|
+
document.removeEventListener('mousemove', handleMove as EventListener);
|
|
95
|
+
handleEl.removeEventListener('pointermove', handleMove as EventListener);
|
|
96
|
+
window.removeEventListener('pointerup', handleUp as EventListener);
|
|
97
|
+
document.removeEventListener('pointerup', handleUp as EventListener);
|
|
98
|
+
window.removeEventListener('mouseup', handleUp as EventListener);
|
|
99
|
+
document.removeEventListener('mouseup', handleUp as EventListener);
|
|
100
|
+
window.removeEventListener('pointercancel', handleUp as EventListener);
|
|
101
|
+
document.removeEventListener('pointercancel', handleUp as EventListener);
|
|
102
|
+
window.removeEventListener('keydown', handleKey as EventListener);
|
|
103
|
+
handleEl.removeEventListener('lostpointercapture', handleUp as EventListener);
|
|
104
104
|
container.removeAttribute('data-resizing');
|
|
105
105
|
body.style.cursor = prevCursor;
|
|
106
106
|
body.style.userSelect = prevUserSelect;
|
|
@@ -132,20 +132,20 @@ export const PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsW
|
|
|
132
132
|
cleanup();
|
|
133
133
|
}
|
|
134
134
|
};
|
|
135
|
-
window.addEventListener('pointermove', handleMove as
|
|
136
|
-
document.addEventListener('pointermove', handleMove as
|
|
135
|
+
window.addEventListener('pointermove', handleMove as EventListener);
|
|
136
|
+
document.addEventListener('pointermove', handleMove as EventListener);
|
|
137
137
|
// Fallbacks for environments that don't fully support PointerEvent on window
|
|
138
|
-
window.addEventListener('mousemove', handleMove as
|
|
139
|
-
document.addEventListener('mousemove', handleMove as
|
|
140
|
-
handleEl.addEventListener('pointermove', handleMove as
|
|
141
|
-
window.addEventListener('pointerup', handleUp as
|
|
142
|
-
document.addEventListener('pointerup', handleUp as
|
|
143
|
-
window.addEventListener('mouseup', handleUp as
|
|
144
|
-
document.addEventListener('mouseup', handleUp as
|
|
145
|
-
window.addEventListener('pointercancel', handleUp as
|
|
146
|
-
document.addEventListener('pointercancel', handleUp as
|
|
147
|
-
window.addEventListener('keydown', handleKey as
|
|
148
|
-
handleEl.addEventListener('lostpointercapture', handleUp as
|
|
138
|
+
window.addEventListener('mousemove', handleMove as EventListener);
|
|
139
|
+
document.addEventListener('mousemove', handleMove as EventListener);
|
|
140
|
+
handleEl.addEventListener('pointermove', handleMove as EventListener);
|
|
141
|
+
window.addEventListener('pointerup', handleUp as EventListener);
|
|
142
|
+
document.addEventListener('pointerup', handleUp as EventListener);
|
|
143
|
+
window.addEventListener('mouseup', handleUp as EventListener);
|
|
144
|
+
document.addEventListener('mouseup', handleUp as EventListener);
|
|
145
|
+
window.addEventListener('pointercancel', handleUp as EventListener);
|
|
146
|
+
document.addEventListener('pointercancel', handleUp as EventListener);
|
|
147
|
+
window.addEventListener('keydown', handleKey as EventListener);
|
|
148
|
+
handleEl.addEventListener('lostpointercapture', handleUp as EventListener);
|
|
149
149
|
activeCleanupRef.current = cleanup;
|
|
150
150
|
}}
|
|
151
151
|
onDoubleClick={() => {
|
|
@@ -7,7 +7,7 @@ import { useResponsivePresentation, useResponsiveInitialState } from '../shell.h
|
|
|
7
7
|
import { PaneResizeContext } from './shell-resize.js';
|
|
8
8
|
import { InspectorHandle, PaneHandle } from './shell-handles.js';
|
|
9
9
|
import { _BREAKPOINTS } from '../shell.types.js';
|
|
10
|
-
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps } from '../shell.types.js';
|
|
10
|
+
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';
|
|
11
11
|
import { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';
|
|
12
12
|
import { normalizeToPx } from '../../helpers/normalize-to-px.js';
|
|
13
13
|
|
|
@@ -393,10 +393,10 @@ export const Inspector = React.forwardRef<HTMLDivElement, InspectorPublicProps>(
|
|
|
393
393
|
data-inset={inset || undefined}
|
|
394
394
|
style={{
|
|
395
395
|
...style,
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
}}
|
|
396
|
+
'--inspector-size': `${expandedSize}px`,
|
|
397
|
+
'--inspector-min-size': `${minSize}px`,
|
|
398
|
+
'--inspector-max-size': `${maxSize}px`,
|
|
399
|
+
} as CSSPropertiesWithVars}
|
|
400
400
|
>
|
|
401
401
|
<div className="rt-ShellInspectorContent" data-visible={isExpanded || undefined}>
|
|
402
402
|
{contentChildren}
|
|
@@ -7,7 +7,7 @@ export function omitPaneProps<T extends object, K extends KeyList<T>>(source: T,
|
|
|
7
7
|
const result: Partial<T> = {};
|
|
8
8
|
(Object.keys(source) as Array<keyof T>).forEach((key) => {
|
|
9
9
|
if (!omitSet.has(key)) {
|
|
10
|
-
result[key] =
|
|
10
|
+
result[key] = source[key];
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
13
|
return result as Omit<T, K[number]>;
|
|
@@ -7,7 +7,7 @@ import { useResponsivePresentation, useResponsiveInitialState } from '../shell.h
|
|
|
7
7
|
import { PaneResizeContext } from './shell-resize.js';
|
|
8
8
|
import { extractPaneDomProps } from './shell-prop-helpers.js';
|
|
9
9
|
import { SidebarHandle, PaneHandle } from './shell-handles.js';
|
|
10
|
-
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, SidebarMode, Responsive, PaneBaseProps } from '../shell.types.js';
|
|
10
|
+
import type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, SidebarMode, Responsive, PaneBaseProps, CSSPropertiesWithVars } from '../shell.types.js';
|
|
11
11
|
import { _BREAKPOINTS } from '../shell.types.js';
|
|
12
12
|
import { normalizeToPx } from '../../helpers/normalize-to-px.js';
|
|
13
13
|
|
|
@@ -446,10 +446,10 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((ini
|
|
|
446
446
|
data-inset={inset || undefined}
|
|
447
447
|
style={{
|
|
448
448
|
...style,
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
449
|
+
'--sidebar-size': `${expandedSize}px`,
|
|
450
|
+
'--sidebar-thin-size': `${thinSize}px`,
|
|
451
|
+
'--sidebar-min-size': `${minSize}px`,
|
|
452
|
+
'--sidebar-max-size': `${maxSize}px`,
|
|
453
453
|
...(shell.peekTarget === 'sidebar' && shell.sidebarMode === 'collapsed' && !isOverlay
|
|
454
454
|
? (() => {
|
|
455
455
|
const strategy: 'both' | 'single' = toggleModes ?? 'both';
|
|
@@ -463,15 +463,15 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((ini
|
|
|
463
463
|
}
|
|
464
464
|
if (next === 'thin') {
|
|
465
465
|
return {
|
|
466
|
-
|
|
467
|
-
} as
|
|
466
|
+
'--peek-sidebar-width': `${thinSize}px`,
|
|
467
|
+
} as CSSPropertiesWithVars;
|
|
468
468
|
}
|
|
469
469
|
return {
|
|
470
|
-
|
|
471
|
-
} as
|
|
470
|
+
'--peek-sidebar-width': `var(--sidebar-size, ${expandedSize}px)`,
|
|
471
|
+
} as CSSPropertiesWithVars;
|
|
472
472
|
})()
|
|
473
473
|
: {}),
|
|
474
|
-
}}
|
|
474
|
+
} as CSSPropertiesWithVars}
|
|
475
475
|
>
|
|
476
476
|
<div className="rt-ShellSidebarContent" data-visible={isContentVisible || undefined}>
|
|
477
477
|
{contentChildren}
|
package/src/components/sheet.tsx
CHANGED
|
@@ -275,17 +275,14 @@ Title.displayName = 'Sheet.Title';
|
|
|
275
275
|
|
|
276
276
|
// Description - renders as Text with sensible defaults
|
|
277
277
|
type SheetDescriptionElement = React.ElementRef<typeof Text>;
|
|
278
|
-
type SheetDescriptionProps =
|
|
278
|
+
type SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof Text>;
|
|
279
279
|
/** Supplementary description text for Sheet content. Renders as Text with sensible defaults. */
|
|
280
280
|
const Description = React.forwardRef<SheetDescriptionElement, SheetDescriptionProps>(
|
|
281
|
-
(
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
</DialogPrimitive.Description>
|
|
287
|
-
);
|
|
288
|
-
},
|
|
281
|
+
({ size = '2', color = 'gray', ...rest }, ref) => (
|
|
282
|
+
<DialogPrimitive.Description asChild>
|
|
283
|
+
<Text ref={ref} size={size} color={color} {...rest} />
|
|
284
|
+
</DialogPrimitive.Description>
|
|
285
|
+
),
|
|
289
286
|
);
|
|
290
287
|
Description.displayName = 'Sheet.Description';
|
|
291
288
|
|
|
@@ -41,6 +41,8 @@ export interface ShellContextValue {
|
|
|
41
41
|
onLeftPres?: (p: PresentationValue) => void;
|
|
42
42
|
// Sizing info for overlay grouping
|
|
43
43
|
onLeftDefaults?: (size: number) => void;
|
|
44
|
+
onRailDefaults?: (size: number) => void;
|
|
45
|
+
onPanelDefaults?: (size: number) => void;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
const ShellContext = React.createContext<ShellContextValue | null>(null);
|
|
@@ -61,35 +63,35 @@ export function ShellProvider({ value, children }: { value: ShellContextValue; c
|
|
|
61
63
|
// Pane mode slice contexts
|
|
62
64
|
type ModeSetter<T> = (mode: T) => void;
|
|
63
65
|
|
|
64
|
-
export const LeftModeContext = React.createContext<{ leftMode: PaneMode; setLeftMode: ModeSetter<PaneMode> } | null>(null
|
|
66
|
+
export const LeftModeContext = React.createContext<{ leftMode: PaneMode; setLeftMode: ModeSetter<PaneMode> } | null>(null);
|
|
65
67
|
export function useLeftMode() {
|
|
66
68
|
const ctx = React.useContext(LeftModeContext);
|
|
67
69
|
if (!ctx) throw new Error('useLeftMode must be used within Shell.Root');
|
|
68
70
|
return ctx;
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
export const PanelModeContext = React.createContext<{ panelMode: PaneMode; setPanelMode: ModeSetter<PaneMode> } | null>(null
|
|
73
|
+
export const PanelModeContext = React.createContext<{ panelMode: PaneMode; setPanelMode: ModeSetter<PaneMode> } | null>(null);
|
|
72
74
|
export function usePanelMode() {
|
|
73
75
|
const ctx = React.useContext(PanelModeContext);
|
|
74
76
|
if (!ctx) throw new Error('usePanelMode must be used within Shell.Root');
|
|
75
77
|
return ctx;
|
|
76
78
|
}
|
|
77
79
|
|
|
78
|
-
export const SidebarModeContext = React.createContext<{ sidebarMode: SidebarMode; setSidebarMode: ModeSetter<SidebarMode> } | null>(null
|
|
80
|
+
export const SidebarModeContext = React.createContext<{ sidebarMode: SidebarMode; setSidebarMode: ModeSetter<SidebarMode> } | null>(null);
|
|
79
81
|
export function useSidebarMode() {
|
|
80
82
|
const ctx = React.useContext(SidebarModeContext);
|
|
81
83
|
if (!ctx) throw new Error('useSidebarMode must be used within Shell.Root');
|
|
82
84
|
return ctx;
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
export const InspectorModeContext = React.createContext<{ inspectorMode: PaneMode; setInspectorMode: ModeSetter<PaneMode> } | null>(null
|
|
87
|
+
export const InspectorModeContext = React.createContext<{ inspectorMode: PaneMode; setInspectorMode: ModeSetter<PaneMode> } | null>(null);
|
|
86
88
|
export function useInspectorMode() {
|
|
87
89
|
const ctx = React.useContext(InspectorModeContext);
|
|
88
90
|
if (!ctx) throw new Error('useInspectorMode must be used within Shell.Root');
|
|
89
91
|
return ctx;
|
|
90
92
|
}
|
|
91
93
|
|
|
92
|
-
export const BottomModeContext = React.createContext<{ bottomMode: PaneMode; setBottomMode: ModeSetter<PaneMode> } | null>(null
|
|
94
|
+
export const BottomModeContext = React.createContext<{ bottomMode: PaneMode; setBottomMode: ModeSetter<PaneMode> } | null>(null);
|
|
93
95
|
export function useBottomMode() {
|
|
94
96
|
const ctx = React.useContext(BottomModeContext);
|
|
95
97
|
if (!ctx) throw new Error('useBottomMode must be used within Shell.Root');
|
|
@@ -97,7 +99,7 @@ export function useBottomMode() {
|
|
|
97
99
|
}
|
|
98
100
|
|
|
99
101
|
// Presentation slice
|
|
100
|
-
export const PresentationContext = React.createContext<{ currentBreakpoint: Breakpoint; currentBreakpointReady: boolean; leftResolvedPresentation?: PresentationValue } | null>(null
|
|
102
|
+
export const PresentationContext = React.createContext<{ currentBreakpoint: Breakpoint; currentBreakpointReady: boolean; leftResolvedPresentation?: PresentationValue } | null>(null);
|
|
101
103
|
export function usePresentation() {
|
|
102
104
|
const ctx = React.useContext(PresentationContext);
|
|
103
105
|
if (!ctx) throw new Error('usePresentation must be used within Shell.Root');
|
|
@@ -106,7 +108,7 @@ export function usePresentation() {
|
|
|
106
108
|
|
|
107
109
|
// Peek slice
|
|
108
110
|
export const PeekContext = React.createContext<{ peekTarget: PaneTarget | null; setPeekTarget: (t: PaneTarget | null) => void; peekPane: (t: PaneTarget) => void; clearPeek: () => void } | null>(
|
|
109
|
-
null
|
|
111
|
+
null,
|
|
110
112
|
);
|
|
111
113
|
export function usePeek() {
|
|
112
114
|
const ctx = React.useContext(PeekContext);
|
|
@@ -120,7 +122,7 @@ export const ActionsContext = React.createContext<{
|
|
|
120
122
|
expandPane: (t: PaneTarget) => void;
|
|
121
123
|
collapsePane: (t: PaneTarget) => void;
|
|
122
124
|
setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;
|
|
123
|
-
} | null>(null
|
|
125
|
+
} | null>(null);
|
|
124
126
|
export function useShellActions() {
|
|
125
127
|
const ctx = React.useContext(ActionsContext);
|
|
126
128
|
if (!ctx) throw new Error('useShellActions must be used within Shell.Root');
|
|
@@ -128,7 +130,7 @@ export function useShellActions() {
|
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
// Composition slice
|
|
131
|
-
export const CompositionContext = React.createContext<{ hasLeft: boolean; setHasLeft: (v: boolean) => void; hasSidebar: boolean; setHasSidebar: (v: boolean) => void } | null>(null
|
|
133
|
+
export const CompositionContext = React.createContext<{ hasLeft: boolean; setHasLeft: (v: boolean) => void; hasSidebar: boolean; setHasSidebar: (v: boolean) => void } | null>(null);
|
|
132
134
|
export function useComposition() {
|
|
133
135
|
const ctx = React.useContext(CompositionContext);
|
|
134
136
|
if (!ctx) throw new Error('useComposition must be used within Shell.Root');
|
|
@@ -142,7 +144,7 @@ export const InsetContext = React.createContext<{
|
|
|
142
144
|
registerInset: (id: InsetPaneId) => void;
|
|
143
145
|
unregisterInset: (id: InsetPaneId) => void;
|
|
144
146
|
hasAnyInset: boolean;
|
|
145
|
-
} | null>(null
|
|
147
|
+
} | null>(null);
|
|
146
148
|
export function useInset() {
|
|
147
149
|
const ctx = React.useContext(InsetContext);
|
|
148
150
|
if (!ctx) throw new Error('useInset must be used within Shell.Root');
|
package/src/components/shell.tsx
CHANGED
|
@@ -36,7 +36,7 @@ import { omitPaneProps, extractPaneDomProps, mapResponsiveBooleanToPaneMode } fr
|
|
|
36
36
|
import { Sidebar } from './_internal/shell-sidebar.js';
|
|
37
37
|
import { Bottom } from './_internal/shell-bottom.js';
|
|
38
38
|
import { Inspector } from './_internal/shell-inspector.js';
|
|
39
|
-
import type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps } from './shell.types.js';
|
|
39
|
+
import type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps, CSSPropertiesWithVars } from './shell.types.js';
|
|
40
40
|
import { _BREAKPOINTS } from './shell.types.js';
|
|
41
41
|
import { normalizeToPx } from '../helpers/normalize-to-px.js';
|
|
42
42
|
import {
|
|
@@ -80,10 +80,11 @@ function useBreakpoint(): { bp: Breakpoint; ready: boolean } {
|
|
|
80
80
|
React.useEffect(() => {
|
|
81
81
|
if (typeof window === 'undefined') return;
|
|
82
82
|
|
|
83
|
-
const queries
|
|
83
|
+
const queries = Object.entries(_BREAKPOINTS) as [keyof typeof _BREAKPOINTS, string][];
|
|
84
84
|
const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
// Accept optional event param to satisfy MediaQueryList listener signature
|
|
87
|
+
const compute = (_e?: MediaQueryListEvent) => {
|
|
87
88
|
// Highest matched wins
|
|
88
89
|
const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);
|
|
89
90
|
const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';
|
|
@@ -101,11 +102,11 @@ function useBreakpoint(): { bp: Breakpoint; ready: boolean } {
|
|
|
101
102
|
removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;
|
|
102
103
|
};
|
|
103
104
|
if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {
|
|
104
|
-
mm.addEventListener('change', compute
|
|
105
|
-
cleanups.push(() => mm.removeEventListener?.('change', compute
|
|
105
|
+
mm.addEventListener('change', compute);
|
|
106
|
+
cleanups.push(() => mm.removeEventListener?.('change', compute));
|
|
106
107
|
} else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {
|
|
107
|
-
mm.addListener(compute
|
|
108
|
-
cleanups.push(() => mm.removeListener?.(compute
|
|
108
|
+
mm.addListener(compute);
|
|
109
|
+
cleanups.push(() => mm.removeListener?.(compute));
|
|
109
110
|
}
|
|
110
111
|
});
|
|
111
112
|
|
|
@@ -568,8 +569,8 @@ const Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, chil
|
|
|
568
569
|
style={
|
|
569
570
|
peekTarget === 'rail' || peekTarget === 'panel'
|
|
570
571
|
? ({
|
|
571
|
-
|
|
572
|
-
} as
|
|
572
|
+
'--peek-rail-width': `${railDefaultSizeRef.current}px`,
|
|
573
|
+
} as CSSPropertiesWithVars)
|
|
573
574
|
: undefined
|
|
574
575
|
}
|
|
575
576
|
>
|
|
@@ -631,8 +632,8 @@ const Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, hei
|
|
|
631
632
|
className={classNames('rt-ShellHeader', className)}
|
|
632
633
|
style={{
|
|
633
634
|
...style,
|
|
634
|
-
|
|
635
|
-
}}
|
|
635
|
+
'--shell-header-height': `${height}px`,
|
|
636
|
+
} as CSSPropertiesWithVars}
|
|
636
637
|
/>
|
|
637
638
|
));
|
|
638
639
|
Header.displayName = 'Shell.Header';
|
|
@@ -698,7 +699,7 @@ const Left = React.forwardRef<HTMLDivElement, LeftProps>((initialProps, ref) =>
|
|
|
698
699
|
const localRef = React.useRef<HTMLDivElement | null>(null);
|
|
699
700
|
// Publish resolved presentation so Root can gate peeking in overlay
|
|
700
701
|
React.useEffect(() => {
|
|
701
|
-
|
|
702
|
+
shell.onLeftPres?.(resolvedPresentation);
|
|
702
703
|
}, [shell, resolvedPresentation]);
|
|
703
704
|
const setRef = React.useCallback(
|
|
704
705
|
(node: HTMLDivElement | null) => {
|
|
@@ -864,7 +865,7 @@ const Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) =>
|
|
|
864
865
|
|
|
865
866
|
// Register expanded size with Left container
|
|
866
867
|
React.useEffect(() => {
|
|
867
|
-
|
|
868
|
+
shell.onRailDefaults?.(expandedSize);
|
|
868
869
|
}, [shell, expandedSize]);
|
|
869
870
|
|
|
870
871
|
const isExpanded = shell.leftMode === 'expanded';
|
|
@@ -879,8 +880,8 @@ const Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) =>
|
|
|
879
880
|
data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}
|
|
880
881
|
style={{
|
|
881
882
|
...style,
|
|
882
|
-
|
|
883
|
-
}}
|
|
883
|
+
'--rail-size': `${expandedSize}px`,
|
|
884
|
+
} as CSSPropertiesWithVars}
|
|
884
885
|
>
|
|
885
886
|
<div className="rt-ShellRailContent" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>
|
|
886
887
|
{children}
|
|
@@ -1068,7 +1069,7 @@ const Panel = assignShellSlot(
|
|
|
1068
1069
|
}, [open]);
|
|
1069
1070
|
|
|
1070
1071
|
React.useEffect(() => {
|
|
1071
|
-
|
|
1072
|
+
shell.onPanelDefaults?.(expandedSize);
|
|
1072
1073
|
}, [shell, expandedSize]);
|
|
1073
1074
|
const localRef = React.useRef<HTMLDivElement | null>(null);
|
|
1074
1075
|
const setRef = React.useCallback(
|
|
@@ -1245,8 +1246,8 @@ const Panel = assignShellSlot(
|
|
|
1245
1246
|
data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}
|
|
1246
1247
|
style={{
|
|
1247
1248
|
...style,
|
|
1248
|
-
|
|
1249
|
-
}}
|
|
1249
|
+
'--panel-size': `${expandedSize}px`,
|
|
1250
|
+
} as CSSPropertiesWithVars}
|
|
1250
1251
|
>
|
|
1251
1252
|
<div className="rt-ShellPanelContent" data-visible={isExpanded || undefined}>
|
|
1252
1253
|
{contentChildren}
|
|
@@ -1312,7 +1313,7 @@ const Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, act
|
|
|
1312
1313
|
onClick?.(event);
|
|
1313
1314
|
|
|
1314
1315
|
// Clear any active peek on this target before toggling to avoid sticky peek state
|
|
1315
|
-
if (
|
|
1316
|
+
if (shell.peekTarget === target) {
|
|
1316
1317
|
shell.clearPeek();
|
|
1317
1318
|
}
|
|
1318
1319
|
|
|
@@ -1361,7 +1362,7 @@ const Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, act
|
|
|
1361
1362
|
(event: React.MouseEvent<HTMLButtonElement>) => {
|
|
1362
1363
|
onMouseLeave?.(event);
|
|
1363
1364
|
if (!peekOnHover) return;
|
|
1364
|
-
if (
|
|
1365
|
+
if (shell.peekTarget === target) {
|
|
1365
1366
|
shell.clearPeek();
|
|
1366
1367
|
}
|
|
1367
1368
|
},
|
|
@@ -50,3 +50,16 @@ export const _BREAKPOINTS = {
|
|
|
50
50
|
export type Breakpoint = 'initial' | keyof typeof _BREAKPOINTS;
|
|
51
51
|
|
|
52
52
|
export type PaneTarget = 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* CSS custom property key type for type-safe style objects.
|
|
56
|
+
* Allows any string prefixed with '--'.
|
|
57
|
+
*/
|
|
58
|
+
export type CSSCustomProperty = `--${string}`;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Style object that supports CSS custom properties.
|
|
62
|
+
*/
|
|
63
|
+
export type CSSPropertiesWithVars = React.CSSProperties & {
|
|
64
|
+
[key: CSSCustomProperty]: string | number | undefined;
|
|
65
|
+
};
|