@nextlyhq/ui 0.0.2-alpha.6 → 0.0.2-alpha.62

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/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as class_variance_authority_types from 'class-variance-authority/types';
2
2
  import * as react from 'react';
3
- import { ButtonHTMLAttributes, ComponentProps, TextareaHTMLAttributes, HTMLAttributes, ComponentPropsWithoutRef, ReactNode } from 'react';
3
+ import { ButtonHTMLAttributes, ComponentProps, TextareaHTMLAttributes, HTMLAttributes, ReactNode, ComponentPropsWithoutRef } from 'react';
4
4
  import * as class_variance_authority from 'class-variance-authority';
5
5
  import { VariantProps } from 'class-variance-authority';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
@@ -13,7 +13,7 @@ import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
13
13
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
14
14
  import { Content, Item, Root as Root$2, Trigger } from '@radix-ui/react-accordion';
15
15
  import * as _radix_ui_react_tabs from '@radix-ui/react-tabs';
16
- import { Content as Content$1, List, Root as Root$3, Trigger as Trigger$1 } from '@radix-ui/react-tabs';
16
+ import { Content as Content$1, Root as Root$3 } from '@radix-ui/react-tabs';
17
17
  import * as _radix_ui_react_tooltip from '@radix-ui/react-tooltip';
18
18
  import * as PopoverPrimitive from '@radix-ui/react-popover';
19
19
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -24,8 +24,11 @@ import { Command as Command$1 } from 'cmdk';
24
24
  import { LucideProps } from 'lucide-react';
25
25
  import { ToasterProps } from 'sonner';
26
26
  export { ToasterProps, toast } from 'sonner';
27
- import { ClassValue } from 'clsx';
27
+ import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
28
+ import * as ResizablePrimitive from 'react-resizable-panels';
29
+ import * as SliderPrimitive from '@radix-ui/react-slider';
28
30
 
31
+ /** @public */
29
32
  interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
30
33
  asChild?: boolean;
31
34
  }
@@ -45,11 +48,13 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantPr
45
48
  * - link: Link-style button (underlined text)
46
49
  *
47
50
  * Note: 'primary' is a semantic alias for 'default' variant for better code readability
51
+ * @experimental
48
52
  */
49
53
  declare const buttonVariants: (props?: ({
50
54
  variant?: "default" | "primary" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
51
55
  size?: "default" | "sm" | "md" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
52
56
  } & class_variance_authority_types.ClassProp) | undefined) => string;
57
+ /** @public */
53
58
  declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
54
59
 
55
60
  /**
@@ -66,15 +71,15 @@ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAtt
66
71
  * - Placeholder text for guidance (not a replacement for labels)
67
72
  *
68
73
  * Design Specs:
69
- * - Height: sm=32px, default=40px, lg=44px
74
+ * - Height: sm=36px, default=40px, lg=44px
70
75
  * - Padding: Horizontal varies by size (sm=10px, default=12px, lg=16px)
71
- * - Border radius: 0px (rounded-none)
76
+ * - Border radius: `rounded-md`, the control step of the `--radius` scale
72
77
  * - Border: 1px solid, changes on focus/error
73
78
  * - Transition: 150ms (consistent with design system)
74
79
  * - Font size: sm/default=14px (text-sm), lg=16px (text-base)
75
80
  *
76
81
  * Size Variants:
77
- * - sm: Height 32px (h-8) - Compact forms, filters
82
+ * - sm: Height 36px - Compact forms and filters, matching a small Button
78
83
  * - default: Height 40px (h-10) - Standard forms
79
84
  * - lg: Height 44px (h-11) - Prominent inputs, marketing forms
80
85
  *
@@ -86,18 +91,34 @@ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAtt
86
91
  * - tel: Phone number input
87
92
  * - url: URL validation
88
93
  * - search: Search input with clear button
94
+ * @experimental
89
95
  */
90
96
  declare const inputVariants: (props?: ({
91
97
  size?: "default" | "sm" | "lg" | null | undefined;
92
98
  } & class_variance_authority_types.ClassProp) | undefined) => string;
99
+ /** @public */
93
100
  interface InputProps extends Omit<ComponentProps<"input">, "size">, VariantProps<typeof inputVariants> {
94
101
  }
102
+ /** @public */
95
103
  declare const Input: react.ForwardRefExoticComponent<Omit<InputProps, "ref"> & react.RefAttributes<HTMLInputElement>>;
96
104
 
105
+ /** @public */
97
106
  declare const Textarea: react.ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & react.RefAttributes<HTMLTextAreaElement>>;
98
107
 
108
+ /** @public */
99
109
  declare function Label({ className, ...props }: ComponentProps<typeof Root>): react_jsx_runtime.JSX.Element;
100
110
 
111
+ /** @public */
112
+ interface FormLabelWithTooltipProps extends react.ComponentPropsWithoutRef<typeof Label> {
113
+ label: react.ReactNode;
114
+ description?: react.ReactNode;
115
+ required?: boolean;
116
+ labelClassName?: string;
117
+ tooltipClassName?: string;
118
+ }
119
+ /** @public */
120
+ declare const FormLabelWithTooltip: react.ForwardRefExoticComponent<FormLabelWithTooltipProps & react.RefAttributes<HTMLLabelElement>>;
121
+
101
122
  /**
102
123
  * Badge Component - Design System Specification
103
124
  *
@@ -124,13 +145,16 @@ declare function Label({ className, ...props }: ComponentProps<typeof Root>): re
124
145
  * - success: Light green background
125
146
  * - warning: Light amber background
126
147
  * - destructive: Light red background
127
- * - outline: Transparent background with border border-primary/5
148
+ * - outline: Transparent background with border border-border
149
+ * @experimental
128
150
  */
129
151
  declare const badgeVariants: (props?: ({
130
152
  variant?: "default" | "primary" | "destructive" | "outline" | "success" | "warning" | null | undefined;
131
153
  } & class_variance_authority_types.ClassProp) | undefined) => string;
154
+ /** @public */
132
155
  interface BadgeProps extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
133
156
  }
157
+ /** @public */
134
158
  declare function Badge({ className, variant, ...props }: BadgeProps): react_jsx_runtime.JSX.Element;
135
159
 
136
160
  /**
@@ -140,14 +164,14 @@ declare function Badge({ className, variant, ...props }: BadgeProps): react_jsx_
140
164
  * Cards provide a structured layout with header, content, and footer sections.
141
165
  *
142
166
  * Design Specs:
143
- * - Border radius: 0px (rounded-none)
167
+ * - Border radius: `rounded-lg`, the container step of the `--radius` scale
144
168
  * - Padding: 24px (p-6) for header/content, 16px 24px for footer
145
169
  * - Shadow: sm (default), md (hover/elevated)
146
- * - Border: 1px solid border border-primary/5 color
170
+ * - Border: 1px solid border border-border color
147
171
  *
148
172
  * Variants:
149
173
  * - default: Standard card with subtle shadow
150
- * - interactive: Hover effects for clickable cards (border border-primary/5 highlight, shadow increase)
174
+ * - interactive: Hover effects for clickable cards (border border-border highlight, shadow increase)
151
175
  * ⚠️ IMPORTANT: When using the interactive variant, you MUST add appropriate
152
176
  * accessibility attributes:
153
177
  * - Add role="button" or use an actual <button> wrapper
@@ -182,33 +206,89 @@ declare function Badge({ className, variant, ...props }: BadgeProps): react_jsx_
182
206
  * - Interactive cards MUST have role, tabIndex, and keyboard handlers (see above)
183
207
  * - Ensure sufficient color contrast for all text (WCAG 2.2 AA minimum)
184
208
  * - Use aria-label or aria-labelledby for cards without visible text labels
209
+ * @experimental
185
210
  */
186
211
  declare const cardVariants: (props?: ({
187
212
  variant?: "default" | "interactive" | "elevated" | null | undefined;
188
213
  } & class_variance_authority_types.ClassProp) | undefined) => string;
214
+ /** @experimental */
189
215
  type CardProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof cardVariants>;
216
+ /** @experimental */
190
217
  declare const Card: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
191
218
  variant?: "default" | "interactive" | "elevated" | null | undefined;
192
219
  } & class_variance_authority_types.ClassProp) | undefined) => string> & react.RefAttributes<HTMLDivElement>>;
220
+ /** @experimental */
193
221
  interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
194
222
  /**
195
- * Whether to hide the bottom border border-primary/5 separator between header and content.
196
- * Default: false (border border-primary/5 is shown per design spec)
223
+ * Whether to hide the bottom border border-border separator between header and content.
224
+ * Default: false (border border-border is shown per design spec)
197
225
  */
198
226
  noBorder?: boolean;
199
227
  }
228
+ /** @experimental */
200
229
  declare const CardHeader: react.ForwardRefExoticComponent<CardHeaderProps & react.RefAttributes<HTMLDivElement>>;
230
+ /** @experimental */
201
231
  type CardTitleProps = HTMLAttributes<HTMLHeadingElement>;
232
+ /** @experimental */
202
233
  declare const CardTitle: react.ForwardRefExoticComponent<CardTitleProps & react.RefAttributes<HTMLHeadingElement>>;
234
+ /** @experimental */
203
235
  type CardDescriptionProps = HTMLAttributes<HTMLParagraphElement>;
236
+ /** @experimental */
204
237
  declare const CardDescription: react.ForwardRefExoticComponent<CardDescriptionProps & react.RefAttributes<HTMLParagraphElement>>;
238
+ /** @experimental */
205
239
  type CardActionProps = HTMLAttributes<HTMLDivElement>;
240
+ /** @experimental */
206
241
  declare const CardAction: react.ForwardRefExoticComponent<CardActionProps & react.RefAttributes<HTMLDivElement>>;
242
+ /** @experimental */
207
243
  type CardContentProps = HTMLAttributes<HTMLDivElement>;
244
+ /** @experimental */
208
245
  declare const CardContent: react.ForwardRefExoticComponent<CardContentProps & react.RefAttributes<HTMLDivElement>>;
246
+ /** @experimental */
209
247
  type CardFooterProps = HTMLAttributes<HTMLDivElement>;
248
+ /** @experimental */
210
249
  declare const CardFooter: react.ForwardRefExoticComponent<CardFooterProps & react.RefAttributes<HTMLDivElement>>;
211
250
 
251
+ type Gap = 0 | 1 | 2 | 3 | 4 | 6 | 8;
252
+ type Cols = 1 | 2 | 3 | 4 | 6;
253
+ /** @experimental */
254
+ interface StackProps extends HTMLAttributes<HTMLDivElement> {
255
+ /** Main-axis direction. Default `col`. */
256
+ direction?: "col" | "row";
257
+ /** Gap between children (Tailwind spacing step). Default `4`. */
258
+ gap?: Gap;
259
+ }
260
+ /** Flex stack: vertical by default, horizontal with `direction="row"`.
261
+ * @experimental
262
+ */
263
+ declare const Stack: react.ForwardRefExoticComponent<StackProps & react.RefAttributes<HTMLDivElement>>;
264
+ /** @experimental */
265
+ interface GridProps extends HTMLAttributes<HTMLDivElement> {
266
+ /** Column count. Default `2`. */
267
+ cols?: Cols;
268
+ /** Gap between cells. Default `4`. */
269
+ gap?: Gap;
270
+ /**
271
+ * Collapse to one column in a narrow container. Off by default so existing
272
+ * callers keep the fixed column count they were written against.
273
+ */
274
+ responsive?: boolean;
275
+ }
276
+ /** Simple fixed-column grid, or a container-responsive one via `responsive`.
277
+ * @experimental
278
+ */
279
+ declare const Grid: react.ForwardRefExoticComponent<GridProps & react.RefAttributes<HTMLDivElement>>;
280
+ /** @experimental */
281
+ interface StatProps extends HTMLAttributes<HTMLDivElement> {
282
+ /** Muted label above the value. */
283
+ label: string;
284
+ /** The emphasized value (string or node). */
285
+ value: ReactNode;
286
+ }
287
+ /** Labelled metric block for dashboard-style plugin widgets.
288
+ * @experimental
289
+ */
290
+ declare const Stat: react.ForwardRefExoticComponent<StatProps & react.RefAttributes<HTMLDivElement>>;
291
+
212
292
  /**
213
293
  * Alert Component - Design System Specification
214
294
  *
@@ -217,7 +297,7 @@ declare const CardFooter: react.ForwardRefExoticComponent<CardFooterProps & reac
217
297
  *
218
298
  * Design Specs:
219
299
  * - Padding: 16px (p-4)
220
- * - Border radius: 0px (rounded-none) - intentionally smaller than Card (12px)
300
+ * - Border radius: `rounded-md`, one step tighter than Card's `rounded-lg`
221
301
  * for inline/flow content vs. larger container components
222
302
  * - Border: 1px solid matching variant color
223
303
  * - Shadow: sm (subtle elevation)
@@ -276,10 +356,12 @@ declare const CardFooter: react.ForwardRefExoticComponent<CardFooterProps & reac
276
356
  * - Success: <CheckCircle2 className="h-4 w-4" />
277
357
  * - Warning: <AlertTriangle className="h-4 w-4" />
278
358
  * - Destructive: <XCircle className="h-4 w-4" />
359
+ * @experimental
279
360
  */
280
361
  declare const alertVariants: (props?: ({
281
362
  variant?: "destructive" | "success" | "warning" | "info" | null | undefined;
282
363
  } & class_variance_authority_types.ClassProp) | undefined) => string;
364
+ /** @experimental */
283
365
  type AlertProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>;
284
366
  /**
285
367
  * Alert - Root container for alert messages
@@ -292,10 +374,12 @@ type AlertProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVari
292
374
  * <CheckCircle2 className="h-4 w-4" />
293
375
  * <AlertDescription>Operation completed successfully</AlertDescription>
294
376
  * </Alert>
377
+ * @experimental
295
378
  */
296
379
  declare const Alert: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
297
380
  variant?: "destructive" | "success" | "warning" | "info" | null | undefined;
298
381
  } & class_variance_authority_types.ClassProp) | undefined) => string> & react.RefAttributes<HTMLDivElement>>;
382
+ /** @experimental */
299
383
  type AlertTitleProps = HTMLAttributes<HTMLHeadingElement>;
300
384
  /**
301
385
  * AlertTitle - Heading text for alert message
@@ -305,8 +389,10 @@ type AlertTitleProps = HTMLAttributes<HTMLHeadingElement>;
305
389
  *
306
390
  * @example
307
391
  * <AlertTitle>Payment Successful</AlertTitle>
392
+ * @experimental
308
393
  */
309
394
  declare const AlertTitle: react.ForwardRefExoticComponent<AlertTitleProps & react.RefAttributes<HTMLHeadingElement>>;
395
+ /** @experimental */
310
396
  type AlertDescriptionProps = HTMLAttributes<HTMLDivElement>;
311
397
  /**
312
398
  * AlertDescription - Supporting detail text for alert message
@@ -318,9 +404,11 @@ type AlertDescriptionProps = HTMLAttributes<HTMLDivElement>;
318
404
  * <AlertDescription>
319
405
  * Your changes have been saved. <a href="/view">View details</a>
320
406
  * </AlertDescription>
407
+ * @experimental
321
408
  */
322
409
  declare const AlertDescription: react.ForwardRefExoticComponent<AlertDescriptionProps & react.RefAttributes<HTMLDivElement>>;
323
410
 
411
+ /** @experimental */
324
412
  declare function Separator({ className, orientation, decorative, ...props }: react.ComponentProps<typeof SeparatorPrimitive.Root>): react_jsx_runtime.JSX.Element;
325
413
 
326
414
  /**
@@ -332,7 +420,7 @@ declare function Separator({ className, orientation, decorative, ...props }: rea
332
420
  * @design_specs
333
421
  * - Background: bg-accent (slate-100 in light mode, slate-800 in dark mode)
334
422
  * - Animation: animate-pulse with motion-reduce:animate-none (respects prefers-reduced-motion)
335
- * - Border-radius: 0px (rounded-none)
423
+ * - Border-radius: `rounded-md` by default; override per placeholder shape
336
424
  * - Contrast: 3:1 minimum for WCAG 1.4.11 (Non-text Contrast) compliance
337
425
  *
338
426
  * @accessibility
@@ -352,13 +440,13 @@ declare function Separator({ className, orientation, decorative, ...props }: rea
352
440
  *
353
441
  * **Avatar Skeleton:**
354
442
  * ```tsx
355
- * <Skeleton className="h-12 w-12 rounded-none" />
443
+ * <Skeleton className="h-12 w-12 rounded-md" />
356
444
  * ```
357
445
  *
358
446
  * **Card Skeleton:**
359
447
  * ```tsx
360
448
  * <div className="space-y-3">
361
- * <Skeleton className="h-[125px] w-[250px] rounded-none" />
449
+ * <Skeleton className="h-[125px] w-[250px] rounded-lg" />
362
450
  * <div className="space-y-2">
363
451
  * <Skeleton className="h-4 w-[250px]" />
364
452
  * <Skeleton className="h-4 w-[200px]" />
@@ -372,7 +460,7 @@ declare function Separator({ className, orientation, decorative, ...props }: rea
372
460
  * {isLoading ? (
373
461
  * <>
374
462
  * <span className="sr-only">Loading user profile...</span>
375
- * <Skeleton className="h-12 w-12 rounded-none" />
463
+ * <Skeleton className="h-12 w-12 rounded-md" />
376
464
  * <Skeleton className="h-4 w-[200px]" />
377
465
  * </>
378
466
  * ) : (
@@ -395,20 +483,25 @@ declare function Separator({ className, orientation, decorative, ...props }: rea
395
483
  *
396
484
  * @see {@link https://ui.shadcn.com/docs/components/skeleton shadcn/ui Skeleton}
397
485
  * @see {@link https://adrianroselli.com/2020/11/more-accessible-skeletons.html More Accessible Skeletons}
486
+ * @experimental
398
487
  */
399
488
  declare const Skeleton: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
489
+ /** @experimental */
400
490
  type SkeletonProps = react.ComponentProps<"div">;
401
491
 
402
492
  /**
403
493
  * Progress variants using CVA
404
494
  *
405
495
  * Defines color variants for different progress states.
496
+ *
497
+ * @experimental
406
498
  */
407
499
  declare const progressVariants: (props?: ({
408
500
  variant?: "default" | "success" | "error" | null | undefined;
409
501
  } & class_variance_authority_types.ClassProp) | undefined) => string;
410
502
  /**
411
503
  * Progress component props
504
+ * @experimental
412
505
  */
413
506
  type ProgressProps = {
414
507
  /**
@@ -433,7 +526,7 @@ type ProgressProps = {
433
526
  * Visual variant for different states
434
527
  *
435
528
  * - `default`: Primary blue (bg-primary-500)
436
- * - `success`: Green (bg-green-500)
529
+ * - `success`: Green (bg-success-500)
437
530
  * - `error`: Red (bg-destructive)
438
531
  *
439
532
  * @default "default"
@@ -476,6 +569,7 @@ type ProgressProps = {
476
569
  * );
477
570
  * }
478
571
  * ```
572
+ * @experimental
479
573
  */
480
574
  declare const Progress: react.ForwardRefExoticComponent<{
481
575
  /**
@@ -500,7 +594,7 @@ declare const Progress: react.ForwardRefExoticComponent<{
500
594
  * Visual variant for different states
501
595
  *
502
596
  * - `default`: Primary blue (bg-primary-500)
503
- * - `success`: Green (bg-green-500)
597
+ * - `success`: Green (bg-success-500)
504
598
  * - `error`: Red (bg-destructive)
505
599
  *
506
600
  * @default "default"
@@ -523,6 +617,7 @@ declare const Progress: react.ForwardRefExoticComponent<{
523
617
  "aria-label"?: string;
524
618
  } & react.HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
525
619
 
620
+ /** @public */
526
621
  declare const Checkbox: react.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & react.RefAttributes<HTMLButtonElement>, "ref"> & {
527
622
  indeterminate?: boolean;
528
623
  } & react.RefAttributes<HTMLButtonElement>>;
@@ -542,40 +637,58 @@ declare const Checkbox: react.ForwardRefExoticComponent<Omit<CheckboxPrimitive.C
542
637
  * Design Specs:
543
638
  * - Size: 16px (h-4 w-4) - Fixed size matching Checkbox
544
639
  * - Border: 1px solid, expands to 5px when checked (visual indicator)
545
- * - Border radius: Full (rounded-none)
640
+ * - Border radius: `rounded-full`. Round means "pick one" and square means
641
+ * "pick many"; a square radio would announce the wrong behaviour, so the
642
+ * shape is fixed and deliberately outside the `--radius` scale. Checkbox
643
+ * keeps the derived radius for the same reason.
546
644
  * - Transition: 150ms (consistent with design system)
547
645
  * - Focus ring: 2px ring with 2px offset
548
646
  *
549
647
  * Implementation Notes:
550
648
  * - Uses Radix UI primitives for robust accessibility
551
- * - Visual "checked" state achieved via border border-primary/5 expansion (border-[5px])
552
- * - No inner indicator needed - border border-primary/5 expansion provides clear visual feedback
553
- * - Hover state changes border border-primary/5 color for better interactivity
649
+ * - Visual "checked" state achieved via border border-border expansion (border-[5px])
650
+ * - No inner indicator needed - border border-border expansion provides clear visual feedback
651
+ * - Hover state changes border border-border color for better interactivity
652
+ * @public
554
653
  */
555
654
  declare const RadioGroup: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
655
+ /** @public */
556
656
  declare const RadioGroupItem: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
557
657
 
658
+ /**
659
+ * A pill track carrying a circular thumb is how a toggle is recognised, so both
660
+ * parts use `rounded-full` and stay outside the `--radius` scale: at any theme
661
+ * radius the switch must still read as a switch and not as a small checkbox.
662
+ * @public
663
+ */
558
664
  declare function Switch({ className, ...props }: ComponentProps<typeof Root$1>): react_jsx_runtime.JSX.Element;
559
665
 
666
+ /** @experimental */
560
667
  declare const Collapsible: react.ForwardRefExoticComponent<CollapsiblePrimitive.CollapsibleProps & react.RefAttributes<HTMLDivElement>>;
668
+ /** @experimental */
561
669
  declare const CollapsibleTrigger: react.ForwardRefExoticComponent<CollapsiblePrimitive.CollapsibleTriggerProps & react.RefAttributes<HTMLButtonElement>>;
670
+ /** @experimental */
562
671
  declare const CollapsibleContent: react.ForwardRefExoticComponent<CollapsiblePrimitive.CollapsibleContentProps & react.RefAttributes<HTMLDivElement>>;
563
672
 
564
673
  /**
565
674
  * Props for the Accordion root component
566
675
  * @see https://www.radix-ui.com/primitives/docs/components/accordion
676
+ * @experimental
567
677
  */
568
678
  type AccordionProps = ComponentPropsWithoutRef<typeof Root$2>;
569
679
  /**
570
680
  * Props for the AccordionItem component (container for trigger and content)
681
+ * @experimental
571
682
  */
572
683
  type AccordionItemProps = ComponentPropsWithoutRef<typeof Item>;
573
684
  /**
574
685
  * Props for the AccordionTrigger component (clickable header button)
686
+ * @experimental
575
687
  */
576
688
  type AccordionTriggerProps = ComponentPropsWithoutRef<typeof Trigger>;
577
689
  /**
578
690
  * Props for the AccordionContent component (collapsible content panel)
691
+ * @experimental
579
692
  */
580
693
  type AccordionContentProps = ComponentPropsWithoutRef<typeof Content>;
581
694
 
@@ -586,7 +699,7 @@ type AccordionContentProps = ComponentPropsWithoutRef<typeof Content>;
586
699
  * Built on Radix UI primitives with WAI-ARIA compliance.
587
700
  *
588
701
  * Design Specs:
589
- * - AccordionItem border: 1px bottom border border-primary/5 (border-b)
702
+ * - AccordionItem border: 1px bottom border border-border (border-b)
590
703
  * - AccordionTrigger padding: 16px vertical (py-4)
591
704
  * - AccordionTrigger font: font-medium (500 weight)
592
705
  * - AccordionContent padding: 16px bottom, 0 top (pb-4 pt-0)
@@ -671,18 +784,20 @@ type AccordionContentProps = ComponentPropsWithoutRef<typeof Content>;
671
784
  * ```
672
785
  *
673
786
  * @see https://www.radix-ui.com/primitives/docs/components/accordion
787
+ * @experimental
674
788
  */
675
789
  declare const Accordion: react.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & react.RefAttributes<HTMLDivElement>>;
676
790
  /**
677
791
  * AccordionItem - Container for trigger and content
678
792
  *
679
793
  * Design Specs:
680
- * - Border: 1px bottom border border-primary/5 (border-b) for visual separation
794
+ * - Border: 1px bottom border border-border (border-b) for visual separation
681
795
  * - Each item represents a collapsible section
682
796
  *
683
797
  * Accessibility:
684
798
  * - Each item requires a unique value prop for identification
685
799
  * - Disabled state can be set via disabled prop
800
+ * @experimental
686
801
  */
687
802
  declare const AccordionItem: react.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
688
803
  /**
@@ -707,6 +822,7 @@ declare const AccordionItem: react.ForwardRefExoticComponent<Omit<AccordionPrimi
707
822
  * - The ChevronDown icon is included by default
708
823
  * - Icon rotates 180° when item is expanded ([data-state=open])
709
824
  * - Trigger includes AccordionPrimitive.Header wrapper for proper semantics
825
+ * @experimental
710
826
  */
711
827
  declare const AccordionTrigger: react.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
712
828
  /**
@@ -728,6 +844,7 @@ declare const AccordionTrigger: react.ForwardRefExoticComponent<Omit<AccordionPr
728
844
  * - data-state="open": animate-accordion-down (Tailwind built-in)
729
845
  * - data-state="closed": animate-accordion-up (Tailwind built-in)
730
846
  * - Height transitions smoothly from 0 to auto
847
+ * @experimental
731
848
  */
732
849
  declare const AccordionContent: react.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
733
850
 
@@ -750,7 +867,9 @@ declare const AccordionContent: react.ForwardRefExoticComponent<Omit<AccordionPr
750
867
  * - 2xl: 80px (h-20 w-20) - For profile headers, large avatars
751
868
  *
752
869
  * **Design Specs**:
753
- * - Border radius: rounded-none (circular)
870
+ * - Border radius: `rounded-full`. A person's avatar is read as a circle, so it
871
+ * sits outside the `--radius` scale and stays circular at any theme radius.
872
+ * Non-identity content (media thumbnails) overrides back to a scale step.
754
873
  * - Background: bg-accent (slate-100 light, slate-800 dark)
755
874
  * - Text color: text-accent-foreground (slate-900 light, slate-100 dark)
756
875
  * - Fallback text scales with avatar size (text-xs to text-2xl)
@@ -790,6 +909,7 @@ declare const AccordionContent: react.ForwardRefExoticComponent<Omit<AccordionPr
790
909
  *
791
910
  * @see {@link https://www.radix-ui.com/primitives/docs/components/avatar Radix UI Avatar}
792
911
  * @see {@link https://github.com/nextlyhq/nextly/blob/main/ui-revamp/04-design-system-specification.md Design System Specification}
912
+ * @experimental
793
913
  */
794
914
  declare const avatarVariants: (props?: ({
795
915
  size?: "sm" | "md" | "lg" | "xl" | "2xl" | null | undefined;
@@ -800,6 +920,7 @@ declare const avatarVariants: (props?: ({
800
920
  * Container element for avatar image and fallback. Provides consistent sizing
801
921
  * and styling across the application. Uses React Context to pass size to
802
922
  * AvatarFallback for reliable text scaling.
923
+ * @experimental
803
924
  */
804
925
  declare const Avatar: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & class_variance_authority.VariantProps<(props?: ({
805
926
  size?: "sm" | "md" | "lg" | "xl" | "2xl" | null | undefined;
@@ -819,6 +940,7 @@ declare const Avatar: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLPro
819
940
  *
820
941
  * @example
821
942
  * <AvatarImage src="/users/john-doe.jpg" alt="John Doe" />
943
+ * @experimental
822
944
  */
823
945
  declare const AvatarImage: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "ref"> & react.RefAttributes<HTMLImageElement>>;
824
946
  /**
@@ -851,6 +973,7 @@ declare const AvatarImage: react.ForwardRefExoticComponent<Omit<react.DetailedHT
851
973
  * @example
852
974
  * // Custom delay before showing fallback
853
975
  * <AvatarFallback delayMs={300}>AB</AvatarFallback>
976
+ * @experimental
854
977
  */
855
978
  declare const AvatarFallback: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
856
979
  delayMs?: number;
@@ -861,6 +984,7 @@ declare const AvatarFallback: react.ForwardRefExoticComponent<Omit<react.Detaile
861
984
  *
862
985
  * Root container for displaying user avatars with image and fallback support.
863
986
  * Extends Radix UI Avatar.Root props with size variants.
987
+ * @experimental
864
988
  */
865
989
  type AvatarProps = ComponentPropsWithoutRef<"span"> & VariantProps<typeof avatarVariants> & {
866
990
  /**
@@ -882,6 +1006,7 @@ type AvatarProps = ComponentPropsWithoutRef<"span"> & VariantProps<typeof avatar
882
1006
  *
883
1007
  * Note: Both src and alt are optional to support dynamic loading scenarios.
884
1008
  * When src is undefined/empty, the AvatarFallback will be displayed instead.
1009
+ * @experimental
885
1010
  */
886
1011
  type AvatarImageProps = ComponentPropsWithoutRef<"img">;
887
1012
  /**
@@ -889,6 +1014,7 @@ type AvatarImageProps = ComponentPropsWithoutRef<"img">;
889
1014
  *
890
1015
  * Displays fallback content (typically user initials) when image fails to load.
891
1016
  * Extends Radix UI Avatar.Fallback props.
1017
+ * @experimental
892
1018
  */
893
1019
  type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
894
1020
  /**
@@ -901,18 +1027,12 @@ type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
901
1027
  /**
902
1028
  * Props for the Tabs root component
903
1029
  * @see https://www.radix-ui.com/primitives/docs/components/tabs
1030
+ * @public
904
1031
  */
905
1032
  type TabsProps = ComponentPropsWithoutRef<typeof Root$3>;
906
- /**
907
- * Props for the TabsList component (container for tab triggers)
908
- */
909
- type TabsListProps = ComponentPropsWithoutRef<typeof List>;
910
- /**
911
- * Props for the TabsTrigger component (clickable tab button)
912
- */
913
- type TabsTriggerProps = ComponentPropsWithoutRef<typeof Trigger$1>;
914
1033
  /**
915
1034
  * Props for the TabsContent component (content panel for each tab)
1035
+ * @public
916
1036
  */
917
1037
  type TabsContentProps = ComponentPropsWithoutRef<typeof Content$1>;
918
1038
 
@@ -923,8 +1043,9 @@ type TabsContentProps = ComponentPropsWithoutRef<typeof Content$1>;
923
1043
  * Built on Radix UI primitives with WAI-ARIA compliance.
924
1044
  *
925
1045
  * Design Specs:
926
- * - TabsList border-radius: 0px (rounded-none)
927
- * - TabsTrigger border-radius: 0px (rounded-none)
1046
+ * - TabsList border-radius: square, independent of `--radius`
1047
+ * - TabsTrigger border-radius: square, independent of `--radius`; the active
1048
+ * state is a 2px bottom border that has to stay flush with the tab edges
928
1049
  * - TabsList height: 40px (h-10)
929
1050
  * - TabsTrigger padding: 12px 24px (px-3 py-1.5)
930
1051
  * - Transition duration: 150ms (design system standard)
@@ -992,6 +1113,7 @@ type TabsContentProps = ComponentPropsWithoutRef<typeof Content$1>;
992
1113
  * ```
993
1114
  *
994
1115
  * @see https://www.radix-ui.com/primitives/docs/components/tabs
1116
+ * @public
995
1117
  */
996
1118
  declare const Tabs: react.ForwardRefExoticComponent<_radix_ui_react_tabs.TabsProps & react.RefAttributes<HTMLDivElement>>;
997
1119
  /**
@@ -1002,8 +1124,34 @@ declare const Tabs: react.ForwardRefExoticComponent<_radix_ui_react_tabs.TabsPro
1002
1124
  * - Border-radius: none (for underline style)
1003
1125
  * - Background: transparent
1004
1126
  * - Layout: inline-flex (horizontal by default, use orientation="vertical" on Tabs root for vertical)
1127
+ * @public
1005
1128
  */
1006
- declare const TabsList: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tabs.TabsListProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1129
+ declare const TabsList: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tabs.TabsListProps & react.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
1130
+ variant?: "default" | "ghost" | null | undefined;
1131
+ } & class_variance_authority_types.ClassProp) | undefined) => string> & {
1132
+ /**
1133
+ * Let a strip too wide for its container scroll sideways.
1134
+ *
1135
+ * The scroll container is a WRAPPER, never the list, and that is why this
1136
+ * prop exists rather than callers reaching for `overflow-x-auto`
1137
+ * themselves. Two things go wrong when the list is the scroller, and the
1138
+ * second is why the obvious remedy is also wrong:
1139
+ *
1140
+ * - Per the CSS overflow rules, `visible` computes to `auto` when the
1141
+ * other axis is neither `visible` nor `clip`, so `overflow-x` alone
1142
+ * always makes the element a VERTICAL scroll container too.
1143
+ * - `TabsTrigger` carries `-mb-0.5` so its 2px underline lands ON this
1144
+ * list's rail rather than below it. That pull-up puts content past the
1145
+ * content-box edge, which the new scroll container reports as vertical
1146
+ * overflow — so `overflow-y-hidden` would clip the 2px the underline is
1147
+ * made of, silencing a scrollbar by deleting the indicator.
1148
+ *
1149
+ * With the wrapper scrolling instead, the list keeps its rail and
1150
+ * `w-max min-w-full` makes that rail span the full scroll width rather
1151
+ * than stopping where the triggers do.
1152
+ */
1153
+ scrollable?: boolean;
1154
+ } & react.RefAttributes<HTMLDivElement>>;
1007
1155
  /**
1008
1156
  * TabsTrigger - Clickable tab button
1009
1157
  *
@@ -1012,8 +1160,8 @@ declare const TabsList: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tab
1012
1160
  * - Padding: 6px 16px (px-4 py-2)
1013
1161
  * - Font: text-sm (14px), font-medium (500)
1014
1162
  * - Transition: 150ms (design system standard)
1015
- * - Active state: blue text with blue bottom border border-primary/5 (2px)
1016
- * - Hover: blue text with blue bottom border border-primary/5
1163
+ * - Active state: the accent colour on the text and on the 2px trailing border
1164
+ * - Hover: the same accent, so the target reads before it is chosen
1017
1165
  * - Gmail-inspired clean underline style
1018
1166
  *
1019
1167
  * Accessibility:
@@ -1021,8 +1169,11 @@ declare const TabsList: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tab
1021
1169
  * - Focus ring: 2px with offset (WCAG 2.2 compliant)
1022
1170
  * - Disabled state: pointer-events-none, opacity-50
1023
1171
  * - Data attributes: [data-state="active|inactive"], [data-disabled]
1172
+ * @public
1024
1173
  */
1025
- declare const TabsTrigger: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tabs.TabsTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1174
+ declare const TabsTrigger: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tabs.TabsTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
1175
+ size?: "default" | "sm" | null | undefined;
1176
+ } & class_variance_authority_types.ClassProp) | undefined) => string> & react.RefAttributes<HTMLButtonElement>>;
1026
1177
  /**
1027
1178
  * TabsContent - Content panel for each tab
1028
1179
  *
@@ -1034,17 +1185,46 @@ declare const TabsTrigger: react.ForwardRefExoticComponent<Omit<_radix_ui_react_
1034
1185
  * - Focus indicator when navigating with Tab key
1035
1186
  * - Data attributes: [data-state="active|inactive"], [data-orientation]
1036
1187
  * - Only active content is visible, inactive content is hidden
1188
+ * @public
1037
1189
  */
1038
1190
  declare const TabsContent: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tabs.TabsContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1039
1191
 
1192
+ /**
1193
+ * The public prop types, DERIVED from the components rather than restated.
1194
+ *
1195
+ * `../types/tabs` describes the Radix props alone, so an alias taken from there
1196
+ * rejects `variant` and `size` — and a consumer typing a wrapper around
1197
+ * `TabsList` would be told the prop it can see in the signature does not exist.
1198
+ * Reading the component's own props keeps the two from drifting: a variant
1199
+ * added later reaches every consumer without a second edit.
1200
+ */
1201
+ /**
1202
+ * The list's props, including its `variant`.
1203
+ * @public
1204
+ */
1205
+ type TabsListProps = ComponentPropsWithoutRef<typeof TabsList>;
1206
+ /**
1207
+ * The trigger's props, including its `size`.
1208
+ * @public
1209
+ */
1210
+ type TabsTriggerProps = ComponentPropsWithoutRef<typeof TabsTrigger>;
1211
+
1212
+ /** @experimental */
1040
1213
  declare const TooltipProvider: react.FC<_radix_ui_react_tooltip.TooltipProviderProps>;
1214
+ /** @public */
1041
1215
  declare const Tooltip: react.FC<_radix_ui_react_tooltip.TooltipProps>;
1216
+ /** @public */
1042
1217
  declare const TooltipTrigger: react.ForwardRefExoticComponent<_radix_ui_react_tooltip.TooltipTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1218
+ /** @public */
1043
1219
  declare const TooltipContent: react.ForwardRefExoticComponent<Omit<_radix_ui_react_tooltip.TooltipContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1044
1220
 
1221
+ /** @experimental */
1045
1222
  declare const Popover: react.FC<PopoverPrimitive.PopoverProps>;
1223
+ /** @experimental */
1046
1224
  declare const PopoverTrigger: react.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1225
+ /** @experimental */
1047
1226
  declare const PopoverAnchor: react.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & react.RefAttributes<HTMLDivElement>>;
1227
+ /** @experimental */
1048
1228
  declare const PopoverContent: react.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1049
1229
 
1050
1230
  /**
@@ -1078,9 +1258,9 @@ declare const PopoverContent: react.ForwardRefExoticComponent<Omit<PopoverPrimit
1078
1258
  * ```
1079
1259
  *
1080
1260
  * @design-spec
1081
- * - Border-radius: 0px (rounded-none) per design system spec
1261
+ * - Border-radius: `rounded-lg`, the container step of the `--radius` scale
1082
1262
  * - Max-width: 512px (default), responsive sizes available
1083
- * - Backdrop: black/80 with blur effect
1263
+ * - Backdrop: the `--nx-overlay` scrim with blur effect
1084
1264
  * - Padding: 24px (p-6)
1085
1265
  * - Shadow: xl for prominence (elevation level 4)
1086
1266
  * - Transition: 150ms per design system
@@ -1093,15 +1273,22 @@ declare const PopoverContent: react.ForwardRefExoticComponent<Omit<PopoverPrimit
1093
1273
  * - Includes ARIA labels and descriptions
1094
1274
  * - Screen reader announcements via role="dialog"
1095
1275
  * - Close button has sr-only text for screen readers
1276
+ * @public
1096
1277
  */
1097
1278
  declare const Dialog: react.FC<DialogPrimitive.DialogProps>;
1279
+ /** @experimental */
1098
1280
  declare const DialogTrigger: react.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1281
+ /** @experimental */
1099
1282
  declare const DialogPortal: react.FC<DialogPrimitive.DialogPortalProps>;
1283
+ /** @experimental */
1100
1284
  declare const DialogClose: react.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
1285
+ /** @experimental */
1101
1286
  type DialogOverlayProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;
1102
1287
  /**
1103
1288
  * DialogOverlay - The backdrop overlay behind the dialog content.
1104
- * Renders with black/80 opacity and blur effect per design spec.
1289
+ * Renders the `--nx-overlay` scrim with a blur effect. The opacity is the
1290
+ * token's, not a literal: it differs by mode and a host can retheme it.
1291
+ * @experimental
1105
1292
  */
1106
1293
  declare const DialogOverlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1107
1294
  /**
@@ -1112,10 +1299,12 @@ declare const DialogOverlay: react.ForwardRefExoticComponent<Omit<DialogPrimitiv
1112
1299
  * @variant lg - Large dialog (672px / max-w-2xl) - complex forms, data tables
1113
1300
  * @variant xl - Extra large dialog (896px / max-w-4xl) - content editors, media galleries
1114
1301
  * @variant full - Full width with margin (responsive) - fullscreen on mobile
1302
+ * @experimental
1115
1303
  */
1116
1304
  declare const dialogContentVariants: (props?: ({
1117
1305
  size?: "sm" | "md" | "lg" | "xl" | "full" | null | undefined;
1118
1306
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1307
+ /** @public */
1119
1308
  type DialogContentProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & VariantProps<typeof dialogContentVariants>;
1120
1309
  /**
1121
1310
  * DialogContent - The main dialog content container.
@@ -1128,16 +1317,20 @@ type DialogContentProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Conten
1128
1317
  * Your content here
1129
1318
  * </DialogContent>
1130
1319
  * ```
1320
+ * @public
1131
1321
  */
1132
1322
  declare const DialogContent: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
1133
1323
  size?: "sm" | "md" | "lg" | "xl" | "full" | null | undefined;
1134
1324
  } & class_variance_authority_types.ClassProp) | undefined) => string> & react.RefAttributes<HTMLDivElement>>;
1325
+ /** @public */
1135
1326
  type DialogHeaderProps = HTMLAttributes<HTMLDivElement>;
1136
1327
  /**
1137
1328
  * DialogHeader - Container for dialog title and description.
1138
1329
  * Provides consistent spacing and alignment (centered on mobile, left-aligned on desktop).
1330
+ * @public
1139
1331
  */
1140
1332
  declare const DialogHeader: react.ForwardRefExoticComponent<DialogHeaderProps & react.RefAttributes<HTMLDivElement>>;
1333
+ /** @public */
1141
1334
  type DialogFooterProps = HTMLAttributes<HTMLDivElement>;
1142
1335
  /**
1143
1336
  * DialogFooter - Container for dialog action buttons.
@@ -1150,16 +1343,20 @@ type DialogFooterProps = HTMLAttributes<HTMLDivElement>;
1150
1343
  * <Button type="submit">Save Changes</Button>
1151
1344
  * </DialogFooter>
1152
1345
  * ```
1346
+ * @public
1153
1347
  */
1154
1348
  declare const DialogFooter: react.ForwardRefExoticComponent<DialogFooterProps & react.RefAttributes<HTMLDivElement>>;
1349
+ /** @public */
1155
1350
  type DialogTitleProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;
1156
1351
  /**
1157
1352
  * DialogTitle - The title of the dialog.
1158
1353
  * Uses text-lg (18px) with semibold weight per design system.
1159
1354
  *
1160
1355
  * @accessibility Required for screen readers. Always include a DialogTitle.
1356
+ * @public
1161
1357
  */
1162
1358
  declare const DialogTitle: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
1359
+ /** @public */
1163
1360
  type DialogDescriptionProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;
1164
1361
  /**
1165
1362
  * DialogDescription - The description text of the dialog.
@@ -1167,52 +1364,72 @@ type DialogDescriptionProps = ComponentPropsWithoutRef<typeof DialogPrimitive.De
1167
1364
  *
1168
1365
  * @accessibility Provides additional context for screen readers.
1169
1366
  * If not needed visually, you can use sr-only class.
1367
+ * @public
1170
1368
  */
1171
1369
  declare const DialogDescription: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
1172
1370
 
1371
+ /** @experimental */
1173
1372
  declare const AlertDialog: react.FC<AlertDialogPrimitive.AlertDialogProps>;
1373
+ /** @experimental */
1174
1374
  declare const AlertDialogTrigger: react.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1375
+ /** @experimental */
1175
1376
  declare const AlertDialogPortal: react.FC<AlertDialogPrimitive.AlertDialogPortalProps>;
1377
+ /** @experimental */
1176
1378
  type AlertDialogOverlayProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>;
1177
1379
  /**
1178
1380
  * AlertDialogOverlay - The backdrop overlay behind the dialog content.
1381
+ * @experimental
1179
1382
  */
1180
1383
  declare const AlertDialogOverlay: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1384
+ /** @experimental */
1181
1385
  type AlertDialogContentProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>;
1182
1386
  /**
1183
1387
  * AlertDialogContent - The main dialog content container.
1388
+ * @experimental
1184
1389
  */
1185
1390
  declare const AlertDialogContent: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1391
+ /** @experimental */
1186
1392
  type AlertDialogHeaderProps = HTMLAttributes<HTMLDivElement>;
1187
1393
  /**
1188
1394
  * AlertDialogHeader - Container for dialog title and description.
1395
+ * @experimental
1189
1396
  */
1190
1397
  declare const AlertDialogHeader: react.ForwardRefExoticComponent<AlertDialogHeaderProps & react.RefAttributes<HTMLDivElement>>;
1398
+ /** @experimental */
1191
1399
  type AlertDialogFooterProps = HTMLAttributes<HTMLDivElement>;
1192
1400
  /**
1193
1401
  * AlertDialogFooter - Container for dialog action buttons.
1402
+ * @experimental
1194
1403
  */
1195
1404
  declare const AlertDialogFooter: react.ForwardRefExoticComponent<AlertDialogFooterProps & react.RefAttributes<HTMLDivElement>>;
1405
+ /** @experimental */
1196
1406
  type AlertDialogTitleProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>;
1197
1407
  /**
1198
1408
  * AlertDialogTitle - The title of the alert dialog.
1409
+ * @experimental
1199
1410
  */
1200
1411
  declare const AlertDialogTitle: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
1412
+ /** @experimental */
1201
1413
  type AlertDialogDescriptionProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>;
1202
1414
  /**
1203
1415
  * AlertDialogDescription - The description text of the alert dialog.
1416
+ * @experimental
1204
1417
  */
1205
1418
  declare const AlertDialogDescription: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
1419
+ /** @experimental */
1206
1420
  type AlertDialogActionProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>;
1207
1421
  /**
1208
1422
  * AlertDialogAction - The primary action button (e.g., "Delete", "Confirm").
1209
1423
  * Styled as destructive by default.
1424
+ * @experimental
1210
1425
  */
1211
1426
  declare const AlertDialogAction: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1427
+ /** @experimental */
1212
1428
  type AlertDialogCancelProps = ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>;
1213
1429
  /**
1214
1430
  * AlertDialogCancel - The cancel button.
1215
1431
  * Styled as outline variant.
1432
+ * @experimental
1216
1433
  */
1217
1434
  declare const AlertDialogCancel: react.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1218
1435
 
@@ -1223,7 +1440,7 @@ declare const AlertDialogCancel: react.ForwardRefExoticComponent<Omit<AlertDialo
1223
1440
  * Provides context menus, action menus, and navigation menus with full keyboard support.
1224
1441
  *
1225
1442
  * **Design Specifications**:
1226
- * - Border-radius: 0px (rounded-none) - consistent with Dialog, Select
1443
+ * - Border-radius: `rounded-lg` for the menu surface, `rounded-sm` for items
1227
1444
  * - Padding: 4px (p-1) - compact spacing for menu items
1228
1445
  * - Shadow: shadow-md - floating element elevation
1229
1446
  * - Z-index: z-50 - above most content, below modals
@@ -1312,30 +1529,46 @@ declare const AlertDialogCancel: react.ForwardRefExoticComponent<Omit<AlertDialo
1312
1529
  * @see https://www.radix-ui.com/docs/primitives/components/dropdown-menu - Radix UI DropdownMenu
1313
1530
  */
1314
1531
 
1532
+ /** @public */
1315
1533
  declare const DropdownMenu: react.FC<DropdownMenuPrimitive.DropdownMenuProps>;
1534
+ /** @public */
1316
1535
  declare const DropdownMenuTrigger: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1536
+ /** @experimental */
1317
1537
  declare const DropdownMenuGroup: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & react.RefAttributes<HTMLDivElement>>;
1538
+ /** @experimental */
1318
1539
  declare const DropdownMenuPortal: react.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
1540
+ /** @experimental */
1319
1541
  declare const DropdownMenuSub: react.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
1542
+ /** @experimental */
1320
1543
  declare const DropdownMenuRadioGroup: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & react.RefAttributes<HTMLDivElement>>;
1544
+ /** @experimental */
1321
1545
  declare const DropdownMenuSubTrigger: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
1322
1546
  inset?: boolean;
1323
1547
  } & react.RefAttributes<HTMLDivElement>>;
1548
+ /** @experimental */
1324
1549
  declare const DropdownMenuSubContent: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1550
+ /** @public */
1325
1551
  declare const DropdownMenuContent: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1552
+ /** @public */
1326
1553
  declare const DropdownMenuItem: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
1327
1554
  inset?: boolean;
1328
1555
  } & react.RefAttributes<HTMLDivElement>>;
1556
+ /** @public */
1329
1557
  declare const DropdownMenuCheckboxItem: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1558
+ /** @experimental */
1330
1559
  declare const DropdownMenuRadioItem: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1560
+ /** @experimental */
1331
1561
  declare const DropdownMenuLabel: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
1332
1562
  inset?: boolean;
1333
1563
  } & react.RefAttributes<HTMLDivElement>>;
1564
+ /** @public */
1334
1565
  declare const DropdownMenuSeparator: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1566
+ /** @experimental */
1335
1567
  declare const DropdownMenuShortcut: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLSpanElement> & react.RefAttributes<HTMLSpanElement>>;
1336
1568
 
1337
1569
  /**
1338
1570
  * Props for the DropdownMenuSubTrigger component
1571
+ * @experimental
1339
1572
  */
1340
1573
  type DropdownMenuSubTriggerProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
1341
1574
  /**
@@ -1345,14 +1578,17 @@ type DropdownMenuSubTriggerProps = react.ComponentPropsWithoutRef<typeof Dropdow
1345
1578
  };
1346
1579
  /**
1347
1580
  * Props for the DropdownMenuSubContent component
1581
+ * @experimental
1348
1582
  */
1349
1583
  type DropdownMenuSubContentProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>;
1350
1584
  /**
1351
1585
  * Props for the DropdownMenuContent component
1586
+ * @public
1352
1587
  */
1353
1588
  type DropdownMenuContentProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>;
1354
1589
  /**
1355
1590
  * Props for the DropdownMenuItem component
1591
+ * @public
1356
1592
  */
1357
1593
  type DropdownMenuItemProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
1358
1594
  /**
@@ -1362,14 +1598,17 @@ type DropdownMenuItemProps = react.ComponentPropsWithoutRef<typeof DropdownMenuP
1362
1598
  };
1363
1599
  /**
1364
1600
  * Props for the DropdownMenuCheckboxItem component
1601
+ * @public
1365
1602
  */
1366
1603
  type DropdownMenuCheckboxItemProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>;
1367
1604
  /**
1368
1605
  * Props for the DropdownMenuRadioItem component
1606
+ * @experimental
1369
1607
  */
1370
1608
  type DropdownMenuRadioItemProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>;
1371
1609
  /**
1372
1610
  * Props for the DropdownMenuLabel component
1611
+ * @experimental
1373
1612
  */
1374
1613
  type DropdownMenuLabelProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
1375
1614
  /**
@@ -1379,10 +1618,12 @@ type DropdownMenuLabelProps = react.ComponentPropsWithoutRef<typeof DropdownMenu
1379
1618
  };
1380
1619
  /**
1381
1620
  * Props for the DropdownMenuSeparator component
1621
+ * @public
1382
1622
  */
1383
1623
  type DropdownMenuSeparatorProps = react.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>;
1384
1624
  /**
1385
1625
  * Props for the DropdownMenuShortcut component
1626
+ * @experimental
1386
1627
  */
1387
1628
  type DropdownMenuShortcutProps = react.HTMLAttributes<HTMLSpanElement>;
1388
1629
 
@@ -1400,15 +1641,15 @@ type DropdownMenuShortcutProps = react.HTMLAttributes<HTMLSpanElement>;
1400
1641
  * - Disabled state support
1401
1642
  *
1402
1643
  * Design Specs:
1403
- * - Height: sm=32px, default=40px, lg=44px (matches Input component)
1644
+ * - Height: sm=36px, default=40px, lg=44px (matches Input component)
1404
1645
  * - Padding: Horizontal 12px, vertical varies by size
1405
- * - Border radius: 0px (rounded-none)
1646
+ * - Border radius: `rounded-md` on the trigger, `rounded-lg` on the panel
1406
1647
  * - Border: 1px solid, changes on focus/error
1407
1648
  * - Transition: 150ms (consistent with design system)
1408
1649
  * - Font size: sm/default=14px (text-sm), lg=16px (text-base)
1409
1650
  *
1410
1651
  * Size Variants:
1411
- * - sm: Height 32px (h-8) - Compact forms, filters
1652
+ * - sm: Height 36px - Compact forms and filters, matching a small Button
1412
1653
  * - default: Height 40px (h-10) - Standard forms
1413
1654
  * - lg: Height 44px (h-11) - Prominent selects
1414
1655
  *
@@ -1419,23 +1660,101 @@ type DropdownMenuShortcutProps = react.HTMLAttributes<HTMLSpanElement>;
1419
1660
  * - Grouping support with labels
1420
1661
  * - Placeholder text support
1421
1662
  * - Error state via aria-invalid
1663
+ * @public
1422
1664
  */
1423
1665
  declare function Select({ ...props }: ComponentProps<typeof SelectPrimitive.Root>): react_jsx_runtime.JSX.Element;
1666
+ /** @experimental */
1424
1667
  declare function SelectGroup({ ...props }: ComponentProps<typeof SelectPrimitive.Group>): react_jsx_runtime.JSX.Element;
1668
+ /** @public */
1425
1669
  declare function SelectValue({ ...props }: ComponentProps<typeof SelectPrimitive.Value>): react_jsx_runtime.JSX.Element;
1670
+ /** @experimental */
1426
1671
  declare const selectTriggerVariants: (props?: ({
1427
1672
  size?: "default" | "sm" | "lg" | null | undefined;
1428
1673
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1674
+ /** @public */
1429
1675
  interface SelectTriggerProps extends ComponentProps<typeof SelectPrimitive.Trigger>, VariantProps<typeof selectTriggerVariants> {
1430
1676
  }
1677
+ /** @public */
1431
1678
  declare const SelectTrigger: react.ForwardRefExoticComponent<Omit<SelectTriggerProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1679
+ /** @public */
1432
1680
  declare function SelectContent({ className, children, position, ...props }: ComponentProps<typeof SelectPrimitive.Content>): react_jsx_runtime.JSX.Element;
1681
+ /** @experimental */
1433
1682
  declare function SelectLabel({ className, ...props }: ComponentProps<typeof SelectPrimitive.Label>): react_jsx_runtime.JSX.Element;
1683
+ /** @public */
1434
1684
  declare function SelectItem({ className, children, ...props }: ComponentProps<typeof SelectPrimitive.Item>): react_jsx_runtime.JSX.Element;
1685
+ /** @experimental */
1435
1686
  declare function SelectSeparator({ className, ...props }: ComponentProps<typeof SelectPrimitive.Separator>): react_jsx_runtime.JSX.Element;
1687
+ /** @experimental */
1436
1688
  declare function SelectScrollUpButton({ className, ...props }: ComponentProps<typeof SelectPrimitive.ScrollUpButton>): react_jsx_runtime.JSX.Element;
1689
+ /** @experimental */
1437
1690
  declare function SelectScrollDownButton({ className, ...props }: ComponentProps<typeof SelectPrimitive.ScrollDownButton>): react_jsx_runtime.JSX.Element;
1438
1691
 
1692
+ /**
1693
+ * Sheet Component Types
1694
+ *
1695
+ * TypeScript type definitions for the Sheet component (Dialog variant).
1696
+ */
1697
+
1698
+ /**
1699
+ * Sheet root component props
1700
+ * Extends Radix UI Dialog.Root props
1701
+ * @public
1702
+ */
1703
+ type SheetProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;
1704
+ /**
1705
+ * Sheet trigger component props
1706
+ * Extends Radix UI Dialog.Trigger props
1707
+ * @experimental
1708
+ */
1709
+ type SheetTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;
1710
+ /**
1711
+ * Sheet close component props
1712
+ * Extends Radix UI Dialog.Close props
1713
+ * @experimental
1714
+ */
1715
+ type SheetCloseProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>;
1716
+ /**
1717
+ * Sheet overlay component props
1718
+ * Extends Radix UI Dialog.Overlay props
1719
+ * @experimental
1720
+ */
1721
+ type SheetOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;
1722
+ /**
1723
+ * Sheet header component props
1724
+ * Standard div props
1725
+ * @public
1726
+ */
1727
+ type SheetHeaderProps = React.HTMLAttributes<HTMLDivElement>;
1728
+ /**
1729
+ * Sheet footer component props
1730
+ * Standard div props
1731
+ * @experimental
1732
+ */
1733
+ type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;
1734
+ /**
1735
+ * Sheet title component props
1736
+ * Extends Radix UI Dialog.Title props
1737
+ * @public
1738
+ */
1739
+ type SheetTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;
1740
+ /**
1741
+ * Sheet description component props
1742
+ * Extends Radix UI Dialog.Description props
1743
+ * @public
1744
+ */
1745
+ type SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;
1746
+ /**
1747
+ * Sheet component refs
1748
+ * @experimental
1749
+ */
1750
+ type SheetOverlayRef = React.ElementRef<typeof DialogPrimitive.Overlay>;
1751
+ /** @experimental */
1752
+ type SheetContentRef = React.ElementRef<typeof DialogPrimitive.Content>;
1753
+ /** @experimental */
1754
+ type SheetTitleRef = React.ElementRef<typeof DialogPrimitive.Title>;
1755
+ /** @experimental */
1756
+ type SheetDescriptionRef = React.ElementRef<typeof DialogPrimitive.Description>;
1757
+
1439
1758
  /**
1440
1759
  * Sheet Component
1441
1760
  *
@@ -1448,7 +1767,7 @@ declare function SelectScrollDownButton({ className, ...props }: ComponentProps<
1448
1767
  *
1449
1768
  * - **Width**: 320px (sm), 400px (default), 512px (lg), 672px (xl), 100% (full)
1450
1769
  * - **Animation**: Slide-in from side (150ms duration)
1451
- * - **Backdrop**: Semi-transparent overlay (50% opacity with backdrop blur)
1770
+ * - **Backdrop**: the `--nx-overlay` scrim, with backdrop blur
1452
1771
  * - **z-index**: 50 (both overlay and content - content renders on top via DOM order)
1453
1772
  * - **Border-radius**: 0 (full-screen edges)
1454
1773
  *
@@ -1488,29 +1807,39 @@ declare function SelectScrollDownButton({ className, ...props }: ComponentProps<
1488
1807
  * ```
1489
1808
  *
1490
1809
  * @see https://www.radix-ui.com/primitives/docs/components/dialog
1810
+ * @public
1491
1811
  */
1492
- declare const Sheet: react.FC<DialogPrimitive.DialogProps>;
1812
+ declare const Sheet: {
1813
+ ({ modal, children, ...props }: SheetProps): react_jsx_runtime.JSX.Element;
1814
+ displayName: string;
1815
+ };
1816
+ /** @experimental */
1493
1817
  declare const SheetTrigger: react.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1818
+ /** @experimental */
1494
1819
  declare const SheetClose: react.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
1820
+ /** @experimental */
1495
1821
  declare const SheetPortal: react.FC<DialogPrimitive.DialogPortalProps>;
1496
1822
  /**
1497
1823
  * SheetOverlay
1498
1824
  *
1499
1825
  * Semi-transparent backdrop that appears behind the sheet.
1500
1826
  *
1501
- * - **Background**: Black with 50% opacity + backdrop blur
1827
+ * - **Background**: the `--nx-overlay` scrim + backdrop blur
1502
1828
  * - **Animation**: Fade in/out (150ms)
1503
1829
  * - **z-index**: 50
1830
+ * @experimental
1504
1831
  */
1505
1832
  declare const SheetOverlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1506
1833
  /**
1507
1834
  * Sheet Content Variants
1508
1835
  *
1509
1836
  * Defines slide-in animations for each side and size options.
1837
+ * @experimental
1510
1838
  */
1511
1839
  declare const sheetVariants: (props?: ({
1512
1840
  side?: "top" | "right" | "bottom" | "left" | null | undefined;
1513
1841
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1842
+ /** @public */
1514
1843
  interface SheetContentProps extends react.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, VariantProps<typeof sheetVariants> {
1515
1844
  }
1516
1845
  /**
@@ -1525,6 +1854,7 @@ interface SheetContentProps extends react.ComponentPropsWithoutRef<typeof Dialog
1525
1854
  * - **Close Button**: Positioned in top-right corner (16px from edges)
1526
1855
  *
1527
1856
  * @param side - Which edge to slide in from: "left", "right", "top", "bottom"
1857
+ * @public
1528
1858
  */
1529
1859
  declare const SheetContent: react.ForwardRefExoticComponent<SheetContentProps & react.RefAttributes<HTMLDivElement>>;
1530
1860
  /**
@@ -1534,6 +1864,7 @@ declare const SheetContent: react.ForwardRefExoticComponent<SheetContentProps &
1534
1864
  *
1535
1865
  * - **Layout**: Flex column with 6px gap
1536
1866
  * - **Text Alignment**: Left (default) or center
1867
+ * @public
1537
1868
  */
1538
1869
  declare const SheetHeader: {
1539
1870
  ({ className, ...props }: react.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
@@ -1546,6 +1877,7 @@ declare const SheetHeader: {
1546
1877
  *
1547
1878
  * - **Layout**: Flex row on desktop, column on mobile
1548
1879
  * - **Alignment**: Right-aligned on desktop, stretched on mobile
1880
+ * @experimental
1549
1881
  */
1550
1882
  declare const SheetFooter: {
1551
1883
  ({ className, ...props }: react.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
@@ -1559,6 +1891,7 @@ declare const SheetFooter: {
1559
1891
  * - **Font**: text-lg font-semibold
1560
1892
  * - **Color**: text-foreground
1561
1893
  * - **Required**: For accessibility (screen readers)
1894
+ * @public
1562
1895
  */
1563
1896
  declare const SheetTitle: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
1564
1897
  /**
@@ -1569,63 +1902,10 @@ declare const SheetTitle: react.ForwardRefExoticComponent<Omit<DialogPrimitive.D
1569
1902
  * - **Font**: text-sm
1570
1903
  * - **Color**: text-muted-foreground
1571
1904
  * - **Purpose**: Provide context for screen readers
1905
+ * @public
1572
1906
  */
1573
1907
  declare const SheetDescription: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
1574
1908
 
1575
- /**
1576
- * Sheet Component Types
1577
- *
1578
- * TypeScript type definitions for the Sheet component (Dialog variant).
1579
- */
1580
-
1581
- /**
1582
- * Sheet root component props
1583
- * Extends Radix UI Dialog.Root props
1584
- */
1585
- type SheetProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;
1586
- /**
1587
- * Sheet trigger component props
1588
- * Extends Radix UI Dialog.Trigger props
1589
- */
1590
- type SheetTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;
1591
- /**
1592
- * Sheet close component props
1593
- * Extends Radix UI Dialog.Close props
1594
- */
1595
- type SheetCloseProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>;
1596
- /**
1597
- * Sheet overlay component props
1598
- * Extends Radix UI Dialog.Overlay props
1599
- */
1600
- type SheetOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;
1601
- /**
1602
- * Sheet header component props
1603
- * Standard div props
1604
- */
1605
- type SheetHeaderProps = React.HTMLAttributes<HTMLDivElement>;
1606
- /**
1607
- * Sheet footer component props
1608
- * Standard div props
1609
- */
1610
- type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;
1611
- /**
1612
- * Sheet title component props
1613
- * Extends Radix UI Dialog.Title props
1614
- */
1615
- type SheetTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;
1616
- /**
1617
- * Sheet description component props
1618
- * Extends Radix UI Dialog.Description props
1619
- */
1620
- type SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;
1621
- /**
1622
- * Sheet component refs
1623
- */
1624
- type SheetOverlayRef = React.ElementRef<typeof DialogPrimitive.Overlay>;
1625
- type SheetContentRef = React.ElementRef<typeof DialogPrimitive.Content>;
1626
- type SheetTitleRef = React.ElementRef<typeof DialogPrimitive.Title>;
1627
- type SheetDescriptionRef = React.ElementRef<typeof DialogPrimitive.Description>;
1628
-
1629
1909
  /**
1630
1910
  * Command Component
1631
1911
  *
@@ -1651,7 +1931,7 @@ type SheetDescriptionRef = React.ElementRef<typeof DialogPrimitive.Description>;
1651
1931
  * @design-spec
1652
1932
  * - Input height: 48px (h-12) - larger for prominence
1653
1933
  * - Item height: 36px (h-9) desktop, 44px (h-11) mobile for touch
1654
- * - Border radius: 0px (rounded-none) for items
1934
+ * - Border radius: `rounded-lg` for the panel, `rounded-sm` for items
1655
1935
  * - Max list height: 400px (max-h-[400px])
1656
1936
  * - Transition: 150ms per design system
1657
1937
  *
@@ -1661,11 +1941,13 @@ type SheetDescriptionRef = React.ElementRef<typeof DialogPrimitive.Description>;
1661
1941
  * - Screen reader announcements for results
1662
1942
  * - Focus management and visual focus indicators
1663
1943
  * - WCAG 2.2 AA compliant (verified contrast ratios)
1944
+ * @experimental
1664
1945
  */
1665
1946
  type CommandProps = ComponentPropsWithoutRef<typeof Command$1>;
1666
1947
  /**
1667
1948
  * Command - Root container for the command palette.
1668
1949
  * Handles filtering, keyboard navigation, and accessibility.
1950
+ * @experimental
1669
1951
  */
1670
1952
  declare const Command: react.ForwardRefExoticComponent<Omit<{
1671
1953
  children?: React.ReactNode;
@@ -1684,7 +1966,31 @@ declare const Command: react.ForwardRefExoticComponent<Omit<{
1684
1966
  disablePointerSelection?: boolean;
1685
1967
  vimBindings?: boolean;
1686
1968
  } & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1687
- type CommandDialogProps = DialogPrimitive.DialogProps;
1969
+ /** @experimental */
1970
+ interface CommandDialogProps extends DialogPrimitive.DialogProps {
1971
+ /**
1972
+ * Passed to the command root this dialog renders internally.
1973
+ *
1974
+ * A seam rather than a list of forwarded props, because the settings a caller needs from the
1975
+ * root are the ones this component happens not to have thought of: `label`, which supplies the
1976
+ * search input's accessible name (cmdk renders an EMPTY hidden label without it, and an empty
1977
+ * `aria-labelledby` reference is worse than none — it stops the placeholder naming the field);
1978
+ * `filter` and `shouldFilter`, which decide match order; and `vimBindings`, which claims Ctrl+K
1979
+ * and Ctrl+N inside the list.
1980
+ *
1981
+ * `children` is excluded because this component owns the dialog's contents.
1982
+ */
1983
+ commandProps?: Omit<ComponentPropsWithoutRef<typeof Command>, "children">;
1984
+ /**
1985
+ * Passed to the dialog content this component renders internally.
1986
+ *
1987
+ * The seam that matters here is `onCloseAutoFocus`: this dialog has no trigger, so Radix has
1988
+ * nothing to hand focus back to, and it fires this at the point focus is actually being
1989
+ * returned — after the exit animation, which a timer set at close time cannot know the length
1990
+ * of. `className` is excluded because this component owns the dialog's own layout.
1991
+ */
1992
+ contentProps?: Omit<ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, "children" | "className">;
1993
+ }
1688
1994
  /**
1689
1995
  * CommandDialog - Command palette in a modal dialog.
1690
1996
  * Use this variant for Cmd+K keyboard shortcut pattern.
@@ -1711,12 +2017,15 @@ type CommandDialogProps = DialogPrimitive.DialogProps;
1711
2017
  * </CommandDialog>
1712
2018
  * )
1713
2019
  * ```
2020
+ * @experimental
1714
2021
  */
1715
- declare const CommandDialog: ({ children, ...props }: CommandDialogProps) => react_jsx_runtime.JSX.Element;
2022
+ declare const CommandDialog: ({ children, commandProps, contentProps, ...props }: CommandDialogProps) => react_jsx_runtime.JSX.Element;
2023
+ /** @experimental */
1716
2024
  type CommandInputProps = ComponentPropsWithoutRef<typeof Command$1.Input>;
1717
2025
  /**
1718
2026
  * CommandInput - Search input field for filtering commands.
1719
2027
  * Includes search icon and styled per design system.
2028
+ * @experimental
1720
2029
  */
1721
2030
  declare const CommandInput: react.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<react.DetailedHTMLProps<react.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "key" | keyof react.InputHTMLAttributes<HTMLInputElement>> & {
1722
2031
  ref?: React.Ref<HTMLInputElement>;
@@ -1726,10 +2035,12 @@ declare const CommandInput: react.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<
1726
2035
  value?: string;
1727
2036
  onValueChange?: (search: string) => void;
1728
2037
  } & react.RefAttributes<HTMLInputElement>, "ref"> & react.RefAttributes<HTMLInputElement>>;
2038
+ /** @experimental */
1729
2039
  type CommandListProps = ComponentPropsWithoutRef<typeof Command$1.List>;
1730
2040
  /**
1731
2041
  * CommandList - Scrollable container for command results.
1732
2042
  * Max height 400px per design spec to prevent tall dialogs.
2043
+ * @experimental
1733
2044
  */
1734
2045
  declare const CommandList: react.ForwardRefExoticComponent<Omit<{
1735
2046
  children?: React.ReactNode;
@@ -1740,10 +2051,12 @@ declare const CommandList: react.ForwardRefExoticComponent<Omit<{
1740
2051
  }, "asChild" | "key" | keyof HTMLAttributes<HTMLDivElement>> & {
1741
2052
  label?: string;
1742
2053
  } & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2054
+ /** @experimental */
1743
2055
  type CommandEmptyProps = ComponentPropsWithoutRef<typeof Command$1.Empty>;
1744
2056
  /**
1745
2057
  * CommandEmpty - Empty state message when no results found.
1746
2058
  * Centered text with muted color per design spec.
2059
+ * @experimental
1747
2060
  */
1748
2061
  declare const CommandEmpty: react.ForwardRefExoticComponent<Omit<{
1749
2062
  children?: React.ReactNode;
@@ -1752,10 +2065,12 @@ declare const CommandEmpty: react.ForwardRefExoticComponent<Omit<{
1752
2065
  } & {
1753
2066
  asChild?: boolean;
1754
2067
  }, "asChild" | "key" | keyof HTMLAttributes<HTMLDivElement>> & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2068
+ /** @experimental */
1755
2069
  type CommandGroupProps = ComponentPropsWithoutRef<typeof Command$1.Group>;
1756
2070
  /**
1757
2071
  * CommandGroup - Grouped section of commands with optional heading.
1758
2072
  * Heading styled as uppercase, small, semibold per design spec.
2073
+ * @experimental
1759
2074
  */
1760
2075
  declare const CommandGroup: react.ForwardRefExoticComponent<Omit<{
1761
2076
  children?: React.ReactNode;
@@ -1768,10 +2083,12 @@ declare const CommandGroup: react.ForwardRefExoticComponent<Omit<{
1768
2083
  value?: string;
1769
2084
  forceMount?: boolean;
1770
2085
  } & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2086
+ /** @experimental */
1771
2087
  type CommandSeparatorProps = ComponentPropsWithoutRef<typeof Command$1.Separator>;
1772
2088
  /**
1773
2089
  * CommandSeparator - Visual divider between command groups.
1774
- * 1px line with border border-primary/5 color, 8px margin top/bottom.
2090
+ * 1px line with border border-border color, 8px margin top/bottom.
2091
+ * @experimental
1775
2092
  */
1776
2093
  declare const CommandSeparator: react.ForwardRefExoticComponent<Omit<Pick<Pick<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof HTMLAttributes<HTMLDivElement>> & {
1777
2094
  ref?: React.Ref<HTMLDivElement>;
@@ -1780,11 +2097,13 @@ declare const CommandSeparator: react.ForwardRefExoticComponent<Omit<Pick<Pick<r
1780
2097
  }, "asChild" | "key" | keyof HTMLAttributes<HTMLDivElement>> & {
1781
2098
  alwaysRender?: boolean;
1782
2099
  } & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2100
+ /** @experimental */
1783
2101
  type CommandItemProps = ComponentPropsWithoutRef<typeof Command$1.Item>;
1784
2102
  /**
1785
2103
  * CommandItem - Individual selectable command item.
1786
2104
  * Height: 36px desktop, 44px mobile per design spec.
1787
2105
  * Includes hover, focus, and selected states.
2106
+ * @experimental
1788
2107
  */
1789
2108
  declare const CommandItem: react.ForwardRefExoticComponent<Omit<{
1790
2109
  children?: React.ReactNode;
@@ -1799,13 +2118,69 @@ declare const CommandItem: react.ForwardRefExoticComponent<Omit<{
1799
2118
  keywords?: string[];
1800
2119
  forceMount?: boolean;
1801
2120
  } & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2121
+ /** @experimental */
1802
2122
  type CommandShortcutProps = HTMLAttributes<HTMLSpanElement>;
1803
2123
  /**
1804
2124
  * CommandShortcut - Keyboard shortcut display (e.g., "⌘K", "↵ Enter").
1805
2125
  * Monospace font, subtle background, right-aligned per design spec.
2126
+ * @experimental
1806
2127
  */
1807
2128
  declare const CommandShortcut: react.ForwardRefExoticComponent<CommandShortcutProps & react.RefAttributes<HTMLSpanElement>>;
1808
2129
 
2130
+ /**
2131
+ * The command palette's default match scorer, re-exported.
2132
+ *
2133
+ * A caller that overrides `filter` — to keep an opaque item value out of the scoring, say — still
2134
+ * wants the ranking that comes for free, and reaching for `cmdk` directly is not open to every
2135
+ * package here.
2136
+ *
2137
+ * Bound to a declaration rather than re-exported with `export { x as y }`: the bundler keeps a doc
2138
+ * comment attached to a declaration and drops one attached to an export statement, so the release
2139
+ * tag would not reach the published types.
2140
+ *
2141
+ * @experimental
2142
+ */
2143
+ declare const commandDefaultFilter: (value: string, search: string, keywords?: string[]) => number;
2144
+ /**
2145
+ * The value of the item the palette has HIGHLIGHTED, from a component inside
2146
+ * it.
2147
+ *
2148
+ * The palette owns which item is highlighted, and it moves that highlight for
2149
+ * reasons a caller never sees: a pointer crossing an item, an arrow key, and a
2150
+ * filter that removes the item the highlight was on. Anything outside wanting
2151
+ * to follow it — a preview pane, a description strip, a status line — needs to
2152
+ * read that rather than keep a copy.
2153
+ *
2154
+ * Reading beats mirroring here for a specific reason rather than on principle.
2155
+ * The palette's controlled `value` sets which item is MARKED, and does not move
2156
+ * the internal cursor that `aria-activedescendant` and the scroll follow. So a
2157
+ * caller that writes the value to steer the highlight desynchronises the two:
2158
+ * the item drawn as current and the option announced as current stop agreeing,
2159
+ * and after a filter the announcement can name an element that has been
2160
+ * removed. A read leaves one owner and takes a derived view.
2161
+ *
2162
+ * NARROWED to the one field deliberately. The underlying library exposes its
2163
+ * whole store through a selector — the raw search text, its internal item and
2164
+ * group maps, the id it uses for `aria-activedescendant` — and publishing that
2165
+ * selector would make every one of those part of this kit's public API and its
2166
+ * generated declarations. A dependency upgrade could then reshape what callers
2167
+ * can reach without any export changing name, which is exactly what the
2168
+ * surface snapshot cannot see. This returns a string.
2169
+ *
2170
+ * Empty string means nothing is highlighted, which is the library's own
2171
+ * spelling and a different answer from "an item whose value is unknown".
2172
+ *
2173
+ * Must be called from inside the palette, since that is where the state lives.
2174
+ *
2175
+ * Bound to a declaration rather than re-exported with `export { x as y }`: the
2176
+ * bundler keeps a doc comment attached to a declaration and drops one attached
2177
+ * to an export statement, so the release tag would not reach the published
2178
+ * types.
2179
+ *
2180
+ * @experimental
2181
+ */
2182
+ declare const useCommandHighlight: () => string;
2183
+
1809
2184
  /**
1810
2185
  * Spinner Component - Design System Specification
1811
2186
  *
@@ -1849,6 +2224,7 @@ declare const CommandShortcut: react.ForwardRefExoticComponent<CommandShortcutPr
1849
2224
  * @example
1850
2225
  * // Custom color
1851
2226
  * <Spinner className="text-primary" />
2227
+ * @experimental
1852
2228
  */
1853
2229
  declare const spinnerVariants: (props?: ({
1854
2230
  size?: "sm" | "md" | "lg" | null | undefined;
@@ -1858,6 +2234,7 @@ declare const spinnerVariants: (props?: ({
1858
2234
  *
1859
2235
  * Extends LucideProps to support all standard SVG attributes (data-*, id, etc.)
1860
2236
  * while providing size variants and accessibility features.
2237
+ * @experimental
1861
2238
  */
1862
2239
  type SpinnerProps = Omit<LucideProps, "size"> & VariantProps<typeof spinnerVariants> & {
1863
2240
  /**
@@ -1868,6 +2245,7 @@ type SpinnerProps = Omit<LucideProps, "size"> & VariantProps<typeof spinnerVaria
1868
2245
  };
1869
2246
  /**
1870
2247
  * Spinner component for loading states
2248
+ * @experimental
1871
2249
  */
1872
2250
  declare const Spinner: react.ForwardRefExoticComponent<Omit<SpinnerProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1873
2251
 
@@ -1936,9 +2314,9 @@ declare const Spinner: react.ForwardRefExoticComponent<Omit<SpinnerProps, "ref">
1936
2314
  *
1937
2315
  * Customization:
1938
2316
  * All styling uses CSS variables from the design system:
1939
- * - --normal-bg: Background color (uses --popover with fallback)
1940
- * - --normal-text: Text color (uses --popover-foreground with fallback)
1941
- * - --normal-border: Border color (uses --border with fallback)
2317
+ * - --normal-bg: Background color (uses --nx-popover with fallback)
2318
+ * - --normal-text: Text color (uses --nx-popover-foreground with fallback)
2319
+ * - --normal-border: Border color (uses --nx-border with fallback)
1942
2320
  * - --border-radius: Border radius (uses --radius with fallback)
1943
2321
  *
1944
2322
  * Security:
@@ -1960,20 +2338,30 @@ declare const Spinner: react.ForwardRefExoticComponent<Omit<SpinnerProps, "ref">
1960
2338
  *
1961
2339
  * @see https://sonner.emilkowal.ski/ - Sonner documentation
1962
2340
  * @see https://ui.shadcn.com/docs/components/sonner - shadcn/ui integration guide
2341
+ * @experimental
1963
2342
  */
1964
2343
  declare function Toaster({ theme, ...props }: ToasterProps): react_jsx_runtime.JSX.Element;
1965
2344
 
2345
+ /** @experimental */
1966
2346
  declare const Table: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableElement> & react.RefAttributes<HTMLTableElement>>;
2347
+ /** @experimental */
1967
2348
  declare const TableHeader: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableSectionElement> & react.RefAttributes<HTMLTableSectionElement>>;
2349
+ /** @experimental */
1968
2350
  declare const TableBody: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableSectionElement> & react.RefAttributes<HTMLTableSectionElement>>;
2351
+ /** @experimental */
1969
2352
  declare const TableFooter: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableSectionElement> & react.RefAttributes<HTMLTableSectionElement>>;
2353
+ /** @experimental */
1970
2354
  declare const TableRow: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableRowElement> & react.RefAttributes<HTMLTableRowElement>>;
2355
+ /** @experimental */
1971
2356
  declare const TableHead: react.ForwardRefExoticComponent<react.ThHTMLAttributes<HTMLTableCellElement> & react.RefAttributes<HTMLTableCellElement>>;
2357
+ /** @experimental */
1972
2358
  declare const TableCell: react.ForwardRefExoticComponent<react.TdHTMLAttributes<HTMLTableCellElement> & react.RefAttributes<HTMLTableCellElement>>;
2359
+ /** @experimental */
1973
2360
  declare const TableCaption: react.ForwardRefExoticComponent<react.HTMLAttributes<HTMLTableCaptionElement> & react.RefAttributes<HTMLTableCaptionElement>>;
1974
2361
 
1975
2362
  /**
1976
2363
  * Props for TableSearch component
2364
+ * @experimental
1977
2365
  */
1978
2366
  interface TableSearchProps {
1979
2367
  /** Current search value */
@@ -2008,11 +2396,13 @@ interface TableSearchProps {
2008
2396
  * isLoading={loading}
2009
2397
  * />
2010
2398
  * ```
2399
+ * @experimental
2011
2400
  */
2012
2401
  declare function TableSearch({ value, onChange, onClear, placeholder, isLoading, inputRef, }: TableSearchProps): react_jsx_runtime.JSX.Element;
2013
2402
 
2014
2403
  /**
2015
2404
  * Props for TableError component
2405
+ * @experimental
2016
2406
  */
2017
2407
  interface TableErrorProps {
2018
2408
  /** Error message to display */
@@ -2020,14 +2410,17 @@ interface TableErrorProps {
2020
2410
  }
2021
2411
  /**
2022
2412
  * Error state component for tables
2413
+ * @experimental
2023
2414
  */
2024
2415
  declare function TableError({ message, }: TableErrorProps): react_jsx_runtime.JSX.Element;
2025
2416
  /**
2026
2417
  * Loading state component for tables
2418
+ * @experimental
2027
2419
  */
2028
2420
  declare function TableLoading(): react_jsx_runtime.JSX.Element;
2029
2421
  /**
2030
2422
  * Props for TableEmpty component
2423
+ * @experimental
2031
2424
  */
2032
2425
  interface TableEmptyProps {
2033
2426
  /** Custom message to display when no data */
@@ -2035,9 +2428,97 @@ interface TableEmptyProps {
2035
2428
  }
2036
2429
  /**
2037
2430
  * Empty state component for tables
2431
+ * @experimental
2038
2432
  */
2039
2433
  declare function TableEmpty({ message }: TableEmptyProps): react_jsx_runtime.JSX.Element;
2040
2434
 
2435
+ /**
2436
+ * TableSkeleton Component
2437
+ *
2438
+ * Generic loading skeleton for data tables.
2439
+ * Renders header, body, and footer skeleton bars inside a card.
2440
+ * Unified with EntryTable skeleton pattern for consistency across all tables.
2441
+ */
2442
+
2443
+ /** @experimental */
2444
+ interface TableSkeletonProps {
2445
+ columns?: number;
2446
+ rowCount?: number;
2447
+ hideWrapper?: boolean;
2448
+ hideFooter?: boolean;
2449
+ }
2450
+ /** @experimental */
2451
+ declare const TableSkeleton: react.FC<TableSkeletonProps>;
2452
+
2453
+ /**
2454
+ * One preset a host offers.
2455
+ *
2456
+ * `color` is what the swatch is PAINTED with. `value` is what `onSwatchSelect`
2457
+ * hands back, unread by this component — a host storing design tokens puts its
2458
+ * own token reference there and receives it unchanged, so choosing a swatch
2459
+ * never resolves a token into the colour it currently happens to be. Without
2460
+ * that, re-theming stops moving the values that pointed at it.
2461
+ *
2462
+ * @experimental
2463
+ */
2464
+ interface ColorSwatch<TValue = string> {
2465
+ id: string;
2466
+ label: string;
2467
+ color: string;
2468
+ value?: TValue;
2469
+ }
2470
+ /**
2471
+ * Props for ColorPicker.
2472
+ * @experimental
2473
+ */
2474
+ interface ColorPickerProps<TValue = string> {
2475
+ /** The colour shown on the surface, as hex. */
2476
+ color: string;
2477
+ /** A colour was chosen by editing — surface, hue, alpha or the hex field. */
2478
+ onColorChange: (color: string) => void;
2479
+ /** Presets. Painted from `color`, returned by `value`. */
2480
+ swatches?: ColorSwatch<TValue>[];
2481
+ /**
2482
+ * A preset was chosen. Separate from `onColorChange` because only the host
2483
+ * can say what a swatch MEANS: the two are different events, and collapsing
2484
+ * them is what loses a token reference.
2485
+ */
2486
+ onSwatchSelect?: (swatch: ColorSwatch<TValue>) => void;
2487
+ /**
2488
+ * Recently used colours. Owned by the host, never by this component — the
2489
+ * admin scopes them per user, and a component writing `localStorage` at
2490
+ * render is unusable on a server and untestable without a DOM.
2491
+ */
2492
+ recentColors?: string[];
2493
+ /** Alpha channel. Off by default: most call sites want an opaque colour. */
2494
+ showAlpha?: boolean;
2495
+ className?: string;
2496
+ }
2497
+ /**
2498
+ * A colour control: a saturation square, a hue strip, optional alpha, a hex
2499
+ * field, and any presets the host supplies.
2500
+ *
2501
+ * Deliberately knows nothing about design tokens. A swatch carries an opaque
2502
+ * `value` this component never reads and hands back untouched, so a host can
2503
+ * store a token reference and keep it. That is what lets one component serve
2504
+ * both a plain colour field and a token-aware surface without either learning
2505
+ * about the other.
2506
+ *
2507
+ * @experimental
2508
+ *
2509
+ * @example
2510
+ * ```tsx
2511
+ * <ColorPicker
2512
+ * color={color}
2513
+ * onColorChange={setColor}
2514
+ * swatches={tokens.map(t => ({ id: t.name, label: t.name, color: t.value, value: { $token: t.name } }))}
2515
+ * onSwatchSelect={s => store(s.value)}
2516
+ * />
2517
+ * ```
2518
+ */
2519
+ declare function ColorPicker<TValue = string>({ color, onColorChange, swatches, onSwatchSelect, recentColors, showAlpha, className, }: ColorPickerProps<TValue>): react_jsx_runtime.JSX.Element;
2520
+
2521
+ /** @experimental */
2041
2522
  interface PaginationMeta {
2042
2523
  total: number;
2043
2524
  page: number;
@@ -2046,14 +2527,17 @@ interface PaginationMeta {
2046
2527
  hasNext: boolean;
2047
2528
  hasPrev: boolean;
2048
2529
  }
2530
+ /** @experimental */
2049
2531
  interface SortInfo {
2050
2532
  field: string;
2051
2533
  direction: "asc" | "desc";
2052
2534
  }
2535
+ /** @experimental */
2053
2536
  interface FilterInfo {
2054
2537
  search?: string;
2055
2538
  filters?: Record<string, unknown>;
2056
2539
  }
2540
+ /** @experimental */
2057
2541
  interface TableParams {
2058
2542
  pagination: {
2059
2543
  page: number;
@@ -2062,258 +2546,934 @@ interface TableParams {
2062
2546
  sorting?: SortInfo[];
2063
2547
  filters?: FilterInfo;
2064
2548
  }
2549
+ /** @experimental */
2065
2550
  interface ListResponse<TData> {
2066
2551
  items: TData[];
2067
2552
  meta: PaginationMeta;
2068
2553
  }
2554
+ /** @experimental */
2069
2555
  interface PaginationConfig {
2070
2556
  pageSize?: number;
2071
2557
  pageSizeOptions?: number[];
2072
2558
  showPageSizeSelector?: boolean;
2073
2559
  maxVisiblePages?: number;
2074
2560
  }
2561
+ /** @experimental */
2075
2562
  interface ActionCallbacks<TData = unknown> {
2076
2563
  onEdit?: (item: TData) => void;
2077
2564
  onDelete?: (item: TData) => void;
2078
2565
  onView?: (item: TData) => void;
2079
2566
  }
2567
+ /** @experimental */
2080
2568
  type DataFetcher<TData> = (params: TableParams) => Promise<ListResponse<TData>>;
2081
2569
 
2082
- /**
2083
- * Props for TablePagination component
2084
- */
2085
- interface TablePaginationProps {
2086
- /** Pagination metadata from server */
2087
- meta: PaginationMeta;
2088
- /** Callback when page changes */
2089
- onPageChange: (page: number) => void;
2090
- /** Callback when page size changes */
2091
- onPageSizeChange: (pageSize: number) => void;
2092
- /** Pagination configuration */
2093
- config?: Required<PaginationConfig>;
2094
- /** Whether data is currently loading */
2095
- isLoading?: boolean;
2570
+ interface PortalProviderProps {
2571
+ /** The DOM element to portal overlay content into. Defaults to document.body (Radix default). */
2572
+ container: HTMLElement | null;
2573
+ children: ReactNode;
2096
2574
  }
2575
+ /** @public */
2576
+ declare function PortalProvider({ container, children }: PortalProviderProps): react_jsx_runtime.JSX.Element;
2577
+ /** @public */
2578
+ declare function usePortalContainer(): HTMLElement | undefined;
2579
+
2580
+ /** @experimental */
2581
+ declare const ContextMenu: react.FC<ContextMenuPrimitive.ContextMenuProps>;
2582
+ /** @experimental */
2583
+ declare const ContextMenuTrigger: react.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuTriggerProps & react.RefAttributes<HTMLSpanElement>>;
2584
+ /** @experimental */
2585
+ declare const ContextMenuGroup: react.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuGroupProps & react.RefAttributes<HTMLDivElement>>;
2586
+ /** @experimental */
2587
+ declare const ContextMenuSub: react.FC<ContextMenuPrimitive.ContextMenuSubProps>;
2588
+ /** @experimental */
2589
+ declare const ContextMenuRadioGroup: react.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuRadioGroupProps & react.RefAttributes<HTMLDivElement>>;
2590
+ /** @experimental */
2591
+ declare const ContextMenuSubTrigger: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubTriggerProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
2592
+ inset?: boolean;
2593
+ } & react.RefAttributes<HTMLDivElement>>;
2594
+ /** @experimental */
2595
+ declare const ContextMenuSubContent: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2596
+ /** @experimental */
2597
+ declare const ContextMenuContent: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2598
+ /** @experimental */
2599
+ declare const ContextMenuItem: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
2600
+ inset?: boolean;
2601
+ } & react.RefAttributes<HTMLDivElement>>;
2602
+ /** @experimental */
2603
+ declare const ContextMenuCheckboxItem: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuCheckboxItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2604
+ /** @experimental */
2605
+ declare const ContextMenuRadioItem: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuRadioItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2606
+ /** @experimental */
2607
+ declare const ContextMenuLabel: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuLabelProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
2608
+ inset?: boolean;
2609
+ } & react.RefAttributes<HTMLDivElement>>;
2610
+ /** @experimental */
2611
+ declare const ContextMenuSeparator: react.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2097
2612
  /**
2098
- * Pagination controls for tables
2613
+ * A keyboard shortcut hint, right-aligned in the item.
2614
+ *
2615
+ * @experimental
2099
2616
  */
2100
- declare function TablePagination({ meta, onPageChange, onPageSizeChange, config, isLoading, }: TablePaginationProps): react_jsx_runtime.JSX.Element;
2617
+ declare const ContextMenuShortcut: {
2618
+ ({ className, ...props }: react.HTMLAttributes<HTMLSpanElement>): react_jsx_runtime.JSX.Element;
2619
+ displayName: string;
2620
+ };
2101
2621
 
2102
2622
  /**
2103
- * TableSkeleton Component
2623
+ * A splitter's accessible name, which the caller must supply one way or the
2624
+ * other.
2625
+ *
2626
+ * REQUIRED rather than documented, because the handle is focusable: a keyboard
2627
+ * user lands on it whether or not anyone remembered, and an unnamed separator
2628
+ * announces its position — "74" — with nothing saying what is at 74. The
2629
+ * caller is the only one who can name it, since only the caller knows what the
2630
+ * two panels hold, so the type is the only place the requirement can live.
2631
+ *
2632
+ * Either attribute satisfies it and neither may be paired with the other: two
2633
+ * names on one element is not a stronger label, it is an ambiguity resolved by
2634
+ * precedence rules nobody writing the call site is thinking about.
2635
+ */
2636
+ type SplitterName = {
2637
+ "aria-label": string;
2638
+ "aria-labelledby"?: never;
2639
+ } | {
2640
+ "aria-labelledby": string;
2641
+ "aria-label"?: never;
2642
+ };
2643
+ /**
2644
+ * A group of resizable panels, laid out horizontally or vertically.
2104
2645
  *
2105
- * Generic loading skeleton for data tables.
2106
- * Renders header, body, and footer skeleton bars inside a card.
2107
- * Unified with EntryTable skeleton pattern for consistency across all tables.
2646
+ * @experimental
2108
2647
  */
2109
-
2110
- interface TableSkeletonProps {
2111
- columns?: number;
2112
- rowCount?: number;
2113
- hideWrapper?: boolean;
2114
- hideFooter?: boolean;
2115
- }
2116
- declare const TableSkeleton: react.FC<TableSkeletonProps>;
2648
+ declare const ResizablePanelGroup: ({ className, ...props }: react.ComponentProps<typeof ResizablePrimitive.Group>) => react_jsx_runtime.JSX.Element;
2649
+ /**
2650
+ * One region of a panel group.
2651
+ *
2652
+ * @experimental
2653
+ */
2654
+ declare const ResizablePanel: typeof ResizablePrimitive.Panel;
2655
+ /**
2656
+ * The draggable divider between two panels.
2657
+ *
2658
+ * The visible line is 1px; the element around it is wider and transparent, so the pointer target
2659
+ * is comfortably larger than the line it appears to grab. `withGrip` adds a visible handle, which
2660
+ * is worth it on a divider people are meant to discover rather than one they already expect.
2661
+ *
2662
+ * @experimental
2663
+ */
2664
+ declare const ResizableHandle: ({ withGrip, className, children, ...props }: Omit<react.ComponentProps<typeof ResizablePrimitive.Separator>, "aria-label" | "aria-labelledby"> & SplitterName & {
2665
+ withGrip?: boolean;
2666
+ }) => react_jsx_runtime.JSX.Element;
2117
2667
 
2118
2668
  /**
2119
- * Column definition for ResponsiveTable
2669
+ * TreeView
2670
+ *
2671
+ * A keyboard-operable, virtualized tree. The layers panel of an editor is this control: a
2672
+ * hierarchy that can hold thousands of nodes, that someone navigates with arrow keys as much as
2673
+ * with a pointer, and that has to stay responsive while they do.
2120
2674
  *
2121
- * Provides type-safe column definitions with proper type narrowing for render functions.
2675
+ * **Why virtualized, and why that decides the markup.** A document of a few thousand blocks
2676
+ * renders a few thousand rows, and the cost is not the React work — it is layout and paint on
2677
+ * every expand, scroll and selection. Only the visible window is rendered here.
2122
2678
  *
2123
- * @template T - The data type of items in the table
2124
- * @template K - The specific key from T (defaults to any key of T)
2679
+ * That has a consequence the accessibility notes below depend on: with only a window in the DOM,
2680
+ * the nested `role="group"` markup the tree pattern usually uses **cannot be built**, because an
2681
+ * item's children may not be rendered at all. The APG covers this exact case by allowing a FLAT
2682
+ * set of `treeitem`s that describe the hierarchy through `aria-level`, `aria-setsize` and
2683
+ * `aria-posinset` instead of through nesting. A screen reader reads depth and position from those
2684
+ * attributes, so they are not decoration — without them a virtualized tree announces itself as a
2685
+ * flat list of whatever happens to be on screen.
2686
+ *
2687
+ * **Why a headless virtualizer.** The markup above is the requirement, so anything that owns the
2688
+ * DOM is unusable. `@tanstack/react-virtual` computes offsets and renders nothing.
2689
+ *
2690
+ * **State is controllable, not controlled.** `expandedIds`/`selectedId` may be passed with their
2691
+ * `onChange` partners to drive the tree from a store — which an editor will do, since selection is
2692
+ * shared with the canvas and the inspector — or omitted entirely, in which case the tree keeps its
2693
+ * own. Requiring a store for a tree in a settings dialog would be a poor trade.
2694
+ *
2695
+ * **Design specifications**:
2696
+ * - Row height: fixed 28px (`--tree-row`), so the virtualizer needs no measurement pass
2697
+ * - Indent: 12px per level, applied as padding so the whole row stays a hit target
2698
+ * - Selection: `bg-muted`, matching the menu highlight rather than a full-contrast flip
2699
+ * - Focus: `focus-visible` ring in the focus token
2700
+ *
2701
+ * **Accessibility**:
2702
+ * - `role="tree"` with flat `role="treeitem"` children carrying `aria-level`, `aria-setsize`,
2703
+ * `aria-posinset`, and `aria-expanded` on anything with children
2704
+ * - Roving tabindex: exactly one row is in the tab order, so Tab enters and leaves the tree once
2705
+ * rather than walking every node
2706
+ * - Arrow keys move and expand, per the APG tree pattern: Right expands then descends, Left
2707
+ * collapses then ascends, Home/End jump to the ends, `*` expands every sibling
2708
+ * - Typeahead focuses the next row whose label starts with what was typed
2709
+ * - Moving focus scrolls the row into view, which virtualization would otherwise prevent: a row
2710
+ * outside the window has no element to focus
2125
2711
  *
2126
2712
  * @example
2127
2713
  * ```tsx
2128
- * interface User {
2129
- * id: string;
2130
- * name: string;
2131
- * age: number;
2132
- * }
2133
- *
2134
- * // Type-safe column definition with proper inference
2135
- * const columns: Column<User>[] = [
2136
- * {
2137
- * key: "name",
2138
- * label: "Name",
2139
- * // value is inferred as string, not string | number
2140
- * render: (value, user) => <strong>{value}</strong>
2141
- * },
2142
- * {
2143
- * key: "age",
2144
- * label: "Age",
2145
- * // value is inferred as number, not string | number
2146
- * render: (value) => `${value} years old`
2147
- * }
2148
- * ];
2714
+ * <TreeView
2715
+ * nodes={layers}
2716
+ * aria-label="Layers"
2717
+ * selectedId={selected}
2718
+ * onSelectedChange={setSelected}
2719
+ * className="h-full"
2720
+ * />
2149
2721
  * ```
2722
+ *
2723
+ * @module
2150
2724
  */
2151
- type Column<T, K extends keyof T = keyof T> = {
2152
- /** Unique key for the column (must match a property in T) */
2153
- key: K;
2154
- /** Display label for the column header */
2155
- label: react.ReactNode;
2156
- /** Optional custom renderer for cell content with type-safe value */
2157
- render?: (value: T[K], item: T) => react.ReactNode;
2158
- /** Hide column on mobile card view (optional, default: false) */
2159
- hideOnMobile?: boolean;
2160
- /** Hide the label on mobile card view (optional, default: false) */
2161
- hideLabelOnMobile?: boolean;
2162
- /** Optional custom className for the table header cell */
2163
- headerClassName?: string;
2164
- /** Optional custom className for the table body cell */
2165
- cellClassName?: string;
2166
- };
2725
+
2167
2726
  /**
2168
- * Props for ResponsiveTable component
2727
+ * One node of the tree. Children are omitted or empty for a leaf.
2169
2728
  *
2170
- * @template T - The data type of items in the table, must have an 'id' property
2729
+ * @experimental
2171
2730
  */
2172
- type ResponsiveTableProps<T extends {
2731
+ interface TreeNode {
2732
+ /** Stable identity. What selection and expansion are keyed by. */
2173
2733
  id: string;
2174
- }> = {
2175
- /** Array of data items to display */
2176
- data: T[];
2177
- /** Array of column definitions */
2178
- columns: Column<T>[];
2179
- /** Optional callback when a row/card is clicked */
2180
- onRowClick?: (item: T) => void;
2181
- /** Optional custom renderer for mobile card view */
2182
- renderMobileCard?: (item: T, columns: Column<T>[]) => react.ReactNode;
2183
- /** Optional custom className for the container */
2184
- className?: string;
2185
- /** Optional empty state message */
2186
- emptyMessage?: string;
2187
- /** Optional ARIA label for the table (improves screen reader experience) */
2188
- ariaLabel?: string;
2189
- /** Optional custom className for the internal desktop table wrapper */
2190
- tableWrapperClassName?: string;
2191
- /** Optional footer content rendered inside the table card (e.g. Pagination) */
2192
- footer?: react.ReactNode;
2734
+ /** What the row shows. A string also feeds typeahead; anything else needs `textValue`. */
2735
+ label: react.ReactNode;
2736
+ /**
2737
+ * The text typeahead matches on, when `label` is not a string.
2738
+ *
2739
+ * Without it a row rendered as markup cannot be typed to, and a keyboard user loses the fastest
2740
+ * way through a long tree.
2741
+ */
2742
+ textValue?: string;
2743
+ /** Children, if any. An empty array still marks the node as a parent. */
2744
+ children?: readonly TreeNode[];
2745
+ /** Shown before the label, after the twisty. */
2746
+ icon?: react.ReactNode;
2747
+ /** Skipped by every keyboard move and not selectable. */
2748
+ disabled?: boolean;
2749
+ }
2750
+ /**
2751
+ * Which gesture a row's modifiers meant.
2752
+ *
2753
+ * Named by the same three words the rest of the system uses, so a caller maps
2754
+ * them onto its own selection rules without translating. Both Meta and Control
2755
+ * mean toggle: a Mac author presses Command and a Windows author presses
2756
+ * Control, and neither ever presses the other's.
2757
+ *
2758
+ * Shift outranks the toggle modifier — a shift+mod click is a slip rather than
2759
+ * a fourth gesture, and extending is the one whose result is visible and undone
2760
+ * by a plain click.
2761
+ *
2762
+ * @experimental
2763
+ */
2764
+ type TreeSelectionMode = "replace" | "toggle" | "extend";
2765
+ /** @experimental */
2766
+ interface TreeViewProps extends Omit<react.HTMLAttributes<HTMLDivElement>, "onSelect"> {
2767
+ /** The roots of the tree. */
2768
+ nodes: readonly TreeNode[];
2769
+ /** Expanded node ids, if the caller owns them. */
2770
+ expandedIds?: readonly string[];
2771
+ /** Which ids start expanded when the caller does not own expansion. */
2772
+ defaultExpandedIds?: readonly string[];
2773
+ /** Called with the full next set whenever a branch opens or closes. */
2774
+ onExpandedChange?: (ids: string[]) => void;
2775
+ /**
2776
+ * The selected node id, if the caller owns it.
2777
+ *
2778
+ * With `selectedIds` also supplied this is the PRIMARY — the row a detail
2779
+ * panel answers for. Drawn at a heavier weight so a reader can tell which
2780
+ * member of a multi-row selection the rest of the screen describes.
2781
+ */
2782
+ selectedId?: string | null;
2783
+ /**
2784
+ * Every selected id, when the caller holds more than one.
2785
+ *
2786
+ * Additive: omit it and the tree behaves exactly as it did. Supplying it also
2787
+ * makes the tree announce itself as `aria-multiselectable`, which is why it
2788
+ * is a separate prop rather than inferred — a single-select tree claiming to
2789
+ * be multi-selectable is wrong in a way a screen-reader user acts on.
2790
+ */
2791
+ selectedIds?: readonly string[];
2792
+ /** Which id starts selected when the caller does not own selection. */
2793
+ defaultSelectedId?: string | null;
2794
+ /** Called when a row is chosen, by pointer or by Enter. */
2795
+ onSelectedChange?: (id: string, mode: TreeSelectionMode) => void;
2796
+ /**
2797
+ * Names the tree for a screen reader. One of this or `aria-labelledby` is required: a tree
2798
+ * announced only as "tree" tells a user nothing about which one they are in.
2799
+ */
2800
+ "aria-label"?: string;
2801
+ }
2802
+ /**
2803
+ * A virtualized tree.
2804
+ *
2805
+ * @experimental
2806
+ */
2807
+ declare const TreeView: react.ForwardRefExoticComponent<TreeViewProps & react.RefAttributes<HTMLDivElement>>;
2808
+
2809
+ /**
2810
+ * The assistive-technology attributes a single thumb can carry.
2811
+ *
2812
+ * @experimental
2813
+ */
2814
+ interface SliderThumbProps {
2815
+ /** The thumb's accessible name. */
2816
+ "aria-label"?: string;
2817
+ /** An element naming the thumb, when the name is already on screen. */
2818
+ "aria-labelledby"?: string;
2819
+ /**
2820
+ * What the value MEANS, when the number alone does not say it — "40
2821
+ * percent", "Medium". Announced in place of the raw number.
2822
+ */
2823
+ "aria-valuetext"?: string;
2824
+ /** An element carrying help text for this thumb. */
2825
+ "aria-describedby"?: string;
2826
+ }
2827
+ /**
2828
+ * The slider's props, mirroring the Radix root.
2829
+ *
2830
+ * @experimental
2831
+ */
2832
+ type SliderProps = Omit<react.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>, "asChild"> & {
2833
+ /**
2834
+ * Assistive-technology attributes per thumb, in value order.
2835
+ *
2836
+ * The reason this exists at all: the focusable element with the `slider`
2837
+ * role is the THUMB, and none of these attributes are inherited from the
2838
+ * root. Anything a caller puts on the root is therefore announced by
2839
+ * nothing, and the thumbs are generated internally so they cannot be
2840
+ * reached any other way.
2841
+ *
2842
+ * Deliberately a curated set rather than the thumb's full prop type. This
2843
+ * is the surface assistive technology reads; opening it to arbitrary props
2844
+ * would let a caller replace the class names or the role the control
2845
+ * depends on, and every escape hatch in a design system eventually gets
2846
+ * used that way.
2847
+ *
2848
+ * Required for a RANGE: two thumbs sharing one name are announced
2849
+ * identically, so nothing says which end is held. A single thumb falls back
2850
+ * to the root's `aria-label`/`aria-labelledby`, so the one-thumb API stays
2851
+ * as documented.
2852
+ */
2853
+ thumbs?: readonly SliderThumbProps[];
2193
2854
  };
2194
2855
  /**
2195
- * Ref type for ResponsiveTable component
2856
+ * A bounded numeric value chosen by dragging.
2857
+ *
2858
+ * @experimental
2196
2859
  */
2197
- type ResponsiveTableRef = HTMLDivElement;
2860
+ declare const Slider: react.ForwardRefExoticComponent<Omit<Omit<SliderPrimitive.SliderProps & react.RefAttributes<HTMLSpanElement>, "ref">, "asChild"> & {
2861
+ /**
2862
+ * Assistive-technology attributes per thumb, in value order.
2863
+ *
2864
+ * The reason this exists at all: the focusable element with the `slider`
2865
+ * role is the THUMB, and none of these attributes are inherited from the
2866
+ * root. Anything a caller puts on the root is therefore announced by
2867
+ * nothing, and the thumbs are generated internally so they cannot be
2868
+ * reached any other way.
2869
+ *
2870
+ * Deliberately a curated set rather than the thumb's full prop type. This
2871
+ * is the surface assistive technology reads; opening it to arbitrary props
2872
+ * would let a caller replace the class names or the role the control
2873
+ * depends on, and every escape hatch in a design system eventually gets
2874
+ * used that way.
2875
+ *
2876
+ * Required for a RANGE: two thumbs sharing one name are announced
2877
+ * identically, so nothing says which end is held. A single thumb falls back
2878
+ * to the root's `aria-label`/`aria-labelledby`, so the one-thumb API stays
2879
+ * as documented.
2880
+ */
2881
+ thumbs?: readonly SliderThumbProps[];
2882
+ } & react.RefAttributes<HTMLSpanElement>>;
2198
2883
 
2199
- declare const ResponsiveTable: <T extends {
2200
- id: string;
2201
- }>(props: ResponsiveTableProps<T> & {
2202
- ref?: react.ForwardedRef<HTMLDivElement>;
2203
- }) => react.ReactElement;
2884
+ /**
2885
+ * The single owner of keyboard shortcuts for an application.
2886
+ *
2887
+ * ## Why this exists
2888
+ *
2889
+ * Shortcuts are usually registered by whoever needs them, each component adding its own
2890
+ * `document` listener. That works until two of them want the same key, and then it fails in a way
2891
+ * that is very hard to see: `stopPropagation()` does NOT stop other listeners on the same node —
2892
+ * that requires `stopImmediatePropagation()`, and even then only for listeners registered later.
2893
+ * So every global handler runs, in mount order, and mount order is not something a developer
2894
+ * chose. Pressing Escape during a drag can cancel the drag AND navigate away from the page,
2895
+ * because two independent listeners each believed they owned the key.
2896
+ *
2897
+ * This module replaces that with one listener and an explicit precedence rule.
2898
+ *
2899
+ * ## The model: a stack of layers
2900
+ *
2901
+ * A **layer** is a set of bindings belonging to one interactive context — the application shell,
2902
+ * a dialog, an editor canvas mid-drag. Layers are ordered, the topmost is offered each keystroke
2903
+ * first, and the first binding that matches consumes it.
2904
+ *
2905
+ * Precedence is `(depth, sequence)`: the deeper layer wins, and between layers at equal depth the
2906
+ * more recently registered wins.
2907
+ *
2908
+ * Of those two, **depth is declared and sequence is incidental** — and only declared properties
2909
+ * survive a refactor. A layer that unmounts and remounts takes a fresh sequence number, so a
2910
+ * subtree rebuilt for unrelated reasons can change equal-depth ordering. The guidance that falls
2911
+ * out: if relative order matters to you, express it as depth, because depth is the part of the
2912
+ * tuple you control. Equal-depth ordering is for stacking things that arrive in genuine
2913
+ * mount order, such as one dialog over another. Depth comes from how the application nests, so precedence
2914
+ * follows the component tree rather than a set of coordinated numbers — the z-index problem,
2915
+ * avoided. Equal-depth ordering is what stacks a second dialog above the first.
2916
+ *
2917
+ * A layer may be **blocking**, meaning it also swallows the keys it does NOT bind. That is the
2918
+ * property a drag or a modal needs: while it is up, nothing beneath it can act. This is the same
2919
+ * shape as a window manager's keyboard grab, and as the dismissable-layer stack this kit's
2920
+ * dialogs already sit on.
2921
+ *
2922
+ * ## What it deliberately does not do
2923
+ *
2924
+ * It listens in the BUBBLE phase, so a focused component that handles its own keys and calls
2925
+ * `stopPropagation()` wins without needing to know this module exists. React attaches its
2926
+ * handlers at the app root, below `document`, so an `onKeyDown` prop is a sufficient opt-out.
2927
+ * Capturing instead would make this module outrank every component in the tree, including the
2928
+ * kit's own dialogs, and there would be no way for a component to decline.
2929
+ *
2930
+ * @module lib/shortcuts/manager
2931
+ */
2932
+ /**
2933
+ * One shortcut and what it does.
2934
+ *
2935
+ * @experimental
2936
+ */
2937
+ interface ShortcutBinding {
2938
+ /** The keys, as understood by `parseKeys` — `"mod+s"`, `"Escape"`, `"g d"`. */
2939
+ keys: string;
2940
+ /**
2941
+ * What this does, in words, for a shortcuts help panel. Required because an undiscoverable
2942
+ * shortcut helps only the person who wrote it.
2943
+ */
2944
+ description: string;
2945
+ /** Runs when the shortcut fires. */
2946
+ run: (event: KeyboardEvent) => void;
2947
+ /** Checked at press time; a binding whose condition is false is skipped and passes the key on. */
2948
+ when?: () => boolean;
2949
+ /**
2950
+ * Whether this fires while the user is typing in a field.
2951
+ *
2952
+ * Defaults to true for bindings whose FIRST chord carries a non-shift modifier or is Escape,
2953
+ * and false otherwise — the rule nearly every application converges on. `mod+s` must save
2954
+ * mid-sentence and Escape must dismiss, while a bare `n` must be able to be the letter n.
2955
+ *
2956
+ * The first chord decides because it is the keystroke that has to be taken from the field.
2957
+ * `mod+k c` is a command from its opening chord, so its bare `c` completes it in an input. A
2958
+ * sequence that OPENS on a plain character cannot fire while typing whatever it ends with:
2959
+ * allowing `g Escape` would mean swallowing the `g` of every word containing one.
2960
+ */
2961
+ whenTyping?: boolean;
2962
+ /** Whether to call `preventDefault()` when it fires. Defaults to true. */
2963
+ preventDefault?: boolean;
2964
+ }
2965
+ /**
2966
+ * How a layer behaves for keys it does not bind.
2967
+ *
2968
+ * @experimental
2969
+ */
2970
+ interface ShortcutLayerOptions {
2971
+ /** Identifies the layer in diagnostics and in a help panel. */
2972
+ name: string;
2973
+ /** Precedence: deeper layers are offered keystrokes first. */
2974
+ depth: number;
2975
+ /**
2976
+ * Whether unmatched keys stop here instead of reaching layers beneath.
2977
+ *
2978
+ * The reason a drag can be interrupted safely: everything below is inert for as long as this
2979
+ * is set, so no other context can act on a keystroke aimed at this one.
2980
+ */
2981
+ blocking?: boolean;
2982
+ /**
2983
+ * Sorted ABOVE depth, so a layer can outrank one nested deeper than itself.
2984
+ *
2985
+ * Depth alone cannot express a modal. A modal wants to sit above every ordinary layer, but the
2986
+ * host chooses how deeply its own shortcuts are scoped, so any depth a modal picks can be tied
2987
+ * or beaten by a scope the host nests one level further. Priority is the axis the host does not
2988
+ * control: ordinary layers leave it at 0 and a modal raises it.
2989
+ *
2990
+ * KNOWN LIMIT, stated so it is not discovered: layers at EQUAL priority still compare depth
2991
+ * before registration order. Two modals therefore stack by how deeply each is scoped rather
2992
+ * than by which opened last, so a modal opened later at a shallower depth can sit under one
2993
+ * opened earlier and nested deeper — while whatever renders them puts the newer on top.
2994
+ *
2995
+ * Fixing it needs the manager to record when a layer is ACTIVATED, which registration order
2996
+ * does not capture: `useShortcuts` registers once at mount and updates its options in place, so
2997
+ * a layer enabled later still carries its mount-time sequence. Not attempted here because
2998
+ * nothing reaches it yet — `priority` is new and one layer sets it, so no two layers currently
2999
+ * share a nonzero value.
3000
+ */
3001
+ priority?: number;
3002
+ /** Whether the layer participates at all. A disabled layer neither matches nor blocks. */
3003
+ enabled?: boolean;
3004
+ }
3005
+ /**
3006
+ * A layer's registration, held by whoever created it.
3007
+ *
3008
+ * @experimental
3009
+ */
3010
+ interface ShortcutRegistration {
3011
+ /** Replace this layer's bindings and options without changing its precedence. */
3012
+ update: (bindings: readonly ShortcutBinding[], options: ShortcutLayerOptions) => void;
3013
+ /** Remove the layer. */
3014
+ dispose: () => void;
3015
+ }
3016
+ /**
3017
+ * Options for creating a manager.
3018
+ *
3019
+ * @experimental
3020
+ */
3021
+ interface ShortcutManagerOptions {
3022
+ /** Whether `mod` means Command. Detected from the platform when omitted. */
3023
+ isApple?: boolean;
3024
+ /** How long a partially typed sequence waits for its next key, in milliseconds. */
3025
+ sequenceTimeoutMs?: number;
3026
+ /** Clock source, for tests that need to control sequence expiry. */
3027
+ now?: () => number;
3028
+ }
3029
+ /**
3030
+ * A shortcut manager: the registry, the matcher, and the one listener.
3031
+ *
3032
+ * @experimental
3033
+ */
3034
+ interface ShortcutManager {
3035
+ /** Add a layer. */
3036
+ register: (bindings: readonly ShortcutBinding[], options: ShortcutLayerOptions) => ShortcutRegistration;
3037
+ /**
3038
+ * Offer a keystroke to the stack. Returns whether it was consumed.
3039
+ *
3040
+ * Public so the behaviour can be tested without a DOM, and so a host that already owns its
3041
+ * event plumbing can drive the manager itself.
3042
+ */
3043
+ handle: (event: KeyboardEvent) => boolean;
3044
+ /** Install the single listener on a target, returning a function that removes it. */
3045
+ attach: (target: Pick<EventTarget, "addEventListener" | "removeEventListener">) => () => void;
3046
+ /**
3047
+ * Every active binding, most-precedent layer first, for a shortcuts help panel.
3048
+ *
3049
+ * The same array is returned until the layer stack changes, so it is safe to use as an external
3050
+ * store snapshot without re-rendering on every read.
3051
+ */
3052
+ activeBindings: () => readonly ActiveShortcut[];
3053
+ /**
3054
+ * Watch for changes to the layer stack.
3055
+ *
3056
+ * A help panel mounting alongside the components that register shortcuts would otherwise read
3057
+ * BEFORE their effects run and show nothing, with no later render to correct it.
3058
+ */
3059
+ subscribe: (onChange: () => void) => () => void;
3060
+ }
3061
+ /**
3062
+ * A binding as presented to a help panel, with the layer it came from.
3063
+ *
3064
+ * @experimental
3065
+ */
3066
+ interface ActiveShortcut {
3067
+ keys: string;
3068
+ description: string;
3069
+ layer: string;
3070
+ }
3071
+ /**
3072
+ * Create a shortcut manager.
3073
+ *
3074
+ * @experimental
3075
+ */
3076
+ declare function createShortcutManager(options?: ShortcutManagerOptions): ShortcutManager;
2204
3077
 
2205
- interface PortalProviderProps {
2206
- /** The DOM element to portal overlay content into. Defaults to document.body (Radix default). */
2207
- container: HTMLElement | null;
2208
- children: ReactNode;
3078
+ /**
3079
+ * Props for {@link ShortcutProvider}.
3080
+ *
3081
+ * @experimental
3082
+ */
3083
+ interface ShortcutProviderProps extends ShortcutManagerOptions {
3084
+ children?: react.ReactNode;
3085
+ /**
3086
+ * Where the listener is installed. Defaults to `document`.
3087
+ *
3088
+ * The bubble phase is deliberate: a component that handles its own keys and calls
3089
+ * `stopPropagation` wins without knowing this exists, because React attaches its handlers
3090
+ * below `document`.
3091
+ */
3092
+ target?: Pick<EventTarget, "addEventListener" | "removeEventListener"> | null;
2209
3093
  }
2210
- declare function PortalProvider({ container, children }: PortalProviderProps): react_jsx_runtime.JSX.Element;
2211
- declare function usePortalContainer(): HTMLElement | undefined;
3094
+ /**
3095
+ * Installs the application's one keydown listener and roots the layer stack.
3096
+ *
3097
+ * @experimental
3098
+ */
3099
+ declare function ShortcutProvider({ children, target, ...managerOptions }: ShortcutProviderProps): react.JSX.Element;
3100
+ /**
3101
+ * Raises the precedence of everything inside it by one level.
3102
+ *
3103
+ * @experimental
3104
+ */
3105
+ declare function ShortcutScope({ children, }: {
3106
+ children?: react.ReactNode;
3107
+ }): react.JSX.Element;
3108
+ /**
3109
+ * Options for {@link useShortcuts}, minus the depth, which comes from the tree.
3110
+ *
3111
+ * @experimental
3112
+ */
3113
+ interface UseShortcutsOptions {
3114
+ /** Identifies this layer in a help panel. */
3115
+ name: string;
3116
+ /** Whether the layer participates. A disabled layer neither matches nor blocks. */
3117
+ enabled?: boolean;
3118
+ /**
3119
+ * Whether unmatched keys stop here rather than reaching layers beneath.
3120
+ *
3121
+ * Set this while a drag or a modal interaction owns the keyboard.
3122
+ */
3123
+ blocking?: boolean;
3124
+ /**
3125
+ * Sorted ABOVE depth, so a layer can outrank one nested deeper than itself.
3126
+ *
3127
+ * For a modal, whose hold must not be tied or beaten by a host scoping its own shortcuts one
3128
+ * level further. Ordinary layers leave this alone.
3129
+ */
3130
+ priority?: number;
3131
+ }
3132
+ /**
3133
+ * Register shortcuts for as long as the calling component is mounted.
3134
+ *
3135
+ * The bindings array may be rebuilt on every render; it is re-read in place rather than
3136
+ * re-registered, so inline closures are fine and the layer keeps its position in the stack.
3137
+ *
3138
+ * @experimental
3139
+ */
3140
+ declare function useShortcuts(bindings: readonly ShortcutBinding[], options: UseShortcutsOptions): void;
3141
+ /**
3142
+ * The manager itself, for a help panel that lists what is currently bound.
3143
+ *
3144
+ * @experimental
3145
+ */
3146
+ declare function useShortcutManager(): ShortcutManager;
3147
+ /**
3148
+ * The shortcuts currently in effect, most precedent first.
3149
+ *
3150
+ * SUBSCRIBED rather than read once. A help panel mounting alongside the components that register
3151
+ * shortcuts reads before their effects have run, so a one-time read returns an empty list and no
3152
+ * later render corrects it — the panel simply shows nothing. The same applies whenever a layer is
3153
+ * enabled, disabled or replaced while the panel is open.
3154
+ *
3155
+ * The manager returns the same array until its stack changes, so this re-renders when the
3156
+ * shortcuts change and not on every read.
3157
+ *
3158
+ * @experimental
3159
+ */
3160
+ declare function useActiveShortcuts(): readonly ActiveShortcut[];
2212
3161
 
2213
3162
  /**
2214
- * Utility function to merge class names with Tailwind CSS support.
3163
+ * Parsing and matching for keyboard shortcut specifications.
2215
3164
  *
2216
- * Combines clsx for conditional class names with tailwind-merge
2217
- * to properly handle Tailwind CSS class conflicts.
3165
+ * A spec is written the way it is spoken: `"mod+s"`, `"Escape"`, `"shift+alt+f"`, and — for a
3166
+ * sequence `"g d"`, meaning `g` then `d`. Steps are separated by spaces; within a step,
3167
+ * modifiers are joined to the key with `+`.
2218
3168
  *
2219
- * @example
2220
- * ```typescript
2221
- * cn('px-2 py-1', 'px-4') // => 'py-1 px-4'
2222
- * cn('text-red-500', condition && 'text-blue-500')
2223
- * ```
3169
+ * The space bar is written `"Space"`, because the character the browser reports for it is `" "`
3170
+ * and a spec split on whitespace has no way to carry that.
3171
+ *
3172
+ * **`mod` is the point of this module.** It resolves to Command on Apple platforms and Control
3173
+ * everywhere else, so a binding is written once. Writing `ctrl` or `meta` explicitly is still
3174
+ * possible and then means exactly that, which is what lets a platform-specific binding coexist
3175
+ * with a portable one — a distinction lost by any implementation that treats the two as
3176
+ * interchangeable.
3177
+ *
3178
+ * @module lib/shortcuts/key-spec
3179
+ */
3180
+ /**
3181
+ * One keystroke: a key plus the modifier state required with it.
3182
+ *
3183
+ * @experimental
3184
+ */
3185
+ interface KeyChord {
3186
+ /** The `KeyboardEvent.key` value, normalized to lower case for single characters. */
3187
+ readonly key: string;
3188
+ /** Command on Apple platforms, Control elsewhere. */
3189
+ readonly mod: boolean;
3190
+ readonly ctrl: boolean;
3191
+ readonly meta: boolean;
3192
+ readonly alt: boolean;
3193
+ readonly shift: boolean;
3194
+ }
3195
+ /**
3196
+ * A shortcut: one chord, or several pressed in order.
3197
+ *
3198
+ * @experimental
3199
+ */
3200
+ type KeySequence = readonly KeyChord[];
3201
+ /**
3202
+ * Parse a spec into the sequence of chords it describes.
3203
+ *
3204
+ * @param spec - For example `"mod+s"`, `"Escape"`, or `"g d"`.
3205
+ * @throws If the spec is empty, or a step names modifiers but no key.
3206
+ *
3207
+ * @experimental
3208
+ */
3209
+ declare function parseKeys(spec: string): KeySequence;
3210
+ /**
3211
+ * The modifier state an event carries, with `mod` already resolved for the platform.
3212
+ *
3213
+ * @experimental
3214
+ */
3215
+ interface ModifierState {
3216
+ readonly ctrlKey: boolean;
3217
+ readonly metaKey: boolean;
3218
+ readonly altKey: boolean;
3219
+ readonly shiftKey: boolean;
3220
+ /** Optional, so a caller driving the matcher by hand need not synthesise one. */
3221
+ readonly getModifierState?: (key: string) => boolean;
3222
+ }
3223
+ /**
3224
+ * Whether a chord describes the given keystroke.
3225
+ *
3226
+ * Modifiers are matched EXACTLY rather than as a minimum: a binding for `s` must not fire on
3227
+ * `mod+s`, which is a different shortcut and very often a destructive one.
3228
+ *
3229
+ * @param chord - The chord to test.
3230
+ * @param key - The event's `key`.
3231
+ * @param state - The event's modifier flags.
3232
+ * @param isApple - Whether `mod` should resolve to Command rather than Control.
3233
+ *
3234
+ * @experimental
3235
+ */
3236
+ declare function chordMatches(chord: KeyChord, key: string, state: ModifierState, isApple: boolean): boolean;
3237
+ /**
3238
+ * Whether this platform uses Command as its primary modifier.
3239
+ *
3240
+ * Reads the modern `userAgentData` hint before the deprecated `navigator.platform`, and answers
3241
+ * `false` when neither exists — the non-Apple default is also the correct answer for a server
3242
+ * render, where no keystroke can arrive.
3243
+ *
3244
+ * @experimental
2224
3245
  */
2225
- declare function cn(...inputs: ClassValue[]): string;
3246
+ declare function detectApplePlatform(): boolean;
2226
3247
 
2227
3248
  /**
2228
- * Tailwind CSS preset for @nextlyhq/ui components.
2229
- *
2230
- * Defines the CSS custom property contract that all UI components expect.
2231
- * Consumers must provide the actual CSS variable values in their stylesheets.
2232
- *
2233
- * Usage (Tailwind v3):
2234
- * // tailwind.config.ts
2235
- * import uiPreset from "@nextlyhq/ui/tailwind-preset";
2236
- * export default { presets: [uiPreset], ... };
2237
- *
2238
- * Usage (Tailwind v4 with @config):
2239
- * Consumers define the equivalent @theme tokens in their CSS.
2240
- * This file serves as the reference contract.
2241
- */
2242
- declare const uiPreset: {
2243
- theme: {
2244
- extend: {
2245
- colors: {
2246
- border: string;
2247
- input: string;
2248
- ring: string;
2249
- background: string;
2250
- foreground: string;
2251
- primary: {
2252
- DEFAULT: string;
2253
- foreground: string;
2254
- };
2255
- secondary: {
2256
- DEFAULT: string;
2257
- foreground: string;
2258
- };
2259
- destructive: {
2260
- DEFAULT: string;
2261
- foreground: string;
2262
- };
2263
- success: {
2264
- DEFAULT: string;
2265
- foreground: string;
2266
- };
2267
- warning: {
2268
- DEFAULT: string;
2269
- foreground: string;
2270
- };
2271
- muted: {
2272
- DEFAULT: string;
2273
- foreground: string;
2274
- };
2275
- accent: {
2276
- DEFAULT: string;
2277
- foreground: string;
2278
- };
2279
- popover: {
2280
- DEFAULT: string;
2281
- foreground: string;
2282
- };
2283
- card: {
2284
- DEFAULT: string;
2285
- foreground: string;
2286
- };
2287
- };
2288
- borderRadius: {
2289
- lg: string;
2290
- md: string;
2291
- sm: string;
2292
- };
2293
- keyframes: {
2294
- "accordion-down": {
2295
- from: {
2296
- height: string;
2297
- };
2298
- to: {
2299
- height: string;
2300
- };
2301
- };
2302
- "accordion-up": {
2303
- from: {
2304
- height: string;
2305
- };
2306
- to: {
2307
- height: string;
2308
- };
2309
- };
2310
- };
2311
- animation: {
2312
- "accordion-down": string;
2313
- "accordion-up": string;
2314
- };
2315
- };
2316
- };
2317
- };
3249
+ * How wide a field's CONTROL may grow.
3250
+ *
3251
+ * Named rather than measured so a page cannot invent a one-off width, which is
3252
+ * how the eight admin forms diverged. The caps read from custom properties with
3253
+ * literal fallbacks, so a theme can retune them centrally without this file
3254
+ * changing and without a page overriding them locally.
3255
+ * @experimental
3256
+ */
3257
+ type FieldWidth = "half" | "full" | "fill";
3258
+ /**
3259
+ * The wiring `FieldShell` computes for its control: the id to attach, the
3260
+ * composed `aria-describedby` (`undefined` when nothing is rendered to point
3261
+ * at), and whether a rendered `error` forces the control invalid (`undefined`
3262
+ * when there is no error to force one way or the other).
3263
+ *
3264
+ * A render-function `children` (see `FieldShellProps`) receives exactly this
3265
+ * object — the SAME computation the element-clone path derives its
3266
+ * `cloneElement` overrides from — so a caller wiring a compound control (a
3267
+ * Radix `Select`'s trigger, for example) gets precisely the values the
3268
+ * simple, single-element case would have applied.
3269
+ * @experimental
3270
+ */
3271
+ interface FieldShellRenderProps {
3272
+ id: string;
3273
+ describedBy: string | undefined;
3274
+ invalid: boolean | undefined;
3275
+ }
3276
+ /** @experimental */
3277
+ interface FieldShellProps {
3278
+ label?: React.ReactNode;
3279
+ /** Helper text under the control. Rendered only when present. */
3280
+ description?: React.ReactNode;
3281
+ /** Validation message under the control. Rendered only when present. */
3282
+ error?: React.ReactNode;
3283
+ /** Defaults to "half": most admin inputs are short values. */
3284
+ width?: FieldWidth;
3285
+ htmlFor?: string;
3286
+ className?: string;
3287
+ /**
3288
+ * Either a single element to clone, or a function that receives the
3289
+ * computed wiring and applies it itself.
3290
+ *
3291
+ * The element form is `FieldShell` cloning it with `cloneElement` to
3292
+ * attach the id, `aria-describedby` and `aria-invalid` it computes —
3293
+ * unchanged from before, and still the right choice for an atomic control
3294
+ * (`Input`, `Textarea`, `Switch`) that spreads its own props onto a real
3295
+ * DOM node. Typing this branch as `ReactNode` would let a composite field
3296
+ * (two inputs with a unit between them, for example) compile and then
3297
+ * crash on mount, so it stays a single `ReactElement` — wrap several
3298
+ * elements in one real element, a `<div>`, not a `<Fragment>`: a Fragment
3299
+ * forwards none of those props to what is inside it.
3300
+ *
3301
+ * The function form exists for a compound control built on a Radix `Root`
3302
+ * (`Select`, and by the same shape `RadioGroup`): `Root` destructures a
3303
+ * fixed, named prop list and never spreads the remainder, so `id` handed
3304
+ * to it via `cloneElement` is silently dropped rather than reaching the
3305
+ * actual focusable element two levels down (`Select` > `SelectTrigger` >
3306
+ * `SelectValue`). A render function is called with `FieldShellRenderProps`
3307
+ * and applies `id`/`describedBy`/`invalid` to whichever nested element is
3308
+ * the real control, instead of relying on a single top-level clone that
3309
+ * can never reach it.
3310
+ */
3311
+ children: React.ReactElement | ((field: FieldShellRenderProps) => React.ReactNode);
3312
+ }
3313
+ /** @experimental */
3314
+ interface FormActionsProps {
3315
+ /**
3316
+ * Whether the form has unsaved changes. Supplied by the page from the form
3317
+ * state that already tracks it; never computed here.
3318
+ */
3319
+ dirty?: boolean;
3320
+ className?: string;
3321
+ children: React.ReactNode;
3322
+ }
3323
+
3324
+ /** @experimental */
3325
+ declare function FieldShell({ label, description, error, width, htmlFor, className, children, }: FieldShellProps): react_jsx_runtime.JSX.Element;
3326
+
3327
+ /** @experimental */
3328
+ interface FormSectionProps {
3329
+ /** Short label above the card, rendered uppercase. */
3330
+ label: string;
3331
+ /** Optional sentence under the label. */
3332
+ description?: react.ReactNode;
3333
+ className?: string;
3334
+ children: react.ReactNode;
3335
+ }
3336
+ /**
3337
+ * A labelled card holding a group of fields.
3338
+ *
3339
+ * Composes `Card` rather than hand-rolling its own border and background, so
3340
+ * a section carries the CONTAINER radius tier `Card` already defines instead
3341
+ * of a second, drifting copy of the same chrome. There is deliberately no
3342
+ * footer slot. A form commits as one document, so its action belongs to the
3343
+ * page rather than to a section.
3344
+ * @experimental
3345
+ */
3346
+ declare function FormSection({ label, description, className, children, }: FormSectionProps): react_jsx_runtime.JSX.Element;
3347
+
3348
+ /**
3349
+ * One action bar per form, at the end of the page's measure.
3350
+ *
3351
+ * A form commits as a single document, so there is one place to commit it. The
3352
+ * dirty flag arrives from the page because the form state already answers that
3353
+ * question, and a second implementation of it here would disagree with the
3354
+ * first as soon as either changed.
3355
+ * @experimental
3356
+ */
3357
+ declare function FormActions({ dirty, className, children }: FormActionsProps): react_jsx_runtime.JSX.Element;
3358
+
3359
+ /** @experimental */
3360
+ interface PageShellProps extends HTMLAttributes<HTMLDivElement> {
3361
+ /**
3362
+ * Which measure the content column is bounded to. `full` removes the cap so
3363
+ * the column takes whatever the panel gives it, while KEEPING the gutter — a
3364
+ * full-width page is still inset from the panel's edge.
3365
+ */
3366
+ width?: "form" | "wide" | "full";
3367
+ }
3368
+ /**
3369
+ * What each named width resolves to, owned here because this is what applies it.
3370
+ *
3371
+ * Declared as a lookup rather than branched at the call site so the three arms
3372
+ * are one list. A `switch` here would let a fourth width be added to the type
3373
+ * and forgotten in the mapping, which the checker cannot see through a
3374
+ * `default` arm.
3375
+ *
3376
+ * Exported because a caller whose CONTENT carries the measure needs the same
3377
+ * value as a length, and the alternative is a second table naming the same
3378
+ * tokens — which drifts silently, since both look correct beside their own
3379
+ * neighbours. Reading it here means there is one answer rather than two that
3380
+ * agree today.
3381
+ *
3382
+ * @experimental
3383
+ */
3384
+ declare const SHELL_MEASURE: Record<NonNullable<PageShellProps["width"]>, string>;
3385
+ /**
3386
+ * The page's inset and measure, owned in one place and spent as GRID COLUMNS.
3387
+ *
3388
+ * This replaces a pairing in which an outer container padded the panel and an
3389
+ * inner one padded again while capping the width. That shape had three
3390
+ * defects, and all three are structural rather than cosmetic:
3391
+ *
3392
+ * - The two insets ADDED, because padding is not something a descendant can
3393
+ * cancel. Measured on the settings page, the header sat at x=360 and the
3394
+ * form card at x=384 — a 24px disagreement between two elements that are
3395
+ * supposed to share a left edge. Here the inset is a column, so there is one
3396
+ * declaration and no second site to disagree with it.
3397
+ * - A measure applied INSIDE a form component lets anything the page renders
3398
+ * beside that form escape it. With the page owning the shell, a sibling is
3399
+ * inside the measure by default and leaves it only by saying `Bleed`.
3400
+ * - Centring by `mx-auto` on a max-width box does nothing at panel widths
3401
+ * where the cap does not bind. Here the two outer tracks are equal and
3402
+ * flexible, so the content column is centred at every width and no
3403
+ * `justify-content` is declared — with flexible tracks the grid fills its
3404
+ * container and there is no free space for one to distribute.
3405
+ *
3406
+ * Vertical padding stays ordinary `padding-block`: it is not in tension with
3407
+ * the columns, and keeping it here means one component answers the whole of
3408
+ * "how far is content from the panel's edge".
3409
+ * @experimental
3410
+ */
3411
+ declare const PageShell: react.ForwardRefExoticComponent<PageShellProps & react.RefAttributes<HTMLDivElement>>;
3412
+ /** @experimental */
3413
+ type BleedProps = HTMLAttributes<HTMLDivElement>;
3414
+ /**
3415
+ * Opts one child out of the measure, edge to edge across the shell's gutter.
3416
+ *
3417
+ * The sanctioned form of something that previously only happened by accident.
3418
+ * A wide data table, a delivery log or a toolbar declares that it wants the
3419
+ * full panel, so a reviewer can see the intent — and, just as usefully, a block
3420
+ * that is merely in the wrong place no longer LOOKS like a deliberate
3421
+ * full-bleed.
3422
+ *
3423
+ * Valid only as a DIRECT child of `PageShell`. The `full-start`/`full-end`
3424
+ * lines are named on the shell's own grid, so they are in scope for its
3425
+ * children and nowhere else; nested inside a `FormSection` this renders a plain
3426
+ * block and the `grid-column` is inert. That is a real constraint rather than a
3427
+ * stylistic preference, and `page-shell.test.tsx` pins both halves: that a
3428
+ * `Bleed` rendered directly under the shell is its child, and that one nested a
3429
+ * level deeper does NOT receive the full column.
3430
+ *
3431
+ * It forwards its ref and any div attributes for the same reason: a consumer
3432
+ * cannot reach for the usual remedy of wrapping it, because a wrapper is
3433
+ * precisely what makes it stop working.
3434
+ * @experimental
3435
+ */
3436
+ declare const Bleed: react.ForwardRefExoticComponent<BleedProps & react.RefAttributes<HTMLDivElement>>;
3437
+
3438
+ /** @experimental */
3439
+ interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3440
+ /** The page's name, rendered as its `h1`. */
3441
+ title: string;
3442
+ /**
3443
+ * A sentence under the title. A `ReactNode` rather than a string because a
3444
+ * description carrying a link or an inline code span is ordinary here, and
3445
+ * typing it narrowly would push those pages back to hand-rolling the header.
3446
+ */
3447
+ description?: ReactNode;
3448
+ /** The trail above the title. The page supplies it; this only places it. */
3449
+ breadcrumbs?: ReactNode;
3450
+ /** Page-level actions, trailing the title on one line where there is room. */
3451
+ actions?: ReactNode;
3452
+ }
3453
+ /**
3454
+ * A page's own identity — its trail, its name, its one-line summary and its
3455
+ * actions — rendered once instead of at every page that needs one.
3456
+ *
3457
+ * Every value arrives as a PROP, and that is the point rather than an
3458
+ * implementation detail. The markup this replaces was written out by hand on 22
3459
+ * pages, and the settings pages took their title from a ~130-line chain that
3460
+ * matched `window.location.pathname` in a file none of them import. Both are
3461
+ * the same defect from opposite ends: a page knows what it is, and nothing let
3462
+ * it say so — so the title lived either in 22 copies or in one foreign file
3463
+ * that had to be edited whenever a route was added.
3464
+ *
3465
+ * The route registry already made this decision for the sidebar. A private
3466
+ * route must DECLARE the rail section it belongs to, because the sidebar reads
3467
+ * that declaration rather than matching the URL, which makes a route added
3468
+ * without one a compile error instead of a page that silently highlights the
3469
+ * wrong entry. A title derived from a pathname is the same defect in the half
3470
+ * nobody had covered.
3471
+ *
3472
+ * It also makes a plugin's page indistinguishable from a first-party one: a
3473
+ * plugin cannot add a branch to an if-chain it does not ship, but it can pass a
3474
+ * prop.
3475
+ * @experimental
3476
+ */
3477
+ declare const PageHeader: react.ForwardRefExoticComponent<PageHeaderProps & react.RefAttributes<HTMLElement>>;
2318
3478
 
2319
- export { Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, type ActionCallbacks, Alert, AlertDescription, type AlertDescriptionProps, AlertDialog, AlertDialogAction, type AlertDialogActionProps, AlertDialogCancel, type AlertDialogCancelProps, AlertDialogContent, type AlertDialogContentProps, AlertDialogDescription, type AlertDialogDescriptionProps, AlertDialogFooter, type AlertDialogFooterProps, AlertDialogHeader, type AlertDialogHeaderProps, AlertDialogOverlay, type AlertDialogOverlayProps, AlertDialogPortal, AlertDialogTitle, type AlertDialogTitleProps, AlertDialogTrigger, type AlertProps, AlertTitle, type AlertTitleProps, Avatar, AvatarFallback, type AvatarFallbackProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Button, type ButtonProps, Card, CardAction, type CardActionProps, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, type Column, Command, CommandDialog, type CommandDialogProps, CommandEmpty, type CommandEmptyProps, CommandGroup, type CommandGroupProps, CommandInput, type CommandInputProps, CommandItem, type CommandItemProps, CommandList, type CommandListProps, type CommandProps, CommandSeparator, type CommandSeparatorProps, CommandShortcut, type CommandShortcutProps, type DataFetcher, Dialog, DialogClose, DialogContent, type DialogContentProps, DialogDescription, type DialogDescriptionProps, DialogFooter, type DialogFooterProps, DialogHeader, type DialogHeaderProps, DialogOverlay, type DialogOverlayProps, DialogPortal, DialogTitle, type DialogTitleProps, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, type DropdownMenuCheckboxItemProps, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, type DropdownMenuRadioItemProps, DropdownMenuSeparator, type DropdownMenuSeparatorProps, DropdownMenuShortcut, type DropdownMenuShortcutProps, DropdownMenuSub, DropdownMenuSubContent, type DropdownMenuSubContentProps, DropdownMenuSubTrigger, type DropdownMenuSubTriggerProps, DropdownMenuTrigger, type FilterInfo, Input, type InputProps, Label, type ListResponse, type PaginationConfig, type PaginationMeta, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalProvider, Progress, type ProgressProps, RadioGroup, RadioGroupItem, ResponsiveTable, type ResponsiveTableProps, type ResponsiveTableRef, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, type SelectTriggerProps, SelectValue, Separator, Sheet, SheetClose, type SheetCloseProps, SheetContent, type SheetContentProps, type SheetContentRef, SheetDescription, type SheetDescriptionProps, type SheetDescriptionRef, SheetFooter, type SheetFooterProps, SheetHeader, type SheetHeaderProps, SheetOverlay, type SheetOverlayProps, type SheetOverlayRef, SheetPortal, type SheetProps, SheetTitle, type SheetTitleProps, type SheetTitleRef, SheetTrigger, type SheetTriggerProps, Skeleton, type SkeletonProps, type SortInfo, Spinner, type SpinnerProps, Switch, Table, TableBody, TableCaption, TableCell, TableEmpty, type TableEmptyProps, TableError, type TableErrorProps, TableFooter, TableHead, TableHeader, TableLoading, TablePagination, type TablePaginationProps, type TableParams, TableRow, TableSearch, type TableSearchProps, TableSkeleton, type TableSkeletonProps, Tabs, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTrigger, type TabsTriggerProps, Textarea, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alertVariants, avatarVariants, badgeVariants, buttonVariants, cardVariants, cn, dialogContentVariants, inputVariants, progressVariants, selectTriggerVariants, sheetVariants, spinnerVariants, uiPreset, usePortalContainer };
3479
+ export { Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, type ActionCallbacks, type ActiveShortcut, Alert, AlertDescription, type AlertDescriptionProps, AlertDialog, AlertDialogAction, type AlertDialogActionProps, AlertDialogCancel, type AlertDialogCancelProps, AlertDialogContent, type AlertDialogContentProps, AlertDialogDescription, type AlertDialogDescriptionProps, AlertDialogFooter, type AlertDialogFooterProps, AlertDialogHeader, type AlertDialogHeaderProps, AlertDialogOverlay, type AlertDialogOverlayProps, AlertDialogPortal, AlertDialogTitle, type AlertDialogTitleProps, AlertDialogTrigger, type AlertProps, AlertTitle, type AlertTitleProps, Avatar, AvatarFallback, type AvatarFallbackProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Bleed, type BleedProps, Button, type ButtonProps, Card, CardAction, type CardActionProps, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, type ColorPickerProps, type ColorSwatch, Command, CommandDialog, type CommandDialogProps, CommandEmpty, type CommandEmptyProps, CommandGroup, type CommandGroupProps, CommandInput, type CommandInputProps, CommandItem, type CommandItemProps, CommandList, type CommandListProps, type CommandProps, CommandSeparator, type CommandSeparatorProps, CommandShortcut, type CommandShortcutProps, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, type DataFetcher, Dialog, DialogClose, DialogContent, type DialogContentProps, DialogDescription, type DialogDescriptionProps, DialogFooter, type DialogFooterProps, DialogHeader, type DialogHeaderProps, DialogOverlay, type DialogOverlayProps, DialogPortal, DialogTitle, type DialogTitleProps, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, type DropdownMenuCheckboxItemProps, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, type DropdownMenuRadioItemProps, DropdownMenuSeparator, type DropdownMenuSeparatorProps, DropdownMenuShortcut, type DropdownMenuShortcutProps, DropdownMenuSub, DropdownMenuSubContent, type DropdownMenuSubContentProps, DropdownMenuSubTrigger, type DropdownMenuSubTriggerProps, DropdownMenuTrigger, FieldShell, type FieldShellProps, type FieldShellRenderProps, type FieldWidth, type FilterInfo, FormActions, type FormActionsProps, FormLabelWithTooltip, type FormLabelWithTooltipProps, FormSection, type FormSectionProps, Grid, type GridProps, Input, type InputProps, type KeyChord, type KeySequence, Label, type ListResponse, type ModifierState, PageHeader, type PageHeaderProps, PageShell, type PageShellProps, type PaginationConfig, type PaginationMeta, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalProvider, Progress, type ProgressProps, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, SHELL_MEASURE, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, type SelectTriggerProps, SelectValue, Separator, Sheet, SheetClose, type SheetCloseProps, SheetContent, type SheetContentProps, type SheetContentRef, SheetDescription, type SheetDescriptionProps, type SheetDescriptionRef, SheetFooter, type SheetFooterProps, SheetHeader, type SheetHeaderProps, SheetOverlay, type SheetOverlayProps, type SheetOverlayRef, SheetPortal, type SheetProps, SheetTitle, type SheetTitleProps, type SheetTitleRef, SheetTrigger, type SheetTriggerProps, type ShortcutBinding, type ShortcutLayerOptions, type ShortcutManager, type ShortcutManagerOptions, ShortcutProvider, type ShortcutProviderProps, type ShortcutRegistration, ShortcutScope, Skeleton, type SkeletonProps, Slider, type SliderProps, type SliderThumbProps, type SortInfo, Spinner, type SpinnerProps, Stack, type StackProps, Stat, type StatProps, Switch, Table, TableBody, TableCaption, TableCell, TableEmpty, type TableEmptyProps, TableError, type TableErrorProps, TableFooter, TableHead, TableHeader, TableLoading, type TableParams, TableRow, TableSearch, type TableSearchProps, TableSkeleton, type TableSkeletonProps, Tabs, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTrigger, type TabsTriggerProps, Textarea, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type TreeNode, TreeView, type TreeViewProps, type UseShortcutsOptions, alertVariants, avatarVariants, badgeVariants, buttonVariants, cardVariants, chordMatches, commandDefaultFilter, createShortcutManager, detectApplePlatform, dialogContentVariants, inputVariants, parseKeys, progressVariants, selectTriggerVariants, sheetVariants, spinnerVariants, useActiveShortcuts, useCommandHighlight, usePortalContainer, useShortcutManager, useShortcuts };