@ship-it-ui/shipit 0.0.6 → 0.0.7

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.cjs CHANGED
@@ -28,12 +28,12 @@ __export(index_exports, {
28
28
  ConfidenceIndicator: () => ConfidenceIndicator,
29
29
  ConnectorCard: () => ConnectorCard,
30
30
  CopilotMessage: () => CopilotMessage,
31
- ENTITY_GLYPH: () => ENTITY_GLYPH,
32
31
  ENTITY_LABEL: () => ENTITY_LABEL,
33
32
  ENTITY_TONE_BG: () => ENTITY_TONE_BG,
34
33
  ENTITY_TONE_CLASS: () => ENTITY_TONE_CLASS,
35
34
  EntityBadge: () => EntityBadge,
36
35
  EntityCard: () => EntityCard,
36
+ EntityList: () => EntityList,
37
37
  EntityListRow: () => EntityListRow,
38
38
  EntityListRowButton: () => EntityListRowButton,
39
39
  EntityListRowDiv: () => EntityListRowDiv,
@@ -51,12 +51,14 @@ __export(index_exports, {
51
51
  PricingCard: () => PricingCard,
52
52
  ReasoningBlock: () => ReasoningBlock,
53
53
  ReasoningStep: () => ReasoningStep,
54
+ StalenessChip: () => StalenessChip,
54
55
  SuggestionChip: () => SuggestionChip,
55
56
  Testimonial: () => Testimonial,
56
57
  ToolCallCard: () => ToolCallCard,
57
- cn: () => import_ui30.cn,
58
+ cn: () => import_ui32.cn,
58
59
  entityColumn: () => entityColumn,
59
60
  entityTypeColumn: () => entityTypeColumn,
61
+ formatAge: () => formatAge,
60
62
  getEntityTypeMeta: () => getEntityTypeMeta,
61
63
  listEntityTypes: () => listEntityTypes,
62
64
  registerEntityType: () => registerEntityType,
@@ -64,7 +66,7 @@ __export(index_exports, {
64
66
  resetEntityTypeRegistry: () => resetEntityTypeRegistry
65
67
  });
66
68
  module.exports = __toCommonJS(index_exports);
67
- var import_ui30 = require("@ship-it-ui/ui");
69
+ var import_ui32 = require("@ship-it-ui/ui");
68
70
 
69
71
  // src/ai/AskBar.tsx
70
72
  var import_ui = require("@ship-it-ui/ui");
@@ -440,18 +442,50 @@ var ReasoningStep = (0, import_react5.forwardRef)(function ReasoningStep2({ step
440
442
  });
441
443
  ReasoningStep.displayName = "ReasoningStep";
442
444
 
443
- // src/ai/SuggestionChip.tsx
445
+ // src/ai/StalenessChip.tsx
444
446
  var import_ui9 = require("@ship-it-ui/ui");
445
447
  var import_react6 = require("react");
446
448
  var import_jsx_runtime6 = require("react/jsx-runtime");
447
- var SuggestionChip = (0, import_react6.forwardRef)(
449
+ var DEFAULT_THRESHOLDS = [3600, 86400];
450
+ function formatAge(ageSeconds) {
451
+ const age = Math.max(0, Math.floor(ageSeconds));
452
+ if (age < 60) return "just now";
453
+ if (age < 3600) return `${Math.floor(age / 60)}m`;
454
+ if (age < 86400) return `${Math.floor(age / 3600)}h`;
455
+ return `${Math.floor(age / 86400)}d`;
456
+ }
457
+ function deriveTier2(ageSeconds, [okMax, warnMax]) {
458
+ if (ageSeconds <= okMax) return "ok";
459
+ if (ageSeconds <= warnMax) return "warn";
460
+ return "err";
461
+ }
462
+ var StalenessChip = (0, import_react6.forwardRef)(function StalenessChip2({ ageSeconds, thresholds = DEFAULT_THRESHOLDS, prefix, tooltip, ...props }, ref) {
463
+ const tier = deriveTier2(ageSeconds, thresholds);
464
+ const humanised = formatAge(ageSeconds);
465
+ const isInstant = humanised === "just now";
466
+ const chip = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_ui9.Badge, { ref, variant: tier, size: "sm", dot: true, ...props, children: [
467
+ prefix && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: prefix }),
468
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "font-mono tabular-nums", children: isInstant ? humanised : `${humanised} ago` })
469
+ ] });
470
+ if (tooltip) {
471
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_ui9.SimpleTooltip, { content: tooltip, children: chip });
472
+ }
473
+ return chip;
474
+ });
475
+ StalenessChip.displayName = "StalenessChip";
476
+
477
+ // src/ai/SuggestionChip.tsx
478
+ var import_ui10 = require("@ship-it-ui/ui");
479
+ var import_react7 = require("react");
480
+ var import_jsx_runtime7 = require("react/jsx-runtime");
481
+ var SuggestionChip = (0, import_react7.forwardRef)(
448
482
  function SuggestionChip2({ glyph = "\u2726", className, children, type, ...props }, ref) {
449
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
483
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
450
484
  "button",
451
485
  {
452
486
  ref,
453
487
  type: type ?? "button",
454
- className: (0, import_ui9.cn)(
488
+ className: (0, import_ui10.cn)(
455
489
  "border-border bg-panel text-text inline-flex cursor-pointer items-center gap-[6px] rounded-full border px-[10px] py-[6px] text-[12px] outline-none",
456
490
  "transition-colors duration-(--duration-micro)",
457
491
  "hover:border-border-strong hover:bg-panel-2",
@@ -460,7 +494,7 @@ var SuggestionChip = (0, import_react6.forwardRef)(
460
494
  ),
461
495
  ...props,
462
496
  children: [
463
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { "aria-hidden": true, className: "text-accent", children: glyph }),
497
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { "aria-hidden": true, className: "text-accent", children: glyph }),
464
498
  children
465
499
  ]
466
500
  }
@@ -470,24 +504,24 @@ var SuggestionChip = (0, import_react6.forwardRef)(
470
504
  SuggestionChip.displayName = "SuggestionChip";
471
505
 
472
506
  // src/ai/ToolCallCard.tsx
473
- var import_ui10 = require("@ship-it-ui/ui");
474
507
  var import_ui11 = require("@ship-it-ui/ui");
475
- var import_react7 = require("react");
476
- var import_jsx_runtime7 = require("react/jsx-runtime");
477
- var ToolCallCard = (0, import_react7.forwardRef)(function ToolCallCard2({ name, status, running, className, children, ...props }, ref) {
478
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
508
+ var import_ui12 = require("@ship-it-ui/ui");
509
+ var import_react8 = require("react");
510
+ var import_jsx_runtime8 = require("react/jsx-runtime");
511
+ var ToolCallCard = (0, import_react8.forwardRef)(function ToolCallCard2({ name, status, running, className, children, ...props }, ref) {
512
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
479
513
  "div",
480
514
  {
481
515
  ref,
482
- className: (0, import_ui11.cn)("border-border bg-panel rounded-md border px-[14px] py-[10px]", className),
516
+ className: (0, import_ui12.cn)("border-border bg-panel rounded-md border px-[14px] py-[10px]", className),
483
517
  ...props,
484
518
  children: [
485
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center gap-[10px]", children: [
486
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_ui10.Badge, { size: "sm", variant: "accent", children: "TOOL" }),
487
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "font-mono text-[12px] font-medium", children: name }),
488
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-text-dim ml-auto inline-flex items-center font-mono text-[10px]", children: running ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
519
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "flex items-center gap-[10px]", children: [
520
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_ui11.Badge, { size: "sm", variant: "accent", children: "TOOL" }),
521
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "font-mono text-[12px] font-medium", children: name }),
522
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-text-dim ml-auto inline-flex items-center font-mono text-[10px]", children: running ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
489
523
  "running",
490
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
524
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
491
525
  "span",
492
526
  {
493
527
  "aria-hidden": true,
@@ -496,7 +530,7 @@ var ToolCallCard = (0, import_react7.forwardRef)(function ToolCallCard2({ name,
496
530
  )
497
531
  ] }) : status })
498
532
  ] }),
499
- children && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("pre", { className: "text-text-muted m-0 mt-[6px] font-mono text-[11px] leading-[1.6] break-words whitespace-pre-wrap", children })
533
+ children && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("pre", { className: "text-text-muted m-0 mt-[6px] font-mono text-[11px] leading-[1.6] break-words whitespace-pre-wrap", children })
500
534
  ]
501
535
  }
502
536
  );
@@ -504,14 +538,15 @@ var ToolCallCard = (0, import_react7.forwardRef)(function ToolCallCard2({ name,
504
538
  ToolCallCard.displayName = "ToolCallCard";
505
539
 
506
540
  // src/entity/EntityBadge.tsx
507
- var import_ui12 = require("@ship-it-ui/ui");
541
+ var import_icons = require("@ship-it-ui/icons");
508
542
  var import_ui13 = require("@ship-it-ui/ui");
509
- var import_react8 = require("react");
543
+ var import_ui14 = require("@ship-it-ui/ui");
544
+ var import_react9 = require("react");
510
545
 
511
546
  // src/entity/types.ts
512
547
  var BUILTIN_META = {
513
548
  service: {
514
- glyph: "\u25C7",
549
+ iconName: "service",
515
550
  label: "Service",
516
551
  toneClass: "text-accent",
517
552
  toneBg: "bg-accent-dim",
@@ -519,7 +554,7 @@ var BUILTIN_META = {
519
554
  badgeVariant: "accent"
520
555
  },
521
556
  person: {
522
- glyph: "\u25CB",
557
+ iconName: "person",
523
558
  label: "Person",
524
559
  toneClass: "text-text-muted",
525
560
  toneBg: "bg-panel-2",
@@ -527,7 +562,7 @@ var BUILTIN_META = {
527
562
  badgeVariant: "neutral"
528
563
  },
529
564
  document: {
530
- glyph: "\u25A4",
565
+ iconName: "document",
531
566
  label: "Document",
532
567
  toneClass: "text-purple",
533
568
  toneBg: "bg-[color-mix(in_oklab,var(--color-purple),transparent_85%)]",
@@ -535,7 +570,7 @@ var BUILTIN_META = {
535
570
  badgeVariant: "purple"
536
571
  },
537
572
  deployment: {
538
- glyph: "\u2191",
573
+ iconName: "deployment",
539
574
  label: "Deployment",
540
575
  toneClass: "text-ok",
541
576
  toneBg: "bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)]",
@@ -543,7 +578,7 @@ var BUILTIN_META = {
543
578
  badgeVariant: "ok"
544
579
  },
545
580
  incident: {
546
- glyph: "\u25CE",
581
+ iconName: "incident",
547
582
  label: "Incident",
548
583
  toneClass: "text-err",
549
584
  toneBg: "bg-[color-mix(in_oklab,var(--color-err),transparent_85%)]",
@@ -551,7 +586,7 @@ var BUILTIN_META = {
551
586
  badgeVariant: "err"
552
587
  },
553
588
  ticket: {
554
- glyph: "\u25A2",
589
+ iconName: "ticket",
555
590
  label: "Ticket",
556
591
  toneClass: "text-warn",
557
592
  toneBg: "bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)]",
@@ -582,14 +617,6 @@ function resetEntityTypeRegistry() {
582
617
  registry.set(key, BUILTIN_META[key]);
583
618
  }
584
619
  }
585
- var ENTITY_GLYPH = {
586
- service: BUILTIN_META.service.glyph,
587
- person: BUILTIN_META.person.glyph,
588
- document: BUILTIN_META.document.glyph,
589
- deployment: BUILTIN_META.deployment.glyph,
590
- incident: BUILTIN_META.incident.glyph,
591
- ticket: BUILTIN_META.ticket.glyph
592
- };
593
620
  var ENTITY_LABEL = {
594
621
  service: BUILTIN_META.service.label,
595
622
  person: BUILTIN_META.person.label,
@@ -616,19 +643,19 @@ var ENTITY_TONE_BG = {
616
643
  };
617
644
 
618
645
  // src/entity/EntityBadge.tsx
619
- var import_jsx_runtime8 = require("react/jsx-runtime");
620
- var EntityBadge = (0, import_react8.forwardRef)(function EntityBadge2({ type, label, hideGlyph, className, children, ...props }, ref) {
646
+ var import_jsx_runtime9 = require("react/jsx-runtime");
647
+ var EntityBadge = (0, import_react9.forwardRef)(function EntityBadge2({ type, label, hideGlyph, className, children, ...props }, ref) {
621
648
  const meta = getEntityTypeMeta(type);
622
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
623
- import_ui12.Badge,
649
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
650
+ import_ui13.Badge,
624
651
  {
625
652
  ref,
626
653
  variant: meta.badgeVariant,
627
654
  "data-entity-type": type,
628
- className: (0, import_ui13.cn)(className),
655
+ className: (0, import_ui14.cn)(className),
629
656
  ...props,
630
657
  children: [
631
- !hideGlyph && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { "aria-hidden": true, className: "font-mono", children: meta.glyph }),
658
+ !hideGlyph && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_icons.DynamicIconGlyph, { name: meta.iconName, size: 11 }),
632
659
  children ?? label ?? meta.label
633
660
  ]
634
661
  }
@@ -637,9 +664,10 @@ var EntityBadge = (0, import_react8.forwardRef)(function EntityBadge2({ type, la
637
664
  EntityBadge.displayName = "EntityBadge";
638
665
 
639
666
  // src/entity/EntityCard.tsx
640
- var import_ui14 = require("@ship-it-ui/ui");
641
- var import_react9 = require("react");
642
- var import_jsx_runtime9 = require("react/jsx-runtime");
667
+ var import_icons2 = require("@ship-it-ui/icons");
668
+ var import_ui15 = require("@ship-it-ui/ui");
669
+ var import_react10 = require("react");
670
+ var import_jsx_runtime10 = require("react/jsx-runtime");
643
671
  var statToneClass = {
644
672
  accent: "text-accent",
645
673
  ok: "text-ok",
@@ -647,53 +675,53 @@ var statToneClass = {
647
675
  err: "text-err",
648
676
  muted: "text-text-muted"
649
677
  };
650
- var EntityCard = (0, import_react9.forwardRef)(function EntityCard2({ type, title, subtitle, description, stats, actions, glyph, className, ...props }, ref) {
678
+ var EntityCard = (0, import_react10.forwardRef)(function EntityCard2({ type, title, subtitle, description, stats, actions, glyph, className, ...props }, ref) {
651
679
  const meta = getEntityTypeMeta(type);
652
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
680
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
653
681
  "div",
654
682
  {
655
683
  ref,
656
684
  "data-entity-type": type,
657
- className: (0, import_ui14.cn)(
685
+ className: (0, import_ui15.cn)(
658
686
  "rounded-base border-border bg-panel flex flex-col gap-3 border p-5",
659
687
  className
660
688
  ),
661
689
  ...props,
662
690
  children: [
663
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-start gap-3", children: [
664
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
691
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-start gap-3", children: [
692
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
665
693
  "span",
666
694
  {
667
695
  "aria-hidden": true,
668
- className: (0, import_ui14.cn)(
696
+ className: (0, import_ui15.cn)(
669
697
  "rounded-base grid h-12 w-12 shrink-0 place-items-center text-[20px]",
670
698
  meta.toneBg,
671
699
  meta.toneClass
672
700
  ),
673
- children: glyph ?? meta.glyph
701
+ children: glyph ?? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_icons2.DynamicIconGlyph, { name: meta.iconName, size: 20 })
674
702
  }
675
703
  ),
676
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "min-w-0 flex-1", children: [
677
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
678
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EntityBadge, { type, size: "sm" }),
679
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-text-dim font-mono text-[11px]", children: subtitle })
704
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "min-w-0 flex-1", children: [
705
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
706
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(EntityBadge, { type, size: "sm" }),
707
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-text-dim font-mono text-[11px]", children: subtitle })
680
708
  ] }),
681
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "mt-1 truncate font-mono text-[18px] font-medium tracking-tight", children: title }),
682
- description && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "text-text-muted mt-1 text-[13px] leading-[1.5]", children: description })
709
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "mt-1 truncate font-mono text-[18px] font-medium tracking-tight", children: title }),
710
+ description && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "text-text-muted mt-1 text-[13px] leading-[1.5]", children: description })
683
711
  ] }),
684
- actions && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "shrink-0", children: actions })
712
+ actions && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "shrink-0", children: actions })
685
713
  ] }),
686
- stats && stats.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
714
+ stats && stats.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
687
715
  "div",
688
716
  {
689
717
  className: "divide-border border-border bg-panel-2 grid divide-x rounded-md border",
690
718
  style: { gridTemplateColumns: `repeat(${Math.min(stats.length, 6)}, 1fr)` },
691
- children: stats.map((stat, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "px-4 py-3", children: [
692
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "text-text-dim font-mono text-[10px] tracking-[1.3px] uppercase", children: stat.label }),
693
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
719
+ children: stats.map((stat, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "px-4 py-3", children: [
720
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "text-text-dim font-mono text-[10px] tracking-[1.3px] uppercase", children: stat.label }),
721
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
694
722
  "div",
695
723
  {
696
- className: (0, import_ui14.cn)(
724
+ className: (0, import_ui15.cn)(
697
725
  "mt-1 text-[16px] font-medium tracking-tight",
698
726
  stat.tone ? statToneClass[stat.tone] : "text-text"
699
727
  ),
@@ -709,13 +737,101 @@ var EntityCard = (0, import_react9.forwardRef)(function EntityCard2({ type, titl
709
737
  });
710
738
  EntityCard.displayName = "EntityCard";
711
739
 
740
+ // src/entity/EntityList.tsx
741
+ var import_icons3 = require("@ship-it-ui/icons");
742
+ var import_ui16 = require("@ship-it-ui/ui");
743
+ var import_react11 = require("react");
744
+ var import_jsx_runtime11 = require("react/jsx-runtime");
745
+ var framedClasses = "rounded-base border-border bg-panel overflow-hidden border";
746
+ var dividerWrapperClasses = "[&>*+*]:border-t [&>*+*]:border-border";
747
+ function Header({ title, subtitle }) {
748
+ if (!title && !subtitle) return null;
749
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "border-border flex flex-col gap-[2px] border-b px-3 py-2", children: [
750
+ title && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-text text-[12px] font-medium", children: title }),
751
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-text-muted text-[11px]", children: subtitle })
752
+ ] });
753
+ }
754
+ function Rows({ dividers, children }) {
755
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: (0, import_ui16.cn)("flex flex-col", dividers && dividerWrapperClasses), children });
756
+ }
757
+ var EntityList = (0, import_react11.forwardRef)(function EntityList2({
758
+ title,
759
+ subtitle,
760
+ framed = true,
761
+ dividers = true,
762
+ collapsible,
763
+ defaultCollapsed = false,
764
+ className,
765
+ children,
766
+ ...props
767
+ }, ref) {
768
+ const [open, setOpen] = (0, import_react11.useState)(!defaultCollapsed);
769
+ if (collapsible) {
770
+ const fallbackLabel = !title && !subtitle ? "Toggle section" : void 0;
771
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
772
+ "details",
773
+ {
774
+ ref,
775
+ open,
776
+ onToggle: (e) => setOpen(e.currentTarget.open),
777
+ className: (0, import_ui16.cn)(framed && framedClasses, "group", className),
778
+ ...props,
779
+ children: [
780
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
781
+ "summary",
782
+ {
783
+ "aria-label": fallbackLabel,
784
+ className: (0, import_ui16.cn)(
785
+ "border-border flex cursor-pointer list-none items-center gap-2 border-b px-3 py-2",
786
+ "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
787
+ // Hide the default disclosure marker on WebKit.
788
+ "[&::-webkit-details-marker]:hidden"
789
+ ),
790
+ children: [
791
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
792
+ import_icons3.IconGlyph,
793
+ {
794
+ name: "caretDown",
795
+ size: 12,
796
+ className: "text-text-muted -rotate-90 transition-transform group-open:rotate-0",
797
+ "aria-hidden": true
798
+ }
799
+ ),
800
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
801
+ title && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-text text-[12px] font-medium", children: title }),
802
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-text-muted text-[11px]", children: subtitle })
803
+ ] })
804
+ ]
805
+ }
806
+ ),
807
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Rows, { dividers, children })
808
+ ]
809
+ }
810
+ );
811
+ }
812
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
813
+ "section",
814
+ {
815
+ ref,
816
+ className: (0, import_ui16.cn)(framed && framedClasses, className),
817
+ ...props,
818
+ children: [
819
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Header, { title, subtitle }),
820
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Rows, { dividers, children })
821
+ ]
822
+ }
823
+ );
824
+ });
825
+ EntityList.displayName = "EntityList";
826
+
712
827
  // src/entity/EntityListRow.tsx
713
- var import_ui15 = require("@ship-it-ui/ui");
714
- var import_react10 = require("react");
715
- var import_jsx_runtime10 = require("react/jsx-runtime");
716
- var baseClassNames = (interactive, className) => (0, import_ui15.cn)(
828
+ var import_icons4 = require("@ship-it-ui/icons");
829
+ var import_ui17 = require("@ship-it-ui/ui");
830
+ var import_react12 = require("react");
831
+ var import_jsx_runtime12 = require("react/jsx-runtime");
832
+ var dividerClass = "border-b border-border last:border-0";
833
+ var labelClass = (interactive, className) => (0, import_ui17.cn)(
717
834
  "flex w-full items-center gap-3 border-0 bg-transparent px-2 py-2 text-left",
718
- "border-b border-border last:border-0",
719
835
  interactive && "cursor-pointer outline-none transition-colors duration-(--duration-micro) hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim",
720
836
  className
721
837
  );
@@ -727,40 +843,93 @@ function RowInner({
727
843
  hideGlyph
728
844
  }) {
729
845
  const typeMeta = getEntityTypeMeta(type);
730
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
731
- !hideGlyph && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { "aria-hidden": true, className: (0, import_ui15.cn)("font-mono text-[14px] leading-none", typeMeta.toneClass), children: typeMeta.glyph }),
732
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-text min-w-0 flex-1 truncate font-mono text-[12px]", children: name }),
733
- relation && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "border-border bg-panel-2 text-text-muted rounded-full border px-2 py-[2px] font-mono text-[10px]", children: relation }),
734
- meta && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-text-dim font-mono text-[10px]", children: meta })
846
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
847
+ !hideGlyph && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
848
+ import_icons4.DynamicIconGlyph,
849
+ {
850
+ name: typeMeta.iconName,
851
+ size: 14,
852
+ className: (0, import_ui17.cn)("shrink-0", typeMeta.toneClass)
853
+ }
854
+ ),
855
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-text min-w-0 flex-1 truncate font-mono text-[12px]", children: name }),
856
+ relation && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "border-border bg-panel-2 text-text-muted rounded-full border px-2 py-[2px] font-mono text-[10px]", children: relation }),
857
+ meta && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-text-dim font-mono text-[10px]", children: meta })
735
858
  ] });
736
859
  }
737
- var EntityListRowDiv = (0, import_react10.forwardRef)(
738
- function EntityListRowDiv2({ type, name, relation, meta, hideGlyph, className, ...props }, ref) {
739
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
860
+ var EntityListRowDiv = (0, import_react12.forwardRef)(
861
+ function EntityListRowDiv2({ type, name, relation, meta, hideGlyph, actions, className, ...props }, ref) {
862
+ if (actions) {
863
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
864
+ "div",
865
+ {
866
+ ref,
867
+ "data-entity-type": type,
868
+ className: (0, import_ui17.cn)("flex w-full items-center gap-1", dividerClass, className),
869
+ ...props,
870
+ children: [
871
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: labelClass(false), children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
872
+ RowInner,
873
+ {
874
+ type,
875
+ name,
876
+ relation,
877
+ meta,
878
+ hideGlyph
879
+ }
880
+ ) }),
881
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "shrink-0 self-center pr-1", children: actions })
882
+ ]
883
+ }
884
+ );
885
+ }
886
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
740
887
  "div",
741
888
  {
742
889
  ref,
743
890
  "data-entity-type": type,
744
- className: baseClassNames(false, className),
891
+ className: (0, import_ui17.cn)(labelClass(false), dividerClass, className),
745
892
  ...props,
746
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowInner, { type, name, relation, meta, hideGlyph })
893
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RowInner, { type, name, relation, meta, hideGlyph })
747
894
  }
748
895
  );
749
896
  }
750
897
  );
751
898
  EntityListRowDiv.displayName = "EntityListRowDiv";
752
- var EntityListRowButton = (0, import_react10.forwardRef)(
753
- function EntityListRowButton2({ type, name, relation, meta, hideGlyph, className, onClick, ...props }, ref) {
754
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
899
+ var EntityListRowButton = (0, import_react12.forwardRef)(
900
+ function EntityListRowButton2({ type, name, relation, meta, hideGlyph, actions, className, onClick, ...props }, ref) {
901
+ if (actions) {
902
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
903
+ "div",
904
+ {
905
+ "data-entity-type": type,
906
+ className: (0, import_ui17.cn)("flex w-full items-stretch gap-1", dividerClass, className),
907
+ children: [
908
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { ref, type: "button", onClick, className: labelClass(true), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
909
+ RowInner,
910
+ {
911
+ type,
912
+ name,
913
+ relation,
914
+ meta,
915
+ hideGlyph
916
+ }
917
+ ) }),
918
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "shrink-0 self-center pr-1", children: actions })
919
+ ]
920
+ }
921
+ );
922
+ }
923
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
755
924
  "button",
756
925
  {
757
926
  ref,
758
927
  type: "button",
759
928
  "data-entity-type": type,
760
929
  onClick,
761
- className: baseClassNames(true, className),
930
+ className: (0, import_ui17.cn)(labelClass(true), dividerClass, className),
762
931
  ...props,
763
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowInner, { type, name, relation, meta, hideGlyph })
932
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RowInner, { type, name, relation, meta, hideGlyph })
764
933
  }
765
934
  );
766
935
  }
@@ -772,12 +941,13 @@ function EntityListRow({
772
941
  relation,
773
942
  meta,
774
943
  hideGlyph,
944
+ actions,
775
945
  onClick,
776
946
  className,
777
947
  ...props
778
948
  }) {
779
949
  if (typeof onClick === "function") {
780
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
950
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
781
951
  EntityListRowButton,
782
952
  {
783
953
  type,
@@ -785,13 +955,14 @@ function EntityListRow({
785
955
  relation,
786
956
  meta,
787
957
  hideGlyph,
958
+ actions,
788
959
  onClick,
789
960
  className,
790
961
  ...props
791
962
  }
792
963
  );
793
964
  }
794
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
965
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
795
966
  EntityListRowDiv,
796
967
  {
797
968
  type,
@@ -799,6 +970,7 @@ function EntityListRow({
799
970
  relation,
800
971
  meta,
801
972
  hideGlyph,
973
+ actions,
802
974
  className,
803
975
  ...props
804
976
  }
@@ -807,15 +979,15 @@ function EntityListRow({
807
979
  EntityListRow.displayName = "EntityListRow";
808
980
 
809
981
  // src/graph/GraphEdge.tsx
810
- var import_react11 = require("react");
811
- var import_jsx_runtime11 = require("react/jsx-runtime");
982
+ var import_react13 = require("react");
983
+ var import_jsx_runtime13 = require("react/jsx-runtime");
812
984
  var styleProps = {
813
985
  solid: { stroke: "var(--color-accent)", strokeWidth: 1.5 },
814
986
  dashed: { stroke: "var(--color-accent)", strokeWidth: 1.5, strokeDasharray: "4 3" },
815
987
  highlighted: { stroke: "var(--color-purple)", strokeWidth: 2.5 },
816
988
  dim: { stroke: "var(--color-text-dim)", strokeWidth: 1, opacity: 0.4 }
817
989
  };
818
- var GraphEdge = (0, import_react11.forwardRef)(function GraphEdge2({ x1, y1, x2, y2, curve, edgeStyle = "solid", color, arrowheadId, ...props }, ref) {
990
+ var GraphEdge = (0, import_react13.forwardRef)(function GraphEdge2({ x1, y1, x2, y2, curve, edgeStyle = "solid", color, arrowheadId, ...props }, ref) {
819
991
  const base = styleProps[edgeStyle];
820
992
  const stroke = color ?? base.stroke;
821
993
  const sharedProps = {
@@ -828,7 +1000,7 @@ var GraphEdge = (0, import_react11.forwardRef)(function GraphEdge2({ x1, y1, x2,
828
1000
  ...props
829
1001
  };
830
1002
  if (curve) {
831
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1003
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
832
1004
  "path",
833
1005
  {
834
1006
  ref,
@@ -837,15 +1009,15 @@ var GraphEdge = (0, import_react11.forwardRef)(function GraphEdge2({ x1, y1, x2,
837
1009
  }
838
1010
  );
839
1011
  }
840
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("line", { ref, x1, y1, x2, y2, ...sharedProps });
1012
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("line", { ref, x1, y1, x2, y2, ...sharedProps });
841
1013
  });
842
1014
  GraphEdge.displayName = "GraphEdge";
843
1015
 
844
1016
  // src/graph/GraphInspector.tsx
845
- var import_ui16 = require("@ship-it-ui/ui");
846
- var import_react12 = require("react");
847
- var import_jsx_runtime12 = require("react/jsx-runtime");
848
- var GraphInspector = (0, import_react12.forwardRef)(
1017
+ var import_ui18 = require("@ship-it-ui/ui");
1018
+ var import_react14 = require("react");
1019
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1020
+ var GraphInspector = (0, import_react14.forwardRef)(
849
1021
  function GraphInspector2({
850
1022
  type,
851
1023
  entityId,
@@ -858,47 +1030,47 @@ var GraphInspector = (0, import_react12.forwardRef)(
858
1030
  ...props
859
1031
  }, ref) {
860
1032
  const total = relationCount ?? relations?.length ?? 0;
861
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1033
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
862
1034
  "aside",
863
1035
  {
864
1036
  ref,
865
1037
  "aria-label": typeof title === "string" ? `${title} inspector` : "Node inspector",
866
- className: (0, import_ui16.cn)(
1038
+ className: (0, import_ui18.cn)(
867
1039
  "rounded-base border-border bg-panel flex w-[340px] flex-col gap-3 border p-4",
868
1040
  className
869
1041
  ),
870
1042
  ...props,
871
1043
  children: [
872
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center", children: [
873
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(EntityBadge, { type, size: "sm" }),
874
- entityId && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-text-dim ml-auto font-mono text-[10px]", children: entityId })
1044
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center", children: [
1045
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EntityBadge, { type, size: "sm" }),
1046
+ entityId && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-text-dim ml-auto font-mono text-[10px]", children: entityId })
875
1047
  ] }),
876
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
877
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "text-[17px] font-medium", children: title }),
878
- description && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "text-text-muted mt-[2px] text-[12px]", children: description })
1048
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
1049
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "text-[17px] font-medium", children: title }),
1050
+ description && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "text-text-muted mt-[2px] text-[12px]", children: description })
879
1051
  ] }),
880
- properties && properties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { children: [
881
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase", children: "Properties" }),
882
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dl", { className: "m-0 flex flex-col gap-1 font-mono text-[11px]", children: properties.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1052
+ properties && properties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { children: [
1053
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase", children: "Properties" }),
1054
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dl", { className: "m-0 flex flex-col gap-1 font-mono text-[11px]", children: properties.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
883
1055
  "div",
884
1056
  {
885
- className: (0, import_ui16.cn)("border-border flex py-1", i < properties.length - 1 && "border-b"),
1057
+ className: (0, import_ui18.cn)("border-border flex py-1", i < properties.length - 1 && "border-b"),
886
1058
  children: [
887
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dt", { className: "text-text-dim w-[70px]", children: p.key }),
888
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dd", { className: "m-0 flex-1", children: p.value })
1059
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dt", { className: "text-text-dim w-[70px]", children: p.key }),
1060
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dd", { className: "m-0 flex-1", children: p.value })
889
1061
  ]
890
1062
  },
891
1063
  i
892
1064
  )) })
893
1065
  ] }),
894
- relations && relations.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { children: [
895
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase", children: [
1066
+ relations && relations.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", { children: [
1067
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase", children: [
896
1068
  "Relations \xB7 ",
897
1069
  total
898
1070
  ] }),
899
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[11px]", children: relations.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("li", { className: "flex gap-2", children: [
900
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-text-dim w-[100px] font-mono", children: r.relation }),
901
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: r.entity })
1071
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[11px]", children: relations.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("li", { className: "flex gap-2", children: [
1072
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-text-dim w-[100px] font-mono", children: r.relation }),
1073
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: r.entity })
902
1074
  ] }, i)) })
903
1075
  ] })
904
1076
  ]
@@ -909,33 +1081,33 @@ var GraphInspector = (0, import_react12.forwardRef)(
909
1081
  GraphInspector.displayName = "GraphInspector";
910
1082
 
911
1083
  // src/graph/GraphLegend.tsx
912
- var import_ui17 = require("@ship-it-ui/ui");
913
- var import_react13 = require("react");
914
- var import_jsx_runtime13 = require("react/jsx-runtime");
1084
+ var import_ui19 = require("@ship-it-ui/ui");
1085
+ var import_react15 = require("react");
1086
+ var import_jsx_runtime15 = require("react/jsx-runtime");
915
1087
  var DEFAULT_ENTRIES = [
916
1088
  { type: "service" },
917
1089
  { type: "person" },
918
1090
  { type: "document" }
919
1091
  ];
920
- var GraphLegend = (0, import_react13.forwardRef)(function GraphLegend2({ entries = DEFAULT_ENTRIES, heading = "Legend", className, children, ...props }, ref) {
921
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1092
+ var GraphLegend = (0, import_react15.forwardRef)(function GraphLegend2({ entries = DEFAULT_ENTRIES, heading = "Legend", className, children, ...props }, ref) {
1093
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
922
1094
  "div",
923
1095
  {
924
1096
  ref,
925
- className: (0, import_ui17.cn)(
1097
+ className: (0, import_ui19.cn)(
926
1098
  "rounded-base border-border bg-panel/85 inline-flex flex-col gap-[6px] border p-[10px] text-[11px] backdrop-blur-[8px]",
927
1099
  className
928
1100
  ),
929
1101
  ...props,
930
1102
  children: [
931
- heading && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: heading }),
1103
+ heading && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: heading }),
932
1104
  children ?? entries.map((entry, i) => {
933
1105
  const meta = entry.type ? getEntityTypeMeta(entry.type) : void 0;
934
1106
  const color = entry.color ?? meta?.colorVar ?? "currentColor";
935
1107
  const label = entry.label ?? meta?.label ?? "";
936
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-[6px]", children: [
937
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { "aria-hidden": true, className: "h-2 w-2 rounded-full", style: { background: color } }),
938
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: label })
1108
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center gap-[6px]", children: [
1109
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": true, className: "h-2 w-2 rounded-full", style: { background: color } }),
1110
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: label })
939
1111
  ] }, i);
940
1112
  })
941
1113
  ]
@@ -945,24 +1117,24 @@ var GraphLegend = (0, import_react13.forwardRef)(function GraphLegend2({ entries
945
1117
  GraphLegend.displayName = "GraphLegend";
946
1118
 
947
1119
  // src/graph/GraphMinimap.tsx
948
- var import_ui18 = require("@ship-it-ui/ui");
949
- var import_react14 = require("react");
950
- var import_jsx_runtime14 = require("react/jsx-runtime");
951
- var GraphMinimap = (0, import_react14.forwardRef)(function GraphMinimap2({ points, viewport, width = 120, height = 72, className, ...props }, ref) {
952
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1120
+ var import_ui20 = require("@ship-it-ui/ui");
1121
+ var import_react16 = require("react");
1122
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1123
+ var GraphMinimap = (0, import_react16.forwardRef)(function GraphMinimap2({ points, viewport, width = 120, height = 72, className, ...props }, ref) {
1124
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
953
1125
  "div",
954
1126
  {
955
1127
  ref,
956
1128
  role: "img",
957
1129
  "aria-label": "Graph minimap",
958
- className: (0, import_ui18.cn)(
1130
+ className: (0, import_ui20.cn)(
959
1131
  "border-border bg-panel/85 relative rounded-md border p-1 backdrop-blur-[8px]",
960
1132
  className
961
1133
  ),
962
1134
  style: { width, height },
963
1135
  ...props,
964
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "relative h-full w-full", children: [
965
- points.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1136
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "relative h-full w-full", children: [
1137
+ points.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
966
1138
  "span",
967
1139
  {
968
1140
  "aria-hidden": true,
@@ -975,7 +1147,7 @@ var GraphMinimap = (0, import_react14.forwardRef)(function GraphMinimap2({ point
975
1147
  },
976
1148
  i
977
1149
  )),
978
- viewport && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1150
+ viewport && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
979
1151
  "span",
980
1152
  {
981
1153
  "aria-hidden": true,
@@ -997,16 +1169,17 @@ var GraphMinimap = (0, import_react14.forwardRef)(function GraphMinimap2({ point
997
1169
  GraphMinimap.displayName = "GraphMinimap";
998
1170
 
999
1171
  // src/graph/GraphNode.tsx
1000
- var import_ui19 = require("@ship-it-ui/ui");
1001
- var import_react15 = require("react");
1002
- var import_jsx_runtime15 = require("react/jsx-runtime");
1003
- var GraphNode = (0, import_react15.forwardRef)(function GraphNode2({ type, state = "default", glyph, label, size = 52, pathColor, className, style, ...props }, ref) {
1172
+ var import_icons5 = require("@ship-it-ui/icons");
1173
+ var import_ui21 = require("@ship-it-ui/ui");
1174
+ var import_react17 = require("react");
1175
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1176
+ var GraphNode = (0, import_react17.forwardRef)(function GraphNode2({ type, state = "default", glyph, label, size = 52, pathColor, className, style, ...props }, ref) {
1004
1177
  const meta = getEntityTypeMeta(type);
1005
1178
  const color = state === "path" ? pathColor ?? "var(--color-purple)" : meta.colorVar;
1006
1179
  const glowPct = state === "hover" ? 50 : 25;
1007
1180
  const opacity = state === "dim" ? 0.35 : 1;
1008
1181
  const showRing = state === "selected" || state === "path";
1009
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1182
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1010
1183
  "div",
1011
1184
  {
1012
1185
  ref,
@@ -1014,11 +1187,11 @@ var GraphNode = (0, import_react15.forwardRef)(function GraphNode2({ type, state
1014
1187
  "aria-label": typeof label === "string" ? label : `${type} node`,
1015
1188
  "data-state": state,
1016
1189
  "data-entity-type": type,
1017
- className: (0, import_ui19.cn)("inline-flex flex-col items-center gap-[6px]", className),
1190
+ className: (0, import_ui21.cn)("inline-flex flex-col items-center gap-[6px]", className),
1018
1191
  style,
1019
1192
  ...props,
1020
1193
  children: [
1021
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1194
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1022
1195
  "div",
1023
1196
  {
1024
1197
  className: "bg-panel grid place-items-center rounded-[14px] border-[1.5px] transition-all duration-(--duration-micro)",
@@ -1033,10 +1206,10 @@ var GraphNode = (0, import_react15.forwardRef)(function GraphNode2({ type, state
1033
1206
  outlineOffset: showRing ? 4 : void 0,
1034
1207
  opacity
1035
1208
  },
1036
- children: glyph ?? meta.glyph
1209
+ children: glyph ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_icons5.DynamicIconGlyph, { name: meta.iconName, size: Math.round(size * 0.42) })
1037
1210
  }
1038
1211
  ),
1039
- label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-text-dim font-mono text-[10px]", children: label })
1212
+ label && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "text-text-dim font-mono text-[10px]", children: label })
1040
1213
  ]
1041
1214
  }
1042
1215
  );
@@ -1044,13 +1217,13 @@ var GraphNode = (0, import_react15.forwardRef)(function GraphNode2({ type, state
1044
1217
  GraphNode.displayName = "GraphNode";
1045
1218
 
1046
1219
  // src/graph/PathOverlay.tsx
1047
- var import_react16 = require("react");
1048
- var import_jsx_runtime16 = require("react/jsx-runtime");
1049
- var PathOverlay = (0, import_react16.forwardRef)(function PathOverlay2({ points, color = "var(--color-purple)", width = 2.5, halo = true, ...props }, ref) {
1220
+ var import_react18 = require("react");
1221
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1222
+ var PathOverlay = (0, import_react18.forwardRef)(function PathOverlay2({ points, color = "var(--color-purple)", width = 2.5, halo = true, ...props }, ref) {
1050
1223
  if (points.length < 2) return null;
1051
1224
  const coords = points.map((p) => `${p.x},${p.y}`).join(" ");
1052
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("g", { ref, ...props, children: [
1053
- halo && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1225
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("g", { ref, ...props, children: [
1226
+ halo && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1054
1227
  "polyline",
1055
1228
  {
1056
1229
  points: coords,
@@ -1062,7 +1235,7 @@ var PathOverlay = (0, import_react16.forwardRef)(function PathOverlay2({ points,
1062
1235
  opacity: 0.65
1063
1236
  }
1064
1237
  ),
1065
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1238
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1066
1239
  "polyline",
1067
1240
  {
1068
1241
  points: coords,
@@ -1078,24 +1251,24 @@ var PathOverlay = (0, import_react16.forwardRef)(function PathOverlay2({ points,
1078
1251
  PathOverlay.displayName = "PathOverlay";
1079
1252
 
1080
1253
  // src/marketing/CTAStrip.tsx
1081
- var import_ui20 = require("@ship-it-ui/ui");
1082
- var import_react17 = require("react");
1083
- var import_jsx_runtime17 = require("react/jsx-runtime");
1084
- var CTAStrip = (0, import_react17.forwardRef)(function CTAStrip2({ title, description, actions, className, ...props }, ref) {
1085
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1254
+ var import_ui22 = require("@ship-it-ui/ui");
1255
+ var import_react19 = require("react");
1256
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1257
+ var CTAStrip = (0, import_react19.forwardRef)(function CTAStrip2({ title, description, actions, className, ...props }, ref) {
1258
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1086
1259
  "section",
1087
1260
  {
1088
1261
  ref,
1089
- className: (0, import_ui20.cn)(
1262
+ className: (0, import_ui22.cn)(
1090
1263
  "rounded-xl px-10 py-12 text-center",
1091
1264
  "bg-[linear-gradient(135deg,var(--color-cta-from),var(--color-cta-to))]",
1092
1265
  className
1093
1266
  ),
1094
1267
  ...props,
1095
1268
  children: [
1096
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { className: "m-0 mb-[10px] text-[28px] font-medium tracking-[-0.4px]", children: title }),
1097
- description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-text-muted m-0 mb-5 text-[13px]", children: description }),
1098
- actions && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "flex flex-wrap justify-center gap-2", children: actions })
1269
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { className: "m-0 mb-[10px] text-[28px] font-medium tracking-[-0.4px]", children: title }),
1270
+ description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-text-muted m-0 mb-5 text-[13px]", children: description }),
1271
+ actions && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "flex flex-wrap justify-center gap-2", children: actions })
1099
1272
  ]
1100
1273
  }
1101
1274
  );
@@ -1103,25 +1276,25 @@ var CTAStrip = (0, import_react17.forwardRef)(function CTAStrip2({ title, descri
1103
1276
  CTAStrip.displayName = "CTAStrip";
1104
1277
 
1105
1278
  // src/marketing/FeatureGrid.tsx
1106
- var import_ui21 = require("@ship-it-ui/ui");
1107
- var import_react18 = require("react");
1108
- var import_jsx_runtime18 = require("react/jsx-runtime");
1279
+ var import_ui23 = require("@ship-it-ui/ui");
1280
+ var import_react20 = require("react");
1281
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1109
1282
  var colsClass = {
1110
1283
  2: "md:grid-cols-2",
1111
1284
  3: "md:grid-cols-3",
1112
1285
  4: "md:grid-cols-2 lg:grid-cols-4"
1113
1286
  };
1114
- var FeatureGrid = (0, import_react18.forwardRef)(function FeatureGrid2({ features, columns = 3, className, ...props }, ref) {
1115
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1287
+ var FeatureGrid = (0, import_react20.forwardRef)(function FeatureGrid2({ features, columns = 3, className, ...props }, ref) {
1288
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1116
1289
  "div",
1117
1290
  {
1118
1291
  ref,
1119
- className: (0, import_ui21.cn)("grid grid-cols-1 gap-3", colsClass[columns], className),
1292
+ className: (0, import_ui23.cn)("grid grid-cols-1 gap-3", colsClass[columns], className),
1120
1293
  ...props,
1121
- children: features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "rounded-base border-border bg-panel border p-5", children: [
1122
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { "aria-hidden": true, className: "text-accent mb-3 text-[22px]", children: f.glyph }),
1123
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "mb-[6px] text-[14px] font-medium", children: f.title }),
1124
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-text-muted text-[12px] leading-[1.55]", children: f.description })
1294
+ children: features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "rounded-base border-border bg-panel border p-5", children: [
1295
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { "aria-hidden": true, className: "text-accent mb-3 text-[22px]", children: f.glyph }),
1296
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "mb-[6px] text-[14px] font-medium", children: f.title }),
1297
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "text-text-muted text-[12px] leading-[1.55]", children: f.description })
1125
1298
  ] }, i))
1126
1299
  }
1127
1300
  );
@@ -1129,16 +1302,16 @@ var FeatureGrid = (0, import_react18.forwardRef)(function FeatureGrid2({ feature
1129
1302
  FeatureGrid.displayName = "FeatureGrid";
1130
1303
 
1131
1304
  // src/marketing/Footer.tsx
1132
- var import_ui22 = require("@ship-it-ui/ui");
1133
- var import_react19 = require("react");
1134
- var import_jsx_runtime19 = require("react/jsx-runtime");
1135
- var Footer = (0, import_react19.forwardRef)(function Footer2({ brand, columns, copyright, closing, className, ...props }, ref) {
1136
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("footer", { ref, className: (0, import_ui22.cn)("px-7 py-7", className), ...props, children: [
1137
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "mb-7 flex flex-wrap gap-8", children: [
1138
- brand && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { children: brand }),
1139
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "text-text-muted ml-auto flex flex-wrap gap-6 text-[12px]", children: columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex flex-col gap-[6px]", children: [
1140
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "text-text-dim font-mono text-[10px] tracking-[1.2px] uppercase", children: col.heading }),
1141
- col.links.map((link, j) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1305
+ var import_ui24 = require("@ship-it-ui/ui");
1306
+ var import_react21 = require("react");
1307
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1308
+ var Footer = (0, import_react21.forwardRef)(function Footer2({ brand, columns, copyright, closing, className, ...props }, ref) {
1309
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("footer", { ref, className: (0, import_ui24.cn)("px-7 py-7", className), ...props, children: [
1310
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "mb-7 flex flex-wrap gap-8", children: [
1311
+ brand && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { children: brand }),
1312
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-text-muted ml-auto flex flex-wrap gap-6 text-[12px]", children: columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex flex-col gap-[6px]", children: [
1313
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-text-dim font-mono text-[10px] tracking-[1.2px] uppercase", children: col.heading }),
1314
+ col.links.map((link, j) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1142
1315
  "a",
1143
1316
  {
1144
1317
  href: link.href,
@@ -1149,47 +1322,47 @@ var Footer = (0, import_react19.forwardRef)(function Footer2({ brand, columns, c
1149
1322
  ))
1150
1323
  ] }, i)) })
1151
1324
  ] }),
1152
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "border-border text-text-dim flex border-t pt-4 font-mono text-[11px]", children: [
1153
- copyright && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { children: copyright }),
1154
- closing && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ml-auto", children: closing })
1325
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "border-border text-text-dim flex border-t pt-4 font-mono text-[11px]", children: [
1326
+ copyright && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: copyright }),
1327
+ closing && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ml-auto", children: closing })
1155
1328
  ] })
1156
1329
  ] });
1157
1330
  });
1158
1331
  Footer.displayName = "Footer";
1159
1332
 
1160
1333
  // src/marketing/Hero.tsx
1161
- var import_ui23 = require("@ship-it-ui/ui");
1162
- var import_react20 = require("react");
1163
- var import_jsx_runtime20 = require("react/jsx-runtime");
1164
- var Hero = (0, import_react20.forwardRef)(function Hero2({ eyebrow, title, description, actions, visual, className, ...props }, ref) {
1334
+ var import_ui25 = require("@ship-it-ui/ui");
1335
+ var import_react22 = require("react");
1336
+ var import_jsx_runtime22 = require("react/jsx-runtime");
1337
+ var Hero = (0, import_react22.forwardRef)(function Hero2({ eyebrow, title, description, actions, visual, className, ...props }, ref) {
1165
1338
  const hasVisual = visual != null;
1166
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1339
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1167
1340
  "section",
1168
1341
  {
1169
1342
  ref,
1170
- className: (0, import_ui23.cn)(
1343
+ className: (0, import_ui25.cn)(
1171
1344
  "flex flex-col items-center justify-between gap-10 px-6 py-16 md:py-24",
1172
1345
  hasVisual && "md:flex-row md:items-center md:gap-16",
1173
1346
  className
1174
1347
  ),
1175
1348
  ...props,
1176
1349
  children: [
1177
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: (0, import_ui23.cn)("max-w-[680px]", !hasVisual && "mx-auto text-center"), children: [
1350
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_ui25.cn)("max-w-[680px]", !hasVisual && "mx-auto text-center"), children: [
1178
1351
  eyebrow,
1179
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1352
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1180
1353
  "h1",
1181
1354
  {
1182
- className: (0, import_ui23.cn)(
1355
+ className: (0, import_ui25.cn)(
1183
1356
  "mb-4 text-[44px] leading-[1.05] font-medium tracking-[-1.6px] md:text-[56px]",
1184
1357
  eyebrow && "mt-5"
1185
1358
  ),
1186
1359
  children: title
1187
1360
  }
1188
1361
  ),
1189
- description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-text-muted mb-7 text-[17px] leading-[1.6]", children: description }),
1190
- actions && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: (0, import_ui23.cn)("flex flex-wrap gap-2", !hasVisual && "justify-center"), children: actions })
1362
+ description && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-text-muted mb-7 text-[17px] leading-[1.6]", children: description }),
1363
+ actions && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: (0, import_ui25.cn)("flex flex-wrap gap-2", !hasVisual && "justify-center"), children: actions })
1191
1364
  ] }),
1192
- visual && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex-1", children: visual })
1365
+ visual && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex-1", children: visual })
1193
1366
  ]
1194
1367
  }
1195
1368
  );
@@ -1197,37 +1370,37 @@ var Hero = (0, import_react20.forwardRef)(function Hero2({ eyebrow, title, descr
1197
1370
  Hero.displayName = "Hero";
1198
1371
 
1199
1372
  // src/marketing/PricingCard.tsx
1200
- var import_ui24 = require("@ship-it-ui/ui");
1201
- var import_react21 = require("react");
1202
- var import_jsx_runtime21 = require("react/jsx-runtime");
1203
- var PricingCard = (0, import_react21.forwardRef)(function PricingCard2({ tier, price, priceUnit, description, features, action, featured, className, ...props }, ref) {
1204
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1373
+ var import_ui26 = require("@ship-it-ui/ui");
1374
+ var import_react23 = require("react");
1375
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1376
+ var PricingCard = (0, import_react23.forwardRef)(function PricingCard2({ tier, price, priceUnit, description, features, action, featured, className, ...props }, ref) {
1377
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1205
1378
  "div",
1206
1379
  {
1207
1380
  ref,
1208
- className: (0, import_ui24.cn)(
1381
+ className: (0, import_ui26.cn)(
1209
1382
  "bg-panel @container flex flex-col gap-5 rounded-lg border p-5 @sm:p-6",
1210
1383
  featured ? "border-accent shadow-lg" : "border-border",
1211
1384
  className
1212
1385
  ),
1213
1386
  ...props,
1214
1387
  children: [
1215
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
1216
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "mb-1 flex flex-wrap items-center gap-2", children: [
1217
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "text-[14px] font-medium", children: tier }),
1218
- featured && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "bg-accent-dim text-accent rounded-full px-[6px] py-[1px] font-mono text-[10px]", children: "recommended" })
1388
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
1389
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mb-1 flex flex-wrap items-center gap-2", children: [
1390
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-[14px] font-medium", children: tier }),
1391
+ featured && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "bg-accent-dim text-accent rounded-full px-[6px] py-[1px] font-mono text-[10px]", children: "recommended" })
1219
1392
  ] }),
1220
- description && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-text-muted text-[12px]", children: description })
1393
+ description && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "text-text-muted text-[12px]", children: description })
1221
1394
  ] }),
1222
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex flex-wrap items-baseline justify-center gap-x-2 gap-y-1", children: [
1223
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "font-mono text-[22px] font-medium tracking-[-0.5px] text-balance @sm:text-[28px]", children: price }),
1224
- priceUnit != null && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "text-text-dim text-[12px] whitespace-nowrap @sm:text-[13px]", children: priceUnit })
1395
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-wrap items-baseline justify-center gap-x-2 gap-y-1", children: [
1396
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "font-mono text-[22px] font-medium tracking-[-0.5px] text-balance @sm:text-[28px]", children: price }),
1397
+ priceUnit != null && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-text-dim text-[12px] whitespace-nowrap @sm:text-[13px]", children: priceUnit })
1225
1398
  ] }),
1226
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "m-0 flex list-none flex-col gap-2 p-0", children: features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("li", { className: "flex items-start gap-2 text-[13px]", children: [
1227
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { "aria-hidden": true, className: "text-accent", children: "\u2713" }),
1228
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: f })
1399
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: "m-0 flex list-none flex-col gap-2 p-0", children: features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("li", { className: "flex items-start gap-2 text-[13px]", children: [
1400
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { "aria-hidden": true, className: "text-accent", children: "\u2713" }),
1401
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: f })
1229
1402
  ] }, i)) }),
1230
- action && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "mt-auto", children: action })
1403
+ action && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mt-auto", children: action })
1231
1404
  ]
1232
1405
  }
1233
1406
  );
@@ -1235,25 +1408,25 @@ var PricingCard = (0, import_react21.forwardRef)(function PricingCard2({ tier, p
1235
1408
  PricingCard.displayName = "PricingCard";
1236
1409
 
1237
1410
  // src/marketing/Testimonial.tsx
1238
- var import_ui25 = require("@ship-it-ui/ui");
1239
- var import_ui26 = require("@ship-it-ui/ui");
1240
- var import_react22 = require("react");
1241
- var import_jsx_runtime22 = require("react/jsx-runtime");
1242
- var Testimonial = (0, import_react22.forwardRef)(function Testimonial2({ quote, author, role, avatar, className, ...props }, ref) {
1243
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1411
+ var import_ui27 = require("@ship-it-ui/ui");
1412
+ var import_ui28 = require("@ship-it-ui/ui");
1413
+ var import_react24 = require("react");
1414
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1415
+ var Testimonial = (0, import_react24.forwardRef)(function Testimonial2({ quote, author, role, avatar, className, ...props }, ref) {
1416
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
1244
1417
  "figure",
1245
1418
  {
1246
1419
  ref,
1247
- className: (0, import_ui26.cn)("mx-auto max-w-[620px] px-6 py-10 text-center", className),
1420
+ className: (0, import_ui28.cn)("mx-auto max-w-[620px] px-6 py-10 text-center", className),
1248
1421
  ...props,
1249
1422
  children: [
1250
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { "aria-hidden": true, className: "text-accent mb-4 text-[40px] leading-none", children: "\u201C" }),
1251
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("blockquote", { className: "m-0 text-[22px] leading-[1.45] font-medium tracking-[-0.3px]", children: quote }),
1252
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("figcaption", { className: "mt-5 flex items-center justify-center gap-[10px]", children: [
1253
- typeof avatar === "string" ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_ui25.Avatar, { size: "md", name: avatar }) : avatar,
1254
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "text-left", children: [
1255
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "text-[13px] font-medium", children: author }),
1256
- role && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "text-text-dim text-[11px]", children: role })
1423
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { "aria-hidden": true, className: "text-accent mb-4 text-[40px] leading-none", children: "\u201C" }),
1424
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("blockquote", { className: "m-0 text-[22px] leading-[1.45] font-medium tracking-[-0.3px]", children: quote }),
1425
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("figcaption", { className: "mt-5 flex items-center justify-center gap-[10px]", children: [
1426
+ typeof avatar === "string" ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_ui27.Avatar, { size: "md", name: avatar }) : avatar,
1427
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "text-left", children: [
1428
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "text-[13px] font-medium", children: author }),
1429
+ role && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "text-text-dim text-[11px]", children: role })
1257
1430
  ] })
1258
1431
  ] })
1259
1432
  ]
@@ -1263,10 +1436,10 @@ var Testimonial = (0, import_react22.forwardRef)(function Testimonial2({ quote,
1263
1436
  Testimonial.displayName = "Testimonial";
1264
1437
 
1265
1438
  // src/data/ConnectorCard.tsx
1266
- var import_icons = require("@ship-it-ui/icons");
1267
- var import_ui27 = require("@ship-it-ui/ui");
1268
- var import_react23 = require("react");
1269
- var import_jsx_runtime23 = require("react/jsx-runtime");
1439
+ var import_icons6 = require("@ship-it-ui/icons");
1440
+ var import_ui29 = require("@ship-it-ui/ui");
1441
+ var import_react25 = require("react");
1442
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1270
1443
  var statusDot = {
1271
1444
  connected: "ok",
1272
1445
  syncing: "sync",
@@ -1279,7 +1452,7 @@ var statusLabel = {
1279
1452
  error: "Error",
1280
1453
  disconnected: "Disconnected"
1281
1454
  };
1282
- var ConnectorCard = (0, import_react23.forwardRef)(function ConnectorCard2({
1455
+ var ConnectorCard = (0, import_react25.forwardRef)(function ConnectorCard2({
1283
1456
  connector,
1284
1457
  name,
1285
1458
  status,
@@ -1293,21 +1466,21 @@ var ConnectorCard = (0, import_react23.forwardRef)(function ConnectorCard2({
1293
1466
  ...props
1294
1467
  }, ref) {
1295
1468
  const interactive = typeof onClick === "function";
1296
- const time = lastSyncedAt ? (0, import_ui27.formatRelative)(lastSyncedAt, relativeNow ?? /* @__PURE__ */ new Date()) : "";
1297
- const labelBlock = /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
1298
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1469
+ const time = lastSyncedAt ? (0, import_ui29.formatRelative)(lastSyncedAt, relativeNow ?? /* @__PURE__ */ new Date()) : "";
1470
+ const labelBlock = /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1471
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1299
1472
  "span",
1300
1473
  {
1301
1474
  "aria-hidden": true,
1302
1475
  className: "bg-panel-2 grid h-10 w-10 shrink-0 place-items-center rounded-md font-mono text-[16px]",
1303
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_icons.IconGlyph, { name: connector, kind: "connector" })
1476
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_icons6.DynamicIconGlyph, { name: connector, kind: "connector" })
1304
1477
  }
1305
1478
  ),
1306
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "min-w-0 flex-1", children: [
1307
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-2", children: [
1308
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "truncate text-[14px] font-medium", children: name }),
1309
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1310
- import_ui27.StatusDot,
1479
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "min-w-0 flex-1", children: [
1480
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center gap-2", children: [
1481
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "truncate text-[14px] font-medium", children: name }),
1482
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1483
+ import_ui29.StatusDot,
1311
1484
  {
1312
1485
  state: statusDot[status],
1313
1486
  pulse: status === "syncing",
@@ -1315,21 +1488,21 @@ var ConnectorCard = (0, import_react23.forwardRef)(function ConnectorCard2({
1315
1488
  }
1316
1489
  )
1317
1490
  ] }),
1318
- (summary || time) && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "text-text-muted mt-[2px] flex items-center gap-2 text-[12px]", children: [
1319
- summary && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "truncate", children: summary }),
1320
- summary && time && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { "aria-hidden": true, className: "text-text-dim", children: "\xB7" }),
1321
- time && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("time", { className: "text-text-dim font-mono text-[11px]", children: [
1491
+ (summary || time) && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "text-text-muted mt-[2px] flex items-center gap-2 text-[12px]", children: [
1492
+ summary && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "truncate", children: summary }),
1493
+ summary && time && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { "aria-hidden": true, className: "text-text-dim", children: "\xB7" }),
1494
+ time && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("time", { className: "text-text-dim font-mono text-[11px]", children: [
1322
1495
  "last synced ",
1323
1496
  time
1324
1497
  ] })
1325
1498
  ] })
1326
1499
  ] })
1327
1500
  ] });
1328
- const labelRegionClass = (0, import_ui27.cn)(
1501
+ const labelRegionClass = (0, import_ui29.cn)(
1329
1502
  "flex flex-1 items-start gap-3 rounded-md p-1 text-left transition-colors duration-(--duration-micro)",
1330
1503
  interactive && "hover:bg-panel-2 focus-visible:ring-accent-dim cursor-pointer outline-none focus-visible:ring-[3px]"
1331
1504
  );
1332
- const labelRegion = interactive ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1505
+ const labelRegion = interactive ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1333
1506
  "button",
1334
1507
  {
1335
1508
  type: "button",
@@ -1338,19 +1511,19 @@ var ConnectorCard = (0, import_react23.forwardRef)(function ConnectorCard2({
1338
1511
  className: labelRegionClass,
1339
1512
  children: labelBlock
1340
1513
  }
1341
- ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: labelRegionClass, children: labelBlock });
1342
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1514
+ ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: labelRegionClass, children: labelBlock });
1515
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1343
1516
  "div",
1344
1517
  {
1345
1518
  ref,
1346
- className: (0, import_ui27.cn)(
1519
+ className: (0, import_ui29.cn)(
1347
1520
  "rounded-base border-border bg-panel flex items-start gap-2 border p-3",
1348
1521
  className
1349
1522
  ),
1350
1523
  ...props,
1351
1524
  children: [
1352
1525
  labelRegion,
1353
- actions && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "shrink-0 self-center pr-1", children: actions })
1526
+ actions && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "shrink-0 self-center pr-1", children: actions })
1354
1527
  ]
1355
1528
  }
1356
1529
  );
@@ -1358,12 +1531,13 @@ var ConnectorCard = (0, import_react23.forwardRef)(function ConnectorCard2({
1358
1531
  ConnectorCard.displayName = "ConnectorCard";
1359
1532
 
1360
1533
  // src/data/EntityTable.tsx
1361
- var import_ui28 = require("@ship-it-ui/ui");
1362
- var import_react24 = require("react");
1363
- var import_jsx_runtime24 = require("react/jsx-runtime");
1534
+ var import_icons7 = require("@ship-it-ui/icons");
1535
+ var import_ui30 = require("@ship-it-ui/ui");
1536
+ var import_react26 = require("react");
1537
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1364
1538
  function EntityTable(props) {
1365
1539
  const { rowKey, ...rest } = props;
1366
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_ui28.DataTable, { ...rest, rowKey: rowKey ?? ((row) => row.id) });
1540
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_ui30.DataTable, { ...rest, rowKey: rowKey ?? ((row) => row.id) });
1367
1541
  }
1368
1542
  function entityColumn(options = {}) {
1369
1543
  return {
@@ -1372,8 +1546,8 @@ function entityColumn(options = {}) {
1372
1546
  accessor: (row) => row.name,
1373
1547
  cell: (row) => {
1374
1548
  const meta = getEntityTypeMeta(row.type);
1375
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "flex items-center gap-2 font-mono", "data-entity-type": row.type, children: [
1376
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { "aria-hidden": true, className: meta.toneClass, children: meta.glyph }),
1549
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("span", { className: "flex items-center gap-2 font-mono", "data-entity-type": row.type, children: [
1550
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_icons7.DynamicIconGlyph, { name: meta.iconName, size: 14, className: meta.toneClass }),
1377
1551
  row.name
1378
1552
  ] });
1379
1553
  }
@@ -1384,21 +1558,21 @@ function entityTypeColumn(options = {}) {
1384
1558
  key: options.key ?? "type",
1385
1559
  header: options.header ?? "Type",
1386
1560
  accessor: (row) => row.type,
1387
- cell: (row) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(EntityBadge, { type: row.type, size: "sm" })
1561
+ cell: (row) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(EntityBadge, { type: row.type, size: "sm" })
1388
1562
  };
1389
1563
  }
1390
1564
 
1391
1565
  // src/notifications/NotifRow.tsx
1392
- var import_ui29 = require("@ship-it-ui/ui");
1393
- var import_react25 = require("react");
1394
- var import_jsx_runtime25 = require("react/jsx-runtime");
1566
+ var import_ui31 = require("@ship-it-ui/ui");
1567
+ var import_react27 = require("react");
1568
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1395
1569
  var toneClass = {
1396
1570
  ok: "bg-ok",
1397
1571
  warn: "bg-warn",
1398
1572
  err: "bg-err",
1399
1573
  neutral: "bg-accent-text"
1400
1574
  };
1401
- var NotifRow = (0, import_react25.forwardRef)(function NotifRow2({
1575
+ var NotifRow = (0, import_react27.forwardRef)(function NotifRow2({
1402
1576
  title,
1403
1577
  body,
1404
1578
  time,
@@ -1411,22 +1585,22 @@ var NotifRow = (0, import_react25.forwardRef)(function NotifRow2({
1411
1585
  onClick,
1412
1586
  ...props
1413
1587
  }, ref) {
1414
- const content = /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1415
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "pt-1", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1588
+ const content = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
1589
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "pt-1", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1416
1590
  "div",
1417
1591
  {
1418
- className: (0, import_ui29.cn)("h-2 w-2 rounded-full", unread ? toneClass[tone] : "bg-border-strong")
1592
+ className: (0, import_ui31.cn)("h-2 w-2 rounded-full", unread ? toneClass[tone] : "bg-border-strong")
1419
1593
  }
1420
1594
  ) }),
1421
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "min-w-0 flex-1", children: [
1422
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-baseline justify-between gap-2", children: [
1423
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "truncate text-[14px] font-medium tracking-tight", children: title }),
1424
- time != null && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-text-muted shrink-0 font-mono text-[11px] whitespace-nowrap", children: time })
1595
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "min-w-0 flex-1", children: [
1596
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-baseline justify-between gap-2", children: [
1597
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "truncate text-[14px] font-medium tracking-tight", children: title }),
1598
+ time != null && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "text-text-muted shrink-0 font-mono text-[11px] whitespace-nowrap", children: time })
1425
1599
  ] }),
1426
- body && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "text-text-muted mt-[3px] text-[13px] leading-tight", children: body })
1600
+ body && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "text-text-muted mt-[3px] text-[13px] leading-tight", children: body })
1427
1601
  ] })
1428
1602
  ] });
1429
- const baseClass = (0, import_ui29.cn)(
1603
+ const baseClass = (0, import_ui31.cn)(
1430
1604
  "flex gap-3 p-[14px] bg-panel border-border border-l border-r",
1431
1605
  isFirst ? "border-t rounded-t-m-card" : "",
1432
1606
  "border-b",
@@ -1435,13 +1609,13 @@ var NotifRow = (0, import_react25.forwardRef)(function NotifRow2({
1435
1609
  className
1436
1610
  );
1437
1611
  if (href) {
1438
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1612
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1439
1613
  "a",
1440
1614
  {
1441
1615
  ref,
1442
1616
  href,
1443
1617
  onClick,
1444
- className: (0, import_ui29.cn)(
1618
+ className: (0, import_ui31.cn)(
1445
1619
  baseClass,
1446
1620
  "text-text focus-visible:ring-accent-dim no-underline outline-none focus-visible:ring-[3px]"
1447
1621
  ),
@@ -1451,13 +1625,13 @@ var NotifRow = (0, import_react25.forwardRef)(function NotifRow2({
1451
1625
  );
1452
1626
  }
1453
1627
  if (onClick) {
1454
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1628
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1455
1629
  "button",
1456
1630
  {
1457
1631
  type: "button",
1458
1632
  ref,
1459
1633
  onClick,
1460
- className: (0, import_ui29.cn)(
1634
+ className: (0, import_ui31.cn)(
1461
1635
  baseClass,
1462
1636
  "focus-visible:ring-accent-dim text-left outline-none focus-visible:ring-[3px]"
1463
1637
  ),
@@ -1466,7 +1640,7 @@ var NotifRow = (0, import_react25.forwardRef)(function NotifRow2({
1466
1640
  }
1467
1641
  );
1468
1642
  }
1469
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { ref, className: baseClass, ...props, children: content });
1643
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { ref, className: baseClass, ...props, children: content });
1470
1644
  });
1471
1645
  NotifRow.displayName = "NotifRow";
1472
1646
  // Annotate the CommonJS export names for ESM import in node:
@@ -1477,12 +1651,12 @@ NotifRow.displayName = "NotifRow";
1477
1651
  ConfidenceIndicator,
1478
1652
  ConnectorCard,
1479
1653
  CopilotMessage,
1480
- ENTITY_GLYPH,
1481
1654
  ENTITY_LABEL,
1482
1655
  ENTITY_TONE_BG,
1483
1656
  ENTITY_TONE_CLASS,
1484
1657
  EntityBadge,
1485
1658
  EntityCard,
1659
+ EntityList,
1486
1660
  EntityListRow,
1487
1661
  EntityListRowButton,
1488
1662
  EntityListRowDiv,
@@ -1500,12 +1674,14 @@ NotifRow.displayName = "NotifRow";
1500
1674
  PricingCard,
1501
1675
  ReasoningBlock,
1502
1676
  ReasoningStep,
1677
+ StalenessChip,
1503
1678
  SuggestionChip,
1504
1679
  Testimonial,
1505
1680
  ToolCallCard,
1506
1681
  cn,
1507
1682
  entityColumn,
1508
1683
  entityTypeColumn,
1684
+ formatAge,
1509
1685
  getEntityTypeMeta,
1510
1686
  listEntityTypes,
1511
1687
  registerEntityType,