@ai-matrx/design-system 0.86.352 → 0.86.354

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -418,7 +418,7 @@ declare function ReadGate({ read, status: statusProp, error: errorProp, what: wh
418
418
  loading?: ReactNode;
419
419
  onRetry?: (() => void) | undefined;
420
420
  children: ReactNode;
421
- }): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | React$1.ReactPortal | React$1.ReactElement<unknown, string | React$1.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | React$1.JSX.Element;
421
+ }): string | number | bigint | boolean | React$1.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | React$1.ReactPortal | React$1.ReactElement<unknown, string | React$1.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined>;
422
422
  /**
423
423
  * A list primitive's EMPTY branch (RC-B12 round 13): the failure while its read
424
424
  * failed, the wait while it loads, and the primitive's own empty view only
@@ -639,8 +639,8 @@ declare const AlertDialogAction: React$1.ForwardRefExoticComponent<Omit<AlertDia
639
639
  declare const AlertDialogCancel: React$1.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React$1.RefAttributes<HTMLButtonElement>, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
640
640
 
641
641
  declare const buttonVariants: (props?: ({
642
- variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "success" | "primary" | "ghost" | "subtle" | null | undefined;
643
- size?: "sm" | "md" | "default" | "xs" | "lg" | "xl" | "2xl" | "3xl" | "icon" | "icon-sm" | "roundIcon" | null | undefined;
642
+ variant?: "default" | "secondary" | "destructive" | "outline" | "success" | "link" | "primary" | "ghost" | "subtle" | null | undefined;
643
+ size?: "default" | "sm" | "md" | "xs" | "lg" | "xl" | "2xl" | "3xl" | "icon" | "icon-sm" | "roundIcon" | null | undefined;
644
644
  } & class_variance_authority_types.ClassProp) | undefined) => string;
645
645
  interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
646
646
  asChild?: boolean;
@@ -1043,11 +1043,11 @@ declare const CollapsibleContent: React$1.ForwardRefExoticComponent<CollapsibleC
1043
1043
 
1044
1044
  declare const Command: React$1.ForwardRefExoticComponent<Omit<{
1045
1045
  children?: React$1.ReactNode;
1046
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1046
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1047
1047
  ref?: React$1.Ref<HTMLDivElement>;
1048
1048
  } & {
1049
1049
  asChild?: boolean;
1050
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild"> & {
1050
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild"> & {
1051
1051
  label?: string;
1052
1052
  shouldFilter?: boolean;
1053
1053
  filter?: (value: string, search: string, keywords?: string[]) => number;
@@ -1082,45 +1082,45 @@ declare function CommandRowClose({ className }: {
1082
1082
  }): React$1.ReactElement | null;
1083
1083
  declare const CommandList: React$1.ForwardRefExoticComponent<Omit<{
1084
1084
  children?: React$1.ReactNode;
1085
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1085
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1086
1086
  ref?: React$1.Ref<HTMLDivElement>;
1087
1087
  } & {
1088
1088
  asChild?: boolean;
1089
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild"> & {
1089
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild"> & {
1090
1090
  label?: string;
1091
1091
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1092
1092
  declare const CommandEmpty: React$1.ForwardRefExoticComponent<Omit<{
1093
1093
  children?: React$1.ReactNode;
1094
- } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1094
+ } & Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1095
1095
  ref?: React$1.Ref<HTMLDivElement>;
1096
1096
  } & {
1097
1097
  asChild?: boolean;
1098
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild"> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1098
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild"> & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1099
1099
  declare const CommandGroup: React$1.ForwardRefExoticComponent<Omit<{
1100
1100
  children?: React$1.ReactNode;
1101
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1101
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1102
1102
  ref?: React$1.Ref<HTMLDivElement>;
1103
1103
  } & {
1104
1104
  asChild?: boolean;
1105
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild">, "heading" | "value"> & {
1105
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild">, "heading" | "value"> & {
1106
1106
  heading?: React$1.ReactNode;
1107
1107
  value?: string;
1108
1108
  forceMount?: boolean;
1109
1109
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1110
- declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1110
+ declare const CommandSeparator: React$1.ForwardRefExoticComponent<Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1111
1111
  ref?: React$1.Ref<HTMLDivElement>;
1112
1112
  } & {
1113
1113
  asChild?: boolean;
1114
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild"> & {
1114
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild"> & {
1115
1115
  alwaysRender?: boolean;
1116
1116
  } & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1117
1117
  declare const CommandItem: React$1.ForwardRefExoticComponent<Omit<{
1118
1118
  children?: React$1.ReactNode;
1119
- } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React$1.HTMLAttributes<HTMLDivElement>> & {
1119
+ } & Omit<Pick<Pick<React$1.DetailedHTMLProps<React$1.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React$1.HTMLAttributes<HTMLDivElement> | "key"> & {
1120
1120
  ref?: React$1.Ref<HTMLDivElement>;
1121
1121
  } & {
1122
1122
  asChild?: boolean;
1123
- }, "key" | keyof React$1.HTMLAttributes<HTMLDivElement> | "asChild">, "onSelect" | "value" | "disabled"> & {
1123
+ }, keyof React$1.HTMLAttributes<HTMLDivElement> | "key" | "asChild">, "onSelect" | "value" | "disabled"> & {
1124
1124
  disabled?: boolean;
1125
1125
  onSelect?: (value: string) => void;
1126
1126
  value?: string;
@@ -2344,7 +2344,7 @@ declare const Select: React$1.FC<SelectPrimitive.SelectProps>;
2344
2344
  declare const SelectGroup: React$1.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React$1.RefAttributes<HTMLDivElement>>;
2345
2345
  declare const SelectValue: React$1.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React$1.RefAttributes<HTMLSpanElement>>;
2346
2346
  declare const selectTriggerVariants: (props?: ({
2347
- size?: "sm" | "default" | "lg" | null | undefined;
2347
+ size?: "default" | "sm" | "lg" | null | undefined;
2348
2348
  } & class_variance_authority_types.ClassProp) | undefined) => string;
2349
2349
  /**
2350
2350
  * THE ONE DROPDOWN CHEVRON (page-pass 2026-09-27, /crm/<id>). Pickers drew three
@@ -2740,7 +2740,7 @@ declare function SidebarMenu({ className, ...props }: React$1.ComponentProps<"ul
2740
2740
  declare function SidebarMenuItem({ className, ...props }: React$1.ComponentProps<"li">): React$1.JSX.Element;
2741
2741
  declare const sidebarMenuButtonVariants: (props?: ({
2742
2742
  variant?: "default" | "outline" | null | undefined;
2743
- size?: "sm" | "default" | "lg" | null | undefined;
2743
+ size?: "default" | "sm" | "lg" | null | undefined;
2744
2744
  } & class_variance_authority_types.ClassProp) | undefined) => string;
2745
2745
  declare function SidebarMenuButton({ asChild, isActive, variant, size, tooltip, className, ...props }: React$1.ComponentProps<"button"> & {
2746
2746
  asChild?: boolean;
@@ -3279,839 +3279,842 @@ interface HoverCardContentProps extends React$1.ComponentPropsWithoutRef<typeof
3279
3279
  }
3280
3280
  declare const HoverCardContent: React$1.ForwardRefExoticComponent<HoverCardContentProps & React$1.RefAttributes<HTMLDivElement>>;
3281
3281
 
3282
- declare const SOCIAL_BRAND_PATHS: {
3283
- readonly linkedin: {
3284
- readonly viewBox: "0 0 448 512";
3285
- readonly d: "M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z";
3286
- };
3287
- readonly x: {
3288
- readonly viewBox: "0 0 512 512";
3289
- readonly d: "M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z";
3290
- };
3291
- readonly instagram: {
3292
- readonly viewBox: "0 0 448 512";
3293
- readonly d: "M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z";
3294
- };
3295
- readonly facebook: {
3296
- readonly viewBox: "0 0 512 512";
3297
- readonly d: "M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z";
3298
- };
3299
- readonly youtube: {
3300
- readonly viewBox: "0 0 576 512";
3301
- readonly d: "M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z";
3302
- };
3303
- readonly tiktok: {
3304
- readonly viewBox: "0 0 448 512";
3305
- readonly d: "M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z";
3306
- };
3307
- readonly github: {
3308
- readonly viewBox: "0 0 496 512";
3309
- readonly d: "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z";
3310
- };
3311
- readonly pinterest: {
3312
- readonly viewBox: "0 0 496 512";
3313
- readonly d: "M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z";
3314
- };
3315
- readonly threads: {
3316
- readonly viewBox: "0 0 448 512";
3317
- readonly d: "M331.5 235.7c2.2 .9 4.2 1.9 6.3 2.8c29.2 14.1 50.6 35.2 61.8 61.4c15.7 36.5 17.2 95.8-30.3 143.2c-36.2 36.2-80.3 52.5-142.6 53h-.3c-70.2-.5-124.1-24.1-160.4-70.2c-32.3-41-48.9-98.1-49.5-169.6V256v-.2C17 184.3 33.6 127.2 65.9 86.2C102.2 40.1 156.2 16.5 226.4 16h.3c70.3 .5 124.9 24 162.3 69.9c18.4 22.7 32 50 40.6 81.7l-40.4 10.8c-7.1-25.8-17.8-47.8-32.2-65.4c-29.2-35.8-73-54.2-130.5-54.6c-57 .5-100.1 18.8-128.2 54.4C72.1 146.1 58.5 194.3 58 256c.5 61.7 14.1 109.9 40.3 143.3c28 35.6 71.2 53.9 128.2 54.4c51.4-.4 85.4-12.6 113.7-40.9c32.3-32.2 31.7-71.8 21.4-95.9c-6.1-14.2-17.1-26-31.9-34.9c-3.7 26.9-11.8 48.3-24.7 64.8c-17.1 21.8-41.4 33.6-72.7 35.3c-23.6 1.3-46.3-4.4-63.9-16c-20.8-13.8-33-34.8-34.3-59.3c-2.5-48.3 35.7-83 95.2-86.4c21.1-1.2 40.9-.3 59.2 2.8c-2.4-14.8-7.3-26.6-14.6-35.2c-10-11.7-25.6-17.7-46.2-17.8H227c-16.6 0-39 4.6-53.3 26.3l-34.4-23.6c19.2-29.1 50.3-45.1 87.8-45.1h.8c62.6 .4 99.9 39.5 103.7 107.7l-.2 .2zm-156 68.8c1.3 25.1 28.4 36.8 54.6 35.3c25.6-1.4 54.6-11.4 59.5-73.2c-13.2-2.9-27.8-4.4-43.4-4.4c-4.8 0-9.6 .1-14.4 .4c-42.9 2.4-57.2 23.2-56.2 41.8l-.1 .1z";
3318
- };
3319
- readonly reddit: {
3320
- readonly viewBox: "0 0 512 512";
3321
- readonly d: "M0 256C0 114.6 114.6 0 256 0S512 114.6 512 256s-114.6 256-256 256L37.1 512c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256zM349.6 153.6c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34c-34.5 3.7-61.4 33-61.4 68.4l0 .2c-37.5 1.6-71.8 12.3-99 29.1c-10.1-7.8-22.8-12.5-36.5-12.5c-33 0-59.8 26.8-59.8 59.8c0 24 14.1 44.6 34.4 54.1c2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54c0-33-26.8-59.8-59.8-59.8c-13.7 0-26.3 4.6-36.4 12.4c-27.4-17-62.1-27.7-100-29.1l0-.2c0-25.4 18.9-46.5 43.4-49.9l0 0c4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6s-31.4-8.8-30.4-30.5s15.4-38.3 32.1-38.3zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9 .8-6.2 3.9-6.5c18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1 .3 5.1 3.6 3.9 6.5z";
3322
- };
3323
- readonly yelp: {
3324
- readonly viewBox: "0 0 384 512";
3325
- readonly d: "M42.9 240.32l99.62 48.61c19.2 9.4 16.2 37.51-4.5 42.71L30.5 358.45a22.79 22.79 0 0 1-28.21-19.6 197.16 197.16 0 0 1 9-85.32 22.8 22.8 0 0 1 31.61-13.21zm44 239.25a199.45 199.45 0 0 0 79.42 32.11A22.78 22.78 0 0 0 192.94 490l3.9-110.82c.7-21.3-25.5-31.91-39.81-16.1l-74.21 82.4a22.82 22.82 0 0 0 4.09 34.09zm145.34-109.92l58.81 94a22.93 22.93 0 0 0 34 5.5 198.36 198.36 0 0 0 52.71-67.61A23 23 0 0 0 364.17 370l-105.42-34.26c-20.31-6.5-37.81 15.8-26.51 33.91zm148.33-132.23a197.44 197.44 0 0 0-50.41-69.31 22.85 22.85 0 0 0-34 4.4l-62 91.92c-11.9 17.7 4.7 40.61 25.2 34.71L366 268.63a23 23 0 0 0 14.61-31.21zM62.11 30.18a22.86 22.86 0 0 0-9.9 32l104.12 180.44c11.7 20.2 42.61 11.9 42.61-11.4V22.88a22.67 22.67 0 0 0-24.5-22.8 320.37 320.37 0 0 0-112.33 30.1z";
3326
- };
3327
- readonly google: {
3328
- readonly viewBox: "0 0 488 512";
3329
- readonly d: "M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z";
3330
- };
3331
- };
3332
- type SocialBrandMark = keyof typeof SOCIAL_BRAND_PATHS;
3333
-
3334
- /** Whether a value is ours to act on. `broken` and `not-us` never render as a link of any kind. */
3335
- type ContactValueState = "ok" | "broken" | "not-us";
3336
- declare const CONTACT_STATE_LABEL: Record<Exclude<ContactValueState, "ok">, string>;
3337
- interface ParsedEmail {
3338
- address: string;
3339
- local: string;
3340
- domain: string;
3341
- valid: boolean;
3342
- }
3343
- /** `mailto:` and surrounding brackets/space removed; the domain lower-cased, the local part kept. */
3344
- declare function parseEmail(raw: string): ParsedEmail;
3345
- declare function mailtoHref(address: string, subject?: string): string;
3346
- interface ParsedPhone {
3347
- /** As written (trimmed). */
3348
- raw: string;
3349
- /** `+15551234567`, or null when the digits cannot make one. */
3350
- e164: string | null;
3351
- /** How a person reads it: `(555) 123-4567` for NANP, `+44 20 7946 0958` style otherwise. */
3352
- display: string;
3353
- /** "United States", "United Kingdom" … or null when unknown. */
3354
- region: string | null;
3355
- /** An extension (`x123`, `ext. 123`), kept apart from the dialled number. */
3356
- extension: string | null;
3357
- valid: boolean;
3358
- }
3282
+ type PeekCardSize = "xs" | "sm" | "md" | "lg" | "xl";
3283
+ type PeekCardOrientation = "portrait" | "landscape";
3359
3284
  /**
3360
- * Read a phone number. A number without a `+` and of 10 digits (or 11 starting with 1) is taken as
3361
- * North American — the default the platform's people overwhelmingly mean; `defaultCallingCode`
3362
- * overrides it.
3285
+ * `fit`: the card is as tall as its content, between the size's floor and its height. `fixed`: always
3286
+ * that height. `content`: exactly as tall as its content, no floor, capped at the size's height — a
3287
+ * notice-shaped peek (an assist, a confirmation) that holds two lines must not stand 400px tall.
3363
3288
  */
3364
- declare function parsePhone(raw: string, defaultCallingCode?: string): ParsedPhone;
3365
- declare function telHref(phone: ParsedPhone): string;
3366
- declare function smsHref(phone: ParsedPhone): string;
3367
- /** A postal address as one string (lines joined) — the form every map and geocoder takes. */
3368
- declare function addressText(address: string | readonly (string | null | undefined)[]): string;
3369
- declare function mapsHref(address: string): string;
3370
- /** What a host's address check answered. */
3371
- interface AddressValidation {
3372
- /** `verified`: a real place matched. `partial`: something matched, not the whole address. `unknown`: no match. */
3373
- status: "verified" | "partial" | "unknown";
3374
- /** The address as the geocoder writes it. */
3375
- formatted?: string;
3376
- lat?: number;
3377
- lng?: number;
3378
- }
3379
- declare function webSearchHref(query: string): string;
3380
- interface ParsedUrl {
3381
- /** An absolute http(s) URL, or null when the text is not one. */
3382
- href: string | null;
3383
- /** `example.com` (no `www.`). */
3384
- domain: string;
3385
- /** What to show: the domain, plus the path when it says something. */
3386
- display: string;
3387
- }
3388
- declare function parseUrl(raw: string): ParsedUrl;
3389
- type SocialPlatform = SocialBrandMark | "other";
3390
- interface PlatformRule {
3391
- name: string;
3392
- hosts: readonly string[];
3393
- /** The profile address for a bare handle. */
3394
- profile: (handle: string) => string;
3395
- /** The handle in a profile URL's path, or null when the path is not a profile. */
3396
- handleFromPath: (segments: string[]) => string | null;
3397
- /** Shown before the handle (`@`), or "" for platforms that name profiles by slug. */
3398
- sigil: "@" | "";
3399
- }
3400
- declare const SOCIAL_PLATFORMS: Record<SocialBrandMark, PlatformRule>;
3401
- /** A platform name as stored anywhere ("Twitter", "linkedin", "IG") → our key, or null. */
3402
- declare function platformKey(name: string | null | undefined): SocialBrandMark | null;
3403
- interface ParsedSocial {
3404
- platform: SocialPlatform;
3405
- /** "LinkedIn", "X" … or the domain for an unknown site. */
3406
- platformName: string;
3407
- /** The handle without its sigil, or null when only a URL is known. */
3408
- handle: string | null;
3409
- /** What to show: `@handle`, a slug, or the domain + path. */
3410
- display: string;
3411
- /** The profile address, or null when neither a URL nor a known platform gives one. */
3412
- href: string | null;
3413
- }
3289
+ type PeekCardHeight = "fit" | "fixed" | "content";
3290
+ type PeekCardDensity = "compact" | "comfortable";
3291
+ /** `surface`: the card is its own frame (border, radius, shadow). `bare`: a host panel already is. */
3292
+ type PeekCardFrame = "surface" | "bare";
3414
3293
  /**
3415
- * Read a social profile from whatever we hold: a URL, an `@handle`, a bare handle — with the
3416
- * platform named separately or found from the URL's host.
3294
+ * Every size, in px. `md` portrait is the reference (the agent picker's 340 × 420 peek). Landscape
3295
+ * sizes are the same family turned on its side: wide enough for a main column and an aside.
3417
3296
  */
3418
- declare function parseSocial(value: string, platform?: string | null): ParsedSocial;
3419
- /** 1234 → "1.2K", 2_500_000 → "2.5M". */
3420
- declare function compactCount(n: number): string;
3421
-
3297
+ declare const PEEK_CARD_SIZES: Record<PeekCardOrientation, Record<PeekCardSize, {
3298
+ width: number;
3299
+ height: number;
3300
+ minHeight: number;
3301
+ }>>;
3422
3302
  /**
3423
- * THE contact values — one component per kind of value a person reaches someone through: an email,
3424
- * a phone number, a postal address, a social profile, a web address. Every place in every app that
3425
- * shows one of these renders it here, never a hand-built `mailto:`, `tel:` or profile link.
3426
- *
3427
- * Each draws inline at the text's size — its glyph, the value, a copy button that is always there
3428
- * (shown on hover/focus, so nothing ever shifts) — and opens THE Peek on hover (a tap opens the phone
3429
- * drawer). The peek does the real things: compose, call, text, map, validate, search, open the
3430
- * profile with our referral. A value whose `state` is `broken` or `not-us` is never a link of any kind.
3431
- *
3432
- * <EmailValue email="ana@solarbright.com" />
3433
- * <PhoneValue phone="949 555 0142" />
3434
- * <AddressValue address={["1 Main St", "Irvine, CA 92618"]} />
3435
- * <SocialHandleValue value="https://www.linkedin.com/in/ana-ruiz" followers={1840} />
3436
- * <UrlValue url="solarbright.com" title="SolarBright — home solar" />
3303
+ * THE RECORD DOORS — a closed list the package owns. A caller names a door by `kind`; the glyph and
3304
+ * the tooltip come from here, so no caller can draw a strange icon, write its own label, or add a
3305
+ * door that repeats a fixed one (Copy, Open in new tab, Settings are never in this list). A new kind
3306
+ * is a change to this package, reviewed once, never a call-site invention.
3437
3307
  *
3438
- * Address validation is the host's (it calls a server): mount `ContactValuesHostProvider` once with
3439
- * `validateAddress`. Without one, the peek simply has no Validate action.
3308
+ * ONE named exception, `action` (2026-10-18): a VERB the record offers that no fixed kind names
3309
+ * ("Start support session", "Message"). The caller names it with a short `label` and a Lucide `icon`
3310
+ * — the footer still owns placement, size, the three-door ceiling and the More overflow, so an action
3311
+ * door can never become a call-site button. It is a record verb, never a link that repeats Open.
3440
3312
  */
3441
-
3442
- interface ContactValuesHost {
3443
- /** Check a postal address against a real geocoder (the host's server route). */
3444
- validateAddress?: (address: string) => Promise<AddressValidation>;
3445
- }
3446
- declare function ContactValuesHostProvider({ children, ...host }: ContactValuesHost & {
3447
- children: React$1.ReactNode;
3448
- }): React$1.JSX.Element;
3449
- declare function useContactValuesHost(): ContactValuesHost;
3450
- interface ContactValueCommonProps {
3451
- /** Whose value it is ("Ana Ruiz", "SolarBright") — the peek's subtitle. */
3452
- owner?: string;
3453
- /** `broken` / `not-us`: drawn struck through with its reason, never a link. Default `ok`. */
3454
- state?: ContactValueState;
3455
- /** Open the peek on hover/tap. Default true; `false` keeps only the inline value and Copy. */
3456
- peek?: boolean;
3457
- }
3458
- interface EmailValueProps extends ContactValueCommonProps {
3459
- email: string;
3313
+ type PeekDoorKind = "peek" | "chat" | "edit" | "download" | "duplicate" | "action";
3314
+ /** One choice in a door's menu. `tone: "danger"` is a choice that removes or silences. */
3315
+ interface PeekDoorMenuItem {
3316
+ key: string;
3317
+ label: string;
3318
+ onSelect: () => void;
3319
+ tone?: "danger";
3460
3320
  }
3461
- declare function EmailValue({ email, owner, state, peek }: EmailValueProps): React$1.JSX.Element;
3462
- interface PhoneValueProps extends ContactValueCommonProps {
3463
- phone: string;
3464
- /** The calling code for a number written without `+`. Default "1" (North America). */
3465
- defaultCallingCode?: string;
3321
+ /** A run of a door's menu: an optional small heading over its items; groups are split by a hairline. */
3322
+ interface PeekDoorMenuGroup {
3323
+ label?: string;
3324
+ items: readonly PeekDoorMenuItem[];
3466
3325
  }
3467
- declare function PhoneValue({ phone, owner, state, peek, defaultCallingCode }: PhoneValueProps): React$1.JSX.Element;
3468
- interface AddressValueProps extends ContactValueCommonProps {
3469
- /** One string (lines split on newlines) or its lines; empty lines are dropped. */
3470
- address: string | readonly (string | null | undefined)[];
3471
- /** Draw each line on its own line. Default: one line, joined with commas. */
3472
- multiline?: boolean;
3326
+ interface PeekDoorCommon {
3327
+ onClick?: (event: React$1.MouseEvent | Event) => void;
3328
+ /** A door that goes somewhere: a link (`newTab` opens it in a new tab). */
3329
+ href?: string;
3330
+ newTab?: boolean;
3331
+ /** Its work is running (a duplicate being made): the door waits. */
3332
+ busy?: boolean;
3473
3333
  }
3474
- declare function AddressValue({ address, owner, state, peek, multiline }: AddressValueProps): React$1.JSX.Element;
3475
- interface SocialHandleValueProps extends ContactValueCommonProps {
3476
- /** A profile URL, an `@handle` or a bare handle. */
3477
- value: string;
3478
- /** The platform when `value` is a handle ("linkedin", "Twitter", "ig" …). */
3479
- platform?: string | null;
3480
- /** Follower count, when known. */
3481
- followers?: number | null;
3482
- /** The profile's display name, when known. */
3483
- name?: string | null;
3334
+ /** A fixed door: its glyph and label come from `PEEK_DOORS`. */
3335
+ interface PeekKindDoor extends PeekDoorCommon {
3336
+ kind: Exclude<PeekDoorKind, "action">;
3484
3337
  }
3485
- declare function SocialHandleValue(props: SocialHandleValueProps): React$1.JSX.Element;
3486
- interface UrlValueProps extends ContactValueCommonProps {
3487
- url: string;
3488
- /** The page's title, when known — the peek's title. */
3489
- title?: string | null;
3490
- /** The inline globe. Off when the address already has its own place and the icon only wraps. */
3491
- icon?: boolean;
3338
+ /** A record verb no fixed kind names. `id` keeps two action doors apart; `label` ≤ 3 words. */
3339
+ interface PeekActionDoor extends PeekDoorCommon {
3340
+ kind: "action";
3341
+ id: string;
3342
+ label: string;
3343
+ icon: React$1.ComponentType<{
3344
+ className?: string;
3345
+ }>;
3346
+ /**
3347
+ * The verb has choices ("Later" → 1 hour · Tomorrow): the door opens this menu instead of running
3348
+ * `onClick`. The menu holds a hover peek open while it is in use. Never in the More overflow — a
3349
+ * menu door that does not fit is a design error the footer says in the console.
3350
+ */
3351
+ menu?: readonly PeekDoorMenuGroup[];
3492
3352
  }
3493
- declare function UrlValue({ url, title, owner, state, peek, icon }: UrlValueProps): React$1.JSX.Element;
3494
- type ContactValueType = "email" | "phone" | "address" | "social" | "url";
3495
- type ContactValueProps = ContactValueCommonProps & {
3496
- type: ContactValueType;
3497
- value: string;
3498
- platform?: string | null;
3499
- followers?: number | null;
3500
- title?: string | null;
3501
- icon?: boolean;
3502
- };
3503
- /** Any contact value by its type — for a renderer that only knows the field's type at run time. */
3504
- declare function ContactValue({ type, value, platform, followers, title, icon, ...common }: ContactValueProps): React$1.JSX.Element;
3353
+ type PeekDoor = PeekKindDoor | PeekActionDoor;
3354
+ /** At most three record doors. More than that is a menu, not a peek. */
3355
+ type PeekDoors = readonly [] | readonly [PeekDoor] | readonly [PeekDoor, PeekDoor] | readonly [PeekDoor, PeekDoor, PeekDoor];
3356
+ declare const PEEK_MAX_RECORD_DOORS = 3;
3357
+ declare const PEEK_DOORS: Record<PeekDoorKind, {
3358
+ icon: React$1.ComponentType<{
3359
+ className?: string;
3360
+ }>;
3361
+ label: string;
3362
+ inMenu?: true;
3363
+ }>;
3505
3364
 
3506
- /** A platform's own mark, filled in the current text color (never tinted with a brand color). */
3507
- declare function SocialMark({ platform, className }: {
3508
- platform: SocialBrandMark;
3365
+ /** A glyph component (a Lucide icon, a design-system icon); drawn 14–16px in muted ink. */
3366
+ type PeekGlyph = React$1.ComponentType<{
3509
3367
  className?: string;
3510
- }): React$1.JSX.Element;
3511
-
3512
- /** A record id the database minted (a UUID) — what a peek shows on its own. */
3513
- declare function isRecordUuid(id: string | null | undefined): boolean;
3514
- /** What RecordId shows for an id: a UUID's (or any long id's) first 8 characters, a short id whole. */
3515
- type RecordIdShow = "auto" | "short" | "full";
3516
- declare function displayId(id: string, show?: RecordIdShow): string;
3517
-
3518
- type RecordIdLook = "plain" | "chip" | "icon";
3519
- type RecordIdOpenResult = void | "forbidden";
3520
- interface RecordIdProps {
3521
- value: string | null | undefined;
3522
- /** What kind of id it is ("Agent", "Chat", a column name): the tooltip, the copy label and, with `labelled`, the visible prefix. */
3523
- label?: string | undefined;
3524
- /** `auto` (default): a UUID or long id shows its first 8 characters, a short id shows whole. */
3525
- show?: RecordIdShow;
3526
- /**
3527
- * `plain` (default): dense mono text. `chip`: a quiet bordered pill for headers, cards and panels.
3528
- * `icon`: the copy button alone, header-sized (a record's own header, where the id is shown elsewhere);
3529
- * the full id is its tooltip.
3530
- */
3531
- look?: RecordIdLook;
3532
- /** Show the kind of id in front of it ("Agent ID 1a2b3c4d"). */
3533
- labelled?: boolean;
3534
- /** A short note added to the tooltip under the id ("Not a member of this organization"). */
3535
- hint?: string;
3536
- /**
3537
- * Inside another control (a button, a select trigger, a door): the id as text only, full id and
3538
- * hint as its native tooltip, no buttons of its own — the control around it owns the click.
3539
- */
3540
- inert?: boolean;
3541
- /**
3542
- * Open the referenced record in-app (prefer WindowPanel).
3543
- * Return `"forbidden"` to block navigation and show a muted state.
3544
- */
3545
- onOpen?: (id: string) => RecordIdOpenResult | Promise<RecordIdOpenResult>;
3546
- /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */
3547
- href?: string | null | undefined;
3368
+ }>;
3369
+ /** One fact on one line: an optional glyph, the text, an optional quieter second line. */
3370
+ interface PeekFact {
3371
+ fact: string;
3548
3372
  /**
3549
- * Canonical entity token this id points at (`agent`, `note`, `task`, …).
3550
- * Supplies the route and the peek automatically — THE DOOR LAW, resolved
3551
- * from the registries instead of wired per callsite. An explicit `href` /
3552
- * `onOpen` still wins.
3373
+ * The fact NAMES a record (a model, a person, a project): it opens like every identity in the app.
3374
+ * Drawn by the host's identity renderer for that token (`PeekEntityRenderer`), else the table host's
3375
+ * `EntityRef` around `fact`, else `fact` as text.
3553
3376
  */
3554
- token?: string | null | undefined;
3555
- /** Force non-navigable (still copyable). */
3556
- forbidden?: boolean;
3557
- className?: string;
3558
- trailing?: ReactNode;
3377
+ entity?: {
3378
+ token: string;
3379
+ id: string;
3380
+ offeringId?: string | null;
3381
+ /** Opening the record starts a new tab (the peek's context stays where it is). */
3382
+ newTab?: boolean;
3383
+ /** Its open / peek buttons stay shown, not only on hover. */
3384
+ showActions?: boolean;
3385
+ };
3386
+ glyph?: PeekGlyph;
3387
+ /** A quieter second line (an email, a date). */
3388
+ meta?: string;
3389
+ /** The whole row is meta (dates, counts). */
3390
+ muted?: boolean;
3391
+ /** Let a long fact run to several lines instead of ending in "…". */
3392
+ wrap?: boolean;
3393
+ /** The fact is a page somewhere else: its text is a link that opens in a new tab. */
3394
+ href?: string;
3559
3395
  }
3560
- declare function RecordId({ value, label, show, look, labelled, hint, inert, onOpen, href, token, forbidden, className, trailing, }: RecordIdProps): React$1.JSX.Element;
3561
-
3396
+ /** A status color, from the design system's semantic tokens. */
3397
+ type PeekTone = "neutral" | "info" | "success" | "warning" | "danger";
3562
3398
  /**
3563
- * THE ONE CONTROL — the settled control family (owner, 2026-10-02/03).
3564
- *
3565
- * Every control here is the same object: 28px visible height, capsule, 13px/500
3566
- * label, 16px glyph inset 6px, text inset 10px, and HALF A GAP (3px) of its own
3567
- * on each side so containers add no gap. There is NO size prop: agents get no
3568
- * choice. Geometry and color live in `controls.css`, locked inside
3569
- * `@layer matrx-tap-lock` (`!important` in the host's first layer), so a call
3570
- * site's `className` can place a control (width, flex, grid, position) but can
3571
- * never restyle it. The rare big control is a different component behind a
3572
- * `// ui-exception:` comment, never a prop.
3573
- *
3574
- * Built on the package's own internals — Radix Slot / Switch / DropdownMenu, the
3575
- * cursor law's `swallowClick`, `SelectChevron`, the package icons — so nothing
3576
- * here is a second implementation of a behavior the package already owns.
3399
+ * One child of the record in a section's list (a step, a finding, an attached place, a reason).
3400
+ * Text first; everything else is optional and drawn in one fixed place on the row.
3577
3401
  */
3578
-
3579
- /** The status inks a glyph may carry (the role tokens). */
3580
- type GlyphTone = "success" | "warning" | "destructive" | "info" | "primary";
3581
-
3402
+ interface PeekRow {
3403
+ text: string;
3404
+ /** A quieter line under the text. */
3405
+ detail?: string;
3406
+ glyph?: PeekGlyph;
3407
+ /** A small dot before the text, in this tone (a finding's grade, a step's state). */
3408
+ tone?: PeekTone;
3409
+ /** The row NAMES a record: drawn like a fact's `entity` (the host's identity renderer, else `EntityRef`). */
3410
+ entity?: {
3411
+ token: string;
3412
+ id: string;
3413
+ offeringId?: string | null;
3414
+ };
3415
+ /** The row's text is a link: a web address opens in a new tab, an app path moves within the app. */
3416
+ href?: string;
3417
+ /** A short tag at the row's right edge ("Needs attention"), its reason as the tooltip. */
3418
+ status?: {
3419
+ text: string;
3420
+ tone?: PeekTone;
3421
+ hint?: string;
3422
+ };
3423
+ /** The row's own doors, by kind (Edit, Sneak peek …), at most two, drawn at its right edge. */
3424
+ doors?: readonly PeekDoor[];
3425
+ }
3426
+ /** Code or raw text, drawn monospaced and kept exactly as written (it scrolls, it never wraps). */
3427
+ interface PeekCode {
3428
+ text: string;
3429
+ /** The language name shown over it ("TypeScript", "JSON"). */
3430
+ language?: string;
3431
+ /** Where it comes from ("src/app.ts · 12–30"). */
3432
+ caption?: string;
3433
+ }
3434
+ /** A labeled block: running text, tags, a list of child rows, code — or several. */
3435
+ interface PeekSection {
3436
+ section: string;
3437
+ glyph?: PeekGlyph;
3438
+ /** A status color for the whole section (an error's severity): its label and edge take the tone. */
3439
+ tone?: PeekTone;
3440
+ text?: string;
3441
+ /** Lines before the text ends in "…". */
3442
+ clamp?: 2 | 3 | 4 | 6;
3443
+ /** Keep the text's own line breaks and indents (a note's content, an address) instead of one flowing paragraph. */
3444
+ breaks?: boolean;
3445
+ /** The text is markdown: the app's formatted-text renderer draws it (part `markdown`); without one, it reads as written. */
3446
+ markdown?: boolean;
3447
+ tags?: readonly string[];
3448
+ /** Short lines under the label (reasons, sources), one per line; past `limit` they end in "+N more". */
3449
+ items?: readonly string[];
3450
+ limit?: number;
3451
+ /** Child rows (steps, findings, reasons), each with its own optional status and doors; `limit` applies. */
3452
+ rows?: readonly PeekRow[];
3453
+ /** Number the rows (a sequence: workflow steps). */
3454
+ numbered?: boolean;
3455
+ code?: PeekCode;
3456
+ /** Pages somewhere else under the label (evidence, sources), one per line, each opening in a new tab. */
3457
+ links?: readonly {
3458
+ text: string;
3459
+ href: string;
3460
+ }[];
3461
+ /**
3462
+ * THE INPUT PREVIEW (a form field at a glance, drawn with the real controls, inert): the choices
3463
+ * an input offers as chips, the picked ones on — what a person filling it will see.
3464
+ */
3465
+ choices?: {
3466
+ options: readonly string[];
3467
+ picked?: readonly string[];
3468
+ };
3469
+ /** THE INPUT PREVIEW for a typed value: a sample field showing `text`, else the `placeholder`. */
3470
+ field?: PeekFieldPreview;
3471
+ /** THE INPUT PREVIEW for an on/off input: the real switch, inert, with its state in words. */
3472
+ toggle?: {
3473
+ on: boolean;
3474
+ label?: string;
3475
+ };
3476
+ /** An exact token (`{{name}}`, an id, a key) in a monospace chip; a press copies it. */
3477
+ token?: string;
3478
+ }
3479
+ /** A sample field: one line, two lines (long text), or a drop zone (a file or media input). */
3480
+ interface PeekFieldPreview {
3481
+ text?: string;
3482
+ placeholder: string;
3483
+ lines?: 1 | 2;
3484
+ /** The input's glyph, at the field's leading edge. */
3485
+ glyph?: PeekGlyph;
3486
+ /** A file / media input: a dashed drop zone instead of a text box. */
3487
+ drop?: boolean;
3488
+ }
3582
3489
  /**
3583
- * DecisionControl — THE row decision: [Yes] [No] [Other] + the answer's value chip.
3584
- *
3585
- * EVERY DECISION OFFERS A WAY OUT (Arman, 2026-10-14): a row that only offers
3586
- * "Preferred / Alias / Not us" forces a person to decide something they cannot,
3587
- * and they freeze. So every decision is exactly three clear buttons in one row —
3588
- * Yes, No, Other — the same words in the same place on every row, for a person
3589
- * or a business and for any kind of data (the section header asks the question:
3590
- * "Is this yours?", "Is this your name?"). Other's menu holds the smart,
3591
- * context-specific answers first (Tagline, Former name, grouped relationships…)
3592
- * and ALWAYS ends with the generic exit "Skip for now", which leaves the item
3593
- * undecided — neither kept nor rejected.
3594
- *
3595
- * NO EMPTY BOX, EVER (Arman, 2026-10-14: "There is a border remaining … no
3596
- * professional app does that"). Champion: Linear's issue properties (the issue
3597
- * view sidebar and the row property chips) — a property with no value draws
3598
- * nothing; the menu opens FROM the control that asked for it; a chosen value is
3599
- * a compact chip, and clicking the chip reopens the same menu. So:
3600
- * · no answer, No, or a plain Yes: nothing is drawn beside the buttons (the
3601
- * column's width is reserved invisibly on desktop, so rows never jump);
3602
- * · Other: its menu opens anchored to the Other button; closing it without a
3603
- * pick is no answer again; Other pressed while answered clears (onClear);
3604
- * · Yes with `yesKinds` ("Main name" / "Also known as", "Primary site" /
3605
- * "Also ours"): the host sets the default kind and it shows as a chip — the
3606
- * primary kind in the strong primary style; click the chip to change it;
3607
- * · a way-out answer or a skip shows as a neutral chip; click to change it.
3608
- *
3609
- * Layout: one line on desktop; below `sm` the three buttons share the row
3610
- * equally and the chip appears under them only once there is a value.
3490
+ * A label with its value — the design system's `PropertyRow` (label gray over value black, one left
3491
+ * edge). For a record's named attributes: Source, Found by, Certainty. `href`: the value is a page
3492
+ * somewhere else and opens in a new tab.
3611
3493
  */
3612
-
3613
- type DecisionAnswer = "yes" | "no" | "other";
3614
- interface WayOutItem {
3494
+ interface PeekProperty {
3495
+ property: string;
3615
3496
  value: string;
3616
- label: string;
3617
- /** 11px trailing text (a shortcut, "We think"). */
3618
- meta?: string;
3619
- /** A submenu (one level). Prefer `group` headings: a flat picker reads faster. */
3620
- items?: WayOutItem[];
3621
- /** A heading above this item, starting a group inside its menu. */
3622
- group?: string;
3497
+ href?: string;
3498
+ /** An empty value shows this tag ("None", "Empty") — never a blank row. */
3499
+ missing?: string;
3623
3500
  }
3624
- interface DecisionControlProps {
3625
- /** The answer: Yes, No, or Other (a way-out answer or a skip). Null = undecided. */
3626
- value: DecisionAnswer | null;
3627
- /** Yes or No pressed. Pressing the chosen one again is the host's to clear (EVERY BUTTON TOGGLES). */
3628
- onChange: (value: "yes" | "no") => void;
3629
- /** Context-specific way-out answers: Other's menu's first entries. */
3630
- wayOut?: WayOutItem[];
3631
- onWayOut?: (value: string) => void;
3632
- /** The chosen way-out answer (a leaf value): the chip shows its label. */
3633
- wayOutValue?: string | null;
3634
- /** The kinds of yes ("Main name", "Also known as"): with Yes on, the chip shows the kind and changes it. */
3635
- yesKinds?: WayOutItem[];
3636
- /** The current kind of yes (one of `yesKinds`' values). */
3637
- yesKind?: string | null;
3638
- onYesKind?: (value: string) => void;
3639
- /** Other pressed while on: the row goes back to no answer (EVERY BUTTON TOGGLES, Arman 2026-10-14). */
3640
- onClear?: () => void;
3641
- /** THE generic exit, always Other's last entry. Required: no decision without a way out. */
3642
- onSkip: () => void;
3643
- /** The item is skipped (undecided on purpose). */
3644
- skipped?: boolean;
3645
- /** Other's last entry. Default "Skip for now". */
3646
- skipLabel?: string;
3647
- /** The chip once skipped. Default "Skipped for now". */
3648
- skippedLabel?: string;
3649
- /** Button words; defaults Yes / No / Other. Keep the defaults unless a surface's question needs others. */
3650
- labels?: Partial<Record<DecisionAnswer, string>>;
3651
- /** Keyboard shortcuts shown as each button's muted meta ("Y"). */
3652
- shortcuts?: Partial<Record<DecisionAnswer, string>>;
3653
- /** "We think": the suggested answer glows (a ring) — it is never chosen for the person. */
3654
- suggested?: DecisionAnswer | null;
3655
- /** The chip's text when Yes is on with kinds but the host set none. Default "Choose…". */
3656
- pickerPlaceholder?: string;
3657
- disabled?: boolean;
3658
- /**
3659
- * "row" (default): the 28px everyday geometry for lists of decisions. "stage": a focus stage that shows ONE
3660
- * decision at a time (Smart Add's validation page) — the buttons take the 44px inviting geometry (Button `hero`)
3661
- * and the row keeps one line on every width. Arman's rule: flagship screens get an elevated stage.
3662
- */
3663
- size?: "row" | "stage";
3664
- className?: string;
3665
- "aria-label"?: string;
3666
- }
3667
-
3668
3501
  /**
3669
- * Slider — the range control (46 host import sites).
3670
- *
3671
- * Ported from matrx-frontend `components/ui/slider.tsx`. Two things the host
3672
- * copy could not do, both fixed here rather than in a fork:
3673
- *
3674
- * 1. A 16px THUMB IS NOT A TOUCH TARGET. The stock thumb is `h-4 w-4`, well
3675
- * under the 44px Apple HIG minimum, so a slider that worked with a mouse
3676
- * was a coin-flip with a thumb. The visible thumb keeps its size (`size`
3677
- * controls it), and an invisible `::after` pseudo-target expands the hit
3678
- * area to 44px on coarse pointers without changing the layout — the same
3679
- * trick `ResizableHandle` uses for mouse tolerance.
3680
- *
3681
- * 2. DENSITY IS A PROP, NOT A FORK (C18). `size="sm|md|lg"` picks the track
3682
- * height and thumb diameter together, so a dense admin panel and a
3683
- * touch-first settings screen use ONE component.
3684
- *
3685
- * Multi-thumb ranges work: a `Thumb` is rendered per value, which is what
3686
- * Radix requires and what the host copy (a single hardcoded Thumb) got wrong
3687
- * for any `value` array longer than one.
3502
+ * A part the HOST draws for this record, from what the app knows and this package does not:
3503
+ * - `custom-fields` — the organization's own fields for the record (nothing when its table takes none);
3504
+ * - `access` — the honest state when the record could not be read (gone, or not shared with this
3505
+ * person), in place of a body that would otherwise be blank;
3506
+ * - `media` / `markdown` — a stored file's thumbnail; formatted text.
3507
+ * Drawn by the renderer `PeekPartRendererProvider` gives; with none, `custom-fields` draws nothing,
3508
+ * `access` says "Not available", `markdown` shows its text as written, `media` its name.
3688
3509
  */
3689
-
3690
- type SliderSize = "sm" | "md" | "lg";
3691
- interface SliderProps extends React$1.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {
3692
- /** Track + thumb scale. Default `md`. */
3693
- size?: SliderSize;
3510
+ type PeekPart = {
3511
+ part: "custom-fields";
3512
+ token: string;
3513
+ id: string;
3694
3514
  }
3695
- declare const Slider: React$1.ForwardRefExoticComponent<SliderProps & React$1.RefAttributes<HTMLSpanElement>>;
3696
-
3697
- /**
3698
- * IndicatorStrip — a fixed row of small yes/no icons for a table cell
3699
- * (owner, 2026-10-08: "create an icon for each option and have it gray if it's
3700
- * not true and color if it is. Show them all at all times so the UI doesn't
3701
- * shift their position in any rows. Add a tooltip that says what they are.
3702
- * Small icons with a small amount of separation.").
3703
- *
3704
- * The contract, pinned by `indicator-strip.test.tsx`:
3705
- * - EVERY item renders in every row, in the order given — off is a muted
3706
- * glyph, never a gap — so a column of strips lines up icon over icon;
3707
- * - 14px glyphs, 4px apart, one line, never wraps, never shrinks;
3708
- * - an on item takes its tone from semantic tokens (`danger` → destructive,
3709
- * `warning`, `info`, `success`); `soft` is the same tone at reduced ink, for a
3710
- * hint rather than a verdict;
3711
- * - every icon names itself: `aria-label` and `title` ("Premium model: yes —
3712
- * Uses gpt-5"), and every `title` is the fleet tooltip (title-tooltips.ts).
3713
- *
3714
- * The caller passes the glyph (any lucide-style component) so the package
3715
- * stays icon-library free and a board keeps its domain icons.
3716
- */
3717
-
3718
- type IndicatorTone = "danger" | "warning" | "info" | "success" | "neutral";
3719
- interface IndicatorItem {
3720
- /** Stable key, also `data-indicator`. */
3515
+ /** `error`: what the read threw, so the host can say WHY (gone, not shared, offline) rather than guess. */
3516
+ | {
3517
+ part: "access";
3518
+ token: string;
3721
3519
  id: string;
3722
- /** The glyph: any component that takes `className` (lucide icons do). */
3723
- icon: React$1.ComponentType<{
3724
- className?: string;
3725
- "aria-hidden"?: boolean | "true" | "false";
3726
- }>;
3727
- /** What the icon means, as a short name ("Premium model"). */
3728
- label: string;
3729
- /** True draws the tone; false draws the muted glyph. */
3730
- on: boolean;
3731
- /** Ink when on. Default `warning`. */
3732
- tone?: IndicatorTone;
3733
- /** The tone at reduced ink: a hint, not a verdict. */
3734
- soft?: boolean;
3735
- /** Shown after the label when on (≤ ~100 chars: the tooltip budget is 140). */
3736
- detail?: string;
3520
+ error?: unknown;
3737
3521
  }
3738
- interface IndicatorStripProps extends Omit<React$1.HTMLAttributes<HTMLSpanElement>, "children"> {
3739
- items: readonly IndicatorItem[];
3522
+ /** A stored file's thumbnail. `mimeType` picks image / video frame / type icon; `name` is the file's name. */
3523
+ | {
3524
+ part: "media";
3525
+ token: string;
3526
+ id: string;
3527
+ mimeType?: string;
3528
+ name?: string;
3740
3529
  }
3741
- declare function indicatorText(item: IndicatorItem): string;
3742
- declare function IndicatorStrip({ items, className, ...props }: IndicatorStripProps): React$1.JSX.Element;
3743
-
3744
- type PeekCardSize = "xs" | "sm" | "md" | "lg" | "xl";
3745
- type PeekCardOrientation = "portrait" | "landscape";
3746
- /**
3747
- * `fit`: the card is as tall as its content, between the size's floor and its height. `fixed`: always
3748
- * that height. `content`: exactly as tall as its content, no floor, capped at the size's height — a
3749
- * notice-shaped peek (an assist, a confirmation) that holds two lines must not stand 400px tall.
3750
- */
3751
- type PeekCardHeight = "fit" | "fixed" | "content";
3752
- type PeekCardDensity = "compact" | "comfortable";
3753
- /** `surface`: the card is its own frame (border, radius, shadow). `bare`: a host panel already is. */
3754
- type PeekCardFrame = "surface" | "bare";
3755
3530
  /**
3756
- * Every size, in px. `md` portrait is the reference (the agent picker's 340 × 420 peek). Landscape
3757
- * sizes are the same family turned on its side: wide enough for a main column and an aside.
3531
+ * Formatted text (markdown) — a section with `markdown: true` hands its text here. `clamp`: the
3532
+ * section's line limit — the host draws a short preview of that many lines (inline, a shape as one line).
3758
3533
  */
3759
- declare const PEEK_CARD_SIZES: Record<PeekCardOrientation, Record<PeekCardSize, {
3760
- width: number;
3761
- height: number;
3762
- minHeight: number;
3763
- }>>;
3534
+ | {
3535
+ part: "markdown";
3536
+ text: string;
3537
+ clamp?: 2 | 3 | 4 | 6;
3538
+ };
3764
3539
  /**
3765
- * THE RECORD DOORS — a closed list the package owns. A caller names a door by `kind`; the glyph and
3766
- * the tooltip come from here, so no caller can draw a strange icon, write its own label, or add a
3767
- * door that repeats a fixed one (Copy, Open in new tab, Settings are never in this list). A new kind
3768
- * is a change to this package, reviewed once, never a call-site invention.
3769
- *
3770
- * ONE named exception, `action` (2026-10-18): a VERB the record offers that no fixed kind names
3771
- * ("Start support session", "Message"). The caller names it with a short `label` and a Lucide `icon`
3772
- * — the footer still owns placement, size, the three-door ceiling and the More overflow, so an action
3773
- * door can never become a call-site button. It is a record verb, never a link that repeats Open.
3540
+ * A picture at the top of the card (a file's thumbnail). `src` is an image address; `file` is a stored
3541
+ * file the HOST draws (through `PeekPartRendererProvider`, as part `media`). `alt` is always required.
3774
3542
  */
3775
- type PeekDoorKind = "peek" | "chat" | "edit" | "download" | "duplicate" | "action";
3776
- /** One choice in a door's menu. `tone: "danger"` is a choice that removes or silences. */
3777
- interface PeekDoorMenuItem {
3778
- key: string;
3779
- label: string;
3780
- onSelect: () => void;
3781
- tone?: "danger";
3782
- }
3783
- /** A run of a door's menu: an optional small heading over its items; groups are split by a hairline. */
3784
- interface PeekDoorMenuGroup {
3785
- label?: string;
3786
- items: readonly PeekDoorMenuItem[];
3787
- }
3788
- interface PeekDoorCommon {
3789
- onClick?: (event: React$1.MouseEvent | Event) => void;
3790
- /** A door that goes somewhere: a link (`newTab` opens it in a new tab). */
3791
- href?: string;
3792
- newTab?: boolean;
3793
- /** Its work is running (a duplicate being made): the door waits. */
3794
- busy?: boolean;
3795
- }
3796
- /** A fixed door: its glyph and label come from `PEEK_DOORS`. */
3797
- interface PeekKindDoor extends PeekDoorCommon {
3798
- kind: Exclude<PeekDoorKind, "action">;
3543
+ interface PeekMedia {
3544
+ alt: string;
3545
+ /** Default 4:3. */
3546
+ aspect?: "4:3" | "16:9" | "1:1";
3547
+ src?: string;
3548
+ file?: {
3549
+ id: string;
3550
+ mimeType?: string;
3551
+ };
3799
3552
  }
3800
- /** A record verb no fixed kind names. `id` keeps two action doors apart; `label` ≤ 3 words. */
3801
- interface PeekActionDoor extends PeekDoorCommon {
3802
- kind: "action";
3553
+ type PeekBlock = PeekFact | PeekSection | PeekProperty | PeekPart;
3554
+ interface PeekRecord {
3555
+ /** What it is in a person's words ("Agent", "Task") — Alchemy's For AI tag says it. */
3556
+ kind: string;
3557
+ /** The record's id. */
3803
3558
  id: string;
3804
- label: string;
3805
- icon: React$1.ComponentType<{
3806
- className?: string;
3807
- }>;
3808
- /**
3809
- * The verb has choices ("Later" → 1 hour · Tomorrow): the door opens this menu instead of running
3810
- * `onClick`. The menu holds a hover peek open while it is in use. Never in the More overflow — a
3811
- * menu door that does not fit is a design error the footer says in the console.
3812
- */
3813
- menu?: readonly PeekDoorMenuGroup[];
3814
- }
3815
- type PeekDoor = PeekKindDoor | PeekActionDoor;
3816
- /** At most three record doors. More than that is a menu, not a peek. */
3817
- type PeekDoors = readonly [] | readonly [PeekDoor] | readonly [PeekDoor, PeekDoor] | readonly [PeekDoor, PeekDoor, PeekDoor];
3818
- declare const PEEK_MAX_RECORD_DOORS = 3;
3819
- declare const PEEK_DOORS: Record<PeekDoorKind, {
3820
- icon: React$1.ComponentType<{
3821
- className?: string;
3822
- }>;
3823
- label: string;
3824
- inMenu?: true;
3825
- }>;
3826
-
3827
- /** A glyph component (a Lucide icon, a design-system icon); drawn 14–16px in muted ink. */
3828
- type PeekGlyph = React$1.ComponentType<{
3829
- className?: string;
3830
- }>;
3831
- /** One fact on one line: an optional glyph, the text, an optional quieter second line. */
3832
- interface PeekFact {
3833
- fact: string;
3834
3559
  /**
3835
- * The fact NAMES a record (a model, a person, a project): it opens like every identity in the app.
3836
- * Drawn by the host's identity renderer for that token (`PeekEntityRenderer`), else the table host's
3837
- * `EntityRef` around `fact`, else `fact` as text.
3560
+ * Show the id under the name with one-click copy (THE id, `RecordId`). Default: when `id` is a real
3561
+ * record id (a UUID). A real id that is not a UUID (a model id, a provider id) says `true`; a
3562
+ * made-up key says nothing and stays hidden.
3838
3563
  */
3839
- entity?: {
3840
- token: string;
3841
- id: string;
3842
- offeringId?: string | null;
3843
- /** Opening the record starts a new tab (the peek's context stays where it is). */
3844
- newTab?: boolean;
3845
- /** Its open / peek buttons stay shown, not only on hover. */
3846
- showActions?: boolean;
3564
+ showId?: boolean;
3565
+ /** Its full name — the card's strongest line; wraps, never truncates. */
3566
+ title: string;
3567
+ /** One short line under the name. */
3568
+ subtitle?: string;
3569
+ /** The subtitle is a status: it takes this tone's ink ("Required · no value yet" in warning). */
3570
+ subtitleTone?: PeekTone;
3571
+ /** A chip at the header's right edge naming what the record is ("Dropdown"), in a status tone. */
3572
+ badge?: {
3573
+ text: string;
3574
+ tone?: "neutral" | "primary" | "success" | "warning" | "destructive" | "info";
3575
+ glyph?: PeekGlyph;
3847
3576
  };
3577
+ /** A glyph that rides the title's first line. */
3848
3578
  glyph?: PeekGlyph;
3849
- /** A quieter second line (an email, a date). */
3850
- meta?: string;
3851
- /** The whole row is meta (dates, counts). */
3852
- muted?: boolean;
3853
- /** Let a long fact run to several lines instead of ending in "…". */
3854
- wrap?: boolean;
3855
- /** The fact is a page somewhere else: its text is a link that opens in a new tab. */
3579
+ /** A person's picture (or initials) in the glyph's place, on the title's first line. */
3580
+ avatar?: {
3581
+ initials: string;
3582
+ src?: string;
3583
+ };
3584
+ /** A picture over the body (a file's thumbnail). */
3585
+ media?: PeekMedia;
3586
+ /** The favorite star; `pinnedLabel` is the gold line under the name while it is on ("Pinned to favorites"). */
3587
+ favorite?: {
3588
+ on: boolean;
3589
+ onToggle: () => void;
3590
+ pinnedLabel?: string;
3591
+ };
3592
+ /**
3593
+ * The one fact that changes what the record IS (an agent that runs an ensemble). At most one.
3594
+ * `lines` are its quieter details, each with an optional hover hint (the full list a line shortens).
3595
+ */
3596
+ callout?: {
3597
+ title: string;
3598
+ glyph?: PeekGlyph;
3599
+ text?: string;
3600
+ lines?: readonly {
3601
+ text: string;
3602
+ hint?: string;
3603
+ }[];
3604
+ };
3605
+ /** The body, in reading order. */
3606
+ body?: readonly PeekBlock[];
3607
+ /** Supporting facts: beside the body in landscape, under it in portrait. */
3608
+ aside?: readonly PeekBlock[];
3609
+ /**
3610
+ * The record could not be read: the body is the design system's failed-read notice ("Couldn't load
3611
+ * {what}", the error's own sentence and its copy menu, Try again when `onRetry` is given) instead of
3612
+ * blocks that would read as an empty record. `message` replaces the error's sentence when the caller
3613
+ * knows better why.
3614
+ */
3615
+ failure?: {
3616
+ what: string;
3617
+ error?: unknown;
3618
+ message?: string;
3619
+ onRetry?: () => void;
3620
+ };
3621
+ /** The one main action. */
3622
+ primary?: {
3623
+ label: string;
3624
+ onSelect: () => void;
3625
+ };
3626
+ /** The record has settings: the first door. */
3627
+ onSettings?: () => void;
3628
+ /** Up to three record doors, by kind. */
3629
+ doors?: PeekDoors;
3630
+ /** The record's own page: the right-most door, in a new tab. */
3856
3631
  href?: string;
3632
+ /**
3633
+ * What Copy hands Alchemy. Absent: the record as drawn. A getter is read on the click (load the
3634
+ * full record only when someone copies it). `false`: this record has no Copy door.
3635
+ */
3636
+ copyData?: unknown | (() => unknown) | false;
3857
3637
  }
3858
- /** A status color, from the design system's semantic tokens. */
3859
- type PeekTone = "neutral" | "info" | "success" | "warning" | "danger";
3638
+ /** Draws a host part (`PeekPart`). `null`: nothing to draw for it. */
3639
+ type PeekPartRenderer = (part: PeekPart) => React$1.ReactNode | null;
3640
+ /** Draws a named record by token (`ai_model` → the app's model door). `null`: not this renderer's token. */
3641
+ type PeekEntityRenderer = (entity: {
3642
+ token: string;
3643
+ id: string;
3644
+ name: string;
3645
+ offeringId?: string | null;
3646
+ className: string;
3647
+ }) => React$1.ReactNode | null;
3860
3648
  /**
3861
- * One child of the record in a section's list (a step, a finding, an attached place, a reason).
3862
- * Text first; everything else is optional and drawn in one fixed place on the row.
3649
+ * The record as drawn — what Copy hands Alchemy when the caller gives nothing richer. It reads like
3650
+ * the card: each section under its own name, facts as a plain list, the callout as a note.
3863
3651
  */
3864
- interface PeekRow {
3865
- text: string;
3866
- /** A quieter line under the text. */
3867
- detail?: string;
3868
- glyph?: PeekGlyph;
3869
- /** A small dot before the text, in this tone (a finding's grade, a step's state). */
3870
- tone?: PeekTone;
3871
- /** The row NAMES a record: drawn like a fact's `entity` (the host's identity renderer, else `EntityRef`). */
3872
- entity?: {
3873
- token: string;
3874
- id: string;
3875
- offeringId?: string | null;
3652
+ declare function peekRecordData(record: PeekRecord): Record<string, unknown>;
3653
+
3654
+ declare const SOCIAL_BRAND_PATHS: {
3655
+ readonly linkedin: {
3656
+ readonly viewBox: "0 0 448 512";
3657
+ readonly d: "M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z";
3876
3658
  };
3877
- /** The row's text is a link: a web address opens in a new tab, an app path moves within the app. */
3878
- href?: string;
3879
- /** A short tag at the row's right edge ("Needs attention"), its reason as the tooltip. */
3880
- status?: {
3881
- text: string;
3882
- tone?: PeekTone;
3883
- hint?: string;
3659
+ readonly x: {
3660
+ readonly viewBox: "0 0 512 512";
3661
+ readonly d: "M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z";
3884
3662
  };
3885
- /** The row's own doors, by kind (Edit, Sneak peek …), at most two, drawn at its right edge. */
3886
- doors?: readonly PeekDoor[];
3663
+ readonly instagram: {
3664
+ readonly viewBox: "0 0 448 512";
3665
+ readonly d: "M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z";
3666
+ };
3667
+ readonly facebook: {
3668
+ readonly viewBox: "0 0 512 512";
3669
+ readonly d: "M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z";
3670
+ };
3671
+ readonly youtube: {
3672
+ readonly viewBox: "0 0 576 512";
3673
+ readonly d: "M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z";
3674
+ };
3675
+ readonly tiktok: {
3676
+ readonly viewBox: "0 0 448 512";
3677
+ readonly d: "M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z";
3678
+ };
3679
+ readonly github: {
3680
+ readonly viewBox: "0 0 496 512";
3681
+ readonly d: "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z";
3682
+ };
3683
+ readonly pinterest: {
3684
+ readonly viewBox: "0 0 496 512";
3685
+ readonly d: "M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z";
3686
+ };
3687
+ readonly threads: {
3688
+ readonly viewBox: "0 0 448 512";
3689
+ readonly d: "M331.5 235.7c2.2 .9 4.2 1.9 6.3 2.8c29.2 14.1 50.6 35.2 61.8 61.4c15.7 36.5 17.2 95.8-30.3 143.2c-36.2 36.2-80.3 52.5-142.6 53h-.3c-70.2-.5-124.1-24.1-160.4-70.2c-32.3-41-48.9-98.1-49.5-169.6V256v-.2C17 184.3 33.6 127.2 65.9 86.2C102.2 40.1 156.2 16.5 226.4 16h.3c70.3 .5 124.9 24 162.3 69.9c18.4 22.7 32 50 40.6 81.7l-40.4 10.8c-7.1-25.8-17.8-47.8-32.2-65.4c-29.2-35.8-73-54.2-130.5-54.6c-57 .5-100.1 18.8-128.2 54.4C72.1 146.1 58.5 194.3 58 256c.5 61.7 14.1 109.9 40.3 143.3c28 35.6 71.2 53.9 128.2 54.4c51.4-.4 85.4-12.6 113.7-40.9c32.3-32.2 31.7-71.8 21.4-95.9c-6.1-14.2-17.1-26-31.9-34.9c-3.7 26.9-11.8 48.3-24.7 64.8c-17.1 21.8-41.4 33.6-72.7 35.3c-23.6 1.3-46.3-4.4-63.9-16c-20.8-13.8-33-34.8-34.3-59.3c-2.5-48.3 35.7-83 95.2-86.4c21.1-1.2 40.9-.3 59.2 2.8c-2.4-14.8-7.3-26.6-14.6-35.2c-10-11.7-25.6-17.7-46.2-17.8H227c-16.6 0-39 4.6-53.3 26.3l-34.4-23.6c19.2-29.1 50.3-45.1 87.8-45.1h.8c62.6 .4 99.9 39.5 103.7 107.7l-.2 .2zm-156 68.8c1.3 25.1 28.4 36.8 54.6 35.3c25.6-1.4 54.6-11.4 59.5-73.2c-13.2-2.9-27.8-4.4-43.4-4.4c-4.8 0-9.6 .1-14.4 .4c-42.9 2.4-57.2 23.2-56.2 41.8l-.1 .1z";
3690
+ };
3691
+ readonly reddit: {
3692
+ readonly viewBox: "0 0 512 512";
3693
+ readonly d: "M0 256C0 114.6 114.6 0 256 0S512 114.6 512 256s-114.6 256-256 256L37.1 512c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256zM349.6 153.6c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34c-34.5 3.7-61.4 33-61.4 68.4l0 .2c-37.5 1.6-71.8 12.3-99 29.1c-10.1-7.8-22.8-12.5-36.5-12.5c-33 0-59.8 26.8-59.8 59.8c0 24 14.1 44.6 34.4 54.1c2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54c0-33-26.8-59.8-59.8-59.8c-13.7 0-26.3 4.6-36.4 12.4c-27.4-17-62.1-27.7-100-29.1l0-.2c0-25.4 18.9-46.5 43.4-49.9l0 0c4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6s-31.4-8.8-30.4-30.5s15.4-38.3 32.1-38.3zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9 .8-6.2 3.9-6.5c18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1 .3 5.1 3.6 3.9 6.5z";
3694
+ };
3695
+ readonly yelp: {
3696
+ readonly viewBox: "0 0 384 512";
3697
+ readonly d: "M42.9 240.32l99.62 48.61c19.2 9.4 16.2 37.51-4.5 42.71L30.5 358.45a22.79 22.79 0 0 1-28.21-19.6 197.16 197.16 0 0 1 9-85.32 22.8 22.8 0 0 1 31.61-13.21zm44 239.25a199.45 199.45 0 0 0 79.42 32.11A22.78 22.78 0 0 0 192.94 490l3.9-110.82c.7-21.3-25.5-31.91-39.81-16.1l-74.21 82.4a22.82 22.82 0 0 0 4.09 34.09zm145.34-109.92l58.81 94a22.93 22.93 0 0 0 34 5.5 198.36 198.36 0 0 0 52.71-67.61A23 23 0 0 0 364.17 370l-105.42-34.26c-20.31-6.5-37.81 15.8-26.51 33.91zm148.33-132.23a197.44 197.44 0 0 0-50.41-69.31 22.85 22.85 0 0 0-34 4.4l-62 91.92c-11.9 17.7 4.7 40.61 25.2 34.71L366 268.63a23 23 0 0 0 14.61-31.21zM62.11 30.18a22.86 22.86 0 0 0-9.9 32l104.12 180.44c11.7 20.2 42.61 11.9 42.61-11.4V22.88a22.67 22.67 0 0 0-24.5-22.8 320.37 320.37 0 0 0-112.33 30.1z";
3698
+ };
3699
+ readonly google: {
3700
+ readonly viewBox: "0 0 488 512";
3701
+ readonly d: "M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z";
3702
+ };
3703
+ };
3704
+ type SocialBrandMark = keyof typeof SOCIAL_BRAND_PATHS;
3705
+
3706
+ /** Whether a value is ours to act on. `broken` and `not-us` never render as a link of any kind. */
3707
+ type ContactValueState = "ok" | "broken" | "not-us";
3708
+ declare const CONTACT_STATE_LABEL: Record<Exclude<ContactValueState, "ok">, string>;
3709
+ interface ParsedEmail {
3710
+ address: string;
3711
+ local: string;
3712
+ domain: string;
3713
+ valid: boolean;
3887
3714
  }
3888
- /** Code or raw text, drawn monospaced and kept exactly as written (it scrolls, it never wraps). */
3889
- interface PeekCode {
3890
- text: string;
3891
- /** The language name shown over it ("TypeScript", "JSON"). */
3892
- language?: string;
3893
- /** Where it comes from ("src/app.ts · 12–30"). */
3894
- caption?: string;
3715
+ /** `mailto:` and surrounding brackets/space removed; the domain lower-cased, the local part kept. */
3716
+ declare function parseEmail(raw: string): ParsedEmail;
3717
+ declare function mailtoHref(address: string, subject?: string): string;
3718
+ interface ParsedPhone {
3719
+ /** As written (trimmed). */
3720
+ raw: string;
3721
+ /** `+15551234567`, or null when the digits cannot make one. */
3722
+ e164: string | null;
3723
+ /** How a person reads it: `(555) 123-4567` for NANP, `+44 20 7946 0958` style otherwise. */
3724
+ display: string;
3725
+ /** "United States", "United Kingdom" … or null when unknown. */
3726
+ region: string | null;
3727
+ /** An extension (`x123`, `ext. 123`), kept apart from the dialled number. */
3728
+ extension: string | null;
3729
+ valid: boolean;
3895
3730
  }
3896
- /** A labeled block: running text, tags, a list of child rows, code — or several. */
3897
- interface PeekSection {
3898
- section: string;
3899
- glyph?: PeekGlyph;
3900
- /** A status color for the whole section (an error's severity): its label and edge take the tone. */
3901
- tone?: PeekTone;
3902
- text?: string;
3903
- /** Lines before the text ends in "…". */
3904
- clamp?: 2 | 3 | 4 | 6;
3905
- /** Keep the text's own line breaks and indents (a note's content, an address) instead of one flowing paragraph. */
3906
- breaks?: boolean;
3907
- /** The text is markdown: the app's formatted-text renderer draws it (part `markdown`); without one, it reads as written. */
3908
- markdown?: boolean;
3909
- tags?: readonly string[];
3910
- /** Short lines under the label (reasons, sources), one per line; past `limit` they end in "+N more". */
3911
- items?: readonly string[];
3912
- limit?: number;
3913
- /** Child rows (steps, findings, reasons), each with its own optional status and doors; `limit` applies. */
3914
- rows?: readonly PeekRow[];
3915
- /** Number the rows (a sequence: workflow steps). */
3916
- numbered?: boolean;
3917
- code?: PeekCode;
3918
- /** Pages somewhere else under the label (evidence, sources), one per line, each opening in a new tab. */
3919
- links?: readonly {
3920
- text: string;
3921
- href: string;
3922
- }[];
3731
+ /**
3732
+ * Read a phone number. A number without a `+` and of 10 digits (or 11 starting with 1) is taken as
3733
+ * North American — the default the platform's people overwhelmingly mean; `defaultCallingCode`
3734
+ * overrides it.
3735
+ */
3736
+ declare function parsePhone(raw: string, defaultCallingCode?: string): ParsedPhone;
3737
+ declare function telHref(phone: ParsedPhone): string;
3738
+ declare function smsHref(phone: ParsedPhone): string;
3739
+ /** A postal address as one string (lines joined) — the form every map and geocoder takes. */
3740
+ declare function addressText(address: string | readonly (string | null | undefined)[]): string;
3741
+ declare function mapsHref(address: string): string;
3742
+ /** What a host's address check answered. */
3743
+ interface AddressValidation {
3744
+ /** `verified`: a real place matched. `partial`: something matched, not the whole address. `unknown`: no match. */
3745
+ status: "verified" | "partial" | "unknown";
3746
+ /** The address as the geocoder writes it. */
3747
+ formatted?: string;
3748
+ lat?: number;
3749
+ lng?: number;
3750
+ }
3751
+ declare function webSearchHref(query: string): string;
3752
+ interface ParsedUrl {
3753
+ /** An absolute http(s) URL, or null when the text is not one. */
3754
+ href: string | null;
3755
+ /** `example.com` (no `www.`). */
3756
+ domain: string;
3757
+ /** What to show: the domain, plus the path when it says something. */
3758
+ display: string;
3759
+ }
3760
+ declare function parseUrl(raw: string): ParsedUrl;
3761
+ type SocialPlatform = SocialBrandMark | "other";
3762
+ interface PlatformRule {
3763
+ name: string;
3764
+ hosts: readonly string[];
3765
+ /** The profile address for a bare handle. */
3766
+ profile: (handle: string) => string;
3767
+ /** The handle in a profile URL's path, or null when the path is not a profile. */
3768
+ handleFromPath: (segments: string[]) => string | null;
3769
+ /** Shown before the handle (`@`), or "" for platforms that name profiles by slug. */
3770
+ sigil: "@" | "";
3771
+ }
3772
+ declare const SOCIAL_PLATFORMS: Record<SocialBrandMark, PlatformRule>;
3773
+ /** A platform name as stored anywhere ("Twitter", "linkedin", "IG") → our key, or null. */
3774
+ declare function platformKey(name: string | null | undefined): SocialBrandMark | null;
3775
+ interface ParsedSocial {
3776
+ platform: SocialPlatform;
3777
+ /** "LinkedIn", "X" … or the domain for an unknown site. */
3778
+ platformName: string;
3779
+ /** The handle without its sigil, or null when only a URL is known. */
3780
+ handle: string | null;
3781
+ /** What to show: `@handle`, a slug, or the domain + path. */
3782
+ display: string;
3783
+ /** The profile address, or null when neither a URL nor a known platform gives one. */
3784
+ href: string | null;
3785
+ }
3786
+ /**
3787
+ * Read a social profile from whatever we hold: a URL, an `@handle`, a bare handle — with the
3788
+ * platform named separately or found from the URL's host.
3789
+ */
3790
+ declare function parseSocial(value: string, platform?: string | null): ParsedSocial;
3791
+ /** 1234 → "1.2K", 2_500_000 → "2.5M". */
3792
+ declare function compactCount(n: number): string;
3793
+
3794
+ /**
3795
+ * THE contact values — one component per kind of value a person reaches someone through: an email,
3796
+ * a phone number, a postal address, a social profile, a web address. Every place in every app that
3797
+ * shows one of these renders it here, never a hand-built `mailto:`, `tel:` or profile link.
3798
+ *
3799
+ * Each draws inline at the text's size — its glyph, the value, a copy button that is always there
3800
+ * (shown on hover/focus, so nothing ever shifts) — and opens THE Peek on hover (a tap opens the phone
3801
+ * drawer). The peek does the real things: compose, call, text, map, validate, search, open the
3802
+ * profile with our referral. A value whose `state` is `broken` or `not-us` is never a link of any kind.
3803
+ *
3804
+ * <EmailValue email="ana@solarbright.com" />
3805
+ * <PhoneValue phone="949 555 0142" />
3806
+ * <AddressValue address={["1 Main St", "Irvine, CA 92618"]} />
3807
+ * <SocialHandleValue value="https://www.linkedin.com/in/ana-ruiz" followers={1840} />
3808
+ * <UrlValue url="solarbright.com" title="SolarBright — home solar" />
3809
+ *
3810
+ * Address validation is the host's (it calls a server): mount `ContactValuesHostProvider` once with
3811
+ * `validateAddress`. Without one, the peek simply has no Validate action.
3812
+ */
3813
+
3814
+ interface ContactValuesHost {
3815
+ /** Check a postal address against a real geocoder (the host's server route). */
3816
+ validateAddress?: (address: string) => Promise<AddressValidation>;
3817
+ }
3818
+ declare function ContactValuesHostProvider({ children, ...host }: ContactValuesHost & {
3819
+ children: React$1.ReactNode;
3820
+ }): React$1.JSX.Element;
3821
+ declare function useContactValuesHost(): ContactValuesHost;
3822
+ interface ContactValueCommonProps {
3823
+ /** Whose value it is ("Ana Ruiz", "SolarBright") — the peek's subtitle. */
3824
+ owner?: string;
3825
+ /** `broken` / `not-us`: drawn struck through with its reason, never a link. Default `ok`. */
3826
+ state?: ContactValueState;
3827
+ /** Open the peek on hover/tap. Default true; `false` keeps only the inline value and Copy. */
3828
+ peek?: boolean;
3829
+ /** More about this value from its host (where it was found, its answer), drawn before Actions — so a host never
3830
+ * wraps the value in a second peek of its own. */
3831
+ about?: readonly PeekBlock[];
3832
+ }
3833
+ interface EmailValueProps extends ContactValueCommonProps {
3834
+ email: string;
3835
+ }
3836
+ declare function EmailValue({ email, owner, state, peek, about }: EmailValueProps): React$1.JSX.Element;
3837
+ interface PhoneValueProps extends ContactValueCommonProps {
3838
+ phone: string;
3839
+ /** The calling code for a number written without `+`. Default "1" (North America). */
3840
+ defaultCallingCode?: string;
3841
+ }
3842
+ declare function PhoneValue({ phone, owner, state, peek, defaultCallingCode, about }: PhoneValueProps): React$1.JSX.Element;
3843
+ interface AddressValueProps extends ContactValueCommonProps {
3844
+ /** One string (lines split on newlines) or its lines; empty lines are dropped. */
3845
+ address: string | readonly (string | null | undefined)[];
3846
+ /** Draw each line on its own line. Default: one line, joined with commas. */
3847
+ multiline?: boolean;
3848
+ }
3849
+ declare function AddressValue({ address, owner, state, peek, multiline, about }: AddressValueProps): React$1.JSX.Element;
3850
+ interface SocialHandleValueProps extends ContactValueCommonProps {
3851
+ /** A profile URL, an `@handle` or a bare handle. */
3852
+ value: string;
3853
+ /** The platform when `value` is a handle ("linkedin", "Twitter", "ig" …). */
3854
+ platform?: string | null;
3855
+ /** Follower count, when known. */
3856
+ followers?: number | null;
3857
+ /** The profile's display name, when known. */
3858
+ name?: string | null;
3859
+ }
3860
+ declare function SocialHandleValue(props: SocialHandleValueProps): React$1.JSX.Element;
3861
+ interface UrlValueProps extends ContactValueCommonProps {
3862
+ url: string;
3863
+ /** The page's title, when known — the peek's title. */
3864
+ title?: string | null;
3865
+ /** The inline globe. Off when the address already has its own place and the icon only wraps. */
3866
+ icon?: boolean;
3867
+ }
3868
+ declare function UrlValue({ url, title, owner, state, peek, icon, about }: UrlValueProps): React$1.JSX.Element;
3869
+ type ContactValueType = "email" | "phone" | "address" | "social" | "url";
3870
+ type ContactValueProps = ContactValueCommonProps & {
3871
+ type: ContactValueType;
3872
+ value: string;
3873
+ platform?: string | null;
3874
+ followers?: number | null;
3875
+ title?: string | null;
3876
+ icon?: boolean;
3877
+ };
3878
+ /** Any contact value by its type — for a renderer that only knows the field's type at run time. */
3879
+ declare function ContactValue({ type, value, platform, followers, title, icon, ...common }: ContactValueProps): React$1.JSX.Element;
3880
+
3881
+ /** A platform's own mark, filled in the current text color (never tinted with a brand color). */
3882
+ declare function SocialMark({ platform, className }: {
3883
+ platform: SocialBrandMark;
3884
+ className?: string;
3885
+ }): React$1.JSX.Element;
3886
+
3887
+ /** A record id the database minted (a UUID) — what a peek shows on its own. */
3888
+ declare function isRecordUuid(id: string | null | undefined): boolean;
3889
+ /** What RecordId shows for an id: a UUID's (or any long id's) first 8 characters, a short id whole. */
3890
+ type RecordIdShow = "auto" | "short" | "full";
3891
+ declare function displayId(id: string, show?: RecordIdShow): string;
3892
+
3893
+ type RecordIdLook = "plain" | "chip" | "icon";
3894
+ type RecordIdOpenResult = void | "forbidden";
3895
+ interface RecordIdProps {
3896
+ value: string | null | undefined;
3897
+ /** What kind of id it is ("Agent", "Chat", a column name): the tooltip, the copy label and, with `labelled`, the visible prefix. */
3898
+ label?: string | undefined;
3899
+ /** `auto` (default): a UUID or long id shows its first 8 characters, a short id shows whole. */
3900
+ show?: RecordIdShow;
3901
+ /**
3902
+ * `plain` (default): dense mono text. `chip`: a quiet bordered pill for headers, cards and panels.
3903
+ * `icon`: the copy button alone, header-sized (a record's own header, where the id is shown elsewhere);
3904
+ * the full id is its tooltip.
3905
+ */
3906
+ look?: RecordIdLook;
3907
+ /** Show the kind of id in front of it ("Agent ID 1a2b3c4d"). */
3908
+ labelled?: boolean;
3909
+ /** A short note added to the tooltip under the id ("Not a member of this organization"). */
3910
+ hint?: string;
3911
+ /**
3912
+ * Inside another control (a button, a select trigger, a door): the id as text only, full id and
3913
+ * hint as its native tooltip, no buttons of its own — the control around it owns the click.
3914
+ */
3915
+ inert?: boolean;
3916
+ /**
3917
+ * Open the referenced record in-app (prefer WindowPanel).
3918
+ * Return `"forbidden"` to block navigation and show a muted state.
3919
+ */
3920
+ onOpen?: (id: string) => RecordIdOpenResult | Promise<RecordIdOpenResult>;
3921
+ /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */
3922
+ href?: string | null | undefined;
3923
+ /**
3924
+ * Canonical entity token this id points at (`agent`, `note`, `task`, …).
3925
+ * Supplies the route and the peek automatically — THE DOOR LAW, resolved
3926
+ * from the registries instead of wired per callsite. An explicit `href` /
3927
+ * `onOpen` still wins.
3928
+ */
3929
+ token?: string | null | undefined;
3930
+ /** Force non-navigable (still copyable). */
3931
+ forbidden?: boolean;
3932
+ className?: string;
3933
+ trailing?: ReactNode;
3934
+ }
3935
+ declare function RecordId({ value, label, show, look, labelled, hint, inert, onOpen, href, token, forbidden, className, trailing, }: RecordIdProps): React$1.JSX.Element;
3936
+
3937
+ /**
3938
+ * THE ONE CONTROL — the settled control family (owner, 2026-10-02/03).
3939
+ *
3940
+ * Every control here is the same object: 28px visible height, capsule, 13px/500
3941
+ * label, 16px glyph inset 6px, text inset 10px, and HALF A GAP (3px) of its own
3942
+ * on each side so containers add no gap. There is NO size prop: agents get no
3943
+ * choice. Geometry and color live in `controls.css`, locked inside
3944
+ * `@layer matrx-tap-lock` (`!important` in the host's first layer), so a call
3945
+ * site's `className` can place a control (width, flex, grid, position) but can
3946
+ * never restyle it. The rare big control is a different component behind a
3947
+ * `// ui-exception:` comment, never a prop.
3948
+ *
3949
+ * Built on the package's own internals — Radix Slot / Switch / DropdownMenu, the
3950
+ * cursor law's `swallowClick`, `SelectChevron`, the package icons — so nothing
3951
+ * here is a second implementation of a behavior the package already owns.
3952
+ */
3953
+
3954
+ /** The status inks a glyph may carry (the role tokens). */
3955
+ type GlyphTone = "success" | "warning" | "destructive" | "info" | "primary";
3956
+
3957
+ /**
3958
+ * DecisionControl — THE row decision: [Yes] [No] [Other] + the answer's value chip.
3959
+ *
3960
+ * EVERY DECISION OFFERS A WAY OUT (Arman, 2026-10-14): a row that only offers
3961
+ * "Preferred / Alias / Not us" forces a person to decide something they cannot,
3962
+ * and they freeze. So every decision is exactly three clear buttons in one row —
3963
+ * Yes, No, Other — the same words in the same place on every row, for a person
3964
+ * or a business and for any kind of data (the section header asks the question:
3965
+ * "Is this yours?", "Is this your name?"). Other's menu holds the smart,
3966
+ * context-specific answers first (Tagline, Former name, grouped relationships…)
3967
+ * and ALWAYS ends with the generic exit "Skip for now", which leaves the item
3968
+ * undecided — neither kept nor rejected.
3969
+ *
3970
+ * NO EMPTY BOX, EVER (Arman, 2026-10-14: "There is a border remaining … no
3971
+ * professional app does that"). Champion: Linear's issue properties (the issue
3972
+ * view sidebar and the row property chips) — a property with no value draws
3973
+ * nothing; the menu opens FROM the control that asked for it; a chosen value is
3974
+ * a compact chip, and clicking the chip reopens the same menu. So:
3975
+ * · no answer, No, or a plain Yes: nothing is drawn beside the buttons (the
3976
+ * column's width is reserved invisibly on desktop, so rows never jump);
3977
+ * · Other: its menu opens anchored to the Other button; closing it without a
3978
+ * pick is no answer again; Other pressed while answered clears (onClear);
3979
+ * · Yes with `yesKinds` ("Main name" / "Also known as", "Primary site" /
3980
+ * "Also ours"): the host sets the default kind and it shows as a chip — the
3981
+ * primary kind in the strong primary style; click the chip to change it;
3982
+ * · a way-out answer or a skip shows as a neutral chip; click to change it.
3983
+ *
3984
+ * Layout: one line on desktop; below `sm` the three buttons share the row
3985
+ * equally and the chip appears under them only once there is a value.
3986
+ */
3987
+
3988
+ type DecisionAnswer = "yes" | "no" | "other";
3989
+ interface WayOutItem {
3990
+ value: string;
3991
+ label: string;
3992
+ /** 11px trailing text (a shortcut, "We think"). */
3993
+ meta?: string;
3994
+ /** A submenu (one level). Prefer `group` headings: a flat picker reads faster. */
3995
+ items?: WayOutItem[];
3996
+ /** A heading above this item, starting a group inside its menu. */
3997
+ group?: string;
3998
+ }
3999
+ interface DecisionControlProps {
4000
+ /** The answer: Yes, No, or Other (a way-out answer or a skip). Null = undecided. */
4001
+ value: DecisionAnswer | null;
4002
+ /** Yes or No pressed. Pressing the chosen one again is the host's to clear (EVERY BUTTON TOGGLES). */
4003
+ onChange: (value: "yes" | "no") => void;
4004
+ /** Context-specific way-out answers: Other's menu's first entries. */
4005
+ wayOut?: WayOutItem[];
4006
+ onWayOut?: (value: string) => void;
4007
+ /** The chosen way-out answer (a leaf value): the chip shows its label. */
4008
+ wayOutValue?: string | null;
4009
+ /** The kinds of yes ("Main name", "Also known as"): with Yes on, the chip shows the kind and changes it. */
4010
+ yesKinds?: WayOutItem[];
4011
+ /** The current kind of yes (one of `yesKinds`' values). */
4012
+ yesKind?: string | null;
4013
+ onYesKind?: (value: string) => void;
4014
+ /** Other pressed while on: the row goes back to no answer (EVERY BUTTON TOGGLES, Arman 2026-10-14). */
4015
+ onClear?: () => void;
4016
+ /** THE generic exit, always Other's last entry. Required: no decision without a way out. */
4017
+ onSkip: () => void;
4018
+ /** The item is skipped (undecided on purpose). */
4019
+ skipped?: boolean;
4020
+ /** Other's last entry. Default "Skip for now". */
4021
+ skipLabel?: string;
4022
+ /** The chip once skipped. Default "Skipped for now". */
4023
+ skippedLabel?: string;
4024
+ /** Button words; defaults Yes / No / Other. Keep the defaults unless a surface's question needs others. */
4025
+ labels?: Partial<Record<DecisionAnswer, string>>;
4026
+ /** Keyboard shortcuts shown as each button's muted meta ("Y"). */
4027
+ shortcuts?: Partial<Record<DecisionAnswer, string>>;
4028
+ /** "We think": the suggested answer glows (a ring) — it is never chosen for the person. */
4029
+ suggested?: DecisionAnswer | null;
4030
+ /** The chip's text when Yes is on with kinds but the host set none. Default "Choose…". */
4031
+ pickerPlaceholder?: string;
4032
+ disabled?: boolean;
3923
4033
  /**
3924
- * THE INPUT PREVIEW (a form field at a glance, drawn with the real controls, inert): the choices
3925
- * an input offers as chips, the picked ones on — what a person filling it will see.
4034
+ * "row" (default): the 28px everyday geometry for lists of decisions. "stage": a focus stage that shows ONE
4035
+ * decision at a time (Smart Add's validation page) — the buttons take the 44px inviting geometry (Button `hero`)
4036
+ * and the row keeps one line on every width. Arman's rule: flagship screens get an elevated stage.
3926
4037
  */
3927
- choices?: {
3928
- options: readonly string[];
3929
- picked?: readonly string[];
3930
- };
3931
- /** THE INPUT PREVIEW for a typed value: a sample field showing `text`, else the `placeholder`. */
3932
- field?: PeekFieldPreview;
3933
- /** THE INPUT PREVIEW for an on/off input: the real switch, inert, with its state in words. */
3934
- toggle?: {
3935
- on: boolean;
3936
- label?: string;
3937
- };
3938
- /** An exact token (`{{name}}`, an id, a key) in a monospace chip; a press copies it. */
3939
- token?: string;
3940
- }
3941
- /** A sample field: one line, two lines (long text), or a drop zone (a file or media input). */
3942
- interface PeekFieldPreview {
3943
- text?: string;
3944
- placeholder: string;
3945
- lines?: 1 | 2;
3946
- /** The input's glyph, at the field's leading edge. */
3947
- glyph?: PeekGlyph;
3948
- /** A file / media input: a dashed drop zone instead of a text box. */
3949
- drop?: boolean;
4038
+ size?: "row" | "stage";
4039
+ className?: string;
4040
+ "aria-label"?: string;
3950
4041
  }
4042
+
3951
4043
  /**
3952
- * A label with its value — the design system's `PropertyRow` (label gray over value black, one left
3953
- * edge). For a record's named attributes: Source, Found by, Certainty. `href`: the value is a page
3954
- * somewhere else and opens in a new tab.
4044
+ * Slider — the range control (46 host import sites).
4045
+ *
4046
+ * Ported from matrx-frontend `components/ui/slider.tsx`. Two things the host
4047
+ * copy could not do, both fixed here rather than in a fork:
4048
+ *
4049
+ * 1. A 16px THUMB IS NOT A TOUCH TARGET. The stock thumb is `h-4 w-4`, well
4050
+ * under the 44px Apple HIG minimum, so a slider that worked with a mouse
4051
+ * was a coin-flip with a thumb. The visible thumb keeps its size (`size`
4052
+ * controls it), and an invisible `::after` pseudo-target expands the hit
4053
+ * area to 44px on coarse pointers without changing the layout — the same
4054
+ * trick `ResizableHandle` uses for mouse tolerance.
4055
+ *
4056
+ * 2. DENSITY IS A PROP, NOT A FORK (C18). `size="sm|md|lg"` picks the track
4057
+ * height and thumb diameter together, so a dense admin panel and a
4058
+ * touch-first settings screen use ONE component.
4059
+ *
4060
+ * Multi-thumb ranges work: a `Thumb` is rendered per value, which is what
4061
+ * Radix requires and what the host copy (a single hardcoded Thumb) got wrong
4062
+ * for any `value` array longer than one.
3955
4063
  */
3956
- interface PeekProperty {
3957
- property: string;
3958
- value: string;
3959
- href?: string;
3960
- /** An empty value shows this tag ("None", "Empty") — never a blank row. */
3961
- missing?: string;
4064
+
4065
+ type SliderSize = "sm" | "md" | "lg";
4066
+ interface SliderProps extends React$1.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {
4067
+ /** Track + thumb scale. Default `md`. */
4068
+ size?: SliderSize;
3962
4069
  }
4070
+ declare const Slider: React$1.ForwardRefExoticComponent<SliderProps & React$1.RefAttributes<HTMLSpanElement>>;
4071
+
3963
4072
  /**
3964
- * A part the HOST draws for this record, from what the app knows and this package does not:
3965
- * - `custom-fields` — the organization's own fields for the record (nothing when its table takes none);
3966
- * - `access` — the honest state when the record could not be read (gone, or not shared with this
3967
- * person), in place of a body that would otherwise be blank;
3968
- * - `media` / `markdown` — a stored file's thumbnail; formatted text.
3969
- * Drawn by the renderer `PeekPartRendererProvider` gives; with none, `custom-fields` draws nothing,
3970
- * `access` says "Not available", `markdown` shows its text as written, `media` its name.
4073
+ * IndicatorStrip — a fixed row of small yes/no icons for a table cell
4074
+ * (owner, 2026-10-08: "create an icon for each option and have it gray if it's
4075
+ * not true and color if it is. Show them all at all times so the UI doesn't
4076
+ * shift their position in any rows. Add a tooltip that says what they are.
4077
+ * Small icons with a small amount of separation.").
4078
+ *
4079
+ * The contract, pinned by `indicator-strip.test.tsx`:
4080
+ * - EVERY item renders in every row, in the order given — off is a muted
4081
+ * glyph, never a gap — so a column of strips lines up icon over icon;
4082
+ * - 14px glyphs, 4px apart, one line, never wraps, never shrinks;
4083
+ * - an on item takes its tone from semantic tokens (`danger` → destructive,
4084
+ * `warning`, `info`, `success`); `soft` is the same tone at reduced ink, for a
4085
+ * hint rather than a verdict;
4086
+ * - every icon names itself: `aria-label` and `title` ("Premium model: yes —
4087
+ * Uses gpt-5"), and every `title` is the fleet tooltip (title-tooltips.ts).
4088
+ *
4089
+ * The caller passes the glyph (any lucide-style component) so the package
4090
+ * stays icon-library free and a board keeps its domain icons.
3971
4091
  */
3972
- type PeekPart = {
3973
- part: "custom-fields";
3974
- token: string;
3975
- id: string;
3976
- }
3977
- /** `error`: what the read threw, so the host can say WHY (gone, not shared, offline) rather than guess. */
3978
- | {
3979
- part: "access";
3980
- token: string;
3981
- id: string;
3982
- error?: unknown;
3983
- }
3984
- /** A stored file's thumbnail. `mimeType` picks image / video frame / type icon; `name` is the file's name. */
3985
- | {
3986
- part: "media";
3987
- token: string;
4092
+
4093
+ type IndicatorTone = "danger" | "warning" | "info" | "success" | "neutral";
4094
+ interface IndicatorItem {
4095
+ /** Stable key, also `data-indicator`. */
3988
4096
  id: string;
3989
- mimeType?: string;
3990
- name?: string;
3991
- }
3992
- /**
3993
- * Formatted text (markdown) — a section with `markdown: true` hands its text here. `clamp`: the
3994
- * section's line limit — the host draws a short preview of that many lines (inline, a shape as one line).
3995
- */
3996
- | {
3997
- part: "markdown";
3998
- text: string;
3999
- clamp?: 2 | 3 | 4 | 6;
4000
- };
4001
- /**
4002
- * A picture at the top of the card (a file's thumbnail). `src` is an image address; `file` is a stored
4003
- * file the HOST draws (through `PeekPartRendererProvider`, as part `media`). `alt` is always required.
4004
- */
4005
- interface PeekMedia {
4006
- alt: string;
4007
- /** Default 4:3. */
4008
- aspect?: "4:3" | "16:9" | "1:1";
4009
- src?: string;
4010
- file?: {
4011
- id: string;
4012
- mimeType?: string;
4013
- };
4097
+ /** The glyph: any component that takes `className` (lucide icons do). */
4098
+ icon: React$1.ComponentType<{
4099
+ className?: string;
4100
+ "aria-hidden"?: boolean | "true" | "false";
4101
+ }>;
4102
+ /** What the icon means, as a short name ("Premium model"). */
4103
+ label: string;
4104
+ /** True draws the tone; false draws the muted glyph. */
4105
+ on: boolean;
4106
+ /** Ink when on. Default `warning`. */
4107
+ tone?: IndicatorTone;
4108
+ /** The tone at reduced ink: a hint, not a verdict. */
4109
+ soft?: boolean;
4110
+ /** Shown after the label when on (≤ ~100 chars: the tooltip budget is 140). */
4111
+ detail?: string;
4014
4112
  }
4015
- type PeekBlock = PeekFact | PeekSection | PeekProperty | PeekPart;
4016
- interface PeekRecord {
4017
- /** What it is in a person's words ("Agent", "Task") — Alchemy's For AI tag says it. */
4018
- kind: string;
4019
- /** The record's id. */
4020
- id: string;
4021
- /**
4022
- * Show the id under the name with one-click copy (THE id, `RecordId`). Default: when `id` is a real
4023
- * record id (a UUID). A real id that is not a UUID (a model id, a provider id) says `true`; a
4024
- * made-up key says nothing and stays hidden.
4025
- */
4026
- showId?: boolean;
4027
- /** Its full name — the card's strongest line; wraps, never truncates. */
4028
- title: string;
4029
- /** One short line under the name. */
4030
- subtitle?: string;
4031
- /** The subtitle is a status: it takes this tone's ink ("Required · no value yet" in warning). */
4032
- subtitleTone?: PeekTone;
4033
- /** A chip at the header's right edge naming what the record is ("Dropdown"), in a status tone. */
4034
- badge?: {
4035
- text: string;
4036
- tone?: "neutral" | "primary" | "success" | "warning" | "destructive" | "info";
4037
- glyph?: PeekGlyph;
4038
- };
4039
- /** A glyph that rides the title's first line. */
4040
- glyph?: PeekGlyph;
4041
- /** A person's picture (or initials) in the glyph's place, on the title's first line. */
4042
- avatar?: {
4043
- initials: string;
4044
- src?: string;
4045
- };
4046
- /** A picture over the body (a file's thumbnail). */
4047
- media?: PeekMedia;
4048
- /** The favorite star; `pinnedLabel` is the gold line under the name while it is on ("Pinned to favorites"). */
4049
- favorite?: {
4050
- on: boolean;
4051
- onToggle: () => void;
4052
- pinnedLabel?: string;
4053
- };
4054
- /**
4055
- * The one fact that changes what the record IS (an agent that runs an ensemble). At most one.
4056
- * `lines` are its quieter details, each with an optional hover hint (the full list a line shortens).
4057
- */
4058
- callout?: {
4059
- title: string;
4060
- glyph?: PeekGlyph;
4061
- text?: string;
4062
- lines?: readonly {
4063
- text: string;
4064
- hint?: string;
4065
- }[];
4066
- };
4067
- /** The body, in reading order. */
4068
- body?: readonly PeekBlock[];
4069
- /** Supporting facts: beside the body in landscape, under it in portrait. */
4070
- aside?: readonly PeekBlock[];
4071
- /**
4072
- * The record could not be read: the body is the design system's failed-read notice ("Couldn't load
4073
- * {what}", the error's own sentence and its copy menu, Try again when `onRetry` is given) instead of
4074
- * blocks that would read as an empty record. `message` replaces the error's sentence when the caller
4075
- * knows better why.
4076
- */
4077
- failure?: {
4078
- what: string;
4079
- error?: unknown;
4080
- message?: string;
4081
- onRetry?: () => void;
4082
- };
4083
- /** The one main action. */
4084
- primary?: {
4085
- label: string;
4086
- onSelect: () => void;
4087
- };
4088
- /** The record has settings: the first door. */
4089
- onSettings?: () => void;
4090
- /** Up to three record doors, by kind. */
4091
- doors?: PeekDoors;
4092
- /** The record's own page: the right-most door, in a new tab. */
4093
- href?: string;
4094
- /**
4095
- * What Copy hands Alchemy. Absent: the record as drawn. A getter is read on the click (load the
4096
- * full record only when someone copies it). `false`: this record has no Copy door.
4097
- */
4098
- copyData?: unknown | (() => unknown) | false;
4113
+ interface IndicatorStripProps extends Omit<React$1.HTMLAttributes<HTMLSpanElement>, "children"> {
4114
+ items: readonly IndicatorItem[];
4099
4115
  }
4100
- /** Draws a host part (`PeekPart`). `null`: nothing to draw for it. */
4101
- type PeekPartRenderer = (part: PeekPart) => React$1.ReactNode | null;
4102
- /** Draws a named record by token (`ai_model` → the app's model door). `null`: not this renderer's token. */
4103
- type PeekEntityRenderer = (entity: {
4104
- token: string;
4105
- id: string;
4106
- name: string;
4107
- offeringId?: string | null;
4108
- className: string;
4109
- }) => React$1.ReactNode | null;
4110
- /**
4111
- * The record as drawn — what Copy hands Alchemy when the caller gives nothing richer. It reads like
4112
- * the card: each section under its own name, facts as a plain list, the callout as a note.
4113
- */
4114
- declare function peekRecordData(record: PeekRecord): Record<string, unknown>;
4116
+ declare function indicatorText(item: IndicatorItem): string;
4117
+ declare function IndicatorStrip({ items, className, ...props }: IndicatorStripProps): React$1.JSX.Element;
4115
4118
 
4116
4119
  /**
4117
4120
  * CandidateCard — THE card for "is this one yours?": a candidate someone found (a profile, a person, a
@@ -4626,8 +4629,8 @@ declare const ResizableHandle: {
4626
4629
  };
4627
4630
 
4628
4631
  declare const toggleVariants: (props?: ({
4629
- variant?: "switch" | "default" | "outline" | null | undefined;
4630
- size?: "sm" | "default" | "lg" | null | undefined;
4632
+ variant?: "default" | "outline" | "switch" | null | undefined;
4633
+ size?: "default" | "sm" | "lg" | null | undefined;
4631
4634
  } & class_variance_authority_types.ClassProp) | undefined) => string;
4632
4635
  interface ToggleProps extends React$1.ComponentPropsWithoutRef<typeof TogglePrimitive.Root>, VariantProps<typeof toggleVariants> {
4633
4636
  }
@@ -5396,8 +5399,8 @@ type AdvancedTooltipProps = {
5396
5399
  disabled?: boolean;
5397
5400
  variant?: "default" | "error" | "warning" | "success";
5398
5401
  };
5399
- declare const SimpleTooltip: ({ children, text }: SimpleTooltipProps) => string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
5400
- declare const AdvancedTooltip: ({ children, text, side, align, delayDuration, className, sideOffset, contentClassName, disabled, variant, }: AdvancedTooltipProps) => string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
5402
+ declare const SimpleTooltip: ({ children, text }: SimpleTooltipProps) => string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
5403
+ declare const AdvancedTooltip: ({ children, text, side, align, delayDuration, className, sideOffset, contentClassName, disabled, variant, }: AdvancedTooltipProps) => string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
5401
5404
 
5402
5405
  type LoadingVariant = 'dots' | 'bars' | 'brain' | 'minimal' | 'workflow';
5403
5406
  type LoadingSize = 'sm' | 'md' | 'lg';