@ship-it-ui/ui 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import { ClassValue } from 'clsx';
2
2
  export { ClassValue } from 'clsx';
3
3
  import * as react from 'react';
4
- import { useEffect, KeyboardEvent, RefObject, ButtonHTMLAttributes, ReactNode, HTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, AnchorHTMLAttributes, Ref, MouseEvent, forwardRef, LabelHTMLAttributes, FC, SVGAttributes, MouseEventHandler } from 'react';
4
+ import { ReactElement, ReactNode, ComponentPropsWithoutRef, TimeHTMLAttributes, useEffect, KeyboardEvent, RefObject, ButtonHTMLAttributes, HTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, AnchorHTMLAttributes, Ref, MouseEvent, forwardRef, LabelHTMLAttributes, FC, SVGAttributes, MouseEventHandler } from 'react';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
6
  import { VariantProps } from 'class-variance-authority';
7
7
  import * as RadixCheckbox from '@radix-ui/react-checkbox';
8
- import * as react_jsx_runtime from 'react/jsx-runtime';
9
8
  import * as RadixRadio from '@radix-ui/react-radio-group';
10
9
  import * as RadixSelect from '@radix-ui/react-select';
11
10
  import * as RadixSlider from '@radix-ui/react-slider';
@@ -31,6 +30,103 @@ import * as RadixTabs from '@radix-ui/react-tabs';
31
30
  */
32
31
  declare function cn(...inputs: ClassValue[]): string;
33
32
 
33
+ /**
34
+ * Emits a `<script type="application/ld+json">` tag carrying schema.org (or
35
+ * any JSON-serializable) structured data. The payload is escaped so a
36
+ * user-supplied string containing `</script>` can't break out of the script
37
+ * tag — that's the standard Next.js JSON-LD recipe.
38
+ *
39
+ * Returns `null` for `null`/`undefined` data so call sites can pass the
40
+ * payload directly without an outer guard.
41
+ *
42
+ * @example
43
+ * <JsonLd data={{
44
+ * '@context': 'https://schema.org',
45
+ * '@type': 'BreadcrumbList',
46
+ * itemListElement: items,
47
+ * }} />
48
+ */
49
+ interface JsonLdProps {
50
+ /** The structured-data payload. JSON-stringified into the script body. */
51
+ data: unknown;
52
+ }
53
+ declare function JsonLd({ data }: JsonLdProps): ReactElement | null;
54
+
55
+ /**
56
+ * Helpers used by components that emit schema.org JSON-LD.
57
+ *
58
+ * Centralised here so the seven structured-data components
59
+ * (ComparisonTable, Breadcrumbs, ReviewCard, Testimonial, PricingCard,
60
+ * ListingCard/Detail, ConnectorCard) don't each carry their own copy.
61
+ * If the behavior ever needs to change (e.g. handle `bigint`,
62
+ * normalise whitespace), there's one place to do it.
63
+ */
64
+ /**
65
+ * Returns the string form of a `ReactNode` when it's a plain string or
66
+ * number, otherwise `null`. Components emitting JSON-LD use this to
67
+ * decide whether a JSX-typed prop can populate a string-only schema
68
+ * field — when it returns `null`, the field (or the whole entity) is
69
+ * skipped rather than coerced to `"[object Object]"` or similar.
70
+ */
71
+ declare function nodeToString(node: ReactNode): string | null;
72
+ /**
73
+ * Returns the ISO 8601 string for a `Date`, `string`, or epoch-number
74
+ * input, or `null` when the value is `undefined`/`null` or the
75
+ * resulting `Date` is not a valid timestamp. Used by the
76
+ * `datePublished` / `dateModified` JSON-LD fields and the
77
+ * `<time dateTime>` attribute on review and activity components.
78
+ *
79
+ * Strings are passed through as-is (no validation) so consumers who
80
+ * already have an ISO 8601 string don't pay for a parse + re-format
81
+ * round trip and so non-ISO machine-readable strings supported by
82
+ * `<time dateTime>` (e.g. `"2026-W19"`) survive.
83
+ */
84
+ declare function toIsoString(value: Date | string | number | undefined | null): string | null;
85
+
86
+ /**
87
+ * Six valid HTML heading levels. Components in the design system expose this
88
+ * type through a `titleAs?: HeadingLevel` prop so consumers can compose the
89
+ * page's H1/H2/H3 hierarchy correctly.
90
+ */
91
+ type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
92
+ interface HeadingProps extends ComponentPropsWithoutRef<'h2'> {
93
+ /** Heading level to render. Default `'h2'`. */
94
+ as?: HeadingLevel;
95
+ }
96
+ /**
97
+ * Renders an `<h1>`–`<h6>` element based on the `as` prop, defaulting to
98
+ * `<h2>`. Use this in design-system components that surface a `titleAs`
99
+ * configurable heading prop so the visual style stays consistent while the
100
+ * underlying element changes.
101
+ *
102
+ * @example
103
+ * <Heading as={titleAs} className="text-[18px] font-semibold">
104
+ * {title}
105
+ * </Heading>
106
+ */
107
+ declare const Heading: react.ForwardRefExoticComponent<HeadingProps & react.RefAttributes<HTMLHeadingElement>>;
108
+
109
+ interface DateTimeProps extends Omit<TimeHTMLAttributes<HTMLTimeElement>, 'dateTime' | 'children'> {
110
+ /** Machine-readable ISO 8601 string or `Date` object. Rendered into `<time dateTime="…">`. */
111
+ iso: string | Date;
112
+ /**
113
+ * Visible label. When omitted the component falls back to the ISO string,
114
+ * so consumers can pass just `<DateTime iso={...} />` and get a sane render.
115
+ */
116
+ children?: ReactNode;
117
+ }
118
+ /**
119
+ * Wraps a date label in a `<time dateTime="…">` element with a machine-readable
120
+ * ISO 8601 attribute. Search crawlers and AI agents read `dateTime` for
121
+ * timestamps even when the visible label is a relative phrase like
122
+ * "2 days ago" or a localized format like "May 3, 2026".
123
+ *
124
+ * @example
125
+ * <DateTime iso="2026-05-03">May 3, 2026</DateTime>
126
+ * <DateTime iso={lastSyncedAt}>{formatRelative(lastSyncedAt)}</DateTime>
127
+ */
128
+ declare const DateTime: react.ForwardRefExoticComponent<DateTimeProps & react.RefAttributes<HTMLTimeElement>>;
129
+
34
130
  /**
35
131
  * Standard controlled/uncontrolled state hook. Mirrors Radix's
36
132
  * `useControllableState` — when `value` is provided, the hook stays in sync
@@ -154,9 +250,9 @@ declare function useTheme(): {
154
250
  * else defers. Variants and sizes match `design-handoff/project/components/Button.jsx`.
155
251
  */
156
252
  declare const buttonStyles: (props?: ({
157
- variant?: "primary" | "secondary" | "ghost" | "outline" | "destructive" | "success" | "link" | null | undefined;
253
+ variant?: "link" | "primary" | "secondary" | "ghost" | "outline" | "destructive" | "success" | null | undefined;
158
254
  size?: "sm" | "md" | "lg" | null | undefined;
159
- density?: "comfortable" | "touch" | null | undefined;
255
+ density?: "touch" | "comfortable" | null | undefined;
160
256
  fullWidth?: boolean | null | undefined;
161
257
  } & class_variance_authority_types.ClassProp) | undefined) => string;
162
258
  interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonStyles> {
@@ -177,7 +273,7 @@ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAtt
177
273
  declare const iconButtonStyles: (props?: ({
178
274
  variant?: "primary" | "secondary" | "ghost" | "outline" | "destructive" | "success" | null | undefined;
179
275
  size?: "sm" | "md" | "lg" | null | undefined;
180
- density?: "comfortable" | "touch" | null | undefined;
276
+ density?: "touch" | "comfortable" | null | undefined;
181
277
  } & class_variance_authority_types.ClassProp) | undefined) => string;
182
278
  interface IconButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>, VariantProps<typeof iconButtonStyles> {
183
279
  /** The glyph or icon node to render. Pure decoration — set `aria-label` for screen readers. */
@@ -291,7 +387,7 @@ interface FieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
291
387
  * {(p) => <Input type="email" placeholder="me@org.com" {...p} />}
292
388
  * </Field>
293
389
  */
294
- declare function Field({ label, hint, error, required, className, children, ...props }: FieldProps): react_jsx_runtime.JSX.Element;
390
+ declare function Field({ label, hint, error, required, className, children, ...props }: FieldProps): react.JSX.Element;
295
391
 
296
392
  /**
297
393
  * Display-to-input rename primitive. Renders `value` as a static element until
@@ -345,7 +441,7 @@ declare const InlineEdit: react.ForwardRefExoticComponent<InlineEditProps & reac
345
441
  declare const inputWrapperStyles: (props?: ({
346
442
  size?: "sm" | "md" | "lg" | null | undefined;
347
443
  tone?: "default" | "err" | null | undefined;
348
- density?: "comfortable" | "touch" | null | undefined;
444
+ density?: "touch" | "comfortable" | null | undefined;
349
445
  } & class_variance_authority_types.ClassProp) | undefined) => string;
350
446
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputWrapperStyles> {
351
447
  /** Element rendered to the left of the input (an `IconGlyph`, `@`, etc.). */
@@ -504,7 +600,7 @@ interface SelectProps extends Omit<RadixSelect.SelectProps, 'children'> {
504
600
  * One-line Select. For composition (groups, separators), use the lower-level
505
601
  * `SelectRoot/Trigger/Content/Item` exports directly.
506
602
  */
507
- declare function Select({ options, placeholder, size, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rootProps }: SelectProps): react_jsx_runtime.JSX.Element;
603
+ declare function Select({ options, placeholder, size, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rootProps }: SelectProps): react.JSX.Element;
508
604
 
509
605
  interface SliderProps extends Omit<RadixSlider.SliderProps, 'asChild' | 'value' | 'defaultValue' | 'onValueChange'> {
510
606
  /** Show the numeric value to the right of the track. */
@@ -647,9 +743,9 @@ interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'>, Var
647
743
  declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
648
744
 
649
745
  declare const cardStyles: (props?: ({
650
- variant?: "ghost" | "default" | "elevated" | null | undefined;
746
+ variant?: "default" | "ghost" | "elevated" | null | undefined;
651
747
  interactive?: boolean | null | undefined;
652
- density?: "comfortable" | "touch" | null | undefined;
748
+ density?: "touch" | "comfortable" | null | undefined;
653
749
  } & class_variance_authority_types.ClassProp) | undefined) => string;
654
750
  interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof cardStyles> {
655
751
  /** Render a header row with this title (and optional `actions`). */
@@ -944,7 +1040,7 @@ interface DialogProps extends RadixDialog.DialogProps {
944
1040
  /** When set, content is wrapped in a content frame; omit for full custom layout. */
945
1041
  children?: ReactNode;
946
1042
  }
947
- declare function Dialog({ title, description, footer, width, children, ...rootProps }: DialogProps): react_jsx_runtime.JSX.Element;
1043
+ declare function Dialog({ title, description, footer, width, children, ...rootProps }: DialogProps): react.JSX.Element;
948
1044
 
949
1045
  type DrawerSide = 'left' | 'right' | 'bottom';
950
1046
  interface DrawerProps extends RadixDialog.DialogProps {
@@ -1042,7 +1138,7 @@ interface HoverCardProps extends RadixHoverCard.HoverCardProps {
1042
1138
  content: ReactNode;
1043
1139
  }
1044
1140
  /** Convenience wrapper — pass `trigger` and `content` as props. */
1045
- declare function HoverCard({ trigger, content, ...rootProps }: HoverCardProps): react_jsx_runtime.JSX.Element;
1141
+ declare function HoverCard({ trigger, content, ...rootProps }: HoverCardProps): react.JSX.Element;
1046
1142
 
1047
1143
  declare const PopoverRoot: react.FC<RadixPopover.PopoverProps>;
1048
1144
  declare const PopoverTrigger: react.ForwardRefExoticComponent<RadixPopover.PopoverTriggerProps & react.RefAttributes<HTMLButtonElement>>;
@@ -1086,7 +1182,7 @@ interface ToastContextValue {
1086
1182
  */
1087
1183
  declare function ToastProvider({ children }: {
1088
1184
  children: ReactNode;
1089
- }): react_jsx_runtime.JSX.Element;
1185
+ }): react.JSX.Element;
1090
1186
  declare function useToast(): ToastContextValue;
1091
1187
  interface ToastCardProps {
1092
1188
  toast: ToastEntry;
@@ -1132,7 +1228,7 @@ interface SimpleTooltipProps {
1132
1228
  * (multiple triggers in a list, shared delay config), use the lower-level
1133
1229
  * `Tooltip` + `TooltipTrigger` + `TooltipContent` primitives.
1134
1230
  */
1135
- declare function SimpleTooltip({ content, children, side, delayDuration, }: SimpleTooltipProps): react_jsx_runtime.JSX.Element;
1231
+ declare function SimpleTooltip({ content, children, side, delayDuration, }: SimpleTooltipProps): react.JSX.Element;
1136
1232
 
1137
1233
  /**
1138
1234
  * Alert — inline messaging block. Four tones (accent / ok / warn / err) with a
@@ -1200,10 +1296,19 @@ declare const Banner: react.ForwardRefExoticComponent<BannerProps & react.RefAtt
1200
1296
  * the current page (rendered as plain text with `aria-current="page"`); earlier
1201
1297
  * crumbs render as links if `href` is provided. Pass `separator` to swap the
1202
1298
  * default `/` divider.
1299
+ *
1300
+ * Emits a schema.org `BreadcrumbList` JSON-LD script next to the `<nav>` so
1301
+ * crawlers and AI agents understand the trail without parsing the DOM. The
1302
+ * script auto-derives `position`/`name`/`item` from each `<Crumb>`'s `href`
1303
+ * and visible children; crumbs without a string label are skipped. Pass
1304
+ * `noStructuredData` to suppress emission entirely (consumers emitting their
1305
+ * own page-level structured data).
1203
1306
  */
1204
1307
  interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {
1205
1308
  /** Element to render between crumbs. Defaults to a dim `/`. */
1206
1309
  separator?: ReactNode;
1310
+ /** Opt out of emitting the `BreadcrumbList` JSON-LD script. */
1311
+ noStructuredData?: boolean;
1207
1312
  }
1208
1313
  declare const Breadcrumbs: react.ForwardRefExoticComponent<BreadcrumbsProps & react.RefAttributes<HTMLElement>>;
1209
1314
  interface CrumbProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -1371,6 +1476,113 @@ declare const CommandPalette: react.ForwardRefExoticComponent<CommandPaletteProp
1371
1476
  */
1372
1477
  declare function filterCommandItems(query: string, groups: ReadonlyArray<CommandPaletteGroup>): CommandPaletteGroup[];
1373
1478
 
1479
+ /**
1480
+ * ComparisonTable — option-vs-option matrix. Rows are features, columns are
1481
+ * options (products, plan tiers, spec sheets), cells are booleans (rendered as
1482
+ * check/cross with sr-only "Yes"/"No"), strings, numbers, or `{ value, note }`
1483
+ * objects for a primary value with a small footnote.
1484
+ *
1485
+ * Designed for AI/SEO consumption: emits a `<script type="application/ld+json">`
1486
+ * next to the table by default — one schema.org entity per option, with each
1487
+ * row contributing an `additionalProperty` `PropertyValue`. Pass `schema` to
1488
+ * change the `@type` (default `Product`), or `noStructuredData` to suppress
1489
+ * the script entirely.
1490
+ *
1491
+ * Semantic HTML: `<caption>` (sr-only), `<th scope="col">` for option headers,
1492
+ * `<th scope="row">` for feature names, optional `<tfoot>` for CTA actions.
1493
+ * Featured columns carry `data-featured="true"`; every cell carries
1494
+ * `data-cell-type` and (when meaningful) `data-cell-value` for crawlers and
1495
+ * scrapers that don't execute JS.
1496
+ */
1497
+ type ComparisonCellValue = boolean | string | number | {
1498
+ value: ReactNode;
1499
+ note?: ReactNode;
1500
+ };
1501
+ interface ComparisonOption {
1502
+ /** Stable key — must match the keys used in each `ComparisonRow.values`. */
1503
+ id: string;
1504
+ /** Visible column header. */
1505
+ name: ReactNode;
1506
+ /** Used as the JSON-LD `name` when `name` is JSX. Falls back to `name` if it's a string. */
1507
+ schemaName?: string;
1508
+ /**
1509
+ * Short description, rendered as a muted line under the name AND used as the
1510
+ * JSON-LD `description`.
1511
+ */
1512
+ description?: ReactNode;
1513
+ /** JSON-LD `url`. */
1514
+ url?: string;
1515
+ /**
1516
+ * Short eyebrow line rendered above the name (uppercase mono). Use for labels
1517
+ * like `STARTER` or `MOST POPULAR` that should live above the tier name
1518
+ * itself.
1519
+ */
1520
+ tagline?: ReactNode;
1521
+ /**
1522
+ * Inline glyph rendered before the name. Pass a `GlyphName` string for a
1523
+ * type-checked icon from the design-system manifest, or any `ReactNode` for
1524
+ * custom imagery (brand logos, avatars).
1525
+ */
1526
+ icon?: GlyphName | ReactNode;
1527
+ /** Highlight as the recommended option — accent-tinted column + auto badge. */
1528
+ featured?: boolean;
1529
+ /** Override the auto "recommended" badge. Set to `null` to suppress entirely. */
1530
+ badge?: ReactNode;
1531
+ /** Optional CTA rendered in a `<tfoot>` row when any option provides one. */
1532
+ action?: ReactNode;
1533
+ }
1534
+ interface ComparisonRow {
1535
+ /** Visible row header (`<th scope="row">`). */
1536
+ feature: ReactNode;
1537
+ /** Used as the JSON-LD `PropertyValue.name` when `feature` is JSX. */
1538
+ schemaName?: string;
1539
+ /** Small muted line rendered under the feature name. */
1540
+ description?: ReactNode;
1541
+ /** Optional grouping label — sibling rows with the same `group` cluster together. */
1542
+ group?: string;
1543
+ /** Cell values keyed by `ComparisonOption.id`. */
1544
+ values: Record<string, ComparisonCellValue | undefined>;
1545
+ }
1546
+ type ComparisonSchemaType = 'Product' | 'Service' | 'SoftwareApplication' | (string & {});
1547
+ interface ComparisonTableProps {
1548
+ /** Columns. */
1549
+ options: ReadonlyArray<ComparisonOption>;
1550
+ /** Rows. */
1551
+ rows: ReadonlyArray<ComparisonRow>;
1552
+ /** Visible-to-AT caption. Also used as the JSON-LD comparison `name`. */
1553
+ caption: ReactNode;
1554
+ /** schema.org `@type` per option in JSON-LD. Default `'Product'`. */
1555
+ schema?: ComparisonSchemaType;
1556
+ /** Opt out of emitting the JSON-LD `<script>`. */
1557
+ noStructuredData?: boolean;
1558
+ /** Visual density. Default `'comfortable'`. */
1559
+ density?: 'comfortable' | 'compact';
1560
+ /** Sticky table header (requires the table to live in a scroll container). */
1561
+ stickyHeader?: boolean;
1562
+ /**
1563
+ * Option-name text scale in the header. `'sm'` for dense spec sheets,
1564
+ * `'lg'` for marketing pricing-tier tables. Default `'md'`.
1565
+ */
1566
+ headerSize?: 'sm' | 'md' | 'lg';
1567
+ /**
1568
+ * Horizontal alignment for option columns — affects both the header cell
1569
+ * and data cells in option columns. The row-header (feature-name) column
1570
+ * always stays left-aligned. Default `'left'`.
1571
+ */
1572
+ headerAlign?: 'left' | 'center';
1573
+ /**
1574
+ * Lift the featured column visually: stronger header background, top + side
1575
+ * accent borders, larger padding, and a soft shadow. Pair with
1576
+ * `headerAlign="center"` and `headerSize="lg"` for a PricingCard-style tier
1577
+ * comparison.
1578
+ */
1579
+ prominentFeatured?: boolean;
1580
+ className?: string;
1581
+ }
1582
+ declare function ComparisonTable(props: ComparisonTableProps & {
1583
+ ref?: Ref<HTMLTableElement>;
1584
+ }): react.JSX.Element;
1585
+
1374
1586
  /**
1375
1587
  * DataTable — generic, sortable, selectable table. The component is a
1376
1588
  * "headless-with-defaults": you bring your data and column definitions, the
@@ -1423,7 +1635,7 @@ interface DataTableProps<T> {
1423
1635
  }
1424
1636
  declare function DataTable<T>(props: DataTableProps<T> & {
1425
1637
  ref?: Ref<HTMLTableElement>;
1426
- }): react_jsx_runtime.JSX.Element;
1638
+ }): react.JSX.Element;
1427
1639
 
1428
1640
  /** A `{from, to}` date range used by `Calendar` and `DateRangePicker`. */
1429
1641
  interface DateRange {
@@ -1590,9 +1802,10 @@ interface ListingCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'childre
1590
1802
  /**
1591
1803
  * Wrap the photo carousel past the boundaries (next from the last
1592
1804
  * photo goes to the first). Default `true` — marketplace photo
1593
- * browsing expects looping. Pass `false` to restore stop-at-end.
1805
+ * browsing expects looping. Pass `false` to restore stop-at-end, or
1806
+ * `'circular'` / `'sweep'` to pick the loop variant explicitly.
1594
1807
  */
1595
- loop?: boolean;
1808
+ loop?: boolean | 'circular' | 'sweep';
1596
1809
  /** Listing title — e.g. "Sun-soaked cabin in Marin". */
1597
1810
  title: ReactNode;
1598
1811
  /** Optional eyebrow text above the title (location, listing type). */
@@ -1647,6 +1860,32 @@ interface ListingCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'childre
1647
1860
  cta?: ListingCardCta;
1648
1861
  /** Hide the photo counter overlay in `spec` variant. Default `false`. */
1649
1862
  hidePhotoCounter?: boolean;
1863
+ /**
1864
+ * schema.org `@type` for the JSON-LD entity. Defaults to `'Accommodation'`
1865
+ * for the default variant and `'Product'` for the spec variant. Pass
1866
+ * `'Place'`, `'LodgingBusiness'`, or any string to override.
1867
+ */
1868
+ schema?: 'Accommodation' | 'Product' | 'Place' | 'LodgingBusiness' | (string & {});
1869
+ /**
1870
+ * ISO 4217 currency code (e.g. `'USD'`). REQUIRED to emit the `offers`
1871
+ * block — without it the offer is skipped (the rest of the entity still
1872
+ * emits if `title` resolves to a string).
1873
+ */
1874
+ priceCurrency?: string;
1875
+ /**
1876
+ * Explicit numeric price for JSON-LD. When omitted, parsed from the
1877
+ * visible `price` prop by stripping non-numeric characters. Pass this
1878
+ * when `price` is JSX or not cleanly parseable.
1879
+ */
1880
+ priceAmount?: number;
1881
+ /** Optional URL of the listing detail page — also emitted as the entity `url`. */
1882
+ url?: string;
1883
+ /** String version of `title` for the JSON-LD `name`. Required if `title` is JSX. */
1884
+ titleText?: string;
1885
+ /** String version of `eyebrow` for the JSON-LD `description`. */
1886
+ descriptionText?: string;
1887
+ /** Opt out of emitting the JSON-LD script. */
1888
+ noStructuredData?: boolean;
1650
1889
  /**
1651
1890
  * Per-section className overrides. Each key targets a specific element in
1652
1891
  * the rendered tree; values are merged with the component's own utilities
@@ -1751,9 +1990,11 @@ interface ListingDetailProps {
1751
1990
  * Wrap the gallery carousel and the fullscreen lightbox past the
1752
1991
  * boundaries (next from the last photo goes to the first). Default
1753
1992
  * `true` — marketplace photo browsing expects looping. One prop
1754
- * drives both surfaces.
1993
+ * drives both surfaces. Pass `'circular'` or `'sweep'` to pick the
1994
+ * gallery's loop variant explicitly; both forward as truthy to the
1995
+ * lightbox.
1755
1996
  */
1756
- loop?: boolean;
1997
+ loop?: boolean | 'circular' | 'sweep';
1757
1998
  /** Listing title — e.g. "Sun-soaked cabin in Marin". */
1758
1999
  title: ReactNode;
1759
2000
  /** Optional eyebrow above the title — listing type, location. */
@@ -1792,6 +2033,35 @@ interface ListingDetailProps {
1792
2033
  cta?: ListingCardCta;
1793
2034
  /** Hide the photo counter overlay in `spec` variant. Default `false`. */
1794
2035
  hidePhotoCounter?: boolean;
2036
+ /**
2037
+ * schema.org `@type` for the JSON-LD entity. Defaults to `'Accommodation'`
2038
+ * for the default variant and `'Product'` for the spec variant. Pass
2039
+ * `'Place'`, `'LodgingBusiness'`, or any custom string to override.
2040
+ */
2041
+ schema?: 'Accommodation' | 'Product' | 'Place' | 'LodgingBusiness' | (string & {});
2042
+ /**
2043
+ * ISO 4217 currency code (e.g. `'USD'`). REQUIRED to emit the `offers`
2044
+ * block — without it the offer is skipped (the rest of the entity still
2045
+ * emits if `title` resolves to a string).
2046
+ */
2047
+ priceCurrency?: string;
2048
+ /**
2049
+ * Explicit numeric price for JSON-LD. When omitted, parsed from the
2050
+ * visible `price` prop by stripping non-numeric characters.
2051
+ */
2052
+ priceAmount?: number;
2053
+ /** Listing detail URL, also emitted as the entity `url`. */
2054
+ url?: string;
2055
+ /** String version of `title` for the JSON-LD `name`. Required if `title` is JSX. */
2056
+ titleText?: string;
2057
+ /** String version of `description` for the JSON-LD `description`. */
2058
+ descriptionText?: string;
2059
+ /**
2060
+ * Opt out of emitting the JSON-LD `<script>`. The script renders as a
2061
+ * sibling of the Radix Dialog root (outside the Portal) so it appears in
2062
+ * the SSR'd HTML regardless of `open` state — crawlers see it always.
2063
+ */
2064
+ noStructuredData?: boolean;
1795
2065
  /**
1796
2066
  * Per-section className overrides. Each key targets a specific element
1797
2067
  * in the rendered tree; values are merged with the component's own
@@ -1932,6 +2202,14 @@ declare const PriceBreakdownLine: react.ForwardRefExoticComponent<PriceBreakdown
1932
2202
  * body, optional photos strip, and a `verified-trip` badge.
1933
2203
  *
1934
2204
  * Distinct from `Testimonial`, which is curated marketing chrome.
2205
+ *
2206
+ * Emits a schema.org `Review` JSON-LD entity by default. Pass `dateTime`
2207
+ * (ISO 8601 string or Date) to populate `datePublished` and emit a
2208
+ * machine-readable `<time dateTime>`; without it the visible `date` is
2209
+ * still rendered but `datePublished` is omitted. The review must point
2210
+ * at *something* — pass `itemReviewedName` (and optionally `url` of the
2211
+ * reviewed item) so Google's Rich Results Test accepts it as a valid
2212
+ * `Review`. Pass `noStructuredData` to suppress the JSON-LD script.
1935
2213
  */
1936
2214
  interface ReviewCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
1937
2215
  /** Reviewer display name. */
@@ -1942,6 +2220,13 @@ interface ReviewCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children
1942
2220
  rating: number;
1943
2221
  /** When set, renders as a Date — otherwise as a string. */
1944
2222
  date: ReactNode;
2223
+ /**
2224
+ * Machine-readable ISO 8601 string (or Date) for the review date. Emitted
2225
+ * as `<time dateTime="…">{date}</time>` and threaded into the JSON-LD
2226
+ * `datePublished` field. Backwards-compatible: when omitted the visible
2227
+ * `date` is rendered without a `dateTime` attribute.
2228
+ */
2229
+ dateTime?: string | Date;
1945
2230
  /** Review body. */
1946
2231
  body: ReactNode;
1947
2232
  /** Optional photo URLs (rendered as a horizontal strip). */
@@ -1950,6 +2235,19 @@ interface ReviewCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children
1950
2235
  verified?: boolean;
1951
2236
  /** Optional reviewer subtitle (location, member-since date). */
1952
2237
  subtitle?: ReactNode;
2238
+ /**
2239
+ * String version of `author` for the JSON-LD `author.name` field. Required
2240
+ * when `author` is JSX — without it the JSON-LD script is suppressed.
2241
+ */
2242
+ authorName?: string;
2243
+ /** String version of `body` for the JSON-LD `reviewBody`. */
2244
+ bodyText?: string;
2245
+ /** Name of the thing being reviewed (product, place, service). */
2246
+ itemReviewedName?: string;
2247
+ /** Optional URL of the reviewed item. */
2248
+ url?: string;
2249
+ /** Opt out of emitting the schema.org `Review` JSON-LD script. */
2250
+ noStructuredData?: boolean;
1953
2251
  }
1954
2252
  declare const ReviewCard: react.ForwardRefExoticComponent<ReviewCardProps & react.RefAttributes<HTMLDivElement>>;
1955
2253
 
@@ -2009,6 +2307,12 @@ interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>
2009
2307
  icon?: ReactNode;
2010
2308
  /** Title heading. */
2011
2309
  title: ReactNode;
2310
+ /**
2311
+ * Heading level for the title. Default `'h3'` — EmptyState typically lives
2312
+ * inside a section that already has an `h2`. Bump to `h2` for top-of-screen
2313
+ * "nothing here" states.
2314
+ */
2315
+ titleAs?: HeadingLevel;
2012
2316
  /** Body description. */
2013
2317
  description?: ReactNode;
2014
2318
  /** Optional primary action (e.g., a Button) below the description. */
@@ -2167,6 +2471,11 @@ declare const HealthScore: react.ForwardRefExoticComponent<HealthScoreProps & re
2167
2471
  interface LargeTitleProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
2168
2472
  /** Headline text. */
2169
2473
  title: ReactNode;
2474
+ /**
2475
+ * Heading level for the title. Default `'h1'` — this component is intended
2476
+ * as a screen-level header. Lower to `h2`/`h3` for nested usage.
2477
+ */
2478
+ titleAs?: HeadingLevel;
2170
2479
  /** Optional eyebrow label rendered above the title. Small, uppercase, mono. */
2171
2480
  eyebrow?: ReactNode;
2172
2481
  /** Optional right-aligned slot (avatar, settings button, etc.). */
@@ -2371,7 +2680,7 @@ type NavItemProps = NavItemBaseProps & (({
2371
2680
  } & Omit<HTMLAttributes<HTMLAnchorElement>, keyof NavItemBaseProps>) | ({
2372
2681
  href?: undefined;
2373
2682
  } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof NavItemBaseProps>));
2374
- declare const NavItem: react.ForwardRefExoticComponent<NavItemProps & react.RefAttributes<HTMLButtonElement | HTMLAnchorElement>>;
2683
+ declare const NavItem: react.ForwardRefExoticComponent<NavItemProps & react.RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
2375
2684
  interface NavSectionProps extends HTMLAttributes<HTMLDivElement> {
2376
2685
  /** Eyebrow heading. Rendered uppercase, mono, dim. */
2377
2686
  label: ReactNode;
@@ -2543,6 +2852,12 @@ interface TimelineEvent {
2543
2852
  description?: ReactNode;
2544
2853
  /** Time label rendered in mono. */
2545
2854
  time?: ReactNode;
2855
+ /**
2856
+ * Machine-readable ISO 8601 string or `Date` for the event. When set, the
2857
+ * visible `time` is wrapped in `<time dateTime="…">` so crawlers and AI
2858
+ * agents get a timestamp without parsing the label.
2859
+ */
2860
+ dateTime?: string | Date;
2546
2861
  /** Marker color tone. Defaults to `accent`. */
2547
2862
  tone?: TimelineEventTone;
2548
2863
  }
@@ -2555,6 +2870,11 @@ interface TimelineItemProps extends HTMLAttributes<HTMLLIElement> {
2555
2870
  tone?: TimelineEventTone;
2556
2871
  description?: ReactNode;
2557
2872
  time?: ReactNode;
2873
+ /**
2874
+ * Machine-readable ISO 8601 string or `Date`. When set, the visible `time`
2875
+ * is wrapped in `<time dateTime="…">`.
2876
+ */
2877
+ dateTime?: string | Date;
2558
2878
  }
2559
2879
  declare const TimelineItem: react.ForwardRefExoticComponent<TimelineItemProps & react.RefAttributes<HTMLLIElement>>;
2560
2880
 
@@ -2617,6 +2937,12 @@ declare const ActivityTimeline: react.ForwardRefExoticComponent<ActivityTimeline
2617
2937
  interface TopbarProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
2618
2938
  /** Title rendered on the left. */
2619
2939
  title?: ReactNode;
2940
+ /**
2941
+ * Heading level for the page title. Default `'h1'` on touch density (mobile
2942
+ * page header) and `'h2'` on desktop density (in-app chrome where the page
2943
+ * `h1` typically lives in a separate hero/content area).
2944
+ */
2945
+ titleAs?: HeadingLevel;
2620
2946
  /**
2621
2947
  * Eyebrow label rendered above the title (small uppercase mono). Touch density
2622
2948
  * only — silently ignored on desktop density to avoid two header tiers stacking.
@@ -2740,4 +3066,4 @@ interface WizardDialogProps {
2740
3066
  }
2741
3067
  declare const WizardDialog: react.ForwardRefExoticComponent<WizardDialogProps & react.RefAttributes<HTMLDivElement>>;
2742
3068
 
2743
- export { Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, type ActivityActor, type ActivityEvent, ActivityTimeline, type ActivityTimelineProps, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, type AlertDialogProps, AlertDialogRoot, AlertDialogTrigger, type AlertProps, type AlertTone, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize, type AvatarStatus, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, Breadcrumbs, type BreadcrumbsProps, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, Calendar, type CalendarProps, Card, CardLink, type CardLinkProps, type CardProps, Carousel, type CarouselProps, Checkbox, type CheckboxProps, Chip, type ChipProps, Combobox, type ComboboxOption, type ComboboxProps, CommandPalette, type CommandPaletteGroup, type CommandPaletteItem, type CommandPaletteProps, ContextMenu, ContextMenuContent, ContextMenuItem, type ContextMenuItemProps, ContextMenuPortal, ContextMenuRoot, ContextMenuSeparator, ContextMenuTrigger, Crumb, type CrumbProps, DataTable, type DataTableColumn, type DataTableProps, type DataTableSort, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, Dialog, DialogClose, DialogContent, type DialogContentProps, DialogOverlay, DialogPortal, type DialogProps, DialogRoot, DialogTrigger, Dots, type DotsProps, Drawer, type DrawerProps, type DrawerSide, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRoot, DropdownMenuTrigger, Dropzone, type DropzoneProps, EmptyState, type EmptyStateProps, FAB, type FABProps, Field, type FieldProps, FileChip, type FileChipProps, type FilterFacet, type FilterFacetOption, FilterPanel, type FilterPanelProps, type FilterPanelValue, HealthScore, type HealthScoreBreakdownEntry, type HealthScoreProps, HoverCard, HoverCardContent, HoverCardPortal, type HoverCardProps, HoverCardRoot, HoverCardTrigger, IconButton, type IconButtonProps, InlineEdit, type InlineEditHandle, type InlineEditProps, Input, type InputProps, Kbd, type KbdProps, LargeTitle, type LargeTitleProps, Lightbox, type LightboxProps, ListingCard, type ListingCardCta, type ListingCardFlag, type ListingCardProps, type ListingCardSpec, type ListingCardVariant, ListingDetail, type ListingDetailAction, type ListingDetailFeature, type ListingDetailHost, type ListingDetailProps, type ListingDetailVariant, MenuCheckboxItem, MenuItem, type MenuItemProps, MenuSeparator, Menubar, MenubarContent, MenubarItem, type MenubarItemProps, MenubarMenu, MenubarSeparator, MenubarTrigger, NavBar, type NavBarItem, type NavBarOrientation, type NavBarProps, NavItem, type NavItemProps, NavSection, type NavSectionProps, type NormalizedOption, NumberInput, type NumberInputProps, OTP, type OTPHandle, type OTPProps, OnboardingChecklist, type OnboardingChecklistProps, type OnboardingItem, type OnboardingItemStatus, Pagination, type PaginationProps, type PhoneCountry, PhoneInput, type PhoneInputProps, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger, PriceBreakdown, type PriceBreakdownItem, PriceBreakdownLine, type PriceBreakdownLineProps, type PriceBreakdownProps, Progress, type ProgressProps, PullToRefresh, type PullToRefreshProps, type PullToRefreshState, RadialProgress, type RadialProgressProps, type RadialTone, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, ReviewCard, type ReviewCardProps, ScrollArea, type ScrollAreaProps, type ScrollAreaType, SearchInput, type SearchInputProps, SegmentedControl, type SegmentedControlOption, type SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectTrigger, SelectValue, Sheet, type SheetProps, Sidebar, type SidebarProps, SimpleTooltip, type SimpleTooltipProps, Skeleton, SkeletonGroup, type SkeletonGroupProps, type SkeletonProps, Slider, type SliderProps, Sparkline, type SparklineProps, Spinner, type SpinnerProps, SplitButton, type SplitButtonProps, StatCard, type StatCardProps, type StatTrend, StatusDot, type StatusDotProps, type StatusState, type StepState, Stepper, type StepperProps, type StepperStep, Switch, type SwitchProps, Tab, TabBar, type TabBarItem, type TabBarProps, type TabProps, Tabs, TabsContent, TabsList, type TabsProps, type TabsVariantProps, Tag, type TagProps, Textarea, type TextareaProps, type Theme, Timeline, type TimelineEvent, type TimelineEventTone, TimelineItem, type TimelineItemProps, type TimelineProps, ToastCard, type ToastInput, ToastProvider, type ToastVariant, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Topbar, type TopbarProps, Tree, type TreeItem, type TreeProps, type UseControllableStateProps, type UseKeyboardListOptions, type UseKeyboardListResult, type WizardContext, WizardDialog, type WizardDialogProps, type WizardStep, badgeStyles, buttonStyles, cardStyles, cn, filterCommandItems, formatRelative, iconButtonStyles, phoneCountries, useControllableState, useDisclosure, useEscape, useIsomorphicLayoutEffect, useKeyboardList, useOutsideClick, useTheme, useToast };
3069
+ export { Accordion, AccordionContent, type AccordionContentProps, AccordionItem, type AccordionItemProps, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, type ActivityActor, type ActivityEvent, ActivityTimeline, type ActivityTimelineProps, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, type AlertDialogProps, AlertDialogRoot, AlertDialogTrigger, type AlertProps, type AlertTone, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize, type AvatarStatus, Badge, type BadgeProps, Banner, type BannerProps, type BannerTone, Breadcrumbs, type BreadcrumbsProps, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, Calendar, type CalendarProps, Card, CardLink, type CardLinkProps, type CardProps, Carousel, type CarouselProps, Checkbox, type CheckboxProps, Chip, type ChipProps, Combobox, type ComboboxOption, type ComboboxProps, CommandPalette, type CommandPaletteGroup, type CommandPaletteItem, type CommandPaletteProps, type ComparisonCellValue, type ComparisonOption, type ComparisonRow, type ComparisonSchemaType, ComparisonTable, type ComparisonTableProps, ContextMenu, ContextMenuContent, ContextMenuItem, type ContextMenuItemProps, ContextMenuPortal, ContextMenuRoot, ContextMenuSeparator, ContextMenuTrigger, Crumb, type CrumbProps, DataTable, type DataTableColumn, type DataTableProps, type DataTableSort, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, DateTime, type DateTimeProps, Dialog, DialogClose, DialogContent, type DialogContentProps, DialogOverlay, DialogPortal, type DialogProps, DialogRoot, DialogTrigger, Dots, type DotsProps, Drawer, type DrawerProps, type DrawerSide, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRoot, DropdownMenuTrigger, Dropzone, type DropzoneProps, EmptyState, type EmptyStateProps, FAB, type FABProps, Field, type FieldProps, FileChip, type FileChipProps, type FilterFacet, type FilterFacetOption, FilterPanel, type FilterPanelProps, type FilterPanelValue, Heading, type HeadingLevel, type HeadingProps, HealthScore, type HealthScoreBreakdownEntry, type HealthScoreProps, HoverCard, HoverCardContent, HoverCardPortal, type HoverCardProps, HoverCardRoot, HoverCardTrigger, IconButton, type IconButtonProps, InlineEdit, type InlineEditHandle, type InlineEditProps, Input, type InputProps, JsonLd, type JsonLdProps, Kbd, type KbdProps, LargeTitle, type LargeTitleProps, Lightbox, type LightboxProps, ListingCard, type ListingCardCta, type ListingCardFlag, type ListingCardProps, type ListingCardSpec, type ListingCardVariant, ListingDetail, type ListingDetailAction, type ListingDetailFeature, type ListingDetailHost, type ListingDetailProps, type ListingDetailVariant, MenuCheckboxItem, MenuItem, type MenuItemProps, MenuSeparator, Menubar, MenubarContent, MenubarItem, type MenubarItemProps, MenubarMenu, MenubarSeparator, MenubarTrigger, NavBar, type NavBarItem, type NavBarOrientation, type NavBarProps, NavItem, type NavItemProps, NavSection, type NavSectionProps, type NormalizedOption, NumberInput, type NumberInputProps, OTP, type OTPHandle, type OTPProps, OnboardingChecklist, type OnboardingChecklistProps, type OnboardingItem, type OnboardingItemStatus, Pagination, type PaginationProps, type PhoneCountry, PhoneInput, type PhoneInputProps, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger, PriceBreakdown, type PriceBreakdownItem, PriceBreakdownLine, type PriceBreakdownLineProps, type PriceBreakdownProps, Progress, type ProgressProps, PullToRefresh, type PullToRefreshProps, type PullToRefreshState, RadialProgress, type RadialProgressProps, type RadialTone, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, ReviewCard, type ReviewCardProps, ScrollArea, type ScrollAreaProps, type ScrollAreaType, SearchInput, type SearchInputProps, SegmentedControl, type SegmentedControlOption, type SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectTrigger, SelectValue, Sheet, type SheetProps, Sidebar, type SidebarProps, SimpleTooltip, type SimpleTooltipProps, Skeleton, SkeletonGroup, type SkeletonGroupProps, type SkeletonProps, Slider, type SliderProps, Sparkline, type SparklineProps, Spinner, type SpinnerProps, SplitButton, type SplitButtonProps, StatCard, type StatCardProps, type StatTrend, StatusDot, type StatusDotProps, type StatusState, type StepState, Stepper, type StepperProps, type StepperStep, Switch, type SwitchProps, Tab, TabBar, type TabBarItem, type TabBarProps, type TabProps, Tabs, TabsContent, TabsList, type TabsProps, type TabsVariantProps, Tag, type TagProps, Textarea, type TextareaProps, type Theme, Timeline, type TimelineEvent, type TimelineEventTone, TimelineItem, type TimelineItemProps, type TimelineProps, ToastCard, type ToastInput, ToastProvider, type ToastVariant, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Topbar, type TopbarProps, Tree, type TreeItem, type TreeProps, type UseControllableStateProps, type UseKeyboardListOptions, type UseKeyboardListResult, type WizardContext, WizardDialog, type WizardDialogProps, type WizardStep, badgeStyles, buttonStyles, cardStyles, cn, filterCommandItems, formatRelative, iconButtonStyles, nodeToString, phoneCountries, toIsoString, useControllableState, useDisclosure, useEscape, useIsomorphicLayoutEffect, useKeyboardList, useOutsideClick, useTheme, useToast };