@kushagradhawan/kookie-ui 0.1.123 → 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.
Files changed (59) hide show
  1. package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
  2. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  3. package/dist/cjs/components/_internal/shell-bottom.js.map +2 -2
  4. package/dist/cjs/components/_internal/shell-handles.js +1 -1
  5. package/dist/cjs/components/_internal/shell-handles.js.map +2 -2
  6. package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
  7. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  8. package/dist/cjs/components/_internal/shell-inspector.js.map +2 -2
  9. package/dist/cjs/components/_internal/shell-prop-helpers.js.map +2 -2
  10. package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
  11. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  12. package/dist/cjs/components/_internal/shell-sidebar.js.map +2 -2
  13. package/dist/cjs/components/shell.context.d.ts +2 -0
  14. package/dist/cjs/components/shell.context.d.ts.map +1 -1
  15. package/dist/cjs/components/shell.context.js +1 -1
  16. package/dist/cjs/components/shell.context.js.map +2 -2
  17. package/dist/cjs/components/shell.d.ts.map +1 -1
  18. package/dist/cjs/components/shell.js +1 -1
  19. package/dist/cjs/components/shell.js.map +3 -3
  20. package/dist/cjs/components/shell.types.d.ts +11 -0
  21. package/dist/cjs/components/shell.types.d.ts.map +1 -1
  22. package/dist/cjs/components/shell.types.js +1 -1
  23. package/dist/cjs/components/shell.types.js.map +1 -1
  24. package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
  25. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  26. package/dist/esm/components/_internal/shell-bottom.js.map +2 -2
  27. package/dist/esm/components/_internal/shell-handles.js +1 -1
  28. package/dist/esm/components/_internal/shell-handles.js.map +2 -2
  29. package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
  30. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  31. package/dist/esm/components/_internal/shell-inspector.js.map +2 -2
  32. package/dist/esm/components/_internal/shell-prop-helpers.js.map +2 -2
  33. package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
  34. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  35. package/dist/esm/components/_internal/shell-sidebar.js.map +2 -2
  36. package/dist/esm/components/shell.context.d.ts +2 -0
  37. package/dist/esm/components/shell.context.d.ts.map +1 -1
  38. package/dist/esm/components/shell.context.js.map +2 -2
  39. package/dist/esm/components/shell.d.ts.map +1 -1
  40. package/dist/esm/components/shell.js +1 -1
  41. package/dist/esm/components/shell.js.map +3 -3
  42. package/dist/esm/components/shell.types.d.ts +11 -0
  43. package/dist/esm/components/shell.types.d.ts.map +1 -1
  44. package/dist/esm/components/shell.types.js.map +1 -1
  45. package/package.json +1 -1
  46. package/schemas/base-button.json +1 -1
  47. package/schemas/button.json +1 -1
  48. package/schemas/icon-button.json +1 -1
  49. package/schemas/index.json +6 -6
  50. package/schemas/toggle-button.json +1 -1
  51. package/schemas/toggle-icon-button.json +1 -1
  52. package/src/components/_internal/shell-bottom.tsx +5 -5
  53. package/src/components/_internal/shell-handles.tsx +26 -26
  54. package/src/components/_internal/shell-inspector.tsx +5 -5
  55. package/src/components/_internal/shell-prop-helpers.ts +1 -1
  56. package/src/components/_internal/shell-sidebar.tsx +10 -10
  57. package/src/components/shell.context.tsx +12 -10
  58. package/src/components/shell.tsx +21 -20
  59. 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-09T16:57:47.916Z",
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
- ['--bottom-size' as any]: `${expandedSize}px`,
395
- ['--bottom-min-size' as any]: `${minSize}px`,
396
- ['--bottom-max-size' as any]: `${maxSize}px`,
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 any);
92
- document.removeEventListener('pointermove', handleMove as any);
93
- window.removeEventListener('mousemove', handleMove as any);
94
- document.removeEventListener('mousemove', handleMove as any);
95
- handleEl.removeEventListener('pointermove', handleMove as any);
96
- window.removeEventListener('pointerup', handleUp as any);
97
- document.removeEventListener('pointerup', handleUp as any);
98
- window.removeEventListener('mouseup', handleUp as any);
99
- document.removeEventListener('mouseup', handleUp as any);
100
- window.removeEventListener('pointercancel', handleUp as any);
101
- document.removeEventListener('pointercancel', handleUp as any);
102
- window.removeEventListener('keydown', handleKey as any);
103
- handleEl.removeEventListener('lostpointercapture', handleUp as any);
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 any);
136
- document.addEventListener('pointermove', handleMove as any);
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 any);
139
- document.addEventListener('mousemove', handleMove as any);
140
- handleEl.addEventListener('pointermove', handleMove as any);
141
- window.addEventListener('pointerup', handleUp as any);
142
- document.addEventListener('pointerup', handleUp as any);
143
- window.addEventListener('mouseup', handleUp as any);
144
- document.addEventListener('mouseup', handleUp as any);
145
- window.addEventListener('pointercancel', handleUp as any);
146
- document.addEventListener('pointercancel', handleUp as any);
147
- window.addEventListener('keydown', handleKey as any);
148
- handleEl.addEventListener('lostpointercapture', handleUp as any);
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
- ['--inspector-size' as any]: `${expandedSize}px`,
397
- ['--inspector-min-size' as any]: `${minSize}px`,
398
- ['--inspector-max-size' as any]: `${maxSize}px`,
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] = (source as any)[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
- ['--sidebar-size' as any]: `${expandedSize}px`,
450
- ['--sidebar-thin-size' as any]: `${thinSize}px`,
451
- ['--sidebar-min-size' as any]: `${minSize}px`,
452
- ['--sidebar-max-size' as any]: `${maxSize}px`,
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
- ['--peek-sidebar-width' as any]: `${thinSize}px`,
467
- } as React.CSSProperties;
466
+ '--peek-sidebar-width': `${thinSize}px`,
467
+ } as CSSPropertiesWithVars;
468
468
  }
469
469
  return {
470
- ['--peek-sidebar-width' as any]: `var(--sidebar-size, ${expandedSize}px)`,
471
- } as React.CSSProperties;
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}
@@ -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 as any);
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 as any);
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 as any);
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 as any);
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 as any);
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 as any);
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 as any,
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 as any);
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 as any);
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 as any);
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');
@@ -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: [key: keyof typeof _BREAKPOINTS, query: string][] = Object.entries(_BREAKPOINTS) as any;
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
- const compute = () => {
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 as any);
105
- cleanups.push(() => mm.removeEventListener?.('change', compute as any));
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 as any);
108
- cleanups.push(() => mm.removeListener?.(compute as any));
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
- ['--peek-rail-width' as any]: `${railDefaultSizeRef.current}px`,
572
- } as React.CSSProperties)
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
- ['--shell-header-height' as any]: `${height}px`,
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
- (shell as any).onLeftPres?.(resolvedPresentation);
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
- (shell as any).onRailDefaults?.(expandedSize);
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
- ['--rail-size' as any]: `${expandedSize}px`,
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
- (shell as any).onPanelDefaults?.(expandedSize);
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
- ['--panel-size' as any]: `${expandedSize}px`,
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 ((shell as any).peekTarget === target) {
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 ((shell as any).peekTarget === target) {
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
+ };