@ship-it-ui/shipit 0.0.14 → 0.0.16

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.cts CHANGED
@@ -1,8 +1,7 @@
1
- import { BadgeProps, DataTableProps, DataTableColumn } from '@ship-it-ui/ui';
1
+ import { BadgeProps, HeadingLevel, DataTableProps, DataTableColumn } from '@ship-it-ui/ui';
2
2
  export { cn } from '@ship-it-ui/ui';
3
3
  import * as react from 'react';
4
4
  import { HTMLAttributes, ReactNode, ButtonHTMLAttributes, MouseEventHandler, SVGAttributes, Ref } from 'react';
5
- import * as react_jsx_runtime from 'react/jsx-runtime';
6
5
  import { ConnectorName } from '@ship-it-ui/icons';
7
6
 
8
7
  /**
@@ -403,7 +402,7 @@ interface EntityListRowProps extends Omit<HTMLAttributes<HTMLElement>, 'title' |
403
402
  * supplied, otherwise `EntityListRowDiv`. Does not forward refs — when you
404
403
  * need a typed ref, reach for the specialized component directly.
405
404
  */
406
- declare function EntityListRow({ type, name, relation, meta, hideGlyph, actions, onClick, className, ...props }: EntityListRowProps): react_jsx_runtime.JSX.Element;
405
+ declare function EntityListRow({ type, name, relation, meta, hideGlyph, actions, onClick, className, ...props }: EntityListRowProps): react.JSX.Element;
407
406
  declare namespace EntityListRow {
408
407
  var displayName: string;
409
408
  }
@@ -568,6 +567,12 @@ declare const PathOverlay: react.ForwardRefExoticComponent<PathOverlayProps & re
568
567
  */
569
568
  interface CTAStripProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
570
569
  title: ReactNode;
570
+ /**
571
+ * Heading level for the title. Default `'h2'`. Marketing pages typically
572
+ * place a CTAStrip between sections, so an `h2` matches the section
573
+ * hierarchy under the page `h1`.
574
+ */
575
+ titleAs?: HeadingLevel;
571
576
  description?: ReactNode;
572
577
  actions?: ReactNode;
573
578
  }
@@ -586,12 +591,23 @@ interface FeatureGridProps extends HTMLAttributes<HTMLDivElement> {
586
591
  features: ReadonlyArray<Feature>;
587
592
  /** Columns at the largest breakpoint. Default 3. */
588
593
  columns?: 2 | 3 | 4;
594
+ /**
595
+ * Heading level for each feature's title. Default `'h3'` — features sit
596
+ * under a section `h2` on most marketing pages.
597
+ */
598
+ featureTitleAs?: HeadingLevel;
589
599
  }
590
600
  declare const FeatureGrid: react.ForwardRefExoticComponent<FeatureGridProps & react.RefAttributes<HTMLDivElement>>;
591
601
 
592
602
  /**
593
603
  * Footer — site footer with brand on the left and grouped link columns on
594
604
  * the right, plus a copyright line below a divider.
605
+ *
606
+ * Each link column is rendered as a proper `<ul>` of `<li>` link rows so
607
+ * search engines pick up the footer-nav hierarchy correctly. Pass
608
+ * `address` for a contact block that renders inside `<address>` (the
609
+ * semantic element for organization contact info — improves local SEO and
610
+ * structured-data extraction).
595
611
  */
596
612
  interface FooterLink {
597
613
  label: ReactNode;
@@ -609,12 +625,18 @@ interface FooterProps extends HTMLAttributes<HTMLElement> {
609
625
  copyright?: ReactNode;
610
626
  /** Right-side closing line (e.g., `made with care · san francisco`). */
611
627
  closing?: ReactNode;
628
+ /**
629
+ * Optional contact / address block. Rendered inside `<address>` next to the
630
+ * brand for org contact info (phone, email, mailing address).
631
+ */
632
+ address?: ReactNode;
612
633
  }
613
634
  declare const Footer: react.ForwardRefExoticComponent<FooterProps & react.RefAttributes<HTMLElement>>;
614
635
 
615
636
  /**
616
637
  * Hero — landing-page top section. Optional eyebrow / pill above the headline,
617
- * a large heading (children of `<h1>`), a body description, and an action row.
638
+ * a large heading (children of `<h1>` by default), a body description, and an
639
+ * action row.
618
640
  *
619
641
  * Designed for marketing surfaces only — do not bring this into the app.
620
642
  */
@@ -623,6 +645,12 @@ interface HeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
623
645
  eyebrow?: ReactNode;
624
646
  /** Headline. Pass JSX to highlight a phrase (e.g., `<span className="text-accent">…</span>`). */
625
647
  title: ReactNode;
648
+ /**
649
+ * Heading level for the title. Default `'h1'` — only override on pages that
650
+ * already have an `<h1>` elsewhere (e.g., a section hero inside a longer
651
+ * landing page).
652
+ */
653
+ titleAs?: HeadingLevel;
626
654
  /** Subheading. */
627
655
  description?: ReactNode;
628
656
  /** Action buttons row. */
@@ -645,6 +673,12 @@ declare const Hero: react.ForwardRefExoticComponent<HeroProps & react.RefAttribu
645
673
  * background for the "recommended" tier. Use `priceUnit` for per-period
646
674
  * suffixes (e.g. `/ user / mo`) so the unit lays out next to the price
647
675
  * baseline-aligned and wraps cleanly when there isn't room.
676
+ *
677
+ * Emits a schema.org `Offer` JSON-LD entity when `priceCurrency` is
678
+ * provided AND a numeric `priceAmount` (or a parseable `price` string like
679
+ * `"$29"`) is supplied. Cards where the price isn't machine-readable
680
+ * (e.g. `"Talk to us"`) skip JSON-LD emission unless the consumer passes
681
+ * `priceAmount` explicitly. Pass `noStructuredData` to opt out entirely.
648
682
  */
649
683
  interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {
650
684
  /** Tier name — e.g., `Pro`, `Team`. */
@@ -661,12 +695,46 @@ interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {
661
695
  action?: ReactNode;
662
696
  /** Highlight as the recommended tier. */
663
697
  featured?: boolean;
698
+ /**
699
+ * Heading level for the tier name. Default `'h3'` — pricing tables live
700
+ * under a section `h2` on most pricing pages.
701
+ */
702
+ tierAs?: HeadingLevel;
703
+ /**
704
+ * ISO 4217 currency code (e.g. `'USD'`, `'EUR'`). REQUIRED to emit the
705
+ * `Offer` JSON-LD — without it the script is suppressed.
706
+ */
707
+ priceCurrency?: string;
708
+ /**
709
+ * Explicit machine-readable price (number). When omitted, parsed from the
710
+ * visible `price` string by stripping non-numeric characters. Pass this
711
+ * directly when `price` is JSX or contains unusual formatting.
712
+ */
713
+ priceAmount?: number;
714
+ /**
715
+ * schema.org `availability` URL, typically `'https://schema.org/InStock'`.
716
+ */
717
+ availability?: string;
718
+ /** Optional URL of the tier's product/checkout page. */
719
+ url?: string;
720
+ /** String version of `tier` for the JSON-LD `name`. Required if `tier` is JSX. */
721
+ tierName?: string;
722
+ /** String version of `description` for the JSON-LD `description`. */
723
+ descriptionText?: string;
724
+ /** Opt out of emitting the `Offer` JSON-LD script. */
725
+ noStructuredData?: boolean;
664
726
  }
665
727
  declare const PricingCard: react.ForwardRefExoticComponent<PricingCardProps & react.RefAttributes<HTMLDivElement>>;
666
728
 
667
729
  /**
668
730
  * Testimonial — pull-quote with author + role. Centered for marketing
669
731
  * surfaces.
732
+ *
733
+ * Emits a schema.org `Review` JSON-LD entity by default. Pass `rating`
734
+ * (1–5) for `reviewRating` and `itemReviewedName` (plus optional `url`)
735
+ * for `itemReviewed` to make the JSON-LD eligible for Google's Review
736
+ * rich results. Without those it still emits a minimal `Review`. Pass
737
+ * `noStructuredData` to suppress the JSON-LD script entirely.
670
738
  */
671
739
  interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'role'> {
672
740
  /** The quoted body. */
@@ -677,6 +745,23 @@ interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'r
677
745
  role?: ReactNode;
678
746
  /** Avatar initials or full node. */
679
747
  avatar?: ReactNode;
748
+ /**
749
+ * String version of `quote` for the JSON-LD `reviewBody` field. Required
750
+ * when `quote` is JSX — without it the JSON-LD script is suppressed.
751
+ */
752
+ quoteText?: string;
753
+ /** String version of `author` for the JSON-LD `author.name`. */
754
+ authorName?: string;
755
+ /** String version of `role` for the JSON-LD `author.jobTitle`. */
756
+ authorJobTitle?: string;
757
+ /** Star rating (1–5). When provided, emitted as `reviewRating`. */
758
+ rating?: number;
759
+ /** Name of the thing being endorsed (product / service / company). */
760
+ itemReviewedName?: string;
761
+ /** Optional URL of the thing being endorsed. */
762
+ url?: string;
763
+ /** Opt out of emitting the schema.org `Review` JSON-LD script. */
764
+ noStructuredData?: boolean;
680
765
  }
681
766
  declare const Testimonial: react.ForwardRefExoticComponent<TestimonialProps & react.RefAttributes<HTMLElement>>;
682
767
 
@@ -688,6 +773,11 @@ declare const Testimonial: react.ForwardRefExoticComponent<TestimonialProps & re
688
773
  *
689
774
  * When `onClick` is provided the whole card becomes a button; otherwise it
690
775
  * renders as a plain `<div>`.
776
+ *
777
+ * Emits a schema.org `SoftwareApplication` JSON-LD entity by default with
778
+ * `name`, `dateModified` (from `lastSyncedAt`), and consumer-supplied
779
+ * `applicationCategory` / `url` / `softwareVersion`. Skipped when `name` is
780
+ * JSX without a string fallback. Pass `noStructuredData` to suppress.
691
781
  */
692
782
  type ConnectorStatus = 'connected' | 'syncing' | 'error' | 'disconnected';
693
783
  interface ConnectorCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'onClick'> {
@@ -713,6 +803,16 @@ interface ConnectorCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title
713
803
  * `button-name`). Optional otherwise.
714
804
  */
715
805
  accessibleName?: string;
806
+ /** String version of `name` for the JSON-LD `name` field. */
807
+ nameText?: string;
808
+ /** schema.org `applicationCategory` (e.g. `'CRM'`, `'DataConnector'`). */
809
+ applicationCategory?: string;
810
+ /** Connector detail URL — emitted as the entity `url`. */
811
+ url?: string;
812
+ /** Optional `softwareVersion` string. */
813
+ softwareVersion?: string;
814
+ /** Opt out of emitting the `SoftwareApplication` JSON-LD script. */
815
+ noStructuredData?: boolean;
716
816
  }
717
817
  declare const ConnectorCard: react.ForwardRefExoticComponent<ConnectorCardProps & react.RefAttributes<HTMLDivElement>>;
718
818
 
@@ -732,7 +832,7 @@ type EntityTableProps<T extends MinimalEntity> = Omit<DataTableProps<T>, 'rowKey
732
832
  };
733
833
  declare function EntityTable<T extends MinimalEntity>(props: EntityTableProps<T> & {
734
834
  ref?: Ref<HTMLTableElement>;
735
- }): react_jsx_runtime.JSX.Element;
835
+ }): react.JSX.Element;
736
836
  /**
737
837
  * Pre-built column for the entity name. Renders the type glyph (in the type's
738
838
  * tone) followed by the name in mono. Sorts on `name`.
@@ -767,6 +867,12 @@ interface NotifRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
767
867
  body?: ReactNode;
768
868
  /** Right-aligned relative time string (e.g. `9:32`, `Mon`). */
769
869
  time?: ReactNode;
870
+ /**
871
+ * Machine-readable ISO 8601 string or `Date` for the notification's
872
+ * timestamp. When set, the visible `time` is wrapped in
873
+ * `<time dateTime="…">` so the row is crawlable / AI-readable.
874
+ */
875
+ dateTime?: string | Date;
770
876
  /** Coloring of the unread dot. */
771
877
  tone?: NotifTone;
772
878
  /** When true, render the unread dot. */
package/dist/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- import { BadgeProps, DataTableProps, DataTableColumn } from '@ship-it-ui/ui';
1
+ import { BadgeProps, HeadingLevel, DataTableProps, DataTableColumn } from '@ship-it-ui/ui';
2
2
  export { cn } from '@ship-it-ui/ui';
3
3
  import * as react from 'react';
4
4
  import { HTMLAttributes, ReactNode, ButtonHTMLAttributes, MouseEventHandler, SVGAttributes, Ref } from 'react';
5
- import * as react_jsx_runtime from 'react/jsx-runtime';
6
5
  import { ConnectorName } from '@ship-it-ui/icons';
7
6
 
8
7
  /**
@@ -403,7 +402,7 @@ interface EntityListRowProps extends Omit<HTMLAttributes<HTMLElement>, 'title' |
403
402
  * supplied, otherwise `EntityListRowDiv`. Does not forward refs — when you
404
403
  * need a typed ref, reach for the specialized component directly.
405
404
  */
406
- declare function EntityListRow({ type, name, relation, meta, hideGlyph, actions, onClick, className, ...props }: EntityListRowProps): react_jsx_runtime.JSX.Element;
405
+ declare function EntityListRow({ type, name, relation, meta, hideGlyph, actions, onClick, className, ...props }: EntityListRowProps): react.JSX.Element;
407
406
  declare namespace EntityListRow {
408
407
  var displayName: string;
409
408
  }
@@ -568,6 +567,12 @@ declare const PathOverlay: react.ForwardRefExoticComponent<PathOverlayProps & re
568
567
  */
569
568
  interface CTAStripProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
570
569
  title: ReactNode;
570
+ /**
571
+ * Heading level for the title. Default `'h2'`. Marketing pages typically
572
+ * place a CTAStrip between sections, so an `h2` matches the section
573
+ * hierarchy under the page `h1`.
574
+ */
575
+ titleAs?: HeadingLevel;
571
576
  description?: ReactNode;
572
577
  actions?: ReactNode;
573
578
  }
@@ -586,12 +591,23 @@ interface FeatureGridProps extends HTMLAttributes<HTMLDivElement> {
586
591
  features: ReadonlyArray<Feature>;
587
592
  /** Columns at the largest breakpoint. Default 3. */
588
593
  columns?: 2 | 3 | 4;
594
+ /**
595
+ * Heading level for each feature's title. Default `'h3'` — features sit
596
+ * under a section `h2` on most marketing pages.
597
+ */
598
+ featureTitleAs?: HeadingLevel;
589
599
  }
590
600
  declare const FeatureGrid: react.ForwardRefExoticComponent<FeatureGridProps & react.RefAttributes<HTMLDivElement>>;
591
601
 
592
602
  /**
593
603
  * Footer — site footer with brand on the left and grouped link columns on
594
604
  * the right, plus a copyright line below a divider.
605
+ *
606
+ * Each link column is rendered as a proper `<ul>` of `<li>` link rows so
607
+ * search engines pick up the footer-nav hierarchy correctly. Pass
608
+ * `address` for a contact block that renders inside `<address>` (the
609
+ * semantic element for organization contact info — improves local SEO and
610
+ * structured-data extraction).
595
611
  */
596
612
  interface FooterLink {
597
613
  label: ReactNode;
@@ -609,12 +625,18 @@ interface FooterProps extends HTMLAttributes<HTMLElement> {
609
625
  copyright?: ReactNode;
610
626
  /** Right-side closing line (e.g., `made with care · san francisco`). */
611
627
  closing?: ReactNode;
628
+ /**
629
+ * Optional contact / address block. Rendered inside `<address>` next to the
630
+ * brand for org contact info (phone, email, mailing address).
631
+ */
632
+ address?: ReactNode;
612
633
  }
613
634
  declare const Footer: react.ForwardRefExoticComponent<FooterProps & react.RefAttributes<HTMLElement>>;
614
635
 
615
636
  /**
616
637
  * Hero — landing-page top section. Optional eyebrow / pill above the headline,
617
- * a large heading (children of `<h1>`), a body description, and an action row.
638
+ * a large heading (children of `<h1>` by default), a body description, and an
639
+ * action row.
618
640
  *
619
641
  * Designed for marketing surfaces only — do not bring this into the app.
620
642
  */
@@ -623,6 +645,12 @@ interface HeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
623
645
  eyebrow?: ReactNode;
624
646
  /** Headline. Pass JSX to highlight a phrase (e.g., `<span className="text-accent">…</span>`). */
625
647
  title: ReactNode;
648
+ /**
649
+ * Heading level for the title. Default `'h1'` — only override on pages that
650
+ * already have an `<h1>` elsewhere (e.g., a section hero inside a longer
651
+ * landing page).
652
+ */
653
+ titleAs?: HeadingLevel;
626
654
  /** Subheading. */
627
655
  description?: ReactNode;
628
656
  /** Action buttons row. */
@@ -645,6 +673,12 @@ declare const Hero: react.ForwardRefExoticComponent<HeroProps & react.RefAttribu
645
673
  * background for the "recommended" tier. Use `priceUnit` for per-period
646
674
  * suffixes (e.g. `/ user / mo`) so the unit lays out next to the price
647
675
  * baseline-aligned and wraps cleanly when there isn't room.
676
+ *
677
+ * Emits a schema.org `Offer` JSON-LD entity when `priceCurrency` is
678
+ * provided AND a numeric `priceAmount` (or a parseable `price` string like
679
+ * `"$29"`) is supplied. Cards where the price isn't machine-readable
680
+ * (e.g. `"Talk to us"`) skip JSON-LD emission unless the consumer passes
681
+ * `priceAmount` explicitly. Pass `noStructuredData` to opt out entirely.
648
682
  */
649
683
  interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {
650
684
  /** Tier name — e.g., `Pro`, `Team`. */
@@ -661,12 +695,46 @@ interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {
661
695
  action?: ReactNode;
662
696
  /** Highlight as the recommended tier. */
663
697
  featured?: boolean;
698
+ /**
699
+ * Heading level for the tier name. Default `'h3'` — pricing tables live
700
+ * under a section `h2` on most pricing pages.
701
+ */
702
+ tierAs?: HeadingLevel;
703
+ /**
704
+ * ISO 4217 currency code (e.g. `'USD'`, `'EUR'`). REQUIRED to emit the
705
+ * `Offer` JSON-LD — without it the script is suppressed.
706
+ */
707
+ priceCurrency?: string;
708
+ /**
709
+ * Explicit machine-readable price (number). When omitted, parsed from the
710
+ * visible `price` string by stripping non-numeric characters. Pass this
711
+ * directly when `price` is JSX or contains unusual formatting.
712
+ */
713
+ priceAmount?: number;
714
+ /**
715
+ * schema.org `availability` URL, typically `'https://schema.org/InStock'`.
716
+ */
717
+ availability?: string;
718
+ /** Optional URL of the tier's product/checkout page. */
719
+ url?: string;
720
+ /** String version of `tier` for the JSON-LD `name`. Required if `tier` is JSX. */
721
+ tierName?: string;
722
+ /** String version of `description` for the JSON-LD `description`. */
723
+ descriptionText?: string;
724
+ /** Opt out of emitting the `Offer` JSON-LD script. */
725
+ noStructuredData?: boolean;
664
726
  }
665
727
  declare const PricingCard: react.ForwardRefExoticComponent<PricingCardProps & react.RefAttributes<HTMLDivElement>>;
666
728
 
667
729
  /**
668
730
  * Testimonial — pull-quote with author + role. Centered for marketing
669
731
  * surfaces.
732
+ *
733
+ * Emits a schema.org `Review` JSON-LD entity by default. Pass `rating`
734
+ * (1–5) for `reviewRating` and `itemReviewedName` (plus optional `url`)
735
+ * for `itemReviewed` to make the JSON-LD eligible for Google's Review
736
+ * rich results. Without those it still emits a minimal `Review`. Pass
737
+ * `noStructuredData` to suppress the JSON-LD script entirely.
670
738
  */
671
739
  interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'role'> {
672
740
  /** The quoted body. */
@@ -677,6 +745,23 @@ interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'r
677
745
  role?: ReactNode;
678
746
  /** Avatar initials or full node. */
679
747
  avatar?: ReactNode;
748
+ /**
749
+ * String version of `quote` for the JSON-LD `reviewBody` field. Required
750
+ * when `quote` is JSX — without it the JSON-LD script is suppressed.
751
+ */
752
+ quoteText?: string;
753
+ /** String version of `author` for the JSON-LD `author.name`. */
754
+ authorName?: string;
755
+ /** String version of `role` for the JSON-LD `author.jobTitle`. */
756
+ authorJobTitle?: string;
757
+ /** Star rating (1–5). When provided, emitted as `reviewRating`. */
758
+ rating?: number;
759
+ /** Name of the thing being endorsed (product / service / company). */
760
+ itemReviewedName?: string;
761
+ /** Optional URL of the thing being endorsed. */
762
+ url?: string;
763
+ /** Opt out of emitting the schema.org `Review` JSON-LD script. */
764
+ noStructuredData?: boolean;
680
765
  }
681
766
  declare const Testimonial: react.ForwardRefExoticComponent<TestimonialProps & react.RefAttributes<HTMLElement>>;
682
767
 
@@ -688,6 +773,11 @@ declare const Testimonial: react.ForwardRefExoticComponent<TestimonialProps & re
688
773
  *
689
774
  * When `onClick` is provided the whole card becomes a button; otherwise it
690
775
  * renders as a plain `<div>`.
776
+ *
777
+ * Emits a schema.org `SoftwareApplication` JSON-LD entity by default with
778
+ * `name`, `dateModified` (from `lastSyncedAt`), and consumer-supplied
779
+ * `applicationCategory` / `url` / `softwareVersion`. Skipped when `name` is
780
+ * JSX without a string fallback. Pass `noStructuredData` to suppress.
691
781
  */
692
782
  type ConnectorStatus = 'connected' | 'syncing' | 'error' | 'disconnected';
693
783
  interface ConnectorCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'onClick'> {
@@ -713,6 +803,16 @@ interface ConnectorCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title
713
803
  * `button-name`). Optional otherwise.
714
804
  */
715
805
  accessibleName?: string;
806
+ /** String version of `name` for the JSON-LD `name` field. */
807
+ nameText?: string;
808
+ /** schema.org `applicationCategory` (e.g. `'CRM'`, `'DataConnector'`). */
809
+ applicationCategory?: string;
810
+ /** Connector detail URL — emitted as the entity `url`. */
811
+ url?: string;
812
+ /** Optional `softwareVersion` string. */
813
+ softwareVersion?: string;
814
+ /** Opt out of emitting the `SoftwareApplication` JSON-LD script. */
815
+ noStructuredData?: boolean;
716
816
  }
717
817
  declare const ConnectorCard: react.ForwardRefExoticComponent<ConnectorCardProps & react.RefAttributes<HTMLDivElement>>;
718
818
 
@@ -732,7 +832,7 @@ type EntityTableProps<T extends MinimalEntity> = Omit<DataTableProps<T>, 'rowKey
732
832
  };
733
833
  declare function EntityTable<T extends MinimalEntity>(props: EntityTableProps<T> & {
734
834
  ref?: Ref<HTMLTableElement>;
735
- }): react_jsx_runtime.JSX.Element;
835
+ }): react.JSX.Element;
736
836
  /**
737
837
  * Pre-built column for the entity name. Renders the type glyph (in the type's
738
838
  * tone) followed by the name in mono. Sorts on `name`.
@@ -767,6 +867,12 @@ interface NotifRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
767
867
  body?: ReactNode;
768
868
  /** Right-aligned relative time string (e.g. `9:32`, `Mon`). */
769
869
  time?: ReactNode;
870
+ /**
871
+ * Machine-readable ISO 8601 string or `Date` for the notification's
872
+ * timestamp. When set, the visible `time` is wrapped in
873
+ * `<time dateTime="…">` so the row is crawlable / AI-readable.
874
+ */
875
+ dateTime?: string | Date;
770
876
  /** Coloring of the unread dot. */
771
877
  tone?: NotifTone;
772
878
  /** When true, render the unread dot. */