executable-stories-react 0.6.0 → 0.7.0

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.
@@ -225,7 +225,7 @@ function DocLink({ entry }) {
225
225
  // src/components/doc/DocSection.tsx
226
226
  import { marked } from "marked";
227
227
 
228
- // src/lib/url.ts
228
+ // ../executable-stories-core/dist/utils/url.js
229
229
  function safeUrl(value) {
230
230
  if (!value) return void 0;
231
231
  const trimmed = value.trim();
@@ -520,18 +520,101 @@ function ReportStepItem({ step }) {
520
520
  );
521
521
  }
522
522
 
523
+ // ../executable-stories-core/dist/storyboard.js
524
+ function findScreenshot(entries) {
525
+ for (const entry of entries) {
526
+ if (entry.kind === "screenshot") return entry;
527
+ if (entry.children) {
528
+ const nested = findScreenshot(entry.children);
529
+ if (nested) return nested;
530
+ }
531
+ }
532
+ return void 0;
533
+ }
534
+ function extractStoryboardFrames(scenario) {
535
+ const frames = [];
536
+ for (const step of scenario.steps) {
537
+ const shot = findScreenshot(step.docEntries);
538
+ if (!shot) continue;
539
+ frames.push({
540
+ stepId: step.id,
541
+ stepIndex: step.index,
542
+ keyword: step.keyword,
543
+ text: step.text,
544
+ status: step.status,
545
+ path: shot.path,
546
+ ...shot.alt !== void 0 && { alt: shot.alt }
547
+ });
548
+ }
549
+ return frames;
550
+ }
551
+
552
+ // src/components/ReportStoryboard.tsx
553
+ import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
554
+ var FRAME_GLYPH = {
555
+ passed: "\u2713",
556
+ failed: "\u2717",
557
+ skipped: "\u25CB",
558
+ pending: "\u25CB"
559
+ };
560
+ var FRAME_GLYPH_COLOR = {
561
+ passed: "text-pass",
562
+ failed: "text-fail",
563
+ skipped: "text-skip",
564
+ pending: "text-pend"
565
+ };
566
+ function ReportStoryboard({ scenario }) {
567
+ const frames = extractStoryboardFrames(scenario);
568
+ if (frames.length < 2) return null;
569
+ return /* @__PURE__ */ jsxs11("section", { "data-slot": "storyboard", "aria-label": "Storyboard", className: "mb-3", children: [
570
+ /* @__PURE__ */ jsx18("h4", { className: "mb-1.5 text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Storyboard" }),
571
+ /* @__PURE__ */ jsx18("ol", { className: "flex gap-3 overflow-x-auto pb-2", children: frames.map((frame) => /* @__PURE__ */ jsx18(StoryboardFrameItem, { frame }, frame.stepId)) })
572
+ ] });
573
+ }
574
+ function StoryboardFrameItem({ frame }) {
575
+ const src = isLocalFsPath(frame.path) ? void 0 : safeImageUrl(frame.path);
576
+ const label = `${frame.keyword} ${frame.text}`;
577
+ return /* @__PURE__ */ jsxs11("li", { className: "w-40 shrink-0", children: [
578
+ /* @__PURE__ */ jsx18(
579
+ "a",
580
+ {
581
+ href: `#${frame.stepId}`,
582
+ "aria-label": `Jump to step: ${label}`,
583
+ className: "block overflow-hidden rounded-md border border-border transition-colors hover:border-ring",
584
+ children: src ? /* @__PURE__ */ jsx18(
585
+ "img",
586
+ {
587
+ src,
588
+ alt: frame.alt ?? label,
589
+ loading: "lazy",
590
+ className: "h-24 w-full bg-muted object-cover object-top"
591
+ }
592
+ ) : /* @__PURE__ */ jsx18("span", { className: "flex h-24 w-full items-center justify-center border-b border-dashed border-border bg-muted px-2 text-center text-[0.6875rem] text-muted-foreground", children: "Screenshot unavailable" })
593
+ }
594
+ ),
595
+ /* @__PURE__ */ jsxs11("p", { className: "mt-1 flex items-baseline gap-1.5 text-[0.6875rem] leading-snug", children: [
596
+ /* @__PURE__ */ jsx18("span", { "aria-hidden": true, className: cn("shrink-0", FRAME_GLYPH_COLOR[frame.status]), children: FRAME_GLYPH[frame.status] ?? "\u25CB" }),
597
+ /* @__PURE__ */ jsxs11("span", { className: "min-w-0", children: [
598
+ /* @__PURE__ */ jsx18("span", { className: "font-mono font-semibold text-keyword", children: frame.keyword }),
599
+ " ",
600
+ /* @__PURE__ */ jsx18("span", { className: "text-muted-foreground", children: frame.alt ?? frame.text })
601
+ ] })
602
+ ] })
603
+ ] });
604
+ }
605
+
523
606
  // src/components/ReportAttachments.tsx
524
- import { Fragment as Fragment6, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
607
+ import { Fragment as Fragment6, jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
525
608
  function ReportAttachments({ attachments }) {
526
609
  if (attachments.length === 0) return null;
527
610
  return (
528
611
  // role="group" (not a labelled <section>) so multiple scenarios' attachment
529
612
  // blocks don't create duplicate "Attachments" region landmarks.
530
- /* @__PURE__ */ jsx18("div", { role: "group", "aria-label": "Attachments", className: "mt-3 flex flex-col gap-2", children: attachments.map((att, i) => {
613
+ /* @__PURE__ */ jsx19("div", { role: "group", "aria-label": "Attachments", className: "mt-3 flex flex-col gap-2", children: attachments.map((att, i) => {
531
614
  const dataUri = att.contentEncoding === "BASE64" ? `data:${att.mediaType};base64,${att.body}` : `data:${att.mediaType},${encodeURIComponent(att.body)}`;
532
615
  const isImage = att.mediaType.startsWith("image/");
533
- return /* @__PURE__ */ jsx18("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs11(Fragment6, { children: [
534
- /* @__PURE__ */ jsx18(
616
+ return /* @__PURE__ */ jsx19("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs12(Fragment6, { children: [
617
+ /* @__PURE__ */ jsx19(
535
618
  "img",
536
619
  {
537
620
  src: dataUri,
@@ -540,8 +623,8 @@ function ReportAttachments({ attachments }) {
540
623
  className: "max-w-full rounded-md border border-border"
541
624
  }
542
625
  ),
543
- /* @__PURE__ */ jsx18("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
544
- ] }) : /* @__PURE__ */ jsxs11(
626
+ /* @__PURE__ */ jsx19("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
627
+ ] }) : /* @__PURE__ */ jsxs12(
545
628
  "a",
546
629
  {
547
630
  href: dataUri,
@@ -550,7 +633,7 @@ function ReportAttachments({ attachments }) {
550
633
  children: [
551
634
  att.name,
552
635
  " ",
553
- /* @__PURE__ */ jsxs11("span", { className: "text-muted-foreground", children: [
636
+ /* @__PURE__ */ jsxs12("span", { className: "text-muted-foreground", children: [
554
637
  "(",
555
638
  att.mediaType,
556
639
  ")"
@@ -638,7 +721,7 @@ function traceWindow(rows) {
638
721
  }
639
722
 
640
723
  // src/components/ReportTrace.tsx
641
- import { jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
724
+ import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
642
725
  var BAR_COLOR = {
643
726
  ok: "bg-pass",
644
727
  error: "bg-fail",
@@ -649,8 +732,8 @@ function ReportTrace({ spans }) {
649
732
  const rows = toTraceRows(spans);
650
733
  if (rows.length === 0) return null;
651
734
  const { minStartMs, totalMs } = traceWindow(rows);
652
- return /* @__PURE__ */ jsxs12("details", { className: "mt-3 rounded-md border border-border bg-muted/30", children: [
653
- /* @__PURE__ */ jsxs12("summary", { className: "cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground", children: [
735
+ return /* @__PURE__ */ jsxs13("details", { className: "mt-3 rounded-md border border-border bg-muted/30", children: [
736
+ /* @__PURE__ */ jsxs13("summary", { className: "cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground", children: [
654
737
  "Trace (",
655
738
  rows.length,
656
739
  " span",
@@ -659,11 +742,11 @@ function ReportTrace({ spans }) {
659
742
  formatDuration(totalMs),
660
743
  ")"
661
744
  ] }),
662
- /* @__PURE__ */ jsx19("ul", { className: "flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]", children: rows.map((row, i) => {
745
+ /* @__PURE__ */ jsx20("ul", { className: "flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]", children: rows.map((row, i) => {
663
746
  const leftPct = (row.startTimeMs - minStartMs) / totalMs * 100;
664
747
  const widthPct = Math.max(row.durationMs / totalMs * 100, 0.5);
665
- return /* @__PURE__ */ jsxs12("li", { className: "flex items-center gap-2", children: [
666
- /* @__PURE__ */ jsx19(
748
+ return /* @__PURE__ */ jsxs13("li", { className: "flex items-center gap-2", children: [
749
+ /* @__PURE__ */ jsx20(
667
750
  "span",
668
751
  {
669
752
  className: "min-w-0 flex-1 truncate text-foreground",
@@ -672,14 +755,14 @@ function ReportTrace({ spans }) {
672
755
  children: row.name
673
756
  }
674
757
  ),
675
- /* @__PURE__ */ jsx19("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx19(
758
+ /* @__PURE__ */ jsx20("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx20(
676
759
  "span",
677
760
  {
678
761
  className: cn("absolute top-0 h-full rounded-sm", BAR_COLOR[row.status]),
679
762
  style: { left: `${leftPct}%`, width: `${widthPct}%` }
680
763
  }
681
764
  ) }),
682
- /* @__PURE__ */ jsx19("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
765
+ /* @__PURE__ */ jsx20("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
683
766
  ] }, `${row.spanId}-${i}`);
684
767
  }) })
685
768
  ] });
@@ -748,7 +831,7 @@ function diffSinceLastRun(history2, scenarios) {
748
831
  }
749
832
 
750
833
  // src/components/ScenarioRunHistory.tsx
751
- import { Fragment as Fragment7, jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
834
+ import { Fragment as Fragment7, jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
752
835
  var MAX_DOTS = 10;
753
836
  var DOT_COLOR = {
754
837
  passed: "bg-pass",
@@ -768,16 +851,16 @@ function ScenarioRunHistory({ scenarioId }) {
768
851
  const recent = entries.slice(-MAX_DOTS);
769
852
  const flaky = flakinessOf(recent) === "flaky";
770
853
  const summary = flaky ? `${describeRunHistory(recent)} \xB7 Flaky` : describeRunHistory(recent);
771
- return /* @__PURE__ */ jsxs13(Fragment7, { children: [
772
- flaky ? /* @__PURE__ */ jsx20(Badge, { variant: "pending", "aria-label": "Flaky: status flips between recent runs", title: summary, children: "Flaky" }) : null,
773
- /* @__PURE__ */ jsx20(
854
+ return /* @__PURE__ */ jsxs14(Fragment7, { children: [
855
+ flaky ? /* @__PURE__ */ jsx21(Badge, { variant: "pending", "aria-label": "Flaky: status flips between recent runs", title: summary, children: "Flaky" }) : null,
856
+ /* @__PURE__ */ jsx21(
774
857
  "span",
775
858
  {
776
859
  role: "img",
777
860
  "aria-label": `Run history: ${summary}`,
778
861
  title: summary,
779
862
  className: "flex shrink-0 items-center gap-[3px]",
780
- children: recent.map((e, i) => /* @__PURE__ */ jsx20(
863
+ children: recent.map((e, i) => /* @__PURE__ */ jsx21(
781
864
  "span",
782
865
  {
783
866
  "aria-hidden": true,
@@ -994,9 +1077,9 @@ function scenarioPermalink(scenario) {
994
1077
 
995
1078
  // src/components/ui/card.tsx
996
1079
  import "react";
997
- import { jsx as jsx21 } from "react/jsx-runtime";
1080
+ import { jsx as jsx22 } from "react/jsx-runtime";
998
1081
  function Card({ className, ...props }) {
999
- return /* @__PURE__ */ jsx21(
1082
+ return /* @__PURE__ */ jsx22(
1000
1083
  "div",
1001
1084
  {
1002
1085
  "data-slot": "card",
@@ -1009,7 +1092,7 @@ function Card({ className, ...props }) {
1009
1092
  );
1010
1093
  }
1011
1094
  function CardHeader({ className, ...props }) {
1012
- return /* @__PURE__ */ jsx21(
1095
+ return /* @__PURE__ */ jsx22(
1013
1096
  "div",
1014
1097
  {
1015
1098
  "data-slot": "card-header",
@@ -1022,7 +1105,7 @@ function CardHeader({ className, ...props }) {
1022
1105
  );
1023
1106
  }
1024
1107
  function CardContent({ className, ...props }) {
1025
- return /* @__PURE__ */ jsx21(
1108
+ return /* @__PURE__ */ jsx22(
1026
1109
  "div",
1027
1110
  {
1028
1111
  "data-slot": "card-content",
@@ -1036,13 +1119,13 @@ function CardContent({ className, ...props }) {
1036
1119
  import "react";
1037
1120
  import { Menu as MenuPrimitive } from "@base-ui/react/menu";
1038
1121
  import { CheckIcon } from "lucide-react";
1039
- import { jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
1122
+ import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
1040
1123
  var itemClasses = "relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg:not([class*='text-'])]:text-muted-foreground";
1041
1124
  function DropdownMenu(props) {
1042
- return /* @__PURE__ */ jsx22(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
1125
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
1043
1126
  }
1044
1127
  function DropdownMenuTrigger(props) {
1045
- return /* @__PURE__ */ jsx22(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
1128
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
1046
1129
  }
1047
1130
  function DropdownMenuContent({
1048
1131
  className,
@@ -1050,14 +1133,14 @@ function DropdownMenuContent({
1050
1133
  sideOffset = 4,
1051
1134
  ...props
1052
1135
  }) {
1053
- return /* @__PURE__ */ jsx22(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx22(
1136
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx23(
1054
1137
  MenuPrimitive.Positioner,
1055
1138
  {
1056
1139
  "data-slot": "dropdown-menu-positioner",
1057
1140
  className: "z-50",
1058
1141
  align,
1059
1142
  sideOffset,
1060
- children: /* @__PURE__ */ jsx22(
1143
+ children: /* @__PURE__ */ jsx23(
1061
1144
  MenuPrimitive.Popup,
1062
1145
  {
1063
1146
  "data-slot": "dropdown-menu-content",
@@ -1075,7 +1158,7 @@ function DropdownMenuItem({
1075
1158
  className,
1076
1159
  ...props
1077
1160
  }) {
1078
- return /* @__PURE__ */ jsx22(
1161
+ return /* @__PURE__ */ jsx23(
1079
1162
  MenuPrimitive.Item,
1080
1163
  {
1081
1164
  "data-slot": "dropdown-menu-item",
@@ -1087,7 +1170,7 @@ function DropdownMenuItem({
1087
1170
 
1088
1171
  // src/components/ReportScenario.tsx
1089
1172
  import { LinkIcon, FileTextIcon, SparklesIcon, MoreHorizontalIcon } from "lucide-react";
1090
- import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
1173
+ import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
1091
1174
  var STATUS_META = {
1092
1175
  passed: { label: "Passed", glyph: "\u2713", glyphColor: "text-pass", badgeVariant: "passed", showPill: false },
1093
1176
  failed: { label: "Failed", glyph: "\u2717", glyphColor: "text-fail", badgeVariant: "failed", showPill: true },
@@ -1103,7 +1186,7 @@ function ReportScenario({ scenario, hideTitle = false }) {
1103
1186
  const collapsible = collapse !== null && !hideTitle;
1104
1187
  const collapsed = collapsible ? collapse.isCollapsed(scenario.id) : false;
1105
1188
  const actions = useScenarioActions();
1106
- return /* @__PURE__ */ jsxs15(
1189
+ return /* @__PURE__ */ jsxs16(
1107
1190
  Card,
1108
1191
  {
1109
1192
  id: scenario.id,
@@ -1111,10 +1194,10 @@ function ReportScenario({ scenario, hideTitle = false }) {
1111
1194
  ...hideTitle ? { "aria-label": `${scenario.title}, ${label}` } : { "aria-labelledby": titleId },
1112
1195
  className: "gap-0 py-0",
1113
1196
  children: [
1114
- /* @__PURE__ */ jsxs15(CardHeader, { className: "px-4 py-3", children: [
1115
- /* @__PURE__ */ jsxs15("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
1116
- hideTitle ? null : /* @__PURE__ */ jsxs15("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
1117
- collapsible ? /* @__PURE__ */ jsx23(
1197
+ /* @__PURE__ */ jsxs16(CardHeader, { className: "px-4 py-3", children: [
1198
+ /* @__PURE__ */ jsxs16("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
1199
+ hideTitle ? null : /* @__PURE__ */ jsxs16("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
1200
+ collapsible ? /* @__PURE__ */ jsx24(
1118
1201
  "button",
1119
1202
  {
1120
1203
  type: "button",
@@ -1123,49 +1206,49 @@ function ReportScenario({ scenario, hideTitle = false }) {
1123
1206
  "aria-controls": bodyId,
1124
1207
  "aria-label": `Toggle ${scenario.title}`,
1125
1208
  className: "shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",
1126
- children: /* @__PURE__ */ jsx23("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
1209
+ children: /* @__PURE__ */ jsx24("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
1127
1210
  }
1128
1211
  ) : null,
1129
- /* @__PURE__ */ jsx23("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
1130
- /* @__PURE__ */ jsx23("span", { children: scenario.title })
1212
+ /* @__PURE__ */ jsx24("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
1213
+ /* @__PURE__ */ jsx24("span", { children: scenario.title })
1131
1214
  ] }),
1132
- /* @__PURE__ */ jsxs15("div", { className: "flex shrink-0 items-center gap-2", children: [
1133
- /* @__PURE__ */ jsx23(ScenarioRunHistory, { scenarioId: scenario.id }),
1134
- scenario.durationMs > 0 ? /* @__PURE__ */ jsx23("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
1135
- meta.showPill ? /* @__PURE__ */ jsx23(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ jsx23("span", { className: "sr-only", children: `Status: ${label}` }),
1136
- actions ? /* @__PURE__ */ jsxs15(DropdownMenu, { children: [
1137
- /* @__PURE__ */ jsx23(
1215
+ /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2", children: [
1216
+ /* @__PURE__ */ jsx24(ScenarioRunHistory, { scenarioId: scenario.id }),
1217
+ scenario.durationMs > 0 ? /* @__PURE__ */ jsx24("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
1218
+ meta.showPill ? /* @__PURE__ */ jsx24(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ jsx24("span", { className: "sr-only", children: `Status: ${label}` }),
1219
+ actions ? /* @__PURE__ */ jsxs16(DropdownMenu, { children: [
1220
+ /* @__PURE__ */ jsx24(
1138
1221
  DropdownMenuTrigger,
1139
1222
  {
1140
1223
  "aria-label": `Actions for ${scenario.title}`,
1141
1224
  className: "cursor-pointer rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground [&_svg]:size-4",
1142
- children: /* @__PURE__ */ jsx23(MoreHorizontalIcon, { "aria-hidden": true })
1225
+ children: /* @__PURE__ */ jsx24(MoreHorizontalIcon, { "aria-hidden": true })
1143
1226
  }
1144
1227
  ),
1145
- /* @__PURE__ */ jsxs15(DropdownMenuContent, { align: "end", children: [
1146
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
1147
- /* @__PURE__ */ jsx23(LinkIcon, {}),
1228
+ /* @__PURE__ */ jsxs16(DropdownMenuContent, { align: "end", children: [
1229
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
1230
+ /* @__PURE__ */ jsx24(LinkIcon, {}),
1148
1231
  " Copy link"
1149
1232
  ] }),
1150
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
1151
- /* @__PURE__ */ jsx23(FileTextIcon, {}),
1233
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
1234
+ /* @__PURE__ */ jsx24(FileTextIcon, {}),
1152
1235
  " Copy as Markdown"
1153
1236
  ] }),
1154
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
1155
- /* @__PURE__ */ jsx23(SparklesIcon, {}),
1237
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
1238
+ /* @__PURE__ */ jsx24(SparklesIcon, {}),
1156
1239
  " Explain with AI"
1157
1240
  ] })
1158
1241
  ] })
1159
1242
  ] }) : null
1160
1243
  ] })
1161
1244
  ] }),
1162
- scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? /* @__PURE__ */ jsxs15("ul", { "aria-label": "Tags and tickets", className: "flex flex-wrap gap-1.5", children: [
1163
- scenario.tags.map((t) => /* @__PURE__ */ jsx23("li", { children: /* @__PURE__ */ jsx23(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
1164
- (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ jsx23("li", { children: ticket.url ? /* @__PURE__ */ jsx23("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx23(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ jsx23(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
1245
+ scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? /* @__PURE__ */ jsxs16("ul", { "aria-label": "Tags and tickets", className: "flex flex-wrap gap-1.5", children: [
1246
+ scenario.tags.map((t) => /* @__PURE__ */ jsx24("li", { children: /* @__PURE__ */ jsx24(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
1247
+ (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ jsx24("li", { children: ticket.url ? /* @__PURE__ */ jsx24("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx24(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ jsx24(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
1165
1248
  ] }) : null
1166
1249
  ] }),
1167
- /* @__PURE__ */ jsxs15(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
1168
- scenario.errorMessage ? /* @__PURE__ */ jsx23(
1250
+ /* @__PURE__ */ jsxs16(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
1251
+ scenario.errorMessage ? /* @__PURE__ */ jsx24(
1169
1252
  "pre",
1170
1253
  {
1171
1254
  role: "alert",
@@ -1173,10 +1256,11 @@ function ReportScenario({ scenario, hideTitle = false }) {
1173
1256
  children: scenario.errorMessage
1174
1257
  }
1175
1258
  ) : null,
1176
- /* @__PURE__ */ jsx23(ReportSteps, { scenario }),
1177
- scenario.docEntries.length > 0 ? /* @__PURE__ */ jsx23("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ jsx23(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
1178
- /* @__PURE__ */ jsx23(ReportAttachments, { attachments: scenario.attachments }),
1179
- /* @__PURE__ */ jsx23(ReportTrace, { spans: scenario.otelSpans })
1259
+ /* @__PURE__ */ jsx24(ReportStoryboard, { scenario }),
1260
+ /* @__PURE__ */ jsx24(ReportSteps, { scenario }),
1261
+ scenario.docEntries.length > 0 ? /* @__PURE__ */ jsx24("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ jsx24(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
1262
+ /* @__PURE__ */ jsx24(ReportAttachments, { attachments: scenario.attachments }),
1263
+ /* @__PURE__ */ jsx24(ReportTrace, { spans: scenario.otelSpans })
1180
1264
  ] })
1181
1265
  ]
1182
1266
  }
@@ -1184,13 +1268,13 @@ function ReportScenario({ scenario, hideTitle = false }) {
1184
1268
  }
1185
1269
 
1186
1270
  // src/components/ReportScenarioList.tsx
1187
- import { Fragment as Fragment8, jsx as jsx24 } from "react/jsx-runtime";
1271
+ import { Fragment as Fragment8, jsx as jsx25 } from "react/jsx-runtime";
1188
1272
  function ReportScenarioList({ feature }) {
1189
- return /* @__PURE__ */ jsx24(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx24(ReportScenario, { scenario }, scenario.id)) });
1273
+ return /* @__PURE__ */ jsx25(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx25(ReportScenario, { scenario }, scenario.id)) });
1190
1274
  }
1191
1275
 
1192
1276
  // src/components/ReportFeature.tsx
1193
- import { Fragment as Fragment9, jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
1277
+ import { Fragment as Fragment9, jsx as jsx26, jsxs as jsxs17 } from "react/jsx-runtime";
1194
1278
  function ReportFeature({ feature }) {
1195
1279
  const titleId = `${feature.id}-title`;
1196
1280
  const bodyId = `${feature.id}-body`;
@@ -1201,7 +1285,7 @@ function ReportFeature({ feature }) {
1201
1285
  return (
1202
1286
  // Suite = a section heading + a divider, NOT another bordered card. Drops a
1203
1287
  // layer of nesting so the scenario cards below read as the primary unit.
1204
- /* @__PURE__ */ jsxs16(
1288
+ /* @__PURE__ */ jsxs17(
1205
1289
  "section",
1206
1290
  {
1207
1291
  id: feature.id,
@@ -1209,9 +1293,9 @@ function ReportFeature({ feature }) {
1209
1293
  "aria-labelledby": titleId,
1210
1294
  className: "flex flex-col gap-3",
1211
1295
  children: [
1212
- /* @__PURE__ */ jsxs16("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1213
- /* @__PURE__ */ jsxs16("div", { className: "min-w-0", children: [
1214
- /* @__PURE__ */ jsx25("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs16(
1296
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1297
+ /* @__PURE__ */ jsxs17("div", { className: "min-w-0", children: [
1298
+ /* @__PURE__ */ jsx26("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs17(
1215
1299
  "button",
1216
1300
  {
1217
1301
  type: "button",
@@ -1220,31 +1304,31 @@ function ReportFeature({ feature }) {
1220
1304
  "aria-controls": bodyId,
1221
1305
  className: "flex w-full cursor-pointer items-center gap-2 text-left hover:text-foreground/80",
1222
1306
  children: [
1223
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1224
- /* @__PURE__ */ jsx25("span", { className: "truncate", children: feature.title })
1307
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1308
+ /* @__PURE__ */ jsx26("span", { className: "truncate", children: feature.title })
1225
1309
  ]
1226
1310
  }
1227
1311
  ) : feature.title }),
1228
- /* @__PURE__ */ jsx25("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1312
+ /* @__PURE__ */ jsx26("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1229
1313
  ] }),
1230
- /* @__PURE__ */ jsxs16(
1314
+ /* @__PURE__ */ jsxs17(
1231
1315
  "p",
1232
1316
  {
1233
1317
  className: "flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",
1234
1318
  "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1235
1319
  children: [
1236
- /* @__PURE__ */ jsxs16("span", { children: [
1320
+ /* @__PURE__ */ jsxs17("span", { children: [
1237
1321
  s.passed,
1238
1322
  " passed"
1239
1323
  ] }),
1240
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1241
- /* @__PURE__ */ jsxs16("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1324
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, children: "\xB7" }),
1325
+ /* @__PURE__ */ jsxs17("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1242
1326
  s.failed,
1243
1327
  " failed"
1244
1328
  ] }),
1245
- skipped > 0 ? /* @__PURE__ */ jsxs16(Fragment9, { children: [
1246
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1247
- /* @__PURE__ */ jsxs16("span", { children: [
1329
+ skipped > 0 ? /* @__PURE__ */ jsxs17(Fragment9, { children: [
1330
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, children: "\xB7" }),
1331
+ /* @__PURE__ */ jsxs17("span", { children: [
1248
1332
  skipped,
1249
1333
  " skipped"
1250
1334
  ] })
@@ -1253,7 +1337,7 @@ function ReportFeature({ feature }) {
1253
1337
  }
1254
1338
  )
1255
1339
  ] }),
1256
- /* @__PURE__ */ jsx25("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx25(ReportScenarioList, { feature }) })
1340
+ /* @__PURE__ */ jsx26("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx26(ReportScenarioList, { feature }) })
1257
1341
  ]
1258
1342
  }
1259
1343
  )
@@ -1261,17 +1345,17 @@ function ReportFeature({ feature }) {
1261
1345
  }
1262
1346
 
1263
1347
  // src/components/ReportFeatureList.tsx
1264
- import { jsx as jsx26 } from "react/jsx-runtime";
1348
+ import { jsx as jsx27 } from "react/jsx-runtime";
1265
1349
  function ReportFeatureList() {
1266
1350
  const report = useReport();
1267
- return /* @__PURE__ */ jsx26("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx26(ReportFeature, { feature }, feature.id)) });
1351
+ return /* @__PURE__ */ jsx27("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx27(ReportFeature, { feature }, feature.id)) });
1268
1352
  }
1269
1353
 
1270
1354
  // src/components/ui/empty.tsx
1271
1355
  import { cva as cva2 } from "class-variance-authority";
1272
- import { jsx as jsx27 } from "react/jsx-runtime";
1356
+ import { jsx as jsx28 } from "react/jsx-runtime";
1273
1357
  function Empty({ className, ...props }) {
1274
- return /* @__PURE__ */ jsx27(
1358
+ return /* @__PURE__ */ jsx28(
1275
1359
  "div",
1276
1360
  {
1277
1361
  "data-slot": "empty",
@@ -1284,7 +1368,7 @@ function Empty({ className, ...props }) {
1284
1368
  );
1285
1369
  }
1286
1370
  function EmptyHeader({ className, ...props }) {
1287
- return /* @__PURE__ */ jsx27(
1371
+ return /* @__PURE__ */ jsx28(
1288
1372
  "div",
1289
1373
  {
1290
1374
  "data-slot": "empty-header",
@@ -1311,7 +1395,7 @@ var emptyMediaVariants = cva2(
1311
1395
  }
1312
1396
  );
1313
1397
  function EmptyTitle({ className, ...props }) {
1314
- return /* @__PURE__ */ jsx27(
1398
+ return /* @__PURE__ */ jsx28(
1315
1399
  "div",
1316
1400
  {
1317
1401
  "data-slot": "empty-title",
@@ -1322,16 +1406,16 @@ function EmptyTitle({ className, ...props }) {
1322
1406
  }
1323
1407
 
1324
1408
  // src/components/ReportEmpty.tsx
1325
- import { jsx as jsx28 } from "react/jsx-runtime";
1409
+ import { jsx as jsx29 } from "react/jsx-runtime";
1326
1410
  function ReportEmpty({ message }) {
1327
- return /* @__PURE__ */ jsx28(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx28(EmptyHeader, { children: /* @__PURE__ */ jsx28(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1411
+ return /* @__PURE__ */ jsx29(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx29(EmptyHeader, { children: /* @__PURE__ */ jsx29(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1328
1412
  }
1329
1413
 
1330
1414
  // src/components/ReportSummary.tsx
1331
- import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
1415
+ import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1332
1416
  function ReportSummary({ className }) {
1333
1417
  const report = useReport();
1334
- return /* @__PURE__ */ jsx29(
1418
+ return /* @__PURE__ */ jsx30(
1335
1419
  ReportSummaryView,
1336
1420
  {
1337
1421
  summary: report.summary,
@@ -1357,7 +1441,7 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1357
1441
  if (summary.pending > 0) {
1358
1442
  cards.push({ status: "pending", label: "Pending", value: summary.pending });
1359
1443
  }
1360
- return /* @__PURE__ */ jsx29(
1444
+ return /* @__PURE__ */ jsx30(
1361
1445
  "dl",
1362
1446
  {
1363
1447
  className: cn(
@@ -1370,17 +1454,17 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1370
1454
  "aria-label": ariaLabel,
1371
1455
  children: cards.map((c) => {
1372
1456
  const tone = TONE[c.status];
1373
- return /* @__PURE__ */ jsxs17(
1457
+ return /* @__PURE__ */ jsxs18(
1374
1458
  "div",
1375
1459
  {
1376
1460
  "data-status": c.status,
1377
1461
  className: "rounded-lg border bg-card px-4 py-3",
1378
1462
  children: [
1379
- /* @__PURE__ */ jsxs17("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1380
- /* @__PURE__ */ jsx29("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1463
+ /* @__PURE__ */ jsxs18("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1464
+ /* @__PURE__ */ jsx30("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1381
1465
  c.label
1382
1466
  ] }),
1383
- /* @__PURE__ */ jsx29("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1467
+ /* @__PURE__ */ jsx30("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1384
1468
  ]
1385
1469
  },
1386
1470
  c.status
@@ -1440,7 +1524,7 @@ function prUrl(ci) {
1440
1524
  }
1441
1525
 
1442
1526
  // src/components/ReportMeta.tsx
1443
- import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1527
+ import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1444
1528
  function ReportMeta() {
1445
1529
  const report = useReport();
1446
1530
  const items = [];
@@ -1463,13 +1547,13 @@ function ReportMeta() {
1463
1547
  const short = sha.slice(0, 8);
1464
1548
  items.push({
1465
1549
  label: "Commit",
1466
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1550
+ value: url ? /* @__PURE__ */ jsx31("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1467
1551
  });
1468
1552
  }
1469
1553
  if (report.ci) {
1470
1554
  items.push({
1471
1555
  label: "CI",
1472
- value: report.ci.url ? /* @__PURE__ */ jsxs18("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1556
+ value: report.ci.url ? /* @__PURE__ */ jsxs19("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1473
1557
  ciDisplayName(report.ci.name),
1474
1558
  report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""
1475
1559
  ] }) : `${ciDisplayName(report.ci.name)}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""}`
@@ -1480,7 +1564,7 @@ function ReportMeta() {
1480
1564
  const label = `#${report.ci.prNumber}`;
1481
1565
  items.push({
1482
1566
  label: "PR",
1483
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1567
+ value: url ? /* @__PURE__ */ jsx31("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1484
1568
  });
1485
1569
  }
1486
1570
  if (items.length === 0) return null;
@@ -1488,50 +1572,50 @@ function ReportMeta() {
1488
1572
  // Run metadata is useful but secondary to "what failed" — tuck it into a
1489
1573
  // collapsed disclosure so it doesn't push the result down. Native <details>
1490
1574
  // so it works with no JS (the SSR/no-hydration report still toggles).
1491
- /* @__PURE__ */ jsxs18("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1492
- /* @__PURE__ */ jsxs18("summary", { className: "flex cursor-pointer list-none select-none items-center gap-1.5 px-4 py-2 font-medium text-muted-foreground [&::-webkit-details-marker]:hidden", children: [
1493
- /* @__PURE__ */ jsx30("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1575
+ /* @__PURE__ */ jsxs19("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1576
+ /* @__PURE__ */ jsxs19("summary", { className: "flex cursor-pointer list-none select-none items-center gap-1.5 px-4 py-2 font-medium text-muted-foreground [&::-webkit-details-marker]:hidden", children: [
1577
+ /* @__PURE__ */ jsx31("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1494
1578
  "Run details"
1495
1579
  ] }),
1496
- /* @__PURE__ */ jsx30("dl", { className: "flex flex-wrap gap-x-5 gap-y-2 border-t border-border px-4 py-3 text-muted-foreground", "aria-label": "Run metadata", children: items.map((item) => /* @__PURE__ */ jsxs18("div", { className: "flex items-baseline gap-1.5", children: [
1497
- /* @__PURE__ */ jsx30("dt", { className: "font-medium", children: item.label }),
1498
- /* @__PURE__ */ jsx30("dd", { className: "font-mono text-foreground", children: item.value })
1580
+ /* @__PURE__ */ jsx31("dl", { className: "flex flex-wrap gap-x-5 gap-y-2 border-t border-border px-4 py-3 text-muted-foreground", "aria-label": "Run metadata", children: items.map((item) => /* @__PURE__ */ jsxs19("div", { className: "flex items-baseline gap-1.5", children: [
1581
+ /* @__PURE__ */ jsx31("dt", { className: "font-medium", children: item.label }),
1582
+ /* @__PURE__ */ jsx31("dd", { className: "font-mono text-foreground", children: item.value })
1499
1583
  ] }, item.label)) })
1500
1584
  ] })
1501
1585
  );
1502
1586
  }
1503
1587
 
1504
1588
  // src/components/ReportSchemaError.tsx
1505
- import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1589
+ import { jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1506
1590
  function ReportSchemaError({ error }) {
1507
- return /* @__PURE__ */ jsxs19("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1508
- /* @__PURE__ */ jsx31("p", { children: /* @__PURE__ */ jsx31("strong", { children: "Report could not be displayed." }) }),
1509
- /* @__PURE__ */ jsx31("p", { children: error.message }),
1510
- error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs19("p", { children: [
1591
+ return /* @__PURE__ */ jsxs20("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1592
+ /* @__PURE__ */ jsx32("p", { children: /* @__PURE__ */ jsx32("strong", { children: "Report could not be displayed." }) }),
1593
+ /* @__PURE__ */ jsx32("p", { children: error.message }),
1594
+ error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs20("p", { children: [
1511
1595
  "The report bundle is newer than this version of ",
1512
- /* @__PURE__ */ jsx31("code", { children: "executable-stories-react" }),
1596
+ /* @__PURE__ */ jsx32("code", { children: "executable-stories-react" }),
1513
1597
  ". Upgrade the package, or regenerate the report with an older formatters CLI."
1514
1598
  ] }) : null,
1515
- error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs19("details", { children: [
1516
- /* @__PURE__ */ jsxs19("summary", { children: [
1599
+ error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs20("details", { children: [
1600
+ /* @__PURE__ */ jsxs20("summary", { children: [
1517
1601
  error.issues.length,
1518
1602
  " validation issue",
1519
1603
  error.issues.length === 1 ? "" : "s"
1520
1604
  ] }),
1521
- /* @__PURE__ */ jsx31("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1605
+ /* @__PURE__ */ jsx32("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1522
1606
  ] }) : null
1523
1607
  ] });
1524
1608
  }
1525
1609
 
1526
1610
  // src/components/ReportShell.tsx
1527
- import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1611
+ import { Fragment as Fragment10, jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
1528
1612
  function ReportErrorShell({
1529
1613
  error,
1530
1614
  className,
1531
1615
  title,
1532
1616
  dataTheme
1533
1617
  }) {
1534
- return /* @__PURE__ */ jsx32("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx32(ReportSchemaError, { error }) });
1618
+ return /* @__PURE__ */ jsx33("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx33(ReportSchemaError, { error }) });
1535
1619
  }
1536
1620
 
1537
1621
  // src/interactive/ReportInteractive.tsx
@@ -1540,12 +1624,12 @@ import { Monitor, Moon, Sun } from "lucide-react";
1540
1624
  // src/components/ui/switch.tsx
1541
1625
  import "react";
1542
1626
  import { Switch as SwitchPrimitive } from "@base-ui/react/switch";
1543
- import { jsx as jsx33 } from "react/jsx-runtime";
1627
+ import { jsx as jsx34 } from "react/jsx-runtime";
1544
1628
  function Switch({
1545
1629
  className,
1546
1630
  ...props
1547
1631
  }) {
1548
- return /* @__PURE__ */ jsx33(
1632
+ return /* @__PURE__ */ jsx34(
1549
1633
  SwitchPrimitive.Root,
1550
1634
  {
1551
1635
  "data-slot": "switch",
@@ -1554,7 +1638,7 @@ function Switch({
1554
1638
  className
1555
1639
  ),
1556
1640
  ...props,
1557
- children: /* @__PURE__ */ jsx33(
1641
+ children: /* @__PURE__ */ jsx34(
1558
1642
  SwitchPrimitive.Thumb,
1559
1643
  {
1560
1644
  "data-slot": "switch-thumb",
@@ -1570,7 +1654,7 @@ import * as React5 from "react";
1570
1654
  import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
1571
1655
  import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
1572
1656
  import { cva as cva3 } from "class-variance-authority";
1573
- import { jsx as jsx34 } from "react/jsx-runtime";
1657
+ import { jsx as jsx35 } from "react/jsx-runtime";
1574
1658
  var toggleItemVariants = cva3(
1575
1659
  "inline-flex items-center justify-center gap-1.5 rounded-md font-medium whitespace-nowrap text-muted-foreground transition-[color,background-color,box-shadow] outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 data-[pressed]:bg-background data-[pressed]:text-foreground data-[pressed]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1576
1660
  {
@@ -1592,13 +1676,13 @@ function ToggleGroup({
1592
1676
  children,
1593
1677
  ...props
1594
1678
  }) {
1595
- return /* @__PURE__ */ jsx34(
1679
+ return /* @__PURE__ */ jsx35(
1596
1680
  ToggleGroupPrimitive,
1597
1681
  {
1598
1682
  "data-slot": "toggle-group",
1599
1683
  className: cn("flex w-fit items-center gap-0.5 rounded-lg bg-muted p-0.5", className),
1600
1684
  ...props,
1601
- children: /* @__PURE__ */ jsx34(ToggleGroupContext.Provider, { value: { size }, children })
1685
+ children: /* @__PURE__ */ jsx35(ToggleGroupContext.Provider, { value: { size }, children })
1602
1686
  }
1603
1687
  );
1604
1688
  }
@@ -1609,7 +1693,7 @@ function ToggleGroupItem({
1609
1693
  ...props
1610
1694
  }) {
1611
1695
  const context = React5.useContext(ToggleGroupContext);
1612
- return /* @__PURE__ */ jsx34(
1696
+ return /* @__PURE__ */ jsx35(
1613
1697
  TogglePrimitive,
1614
1698
  {
1615
1699
  "data-slot": "toggle-group-item",
@@ -1629,9 +1713,9 @@ import { Search } from "lucide-react";
1629
1713
 
1630
1714
  // src/components/ui/input.tsx
1631
1715
  import "react";
1632
- import { jsx as jsx35 } from "react/jsx-runtime";
1716
+ import { jsx as jsx36 } from "react/jsx-runtime";
1633
1717
  function Input({ className, type, ...props }) {
1634
- return /* @__PURE__ */ jsx35(
1718
+ return /* @__PURE__ */ jsx36(
1635
1719
  "input",
1636
1720
  {
1637
1721
  type,
@@ -1648,7 +1732,7 @@ function Input({ className, type, ...props }) {
1648
1732
  }
1649
1733
 
1650
1734
  // src/interactive/ReportSearch.tsx
1651
- import { jsx as jsx36, jsxs as jsxs21 } from "react/jsx-runtime";
1735
+ import { jsx as jsx37, jsxs as jsxs22 } from "react/jsx-runtime";
1652
1736
  var ReportSearch = forwardRef(
1653
1737
  function ReportSearch2(props, ref) {
1654
1738
  const {
@@ -1670,17 +1754,17 @@ var ReportSearch = forwardRef(
1670
1754
  e.preventDefault();
1671
1755
  }
1672
1756
  }
1673
- return /* @__PURE__ */ jsxs21("div", { className: cn("es-search flex flex-col gap-1", className), children: [
1674
- /* @__PURE__ */ jsx36("label", { htmlFor: inputId, className: "sr-only", children: "Search" }),
1675
- /* @__PURE__ */ jsxs21("div", { className: "relative w-full sm:w-72", children: [
1676
- /* @__PURE__ */ jsx36(
1757
+ return /* @__PURE__ */ jsxs22("div", { className: cn("es-search flex flex-col gap-1", className), children: [
1758
+ /* @__PURE__ */ jsx37("label", { htmlFor: inputId, className: "sr-only", children: "Search" }),
1759
+ /* @__PURE__ */ jsxs22("div", { className: "relative w-full sm:w-72", children: [
1760
+ /* @__PURE__ */ jsx37(
1677
1761
  Search,
1678
1762
  {
1679
1763
  "aria-hidden": true,
1680
1764
  className: "pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground"
1681
1765
  }
1682
1766
  ),
1683
- /* @__PURE__ */ jsx36(
1767
+ /* @__PURE__ */ jsx37(
1684
1768
  Input,
1685
1769
  {
1686
1770
  ref,
@@ -1697,7 +1781,7 @@ var ReportSearch = forwardRef(
1697
1781
  }
1698
1782
  )
1699
1783
  ] }),
1700
- showCounts ? /* @__PURE__ */ jsxs21(
1784
+ showCounts ? /* @__PURE__ */ jsxs22(
1701
1785
  "span",
1702
1786
  {
1703
1787
  className: "text-xs tabular-nums text-muted-foreground",
@@ -1738,7 +1822,7 @@ function scrollToScenarioId(scenarioId, options = {}) {
1738
1822
  }
1739
1823
 
1740
1824
  // src/interactive/ReportFailureBanner.tsx
1741
- import { jsx as jsx37, jsxs as jsxs22 } from "react/jsx-runtime";
1825
+ import { jsx as jsx38, jsxs as jsxs23 } from "react/jsx-runtime";
1742
1826
  function ReportFailureBanner({ failures }) {
1743
1827
  const first = failures[0];
1744
1828
  const jumpToFirst = useCallback2(() => {
@@ -1746,7 +1830,7 @@ function ReportFailureBanner({ failures }) {
1746
1830
  scrollToScenarioId(first.scenarioId);
1747
1831
  }, [first]);
1748
1832
  if (failures.length === 0) return null;
1749
- return /* @__PURE__ */ jsxs22(
1833
+ return /* @__PURE__ */ jsxs23(
1750
1834
  "div",
1751
1835
  {
1752
1836
  className: "es-failure-banner",
@@ -1754,13 +1838,13 @@ function ReportFailureBanner({ failures }) {
1754
1838
  "aria-live": "polite",
1755
1839
  "aria-label": "Failure summary",
1756
1840
  children: [
1757
- /* @__PURE__ */ jsxs22("span", { className: "es-failure-banner-text", children: [
1758
- /* @__PURE__ */ jsx37("strong", { children: failures.length }),
1841
+ /* @__PURE__ */ jsxs23("span", { className: "es-failure-banner-text", children: [
1842
+ /* @__PURE__ */ jsx38("strong", { children: failures.length }),
1759
1843
  " ",
1760
1844
  "failure",
1761
1845
  failures.length === 1 ? "" : "s"
1762
1846
  ] }),
1763
- /* @__PURE__ */ jsx37(
1847
+ /* @__PURE__ */ jsx38(
1764
1848
  "button",
1765
1849
  {
1766
1850
  type: "button",
@@ -1777,7 +1861,7 @@ function ReportFailureBanner({ failures }) {
1777
1861
 
1778
1862
  // src/interactive/ReportFreshness.tsx
1779
1863
  import { useEffect, useState as useState2 } from "react";
1780
- import { Fragment as Fragment11, jsx as jsx38, jsxs as jsxs23 } from "react/jsx-runtime";
1864
+ import { Fragment as Fragment11, jsx as jsx39, jsxs as jsxs24 } from "react/jsx-runtime";
1781
1865
  function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1782
1866
  const [now, setNow] = useState2(nowMs);
1783
1867
  useEffect(() => {
@@ -1785,7 +1869,7 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1785
1869
  }, [nowMs]);
1786
1870
  if (lastRunMs === void 0 || now === void 0) return null;
1787
1871
  const age = formatRelativeAge(lastRunMs, now);
1788
- const runLink = ciUrl ? /* @__PURE__ */ jsx38(
1872
+ const runLink = ciUrl ? /* @__PURE__ */ jsx39(
1789
1873
  "a",
1790
1874
  {
1791
1875
  href: ciUrl,
@@ -1796,9 +1880,9 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1796
1880
  }
1797
1881
  ) : null;
1798
1882
  if (isReportStale(lastRunMs, staleAfterDays, now)) {
1799
- return /* @__PURE__ */ jsxs23("div", { className: "es-stale-banner", role: "status", "aria-label": "Report freshness", children: [
1800
- /* @__PURE__ */ jsxs23("span", { children: [
1801
- /* @__PURE__ */ jsxs23("strong", { children: [
1883
+ return /* @__PURE__ */ jsxs24("div", { className: "es-stale-banner", role: "status", "aria-label": "Report freshness", children: [
1884
+ /* @__PURE__ */ jsxs24("span", { children: [
1885
+ /* @__PURE__ */ jsxs24("strong", { children: [
1802
1886
  "Last verified ",
1803
1887
  age,
1804
1888
  "."
@@ -1808,10 +1892,10 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1808
1892
  runLink
1809
1893
  ] });
1810
1894
  }
1811
- return /* @__PURE__ */ jsxs23("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
1895
+ return /* @__PURE__ */ jsxs24("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
1812
1896
  "Verified ",
1813
1897
  age,
1814
- runLink ? /* @__PURE__ */ jsxs23(Fragment11, { children: [
1898
+ runLink ? /* @__PURE__ */ jsxs24(Fragment11, { children: [
1815
1899
  " \xB7 ",
1816
1900
  runLink
1817
1901
  ] }) : null
@@ -1819,15 +1903,15 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1819
1903
  }
1820
1904
 
1821
1905
  // src/interactive/ReportLastRunDelta.tsx
1822
- import { Fragment as Fragment12, jsx as jsx39, jsxs as jsxs24 } from "react/jsx-runtime";
1906
+ import { Fragment as Fragment12, jsx as jsx40, jsxs as jsxs25 } from "react/jsx-runtime";
1823
1907
  var MAX_LINKS = 5;
1824
1908
  function ScenarioLinks({ scenarios, tone }) {
1825
- return /* @__PURE__ */ jsxs24(Fragment12, { children: [
1826
- scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs24("span", { children: [
1909
+ return /* @__PURE__ */ jsxs25(Fragment12, { children: [
1910
+ scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs25("span", { children: [
1827
1911
  i > 0 ? ", " : "",
1828
- /* @__PURE__ */ jsx39("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
1912
+ /* @__PURE__ */ jsx40("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
1829
1913
  ] }, s.id)),
1830
- scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs24("span", { children: [
1914
+ scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs25("span", { children: [
1831
1915
  " and ",
1832
1916
  scenarios.length - MAX_LINKS,
1833
1917
  " more"
@@ -1844,23 +1928,23 @@ function ReportLastRunDelta({
1844
1928
  if (!delta) return null;
1845
1929
  const { newlyFailing, newlyPassing, added } = delta;
1846
1930
  if (newlyFailing.length === 0 && newlyPassing.length === 0 && added.length === 0) {
1847
- return /* @__PURE__ */ jsx39("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: "Since last run: no behavior changes." });
1931
+ return /* @__PURE__ */ jsx40("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: "Since last run: no behavior changes." });
1848
1932
  }
1849
- return /* @__PURE__ */ jsxs24("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: [
1850
- /* @__PURE__ */ jsx39("span", { className: "font-medium text-foreground", children: "Since last run:" }),
1851
- newlyFailing.length > 0 ? /* @__PURE__ */ jsxs24("span", { className: "ml-2 text-fail", children: [
1933
+ return /* @__PURE__ */ jsxs25("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: [
1934
+ /* @__PURE__ */ jsx40("span", { className: "font-medium text-foreground", children: "Since last run:" }),
1935
+ newlyFailing.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2 text-fail", children: [
1852
1936
  newlyFailing.length,
1853
1937
  " newly failing (",
1854
- /* @__PURE__ */ jsx39(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
1938
+ /* @__PURE__ */ jsx40(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
1855
1939
  ")"
1856
1940
  ] }) : null,
1857
- newlyPassing.length > 0 ? /* @__PURE__ */ jsxs24("span", { className: "ml-2 text-pass", children: [
1941
+ newlyPassing.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2 text-pass", children: [
1858
1942
  newlyPassing.length,
1859
1943
  " fixed (",
1860
- /* @__PURE__ */ jsx39(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
1944
+ /* @__PURE__ */ jsx40(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
1861
1945
  ")"
1862
1946
  ] }) : null,
1863
- added.length > 0 ? /* @__PURE__ */ jsxs24("span", { className: "ml-2", children: [
1947
+ added.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2", children: [
1864
1948
  added.length,
1865
1949
  " new"
1866
1950
  ] }) : null
@@ -1924,7 +2008,7 @@ function Button({
1924
2008
  }
1925
2009
 
1926
2010
  // src/interactive/ReportShortcutsHelp.tsx
1927
- import { jsx as jsx40, jsxs as jsxs25 } from "react/jsx-runtime";
2011
+ import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
1928
2012
  var SHORTCUTS = [
1929
2013
  { keys: "/", description: "Focus search" },
1930
2014
  { keys: "f", description: "Jump to next failure" },
@@ -1936,9 +2020,9 @@ var SHORTCUTS = [
1936
2020
  ];
1937
2021
  function Keys({ keys }) {
1938
2022
  const parts = keys.split(" ");
1939
- return /* @__PURE__ */ jsx40("span", { className: "inline-flex items-center gap-1", children: parts.map((k, i) => /* @__PURE__ */ jsxs25("span", { className: "inline-flex items-center gap-1", children: [
1940
- i > 0 ? /* @__PURE__ */ jsx40("span", { className: "text-xs text-muted-foreground", children: "+" }) : null,
1941
- /* @__PURE__ */ jsx40("kbd", { className: "inline-flex h-6 min-w-6 items-center justify-center rounded border border-border bg-muted px-1.5 font-mono text-xs font-medium text-muted-foreground", children: k })
2023
+ return /* @__PURE__ */ jsx41("span", { className: "inline-flex items-center gap-1", children: parts.map((k, i) => /* @__PURE__ */ jsxs26("span", { className: "inline-flex items-center gap-1", children: [
2024
+ i > 0 ? /* @__PURE__ */ jsx41("span", { className: "text-xs text-muted-foreground", children: "+" }) : null,
2025
+ /* @__PURE__ */ jsx41("kbd", { className: "inline-flex h-6 min-w-6 items-center justify-center rounded border border-border bg-muted px-1.5 font-mono text-xs font-medium text-muted-foreground", children: k })
1942
2026
  ] }, k)) });
1943
2027
  }
1944
2028
  function ReportShortcutsHelp({ open, onClose }) {
@@ -1949,7 +2033,7 @@ function ReportShortcutsHelp({ open, onClose }) {
1949
2033
  if (open && !dialog.open) dialog.showModal();
1950
2034
  else if (!open && dialog.open) dialog.close();
1951
2035
  }, [open]);
1952
- return /* @__PURE__ */ jsxs25(
2036
+ return /* @__PURE__ */ jsxs26(
1953
2037
  "dialog",
1954
2038
  {
1955
2039
  ref: dialogRef,
@@ -1957,12 +2041,12 @@ function ReportShortcutsHelp({ open, onClose }) {
1957
2041
  "aria-label": "Keyboard shortcuts",
1958
2042
  onClose,
1959
2043
  children: [
1960
- /* @__PURE__ */ jsx40("h2", { className: "text-base font-semibold", children: "Keyboard shortcuts" }),
1961
- /* @__PURE__ */ jsx40("dl", { className: "mt-4 grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-2.5", children: SHORTCUTS.map((s) => /* @__PURE__ */ jsxs25("div", { className: "col-span-2 grid grid-cols-subgrid items-center", children: [
1962
- /* @__PURE__ */ jsx40("dt", { className: "justify-self-start", children: /* @__PURE__ */ jsx40(Keys, { keys: s.keys }) }),
1963
- /* @__PURE__ */ jsx40("dd", { className: "text-sm text-muted-foreground", children: s.description })
2044
+ /* @__PURE__ */ jsx41("h2", { className: "text-base font-semibold", children: "Keyboard shortcuts" }),
2045
+ /* @__PURE__ */ jsx41("dl", { className: "mt-4 grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-2.5", children: SHORTCUTS.map((s) => /* @__PURE__ */ jsxs26("div", { className: "col-span-2 grid grid-cols-subgrid items-center", children: [
2046
+ /* @__PURE__ */ jsx41("dt", { className: "justify-self-start", children: /* @__PURE__ */ jsx41(Keys, { keys: s.keys }) }),
2047
+ /* @__PURE__ */ jsx41("dd", { className: "text-sm text-muted-foreground", children: s.description })
1964
2048
  ] }, s.keys)) }),
1965
- /* @__PURE__ */ jsx40("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx40(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
2049
+ /* @__PURE__ */ jsx41("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx41(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
1966
2050
  ]
1967
2051
  }
1968
2052
  );
@@ -2163,7 +2247,7 @@ function failuresFirst(report) {
2163
2247
 
2164
2248
  // src/interactive/ReportFilters.tsx
2165
2249
  import { useState as useState3 } from "react";
2166
- import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
2250
+ import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2167
2251
  var TAG_LIMIT = 12;
2168
2252
  function ReportFilters({
2169
2253
  statuses,
@@ -2177,10 +2261,10 @@ function ReportFilters({
2177
2261
  if (statuses.length === 0 && tags.length === 0) return null;
2178
2262
  const tagsCollapsed = tags.length > TAG_LIMIT && !showAllTags;
2179
2263
  const visibleTags = tagsCollapsed ? tags.slice(0, TAG_LIMIT) : tags;
2180
- return /* @__PURE__ */ jsxs26("div", { className: "flex flex-col gap-2", children: [
2181
- statuses.length > 0 ? /* @__PURE__ */ jsx41("div", { role: "group", "aria-label": "Filter by status", className: "flex flex-wrap gap-1", children: statuses.map((opt) => {
2264
+ return /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-2", children: [
2265
+ statuses.length > 0 ? /* @__PURE__ */ jsx42("div", { role: "group", "aria-label": "Filter by status", className: "flex flex-wrap gap-1", children: statuses.map((opt) => {
2182
2266
  const active = status === opt.key;
2183
- return /* @__PURE__ */ jsxs26(
2267
+ return /* @__PURE__ */ jsxs27(
2184
2268
  "button",
2185
2269
  {
2186
2270
  type: "button",
@@ -2192,23 +2276,23 @@ function ReportFilters({
2192
2276
  ),
2193
2277
  children: [
2194
2278
  opt.label,
2195
- /* @__PURE__ */ jsx41("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2279
+ /* @__PURE__ */ jsx42("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2196
2280
  ]
2197
2281
  },
2198
2282
  opt.key
2199
2283
  );
2200
2284
  }) }) : null,
2201
- tags.length > 0 ? /* @__PURE__ */ jsxs26("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2285
+ tags.length > 0 ? /* @__PURE__ */ jsxs27("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2202
2286
  visibleTags.map((tag) => {
2203
2287
  const active = activeTags.includes(tag);
2204
- return /* @__PURE__ */ jsx41("li", { children: /* @__PURE__ */ jsx41(
2288
+ return /* @__PURE__ */ jsx42("li", { children: /* @__PURE__ */ jsx42(
2205
2289
  "button",
2206
2290
  {
2207
2291
  type: "button",
2208
2292
  "aria-pressed": active,
2209
2293
  onClick: () => onToggleTag(tag),
2210
2294
  className: "cursor-pointer",
2211
- children: /* @__PURE__ */ jsx41(
2295
+ children: /* @__PURE__ */ jsx42(
2212
2296
  Badge,
2213
2297
  {
2214
2298
  variant: "tag",
@@ -2221,7 +2305,7 @@ function ReportFilters({
2221
2305
  }
2222
2306
  ) }, tag);
2223
2307
  }),
2224
- tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx41("li", { children: /* @__PURE__ */ jsx41(
2308
+ tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx42("li", { children: /* @__PURE__ */ jsx42(
2225
2309
  "button",
2226
2310
  {
2227
2311
  type: "button",
@@ -2237,7 +2321,7 @@ function ReportFilters({
2237
2321
 
2238
2322
  // src/interactive/ReportToc.tsx
2239
2323
  import { useEffect as useEffect5, useMemo as useMemo2, useState as useState4 } from "react";
2240
- import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2324
+ import { jsx as jsx43, jsxs as jsxs28 } from "react/jsx-runtime";
2241
2325
  var DOT = {
2242
2326
  passed: "bg-pass",
2243
2327
  failed: "bg-fail",
@@ -2266,11 +2350,11 @@ function TocContent({ onNavigate }) {
2266
2350
  return () => observer.disconnect();
2267
2351
  }, [scenarioIds]);
2268
2352
  if (report.features.length === 0) return null;
2269
- return /* @__PURE__ */ jsx42("ul", { className: "flex list-none flex-col gap-4 pl-0", children: report.features.map((feature) => /* @__PURE__ */ jsxs27("li", { children: [
2270
- /* @__PURE__ */ jsx42("p", { className: "mb-1.5 font-semibold leading-snug text-foreground", children: feature.title }),
2271
- /* @__PURE__ */ jsx42("ul", { className: "flex list-none flex-col gap-0.5 pl-0", children: feature.scenarios.map((scenario) => {
2353
+ return /* @__PURE__ */ jsx43("ul", { className: "flex list-none flex-col gap-4 pl-0", children: report.features.map((feature) => /* @__PURE__ */ jsxs28("li", { children: [
2354
+ /* @__PURE__ */ jsx43("p", { className: "mb-1.5 font-semibold leading-snug text-foreground", children: feature.title }),
2355
+ /* @__PURE__ */ jsx43("ul", { className: "flex list-none flex-col gap-0.5 pl-0", children: feature.scenarios.map((scenario) => {
2272
2356
  const active = activeId === scenario.id;
2273
- return /* @__PURE__ */ jsx42("li", { children: /* @__PURE__ */ jsxs27(
2357
+ return /* @__PURE__ */ jsx43("li", { children: /* @__PURE__ */ jsxs28(
2274
2358
  "a",
2275
2359
  {
2276
2360
  href: `#${scenario.id}`,
@@ -2285,14 +2369,14 @@ function TocContent({ onNavigate }) {
2285
2369
  active ? "border-primary font-medium text-foreground" : "border-border text-muted-foreground"
2286
2370
  ),
2287
2371
  children: [
2288
- /* @__PURE__ */ jsx42(
2372
+ /* @__PURE__ */ jsx43(
2289
2373
  "span",
2290
2374
  {
2291
2375
  "aria-hidden": true,
2292
2376
  className: cn("mt-1 size-1.5 shrink-0 rounded-full", DOT[scenario.status])
2293
2377
  }
2294
2378
  ),
2295
- /* @__PURE__ */ jsx42("span", { className: "break-words", children: scenario.title })
2379
+ /* @__PURE__ */ jsx43("span", { className: "break-words", children: scenario.title })
2296
2380
  ]
2297
2381
  }
2298
2382
  ) }, scenario.id);
@@ -2302,14 +2386,14 @@ function TocContent({ onNavigate }) {
2302
2386
  function ReportToc() {
2303
2387
  const report = useReport();
2304
2388
  if (report.features.length === 0) return null;
2305
- return /* @__PURE__ */ jsxs27(
2389
+ return /* @__PURE__ */ jsxs28(
2306
2390
  "nav",
2307
2391
  {
2308
2392
  "aria-label": "Table of contents",
2309
2393
  className: "sticky top-4 hidden h-fit w-64 shrink-0 self-start text-xs lg:block",
2310
2394
  children: [
2311
- /* @__PURE__ */ jsx42("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2312
- /* @__PURE__ */ jsx42(TocContent, {})
2395
+ /* @__PURE__ */ jsx43("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2396
+ /* @__PURE__ */ jsx43(TocContent, {})
2313
2397
  ]
2314
2398
  }
2315
2399
  );
@@ -2319,31 +2403,31 @@ function ReportToc() {
2319
2403
  import { useState as useState5 } from "react";
2320
2404
  import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
2321
2405
  import { ListIcon, XIcon } from "lucide-react";
2322
- import { jsx as jsx43, jsxs as jsxs28 } from "react/jsx-runtime";
2406
+ import { jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
2323
2407
  function ReportTocDrawer() {
2324
2408
  const report = useReport();
2325
2409
  const [open, setOpen] = useState5(false);
2326
2410
  if (report.features.length === 0) return null;
2327
- return /* @__PURE__ */ jsxs28(DialogPrimitive.Root, { open, onOpenChange: setOpen, children: [
2328
- /* @__PURE__ */ jsxs28(DialogPrimitive.Trigger, { className: "flex cursor-pointer items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground lg:hidden [&_svg]:size-3.5", children: [
2329
- /* @__PURE__ */ jsx43(ListIcon, { "aria-hidden": true }),
2411
+ return /* @__PURE__ */ jsxs29(DialogPrimitive.Root, { open, onOpenChange: setOpen, children: [
2412
+ /* @__PURE__ */ jsxs29(DialogPrimitive.Trigger, { className: "flex cursor-pointer items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground lg:hidden [&_svg]:size-3.5", children: [
2413
+ /* @__PURE__ */ jsx44(ListIcon, { "aria-hidden": true }),
2330
2414
  " Contents"
2331
2415
  ] }),
2332
- /* @__PURE__ */ jsxs28(DialogPrimitive.Portal, { children: [
2333
- /* @__PURE__ */ jsx43(DialogPrimitive.Backdrop, { className: "fixed inset-0 z-50 bg-black/50 transition-opacity duration-200 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0" }),
2334
- /* @__PURE__ */ jsxs28(DialogPrimitive.Popup, { className: "fixed inset-y-0 left-0 z-50 flex w-72 max-w-[80vw] flex-col gap-3 overflow-y-auto border-r border-border bg-background p-4 font-sans text-xs shadow-lg outline-none transition-transform duration-200 data-[ending-style]:-translate-x-full data-[starting-style]:-translate-x-full", children: [
2335
- /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between", children: [
2336
- /* @__PURE__ */ jsx43(DialogPrimitive.Title, { className: "text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Contents" }),
2337
- /* @__PURE__ */ jsx43(
2416
+ /* @__PURE__ */ jsxs29(DialogPrimitive.Portal, { children: [
2417
+ /* @__PURE__ */ jsx44(DialogPrimitive.Backdrop, { className: "fixed inset-0 z-50 bg-black/50 transition-opacity duration-200 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0" }),
2418
+ /* @__PURE__ */ jsxs29(DialogPrimitive.Popup, { className: "fixed inset-y-0 left-0 z-50 flex w-72 max-w-[80vw] flex-col gap-3 overflow-y-auto border-r border-border bg-background p-4 font-sans text-xs shadow-lg outline-none transition-transform duration-200 data-[ending-style]:-translate-x-full data-[starting-style]:-translate-x-full", children: [
2419
+ /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between", children: [
2420
+ /* @__PURE__ */ jsx44(DialogPrimitive.Title, { className: "text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Contents" }),
2421
+ /* @__PURE__ */ jsx44(
2338
2422
  DialogPrimitive.Close,
2339
2423
  {
2340
2424
  "aria-label": "Close contents",
2341
2425
  className: "cursor-pointer rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground [&_svg]:size-4",
2342
- children: /* @__PURE__ */ jsx43(XIcon, { "aria-hidden": true })
2426
+ children: /* @__PURE__ */ jsx44(XIcon, { "aria-hidden": true })
2343
2427
  }
2344
2428
  )
2345
2429
  ] }),
2346
- /* @__PURE__ */ jsx43(TocContent, { onNavigate: () => setOpen(false) })
2430
+ /* @__PURE__ */ jsx44(TocContent, { onNavigate: () => setOpen(false) })
2347
2431
  ] })
2348
2432
  ] })
2349
2433
  ] });
@@ -2398,14 +2482,14 @@ function useTheme() {
2398
2482
  }
2399
2483
 
2400
2484
  // src/interactive/ReportInteractive.tsx
2401
- import { Fragment as Fragment13, jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
2485
+ import { Fragment as Fragment13, jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2402
2486
  function ReportInteractive(props) {
2403
2487
  const { report, className, title, dataTheme } = props;
2404
2488
  const result = unwrapReport(report);
2405
2489
  if (!result.ok) {
2406
- return /* @__PURE__ */ jsx44(ReportErrorShell, { error: result.error, className, title, dataTheme });
2490
+ return /* @__PURE__ */ jsx45(ReportErrorShell, { error: result.error, className, title, dataTheme });
2407
2491
  }
2408
- return /* @__PURE__ */ jsx44(ReportInteractiveView, { ...props, report: result.data });
2492
+ return /* @__PURE__ */ jsx45(ReportInteractiveView, { ...props, report: result.data });
2409
2493
  }
2410
2494
  var THEME_OPTIONS = [
2411
2495
  { value: "light", label: "Light", Icon: Sun },
@@ -2413,7 +2497,7 @@ var THEME_OPTIONS = [
2413
2497
  { value: "dark", label: "Dark", Icon: Moon }
2414
2498
  ];
2415
2499
  function ThemeSegment({ pref, onPref }) {
2416
- return /* @__PURE__ */ jsx44(
2500
+ return /* @__PURE__ */ jsx45(
2417
2501
  ToggleGroup,
2418
2502
  {
2419
2503
  size: "sm",
@@ -2423,7 +2507,7 @@ function ThemeSegment({ pref, onPref }) {
2423
2507
  if (next) onPref(next);
2424
2508
  },
2425
2509
  "aria-label": "Color theme",
2426
- children: THEME_OPTIONS.map(({ value, label, Icon }) => /* @__PURE__ */ jsx44(ToggleGroupItem, { value, "aria-label": label, title: label, className: "px-2", children: /* @__PURE__ */ jsx44(Icon, {}) }, value))
2510
+ children: THEME_OPTIONS.map(({ value, label, Icon }) => /* @__PURE__ */ jsx45(ToggleGroupItem, { value, "aria-label": label, title: label, className: "px-2", children: /* @__PURE__ */ jsx45(Icon, {}) }, value))
2427
2511
  }
2428
2512
  );
2429
2513
  }
@@ -2545,13 +2629,13 @@ function ReportInteractiveView({
2545
2629
  const totalScenarios = report.summary.total;
2546
2630
  const matchedScenarios = filtered.summary.total;
2547
2631
  const showToc = !hideToc && totalScenarios > 3;
2548
- return /* @__PURE__ */ jsx44(CollapseProvider, { value: collapse.api, children: /* @__PURE__ */ jsx44(ScenarioActionsProvider, { value: scenarioActions, children: /* @__PURE__ */ jsx44(ScenarioHistoryProvider, { value: scenarioHistory ?? null, children: /* @__PURE__ */ jsx44(
2632
+ return /* @__PURE__ */ jsx45(CollapseProvider, { value: collapse.api, children: /* @__PURE__ */ jsx45(ScenarioActionsProvider, { value: scenarioActions, children: /* @__PURE__ */ jsx45(ScenarioHistoryProvider, { value: scenarioHistory ?? null, children: /* @__PURE__ */ jsx45(
2549
2633
  ReportRoot,
2550
2634
  {
2551
2635
  report: filtered,
2552
2636
  customRenderers,
2553
2637
  renderers,
2554
- children: /* @__PURE__ */ jsxs29(
2638
+ children: /* @__PURE__ */ jsxs30(
2555
2639
  "main",
2556
2640
  {
2557
2641
  className: cn("es-report", "es-report-interactive", className),
@@ -2560,8 +2644,8 @@ function ReportInteractiveView({
2560
2644
  "data-theme": dataTheme,
2561
2645
  "data-detail-level": detail,
2562
2646
  children: [
2563
- /* @__PURE__ */ jsxs29("header", { className: "es-report-header", children: [
2564
- /* @__PURE__ */ jsxs29(
2647
+ /* @__PURE__ */ jsxs30("header", { className: "es-report-header", children: [
2648
+ /* @__PURE__ */ jsxs30(
2565
2649
  "div",
2566
2650
  {
2567
2651
  "data-es-navbar": true,
@@ -2570,9 +2654,9 @@ function ReportInteractiveView({
2570
2654
  hideHeader ? "justify-end" : "justify-between"
2571
2655
  ),
2572
2656
  children: [
2573
- hideHeader ? null : /* @__PURE__ */ jsx44("h1", { className: "min-w-0", children: title ?? "Story Report" }),
2574
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2", children: [
2575
- /* @__PURE__ */ jsx44(
2657
+ hideHeader ? null : /* @__PURE__ */ jsx45("h1", { className: "min-w-0", children: title ?? "Story Report" }),
2658
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2659
+ /* @__PURE__ */ jsx45(
2576
2660
  ReportSearch,
2577
2661
  {
2578
2662
  ref: searchRef,
@@ -2582,16 +2666,16 @@ function ReportInteractiveView({
2582
2666
  totalCount: totalScenarios
2583
2667
  }
2584
2668
  ),
2585
- /* @__PURE__ */ jsx44(ThemeSegment, { pref: themePref, onPref: setThemePref })
2669
+ /* @__PURE__ */ jsx45(ThemeSegment, { pref: themePref, onPref: setThemePref })
2586
2670
  ] })
2587
2671
  ]
2588
2672
  }
2589
2673
  ),
2590
- hideHeader ? null : /* @__PURE__ */ jsxs29(Fragment13, { children: [
2591
- /* @__PURE__ */ jsx44(ReportSummary, {}),
2592
- /* @__PURE__ */ jsx44(ReportMeta, {})
2674
+ hideHeader ? null : /* @__PURE__ */ jsxs30(Fragment13, { children: [
2675
+ /* @__PURE__ */ jsx45(ReportSummary, {}),
2676
+ /* @__PURE__ */ jsx45(ReportMeta, {})
2593
2677
  ] }),
2594
- /* @__PURE__ */ jsx44(
2678
+ /* @__PURE__ */ jsx45(
2595
2679
  ReportFreshness,
2596
2680
  {
2597
2681
  lastRunMs: reportLastRunMs(report),
@@ -2599,8 +2683,8 @@ function ReportInteractiveView({
2599
2683
  staleAfterDays
2600
2684
  }
2601
2685
  ),
2602
- /* @__PURE__ */ jsx44(ReportLastRunDelta, { history: scenarioHistory, report }),
2603
- /* @__PURE__ */ jsx44(
2686
+ /* @__PURE__ */ jsx45(ReportLastRunDelta, { history: scenarioHistory, report }),
2687
+ /* @__PURE__ */ jsx45(
2604
2688
  ReportFilters,
2605
2689
  {
2606
2690
  statuses: statusOptions,
@@ -2611,14 +2695,14 @@ function ReportInteractiveView({
2611
2695
  onToggleTag: toggleTag
2612
2696
  }
2613
2697
  ),
2614
- /* @__PURE__ */ jsxs29("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2 border-t border-border/60 pt-3", children: [
2615
- showToc ? /* @__PURE__ */ jsx44(ReportTocDrawer, {}) : null,
2616
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2", children: [
2617
- /* @__PURE__ */ jsx44(Switch, { id: expandId, checked: expandedAll, onCheckedChange: setExpanded }),
2618
- /* @__PURE__ */ jsx44("label", { htmlFor: expandId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Expand all" })
2698
+ /* @__PURE__ */ jsxs30("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2 border-t border-border/60 pt-3", children: [
2699
+ showToc ? /* @__PURE__ */ jsx45(ReportTocDrawer, {}) : null,
2700
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2701
+ /* @__PURE__ */ jsx45(Switch, { id: expandId, checked: expandedAll, onCheckedChange: setExpanded }),
2702
+ /* @__PURE__ */ jsx45("label", { htmlFor: expandId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Expand all" })
2619
2703
  ] }),
2620
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2", children: [
2621
- /* @__PURE__ */ jsx44(
2704
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2705
+ /* @__PURE__ */ jsx45(
2622
2706
  Switch,
2623
2707
  {
2624
2708
  id: docsId,
@@ -2626,16 +2710,16 @@ function ReportInteractiveView({
2626
2710
  onCheckedChange: (checked) => setDetail(checked ? "full" : "minimal")
2627
2711
  }
2628
2712
  ),
2629
- /* @__PURE__ */ jsx44("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2713
+ /* @__PURE__ */ jsx45("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2630
2714
  ] })
2631
2715
  ] })
2632
2716
  ] }),
2633
- /* @__PURE__ */ jsx44(ReportFailureBanner, { failures }),
2634
- hasContent ? showToc ? /* @__PURE__ */ jsxs29("div", { className: "flex gap-6", children: [
2635
- /* @__PURE__ */ jsx44(ReportToc, {}),
2636
- /* @__PURE__ */ jsx44("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: /* @__PURE__ */ jsx44(ReportFeatureList, {}) })
2637
- ] }) : /* @__PURE__ */ jsx44("div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ jsx44(ReportFeatureList, {}) }) : /* @__PURE__ */ jsx44(ReportEmpty, { message: query ? "No scenarios match the search." : void 0 }),
2638
- /* @__PURE__ */ jsx44(
2717
+ /* @__PURE__ */ jsx45(ReportFailureBanner, { failures }),
2718
+ hasContent ? showToc ? /* @__PURE__ */ jsxs30("div", { className: "flex gap-6", children: [
2719
+ /* @__PURE__ */ jsx45(ReportToc, {}),
2720
+ /* @__PURE__ */ jsx45("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: /* @__PURE__ */ jsx45(ReportFeatureList, {}) })
2721
+ ] }) : /* @__PURE__ */ jsx45("div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ jsx45(ReportFeatureList, {}) }) : /* @__PURE__ */ jsx45(ReportEmpty, { message: query ? "No scenarios match the search." : void 0 }),
2722
+ /* @__PURE__ */ jsx45(
2639
2723
  "button",
2640
2724
  {
2641
2725
  type: "button",
@@ -2646,8 +2730,8 @@ function ReportInteractiveView({
2646
2730
  children: "?"
2647
2731
  }
2648
2732
  ),
2649
- /* @__PURE__ */ jsx44(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2650
- toast ? /* @__PURE__ */ jsx44(
2733
+ /* @__PURE__ */ jsx45(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2734
+ toast ? /* @__PURE__ */ jsx45(
2651
2735
  "div",
2652
2736
  {
2653
2737
  role: "status",
@@ -2671,7 +2755,7 @@ import { createElement, useEffect as useEffect8, useState as useState9 } from "r
2671
2755
 
2672
2756
  // src/components/doc/MermaidView.tsx
2673
2757
  import { useEffect as useEffect7, useRef as useRef4, useState as useState8 } from "react";
2674
- import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2758
+ import { jsx as jsx46, jsxs as jsxs31 } from "react/jsx-runtime";
2675
2759
  function prefersDark(el) {
2676
2760
  const themed = el?.closest("[data-theme]");
2677
2761
  if (themed?.dataset.theme === "dark") return true;
@@ -2708,9 +2792,9 @@ function MermaidView({ entry, load }) {
2708
2792
  };
2709
2793
  }, [entry.code, load]);
2710
2794
  if (svg) {
2711
- return /* @__PURE__ */ jsxs30("figure", { ref, className: "my-3", children: [
2712
- entry.title ? /* @__PURE__ */ jsx45("figcaption", { className: "mb-1.5 text-xs font-medium text-muted-foreground", children: entry.title }) : null,
2713
- /* @__PURE__ */ jsx45(
2795
+ return /* @__PURE__ */ jsxs31("figure", { ref, className: "my-3", children: [
2796
+ entry.title ? /* @__PURE__ */ jsx46("figcaption", { className: "mb-1.5 text-xs font-medium text-muted-foreground", children: entry.title }) : null,
2797
+ /* @__PURE__ */ jsx46(
2714
2798
  "div",
2715
2799
  {
2716
2800
  role: "img",
@@ -2721,11 +2805,11 @@ function MermaidView({ entry, load }) {
2721
2805
  )
2722
2806
  ] });
2723
2807
  }
2724
- return /* @__PURE__ */ jsx45(MermaidSource, { entry, ref });
2808
+ return /* @__PURE__ */ jsx46(MermaidSource, { entry, ref });
2725
2809
  }
2726
2810
 
2727
2811
  // src/interactive/island-renderers.tsx
2728
- import { jsx as jsx46 } from "react/jsx-runtime";
2812
+ import { jsx as jsx47 } from "react/jsx-runtime";
2729
2813
  var HLJS_ESM = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/es/highlight.min.js";
2730
2814
  var MERMAID_ESM = "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs";
2731
2815
  function cachedCdnModule(url) {
@@ -2759,13 +2843,13 @@ function CdnHighlightedCode({ entry }) {
2759
2843
  cancelled = true;
2760
2844
  };
2761
2845
  }, [entry.content, entry.lang]);
2762
- return /* @__PURE__ */ jsx46(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx46(
2846
+ return /* @__PURE__ */ jsx47(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx47(
2763
2847
  "code",
2764
2848
  {
2765
2849
  className: cn("hljs font-mono text-xs", entry.lang && `language-${entry.lang}`),
2766
2850
  dangerouslySetInnerHTML: { __html: html }
2767
2851
  }
2768
- ) : /* @__PURE__ */ jsx46("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
2852
+ ) : /* @__PURE__ */ jsx47("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
2769
2853
  }
2770
2854
  function buildIslandRenderers(opts) {
2771
2855
  const renderers = {};
@@ -2779,7 +2863,7 @@ function buildIslandRenderers(opts) {
2779
2863
  }
2780
2864
 
2781
2865
  // src/interactive/ReportInteractiveIsland.tsx
2782
- import { jsx as jsx47 } from "react/jsx-runtime";
2866
+ import { jsx as jsx48 } from "react/jsx-runtime";
2783
2867
  function ReportInteractiveIsland({
2784
2868
  report,
2785
2869
  title,
@@ -2793,7 +2877,7 @@ function ReportInteractiveIsland({
2793
2877
  () => buildIslandRenderers({ syntaxHighlighting, mermaid }),
2794
2878
  [syntaxHighlighting, mermaid]
2795
2879
  );
2796
- return /* @__PURE__ */ jsx47(
2880
+ return /* @__PURE__ */ jsx48(
2797
2881
  ReportInteractive,
2798
2882
  {
2799
2883
  report,