@caqophony/ui 0.0.0-stage → 0.2.0

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.
@@ -0,0 +1,2029 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+ import { ReactNode, ReactElement, ComponentType } from 'react';
5
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
6
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
7
+ import * as react_jsx_runtime from 'react/jsx-runtime';
8
+ export { MarkdownRenderer } from './markdown.mjs';
9
+ import * as lucide_react from 'lucide-react';
10
+ import { LucideIcon } from 'lucide-react';
11
+ import { ClassValue } from 'clsx';
12
+
13
+ declare const buttonVariants: (props?: ({
14
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
15
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
16
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
17
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
18
+ asChild?: boolean;
19
+ /** Show loading spinner and disable button */
20
+ loading?: boolean;
21
+ /** Text to show when loading (defaults to children) */
22
+ loadingText?: string;
23
+ }
24
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
25
+
26
+ /**
27
+ * Input Component
28
+ *
29
+ * Standard form input with consistent sizing, focus ring, and disabled state.
30
+ * Mobile-first: 44px minimum height for touch targets.
31
+ *
32
+ * Usage:
33
+ * import { Input } from '@caqophony/ui';
34
+ * <Input type="email" placeholder="Enter email" />
35
+ *
36
+ * Authored by Caqophony
37
+ */
38
+
39
+ interface InputProps extends React.ComponentProps<'input'> {
40
+ /** Show error styling (red border + aria-invalid) */
41
+ error?: boolean;
42
+ /** ID of the element describing the error, for aria-describedby */
43
+ errorMessageId?: string;
44
+ }
45
+ declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
46
+
47
+ /**
48
+ * Card Component
49
+ *
50
+ * Composable card container with header, content, footer, title, and description.
51
+ * Uses Gossamer semantic tokens — no hardcoded colors.
52
+ *
53
+ * Usage:
54
+ * import { Card, CardHeader, CardTitle, CardContent } from '@caqophony/ui';
55
+ * <Card>
56
+ * <CardHeader><CardTitle>Title</CardTitle></CardHeader>
57
+ * <CardContent>Body</CardContent>
58
+ * </Card>
59
+ *
60
+ * Authored by Caqophony
61
+ */
62
+
63
+ declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
64
+ declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
65
+ declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
66
+ declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
67
+ declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
68
+ declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
69
+
70
+ /**
71
+ * Switch Component
72
+ *
73
+ * Accessible toggle switch using Radix UI primitives.
74
+ * Uses Gossamer semantic tokens for dark mode support.
75
+ *
76
+ * Authored by Caqophony
77
+ */
78
+
79
+ interface SwitchProps extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> {
80
+ /** Optional label to display next to the switch */
81
+ label?: string;
82
+ /** Optional description text below the label */
83
+ description?: string;
84
+ }
85
+ declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
86
+
87
+ /**
88
+ * Tooltip Component
89
+ *
90
+ * A reusable tooltip using Radix UI primitives.
91
+ * Use for showing additional information on hover.
92
+ *
93
+ * Usage:
94
+ * ```tsx
95
+ * import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@caqophony/ui';
96
+ *
97
+ * <TooltipProvider>
98
+ * <Tooltip>
99
+ * <TooltipTrigger>Hover me</TooltipTrigger>
100
+ * <TooltipContent>Tooltip text</TooltipContent>
101
+ * </Tooltip>
102
+ * </TooltipProvider>
103
+ * ```
104
+ *
105
+ * Authored by Caqophony
106
+ */
107
+
108
+ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
109
+ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
110
+ declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
111
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
112
+
113
+ interface FormFieldProps {
114
+ /** Field label text */
115
+ label: string;
116
+ /** Field name (used for htmlFor) */
117
+ name: string;
118
+ /** Error message to display */
119
+ error?: string;
120
+ /** Optional description/hint text */
121
+ description?: string;
122
+ /** Whether field is required */
123
+ required?: boolean;
124
+ /** Whether the field and its child input are disabled */
125
+ disabled?: boolean;
126
+ /** Children (typically Input, Select, etc.) */
127
+ children: React.ReactNode;
128
+ /** Additional className for the wrapper */
129
+ className?: string;
130
+ }
131
+ /**
132
+ * FormField - Wrapper component for form inputs with validation feedback
133
+ *
134
+ * Features:
135
+ * - Label with optional required indicator
136
+ * - Error state with red border on child input
137
+ * - Error message displayed below input
138
+ * - Optional description/hint text
139
+ * - Mobile-first responsive design
140
+ */
141
+ declare function FormField({ label, name, error, description, required, disabled, children, className, }: FormFieldProps): react_jsx_runtime.JSX.Element;
142
+ /**
143
+ * FormFieldGroup - Groups multiple FormFields horizontally on larger screens
144
+ *
145
+ * Usage:
146
+ * <FormFieldGroup>
147
+ * <FormField label="First Name" name="firstName">...</FormField>
148
+ * <FormField label="Last Name" name="lastName">...</FormField>
149
+ * </FormFieldGroup>
150
+ */
151
+ interface FormFieldGroupProps {
152
+ children: React.ReactNode;
153
+ className?: string;
154
+ }
155
+ declare function FormFieldGroup({ children, className }: FormFieldGroupProps): react_jsx_runtime.JSX.Element;
156
+ /**
157
+ * FormSection - Groups related form fields with an optional heading
158
+ *
159
+ * Usage:
160
+ * <FormSection title="Personal Information">
161
+ * <FormField label="Name" name="name">...</FormField>
162
+ * </FormSection>
163
+ */
164
+ interface FormSectionProps {
165
+ title?: string;
166
+ description?: string;
167
+ children: React.ReactNode;
168
+ className?: string;
169
+ }
170
+ declare function FormSection({ title, description, children, className, }: FormSectionProps): react_jsx_runtime.JSX.Element;
171
+ /**
172
+ * FormError - Displays form-level errors (not field-specific)
173
+ *
174
+ * Usage:
175
+ * <FormError error="Unable to save changes. Please try again." />
176
+ */
177
+ interface FormErrorProps {
178
+ error?: string | null;
179
+ className?: string;
180
+ }
181
+ declare function FormError({ error, className }: FormErrorProps): react_jsx_runtime.JSX.Element | null;
182
+ /**
183
+ * FormSuccess - Displays form-level success messages
184
+ *
185
+ * Usage:
186
+ * <FormSuccess message="Changes saved successfully!" />
187
+ */
188
+ interface FormSuccessProps {
189
+ message?: string | null;
190
+ className?: string;
191
+ }
192
+ declare function FormSuccess({ message, className }: FormSuccessProps): react_jsx_runtime.JSX.Element | null;
193
+
194
+ /**
195
+ * Global Error Content Component
196
+ *
197
+ * Centralized error UI for global-error.tsx pages across all apps.
198
+ * This component provides the error display content that each app wraps
199
+ * in their own global-error.tsx with the required <html> and <body> tags.
200
+ *
201
+ * IMPORTANT: Next.js 16 with Turbopack prerenders global-error.tsx during build.
202
+ * This component must be completely STATELESS - no hooks (useState, useEffect, etc.)
203
+ * allowed. If you need client-side logic, use event handlers that check `typeof window`.
204
+ *
205
+ * Sentry reporting should happen server-side via error.tsx instead.
206
+ *
207
+ * @see https://github.com/vercel/next.js/issues/85668
208
+ *
209
+ * Authored by Caqophony
210
+ */
211
+
212
+ interface GlobalErrorContentProps {
213
+ /** The error that occurred */
214
+ error: Error & {
215
+ digest?: string;
216
+ };
217
+ /** Next.js reset function to re-render the page */
218
+ reset: () => void;
219
+ /** Optional app name for branding/support context */
220
+ appName?: string;
221
+ /** Support address for the "contact support" link. The link is omitted when not provided. */
222
+ supportEmail?: string;
223
+ /** Optional custom action buttons to display instead of defaults */
224
+ customActions?: ReactNode;
225
+ }
226
+ /**
227
+ * Stateless error content component for global-error pages.
228
+ *
229
+ * Usage in app/global-error.tsx:
230
+ * ```tsx
231
+ * 'use client';
232
+ * import { GlobalErrorContent } from '@caqophony/ui';
233
+ *
234
+ * export default function GlobalError({ error, reset }) {
235
+ * return (
236
+ * <html lang="en">
237
+ * <body style={{ margin: 0 }}>
238
+ * <GlobalErrorContent error={error} reset={reset} appName="My App" />
239
+ * </body>
240
+ * </html>
241
+ * );
242
+ * }
243
+ * ```
244
+ */
245
+ declare function GlobalErrorContent({ error, reset, appName, supportEmail, customActions, }: GlobalErrorContentProps): ReactElement;
246
+
247
+ interface SidebarContextValue {
248
+ isCollapsed: boolean;
249
+ toggle: () => void;
250
+ }
251
+ declare function useSidebar(): SidebarContextValue;
252
+ interface NavItem {
253
+ name: string;
254
+ href: string;
255
+ icon: ComponentType<{
256
+ className?: string;
257
+ }>;
258
+ description?: string;
259
+ }
260
+ type LinkComponentProps = {
261
+ href: unknown;
262
+ className?: string;
263
+ children: ReactNode;
264
+ };
265
+ interface CollapsibleSidebarProps {
266
+ /** Unique key for localStorage persistence */
267
+ storageKey?: string;
268
+ /** Default collapsed state */
269
+ defaultCollapsed?: boolean;
270
+ /** Header content (title, logo) */
271
+ header?: ReactNode;
272
+ /** Header content when collapsed (optional, defaults to null) */
273
+ collapsedHeader?: ReactNode;
274
+ /** Navigation items */
275
+ items: NavItem[];
276
+ /** Function to check if item is active */
277
+ isActive?: (href: string) => boolean;
278
+ /** Custom link component (for Next.js Link) */
279
+ linkComponent?: ComponentType<LinkComponentProps>;
280
+ /** Footer content */
281
+ footer?: ReactNode;
282
+ /** Footer content when collapsed (optional) */
283
+ collapsedFooter?: ReactNode;
284
+ /** Additional className */
285
+ className?: string;
286
+ /** Custom collapsed width (default: 64px) */
287
+ collapsedWidth?: number;
288
+ /** Custom expanded width (default: 256px) */
289
+ expandedWidth?: number;
290
+ /** Below `lg`: the menu button's and the drawer's accessible name. */
291
+ navLabel?: string;
292
+ /** Below `lg`: the drawer starts open (the style sheet draws it so). */
293
+ defaultNavOpen?: boolean;
294
+ }
295
+ declare function CollapsibleSidebar({ storageKey, defaultCollapsed, header, collapsedHeader, items, isActive, linkComponent: LinkComponent, footer, collapsedFooter, className, collapsedWidth, expandedWidth, navLabel, defaultNavOpen, }: CollapsibleSidebarProps): react_jsx_runtime.JSX.Element;
296
+
297
+ interface AccordionSingleProps {
298
+ type?: 'single';
299
+ value?: string;
300
+ defaultValue?: string;
301
+ onValueChange?: (value: string) => void;
302
+ collapsible?: boolean;
303
+ children: React.ReactNode;
304
+ className?: string;
305
+ }
306
+ interface AccordionMultipleProps {
307
+ type: 'multiple';
308
+ value?: string[];
309
+ defaultValue?: string[];
310
+ onValueChange?: (value: string[]) => void;
311
+ children: React.ReactNode;
312
+ className?: string;
313
+ }
314
+ type AccordionProps = AccordionSingleProps | AccordionMultipleProps;
315
+ declare function Accordion(props: AccordionProps): react_jsx_runtime.JSX.Element;
316
+ interface AccordionItemProps {
317
+ value: string;
318
+ children: React.ReactNode;
319
+ className?: string;
320
+ disabled?: boolean;
321
+ /** Optional data-testid for the item wrapper */
322
+ testId?: string;
323
+ }
324
+ declare function AccordionItem({ value, children, className, disabled, testId, }: AccordionItemProps): react_jsx_runtime.JSX.Element;
325
+ interface AccordionTriggerProps {
326
+ children: React.ReactNode;
327
+ className?: string;
328
+ icon?: React.ReactNode;
329
+ /** Additional content on the right side (before chevron) */
330
+ rightContent?: React.ReactNode;
331
+ /** Optional data-testid for the trigger button */
332
+ testId?: string;
333
+ }
334
+ declare function AccordionTrigger({ children, className, icon, rightContent, testId, }: AccordionTriggerProps): react_jsx_runtime.JSX.Element;
335
+ interface AccordionContentProps {
336
+ children: React.ReactNode;
337
+ className?: string;
338
+ /** Optional data-testid for the content wrapper */
339
+ testId?: string;
340
+ }
341
+ declare function AccordionContent({ children, className, testId, }: AccordionContentProps): react_jsx_runtime.JSX.Element;
342
+ /**
343
+ * SimpleAccordion - A single, self-contained accordion section
344
+ *
345
+ * For when you just need one expandable section without the full Accordion setup.
346
+ *
347
+ * Usage:
348
+ * <SimpleAccordion
349
+ * title="Advanced Settings"
350
+ * icon={<Settings className="size-5" />}
351
+ * defaultOpen={false}
352
+ * >
353
+ * Content here...
354
+ * </SimpleAccordion>
355
+ */
356
+ interface SimpleAccordionProps {
357
+ /** The trigger title */
358
+ title: React.ReactNode;
359
+ /** Optional icon before the title */
360
+ icon?: React.ReactNode;
361
+ /** Content on the right side of the trigger (before chevron) */
362
+ rightContent?: React.ReactNode;
363
+ /** Whether the accordion is open by default */
364
+ defaultOpen?: boolean;
365
+ /** Controlled open state */
366
+ open?: boolean;
367
+ /** Callback when open state changes */
368
+ onOpenChange?: (open: boolean) => void;
369
+ /** The accordion content */
370
+ children: React.ReactNode;
371
+ /** Additional class for the container */
372
+ className?: string;
373
+ /** Additional class for the trigger */
374
+ triggerClassName?: string;
375
+ /** Additional class for the content wrapper */
376
+ contentClassName?: string;
377
+ /** Optional data-testid for the trigger button */
378
+ triggerTestId?: string;
379
+ /** Optional data-testid for the content area */
380
+ contentTestId?: string;
381
+ }
382
+ declare function SimpleAccordion({ title, icon, rightContent, defaultOpen, open: controlledOpen, onOpenChange, children, className, triggerClassName, contentClassName, triggerTestId, contentTestId, }: SimpleAccordionProps): react_jsx_runtime.JSX.Element;
383
+
384
+ interface ConfirmDialogProps {
385
+ /** Dialog title */
386
+ title: string;
387
+ /** Dialog message/description */
388
+ message: string;
389
+ /** Confirm button text */
390
+ confirmLabel: string;
391
+ /** Callback when confirmed */
392
+ onConfirm: () => void;
393
+ /** Callback when cancelled */
394
+ onCancel: () => void;
395
+ /** Loading state (disables buttons and shows spinner) */
396
+ isLoading?: boolean;
397
+ /** Test ID for the confirm button */
398
+ confirmTestId?: string;
399
+ /** Test ID for the cancel button */
400
+ cancelTestId?: string;
401
+ /** Test ID for the dialog overlay */
402
+ dialogTestId?: string;
403
+ /** Cancel button text (default: "Cancel") */
404
+ cancelLabel?: string;
405
+ /** Variant for confirm button (default: "default") */
406
+ confirmVariant?: 'default' | 'destructive';
407
+ /** Additional class for the dialog container */
408
+ className?: string;
409
+ }
410
+ declare function ConfirmDialog({ title, message, confirmLabel, onConfirm, onCancel, isLoading, confirmTestId, cancelTestId, dialogTestId, cancelLabel, confirmVariant, className, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
411
+
412
+ /** Supported DiceBear avatar styles */
413
+ type DiceBearStyle = 'adventurer' | 'adventurer-neutral' | 'avataaars' | 'avataaars-neutral' | 'big-ears' | 'big-ears-neutral' | 'bottts' | 'bottts-neutral' | 'croodles' | 'croodles-neutral' | 'fun-emoji' | 'icons' | 'identicon' | 'initials' | 'lorelei' | 'lorelei-neutral' | 'micah' | 'miniavs' | 'notionists' | 'notionists-neutral' | 'open-peeps' | 'personas' | 'pixel-art' | 'pixel-art-neutral' | 'rings' | 'shapes' | 'thumbs';
414
+ declare const avatarVariants: (props?: ({
415
+ size?: "sm" | "lg" | "xs" | "md" | "xl" | "2xl" | null | undefined;
416
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
417
+ /**
418
+ * Build a DiceBear avatar URL from a seed and style.
419
+ * Deterministic — same seed + style always produces the same avatar.
420
+ */
421
+ declare function buildDiceBearUrl(seed: string, style?: DiceBearStyle): string;
422
+ interface DiceBearAvatarProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof avatarVariants> {
423
+ /** Seed string for deterministic avatar generation (e.g. agent ID or name) */
424
+ seed: string;
425
+ /** DiceBear style to use. Defaults to 'adventurer-neutral'. */
426
+ avatarStyle?: DiceBearStyle;
427
+ /** Alt text for accessibility. Defaults to 'Avatar'. */
428
+ alt?: string;
429
+ /** Fallback content when image fails to load (e.g. initials) */
430
+ fallback?: React.ReactNode;
431
+ }
432
+ declare const DiceBearAvatar: React.ForwardRefExoticComponent<DiceBearAvatarProps & React.RefAttributes<HTMLDivElement>>;
433
+
434
+ /** Each icon name and the glyph it draws. */
435
+ declare const ICONS: {
436
+ readonly 'arrow-left': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
437
+ readonly 'arrow-right': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
438
+ readonly bell: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
439
+ readonly calendar: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
440
+ readonly check: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
441
+ readonly 'chevron-down': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
442
+ readonly 'chevron-left': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
443
+ readonly 'chevron-right': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
444
+ readonly 'chevron-up': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
445
+ readonly 'circle-alert': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
446
+ readonly 'circle-check': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
447
+ readonly 'clipboard-list': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
448
+ readonly clock: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
449
+ readonly database: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
450
+ readonly download: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
451
+ readonly ellipsis: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
452
+ readonly 'external-link': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
453
+ readonly eye: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
454
+ readonly 'eye-off': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
455
+ readonly 'file-text': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
456
+ readonly filter: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
457
+ readonly folder: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
458
+ readonly heart: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
459
+ readonly house: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
460
+ readonly inbox: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
461
+ readonly info: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
462
+ readonly 'layout-grid': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
463
+ readonly link: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
464
+ readonly list: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
465
+ readonly loader: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
466
+ readonly lock: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
467
+ readonly 'log-out': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
468
+ readonly mail: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
469
+ readonly 'map-pin': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
470
+ readonly menu: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
471
+ readonly package: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
472
+ readonly pencil: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
473
+ readonly phone: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
474
+ readonly plus: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
475
+ readonly 'refresh-cw': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
476
+ readonly rocket: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
477
+ readonly search: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
478
+ readonly settings: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
479
+ readonly star: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
480
+ readonly tag: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
481
+ readonly trash: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
482
+ readonly 'triangle-alert': React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
483
+ readonly upload: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
484
+ readonly user: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
485
+ readonly users: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
486
+ readonly x: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
487
+ };
488
+ type IconName = keyof typeof ICONS;
489
+ /**
490
+ * The icon sizes, each a step of the spacing scale (`size-3` is 12px …
491
+ * `size-8` 32px): the size comes from the tokens, never lucide's 24px
492
+ * default (the class sets the box; the SVG's own width/height give way).
493
+ */
494
+ declare const ICON_SIZES: {
495
+ readonly xs: "size-3";
496
+ readonly sm: "size-4";
497
+ readonly md: "size-5";
498
+ readonly lg: "size-6";
499
+ readonly xl: "size-8";
500
+ };
501
+ type IconSize = keyof typeof ICON_SIZES;
502
+ interface IconProps {
503
+ /** One name of the closed set (`ICONS`). */
504
+ name: IconName;
505
+ /** One step of the size scale (`ICON_SIZES`). */
506
+ size: IconSize;
507
+ className?: string;
508
+ }
509
+ /** A decorative icon from the closed set (hidden from assistive technology). */
510
+ declare function Icon({ name, size, className }: IconProps): React.ReactElement;
511
+
512
+ interface IntentIconProps {
513
+ intent?: 'success' | 'warning' | 'error' | 'info';
514
+ size?: 'sm' | 'md';
515
+ }
516
+ declare function IntentIcon({ intent, size, }: IntentIconProps): react_jsx_runtime.JSX.Element;
517
+
518
+ interface SectionHeadingProps {
519
+ title: string;
520
+ description?: string;
521
+ align?: 'center' | 'left';
522
+ size?: 'display' | 'h1' | 'h2' | 'h3';
523
+ }
524
+ declare function SectionHeading({ title, description, align, size, }: SectionHeadingProps): react_jsx_runtime.JSX.Element;
525
+
526
+ /**
527
+ * FilterChip Atom Component
528
+ *
529
+ * Inline filter toggle with optional count badge.
530
+ * Uses Gossamer semantic tokens for dark mode support.
531
+ *
532
+ * Authored by Caqophony
533
+ */
534
+ interface FilterChipProps {
535
+ /** Display label */
536
+ label: string;
537
+ /** Whether the chip is currently selected */
538
+ active?: boolean;
539
+ /** Optional count badge */
540
+ count?: number;
541
+ /** Chip size */
542
+ size?: 'sm' | 'md';
543
+ /** Click handler */
544
+ onClick?: () => void;
545
+ }
546
+ /**
547
+ * FilterChip — a pill-shaped toggle for filter bars.
548
+ *
549
+ * - **Inactive**: white bg, border, muted text
550
+ * - **Active**: foreground bg, white text
551
+ * - Optional count badge with accessible contrast (WCAG AA 5.7:1)
552
+ */
553
+ declare function FilterChip({ label, active, count, size, onClick, }: FilterChipProps): react_jsx_runtime.JSX.Element;
554
+
555
+ /**
556
+ * DistributionChip — a color-dotted count chip for reading a state/cost mix at a
557
+ * glance in a focal header (e.g. "● 12 running ● 3 failed"). The count/label
558
+ * distribution idiom used across the design-sweep headers.
559
+ *
560
+ * Authored by Caqophony
561
+ */
562
+ interface DistributionChipProps {
563
+ /** The count (or short value) shown in the chip. */
564
+ count: number | string;
565
+ /** The label describing what the count measures. */
566
+ label: string;
567
+ /** Tailwind class for the leading status dot (e.g. `bg-intent-success`). */
568
+ dotClass: string;
569
+ /** Optional test id. */
570
+ testId?: string;
571
+ }
572
+ declare function DistributionChip({ count, label, dotClass, testId, }: DistributionChipProps): react_jsx_runtime.JSX.Element;
573
+
574
+ /**
575
+ * SkeletonBar Atom Component
576
+ *
577
+ * Simple loading placeholder rectangle with muted fill and pill radius.
578
+ * Used as a building block in SkeletonCard and SkeletonRow.
579
+ *
580
+ * Authored by Caqophony
581
+ */
582
+ interface SkeletonBarProps {
583
+ /** Width in px, or "full" for 100%. Default: "full" */
584
+ width?: number | 'full';
585
+ /** Height in px. Default: 14 */
586
+ height?: number;
587
+ /** Optional CSS class name */
588
+ className?: string;
589
+ }
590
+ /**
591
+ * SkeletonBar — a single loading placeholder bar.
592
+ *
593
+ * Mirrors the Figma skeletonBar helper: muted fill, pill radius (height/2),
594
+ * animate-pulse for loading indication.
595
+ */
596
+ declare function SkeletonBar({ width, height, className, }: SkeletonBarProps): react_jsx_runtime.JSX.Element;
597
+
598
+ /**
599
+ * SkeletonCard Atom Component
600
+ *
601
+ * Card-shaped loading placeholder with 3 skeleton bars inside.
602
+ * Static placeholder requiring no props.
603
+ *
604
+ * Authored by Caqophony
605
+ */
606
+ interface SkeletonCardProps {
607
+ /** Optional CSS class name */
608
+ className?: string;
609
+ }
610
+ /**
611
+ * SkeletonCard — a card loading placeholder.
612
+ *
613
+ * Mirrors the Figma skeletonCard helper: card bg, border, rounded-xl,
614
+ * padding 20px, gap 10px, containing 3 skeleton bars (80x10, 60x24, 100x10).
615
+ */
616
+ declare function SkeletonCard({ className }: SkeletonCardProps): react_jsx_runtime.JSX.Element;
617
+
618
+ /**
619
+ * SkeletonRow Atom Component
620
+ *
621
+ * Row-shaped loading placeholder with avatar circle + 2 skeleton bars.
622
+ * Static placeholder requiring no props.
623
+ *
624
+ * Authored by Caqophony
625
+ */
626
+ interface SkeletonRowProps {
627
+ /** Optional CSS class name */
628
+ className?: string;
629
+ }
630
+ /**
631
+ * SkeletonRow — a row loading placeholder with avatar and text lines.
632
+ *
633
+ * Mirrors the Figma skeletonRow helper: card bg, border, rounded-[10px],
634
+ * padding 14px/18px, gap 14px, with 36px circle avatar + 2 bars (200x12, 140x10).
635
+ */
636
+ declare function SkeletonRow({ className }: SkeletonRowProps): react_jsx_runtime.JSX.Element;
637
+
638
+ /**
639
+ * StackedList Component
640
+ *
641
+ * Vertical list of items with avatar, content, and action slots.
642
+ * Common pattern for entity lists, activity feeds, and notification panels.
643
+ *
644
+ * Usage:
645
+ * import { StackedList, StackedListItem } from '@caqophony/ui';
646
+ * <StackedList divided>
647
+ * <StackedListItem
648
+ * avatar={<Avatar />}
649
+ * title="Item title"
650
+ * description="Description text"
651
+ * action={<Button size="sm">Edit</Button>}
652
+ * />
653
+ * </StackedList>
654
+ *
655
+ * Issue #2630 — B-4: Stacked Lists + Grid Lists
656
+ * Authored by Caqophony
657
+ */
658
+
659
+ interface StackedListProps extends React.HTMLAttributes<HTMLUListElement> {
660
+ divided?: boolean;
661
+ density?: 'compact' | 'default';
662
+ }
663
+ declare const StackedList: React.ForwardRefExoticComponent<StackedListProps & React.RefAttributes<HTMLUListElement>>;
664
+ interface StackedListItemProps extends React.HTMLAttributes<HTMLLIElement> {
665
+ avatar?: React.ReactNode;
666
+ title: string;
667
+ description?: string;
668
+ meta?: string;
669
+ action?: React.ReactNode;
670
+ density?: 'compact' | 'default';
671
+ }
672
+ declare const StackedListItem: React.ForwardRefExoticComponent<StackedListItemProps & React.RefAttributes<HTMLLIElement>>;
673
+
674
+ /**
675
+ * GridList Component
676
+ *
677
+ * Responsive grid of card-style items. Common pattern for entity galleries,
678
+ * product grids, and dashboard card layouts.
679
+ *
680
+ * Usage:
681
+ * import { GridList, GridListItem } from '@caqophony/ui';
682
+ * <GridList columns={3} gap="md">
683
+ * <GridListItem>Card content</GridListItem>
684
+ * </GridList>
685
+ *
686
+ * Issue #2630 — B-4: Stacked Lists + Grid Lists
687
+ * Authored by Caqophony
688
+ */
689
+
690
+ interface GridListProps extends React.HTMLAttributes<HTMLDivElement> {
691
+ columns?: 2 | 3 | 4;
692
+ gap?: 'sm' | 'md' | 'lg';
693
+ }
694
+ declare const GridList: React.ForwardRefExoticComponent<GridListProps & React.RefAttributes<HTMLDivElement>>;
695
+ interface GridListItemProps extends React.HTMLAttributes<HTMLDivElement> {
696
+ hoverable?: boolean;
697
+ }
698
+ declare const GridListItem: React.ForwardRefExoticComponent<GridListItemProps & React.RefAttributes<HTMLDivElement>>;
699
+
700
+ /**
701
+ * Pagination Component
702
+ *
703
+ * Page navigation controls for data tables and list views.
704
+ * Supports simple (prev/next), numbered, and centered variants.
705
+ *
706
+ * Usage:
707
+ * import { Pagination } from '@caqophony/ui';
708
+ * <Pagination currentPage={1} totalPages={10} onPageChange={setPage} />
709
+ *
710
+ * Issue #2634 — B-8: Pagination + Stepper
711
+ * Authored by Caqophony
712
+ */
713
+
714
+ interface PaginationProps extends React.HTMLAttributes<HTMLElement> {
715
+ currentPage: number;
716
+ totalPages: number;
717
+ onPageChange?: (page: number) => void;
718
+ variant?: 'simple' | 'numbered' | 'centered';
719
+ siblingCount?: number;
720
+ }
721
+ declare function getPageRange(current: number, total: number, siblings: number): (number | 'ellipsis')[];
722
+ declare const PaginationButton: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
723
+ active?: boolean;
724
+ } & React.RefAttributes<HTMLButtonElement>>;
725
+ declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLElement>>;
726
+
727
+ /**
728
+ * Stepper Component
729
+ *
730
+ * Multi-step progress indicator for wizards and multi-phase workflows.
731
+ * Supports horizontal (progress bar) and vertical (sidebar checklist) variants.
732
+ *
733
+ * Usage:
734
+ * import { Stepper, StepperStep } from '@caqophony/ui';
735
+ * <Stepper variant="horizontal" activeStep={1}>
736
+ * <StepperStep label="Account" />
737
+ * <StepperStep label="Profile" />
738
+ * <StepperStep label="Review" />
739
+ * </Stepper>
740
+ *
741
+ * Issue #2634 — B-8: Pagination + Stepper
742
+ * Authored by Caqophony
743
+ */
744
+
745
+ interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {
746
+ variant?: 'horizontal' | 'vertical';
747
+ activeStep: number;
748
+ size?: 'sm' | 'md' | 'lg';
749
+ }
750
+ interface StepperStepProps extends React.HTMLAttributes<HTMLDivElement> {
751
+ label: string;
752
+ description?: string;
753
+ icon?: React.ReactNode;
754
+ /** Mark this step as having an error */
755
+ error?: boolean;
756
+ /** Disable this step (prevents interaction, muted styling) */
757
+ disabled?: boolean;
758
+ /**
759
+ * Force the completed (✓) indicator even when this step is the current one.
760
+ * Steps before activeStep are completed automatically; this covers the case
761
+ * where the user revisits an already-completed step (current AND done).
762
+ */
763
+ completed?: boolean;
764
+ /** Optional href — wraps the indicator + label in an anchor tag for navigation */
765
+ href?: string;
766
+ }
767
+ declare const StepperStep: React.ForwardRefExoticComponent<StepperStepProps & React.RefAttributes<HTMLDivElement>>;
768
+ declare const Stepper: React.ForwardRefExoticComponent<StepperProps & React.RefAttributes<HTMLDivElement>>;
769
+
770
+ /**
771
+ * CommandPalette Component
772
+ *
773
+ * Power-user search/navigation overlay (Cmd+K).
774
+ *
775
+ * Token mapping:
776
+ * bg-card -> colors.card (palette bg)
777
+ * border-border -> colors.border (input border, dividers)
778
+ * bg-muted -> colors.muted (active result bg)
779
+ * text-foreground -> colors.foreground (result text)
780
+ * text-muted-fg -> colors.mutedFg (group labels, shortcuts)
781
+ * z-modal -> zIndex.modal (above everything)
782
+ *
783
+ * Issue #2631 — B-5: Command Palette (Cmd+K)
784
+ * Authored by Caqophony
785
+ */
786
+
787
+ interface CommandPaletteResult {
788
+ id: string;
789
+ label: string;
790
+ group?: string;
791
+ shortcut?: string;
792
+ icon?: React.ReactNode;
793
+ onSelect?: () => void;
794
+ }
795
+ interface CommandPaletteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'results'> {
796
+ open?: boolean;
797
+ onClose?: () => void;
798
+ results?: CommandPaletteResult[];
799
+ placeholder?: string;
800
+ onSearch?: (query: string) => void;
801
+ size?: 'sm' | 'md' | 'lg';
802
+ }
803
+ declare const CommandPalette: React.ForwardRefExoticComponent<CommandPaletteProps & React.RefAttributes<HTMLDivElement>>;
804
+
805
+ /**
806
+ * AppShell Component
807
+ *
808
+ * Generic application layout shells for generated apps.
809
+ * Stacked (top nav + content), Sidebar (collapsible + content),
810
+ * Multi-column (sidebar + main + detail panel).
811
+ *
812
+ * Token mapping:
813
+ * bg-background -> colors.background (page bg)
814
+ * bg-card -> colors.card (sidebar bg)
815
+ * border-border -> colors.border (sidebar border)
816
+ *
817
+ * One-artifact W1 (#5823) — the app frame on a phone: the `sidebar`
818
+ * variant drew its 240px sidebar beside the content at every width, leaving
819
+ * a 150px column at 390px. Below `md` the sidebar now lives behind a menu
820
+ * button in a top bar and opens as a drawer over a scrim (`z-overlay`,
821
+ * Escape and the scrim close it); from `md` up it is the fixed column.
822
+ * The drawer is `NavDrawer` (`./nav-drawer`), shared with
823
+ * `CollapsibleSidebar`: one phone drawer in the library.
824
+ *
825
+ * Issue #2629 — B-3: Application Shells
826
+ * Authored by Caqophony
827
+ */
828
+
829
+ interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {
830
+ variant?: 'stacked' | 'sidebar' | 'multi-column';
831
+ sidebarPosition?: 'left' | 'right';
832
+ sidebarCollapsed?: boolean;
833
+ header?: React.ReactNode;
834
+ sidebar?: React.ReactNode;
835
+ detailPanel?: React.ReactNode;
836
+ /** `sidebar` variant: the menu button's accessible name on a phone. */
837
+ navLabel?: string;
838
+ /** `sidebar` variant: the phone drawer starts open (the style sheet draws it so). */
839
+ defaultNavOpen?: boolean;
840
+ }
841
+ declare const AppShell: React.ForwardRefExoticComponent<AppShellProps & React.RefAttributes<HTMLDivElement>>;
842
+
843
+ /**
844
+ * Popover + HoverCard Components
845
+ *
846
+ * Content-rich tooltips for entity previews and contextual help.
847
+ *
848
+ * Token mapping:
849
+ * bg-card -> colors.card (popover bg)
850
+ * border-border -> colors.border (popover border)
851
+ * z-popover -> zIndex.popover (80)
852
+ * shadow-lg -> elevation-3
853
+ *
854
+ * Issue #2651 — B-19: Popover + Hover Card
855
+ * Authored by Caqophony
856
+ */
857
+
858
+ interface PopoverProps extends React.HTMLAttributes<HTMLDivElement> {
859
+ open?: boolean;
860
+ onOpenChange?: (open: boolean) => void;
861
+ trigger: React.ReactNode;
862
+ side?: 'top' | 'bottom' | 'left' | 'right';
863
+ align?: 'start' | 'center' | 'end';
864
+ }
865
+ declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
866
+ interface HoverCardProps extends React.HTMLAttributes<HTMLDivElement> {
867
+ trigger: React.ReactNode;
868
+ side?: 'top' | 'bottom';
869
+ align?: 'start' | 'center' | 'end';
870
+ delay?: number;
871
+ }
872
+ declare const HoverCard: React.ForwardRefExoticComponent<HoverCardProps & React.RefAttributes<HTMLDivElement>>;
873
+
874
+ /**
875
+ * Calendar + DatePicker Components
876
+ *
877
+ * Calendar renders a month grid with selectable days, event dots,
878
+ * single/range selection, and full keyboard navigation.
879
+ * DatePicker wraps Calendar in a popover triggered by an input.
880
+ *
881
+ * Token mapping:
882
+ * bg-card -> colors.card (calendar bg)
883
+ * border-border -> colors.border (calendar border, input border)
884
+ * bg-primary -> colors.primary (selected day, range endpoints)
885
+ * bg-primary/10 -> colors.primary10 (range middle days)
886
+ * text-primary-foreground -> colors.white (selected day text)
887
+ * bg-muted -> colors.muted (today highlight)
888
+ * text-muted-foreground -> colors.mutedFg (weekday headers)
889
+ * text-foreground -> colors.foreground (day text, navigation)
890
+ * bg-intent-info -> colors.info (event dots)
891
+ * z-popover -> zIndex.popover (datepicker dropdown)
892
+ *
893
+ * Issue #2640 — B-13: Calendar + DatePicker
894
+ * Authored by Caqophony
895
+ */
896
+
897
+ interface CalendarEvent {
898
+ date: Date;
899
+ color?: string;
900
+ }
901
+ interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
902
+ /** Currently selected date (single mode) */
903
+ value?: Date | null;
904
+ /** Called when a day is clicked (single mode) */
905
+ onChange?: (date: Date) => void;
906
+ /** Selection mode */
907
+ selectionMode?: 'single' | 'range';
908
+ /** Range start date (range mode) */
909
+ rangeStart?: Date | null;
910
+ /** Range end date (range mode) */
911
+ rangeEnd?: Date | null;
912
+ /** Called when a range endpoint is selected */
913
+ onRangeChange?: (start: Date | null, end: Date | null) => void;
914
+ /** Minimum selectable date */
915
+ minDate?: Date;
916
+ /** Maximum selectable date */
917
+ maxDate?: Date;
918
+ /** Events to show as dots under day numbers */
919
+ events?: CalendarEvent[];
920
+ /** Override "today" date (for testing or server-injected current date) */
921
+ today?: Date;
922
+ /** Size variant */
923
+ size?: 'sm' | 'md' | 'lg';
924
+ }
925
+ declare const Calendar: React.ForwardRefExoticComponent<CalendarProps & React.RefAttributes<HTMLDivElement>>;
926
+ interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
927
+ /** Selection variant */
928
+ variant?: 'single' | 'range';
929
+ /** Currently selected date (single mode) */
930
+ value?: Date | null;
931
+ /** Called when a date is selected (single mode) */
932
+ onChange?: (date: Date) => void;
933
+ /** Range start date (range mode) */
934
+ rangeStart?: Date | null;
935
+ /** Range end date (range mode) */
936
+ rangeEnd?: Date | null;
937
+ /** Called when range changes */
938
+ onRangeChange?: (start: Date | null, end: Date | null) => void;
939
+ /** Placeholder text when no date is selected */
940
+ placeholder?: string;
941
+ /** Minimum selectable date */
942
+ minDate?: Date;
943
+ /** Maximum selectable date */
944
+ maxDate?: Date;
945
+ /** Events to show on calendar */
946
+ events?: CalendarEvent[];
947
+ /** Controlled open state */
948
+ open?: boolean;
949
+ /** Called when open state changes */
950
+ onOpenChange?: (open: boolean) => void;
951
+ /** Calendar size */
952
+ calendarSize?: 'sm' | 'md' | 'lg';
953
+ /** Disabled state */
954
+ disabled?: boolean;
955
+ }
956
+ declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLDivElement>>;
957
+
958
+ /**
959
+ * Navbar Component
960
+ *
961
+ * Top navigation bar with simple, centered, withSearch, twoLevel variants.
962
+ *
963
+ * Token mapping:
964
+ * bg-card -> colors.card (nav bg)
965
+ * border-border -> colors.border (bottom border)
966
+ * text-foreground -> colors.foreground (active links)
967
+ * text-muted-fg -> colors.mutedFg (inactive links)
968
+ *
969
+ * Issue #2647 — B-16: Extended Navbar Variants
970
+ * Authored by Caqophony
971
+ */
972
+
973
+ interface NavbarProps extends React.HTMLAttributes<HTMLElement> {
974
+ variant?: 'simple' | 'centered' | 'withSearch' | 'twoLevel';
975
+ transparent?: boolean;
976
+ logo?: React.ReactNode;
977
+ actions?: React.ReactNode;
978
+ search?: React.ReactNode;
979
+ secondaryNav?: React.ReactNode;
980
+ }
981
+ declare const Navbar: React.ForwardRefExoticComponent<NavbarProps & React.RefAttributes<HTMLElement>>;
982
+ interface NavbarLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
983
+ active?: boolean;
984
+ }
985
+ declare const NavbarLink: React.ForwardRefExoticComponent<NavbarLinkProps & React.RefAttributes<HTMLAnchorElement>>;
986
+
987
+ /**
988
+ * Extended Card Variants
989
+ *
990
+ * Beyond the basic Card: horizontal, image, stat, action card patterns.
991
+ *
992
+ * Token mapping:
993
+ * bg-card -> colors.card
994
+ * border-border -> colors.border
995
+ * text-foreground -> colors.foreground
996
+ * text-muted-fg -> colors.mutedFg
997
+ * hover:shadow-md -> elevation-2 (hoverable)
998
+ *
999
+ * Issue #2648 — B-17: Extended Card Variants
1000
+ * Authored by Caqophony
1001
+ */
1002
+
1003
+ interface HorizontalCardProps extends React.HTMLAttributes<HTMLDivElement> {
1004
+ media?: React.ReactNode;
1005
+ hoverable?: boolean;
1006
+ }
1007
+ declare const HorizontalCard: React.ForwardRefExoticComponent<HorizontalCardProps & React.RefAttributes<HTMLDivElement>>;
1008
+ interface ImageCardProps extends React.HTMLAttributes<HTMLDivElement> {
1009
+ imageSrc?: string;
1010
+ imageAlt?: string;
1011
+ hoverable?: boolean;
1012
+ }
1013
+ declare const ImageCard: React.ForwardRefExoticComponent<ImageCardProps & React.RefAttributes<HTMLDivElement>>;
1014
+ interface StatCardExtendedProps extends React.HTMLAttributes<HTMLDivElement> {
1015
+ label: string;
1016
+ /** W1 (#5823): `null` (not measured yet) draws `EmptyValue`, never a blank. */
1017
+ value: string | null;
1018
+ trend?: {
1019
+ direction: 'up' | 'down' | 'neutral';
1020
+ text: string;
1021
+ };
1022
+ icon?: React.ReactNode;
1023
+ }
1024
+ declare const StatCardExtended: React.ForwardRefExoticComponent<StatCardExtendedProps & React.RefAttributes<HTMLDivElement>>;
1025
+ interface ActionCardProps extends React.HTMLAttributes<HTMLDivElement> {
1026
+ title: string;
1027
+ description?: string;
1028
+ actions?: React.ReactNode;
1029
+ }
1030
+ declare const ActionCard: React.ForwardRefExoticComponent<ActionCardProps & React.RefAttributes<HTMLDivElement>>;
1031
+
1032
+ /**
1033
+ * ModalDialog Component
1034
+ *
1035
+ * Overlay dialog with backdrop, focus trap, and composable slots.
1036
+ *
1037
+ * Token mapping:
1038
+ * bg-background/overlay -> opacity-overlay (backdrop)
1039
+ * bg-card -> colors.card (modal bg)
1040
+ * border-border -> colors.border
1041
+ * z-modal -> zIndex.modal (70)
1042
+ * z-overlay -> zIndex.overlay (60)
1043
+ * duration-default -> transition.duration.default
1044
+ *
1045
+ * Issue #2628 — B-2: Modal Dialog + Drawer
1046
+ * Authored by Caqophony
1047
+ */
1048
+
1049
+ interface ModalDialogProps extends React.HTMLAttributes<HTMLDivElement> {
1050
+ open?: boolean;
1051
+ onClose?: () => void;
1052
+ size?: 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen';
1053
+ }
1054
+ declare const ModalDialog: React.ForwardRefExoticComponent<ModalDialogProps & React.RefAttributes<HTMLDivElement>>;
1055
+ declare const ModalHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1056
+ declare const ModalBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1057
+ declare const ModalFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1058
+
1059
+ /**
1060
+ * Drawer Component
1061
+ *
1062
+ * Slide-over panel from left, right, or bottom edges.
1063
+ *
1064
+ * Token mapping:
1065
+ * bg-background/overlay -> opacity-overlay (backdrop)
1066
+ * bg-card -> colors.card (drawer bg)
1067
+ * border-border -> colors.border
1068
+ * z-modal -> zIndex.modal (70)
1069
+ * duration-drawer -> transition.duration.drawer (500ms)
1070
+ *
1071
+ * Issue #2628 — B-2: Modal Dialog + Drawer
1072
+ * Authored by Caqophony
1073
+ */
1074
+
1075
+ interface DrawerProps extends React.HTMLAttributes<HTMLDivElement> {
1076
+ open?: boolean;
1077
+ onClose?: () => void;
1078
+ side?: 'left' | 'right' | 'bottom';
1079
+ size?: 'sm' | 'md' | 'lg';
1080
+ }
1081
+ declare const Drawer: React.ForwardRefExoticComponent<DrawerProps & React.RefAttributes<HTMLDivElement>>;
1082
+ declare const DrawerHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1083
+ declare const DrawerBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1084
+ declare const DrawerFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1085
+
1086
+ /**
1087
+ * FormLayout Component
1088
+ *
1089
+ * Responsive form section layout: stacked, inline, or two-column.
1090
+ *
1091
+ * Token mapping: border-border -> colors.border (section dividers)
1092
+ *
1093
+ * Issue #2633 — B-7: Advanced Form Family
1094
+ * Authored by Caqophony
1095
+ */
1096
+
1097
+ interface FormLayoutProps extends React.FormHTMLAttributes<HTMLFormElement> {
1098
+ layout?: 'stacked' | 'inline' | 'two-column';
1099
+ }
1100
+ declare const FormLayout: React.ForwardRefExoticComponent<FormLayoutProps & React.RefAttributes<HTMLFormElement>>;
1101
+ interface FormLayoutSectionProps extends React.HTMLAttributes<HTMLDivElement> {
1102
+ title?: string;
1103
+ description?: string;
1104
+ }
1105
+ declare const FormLayoutSection: React.ForwardRefExoticComponent<FormLayoutSectionProps & React.RefAttributes<HTMLDivElement>>;
1106
+
1107
+ /**
1108
+ * InputGroup Component
1109
+ *
1110
+ * Input with prefix/suffix addons (text, icon, or button).
1111
+ *
1112
+ * Token mapping:
1113
+ * bg-muted -> colors.muted (addon background)
1114
+ * border-input -> colors.border (input border)
1115
+ * text-muted-fg -> colors.mutedFg (addon text)
1116
+ *
1117
+ * Issue #2633 — B-7: Advanced Form Family
1118
+ * Authored by Caqophony
1119
+ */
1120
+
1121
+ interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {
1122
+ addon?: 'prefix' | 'suffix' | 'both';
1123
+ addonContent?: React.ReactNode;
1124
+ suffixContent?: React.ReactNode;
1125
+ }
1126
+ declare const InputGroup: React.ForwardRefExoticComponent<InputGroupProps & React.RefAttributes<HTMLDivElement>>;
1127
+
1128
+ /**
1129
+ * RadioGroup Component
1130
+ *
1131
+ * Radio selection with simple, card, and stacked visual variants.
1132
+ *
1133
+ * Token mapping:
1134
+ * bg-card -> colors.card (card variant bg)
1135
+ * border-border -> colors.border (card border)
1136
+ * border-primary -> colors.primary (selected card border)
1137
+ * text-foreground -> colors.foreground (label)
1138
+ * text-muted-fg -> colors.mutedFg (description)
1139
+ *
1140
+ * Issue #2633 — B-7: Advanced Form Family
1141
+ * Authored by Caqophony
1142
+ */
1143
+
1144
+ interface RadioGroupOption {
1145
+ value: string;
1146
+ label: string;
1147
+ description?: string;
1148
+ }
1149
+ interface RadioGroupProps extends Omit<React.HTMLAttributes<HTMLFieldSetElement>, 'onChange'> {
1150
+ options: RadioGroupOption[];
1151
+ value?: string;
1152
+ onChange?: (value: string) => void;
1153
+ variant?: 'simple' | 'card' | 'stacked';
1154
+ name?: string;
1155
+ label?: string;
1156
+ }
1157
+ declare const RadioGroup: React.ForwardRefExoticComponent<RadioGroupProps & React.RefAttributes<HTMLFieldSetElement>>;
1158
+
1159
+ /**
1160
+ * Combobox Component
1161
+ *
1162
+ * Searchable dropdown with filtering and multi-select support.
1163
+ *
1164
+ * Token mapping:
1165
+ * bg-card -> colors.card (dropdown bg)
1166
+ * bg-muted -> colors.muted (hover item)
1167
+ * border-input -> colors.border (input border)
1168
+ * text-foreground -> colors.foreground (option text)
1169
+ * text-muted-fg -> colors.mutedFg (placeholder)
1170
+ * bg-primary -> colors.primary (selected tag)
1171
+ *
1172
+ * Issue #2633 — B-7: Advanced Form Family
1173
+ * Authored by Caqophony
1174
+ */
1175
+
1176
+ interface ComboboxOption {
1177
+ value: string;
1178
+ label: string;
1179
+ }
1180
+ interface ComboboxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
1181
+ options: ComboboxOption[];
1182
+ value?: string | string[];
1183
+ onChange?: (value: string | string[]) => void;
1184
+ placeholder?: string;
1185
+ multi?: boolean;
1186
+ filterable?: boolean;
1187
+ }
1188
+ declare const Combobox: React.ForwardRefExoticComponent<ComboboxProps & React.RefAttributes<HTMLDivElement>>;
1189
+
1190
+ /**
1191
+ * NotificationBanner Component
1192
+ *
1193
+ * Inline notification banners with 4 intents and dismiss animation.
1194
+ *
1195
+ * Token mapping:
1196
+ * bg-intent-[intent]/10 -> solidFillAlpha(intent, 0.1)
1197
+ * text-intent-[intent]-fg -> intent foreground colors
1198
+ * border-intent-[intent]/20 -> solidFillAlpha(intent, 0.2)
1199
+ *
1200
+ * Usage:
1201
+ * import { NotificationBanner } from '@caqophony/ui';
1202
+ * <NotificationBanner intent="success" dismissible>
1203
+ * Your changes have been saved.
1204
+ * </NotificationBanner>
1205
+ *
1206
+ * Issue #2632 — B-6: Notification Panel + Banner
1207
+ * Authored by Caqophony
1208
+ */
1209
+
1210
+ interface NotificationBannerProps extends React.HTMLAttributes<HTMLDivElement> {
1211
+ intent?: 'success' | 'warning' | 'error' | 'info';
1212
+ variant?: 'subtle' | 'solid' | 'accent';
1213
+ title?: string;
1214
+ dismissible?: boolean;
1215
+ onDismiss?: () => void;
1216
+ action?: React.ReactNode;
1217
+ }
1218
+ declare const NotificationBanner: React.ForwardRefExoticComponent<NotificationBannerProps & React.RefAttributes<HTMLDivElement>>;
1219
+
1220
+ /**
1221
+ * NotificationPanel Component
1222
+ *
1223
+ * Dropdown notification list triggered from a bell icon.
1224
+ * Renders a list of notification items with unread badge and mark-all-read.
1225
+ *
1226
+ * Token mapping:
1227
+ * bg-card → colors.card (panel bg)
1228
+ * border-border → colors.border (panel border, dividers)
1229
+ * text-primary → colors.primary (unread indicator)
1230
+ * text-muted-fg → colors.mutedFg (timestamps)
1231
+ *
1232
+ * Usage:
1233
+ * import { NotificationPanel, NotificationPanelItem } from '@caqophony/ui';
1234
+ * <NotificationPanel unreadCount={3} onMarkAllRead={handleMarkAll}>
1235
+ * <NotificationPanelItem title="New comment" time="2m ago" unread />
1236
+ * </NotificationPanel>
1237
+ *
1238
+ * Issue #2632 — B-6: Notification Panel + Banner
1239
+ * Authored by Caqophony
1240
+ */
1241
+
1242
+ interface NotificationPanelProps extends React.HTMLAttributes<HTMLDivElement> {
1243
+ unreadCount?: number;
1244
+ onMarkAllRead?: () => void;
1245
+ }
1246
+ declare const NotificationPanel: React.ForwardRefExoticComponent<NotificationPanelProps & React.RefAttributes<HTMLDivElement>>;
1247
+ interface NotificationPanelItemProps extends React.HTMLAttributes<HTMLDivElement> {
1248
+ title: string;
1249
+ description?: string;
1250
+ time?: string;
1251
+ unread?: boolean;
1252
+ icon?: React.ReactNode;
1253
+ }
1254
+ declare const NotificationPanelItem: React.ForwardRefExoticComponent<NotificationPanelItemProps & React.RefAttributes<HTMLDivElement>>;
1255
+
1256
+ interface SkeletonTableProps extends React.HTMLAttributes<HTMLDivElement> {
1257
+ rows?: number;
1258
+ columns?: number;
1259
+ }
1260
+ declare function SkeletonTable({ className, rows, columns, ...props }: SkeletonTableProps): react_jsx_runtime.JSX.Element;
1261
+ declare namespace SkeletonTable {
1262
+ var displayName: string;
1263
+ }
1264
+ interface SkeletonCardGridProps extends React.HTMLAttributes<HTMLDivElement> {
1265
+ cards?: number;
1266
+ columns?: 2 | 3;
1267
+ }
1268
+ declare function SkeletonCardGrid({ className, cards, columns, ...props }: SkeletonCardGridProps): react_jsx_runtime.JSX.Element;
1269
+ declare namespace SkeletonCardGrid {
1270
+ var displayName: string;
1271
+ }
1272
+ interface SkeletonDetailProps extends React.HTMLAttributes<HTMLDivElement> {
1273
+ }
1274
+ declare function SkeletonDetail({ className, ...props }: SkeletonDetailProps): react_jsx_runtime.JSX.Element;
1275
+ declare namespace SkeletonDetail {
1276
+ var displayName: string;
1277
+ }
1278
+
1279
+ /**
1280
+ * Toggle + ToggleGroup Components
1281
+ *
1282
+ * Icon toggles and view-mode selectors (grid/list/table).
1283
+ * Beyond Switch: pressed/unpressed visual state with icon support.
1284
+ *
1285
+ * Token mapping:
1286
+ * bg-muted → colors.muted (group container, active toggle)
1287
+ * bg-transparent → transparent (inactive toggle)
1288
+ * text-foreground → colors.foreground (active)
1289
+ * text-muted-fg → colors.mutedFg (inactive)
1290
+ * border-input → colors.border (outline variant)
1291
+ *
1292
+ * Usage:
1293
+ * import { Toggle, ToggleGroup } from '@caqophony/ui';
1294
+ * <ToggleGroup type="single" value={view} onValueChange={setView}>
1295
+ * <Toggle value="grid" aria-label="Grid view">Grid</Toggle>
1296
+ * <Toggle value="list" aria-label="List view">List</Toggle>
1297
+ * </ToggleGroup>
1298
+ *
1299
+ * Issue #2650 — B-18: Toggle + Toggle Group
1300
+ * Authored by Caqophony
1301
+ */
1302
+
1303
+ interface ToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
1304
+ pressed?: boolean;
1305
+ variant?: 'default' | 'outline';
1306
+ size?: 'sm' | 'md' | 'lg';
1307
+ value?: string;
1308
+ }
1309
+ declare const Toggle: React.ForwardRefExoticComponent<ToggleProps & React.RefAttributes<HTMLButtonElement>>;
1310
+ interface ToggleGroupProps extends React.HTMLAttributes<HTMLDivElement> {
1311
+ type?: 'single' | 'multiple';
1312
+ value?: string | string[];
1313
+ onValueChange?: (value: string | string[]) => void;
1314
+ variant?: 'default' | 'outline';
1315
+ size?: 'sm' | 'md' | 'lg';
1316
+ }
1317
+ declare const ToggleGroup: React.ForwardRefExoticComponent<ToggleGroupProps & React.RefAttributes<HTMLDivElement>>;
1318
+
1319
+ /**
1320
+ * AvatarGroup Component
1321
+ *
1322
+ * Overlapping avatar circles with +N overflow indicator.
1323
+ * Common for team displays, assignee fields, and user lists.
1324
+ *
1325
+ * Token mapping:
1326
+ * bg-muted → colors.muted (avatar placeholder bg)
1327
+ * border-background → colors.background (ring around each avatar)
1328
+ * text-muted-fg → colors.mutedFg (overflow text)
1329
+ *
1330
+ * Usage:
1331
+ * import { AvatarGroup, AvatarGroupItem } from '@caqophony/ui';
1332
+ * <AvatarGroup max={3}>
1333
+ * <AvatarGroupItem src="/user1.jpg" alt="Jane" />
1334
+ * <AvatarGroupItem src="/user2.jpg" alt="John" />
1335
+ * <AvatarGroupItem src="/user3.jpg" alt="Sarah" />
1336
+ * <AvatarGroupItem src="/user4.jpg" alt="Mike" />
1337
+ * </AvatarGroup>
1338
+ *
1339
+ * Issue #2639 — B-12: Avatar Groups + Badge Extensions
1340
+ * Authored by Caqophony
1341
+ */
1342
+
1343
+ interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {
1344
+ max?: number;
1345
+ size?: 'xs' | 'sm' | 'md' | 'lg';
1346
+ }
1347
+ declare const AvatarGroup: React.ForwardRefExoticComponent<AvatarGroupProps & React.RefAttributes<HTMLDivElement>>;
1348
+ interface AvatarGroupItemProps extends React.ImgHTMLAttributes<HTMLImageElement> {
1349
+ fallback?: string;
1350
+ size?: 'xs' | 'sm' | 'md' | 'lg';
1351
+ }
1352
+ declare const AvatarGroupItem: React.ForwardRefExoticComponent<AvatarGroupItemProps & React.RefAttributes<HTMLImageElement>>;
1353
+
1354
+ /**
1355
+ * TabBar Component
1356
+ *
1357
+ * Tabbed navigation with underline, pills, and enclosed visual variants.
1358
+ *
1359
+ * Token mapping (React ↔ Figma):
1360
+ * bg-muted → colors.muted (pills container bg)
1361
+ * text-foreground → colors.foreground (active tab text)
1362
+ * text-muted-fg → colors.mutedFg (inactive tab text)
1363
+ * border-primary → colors.primary (underline indicator)
1364
+ * bg-background → colors.background (active pill bg)
1365
+ *
1366
+ * Usage:
1367
+ * import { TabBar, TabBarItem } from '@caqophony/ui';
1368
+ * <TabBar variant="underline">
1369
+ * <TabBarItem active>Overview</TabBarItem>
1370
+ * <TabBarItem>Settings</TabBarItem>
1371
+ * </TabBar>
1372
+ *
1373
+ * Issue #2637 — B-11: Breadcrumb + Tab Extensions
1374
+ * Authored by Caqophony
1375
+ */
1376
+
1377
+ interface TabBarProps extends React.HTMLAttributes<HTMLDivElement> {
1378
+ variant?: 'underline' | 'pills' | 'enclosed';
1379
+ }
1380
+ declare const TabBar: React.ForwardRefExoticComponent<TabBarProps & React.RefAttributes<HTMLDivElement>>;
1381
+ interface TabBarItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
1382
+ active?: boolean;
1383
+ /** @internal injected by TabBar */
1384
+ _variant?: 'underline' | 'pills' | 'enclosed';
1385
+ }
1386
+ declare const TabBarItem: React.ForwardRefExoticComponent<TabBarItemProps & React.RefAttributes<HTMLButtonElement>>;
1387
+
1388
+ interface StickyActionBarProps {
1389
+ /** Left slot — page title, status/verdict pill, a short summary. */
1390
+ context?: ReactNode;
1391
+ /** Right slot — the action button(s). The primary is the visually dominant. */
1392
+ actions: ReactNode;
1393
+ /** Sticky top offset — defaults to `top-16` (below the app header). */
1394
+ topClassName?: string;
1395
+ /** Extra classes on the sticky wrapper. */
1396
+ className?: string;
1397
+ /** testid for the bar (defaults to sticky-action-bar). */
1398
+ testId?: string;
1399
+ }
1400
+ declare function StickyActionBar({ context, actions, topClassName, className, testId, }: StickyActionBarProps): react_jsx_runtime.JSX.Element;
1401
+
1402
+ /**
1403
+ * ButtonGroup Component
1404
+ *
1405
+ * Segmented controls, toggle groups, and split buttons.
1406
+ * Connected borders between buttons (no double borders).
1407
+ *
1408
+ * Usage:
1409
+ * import { ButtonGroup, ButtonGroupItem } from '@caqophony/ui';
1410
+ * <ButtonGroup variant="segmented">
1411
+ * <ButtonGroupItem active>Grid</ButtonGroupItem>
1412
+ * <ButtonGroupItem>List</ButtonGroupItem>
1413
+ * <ButtonGroupItem>Table</ButtonGroupItem>
1414
+ * </ButtonGroup>
1415
+ *
1416
+ * Issue #2642 — B-15: Button Groups
1417
+ * Authored by Caqophony
1418
+ */
1419
+
1420
+ interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement> {
1421
+ variant?: 'default' | 'outlined' | 'segmented';
1422
+ size?: 'sm' | 'md' | 'lg';
1423
+ }
1424
+ declare const ButtonGroup: React.ForwardRefExoticComponent<ButtonGroupProps & React.RefAttributes<HTMLDivElement>>;
1425
+ interface ButtonGroupItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
1426
+ active?: boolean;
1427
+ /** @internal injected by ButtonGroup */
1428
+ _variant?: 'default' | 'outlined' | 'segmented';
1429
+ /** @internal injected by ButtonGroup */
1430
+ _size?: 'sm' | 'md' | 'lg';
1431
+ }
1432
+ declare const ButtonGroupItem: React.ForwardRefExoticComponent<ButtonGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
1433
+
1434
+ /**
1435
+ * DataTable Component
1436
+ *
1437
+ * Sortable, selectable data table with density variants.
1438
+ * The highest-reuse component across SaaS — every generated app needs one.
1439
+ *
1440
+ * Token mapping (React ↔ Figma):
1441
+ * bg-card → colors.card (table background)
1442
+ * border-border → colors.border (cell borders)
1443
+ * text-foreground → colors.foreground (cell text)
1444
+ * text-muted-fg → colors.mutedFg (header text)
1445
+ * bg-muted → colors.muted (striped rows, header bg)
1446
+ * bg-primary → colors.primary (selected row indicator)
1447
+ *
1448
+ * Usage:
1449
+ * import { DataTable, TableHeader, TableRow, TableCell } from '@caqophony/ui';
1450
+ * <DataTable density="default" striped bordered>
1451
+ * <TableHeader>
1452
+ * <TableRow>
1453
+ * <TableCell header sortDirection="asc">Name</TableCell>
1454
+ * <TableCell header>Email</TableCell>
1455
+ * </TableRow>
1456
+ * </TableHeader>
1457
+ * <tbody>
1458
+ * <TableRow>
1459
+ * <TableCell>Jane Cooper</TableCell>
1460
+ * <TableCell>jane@example.com</TableCell>
1461
+ * </TableRow>
1462
+ * </tbody>
1463
+ * </DataTable>
1464
+ *
1465
+ * Issue #2627 — B-1: DataTable + TableHeader + TableRow + TableCell
1466
+ * Authored by Caqophony
1467
+ */
1468
+
1469
+ interface DataTableProps extends React.TableHTMLAttributes<HTMLTableElement> {
1470
+ density?: 'compact' | 'default' | 'relaxed';
1471
+ striped?: boolean;
1472
+ bordered?: boolean;
1473
+ }
1474
+ declare const DataTable: React.ForwardRefExoticComponent<DataTableProps & React.RefAttributes<HTMLTableElement>>;
1475
+ declare const TableHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
1476
+ declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
1477
+ interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {
1478
+ selected?: boolean;
1479
+ }
1480
+ declare const TableRow: React.ForwardRefExoticComponent<TableRowProps & React.RefAttributes<HTMLTableRowElement>>;
1481
+ interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {
1482
+ header?: boolean;
1483
+ sortDirection?: 'asc' | 'desc' | null;
1484
+ onSort?: () => void;
1485
+ }
1486
+ declare const TableCell: React.ForwardRefExoticComponent<TableCellProps & React.RefAttributes<HTMLTableCellElement>>;
1487
+ declare const TableCaption: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableCaptionElement> & React.RefAttributes<HTMLTableCaptionElement>>;
1488
+
1489
+ /**
1490
+ * StatGroup Component
1491
+ *
1492
+ * Responsive grid of stat cards for dashboards. Composes with StatCard atoms.
1493
+ *
1494
+ * Token mapping: bg-card → colors.card, border-border → colors.border
1495
+ *
1496
+ * Usage:
1497
+ * import { StatGroup } from '@caqophony/ui';
1498
+ * <StatGroup columns={3} variant="card">
1499
+ * <div>Stat 1</div><div>Stat 2</div><div>Stat 3</div>
1500
+ * </StatGroup>
1501
+ *
1502
+ * Issue #2635 — B-9
1503
+ * Authored by Caqophony
1504
+ */
1505
+
1506
+ interface StatGroupProps extends React.HTMLAttributes<HTMLDivElement> {
1507
+ columns?: 2 | 3 | 4;
1508
+ variant?: 'card' | 'inline';
1509
+ }
1510
+ declare const StatGroup: React.ForwardRefExoticComponent<StatGroupProps & React.RefAttributes<HTMLDivElement>>;
1511
+
1512
+ /**
1513
+ * DescriptionList Component
1514
+ *
1515
+ * Key-value pairs for detail pages, settings views, and entity summaries.
1516
+ *
1517
+ * Token mapping:
1518
+ * text-muted-foreground → colors.mutedFg (labels)
1519
+ * text-foreground → colors.foreground (values)
1520
+ * border-border → colors.border (dividers)
1521
+ *
1522
+ * Usage:
1523
+ * import { DescriptionList, DescriptionItem } from '@caqophony/ui';
1524
+ * <DescriptionList layout="side-by-side">
1525
+ * <DescriptionItem label="Name" value="Jane Cooper" />
1526
+ * <DescriptionItem label="Email" value={null} /> → "—"
1527
+ * </DescriptionList>
1528
+ *
1529
+ * One-artifact W1 (#5823): the list's `layout` is the ONE writer of every
1530
+ * item's layout (a context; an item had its own `layout` prop that a page
1531
+ * had to repeat on each item). An empty value (`isEmptyValue`) draws
1532
+ * `EmptyValue`, never a blank. A long value wraps instead of running off.
1533
+ *
1534
+ * Issue #2635 — B-9
1535
+ * Authored by Caqophony
1536
+ */
1537
+
1538
+ type DescriptionLayout = 'stacked' | 'side-by-side' | 'grid';
1539
+ interface DescriptionListProps extends React.HTMLAttributes<HTMLDListElement> {
1540
+ layout?: DescriptionLayout;
1541
+ }
1542
+ declare const DescriptionList: React.ForwardRefExoticComponent<DescriptionListProps & React.RefAttributes<HTMLDListElement>>;
1543
+ interface DescriptionItemProps extends React.HTMLAttributes<HTMLDivElement> {
1544
+ label: string;
1545
+ /** Drawn as `EmptyValue` when empty (`isEmptyValue`). */
1546
+ value: React.ReactNode;
1547
+ }
1548
+ declare const DescriptionItem: React.ForwardRefExoticComponent<DescriptionItemProps & React.RefAttributes<HTMLDivElement>>;
1549
+
1550
+ /**
1551
+ * ActivityFeed Component
1552
+ *
1553
+ * Vertical timeline of events with avatar, content, and timestamp.
1554
+ *
1555
+ * Token mapping:
1556
+ * bg-primary → colors.primary (timeline connector)
1557
+ * bg-muted → colors.muted (inactive connector)
1558
+ * text-foreground → colors.foreground (content)
1559
+ * text-muted-foreground → colors.mutedFg (timestamp)
1560
+ *
1561
+ * Usage:
1562
+ * import { ActivityFeed, ActivityFeedItem } from '@caqophony/ui';
1563
+ * <ActivityFeed>
1564
+ * <ActivityFeedItem
1565
+ * avatar={<Avatar />}
1566
+ * eventDescription="Jane created a new project"
1567
+ * timestamp="2 hours ago"
1568
+ * />
1569
+ * </ActivityFeed>
1570
+ *
1571
+ * Issue #2635 — B-9
1572
+ * Authored by Caqophony
1573
+ */
1574
+
1575
+ interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {
1576
+ variant?: 'simple' | 'withComments';
1577
+ }
1578
+ declare const ActivityFeed: React.ForwardRefExoticComponent<ActivityFeedProps & React.RefAttributes<HTMLDivElement>>;
1579
+ interface ActivityFeedItemProps extends React.HTMLAttributes<HTMLDivElement> {
1580
+ avatar?: React.ReactNode;
1581
+ eventDescription: React.ReactNode;
1582
+ timestamp?: string;
1583
+ isLast?: boolean;
1584
+ }
1585
+ declare const ActivityFeedItem: React.ForwardRefExoticComponent<ActivityFeedItemProps & React.RefAttributes<HTMLDivElement>>;
1586
+
1587
+ /**
1588
+ * Alert Component
1589
+ *
1590
+ * Contextual feedback messages with 4 intents × 3 visual variants.
1591
+ *
1592
+ * Token mapping (React ↔ Figma):
1593
+ * bg-intent-success/10 → solidFillAlpha(colors.success, 0.1) [subtle]
1594
+ * bg-intent-success → colors.success [solid]
1595
+ * border-intent-success → solidFill(intentSuccessBorder) [outline]
1596
+ * text-intent-success → colors.success [icon/title]
1597
+ *
1598
+ * Usage:
1599
+ * import { Alert } from '@caqophony/ui';
1600
+ * <Alert intent="error" variant="subtle" title="Error" dismissible>
1601
+ * Something went wrong.
1602
+ * </Alert>
1603
+ *
1604
+ * Issue #2636 — B-10: Action Panels + Alert Component
1605
+ * Authored by Caqophony
1606
+ */
1607
+
1608
+ interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
1609
+ intent?: 'success' | 'warning' | 'error' | 'info';
1610
+ variant?: 'subtle' | 'solid' | 'outline';
1611
+ title?: string;
1612
+ dismissible?: boolean;
1613
+ onDismiss?: () => void;
1614
+ }
1615
+ /** The pale-tint intent styles; `IntentBadge` reads the same map (W1 #5823). */
1616
+ declare const INTENT_SUBTLE_STYLES: Record<'success' | 'warning' | 'error' | 'info', string>;
1617
+ declare const Alert: React.ForwardRefExoticComponent<AlertProps & React.RefAttributes<HTMLDivElement>>;
1618
+
1619
+ interface EmptyStateProps {
1620
+ /**
1621
+ * Lucide icon shown in the circular badge above the title. Optional — when
1622
+ * omitted the badge is hidden and the title leads.
1623
+ */
1624
+ icon?: LucideIcon;
1625
+ /** Short headline, e.g. "No projects yet". */
1626
+ title: string;
1627
+ /**
1628
+ * Body copy: explain what will populate this space and what to do next,
1629
+ * e.g. "Items you create will appear here." Keep to ~2 lines.
1630
+ */
1631
+ description?: React.ReactNode;
1632
+ /**
1633
+ * Primary call-to-action node (a Button, a Link-wrapped Button, etc.). The
1634
+ * page owns routing/handlers; this slot just places it. Optional — some
1635
+ * empty states (e.g. "all clear") are informational with no action.
1636
+ */
1637
+ action?: React.ReactNode;
1638
+ /**
1639
+ * Visual size. `default` is the full-page/section empty state; `compact`
1640
+ * fits inside a card or sidebar panel (smaller badge + padding).
1641
+ */
1642
+ size?: 'default' | 'compact';
1643
+ /** Override the test id (defaults to the rubric-mandated "empty-state"). */
1644
+ testId?: string;
1645
+ className?: string;
1646
+ }
1647
+ /**
1648
+ * EmptyState
1649
+ *
1650
+ * The shared empty-state block. A list / grid / feed page renders this when it
1651
+ * has no data: an icon badge, a headline, body copy and a contextual
1652
+ * call-to-action, with `data-testid="empty-state"`. Gossamer semantic tokens
1653
+ * only.
1654
+ *
1655
+ * @example
1656
+ * <EmptyState
1657
+ * icon={Rocket}
1658
+ * title="No projects yet"
1659
+ * description="Describe what you want to build and your AI team takes it from there."
1660
+ * action={<Button asChild><Link href="/projects/new">Create project</Link></Button>}
1661
+ * />
1662
+ *
1663
+ * Authored by Caqophony
1664
+ */
1665
+ declare function EmptyState({ icon: Icon, title, description, action, size, testId, className, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
1666
+
1667
+ /**
1668
+ * ActionPanel Component
1669
+ *
1670
+ * Settings-style section with title, description, and action button.
1671
+ * Used for confirmation blocks, settings sections, and CTA panels.
1672
+ *
1673
+ * Token mapping (React ↔ Figma):
1674
+ * bg-card → colors.card (panel background)
1675
+ * border-border → colors.border (panel border)
1676
+ * text-foreground → colors.foreground (title)
1677
+ * text-muted-fg → colors.mutedFg (description)
1678
+ * border-intent-* → colors[intent] (withBorder left accent)
1679
+ *
1680
+ * Usage:
1681
+ * import { ActionPanel } from '@caqophony/ui';
1682
+ * <ActionPanel
1683
+ * title="Delete project"
1684
+ * description="This action cannot be undone."
1685
+ * intent="destructive"
1686
+ * action={<Button variant="destructive">Delete</Button>}
1687
+ * />
1688
+ *
1689
+ * Issue #2636 — B-10: Action Panels + Alert Component
1690
+ * Authored by Caqophony
1691
+ */
1692
+
1693
+ interface ActionPanelProps extends React.HTMLAttributes<HTMLDivElement> {
1694
+ title: string;
1695
+ description?: string;
1696
+ action?: React.ReactNode;
1697
+ variant?: 'simple' | 'split' | 'withBorder';
1698
+ intent?: 'default' | 'warning' | 'destructive';
1699
+ }
1700
+ declare const ActionPanel: React.ForwardRefExoticComponent<ActionPanelProps & React.RefAttributes<HTMLDivElement>>;
1701
+
1702
+ /**
1703
+ * Divider Component
1704
+ *
1705
+ * Section separator with optional label. Supports solid/dashed/dotted styles.
1706
+ *
1707
+ * Usage:
1708
+ * import { Divider } from '@caqophony/ui';
1709
+ * <Divider />
1710
+ * <Divider label="Or continue with" />
1711
+ * <Divider label="Section" labelPosition="left" variant="dashed" />
1712
+ *
1713
+ * Issue #2641 — B-14: Dividers + Containers + Media Objects
1714
+ * Authored by Caqophony
1715
+ */
1716
+
1717
+ interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {
1718
+ label?: string;
1719
+ labelPosition?: 'left' | 'center' | 'right';
1720
+ variant?: 'solid' | 'dashed' | 'dotted';
1721
+ orientation?: 'horizontal' | 'vertical';
1722
+ }
1723
+ declare const Divider: React.ForwardRefExoticComponent<DividerProps & React.RefAttributes<HTMLDivElement>>;
1724
+
1725
+ /**
1726
+ * Container Component
1727
+ *
1728
+ * Max-width content wrapper with responsive padding.
1729
+ * Centers content and constrains width for readability.
1730
+ *
1731
+ * Usage:
1732
+ * import { Container } from '@caqophony/ui';
1733
+ * <Container size="lg" padded>
1734
+ * <h1>Page Content</h1>
1735
+ * </Container>
1736
+ *
1737
+ * Issue #2641 — B-14: Dividers + Containers + Media Objects
1738
+ * Authored by Caqophony
1739
+ */
1740
+
1741
+ interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {
1742
+ size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
1743
+ padded?: boolean;
1744
+ }
1745
+ declare const Container: React.ForwardRefExoticComponent<ContainerProps & React.RefAttributes<HTMLDivElement>>;
1746
+
1747
+ /**
1748
+ * PageContent — Standard page-level content wrapper.
1749
+ *
1750
+ * Provides consistent vertical padding and spacing for page content
1751
+ * rendered inside app shells (ProjectNavShell, SetupWizardShell, etc.).
1752
+ *
1753
+ * The shell provides the structural frame (sidebar, header, breadcrumb).
1754
+ * PageContent provides the content padding every page needs.
1755
+ *
1756
+ * Usage:
1757
+ * import { PageContent } from '@caqophony/ui';
1758
+ * <PageContent>
1759
+ * <HeroSection />
1760
+ * <DataGrid />
1761
+ * </PageContent>
1762
+ *
1763
+ * Authored by Caqophony
1764
+ */
1765
+
1766
+ interface PageContentProps extends React.HTMLAttributes<HTMLDivElement> {
1767
+ /** Vertical gap between direct children. Default: 'md' (space-y-6) */
1768
+ gap?: 'sm' | 'md' | 'lg' | 'none';
1769
+ /** Whether to include page-level padding. Default: true */
1770
+ padded?: boolean;
1771
+ }
1772
+ declare const PageContent: React.ForwardRefExoticComponent<PageContentProps & React.RefAttributes<HTMLDivElement>>;
1773
+
1774
+ /**
1775
+ * MediaObject Component
1776
+ *
1777
+ * Horizontal layout with media (icon/image/avatar) + content + optional action.
1778
+ * Common pattern for comments, chat messages, notifications, and list items.
1779
+ *
1780
+ * Usage:
1781
+ * import { MediaObject } from '@caqophony/ui';
1782
+ * <MediaObject
1783
+ * media={<Avatar src={user.avatar} />}
1784
+ * title="John Doe"
1785
+ * description="Left a comment on your post"
1786
+ * action={<Button size="sm">Reply</Button>}
1787
+ * />
1788
+ *
1789
+ * Issue #2641 — B-14: Dividers + Containers + Media Objects
1790
+ * Authored by Caqophony
1791
+ */
1792
+
1793
+ interface MediaObjectProps extends React.HTMLAttributes<HTMLDivElement> {
1794
+ media: React.ReactNode;
1795
+ title?: string;
1796
+ description?: string;
1797
+ action?: React.ReactNode;
1798
+ align?: 'top' | 'center';
1799
+ mediaSize?: 'sm' | 'md' | 'lg';
1800
+ stacked?: boolean;
1801
+ }
1802
+ declare const MediaObject: React.ForwardRefExoticComponent<MediaObjectProps & React.RefAttributes<HTMLDivElement>>;
1803
+
1804
+ /** The glyph an empty value is drawn as. */
1805
+ declare const EMPTY_VALUE_GLYPH = "\u2014";
1806
+ /** A value with nothing to draw: `null`, `undefined`, `false`, or a string of only whitespace. */
1807
+ declare function isEmptyValue(value: React.ReactNode): boolean;
1808
+ interface EmptyValueProps {
1809
+ className?: string;
1810
+ }
1811
+ declare function EmptyValue({ className }: EmptyValueProps): react_jsx_runtime.JSX.Element;
1812
+
1813
+ /**
1814
+ * Page patterns — the composites every bake-off tree re-created by hand
1815
+ * (one-artifact W1, #5823). Each one owns its spacing, radius, overflow and
1816
+ * empty states, in the project's tokens, so a page composes them and never
1817
+ * re-decides them:
1818
+ *
1819
+ * PageGutter the page column: centred, a content width, the gutter
1820
+ * (3 of 3 trees: `max-w-* mx-auto px-4 sm:px-6 py-6 …`)
1821
+ * PageHeading the h1, its description, badges, actions (3 of 3)
1822
+ * SectionCard a titled card section; `flush` for a list (3 of 3)
1823
+ * TabbedCard a card whose top is a tab bar, its labels inset (run 7:
1824
+ * the tabs sat flush against the card edge)
1825
+ * SidePanelLayout main column + a side panel that stacks under it on a
1826
+ * narrow screen and sticks beside it on a wide one (2 of 3)
1827
+ *
1828
+ * Usage:
1829
+ * <PageGutter>
1830
+ * <PageHeading title="Senior Designer" description="Acme" actions={…} />
1831
+ * <SidePanelLayout aside={<SectionCard title="Next action">…</SectionCard>}>
1832
+ * <TabbedCard tabs={<><TabBarItem active>Overview</TabBarItem>…</>}>…</TabbedCard>
1833
+ * </SidePanelLayout>
1834
+ * </PageGutter>
1835
+ *
1836
+ * Authored by Caqophony
1837
+ */
1838
+
1839
+ declare const GUTTER_WIDTHS: {
1840
+ /** A single column of reading or a short list. */
1841
+ readonly narrow: "max-w-content-md";
1842
+ /** A detail or list page with a side panel. */
1843
+ readonly default: "max-w-content-xl";
1844
+ };
1845
+ interface PageGutterProps extends React.HTMLAttributes<HTMLDivElement> {
1846
+ width?: keyof typeof GUTTER_WIDTHS;
1847
+ }
1848
+ declare const PageGutter: React.ForwardRefExoticComponent<PageGutterProps & React.RefAttributes<HTMLDivElement>>;
1849
+ interface PageHeadingProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
1850
+ title: React.ReactNode;
1851
+ description?: React.ReactNode;
1852
+ /** Badges under the title (`IntentBadge`s); they wrap. */
1853
+ meta?: React.ReactNode;
1854
+ /** The page's actions: they sit beside the title, and under it on a phone. */
1855
+ actions?: React.ReactNode;
1856
+ }
1857
+ declare const PageHeading: React.ForwardRefExoticComponent<PageHeadingProps & React.RefAttributes<HTMLElement>>;
1858
+ interface SectionCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
1859
+ title?: React.ReactNode;
1860
+ description?: React.ReactNode;
1861
+ /** Actions at the right of the title row. */
1862
+ actions?: React.ReactNode;
1863
+ /** `compact`: a side panel's card (smaller title, tighter padding). */
1864
+ size?: 'default' | 'compact';
1865
+ /** The body has no padding: a `StackedList` or a table runs edge to edge. */
1866
+ flush?: boolean;
1867
+ }
1868
+ declare const SectionCard: React.ForwardRefExoticComponent<SectionCardProps & React.RefAttributes<HTMLDivElement>>;
1869
+ interface TabbedCardProps extends React.HTMLAttributes<HTMLDivElement> {
1870
+ /** The `TabBarItem`s. */
1871
+ tabs: React.ReactNode;
1872
+ /** The tab bar's accessible name. */
1873
+ tabsLabel: string;
1874
+ }
1875
+ declare const TabbedCard: React.ForwardRefExoticComponent<TabbedCardProps & React.RefAttributes<HTMLDivElement>>;
1876
+ interface SidePanelLayoutProps extends React.HTMLAttributes<HTMLDivElement> {
1877
+ /** The side panel: a stack of compact `SectionCard`s. */
1878
+ aside: React.ReactNode;
1879
+ /** The panel's accessible name. */
1880
+ asideLabel: string;
1881
+ }
1882
+ declare const SidePanelLayout: React.ForwardRefExoticComponent<SidePanelLayoutProps & React.RefAttributes<HTMLDivElement>>;
1883
+
1884
+ /**
1885
+ * IntentBadge — a record's status (stage, priority, method) as a small pill.
1886
+ *
1887
+ * One-artifact W1 (#5823): run 7 drew three of these by hand
1888
+ * (`inline-flex px-3 py-1 rounded-full text-13 bg-primary-10 …`). The badge
1889
+ * owns its shape, size and colours; a page names only the intent. The intent
1890
+ * tints are the ones `Alert` draws (`INTENT_SUBTLE_STYLES`, one writer), so a
1891
+ * badge and an alert of one intent match. A long value is truncated with its
1892
+ * full text in `title`, never run off the row.
1893
+ *
1894
+ * Usage:
1895
+ * import { IntentBadge } from '@caqophony/ui';
1896
+ * <IntentBadge intent="success">Offer</IntentBadge>
1897
+ *
1898
+ * Authored by Caqophony
1899
+ */
1900
+
1901
+ type IntentBadgeIntent = 'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info';
1902
+ interface IntentBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
1903
+ intent?: IntentBadgeIntent;
1904
+ }
1905
+ declare const IntentBadge: React.ForwardRefExoticComponent<IntentBadgeProps & React.RefAttributes<HTMLSpanElement>>;
1906
+
1907
+ interface OverflowMenuItem {
1908
+ label: string;
1909
+ onSelect: () => void;
1910
+ icon?: IconName;
1911
+ /** Drawn in the error colour (delete, remove). */
1912
+ destructive?: boolean;
1913
+ disabled?: boolean;
1914
+ }
1915
+ interface OverflowMenuProps {
1916
+ /** The trigger's accessible name ("More actions"). */
1917
+ label: string;
1918
+ items: readonly OverflowMenuItem[];
1919
+ /** Open on first render (the style sheet draws it open). */
1920
+ defaultOpen?: boolean;
1921
+ className?: string;
1922
+ }
1923
+ declare function OverflowMenu({ label, items, defaultOpen, className, }: OverflowMenuProps): react_jsx_runtime.JSX.Element;
1924
+
1925
+ /**
1926
+ * StageList — where a record stands in its sequence of stages (an
1927
+ * application's pipeline, an order's fulfilment), drawn as a vertical
1928
+ * `Stepper` the page never configures by hand.
1929
+ *
1930
+ * One-artifact W1 (#5823): run 7 passed `activeStep={4}` AND `completed` on
1931
+ * every step (two writers of one fact) and clamped the 9 steps in a scroll
1932
+ * box that cut the line. Here ONE value, `current`, decides every step: the
1933
+ * ones before it are complete, it is current, the rest upcoming. An
1934
+ * `outcome` (a stage off the sequence: rejected, withdrawn) ends the list as
1935
+ * an error step after the sequence. The list is drawn at its full height,
1936
+ * never clamped.
1937
+ *
1938
+ * A `current` that is neither a stage nor an outcome is a contract fault,
1939
+ * thrown with the value and the lists, never drawn as a guess.
1940
+ *
1941
+ * Usage:
1942
+ * <StageList
1943
+ * stages={[{ value: 'applied', label: 'Applied' }, …]}
1944
+ * outcomes={[{ value: 'rejected', label: 'Rejected' }]}
1945
+ * current={application.stage}
1946
+ * />
1947
+ *
1948
+ * Authored by Caqophony
1949
+ */
1950
+
1951
+ interface Stage {
1952
+ value: string;
1953
+ label: string;
1954
+ }
1955
+ interface StageListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
1956
+ /** The sequence, in order. */
1957
+ stages: readonly Stage[];
1958
+ /** Stages off the sequence that end it (rejected, withdrawn). */
1959
+ outcomes?: readonly Stage[];
1960
+ /** The record's stage: a `stages` or `outcomes` value. */
1961
+ current: string;
1962
+ }
1963
+ declare const StageList: React.ForwardRefExoticComponent<StageListProps & React.RefAttributes<HTMLDivElement>>;
1964
+
1965
+ /**
1966
+ * ClampedList — a list held to a height that scrolls inside itself.
1967
+ *
1968
+ * One-artifact W1 (#5823): run 7 wrapped a 9-step `Stepper` in
1969
+ * `max-h-[160px] overflow-y-auto`, which cut the stepper's line under the
1970
+ * clip with no sign there was more. This owns the clamp: a height from the
1971
+ * scale, the scroll, the scroll hint (`SCROLL_HINT_Y`: a chevron mark on the
1972
+ * end edge while there is more below), and keyboard access
1973
+ * (a scrolling region is focusable and named, WCAG 2.1.1). A page never
1974
+ * writes `max-h-*` with `overflow-*` around a library component.
1975
+ *
1976
+ * Usage:
1977
+ * import { ClampedList } from '@caqophony/ui';
1978
+ * <ClampedList label="Activity" maxHeight="md">…</ClampedList>
1979
+ *
1980
+ * Authored by Caqophony
1981
+ */
1982
+
1983
+ declare const MAX_HEIGHTS: {
1984
+ readonly sm: "max-h-48";
1985
+ readonly md: "max-h-72";
1986
+ readonly lg: "max-h-96";
1987
+ };
1988
+ interface ClampedListProps extends React.HTMLAttributes<HTMLDivElement> {
1989
+ /** The region's accessible name. */
1990
+ label: string;
1991
+ maxHeight?: keyof typeof MAX_HEIGHTS;
1992
+ }
1993
+ declare const ClampedList: React.ForwardRefExoticComponent<ClampedListProps & React.RefAttributes<HTMLDivElement>>;
1994
+
1995
+ /**
1996
+ * One-artifact W1 (#5823) — the scroll hint: the ONE writer of how a box
1997
+ * that scrolls says there is more. The last 1.5rem of the box (its end edge)
1998
+ * fades out through a mask (3rem for a vertical box, below); the box carries
1999
+ * the same length of end padding,
2000
+ * so when nothing is clipped only that empty padding fades, and when content
2001
+ * runs past the edge the clipped item fades, which is the hint.
2002
+ *
2003
+ * Static CSS (no script, no animation): it shows in a server render and in a
2004
+ * still capture alike. A mask is surface-agnostic (no gradient in a guessed
2005
+ * background colour). The style sheet's `scrollHint` check fails on a box
2006
+ * that overflows on an axis it scrolls without one of these.
2007
+ *
2008
+ * Authored by Caqophony
2009
+ */
2010
+ /** A horizontally scrolling box (a tab bar). */
2011
+ declare const SCROLL_HINT_X = "pr-6 [mask-image:linear-gradient(to_right,black_calc(100%-1.5rem),transparent)]";
2012
+
2013
+ /**
2014
+ * UI Package Utilities
2015
+ *
2016
+ * Provides cn utility for consistent class name merging
2017
+ *
2018
+ * Authored by Caqophony
2019
+ */
2020
+
2021
+ /**
2022
+ * Merges class names with Tailwind CSS conflict resolution
2023
+ * Combines clsx for conditional classes with tailwind-merge for deduplication
2024
+ */
2025
+ declare function cn(...inputs: ClassValue[]): string;
2026
+
2027
+ declare function useDebounce<T>(value: T, ms: number): T;
2028
+
2029
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionCard, type ActionCardProps, ActionPanel, type ActionPanelProps, ActivityFeed, ActivityFeedItem, type ActivityFeedItemProps, type ActivityFeedProps, Alert, type AlertProps, AppShell, type AppShellProps, AvatarGroup, AvatarGroupItem, type AvatarGroupItemProps, type AvatarGroupProps, Button, ButtonGroup, ButtonGroupItem, type ButtonGroupItemProps, type ButtonGroupProps, type ButtonProps, Calendar, type CalendarEvent, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ClampedList, type ClampedListProps, CollapsibleSidebar, Combobox, type ComboboxOption, type ComboboxProps, CommandPalette, type CommandPaletteProps, type CommandPaletteResult, ConfirmDialog, type ConfirmDialogProps, Container, type ContainerProps, DataTable, type DataTableProps, DatePicker, type DatePickerProps, DescriptionItem, type DescriptionItemProps, DescriptionList, type DescriptionListProps, DiceBearAvatar, type DiceBearAvatarProps, type DiceBearStyle, DistributionChip, type DistributionChipProps, Divider, type DividerProps, Drawer, DrawerBody, DrawerFooter, DrawerHeader, type DrawerProps, EMPTY_VALUE_GLYPH, EmptyState, type EmptyStateProps, EmptyValue, type EmptyValueProps, FilterChip, type FilterChipProps, FormError, type FormErrorProps, FormField, FormFieldGroup, type FormFieldGroupProps, type FormFieldProps, FormLayout, type FormLayoutProps, FormLayoutSection, type FormLayoutSectionProps, FormSection, type FormSectionProps, FormSuccess, type FormSuccessProps, GlobalErrorContent, type GlobalErrorContentProps, GridList, GridListItem, type GridListItemProps, type GridListProps, HorizontalCard, type HorizontalCardProps, HoverCard, type HoverCardProps, ICONS, ICON_SIZES, INTENT_SUBTLE_STYLES, Icon, type IconName, type IconProps, type IconSize, ImageCard, type ImageCardProps, Input, InputGroup, type InputGroupProps, type InputProps, IntentBadge, type IntentBadgeIntent, type IntentBadgeProps, IntentIcon, type IntentIconProps, MediaObject, type MediaObjectProps, ModalBody, ModalDialog, type ModalDialogProps, ModalFooter, ModalHeader, type NavItem, Navbar, NavbarLink, type NavbarLinkProps, type NavbarProps, NotificationBanner, type NotificationBannerProps, NotificationPanel, NotificationPanelItem, type NotificationPanelItemProps, type NotificationPanelProps, OverflowMenu, type OverflowMenuItem, type OverflowMenuProps, PageContent, type PageContentProps, PageGutter, type PageGutterProps, PageHeading, type PageHeadingProps, Pagination, PaginationButton, type PaginationProps, Popover, type PopoverProps, RadioGroup, type RadioGroupOption, type RadioGroupProps, SCROLL_HINT_X, SectionCard, type SectionCardProps, SectionHeading, type SectionHeadingProps, SidePanelLayout, type SidePanelLayoutProps, type NavItem as SidebarNavItem, SimpleAccordion, SkeletonBar, type SkeletonBarProps, SkeletonCard, SkeletonCardGrid, type SkeletonCardGridProps, type SkeletonCardProps, SkeletonDetail, type SkeletonDetailProps, SkeletonRow, type SkeletonRowProps, SkeletonTable, type SkeletonTableProps, StackedList, StackedListItem, type StackedListItemProps, type StackedListProps, type Stage, StageList, type StageListProps, StatCardExtended, type StatCardExtendedProps, StatGroup, type StatGroupProps, Stepper, type StepperProps, StepperStep, type StepperStepProps, StickyActionBar, type StickyActionBarProps, Switch, type SwitchProps, TabBar, TabBarItem, type TabBarItemProps, type TabBarProps, TabbedCard, type TabbedCardProps, TableBody, TableCaption, TableCell, type TableCellProps, TableHeader, TableRow, type TableRowProps, Toggle, ToggleGroup, type ToggleGroupProps, type ToggleProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, avatarVariants, buildDiceBearUrl, buttonVariants, cn, getPageRange, isEmptyValue, useDebounce, useSidebar };