@lovett/ui 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/index.d.ts +823 -135
  2. package/dist/index.js +2048 -358
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +44 -2
  5. package/dist/theme-v2.css +228 -0
  6. package/dist/tokens.css +123 -8
  7. package/package.json +1 -1
  8. package/src/__tests__/anchor.test.tsx +422 -0
  9. package/src/__tests__/combobox.test.tsx +677 -0
  10. package/src/__tests__/dropdown-menu.test.tsx +418 -0
  11. package/src/__tests__/helpers/geometry.ts +58 -0
  12. package/src/__tests__/layer-stack.test.tsx +228 -0
  13. package/src/__tests__/modal.test.tsx +180 -6
  14. package/src/__tests__/popover.test.tsx +460 -0
  15. package/src/__tests__/select.test.tsx +543 -0
  16. package/src/__tests__/tooltip.test.tsx +355 -0
  17. package/src/calculator-shell-v2.tsx +19 -39
  18. package/src/code-block.tsx +15 -26
  19. package/src/combobox.tsx +796 -0
  20. package/src/dropdown-menu.tsx +142 -152
  21. package/src/icons/brand.tsx +81 -2
  22. package/src/index.ts +111 -0
  23. package/src/lib/anchor.ts +427 -0
  24. package/src/lib/focus.ts +32 -0
  25. package/src/lib/layer-stack.ts +188 -0
  26. package/src/lib/refs.ts +31 -0
  27. package/src/metric-card.tsx +57 -22
  28. package/src/modal.tsx +149 -9
  29. package/src/page-shell.tsx +91 -2
  30. package/src/popover.tsx +407 -0
  31. package/src/segmented-pill.tsx +33 -10
  32. package/src/select.tsx +646 -0
  33. package/src/stat-row.tsx +108 -70
  34. package/src/styles.css +44 -2
  35. package/src/theme-v2.css +7 -245
  36. package/src/tokens.css +123 -8
  37. package/src/tooltip.tsx +297 -0
  38. package/src/react-syntax-highlighter-prism.d.ts +0 -34
  39. package/src/v2/README.md +0 -208
  40. package/src/v2/__demo__/showcase.tsx +0 -1045
  41. package/src/v2/action.tsx +0 -91
  42. package/src/v2/callout.tsx +0 -76
  43. package/src/v2/document-section.tsx +0 -82
  44. package/src/v2/document-shell.tsx +0 -0
  45. package/src/v2/field-row.tsx +0 -113
  46. package/src/v2/icons.tsx +0 -165
  47. package/src/v2/index.ts +0 -147
  48. package/src/v2/layout.tsx +0 -293
  49. package/src/v2/progress-track.tsx +0 -89
  50. package/src/v2/stat-tile.tsx +0 -129
  51. package/src/v2/states.tsx +0 -271
  52. package/src/v2/status-pill.tsx +0 -74
  53. package/src/v2/theme.css +0 -1861
  54. package/src/v2/timeline.tsx +0 -81
  55. package/src/v2/tokens.ts +0 -228
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
1
2
  import * as react from 'react';
2
- import react__default, { HTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, CSSProperties, RefObject, ComponentProps, ComponentType, FormHTMLAttributes, FormEvent } from 'react';
3
+ import react__default, { HTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, CSSProperties, RefObject, ComponentProps, ComponentType, RefAttributes, ReactElement, Ref, FormHTMLAttributes, FormEvent } from 'react';
3
4
  import { Toaster as Toaster$1 } from 'sonner';
4
5
  export { toast } from 'sonner';
5
6
  import { DndContext, DragEndEvent } from '@dnd-kit/core';
@@ -33,21 +34,21 @@ interface CardProps extends DivProps {
33
34
  interactive?: boolean;
34
35
  }
35
36
  declare const CardRoot: react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLDivElement>>;
36
- declare function Head({ className, ...rest }: DivProps): react.JSX.Element;
37
- declare function Body({ className, ...rest }: DivProps): react.JSX.Element;
38
- declare function Tray$1({ className, ...rest }: DivProps): react.JSX.Element;
39
- declare function Foot({ className, ...rest }: DivProps): react.JSX.Element;
40
- declare function Title({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
37
+ declare function Head({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
38
+ declare function Body({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
39
+ declare function Tray$1({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
40
+ declare function Foot({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
41
+ declare function Title({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
41
42
  declare function Desc({ children, className, ...rest }: HTMLAttributes<HTMLDivElement> & {
42
43
  clamp?: 2 | 3;
43
- }): react.JSX.Element;
44
- declare function Meta({ className, ...rest }: DivProps): react.JSX.Element;
44
+ }): react_jsx_runtime.JSX.Element;
45
+ declare function Meta({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
45
46
  declare function MetaItem({ icon, children, className, }: {
46
47
  icon?: ReactNode;
47
48
  children: ReactNode;
48
49
  className?: string;
49
- }): react.JSX.Element;
50
- declare function Actions({ className, ...rest }: DivProps): react.JSX.Element;
50
+ }): react_jsx_runtime.JSX.Element;
51
+ declare function Actions({ className, ...rest }: DivProps): react_jsx_runtime.JSX.Element;
51
52
  interface ActionButtonProps$1 extends HTMLAttributes<HTMLButtonElement> {
52
53
  danger?: boolean;
53
54
  }
@@ -62,13 +63,13 @@ declare function IconTile({ bg, fg, size, className, children, }: {
62
63
  size?: number;
63
64
  className?: string;
64
65
  children: ReactNode;
65
- }): react.JSX.Element;
66
+ }): react_jsx_runtime.JSX.Element;
66
67
  /** Tag row helper — reads `--tag-bg`/`--border` automatically. */
67
68
  declare function TagRow({ tags, max, className, }: {
68
69
  tags: string[];
69
70
  max?: number;
70
71
  className?: string;
71
- }): react.JSX.Element;
72
+ }): react_jsx_runtime.JSX.Element;
72
73
  type CardComponent = typeof CardRoot & {
73
74
  Head: typeof Head;
74
75
  Body: typeof Body;
@@ -99,7 +100,7 @@ interface CollapsibleCardProps {
99
100
  contentClassName?: string;
100
101
  children: ReactNode;
101
102
  }
102
- declare function CollapsibleCard({ title, icon, meta, actions, defaultOpen, contentClassName, children, }: CollapsibleCardProps): react.JSX.Element;
103
+ declare function CollapsibleCard({ title, icon, meta, actions, defaultOpen, contentClassName, children, }: CollapsibleCardProps): react_jsx_runtime.JSX.Element;
103
104
 
104
105
  type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'destructive-soft' | 'icon' | 'toolbar';
105
106
  type ButtonSize = 'sm' | 'md' | 'lg';
@@ -122,7 +123,7 @@ interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {
122
123
  /** One or more `<Button>` elements. */
123
124
  children: ReactNode;
124
125
  }
125
- declare function ButtonGroup({ children, className, role, ...rest }: ButtonGroupProps): react.JSX.Element;
126
+ declare function ButtonGroup({ children, className, role, ...rest }: ButtonGroupProps): react_jsx_runtime.JSX.Element;
126
127
 
127
128
  type InputSize = 'sm' | 'md' | 'lg';
128
129
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {
@@ -186,18 +187,58 @@ declare const Textarea: react.ForwardRefExoticComponent<TextareaProps & react.Re
186
187
  * <Button>Confirm</Button>
187
188
  * </Modal.Footer>
188
189
  * </Modal>
190
+ *
191
+ * Accessibility. The panel is a `role="dialog" aria-modal="true"` region
192
+ * named by its own `<h2>` (`aria-labelledby`), or by the `ariaLabel` prop
193
+ * when a caller renders a titleless modal. Opening moves focus to the
194
+ * panel — so a screen reader announces the dialog's name — and closing
195
+ * RESTORES focus to whatever was focused before it opened. Tab and
196
+ * Shift+Tab wrap inside the panel; Escape closes.
197
+ *
198
+ * Callers that want a specific control focused on open mark it
199
+ * `data-autofocus`; anything else and the panel itself takes focus.
200
+ *
201
+ * WHY A FOCUS TRAP AND NOT `inert` ON THE APP ROOT. Modal renders INLINE
202
+ * in the React tree — it is a descendant of `#root`, not a portal — so
203
+ * `inert` on the app root would make the modal itself inert. Portaling it
204
+ * to `document.body` to unlock that would move all 59 consuming files off
205
+ * the `.cs-frame`-scoped token layer and out of their current stacking /
206
+ * inheritance context, which is a much larger change than an a11y fix
207
+ * should make. Inerting `document.body`'s other children is also wrong:
208
+ * `DropdownMenu`, `Popover`, `TagChipInput` and `FolderTreePicker` portal
209
+ * their content THERE, so a select inside a modal would go dead. Focus trap
210
+ * it is — the keyboard hole is closed; pointer and AT virtual-cursor access
211
+ * to the background remains, which is the documented residual.
212
+ *
213
+ * Escape and dismiss order come from the shared layer stack
214
+ * (`lib/layer-stack.ts`): the topmost open surface — modal, menu or
215
+ * popover — answers Escape alone.
216
+ */
217
+ /**
218
+ * Dismiss order lives in the shared layer stack (`lib/layer-stack.ts`),
219
+ * which this file used to own as a module-level `openPanels` array. Only
220
+ * the topmost layer answers Escape, so nested modals do not both close on
221
+ * one keypress — and now a DropdownMenu or Popover opened from inside a
222
+ * modal closes on its own first, leaving the modal open. The Tab trap asks
223
+ * for the topmost MODAL (`isTopOfKind`), so a popover above it does not
224
+ * switch the trap off.
189
225
  */
190
226
  interface ModalProps {
191
227
  isOpen: boolean;
192
228
  onClose: () => void;
193
229
  title: string;
194
230
  children: ReactNode;
195
- className?: string;
231
+ className?: string | undefined;
232
+ /**
233
+ * Accessible name for a modal rendered with an empty `title`. Ignored
234
+ * when `title` is non-empty — the `<h2>` names the dialog then.
235
+ */
236
+ ariaLabel?: string | undefined;
196
237
  }
197
- declare function Modal({ isOpen, onClose, title, children, className }: ModalProps): react.JSX.Element | null;
238
+ declare function Modal({ isOpen, onClose, title, children, className, ariaLabel }: ModalProps): react_jsx_runtime.JSX.Element | null;
198
239
  declare namespace Modal {
199
- var Tray: ({ className, ...rest }: HTMLAttributes<HTMLDivElement>) => react.JSX.Element;
200
- var Footer: ({ className, ...rest }: HTMLAttributes<HTMLDivElement>) => react.JSX.Element;
240
+ var Tray: ({ className, ...rest }: HTMLAttributes<HTMLDivElement>) => react_jsx_runtime.JSX.Element;
241
+ var Footer: ({ className, ...rest }: HTMLAttributes<HTMLDivElement>) => react_jsx_runtime.JSX.Element;
201
242
  }
202
243
 
203
244
  type Side$1 = 'right' | 'bottom';
@@ -260,7 +301,7 @@ interface FloatingDrawerProps {
260
301
  * the right-drawer's body padding so the action bar feels integrated. */
261
302
  headerClassName?: string;
262
303
  }
263
- declare function FloatingDrawer({ isOpen, onClose, side, size, resizable, onResize, title, titleSlot, footer, children, className, panelClassName, modal, anchor, showClose, headerClassName, collapsed, }: FloatingDrawerProps): react.JSX.Element;
304
+ declare function FloatingDrawer({ isOpen, onClose, side, size, resizable, onResize, title, titleSlot, footer, children, className, panelClassName, modal, anchor, showClose, headerClassName, collapsed, }: FloatingDrawerProps): react_jsx_runtime.JSX.Element;
264
305
  /**
265
306
  * DetailSection — small label/value layout for drawer body content.
266
307
  * Ports verbatim from brand-ai-extension's detail-drawer.tsx.
@@ -269,7 +310,7 @@ declare function DetailSection({ label, children, className, }: {
269
310
  label: string;
270
311
  children: ReactNode;
271
312
  className?: string;
272
- }): react.JSX.Element;
313
+ }): react_jsx_runtime.JSX.Element;
273
314
 
274
315
  type BrandLogoTileSize = 'xs' | 'sm' | 'md' | 'lg' | number;
275
316
  interface BrandLogoTileProps {
@@ -315,12 +356,12 @@ interface BrandLogoTileProps {
315
356
  className?: string;
316
357
  style?: CSSProperties;
317
358
  }
318
- declare function BrandLogoTile({ size, url, name, isFavicon, accentGlow, fallbackChar, background, color, borderless, className, style, }: BrandLogoTileProps): react.JSX.Element;
359
+ declare function BrandLogoTile({ size, url, name, isFavicon, accentGlow, fallbackChar, background, color, borderless, className, style, }: BrandLogoTileProps): react_jsx_runtime.JSX.Element;
319
360
 
320
361
  interface ActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
321
362
  label: string;
322
363
  }
323
- declare function ActionButton({ label, className, children, ...rest }: ActionButtonProps): react.JSX.Element;
364
+ declare function ActionButton({ label, className, children, ...rest }: ActionButtonProps): react_jsx_runtime.JSX.Element;
324
365
  interface FootProps {
325
366
  meta?: ReactNode;
326
367
  link?: {
@@ -332,7 +373,7 @@ interface FootProps {
332
373
  /** FootItem — a single icon+text item inside the foot. */
333
374
  declare function FootItem({ children }: {
334
375
  children: ReactNode;
335
- }): react.JSX.Element;
376
+ }): react_jsx_runtime.JSX.Element;
336
377
  interface BaseProps {
337
378
  /** DOM id and `data-section-id` for ChipNav scroll-spy. */
338
379
  id: string;
@@ -384,7 +425,7 @@ interface EditableSectionProps extends BaseProps {
384
425
  actions?: undefined;
385
426
  }
386
427
  type ProfileSectionProps = StaticSectionProps | EditableSectionProps;
387
- declare function ProfileSection(props: ProfileSectionProps): react.JSX.Element;
428
+ declare function ProfileSection(props: ProfileSectionProps): react_jsx_runtime.JSX.Element;
388
429
  type ProfileSectionComponent = typeof ProfileSection & {
389
430
  ActionButton: typeof ActionButton;
390
431
  FootItem: typeof FootItem;
@@ -464,7 +505,7 @@ interface ChipNavProps {
464
505
  */
465
506
  density?: 'comfortable' | 'compact';
466
507
  }
467
- declare function ChipNav({ items, scrollContainer, stickyTop, scrollOffset, actions, className, style, surface, activeId: activeIdProp, onItemClick, position, density, }: ChipNavProps): react.JSX.Element;
508
+ declare function ChipNav({ items, scrollContainer, stickyTop, scrollOffset, actions, className, style, surface, activeId: activeIdProp, onItemClick, position, density, }: ChipNavProps): react_jsx_runtime.JSX.Element;
468
509
 
469
510
  interface CompletionRingProps {
470
511
  /** 0–100. Values outside the range are clamped. */
@@ -489,7 +530,7 @@ interface CompletionRingProps {
489
530
  className?: string;
490
531
  style?: CSSProperties;
491
532
  }
492
- declare function CompletionRing({ percent, size, strokeWidth, label, showLabel, trackColor, fillColor, className, style, }: CompletionRingProps): react.JSX.Element;
533
+ declare function CompletionRing({ percent, size, strokeWidth, label, showLabel, trackColor, fillColor, className, style, }: CompletionRingProps): react_jsx_runtime.JSX.Element;
493
534
 
494
535
  /**
495
536
  * MicrosoftLogo — the Microsoft four-square brand mark, for "Sign in with
@@ -505,7 +546,7 @@ interface MicrosoftLogoProps {
505
546
  size?: number;
506
547
  className?: string;
507
548
  }
508
- declare function MicrosoftLogo({ size, className }: MicrosoftLogoProps): react.JSX.Element;
549
+ declare function MicrosoftLogo({ size, className }: MicrosoftLogoProps): react_jsx_runtime.JSX.Element;
509
550
 
510
551
  /**
511
552
  * Brand platform glyphs — real mono (currentColor) marks for the ad platforms
@@ -529,27 +570,27 @@ declare function MicrosoftLogo({ size, className }: MicrosoftLogoProps): react.J
529
570
  interface BrandIconProps {
530
571
  /** Square box size in px; the glyph letterboxes inside (non-square viewBoxes
531
572
  * centre via preserveAspectRatio). Default 16 — a tab/affix glyph. */
532
- size?: number;
533
- className?: string;
573
+ size?: number | undefined;
574
+ className?: string | undefined;
534
575
  }
535
576
  /** Meta brand glyph (mono, currentColor). */
536
- declare function BrandMeta({ size, className }: BrandIconProps): react.JSX.Element;
577
+ declare function BrandMeta({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
537
578
  /** Facebook brand glyph (mono, currentColor). */
538
- declare function BrandFacebook({ size, className }: BrandIconProps): react.JSX.Element;
579
+ declare function BrandFacebook({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
539
580
  /** Instagram brand glyph (mono, currentColor). */
540
- declare function BrandInstagram({ size, className }: BrandIconProps): react.JSX.Element;
581
+ declare function BrandInstagram({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
541
582
  /** Messenger brand glyph (mono, currentColor). */
542
- declare function BrandMessenger({ size, className }: BrandIconProps): react.JSX.Element;
583
+ declare function BrandMessenger({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
543
584
  /** LinkedIn brand glyph (mono, currentColor). */
544
- declare function BrandLinkedIn({ size, className }: BrandIconProps): react.JSX.Element;
585
+ declare function BrandLinkedIn({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
545
586
  /** Nextdoor brand glyph (mono, currentColor). */
546
- declare function BrandNextdoor({ size, className }: BrandIconProps): react.JSX.Element;
587
+ declare function BrandNextdoor({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
547
588
  /** Pinterest brand glyph (mono, currentColor). */
548
- declare function BrandPinterest({ size, className }: BrandIconProps): react.JSX.Element;
589
+ declare function BrandPinterest({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
549
590
  /** Snapchat brand glyph (mono, currentColor). */
550
- declare function BrandSnapchat({ size, className }: BrandIconProps): react.JSX.Element;
591
+ declare function BrandSnapchat({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
551
592
  /** TikTok brand glyph (mono, currentColor). */
552
- declare function BrandTikTok({ size, className }: BrandIconProps): react.JSX.Element;
593
+ declare function BrandTikTok({ size, className }: BrandIconProps): react_jsx_runtime.JSX.Element;
553
594
  /** Keyed map for registry-style resolution (e.g. the Social Spec tactic icons). */
554
595
  declare const BRAND_ICONS: {
555
596
  readonly meta: typeof BrandMeta;
@@ -563,6 +604,20 @@ declare const BRAND_ICONS: {
563
604
  readonly tiktok: typeof BrandTikTok;
564
605
  };
565
606
  type BrandIconKey = keyof typeof BRAND_ICONS;
607
+ /** Every platform `<BrandIcon>` can draw in colour. */
608
+ declare function hasBrandIcon(name: string): boolean;
609
+ interface BrandIconRegistryProps extends BrandIconProps {
610
+ /** Platform key, e.g. "facebook", "youtube". */
611
+ name: string;
612
+ /** Give a label only when the mark stands alone; decorative beside text. */
613
+ title?: string | undefined;
614
+ }
615
+ /**
616
+ * A full-colour platform mark, looked up by key. Use when the platform is
617
+ * chosen at runtime; use the named mono `Brand*` components when it is known
618
+ * at author time and the mark sits in coloured chrome.
619
+ */
620
+ declare function BrandIcon({ name, size, className, title }: BrandIconRegistryProps): react_jsx_runtime.JSX.Element | null;
566
621
 
567
622
  interface ChoroplethProps {
568
623
  /** `radius` → concentric circles; `isochrone` → concentric polygons. */
@@ -570,7 +625,7 @@ interface ChoroplethProps {
570
625
  className?: string;
571
626
  style?: CSSProperties;
572
627
  }
573
- declare function Choropleth({ mode, className, style }: ChoroplethProps): react.JSX.Element;
628
+ declare function Choropleth({ mode, className, style }: ChoroplethProps): react_jsx_runtime.JSX.Element;
574
629
 
575
630
  type Crumb = {
576
631
  label: string;
@@ -604,9 +659,26 @@ interface PageShellProps {
604
659
  /** Override content padding if needed. Default leaves room for the sticky-blend header. */
605
660
  contentClassName?: string;
606
661
  }
607
- declare function PageHeaderSlotProvider({ children }: {
662
+ /**
663
+ * The app's home destination, rendered as the first breadcrumb.
664
+ *
665
+ * PER-APP AND OPT-IN, which is the whole reason it lives on the provider
666
+ * instead of being hardcoded in `Breadcrumbs`. `PageShell` is shared: the
667
+ * workspace and `apps/approvals` both render it, and approvals has no
668
+ * `/clients` route — a hardcoded home would have shipped it a dead link on
669
+ * every page. An app that wants a home crumb says where home is; an app that
670
+ * does not gets no icon and nothing breaks.
671
+ */
672
+ interface HomeCrumb {
673
+ to: string;
674
+ /** Accessible name for the icon-only link, e.g. "Clients". */
675
+ label: string;
676
+ }
677
+ declare function PageHeaderSlotProvider({ children, home, }: {
608
678
  children: ReactNode;
609
- }): react.JSX.Element;
679
+ /** Where the leading home crumb points. Omit to render no home crumb. */
680
+ home?: HomeCrumb | null;
681
+ }): react_jsx_runtime.JSX.Element;
610
682
  /**
611
683
  * Page shell — promoted from brand-ai-extension Phase 2a (ADR-009 Decision 7).
612
684
  *
@@ -619,7 +691,7 @@ declare function PageHeaderSlotProvider({ children }: {
619
691
  * rendering its own bar — the workspace uses this to merge the lens crumbs
620
692
  * onto the same row as the workspace sidebar toggle.
621
693
  */
622
- declare function PageShell({ crumbs, breadcrumb, title, actions, headerCenter, children, contentClassName, }: PageShellProps): react.JSX.Element;
694
+ declare function PageShell({ crumbs, breadcrumb, title, actions, headerCenter, children, contentClassName, }: PageShellProps): react_jsx_runtime.JSX.Element;
623
695
 
624
696
  /**
625
697
  * PageHeaderHost — single workspace-level header bar that the active
@@ -656,7 +728,33 @@ declare function PageHeaderHost({ leading, center, trailing, padX, }: {
656
728
  */
657
729
  center?: ReactNode;
658
730
  trailing?: ReactNode;
659
- }): react.JSX.Element;
731
+ }): react_jsx_runtime.JSX.Element;
732
+ /**
733
+ * The app's home destination, or null when the app has not declared one.
734
+ *
735
+ * Exported because not every breadcrumb in the app goes through `PageShell` —
736
+ * the Generate lens renders its own trail beside an editable project title —
737
+ * and those forks should read the same destination rather than each hardcoding
738
+ * a path that then drifts.
739
+ */
740
+ declare function useBreadcrumbHome(): HomeCrumb | null;
741
+ /**
742
+ * The leading home crumb: an icon, not a word.
743
+ *
744
+ * WHY AN ICON REPLACES THE FIRST CRUMB RATHER THAN SITTING BESIDE IT. Thirty-one
745
+ * lens trails already began `Clients / …` pointing at `/clients`, which is
746
+ * exactly where home goes — so rendering both would put the same destination on
747
+ * screen twice in a row, once as a picture and once as a word. The icon takes
748
+ * that crumb's place when they agree and prepends when they do not (the tools
749
+ * trails start at `/tools`), so "first position" holds either way.
750
+ *
751
+ * It carries an `aria-label` and a `title`: an icon-only link has no accessible
752
+ * name otherwise, and the tooltip is what tells a first-time user that the house
753
+ * means the client list rather than some other notion of home.
754
+ */
755
+ declare function HomeCrumbLink({ home }: {
756
+ home: HomeCrumb;
757
+ }): react_jsx_runtime.JSX.Element;
660
758
  /**
661
759
  * Scrollable wrapper that exposes its scrollRef via a render prop so
662
760
  * the consuming header (PageShell's internal PageHeader) can subscribe
@@ -665,7 +763,7 @@ declare function PageHeaderHost({ leading, center, trailing, padX, }: {
665
763
  declare function AppScroll({ children, className, }: {
666
764
  children: (scrollRef: RefObject<HTMLDivElement | null>) => ReactNode;
667
765
  className?: string;
668
- }): react.JSX.Element;
766
+ }): react_jsx_runtime.JSX.Element;
669
767
 
670
768
  type SonnerToasterProps = ComponentProps<typeof Toaster$1>;
671
769
  /**
@@ -678,18 +776,18 @@ type SonnerToasterProps = ComponentProps<typeof Toaster$1>;
678
776
  * Apps can override any prop (position, duration, theme, etc.) by
679
777
  * passing it through.
680
778
  */
681
- declare function Toaster(props: SonnerToasterProps): react.JSX.Element;
779
+ declare function Toaster(props: SonnerToasterProps): react_jsx_runtime.JSX.Element;
682
780
 
683
781
  declare function SectionLabel({ children }: {
684
782
  children: ReactNode;
685
- }): react.JSX.Element;
783
+ }): react_jsx_runtime.JSX.Element;
686
784
  declare function IdentityLabel({ children }: {
687
785
  children: ReactNode;
688
- }): react.JSX.Element;
786
+ }): react_jsx_runtime.JSX.Element;
689
787
  declare function IdentityValue({ children, className, }: {
690
788
  children: ReactNode;
691
789
  className?: string;
692
- }): react.JSX.Element;
790
+ }): react_jsx_runtime.JSX.Element;
693
791
  declare function TextInput({ value, onChange, placeholder, autoFocus, autoComplete, name, }: {
694
792
  value: string;
695
793
  onChange: (v: string) => void;
@@ -699,7 +797,7 @@ declare function TextInput({ value, onChange, placeholder, autoFocus, autoComple
699
797
  autoComplete?: string | undefined;
700
798
  /** Forwarded so the field participates in form submission / autofill heuristics. */
701
799
  name?: string | undefined;
702
- }): react.JSX.Element;
800
+ }): react_jsx_runtime.JSX.Element;
703
801
  declare function TextareaInput({ value, onChange, placeholder, autoFocus, autoComplete, name, rows, }: {
704
802
  value: string;
705
803
  onChange: (v: string) => void;
@@ -708,15 +806,15 @@ declare function TextareaInput({ value, onChange, placeholder, autoFocus, autoCo
708
806
  autoComplete?: string | undefined;
709
807
  name?: string | undefined;
710
808
  rows?: number | undefined;
711
- }): react.JSX.Element;
809
+ }): react_jsx_runtime.JSX.Element;
712
810
  declare function EmptyPlaceholder({ label, description, onAdd, }: {
713
811
  label: string;
714
812
  description?: string | undefined;
715
813
  onAdd?: (() => void) | undefined;
716
- }): react.JSX.Element;
814
+ }): react_jsx_runtime.JSX.Element;
717
815
  declare function ListItem({ children }: {
718
816
  children: ReactNode;
719
- }): react.JSX.Element;
817
+ }): react_jsx_runtime.JSX.Element;
720
818
 
721
819
  type Strategy = 'vertical' | 'horizontal' | 'grid';
722
820
  declare function SortableList<T>({ items, getId, onReorder, strategy, children, }: {
@@ -725,7 +823,7 @@ declare function SortableList<T>({ items, getId, onReorder, strategy, children,
725
823
  onReorder: (items: T[]) => void;
726
824
  strategy?: Strategy;
727
825
  children: ReactNode;
728
- }): react.JSX.Element;
826
+ }): react_jsx_runtime.JSX.Element;
729
827
  declare function SortableItem({ id, children, }: {
730
828
  id: string;
731
829
  children: (props: {
@@ -734,11 +832,11 @@ declare function SortableItem({ id, children, }: {
734
832
  style: CSSProperties;
735
833
  isDragging: boolean;
736
834
  }) => ReactNode;
737
- }): react.JSX.Element;
835
+ }): react_jsx_runtime.JSX.Element;
738
836
  declare function DragHandle({ dragHandleProps, className, }: {
739
837
  dragHandleProps: HTMLAttributes<HTMLElement>;
740
838
  className?: string;
741
- }): react.JSX.Element;
839
+ }): react_jsx_runtime.JSX.Element;
742
840
 
743
841
  interface EmptyStateProps {
744
842
  /** Lucide icon (or any ReactNode) rendered inside the 56×56 tile.
@@ -754,7 +852,7 @@ interface EmptyStateProps {
754
852
  * (e.g. when the parent already provides vertical padding). */
755
853
  className?: string;
756
854
  }
757
- declare function EmptyState({ icon, title, description, actions, className, }: EmptyStateProps): react.JSX.Element;
855
+ declare function EmptyState({ icon, title, description, actions, className, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
758
856
 
759
857
  interface RadioGroupProps<T extends string = string> {
760
858
  /** Form name — required for proper radio semantics + form submission. */
@@ -774,7 +872,7 @@ interface RadioGroupProps<T extends string = string> {
774
872
  /** Disable every child radio. */
775
873
  disabled?: boolean;
776
874
  }
777
- declare function RadioGroup<T extends string = string>({ name, value, onChange, children, ariaLabel, orientation, className, disabled, }: RadioGroupProps<T>): react.JSX.Element;
875
+ declare function RadioGroup<T extends string = string>({ name, value, onChange, children, ariaLabel, orientation, className, disabled, }: RadioGroupProps<T>): react_jsx_runtime.JSX.Element;
778
876
  interface RadioProps {
779
877
  /** Value emitted to the group's onChange when picked. */
780
878
  value: string;
@@ -800,7 +898,7 @@ interface OptionTileProps {
800
898
  disabled: boolean | undefined;
801
899
  className: string | undefined;
802
900
  }
803
- declare function OptionTile({ selected, onSelect, inputType, inputName, label, description, disabled, className, }: OptionTileProps): react.JSX.Element;
901
+ declare function OptionTile({ selected, onSelect, inputType, inputName, label, description, disabled, className, }: OptionTileProps): react_jsx_runtime.JSX.Element;
804
902
  interface OptionTileGroupOption<T extends string> {
805
903
  value: T;
806
904
  label: ReactNode;
@@ -827,7 +925,7 @@ type OptionTileGroupProps<T extends string = string> = {
827
925
  /** Optional shared `name` attr on the underlying checkboxes (rarely needed). */
828
926
  name?: string;
829
927
  };
830
- declare function OptionTileGroup<T extends string = string>(props: OptionTileGroupProps<T>): react.JSX.Element;
928
+ declare function OptionTileGroup<T extends string = string>(props: OptionTileGroupProps<T>): react_jsx_runtime.JSX.Element;
831
929
 
832
930
  type MetricCardTone = 'neutral' | 'accent' | 'success' | 'warning' | 'destructive' | 'info';
833
931
  interface MetricCardProps {
@@ -850,8 +948,13 @@ interface MetricCardProps {
850
948
  labelPosition?: 'top' | 'bottom';
851
949
  /** Optional className override for the outer container. */
852
950
  className?: string;
951
+ /** Make the whole card a copy-to-clipboard button. */
952
+ copyable?: boolean;
953
+ /** What a copyable card writes. Defaults to `value` when it is a string;
954
+ * REQUIRED when `value` is a node (there is nothing else to copy). */
955
+ copyValue?: string;
853
956
  }
854
- declare function MetricCard({ value, label, tone, icon, labelPosition, className, }: MetricCardProps): react.JSX.Element;
957
+ declare function MetricCard({ value, label, tone, icon, labelPosition, className, copyable, copyValue, }: MetricCardProps): react_jsx_runtime.JSX.Element;
855
958
 
856
959
  /**
857
960
  * ProgressBar — labeled fill bar.
@@ -875,7 +978,7 @@ interface ProgressBarProps {
875
978
  /** Track height in px (default 8). */
876
979
  height?: number;
877
980
  }
878
- declare function ProgressBar({ label, percent, status, height }: ProgressBarProps): react.JSX.Element;
981
+ declare function ProgressBar({ label, percent, status, height }: ProgressBarProps): react_jsx_runtime.JSX.Element;
879
982
 
880
983
  /**
881
984
  * StepLoader — a sequential, multi-step loading indicator (3-5 steps). Each step
@@ -907,7 +1010,7 @@ interface StepLoaderProps {
907
1010
  minLastStepMs?: number;
908
1011
  className?: string;
909
1012
  }
910
- declare function StepLoader({ steps, done, onComplete, defaultStepMs, minLastStepMs, className, }: StepLoaderProps): react.JSX.Element;
1013
+ declare function StepLoader({ steps, done, onComplete, defaultStepMs, minLastStepMs, className, }: StepLoaderProps): react_jsx_runtime.JSX.Element;
911
1014
 
912
1015
  type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'destructive' | 'info';
913
1016
  interface BadgeProps {
@@ -924,7 +1027,7 @@ interface BadgeProps {
924
1027
  /** Extra classes merged onto the outer span (no longer replaces base). */
925
1028
  className?: string;
926
1029
  }
927
- declare function Badge({ tone, children, icon, dot, size, className, }: BadgeProps): react.JSX.Element;
1030
+ declare function Badge({ tone, children, icon, dot, size, className, }: BadgeProps): react_jsx_runtime.JSX.Element;
928
1031
 
929
1032
  interface TokenBadgeProps {
930
1033
  /** Public token name to tint from, e.g. `--folder-teal`, `--accent`,
@@ -946,7 +1049,7 @@ interface TokenBadgeProps {
946
1049
  uppercase?: boolean;
947
1050
  className?: string;
948
1051
  }
949
- declare function TokenBadge({ colorVar, children, variant, dot, icon, size, shape, uppercase, className, }: TokenBadgeProps): react.JSX.Element;
1052
+ declare function TokenBadge({ colorVar, children, variant, dot, icon, size, shape, uppercase, className, }: TokenBadgeProps): react_jsx_runtime.JSX.Element;
950
1053
 
951
1054
  interface ValueChipProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
952
1055
  children: ReactNode;
@@ -1048,7 +1151,7 @@ interface AllocationSparkbarProps {
1048
1151
  height?: number;
1049
1152
  className?: string;
1050
1153
  }
1051
- declare function AllocationSparkbar({ values, baseColorVar, colorVars, labels, titles, height, className, }: AllocationSparkbarProps): react.JSX.Element;
1154
+ declare function AllocationSparkbar({ values, baseColorVar, colorVars, labels, titles, height, className, }: AllocationSparkbarProps): react_jsx_runtime.JSX.Element;
1052
1155
 
1053
1156
  type FloatingStatusTone = 'neutral' | 'accent' | 'success' | 'warning' | 'destructive' | 'info';
1054
1157
  interface FloatingStatusBarProps {
@@ -1066,7 +1169,7 @@ interface FloatingStatusBarProps {
1066
1169
  * bottom-center. */
1067
1170
  className?: string;
1068
1171
  }
1069
- declare function FloatingStatusBar({ tone, label, meta, summary, action, className, }: FloatingStatusBarProps): react.JSX.Element;
1172
+ declare function FloatingStatusBar({ tone, label, meta, summary, action, className, }: FloatingStatusBarProps): react_jsx_runtime.JSX.Element;
1070
1173
 
1071
1174
  interface StatsGridProps {
1072
1175
  children: ReactNode;
@@ -1076,7 +1179,7 @@ interface StatsGridProps {
1076
1179
  /** Optional className override for the outer container. */
1077
1180
  className?: string;
1078
1181
  }
1079
- declare function StatsGrid({ children, minColumnWidth, className, }: StatsGridProps): react.JSX.Element;
1182
+ declare function StatsGrid({ children, minColumnWidth, className, }: StatsGridProps): react_jsx_runtime.JSX.Element;
1080
1183
 
1081
1184
  interface Column<T> {
1082
1185
  /** Unique id; doubles as the sort key. Use a `keyof T` string or
@@ -1115,7 +1218,7 @@ interface SortableTableProps<T> {
1115
1218
  /** Compact density (smaller padding). Default false. */
1116
1219
  compact?: boolean;
1117
1220
  }
1118
- declare function SortableTable<T>({ columns, rows, rowKey, initialSort, onRowClick, emptyState, zebra, compact, }: SortableTableProps<T>): react.JSX.Element;
1221
+ declare function SortableTable<T>({ columns, rows, rowKey, initialSort, onRowClick, emptyState, zebra, compact, }: SortableTableProps<T>): react_jsx_runtime.JSX.Element;
1119
1222
 
1120
1223
  /**
1121
1224
  * Pagination — "Showing X-Y of Z" + prev/next buttons.
@@ -1137,7 +1240,7 @@ interface PaginationProps {
1137
1240
  totalItems: number;
1138
1241
  onPageChange: (page: number) => void;
1139
1242
  }
1140
- declare function Pagination({ currentPage, pageSize, totalItems, onPageChange, }: PaginationProps): react.JSX.Element | null;
1243
+ declare function Pagination({ currentPage, pageSize, totalItems, onPageChange, }: PaginationProps): react_jsx_runtime.JSX.Element | null;
1141
1244
 
1142
1245
  interface Tab {
1143
1246
  id: string;
@@ -1163,7 +1266,7 @@ interface TabsProps {
1163
1266
  stretch?: boolean;
1164
1267
  className?: string;
1165
1268
  }
1166
- declare function Tabs({ tabs, activeTabId, onTabChange, size, variant, stretch, className, }: TabsProps): react.JSX.Element;
1269
+ declare function Tabs({ tabs, activeTabId, onTabChange, size, variant, stretch, className, }: TabsProps): react_jsx_runtime.JSX.Element;
1167
1270
 
1168
1271
  interface PillButtonProps {
1169
1272
  active: boolean;
@@ -1177,7 +1280,7 @@ interface PillButtonProps {
1177
1280
  icon?: ReactNode;
1178
1281
  disabled?: boolean;
1179
1282
  }
1180
- declare function PillButton({ active, onClick, children, size, tone, icon, disabled, }: PillButtonProps): react.JSX.Element;
1283
+ declare function PillButton({ active, onClick, children, size, tone, icon, disabled, }: PillButtonProps): react_jsx_runtime.JSX.Element;
1181
1284
 
1182
1285
  interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange' | 'checked'> {
1183
1286
  checked?: boolean;
@@ -1186,8 +1289,242 @@ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'typ
1186
1289
  }
1187
1290
  declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLInputElement>>;
1188
1291
 
1189
- type Align = 'start' | 'center' | 'end';
1190
- type Side = 'top' | 'bottom';
1292
+ /**
1293
+ * Dismiss-layer stack the ONE "topmost layer wins" registry shared by
1294
+ * Modal, DropdownMenu and Popover (and, next, ContextMenu / Select /
1295
+ * Combobox / Tooltip / CommandPalette).
1296
+ *
1297
+ * Extracted from modal.tsx's module-level `openPanels` array so every
1298
+ * dismissable surface participates in the same order. Before this, a
1299
+ * DropdownMenu opened from inside a Modal answered Escape at the same time
1300
+ * the Modal did — two document listeners, one keypress, both closed. Now a
1301
+ * single document `keydown` listener dispatches Escape to the top of the
1302
+ * stack ONLY, then stops propagation so window-level handlers (the chat
1303
+ * conversation drawer's Escape, lens hotkey maps) do not treat a consumed
1304
+ * Escape as theirs — which is what DropdownMenu's own listener already did.
1305
+ *
1306
+ * Promoted per ADR-0030 Decision G (meta-ads-audit-dashboard task manager:
1307
+ * every picker, sheet and palette needs one dismiss order). First consumer
1308
+ * is the workspace app: Modal (51 files), DropdownMenu (137 call sites) and
1309
+ * Popover all register here.
1310
+ *
1311
+ * Two kinds. A `modal` layer also owns a focus trap, and that trap must not
1312
+ * switch off because a `popover` opened above it — so Modal asks
1313
+ * `isTopOfKind()` for Tab handling while Escape always goes to `isTop()`.
1314
+ * Order is push order, which under React is effect order: a surface that
1315
+ * mounts or opens later sits above one that opened earlier.
1316
+ *
1317
+ * Usage (a dismissable surface):
1318
+ *
1319
+ * const layer = useLayer({
1320
+ * enabled: open,
1321
+ * kind: 'popover',
1322
+ * elementRef: contentRef,
1323
+ * onEscape: () => setOpen(false),
1324
+ * })
1325
+ * useOutsideClick([triggerRef, contentRef], () => setOpen(false), {
1326
+ * enabled: open,
1327
+ * layer, // clicks inside a layer stacked ABOVE this one are not "outside"
1328
+ * })
1329
+ *
1330
+ * `useEscapeKey(handler, { enabled })` is the one-liner for anything that
1331
+ * only needs Escape.
1332
+ */
1333
+
1334
+ type LayerKind = 'modal' | 'popover';
1335
+ interface LayerHandle {
1336
+ /** True while no layer of ANY kind sits above this one. */
1337
+ isTop(): boolean;
1338
+ /** True while no layer of the SAME kind sits above this one. */
1339
+ isTopOfKind(): boolean;
1340
+ /**
1341
+ * True when `node` is inside the element of a layer stacked above this
1342
+ * one — a nested Select's listbox, a Combobox inside a Popover. Outside-
1343
+ * click handlers treat those as inside.
1344
+ */
1345
+ containsInLayerAbove(node: Node): boolean;
1346
+ }
1347
+ interface UseLayerOptions {
1348
+ /** Register while true; pop when it turns false or the owner unmounts. */
1349
+ enabled: boolean;
1350
+ kind: LayerKind;
1351
+ /**
1352
+ * The surface's root element. Read lazily, so a ref that is filled in
1353
+ * after the layer registers (portal content) still resolves.
1354
+ */
1355
+ elementRef?: RefObject<HTMLElement | null>;
1356
+ /** Called when this layer is topmost and Escape is pressed. */
1357
+ onEscape: (event: KeyboardEvent) => void;
1358
+ }
1359
+ /**
1360
+ * Register a dismiss layer for as long as `enabled` holds. `onEscape` is
1361
+ * read through a ref, so an inline arrow does not re-register the layer
1362
+ * (and does not reorder it) on every render.
1363
+ */
1364
+ declare function useLayer(options: UseLayerOptions): LayerHandle;
1365
+ interface UseEscapeKeyOptions {
1366
+ /** Default true. */
1367
+ enabled?: boolean;
1368
+ /** Default `popover`. */
1369
+ kind?: LayerKind;
1370
+ }
1371
+ /**
1372
+ * Escape-only participant in the layer stack. Fires `onEscape` only while
1373
+ * this is the topmost layer; a layer that opens later takes over until it
1374
+ * closes.
1375
+ */
1376
+ declare function useEscapeKey(onEscape: (event: KeyboardEvent) => void, options?: UseEscapeKeyOptions): LayerHandle;
1377
+
1378
+ /**
1379
+ * Anchored positioning — the ONE measure / flip / clamp routine behind every
1380
+ * floating surface in @lovett/ui.
1381
+ *
1382
+ * Four primitives (DropdownMenu, FilterDropdown, FolderTreePicker,
1383
+ * TagChipInput) each hand-rolled the same `useLayoutEffect` +
1384
+ * `getBoundingClientRect` + clamp + resize/scroll-listener block, with four
1385
+ * slightly different gaps: no flip at a viewport edge; no clamp; measuring in
1386
+ * a passive effect so the first paint was wrong; `top`/`bottom` only. This
1387
+ * module is the single implementation. DropdownMenu is rebuilt on it in the
1388
+ * same change; the other three keep their local copies for now (follow-up).
1389
+ *
1390
+ * Promoted per ADR-0030 Decision G (meta-ads-audit-dashboard task manager)
1391
+ * with the workspace app as the first consumer — DropdownMenu and Popover
1392
+ * position through this hook, so every menu in the app is on it. Select /
1393
+ * Combobox / Tooltip / ContextMenu build on it next.
1394
+ *
1395
+ * No Floating UI, no Popper (CLAUDE.md §1 allowed deps). Three pieces:
1396
+ * • `computeAnchoredPosition` — pure math, unit-tested without a DOM.
1397
+ * • `useAnchoredPosition` — measures, positions, tracks resize / scroll /
1398
+ * size changes. Anchor is an element (`anchorRef`) OR a virtual rect
1399
+ * (`anchorRect`) — ContextMenu passes the right-click point as
1400
+ * `{ left: e.clientX, top: e.clientY, width: 0, height: 0 }`.
1401
+ * • `useOutsideClick` — pointerdown outside a set of targets, aware of
1402
+ * layers stacked above (a nested Select's listbox is not "outside").
1403
+ *
1404
+ * Two-phase render, unchanged from the DropdownMenu it replaces: the first
1405
+ * paint measures the content parked at (-99999, -99999) with
1406
+ * `visibility: hidden`, the layout effect computes the real coordinates, and
1407
+ * the second paint reveals it. Components gate their entry animation on
1408
+ * `positioned` so `.ds-enter-pop` never plays from the parked location.
1409
+ *
1410
+ * Token discipline: the hook emits geometry only (`position: fixed` +
1411
+ * `left` / `top` in px). Surface colour, radius, shadow, padding and the
1412
+ * motion class stay with the component.
1413
+ *
1414
+ * Usage:
1415
+ *
1416
+ * const { ref, style, placement, positioned } =
1417
+ * useAnchoredPosition<HTMLDivElement>({
1418
+ * anchorRef: triggerRef,
1419
+ * side: 'bottom',
1420
+ * align: 'start',
1421
+ * offset: 6,
1422
+ * enabled: open,
1423
+ * })
1424
+ * return createPortal(
1425
+ * <div
1426
+ * ref={ref}
1427
+ * style={style}
1428
+ * data-side={placement?.side}
1429
+ * className={cn(positioned && 'ds-enter-pop')}
1430
+ * >
1431
+ * …
1432
+ * </div>,
1433
+ * document.body,
1434
+ * )
1435
+ */
1436
+
1437
+ type AnchorSide = 'top' | 'bottom' | 'left' | 'right';
1438
+ type AnchorAlign = 'start' | 'center' | 'end';
1439
+ /** Viewport-relative rect. `DOMRect` satisfies it; so does a point. */
1440
+ interface AnchorRect {
1441
+ readonly left: number;
1442
+ readonly top: number;
1443
+ readonly width: number;
1444
+ readonly height: number;
1445
+ }
1446
+ interface AnchorSize {
1447
+ readonly width: number;
1448
+ readonly height: number;
1449
+ }
1450
+ /** The side and alignment actually used after flipping. */
1451
+ interface AnchorPlacement {
1452
+ readonly side: AnchorSide;
1453
+ readonly align: AnchorAlign;
1454
+ }
1455
+ interface AnchoredPositionOptions {
1456
+ /** Preferred side of the anchor. Default `bottom`. */
1457
+ side?: AnchorSide;
1458
+ /** Alignment along the anchor's cross axis. Default `start`. */
1459
+ align?: AnchorAlign;
1460
+ /** Gap between anchor and floating element along `side`, px. Default 6. */
1461
+ offset?: number;
1462
+ /** Shift along the alignment axis, px. Default 0. */
1463
+ alignOffset?: number;
1464
+ /**
1465
+ * Flip to the opposite side when the preferred side cannot fit and the
1466
+ * opposite side fits — or simply has more room. Default true.
1467
+ */
1468
+ flip?: boolean;
1469
+ /** Keep the floating element inside the viewport, `gutter` px in. Default true. */
1470
+ clampToViewport?: boolean;
1471
+ /** Viewport inset used by both flip and clamp, px. Default 8. */
1472
+ gutter?: number;
1473
+ }
1474
+ interface AnchoredPosition {
1475
+ readonly left: number;
1476
+ readonly top: number;
1477
+ readonly placement: AnchorPlacement;
1478
+ }
1479
+ /**
1480
+ * Pure placement math. Given the anchor rect, the floating element's size
1481
+ * and the viewport size, returns fixed-position coordinates plus the
1482
+ * placement actually used. No DOM — this is what the tests pin.
1483
+ */
1484
+ declare function computeAnchoredPosition(anchor: AnchorRect, floating: AnchorSize, viewport: AnchorSize, options?: AnchoredPositionOptions): AnchoredPosition;
1485
+ interface UseAnchoredPositionOptions extends AnchoredPositionOptions {
1486
+ /** Element to anchor to. Ignored while `anchorRect` is non-null. */
1487
+ anchorRef?: RefObject<Element | null>;
1488
+ /** Virtual anchor (a right-click point, a text caret). Wins over `anchorRef`. */
1489
+ anchorRect?: AnchorRect | null;
1490
+ /** Measure and track while true. Default true. */
1491
+ enabled?: boolean;
1492
+ }
1493
+ interface UseAnchoredPositionResult<T extends HTMLElement> {
1494
+ /** Attach to the floating element. */
1495
+ ref: (node: T | null) => void;
1496
+ /** The same node as a ref object — for `contains()` checks. */
1497
+ floatingRef: RefObject<T | null>;
1498
+ /** `position: fixed` + coordinates; hidden and parked off-screen until measured. */
1499
+ style: CSSProperties;
1500
+ /** Side / align actually used, or null until measured. */
1501
+ placement: AnchorPlacement | null;
1502
+ /** True once real coordinates are applied. Gate entry motion on this. */
1503
+ positioned: boolean;
1504
+ /** Re-measure now (after content you know changed size, for example). */
1505
+ update: () => void;
1506
+ }
1507
+ declare function useAnchoredPosition<T extends HTMLElement = HTMLElement>(options: UseAnchoredPositionOptions): UseAnchoredPositionResult<T>;
1508
+ type OutsideClickTarget = RefObject<Element | null> | Element | null | undefined;
1509
+ interface UseOutsideClickOptions {
1510
+ /** Default true. */
1511
+ enabled?: boolean;
1512
+ /**
1513
+ * This surface's dismiss layer. When given, a pointerdown inside any layer
1514
+ * stacked ABOVE it (a Select opened from inside a Popover) is treated as
1515
+ * inside, not outside.
1516
+ */
1517
+ layer?: LayerHandle;
1518
+ }
1519
+ /**
1520
+ * Calls `onOutside` on a `pointerdown` whose target is inside none of
1521
+ * `targets`. Handler and targets are read through refs, so inline arrays
1522
+ * and arrows do not re-subscribe the listener.
1523
+ */
1524
+ declare function useOutsideClick(targets: ReadonlyArray<OutsideClickTarget>, onOutside: (event: PointerEvent) => void, options?: UseOutsideClickOptions): void;
1525
+
1526
+ type Align = AnchorAlign;
1527
+ type Side = AnchorSide;
1191
1528
  interface DropdownMenuProps {
1192
1529
  /** Controlled open state. Omit for internal state. */
1193
1530
  open?: boolean;
@@ -1196,7 +1533,7 @@ interface DropdownMenuProps {
1196
1533
  defaultOpen?: boolean;
1197
1534
  children: ReactNode;
1198
1535
  }
1199
- declare function DropdownMenu({ open: controlledOpen, onOpenChange, defaultOpen, children, }: DropdownMenuProps): react.JSX.Element;
1536
+ declare function DropdownMenu({ open: controlledOpen, onOpenChange, defaultOpen, children, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
1200
1537
  interface DropdownMenuTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1201
1538
  /** Skip the default secondary-Button styling. Useful when wrapping
1202
1539
  * an existing Button primitive. */
@@ -1207,37 +1544,41 @@ interface DropdownMenuTriggerProps extends ButtonHTMLAttributes<HTMLButtonElemen
1207
1544
  * secondary Button visual (rounded-xl + `--bg-card` fill + 1px
1208
1545
  * `--border`). Set `unstyled` to wrap your own button shape.
1209
1546
  */
1210
- declare function DropdownMenuTrigger({ unstyled, className, onClick, children, ...rest }: DropdownMenuTriggerProps): react.JSX.Element;
1547
+ declare const DropdownMenuTrigger: react.ForwardRefExoticComponent<DropdownMenuTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1211
1548
  interface DropdownMenuContentProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
1212
1549
  children: ReactNode;
1213
1550
  /** Horizontal alignment relative to the trigger. Default `start`. */
1214
1551
  align?: Align;
1215
1552
  /** Pixel offset along the alignment axis. Default 0. */
1216
1553
  alignOffset?: number;
1217
- /** Place above (`top`) or below (`bottom`) the trigger. Default `bottom`. */
1554
+ /**
1555
+ * Preferred side of the trigger. Default `bottom`. Flips to the opposite
1556
+ * side when it cannot fit (before the 2026-09-05 rebuild it was clamped
1557
+ * over its own trigger instead; only that no-room case differs).
1558
+ */
1218
1559
  side?: Side;
1219
1560
  /** Pixel offset along the side axis. Default 6. */
1220
1561
  sideOffset?: number;
1221
1562
  }
1222
- declare function DropdownMenuContent({ children, align, alignOffset, side, sideOffset, className, style, ...rest }: DropdownMenuContentProps): react.ReactPortal | null;
1563
+ declare const DropdownMenuContent: react.ForwardRefExoticComponent<DropdownMenuContentProps & react.RefAttributes<HTMLDivElement>>;
1223
1564
  interface DropdownMenuItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1224
1565
  variant?: 'default' | 'destructive';
1225
1566
  /** Pad-left compensation so items with no leading icon align with
1226
1567
  * items that have one. */
1227
1568
  inset?: boolean;
1228
1569
  }
1229
- declare function DropdownMenuItem({ variant, inset, className, onClick, children, ...rest }: DropdownMenuItemProps): react.JSX.Element;
1570
+ declare const DropdownMenuItem: react.ForwardRefExoticComponent<DropdownMenuItemProps & react.RefAttributes<HTMLButtonElement>>;
1230
1571
  interface DropdownMenuCheckboxItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {
1231
1572
  checked?: boolean;
1232
1573
  onCheckedChange?: (checked: boolean) => void;
1233
1574
  }
1234
- declare function DropdownMenuCheckboxItem({ checked, onCheckedChange, className, children, onClick, disabled, ...rest }: DropdownMenuCheckboxItemProps): react.JSX.Element;
1235
- declare function DropdownMenuSeparator({ className, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
1575
+ declare const DropdownMenuCheckboxItem: react.ForwardRefExoticComponent<DropdownMenuCheckboxItemProps & react.RefAttributes<HTMLButtonElement>>;
1576
+ declare function DropdownMenuSeparator({ className, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1236
1577
  interface DropdownMenuLabelProps extends HTMLAttributes<HTMLDivElement> {
1237
1578
  inset?: boolean;
1238
1579
  }
1239
- declare function DropdownMenuLabel({ inset, className, ...rest }: DropdownMenuLabelProps): react.JSX.Element;
1240
- declare function DropdownMenuGroup({ className, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
1580
+ declare function DropdownMenuLabel({ inset, className, ...rest }: DropdownMenuLabelProps): react_jsx_runtime.JSX.Element;
1581
+ declare function DropdownMenuGroup({ className, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1241
1582
 
1242
1583
  /**
1243
1584
  * DataGrid public types.
@@ -1374,7 +1715,7 @@ type EditingCell<ColumnId extends string> = {
1374
1715
  };
1375
1716
  };
1376
1717
 
1377
- declare function DataGrid<Row extends DataGridRowBase, ColumnId extends string>({ rows, columns, getRowLabel, renderCell, isEditableColumn, getCellEditValue, applyCellEdit, getDrawerCellValue, canOpenDrawer, renderSummary, renderDrawerPanel, renderToolbar, onToolbarPropsChange, onOpenDrawerCell, drawerModal, drawerSize, stickySummaryFooter, stickyHeader, fillWidth, fillAvailableHeight, tableContainerClassName, onRowsChange, sort, onSortChange, }: DataGridProps<Row, ColumnId>): react.JSX.Element;
1718
+ declare function DataGrid<Row extends DataGridRowBase, ColumnId extends string>({ rows, columns, getRowLabel, renderCell, isEditableColumn, getCellEditValue, applyCellEdit, getDrawerCellValue, canOpenDrawer, renderSummary, renderDrawerPanel, renderToolbar, onToolbarPropsChange, onOpenDrawerCell, drawerModal, drawerSize, stickySummaryFooter, stickyHeader, fillWidth, fillAvailableHeight, tableContainerClassName, onRowsChange, sort, onSortChange, }: DataGridProps<Row, ColumnId>): react_jsx_runtime.JSX.Element;
1378
1719
 
1379
1720
  interface DataGridToolbarProps {
1380
1721
  /** Left slot — typically a <SearchBar>. Stretches up to a comfortable
@@ -1384,19 +1725,19 @@ interface DataGridToolbarProps {
1384
1725
  children?: ReactNode;
1385
1726
  className?: string;
1386
1727
  }
1387
- declare function DataGridToolbar({ search, children, className, }: DataGridToolbarProps): react.JSX.Element;
1728
+ declare function DataGridToolbar({ search, children, className, }: DataGridToolbarProps): react_jsx_runtime.JSX.Element;
1388
1729
 
1389
1730
  type DataGridColumnOptionsMenuProps<ColumnId extends string> = Pick<DataGridToolbarRenderProps<ColumnId>, 'showSummaries' | 'onShowSummariesChange' | 'visibleColumns' | 'visibleColumnIds' | 'hiddenColumns' | 'toggleColumnVisibility' | 'optionsSensors' | 'onOptionColumnDragEnd' | 'optionsDndContextId'> & {
1390
1731
  triggerLabel?: string;
1391
1732
  };
1392
- declare function DataGridColumnOptionsMenu<ColumnId extends string>({ showSummaries, onShowSummariesChange, visibleColumns, visibleColumnIds, hiddenColumns, toggleColumnVisibility, optionsSensors, onOptionColumnDragEnd, optionsDndContextId, triggerLabel, }: DataGridColumnOptionsMenuProps<ColumnId>): react.JSX.Element;
1733
+ declare function DataGridColumnOptionsMenu<ColumnId extends string>({ showSummaries, onShowSummariesChange, visibleColumns, visibleColumnIds, hiddenColumns, toggleColumnVisibility, optionsSensors, onOptionColumnDragEnd, optionsDndContextId, triggerLabel, }: DataGridColumnOptionsMenuProps<ColumnId>): react_jsx_runtime.JSX.Element;
1393
1734
 
1394
1735
  type DataGridDragOverlayProps<ColumnId extends string> = {
1395
1736
  dragOverlayColumn: DataGridColumn<ColumnId> | null;
1396
1737
  columnWidths: Record<ColumnId, number>;
1397
1738
  dragOverlayHeight: number;
1398
1739
  };
1399
- declare function DataGridDragOverlay<ColumnId extends string>({ dragOverlayColumn, columnWidths, dragOverlayHeight, }: DataGridDragOverlayProps<ColumnId>): react.JSX.Element | null;
1740
+ declare function DataGridDragOverlay<ColumnId extends string>({ dragOverlayColumn, columnWidths, dragOverlayHeight, }: DataGridDragOverlayProps<ColumnId>): react_jsx_runtime.JSX.Element | null;
1400
1741
  type DataGridDropIndicatorProps = {
1401
1742
  dropIndicatorLeft: number | null;
1402
1743
  dragTableRect: {
@@ -1404,7 +1745,348 @@ type DataGridDropIndicatorProps = {
1404
1745
  height: number;
1405
1746
  } | null;
1406
1747
  };
1407
- declare function DataGridDropIndicator({ dropIndicatorLeft, dragTableRect, }: DataGridDropIndicatorProps): react.JSX.Element | null;
1748
+ declare function DataGridDropIndicator({ dropIndicatorLeft, dragTableRect, }: DataGridDropIndicatorProps): react_jsx_runtime.JSX.Element | null;
1749
+
1750
+ /**
1751
+ * The popover surface chrome, shared with DropdownMenuContent so a menu and
1752
+ * a popover read as the same family. Inline rather than a stylesheet class
1753
+ * because the surface tokens are internal and the primitives already own
1754
+ * them here (Kbd, DropdownMenu follow the same pattern).
1755
+ */
1756
+ declare const POPOVER_SURFACE_STYLE: CSSProperties;
1757
+ interface PopoverProps {
1758
+ /** Controlled open state. Omit for internal state. */
1759
+ open?: boolean;
1760
+ defaultOpen?: boolean;
1761
+ /** Fires whenever open transitions. */
1762
+ onOpenChange?: (open: boolean) => void;
1763
+ /**
1764
+ * Virtual anchor. When non-null, Content positions against this rect
1765
+ * instead of the Trigger — a right-click point, a caret, a cell.
1766
+ */
1767
+ anchorRect?: AnchorRect | null;
1768
+ children: ReactNode;
1769
+ }
1770
+ declare function PopoverRoot({ open: controlledOpen, defaultOpen, onOpenChange, anchorRect, children, }: PopoverProps): react_jsx_runtime.JSX.Element;
1771
+ interface PopoverTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1772
+ /**
1773
+ * Render the single child element as the trigger instead of a `<button>`.
1774
+ * The child receives the ref, click handler and ARIA attributes; the DOM
1775
+ * stays one element. It must be focusable and keyboard-operable on its
1776
+ * own (a `<button>`, an `<a href>`, or `role="button"` + `tabIndex={0}` +
1777
+ * Enter / Space handling): Trigger adds no role, tabIndex or key handler.
1778
+ */
1779
+ asChild?: boolean;
1780
+ }
1781
+ interface PopoverContentProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'> {
1782
+ children: ReactNode;
1783
+ /** Preferred side of the anchor. Default `bottom`. Flips when it cannot fit. */
1784
+ side?: AnchorSide;
1785
+ /** Alignment along the anchor's cross axis. Default `start`. */
1786
+ align?: AnchorAlign;
1787
+ /** Gap from the anchor, px. Default 6. */
1788
+ offset?: number;
1789
+ /** Shift along the alignment axis, px. Default 0. */
1790
+ alignOffset?: number;
1791
+ /** Default true. */
1792
+ flip?: boolean;
1793
+ /** Default true. */
1794
+ clampToViewport?: boolean;
1795
+ /**
1796
+ * `dialog` (default) — a named, non-modal dialog; give it `aria-label` or
1797
+ * `aria-labelledby`. `none` — no role attribute, for content that is
1798
+ * itself the widget.
1799
+ */
1800
+ role?: 'dialog' | 'none';
1801
+ /** Skip the surface chrome (background / border / shadow / radius / padding). */
1802
+ unstyled?: boolean;
1803
+ }
1804
+ declare const Popover: typeof PopoverRoot & {
1805
+ Trigger: react.ForwardRefExoticComponent<PopoverTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1806
+ Content: react.ForwardRefExoticComponent<PopoverContentProps & react.RefAttributes<HTMLDivElement>>;
1807
+ };
1808
+
1809
+ type SelectSize = 'sm' | 'md';
1810
+ interface SelectOption<T extends string = string> {
1811
+ value: T;
1812
+ label: string;
1813
+ /** Secondary line under the label. */
1814
+ description?: string;
1815
+ /** Leading adornment — a Lucide icon, an avatar, a colour dot. */
1816
+ icon?: ReactNode;
1817
+ /** Rendered but not selectable; skipped by the arrow keys and type-ahead. */
1818
+ disabled?: boolean;
1819
+ }
1820
+ interface SelectProps<T extends string = string> extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'defaultValue' | 'onChange' | 'role'> {
1821
+ options: ReadonlyArray<SelectOption<T>>;
1822
+ /** Controlled value; `null` = nothing selected. Omit for internal state. */
1823
+ value?: T | null;
1824
+ defaultValue?: T | null;
1825
+ /** Fires when the user picks a DIFFERENT option. */
1826
+ onValueChange?: (value: T) => void;
1827
+ /** Shown while nothing is selected. Default "Select…". */
1828
+ placeholder?: string;
1829
+ /** Control height — matches `<Input inputSize>`. Default `md`. */
1830
+ size?: SelectSize;
1831
+ /** Error chrome (`is-error`) + `aria-invalid` on the trigger. A caller's own `aria-invalid` wins. */
1832
+ error?: boolean;
1833
+ /** Controlled open state. Omit for internal state. */
1834
+ open?: boolean;
1835
+ defaultOpen?: boolean;
1836
+ onOpenChange?: (open: boolean) => void;
1837
+ /** Preferred side for the listbox. Default `bottom`; flips when it cannot fit. */
1838
+ side?: AnchorSide;
1839
+ /** Alignment along the trigger's edge. Default `start`. */
1840
+ align?: AnchorAlign;
1841
+ /** Extra classes on the listbox surface. */
1842
+ listboxClassName?: string;
1843
+ }
1844
+ /**
1845
+ * The listbox popup chrome, shared with Combobox so the two lists read as
1846
+ * one family (Popover / DropdownMenu share `POPOVER_SURFACE_STYLE` the same
1847
+ * way).
1848
+ */
1849
+ declare const LISTBOX_CLASS = "fixed z-[100] max-h-[min(60vh,20rem)] overflow-y-auto rounded-[var(--radius-lg)] p-1.5 outline-none";
1850
+ interface ListboxOptionProps {
1851
+ id: string;
1852
+ label: string;
1853
+ description?: string | undefined;
1854
+ icon?: ReactNode;
1855
+ /** Trailing count — tabular, muted. */
1856
+ count?: number | undefined;
1857
+ selected: boolean;
1858
+ highlighted: boolean;
1859
+ disabled?: boolean | undefined;
1860
+ onSelect: () => void;
1861
+ onHighlight: () => void;
1862
+ /** Replaces the default body (icon / label / description / count). The check mark stays. */
1863
+ children?: ReactNode;
1864
+ }
1865
+ /**
1866
+ * One row of a listbox — used by Select and Combobox. A `<button>` rather
1867
+ * than a `<div role="option">` so it is clickable without a keyboard handler
1868
+ * of its own; `tabIndex={-1}` keeps it out of the tab order (the trigger /
1869
+ * input owns the keyboard, per `aria-activedescendant`). Disabled rows use
1870
+ * `aria-disabled`, NOT the `disabled` attribute: a disabled control swallows
1871
+ * the mousedown the listbox prevents to keep focus on the trigger / in the
1872
+ * input, so clicking one would blur the Combobox and close the list.
1873
+ */
1874
+ declare function ListboxOption({ id, label, description, icon, count, selected, highlighted, disabled, onSelect, onHighlight, children, }: ListboxOptionProps): react_jsx_runtime.JSX.Element;
1875
+ /**
1876
+ * `forwardRef` erases the component's type parameter (it is instantiated at
1877
+ * `string` above). This assertion restores the generic signature so
1878
+ * `onValueChange` narrows to the union of the option values a caller
1879
+ * passed; it changes nothing at runtime.
1880
+ */
1881
+ declare const Select: <T extends string = string>(props: SelectProps<T> & RefAttributes<HTMLButtonElement>) => ReactElement | null;
1882
+
1883
+ /**
1884
+ * Combobox — a text input that filters a listbox; single- or multi-select.
1885
+ *
1886
+ * WAI-ARIA APG "editable combobox with list autocomplete": the `<input>` is
1887
+ * `role="combobox"` with `aria-autocomplete="list"`, `aria-expanded`,
1888
+ * `aria-controls` and `aria-activedescendant`; the popup is `role="listbox"`
1889
+ * (`aria-multiselectable` in multi mode) of `role="option"` rows, optionally
1890
+ * inside `role="group"` sections with a heading. DOM focus never leaves the
1891
+ * input: a mousedown in the list is prevented, so clicking an option keeps
1892
+ * the caret where it was.
1893
+ *
1894
+ * Filtering is client-side by default (case-insensitive substring over label
1895
+ * and description) and starts only once the user TYPES — opening a
1896
+ * single-select that already holds a value shows the whole list, not the one
1897
+ * row matching the selected label. Async-friendly: pass `shouldFilter={false}`
1898
+ * to show `options` exactly as given, read the query through
1899
+ * `onInputValueChange`, fetch, and flip `loading` while you wait. The
1900
+ * component never fetches anything itself.
1901
+ *
1902
+ * Single mode: picking an option sets it and closes; the input shows the
1903
+ * selected label; the label text is selected on focus so typing replaces it;
1904
+ * leaving the field (blur / outside click) with the text deliberately emptied
1905
+ * clears the value (`onValueChange(null)`), while Escape closes and reverts.
1906
+ * Multi mode: selected options render as chips ahead of the input; picking
1907
+ * toggles and keeps the list open; Backspace on an empty input removes the
1908
+ * last chip. Keep the selected options present in `options` (a chip whose
1909
+ * option has scrolled out of an async result set falls back to its raw
1910
+ * value as the label).
1911
+ *
1912
+ * Keyboard: ArrowDown / ArrowUp open the list and move the highlight
1913
+ * (disabled options are skipped, no wrap), Enter picks the highlighted
1914
+ * option, Escape closes (through the shared layer stack — a Combobox in a
1915
+ * Popover in a Modal peels one layer per keypress), Tab and blur close.
1916
+ * Home / End are left to the caret.
1917
+ *
1918
+ * Promoted per ADR-0030 Decision G (meta-ads-audit-dashboard task manager:
1919
+ * the row / card / context-menu / palette pickers are all "popover + search +
1920
+ * live counts", which is exactly `count` on each option). Second consumer is
1921
+ * the workspace app: `lenses/sem-spec/components/location-autocomplete.tsx`
1922
+ * hand-rolls this role, and TagChipInput carries the chip model this one
1923
+ * generalises.
1924
+ *
1925
+ * Token discipline: the shell is `.input-shell` (INTERNAL `--bg-input` /
1926
+ * `--border-input`, owned by styles.css); the listbox shares
1927
+ * `LISTBOX_CLASS` + `POPOVER_SURFACE_STYLE` with Select; chips are public
1928
+ * `--surface-overlay` on `--foreground`; counts and group headings
1929
+ * `--text-muted`. Geometry from `useAnchoredPosition`, motion from
1930
+ * `.ds-enter-pop` gated on `positioned` (prefers-reduced-motion honoured in
1931
+ * styles.css).
1932
+ *
1933
+ * TODO(tokens): the type / size literals here (`text-[12px]` chips,
1934
+ * `max-w-[12rem]`, `text-[12.5px]` and `text-[11px] tracking-[0.4px]` in
1935
+ * the list, `minWidth: '6rem'`) mirror dropdown-menu.tsx and sit off the
1936
+ * spacing scale; snap them once a type-scale token exists (review
1937
+ * 2026-09-05, MINOR).
1938
+ *
1939
+ * Usage:
1940
+ *
1941
+ * <Combobox
1942
+ * aria-label="Assignee"
1943
+ * placeholder="Search people…"
1944
+ * options={people.map((p) => ({ value: p.id, label: p.name, count: p.openTasks }))}
1945
+ * value={assigneeId}
1946
+ * onValueChange={setAssigneeId}
1947
+ * />
1948
+ *
1949
+ * <Combobox
1950
+ * multiple
1951
+ * aria-label="Statuses"
1952
+ * groups={[{ id: 'open', label: 'Open' }, { id: 'closed', label: 'Closed' }]}
1953
+ * options={statuses} // each with `group: 'open' | 'closed'`
1954
+ * value={selected}
1955
+ * onValueChange={setSelected}
1956
+ * renderOption={(o, { selected }) => <StatusRow status={o} checked={selected} />}
1957
+ * />
1958
+ *
1959
+ * // Async: the consumer owns the query and the fetch.
1960
+ * <Combobox shouldFilter={false} loading={isFetching} options={results}
1961
+ * inputValue={query} onInputValueChange={setQuery} … />
1962
+ */
1963
+
1964
+ type ComboboxSize = 'sm' | 'md';
1965
+ interface ComboboxOption<T extends string = string> {
1966
+ value: T;
1967
+ label: string;
1968
+ /** Secondary line under the label. Searched by the default filter. */
1969
+ description?: string;
1970
+ /** Leading adornment — a Lucide icon, an avatar, a colour dot. */
1971
+ icon?: ReactNode;
1972
+ /** Rendered but not selectable; skipped by the arrow keys. */
1973
+ disabled?: boolean;
1974
+ /** Live count at the row's trailing edge (tasks per status, per assignee). */
1975
+ count?: number;
1976
+ /** Key into `groups`. Ungrouped options render first. */
1977
+ group?: string;
1978
+ }
1979
+ interface ComboboxGroup {
1980
+ id: string;
1981
+ label: string;
1982
+ }
1983
+ interface ComboboxOptionState {
1984
+ selected: boolean;
1985
+ highlighted: boolean;
1986
+ /** The query the list is currently filtered by ('' when unfiltered). */
1987
+ query: string;
1988
+ }
1989
+ interface ComboboxBaseProps<T extends string> {
1990
+ options: ReadonlyArray<ComboboxOption<T>>;
1991
+ /**
1992
+ * Group order and labels. Options whose `group` is not listed here render
1993
+ * in a trailing group labelled by the key; omit `groups` entirely to
1994
+ * derive groups from the options in order of first appearance.
1995
+ */
1996
+ groups?: ReadonlyArray<ComboboxGroup>;
1997
+ /** Shows a spinner in the shell and `loadingMessage` while the list is empty. */
1998
+ loading?: boolean;
1999
+ placeholder?: string;
2000
+ /** Control height — matches `<Input inputSize>`. Default `md`. */
2001
+ size?: ComboboxSize;
2002
+ disabled?: boolean;
2003
+ /** Error chrome (`is-error`) on the shell + `aria-invalid` on the input. */
2004
+ error?: boolean;
2005
+ /** Controlled query text. Omit for internal state. */
2006
+ inputValue?: string;
2007
+ defaultInputValue?: string;
2008
+ onInputValueChange?: (value: string) => void;
2009
+ /** Filter `options` by the query on the client. Default true; false for async. */
2010
+ shouldFilter?: boolean;
2011
+ /** Custom match. Default: case-insensitive substring over label + description. */
2012
+ filter?: (option: ComboboxOption<T>, query: string) => boolean;
2013
+ /** Default "No results". */
2014
+ emptyMessage?: ReactNode;
2015
+ /** Default "Loading…". */
2016
+ loadingMessage?: ReactNode;
2017
+ /** Replaces the default row body (icon / label / description / count). The check mark stays. */
2018
+ renderOption?: (option: ComboboxOption<T>, state: ComboboxOptionState) => ReactNode;
2019
+ /** Controlled open state. Omit for internal state. */
2020
+ open?: boolean;
2021
+ onOpenChange?: (open: boolean) => void;
2022
+ /** Preferred side for the listbox. Default `bottom`; flips when it cannot fit. */
2023
+ side?: AnchorSide;
2024
+ /** Default `start`. */
2025
+ align?: AnchorAlign;
2026
+ /** id of the `<input>`, for `<label htmlFor>`. */
2027
+ id?: string;
2028
+ /**
2029
+ * Focus the input on mount. Also marks it `data-autofocus`: inside a
2030
+ * Popover the popover does the focusing, once its content is positioned.
2031
+ */
2032
+ autoFocus?: boolean;
2033
+ 'aria-label'?: string;
2034
+ 'aria-labelledby'?: string;
2035
+ /** Extra classes on the `.input-shell`. */
2036
+ className?: string;
2037
+ /** Extra classes on the listbox surface. */
2038
+ listboxClassName?: string;
2039
+ }
2040
+ interface ComboboxSingleProps<T extends string = string> extends ComboboxBaseProps<T> {
2041
+ multiple?: false;
2042
+ /** Controlled value; `null` = nothing selected. */
2043
+ value?: T | null;
2044
+ defaultValue?: T | null;
2045
+ /** `null` when the user empties the field and leaves it. */
2046
+ onValueChange?: (value: T | null) => void;
2047
+ }
2048
+ interface ComboboxMultipleProps<T extends string = string> extends ComboboxBaseProps<T> {
2049
+ multiple: true;
2050
+ value?: ReadonlyArray<T>;
2051
+ defaultValue?: ReadonlyArray<T>;
2052
+ onValueChange?: (value: T[]) => void;
2053
+ }
2054
+ type ComboboxProps<T extends string = string> = ComboboxSingleProps<T> | ComboboxMultipleProps<T>;
2055
+ /**
2056
+ * `forwardRef` erases the component's type parameter (it is instantiated at
2057
+ * `string` above). This assertion restores the generic signature so
2058
+ * `onValueChange` narrows to the union of the option values a caller
2059
+ * passed; it changes nothing at runtime.
2060
+ */
2061
+ declare const Combobox: <T extends string = string>(props: ComboboxProps<T> & RefAttributes<HTMLInputElement>) => ReactElement | null;
2062
+
2063
+ interface TooltipProps {
2064
+ /** The tip's content. Nothing renders (children pass through untouched) when null. */
2065
+ content: ReactNode;
2066
+ /** Exactly one element — it becomes the trigger. */
2067
+ children: ReactElement<TooltipTriggerProps>;
2068
+ /** Default `top`. Flips when it cannot fit. */
2069
+ side?: AnchorSide;
2070
+ /** Default `center`. */
2071
+ align?: AnchorAlign;
2072
+ /** Gap from the trigger, px. Default 6. */
2073
+ offset?: number;
2074
+ /** Hover-open delay, ms. Default 300. Focus opens immediately. */
2075
+ openDelay?: number;
2076
+ /** Close delay, ms. Default 0. */
2077
+ closeDelay?: number;
2078
+ /** Controlled open state. Omit for internal state. */
2079
+ open?: boolean;
2080
+ defaultOpen?: boolean;
2081
+ onOpenChange?: (open: boolean) => void;
2082
+ /** Extra classes on the tip surface. */
2083
+ className?: string;
2084
+ }
2085
+ /** What the cloned trigger element must accept. */
2086
+ type TooltipTriggerProps = HTMLAttributes<HTMLElement> & {
2087
+ ref?: Ref<HTMLElement>;
2088
+ };
2089
+ declare function Tooltip({ content, children, side, align, offset, openDelay, closeDelay, open: openProp, defaultOpen, onOpenChange, className, }: TooltipProps): react_jsx_runtime.JSX.Element;
1408
2090
 
1409
2091
  interface DropdownButtonItem {
1410
2092
  /** Stable id for keying. If omitted, the index is used (avoid for
@@ -1460,7 +2142,7 @@ interface DropdownButtonProps {
1460
2142
  * an engaged filter. Pair with `activeId` for filter-chip use. */
1461
2143
  active?: boolean;
1462
2144
  }
1463
- declare function DropdownButton({ label, variant, size, leadingIcon, trailingIcon, items, disabled, loading, className, align, side, sideOffset, menuWidth, triggerAriaLabel, activeId, active, }: DropdownButtonProps): react.JSX.Element;
2145
+ declare function DropdownButton({ label, variant, size, leadingIcon, trailingIcon, items, disabled, loading, className, align, side, sideOffset, menuWidth, triggerAriaLabel, activeId, active, }: DropdownButtonProps): react_jsx_runtime.JSX.Element;
1464
2146
 
1465
2147
  interface AccordionProps {
1466
2148
  /** Ids of the currently-open sections. */
@@ -1470,7 +2152,7 @@ interface AccordionProps {
1470
2152
  children: ReactNode;
1471
2153
  className?: string;
1472
2154
  }
1473
- declare function Accordion({ openIds, onToggle, children, className }: AccordionProps): react.JSX.Element;
2155
+ declare function Accordion({ openIds, onToggle, children, className }: AccordionProps): react_jsx_runtime.JSX.Element;
1474
2156
  interface AccordionSectionProps {
1475
2157
  /** Stable id — matched against the Accordion's `openIds`. */
1476
2158
  id: string;
@@ -1484,7 +2166,7 @@ interface AccordionSectionProps {
1484
2166
  complete?: boolean;
1485
2167
  children: ReactNode;
1486
2168
  }
1487
- declare function AccordionSection({ id, title, summary, badge, complete, children, }: AccordionSectionProps): react.JSX.Element;
2169
+ declare function AccordionSection({ id, title, summary, badge, complete, children, }: AccordionSectionProps): react_jsx_runtime.JSX.Element;
1488
2170
  declare const AccordionCompound: typeof Accordion & {
1489
2171
  Section: typeof AccordionSection;
1490
2172
  };
@@ -1526,7 +2208,7 @@ interface MenuButtonProps {
1526
2208
  /** aria-label for the trigger when the visible label is ambiguous. */
1527
2209
  triggerAriaLabel?: string;
1528
2210
  }
1529
- declare function MenuButton({ label, items, leadingIcon, disabled, align, menuWidth, className, triggerAriaLabel, }: MenuButtonProps): react.JSX.Element;
2211
+ declare function MenuButton({ label, items, leadingIcon, disabled, align, menuWidth, className, triggerAriaLabel, }: MenuButtonProps): react_jsx_runtime.JSX.Element;
1530
2212
 
1531
2213
  /**
1532
2214
  * CopyField — an input/output field with a copy button pinned to the
@@ -1568,7 +2250,7 @@ interface CopyFieldProps {
1568
2250
  copyToastMessage?: string;
1569
2251
  className?: string;
1570
2252
  }
1571
- declare function CopyField({ value, onChange, multiline, rows, placeholder, readOnly, label, hideLabel, id, copyToastMessage, className, }: CopyFieldProps): react.JSX.Element;
2253
+ declare function CopyField({ value, onChange, multiline, rows, placeholder, readOnly, label, hideLabel, id, copyToastMessage, className, }: CopyFieldProps): react_jsx_runtime.JSX.Element;
1572
2254
 
1573
2255
  /**
1574
2256
  * TagChipInput — type-to-create chips with autocomplete.
@@ -1611,7 +2293,7 @@ interface TagChipInputProps {
1611
2293
  error?: boolean;
1612
2294
  className?: string;
1613
2295
  }
1614
- declare function TagChipInput({ value, onChange, suggestions, placeholder, max, maxLength, disabled, id, error, className, }: TagChipInputProps): react.JSX.Element;
2296
+ declare function TagChipInput({ value, onChange, suggestions, placeholder, max, maxLength, disabled, id, error, className, }: TagChipInputProps): react_jsx_runtime.JSX.Element;
1615
2297
 
1616
2298
  /**
1617
2299
  * FolderTreePicker — dropdown picker for a nestable folder tree.
@@ -1664,7 +2346,7 @@ interface FolderTreePickerProps {
1664
2346
  /** Apply error styling to the trigger. */
1665
2347
  error?: boolean;
1666
2348
  }
1667
- declare function FolderTreePicker({ folders, value, onChange, onCreateFolder, placeholder, disabled, id, className, error, }: FolderTreePickerProps): react.JSX.Element;
2349
+ declare function FolderTreePicker({ folders, value, onChange, onCreateFolder, placeholder, disabled, id, className, error, }: FolderTreePickerProps): react_jsx_runtime.JSX.Element;
1668
2350
 
1669
2351
  interface HeroFormCardProps extends Omit<FormHTMLAttributes<HTMLFormElement>, 'title' | 'onSubmit'> {
1670
2352
  /** Small accent text above the title, e.g. "Brand · Research". */
@@ -1704,7 +2386,7 @@ interface HeroFormCardSectionProps extends Omit<HTMLAttributes<HTMLElement>, 'ti
1704
2386
  trailing?: ReactNode;
1705
2387
  children: ReactNode;
1706
2388
  }
1707
- declare function Section({ title, icon, description, trailing, children, className, ...rest }: HeroFormCardSectionProps): react.JSX.Element;
2389
+ declare function Section({ title, icon, description, trailing, children, className, ...rest }: HeroFormCardSectionProps): react_jsx_runtime.JSX.Element;
1708
2390
  interface HeroFormCardFieldProps {
1709
2391
  /** Visible field label. */
1710
2392
  label: ReactNode;
@@ -1719,8 +2401,8 @@ interface HeroFormCardFieldProps {
1719
2401
  children: ReactNode;
1720
2402
  className?: string;
1721
2403
  }
1722
- declare function Field({ label, htmlFor, required, optional, error, hint, children, className, }: HeroFormCardFieldProps): react.JSX.Element;
1723
- declare function FieldRow({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
2404
+ declare function Field({ label, htmlFor, required, optional, error, hint, children, className, }: HeroFormCardFieldProps): react_jsx_runtime.JSX.Element;
2405
+ declare function FieldRow({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1724
2406
  interface HeroFormCardBannerProps {
1725
2407
  /** Optional leading icon. */
1726
2408
  icon?: ReactNode;
@@ -1730,7 +2412,7 @@ interface HeroFormCardBannerProps {
1730
2412
  tone?: 'info' | 'accent' | 'success' | 'warning' | 'destructive';
1731
2413
  className?: string;
1732
2414
  }
1733
- declare function Banner({ icon, children, tone, className, }: HeroFormCardBannerProps): react.JSX.Element;
2415
+ declare function Banner({ icon, children, tone, className, }: HeroFormCardBannerProps): react_jsx_runtime.JSX.Element;
1734
2416
  interface HeroFormCardAdvancedProps {
1735
2417
  summary?: ReactNode;
1736
2418
  /** Optional icon node next to the summary. */
@@ -1739,8 +2421,8 @@ interface HeroFormCardAdvancedProps {
1739
2421
  children: ReactNode;
1740
2422
  className?: string;
1741
2423
  }
1742
- declare function Advanced({ summary, icon, defaultOpen, children, className, }: HeroFormCardAdvancedProps): react.JSX.Element;
1743
- declare function Footer({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
2424
+ declare function Advanced({ summary, icon, defaultOpen, children, className, }: HeroFormCardAdvancedProps): react_jsx_runtime.JSX.Element;
2425
+ declare function Footer({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1744
2426
  declare const HeroFormCardCompound: react.ForwardRefExoticComponent<HeroFormCardProps & react.RefAttributes<HTMLFormElement>> & {
1745
2427
  Section: typeof Section;
1746
2428
  Field: typeof Field;
@@ -1770,7 +2452,7 @@ interface RangeSliderProps {
1770
2452
  disabled?: boolean;
1771
2453
  className?: string;
1772
2454
  }
1773
- declare function RangeSlider({ min, max, value, onChange, step, label, formatValue, id, disabled, className, }: RangeSliderProps): react.JSX.Element;
2455
+ declare function RangeSlider({ min, max, value, onChange, step, label, formatValue, id, disabled, className, }: RangeSliderProps): react_jsx_runtime.JSX.Element;
1774
2456
 
1775
2457
  interface SegmentedPillItem<Id extends string = string> {
1776
2458
  id: Id;
@@ -1794,7 +2476,7 @@ interface SegmentedPillProps<Id extends string = string> {
1794
2476
  stretch?: boolean;
1795
2477
  className?: string;
1796
2478
  }
1797
- declare function SegmentedPill<Id extends string = string>({ items, value, onChange, ariaLabel, size, stretch, className, }: SegmentedPillProps<Id>): react.JSX.Element;
2479
+ declare function SegmentedPill<Id extends string = string>({ items, value, onChange, ariaLabel, size, stretch, className, }: SegmentedPillProps<Id>): react_jsx_runtime.JSX.Element;
1798
2480
 
1799
2481
  interface ShellProps extends HTMLAttributes<HTMLDivElement> {
1800
2482
  /** Max-width for the auto-centered page-level wrapper, in pixels.
@@ -1826,7 +2508,7 @@ interface ShellTrayHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'
1826
2508
  /** Tighter padding for dense layouts. */
1827
2509
  compact?: boolean;
1828
2510
  }
1829
- declare function TrayHeader({ title, meta, index, description, compact, className, style, ...rest }: ShellTrayHeaderProps): react.JSX.Element;
2511
+ declare function TrayHeader({ title, meta, index, description, compact, className, style, ...rest }: ShellTrayHeaderProps): react_jsx_runtime.JSX.Element;
1830
2512
  interface ShellTrayBodyProps extends HTMLAttributes<HTMLDivElement> {
1831
2513
  /** Vertical gap between children. Default `form` (16px). `grid`
1832
2514
  * (14px) is for tighter sub-card grids. `flush` (0) lets the
@@ -1835,7 +2517,7 @@ interface ShellTrayBodyProps extends HTMLAttributes<HTMLDivElement> {
1835
2517
  /** Tighter padding for dense layouts. */
1836
2518
  compact?: boolean;
1837
2519
  }
1838
- declare function TrayBody({ spacing, compact, className, style, children, ...rest }: ShellTrayBodyProps): react.JSX.Element;
2520
+ declare function TrayBody({ spacing, compact, className, style, children, ...rest }: ShellTrayBodyProps): react_jsx_runtime.JSX.Element;
1839
2521
  interface ShellTrayFooterProps extends HTMLAttributes<HTMLDivElement> {
1840
2522
  /** Tighter padding for dense layouts. */
1841
2523
  compact?: boolean;
@@ -1846,12 +2528,12 @@ interface ShellTrayFooterProps extends HTMLAttributes<HTMLDivElement> {
1846
2528
  * the right edge via `margin-left: auto`. */
1847
2529
  right?: ReactNode;
1848
2530
  }
1849
- declare function TrayFooter({ compact, left, right, className, style, children, ...rest }: ShellTrayFooterProps): react.JSX.Element;
2531
+ declare function TrayFooter({ compact, left, right, className, style, children, ...rest }: ShellTrayFooterProps): react_jsx_runtime.JSX.Element;
1850
2532
  interface ShellSubCardProps extends HTMLAttributes<HTMLDivElement> {
1851
2533
  /** Optional header content rendered above the body. */
1852
2534
  header?: ReactNode;
1853
2535
  }
1854
- declare function SubCard({ header, className, style, children, ...rest }: ShellSubCardProps): react.JSX.Element;
2536
+ declare function SubCard({ header, className, style, children, ...rest }: ShellSubCardProps): react_jsx_runtime.JSX.Element;
1855
2537
  /** Value-text tone for <ShellStat>. Semantic tones map to the public
1856
2538
  * status tokens — handy for traffic-light KPIs (e.g. competition). */
1857
2539
  type ShellStatTone = 'default' | 'accent' | 'success' | 'warning' | 'destructive';
@@ -1868,7 +2550,7 @@ interface ShellStatProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
1868
2550
  * color (`success` / `warning` / `destructive`). */
1869
2551
  valueTone?: ShellStatTone;
1870
2552
  }
1871
- declare function ShellStat({ label, value, icon, hint, valueTone, className, ...rest }: ShellStatProps): react.JSX.Element;
2553
+ declare function ShellStat({ label, value, icon, hint, valueTone, className, ...rest }: ShellStatProps): react_jsx_runtime.JSX.Element;
1872
2554
  type ShellComponent = typeof ShellRoot & {
1873
2555
  Tray: typeof Tray;
1874
2556
  TrayHeader: typeof TrayHeader;
@@ -1901,7 +2583,7 @@ interface FolderCardProps {
1901
2583
  menuSlot?: ReactNode;
1902
2584
  className?: string;
1903
2585
  }
1904
- declare function FolderCard({ name, colorKey, assetCount, folderCount, selected, selectable, onOpen, onSelect, menuSlot, className, }: FolderCardProps): react.JSX.Element;
2586
+ declare function FolderCard({ name, colorKey, assetCount, folderCount, selected, selectable, onOpen, onSelect, menuSlot, className, }: FolderCardProps): react_jsx_runtime.JSX.Element;
1905
2587
 
1906
2588
  interface BulkActionBarProps {
1907
2589
  /** Selection count shown in the accent badge. */
@@ -1913,7 +2595,7 @@ interface BulkActionBarProps {
1913
2595
  children: ReactNode;
1914
2596
  onClear: () => void;
1915
2597
  }
1916
- declare function BulkActionBar({ count, summary, children, onClear, }: BulkActionBarProps): react.JSX.Element;
2598
+ declare function BulkActionBar({ count, summary, children, onClear, }: BulkActionBarProps): react_jsx_runtime.JSX.Element;
1917
2599
 
1918
2600
  /**
1919
2601
  * FileUploadButton — paperclip trigger that opens a native file picker.
@@ -1927,7 +2609,7 @@ interface FileUploadButtonProps {
1927
2609
  fileCount?: number;
1928
2610
  maxFiles?: number;
1929
2611
  }
1930
- declare function FileUploadButton({ onFilesSelected, disabled, fileCount, maxFiles, }: FileUploadButtonProps): react.JSX.Element;
2612
+ declare function FileUploadButton({ onFilesSelected, disabled, fileCount, maxFiles, }: FileUploadButtonProps): react_jsx_runtime.JSX.Element;
1931
2613
 
1932
2614
  interface FileDropZoneProps {
1933
2615
  children: ReactNode;
@@ -1935,7 +2617,7 @@ interface FileDropZoneProps {
1935
2617
  disabled?: boolean;
1936
2618
  className?: string;
1937
2619
  }
1938
- declare function FileDropZone({ children, onFilesDropped, disabled, className, }: FileDropZoneProps): react.JSX.Element;
2620
+ declare function FileDropZone({ children, onFilesDropped, disabled, className, }: FileDropZoneProps): react_jsx_runtime.JSX.Element;
1939
2621
 
1940
2622
  /**
1941
2623
  * useFileUpload — stateful file-selection, validation, text-extraction, and
@@ -2008,13 +2690,13 @@ interface FilePreviewGridProps {
2008
2690
  onRemove: (id: string) => void;
2009
2691
  className?: string;
2010
2692
  }
2011
- declare function FilePreviewGrid({ files, onRemove, className }: FilePreviewGridProps): react.JSX.Element | null;
2693
+ declare function FilePreviewGrid({ files, onRemove, className }: FilePreviewGridProps): react_jsx_runtime.JSX.Element | null;
2012
2694
 
2013
2695
  interface FilePreviewItemProps {
2014
2696
  pendingFile: PendingFile;
2015
2697
  onRemove: (id: string) => void;
2016
2698
  }
2017
- declare function FilePreviewItem({ pendingFile, onRemove }: FilePreviewItemProps): react.JSX.Element;
2699
+ declare function FilePreviewItem({ pendingFile, onRemove }: FilePreviewItemProps): react_jsx_runtime.JSX.Element;
2018
2700
 
2019
2701
  /**
2020
2702
  * FileThumbnail — icon-based preview tile for non-image files; renders the
@@ -2034,7 +2716,7 @@ interface FileThumbnailProps {
2034
2716
  previewUrl?: string;
2035
2717
  className?: string;
2036
2718
  }
2037
- declare function FileThumbnail({ file, previewUrl, className }: FileThumbnailProps): react.JSX.Element;
2719
+ declare function FileThumbnail({ file, previewUrl, className }: FileThumbnailProps): react_jsx_runtime.JSX.Element;
2038
2720
 
2039
2721
  interface CodeBlockProps {
2040
2722
  /** Lowercased language identifier, e.g. "typescript" or "json". */
@@ -2042,7 +2724,7 @@ interface CodeBlockProps {
2042
2724
  /** Raw source text. */
2043
2725
  children: string;
2044
2726
  }
2045
- declare function CodeBlock({ language, children }: CodeBlockProps): react.JSX.Element;
2727
+ declare function CodeBlock({ language, children }: CodeBlockProps): react_jsx_runtime.JSX.Element;
2046
2728
  /**
2047
2729
  * MarkdownCode — react-markdown code element adapter.
2048
2730
  *
@@ -2050,7 +2732,7 @@ declare function CodeBlock({ language, children }: CodeBlockProps): react.JSX.El
2050
2732
  * Fenced code (triple backtick, className="language-xxx") delegates to
2051
2733
  * CodeBlock for syntax highlighting + copy button.
2052
2734
  */
2053
- declare function MarkdownCode({ className, children }: HTMLAttributes<HTMLElement>): react.JSX.Element;
2735
+ declare function MarkdownCode({ className, children }: HTMLAttributes<HTMLElement>): react_jsx_runtime.JSX.Element;
2054
2736
 
2055
2737
  interface MarkdownRendererProps {
2056
2738
  /** Raw markdown string to render. */
@@ -2063,7 +2745,7 @@ interface MarkdownRendererProps {
2063
2745
  * Renders headings, lists, code (via CodeBlock), tables, task lists,
2064
2746
  * strikethrough, blockquotes, and links with workspace token styling.
2065
2747
  */
2066
- declare function MarkdownRenderer({ children, className }: MarkdownRendererProps): react.JSX.Element;
2748
+ declare function MarkdownRenderer({ children, className }: MarkdownRendererProps): react_jsx_runtime.JSX.Element;
2067
2749
 
2068
2750
  interface ResizableHandleProps {
2069
2751
  /** Which edge of the parent the handle decorates. */
@@ -2088,12 +2770,12 @@ interface ResizableHandleProps {
2088
2770
  disabled?: boolean;
2089
2771
  className?: string;
2090
2772
  }
2091
- declare function ResizableHandle({ side, value, onChange, onCommit, min, max, defaultValue, step, 'aria-label': ariaLabel, disabled, className, }: ResizableHandleProps): react.JSX.Element;
2773
+ declare function ResizableHandle({ side, value, onChange, onCommit, min, max, defaultValue, step, 'aria-label': ariaLabel, disabled, className, }: ResizableHandleProps): react_jsx_runtime.JSX.Element;
2092
2774
  interface ResizablePaneProps extends ResizableHandleProps {
2093
2775
  children: ReactNode;
2094
2776
  paneClassName?: string;
2095
2777
  }
2096
- declare function ResizablePane({ children, paneClassName, ...handleProps }: ResizablePaneProps): react.JSX.Element;
2778
+ declare function ResizablePane({ children, paneClassName, ...handleProps }: ResizablePaneProps): react_jsx_runtime.JSX.Element;
2097
2779
 
2098
2780
  interface KbdProps {
2099
2781
  /** Child text — typically a single key glyph or short string. */
@@ -2101,7 +2783,7 @@ interface KbdProps {
2101
2783
  /** Optional size — defaults to 'md'. */
2102
2784
  size?: 'sm' | 'md';
2103
2785
  }
2104
- declare function Kbd({ children, size }: KbdProps): react.JSX.Element;
2786
+ declare function Kbd({ children, size }: KbdProps): react_jsx_runtime.JSX.Element;
2105
2787
 
2106
2788
  interface FrameStackProps extends HTMLAttributes<HTMLDivElement> {
2107
2789
  /** Visual gap between child cards. Defaults to 10 px to match the
@@ -2154,7 +2836,7 @@ interface CalculatorShellProps {
2154
2836
  * CalculatorShell — the layout primitive. See file-level JSDoc for the
2155
2837
  * locked layout / interaction / token rules.
2156
2838
  */
2157
- declare function CalculatorShell({ title, subtitle, inputs, result, formula, secondaryStats, onReset, copyValue, shareUrl, }: CalculatorShellProps): react.JSX.Element;
2839
+ declare function CalculatorShell({ title, subtitle, inputs, result, formula, secondaryStats, onReset, copyValue, shareUrl, }: CalculatorShellProps): react_jsx_runtime.JSX.Element;
2158
2840
 
2159
2841
  type CalcLayout = 'shell' | 'open';
2160
2842
  /**
@@ -2201,11 +2883,11 @@ interface CalculatorShellV2Props {
2201
2883
  copyReport?: string | (() => string);
2202
2884
  /** STUBBED (D9) — typed, not read this ADR. */
2203
2885
  prefill?: CalcPrefill;
2204
- /** "vs. benchmark" rail. When absent, the shell renders a muted
2205
- * "Benchmark unavailable in manual mode" placeholder (Amendment 1 E). */
2886
+ /** "vs. benchmark" rail. Rendered only when provided (the Amendment 1 E
2887
+ * placeholder is retired ADR-145 amendment). */
2206
2888
  benchmarkSlot?: ReactNode;
2207
2889
  }
2208
- declare function CalculatorShellV2({ eyebrow, title, icon, layout, inputs, result, footerNote, actions, assumptions, copyReport, benchmarkSlot, }: CalculatorShellV2Props): react.JSX.Element;
2890
+ declare function CalculatorShellV2({ eyebrow, title, icon, layout, inputs, result, footerNote, actions, assumptions, copyReport, benchmarkSlot, }: CalculatorShellV2Props): react_jsx_runtime.JSX.Element;
2209
2891
 
2210
2892
  interface StatRowStep {
2211
2893
  /** Lucide glyph (~16px). Inherits the dark-frame label colour. */
@@ -2217,12 +2899,18 @@ interface StatRowStep {
2217
2899
  /** The single pivotal tile — rendered in `--accent` instead of
2218
2900
  * `--brand-ink`. At most one step should set this. */
2219
2901
  pivotal?: boolean;
2902
+ /** What a copyable tile writes to the clipboard. Defaults to `value`;
2903
+ * set it when the display is rounded (e.g. "833.3K") and the exact
2904
+ * figure is what the user wants. */
2905
+ copyValue?: string;
2220
2906
  }
2221
2907
  interface StatRowProps {
2222
2908
  steps: StatRowStep[];
2909
+ /** Make every tile's figure a copy-to-clipboard button. */
2910
+ copyable?: boolean;
2223
2911
  className?: string;
2224
2912
  }
2225
- declare function StatRow({ steps, className }: StatRowProps): react.JSX.Element;
2913
+ declare function StatRow({ steps, copyable, className }: StatRowProps): react_jsx_runtime.JSX.Element;
2226
2914
 
2227
2915
  /**
2228
2916
  * Slider — single-value numeric slider (ADR-076 D8).
@@ -2251,7 +2939,7 @@ interface SliderProps {
2251
2939
  disabled?: boolean;
2252
2940
  className?: string;
2253
2941
  }
2254
- declare function Slider({ value, min, max, step, onChange, 'aria-label': ariaLabel, disabled, className, }: SliderProps): react.JSX.Element;
2942
+ declare function Slider({ value, min, max, step, onChange, 'aria-label': ariaLabel, disabled, className, }: SliderProps): react_jsx_runtime.JSX.Element;
2255
2943
 
2256
2944
  /**
2257
2945
  * Number-formatting helpers — small set of pure, zero-dep utilities
@@ -2361,7 +3049,7 @@ interface PageHeroProps {
2361
3049
  leading?: ReactNode;
2362
3050
  className?: string;
2363
3051
  }
2364
- declare function PageHero({ eyebrow, title, subtitle, actions, leading, className, }: PageHeroProps): react.JSX.Element;
3052
+ declare function PageHero({ eyebrow, title, subtitle, actions, leading, className, }: PageHeroProps): react_jsx_runtime.JSX.Element;
2365
3053
 
2366
3054
  interface SearchBarProps {
2367
3055
  value: string;
@@ -2370,7 +3058,7 @@ interface SearchBarProps {
2370
3058
  width?: number | string;
2371
3059
  className?: string;
2372
3060
  }
2373
- declare function SearchBar({ value, onChange, placeholder, width, className, }: SearchBarProps): react.JSX.Element;
3061
+ declare function SearchBar({ value, onChange, placeholder, width, className, }: SearchBarProps): react_jsx_runtime.JSX.Element;
2374
3062
 
2375
3063
  interface FilterBarProps {
2376
3064
  /**
@@ -2384,7 +3072,7 @@ interface FilterBarProps {
2384
3072
  className?: string;
2385
3073
  children: ReactNode;
2386
3074
  }
2387
- declare function FilterBarRoot({ variant, 'aria-label': ariaLabel, className, children, }: FilterBarProps): react.JSX.Element;
3075
+ declare function FilterBarRoot({ variant, 'aria-label': ariaLabel, className, children, }: FilterBarProps): react_jsx_runtime.JSX.Element;
2388
3076
  interface FilterBarSearchProps {
2389
3077
  value: string;
2390
3078
  onChange: (next: string) => void;
@@ -2395,15 +3083,15 @@ interface FilterBarSearchProps {
2395
3083
  className?: string;
2396
3084
  }
2397
3085
  /** Standardized search field: small `Input` with a leading magnifier. */
2398
- declare function FilterBarSearch({ value, onChange, placeholder, 'aria-label': ariaLabel, className, }: FilterBarSearchProps): react.JSX.Element;
3086
+ declare function FilterBarSearch({ value, onChange, placeholder, 'aria-label': ariaLabel, className, }: FilterBarSearchProps): react_jsx_runtime.JSX.Element;
2399
3087
  /** Flexible spacer — everything after it is pushed to the right edge. */
2400
- declare function FilterBarSpacer(): react.JSX.Element;
3088
+ declare function FilterBarSpacer(): react_jsx_runtime.JSX.Element;
2401
3089
  interface FilterBarCountProps {
2402
3090
  shown: number;
2403
3091
  total: number;
2404
3092
  }
2405
3093
  /** Right-aligned "{shown} of {total}" result count, tabular-nums. */
2406
- declare function FilterBarCount({ shown, total }: FilterBarCountProps): react.JSX.Element;
3094
+ declare function FilterBarCount({ shown, total }: FilterBarCountProps): react_jsx_runtime.JSX.Element;
2407
3095
  declare const FilterBar: typeof FilterBarRoot & {
2408
3096
  Search: typeof FilterBarSearch;
2409
3097
  Spacer: typeof FilterBarSpacer;
@@ -2431,7 +3119,7 @@ interface FilterDropdownProps<T extends string = string> {
2431
3119
  className?: string;
2432
3120
  align?: 'left' | 'right';
2433
3121
  }
2434
- declare function FilterDropdown<T extends string = string>({ label, value, onChange, options, neutralValue, triggerValueLabel, className, align, }: FilterDropdownProps<T>): react.JSX.Element;
3122
+ declare function FilterDropdown<T extends string = string>({ label, value, onChange, options, neutralValue, triggerValueLabel, className, align, }: FilterDropdownProps<T>): react_jsx_runtime.JSX.Element;
2435
3123
 
2436
3124
  interface DeviceFrameProps {
2437
3125
  /** Which device bezel to render. */
@@ -2447,7 +3135,7 @@ interface DeviceFrameProps {
2447
3135
  /** Optional className on the outer frame element. */
2448
3136
  className?: string;
2449
3137
  }
2450
- declare function DeviceFrame({ device, url, children, className }: DeviceFrameProps): react.JSX.Element;
3138
+ declare function DeviceFrame({ device, url, children, className }: DeviceFrameProps): react_jsx_runtime.JSX.Element;
2451
3139
 
2452
3140
  interface CreativeMediaProps {
2453
3141
  src: string;
@@ -2656,4 +3344,4 @@ declare namespace index {
2656
3344
  export { type index_CarouselCardView as CarouselCardView, type index_CarouselViewProps as CarouselViewProps, index_CreativeMedia as CreativeMedia, index_InstagramExplorePreview as InstagramExplorePreview, index_InstagramFeedCarousel as InstagramFeedCarousel, index_InstagramFeedPreview as InstagramFeedPreview, index_MetaFeedCarousel as MetaFeedCarousel, index_MetaFeedPreview as MetaFeedPreview, index_MetaInstreamPreview as MetaInstreamPreview, index_MetaMessengerPreview as MetaMessengerPreview, index_MetaReelPreview as MetaReelPreview, index_MetaRightColumnPreview as MetaRightColumnPreview, index_MetaSearchPreview as MetaSearchPreview, index_MetaStoryPreview as MetaStoryPreview, index_PLACEMENT_CONFIGS as PLACEMENT_CONFIGS, type index_PlacementPreview as PlacementPreview, type index_PreviewAdData as PreviewAdData, type index_PreviewConfiguration as PreviewConfiguration, type index_PreviewDevice as PreviewDevice, type index_PreviewPlacement as PreviewPlacement, type index_PreviewPlatform as PreviewPlatform };
2657
3345
  }
2658
3346
 
2659
- export { AccordionCompound as Accordion, type AccordionProps, type AccordionSectionProps, AllocationSparkbar, type AllocationSparkbarProps, AppScroll, BRAND_ICONS, Badge, type BadgeProps, type BadgeTone, BrandFacebook, type BrandIconKey, type BrandIconProps, BrandInstagram, BrandLinkedIn, BrandLogoTile, type BrandLogoTileProps, type BrandLogoTileSize, BrandMessenger, BrandMeta, BrandNextdoor, BrandPinterest, BrandSnapchat, BrandTikTok, BulkActionBar, type BulkActionBarProps, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonShape, type ButtonSize, type ButtonVariant, type CalcLayout, type CalcPrefill, CalculatorShell, type CalculatorShellProps, CalculatorShellV2, type CalculatorShellV2Props, Card, Checkbox, type CheckboxProps, ChipNav, type ChipNavItem, Choropleth, type ChoroplethProps, CodeBlock, type CodeBlockProps, CollapsibleCard, type CollapsibleCardProps, CompletionRing, type CompletionRingProps, CopyField, type CopyFieldProps, type Crumb, DataGrid, type DataGridColumn, DataGridColumnOptionsMenu, DataGridDragOverlay, type DataGridDrawerPanelProps, DataGridDropIndicator, type DataGridIcon, type DataGridProps, type DataGridRowBase, type DataGridSortState, DataGridToolbar, type DataGridToolbarProps, type DataGridToolbarRenderProps, DetailSection, DeviceFrame, type DeviceFrameProps, DragHandle, DropdownButton, type DropdownButtonItem, type DropdownButtonProps, DropdownMenu, DropdownMenuCheckboxItem, type DropdownMenuCheckboxItemProps, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, type DropdownMenuProps, DropdownMenuSeparator, DropdownMenuTrigger, type DropdownMenuTriggerProps, type EditingCell, EmptyPlaceholder, EmptyState, type EmptyStateProps, FOLDER_COLOR_KEYS, FileDropZone, FilePreviewGrid, FilePreviewItem, FileThumbnail, FileUploadButton, FilterBar, type FilterBarCountProps, type FilterBarProps, type FilterBarSearchProps, FilterDropdown, type FilterDropdownProps, type FilterOption, FloatingDrawer, type FloatingDrawerProps, FloatingStatusBar, type FloatingStatusBarProps, type FloatingStatusTone, FolderCard, type FolderCardProps, type FolderColorKey, type FolderTreeNode, FolderTreePicker, type FolderTreePickerProps, FrameStack, type FrameStackProps, HEADER_HEIGHT, HeroFormCardCompound as HeroFormCard, type HeroFormCardAdvancedProps, type HeroFormCardBannerProps, type HeroFormCardFieldProps, type HeroFormCardProps, type HeroFormCardSectionProps, IconTile, IdentityLabel, IdentityValue, Input, type InputProps, type InputSize, Kbd, type KbdProps, ListItem, MarkdownCode, MarkdownRenderer, type MarkdownRendererProps, MenuButton, type MenuButtonEntry, type MenuButtonItem, type MenuButtonProps, type MenuButtonSeparator, MetaCell, type MetaCellProps, index as MetaPreviews, MetricCard, type MetricCardProps, type MetricCardTone, MicrosoftLogo, type MicrosoftLogoProps, Modal, OptionTile, OptionTileGroup, type OptionTileGroupProps, type OptionTileProps, PLACEMENT_CONFIGS, PageHeaderHost, PageHeaderSlotProvider, PageHero, type PageHeroProps, PageShell, Pagination, type PaginationProps, type PendingFile, PillButton, type PillButtonProps, type PlacementPreview, type PreviewAdData, type PreviewConfiguration, type PreviewDevice, type PreviewPlacement, type PreviewPlatform, PS as ProfileSection, type ProfileSectionProps, ProgressBar, type ProgressBarProps, Radio, RadioGroup, type RadioGroupProps, type RadioProps, RangeSlider, type RangeSliderProps, ResizableHandle, type ResizableHandleProps, ResizablePane, type ResizablePaneProps, type RgbTuple, SECTION_SCROLL_OFFSET, SearchBar, type SearchBarProps, SectionLabel, SegmentedPill, type SegmentedPillItem, type SegmentedPillProps, Shell, type ShellProps, ShellStat, type ShellStatProps, type ShellStatTone, type ShellSubCardProps, type ShellTrayBodyProps, type ShellTrayFooterProps, type ShellTrayHeaderProps, type ShellTrayProps, Slider, type SliderProps, SortableItem, SortableList, SortableTable, type Column as SortableTableColumn, type SortableTableProps, StatRow, type StatRowProps, type StatRowStep, StatsGrid, type StatsGridProps, StepLoader, type StepLoaderProps, type StepLoaderStep, type Tab, Tabs, type TabsProps, TagChipInput, type TagChipInputProps, TagRow, TextInput, Textarea, TextareaInput, type TextareaProps, Toaster, TokenBadge, type TokenBadgeProps, type UploadResult, type UseFileUploadOptions, ValueChip, type ValueChipProps, type WcagBadge, bestTextOn, cn, contrastRatio, copyText, folderColorVar, formatCurrency, formatNumber, formatPercent, formatRatio, hexToRgbTuple, hslString, relativeLuminance, rgbCss, rgbString, useFileUpload, wcagBadges };
3347
+ export { AccordionCompound as Accordion, type AccordionProps, type AccordionSectionProps, AllocationSparkbar, type AllocationSparkbarProps, type AnchorAlign, type AnchorPlacement, type AnchorRect, type AnchorSide, type AnchorSize, type AnchoredPosition, type AnchoredPositionOptions, AppScroll, BRAND_ICONS, Badge, type BadgeProps, type BadgeTone, BrandFacebook, BrandIcon, type BrandIconKey, type BrandIconProps, BrandInstagram, BrandLinkedIn, BrandLogoTile, type BrandLogoTileProps, type BrandLogoTileSize, BrandMessenger, BrandMeta, BrandNextdoor, BrandPinterest, BrandSnapchat, BrandTikTok, BulkActionBar, type BulkActionBarProps, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonShape, type ButtonSize, type ButtonVariant, type CalcLayout, type CalcPrefill, CalculatorShell, type CalculatorShellProps, CalculatorShellV2, type CalculatorShellV2Props, Card, Checkbox, type CheckboxProps, ChipNav, type ChipNavItem, Choropleth, type ChoroplethProps, CodeBlock, type CodeBlockProps, CollapsibleCard, type CollapsibleCardProps, Combobox, type ComboboxGroup, type ComboboxMultipleProps, type ComboboxOption, type ComboboxOptionState, type ComboboxProps, type ComboboxSingleProps, type ComboboxSize, CompletionRing, type CompletionRingProps, CopyField, type CopyFieldProps, type Crumb, DataGrid, type DataGridColumn, DataGridColumnOptionsMenu, DataGridDragOverlay, type DataGridDrawerPanelProps, DataGridDropIndicator, type DataGridIcon, type DataGridProps, type DataGridRowBase, type DataGridSortState, DataGridToolbar, type DataGridToolbarProps, type DataGridToolbarRenderProps, DetailSection, DeviceFrame, type DeviceFrameProps, DragHandle, DropdownButton, type DropdownButtonItem, type DropdownButtonProps, DropdownMenu, DropdownMenuCheckboxItem, type DropdownMenuCheckboxItemProps, DropdownMenuContent, type DropdownMenuContentProps, DropdownMenuGroup, DropdownMenuItem, type DropdownMenuItemProps, DropdownMenuLabel, type DropdownMenuLabelProps, type DropdownMenuProps, DropdownMenuSeparator, DropdownMenuTrigger, type DropdownMenuTriggerProps, type EditingCell, EmptyPlaceholder, EmptyState, type EmptyStateProps, FOLDER_COLOR_KEYS, FileDropZone, FilePreviewGrid, FilePreviewItem, FileThumbnail, FileUploadButton, FilterBar, type FilterBarCountProps, type FilterBarProps, type FilterBarSearchProps, FilterDropdown, type FilterDropdownProps, type FilterOption, FloatingDrawer, type FloatingDrawerProps, FloatingStatusBar, type FloatingStatusBarProps, type FloatingStatusTone, FolderCard, type FolderCardProps, type FolderColorKey, type FolderTreeNode, FolderTreePicker, type FolderTreePickerProps, FrameStack, type FrameStackProps, HEADER_HEIGHT, HeroFormCardCompound as HeroFormCard, type HeroFormCardAdvancedProps, type HeroFormCardBannerProps, type HeroFormCardFieldProps, type HeroFormCardProps, type HeroFormCardSectionProps, type HomeCrumb, HomeCrumbLink, IconTile, IdentityLabel, IdentityValue, Input, type InputProps, type InputSize, Kbd, type KbdProps, LISTBOX_CLASS, type LayerHandle, type LayerKind, ListItem, ListboxOption, type ListboxOptionProps, MarkdownCode, MarkdownRenderer, type MarkdownRendererProps, MenuButton, type MenuButtonEntry, type MenuButtonItem, type MenuButtonProps, type MenuButtonSeparator, MetaCell, type MetaCellProps, index as MetaPreviews, MetricCard, type MetricCardProps, type MetricCardTone, MicrosoftLogo, type MicrosoftLogoProps, Modal, OptionTile, OptionTileGroup, type OptionTileGroupProps, type OptionTileProps, type OutsideClickTarget, PLACEMENT_CONFIGS, POPOVER_SURFACE_STYLE, PageHeaderHost, PageHeaderSlotProvider, PageHero, type PageHeroProps, PageShell, Pagination, type PaginationProps, type PendingFile, PillButton, type PillButtonProps, type PlacementPreview, Popover, type PopoverContentProps, type PopoverProps, type PopoverTriggerProps, type PreviewAdData, type PreviewConfiguration, type PreviewDevice, type PreviewPlacement, type PreviewPlatform, PS as ProfileSection, type ProfileSectionProps, ProgressBar, type ProgressBarProps, Radio, RadioGroup, type RadioGroupProps, type RadioProps, RangeSlider, type RangeSliderProps, ResizableHandle, type ResizableHandleProps, ResizablePane, type ResizablePaneProps, type RgbTuple, SECTION_SCROLL_OFFSET, SearchBar, type SearchBarProps, SectionLabel, SegmentedPill, type SegmentedPillItem, type SegmentedPillProps, Select, type SelectOption, type SelectProps, type SelectSize, Shell, type ShellProps, ShellStat, type ShellStatProps, type ShellStatTone, type ShellSubCardProps, type ShellTrayBodyProps, type ShellTrayFooterProps, type ShellTrayHeaderProps, type ShellTrayProps, Slider, type SliderProps, SortableItem, SortableList, SortableTable, type Column as SortableTableColumn, type SortableTableProps, StatRow, type StatRowProps, type StatRowStep, StatsGrid, type StatsGridProps, StepLoader, type StepLoaderProps, type StepLoaderStep, type Tab, Tabs, type TabsProps, TagChipInput, type TagChipInputProps, TagRow, TextInput, Textarea, TextareaInput, type TextareaProps, Toaster, TokenBadge, type TokenBadgeProps, Tooltip, type TooltipProps, type TooltipTriggerProps, type UploadResult, type UseAnchoredPositionOptions, type UseAnchoredPositionResult, type UseEscapeKeyOptions, type UseFileUploadOptions, type UseLayerOptions, type UseOutsideClickOptions, ValueChip, type ValueChipProps, type WcagBadge, bestTextOn, cn, computeAnchoredPosition, contrastRatio, copyText, folderColorVar, formatCurrency, formatNumber, formatPercent, formatRatio, hasBrandIcon, hexToRgbTuple, hslString, relativeLuminance, rgbCss, rgbString, useAnchoredPosition, useBreadcrumbHome, useEscapeKey, useFileUpload, useLayer, useOutsideClick, wcagBadges };