@akhil-saxena/design-system 1.2.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import react__default, { ButtonHTMLAttributes, ReactNode, InputHTMLAttributes, TextareaHTMLAttributes, HTMLAttributes, ChangeEvent, CSSProperties, ReactElement, RefObject } from 'react';
2
+ import react__default, { ButtonHTMLAttributes, ReactNode, InputHTMLAttributes, CSSProperties, HTMLAttributes, ElementType, AnchorHTMLAttributes, TextareaHTMLAttributes, ChangeEvent, ReactElement, RefObject } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  export { I as Icon, a as IconProps } from './Icon-XUp5t4PQ.js';
5
5
  import { UniqueIdentifier } from '@dnd-kit/core';
@@ -51,6 +51,28 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
51
51
  */
52
52
  declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
53
53
 
54
+ type OAuthProvider = "google" | "github" | "apple";
55
+ interface OAuthButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
56
+ /** OAuth provider — determines logo + default label. @default "google" */
57
+ provider?: OAuthProvider;
58
+ /** Override the button label (defaults to "Continue with {Provider}"). */
59
+ label?: string;
60
+ /** When true, renders inverted for dark surfaces. @default false */
61
+ dark?: boolean;
62
+ }
63
+ /**
64
+ * OAuth provider button. Renders the provider's official logo + a label
65
+ * styled to match DS Button conventions (44px height, 9px radius, transitions).
66
+ *
67
+ * Hooks into press feedback via `.ds-atom-oauthbtn:active { transform: scale(.97); }`
68
+ * defined in primitives.css.
69
+ *
70
+ * @example
71
+ * <OAuthButton provider="google" type="submit" />
72
+ * <OAuthButton provider="github" dark />
73
+ */
74
+ declare const OAuthButton: react.ForwardRefExoticComponent<OAuthButtonProps & react.RefAttributes<HTMLButtonElement>>;
75
+
54
76
  interface TextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "prefix"> {
55
77
  /** When true, applies error-state border color to the input or wrapper. */
56
78
  error?: boolean;
@@ -65,6 +87,303 @@ interface TextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "pr
65
87
  }
66
88
  declare const TextInput: react.ForwardRefExoticComponent<TextInputProps & react.RefAttributes<HTMLInputElement>>;
67
89
 
90
+ interface InlineEditFieldProps {
91
+ /** Current display value. */
92
+ value: string;
93
+ /**
94
+ * Called with the new value on commit (Enter, ⌘Enter for multiline, or blur).
95
+ * Return a Promise to trigger the saving state.
96
+ * If the Promise rejects, component enters error state with rejection message.
97
+ */
98
+ onSave: (next: string) => void | Promise<void>;
99
+ /** When true, renders a Textarea instead of a single-line TextInput.
100
+ * @default false
101
+ */
102
+ multiline?: boolean;
103
+ /** Placeholder shown in idle state when value is empty.
104
+ * Rendered as an italic span with `var(--ink-4)` color.
105
+ */
106
+ placeholder?: string;
107
+ /** When true, the idle span is not clickable.
108
+ * @default false
109
+ */
110
+ disabled?: boolean;
111
+ /** Maximum character length passed to the underlying input/textarea. */
112
+ maxLength?: number;
113
+ /**
114
+ * Accessible label for the trigger element in idle state and the underlying
115
+ * input in edit state. Required.
116
+ */
117
+ ariaLabel: string;
118
+ /**
119
+ * Typography preset for edit-mode input. Controls font-family + matching
120
+ * size defaults. Does NOT affect idle mode — idle inherits from parent.
121
+ * - "default" — Inter, 13px, weight 500 (matches existing INPUT style object)
122
+ * - "mono" — var(--mono), 10.5px, weight 700, letter-spacing .12em, uppercase
123
+ * - "serif" — Newsreader, 14px, line-height 1.55
124
+ * @default "default"
125
+ */
126
+ font?: "default" | "mono" | "serif";
127
+ className?: string;
128
+ style?: CSSProperties;
129
+ }
130
+ declare function InlineEditField({ value, onSave, multiline, placeholder, disabled, maxLength, ariaLabel, font, className, style, }: InlineEditFieldProps): react_jsx_runtime.JSX.Element;
131
+
132
+ interface InlineAddRowProps {
133
+ /** Placeholder shown in both the dashed trigger and the active input. */
134
+ placeholder?: string;
135
+ /** Called with the trimmed value when the user commits (Enter). */
136
+ onSave: (value: string) => void;
137
+ /** Keyboard hint rendered at the right edge of the active input. */
138
+ kbdHint?: string;
139
+ className?: string;
140
+ style?: CSSProperties;
141
+ }
142
+ /**
143
+ * InlineAddRow — a dashed "+ add" affordance that expands into an inline text
144
+ * input on click. Enter commits (`onSave` with the trimmed value); Esc or blur
145
+ * discards. Use for "add a question / note / person / row" patterns where a full
146
+ * form is overkill.
147
+ *
148
+ * @example
149
+ * <InlineAddRow placeholder="Add a question…" onSave={(t) => addQuestion(t)} />
150
+ */
151
+ declare const InlineAddRow: react.ForwardRefExoticComponent<InlineAddRowProps & react.RefAttributes<HTMLDivElement>>;
152
+
153
+ type EyebrowSize = "xs" | "sm" | "md";
154
+ type EyebrowTone = "ink-3" | "ink-4" | "amber";
155
+ interface EyebrowProps extends HTMLAttributes<HTMLSpanElement> {
156
+ /** Type-scale token. @default "sm" */
157
+ size?: EyebrowSize;
158
+ /** Override color (legacy — defaults to var(--ink-3)). Use `tone` for the
159
+ * declarative path. */
160
+ color?: string;
161
+ /** Tone token — emits a data-attr so CSS rules apply the color. */
162
+ tone?: EyebrowTone;
163
+ }
164
+ /**
165
+ * Mono-caps eyebrow / overline. Used as form field labels, hero kickers,
166
+ * section headers, and stage-chip captions.
167
+ *
168
+ * `tone` (declarative, CSS data-attr) is the preferred way to set color in
169
+ * new code; `color` (legacy inline override) still works for one-offs.
170
+ *
171
+ * @example
172
+ * <Eyebrow>FULL NAME</Eyebrow>
173
+ * <Eyebrow size="md" tone="amber">WELCOME BACK</Eyebrow>
174
+ */
175
+ declare const Eyebrow: react.ForwardRefExoticComponent<EyebrowProps & react.RefAttributes<HTMLSpanElement>>;
176
+
177
+ type TextVariant = "body" | "small" | "caption" | "legal";
178
+ type TextElement = "p" | "span" | "div";
179
+ type TextSizeToken = "2xs" | "xs" | "sm" | "base" | "md" | "lg";
180
+ type TextWeightToken = "regular" | "medium" | "bold" | "black";
181
+ type TextTone = "ink" | "ink-2" | "ink-3" | "ink-4" | "amber" | "red" | "green";
182
+ type TextLeading = "tight" | "snug" | "normal" | "relaxed";
183
+ interface TextProps extends HTMLAttributes<HTMLElement> {
184
+ /** Legacy preset — drives inline style. @default "body" */
185
+ variant?: TextVariant;
186
+ /** Semantic element to render. @default "p" */
187
+ as?: TextElement;
188
+ /** Override color (legacy — defaults to tone for variant). Use `tone` for
189
+ * the declarative path. */
190
+ color?: string;
191
+ /** Override max-width — caps line length for readability. */
192
+ maxWidth?: number | string;
193
+ /** Type-scale token — emits data-attr; CSS applies font-size. */
194
+ size?: TextSizeToken;
195
+ /** Weight token — emits data-attr; CSS applies font-weight. */
196
+ weight?: TextWeightToken;
197
+ /** Color tone token — emits data-attr; CSS applies color. */
198
+ tone?: TextTone;
199
+ /** When true, swaps to var(--mono) family + letter-spacing. */
200
+ mono?: boolean;
201
+ /** Line-height token — overrides the default (relaxed). */
202
+ leading?: TextLeading;
203
+ }
204
+ /**
205
+ * Body text primitive. Two APIs coexist:
206
+ * - **Legacy:** `variant` preset drives inline style (body/small/caption/legal).
207
+ * - **Token/data-attr:** `size` + `tone` + `weight` + `mono` + `leading` all
208
+ * emit data-attrs; `primitives.css` resolves them. Use this for new code.
209
+ *
210
+ * The two are NOT exclusive — pass `variant` for the base + a `size`/`tone`
211
+ * override to tweak one axis.
212
+ *
213
+ * @example
214
+ * <Text>Mark every step of your job search.</Text>
215
+ * <Text size="sm" tone="ink-3">Applied 3d ago</Text>
216
+ * <Text variant="caption" maxWidth={360}>Sent to alex@example.com…</Text>
217
+ */
218
+ declare const Text: react.ForwardRefExoticComponent<TextProps & react.RefAttributes<HTMLElement>>;
219
+
220
+ type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
221
+ type HeadingSizeToken = "2xs" | "xs" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
222
+ type HeadingWeightToken = "regular" | "medium" | "bold" | "black";
223
+ type HeadingTone = "ink" | "ink-2" | "ink-3" | "amber";
224
+ interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
225
+ /** Semantic heading level. @default 2 */
226
+ level?: HeadingLevel;
227
+ /** Visual size — either a px number (legacy, drives inline style) or a
228
+ * type-scale token ('2xs'..'4xl') which routes through the CSS data-attr
229
+ * path. @default 28
230
+ */
231
+ size?: number | HeadingSizeToken;
232
+ /** Archivo weight — numeric (legacy) or token. @default 900 */
233
+ weight?: 500 | 600 | 700 | 800 | 900 | HeadingWeightToken;
234
+ /** Override color (legacy — defaults to var(--ink)). Use `tone` for the
235
+ * declarative path. */
236
+ color?: string;
237
+ /** Tone token — emits a data-attr so CSS rules apply the color. */
238
+ tone?: HeadingTone;
239
+ /** Override the rendered tag — useful when the visual size and the semantic
240
+ * level diverge (e.g. an `<h2>` styled as a small kicker). */
241
+ as?: ElementType;
242
+ }
243
+ /**
244
+ * Display heading primitive — for hero headlines and form headlines.
245
+ *
246
+ * Two APIs coexist:
247
+ * - **Legacy/inline:** `size={28}` (number) + `weight={900}` (number) drives
248
+ * inline style. Letter-spacing derives from size.
249
+ * - **Token/data-attr:** `size="2xl"` + `weight="black"` emit data-attrs;
250
+ * `primitives.css` applies font-size + font-weight from token vars. Use this
251
+ * for new code where the theme drives sizing.
252
+ *
253
+ * @example
254
+ * <Heading level={1} size={72} weight={900}>Job search, organized.</Heading>
255
+ * <Heading level={2} size="2xl" weight="black" tone="amber">Settings</Heading>
256
+ */
257
+ declare const Heading: react.ForwardRefExoticComponent<HeadingProps & react.RefAttributes<HTMLHeadingElement>>;
258
+
259
+ type DividerSpacing = "none" | "sm" | "md" | "lg" | "xl";
260
+ type DividerAccent = "dashed" | "amber";
261
+ interface DividerProps extends HTMLAttributes<HTMLDivElement> {
262
+ /** Optional centered label between two hairlines (e.g. "OR"). */
263
+ label?: ReactNode;
264
+ /** When true, renders vertically (height: 100%, width: 1px). @default false */
265
+ vertical?: boolean;
266
+ /** Override the hairline color (defaults to var(--rule)). */
267
+ color?: string;
268
+ /** Margin preset — data-attr-driven via primitives.css. When set, overrides
269
+ * the legacy default (no margin for horizontal, var(--space-3) horizontal
270
+ * for vertical). */
271
+ spacing?: DividerSpacing;
272
+ /** Accent style — `dashed` uses a dashed top-border, `amber` paints an
273
+ * amber-tinted 2px hairline. */
274
+ accent?: DividerAccent;
275
+ }
276
+ /**
277
+ * Hairline rule with an optional centered label.
278
+ *
279
+ * - Horizontal (default): `1px` rule across the row; label centered with
280
+ * monospace caps if provided (e.g. the "OR" between OAuth and email forms).
281
+ * - Vertical: `1px` rule fills the parent's height.
282
+ *
283
+ * New axes (data-attr driven):
284
+ * - `spacing` adds the bundle's margin presets.
285
+ * - `accent` swaps to dashed or amber-tinted stylings via primitives.css.
286
+ *
287
+ * @example
288
+ * <Divider />
289
+ * <Divider label="OR" spacing="md" />
290
+ * <Divider accent="amber" spacing="lg" />
291
+ */
292
+ declare const Divider: react.ForwardRefExoticComponent<DividerProps & react.RefAttributes<HTMLDivElement>>;
293
+
294
+ type LinkVariant = "default" | "inline" | "footer" | "action" | "quiet";
295
+ interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
296
+ /** Style variant.
297
+ * - `default` — neutral inline link, amber on hover.
298
+ * - `inline` — body-text inline link, amber underline.
299
+ * - `footer` — small footer/cross-link.
300
+ * - `action` — bold action link with trailing arrow (e.g. "Sign in →").
301
+ * - `quiet` — muted, no underline until hover.
302
+ * @default "inline"
303
+ */
304
+ variant?: LinkVariant;
305
+ /** Override color (inline). */
306
+ color?: string;
307
+ /** Override the rendered element. Use to attach Link styles to a `<button>`
308
+ * or any custom element. @default "a"
309
+ */
310
+ as?: ElementType;
311
+ }
312
+ /**
313
+ * Text-style hyperlink primitive. Five variants cover the common surfaces:
314
+ * default (neutral), inline (body-text amber), footer (small cross-link),
315
+ * action (bold with arrow), quiet (muted, hover-only underline).
316
+ *
317
+ * `as` overrides the rendered element — useful when the visual contract is
318
+ * "link" but the semantic is "button" (e.g. JS-handled actions).
319
+ *
320
+ * @example
321
+ * <Link href="/signin">Sign in</Link>
322
+ * <Link variant="quiet" href="/legal">Legal</Link>
323
+ * <Link variant="footer" as="button" onClick={clear}>CLEAR</Link>
324
+ */
325
+ declare const Link: react.ForwardRefExoticComponent<LinkProps & react.RefAttributes<HTMLAnchorElement>>;
326
+
327
+ interface DotGridProps extends HTMLAttributes<HTMLDivElement> {
328
+ /** Dot color (any CSS color). @default "var(--cream)" */
329
+ color?: string;
330
+ /** Dot opacity. @default 0.055 */
331
+ opacity?: number;
332
+ /** Tile size in px — controls dot spacing. @default 18 */
333
+ tile?: number;
334
+ /** Dot radius in px. @default 1.4 */
335
+ dotRadius?: number;
336
+ }
337
+ /**
338
+ * Radial-gradient dot-pattern overlay. Use as an `position: absolute; inset: 0;`
339
+ * decoration on dark hero panels, marketing surfaces, or empty-state backgrounds.
340
+ *
341
+ * Pointer-events disabled so it never blocks content underneath.
342
+ *
343
+ * @example
344
+ * <div style={{ position: "relative" }}>
345
+ * <DotGrid />
346
+ * <p>Hero content over dots…</p>
347
+ * </div>
348
+ */
349
+ declare const DotGrid: react.ForwardRefExoticComponent<DotGridProps & react.RefAttributes<HTMLDivElement>>;
350
+
351
+ interface SplitHeroProps extends Omit<HTMLAttributes<HTMLElement>, "children"> {
352
+ /** Left/aside content — typically a marketing or brand panel on a dark surface. */
353
+ aside: ReactNode;
354
+ /** Right/main content — typically the form, body, or interactive payload. */
355
+ main: ReactNode;
356
+ /** Aside-to-main column ratio, e.g. "1fr 1fr" (default) or "1.15fr 1fr". @default "1fr 1fr" */
357
+ ratio?: string;
358
+ /** Aside background color. @default "var(--ink)" */
359
+ asideBackground?: string;
360
+ /** Main background color. @default "var(--cream)" */
361
+ mainBackground?: string;
362
+ /** When viewport ≤ this breakpoint (px), stack vertically (aside on top). @default 900 */
363
+ stackBelow?: number;
364
+ /** When viewport ≤ this breakpoint (px), hide the aside entirely. @default 600 */
365
+ hideAsideBelow?: number;
366
+ }
367
+ /**
368
+ * Two-column page chrome for marketing / auth / onboarding surfaces.
369
+ *
370
+ * - Desktop (`> stackBelow`): aside | main, side-by-side.
371
+ * - Tablet (`≤ stackBelow`, `> hideAsideBelow`): stacked vertically.
372
+ * - Mobile (`≤ hideAsideBelow`): aside hidden, main fills the viewport.
373
+ *
374
+ * The root is `height: 100vh; overflow: hidden;` so the aside cannot push the
375
+ * page taller than the viewport; the `main` slot internally allows scroll for
376
+ * long forms. At the stacked breakpoints the clamp releases so the page
377
+ * scrolls naturally.
378
+ *
379
+ * @example
380
+ * <SplitHero
381
+ * aside={<HeroPanel kicker="WELCOME BACK" headline="Sign in to your trail." />}
382
+ * main={<SignInForm />}
383
+ * />
384
+ */
385
+ declare const SplitHero: react.ForwardRefExoticComponent<SplitHeroProps & react.RefAttributes<HTMLElement>>;
386
+
68
387
  interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
69
388
  /** When true, applies error-state border color to the textarea. */
70
389
  error?: boolean;
@@ -84,6 +403,13 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
84
403
  }
85
404
  declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
86
405
 
406
+ type KbdSize = "sm" | "md";
407
+ interface KbdProps extends HTMLAttributes<HTMLElement> {
408
+ /** Size variant. "sm" for inline hints (9.5px); "md" default (11px). */
409
+ size?: KbdSize;
410
+ }
411
+ declare const Kbd: react.ForwardRefExoticComponent<KbdProps & react.RefAttributes<HTMLElement>>;
412
+
87
413
  type ChipTone = "default" | "match" | "miss" | "learning" | "tag";
88
414
  interface ChipProps extends HTMLAttributes<HTMLSpanElement> {
89
415
  /** Color tone applying semantic background and text colors.
@@ -105,6 +431,18 @@ interface AvatarProps extends HTMLAttributes<HTMLDivElement> {
105
431
  name?: string;
106
432
  /** Override the auto-derived initials (1–2 uppercase letters). */
107
433
  initials?: string;
434
+ /**
435
+ * Derive the background color from this string instead of `name` — e.g. a
436
+ * stable id — so the color stays fixed even if the display name changes.
437
+ * Initials are still derived from `name`/`initials`.
438
+ */
439
+ seed?: string;
440
+ /**
441
+ * Override the built-in solid-color palette used for the name→color hash.
442
+ * Pass a custom set (e.g. WCAG-tuned colors) to control which colors the
443
+ * deterministic hash can land on. Ignored when `gradient` is set.
444
+ */
445
+ palette?: string[];
108
446
  /**
109
447
  * URL of an image to display. When provided, the image fills the circle and
110
448
  * initials/background are not rendered.
@@ -248,6 +586,55 @@ interface RollingNumberProps {
248
586
  }
249
587
  declare function RollingNumber({ value, format, prefix, suffix, variant, ariaLabel, className, style, }: RollingNumberProps): react_jsx_runtime.JSX.Element;
250
588
 
589
+ type StatCardChangeDir = "up" | "down";
590
+ interface StatCardProps {
591
+ /** Monospace uppercase label, e.g. "Total Applications" */
592
+ label: string;
593
+ /** Primary metric value as string or number, e.g. "24", "42%", "4.2d" */
594
+ value: string | number;
595
+ /** Change string displayed in trend badge, e.g. "+12%", "-5%" */
596
+ change?: string;
597
+ /** Trend direction — determines badge and sparkline color */
598
+ changeDir?: StatCardChangeDir;
599
+ /** Sparkline data points — renders chart when provided (min 2 points) */
600
+ data?: number[];
601
+ /** Additional className forwarded to the root div */
602
+ className?: string;
603
+ /** Additional inline styles for the root div */
604
+ style?: CSSProperties;
605
+ }
606
+ declare function StatCard({ label, value, change, changeDir, data, className, style, }: StatCardProps): react_jsx_runtime.JSX.Element;
607
+
608
+ interface SparklineProps {
609
+ data: number[];
610
+ width?: number;
611
+ height?: number;
612
+ color?: string;
613
+ fill?: boolean;
614
+ /** Accessible label. Defaults to "Trend chart". */
615
+ ariaLabel?: string;
616
+ }
617
+ declare function Sparkline({ data, width, height, color, fill, ariaLabel, }: SparklineProps): react_jsx_runtime.JSX.Element | null;
618
+
619
+ interface MiniDonutProps {
620
+ value: number;
621
+ max?: number;
622
+ size?: number;
623
+ strokeWidth?: number;
624
+ color?: string;
625
+ /** Accessible label. Defaults to "{percentage}%". */
626
+ ariaLabel?: string;
627
+ }
628
+ declare function MiniDonut({ value, max, size, strokeWidth, color, ariaLabel, }: MiniDonutProps): react_jsx_runtime.JSX.Element;
629
+
630
+ interface MiniBarProps {
631
+ data: number[];
632
+ labels?: string[];
633
+ height?: number;
634
+ barColor?: string;
635
+ }
636
+ declare function MiniBar({ data, labels, height, barColor }: MiniBarProps): react_jsx_runtime.JSX.Element;
637
+
251
638
  interface RangeSliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange" | "min" | "max" | "step" | "disabled"> {
252
639
  /** Controlled numeric value of the slider thumb position. */
253
640
  value: number;
@@ -310,6 +697,41 @@ interface StarRatingProps {
310
697
  }
311
698
  declare function StarRating({ value, onChange, size, label, readOnly, disabled, className, style, }: StarRatingProps): react_jsx_runtime.JSX.Element;
312
699
 
700
+ type StatusPillStage = "wishlist" | "applied" | "screening" | "interviewing" | "offer" | "closed";
701
+ interface StatusPillBaseProps {
702
+ /** Pipeline stage — drives bg/color tinting. */
703
+ stage: StatusPillStage;
704
+ /** Show trailing chevron (▾) — signals the pill is a dropdown trigger. */
705
+ withChevron?: boolean;
706
+ /** When true, renders as <button>. When false, renders as <span> and ignores
707
+ * onClick. Use false for table cells / read-only kanban cards where the pill
708
+ * is decorative.
709
+ * @default true
710
+ */
711
+ interactive?: boolean;
712
+ children: ReactNode;
713
+ }
714
+ type StatusPillProps = StatusPillBaseProps & ((Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof StatusPillBaseProps> & {
715
+ interactive?: true;
716
+ }) | (Omit<HTMLAttributes<HTMLSpanElement>, keyof StatusPillBaseProps> & {
717
+ interactive: false;
718
+ }));
719
+ /**
720
+ * StatusPill - per-stage tinted chip for Cairn-style kanban + DataGrid status columns.
721
+ *
722
+ * Six locked stage variants (`wishlist`, `applied`, `screening`, `interviewing`,
723
+ * `offer`, `closed`) map to subtle tints — `wishlist`/`applied` are outlined,
724
+ * `screening`/`interviewing` use amber tints, `offer` uses green, `closed` is muted.
725
+ * Use the same atom in both kanban cards and DataGrid status columns so the
726
+ * visual contract stays single-sourced.
727
+ *
728
+ * <StatusPill stage="screening" withChevron onClick={openMenu}>Screening</StatusPill>
729
+ * <StatusPill stage="offer" interactive={false}>Offer</StatusPill>
730
+ *
731
+ * Visual styling lives in primitives.css under `.ds-atom-statuspill[.stage]`.
732
+ */
733
+ declare const StatusPill: react.ForwardRefExoticComponent<StatusPillProps & react.RefAttributes<HTMLButtonElement | HTMLSpanElement>>;
734
+
313
735
  type StickyNoteRotation = "left" | "right" | "none";
314
736
  interface StickyNoteProps extends HTMLAttributes<HTMLDivElement> {
315
737
  /** Static rotation applied to the note surface for a handwritten feel.
@@ -338,38 +760,39 @@ interface StickyNoteProps extends HTMLAttributes<HTMLDivElement> {
338
760
  declare const StickyNote: react.ForwardRefExoticComponent<StickyNoteProps & react.RefAttributes<HTMLDivElement>>;
339
761
 
340
762
  type CardVariant = "glass" | "amber" | "dark" | "kanban";
763
+ type CardPadding = "none" | "sm" | "md" | "lg" | "xl";
764
+ type CardRadius = "sm" | "md" | "lg" | "xl";
765
+ type CardTone = "amber" | "cream-2" | "flat";
766
+ type CardHover = "elevate";
341
767
  interface CardProps extends HTMLAttributes<HTMLDivElement> {
342
- /** Surface style variant.
343
- * - `glass` - translucent glass surface (default).
344
- * - `amber` - amber-tinted CTA card.
345
- * - `dark` - always-dark surface independent of theme.
346
- * - `kanban` - compact glass with hover-lift; use for drag-and-drop boards.
347
- * @default "glass"
348
- */
768
+ /** Top-level preset (legacy). One of glass / amber / dark / kanban. Adds
769
+ * its own bg + border treatment via `data-variant`. @default "glass" */
349
770
  variant?: CardVariant;
350
- /** Arbitrary JSX content; Card has no compound structure - compose freely. */
771
+ /** Padding scale. Independent of variant. */
772
+ padding?: CardPadding;
773
+ /** Border-radius token. Independent of variant. */
774
+ radius?: CardRadius;
775
+ /** Surface tone (separate axis from variant). `amber` tints the bg, `flat`
776
+ * uses a dashed neutral border, `cream-2` switches to the cream-2 surface. */
777
+ tone?: CardTone;
778
+ /** Interactive elevation on hover. Adds shadow + cursor + border-color shift. */
779
+ hover?: CardHover;
780
+ /** Override the rendered element. @default "div" */
781
+ as?: ElementType;
351
782
  children: ReactNode;
352
783
  }
353
784
  /**
354
- * Card - surface primitive with 4 variants (D-300, D-301, D-302).
355
- *
356
- * <Card variant="glass"> // default - translucent glass surface
357
- * <Card variant="amber"> // amber-tinted CTA card
358
- * <Card variant="dark"> // always-dark surface (handoff invariant)
359
- * <Card variant="kanban"> // compact glass card with hover-lift; visual surface only
785
+ * Card surface primitive. Visual is driven by a top-level `variant` plus
786
+ * independent data-attr axes (`padding`, `radius`, `tone`, `hover`).
360
787
  *
361
- * Children are arbitrary JSX - there is no compound API. Compose freely:
788
+ * <Card>...</Card> // glass, default radius/padding
789
+ * <Card variant="amber">...</Card> // amber CTA card
790
+ * <Card variant="kanban" hover="elevate">...</Card> // hover-lift kanban surface
791
+ * <Card padding="lg" radius="xl" tone="cream-2"> // declarative overrides
362
792
  *
363
- * <Card variant="glass">
364
- * <header>...</header>
365
- * <div>...</div>
366
- * <footer>...</footer>
367
- * </Card>
368
- *
369
- * The `kanban` variant ships only the VISUAL surface (12px padding, 10px
370
- * radius, glass bg, hover shadow lift). Application data binding (logo +
371
- * role + age + chips + priority dot) is deferred to Wave 7 / DragDropList
372
- * per D-302.
793
+ * The four axes layer on top of each other — variant sets the baseline, the
794
+ * data-attr axes refine padding/radius/tone/hover. See primitives.css for
795
+ * the resolved rules.
373
796
  */
374
797
  declare const Card: react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLDivElement>>;
375
798
 
@@ -538,57 +961,92 @@ interface ModalProps {
538
961
  * - closeOnBackdropClick defaults to true; click on backdrop only (not panel) closes
539
962
  * - Animations namespaced (ds-atom-modal-fadein, ds-atom-modal-in) to avoid
540
963
  * colliding with consumer-defined keyframes
541
- *
542
- * ConfirmDialog ships from this same file as a named variant export (D-287, D-356).
543
964
  */
544
965
  declare function Modal({ open, onClose, title, description, footer, children, closeOnBackdropClick, role, initialFocus, className, style, }: ModalProps): react_jsx_runtime.JSX.Element | null;
966
+
967
+ type ConfirmDialogTone = "danger" | "warn" | "success" | "neutral";
545
968
  interface ConfirmDialogProps {
546
969
  /** Controls visibility; returns null when false. */
547
970
  open: boolean;
548
- /** Called when the user dismisses or cancels the dialog. */
971
+ /** Called when the user cancels (Escape key or Cancel button). */
549
972
  onClose: () => void;
550
- /** Heading text for the confirmation dialog. */
973
+ /** Called when the user confirms (Enter key or Confirm button). */
974
+ onConfirm: () => void;
975
+ /** Visual tone — controls icon, icon bg, and confirm button style. */
976
+ tone?: ConfirmDialogTone;
977
+ /** Dialog heading. */
551
978
  title: ReactNode;
552
- /** Supplemental explanation shown below the title; string gets `aria-describedby`, ReactNode renders as children. */
553
- description?: ReactNode;
554
- /** Label for the confirm action button.
979
+ /** Optional body text below the heading. */
980
+ body?: ReactNode;
981
+ /** Label for the confirm button.
555
982
  * @default "Confirm"
556
983
  */
557
984
  confirmLabel?: string;
558
- /** Label for the cancel action button.
985
+ /** Label for the cancel button.
559
986
  * @default "Cancel"
560
987
  */
561
988
  cancelLabel?: string;
562
- /** When true, uses `role="alertdialog"`, disables backdrop close, and styles confirm as `danger`.
563
- * @default false
564
- */
565
- danger?: boolean;
566
- /** Called when the user clicks the confirm button. */
989
+ }
990
+ declare function ConfirmDialog({ open, onClose, onConfirm, tone, title, body, confirmLabel, cancelLabel, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element | null;
991
+ interface TypeToConfirmProps {
992
+ /** Controls visibility; returns null when false. */
993
+ open: boolean;
994
+ /** Called when the user cancels (Escape key or Cancel button). */
995
+ onClose: () => void;
996
+ /** Called when the user confirms (Enter key when ok, or Confirm button). */
567
997
  onConfirm: () => void;
998
+ /** Dialog heading. */
999
+ title: ReactNode;
1000
+ /** Optional body text below the heading. */
1001
+ body?: ReactNode;
1002
+ /** Word the user must type exactly (case-sensitive, no trim) to enable confirm.
1003
+ * @default "DELETE"
1004
+ */
1005
+ guardWord?: string;
1006
+ /** Label for the confirm button.
1007
+ * @default "Delete forever"
1008
+ */
1009
+ confirmLabel?: string;
1010
+ /** Label for the cancel button.
1011
+ * @default "Cancel"
1012
+ */
1013
+ cancelLabel?: string;
568
1014
  }
569
- /**
570
- * ConfirmDialog - Modal-as-confirmation variant (D-287, D-356).
571
- *
572
- * <ConfirmDialog
573
- * open={open}
574
- * onClose={close}
575
- * onConfirm={doDelete}
576
- * title="Delete application?"
577
- * description="This cannot be undone."
578
- * confirmLabel="Yes, delete"
579
- * danger
580
- * />
581
- *
582
- * When `danger=true`:
583
- * - role="alertdialog"
584
- * - closeOnBackdropClick=false (forces explicit Cancel/Confirm)
585
- * - Confirm button uses Button variant="danger"
586
- *
587
- * `description` accepts string or ReactNode. Strings flow to Modal's
588
- * `description` prop (gets aria-describedby wiring); ReactNode renders
589
- * inline as Modal children (no auto aria-describedby).
590
- */
591
- declare function ConfirmDialog({ open, onClose, title, description, confirmLabel, cancelLabel, danger, onConfirm, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
1015
+ declare function TypeToConfirm({ open, onClose, onConfirm, title, body, guardWord, confirmLabel, cancelLabel, }: TypeToConfirmProps): react_jsx_runtime.JSX.Element | null;
1016
+
1017
+ interface CommandPaletteItem {
1018
+ /** Stable identity used as the React key. */
1019
+ id: string;
1020
+ /** Display label; used for case-insensitive substring filtering. */
1021
+ label: string;
1022
+ /** Group bucket name; items with the same group cluster under a header. */
1023
+ group: string;
1024
+ /** Optional ReactNode icon (16–18px recommended). */
1025
+ icon?: ReactNode;
1026
+ /** Optional keyboard shortcut hint, rendered as a Kbd chip. */
1027
+ shortcut?: string;
1028
+ /** Fires when the item is selected (Enter on active row, or click). */
1029
+ onSelect: () => void;
1030
+ }
1031
+ interface CommandPaletteProps {
1032
+ /** Controls visibility; component returns null when false. */
1033
+ open: boolean;
1034
+ /** Called when the user dismisses the palette (Escape, backdrop click, item select). */
1035
+ onClose: () => void;
1036
+ /** Flat list of items; the component derives groups internally. */
1037
+ items: CommandPaletteItem[];
1038
+ /** Search input placeholder.
1039
+ * @default "Type a command or search…"
1040
+ */
1041
+ placeholder?: string;
1042
+ /** Optional override text shown when filter has zero matches. Defaults to `No results for "<query>"`. */
1043
+ emptyText?: string;
1044
+ /** Optional className appended to the panel. */
1045
+ className?: string;
1046
+ /** Optional inline style applied to the panel. */
1047
+ style?: CSSProperties;
1048
+ }
1049
+ declare function CommandPalette({ open, onClose, items, placeholder, emptyText, className, style, }: CommandPaletteProps): react_jsx_runtime.JSX.Element | null;
592
1050
 
593
1051
  type SheetSide = "right" | "left";
594
1052
  interface SheetProps {
@@ -697,6 +1155,13 @@ interface BottomSheetProps {
697
1155
  * Defaults to detecting `html.dark` (Canvas dark mode toggle).
698
1156
  */
699
1157
  dark?: boolean;
1158
+ /**
1159
+ * Track the mobile soft keyboard via `window.visualViewport` and lift the
1160
+ * footer above it (padding-bottom = visible-viewport delta). Defaults to
1161
+ * true. Set false to opt out; it is a no-op anyway on platforms without a
1162
+ * `visualViewport` (e.g. desktop) or when there is no footer.
1163
+ */
1164
+ trackKeyboard?: boolean;
700
1165
  className?: string;
701
1166
  style?: CSSProperties;
702
1167
  }
@@ -730,7 +1195,38 @@ interface BottomSheetProps {
730
1195
  * feeding it into useFocusTrap's `active` arg ensures the trap re-runs
731
1196
  * once the portal commits the panel into the DOM.
732
1197
  */
733
- declare function BottomSheet({ open, onClose, title, footer, children, height, closeOnBackdropClick, dark, className, style, }: BottomSheetProps): react_jsx_runtime.JSX.Element | null;
1198
+ declare function BottomSheet({ open, onClose, title, footer, children, height, closeOnBackdropClick, dark, trackKeyboard, className, style, }: BottomSheetProps): react_jsx_runtime.JSX.Element | null;
1199
+
1200
+ interface ActionSheetItem {
1201
+ label: string;
1202
+ /** `"destructive"` renders the label in `--red`. */
1203
+ variant?: "default" | "destructive";
1204
+ onSelect: () => void;
1205
+ }
1206
+ interface ActionSheetProps {
1207
+ open: boolean;
1208
+ onClose: () => void;
1209
+ items: ActionSheetItem[];
1210
+ /** Dismiss-without-picking label. Default "Close". Backdrop tap + Esc also dismiss. */
1211
+ cancelLabel?: string;
1212
+ }
1213
+ /**
1214
+ * ActionSheet — an iOS-style bottom-anchored action list: a rounded block of
1215
+ * tappable items plus a separate Cancel block. Backdrop tap, the Cancel button,
1216
+ * and Esc all dismiss; body scroll locks while open. Pair with `useLongPress`
1217
+ * for the touch "long-press → actions" pattern.
1218
+ *
1219
+ * @example
1220
+ * <ActionSheet
1221
+ * open={open}
1222
+ * onClose={() => setOpen(false)}
1223
+ * items={[
1224
+ * { label: "Edit", onSelect: edit },
1225
+ * { label: "Delete", variant: "destructive", onSelect: remove },
1226
+ * ]}
1227
+ * />
1228
+ */
1229
+ declare function ActionSheet({ open, onClose, items, cancelLabel }: ActionSheetProps): react.ReactPortal | null;
734
1230
 
735
1231
  interface LightboxItem {
736
1232
  src: string;
@@ -937,6 +1433,12 @@ interface AlertBannerProps extends Omit<HTMLAttributes<HTMLDivElement>, "title">
937
1433
  children?: ReactNode;
938
1434
  /** Whether to show the dismiss X button. Defaults to `!!onDismiss`. Pass `false` to suppress it. */
939
1435
  dismissible?: boolean;
1436
+ /** Whether the title renders in semibold (600) or regular (400) weight.
1437
+ * Default `true` keeps the original bold weight; `false` is for surfaces
1438
+ * where the icon + tone already signal severity and bold feels heavy.
1439
+ * @default true
1440
+ */
1441
+ boldTitle?: boolean;
940
1442
  }
941
1443
  /**
942
1444
  * AlertBanner - inline-flow controlled tone banner (D-410, D-411).
@@ -1059,6 +1561,87 @@ interface ToastProviderProps {
1059
1561
  */
1060
1562
  declare function ToastProvider({ children }: ToastProviderProps): react_jsx_runtime.JSX.Element;
1061
1563
 
1564
+ /**
1565
+ * Snackbar — bottom-center, solid-fill action surface. Companion to Toast
1566
+ * but with a different intent: snackbars confirm a destructive or
1567
+ * reversible action and offer an inline UNDO / RETRY. Toast is for
1568
+ * passive notifications; Snackbar pairs with a callback. Single-at-a-time
1569
+ * (replaces any active snackbar with FIFO ordering) — never stacks. Solid
1570
+ * ink background so the message stays readable over any page chrome
1571
+ * (Toast's translucent fill becomes hard to read on top-heavy apps).
1572
+ */
1573
+ type SnackbarTone = "neutral" | "success" | "error";
1574
+ interface SnackbarAction {
1575
+ /** Visible label, e.g. "UNDO", "RETRY". Rendered mono caps amber. */
1576
+ label: string;
1577
+ /** Fires when the action is activated. The snackbar auto-dismisses after. */
1578
+ onClick: () => void;
1579
+ }
1580
+ interface SnackbarOptions {
1581
+ /** Auto-dismiss after `duration` ms. Default 5000 (longer than Toast — the
1582
+ * user needs time to read + click the action). Pass `Infinity` to disable. */
1583
+ duration?: number;
1584
+ /** Optional inline action (UNDO / RETRY / etc.). Rendered to the right of
1585
+ * the message. Clicking it fires `onClick` then dismisses the snackbar. */
1586
+ action?: SnackbarAction;
1587
+ /** Visual tone. `"neutral"` (default) for confirmations; `"success"` /
1588
+ * `"error"` add a left-border accent without changing the ink fill. */
1589
+ tone?: SnackbarTone;
1590
+ /** Show the explicit dismiss "✕" affordance.
1591
+ *
1592
+ * Default behavior:
1593
+ * - with `action` → false (the action button doubles as the dismiss path,
1594
+ * plus the timeout will close it; an extra "✕" is redundant chrome)
1595
+ * - without `action` → true (otherwise the snackbar would only have the
1596
+ * timeout as an escape hatch, which is too implicit)
1597
+ *
1598
+ * Pass an explicit boolean to override.
1599
+ */
1600
+ dismissible?: boolean;
1601
+ /** Render a thin countdown progress bar along the bottom edge that depletes
1602
+ * (width 100% → 0%) linearly over `duration` ms — a visual undo timer
1603
+ * (matches the SoftConfirmToast pattern). Only renders when `true` AND
1604
+ * `duration` is finite. Respects `prefers-reduced-motion: reduce` (the bar
1605
+ * is shown static, no animation). Default `false`. */
1606
+ progress?: boolean;
1607
+ }
1608
+ interface SnackbarApi {
1609
+ /** Show a snackbar. Replaces any active snackbar (single-at-a-time). */
1610
+ show: (message: ReactNode, opts?: SnackbarOptions) => number;
1611
+ dismiss: (id: number) => void;
1612
+ }
1613
+ /**
1614
+ * useSnackbar — imperative bottom-center action surface hook.
1615
+ *
1616
+ * Must be called inside a `<SnackbarProvider>`. Throws otherwise.
1617
+ *
1618
+ * const snack = useSnackbar();
1619
+ * snack.show("Application deleted.", {
1620
+ * action: { label: "UNDO", onClick: () => restore(row) },
1621
+ * });
1622
+ * snack.show("Saved.", { tone: "success" });
1623
+ * const id = snack.show("...", { duration: Infinity });
1624
+ * snack.dismiss(id);
1625
+ */
1626
+ declare function useSnackbar(): SnackbarApi;
1627
+ interface SnackbarProviderProps {
1628
+ children: ReactNode;
1629
+ }
1630
+ /**
1631
+ * SnackbarProvider — context + DSPortal-mounted region (bottom-center).
1632
+ *
1633
+ * <SnackbarProvider>
1634
+ * <App />
1635
+ * </SnackbarProvider>
1636
+ *
1637
+ * Single-snackbar-at-a-time: calling show() while another is visible
1638
+ * dismisses the old one before fading in the new (FIFO swap, not a queue).
1639
+ * Mounts a fixed bottom-center region (z-1100) that renders only when a
1640
+ * snackbar is active. The region pointer-events:none lets clicks pass to
1641
+ * the page; the snackbar itself sets pointer-events:auto.
1642
+ */
1643
+ declare function SnackbarProvider({ children }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
1644
+
1062
1645
  interface CopyToClipboardProps extends Omit<HTMLAttributes<HTMLButtonElement>, "onCopy" | "onError"> {
1063
1646
  /** The string value written to the clipboard on click. */
1064
1647
  value: string;
@@ -1084,6 +1667,16 @@ interface CopyToClipboardProps extends Omit<HTMLAttributes<HTMLButtonElement>, "
1084
1667
  */
1085
1668
  declare const CopyToClipboard: react.ForwardRefExoticComponent<CopyToClipboardProps & react.RefAttributes<HTMLButtonElement>>;
1086
1669
 
1670
+ interface RelativeTimeProps extends HTMLAttributes<HTMLTimeElement> {
1671
+ /** Date to format. Accepts Date object, ISO string, or Unix ms timestamp. */
1672
+ date: Date | string | number;
1673
+ /** Optional prefix rendered in --ink-4 color before the relative string (e.g. "Applied"). */
1674
+ prefix?: string;
1675
+ /** Recompute interval in ms. Pass 0 to disable live updates. @default 60000 */
1676
+ updateInterval?: number;
1677
+ }
1678
+ declare const RelativeTime: react.ForwardRefExoticComponent<RelativeTimeProps & react.RefAttributes<HTMLTimeElement>>;
1679
+
1087
1680
  interface DatePickerProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
1088
1681
  /** Controlled selected date; pass `null` for no selection. */
1089
1682
  value: Date | null;
@@ -1117,6 +1710,15 @@ interface DatePickerProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange
1117
1710
  isRangeStart?: (d: Date) => boolean;
1118
1711
  /** Marks a cell as the end of a range for edge-pill visual polish; used by DateRangePicker. */
1119
1712
  isRangeEnd?: (d: Date) => boolean;
1713
+ /** Render mode. `"inline"` (default) shows the calendar grid in flow. `"popover"`
1714
+ * renders a trigger pill that opens the grid in an anchored DS Popover.
1715
+ * @default "inline"
1716
+ */
1717
+ variant?: "inline" | "popover";
1718
+ /** Placeholder text shown on the trigger pill when `value` is null. Only used when `variant="popover"`. */
1719
+ placeholder?: string;
1720
+ /** Override the date formatter for the trigger pill label. Only used when `variant="popover"`. */
1721
+ formatLabel?: (d: Date, showTime: boolean) => string;
1120
1722
  }
1121
1723
  declare const DatePicker: react.ForwardRefExoticComponent<DatePickerProps & react.RefAttributes<HTMLDivElement>>;
1122
1724
 
@@ -1191,6 +1793,42 @@ interface MultiSelectProps {
1191
1793
  * @default "Select…"
1192
1794
  */
1193
1795
  placeholder?: string;
1796
+ /** When true, the trigger renders as a single-line count summary instead of
1797
+ * the default chips-in-trigger layout. Useful in filter bars where the
1798
+ * trigger height needs to stay stable regardless of selection count.
1799
+ *
1800
+ * Trigger copy:
1801
+ * - 0 selected → `placeholder` (e.g. "Status")
1802
+ * - all selected (value.length === options.length) → `allSelectedLabel`
1803
+ * - 1+ selected (partial) → `${placeholder} (${count})`
1804
+ *
1805
+ * @default false
1806
+ */
1807
+ compact?: boolean;
1808
+ /** Label rendered in the compact trigger when every option is selected.
1809
+ * Has no effect unless `compact` is true.
1810
+ * @default "All"
1811
+ */
1812
+ allSelectedLabel?: string;
1813
+ /** Visual tone of the trigger surface.
1814
+ * - `"default"` — cream surface with ink text + a thin rule border.
1815
+ * The standard look for filter-bar triggers.
1816
+ * - `"solid"` — ink fill with cream text, no border. A confident
1817
+ * "filter applied" affordance; pairs well with `compact` for a
1818
+ * count-summary chip.
1819
+ *
1820
+ * @default "default"
1821
+ */
1822
+ tone?: "default" | "solid";
1823
+ /** Trigger height + padding scale.
1824
+ * - `"md"` (default) — 36px height, standard form-input rhythm.
1825
+ * - `"sm"` — 28px height, smaller padding + 12px text.
1826
+ * Use when the trigger sits in a dense filter row where the chips
1827
+ * should read as chips, not full-size form controls.
1828
+ *
1829
+ * @default "md"
1830
+ */
1831
+ size?: "sm" | "md";
1194
1832
  /** When true, disables the trigger and prevents interaction.
1195
1833
  * @default false
1196
1834
  */
@@ -1228,6 +1866,22 @@ interface SelectProps {
1228
1866
  * @default true
1229
1867
  */
1230
1868
  searchable?: boolean;
1869
+ /** Visual tone of the trigger surface.
1870
+ * - `"default"` — cream surface with ink text + a thin rule border.
1871
+ * - `"solid"` — ink fill with cream text, no visible border. Pairs with
1872
+ * MultiSelect's matching tone for filter-bar consistency.
1873
+ *
1874
+ * @default "default"
1875
+ */
1876
+ tone?: "default" | "solid";
1877
+ /** Trigger height + padding scale.
1878
+ * - `"md"` (default) — 36px height, standard form-input rhythm.
1879
+ * - `"sm"` — 28px height, smaller padding + 12px text. Use in
1880
+ * dense filter rows alongside MultiSelect at the same size.
1881
+ *
1882
+ * @default "md"
1883
+ */
1884
+ size?: "sm" | "md";
1231
1885
  /** When true, disables the trigger button and prevents interaction.
1232
1886
  * @default false
1233
1887
  */
@@ -1342,10 +1996,111 @@ interface AutocompleteProps<T> {
1342
1996
  */
1343
1997
  declare function Autocomplete<T>({ value, onValueChange, items, recentItems, onSelect, onCreate, getItemLabel, getItemKey, renderItem, placeholder, className, style, }: AutocompleteProps<T>): react_jsx_runtime.JSX.Element;
1344
1998
 
1999
+ interface FileInputProps {
2000
+ /** Called when the user selects or drops file(s). */
2001
+ onSelect: (files: File[]) => void;
2002
+ /** MIME type or file extension allowlist (passed to hidden input `accept`).
2003
+ * @example "application/pdf" | ".pdf,.docx,.md"
2004
+ */
2005
+ accept?: string;
2006
+ /** Whether to allow multiple files.
2007
+ * @default false
2008
+ */
2009
+ multiple?: boolean;
2010
+ /** Maximum file size in bytes. `onError` is called if exceeded.
2011
+ * @default undefined (no limit)
2012
+ */
2013
+ maxSizeBytes?: number;
2014
+ /**
2015
+ * Called when a file is rejected due to type or size constraint.
2016
+ * Receives a human-readable reason string.
2017
+ */
2018
+ onError?: (reason: string) => void;
2019
+ /** When true, disables interaction.
2020
+ * @default false
2021
+ */
2022
+ disabled?: boolean;
2023
+ /**
2024
+ * Visual variant.
2025
+ * - "dropzone" — dashed bordered drop area; accepts drag-and-drop.
2026
+ * - "button" — renders a Button-like trigger with no drop area.
2027
+ * @default "dropzone"
2028
+ */
2029
+ variant?: "dropzone" | "button";
2030
+ /** Accessible label for the trigger.
2031
+ * @default "Upload file"
2032
+ */
2033
+ ariaLabel?: string;
2034
+ /**
2035
+ * Content rendered inside the dropzone area (dropzone variant only).
2036
+ * When not provided, a default amber icon + "Drop a file here, or click
2037
+ * to upload" + meta line is rendered (matching cairn UploadDropZone visual).
2038
+ */
2039
+ children?: ReactNode;
2040
+ className?: string;
2041
+ style?: CSSProperties;
2042
+ }
2043
+ declare function FileInput({ onSelect, accept, multiple, maxSizeBytes, onError, disabled, variant, ariaLabel, children, className, style, }: FileInputProps): react_jsx_runtime.JSX.Element;
2044
+
2045
+ interface ColorPickerProps {
2046
+ /** Controlled hex value, e.g. '#f59e0b'. Optional — uncontrolled if absent. */
2047
+ value?: string;
2048
+ /** Called with new hex string when color changes via any sub-control. */
2049
+ onChange?: (hex: string) => void;
2050
+ /** Initial hex when uncontrolled. @default '#f59e0b' */
2051
+ defaultValue?: string;
2052
+ /** Custom preset swatches. @default the 10-color amber-led palette */
2053
+ presets?: string[];
2054
+ /** Additional className applied to the root wrapper. */
2055
+ className?: string;
2056
+ /** Inline styles applied to the root wrapper. */
2057
+ style?: CSSProperties;
2058
+ }
2059
+ declare function ColorPicker({ value, onChange, defaultValue, presets, className, style, }: ColorPickerProps): react_jsx_runtime.JSX.Element;
2060
+
2061
+ interface ColorInputProps {
2062
+ /** Controlled hex value, e.g. '#f59e0b'. Optional — uncontrolled if absent. */
2063
+ value?: string;
2064
+ /** Called with new hex string when a valid 6-digit hex is typed. */
2065
+ onChange?: (hex: string) => void;
2066
+ /** Initial hex when uncontrolled. @default '#f59e0b' */
2067
+ defaultValue?: string;
2068
+ /** Optional label rendered above the input row. */
2069
+ label?: string;
2070
+ /** Additional className applied to the root wrapper. */
2071
+ className?: string;
2072
+ /** Inline styles applied to the root wrapper. */
2073
+ style?: CSSProperties;
2074
+ }
2075
+ /**
2076
+ * Compact inline color field — swatch + hex text input.
2077
+ * No popover, no full picker — designed to drop into form rows alongside
2078
+ * other inline form fields.
2079
+ */
2080
+ declare function ColorInput({ value, onChange, defaultValue, label, className, style, }: ColorInputProps): react_jsx_runtime.JSX.Element;
2081
+
2082
+ /**
2083
+ * Optional per-option active colors. When set, the option uses these
2084
+ * foreground/background colors *while active* instead of the default amber
2085
+ * pill. Prefer DS CSS-var tokens (e.g. `var(--green)`). Inactive options are
2086
+ * unaffected and render with default styling.
2087
+ */
2088
+ interface SegmentedTone {
2089
+ /** Text color of the option while active. */
2090
+ fg: string;
2091
+ /** Background of the option while active. */
2092
+ activeBg: string;
2093
+ }
1345
2094
  interface SegmentedOption<T extends string = string> {
1346
2095
  value: T;
1347
2096
  label: string;
1348
2097
  disabled?: boolean;
2098
+ /**
2099
+ * Optional per-option active tone. When provided, the *active* segment
2100
+ * renders with `tone.fg` / `tone.activeBg` instead of the default amber.
2101
+ * Omit for the standard styling (fully backward compatible).
2102
+ */
2103
+ tone?: SegmentedTone;
1349
2104
  }
1350
2105
  interface SegmentedControlProps<T extends string = string> {
1351
2106
  options: SegmentedOption<T>[];
@@ -1751,6 +2506,83 @@ declare const Calendar: react.ForwardRefExoticComponent<CalendarProps & react.Re
1751
2506
  Agenda: typeof AgendaList;
1752
2507
  };
1753
2508
 
2509
+ interface PaginationProps {
2510
+ /** Total number of pages. */
2511
+ totalPages: number;
2512
+ /** Currently active page (1-based). */
2513
+ currentPage: number;
2514
+ /** Called when user navigates to a different page. */
2515
+ onPageChange: (page: number) => void;
2516
+ /** Display variant. "full" shows numbered page buttons; "compact" shows "N / M" only.
2517
+ * @default "full"
2518
+ */
2519
+ variant?: "full" | "compact";
2520
+ /** Accessible label for the nav landmark.
2521
+ * @default "Pagination"
2522
+ */
2523
+ ariaLabel?: string;
2524
+ /** Additional className applied to the root `<nav>` element. */
2525
+ className?: string;
2526
+ /** Inline styles applied to the root `<nav>` element. */
2527
+ style?: CSSProperties;
2528
+ }
2529
+ declare const Pagination: react.ForwardRefExoticComponent<PaginationProps & react.RefAttributes<HTMLElement>>;
2530
+
2531
+ /**
2532
+ * # Usage Audit - DataGrid (DS-62)
2533
+ *
2534
+ * Composed component built on Table.* + three table hooks. Provides a
2535
+ * higher-level columns/rows API with status badge rendering, priority dots,
2536
+ * bulk-action bar, and footer pagination.
2537
+ *
2538
+ * <DataGrid
2539
+ * columns={cols}
2540
+ * rows={rows}
2541
+ * page={page}
2542
+ * totalPages={n}
2543
+ * onPageChange={setPage}
2544
+ * onSelectionChange={(ids) => setSelected(ids)}
2545
+ * />
2546
+ *
2547
+ * Important: <Pagination> is rendered as a SIBLING of the inner Table.Root,
2548
+ * NOT inside it. <nav> inside <table> is invalid HTML.
2549
+ *
2550
+ * Status mapping:
2551
+ * applied → Badge tone="upcoming" label="Applied"
2552
+ * interviewing → Badge tone="done" label="Interview"
2553
+ * offer → Badge tone="passed" label="Offer"
2554
+ * rejected → Badge tone="pending" label="Rejected"
2555
+ *
2556
+ * Priority mapping:
2557
+ * high → red dot (var(--red-vivid))
2558
+ * medium → amber dot (var(--amber-vivid))
2559
+ * low → green dot (var(--green-vivid))
2560
+ */
2561
+
2562
+ interface DataGridColumn {
2563
+ key: string;
2564
+ label: string;
2565
+ width: number;
2566
+ sortable?: boolean;
2567
+ align?: "left" | "right";
2568
+ }
2569
+ type DataGridRow = Record<string, unknown> & {
2570
+ id: string | number;
2571
+ };
2572
+ interface DataGridProps extends react__default.HTMLAttributes<HTMLDivElement> {
2573
+ columns: DataGridColumn[];
2574
+ rows: DataGridRow[];
2575
+ /** Current page (1-based). Optional — defaults to 1 when pagination not used. */
2576
+ page?: number;
2577
+ /** Total page count. Optional — defaults to 1. */
2578
+ totalPages?: number;
2579
+ /** Page-change callback wired to <Pagination>. */
2580
+ onPageChange?: (page: number) => void;
2581
+ /** Fires whenever the selected row IDs change. */
2582
+ onSelectionChange?: (ids: Array<string | number>) => void;
2583
+ }
2584
+ declare const DataGrid: react__default.ForwardRefExoticComponent<DataGridProps & react__default.RefAttributes<HTMLDivElement>>;
2585
+
1754
2586
  interface RichTextProps {
1755
2587
  /** Controlled HTML string (default) or TipTap JSON Doc object when `outputFormat="json"`. */
1756
2588
  value: string | object;
@@ -1776,6 +2608,17 @@ interface RichTextProps {
1776
2608
  ariaLabel?: string;
1777
2609
  /** Inline styles applied to the outer root wrapper. */
1778
2610
  style?: CSSProperties;
2611
+ /** Borderless/inline mode: strips the editor chrome (border, background, padding,
2612
+ * min-height) so the editor sits inline inside a card or click-to-edit surface.
2613
+ * Purely additive - default keeps the bordered "card" appearance.
2614
+ * @default false
2615
+ */
2616
+ inline?: boolean;
2617
+ /** Show a keyboard-shortcut hint strip (⌘B ⌘I ⌘U ⌘⇧H ⌘K ⌘↵ Esc) that is revealed
2618
+ * while the editor has focus. Suppressed in `readOnly` mode.
2619
+ * @default false
2620
+ */
2621
+ hints?: boolean;
1779
2622
  }
1780
2623
  declare const RichText: react.ForwardRefExoticComponent<RichTextProps & react.RefAttributes<HTMLDivElement>>;
1781
2624
 
@@ -2088,4 +2931,4 @@ declare function SortableItem({ id, children, reducedMotion }: SortableItemProps
2088
2931
  declare function SortableDndContext({ children, onMove, renderOverlay }: SortableDndContextProps): react_jsx_runtime.JSX.Element;
2089
2932
  declare function Sortable({ items, onReorder, renderItem, id, className, style }: SortableProps): react_jsx_runtime.JSX.Element;
2090
2933
 
2091
- export { Accordion, type AccordionItemProps, type AccordionProps, AlertBanner, type AlertBannerProps, type AlertBannerTone, AppBar, type AppBarProps, type AppBarVariant, AppShell, type AppShellProps, Autocomplete, type AutocompleteProps, Avatar, type AvatarPresence, type AvatarPresencePosition, type AvatarProps, type AvatarSize, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, type BadgeTone, BottomSheet, type BottomSheetHeight, type BottomSheetProps, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarEvent, type CalendarProps, Card, type CardProps, type CardVariant, Carousel, type CarouselProps, type CarouselSlide, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipTone, Coachmark, type CoachmarkProps, ConfirmDialog, type ConfirmDialogProps, ContextMenu, type ContextMenuItem, type ContextMenuProps, CopyToClipboard, type CopyToClipboardProps, DSPortal, type DSPortalProps, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, EmptyState, type EmptyStateProps, FieldError, type FieldErrorProps, Footer, type FooterColumn, type FooterProps, type FooterVariant, FormErrorSummary, type FormErrorSummaryProps, HoverCard, type HoverCardPlacement, type HoverCardProps, InfiniteList, type InfiniteListProps, InlineConfirm, type InlineConfirmProps, type InlineConfirmTriggerProps, InlineEdit, type InlineEditProps, Lightbox, type LightboxItem, type LightboxProps, Modal, type ModalProps, type ModalRole, MultiSelect, type MultiSelectOption, type MultiSelectProps, NumberStepper, type NumberStepperProps, PasswordStrength, type PasswordStrengthProps, Popover, type PopoverPlacement, type PopoverProps, type PopoverVariant, ProgressBar, type ProgressBarProps, Radio, RadioGroup, type RadioGroupProps, type RadioProps, RangeSlider, type RangeSliderProps, RichText, type RichTextProps, RollingNumber, type RollingNumberProps, SearchAndFilters, type SearchAndFiltersProps, type SearchFilter, type SearchSuggestion, SegmentedControl, type SegmentedControlProps, type SegmentedOption, Select, type SelectOption, type SelectProps, Sheet, type SheetProps, type SheetSide, Skeleton, type SkeletonProps, type SkeletonShape, Sortable, SortableDndContext, type SortableDndContextProps, SortableItem, type SortableItemData, type SortableItemProps, type SortableProps, SplitButton, type SplitButtonAction, type SplitButtonProps, StarRating, type StarRatingProps, type StarRatingSize, StickyNote, type StickyNoteProps, type StickyNoteRotation, type TabItem, Table, type TableHeaderCellProps, type TableRootProps, Tabs, type TabsProps, TextInput, type TextInputProps, Textarea, type TextareaProps, Timeline, type TimelineEvent, type TimelineProps, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastTone, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, Wizard, type WizardProps, type WizardStep, deriveGradient, deriveInitials, useToast };
2934
+ export { Accordion, type AccordionItemProps, type AccordionProps, ActionSheet, type ActionSheetItem, type ActionSheetProps, AlertBanner, type AlertBannerProps, type AlertBannerTone, AppBar, type AppBarProps, type AppBarVariant, AppShell, type AppShellProps, Autocomplete, type AutocompleteProps, Avatar, type AvatarPresence, type AvatarPresencePosition, type AvatarProps, type AvatarSize, AvatarStack, type AvatarStackProps, Badge, type BadgeProps, type BadgeTone, BottomSheet, type BottomSheetHeight, type BottomSheetProps, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarEvent, type CalendarProps, Card, type CardProps, type CardVariant, Carousel, type CarouselProps, type CarouselSlide, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipTone, Coachmark, type CoachmarkProps, ColorInput, type ColorInputProps, ColorPicker, type ColorPickerProps, CommandPalette, type CommandPaletteItem, type CommandPaletteProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmDialogTone, ContextMenu, type ContextMenuItem, type ContextMenuProps, CopyToClipboard, type CopyToClipboardProps, DSPortal, type DSPortalProps, DataGrid, type DataGridColumn, type DataGridProps, type DataGridRow, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, Divider, type DividerProps, DotGrid, type DotGridProps, EmptyState, type EmptyStateProps, Eyebrow, type EyebrowProps, type EyebrowSize, FieldError, type FieldErrorProps, FileInput, type FileInputProps, Footer, type FooterColumn, type FooterProps, type FooterVariant, FormErrorSummary, type FormErrorSummaryProps, Heading, type HeadingLevel, type HeadingProps, HoverCard, type HoverCardPlacement, type HoverCardProps, InfiniteList, type InfiniteListProps, InlineAddRow, type InlineAddRowProps, InlineConfirm, type InlineConfirmProps, type InlineConfirmTriggerProps, InlineEdit, InlineEditField, type InlineEditFieldProps, type InlineEditProps, Kbd, type KbdProps, type KbdSize, Lightbox, type LightboxItem, type LightboxProps, Link, type LinkProps, type LinkVariant, MiniBar, type MiniBarProps, MiniDonut, type MiniDonutProps, Modal, type ModalProps, type ModalRole, MultiSelect, type MultiSelectOption, type MultiSelectProps, NumberStepper, type NumberStepperProps, OAuthButton, type OAuthButtonProps, type OAuthProvider, Pagination, type PaginationProps, PasswordStrength, type PasswordStrengthProps, Popover, type PopoverPlacement, type PopoverProps, type PopoverVariant, ProgressBar, type ProgressBarProps, Radio, RadioGroup, type RadioGroupProps, type RadioProps, RangeSlider, type RangeSliderProps, RelativeTime, type RelativeTimeProps, RichText, type RichTextProps, RollingNumber, type RollingNumberProps, SearchAndFilters, type SearchAndFiltersProps, type SearchFilter, type SearchSuggestion, SegmentedControl, type SegmentedControlProps, type SegmentedOption, Select, type SelectOption, type SelectProps, Sheet, type SheetProps, type SheetSide, Skeleton, type SkeletonProps, type SkeletonShape, type SnackbarAction, type SnackbarOptions, SnackbarProvider, type SnackbarProviderProps, type SnackbarTone, Sortable, SortableDndContext, type SortableDndContextProps, SortableItem, type SortableItemData, type SortableItemProps, type SortableProps, Sparkline, type SparklineProps, SplitButton, type SplitButtonAction, type SplitButtonProps, SplitHero, type SplitHeroProps, StarRating, type StarRatingProps, type StarRatingSize, StatCard, type StatCardChangeDir, type StatCardProps, StatusPill, type StatusPillProps, type StatusPillStage, StickyNote, type StickyNoteProps, type StickyNoteRotation, type TabItem, Table, type TableHeaderCellProps, type TableRootProps, Tabs, type TabsProps, Text, type TextElement, TextInput, type TextInputProps, type TextProps, type TextVariant, Textarea, type TextareaProps, Timeline, type TimelineEvent, type TimelineProps, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastTone, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TypeToConfirm, type TypeToConfirmProps, Wizard, type WizardProps, type WizardStep, deriveGradient, deriveInitials, useSnackbar, useToast };