@sequenceholdings/atlas-ui 0.1.2 → 0.1.5

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,4064 @@
1
+ import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
2
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
3
+ import { ClassProp } from 'class-variance-authority/types';
4
+ import { ClassValue } from 'clsx';
5
+ import { ColumnDef } from '@tanstack/react-table';
6
+ import { ColumnFiltersState } from '@tanstack/react-table';
7
+ import { Command as Command_2 } from 'cmdk';
8
+ import { ComponentProps } from 'react';
9
+ import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
10
+ import { DayPicker } from 'react-day-picker';
11
+ import { default as default_2 } from 'react';
12
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
13
+ import { Dispatch } from 'react';
14
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
15
+ import * as HoverCardPrimitive from '@radix-ui/react-hover-card';
16
+ import { InputProps as InputProps_2 } from 'src';
17
+ import { JSX } from 'react/jsx-runtime';
18
+ import * as LabelPrimitive from '@radix-ui/react-label';
19
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
20
+ import { QueryKey } from '@tanstack/react-query';
21
+ import * as React_2 from 'react';
22
+ import { ReactNode } from 'react';
23
+ import * as RechartsPrimitive from 'recharts';
24
+ import { Row } from '@tanstack/react-table';
25
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
26
+ import * as SelectPrimitive from '@radix-ui/react-select';
27
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
28
+ import { SetStateAction } from 'react';
29
+ import * as SliderPrimitive from '@radix-ui/react-slider';
30
+ import { SortingState } from '@tanstack/react-table';
31
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
32
+ import { Table as Table_2 } from '@tanstack/react-table';
33
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
34
+ import { toast } from 'sonner';
35
+ import { ToasterProps } from 'sonner';
36
+ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
37
+ import * as TogglePrimitive from '@radix-ui/react-toggle';
38
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
39
+ import { UseMutationResult } from '@tanstack/react-query';
40
+ import { VariantProps } from 'class-variance-authority';
41
+
42
+ export declare const AGENT_TINTS: {
43
+ readonly teal: {
44
+ readonly bg: "bg-teal-50 dark:bg-teal-500/10";
45
+ readonly fg: "text-teal-700 dark:text-teal-300";
46
+ };
47
+ readonly violet: {
48
+ readonly bg: "bg-violet-50 dark:bg-violet-500/10";
49
+ readonly fg: "text-violet-700 dark:text-violet-300";
50
+ };
51
+ readonly amber: {
52
+ readonly bg: "bg-amber-50 dark:bg-amber-500/10";
53
+ readonly fg: "text-amber-700 dark:text-amber-300";
54
+ };
55
+ readonly rose: {
56
+ readonly bg: "bg-rose-50 dark:bg-rose-500/10";
57
+ readonly fg: "text-rose-700 dark:text-rose-300";
58
+ };
59
+ readonly sky: {
60
+ readonly bg: "bg-sky-50 dark:bg-sky-500/10";
61
+ readonly fg: "text-sky-700 dark:text-sky-300";
62
+ };
63
+ readonly emerald: {
64
+ readonly bg: "bg-emerald-50 dark:bg-emerald-500/10";
65
+ readonly fg: "text-emerald-700 dark:text-emerald-300";
66
+ };
67
+ readonly orange: {
68
+ readonly bg: "bg-orange-50 dark:bg-orange-500/10";
69
+ readonly fg: "text-orange-700 dark:text-orange-300";
70
+ };
71
+ readonly indigo: {
72
+ readonly bg: "bg-indigo-50 dark:bg-indigo-500/10";
73
+ readonly fg: "text-indigo-700 dark:text-indigo-300";
74
+ };
75
+ readonly graphite: {
76
+ readonly bg: "bg-muted";
77
+ readonly fg: "text-foreground";
78
+ };
79
+ };
80
+
81
+ export declare type AgentTint = keyof typeof AGENT_TINTS;
82
+
83
+ export declare const AlertDialog: React_2.FC<AlertDialogPrimitive.AlertDialogProps>;
84
+
85
+ export declare const AlertDialogAction: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
86
+
87
+ export declare const AlertDialogCancel: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
88
+
89
+ export declare const AlertDialogContent: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
90
+ /**
91
+ * Classes for the scrim behind the dialog. Pair with `className` when
92
+ * raising z-index — a lone `className="z-modal"` lifts only the panel and
93
+ * leaves the overlay at `z-50` (DES-315). Additive; defaults unchanged.
94
+ */
95
+ overlayClassName?: string;
96
+ } & React_2.RefAttributes<HTMLDivElement>>;
97
+
98
+ export declare const AlertDialogDescription: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogDescriptionProps & React_2.RefAttributes<HTMLParagraphElement>, "ref"> & React_2.RefAttributes<HTMLParagraphElement>>;
99
+
100
+ export declare const AlertDialogFooter: {
101
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
102
+ displayName: string;
103
+ };
104
+
105
+ export declare const AlertDialogHeader: {
106
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
107
+ displayName: string;
108
+ };
109
+
110
+ export declare const AlertDialogOverlay: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogOverlayProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
111
+
112
+ export declare function AlertDialogPortal({ container, ...props }: React_2.ComponentProps<typeof AlertDialogPrimitive.Portal>): JSX.Element;
113
+
114
+ export declare const AlertDialogTitle: React_2.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogTitleProps & React_2.RefAttributes<HTMLHeadingElement>, "ref"> & React_2.RefAttributes<HTMLHeadingElement>>;
115
+
116
+ export declare const AlertDialogTrigger: React_2.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
117
+
118
+ /**
119
+ * Lifecycle status for an Atlas app.
120
+ *
121
+ * GA is intentionally NOT a member of this union. GA = no badge, signaled by
122
+ * `App.status` being absent. Adding `'ga'` would suggest you could set it
123
+ * explicitly, but no renderer draws anything for GA — the truthy check on
124
+ * `status` is the "show a badge" gate in `<AppStatusBadge>`, the sidebar, the
125
+ * TitleBar, and the Add Apps dialog. Keep GA implicit; only call out alpha /
126
+ * beta. To promote an app from beta → GA, remove the `status` field from its
127
+ * entry (see the `set-product-status` skill).
128
+ */
129
+ declare type AppStatus = 'alpha' | 'beta';
130
+
131
+ export declare function AppStatusBadge({ status, className }: AppStatusBadgeProps): JSX.Element;
132
+
133
+ declare interface AppStatusBadgeProps {
134
+ status: AppStatus;
135
+ className?: string;
136
+ }
137
+
138
+ /**
139
+ * Button that reflects the lifecycle of an async mutation:
140
+ * idle → pending (spinner) → success/error (auto-resets).
141
+ *
142
+ * Designed to pair with TanStack Query's `useMutation` return values.
143
+ */
144
+ export declare function AsyncActionButton({ onClick, isPending, isSuccess, isError, error, icon, label, pendingLabel, successLabel, successTimeout, errorTimeout, className, }: AsyncActionButtonProps): JSX.Element;
145
+
146
+ export declare interface AsyncActionButtonProps {
147
+ onClick: () => void;
148
+ isPending: boolean;
149
+ isSuccess: boolean;
150
+ isError: boolean;
151
+ error?: Error | null;
152
+ icon: React.ReactNode;
153
+ label: string;
154
+ pendingLabel: string;
155
+ /** Label shown on success. Defaults to "Triggered". */
156
+ successLabel?: string;
157
+ /** How long to show the success state before resetting (ms). */
158
+ successTimeout?: number;
159
+ /** How long to show the error state before resetting (ms). */
160
+ errorTimeout?: number;
161
+ className?: string;
162
+ }
163
+
164
+ export declare function AvatarTextCell({ icon, initials, title, subtitle, tag, tint, rightSlot, className, }: AvatarTextCellProps): JSX.Element;
165
+
166
+ declare interface AvatarTextCellProps {
167
+ /** Icon rendered inside the tinted square. */
168
+ icon?: React_2.ReactNode;
169
+ /** Fallback initials when no icon is supplied. */
170
+ initials?: string;
171
+ title: React_2.ReactNode;
172
+ subtitle?: React_2.ReactNode;
173
+ /** Small mono tag rendered inline to the right of the title (e.g. "Sonnet 4.5"). */
174
+ tag?: React_2.ReactNode;
175
+ tint?: AgentTint;
176
+ /** Override inline action rendered on hover at the right of the title row. */
177
+ rightSlot?: React_2.ReactNode;
178
+ className?: string;
179
+ }
180
+
181
+ export declare const Badge: React_2.ForwardRefExoticComponent<BadgeProps & React_2.RefAttributes<HTMLSpanElement>>;
182
+
183
+ declare interface BadgeProps extends React_2.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
184
+ }
185
+
186
+ export declare const badgeVariants: (props?: ({
187
+ variant?: "default" | "success" | "secondary" | "neutral" | "destructive" | "outline" | "warning" | "info" | "danger" | "identity" | "ghost" | "alpha" | "beta" | null | undefined;
188
+ size?: "default" | "sm" | null | undefined;
189
+ } & ClassProp) | undefined) => string;
190
+
191
+ export declare function Breadcrumb({ items, interactive, maxItems, variant, renderLink, ariaLabel, className, }: BreadcrumbProps): JSX.Element | null;
192
+
193
+ declare function Breadcrumb_2({ ...props }: React_2.ComponentProps<"nav">): JSX.Element;
194
+
195
+ /**
196
+ * Breadcrumb — the app-facing, presentational breadcrumb.
197
+ *
198
+ * App-agnostic on purpose so it ships in the published `atlas-ui` package and
199
+ * artifacts can use it: it takes the full `items` trail as a prop and does NOT
200
+ * touch any app registry, router, or `next/navigation`. Navigation defaults to
201
+ * plain `<a href>`; inject `renderLink` (e.g. a SPA `Link`) for client routing,
202
+ * or mount `BreadcrumbLinkProvider` once to supply it to a whole subtree (the
203
+ * Atlas shell does this). For the app-root crumb, prepend `useAppRootCrumb()`
204
+ * (`@platform/hooks/useAppRootCrumb`).
205
+ *
206
+ * Depth drives the affordance (`variant='auto'`): 0 ancestors → nothing, 1 →
207
+ * back button, 2+ → breadcrumb. Long trails collapse into an ellipsis dropdown
208
+ * (`maxItems`); every crumb truncates with a tooltip; `loading` crumbs show a
209
+ * pulsing skeleton.
210
+ */
211
+ export declare interface BreadcrumbCrumb {
212
+ label: React_2.ReactNode;
213
+ /** Navigation target for an ancestor crumb. Ignored on the last crumb (it
214
+ * renders as the current page). Prefer `href`; use `onClick` for custom nav. */
215
+ href?: string;
216
+ onClick?: () => void;
217
+ /** Render a pulsing skeleton in place of the label while its value loads. */
218
+ loading?: boolean;
219
+ }
220
+
221
+ declare function BreadcrumbEllipsis({ className, ...props }: React_2.ComponentProps<"span">): JSX.Element;
222
+
223
+ declare function BreadcrumbItem({ className, ...props }: React_2.ComponentProps<"li">): JSX.Element;
224
+
225
+ declare function BreadcrumbLink({ asChild, className, ...props }: React_2.ComponentProps<"a"> & {
226
+ asChild?: boolean;
227
+ }): JSX.Element;
228
+
229
+ /**
230
+ * Supplies the router link that `Breadcrumb` uses for ancestor crumbs. Mount it
231
+ * once in the app shell with your SPA `Link` so every breadcrumb navigates
232
+ * client-side; without it (e.g. in a standalone artifact) breadcrumbs fall back
233
+ * to plain `<a href>`. A `renderLink` prop on an individual `Breadcrumb` still
234
+ * wins over this.
235
+ */
236
+ export declare function BreadcrumbLinkProvider({ renderLink, children, }: {
237
+ renderLink: BreadcrumbLinkRenderer;
238
+ children: React_2.ReactNode;
239
+ }): JSX.Element;
240
+
241
+ /** Renders a navigable crumb. Default is a plain `<a href>`; a host injects its
242
+ * router link (e.g. `<Link to={href}>`) so SPA nav works without coupling the
243
+ * shared component to any router. */
244
+ export declare type BreadcrumbLinkRenderer = (props: {
245
+ href: string;
246
+ onClick?: () => void;
247
+ className?: string;
248
+ children: React_2.ReactNode;
249
+ }) => React_2.ReactElement;
250
+
251
+ declare function BreadcrumbList({ className, ...props }: React_2.ComponentProps<"ol">): JSX.Element;
252
+
253
+ declare function BreadcrumbPage({ className, ...props }: React_2.ComponentProps<"span">): JSX.Element;
254
+
255
+ /**
256
+ * shadcn breadcrumb primitives, grouped under one namespace so the bare name
257
+ * `Breadcrumb` names the app-facing smart component (`./breadcrumb-nav`).
258
+ * Compose these directly only when building a bespoke trail; almost all code
259
+ * should use the smart `Breadcrumb` instead.
260
+ */
261
+ export declare const BreadcrumbPrimitive: {
262
+ Root: typeof Breadcrumb_2;
263
+ List: typeof BreadcrumbList;
264
+ Item: typeof BreadcrumbItem;
265
+ Link: typeof BreadcrumbLink;
266
+ Page: typeof BreadcrumbPage;
267
+ Separator: typeof BreadcrumbSeparator;
268
+ Ellipsis: typeof BreadcrumbEllipsis;
269
+ };
270
+
271
+ export declare interface BreadcrumbProps {
272
+ /** The full trail; the last item renders as the current page. */
273
+ items: BreadcrumbCrumb[];
274
+ /** When false, ancestor crumbs render as static text (e.g. loading states). */
275
+ interactive?: boolean;
276
+ /** Collapse the middle of long trails to an ellipsis-dropdown once the count
277
+ * exceeds this (clamped to >= 2 so the root + current page always show). */
278
+ maxItems?: number;
279
+ /**
280
+ * Which affordance to render. Defaults to `'auto'`, which picks by depth so
281
+ * callers never decide: **0 ancestors** → nothing; **1 ancestor** → a back
282
+ * button (a full breadcrumb is overkill one level deep); **2+ ancestors** →
283
+ * the breadcrumb trail. Force `'breadcrumb'` / `'back'` for a deliberate
284
+ * exception.
285
+ */
286
+ variant?: "auto" | "breadcrumb" | "back";
287
+ /** Injected router link. Defaults to a plain `<a href>`. */
288
+ renderLink?: BreadcrumbLinkRenderer;
289
+ ariaLabel?: string;
290
+ className?: string;
291
+ }
292
+
293
+ declare function BreadcrumbSeparator({ children, className, ...props }: React_2.ComponentProps<"li">): JSX.Element;
294
+
295
+ /**
296
+ * Generate heat-colored columns for time-period keys (dates, weeks, months).
297
+ * Each column auto-computes min/max from visible rows for relative coloring.
298
+ */
299
+ export declare function buildPeriodColumns<T extends Record<string, any>>({ periods, accessor, formatLabel, formatValue, }: {
300
+ periods: string[];
301
+ accessor: (row: T) => Record<string, number>;
302
+ formatLabel: (period: string) => string;
303
+ /** Custom value formatter. Defaults to whole-dollar currency. */
304
+ formatValue?: (value: number) => string;
305
+ }): ColumnDef<T>[];
306
+
307
+ /**
308
+ * A "Total" column with a value + horizontal progress bar.
309
+ */
310
+ export declare function buildTotalColumn<T>({ accessor, maxValue, formatValue, barColor, }: {
311
+ accessor: (row: T) => number;
312
+ maxValue: number;
313
+ formatValue?: (value: number) => string;
314
+ barColor?: string;
315
+ }): ColumnDef<T>;
316
+
317
+ export declare const Button: React_2.ForwardRefExoticComponent<ButtonProps & React_2.RefAttributes<HTMLButtonElement>>;
318
+
319
+ export declare interface ButtonProps extends React_2.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
320
+ asChild?: boolean;
321
+ }
322
+
323
+ export declare const buttonVariants: (props?: ({
324
+ variant?: "default" | "link" | "secondary" | "destructive" | "outline" | "ghost" | "submit" | null | undefined;
325
+ size?: "default" | "sm" | "icon" | "lg" | "xs" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
326
+ } & ClassProp) | undefined) => string;
327
+
328
+ export declare function Calendar({ className, classNames, showOutsideDays, ...props }: React_2.ComponentProps<typeof DayPicker>): JSX.Element;
329
+
330
+ export declare function CalendarGrid({ startHour, endHour, hourHeight, maxHeight, initialScrollHour, dayHeaders, children, loading, loadingText, }: CalendarGridProps): JSX.Element;
331
+
332
+ export declare interface CalendarGridProps {
333
+ startHour?: number;
334
+ endHour?: number;
335
+ hourHeight?: number;
336
+ maxHeight?: number;
337
+ initialScrollHour?: number;
338
+ dayHeaders?: default_2.ReactNode[];
339
+ children: (dayIdx: number) => default_2.ReactNode;
340
+ loading?: boolean;
341
+ loadingText?: string;
342
+ }
343
+
344
+ /**
345
+ * Card — the foundational surface for grouped content (dashboards,
346
+ * metrics, forms, lists, detail pages).
347
+ *
348
+ * Visual contract:
349
+ * - Background: `bg-card`, which maps to the `--card` design token.
350
+ * `--card` is pure white (`oklch(1 0 0)`) in every Atlas app theme
351
+ * — verified in `atlas/src/index.css`. Dark mode resolves to the
352
+ * warm-dark surface token. Do NOT hardcode `bg-white` / `#fff`:
353
+ * the theme system needs the variable to switch modes reliably.
354
+ * - Text: `text-card-foreground` — paired with `--card` so reversed
355
+ * themes flip body color correctly.
356
+ * - Separation: a 1px `border` (maps to `--border`), NOT a drop
357
+ * shadow. Matches the flat aesthetic used by ProDataTable,
358
+ * DashboardShell, Input, Select, Textarea, Switch, and Button.
359
+ * Drop shadows on cards quickly compound against each other in
360
+ * dense dashboards (card-inside-card, kpi-tile-inside-card, etc.)
361
+ * and visually muddy the hierarchy.
362
+ * - Radius: `rounded-surface` (DES-313) — the top-level-container
363
+ * radius role. Cards own their radius; call sites never pass one.
364
+ *
365
+ * When a card genuinely needs elevation (modal/popover-adjacent lifts,
366
+ * drag affordances), opt in explicitly with `shadow-resting`
367
+ * at the call site rather than baking it into the base.
368
+ */
369
+ export declare const Card: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLDivElement> & React_2.RefAttributes<HTMLDivElement>>;
370
+
371
+ export declare const CardContent: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLDivElement> & React_2.RefAttributes<HTMLDivElement>>;
372
+
373
+ export declare const CardDescription: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLDivElement> & React_2.RefAttributes<HTMLDivElement>>;
374
+
375
+ export declare const CardHeader: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLDivElement> & React_2.RefAttributes<HTMLDivElement>>;
376
+
377
+ export declare const CardTitle: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLDivElement> & React_2.RefAttributes<HTMLDivElement>>;
378
+
379
+ export declare type ChartConfig = {
380
+ [key: string]: {
381
+ label?: React_2.ReactNode;
382
+ icon?: React_2.ComponentType;
383
+ } & ({
384
+ color?: string;
385
+ theme?: never;
386
+ } | {
387
+ color?: never;
388
+ theme: Record<keyof typeof THEMES, string>;
389
+ });
390
+ };
391
+
392
+ export declare function ChartContainer({ id, className, children, config, ...props }: React_2.ComponentProps<'div'> & {
393
+ config: ChartConfig;
394
+ children: React_2.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];
395
+ }): JSX.Element;
396
+
397
+ export declare const ChartLegend: typeof RechartsPrimitive.Legend;
398
+
399
+ export declare function ChartLegendContent({ className, hideIcon, payload, verticalAlign, nameKey, }: {
400
+ className?: string;
401
+ hideIcon?: boolean;
402
+ payload?: LegendPayloadItem[];
403
+ verticalAlign?: 'top' | 'bottom';
404
+ nameKey?: string;
405
+ }): JSX.Element | null;
406
+
407
+ export declare const ChartTooltip: typeof RechartsPrimitive.Tooltip;
408
+
409
+ export declare function ChartTooltipContent({ active, payload, className, indicator, hideLabel, hideIndicator, label, labelFormatter, labelClassName, formatter, color, nameKey, labelKey, }: {
410
+ active?: boolean;
411
+ payload?: TooltipPayloadItem[];
412
+ className?: string;
413
+ indicator?: 'line' | 'dot' | 'dashed';
414
+ hideLabel?: boolean;
415
+ hideIndicator?: boolean;
416
+ label?: React_2.ReactNode;
417
+ labelFormatter?: (value: React_2.ReactNode, payload: TooltipPayloadItem[]) => React_2.ReactNode;
418
+ labelClassName?: string;
419
+ formatter?: (value: number | string, name: string | number, item: TooltipPayloadItem, index: number, payloadItem: Record<string, unknown> | undefined) => React_2.ReactNode;
420
+ color?: string;
421
+ nameKey?: string;
422
+ labelKey?: string;
423
+ }): JSX.Element | null;
424
+
425
+ /**
426
+ * Checkbox — matches shadcn's canonical 16×16 design:
427
+ *
428
+ * - `size-4` (16px)
429
+ * - `rounded-xs` (4px, `--radius-xs`) — a square with softened corners,
430
+ * NOT a circle. Atlas's scale shifted `--radius-sm` up to 8px, which
431
+ * would render a 16px checkbox as a 50% pill. `--radius-xs` closes
432
+ * the gap at the tight end specifically for cases like this.
433
+ * - Neutral `border-input` when unchecked; flips to `border-primary`
434
+ * when checked/indeterminate so the outline blends with the fill.
435
+ * - No drop shadow — consistent with the rest of Atlas's form
436
+ * primitives (Input, Select, Button).
437
+ * - Distinct icon for indeterminate state (horizontal minus) so a
438
+ * bulk-select header reads as "some selected" without showing a
439
+ * check mark. Switching is driven by Radix's `data-state` attribute
440
+ * via Tailwind `group-data-*` modifiers — no extra state wiring.
441
+ *
442
+ * Composition safety: the Check + Minus icons each carry an explicit
443
+ * `text-current` class even though the Indicator parent already sets
444
+ * `text-current`. This is NOT redundant — it's the safeguard against
445
+ * descendant-svg dyeing rules like cmdk's
446
+ * `[&_svg:not([class*='text-'])]:text-muted-foreground` on CommandItem.
447
+ * The icons need their OWN `text-*` class on the svg element so the
448
+ * `:not([class*='text-'])` filter doesn't match them. See DESIGN.md
449
+ * "Composition safety" and `controls:compositions` in the Design System.
450
+ */
451
+ export declare const Checkbox: React_2.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
452
+
453
+ /**
454
+ * A crisp multi-select rendered as toggleable option cards — a nicer stand-in
455
+ * for a grid of native checkboxes. Reusable for any small set of multi-choice
456
+ * options (review areas, tags, scopes, …).
457
+ */
458
+ export declare function CheckboxGroup<T extends string>({ options, value, onChange, columns, className, }: CheckboxGroupProps<T>): JSX.Element;
459
+
460
+ export declare interface CheckboxGroupProps<T extends string> {
461
+ options: CheckboxOption<T>[];
462
+ value: T[];
463
+ onChange: (next: T[]) => void;
464
+ columns?: 1 | 2 | 3;
465
+ className?: string;
466
+ }
467
+
468
+ export declare interface CheckboxOption<T extends string> {
469
+ value: T;
470
+ label: string;
471
+ }
472
+
473
+ declare const CHIP_TONES: {
474
+ readonly default: "border-border bg-accent text-muted-foreground";
475
+ readonly danger: "border-red-200 bg-red-50 text-red-700 dark:border-red-500/30 dark:bg-red-500/15 dark:text-red-300";
476
+ readonly warning: "border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/15 dark:text-amber-300";
477
+ readonly success: "border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/30 dark:bg-emerald-500/15 dark:text-emerald-300";
478
+ };
479
+
480
+ export declare const ChoiceCard: React_2.ForwardRefExoticComponent<ChoiceCardProps & React_2.RefAttributes<HTMLLabelElement>>;
481
+
482
+ /**
483
+ * ChoiceCardGroup — the canonical wrapper for a stack of `ChoiceCard`s.
484
+ *
485
+ * Differences from `FieldGroup`:
486
+ * - Gap is `gap-2` (8px), not `gap-7` (28px). ChoiceCards are visually
487
+ * dense already (border + padding + hover); a tight gap reads as a
488
+ * single group rather than a loose collection of unrelated rows.
489
+ * - Optional `searchable` — adds a search input that filters children
490
+ * by their `searchTerms` prop (with text fallbacks). Useful when the
491
+ * underlying list is long (tool palettes, integrations, etc.).
492
+ *
493
+ * Children are expected to be `<ChoiceCard>` elements. Non-ChoiceCard
494
+ * children pass through unchanged and aren't affected by the filter —
495
+ * so you can intermix dividers, section headers, or `<FieldSeparator>`
496
+ * without them being stripped when the user types.
497
+ */
498
+ export declare const ChoiceCardGroup: React_2.ForwardRefExoticComponent<ChoiceCardGroupProps & React_2.RefAttributes<HTMLDivElement>>;
499
+
500
+ export declare interface ChoiceCardGroupProps extends React_2.HTMLAttributes<HTMLDivElement> {
501
+ /**
502
+ * When true, renders a search input above the list that filters visible
503
+ * cards by matching the query against each card's `searchTerms` prop
504
+ * (or a fallback derived from the card's `title` / `description`).
505
+ * Intended for long lists — tool pickers, skill palettes, integration
506
+ * catalogs — where users need to narrow down quickly.
507
+ */
508
+ searchable?: boolean;
509
+ /** Placeholder shown in the search input. Defaults to `'Search'`. */
510
+ searchPlaceholder?: string;
511
+ /**
512
+ * Rendered when the search query matches zero cards. Defaults to a
513
+ * muted "No matches" row. Pass a richer ReactNode (illustration, CTA,
514
+ * etc.) when context warrants it.
515
+ */
516
+ emptyState?: React_2.ReactNode;
517
+ children?: React_2.ReactNode;
518
+ }
519
+
520
+ /**
521
+ * ChoiceCard — card-style selection row built on shadcn's `Field` family.
522
+ *
523
+ * Composes `FieldLabel` (which makes the whole card clickable as a native
524
+ * label) + `Field` (horizontal) + `FieldContent` (holding `FieldTitle` +
525
+ * `FieldDescription`) + `Switch`. This is the canonical "Switch Choice
526
+ * Card" pattern from shadcn — wrapping it here saves consumers from
527
+ * hand-assembling the five Field primitives every time and ensures the
528
+ * shared selected-tint behavior (`has-data-[state=checked]:bg-primary/5`)
529
+ * kicks in consistently.
530
+ *
531
+ * Composition:
532
+ * ```tsx
533
+ * import { ChoiceCard, ChoiceCardGroup } from '@sequenceholdings/atlas-ui'
534
+ *
535
+ * <ChoiceCardGroup>
536
+ * <ChoiceCard
537
+ * title="Web search"
538
+ * description="General web lookup via platform search provider"
539
+ * checked={enabled}
540
+ * onCheckedChange={setEnabled}
541
+ * />
542
+ * </ChoiceCardGroup>
543
+ * ```
544
+ *
545
+ * `ChoiceCardGroup` is the recommended wrapper — it renders choice cards
546
+ * at a tighter 8px gap (vs `FieldGroup`'s 28px) and supports an optional
547
+ * search input for long lists. `FieldGroup` remains available for mixed
548
+ * Field layouts where the looser spacing is intentional.
549
+ *
550
+ * When you need extra content below the description (e.g. a secondary
551
+ * checkbox, a config chip, a status indicator), pass it via `children` —
552
+ * it renders inside `FieldContent` after the description.
553
+ *
554
+ * When you need a different trailing control (Checkbox, Radio, icon
555
+ * button), pass it via `control`; otherwise the default `Switch` is used.
556
+ * Controls receive their own `onClick` handlers and don't need propagation
557
+ * handling — the label wiring covers row clicks.
558
+ */
559
+ declare interface ChoiceCardProps {
560
+ /**
561
+ * Leading icon slot — renders as a tinted 32px square tile on the left
562
+ * of the card. Accepts a lucide/tabler icon; the tile styling and sizing
563
+ * are handled here so callers just pass the glyph.
564
+ */
565
+ icon?: React_2.ReactNode;
566
+ /**
567
+ * Primary label — renders inside `FieldTitle`. Accepts a ReactNode so
568
+ * inline badges / tags can sit next to the title.
569
+ */
570
+ title: React_2.ReactNode;
571
+ /** Secondary text — renders inside `FieldDescription`. */
572
+ description?: React_2.ReactNode;
573
+ /**
574
+ * Default trailing control is a `Switch`. Pass a custom control here
575
+ * to use something else (Checkbox, Radio, icon button). The custom
576
+ * control is responsible for its own state — `checked` /
577
+ * `onCheckedChange` are ignored when `control` is set.
578
+ */
579
+ control?: React_2.ReactNode;
580
+ /** Forwarded to the default `Switch`. */
581
+ checked?: boolean;
582
+ /** Forwarded to the default `Switch`. */
583
+ onCheckedChange?: (checked: boolean) => void;
584
+ /** Forwarded to the default `Switch` — also surfaces Field's disabled styling. */
585
+ disabled?: boolean;
586
+ /**
587
+ * Optional id. When omitted, one is generated so the FieldLabel's
588
+ * `htmlFor` binds to the Switch automatically. Override only when the
589
+ * consumer needs to reference the control id externally.
590
+ */
591
+ id?: string;
592
+ /**
593
+ * Canonical searchable text used by `ChoiceCardGroup` when `searchable`
594
+ * is enabled. Lets callers control exactly what a query matches against
595
+ * — important when `title` / `description` are ReactNodes (badges,
596
+ * icons, fragments) that can't be reliably stringified.
597
+ *
598
+ * When omitted, the group falls back to stringifying whatever string
599
+ * content it can extract from `title` and `description`; works fine for
600
+ * plain-text cards, unreliable for rich ones. Provide it explicitly
601
+ * for any list where search matters.
602
+ */
603
+ searchTerms?: string;
604
+ /** Additional content rendered inside FieldContent after the description. */
605
+ children?: React_2.ReactNode;
606
+ className?: string;
607
+ }
608
+
609
+ export declare function CitationChip({ fileName, url, kind, resolved, className, }: CitationChipProps): JSX.Element;
610
+
611
+ /**
612
+ * Inline citation chip — the rendered form of a resolved `[[cite:...]]` anchor.
613
+ * A `document` chip shows the source filename; a `web` chip shows the site (or
614
+ * host) and links out; an unresolved anchor renders a muted "source" pill so a
615
+ * fabricated/dropped citation is still visible rather than a raw token.
616
+ *
617
+ * The label truncates and reveals its full value on hover (via `TruncatedText`).
618
+ * When a `url` is present the chip is an anchor that opens in a new tab.
619
+ */
620
+ export declare interface CitationChipProps {
621
+ fileName?: string | null;
622
+ url?: string | null;
623
+ kind?: 'web' | 'document';
624
+ /** False renders the muted unresolved state. Defaults to true. */
625
+ resolved?: boolean;
626
+ className?: string;
627
+ }
628
+
629
+ export declare function cn(...inputs: ClassValue[]): string;
630
+
631
+ export declare const CodeBadge: React_2.ForwardRefExoticComponent<CodeBadgeProps & React_2.RefAttributes<HTMLSpanElement>>;
632
+
633
+ declare interface CodeBadgeProps extends React_2.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof codeBadgeVariants> {
634
+ }
635
+
636
+ /**
637
+ * CodeBadge — small inline monospace pill for literal strings.
638
+ *
639
+ * Use for identifiers that read as "code" rather than prose: model IDs
640
+ * (`gemini-3.1-flash-lite-preview`), version labels (`v14`), commit hashes,
641
+ * cron expressions, IDs, etc. Sits naturally next to titles, inside table
642
+ * cells, or in top-bar identity rows.
643
+ *
644
+ * When to reach for this vs. `Badge`:
645
+ * - `Badge` — semantic status/tone (success, destructive, outline)
646
+ * - `CodeBadge` — typographic tag (monospace, muted bg, neutral)
647
+ *
648
+ * Sizes:
649
+ * - `sm` (default) — inline next to a title (e.g. AvatarTextCell tag)
650
+ * - `md` — inside table cells where it reads as primary content
651
+ */
652
+ export declare const codeBadgeVariants: (props?: ({
653
+ size?: "sm" | "md" | null | undefined;
654
+ } & ClassProp) | undefined) => string;
655
+
656
+ /**
657
+ * Table-cell wrapper around `CodeBadge` for columns that render literal
658
+ * strings (version labels, cron expressions, IDs). Kept as a separate export
659
+ * so column definitions can stay value-oriented (`<CodePillCell value={v} />`)
660
+ * rather than wrapping children — but the visual treatment now lives in
661
+ * the shared `CodeBadge` primitive.
662
+ */
663
+ export declare function CodePillCell({ value, className, }: {
664
+ value: React_2.ReactNode;
665
+ className?: string;
666
+ }): JSX.Element;
667
+
668
+ export { ColumnDef }
669
+
670
+ export declare function Command({ className, ...props }: React_2.ComponentProps<typeof Command_2>): JSX.Element;
671
+
672
+ export declare function CommandDialog({ title, description, children, className, ...props }: React_2.ComponentProps<typeof Dialog> & {
673
+ title?: string;
674
+ description?: string;
675
+ className?: string;
676
+ }): JSX.Element;
677
+
678
+ export declare function CommandEmpty({ ...props }: React_2.ComponentProps<typeof Command_2.Empty>): JSX.Element;
679
+
680
+ export declare function CommandGroup({ className, ...props }: React_2.ComponentProps<typeof Command_2.Group>): JSX.Element;
681
+
682
+ export declare function CommandInput({ className, showSearchIcon, ...props }: React_2.ComponentProps<typeof Command_2.Input> & {
683
+ showSearchIcon?: boolean;
684
+ }): JSX.Element;
685
+
686
+ export declare function CommandItem({ className, ...props }: React_2.ComponentProps<typeof Command_2.Item>): JSX.Element;
687
+
688
+ export declare function CommandList({ className, ...props }: React_2.ComponentProps<typeof Command_2.List>): JSX.Element;
689
+
690
+ export declare function CommandSeparator({ className, ...props }: React_2.ComponentProps<typeof Command_2.Separator>): JSX.Element;
691
+
692
+ export declare function CommandShortcut({ className, ...props }: React_2.ComponentProps<'span'>): JSX.Element;
693
+
694
+ /**
695
+ * In-app confirmation dialog — a thin convenience over the AlertDialog
696
+ * primitives for the common confirm-before-action flow (deletes, destructive
697
+ * edits).
698
+ *
699
+ * Prefer this over `window.confirm`: in a sandboxed Artifact Studio iframe the
700
+ * native dialog is blocked (no `allow-modals`) and silently returns false, so a
701
+ * "delete" button wired to `confirm()` appears to do nothing.
702
+ */
703
+ export declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, destructive, onConfirm, }: ConfirmDialogProps): JSX.Element;
704
+
705
+ export declare interface ConfirmDialogProps {
706
+ open: boolean;
707
+ onOpenChange: (open: boolean) => void;
708
+ title: string;
709
+ description?: ReactNode;
710
+ confirmLabel?: string;
711
+ cancelLabel?: string;
712
+ /** Render the confirm action with destructive styling (red). */
713
+ destructive?: boolean;
714
+ onConfirm: () => void;
715
+ }
716
+
717
+ /**
718
+ * Full content-area loading indicator. Use when an entire tab or page section
719
+ * is waiting for data. Renders a centered large spinner with a consistent
720
+ * fade-in animation so loading → content transitions feel smooth.
721
+ */
722
+ export declare function ContentLoadingState({ className }: ContentLoadingStateProps): JSX.Element;
723
+
724
+ export declare interface ContentLoadingStateProps {
725
+ className?: string;
726
+ }
727
+
728
+ export declare const ContextMenu: React_2.FC<ContextMenuPrimitive.ContextMenuProps>;
729
+
730
+ export declare const ContextMenuCheckboxItem: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuCheckboxItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
731
+
732
+ export declare const ContextMenuContent: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
733
+
734
+ export declare const ContextMenuGroup: React_2.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuGroupProps & React_2.RefAttributes<HTMLDivElement>>;
735
+
736
+ export declare const ContextMenuItem: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
737
+ inset?: boolean;
738
+ variant?: "default" | "destructive";
739
+ } & React_2.RefAttributes<HTMLDivElement>>;
740
+
741
+ export declare const ContextMenuLabel: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuLabelProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
742
+ inset?: boolean;
743
+ } & React_2.RefAttributes<HTMLDivElement>>;
744
+
745
+ export declare const ContextMenuPortal: React_2.FC<ContextMenuPrimitive.ContextMenuPortalProps>;
746
+
747
+ export declare const ContextMenuRadioGroup: React_2.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuRadioGroupProps & React_2.RefAttributes<HTMLDivElement>>;
748
+
749
+ export declare const ContextMenuRadioItem: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuRadioItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
750
+
751
+ export declare const ContextMenuSeparator: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSeparatorProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
752
+
753
+ export declare const ContextMenuShortcut: {
754
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLSpanElement>): JSX.Element;
755
+ displayName: string;
756
+ };
757
+
758
+ export declare const ContextMenuSub: React_2.FC<ContextMenuPrimitive.ContextMenuSubProps>;
759
+
760
+ export declare const ContextMenuSubContent: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
761
+
762
+ export declare const ContextMenuSubTrigger: React_2.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubTriggerProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
763
+ inset?: boolean;
764
+ } & React_2.RefAttributes<HTMLDivElement>>;
765
+
766
+ export declare const ContextMenuTrigger: React_2.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuTriggerProps & React_2.RefAttributes<HTMLSpanElement>>;
767
+
768
+ export declare function DashboardShell({ title, range, actions, children, className, bodyClassName, }: DashboardShellProps): JSX.Element;
769
+
770
+ /**
771
+ * DashboardShell — canonical frame for dashboard / list pages.
772
+ *
773
+ * Provides the compact 12-row top bar (title · range slot · actions slot) and
774
+ * a scrolling body with consistent horizontal/vertical rhythm. Pages compose
775
+ * their content (KPI strip, chart cards, tables) as direct children — each
776
+ * child gets `gap-5` vertical spacing automatically.
777
+ *
778
+ * Scrolling ownership: the body is the *only* vertical scroll container for
779
+ * the page. Do NOT wrap `<DashboardShell>` in another `overflow-y-auto` div.
780
+ * Height flows from the platform app shell (`atlas-shell-routes` → app
781
+ * wrapper → `h-full`).
782
+ *
783
+ * Composition:
784
+ * ```tsx
785
+ * <DashboardShell
786
+ * title="Agents"
787
+ * range={<SegmentedControl value="24h" onChange={…} options={…} />}
788
+ * actions={<>
789
+ * <Button variant="outline" size="sm">Import</Button>
790
+ * <Button size="sm">New agent</Button>
791
+ * </>}
792
+ * >
793
+ * <KpiTileGrid columns={4}>…</KpiTileGrid>
794
+ * <ChartCard />
795
+ * <ProDataTable … />
796
+ * </DashboardShell>
797
+ * ```
798
+ *
799
+ * Rules:
800
+ * - Don't render a page subtitle (e.g. "N total") under the title — those
801
+ * belong in section headers or on the table itself.
802
+ * - Don't nest a `<DashboardShell>` inside another scroll container.
803
+ * - Title renders at 16px (`text-base`).
804
+ */
805
+ declare interface DashboardShellProps {
806
+ /** Page title — 16px, semibold. Usually a short noun ("Agents", "Schedules"). */
807
+ title: ReactNode;
808
+ /** Small controls rendered left of the actions (e.g. 24h/7d/30d toggle). */
809
+ range?: ReactNode;
810
+ /** Right-aligned action buttons (Import, New item, etc.). */
811
+ actions?: ReactNode;
812
+ children: ReactNode;
813
+ className?: string;
814
+ /** Extra className on the scrolling body. Use for custom gap/padding overrides. */
815
+ bodyClassName?: string;
816
+ }
817
+
818
+ export declare function DataTable<T>({ columns, data, pageSize, defaultSort, emptyMessage, onRowClick, rowClassName, className, }: DataTableProps<T>): JSX.Element;
819
+
820
+ declare interface DataTableProps<T> {
821
+ columns: ColumnDef<T, unknown>[];
822
+ data: T[];
823
+ pageSize?: number;
824
+ defaultSort?: SortingState;
825
+ emptyMessage?: string;
826
+ onRowClick?: (row: T) => void;
827
+ rowClassName?: (row: Row<T>) => string | undefined;
828
+ className?: string;
829
+ }
830
+
831
+ /**
832
+ * Date picker working in `Date | null` (or `DateRange | null` in `mode="range"`).
833
+ * Radix popover + react-day-picker calendar + free-text parsing + presets.
834
+ *
835
+ * Most fields persist a date-only `YYYY-MM-DD` string — for those, reach for
836
+ * {@link IsoDateField} (single) or `DateRangePill` (start–end range) instead,
837
+ * which own the string ↔ Date bridge (local-midnight parse, invalid-date
838
+ * rejection) so you don't re-implement it. Use `DateField` directly only when
839
+ * the value is genuinely a `Date`/`DateRange`: an in-memory filter, a
840
+ * non-date-only serialization (e.g. a full timestamp), or a custom trigger.
841
+ *
842
+ * @see IsoDateField — single date-only string fields (the common case)
843
+ * @see DateRangePill — start–end ranges persisted as strings
844
+ */
845
+ export declare function DateField(props: DateFieldProps): React_2.ReactElement;
846
+
847
+ declare interface DateFieldCommonProps {
848
+ /** Optional id for the trigger control (enables `<label htmlFor>` association). */
849
+ id?: string;
850
+ /** Placeholder for the trigger when no value is set. */
851
+ placeholder?: string;
852
+ /** Disable both input and calendar. */
853
+ disabled?: boolean;
854
+ /** Latest date the user can pick / parse. Inclusive. */
855
+ max?: Date;
856
+ /** Earliest date the user can pick / parse. Inclusive. */
857
+ min?: Date;
858
+ /**
859
+ * Override "today" — both for relative phrase parsing AND for
860
+ * the default visible month on the calendar. Tests pass this to
861
+ * pin output; UI callers usually leave it undefined.
862
+ */
863
+ referenceDate?: Date;
864
+ /** Popover alignment relative to the trigger. */
865
+ align?: 'start' | 'center' | 'end';
866
+ /**
867
+ * Override the default preset list. Pass `[]` to hide presets
868
+ * entirely (yields a leaner popover for tight surfaces).
869
+ */
870
+ presets?: readonly DateFieldPreset[];
871
+ /** Extra classes applied to the trigger wrapper div. */
872
+ containerClassName?: string;
873
+ /** Extra classes applied to the trigger button. */
874
+ className?: string;
875
+ /** ARIA label for the trigger button. */
876
+ ariaLabel?: string;
877
+ /**
878
+ * When set, applies `aria-invalid` to the trigger button so validation
879
+ * helpers (e.g. scroll-to-first-error) can locate and focus this control.
880
+ */
881
+ 'aria-invalid'?: boolean;
882
+ /** Render a clear (X) affordance inside the trigger when a value is set. */
883
+ clearable?: boolean;
884
+ /**
885
+ * Year-resolution direction for bare month / month-day text input
886
+ * (e.g. `"Jun 8"` with no year). Defaults to `'past'` — matches
887
+ * retrospective filter usage. Pass `'future'` on forward-planning
888
+ * surfaces (due dates, scheduling) so `"Jun 8"` in May reads as the
889
+ * upcoming June 8 instead of last year's.
890
+ */
891
+ yearBias?: YearBias;
892
+ }
893
+
894
+ /**
895
+ * A relative preset. The `value` is computed lazily against a
896
+ * reference date so the same preset table works in any mode and
897
+ * with any "now" — including the test/fixture case where callers
898
+ * pass `referenceDate` to make rendering deterministic.
899
+ */
900
+ export declare interface DateFieldPreset {
901
+ label: string;
902
+ /**
903
+ * Resolve the preset against a reference date. Return either:
904
+ * - a `Date` (the preset picks a single day),
905
+ * - a `DateRange` (the preset picks a span),
906
+ * - `null` to skip rendering (rare; lets callers gate presets
907
+ * conditionally without removing them from the array).
908
+ *
909
+ * `DateField` automatically adapts: a preset that yields a range
910
+ * but is clicked in single mode falls back to the range's `from`
911
+ * day, and a preset that yields a single date in range mode is
912
+ * treated as `from === to`.
913
+ */
914
+ resolve: (now: Date) => Date | DateRange | null;
915
+ }
916
+
917
+ export declare type DateFieldProps = DateFieldSingleProps | DateFieldRangeProps;
918
+
919
+ declare interface DateFieldRangeProps extends DateFieldCommonProps {
920
+ mode: 'range';
921
+ value: DateRange | null;
922
+ onChange: (next: DateRange | null) => void;
923
+ }
924
+
925
+ declare interface DateFieldSingleProps extends DateFieldCommonProps {
926
+ mode?: 'single';
927
+ value: Date | null;
928
+ onChange: (next: Date | null) => void;
929
+ }
930
+
931
+ export declare interface DateRange {
932
+ from: Date;
933
+ to: Date;
934
+ }
935
+
936
+ /** Checkbox "checked" target: clicking an unchecked row sets this. */
937
+ export declare const DEFAULT_COMPLETE_STATUS = "done";
938
+
939
+ /** Checkbox "unchecked" target: clicking a checked row resets to this. */
940
+ export declare const DEFAULT_INCOMPLETE_STATUS = "todo";
941
+
942
+ /** Default range presets — the canonical "filter by time" set. */
943
+ export declare const DEFAULT_RANGE_PRESETS: readonly DateFieldPreset[];
944
+
945
+ /** Statuses treated as resolved: title struck-through + due-date urgency suppressed. */
946
+ export declare const DEFAULT_RESOLVED_STATUSES: readonly string[];
947
+
948
+ /** Default single-date presets. */
949
+ export declare const DEFAULT_SINGLE_PRESETS: readonly DateFieldPreset[];
950
+
951
+ /** Hover "Start" button target, shown when a row sits at the incomplete status. */
952
+ export declare const DEFAULT_START_STATUS = "in_progress";
953
+
954
+ export declare const DEFAULT_STATUS_BOARD_ORDER: readonly string[];
955
+
956
+ export declare const DEFAULT_STATUS_OPTIONS: TaskStatusOption[];
957
+
958
+ /** The status values the built-in default vocabulary uses. */
959
+ export declare type DefaultTaskStatus = 'todo' | 'in_progress' | 'blocked' | 'done' | 'cancelled';
960
+
961
+ /**
962
+ * Dialog — modal dialog built on Radix's Dialog primitive.
963
+ *
964
+ * Composition (header + body + footer):
965
+ *
966
+ * <Dialog>
967
+ * <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
968
+ * <DialogContent>
969
+ * <DialogHeader>
970
+ * <DialogTitle>Title</DialogTitle>
971
+ * <DialogDescription>Optional helper copy.</DialogDescription>
972
+ * </DialogHeader>
973
+ * <DialogBody>
974
+ * {form fields / long content}
975
+ * </DialogBody>
976
+ * <DialogFooter>
977
+ * <DialogClose asChild><Button variant="ghost">Cancel</Button></DialogClose>
978
+ * <Button>Save</Button>
979
+ * </DialogFooter>
980
+ * </DialogContent>
981
+ * </Dialog>
982
+ *
983
+ * Layout contract:
984
+ * - `DialogContent` is a flex column with `overflow-hidden` — the
985
+ * rounded corners clip the header/body/footer surfaces so they
986
+ * meet the corners cleanly.
987
+ * - `DialogHeader` is `shrink-0` on the shared white (`bg-card`)
988
+ * surface with a 1px `border-b`. The border acts as the scroll
989
+ * horizon — content in `DialogBody` slides under that line when
990
+ * scrolled. No tint on the header: the dialog reads as one clean
991
+ * white card with subtle dividers rather than stratified bands.
992
+ * - `DialogBody` is `flex-1 min-h-0 overflow-y-auto` with its own
993
+ * padding, same white surface as the header. Single scroll region
994
+ * — content scrolls independently of the sticky header/footer.
995
+ * - `DialogFooter` mirrors the header: white surface + 1px
996
+ * `border-t` so the action row reads as a capped footer that
997
+ * doesn't scroll with content.
998
+ * - All three zones share `px-6 py-4` padding so the vertical
999
+ * rhythm stays uniform; the borders are the only visual
1000
+ * differentiator.
1001
+ *
1002
+ * Atlas-specific behaviors:
1003
+ * - Portal mounts into the shared Atlas portal container
1004
+ * (`usePortalContainer()`), so dialogs trap focus + stacking
1005
+ * correctly inside MFEs (chat-admin, inbox, agents) that isolate
1006
+ * their own DOM scope.
1007
+ * - Fallback portal root is appended under `document.body` (NOT
1008
+ * `documentElement`) — a portal on `<html>` breaks Radix's
1009
+ * `aria-hidden` bookkeeping for nested layers.
1010
+ * - Title renders at `text-base` (16px) semibold — NOT `text-lg`
1011
+ * (which in Atlas's token scale is 26px / hero size).
1012
+ * - Overlay is `bg-overlay` with a light backdrop blur — a
1013
+ * mode-independent dark scrim, NOT an alpha of `--foreground`
1014
+ * (see `DialogOverlay`).
1015
+ * - Content rounds to `rounded-surface` (DES-313) — the top-level
1016
+ * container radius role shared with Card.
1017
+ */
1018
+ export declare const Dialog: React_2.FC<DialogPrimitive.DialogProps>;
1019
+
1020
+ /**
1021
+ * DialogBody — the scrollable body region between DialogHeader and
1022
+ * DialogFooter. New in this revision.
1023
+ *
1024
+ * Use this for any dialog with form fields, long content, or anything
1025
+ * that might exceed the viewport. For very short dialogs where the
1026
+ * scroll affordance is overkill, consumers can still render their own
1027
+ * `<div>` between header and footer; this component just encodes the
1028
+ * standard pattern (flex-1 + min-h-0 + overflow-y-auto + default
1029
+ * padding) so callers don't have to remember the details.
1030
+ */
1031
+ export declare function DialogBody({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
1032
+
1033
+ export declare namespace DialogBody {
1034
+ var displayName: string;
1035
+ }
1036
+
1037
+ export declare const DialogClose: React_2.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React_2.RefAttributes<HTMLButtonElement>>;
1038
+
1039
+ export declare const DialogContent: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
1040
+ /**
1041
+ * Render the corner close affordance. Default `true`. Set `false` to
1042
+ * suppress it during a blocking in-dialog action (e.g. an upload in
1043
+ * flight) so the user can't dismiss mid-operation. Pair with a
1044
+ * controlled `open` + an `onOpenChange` guard for full lockout.
1045
+ */
1046
+ showCloseButton?: boolean;
1047
+ /**
1048
+ * Classes for the scrim behind the dialog. Pair with `className` when
1049
+ * raising z-index — a lone `className="z-modal"` lifts only the panel and
1050
+ * leaves the overlay at `z-50` (DES-315). Additive; defaults unchanged.
1051
+ */
1052
+ overlayClassName?: string;
1053
+ } & React_2.RefAttributes<HTMLDivElement>>;
1054
+
1055
+ export declare const DialogDescription: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React_2.RefAttributes<HTMLParagraphElement>, "ref"> & React_2.RefAttributes<HTMLParagraphElement>>;
1056
+
1057
+ export declare function DialogFooter({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
1058
+
1059
+ export declare namespace DialogFooter {
1060
+ var displayName: string;
1061
+ }
1062
+
1063
+ export declare function DialogHeader({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
1064
+
1065
+ export declare namespace DialogHeader {
1066
+ var displayName: string;
1067
+ }
1068
+
1069
+ export declare const DialogOverlay: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1070
+
1071
+ export declare function DialogPortal({ container, ...props }: React_2.ComponentProps<typeof DialogPrimitive.Portal>): JSX.Element;
1072
+
1073
+ export declare const DialogTitle: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React_2.RefAttributes<HTMLHeadingElement>, "ref"> & React_2.RefAttributes<HTMLHeadingElement>>;
1074
+
1075
+ export declare const DialogTrigger: React_2.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
1076
+
1077
+ export declare const DropdownMenu: React_2.FC<DropdownMenuPrimitive.DropdownMenuProps>;
1078
+
1079
+ export declare const DropdownMenuCheckboxItem: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1080
+
1081
+ export declare const DropdownMenuContent: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1082
+
1083
+ export declare const DropdownMenuGroup: React_2.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & React_2.RefAttributes<HTMLDivElement>>;
1084
+
1085
+ export declare const DropdownMenuItem: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
1086
+ inset?: boolean;
1087
+ variant?: "default" | "destructive";
1088
+ } & React_2.RefAttributes<HTMLDivElement>>;
1089
+
1090
+ export declare const DropdownMenuLabel: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
1091
+ inset?: boolean;
1092
+ } & React_2.RefAttributes<HTMLDivElement>>;
1093
+
1094
+ export declare const DropdownMenuPortal: React_2.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
1095
+
1096
+ export declare const DropdownMenuRadioGroup: React_2.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React_2.RefAttributes<HTMLDivElement>>;
1097
+
1098
+ export declare const DropdownMenuRadioItem: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1099
+
1100
+ export declare const DropdownMenuSeparator: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1101
+
1102
+ export declare const DropdownMenuShortcut: {
1103
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLSpanElement>): JSX.Element;
1104
+ displayName: string;
1105
+ };
1106
+
1107
+ /**
1108
+ * Nested submenu. **House convention:** when a `…` overflow menu offers a
1109
+ * *choice among values* (role / permission / status / assignee), put the
1110
+ * options in a `DropdownMenuSub` whose trigger is the field name — e.g.
1111
+ * `Role ›` opens `Viewer ✓ / Admin` — instead of a flat label followed by the
1112
+ * options inline. Keep standalone/destructive actions (`Remove access`) at the
1113
+ * top level, and mark the current value with a right-aligned `Check`. This
1114
+ * keeps the top menu short and scales as options grow.
1115
+ *
1116
+ * Reference: `PrincipalRow` / `GroupMembersDetail` role menus. See also
1117
+ * `.cursor/rules/design-system.md` ("Overflow menus: nest the option list").
1118
+ */
1119
+ export declare const DropdownMenuSub: React_2.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
1120
+
1121
+ export declare const DropdownMenuSubContent: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1122
+
1123
+ export declare const DropdownMenuSubTrigger: React_2.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
1124
+ inset?: boolean;
1125
+ } & React_2.RefAttributes<HTMLDivElement>>;
1126
+
1127
+ export declare const DropdownMenuTrigger: React_2.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
1128
+
1129
+ export declare function EditorPageHeader({ title, description, actions, className }: EditorPageHeaderProps): JSX.Element;
1130
+
1131
+ /**
1132
+ * EditorPageHeader — section title + description block used at the top of
1133
+ * each editor pane (Prompt, Tools, Input Schema, etc.).
1134
+ *
1135
+ * Replaces the older `<Panel>` Card-wrap pattern with a flat layout that
1136
+ * matches the new editor design. Title is 18px (one step up from the
1137
+ * dashboard's 16px page header), description is 13px secondary text.
1138
+ *
1139
+ * Pair with `EditorSection` for vertically-stacked content blocks under the
1140
+ * header — gives consistent spacing and an optional sub-section divider.
1141
+ *
1142
+ * Usage:
1143
+ * <EditorPagePane>
1144
+ * <EditorPageHeader
1145
+ * title="Prompt"
1146
+ * description="The system prompt sent to the model on every run …"
1147
+ * />
1148
+ * <EditorSection>…</EditorSection>
1149
+ * <EditorSection title="Model parameters">…</EditorSection>
1150
+ * </EditorPagePane>
1151
+ */
1152
+ declare interface EditorPageHeaderProps {
1153
+ title: React_2.ReactNode;
1154
+ description?: React_2.ReactNode;
1155
+ /** Right-aligned action(s) on the same row as the title. */
1156
+ actions?: React_2.ReactNode;
1157
+ className?: string;
1158
+ }
1159
+
1160
+ export declare const EditorPagePane: React_2.ForwardRefExoticComponent<EditorPagePaneProps & React_2.RefAttributes<HTMLDivElement>>;
1161
+
1162
+ declare interface EditorPagePaneProps extends React_2.HTMLAttributes<HTMLDivElement> {
1163
+ }
1164
+
1165
+ export declare const EditorSection: React_2.ForwardRefExoticComponent<EditorSectionProps & React_2.RefAttributes<HTMLDivElement>>;
1166
+
1167
+ declare interface EditorSectionProps extends Omit<React_2.HTMLAttributes<HTMLDivElement>, 'title'> {
1168
+ /** Subtle section heading rendered above the content (smaller than EditorPageHeader). */
1169
+ title?: React_2.ReactNode;
1170
+ description?: React_2.ReactNode;
1171
+ /** Right-aligned action(s) on the heading row. */
1172
+ actions?: React_2.ReactNode;
1173
+ }
1174
+
1175
+ export declare const EditorSideNav: React_2.ForwardRefExoticComponent<EditorSideNavProps & React_2.RefAttributes<HTMLDivElement>>;
1176
+
1177
+ export declare function EditorSideNavGroup({ label, headerTrailing, className, children, }: EditorSideNavGroupProps): JSX.Element;
1178
+
1179
+ declare interface EditorSideNavGroupProps {
1180
+ label?: React_2.ReactNode;
1181
+ headerTrailing?: React_2.ReactNode;
1182
+ className?: string;
1183
+ children?: React_2.ReactNode;
1184
+ }
1185
+
1186
+ export declare const EditorSideNavItem: React_2.ForwardRefExoticComponent<EditorSideNavItemProps & React_2.RefAttributes<HTMLButtonElement>>;
1187
+
1188
+ declare interface EditorSideNavItemProps extends React_2.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> {
1189
+ /** Optional small right-aligned count or tag. */
1190
+ trailing?: React_2.ReactNode;
1191
+ }
1192
+
1193
+ /**
1194
+ * EditorSideNav — vertical, grouped tab list for entity editors.
1195
+ *
1196
+ * Designed to drop in as the `<TabsList>` for a Radix `<Tabs orientation="vertical">`
1197
+ * tree, so it works with the existing `<TabsContent value="…">` pattern with
1198
+ * zero state plumbing. Visual goals:
1199
+ * - 220px wide rail with subtle right border
1200
+ * - Section headers (`EditorSideNavGroup`) use uppercase 11px tracking — same
1201
+ * density as the V2 dashboards' KPI labels
1202
+ * - Items are 28–30px tall with a soft fill on the active row
1203
+ *
1204
+ * Optional `header` / `footer` slots render INSIDE the rail's chrome but
1205
+ * OUTSIDE the Radix tablist, so non-tab controls (brand row, freshness
1206
+ * indicator, scope toggles) don't pollute the tablist's keyboard
1207
+ * semantics or screen-reader announcements. Without these slots, mixing
1208
+ * a `<button>` into the EditorSideNav children would put an interactive
1209
+ * non-tab control inside `role=tablist`, breaking arrow-key navigation.
1210
+ *
1211
+ * Usage:
1212
+ * <Tabs orientation="vertical" defaultValue="overview" className="flex …">
1213
+ * <EditorSideNav
1214
+ * header={<BrandRow />}
1215
+ * footer={<LiveBadge />}
1216
+ * >
1217
+ * <EditorSideNavGroup label="General">
1218
+ * <EditorSideNavItem value="overview">Overview</EditorSideNavItem>
1219
+ * <EditorSideNavItem value="prompt">Prompt</EditorSideNavItem>
1220
+ * </EditorSideNavGroup>
1221
+ * …
1222
+ * </EditorSideNav>
1223
+ * <div>
1224
+ * <TabsContent value="overview">…</TabsContent>
1225
+ * </div>
1226
+ * </Tabs>
1227
+ */
1228
+ declare interface EditorSideNavProps extends React_2.ComponentPropsWithoutRef<typeof TabsPrimitive.List> {
1229
+ /** Width override in px. Defaults to 220. */
1230
+ width?: number;
1231
+ /**
1232
+ * Content rendered above the tablist — brand row, identity, etc.
1233
+ * Lives outside the Radix tablist so it doesn't appear in keyboard /
1234
+ * screen-reader navigation as a tab. Receives the same horizontal
1235
+ * padding as the rail.
1236
+ */
1237
+ header?: React_2.ReactNode;
1238
+ /**
1239
+ * Content rendered below the tablist and pinned to the bottom of
1240
+ * the rail (via `mt-auto`). Use for global controls and indicators
1241
+ * (scope toggles, data-freshness badges) — anything that's
1242
+ * interactive but not a tab. Lives outside the Radix tablist for
1243
+ * the same accessibility reason as `header`.
1244
+ */
1245
+ footer?: React_2.ReactNode;
1246
+ }
1247
+
1248
+ export declare const EditorTopBar: React_2.ForwardRefExoticComponent<EditorTopBarProps & React_2.RefAttributes<HTMLDivElement>>;
1249
+
1250
+ /** Right-aligned action group. Adds spacing + flex-end positioning. */
1251
+ export declare function EditorTopBarActions({ className, children, }: {
1252
+ className?: string;
1253
+ children?: React_2.ReactNode;
1254
+ }): JSX.Element;
1255
+
1256
+ export declare function EditorTopBarBackButton({ onClick, title }: {
1257
+ onClick: () => void;
1258
+ title?: string;
1259
+ }): JSX.Element;
1260
+
1261
+ export declare function EditorTopBarIdentity({ icon, iconBg, iconColor, name, tag, badge, meta, className, }: EditorTopBarIdentityProps): JSX.Element;
1262
+
1263
+ declare interface EditorTopBarIdentityProps {
1264
+ /** Tinted square icon/avatar (28px) — pass an icon or initials. */
1265
+ icon?: React_2.ReactNode;
1266
+ /** Background color for the icon tile. */
1267
+ iconBg?: string;
1268
+ /** Foreground color for the icon glyph/initials. */
1269
+ iconColor?: string;
1270
+ /** Primary name. */
1271
+ name: React_2.ReactNode;
1272
+ /** Optional inline mono tag rendered next to the name (e.g. "Sonnet 4.5"). */
1273
+ tag?: React_2.ReactNode;
1274
+ /** Optional status badge rendered to the right of the tag. */
1275
+ badge?: React_2.ReactNode;
1276
+ /** Subtle meta line under the name (e.g. "Draft · edited 4m ago by …"). */
1277
+ meta?: React_2.ReactNode;
1278
+ className?: string;
1279
+ }
1280
+
1281
+ /**
1282
+ * EditorTopBar — minimal page header for entity editors (Agent, Workflow,
1283
+ * Skill, etc.). Pairs with `EditorSideNav` + `EditorPageHeader` to form the
1284
+ * standard editor chrome.
1285
+ *
1286
+ * Composition (left → right):
1287
+ * <EditorTopBar onBack={...}> ← back button slot
1288
+ * <EditorTopBarIdentity icon={...} name="…" tag="…" /> ← identity block
1289
+ * <EditorTopBarActions> ← right side
1290
+ * ...buttons...
1291
+ * </EditorTopBarActions>
1292
+ * </EditorTopBar>
1293
+ *
1294
+ * Density matches the V2 dashboard top bars (52px tall) so editors and
1295
+ * dashboards share a consistent shell row.
1296
+ */
1297
+ declare interface EditorTopBarProps extends React_2.HTMLAttributes<HTMLDivElement> {
1298
+ onBack?: () => void;
1299
+ /** Override the back button entirely (e.g. wrap in a Link). */
1300
+ backSlot?: React_2.ReactNode;
1301
+ }
1302
+
1303
+ /**
1304
+ * Convenience status pill for "Draft / Deployed / Archived" etc. — uses the
1305
+ * same dot+label aesthetic as `StatusDotBadge` but smaller for inline use
1306
+ * inside the top bar identity block.
1307
+ */
1308
+ export declare function EditorTopBarStatusBadge({ tone, label, }: {
1309
+ tone?: 'success' | 'neutral' | 'warn' | 'info';
1310
+ label: React_2.ReactNode;
1311
+ }): JSX.Element;
1312
+
1313
+ /**
1314
+ * Consistent empty-state placeholder for tables and content areas.
1315
+ */
1316
+ export declare function EmptyState({ icon, message, detail, className }: EmptyStateProps): JSX.Element;
1317
+
1318
+ export declare interface EmptyStateProps {
1319
+ icon?: React.ReactNode;
1320
+ message: string;
1321
+ detail?: string;
1322
+ className?: string;
1323
+ }
1324
+
1325
+ /**
1326
+ * The canonical inline failure banner — one treatment for "this panel could not
1327
+ * load", used across apps so a failure reads the same everywhere.
1328
+ *
1329
+ * The red hue is fixed on purpose: it carries meaning, not theme. What it does
1330
+ * carry is a dark pair — the `-50`/`-200`/`-700` triplet is tuned for a white
1331
+ * surface and goes near-illegible on a dark one, so `.dark` lifts the fill to a
1332
+ * translucent step and lightens the ink. Light is byte-identical.
1333
+ */
1334
+ export declare function ErrorState({ message, className }: ErrorStateProps): JSX.Element;
1335
+
1336
+ declare interface ErrorStateProps {
1337
+ message: string;
1338
+ className?: string;
1339
+ }
1340
+
1341
+ /**
1342
+ * The row-match test behind both facet predicates (multi + single), factored
1343
+ * out as a pure function so the filtering behavior is unit-testable without
1344
+ * driving the cmdk menu. A row is kept when:
1345
+ * - no filter is set (`undefined`/`''`/empty array), or
1346
+ * - `filterValue` is an array (multi) and the cell value is in it, or
1347
+ * - `filterValue` is a string (single) and the cell value equals it.
1348
+ * The cell value is compared via {@link facetValueToString}, so numbers,
1349
+ * booleans, and dates match the option `value` strings the facet offers.
1350
+ */
1351
+ export declare function facetFilterMatches(cellValue: unknown, filterValue: string | string[] | undefined): boolean;
1352
+
1353
+ export declare function Field({ className, orientation, ...props }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>): JSX.Element;
1354
+
1355
+ /** The display text for a field's auto-rendered chip. */
1356
+ export declare function fieldChipText(field: TaskFieldDef): string;
1357
+
1358
+ export declare function FieldContent({ className, ...props }: React.ComponentProps<"div">): JSX.Element;
1359
+
1360
+ export declare function FieldDescription({ className, ...props }: React.ComponentProps<"p">): JSX.Element;
1361
+
1362
+ /** The current single-select value for a field's inline editor. */
1363
+ export declare function fieldEditorValue(field: TaskFieldDef): string | null;
1364
+
1365
+ export declare function FieldError({ className, children, errors, ...props }: React.ComponentProps<"div"> & {
1366
+ errors?: Array<{
1367
+ message?: string;
1368
+ } | undefined>;
1369
+ }): JSX.Element | null;
1370
+
1371
+ export declare function FieldGroup({ className, ...props }: React.ComponentProps<"div">): JSX.Element;
1372
+
1373
+ export declare function FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>): JSX.Element;
1374
+
1375
+ export declare function FieldLegend({ className, variant, ...props }: React.ComponentProps<"legend"> & {
1376
+ variant?: "legend" | "label";
1377
+ }): JSX.Element;
1378
+
1379
+ export declare function FieldSeparator({ children, className, ...props }: React.ComponentProps<"div"> & {
1380
+ children?: React.ReactNode;
1381
+ }): JSX.Element;
1382
+
1383
+ export declare function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">): JSX.Element;
1384
+
1385
+ export declare function FieldTitle({ className, ...props }: React.ComponentProps<"div">): JSX.Element;
1386
+
1387
+ declare const fieldVariants: (props?: ({
1388
+ orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
1389
+ } & ClassProp) | undefined) => string;
1390
+
1391
+ export declare const FileDropzone: React_2.ForwardRefExoticComponent<FileDropzoneProps & React_2.RefAttributes<HTMLDivElement>>;
1392
+
1393
+ /**
1394
+ * Companion component — renders the current file selection as a list
1395
+ * with per-item remove buttons. Separate from `FileDropzone` on
1396
+ * purpose: some layouts want the list above the dropzone, some below,
1397
+ * some inside a dialog. The dropzone emits the file array; callers
1398
+ * render however they want.
1399
+ */
1400
+ export declare const FileDropzoneList: React_2.ForwardRefExoticComponent<FileDropzoneListProps & React_2.RefAttributes<HTMLUListElement>>;
1401
+
1402
+ export declare interface FileDropzoneListProps extends React_2.HTMLAttributes<HTMLUListElement> {
1403
+ files: File[];
1404
+ onRemove?: (file: File) => void;
1405
+ }
1406
+
1407
+ export declare interface FileDropzoneProps {
1408
+ /**
1409
+ * Controlled list of files. Omit for uncontrolled — the dropzone
1410
+ * holds its own internal list and emits adds/removes via callbacks.
1411
+ */
1412
+ value?: File[];
1413
+ /** Controlled counterpart — fires with the full updated list. */
1414
+ onValueChange?: (files: File[]) => void;
1415
+ /**
1416
+ * Fires with files that passed validation and were added to the set.
1417
+ * Useful when you want to start an upload immediately rather than
1418
+ * wait for an explicit "Submit" action.
1419
+ */
1420
+ onFilesAdded?: (files: File[]) => void;
1421
+ /**
1422
+ * Fires with files that were dropped/selected but rejected. Report
1423
+ * these to the user — typically via a toast or inline error.
1424
+ */
1425
+ onReject?: (rejections: FileRejection[]) => void;
1426
+ /**
1427
+ * MIME types or extensions accepted by the file picker. Passed
1428
+ * verbatim to the native `<input>` `accept` attribute. Use the
1429
+ * native format: `"image/*,application/pdf,.jsonl"`.
1430
+ */
1431
+ accept?: string;
1432
+ /** Max files in the total set. Defaults to `Infinity`. */
1433
+ maxFiles?: number;
1434
+ /** Max size per file in bytes. Defaults to `Infinity`. */
1435
+ maxSize?: number;
1436
+ /** Allow multiple selections. Default `true`. */
1437
+ multiple?: boolean;
1438
+ /** Disable interaction + dim the surface. */
1439
+ disabled?: boolean;
1440
+ /**
1441
+ * Error state — destructive border + `aria-invalid`. Mirrors
1442
+ * Input / Select / Textarea so form primitives share a surface.
1443
+ */
1444
+ error?: boolean | string;
1445
+ /**
1446
+ * Override the default empty-state UI. When omitted, a centered
1447
+ * upload icon + "Drop files here or click to browse" label renders
1448
+ * using the `accept` / `maxSize` props as the hint line.
1449
+ */
1450
+ children?: React_2.ReactNode;
1451
+ className?: string;
1452
+ }
1453
+
1454
+ /**
1455
+ * FileDropzone — drag-and-drop file upload surface.
1456
+ *
1457
+ * Shadcn doesn't ship a first-class file-upload primitive in the core
1458
+ * registry, so this is Atlas's canonical version — built in the same
1459
+ * house style: `cn()`, `forwardRef`, design-token palette, composable
1460
+ * via children, and zero external dependencies (no `react-dropzone`).
1461
+ *
1462
+ * Core behaviors:
1463
+ * - Drag-and-drop OR click-to-browse OR keyboard (Enter/Space)
1464
+ * - Paste support (Ctrl/Cmd+V while focused)
1465
+ * - Validation: `accept` (mime / extension), `maxFiles`, `maxSize`
1466
+ * - Rejection reporting via `onReject({ file, reason })`
1467
+ * - Controlled (`value` + `onValueChange`) or uncontrolled
1468
+ * - Matches Input/Select/Textarea on radius (8px), border color
1469
+ * (`border-input` dashed), and focus ring (1px). Surface is
1470
+ * `bg-muted` — a subtle tinted fill that differentiates the drop
1471
+ * target from the white page backdrop. Hover / drag states
1472
+ * darken via `bg-accent/40` and `bg-accent/60` respectively.
1473
+ *
1474
+ * Usage — simplest form (uncontrolled):
1475
+ * ```tsx
1476
+ * <FileDropzone accept="image/*" maxSize={5 * 1024 * 1024} onFilesAdded={upload} />
1477
+ * ```
1478
+ *
1479
+ * Controlled with file list:
1480
+ * ```tsx
1481
+ * const [files, setFiles] = useState<File[]>([])
1482
+ * <FileDropzone value={files} onValueChange={setFiles} multiple />
1483
+ * <FileDropzoneList files={files} onRemove={(f) => setFiles(prev => prev.filter(x => x !== f))} />
1484
+ * ```
1485
+ */
1486
+ export declare interface FileRejection {
1487
+ file: File;
1488
+ /**
1489
+ * Reason the file was rejected. Discrete codes so consumers can
1490
+ * localize or branch on them rather than parsing strings.
1491
+ */
1492
+ reason: 'invalid-type' | 'too-large' | 'too-many' | 'empty';
1493
+ message: string;
1494
+ }
1495
+
1496
+ /** @deprecated Use `MultiSelectOption` from `./multi-select`. */
1497
+ export declare interface FilterOption<T extends string> {
1498
+ value: T;
1499
+ label: string;
1500
+ /** Optional visual (colored badge, dot) shown beside the label. */
1501
+ swatch?: ReactNode;
1502
+ }
1503
+
1504
+ export declare function FilterPill({ label, options, selected, onChange }: FilterPillProps): JSX.Element | null;
1505
+
1506
+ /**
1507
+ * @deprecated Do not use in new code, and migrate existing usages off it.
1508
+ * `FilterPill` is being retired from the design system: filtering must go
1509
+ * through the canonical support — `ProDataTable`'s native filter funnel
1510
+ * (`meta.filter` → `FilterMenu`), which owns state, ordering (search always
1511
+ * before filter), and DS-composed controls. This standalone pill is removed
1512
+ * from the design-system gallery; it is still exported from
1513
+ * `@sequenceholdings/atlas-ui` (deprecated) purely so existing consumers keep
1514
+ * compiling — kept only until the remaining app consumers (chat / crm /
1515
+ * permissions / groups / jarvis / billing) are migrated to the funnel, after
1516
+ * which the exports and this file go away (DES-126).
1517
+ *
1518
+ * FilterPill — a compact multi-select filter anchored to a table toolbar.
1519
+ *
1520
+ * Visual contract mirrors `SelectTrigger` so a toolbar of FilterPills +
1521
+ * SearchInput + Select reads as one coherent row of controls, not a
1522
+ * grab-bag of visual treatments:
1523
+ *
1524
+ * - Height: h-9 (36px)
1525
+ * - Radius: rounded-sm (8px, `--radius-sm`)
1526
+ * - Border/bg: `border bg-card` — `--input` border, raised surface,
1527
+ * same palette as Select/Input. NOT `background`: that is
1528
+ * the PAGE role (ds-neutral-50 under v2, not white), which
1529
+ * rendered the pill as a grey chip next to the white
1530
+ * outline controls beside it. `Button variant="outline"`
1531
+ * carries the same note and the same `dark:bg-input/30`
1532
+ * lift, since in dark the resting fill matches the darkest
1533
+ * surface and vanishes.
1534
+ * - Padding: px-3 py-1
1535
+ * - Text: text-base md:text-sm (14px on desktop)
1536
+ * - Focus ring: focus:ring-1 focus:ring-ring (keyboard-visible)
1537
+ *
1538
+ * Rationale for NOT using `rounded-full` + primary fill (the old shape):
1539
+ * 1. Visual noise. When a toolbar mixes a SearchInput (8px radius),
1540
+ * two FilterPills (full radius), and a Select (8px radius), the
1541
+ * eye has to re-parse each control. A consistent radius reads as
1542
+ * one group.
1543
+ * 2. Active state hierarchy. A solid primary-colored pill made the
1544
+ * active filter feel like a CTA. Filters are not CTAs — the
1545
+ * primary action on a dashboard is "run query" / "save", not
1546
+ * "I've narrowed my view". A subtle count chip communicates
1547
+ * activity without competing with real buttons.
1548
+ *
1549
+ * Active state now uses a tiny pill-shaped count badge next to the
1550
+ * label. The trigger itself stays in the Select-aligned neutral look.
1551
+ */
1552
+ declare interface FilterPillProps {
1553
+ label: string;
1554
+ options: string[];
1555
+ selected: string[];
1556
+ onChange: (values: string[]) => void;
1557
+ }
1558
+
1559
+ /**
1560
+ * @deprecated Do not use in new code, and migrate existing usages off it.
1561
+ * `FilterSelect` is retired in favor of `MultiSelect` (searchable cmdk list,
1562
+ * always-visible checkboxes, stacked trigger icons). It is still exported from
1563
+ * `@sequenceholdings/atlas-ui` (deprecated) so remaining consumers keep
1564
+ * compiling — remove only after the blast-radius scan is clean (FilterPill /
1565
+ * DES-261 deprecate-before-delete pattern).
1566
+ *
1567
+ * A compact multi-select filter for a table/list toolbar: a trigger with a count
1568
+ * chip when active, and a popover of swatch + label rows with a check on the
1569
+ * selected ones. Reusable for any short enum filter (status, health, type, …).
1570
+ *
1571
+ * "Active" means the filter actually narrows the set — neither all nor none
1572
+ * selected — so an all-selected filter reads as a neutral control, not an
1573
+ * applied one.
1574
+ */
1575
+ export declare function FilterSelect<T extends string>({ label, options, selected, onChange, }: FilterSelectProps<T>): JSX.Element;
1576
+
1577
+ /** @deprecated Use `MultiSelect` props instead. */
1578
+ export declare interface FilterSelectProps<T extends string> {
1579
+ label: string;
1580
+ options: FilterOption<T>[];
1581
+ selected: T[];
1582
+ onChange: (next: T[]) => void;
1583
+ }
1584
+
1585
+ /**
1586
+ * Format a byte count to a human-readable string. Matches the
1587
+ * conventions users expect in file dialogs: 1024-base, one decimal
1588
+ * place once past KB.
1589
+ */
1590
+ export declare function formatBytes(bytes: number): string;
1591
+
1592
+ export declare function formatCompact(value: number): string;
1593
+
1594
+ export declare function formatCurrency(value: number): string;
1595
+
1596
+ export declare function formatCurrencyPrecise(value: number): string;
1597
+
1598
+ export declare function formatDurationMs(ms: number): string;
1599
+
1600
+ export declare function formatNumber(value: number): string;
1601
+
1602
+ export declare function formatPercent(value: number): string;
1603
+
1604
+ export declare function formatTimestamp(date: string | Date): string;
1605
+
1606
+ /**
1607
+ * A reusable create/edit dialog shell: title (+ optional description), a
1608
+ * scrollable body for the fields, an inline error, and a Cancel / submit footer
1609
+ * with a saving state. Owns all the dialog chrome so each form only supplies its
1610
+ * fields and an `onSubmit`.
1611
+ */
1612
+ export declare function FormDialog({ open, onOpenChange, title, description, submitLabel, submittingLabel, onSubmit, submitting, canSubmit, error, widthClassName, children, }: FormDialogProps): JSX.Element;
1613
+
1614
+ export declare interface FormDialogProps {
1615
+ open: boolean;
1616
+ onOpenChange: (open: boolean) => void;
1617
+ title: string;
1618
+ description?: ReactNode;
1619
+ submitLabel: string;
1620
+ submittingLabel?: string;
1621
+ onSubmit: () => void;
1622
+ submitting?: boolean;
1623
+ /** Disable the submit button (e.g. required fields not yet filled). */
1624
+ canSubmit?: boolean;
1625
+ /** Inline error rendered above the footer. */
1626
+ error?: string | null;
1627
+ /** Tailwind max-width class for the dialog (default `max-w-2xl`). */
1628
+ widthClassName?: string;
1629
+ children: ReactNode;
1630
+ }
1631
+
1632
+ /**
1633
+ * Compound form-field wrapper — the label + control + error/description
1634
+ * triple, wired up correctly.
1635
+ *
1636
+ * ```tsx
1637
+ * <FormField label="Customer name" required error={errors.name}>
1638
+ * <Input value={name} onChange={e => setName(e.target.value)} />
1639
+ * </FormField>
1640
+ * ```
1641
+ *
1642
+ * Handles three things consumers otherwise have to do by hand:
1643
+ *
1644
+ * 1. `id` + `htmlFor` wiring — auto-generated via `useId()` when
1645
+ * omitted, so the label clicks focus the control.
1646
+ * 2. `aria-describedby` — points the control at the description
1647
+ * and/or error message element(s) for assistive tech.
1648
+ * 3. Error-state propagation — passes `error={!!error}` down to the
1649
+ * child control so its border/ring flip to destructive tokens
1650
+ * without the caller having to duplicate the flag.
1651
+ *
1652
+ * For manual composition (Label + Input as siblings), everything the
1653
+ * FormField does is still reachable as individual primitives. Use FormField
1654
+ * when you want the 90% case in one line.
1655
+ */
1656
+ export declare function FormField({ label, required, error, description, descriptionPlacement, id: providedId, children, className, }: FormFieldProps): JSX.Element;
1657
+
1658
+ export declare interface FormFieldProps {
1659
+ /**
1660
+ * Label text rendered above the control. Pass a string for the common
1661
+ * case; pass a ReactNode for custom content (e.g. a Label with an
1662
+ * adjacent HelpTooltip icon). When omitted, the field renders its
1663
+ * control only — useful for nesting a raw control inside a layout
1664
+ * without forcing a label.
1665
+ */
1666
+ label?: React_2.ReactNode;
1667
+ /**
1668
+ * When true, appends a red `*` marker to the label. No-op without `label`.
1669
+ */
1670
+ required?: boolean;
1671
+ /**
1672
+ * Error message. When non-empty, the control inside is styled with its
1673
+ * error state and this message renders below in destructive color.
1674
+ * Mutually exclusive with `description` (error wins when both are set).
1675
+ */
1676
+ error?: string;
1677
+ /**
1678
+ * Helper text rendered in muted color (field hint, input format, etc).
1679
+ * Placement is controlled by {@link descriptionPlacement}. When placed
1680
+ * `below` (default), an `error` takes the same slot and hides it.
1681
+ */
1682
+ description?: React_2.ReactNode;
1683
+ /**
1684
+ * Where the {@link description} sits relative to the control:
1685
+ * - `below` (default) — the classic helper-text slot beneath the control.
1686
+ * - `above` — a caption between the label and the control, for fields
1687
+ * where the description explains what to pick before you pick it
1688
+ * (e.g. a multi-select of capabilities). An `error` still renders below.
1689
+ */
1690
+ descriptionPlacement?: 'above' | 'below';
1691
+ /**
1692
+ * DOM id for the control. If omitted, `useId()` generates one so
1693
+ * `<label htmlFor>` and `aria-describedby` wire up automatically.
1694
+ */
1695
+ id?: string;
1696
+ /**
1697
+ * The form control. `FormField` clones this child to inject `id`,
1698
+ * `aria-describedby`, and — when `error` is set — the child's
1699
+ * `error` prop. Must be a single element (Input / Textarea / Select
1700
+ * trigger / etc).
1701
+ */
1702
+ children: React_2.ReactElement;
1703
+ className?: string;
1704
+ }
1705
+
1706
+ export declare function GenericAvatar({ size, className }: GenericAvatarProps): JSX.Element;
1707
+
1708
+ export declare interface GenericAvatarProps {
1709
+ /** Size in px. Defaults to 20. */
1710
+ size?: number;
1711
+ className?: string;
1712
+ }
1713
+
1714
+ /**
1715
+ * Maps a numeric value within [min, max] to a warm green→amber background.
1716
+ * Returns `undefined` for zero / degenerate ranges so the caller can skip styling.
1717
+ */
1718
+ export declare function heatColor(value: number, min: number, max: number): string | undefined;
1719
+
1720
+ /**
1721
+ * Sortable, paginated table with heat-colored numeric cells.
1722
+ *
1723
+ * Pair with `buildPeriodColumns` and `buildTotalColumn` for time-series
1724
+ * data, or supply your own `ColumnDef` array for any tabular layout.
1725
+ */
1726
+ export declare function HeatmapTable<T>({ data, columns, pageSize, defaultSort, onRowClick, entityLabel, density, className, }: HeatmapTableProps<T>): JSX.Element;
1727
+
1728
+ export declare interface HeatmapTableProps<T> {
1729
+ data: T[];
1730
+ columns: ColumnDef<T>[];
1731
+ pageSize?: number;
1732
+ defaultSort?: SortingState;
1733
+ onRowClick?: (row: T) => void;
1734
+ /** Label used in pagination ("1–10 of 42 {entityLabel}") and empty state. */
1735
+ entityLabel?: string;
1736
+ /** Tightens cell padding for dense, many-column matrices. */
1737
+ density?: 'default' | 'compact' | 'dense';
1738
+ className?: string;
1739
+ }
1740
+
1741
+ export declare const HoverCard: React_2.FC<HoverCardPrimitive.HoverCardProps>;
1742
+
1743
+ export declare const HoverCardContent: React_2.ForwardRefExoticComponent<Omit<HoverCardPrimitive.HoverCardContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
1744
+
1745
+ export declare const HoverCardTrigger: React_2.ForwardRefExoticComponent<HoverCardPrimitive.HoverCardTriggerProps & React_2.RefAttributes<HTMLAnchorElement>>;
1746
+
1747
+ /**
1748
+ * Click-to-edit date cell. Shows a custom (or default) display until clicked,
1749
+ * then a native date input that commits on change/blur. The closed display is a
1750
+ * render prop so callers can style it (e.g. a due-date heat pill).
1751
+ */
1752
+ export declare function InlineDateCell({ value, onCommit, renderDisplay, placeholder, title, className, }: InlineDateCellProps): JSX.Element;
1753
+
1754
+ export declare interface InlineDateCellProps {
1755
+ /** ISO date string (YYYY-MM-DD) or null. */
1756
+ value: string | null;
1757
+ onCommit: (value: string | null) => void | Promise<void>;
1758
+ /** Closed-state display for the value; defaults to the raw date or a dash. */
1759
+ renderDisplay?: (value: string | null) => ReactNode;
1760
+ placeholder?: string;
1761
+ title?: string;
1762
+ className?: string;
1763
+ }
1764
+
1765
+ /**
1766
+ * Click-to-edit text cell. Reads as plain text until clicked, then becomes a
1767
+ * borderless auto-growing textarea that commits on blur / Enter (⌘/Ctrl+Enter
1768
+ * for multiline) and cancels on Escape. Empty commits to null; `required`
1769
+ * fields revert instead. Domain-agnostic — pairs with any table cell.
1770
+ */
1771
+ export declare function InlineTextCell({ value, onCommit, placeholder, multiline, required, className, displayClassName, }: InlineTextCellProps): JSX.Element;
1772
+
1773
+ export declare interface InlineTextCellProps {
1774
+ value: string | null;
1775
+ onCommit: (value: string | null) => void | Promise<void>;
1776
+ placeholder?: string;
1777
+ multiline?: boolean;
1778
+ required?: boolean;
1779
+ /** Extra classes for the editing textarea. */
1780
+ className?: string;
1781
+ /** Extra classes for the read-only display button. */
1782
+ displayClassName?: string;
1783
+ }
1784
+
1785
+ export declare const Input: React_2.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React_2.RefAttributes<HTMLInputElement>>;
1786
+
1787
+ declare interface InputOwnProps {
1788
+ /**
1789
+ * When truthy, the input renders in its error state — destructive
1790
+ * border, destructive focus ring, and `aria-invalid="true"` for
1791
+ * assistive tech.
1792
+ *
1793
+ * Accepts `boolean` (to toggle styling) or `string` (for convenience
1794
+ * — any non-empty string is truthy). The error *message* itself is
1795
+ * rendered by the caller (or automatically by `<Field error="...">`);
1796
+ * this prop only controls the input's own visual state.
1797
+ */
1798
+ error?: boolean | string;
1799
+ }
1800
+
1801
+ export declare type InputProps = React_2.ComponentProps<"input"> & InputOwnProps;
1802
+
1803
+ /**
1804
+ * Whether a declarative field is inline-editable: it carries an editor
1805
+ * (`options` + `onChange`), hasn't opted out (`readOnly`), and isn't using
1806
+ * the bespoke static `render` escape hatch.
1807
+ */
1808
+ export declare function isFieldEditable(field: TaskFieldDef): boolean;
1809
+
1810
+ export declare function KpiTile({ label, labelAdornment, onLabelClick, value, delta, deltaTone, footer, tone, valueAdornment, pinValue, className, onClick, }: KpiTileProps): JSX.Element;
1811
+
1812
+ /**
1813
+ * KpiTileGrid — opinionated 1-D grid of KPI tiles. Responsive: wraps at small
1814
+ * widths, up to `columns` at wide widths.
1815
+ */
1816
+ export declare function KpiTileGrid({ columns, className, children, }: {
1817
+ columns?: 2 | 3 | 4 | 5;
1818
+ className?: string;
1819
+ children: React_2.ReactNode;
1820
+ }): JSX.Element;
1821
+
1822
+ declare interface KpiTileProps {
1823
+ label: string;
1824
+ /** Inline adornment rendered immediately after the label (e.g. info icon). */
1825
+ labelAdornment?: React_2.ReactNode;
1826
+ /**
1827
+ * When set, the label text becomes a button that fires this handler.
1828
+ * Adornments stay separate (their own buttons handle their own clicks),
1829
+ * so consumers can keep info / remove / log affordances next to a
1830
+ * clickable title without overlapping hit-targets.
1831
+ */
1832
+ onLabelClick?: () => void;
1833
+ value: React_2.ReactNode;
1834
+ /** Delta chip rendered next to the value (e.g. "+12%"). */
1835
+ delta?: React_2.ReactNode;
1836
+ /** Green for positive, red for negative; neutral when omitted. */
1837
+ deltaTone?: 'positive' | 'negative' | 'neutral';
1838
+ /** Optional small line of text below the value (captions, context). */
1839
+ footer?: React_2.ReactNode;
1840
+ /** When 'warn', the tile picks up an amber tint to flag attention. */
1841
+ tone?: KpiTone;
1842
+ /** Inline adornment rendered next to the value (e.g. live dot). */
1843
+ valueAdornment?: React_2.ReactNode;
1844
+ /**
1845
+ * Pin the value+footer block to the bottom of the tile instead of
1846
+ * letting the value float right below the label. Use for tiles where
1847
+ * the value should stay anchored to chart/progress content
1848
+ * regardless of how tall the label gets (e.g. a label that wraps to
1849
+ * two lines). Also drops the default `truncate` on the footer wrapper
1850
+ * since pinned-value consumers typically pass a multi-element footer
1851
+ * (progress bar + chip) where truncation would clip the layout.
1852
+ */
1853
+ pinValue?: boolean;
1854
+ className?: string;
1855
+ onClick?: () => void;
1856
+ }
1857
+
1858
+ /**
1859
+ * KpiTile — compact metric card for the top of dashboards.
1860
+ *
1861
+ * Differs from `MetricCard` in two deliberate ways:
1862
+ * - supports a colored "warn" state (tinted background/border) for KPIs that
1863
+ * themselves carry an attention signal (e.g. "Needs attention: 1")
1864
+ * - exposes `delta`, `deltaTone`, and `footer` slots so the monitoring-style
1865
+ * copy ("+0.4pp vs prev 24h", "5 agents live") renders consistently
1866
+ *
1867
+ * When you only need a static label + value + subtitle, prefer MetricCard.
1868
+ */
1869
+ declare type KpiTone = 'neutral' | 'warn' | 'info';
1870
+
1871
+ export declare const Label: React_2.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React_2.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: ClassProp | undefined) => string> & LabelOwnProps & React_2.RefAttributes<HTMLLabelElement>>;
1872
+
1873
+ export declare function LabeledSelect({ label, icon, value, options, onChange, ariaLabel, prefixHiddenValues, className, }: LabeledSelectProps): JSX.Element;
1874
+
1875
+ export declare interface LabeledSelectOption {
1876
+ value: string;
1877
+ label: string;
1878
+ }
1879
+
1880
+ export declare interface LabeledSelectProps {
1881
+ /** Muted prefix shown before the value, e.g. `"Group by"` / `"Sorted by"`. */
1882
+ label: string;
1883
+ /** Leading glyph (kept small + muted by the pill). */
1884
+ icon?: React_2.ReactNode;
1885
+ value: string;
1886
+ options: LabeledSelectOption[];
1887
+ onChange: (value: string) => void;
1888
+ /** Accessible name for the trigger. Defaults to `label`. */
1889
+ ariaLabel?: string;
1890
+ /**
1891
+ * Values for which the muted prefix is hidden — the pill shows just the
1892
+ * value. Use for "off"/"none" states where the prefix reads awkwardly
1893
+ * (e.g. `'none'` → "No grouping", not "Group by No grouping").
1894
+ */
1895
+ prefixHiddenValues?: readonly string[];
1896
+ className?: string;
1897
+ }
1898
+
1899
+ declare interface LabelOwnProps {
1900
+ /**
1901
+ * When true, appends a red `*` marker after the label text. Prefer this
1902
+ * over rendering `<RequiredMarker />` manually — keeps the marker
1903
+ * positioning consistent and makes required-ness a declarative prop
1904
+ * at the call site. Also consumed by `<FormField required>` which
1905
+ * forwards it through to the label automatically.
1906
+ */
1907
+ required?: boolean;
1908
+ }
1909
+
1910
+ declare type LegendPayloadItem = {
1911
+ value?: string | number;
1912
+ dataKey?: string | number;
1913
+ color?: string;
1914
+ };
1915
+
1916
+ export declare function LineSparklineCell({ values, width, height, scaleMax, color, label, className, }: LineSparklineCellProps): JSX.Element;
1917
+
1918
+ declare interface LineSparklineCellProps {
1919
+ values: number[];
1920
+ width?: number;
1921
+ height?: number;
1922
+ /** Y-axis max — defaults to 100 for percent metrics. */
1923
+ scaleMax?: number;
1924
+ color?: string;
1925
+ label?: React_2.ReactNode;
1926
+ className?: string;
1927
+ }
1928
+
1929
+ /**
1930
+ * Recharts area chart for a metric's record series — the shared primitive behind
1931
+ * the metric sparkline (cards) and the metric detail view. Mirrors the Jarvis
1932
+ * metric-card chart (gradient area, monotone line) so metric viz reads the same
1933
+ * everywhere. Lives in atlas-ui so standalone artifacts can reuse it without
1934
+ * pulling chart.js.
1935
+ */
1936
+ export declare function MetricAreaChart({ points, color, height, variant, valueFormatter, dateFormatter, className, }: MetricAreaChartProps): JSX.Element;
1937
+
1938
+ export declare interface MetricAreaChartPoint {
1939
+ t: string;
1940
+ v: number;
1941
+ }
1942
+
1943
+ export declare interface MetricAreaChartProps {
1944
+ points: MetricAreaChartPoint[];
1945
+ /** Stroke / fill color for the area. Defaults to the semantic "positive series" token. */
1946
+ color?: string;
1947
+ height?: number;
1948
+ /** `spark` = compact, axis-less (cards); `full` = axes + grid + tooltip. */
1949
+ variant?: 'spark' | 'full';
1950
+ valueFormatter?: (value: number) => string;
1951
+ dateFormatter?: (iso: string) => string;
1952
+ className?: string;
1953
+ }
1954
+
1955
+ export declare function MetricCard({ label, value, subtitle, compact, className, onClick, children }: MetricCardProps): JSX.Element;
1956
+
1957
+ declare interface MetricCardProps {
1958
+ label: string;
1959
+ value: ReactNode;
1960
+ subtitle?: ReactNode;
1961
+ compact?: boolean;
1962
+ className?: string;
1963
+ onClick?: () => void;
1964
+ children?: ReactNode;
1965
+ }
1966
+
1967
+ export declare function MetricGrid({ columns, children, className }: MetricGridProps): JSX.Element;
1968
+
1969
+ declare interface MetricGridProps {
1970
+ columns?: 2 | 3 | 4 | 5;
1971
+ children: ReactNode;
1972
+ className?: string;
1973
+ }
1974
+
1975
+ export declare function MultiSelect({ label, countLabel, options, selected, onChange, searchPlaceholder, emptyMessage, maxStackedIcons, hideWhenEmpty, className, }: MultiSelectProps): JSX.Element | null;
1976
+
1977
+ /**
1978
+ * Fields shared by `MultiSelect` (trigger + popover) and the standalone
1979
+ * `MultiSelectList` body: the options and how selection is read/written.
1980
+ * Trigger-only and list-only props live on the respective interfaces.
1981
+ */
1982
+ declare interface MultiSelectCoreProps {
1983
+ options: MultiSelectOption[];
1984
+ selected: string[];
1985
+ onChange: (values: string[]) => void;
1986
+ /** Placeholder for the inline search input. */
1987
+ searchPlaceholder?: string;
1988
+ /** Empty-state message when the search matches nothing. */
1989
+ emptyMessage?: string;
1990
+ }
1991
+
1992
+ /**
1993
+ * MultiSelectList — the searchable, checkbox-list body of `MultiSelect`,
1994
+ * extracted so it can be embedded outside the default Popover trigger.
1995
+ * `MultiSelect` renders it inside its own PopoverContent; other callers
1996
+ * (e.g. a Linear-style filter built on a Radix DropdownMenu submenu) can
1997
+ * drop it into any floating container and get the same rows, search,
1998
+ * pinned grouping, and icon-column behavior.
1999
+ */
2000
+ export declare function MultiSelectList({ options, selected, onChange, searchPlaceholder, emptyMessage, query, onQueryChange, className, searchable, }: MultiSelectListProps): JSX.Element;
2001
+
2002
+ declare interface MultiSelectListProps extends MultiSelectCoreProps {
2003
+ /** Controlled search query. Omit to let the list manage its own. */
2004
+ query?: string;
2005
+ onQueryChange?: (query: string) => void;
2006
+ className?: string;
2007
+ /** Show the search input. Default true (see `SelectListShellProps`). */
2008
+ searchable?: boolean;
2009
+ }
2010
+
2011
+ /**
2012
+ * MultiSelect — a filter-bar facet with a searchable multi-select
2013
+ * dropdown. Modeled after Linear's filter pills: stacked icons in the
2014
+ * trigger when active, inline X to clear, searchable cmdk list with
2015
+ * optional pinned (virtual) rows like "No assignee".
2016
+ *
2017
+ * Composition:
2018
+ * - Popover (Radix) for the floating container.
2019
+ * - Command (cmdk) for the searchable list and keyboard nav.
2020
+ * - Checkbox (Radix) for per-row selection state.
2021
+ *
2022
+ * Visual contract for the trigger mirrors `SelectTrigger` (h-9, rounded-sm,
2023
+ * border + bg-field) so a toolbar of MultiSelect + Input + Select reads
2024
+ * as one coherent control row. Active state stacks up to `maxStackedIcons`
2025
+ * selected-row icons (with a generic silhouette for icon-less rows) and
2026
+ * shows "{count} {countLabel}" alongside.
2027
+ *
2028
+ * Composition safety: the active trigger keeps `border-input` (NOT
2029
+ * `border-foreground`). `--foreground` is near-black, so swapping to
2030
+ * it on selection produced a heavy black outline that competed with
2031
+ * real CTAs. Active state is conveyed by the stacked icons + bold
2032
+ * count + X, not by the chrome. See DESIGN.md "Composition safety".
2033
+ */
2034
+ export declare interface MultiSelectOption {
2035
+ /** Stable identifier — what shows up in `selected` and `onChange`. */
2036
+ value: string;
2037
+ /** Display text for the row and the cmdk search index. */
2038
+ label: string;
2039
+ /**
2040
+ * Optional secondary line beneath the label (e.g. an email under a name).
2041
+ * Disambiguates rows that share a label — two people with the same name.
2042
+ * Truncates like the label. Pure presentational — not searched (add the
2043
+ * same text to `keywords` to also match on it).
2044
+ */
2045
+ sublabel?: ReactNode;
2046
+ /**
2047
+ * Optional leading visual (e.g. avatar). Renders before the label in
2048
+ * the row, and stacks in the trigger when this option is selected.
2049
+ * Size yourself to ~20px square so the row vertical rhythm holds.
2050
+ */
2051
+ icon?: ReactNode;
2052
+ /**
2053
+ * Optional right-aligned secondary text (e.g. "8 issues"). Pure
2054
+ * presentational — not searched.
2055
+ */
2056
+ meta?: ReactNode;
2057
+ /**
2058
+ * Pin this option above a separator at the top of the list (e.g.
2059
+ * "No assignee", "Current user"). Pinned options render in their
2060
+ * caller-provided order regardless of search ranking.
2061
+ */
2062
+ pinned?: boolean;
2063
+ /**
2064
+ * Extra strings to include in the search index alongside `label`.
2065
+ * Useful when the visible label is a name but you also want to
2066
+ * match an email or alias.
2067
+ */
2068
+ keywords?: string[];
2069
+ }
2070
+
2071
+ declare interface MultiSelectProps extends MultiSelectCoreProps {
2072
+ /** Inactive trigger label (e.g. "People", "Assignee"). */
2073
+ label: string;
2074
+ /**
2075
+ * Plural noun shown after the count in the active trigger
2076
+ * ("3 {countLabel}"). Defaults to `label.toLowerCase()`.
2077
+ */
2078
+ countLabel?: string;
2079
+ /**
2080
+ * Max number of selected-row icons to stack in the trigger. Beyond
2081
+ * this, additional selected rows roll up into the count. Defaults
2082
+ * to 3 (matches Linear's behavior).
2083
+ */
2084
+ maxStackedIcons?: number;
2085
+ /**
2086
+ * Hide the trigger entirely when `options` is empty. Defaults to
2087
+ * true — empty filter chips clutter a toolbar. Pass `false` when
2088
+ * the chip should be visible (e.g. as an affordance for a list
2089
+ * that hasn't loaded yet).
2090
+ */
2091
+ hideWhenEmpty?: boolean;
2092
+ className?: string;
2093
+ }
2094
+
2095
+ /**
2096
+ * Snapshot of every matching cache entry, captured in `onMutate` for rollback.
2097
+ */
2098
+ export declare interface OptimisticListContext<TCache> {
2099
+ previous: [QueryKey, TCache | undefined][];
2100
+ optimisticMutationId?: number;
2101
+ queryKeyHash?: string;
2102
+ }
2103
+
2104
+ /**
2105
+ * Snapshot captured in `onMutate`, used to roll the cache back on error.
2106
+ */
2107
+ export declare interface OptimisticResourceContext<TData> {
2108
+ previous: TData | undefined;
2109
+ optimisticMutationId?: number;
2110
+ queryKeyHash?: string;
2111
+ }
2112
+
2113
+ /**
2114
+ * A small, reusable inline picker: the current value renders as a clickable
2115
+ * badge/dot that opens a popover of the actual options (each shown with its own
2116
+ * swatch + a check on the active one). A nicer, on-brand replacement for a
2117
+ * native <select> for short, visual enum fields like status and health.
2118
+ */
2119
+ export declare function OptionPicker<T extends string>({ value, options, onChange, children, ariaLabel, align, triggerClassName, contentClassName, }: OptionPickerProps<T>): JSX.Element;
2120
+
2121
+ export declare interface OptionPickerProps<T extends string> {
2122
+ value: T;
2123
+ options: PickerOption<T>[];
2124
+ onChange: (value: T) => void;
2125
+ /** Closed-state trigger content (the badge / dot shown in the row). */
2126
+ children: ReactNode;
2127
+ ariaLabel?: string;
2128
+ align?: 'start' | 'center' | 'end';
2129
+ /** Extra classes for the trigger button (e.g. padding around a small dot). */
2130
+ triggerClassName?: string;
2131
+ contentClassName?: string;
2132
+ }
2133
+
2134
+ export declare function PageSkeleton({ variant, className }: PageSkeletonProps): JSX.Element;
2135
+
2136
+ export declare interface PageSkeletonProps {
2137
+ variant?: PageSkeletonVariant;
2138
+ className?: string;
2139
+ }
2140
+
2141
+ export declare type PageSkeletonVariant = 'default' | 'list' | 'detail' | 'dashboard';
2142
+
2143
+ export declare function pctChange(current: number, previous: number): number | null;
2144
+
2145
+ export declare function PercentCell({ value, dangerBelow, className, }: {
2146
+ value: number | null | undefined;
2147
+ dangerBelow?: number;
2148
+ className?: string;
2149
+ }): JSX.Element;
2150
+
2151
+ export declare interface PickerOption<T extends string> {
2152
+ value: T;
2153
+ /** Optional text label; omit when the swatch already reads as the option. */
2154
+ label?: string;
2155
+ /** The option's visual — a colored badge, dot, etc. */
2156
+ swatch: ReactNode;
2157
+ }
2158
+
2159
+ export declare const Popover: React_2.FC<PopoverPrimitive.PopoverProps>;
2160
+
2161
+ export declare const PopoverAnchor: React_2.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React_2.RefAttributes<HTMLDivElement>>;
2162
+
2163
+ export declare const PopoverContent: React_2.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2164
+
2165
+ export declare const PopoverTrigger: React_2.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
2166
+
2167
+ export declare const PortalContainerContext: React_2.Context<PortalContainerContextValue>;
2168
+
2169
+ declare interface PortalContainerContextValue {
2170
+ container: HTMLElement | null;
2171
+ appClassName?: string;
2172
+ }
2173
+
2174
+ export declare function PortalContainerProvider({ children, appClassName, }: {
2175
+ children: React_2.ReactNode;
2176
+ appClassName?: string;
2177
+ }): JSX.Element;
2178
+
2179
+ export declare type ProColumnDef<T> = ColumnDef<T, unknown> & {
2180
+ meta?: ProColumnMeta;
2181
+ };
2182
+
2183
+ /**
2184
+ * ProDataTable — opinionated extension of the shadcn table for dashboard-style
2185
+ * lists. Layered on top of `DataTable` so apps can opt into richer chrome:
2186
+ * - toolbar slot (search + filters + extras) above the header row
2187
+ * - uppercase, compact header cells with sort arrows (stateful)
2188
+ * - sticky-left columns for "name" identity (horizontal-scroll safe)
2189
+ * - selected/hover row styling + right-aligned numeric cells
2190
+ * - composable cell primitives exported from this module
2191
+ * (AvatarTextCell, SparklineCell, StatusDotBadge, ScoreBarCell, etc.)
2192
+ *
2193
+ * Consumers describe columns with TanStack's `ColumnDef<T>`. The `meta` field
2194
+ * on each column is extended with optional presentational hints that live
2195
+ * with the column definition (alignment, sticky, width, header tooltip).
2196
+ */
2197
+ /**
2198
+ * Column meta extension. Narrow, opt-in; backwards compatible with ColumnDef.
2199
+ *
2200
+ * Sizing model (rebuilt):
2201
+ * - `minWidth` — hard lower bound. The cell never renders narrower than
2202
+ * this, even when the table is squeezed. This is what
2203
+ * triggers horizontal scroll when the sum of minimums
2204
+ * exceeds the container. Defaults to `width` when only
2205
+ * `width` is supplied, else `DEFAULT_MIN_WIDTH`.
2206
+ * - `width` — preferred/fixed width in px. Use for compact utility
2207
+ * columns (status pills, action menus, numeric cells).
2208
+ * A column with `width` but no `grow` stays locked to
2209
+ * `width` when the container is wide.
2210
+ * - `grow` — when true, the column claims remaining horizontal space.
2211
+ * Use for identity columns (name + subtitle) so they
2212
+ * flex with the viewport. Multiple `grow` columns share
2213
+ * remaining space proportionally.
2214
+ *
2215
+ * The table itself uses `table-layout: auto` + a computed `min-width` that
2216
+ * equals the sum of per-column `minWidth`s plus container padding — so when
2217
+ * the viewport shrinks past that threshold, horizontal scroll kicks in and
2218
+ * every column stays at its own minimum instead of collapsing below it.
2219
+ */
2220
+ /**
2221
+ * Native per-column filter config. Attach to a column's `meta.filter` to opt
2222
+ * that column into the toolbar filter menu (a single funnel button that lists
2223
+ * every filterable column as a nested facet — the standard Atlas `FilterMenu`).
2224
+ *
2225
+ * The table owns the filtering: it wires the facet to TanStack's column-filter
2226
+ * state and drops rows whose cell value doesn't match. This is a client-side
2227
+ * feature — it's ignored under `manualPagination` (the parent already paged the
2228
+ * rows server-side, so it owns filtering too).
2229
+ *
2230
+ * - `type: 'multi'` — checklist; a row matches if its value is in the set.
2231
+ * - `type: 'single'` — pick one value; a row matches if it equals the pick.
2232
+ *
2233
+ * `options` is optional: when omitted the table derives the distinct values of
2234
+ * the column from `data` (value used verbatim as the label). Supply `options`
2235
+ * to control the option set, ordering, or human labels (e.g. map a status code
2236
+ * to a readable name). Matching always compares against the column's own cell
2237
+ * value coerced to a string, so option `value`s must equal that string form.
2238
+ */
2239
+ export declare type ProColumnFilter = {
2240
+ type: 'multi';
2241
+ /** Facet label in the menu. Defaults to the column's string header. */
2242
+ label?: string;
2243
+ /** Explicit options. Omit to auto-derive distinct values from `data`. */
2244
+ options?: MultiSelectOption[];
2245
+ /** Search-input placeholder inside the facet submenu. Defaults to the label. */
2246
+ searchPlaceholder?: string;
2247
+ } | {
2248
+ type: 'single';
2249
+ label?: string;
2250
+ options?: MultiSelectOption[];
2251
+ searchPlaceholder?: string;
2252
+ /**
2253
+ * Value that counts as "no filter" (e.g. an `'all'` default). When the
2254
+ * pick equals this, the facet is inactive and "Clear all" resets to it.
2255
+ */
2256
+ defaultValue?: string;
2257
+ };
2258
+
2259
+ /**
2260
+ * Discriminated union on `sticky`. The variants enforce at compile time that
2261
+ * `{ sticky: true, grow: true }` can't be declared — callers get a TS error
2262
+ * instead of silent layout corruption.
2263
+ */
2264
+ export declare type ProColumnMeta = ProColumnMetaSticky | ProColumnMetaNonSticky;
2265
+
2266
+ /**
2267
+ * Fields shared by every column regardless of sticky / grow.
2268
+ *
2269
+ * `sticky` and `grow` are intentionally omitted here — they're added by the
2270
+ * two `ProColumnMeta` variants below to form a discriminated union that makes
2271
+ * `{ sticky: true, grow: true }` unrepresentable.
2272
+ */
2273
+ declare interface ProColumnMetaBase {
2274
+ align?: 'left' | 'right' | 'center';
2275
+ /** Preferred pixel width. Locks the column unless `grow` is also set. */
2276
+ width?: number;
2277
+ /** Lower bound — column never renders narrower than this. */
2278
+ minWidth?: number;
2279
+ /** Header cell monospace / text hint. Body follows column cell content. */
2280
+ headerMono?: boolean;
2281
+ /** Extra className applied to the <th>. */
2282
+ headerClassName?: string;
2283
+ /** Extra className applied to every <td>. */
2284
+ cellClassName?: string;
2285
+ /** Hide default sort indicator even when column is sortable. */
2286
+ hideSortIndicator?: boolean;
2287
+ /**
2288
+ * Opt this specific column out of user resizing when the table is rendered
2289
+ * with `resizableColumns`. Defaults to resizable. Set `false` for columns
2290
+ * whose width is intentionally fixed (action / overflow-menu columns, tight
2291
+ * numeric cells) so they don't sprout a drag handle.
2292
+ */
2293
+ enableResizing?: boolean;
2294
+ /**
2295
+ * Mark a column whose cells carry their own control (checkbox, status
2296
+ * toggle, delete button). Clicks anywhere in the cell — including the
2297
+ * padding around the control — stop at the cell instead of bubbling to
2298
+ * the row's `onRowClick`, so a near-miss on the control can't navigate
2299
+ * away. The control itself no longer needs its own `stopPropagation`.
2300
+ */
2301
+ interactive?: boolean;
2302
+ /**
2303
+ * Opt this column into the toolbar filter menu. See {@link ProColumnFilter}.
2304
+ * Client-side only — ignored under `manualPagination`.
2305
+ */
2306
+ filter?: ProColumnFilter;
2307
+ }
2308
+
2309
+ /**
2310
+ * Column meta for a non-sticky column. `grow: true` opts the column into
2311
+ * absorbing remaining horizontal space (identity / title columns typically
2312
+ * want this; utility columns do not).
2313
+ */
2314
+ declare interface ProColumnMetaNonSticky extends ProColumnMetaBase {
2315
+ sticky?: false;
2316
+ /** When true, column flexes to fill remaining horizontal space. */
2317
+ grow?: boolean;
2318
+ }
2319
+
2320
+ /**
2321
+ * Column meta for a sticky (pinned) column.
2322
+ *
2323
+ * Sticky columns pin to EITHER the left or right edge of the scroll
2324
+ * region. Both sides support a contiguous block — for left, the block
2325
+ * starts at the leftmost column; for right, at the rightmost. The first
2326
+ * non-sticky column ends the chain on each side (dev-mode warning if a
2327
+ * sticky declaration follows the break).
2328
+ *
2329
+ * API:
2330
+ * - `sticky: true` → equivalent to `sticky: 'left'` (backward compat)
2331
+ * - `sticky: 'left'` → pin to the left edge. Common for identity
2332
+ * columns (name, row ID).
2333
+ * - `sticky: 'right'`→ pin to the right edge. Common for action
2334
+ * columns (overflow menu, status).
2335
+ *
2336
+ * The innermost pinned cell on each side (rightmost of the left block,
2337
+ * leftmost of the right block) gets an edge shadow when the scrollable
2338
+ * content has room to move away from that side — i.e., left-edge shadow
2339
+ * appears after the user scrolls right past the start, right-edge shadow
2340
+ * appears until the user scrolls to the end. The shadow indicates that
2341
+ * content is currently being occluded BY the pinned cell.
2342
+ *
2343
+ * `grow` is disallowed on sticky columns — a grown sticky column renders at
2344
+ * `width: 100%` which both breaks the cumulative offset math used to pin
2345
+ * subsequent sticky columns and makes the pinned region balloon to fill
2346
+ * the viewport. Set an explicit `width` (and optional `minWidth`) instead.
2347
+ */
2348
+ declare interface ProColumnMetaSticky extends ProColumnMetaBase {
2349
+ sticky: true | 'left' | 'right';
2350
+ /**
2351
+ * @deprecated `grow` is not allowed on sticky columns. Use `width` +
2352
+ * `minWidth` to give the sticky column a deterministic size.
2353
+ */
2354
+ grow?: never;
2355
+ }
2356
+
2357
+ export declare function ProDataTable<T>({ columns, data, selectable, getRowId, selectedRowIds, onSelectionChange, enableRowSelection, rowActions, getRowLabel, searchable, filters, toolbar, actions, footer, pageSize, disablePagination, resizableColumns, columnSizingStorageKey, defaultSort, manualPagination, rowCount, pageIndex, onPageChange, manualSorting, sorting: controlledSorting, onSortingChange, manualFiltering, columnFilters: controlledColumnFilters, onColumnFiltersChange, loading, emptyMessage, onRowClick, rowHref, rowClassName, minWidth, height, bordered, variant, ariaLabel, className, }: ProDataTableProps<T>): JSX.Element;
2358
+
2359
+ /**
2360
+ * Native segmented filter for the toolbar (e.g. All / Groups / People). The
2361
+ * table renders the pills; the caller owns the active value and the actual
2362
+ * filtering of `data` (filters are frequently heterogeneous, so the predicate
2363
+ * stays with the caller rather than being baked in).
2364
+ */
2365
+ declare interface ProDataTableFilters {
2366
+ value: string;
2367
+ onChange: (value: string) => void;
2368
+ options: ReadonlyArray<{
2369
+ id: string;
2370
+ label: string;
2371
+ }>;
2372
+ ariaLabel?: string;
2373
+ }
2374
+
2375
+ export declare function ProDataTablePagination<T>({ table, className, totalLabel, total: totalOverride }: ProDataTablePaginationProps<T>): JSX.Element;
2376
+
2377
+ declare interface ProDataTablePaginationProps<T> {
2378
+ table: Table_2<T>;
2379
+ className?: string;
2380
+ totalLabel?: (args: {
2381
+ from: number;
2382
+ to: number;
2383
+ total: number;
2384
+ }) => React_2.ReactNode;
2385
+ /**
2386
+ * True total across all pages. Required for manual (server) pagination, where
2387
+ * the client row model only holds the current page — omit for client-side
2388
+ * pagination, which derives the total from the filtered row model.
2389
+ */
2390
+ total?: number;
2391
+ }
2392
+
2393
+ declare interface ProDataTableProps<T> {
2394
+ columns: ProColumnDef<T>[];
2395
+ data: T[];
2396
+ /**
2397
+ * Render a leading, left-pinned selection checkbox column (with a select-all
2398
+ * header), backed by TanStack's row-selection model. The table owns the
2399
+ * column and the state — pass `getRowId` for stable keys and read the result
2400
+ * via `onSelectionChange`, or drive it with `selectedRowIds`. Prefer this
2401
+ * over hand-rolling a checkbox column + selection `Set`.
2402
+ */
2403
+ selectable?: boolean;
2404
+ /**
2405
+ * Stable id per row. Strongly recommended with `selectable` — without it
2406
+ * selection is keyed by row index and won't survive sort/filter/paging.
2407
+ */
2408
+ getRowId?: (row: T) => string;
2409
+ /** Controlled selection (row ids). Omit for uncontrolled; read via `onSelectionChange`. */
2410
+ selectedRowIds?: string[];
2411
+ /** Called with the selected row ids whenever selection changes. */
2412
+ onSelectionChange?: (ids: string[]) => void;
2413
+ /** Gate which rows can be selected. Defaults to all rows selectable. */
2414
+ enableRowSelection?: (row: T) => boolean;
2415
+ /**
2416
+ * Render a trailing, right-pinned overflow (⋯) menu, resolved per row. Return
2417
+ * the actions for that row — an empty array (or all `hidden`) renders no
2418
+ * button. Destructive actions automatically drop below a divider. Prefer this
2419
+ * over hand-rolling an end-of-row action button + `DropdownMenu`.
2420
+ */
2421
+ rowActions?: (row: T) => RowAction[];
2422
+ /**
2423
+ * Human-readable per-row label for accessibility. When set, the injected
2424
+ * selection checkbox and row-actions (⋯) trigger get row-specific aria-labels
2425
+ * ("Select <label>" / "Actions for <label>") instead of generic repeated ones,
2426
+ * so screen-reader users can tell which record they're acting on. Recommended
2427
+ * whenever `selectable` or `rowActions` is used.
2428
+ */
2429
+ getRowLabel?: (row: T) => string;
2430
+ /**
2431
+ * Enable a client-side search input in the table header. Filters rows by
2432
+ * concatenating every cell's accessor value (default) or via a custom
2433
+ * accessor. Pass `true` for defaults, or an object to override.
2434
+ */
2435
+ searchable?: boolean | ProDataTableSearchable<T>;
2436
+ /** Native segmented filter pills rendered in the toolbar. */
2437
+ filters?: ProDataTableFilters;
2438
+ /** Custom filter controls rendered next to the search input. */
2439
+ toolbar?: React_2.ReactNode;
2440
+ /**
2441
+ * Action buttons pinned to the right edge of the toolbar (e.g. "New", an
2442
+ * export button, an overflow menu). Kept in a dedicated right-aligned slot —
2443
+ * separate from `toolbar` (left-aligned custom controls) — so primary
2444
+ * actions read as distinct from the search/filter chrome. Rendering any
2445
+ * toolbar content (search, filters, `toolbar`, or `actions`) shows the bar.
2446
+ */
2447
+ actions?: React_2.ReactNode;
2448
+ /** Footer rendered below the table (e.g. custom summary row). */
2449
+ footer?: React_2.ReactNode;
2450
+ pageSize?: number;
2451
+ /** Disable pagination entirely (small, known datasets). */
2452
+ disablePagination?: boolean;
2453
+ /**
2454
+ * Let the user drag column borders to resize them. A grab handle appears on
2455
+ * the right edge of every header cell (except columns with
2456
+ * `meta.enableResizing: false`), drag to resize live, double-click a handle
2457
+ * to reset that column to its default width. Only applies to the `table`
2458
+ * variant (the `list` variant has no header to grab).
2459
+ *
2460
+ * Under resize mode, non-grow columns render at deterministic px widths.
2461
+ * A `grow` column keeps its flex behavior (absorbing surplus container
2462
+ * width) until the user drags it — at which point it becomes a
2463
+ * deterministic px width like the rest; double-click reset restores the
2464
+ * flex behavior. Keeping one grow column is what stops `table-layout:
2465
+ * fixed` from distributing surplus across every column (which would
2466
+ * desync sticky-offset math and inflate tight utility columns).
2467
+ */
2468
+ resizableColumns?: boolean;
2469
+ /**
2470
+ * When set alongside `resizableColumns`, per-column widths persist to
2471
+ * `localStorage` under this key so a user's sizing survives reloads and
2472
+ * re-mounts. Omit for session-only (in-memory) resizing. Failures to read
2473
+ * or write storage are swallowed — resizing still works, it just won't
2474
+ * persist.
2475
+ */
2476
+ columnSizingStorageKey?: string;
2477
+ defaultSort?: SortingState;
2478
+ /**
2479
+ * Server-side (manual) pagination. When set, the table renders `data` as-is
2480
+ * (already one server page) instead of slicing client-side, and reports
2481
+ * position/total from `rowCount` + the controlled `pageIndex`. The pager's
2482
+ * prev/next call `onPageChange` with the new zero-based page index; the parent
2483
+ * refetches. Omit for the default client-side pagination — existing callers
2484
+ * are unaffected.
2485
+ */
2486
+ manualPagination?: boolean;
2487
+ /** Total row count across all server pages (manual pagination only). */
2488
+ rowCount?: number;
2489
+ /** Controlled zero-based page index (manual pagination only). */
2490
+ pageIndex?: number;
2491
+ /** Called with the new zero-based page index when the pager advances (manual pagination only). */
2492
+ onPageChange?: (pageIndex: number) => void;
2493
+ /**
2494
+ * Server-side (manual) sorting. When set, header clicks call `onSortingChange`
2495
+ * instead of reordering client rows — the parent maps the sort to its query
2496
+ * and refetches. Pair with `sorting` (controlled state). Columns that have no
2497
+ * server-sortable backing should set `enableSorting: false`.
2498
+ */
2499
+ manualSorting?: boolean;
2500
+ /** Controlled sort state (manual sorting only). */
2501
+ sorting?: SortingState;
2502
+ /** Called with the next sort state on a header click (manual sorting only). */
2503
+ onSortingChange?: (sorting: SortingState) => void;
2504
+ /**
2505
+ * Server-side (manual) column filtering. When set, the toolbar filter funnel
2506
+ * renders even under `manualPagination`, but the table does NOT drop rows
2507
+ * itself — it reflects the controlled `columnFilters` in the facets/pills and
2508
+ * emits `onColumnFiltersChange` so the parent maps them to its query and
2509
+ * refetches. Filterable columns MUST supply explicit `meta.filter.options`
2510
+ * (distinct values can't be auto-derived from a single server page). Pair
2511
+ * with `columnFilters`; the parent should reset `pageIndex` to 0 on change.
2512
+ */
2513
+ manualFiltering?: boolean;
2514
+ /** Controlled column-filter state (manual filtering only). */
2515
+ columnFilters?: ColumnFiltersState;
2516
+ /** Called with the next column-filter state when a facet changes (manual filtering only). */
2517
+ onColumnFiltersChange?: (filters: ColumnFiltersState) => void;
2518
+ /**
2519
+ * Dim the table body and show a centered spinner — for server-driven tables
2520
+ * during a refetch (search/filter/sort/page change), so the grid doesn't
2521
+ * flash empty or stale between requests.
2522
+ */
2523
+ loading?: boolean;
2524
+ emptyMessage?: React_2.ReactNode;
2525
+ onRowClick?: (row: T) => void;
2526
+ /**
2527
+ * Per-row destination URL. When provided alongside `onRowClick`, plain
2528
+ * clicks still call `onRowClick` (SPA navigate), but Cmd/Ctrl-click,
2529
+ * middle-click, and Shift-click open the URL in a new tab/window — same
2530
+ * semantics as a real `<a>` element. Without this prop, modifier-clicks
2531
+ * fall through to the plain handler and the user can't multi-open rows.
2532
+ */
2533
+ rowHref?: (row: T) => string | undefined;
2534
+ rowClassName?: (row: Row<T>) => string | undefined;
2535
+ /**
2536
+ * Override the computed table min-width. By default, the component adds up
2537
+ * each column's `minWidth` + horizontal padding to derive the threshold
2538
+ * where horizontal scroll should kick in. Set this only if you need to
2539
+ * force a larger minimum (e.g. to reserve room for a floating column).
2540
+ */
2541
+ minWidth?: number;
2542
+ /**
2543
+ * Explicit height for the table card. Overrides the default fill-parent
2544
+ * behavior. Accepts any CSS length (`'600px'`, `'70vh'`,
2545
+ * `'calc(100vh - 12rem)'`) or a pixel `number`.
2546
+ *
2547
+ * By default the card grows to fill its parent's available height via
2548
+ * `flex-1` (for flex-column parents like DashboardShell body) and
2549
+ * `h-full` (for fixed-height parents). The toolbar stays pinned at
2550
+ * the top of the card, the body scrolls internally, and the header
2551
+ * sticks to the top of the scroll region.
2552
+ */
2553
+ height?: string | number;
2554
+ /** Wrap the whole thing in a rounded card. Defaults to true. */
2555
+ bordered?: boolean;
2556
+ /**
2557
+ * `table` (default) renders column headers (sortable). `list` hides the
2558
+ * header row for a clean borderless list — rows still carry the `border`
2559
+ * inset dividers. Use for identity lists (people / groups) where column
2560
+ * labels are noise. Sorting via header click isn't available in `list`;
2561
+ * pass `defaultSort` for a fixed order.
2562
+ */
2563
+ variant?: 'table' | 'list';
2564
+ /** Shown when the table is selected in a multi-table shell (optional). */
2565
+ ariaLabel?: string;
2566
+ className?: string;
2567
+ }
2568
+
2569
+ /**
2570
+ * Built-in search config for ProDataTable. The table owns the input and
2571
+ * filters rows client-side via TanStack's globalFilter. Pass `true` for a
2572
+ * default search bar, or an object to customize placeholder / matcher.
2573
+ */
2574
+ declare interface ProDataTableSearchable<T> {
2575
+ placeholder?: string;
2576
+ /**
2577
+ * Optional extractor used when the default includes-string matcher isn't
2578
+ * enough (e.g. fuzzy search, concatenating several fields). Return the
2579
+ * searchable text representation for a row. Client-side search only.
2580
+ */
2581
+ accessor?: (row: T) => string;
2582
+ /** Width of the input in px. Defaults to 240. */
2583
+ width?: number;
2584
+ /**
2585
+ * Controlled (server-side) search. When `onChange` is provided the table
2586
+ * stops filtering client-side and hands the debounced query to the parent,
2587
+ * which refetches — pair with `manualPagination`. Omit both for the default
2588
+ * client-side filter over the loaded `data`.
2589
+ *
2590
+ * Once `value` is provided it is the source of truth for the input:
2591
+ * keystrokes show instantly, but as soon as the debounce emits, the field
2592
+ * renders `value` again. So rejecting or rewriting the query in `onChange` is
2593
+ * reflected in the box rather than leaving a stale private copy behind, and a
2594
+ * `value` the parent changes on its own cancels any unsent keystroke.
2595
+ *
2596
+ * Set your state to the emitted value synchronously inside `onChange` — the
2597
+ * normal controlled-input contract. A `value` that only catches up after a
2598
+ * round-trip leaves the field showing the pre-emit query until it does, and
2599
+ * anything typed while that update is in flight is dropped when it lands.
2600
+ */
2601
+ value?: string;
2602
+ onChange?: (value: string) => void;
2603
+ /**
2604
+ * Debounce before a controlled `onChange` fires, in ms. Default 300.
2605
+ *
2606
+ * `0` (or negative) means no debounce at all — `onChange` fires inline on the
2607
+ * keystroke, with no timer. Use it for search that filters rows already in
2608
+ * memory: a debounce only adds keystroke lag there, and emitting inline also
2609
+ * means the field is never showing a query the parent has not been handed.
2610
+ */
2611
+ debounceMs?: number;
2612
+ }
2613
+
2614
+ export declare function ProDataTableToolbar({ className, children, }: {
2615
+ className?: string;
2616
+ children?: React_2.ReactNode;
2617
+ }): JSX.Element;
2618
+
2619
+ export declare function ProgressBar({ value, max, color, className }: ProgressBarProps): JSX.Element;
2620
+
2621
+ export declare function ProgressBarCell({ value, total, label, tone, className, }: ProgressBarCellProps): JSX.Element;
2622
+
2623
+ declare interface ProgressBarCellProps {
2624
+ value: number;
2625
+ total: number;
2626
+ label?: React_2.ReactNode;
2627
+ /** Tone applied to the fill bar. Defaults to neutral ink. */
2628
+ tone?: 'neutral' | 'running' | 'success' | 'danger';
2629
+ className?: string;
2630
+ }
2631
+
2632
+ declare interface ProgressBarProps {
2633
+ value: number;
2634
+ max?: number;
2635
+ color?: string;
2636
+ className?: string;
2637
+ }
2638
+
2639
+ /**
2640
+ * A quiet live/refresh indicator: a small green dot (muted when paused) that
2641
+ * pulses subtly while a refresh is in flight, doubling as a manual-refresh
2642
+ * button. Deliberately text-free — the freshness detail lives in the tooltip so
2643
+ * the UI doesn't churn a ticking label.
2644
+ */
2645
+ export declare function RefreshIndicator({ onRefresh, isFetching, isPaused, updatedAt, className, }: RefreshIndicatorProps): JSX.Element;
2646
+
2647
+ export declare interface RefreshIndicatorProps {
2648
+ /** Manually trigger a refresh. */
2649
+ onRefresh: () => void;
2650
+ /** A background refresh is in flight — shows a subtle pulse. */
2651
+ isFetching?: boolean;
2652
+ /** Auto-refresh is paused (e.g. while editing) — shows a muted dot. */
2653
+ isPaused?: boolean;
2654
+ /** Last successful refresh time (ms epoch) — surfaced in the tooltip only. */
2655
+ updatedAt?: number;
2656
+ className?: string;
2657
+ }
2658
+
2659
+ export declare function RelativeTimeCell({ primary, secondary, className, }: {
2660
+ primary: React_2.ReactNode;
2661
+ secondary?: React_2.ReactNode;
2662
+ className?: string;
2663
+ }): JSX.Element;
2664
+
2665
+ export declare function RequiredMarker({ className }: {
2666
+ className?: string;
2667
+ }): JSX.Element;
2668
+
2669
+ export declare function ResultsBarCell({ passed, warn, failed, className }: ResultsBarCellProps): JSX.Element;
2670
+
2671
+ declare interface ResultsBarCellProps {
2672
+ passed: number;
2673
+ warn?: number;
2674
+ failed?: number;
2675
+ className?: string;
2676
+ }
2677
+
2678
+ export declare function RouteLoading({ className }: RouteLoadingProps): JSX.Element;
2679
+
2680
+ export declare interface RouteLoadingProps {
2681
+ className?: string;
2682
+ }
2683
+
2684
+ export { Row }
2685
+
2686
+ /**
2687
+ * A single entry in a row's overflow (⋯) menu. The consumer resolves these
2688
+ * per-row via `rowActions`, so `onSelect` closes over the row itself — no row
2689
+ * argument needed here.
2690
+ */
2691
+ declare interface RowAction {
2692
+ label: React_2.ReactNode;
2693
+ onSelect: () => void;
2694
+ /** Optional leading icon (e.g. `<IconPencil />`). */
2695
+ icon?: React_2.ReactNode;
2696
+ /** Render below a divider with destructive styling (Delete, Remove, …). */
2697
+ destructive?: boolean;
2698
+ disabled?: boolean;
2699
+ /** Omit this action for this row entirely. */
2700
+ hidden?: boolean;
2701
+ }
2702
+
2703
+ export declare function scoreBand(value: number): 'green' | 'amber' | 'red';
2704
+
2705
+ export declare function ScoreBarCell({ value, className, }: {
2706
+ value: number | null | undefined;
2707
+ className?: string;
2708
+ }): JSX.Element;
2709
+
2710
+ export declare const ScrollArea: React_2.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2711
+
2712
+ export declare const ScrollBar: React_2.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2713
+
2714
+ /**
2715
+ * Shared search input with a left-aligned magnifying glass icon and an
2716
+ * optional right-aligned clear (×) button. Both icons come from
2717
+ * `lucide-react` — Atlas's primary icon library — and are sized to 14px
2718
+ * to match the h-9 input's optical balance.
2719
+ *
2720
+ * Works in both controlled and uncontrolled modes. In controlled mode,
2721
+ * clicking the clear button synthesizes an `onChange` event with an
2722
+ * empty value using the native setter so React's state pipeline picks
2723
+ * it up correctly. In uncontrolled mode, it clears the input directly.
2724
+ *
2725
+ * The native WebKit/Chromium `::-webkit-search-cancel-button` is
2726
+ * suppressed so consumers see one consistent clear affordance across
2727
+ * browsers, not two stacked ones.
2728
+ */
2729
+ export declare const SearchInput: React_2.ForwardRefExoticComponent<SearchInputOwnProps & Omit<Omit<Omit<InputProps_2, "ref"> & React_2.RefAttributes<HTMLInputElement>, "ref">, "type"> & React_2.RefAttributes<HTMLInputElement>>;
2730
+
2731
+ declare type SearchInputOwnProps = {
2732
+ /**
2733
+ * Size of the magnifying glass icon in px. Defaults to 14 — matches
2734
+ * the h-9 input height's optical balance.
2735
+ */
2736
+ iconSize?: number;
2737
+ /**
2738
+ * Tailwind classes for the outer relative wrapper (e.g., width / layout).
2739
+ * Use `className` for the actual `<input>` styling.
2740
+ */
2741
+ containerClassName?: string;
2742
+ /**
2743
+ * Optional override for the icon tailwind classes. By default the icon
2744
+ * sits on the LEFT side of the input with enough padding that the first
2745
+ * character of user text never collides with the icon.
2746
+ */
2747
+ iconClassName?: string;
2748
+ /**
2749
+ * Hide the built-in clear (×) button. Defaults to `false`. The clear
2750
+ * button appears when the input has a value and replaces the browser's
2751
+ * inconsistent native `<input type="search">` × with a properly-sized
2752
+ * Lucide X icon that matches the rest of the design system.
2753
+ */
2754
+ hideClearButton?: boolean;
2755
+ };
2756
+
2757
+ export declare type SearchInputProps = SearchInputOwnProps & Omit<React_2.ComponentPropsWithoutRef<typeof Input>, 'type'>;
2758
+
2759
+ export declare function SectionHeader({ title, icon, children, className }: SectionHeaderProps): JSX.Element;
2760
+
2761
+ declare interface SectionHeaderProps {
2762
+ title: string;
2763
+ icon?: ReactNode;
2764
+ children?: ReactNode;
2765
+ className?: string;
2766
+ }
2767
+
2768
+ /**
2769
+ * Inline section loading indicator. Use inside cards, chart areas, sidebar
2770
+ * panels, or any bounded region that loads independently of the page chrome.
2771
+ */
2772
+ export declare function SectionLoadingState({ className, size, label }: SectionLoadingStateProps): JSX.Element;
2773
+
2774
+ export declare interface SectionLoadingStateProps {
2775
+ className?: string;
2776
+ size?: 'sm' | 'default';
2777
+ label?: string;
2778
+ }
2779
+
2780
+ export declare function SegmentedControl<T extends string>({ options, value, onChange, className, }: SegmentedControlProps<T>): JSX.Element;
2781
+
2782
+ declare interface SegmentedControlOption<T extends string> {
2783
+ value: T;
2784
+ label: string;
2785
+ icon?: ReactNode;
2786
+ }
2787
+
2788
+ declare interface SegmentedControlProps<T extends string> {
2789
+ options: SegmentedControlOption<T>[];
2790
+ value: T;
2791
+ onChange: (value: T) => void;
2792
+ className?: string;
2793
+ }
2794
+
2795
+ export declare const Select: React_2.FC<SelectPrimitive.SelectProps>;
2796
+
2797
+ export declare const SelectContent: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2798
+
2799
+ export declare const SelectGroup: React_2.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React_2.RefAttributes<HTMLDivElement>>;
2800
+
2801
+ export declare const SelectItem: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2802
+
2803
+ export declare const SelectLabel: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2804
+
2805
+ export declare const SelectScrollDownButton: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2806
+
2807
+ export declare const SelectScrollUpButton: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2808
+
2809
+ export declare const SelectSeparator: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2810
+
2811
+ export declare const SelectTrigger: React_2.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & SelectTriggerOwnProps & React_2.RefAttributes<HTMLButtonElement>>;
2812
+
2813
+ declare interface SelectTriggerOwnProps {
2814
+ /**
2815
+ * Error state — destructive border, destructive focus ring, and
2816
+ * `aria-invalid="true"`. Mirrors `Input` / `Textarea` so the three
2817
+ * form primitives share the same API surface.
2818
+ */
2819
+ error?: boolean | string;
2820
+ }
2821
+
2822
+ export declare const SelectValue: React_2.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React_2.RefAttributes<HTMLSpanElement>>;
2823
+
2824
+ export declare const Separator: React_2.ForwardRefExoticComponent<Omit<SeparatorPrimitive.SeparatorProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2825
+
2826
+ export declare const Sheet: React_2.FC<DialogPrimitive.DialogProps>;
2827
+
2828
+ export declare const SheetClose: React_2.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React_2.RefAttributes<HTMLButtonElement>>;
2829
+
2830
+ export declare const SheetContent: React_2.ForwardRefExoticComponent<SheetContentProps & React_2.RefAttributes<HTMLDivElement>>;
2831
+
2832
+ declare interface SheetContentProps extends React_2.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, VariantProps<typeof sheetVariants> {
2833
+ hideCloseButton?: boolean;
2834
+ }
2835
+
2836
+ export declare const SheetDescription: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React_2.RefAttributes<HTMLParagraphElement>, "ref"> & React_2.RefAttributes<HTMLParagraphElement>>;
2837
+
2838
+ export declare const SheetFooter: {
2839
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
2840
+ displayName: string;
2841
+ };
2842
+
2843
+ export declare const SheetHeader: {
2844
+ ({ className, ...props }: React_2.HTMLAttributes<HTMLDivElement>): JSX.Element;
2845
+ displayName: string;
2846
+ };
2847
+
2848
+ export declare const SheetOverlay: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
2849
+
2850
+ export declare function SheetPortal({ container, ...props }: React_2.ComponentProps<typeof DialogPrimitive.Portal>): JSX.Element;
2851
+
2852
+ export declare const SheetTitle: React_2.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React_2.RefAttributes<HTMLHeadingElement>, "ref"> & React_2.RefAttributes<HTMLHeadingElement>>;
2853
+
2854
+ export declare const SheetTrigger: React_2.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
2855
+
2856
+ declare const sheetVariants: (props?: ({
2857
+ side?: "bottom" | "left" | "right" | "top" | null | undefined;
2858
+ } & ClassProp) | undefined) => string;
2859
+
2860
+ /**
2861
+ * Whether a field should render as an inline chip on the row, given its
2862
+ * `show` config and whether it currently holds a value. The right-click menu
2863
+ * is unaffected by this — it always lists every field.
2864
+ */
2865
+ export declare function showFieldInline({ show, hasValue, }: {
2866
+ show?: TaskFieldShow;
2867
+ hasValue: boolean;
2868
+ }): boolean;
2869
+
2870
+ /**
2871
+ * SingleSelectList — the single-select sibling of `MultiSelectList`. Same
2872
+ * searchable cmdk body, pinned grouping, and icon column, but rows carry a
2873
+ * leading checkmark (not a checkbox) and selecting one replaces the value.
2874
+ * Use this for single-choice facets in a shared `FilterMenu` so they read as
2875
+ * a proper select list rather than a radio-dot menu.
2876
+ */
2877
+ export declare function SingleSelectList({ options, value, onChange, searchPlaceholder, emptyMessage, clearable, hideSelectedIndicator, selectedIndicatorSide, query, onQueryChange, className, searchable, }: SingleSelectListProps): JSX.Element;
2878
+
2879
+ declare interface SingleSelectListProps {
2880
+ options: MultiSelectOption[];
2881
+ /** Currently selected value, or null when nothing is chosen. */
2882
+ value: string | null;
2883
+ onChange: (value: string | null) => void;
2884
+ searchPlaceholder?: string;
2885
+ emptyMessage?: string;
2886
+ /** Clicking the already-selected row clears it back to null. Default true. */
2887
+ clearable?: boolean;
2888
+ /**
2889
+ * Drop the leading checkmark column. Use for action-style pickers that never
2890
+ * persist a selection (e.g. a reassign list), where the always-empty check
2891
+ * gutter just reads as dead left padding. Default false (checkmark shown).
2892
+ */
2893
+ hideSelectedIndicator?: boolean;
2894
+ /**
2895
+ * Which side of the row the selected checkmark sits on. Default 'left' (the
2896
+ * leading-checkmark select pattern). Use 'right' for menu-style lists where
2897
+ * the label should read flush-left and the tick trails it.
2898
+ */
2899
+ selectedIndicatorSide?: 'left' | 'right';
2900
+ /** Controlled search query. Omit to let the list manage its own. */
2901
+ query?: string;
2902
+ onQueryChange?: (query: string) => void;
2903
+ className?: string;
2904
+ /** Show the search input. Default true (see `SelectListShellProps`). */
2905
+ searchable?: boolean;
2906
+ }
2907
+
2908
+ export declare function Skeleton({ className, ...props }: React.ComponentProps<'div'>): JSX.Element;
2909
+
2910
+ export declare function SkeletonBlock({ className, style }: {
2911
+ className?: string;
2912
+ style?: React.CSSProperties;
2913
+ }): JSX.Element;
2914
+
2915
+ export declare const Slider: React_2.ForwardRefExoticComponent<Omit<SliderPrimitive.SliderProps & React_2.RefAttributes<HTMLSpanElement>, "ref"> & React_2.RefAttributes<HTMLSpanElement>>;
2916
+
2917
+ export declare function SortableHeader({ column, children }: {
2918
+ column: any;
2919
+ children: React.ReactNode;
2920
+ }): JSX.Element;
2921
+
2922
+ export { SortingState }
2923
+
2924
+ export declare function SparklineCell({ values, highlightTail, label, width, height, scaleMax, className, }: SparklineCellProps): JSX.Element;
2925
+
2926
+ declare interface SparklineCellProps {
2927
+ values: number[];
2928
+ /** Highlight a trailing portion in rose (e.g. failures near end). */
2929
+ highlightTail?: number;
2930
+ label?: React_2.ReactNode;
2931
+ /** Fixed pixel width of the sparkline area. */
2932
+ width?: number;
2933
+ height?: number;
2934
+ /** When set, bar heights use this fixed max instead of scaling to the series peak. */
2935
+ scaleMax?: number;
2936
+ className?: string;
2937
+ }
2938
+
2939
+ export declare function Spinner({ size, className, ...props }: VariantProps<typeof spinnerVariants> & React.ComponentProps<'div'>): JSX.Element;
2940
+
2941
+ export declare const spinnerVariants: (props?: ({
2942
+ size?: "default" | "sm" | "lg" | null | undefined;
2943
+ } & ClassProp) | undefined) => string;
2944
+
2945
+ export declare const STATUS_TONES: {
2946
+ readonly healthy: {
2947
+ readonly bg: "bg-emerald-50 dark:bg-emerald-500/15";
2948
+ readonly fg: "text-emerald-700 dark:text-emerald-300";
2949
+ readonly dot: "bg-emerald-500";
2950
+ };
2951
+ readonly active: {
2952
+ readonly bg: "bg-emerald-50 dark:bg-emerald-500/15";
2953
+ readonly fg: "text-emerald-700 dark:text-emerald-300";
2954
+ readonly dot: "bg-emerald-500";
2955
+ };
2956
+ readonly completed: {
2957
+ readonly bg: "bg-emerald-50 dark:bg-emerald-500/15";
2958
+ readonly fg: "text-emerald-700 dark:text-emerald-300";
2959
+ readonly dot: "bg-emerald-500";
2960
+ };
2961
+ readonly success: {
2962
+ readonly bg: "bg-emerald-50 dark:bg-emerald-500/15";
2963
+ readonly fg: "text-emerald-700 dark:text-emerald-300";
2964
+ readonly dot: "bg-emerald-500";
2965
+ };
2966
+ readonly running: {
2967
+ readonly bg: "bg-sky-50 dark:bg-sky-500/15";
2968
+ readonly fg: "text-sky-700 dark:text-sky-300";
2969
+ readonly dot: "bg-sky-500";
2970
+ };
2971
+ readonly info: {
2972
+ readonly bg: "bg-sky-50 dark:bg-sky-500/15";
2973
+ readonly fg: "text-sky-700 dark:text-sky-300";
2974
+ readonly dot: "bg-sky-500";
2975
+ };
2976
+ readonly queued: {
2977
+ readonly bg: "bg-sky-50 dark:bg-sky-500/15";
2978
+ readonly fg: "text-sky-700 dark:text-sky-300";
2979
+ readonly dot: "bg-sky-500";
2980
+ };
2981
+ readonly drift: {
2982
+ readonly bg: "bg-amber-50 dark:bg-amber-500/15";
2983
+ readonly fg: "text-amber-700 dark:text-amber-300";
2984
+ readonly dot: "bg-amber-500";
2985
+ };
2986
+ readonly warn: {
2987
+ readonly bg: "bg-amber-50 dark:bg-amber-500/15";
2988
+ readonly fg: "text-amber-700 dark:text-amber-300";
2989
+ readonly dot: "bg-amber-500";
2990
+ };
2991
+ readonly failing: {
2992
+ readonly bg: "bg-rose-50 dark:bg-rose-500/15";
2993
+ readonly fg: "text-rose-700 dark:text-rose-300";
2994
+ readonly dot: "bg-rose-500";
2995
+ };
2996
+ readonly failed: {
2997
+ readonly bg: "bg-rose-50 dark:bg-rose-500/15";
2998
+ readonly fg: "text-rose-700 dark:text-rose-300";
2999
+ readonly dot: "bg-rose-500";
3000
+ };
3001
+ readonly error: {
3002
+ readonly bg: "bg-rose-50 dark:bg-rose-500/15";
3003
+ readonly fg: "text-rose-700 dark:text-rose-300";
3004
+ readonly dot: "bg-rose-500";
3005
+ };
3006
+ readonly paused: {
3007
+ readonly bg: "bg-muted";
3008
+ readonly fg: "text-muted-foreground";
3009
+ readonly dot: "bg-muted-foreground";
3010
+ };
3011
+ readonly neutral: {
3012
+ readonly bg: "bg-muted";
3013
+ readonly fg: "text-muted-foreground";
3014
+ readonly dot: "bg-muted-foreground";
3015
+ };
3016
+ };
3017
+
3018
+ /** Sort rank within a board order (unknown statuses sort last). */
3019
+ export declare function statusBoardRankIn(order: readonly string[], status: string): number;
3020
+
3021
+ export declare function StatusDotBadge({ tone, label, pulse, className, }: {
3022
+ tone: StatusTone;
3023
+ label: React_2.ReactNode;
3024
+ pulse?: boolean;
3025
+ className?: string;
3026
+ }): JSX.Element;
3027
+
3028
+ /** Resolve a status's display meta within a vocabulary, with a neutral fallback. */
3029
+ export declare function statusMetaOf(options: TaskStatusOption[], value: string): TaskStatusOption;
3030
+
3031
+ /** Render a status vocabulary as `SingleSelectList` options (glyph + label). */
3032
+ export declare function statusSelectOptions(options: TaskStatusOption[]): MultiSelectOption[];
3033
+
3034
+ export declare type StatusTone = keyof typeof STATUS_TONES;
3035
+
3036
+ /**
3037
+ * Switch — slider-style on/off toggle.
3038
+ *
3039
+ * No drop shadows — neither on the track nor the thumb — consistent
3040
+ * with the rest of Atlas's form primitives (Input, Select, Textarea,
3041
+ * Button, Checkbox). Affordance comes from the bg-color transition
3042
+ * (`bg-input` → `bg-primary`) and the thumb's translate + opaque
3043
+ * contrast against the track.
3044
+ */
3045
+ export declare const Switch: React_2.ForwardRefExoticComponent<Omit<SwitchPrimitives.SwitchProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
3046
+
3047
+ export declare const Table: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableElement> & React_2.RefAttributes<HTMLTableElement>>;
3048
+
3049
+ export declare const TableBody: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableSectionElement> & React_2.RefAttributes<HTMLTableSectionElement>>;
3050
+
3051
+ export declare const TableCaption: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableCaptionElement> & React_2.RefAttributes<HTMLTableCaptionElement>>;
3052
+
3053
+ export declare const TableCell: React_2.ForwardRefExoticComponent<React_2.TdHTMLAttributes<HTMLTableCellElement> & React_2.RefAttributes<HTMLTableCellElement>>;
3054
+
3055
+ export declare const TableFooter: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableSectionElement> & React_2.RefAttributes<HTMLTableSectionElement>>;
3056
+
3057
+ export declare const TableHead: React_2.ForwardRefExoticComponent<React_2.ThHTMLAttributes<HTMLTableCellElement> & React_2.RefAttributes<HTMLTableCellElement>>;
3058
+
3059
+ export declare const TableHeader: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableSectionElement> & React_2.RefAttributes<HTMLTableSectionElement>>;
3060
+
3061
+ export declare const TableRow: React_2.ForwardRefExoticComponent<React_2.HTMLAttributes<HTMLTableRowElement> & React_2.RefAttributes<HTMLTableRowElement>>;
3062
+
3063
+ export declare const Tabs: React_2.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React_2.RefAttributes<HTMLDivElement>>;
3064
+
3065
+ export declare const TabsContent: React_2.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & React_2.RefAttributes<HTMLDivElement>>;
3066
+
3067
+ export declare const TabsList: React_2.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
3068
+ variant?: "default" | "line" | "sidebar" | null | undefined;
3069
+ } & ClassProp) | undefined) => string> & React_2.RefAttributes<HTMLDivElement>>;
3070
+
3071
+ export declare const TabsTrigger: React_2.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
3072
+
3073
+ /** Assignee field config — visibility/edit plus the options the inline picker offers. */
3074
+ export declare interface TaskAssigneeConfig extends TaskFieldConfig {
3075
+ options?: TaskAssigneeOption[];
3076
+ }
3077
+
3078
+ /** One selectable assignee in the single-select picker. */
3079
+ export declare interface TaskAssigneeOption {
3080
+ /** Identity persisted on the task (`ownerEmail`). */
3081
+ email: string;
3082
+ /** Display name; falls back to the email stem. */
3083
+ name?: string;
3084
+ /** Two-letter avatar initials; derived from email when omitted. */
3085
+ initials?: string;
3086
+ }
3087
+
3088
+ export declare function TaskCreateDialog({ open, onOpenChange, initialValues, assigneeOptions, statusOptions, defaultStatus, showDescription, createFields, initialFieldValues, onCreate, }: TaskCreateDialogProps): JSX.Element;
3089
+
3090
+ export declare interface TaskCreateDialogProps {
3091
+ open: boolean;
3092
+ onOpenChange: (open: boolean) => void;
3093
+ /** Seeds the form when the dialog opens (status / owner / due from a group). */
3094
+ initialValues?: Partial<TaskRowData>;
3095
+ /** People offered by the assignee picker. Omit to hide the assignee field. */
3096
+ assigneeOptions?: TaskAssigneeOption[];
3097
+ /** Status vocabulary for the status picker. Defaults to the built-in set. */
3098
+ statusOptions?: TaskStatusOption[];
3099
+ /** Status a fresh draft seeds with (the incomplete status). Default `'todo'`. */
3100
+ defaultStatus?: string;
3101
+ /**
3102
+ * Show the long-form description field. Default `true`. Set `false` for task
3103
+ * surfaces with no description concept (or that never display one), so the
3104
+ * create flow doesn't collect a field the list can't show.
3105
+ */
3106
+ showDescription?: boolean;
3107
+ /** Extra single-select fields (e.g. Category). */
3108
+ createFields?: TaskCreateField[];
3109
+ /** Seeds for the extra fields, keyed by field id (matched by value or label). */
3110
+ initialFieldValues?: TaskCreateFieldValues;
3111
+ /** Builds + commits the new task. */
3112
+ onCreate: (draft: TaskRowData, fieldValues: TaskCreateFieldValues) => void;
3113
+ }
3114
+
3115
+ /** A consumer-defined extra single-select on the create dialog (e.g. Category). */
3116
+ export declare interface TaskCreateField {
3117
+ id: string;
3118
+ label: string;
3119
+ options: MultiSelectOption[];
3120
+ /** Block the create action until this field has a value. */
3121
+ required?: boolean;
3122
+ }
3123
+
3124
+ /** Values chosen for the extra `createFields`, keyed by field id. */
3125
+ export declare type TaskCreateFieldValues = Record<string, string | null>;
3126
+
3127
+ /**
3128
+ * The single, uniform chip every inline task field renders through. Squared-
3129
+ * rounded and the same height as the design system's `Badge`, with a
3130
+ * consistent empty-state. Use `asStatic` for display-only (edit: 'menu')
3131
+ * fields and the interactive `<button>` form for inline editors.
3132
+ */
3133
+ export declare const TaskFieldChip: React_2.ForwardRefExoticComponent<Omit<TaskFieldChipProps, "ref"> & React_2.RefAttributes<HTMLButtonElement>>;
3134
+
3135
+ export declare interface TaskFieldChipProps extends React_2.ComponentProps<'button'> {
3136
+ /** Leading icon (kept small + muted by the chip). */
3137
+ icon?: React_2.ReactNode;
3138
+ /** Empty-state styling — dashed, muted — for an `always`-shown unset field. */
3139
+ empty?: boolean;
3140
+ /** Tonal treatment for value-carrying chips (e.g. overdue due date). */
3141
+ tone?: TaskFieldChipTone;
3142
+ /** Renders as a static span (no button affordance) for display-only fields. */
3143
+ asStatic?: boolean;
3144
+ }
3145
+
3146
+ export declare type TaskFieldChipTone = keyof typeof CHIP_TONES;
3147
+
3148
+ /** Per-field display + edit configuration. */
3149
+ export declare interface TaskFieldConfig {
3150
+ /** When the field shows inline. Defaults to `'whenSet'`. */
3151
+ show?: TaskFieldShow;
3152
+ /** How the field is edited. Defaults to `'inline'`. */
3153
+ edit?: TaskFieldEdit;
3154
+ }
3155
+
3156
+ /**
3157
+ * A declarative custom field rendered on the row's second line. Built-in
3158
+ * fields (due / assignee / tags) have named props on `TaskRow`; this is the
3159
+ * escape hatch for everything else (workstream, goal, experiment, priority,
3160
+ * project, estimate, …). Compose the value with the opinionated chip
3161
+ * components exported from this module so custom fields match the built-ins.
3162
+ *
3163
+ * ## Editable by default
3164
+ *
3165
+ * A shown field is INLINE-EDITABLE by default — exactly like the assignee:
3166
+ * declare `options` + `onChange` and TaskRow renders an interactive chip that
3167
+ * opens the shared `SingleSelectList` picker anchored to the chip. A field is
3168
+ * display-only ONLY when it explicitly opts out (`readOnly: true`) or supplies
3169
+ * no editor (`options`/`onChange`), or when it provides a bespoke `render`
3170
+ * (the static escape hatch). This keeps "shown ⇒ editable unless explicitly
3171
+ * read-only" true across every field, not just the named ones.
3172
+ */
3173
+ export declare interface TaskFieldDef {
3174
+ /** Stable key (React key + menu identity). */
3175
+ id: string;
3176
+ /** Human label — the right-click menu entry and the editor's search hint. */
3177
+ label: string;
3178
+ show?: TaskFieldShow;
3179
+ edit?: TaskFieldEdit;
3180
+ /** Does the field currently hold a value? Drives `show: 'whenSet'`. */
3181
+ hasValue: boolean;
3182
+ /**
3183
+ * Bespoke inline chip content (the static escape hatch). Optional — when
3184
+ * omitted, TaskRow renders a uniform `TaskFieldChip` from `icon` + `text`
3185
+ * (interactive when `options`/`onChange` are present and not `readOnly`,
3186
+ * static otherwise). Providing `render` always yields a static chip; use it
3187
+ * only when the opinionated chip can't express the content.
3188
+ */
3189
+ render?: () => React_2.ReactNode;
3190
+ /**
3191
+ * A value standing in for `render`'s output for memo comparison. When a row
3192
+ * is memoized, the bespoke `render` output is opaque to the equality check —
3193
+ * so a render-backed field is treated as changed unless it supplies a
3194
+ * `renderKey` that matches the previous one (set it to whatever the render
3195
+ * reads, e.g. the priority string). Without a `renderKey`, a render-backed
3196
+ * field always re-renders (correct but unmemoized).
3197
+ */
3198
+ renderKey?: string;
3199
+ /** Leading glyph for the auto-rendered chip. */
3200
+ icon?: React_2.ReactNode;
3201
+ /** Tonal treatment for the auto-rendered chip. Defaults to `'default'`. */
3202
+ tone?: TaskFieldChipTone;
3203
+ /** Display text for the auto-rendered chip. Falls back to a string `value`. */
3204
+ text?: string;
3205
+ /**
3206
+ * Choices for the inline single-select editor. With `onChange` (and without
3207
+ * `readOnly`/`render`) this makes the field editable — the chip becomes a
3208
+ * button that opens the shared picker, same as the assignee.
3209
+ */
3210
+ options?: MultiSelectOption[];
3211
+ /** Inline-editor write handler. `null` = the value was cleared/unset. */
3212
+ onChange?: (value: string | null) => void;
3213
+ /**
3214
+ * The editor's currently-selected option value, when it differs from the
3215
+ * displayed `value` — e.g. the chip shows an experiment's *label* but the
3216
+ * options are keyed by its *id*. Falls back to `value` when omitted.
3217
+ */
3218
+ editorValue?: string | null;
3219
+ /** Explicitly make the field display-only, even if it carries an editor. */
3220
+ readOnly?: boolean;
3221
+ /** Placeholder for the inline editor's search box. Defaults to `label`. */
3222
+ editorPlaceholder?: string;
3223
+ /**
3224
+ * Whether clicking the selected option clears it (`onChange(null)`).
3225
+ * Defaults to `true`. Set `false` for fields the backend won't let you
3226
+ * unset (e.g. a required enum).
3227
+ */
3228
+ editorClearable?: boolean;
3229
+ /** Invoked when the field is chosen from the right-click menu (advanced). */
3230
+ onEditFromMenu?: () => void;
3231
+ /**
3232
+ * Raw value(s) used for filtering. When present (and `filterable` isn't
3233
+ * `false`), the list's `filterable` automatically derives a filter facet
3234
+ * from this field — keyed by `id`, labeled by `label`, with options
3235
+ * collected from the distinct values across the tasks. So declaring a
3236
+ * field is enough to make it both a chip and a facet.
3237
+ */
3238
+ value?: string | string[];
3239
+ /** Opt this field out of becoming a filter facet even when it has a value. */
3240
+ filterable?: boolean;
3241
+ }
3242
+
3243
+ /** How a field is edited: an inline editor, or only via the right-click menu. */
3244
+ export declare type TaskFieldEdit = 'inline' | 'menu';
3245
+
3246
+ /** When a field appears as an inline chip on the row. */
3247
+ export declare type TaskFieldShow = 'always' | 'whenSet' | 'never';
3248
+
3249
+ export declare function TaskList<T extends TaskListItem>({ tasks, editable, statusOnly, hideOwner, getRowKey, onChange, createTask, onTaskUpdate, onTaskDelete, onTaskCreate, emptyMessage, searchable, filterable, currentUserEmail, onVisibleTasksChange, groupable, defaultGroupBy, groupStorageKey, due, assignee, tags, fields, createFields, statusOptions, statusBoardOrder, completeStatus, incompleteStatus, startStatus, resolvedStatuses, showDescription, className, }: TaskListProps<T>): JSX.Element;
3250
+
3251
+ /** Minimal item shape — the `TaskRow` presentation fields plus whatever the consumer carries. */
3252
+ export declare type TaskListItem = TaskRowData & {
3253
+ id?: string;
3254
+ };
3255
+
3256
+ export declare interface TaskListProps<T extends TaskListItem> {
3257
+ tasks: T[];
3258
+ /**
3259
+ * Read-only when false: no inline editing, no draft row, no delete. Pair
3260
+ * with omitting `onChange` for a pure display list.
3261
+ */
3262
+ editable?: boolean;
3263
+ /**
3264
+ * Lock everything except the status circle (rollup surfaces). Title is
3265
+ * static, due pill hidden, no draft row, no delete. `editable` must still
3266
+ * be true for the status control to open.
3267
+ */
3268
+ statusOnly?: boolean;
3269
+ /** Suppress the owner avatar on every row (single-owner surfaces). */
3270
+ hideOwner?: boolean;
3271
+ /** Stable React key per row. Defaults to the array index. */
3272
+ getRowKey?: (task: T, index: number) => string;
3273
+ /**
3274
+ * Fires with the full next list on any create / edit / delete. Use this
3275
+ * for in-memory lists the parent holds in state. For cache-backed lists
3276
+ * (React Query, per-row server mutations) prefer the granular
3277
+ * `onTask*` callbacks below — they fire per row and don't require the
3278
+ * parent to own the whole array.
3279
+ */
3280
+ onChange?: (tasks: T[]) => void;
3281
+ /**
3282
+ * Build a full task from a committed draft row. Used with `onChange` to
3283
+ * surface the draft "add a task" slot. The consumer stamps id / owner
3284
+ * defaults / timestamps here. Ignored when `onTaskCreate` is provided.
3285
+ */
3286
+ createTask?: (draft: TaskRowData) => T;
3287
+ /** Granular: a single row's fields changed (status / title / due / …). */
3288
+ onTaskUpdate?: (task: T, patch: Partial<TaskRowData>) => void;
3289
+ /** Granular: a single row was deleted. */
3290
+ onTaskDelete?: (task: T) => void;
3291
+ /**
3292
+ * Granular: a new task was created via the create dialog. Enables the
3293
+ * per-group "Add task" affordance. `fieldValues` carries the chosen values
3294
+ * for any `createFields` (e.g. category), seeded from the originating group.
3295
+ */
3296
+ onTaskCreate?: (draft: TaskRowData, fieldValues?: TaskCreateFieldValues) => void;
3297
+ /** Shown when the list is empty and read-only. */
3298
+ emptyMessage?: React_2.ReactNode;
3299
+ /**
3300
+ * Built-in search input above the list. `true` for defaults (matches
3301
+ * title + tags + owner), or an object to customize placeholder / matcher.
3302
+ */
3303
+ searchable?: TaskListSearchable<T>;
3304
+ /**
3305
+ * Built-in faceted filter (shared `FilterMenu`). When on, EVERY available
3306
+ * facet becomes filterable: Status, Assignee (when `assignee.options` is
3307
+ * set), Tags (from the data), AND every custom `fields` entry that carries
3308
+ * a `value`. No need to re-declare facets — declaring a field is enough.
3309
+ */
3310
+ filterable?: boolean;
3311
+ /**
3312
+ * The signed-in user's email. When set, the toolbar shows a "My Tasks"
3313
+ * quick-filter toggle that narrows the list to tasks owned by this user.
3314
+ */
3315
+ currentUserEmail?: string;
3316
+ /**
3317
+ * Fires with the post-search / post-filter / post-"My Tasks" visible set
3318
+ * whenever it changes. The list owns those controls internally, so a
3319
+ * consumer that needs the live visible scope (e.g. publishing a Jarvis
3320
+ * chat-view snapshot) can't derive it from `tasks` — this surfaces it.
3321
+ */
3322
+ onVisibleTasksChange?: (visible: T[]) => void;
3323
+ /**
3324
+ * Offer Linear-style grouping: a toolbar control to group rows under
3325
+ * collapsible headers by any available field. On by default (the control
3326
+ * shows), but grouping itself starts OFF — see `defaultGroupBy`. `false`
3327
+ * hides the control entirely. Auto-disabled in `statusOnly` mode.
3328
+ */
3329
+ groupable?: boolean;
3330
+ /**
3331
+ * Initial grouping dimension key. Defaults to `'none'` (flat list, still
3332
+ * board-sorted) — grouping is opt-in. Pass `'status'` (etc.) for a surface
3333
+ * that should start grouped.
3334
+ */
3335
+ defaultGroupBy?: string;
3336
+ /**
3337
+ * Persist collapsed groups (and the chosen grouping dimension) across
3338
+ * reloads under this localStorage key — Linear-style sticky groups. Omit for
3339
+ * ephemeral, per-mount state.
3340
+ */
3341
+ groupStorageKey?: string;
3342
+ /** Due-date field config, forwarded to every row. See `TaskRow`. */
3343
+ due?: TaskFieldConfig;
3344
+ /** Assignee field config + options, forwarded to every row. See `TaskRow`. */
3345
+ assignee?: TaskAssigneeConfig;
3346
+ /** Tags field config, forwarded to every row. See `TaskRow`. */
3347
+ tags?: TaskFieldConfig;
3348
+ /** Per-row custom fields builder — called for each task to build its chips. */
3349
+ fields?: (task: T) => TaskFieldDef[];
3350
+ /**
3351
+ * Status vocabulary + interaction mapping, forwarded to every row and used
3352
+ * for the status group/filter dimension and the board sort. All default to
3353
+ * the built-in set, so a surface with the standard statuses passes nothing.
3354
+ * Pass stable references (module consts / memoized) — rows compare them by
3355
+ * identity.
3356
+ */
3357
+ statusOptions?: TaskStatusOption[];
3358
+ /** Status sort/group order (board: active first). Defaults to the built-in board order. */
3359
+ statusBoardOrder?: readonly string[];
3360
+ /** Checkbox "checked" / "unchecked" targets. Default `'done'` / `'todo'`. */
3361
+ completeStatus?: string;
3362
+ incompleteStatus?: string;
3363
+ /** Hover "Start" button target (shown at the incomplete status). Default `'in_progress'`; `null` hides it. */
3364
+ startStatus?: string | null;
3365
+ /** Statuses treated as resolved (struck-through + no due urgency). Default `['done','cancelled']`. */
3366
+ resolvedStatuses?: readonly string[];
3367
+ /**
3368
+ * Show the long-form description field in the create dialog. Default `true`.
3369
+ * Set `false` for surfaces with no description concept (or that never display
3370
+ * one) so the create flow doesn't collect a field the list can't show.
3371
+ */
3372
+ showDescription?: boolean;
3373
+ /**
3374
+ * Extra single-select fields shown in the create dialog (e.g. Category).
3375
+ * A required field gates "Create". When the list is grouped by a dimension
3376
+ * whose key matches a field id, that field is pre-seeded from the group.
3377
+ */
3378
+ createFields?: TaskCreateField[];
3379
+ className?: string;
3380
+ }
3381
+
3382
+ /** Built-in search config. `true` = default search over title + tags + owner. */
3383
+ export declare type TaskListSearchable<T> = boolean | {
3384
+ placeholder?: string;
3385
+ /** Custom searchable text for a task. Defaults to title + tags + owner. */
3386
+ accessor?: (task: T) => string;
3387
+ };
3388
+
3389
+ export declare const TaskRow: React_2.NamedExoticComponent<TaskRowProps & React_2.RefAttributes<HTMLDivElement>>;
3390
+
3391
+ export declare interface TaskRowData {
3392
+ title: string;
3393
+ status: TaskRowStatus;
3394
+ /** Long-form body. Not rendered on the row — carried for the create dialog. */
3395
+ description?: string | null;
3396
+ /** ISO YYYY-MM-DD. Null / undefined for tasks with no due date. */
3397
+ dueDate?: string | null;
3398
+ /** Used to color + initial the owner avatar. Null for unassigned. */
3399
+ ownerEmail?: string | null;
3400
+ ownerInitials?: string | null;
3401
+ /** Freeform labels rendered as chips on the row's second line. */
3402
+ tags?: string[];
3403
+ }
3404
+
3405
+ export declare interface TaskRowProps {
3406
+ /**
3407
+ * Current row data. Pass `null` for a placeholder/draft row — the
3408
+ * row renders idle styling + placeholder copy until the user
3409
+ * starts typing.
3410
+ */
3411
+ task: TaskRowData | null;
3412
+ /**
3413
+ * Read-only when false. Status / title / due / owner / linear /
3414
+ * delete affordances are all suppressed. Useful for preview
3415
+ * surfaces (popovers, drawers).
3416
+ */
3417
+ editable?: boolean;
3418
+ /**
3419
+ * Default placeholder for the title input. Defaults to a generic
3420
+ * prompt; surfaces with stronger context (e.g. "this week's goal")
3421
+ * should pass something more specific.
3422
+ */
3423
+ placeholder?: string;
3424
+ /**
3425
+ * Fires on every field change (status, due, etc.) for committed
3426
+ * rows. NOT called for draft rows — the draft fires `onCommit`
3427
+ * once the user types a title. Receives a partial patch; merge
3428
+ * with the existing row at the call site.
3429
+ */
3430
+ onChange?: (patch: Partial<TaskRowData>) => void;
3431
+ /**
3432
+ * Called when a draft row commits (user types a non-empty title
3433
+ * and blurs / hits Enter). The parent typically appends the new
3434
+ * task to its list and renders a fresh draft TaskRow at the end.
3435
+ */
3436
+ onCommit?: (next: TaskRowData) => void;
3437
+ /**
3438
+ * Delete handler. When omitted, both the right-click context menu
3439
+ * item and any visible delete affordance are suppressed.
3440
+ */
3441
+ onDelete?: () => void;
3442
+ /**
3443
+ * Suppress the owner avatar regardless of `ownerEmail`. Used by
3444
+ * surfaces where every row is already implicitly scoped to the
3445
+ * caller (MyWeek's per-card task list — every card and task on it
3446
+ * belongs to the signed-in user, so repeating the same JJ pip on
3447
+ * every row is pure chrome). The avatar still renders by default;
3448
+ * surfaces with mixed-owner task lists (Tasks tab, HypothesisDetail)
3449
+ * leave this off.
3450
+ */
3451
+ hideOwner?: boolean;
3452
+ /**
3453
+ * Lock everything except the status circle. The title renders as
3454
+ * static text (not an input), the due-date pill is hidden, the
3455
+ * right-click delete is suppressed. Used by rollup surfaces (e.g.
3456
+ * AllMembersTab) where viewers can move work forward but can't
3457
+ * authoring-edit someone else's task from there. `editable` must
3458
+ * still be true for the status dropdown to open.
3459
+ */
3460
+ statusOnly?: boolean;
3461
+ /**
3462
+ * Due-date field config. Defaults to `{ show: 'whenSet', edit: 'inline' }`.
3463
+ * Set `{ show: 'whenSet', edit: 'menu' }` for the "only via right-click,
3464
+ * only shown once set" pattern. See the UX contract in `task-field.tsx`.
3465
+ */
3466
+ due?: TaskFieldConfig;
3467
+ /**
3468
+ * Assignee field config + the options the inline single-select offers.
3469
+ * Defaults to `{ show: 'whenSet', edit: 'inline' }`. With `show: 'always'`
3470
+ * an unassigned task shows an empty-state avatar that opens the picker.
3471
+ * Changing the assignee fires `onChange({ ownerEmail })`.
3472
+ */
3473
+ assignee?: TaskAssigneeConfig;
3474
+ /**
3475
+ * Tags field config (display-only chips on the second line). Defaults to
3476
+ * `{ show: 'whenSet' }`.
3477
+ */
3478
+ tags?: TaskFieldConfig;
3479
+ /**
3480
+ * Declarative custom fields rendered on the second line (priority,
3481
+ * project, estimate, …). Each composes the shared `TaskFieldChip`, so it
3482
+ * matches the built-in fields. Every field also appears in the right-click
3483
+ * menu via `onEditFromMenu`.
3484
+ */
3485
+ fields?: TaskFieldDef[];
3486
+ /**
3487
+ * Status vocabulary — the value/label/icon/tone for every status this row
3488
+ * can show. Defaults to the built-in set (`DEFAULT_STATUS_OPTIONS`). Pass a
3489
+ * stable reference (module const or memoized) — it's compared by identity.
3490
+ */
3491
+ statusOptions?: TaskStatusOption[];
3492
+ /**
3493
+ * Checkbox interaction: clicking the leading circle on a non-complete row
3494
+ * sets `completeStatus`; clicking a complete row resets to `incompleteStatus`.
3495
+ * Default `'done'` / `'todo'`.
3496
+ */
3497
+ completeStatus?: string;
3498
+ incompleteStatus?: string;
3499
+ /**
3500
+ * The status the hover "Start" button transitions to — shown only when the
3501
+ * row sits at `incompleteStatus`. Default `'in_progress'`; pass `null` to
3502
+ * hide the Start affordance entirely.
3503
+ */
3504
+ startStatus?: string | null;
3505
+ /**
3506
+ * Statuses treated as resolved: the title renders struck-through and due-date
3507
+ * urgency is suppressed. Defaults to `['done', 'cancelled']`. Pass a stable
3508
+ * reference — compared by identity.
3509
+ */
3510
+ resolvedStatuses?: readonly string[];
3511
+ className?: string;
3512
+ }
3513
+
3514
+ export declare type TaskRowStatus = string;
3515
+
3516
+ export declare function TaskStatusIndicator({ status, editable, onChange, size, className, statusOptions, }: TaskStatusIndicatorProps): JSX.Element;
3517
+
3518
+ export declare interface TaskStatusIndicatorProps {
3519
+ status: TaskRowStatus;
3520
+ /** When false, renders only the colored icon — no click target. */
3521
+ editable?: boolean;
3522
+ onChange?: (next: TaskRowStatus) => void;
3523
+ /** Icon size in px. Defaults to 16. */
3524
+ size?: number;
3525
+ className?: string;
3526
+ /** Status vocabulary. Defaults to the built-in set. */
3527
+ statusOptions?: TaskStatusOption[];
3528
+ }
3529
+
3530
+ /** One status in a task vocabulary: its value, label, glyph, and icon tone. */
3531
+ export declare interface TaskStatusOption {
3532
+ value: string;
3533
+ label: string;
3534
+ /** Glyph for the status circle + picker row. */
3535
+ icon: React_2.ComponentType<{
3536
+ size?: number;
3537
+ className?: string;
3538
+ }>;
3539
+ /** Tailwind text-color class for the glyph, e.g. `'text-blue-600'`. */
3540
+ tone: string;
3541
+ }
3542
+
3543
+ export declare const Textarea: React_2.ForwardRefExoticComponent<Omit<TextareaProps, "ref"> & React_2.RefAttributes<HTMLTextAreaElement>>;
3544
+
3545
+ declare interface TextareaOwnProps {
3546
+ /**
3547
+ * Error state — destructive border, destructive focus ring, and
3548
+ * `aria-invalid="true"`. Mirrors `Input`'s `error` prop so the three
3549
+ * form primitives share the same API surface.
3550
+ */
3551
+ error?: boolean | string;
3552
+ }
3553
+
3554
+ export declare type TextareaProps = React_2.ComponentProps<"textarea"> & TextareaOwnProps;
3555
+
3556
+ /**
3557
+ * shadcn/ui chart primitive (recharts-based).
3558
+ *
3559
+ * Provides a themeable container + tooltip/legend chrome so charts across
3560
+ * Atlas share one styling contract instead of each app hand-rolling recharts
3561
+ * markup. New charts should compose `ChartContainer` + a `ChartConfig` and let
3562
+ * this primitive resolve colors from the `--chart-*` design tokens.
3563
+ *
3564
+ * Jarvis is migrating its bespoke recharts usage onto this primitive — prefer
3565
+ * it over importing recharts directly in new code.
3566
+ */
3567
+ declare const THEMES: {
3568
+ readonly light: "";
3569
+ readonly dark: ".dark";
3570
+ };
3571
+
3572
+ export declare function tintForString(seed: string): AgentTint;
3573
+
3574
+ export { toast }
3575
+
3576
+ /**
3577
+ * Toaster — the Atlas-themed Sonner renderer. Canonical toast system
3578
+ * for the design system, matching the current shadcn recommendation
3579
+ * (https://ui.shadcn.com/docs/components/sonner — the Radix-based
3580
+ * Toast was deprecated in v5 in favor of Sonner).
3581
+ *
3582
+ * Mount once at the app shell — Atlas already does this in
3583
+ * `atlas/src/platform/app/AppLayout.tsx`. Callers never render
3584
+ * `<Toaster />` themselves; they just call `toast(...)` from
3585
+ * 'sonner' and messages appear in the shared stack.
3586
+ *
3587
+ * Why a wrapper instead of using Sonner's `<Toaster>` directly:
3588
+ * 1. Bakes in Atlas's positioning / visibility / sizing defaults
3589
+ * (top-right, 380px wide, 8-deep stack) so every mount looks
3590
+ * the same without re-specifying options at the call site.
3591
+ * 2. Binds Sonner's internal classes to Atlas design tokens via
3592
+ * `toastOptions.classNames` — `bg-card`, `border-border`,
3593
+ * `shadow-popover`, `rounded-md`, and the `--destructive` /
3594
+ * `--primary` / `--muted` pairs. Matches Dialog / Popover /
3595
+ * DropdownMenu so all floating UI reads as one visual family.
3596
+ * 3. Uses `richColors` for the semantic variants
3597
+ * (`toast.success` / `.error` / `.warning` / `.info`), so
3598
+ * consumers get Atlas's destructive red on errors without
3599
+ * per-call styling.
3600
+ *
3601
+ * Usage:
3602
+ * import { toast } from 'sonner'
3603
+ *
3604
+ * toast('Saved')
3605
+ * toast.success('Published')
3606
+ * toast.error('Upload failed', { description: err.message })
3607
+ * toast.promise(saveDraft(), {
3608
+ * loading: 'Saving…',
3609
+ * success: 'Saved',
3610
+ * error: (err) => `Failed: ${err.message}`,
3611
+ * })
3612
+ * toast('Deleted', {
3613
+ * description: '3 items moved to trash.',
3614
+ * action: { label: 'Undo', onClick: () => restore() },
3615
+ * })
3616
+ */
3617
+ export declare function Toaster({ ...props }: ToasterProps): JSX.Element;
3618
+
3619
+ export declare const Toggle: React_2.ForwardRefExoticComponent<Omit<TogglePrimitive.ToggleProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
3620
+ variant?: "default" | "outline" | null | undefined;
3621
+ size?: "default" | "sm" | "lg" | null | undefined;
3622
+ } & ClassProp) | undefined) => string> & React_2.RefAttributes<HTMLButtonElement>>;
3623
+
3624
+ export declare const ToggleGroup: React_2.ForwardRefExoticComponent<((Omit<ToggleGroupPrimitive.ToggleGroupSingleProps & React_2.RefAttributes<HTMLDivElement>, "ref"> | Omit<ToggleGroupPrimitive.ToggleGroupMultipleProps & React_2.RefAttributes<HTMLDivElement>, "ref">) & VariantProps<(props?: ({
3625
+ variant?: "default" | "outline" | null | undefined;
3626
+ size?: "default" | "sm" | "lg" | null | undefined;
3627
+ } & ClassProp) | undefined) => string>) & React_2.RefAttributes<HTMLDivElement>>;
3628
+
3629
+ export declare const ToggleGroupItem: React_2.ForwardRefExoticComponent<Omit<ToggleGroupPrimitive.ToggleGroupItemProps & React_2.RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
3630
+ variant?: "default" | "outline" | null | undefined;
3631
+ size?: "default" | "sm" | "lg" | null | undefined;
3632
+ } & ClassProp) | undefined) => string> & React_2.RefAttributes<HTMLButtonElement>>;
3633
+
3634
+ /**
3635
+ * Toggle — pressable two-state button primitive (shadcn/ui).
3636
+ *
3637
+ * Use for formatting-style toolbars (bold/italic), view-mode switches, or any
3638
+ * button that represents an on/off state without a label. For slider-style
3639
+ * on/off switches in forms, use `Switch` instead. For mutually-exclusive
3640
+ * groups of toggles (segmented picker), use `ToggleGroup`.
3641
+ */
3642
+ export declare const toggleVariants: (props?: ({
3643
+ variant?: "default" | "outline" | null | undefined;
3644
+ size?: "default" | "sm" | "lg" | null | undefined;
3645
+ } & ClassProp) | undefined) => string;
3646
+
3647
+ export declare const Tooltip: React_2.FC<TooltipPrimitive.TooltipProps>;
3648
+
3649
+ /**
3650
+ * Raw access to Radix's `Arrow` primitive for the rare case where a
3651
+ * consumer wants to render a custom-styled arrow separately from the
3652
+ * default one baked into `TooltipContent`. Most callers should NOT
3653
+ * need this — reach for it only when building a specialized tooltip
3654
+ * variant inside a subsystem (e.g. an inline annotation overlay).
3655
+ */
3656
+ export declare const TooltipArrow: React_2.ForwardRefExoticComponent<TooltipPrimitive.TooltipArrowProps & React_2.RefAttributes<SVGSVGElement>>;
3657
+
3658
+ export declare const TooltipContent: React_2.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React_2.RefAttributes<HTMLDivElement>, "ref"> & {
3659
+ /**
3660
+ * Per-instance portal container override. Radix Popper uses
3661
+ * `position: fixed` for the tooltip body, which is normally
3662
+ * anchored to the viewport — but per CSS spec, **any** ancestor
3663
+ * with `transform`, `filter`, `perspective`, `will-change`, or
3664
+ * `contain` creates a new containing block and re-anchors fixed
3665
+ * descendants to itself. Surfaces that mount inside such an
3666
+ * ancestor (e.g. a React Flow node body) get tooltips placed at
3667
+ * the wrong viewport position even though Floating UI's math is
3668
+ * correct.
3669
+ *
3670
+ * The shared `PortalContainerProvider` can pick up such a
3671
+ * containing block when the app's outer chrome is transformed.
3672
+ * Pass `container={null}` on triggers inside transformed wrappers
3673
+ * to force the portal back to `document.body`, where no
3674
+ * transformed ancestor can re-anchor `position: fixed`.
3675
+ *
3676
+ * Leave undefined to inherit `usePortalContainer()` (default).
3677
+ */
3678
+ container?: HTMLElement | null;
3679
+ } & React_2.RefAttributes<HTMLDivElement>>;
3680
+
3681
+ declare type TooltipPayloadItem = {
3682
+ name?: string | number;
3683
+ dataKey?: string | number;
3684
+ value?: number | string;
3685
+ color?: string;
3686
+ payload?: Record<string, unknown>;
3687
+ fill?: string;
3688
+ };
3689
+
3690
+ /**
3691
+ * Tooltip — contextual helper text anchored to a trigger.
3692
+ *
3693
+ * Wraps Radix's Tooltip primitives with Atlas defaults. The component
3694
+ * family tracks shadcn's canonical v5 pattern:
3695
+ *
3696
+ * - `TooltipProvider` is mounted once at the app shell
3697
+ * (`atlas/src/platform/app/AppLayout.tsx`) with
3698
+ * `delayDuration={200}` — consumers don't need to provide their own.
3699
+ * - `TooltipContent` renders into the shared portal container
3700
+ * (`usePortalContainer()`) so tooltips escape `overflow: hidden`
3701
+ * ancestors (tables, scroll regions, dialogs) and still align to
3702
+ * the trigger correctly.
3703
+ * - `TooltipArrow` is baked into `TooltipContent` — the caret
3704
+ * pointing at the trigger is an expected affordance, not an opt-in
3705
+ * one.
3706
+ * - Colors use `bg-foreground` / `text-background` (neutral dark
3707
+ * tooltip on light surfaces). Intentionally NOT `bg-primary` —
3708
+ * tooltips are informational, not branded; using the primary
3709
+ * color made them read as popovers or links in themed apps.
3710
+ *
3711
+ * Usage:
3712
+ * ```tsx
3713
+ * <Tooltip>
3714
+ * <TooltipTrigger asChild>
3715
+ * <Button variant="ghost" size="icon">
3716
+ * <Info />
3717
+ * </Button>
3718
+ * </TooltipTrigger>
3719
+ * <TooltipContent>Helpful description</TooltipContent>
3720
+ * </Tooltip>
3721
+ * ```
3722
+ *
3723
+ * For triggers that are a single non-interactive element (text span,
3724
+ * icon), wrap with `asChild` so the trigger inherits the child's DOM
3725
+ * rather than adding an extra button wrapper.
3726
+ */
3727
+ export declare const TooltipProvider: React_2.FC<TooltipPrimitive.TooltipProviderProps>;
3728
+
3729
+ export declare const TooltipTrigger: React_2.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React_2.RefAttributes<HTMLButtonElement>>;
3730
+
3731
+ export declare function TrendBadge({ value, invertColors }: TrendBadgeProps): JSX.Element;
3732
+
3733
+ declare interface TrendBadgeProps {
3734
+ value: number | null;
3735
+ /** When true, "up" is green (revenue). Default false: "up" is red (cost). */
3736
+ invertColors?: boolean;
3737
+ }
3738
+
3739
+ /**
3740
+ * Text that truncates with an ellipsis and reveals its full value in a tooltip —
3741
+ * **but only when actually clipped**. The one place the overflow-detection +
3742
+ * tooltip pattern lives, so every truncating title/label gets it for free.
3743
+ *
3744
+ * Use for **titles and labels** (page/tab titles, table cells, breadcrumbs, list
3745
+ * rows) — anything single-line that must fit a bounded width. Do **not** use for
3746
+ * body or long-form copy: that should wrap, not truncate.
3747
+ *
3748
+ * ```tsx
3749
+ * <TruncatedText className="max-w-[16rem]">{customer.name}</TruncatedText>
3750
+ *
3751
+ * // asChild — the link itself truncates; pass the text as `tooltip`:
3752
+ * <TruncatedText asChild tooltip={repo.name}>
3753
+ * <a href={href} className="max-w-[14rem]">{repo.name}</a>
3754
+ * </TruncatedText>
3755
+ * ```
3756
+ */
3757
+ export declare function TruncatedText({ asChild, tooltip, side, className, children, ref: forwardedRef, ...props }: TruncatedTextProps): JSX.Element;
3758
+
3759
+ declare type TruncatedTextProps = ComponentProps<'span'> & {
3760
+ /**
3761
+ * Merge the truncation + tooltip onto the child element instead of rendering a
3762
+ * `<span>` (shadcn `asChild`). Use when the truncating element must be a link,
3763
+ * button, or heading. When set, pass `tooltip` explicitly — `children` is an
3764
+ * element, not the text.
3765
+ */
3766
+ asChild?: boolean;
3767
+ /** Tooltip content. Defaults to `children` (correct only when they're the raw
3768
+ * text — i.e. not `asChild`). */
3769
+ tooltip?: ReactNode;
3770
+ /** Tooltip side; forwarded to `TooltipContent`. */
3771
+ side?: ComponentProps<typeof TooltipContent>['side'];
3772
+ };
3773
+
3774
+ export declare function useAppClassName(): string | undefined;
3775
+
3776
+ /**
3777
+ * Owns the "don't clobber the in-progress edit" draft pattern.
3778
+ *
3779
+ * A click-to-edit control mirrors a server/parent `value` into local state, but
3780
+ * a background refresh or parent re-render that arrives MID-EDIT must not
3781
+ * overwrite what the user is typing. This hook resyncs the draft from `value`
3782
+ * only while `editing` is false; while editing, the draft is left alone.
3783
+ *
3784
+ * `value` must be the STABLE source (typically the prop/cache object), not a
3785
+ * value recomputed every render — the resync watches `value` by identity. Use
3786
+ * `toDraft` to derive the draft shape from a stable source (e.g. project a
3787
+ * workstream object to one side's owner rows); the mapper is read from a ref so
3788
+ * passing an inline closure doesn't trigger spurious resyncs.
3789
+ *
3790
+ * Extracted from `inline-text-cell.tsx`; the shared layer for every inline
3791
+ * editor (text cells, owner pickers, date cells, …).
3792
+ */
3793
+ export declare function useEditableDraft<TValue, TDraft = TValue>(params: {
3794
+ value: TValue;
3795
+ editing: boolean;
3796
+ /** Project the source value into the draft shape. Omit for an identity draft. */
3797
+ toDraft?: (value: TValue) => TDraft;
3798
+ }): UseEditableDraftResult<TDraft>;
3799
+
3800
+ export declare interface UseEditableDraftResult<TDraft> {
3801
+ /** The editable draft value. */
3802
+ draft: TDraft;
3803
+ /** Update the draft locally (e.g. on input change). */
3804
+ setDraft: Dispatch<SetStateAction<TDraft>>;
3805
+ /** Force the draft back to the current source value (e.g. on Escape / cancel). */
3806
+ reset: () => void;
3807
+ }
3808
+
3809
+ /**
3810
+ * Optimistic mutation over a family of React Query list caches matched by a
3811
+ * partial key. Same lifecycle as `useOptimisticResource` (cancel + snapshot +
3812
+ * patch in `onMutate`, rollback in `onError`, reconcile-not-invalidate on
3813
+ * success), but it patches every matching cache so filtered/paginated views of
3814
+ * the same list stay consistent. Framework-generic: the caller's
3815
+ * `applyOptimistic`/`reconcile` own all knowledge of the cache shape.
3816
+ */
3817
+ export declare function useOptimisticList<TCache, TVariables, TResult = unknown>(params: UseOptimisticListParams<TCache, TVariables, TResult>): UseMutationResult<TResult, unknown, TVariables, OptimisticListContext<TCache>>;
3818
+
3819
+ export declare interface UseOptimisticListParams<TCache, TVariables, TResult> {
3820
+ /**
3821
+ * Partial query key. EVERY cache whose key starts with this is patched
3822
+ * (React Query's `getQueriesData` / `setQueriesData` semantics) — e.g. a
3823
+ * paginated/filtered list keyed `['workstreams', week, search]` is patched
3824
+ * across all its variants with one mutation.
3825
+ */
3826
+ queryKey: QueryKey;
3827
+ /** The async write. Its resolved value is the `result` passed to reconcile. */
3828
+ mutationFn: (variables: TVariables) => Promise<TResult>;
3829
+ /**
3830
+ * Patch one matching cache value, applied synchronously in `onMutate`.
3831
+ * Called once per matching entry. Return the cache unchanged to skip it.
3832
+ */
3833
+ applyOptimistic: (args: {
3834
+ cache: TCache;
3835
+ variables: TVariables;
3836
+ }) => TCache;
3837
+ /**
3838
+ * Reconcile each matching cache with the server result on success, WITHOUT a
3839
+ * refetch. Omit to trust the optimistic patch — the no-flash-back default.
3840
+ */
3841
+ reconcile?: (args: {
3842
+ cache: TCache;
3843
+ result: TResult;
3844
+ variables: TVariables;
3845
+ }) => TCache;
3846
+ /**
3847
+ * Invalidate the PATCHED key on settle. Defaults to `false`: re-running the
3848
+ * list query lets a stale in-flight response overwrite the patch for a frame
3849
+ * (flash-back). Only enable when you cannot reconcile from the server result.
3850
+ */
3851
+ invalidateOnSettle?: boolean;
3852
+ /**
3853
+ * Sibling query keys to invalidate on success. Must NOT include `queryKey` —
3854
+ * only caches you did not optimistically patch (e.g. an aggregate the list
3855
+ * feeds). Refetching those is safe and keeps them fresh.
3856
+ */
3857
+ invalidateKeysOnSuccess?: QueryKey[];
3858
+ onError?: (args: {
3859
+ error: unknown;
3860
+ variables: TVariables;
3861
+ }) => void;
3862
+ onSuccess?: (args: {
3863
+ result: TResult;
3864
+ variables: TVariables;
3865
+ }) => void;
3866
+ onSettled?: (args: {
3867
+ variables: TVariables;
3868
+ }) => void;
3869
+ }
3870
+
3871
+ /**
3872
+ * Optimistic mutation over a single React Query cache entry.
3873
+ *
3874
+ * Encapsulates the full lifecycle the Jarvis playbook prescribes:
3875
+ * `onMutate` cancels in-flight queries, snapshots the entry, and applies an
3876
+ * optimistic patch; `onError` rolls back to the snapshot; `onSuccess`
3877
+ * reconciles from the server result (or trusts the patch); and settle does NOT
3878
+ * blindly invalidate the patched key. Framework-generic — it knows nothing
3879
+ * about the resource shape beyond what the caller's callbacks describe.
3880
+ *
3881
+ * For multiple matching caches each holding a list, use `useOptimisticList`.
3882
+ */
3883
+ export declare function useOptimisticResource<TData, TVariables, TResult = unknown>(params: UseOptimisticResourceParams<TData, TVariables, TResult>): UseMutationResult<TResult, unknown, TVariables, OptimisticResourceContext<TData>>;
3884
+
3885
+ export declare interface UseOptimisticResourceParams<TData, TVariables, TResult> {
3886
+ /** Exact query key of the cache entry holding the resource. */
3887
+ queryKey: QueryKey;
3888
+ /** The async write. Its resolved value is the `result` passed to reconcile. */
3889
+ mutationFn: (variables: TVariables) => Promise<TResult>;
3890
+ /**
3891
+ * Produce the optimistically-patched cache value, applied synchronously in
3892
+ * `onMutate`. Receives the pre-mutation value (or `undefined` when the cache
3893
+ * is empty). Return `previous` unchanged to skip the patch.
3894
+ */
3895
+ applyOptimistic: (args: {
3896
+ previous: TData | undefined;
3897
+ variables: TVariables;
3898
+ }) => TData | undefined;
3899
+ /**
3900
+ * Reconcile the cache with the authoritative server result on success,
3901
+ * WITHOUT a refetch. Omit to trust the optimistic patch — the no-flash-back
3902
+ * default. Prefer this over `invalidateOnSettle` whenever the server result
3903
+ * carries the canonical shape (it sets the cache directly, so there is no
3904
+ * stale-poll window the way an invalidate-driven refetch has).
3905
+ */
3906
+ reconcile?: (args: {
3907
+ previous: TData | undefined;
3908
+ result: TResult;
3909
+ variables: TVariables;
3910
+ }) => TData | undefined;
3911
+ /**
3912
+ * Invalidate the PATCHED key on settle. Defaults to `false`: invalidating a
3913
+ * key you just optimistically patched re-runs its query and lets a stale
3914
+ * in-flight response overwrite the patch for a frame — the flash-back the
3915
+ * Jarvis frontend-mutations playbook warns against. Only enable when you
3916
+ * cannot reconcile from the server result.
3917
+ */
3918
+ invalidateOnSettle?: boolean;
3919
+ /**
3920
+ * Sibling query keys to invalidate on success. These must NOT include
3921
+ * `queryKey` — only caches you did not optimistically patch (e.g. a list the
3922
+ * detail view doesn't render). Refetching those is safe and keeps them fresh.
3923
+ */
3924
+ invalidateKeysOnSuccess?: QueryKey[];
3925
+ onError?: (args: {
3926
+ error: unknown;
3927
+ variables: TVariables;
3928
+ previous: TData | undefined;
3929
+ }) => void;
3930
+ onSuccess?: (args: {
3931
+ result: TResult;
3932
+ variables: TVariables;
3933
+ }) => void;
3934
+ onSettled?: (args: {
3935
+ variables: TVariables;
3936
+ }) => void;
3937
+ }
3938
+
3939
+ /**
3940
+ * A drop-in replacement for `Tabs`' uncontrolled `defaultValue` that survives a
3941
+ * reload — built for Artifact Studio artifacts.
3942
+ *
3943
+ * Artifacts run inside an iframe the preview page re-keys (by deployment id) on
3944
+ * every `seq-studio artifact dev` rebuild, so each rebuild fully *remounts* the
3945
+ * iframe to a fresh `src`: a brand-new browsing context that wipes React state,
3946
+ * the HashRouter route, and the active tab. We use `localStorage` (not
3947
+ * `sessionStorage`) deliberately: a remounted iframe is a new browsing context,
3948
+ * so sessionStorage survival across the remount is browser/spec-dependent, while
3949
+ * localStorage is origin/partition-scoped and persists regardless. It also keeps
3950
+ * the tab across a normal page refresh.
3951
+ *
3952
+ * Feed the returned tuple straight into a Radix `Tabs`:
3953
+ *
3954
+ * ```tsx
3955
+ * const [tab, setTab] = usePersistentTabValue({
3956
+ * storageKey: 'my-artifact:detail-tab',
3957
+ * defaultValue: 'overview',
3958
+ * })
3959
+ * <Tabs value={tab} onValueChange={setTab}>…</Tabs>
3960
+ * ```
3961
+ *
3962
+ * `storageKey` must be a stable, app-unique string. Compose in an entity id
3963
+ * (e.g. `my-artifact:workstream:${id}:tab`) if each entity should remember its
3964
+ * own tab.
3965
+ */
3966
+ export declare function usePersistentTabValue({ storageKey, defaultValue, }: {
3967
+ storageKey: string;
3968
+ defaultValue: string;
3969
+ }): readonly [string, (value: string) => void];
3970
+
3971
+ export declare function usePortalContainer(): HTMLElement | null;
3972
+
3973
+ export declare function UserAvatar({ name, avatarUrl, colorKey, initials: explicitInitials, size, fallback, className, }: UserAvatarProps): JSX.Element;
3974
+
3975
+ export declare interface UserAvatarProps {
3976
+ name: string;
3977
+ /** Profile image URL. Falls back to initials or the neutral icon. */
3978
+ avatarUrl?: string | null;
3979
+ /** Stable identifier for deterministic color (e.g. email). Falls back to name. */
3980
+ colorKey?: string;
3981
+ /**
3982
+ * Optional explicit initials (e.g. "AR", "ML"). Use when the displayed
3983
+ * `name` is a single token but you want a two-letter avatar — common in
3984
+ * Jarvis where `emailToName()` returns just the first name from the
3985
+ * TEAM roster. Falls back to deriving from `name` when omitted, which
3986
+ * yields a single letter for one-word names.
3987
+ */
3988
+ initials?: string;
3989
+ /** Size in px. Defaults to 20. */
3990
+ size?: number;
3991
+ /** Initials are the identity default; icon is for generic/unassigned people. */
3992
+ fallback?: 'initials' | 'icon';
3993
+ className?: string;
3994
+ }
3995
+
3996
+ /**
3997
+ * A person rendered as a first-class platform entity: an avatar (+ optional
3998
+ * name) that reveals an identity card on hover — name, email, organization, and
3999
+ * role. Read-only; use the same component everywhere a user appears so people
4000
+ * feel like consistent, recognizable objects across the platform.
4001
+ */
4002
+ export declare function UserChip({ user, showName, size, className }: UserChipProps): JSX.Element;
4003
+
4004
+ export declare interface UserChipProps {
4005
+ user: UserChipUser;
4006
+ /** Render the name beside the avatar. When false, only the avatar shows. */
4007
+ showName?: boolean;
4008
+ /** Avatar size in px (the inline trigger). Defaults to 22. */
4009
+ size?: number;
4010
+ className?: string;
4011
+ }
4012
+
4013
+ /**
4014
+ * Canonical shape for a platform user, mirroring the fields the Users surface
4015
+ * (chat-admin user management + `/api/user/list`) exposes. Only `name` is
4016
+ * required; everything else degrades gracefully.
4017
+ */
4018
+ export declare interface UserChipUser {
4019
+ name: string;
4020
+ email?: string | null;
4021
+ /** Tenant / org the user belongs to (e.g. "Sequence", "Acme Corp"). */
4022
+ organization?: string | null;
4023
+ role?: string | null;
4024
+ /** Profile image URL; falls back to a deterministic initials avatar. */
4025
+ avatarUrl?: string | null;
4026
+ /** Stable id for deterministic avatar color (defaults to email, then name). */
4027
+ colorKey?: string;
4028
+ /** Explicit initials override (e.g. "AR") when `name` is a single token. */
4029
+ initials?: string;
4030
+ }
4031
+
4032
+ /**
4033
+ * Resolve a `ParsedDate` (year/month/day, any of which may be null)
4034
+ * into a concrete `Date`, using the reference date and `dayDefault`
4035
+ * to fill in the missing pieces.
4036
+ *
4037
+ * Decisions:
4038
+ * - Missing day: 1st of the month for `start`, last day for `end`.
4039
+ * - Missing month: January (start) or December (end).
4040
+ * - Missing year: current year, unless picking that year would put
4041
+ * the date in the future for "bare month" inputs — in which case
4042
+ * we fall back to the prior year (matches Mercury's behaviour for
4043
+ * "Dec" entered in July).
4044
+ *
4045
+ * Returns `null` if the resulting date doesn't actually exist (e.g.
4046
+ * "Feb 30 2024" was typed).
4047
+ */
4048
+ /**
4049
+ * Direction the parser leans when a year is missing from the user's
4050
+ * input. Default is `'past'` — matches the original retrospective bias
4051
+ * (`"Dec"` in July → last December). Forward-planning surfaces (due
4052
+ * dates, scheduling) pass `'future'` so `"Jun 8"` in May reads as the
4053
+ * upcoming June 8 instead of last year's.
4054
+ */
4055
+ declare type YearBias = 'past' | 'future';
4056
+
4057
+ export { }
4058
+
4059
+
4060
+ declare module 'chart.js' {
4061
+ interface TooltipPositionerMap {
4062
+ cursor: TooltipPositionerFunction<ChartType>;
4063
+ }
4064
+ }