executable-stories-react 0.6.0 → 0.8.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();
@@ -383,17 +383,29 @@ function DocHtml({ entry }) {
383
383
  ] });
384
384
  }
385
385
 
386
+ // src/components/doc/DocState.tsx
387
+ import { jsx as jsx13 } from "react/jsx-runtime";
388
+ function DocState({ entry }) {
389
+ let json;
390
+ try {
391
+ json = JSON.stringify(entry.value, null, 2) ?? String(entry.value);
392
+ } catch {
393
+ json = String(entry.value);
394
+ }
395
+ return /* @__PURE__ */ jsx13(CodeFigure, { label: entry.label ?? "State", children: /* @__PURE__ */ jsx13("code", { className: "font-mono text-xs language-json", children: json }) });
396
+ }
397
+
386
398
  // src/components/doc/DocCustom.tsx
387
- import { Fragment as Fragment4, jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
399
+ import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs9 } from "react/jsx-runtime";
388
400
  function DocCustom({ entry }) {
389
401
  const renderers = useCustomRenderers();
390
402
  const renderer = renderers[entry.type];
391
403
  if (renderer) {
392
- return /* @__PURE__ */ jsx13(Fragment4, { children: renderer(entry) });
404
+ return /* @__PURE__ */ jsx14(Fragment4, { children: renderer(entry) });
393
405
  }
394
406
  return /* @__PURE__ */ jsxs9("div", { className: "my-2", "data-type": entry.type, children: [
395
- /* @__PURE__ */ jsx13("p", { className: "mb-1 text-xs font-medium text-muted-foreground", children: entry.type }),
396
- /* @__PURE__ */ jsx13("pre", { tabIndex: 0, className: "overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground", children: safeStringify(entry.data) })
407
+ /* @__PURE__ */ jsx14("p", { className: "mb-1 text-xs font-medium text-muted-foreground", children: entry.type }),
408
+ /* @__PURE__ */ jsx14("pre", { tabIndex: 0, className: "overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground", children: safeStringify(entry.data) })
397
409
  ] });
398
410
  }
399
411
  function safeStringify(value) {
@@ -405,45 +417,47 @@ function safeStringify(value) {
405
417
  }
406
418
 
407
419
  // src/components/doc/DocEntry.tsx
408
- import { jsx as jsx14 } from "react/jsx-runtime";
420
+ import { jsx as jsx15 } from "react/jsx-runtime";
409
421
  function DocEntry({ entry }) {
410
422
  switch (entry.kind) {
411
423
  case "note":
412
- return /* @__PURE__ */ jsx14(DocNote, { entry });
424
+ return /* @__PURE__ */ jsx15(DocNote, { entry });
413
425
  case "tag":
414
- return /* @__PURE__ */ jsx14(DocTag, { entry });
426
+ return /* @__PURE__ */ jsx15(DocTag, { entry });
415
427
  case "kv":
416
- return /* @__PURE__ */ jsx14(DocKv, { entry });
428
+ return /* @__PURE__ */ jsx15(DocKv, { entry });
417
429
  case "code":
418
- return /* @__PURE__ */ jsx14(DocCode, { entry });
430
+ return /* @__PURE__ */ jsx15(DocCode, { entry });
419
431
  case "table":
420
- return /* @__PURE__ */ jsx14(DocTable, { entry });
432
+ return /* @__PURE__ */ jsx15(DocTable, { entry });
421
433
  case "link":
422
- return /* @__PURE__ */ jsx14(DocLink, { entry });
434
+ return /* @__PURE__ */ jsx15(DocLink, { entry });
423
435
  case "section":
424
- return /* @__PURE__ */ jsx14(DocSection, { entry });
436
+ return /* @__PURE__ */ jsx15(DocSection, { entry });
425
437
  case "mermaid":
426
- return /* @__PURE__ */ jsx14(DocMermaid, { entry });
438
+ return /* @__PURE__ */ jsx15(DocMermaid, { entry });
427
439
  case "screenshot":
428
- return /* @__PURE__ */ jsx14(DocScreenshot, { entry });
440
+ return /* @__PURE__ */ jsx15(DocScreenshot, { entry });
429
441
  case "video":
430
- return /* @__PURE__ */ jsx14(DocVideo, { entry });
442
+ return /* @__PURE__ */ jsx15(DocVideo, { entry });
431
443
  case "html":
432
- return /* @__PURE__ */ jsx14(DocHtml, { entry });
444
+ return /* @__PURE__ */ jsx15(DocHtml, { entry });
445
+ case "state":
446
+ return /* @__PURE__ */ jsx15(DocState, { entry });
433
447
  case "custom":
434
- return /* @__PURE__ */ jsx14(DocCustom, { entry });
448
+ return /* @__PURE__ */ jsx15(DocCustom, { entry });
435
449
  }
436
450
  }
437
451
 
438
452
  // src/components/ReportDocEntries.tsx
439
- import { Fragment as Fragment5, jsx as jsx15 } from "react/jsx-runtime";
453
+ import { Fragment as Fragment5, jsx as jsx16 } from "react/jsx-runtime";
440
454
  function ReportDocEntries({ entries }) {
441
455
  if (entries.length === 0) return null;
442
- return /* @__PURE__ */ jsx15(Fragment5, { children: entries.map((entry, i) => /* @__PURE__ */ jsx15(DocEntry, { entry }, i)) });
456
+ return /* @__PURE__ */ jsx16(Fragment5, { children: entries.map((entry, i) => /* @__PURE__ */ jsx16(DocEntry, { entry }, i)) });
443
457
  }
444
458
 
445
459
  // src/lib/step-params.tsx
446
- import { jsx as jsx16 } from "react/jsx-runtime";
460
+ import { jsx as jsx17 } from "react/jsx-runtime";
447
461
  var STEP_PARAM_PATTERN = /"[^"]*"|(?<![\w.-])\d+(?:\.\d+)?(?![\w.-])/g;
448
462
  function highlightStepParams(text) {
449
463
  const matches = Array.from(text.matchAll(STEP_PARAM_PATTERN));
@@ -455,7 +469,7 @@ function highlightStepParams(text) {
455
469
  const end = start + match[0].length;
456
470
  if (start > lastIndex) nodes.push(text.slice(lastIndex, start));
457
471
  nodes.push(
458
- /* @__PURE__ */ jsx16("span", { className: "font-medium text-step-param italic", children: match[0] }, i)
472
+ /* @__PURE__ */ jsx17("span", { className: "font-medium text-step-param italic", children: match[0] }, i)
459
473
  );
460
474
  lastIndex = end;
461
475
  });
@@ -464,7 +478,7 @@ function highlightStepParams(text) {
464
478
  }
465
479
 
466
480
  // src/components/ReportSteps.tsx
467
- import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
481
+ import { jsx as jsx18, jsxs as jsxs10 } from "react/jsx-runtime";
468
482
  var STEP_GLYPH = {
469
483
  passed: "\u2713",
470
484
  failed: "\u2717",
@@ -479,7 +493,7 @@ var STEP_GLYPH_COLOR = {
479
493
  };
480
494
  function ReportSteps({ scenario }) {
481
495
  if (scenario.steps.length === 0) return null;
482
- return /* @__PURE__ */ jsx17("ol", { "data-slot": "steps", className: "flex flex-col", children: scenario.steps.map((step) => /* @__PURE__ */ jsx17(ReportStepItem, { step }, step.id)) });
496
+ return /* @__PURE__ */ jsx18("ol", { "data-slot": "steps", className: "flex flex-col", children: scenario.steps.map((step) => /* @__PURE__ */ jsx18(ReportStepItem, { step }, step.id)) });
483
497
  }
484
498
  function ReportStepItem({ step }) {
485
499
  const kw = step.keyword.toLowerCase();
@@ -492,8 +506,8 @@ function ReportStepItem({ step }) {
492
506
  className: cn("py-1.5 text-[0.8125rem] leading-normal", continuation && "pl-5"),
493
507
  children: [
494
508
  /* @__PURE__ */ jsxs10("div", { className: "flex items-baseline gap-2", children: [
495
- /* @__PURE__ */ jsx17("span", { "aria-hidden": true, className: cn("w-4 shrink-0 text-center text-xs", STEP_GLYPH_COLOR[step.status]), children: STEP_GLYPH[step.status] ?? "\u25CB" }),
496
- /* @__PURE__ */ jsx17(
509
+ /* @__PURE__ */ jsx18("span", { "aria-hidden": true, className: cn("w-4 shrink-0 text-center text-xs", STEP_GLYPH_COLOR[step.status]), children: STEP_GLYPH[step.status] ?? "\u25CB" }),
510
+ /* @__PURE__ */ jsx18(
497
511
  "span",
498
512
  {
499
513
  className: cn(
@@ -503,10 +517,10 @@ function ReportStepItem({ step }) {
503
517
  children: step.keyword
504
518
  }
505
519
  ),
506
- /* @__PURE__ */ jsx17("span", { className: "flex-1 text-foreground", children: highlightStepParams(step.text) }),
507
- step.durationMs > 0 ? /* @__PURE__ */ jsx17("span", { className: "shrink-0 whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(step.durationMs) }) : null
520
+ /* @__PURE__ */ jsx18("span", { className: "flex-1 text-foreground", children: highlightStepParams(step.text) }),
521
+ step.durationMs > 0 ? /* @__PURE__ */ jsx18("span", { className: "shrink-0 whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(step.durationMs) }) : null
508
522
  ] }),
509
- step.errorMessage ? /* @__PURE__ */ jsx17(
523
+ step.errorMessage ? /* @__PURE__ */ jsx18(
510
524
  "pre",
511
525
  {
512
526
  role: "alert",
@@ -514,24 +528,255 @@ function ReportStepItem({ step }) {
514
528
  children: step.errorMessage
515
529
  }
516
530
  ) : null,
517
- step.docEntries.length > 0 ? /* @__PURE__ */ jsx17("div", { "data-es-docs": true, className: "mt-2 ml-6", children: /* @__PURE__ */ jsx17(ReportDocEntries, { entries: step.docEntries }) }) : null
531
+ step.docEntries.length > 0 ? /* @__PURE__ */ jsx18("div", { "data-es-docs": true, className: "mt-2 ml-6", children: /* @__PURE__ */ jsx18(ReportDocEntries, { entries: step.docEntries }) }) : null
518
532
  ]
519
533
  }
520
534
  );
521
535
  }
522
536
 
537
+ // ../executable-stories-core/dist/state-diff.js
538
+ var isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
539
+ function deepEqual(a, b) {
540
+ if (Object.is(a, b)) return true;
541
+ if (Array.isArray(a) && Array.isArray(b)) {
542
+ return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
543
+ }
544
+ if (isPlainObject(a) && isPlainObject(b)) {
545
+ const ak = Object.keys(a);
546
+ const bk = Object.keys(b);
547
+ return ak.length === bk.length && ak.every((k) => k in b && deepEqual(a[k], b[k]));
548
+ }
549
+ return false;
550
+ }
551
+ var joinKey = (path, key) => path === "" ? key : `${path}.${key}`;
552
+ function walk(path, before, after, out) {
553
+ if (Object.is(before, after)) return;
554
+ if (Array.isArray(before) && Array.isArray(after)) {
555
+ const shared = Math.min(before.length, after.length);
556
+ for (let i = 0; i < shared; i++) walk(`${path}[${i}]`, before[i], after[i], out);
557
+ for (let i = shared; i < after.length; i++) out.push({ path: `${path}[${i}]`, kind: "added", after: after[i] });
558
+ for (let i = shared; i < before.length; i++) out.push({ path: `${path}[${i}]`, kind: "removed", before: before[i] });
559
+ return;
560
+ }
561
+ if (isPlainObject(before) && isPlainObject(after)) {
562
+ for (const key of Object.keys(after)) {
563
+ const p = joinKey(path, key);
564
+ if (key in before) walk(p, before[key], after[key], out);
565
+ else out.push({ path: p, kind: "added", after: after[key] });
566
+ }
567
+ for (const key of Object.keys(before)) {
568
+ if (!(key in after)) out.push({ path: joinKey(path, key), kind: "removed", before: before[key] });
569
+ }
570
+ return;
571
+ }
572
+ if (!deepEqual(before, after)) out.push({ path, kind: "changed", before, after });
573
+ }
574
+ function diffStateValues(before, after) {
575
+ const out = [];
576
+ walk("", before, after, out);
577
+ return out;
578
+ }
579
+ function formatStateValue(value, maxLen = 60) {
580
+ const s = value === void 0 ? "undefined" : JSON.stringify(value);
581
+ return s.length > maxLen ? `${s.slice(0, maxLen - 1)}\u2026` : s;
582
+ }
583
+ function summarizeStateChanges(changes) {
584
+ return changes.map((c) => {
585
+ const at = c.path === "" ? "(root)" : c.path;
586
+ switch (c.kind) {
587
+ case "added":
588
+ return `+ ${at}: ${formatStateValue(c.after)}`;
589
+ case "removed":
590
+ return `\u2212 ${at}`;
591
+ case "changed":
592
+ return `${at}: ${formatStateValue(c.before)} \u2192 ${formatStateValue(c.after)}`;
593
+ }
594
+ });
595
+ }
596
+
597
+ // ../executable-stories-core/dist/storyboard.js
598
+ function findScreenshot(entries) {
599
+ for (const entry of entries) {
600
+ if (entry.kind === "screenshot") return entry;
601
+ if (entry.children) {
602
+ const nested = findScreenshot(entry.children);
603
+ if (nested) return nested;
604
+ }
605
+ }
606
+ return void 0;
607
+ }
608
+ function findStates(entries, out = []) {
609
+ for (const entry of entries) {
610
+ if (entry.kind === "state") out.push(entry);
611
+ if (entry.children) findStates(entry.children, out);
612
+ }
613
+ return out;
614
+ }
615
+ var laneOf = (label) => label ?? "";
616
+ function extractStoryboardFrames(scenario) {
617
+ const frames = [];
618
+ const laneOrder = [];
619
+ const previous = /* @__PURE__ */ new Map();
620
+ for (const step of scenario.steps) {
621
+ const shot = findScreenshot(step.docEntries);
622
+ const stateDocs = findStates(step.docEntries);
623
+ if (!shot && stateDocs.length === 0) continue;
624
+ const byLane = /* @__PURE__ */ new Map();
625
+ for (const doc of stateDocs) {
626
+ const lane = laneOf(doc.label);
627
+ if (!byLane.has(lane) && !laneOrder.includes(lane)) laneOrder.push(lane);
628
+ byLane.set(lane, doc);
629
+ }
630
+ const states = [];
631
+ for (const lane of laneOrder) {
632
+ const doc = byLane.get(lane);
633
+ if (!doc) continue;
634
+ const card = {
635
+ ...doc.label !== void 0 && { label: doc.label },
636
+ value: doc.value
637
+ };
638
+ if (previous.has(lane)) card.changes = diffStateValues(previous.get(lane), doc.value);
639
+ previous.set(lane, doc.value);
640
+ states.push(card);
641
+ }
642
+ frames.push({
643
+ stepId: step.id,
644
+ stepIndex: step.index,
645
+ keyword: step.keyword,
646
+ text: step.text,
647
+ status: step.status,
648
+ ...shot && { screenshot: { path: shot.path, ...shot.alt !== void 0 && { alt: shot.alt } } },
649
+ states
650
+ });
651
+ }
652
+ return frames;
653
+ }
654
+
655
+ // src/components/ReportStoryboard.tsx
656
+ import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
657
+ var FRAME_GLYPH = {
658
+ passed: "\u2713",
659
+ failed: "\u2717",
660
+ skipped: "\u25CB",
661
+ pending: "\u25CB"
662
+ };
663
+ var FRAME_GLYPH_COLOR = {
664
+ passed: "text-pass",
665
+ failed: "text-fail",
666
+ skipped: "text-skip",
667
+ pending: "text-pend"
668
+ };
669
+ function ReportStoryboard({ scenario }) {
670
+ const frames = extractStoryboardFrames(scenario);
671
+ if (frames.length < 2) return null;
672
+ return /* @__PURE__ */ jsxs11("section", { "data-slot": "storyboard", "aria-label": "Storyboard", className: "mb-3", children: [
673
+ /* @__PURE__ */ jsx19("h4", { className: "mb-1.5 text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Storyboard" }),
674
+ /* @__PURE__ */ jsx19("ol", { className: "flex items-start gap-3 overflow-x-auto pb-2", children: frames.map((frame) => /* @__PURE__ */ jsx19(StoryboardFrameItem, { frame }, frame.stepId)) })
675
+ ] });
676
+ }
677
+ function StoryboardFrameItem({ frame }) {
678
+ const label = `${frame.keyword} ${frame.text}`;
679
+ const hasStates = frame.states.length > 0;
680
+ const caption = /* @__PURE__ */ jsxs11("p", { className: "mt-1 flex items-baseline gap-1.5 text-[0.6875rem] leading-snug", children: [
681
+ /* @__PURE__ */ jsx19("span", { "aria-hidden": true, className: cn("shrink-0", FRAME_GLYPH_COLOR[frame.status]), children: FRAME_GLYPH[frame.status] ?? "\u25CB" }),
682
+ /* @__PURE__ */ jsxs11("span", { className: "min-w-0", children: [
683
+ /* @__PURE__ */ jsx19("span", { className: "font-mono font-semibold text-keyword", children: frame.keyword }),
684
+ " ",
685
+ /* @__PURE__ */ jsx19("span", { className: "text-muted-foreground", children: frame.screenshot?.alt ?? frame.text })
686
+ ] })
687
+ ] });
688
+ return (
689
+ // State cards need room for diff rows; screenshot-only frames keep the
690
+ // original narrow film-cell width (and DOM) unchanged.
691
+ /* @__PURE__ */ jsxs11("li", { className: cn("shrink-0", hasStates ? "w-64" : "w-40"), children: [
692
+ frame.screenshot ? /* @__PURE__ */ jsx19(FrameScreenshot, { frame, label }) : null,
693
+ hasStates ? /* @__PURE__ */ jsx19("div", { className: cn("flex flex-col gap-1.5", frame.screenshot && "mt-1.5"), children: frame.states.map((card, i) => /* @__PURE__ */ jsx19(StateCardView, { card }, card.label ?? i)) }) : null,
694
+ frame.screenshot ? caption : (
695
+ // No screenshot means no image anchor, so the caption carries the
696
+ // jump-to-step link instead.
697
+ /* @__PURE__ */ jsx19("a", { href: `#${frame.stepId}`, "aria-label": `Jump to step: ${label}`, className: "block hover:underline", children: caption })
698
+ )
699
+ ] })
700
+ );
701
+ }
702
+ function FrameScreenshot({ frame, label }) {
703
+ const path = frame.screenshot?.path ?? "";
704
+ const src = isLocalFsPath(path) ? void 0 : safeImageUrl(path);
705
+ return /* @__PURE__ */ jsx19(
706
+ "a",
707
+ {
708
+ href: `#${frame.stepId}`,
709
+ "aria-label": `Jump to step: ${label}`,
710
+ className: "block overflow-hidden rounded-md border border-border transition-colors hover:border-ring",
711
+ children: src ? /* @__PURE__ */ jsx19(
712
+ "img",
713
+ {
714
+ src,
715
+ alt: frame.screenshot?.alt ?? label,
716
+ loading: "lazy",
717
+ className: "h-24 w-full bg-muted object-cover object-top"
718
+ }
719
+ ) : /* @__PURE__ */ jsx19("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" })
720
+ }
721
+ );
722
+ }
723
+ var CHANGE_TONE = {
724
+ added: "bg-pass-bg text-pass",
725
+ removed: "bg-fail-bg text-fail",
726
+ changed: "bg-skip-bg text-skip"
727
+ };
728
+ function prettyJson(value) {
729
+ try {
730
+ return JSON.stringify(value, null, 2) ?? String(value);
731
+ } catch {
732
+ return String(value);
733
+ }
734
+ }
735
+ function StateCardView({ card }) {
736
+ const json = prettyJson(card.value);
737
+ const firstCapture = card.changes === void 0;
738
+ return /* @__PURE__ */ jsxs11("div", { "data-slot": "state-card", className: "rounded-md border border-border bg-card p-2", children: [
739
+ /* @__PURE__ */ jsxs11("p", { className: "flex flex-wrap items-baseline gap-1.5", children: [
740
+ /* @__PURE__ */ jsx19("span", { className: "inline-flex rounded-full border border-border px-1.5 font-mono text-[0.625rem] font-medium text-muted-foreground", children: card.label ?? "State" }),
741
+ firstCapture ? /* @__PURE__ */ jsx19("span", { className: "text-[0.625rem] text-muted-foreground italic", children: "first capture" }) : null
742
+ ] }),
743
+ !firstCapture && (card.changes && card.changes.length > 0 ? /* @__PURE__ */ jsx19("ul", { className: "mt-1.5 flex flex-col gap-0.5", children: card.changes.map((change, i) => /* @__PURE__ */ jsx19(
744
+ "li",
745
+ {
746
+ className: cn(
747
+ "rounded-sm px-1.5 py-0.5 font-mono text-[0.625rem] leading-snug break-all",
748
+ CHANGE_TONE[change.kind]
749
+ ),
750
+ children: summarizeStateChanges([change])[0]
751
+ },
752
+ i
753
+ )) }) : /* @__PURE__ */ jsx19("p", { className: "mt-1.5 text-[0.625rem] text-muted-foreground", children: "No changes" })),
754
+ /* @__PURE__ */ jsxs11(
755
+ "details",
756
+ {
757
+ open: firstCapture && json.length <= 240,
758
+ className: cn(firstCapture ? "mt-1.5" : "mt-1"),
759
+ children: [
760
+ /* @__PURE__ */ jsx19("summary", { className: "cursor-pointer text-[0.625rem] text-muted-foreground hover:text-foreground", children: "Snapshot" }),
761
+ /* @__PURE__ */ jsx19("pre", { tabIndex: 0, className: "mt-1 max-h-48 overflow-auto rounded-sm bg-muted p-1.5 font-mono text-[0.625rem] leading-snug", children: json })
762
+ ]
763
+ }
764
+ )
765
+ ] });
766
+ }
767
+
523
768
  // src/components/ReportAttachments.tsx
524
- import { Fragment as Fragment6, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
769
+ import { Fragment as Fragment6, jsx as jsx20, jsxs as jsxs12 } from "react/jsx-runtime";
525
770
  function ReportAttachments({ attachments }) {
526
771
  if (attachments.length === 0) return null;
527
772
  return (
528
773
  // role="group" (not a labelled <section>) so multiple scenarios' attachment
529
774
  // 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) => {
775
+ /* @__PURE__ */ jsx20("div", { role: "group", "aria-label": "Attachments", className: "mt-3 flex flex-col gap-2", children: attachments.map((att, i) => {
531
776
  const dataUri = att.contentEncoding === "BASE64" ? `data:${att.mediaType};base64,${att.body}` : `data:${att.mediaType},${encodeURIComponent(att.body)}`;
532
777
  const isImage = att.mediaType.startsWith("image/");
533
- return /* @__PURE__ */ jsx18("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs11(Fragment6, { children: [
534
- /* @__PURE__ */ jsx18(
778
+ return /* @__PURE__ */ jsx20("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs12(Fragment6, { children: [
779
+ /* @__PURE__ */ jsx20(
535
780
  "img",
536
781
  {
537
782
  src: dataUri,
@@ -540,8 +785,8 @@ function ReportAttachments({ attachments }) {
540
785
  className: "max-w-full rounded-md border border-border"
541
786
  }
542
787
  ),
543
- /* @__PURE__ */ jsx18("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
544
- ] }) : /* @__PURE__ */ jsxs11(
788
+ /* @__PURE__ */ jsx20("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
789
+ ] }) : /* @__PURE__ */ jsxs12(
545
790
  "a",
546
791
  {
547
792
  href: dataUri,
@@ -550,7 +795,7 @@ function ReportAttachments({ attachments }) {
550
795
  children: [
551
796
  att.name,
552
797
  " ",
553
- /* @__PURE__ */ jsxs11("span", { className: "text-muted-foreground", children: [
798
+ /* @__PURE__ */ jsxs12("span", { className: "text-muted-foreground", children: [
554
799
  "(",
555
800
  att.mediaType,
556
801
  ")"
@@ -614,15 +859,15 @@ function toTraceRows(spans) {
614
859
  roots.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);
615
860
  const rows = [];
616
861
  const seen = /* @__PURE__ */ new Set();
617
- const walk = (node, depth) => {
862
+ const walk2 = (node, depth) => {
618
863
  if (seen.has(node.span.spanId)) return;
619
864
  seen.add(node.span.spanId);
620
865
  rows.push({ ...node.span, depth });
621
- for (const child of node.children) walk(child, depth + 1);
866
+ for (const child of node.children) walk2(child, depth + 1);
622
867
  };
623
- for (const root of roots) walk(root, 0);
868
+ for (const root of roots) walk2(root, 0);
624
869
  for (const node of byId.values()) {
625
- if (!seen.has(node.span.spanId)) walk(node, 0);
870
+ if (!seen.has(node.span.spanId)) walk2(node, 0);
626
871
  }
627
872
  return rows;
628
873
  }
@@ -638,7 +883,7 @@ function traceWindow(rows) {
638
883
  }
639
884
 
640
885
  // src/components/ReportTrace.tsx
641
- import { jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
886
+ import { jsx as jsx21, jsxs as jsxs13 } from "react/jsx-runtime";
642
887
  var BAR_COLOR = {
643
888
  ok: "bg-pass",
644
889
  error: "bg-fail",
@@ -649,8 +894,8 @@ function ReportTrace({ spans }) {
649
894
  const rows = toTraceRows(spans);
650
895
  if (rows.length === 0) return null;
651
896
  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: [
897
+ return /* @__PURE__ */ jsxs13("details", { className: "mt-3 rounded-md border border-border bg-muted/30", children: [
898
+ /* @__PURE__ */ jsxs13("summary", { className: "cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground", children: [
654
899
  "Trace (",
655
900
  rows.length,
656
901
  " span",
@@ -659,11 +904,11 @@ function ReportTrace({ spans }) {
659
904
  formatDuration(totalMs),
660
905
  ")"
661
906
  ] }),
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) => {
907
+ /* @__PURE__ */ jsx21("ul", { className: "flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]", children: rows.map((row, i) => {
663
908
  const leftPct = (row.startTimeMs - minStartMs) / totalMs * 100;
664
909
  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(
910
+ return /* @__PURE__ */ jsxs13("li", { className: "flex items-center gap-2", children: [
911
+ /* @__PURE__ */ jsx21(
667
912
  "span",
668
913
  {
669
914
  className: "min-w-0 flex-1 truncate text-foreground",
@@ -672,14 +917,14 @@ function ReportTrace({ spans }) {
672
917
  children: row.name
673
918
  }
674
919
  ),
675
- /* @__PURE__ */ jsx19("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx19(
920
+ /* @__PURE__ */ jsx21("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx21(
676
921
  "span",
677
922
  {
678
923
  className: cn("absolute top-0 h-full rounded-sm", BAR_COLOR[row.status]),
679
924
  style: { left: `${leftPct}%`, width: `${widthPct}%` }
680
925
  }
681
926
  ) }),
682
- /* @__PURE__ */ jsx19("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
927
+ /* @__PURE__ */ jsx21("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
683
928
  ] }, `${row.spanId}-${i}`);
684
929
  }) })
685
930
  ] });
@@ -748,7 +993,7 @@ function diffSinceLastRun(history2, scenarios) {
748
993
  }
749
994
 
750
995
  // src/components/ScenarioRunHistory.tsx
751
- import { Fragment as Fragment7, jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
996
+ import { Fragment as Fragment7, jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
752
997
  var MAX_DOTS = 10;
753
998
  var DOT_COLOR = {
754
999
  passed: "bg-pass",
@@ -768,16 +1013,16 @@ function ScenarioRunHistory({ scenarioId }) {
768
1013
  const recent = entries.slice(-MAX_DOTS);
769
1014
  const flaky = flakinessOf(recent) === "flaky";
770
1015
  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(
1016
+ return /* @__PURE__ */ jsxs14(Fragment7, { children: [
1017
+ flaky ? /* @__PURE__ */ jsx22(Badge, { variant: "pending", "aria-label": "Flaky: status flips between recent runs", title: summary, children: "Flaky" }) : null,
1018
+ /* @__PURE__ */ jsx22(
774
1019
  "span",
775
1020
  {
776
1021
  role: "img",
777
1022
  "aria-label": `Run history: ${summary}`,
778
1023
  title: summary,
779
1024
  className: "flex shrink-0 items-center gap-[3px]",
780
- children: recent.map((e, i) => /* @__PURE__ */ jsx20(
1025
+ children: recent.map((e, i) => /* @__PURE__ */ jsx22(
781
1026
  "span",
782
1027
  {
783
1028
  "aria-hidden": true,
@@ -868,7 +1113,7 @@ function stringify(value) {
868
1113
  return String(value);
869
1114
  }
870
1115
  }
871
- function docEntryToMarkdown(entry) {
1116
+ function docEntryToMarkdown(entry, stateLanes) {
872
1117
  const lines = [];
873
1118
  switch (entry.kind) {
874
1119
  case "note":
@@ -920,13 +1165,24 @@ function docEntryToMarkdown(entry) {
920
1165
  case "custom":
921
1166
  lines.push(`**${entry.type}**`, "", "```json", stringify(entry.data), "```");
922
1167
  break;
1168
+ case "state": {
1169
+ const lane = entry.label ?? "";
1170
+ lines.push(`**${entry.label ?? "State"}**`);
1171
+ if (stateLanes?.has(lane)) {
1172
+ const summary = summarizeStateChanges(diffStateValues(stateLanes.get(lane), entry.value));
1173
+ if (summary.length > 0) lines.push("", ...summary.map((l) => `- ${l}`));
1174
+ }
1175
+ stateLanes?.set(lane, entry.value);
1176
+ lines.push("", "<details>", "<summary>snapshot</summary>", "", "```json", stringify(entry.value ?? null), "```", "", "</details>");
1177
+ break;
1178
+ }
923
1179
  }
924
1180
  for (const child of entry.children ?? []) {
925
- lines.push("", ...docEntryToMarkdown(child));
1181
+ lines.push("", ...docEntryToMarkdown(child, stateLanes));
926
1182
  }
927
1183
  return lines;
928
1184
  }
929
- function stepLines(step, ordinal, full) {
1185
+ function stepLines(step, ordinal, full, stateLanes) {
930
1186
  const status = step.status === "passed" ? "" : ` \u2014 **${step.status}**`;
931
1187
  const lines = [`${ordinal}. **${step.keyword}** ${step.text}${status}`];
932
1188
  if (!full) return lines;
@@ -934,7 +1190,7 @@ function stepLines(step, ordinal, full) {
934
1190
  lines.push(...step.errorMessage.split("\n").map((l) => ` > ${l}`));
935
1191
  }
936
1192
  for (const entry of step.docEntries) {
937
- lines.push("", ...docEntryToMarkdown(entry).map((l) => l === "" ? l : ` ${l}`));
1193
+ lines.push("", ...docEntryToMarkdown(entry, stateLanes).map((l) => l === "" ? l : ` ${l}`));
938
1194
  }
939
1195
  return lines;
940
1196
  }
@@ -943,9 +1199,10 @@ function scenarioToMarkdown(scenario, options = {}) {
943
1199
  const full = variant === "full";
944
1200
  const lines = full ? [`# ${scenario.title}`, ""] : [`## ${scenario.title} _(${scenario.status})_`, ""];
945
1201
  if (full && meta.length > 0) lines.push(...meta);
1202
+ const stateLanes = /* @__PURE__ */ new Map();
946
1203
  if (scenario.steps.length > 0) {
947
1204
  if (full) lines.push("", "## Steps", "");
948
- scenario.steps.forEach((step, i) => lines.push(...stepLines(step, i + 1, full)));
1205
+ scenario.steps.forEach((step, i) => lines.push(...stepLines(step, i + 1, full, stateLanes)));
949
1206
  }
950
1207
  if (scenario.errorMessage) {
951
1208
  if (full) lines.push("", "## Failure", "");
@@ -954,7 +1211,7 @@ function scenarioToMarkdown(scenario, options = {}) {
954
1211
  }
955
1212
  if (full && scenario.docEntries.length > 0) {
956
1213
  lines.push("", "## Docs", "");
957
- for (const entry of scenario.docEntries) lines.push(...docEntryToMarkdown(entry), "");
1214
+ for (const entry of scenario.docEntries) lines.push(...docEntryToMarkdown(entry, stateLanes), "");
958
1215
  }
959
1216
  return lines.join("\n").replaceAll(/\n{3,}/g, "\n\n").trimEnd() + (full ? "\n" : "");
960
1217
  }
@@ -994,9 +1251,9 @@ function scenarioPermalink(scenario) {
994
1251
 
995
1252
  // src/components/ui/card.tsx
996
1253
  import "react";
997
- import { jsx as jsx21 } from "react/jsx-runtime";
1254
+ import { jsx as jsx23 } from "react/jsx-runtime";
998
1255
  function Card({ className, ...props }) {
999
- return /* @__PURE__ */ jsx21(
1256
+ return /* @__PURE__ */ jsx23(
1000
1257
  "div",
1001
1258
  {
1002
1259
  "data-slot": "card",
@@ -1009,7 +1266,7 @@ function Card({ className, ...props }) {
1009
1266
  );
1010
1267
  }
1011
1268
  function CardHeader({ className, ...props }) {
1012
- return /* @__PURE__ */ jsx21(
1269
+ return /* @__PURE__ */ jsx23(
1013
1270
  "div",
1014
1271
  {
1015
1272
  "data-slot": "card-header",
@@ -1022,7 +1279,7 @@ function CardHeader({ className, ...props }) {
1022
1279
  );
1023
1280
  }
1024
1281
  function CardContent({ className, ...props }) {
1025
- return /* @__PURE__ */ jsx21(
1282
+ return /* @__PURE__ */ jsx23(
1026
1283
  "div",
1027
1284
  {
1028
1285
  "data-slot": "card-content",
@@ -1036,13 +1293,13 @@ function CardContent({ className, ...props }) {
1036
1293
  import "react";
1037
1294
  import { Menu as MenuPrimitive } from "@base-ui/react/menu";
1038
1295
  import { CheckIcon } from "lucide-react";
1039
- import { jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
1296
+ import { jsx as jsx24, jsxs as jsxs15 } from "react/jsx-runtime";
1040
1297
  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
1298
  function DropdownMenu(props) {
1042
- return /* @__PURE__ */ jsx22(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
1299
+ return /* @__PURE__ */ jsx24(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
1043
1300
  }
1044
1301
  function DropdownMenuTrigger(props) {
1045
- return /* @__PURE__ */ jsx22(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
1302
+ return /* @__PURE__ */ jsx24(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
1046
1303
  }
1047
1304
  function DropdownMenuContent({
1048
1305
  className,
@@ -1050,14 +1307,14 @@ function DropdownMenuContent({
1050
1307
  sideOffset = 4,
1051
1308
  ...props
1052
1309
  }) {
1053
- return /* @__PURE__ */ jsx22(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx22(
1310
+ return /* @__PURE__ */ jsx24(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx24(
1054
1311
  MenuPrimitive.Positioner,
1055
1312
  {
1056
1313
  "data-slot": "dropdown-menu-positioner",
1057
1314
  className: "z-50",
1058
1315
  align,
1059
1316
  sideOffset,
1060
- children: /* @__PURE__ */ jsx22(
1317
+ children: /* @__PURE__ */ jsx24(
1061
1318
  MenuPrimitive.Popup,
1062
1319
  {
1063
1320
  "data-slot": "dropdown-menu-content",
@@ -1075,7 +1332,7 @@ function DropdownMenuItem({
1075
1332
  className,
1076
1333
  ...props
1077
1334
  }) {
1078
- return /* @__PURE__ */ jsx22(
1335
+ return /* @__PURE__ */ jsx24(
1079
1336
  MenuPrimitive.Item,
1080
1337
  {
1081
1338
  "data-slot": "dropdown-menu-item",
@@ -1087,7 +1344,7 @@ function DropdownMenuItem({
1087
1344
 
1088
1345
  // src/components/ReportScenario.tsx
1089
1346
  import { LinkIcon, FileTextIcon, SparklesIcon, MoreHorizontalIcon } from "lucide-react";
1090
- import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
1347
+ import { jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
1091
1348
  var STATUS_META = {
1092
1349
  passed: { label: "Passed", glyph: "\u2713", glyphColor: "text-pass", badgeVariant: "passed", showPill: false },
1093
1350
  failed: { label: "Failed", glyph: "\u2717", glyphColor: "text-fail", badgeVariant: "failed", showPill: true },
@@ -1103,7 +1360,7 @@ function ReportScenario({ scenario, hideTitle = false }) {
1103
1360
  const collapsible = collapse !== null && !hideTitle;
1104
1361
  const collapsed = collapsible ? collapse.isCollapsed(scenario.id) : false;
1105
1362
  const actions = useScenarioActions();
1106
- return /* @__PURE__ */ jsxs15(
1363
+ return /* @__PURE__ */ jsxs16(
1107
1364
  Card,
1108
1365
  {
1109
1366
  id: scenario.id,
@@ -1111,10 +1368,10 @@ function ReportScenario({ scenario, hideTitle = false }) {
1111
1368
  ...hideTitle ? { "aria-label": `${scenario.title}, ${label}` } : { "aria-labelledby": titleId },
1112
1369
  className: "gap-0 py-0",
1113
1370
  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(
1371
+ /* @__PURE__ */ jsxs16(CardHeader, { className: "px-4 py-3", children: [
1372
+ /* @__PURE__ */ jsxs16("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
1373
+ hideTitle ? null : /* @__PURE__ */ jsxs16("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
1374
+ collapsible ? /* @__PURE__ */ jsx25(
1118
1375
  "button",
1119
1376
  {
1120
1377
  type: "button",
@@ -1123,49 +1380,49 @@ function ReportScenario({ scenario, hideTitle = false }) {
1123
1380
  "aria-controls": bodyId,
1124
1381
  "aria-label": `Toggle ${scenario.title}`,
1125
1382
  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" })
1383
+ children: /* @__PURE__ */ jsx25("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
1127
1384
  }
1128
1385
  ) : 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 })
1386
+ /* @__PURE__ */ jsx25("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
1387
+ /* @__PURE__ */ jsx25("span", { children: scenario.title })
1131
1388
  ] }),
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(
1389
+ /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2", children: [
1390
+ /* @__PURE__ */ jsx25(ScenarioRunHistory, { scenarioId: scenario.id }),
1391
+ scenario.durationMs > 0 ? /* @__PURE__ */ jsx25("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
1392
+ meta.showPill ? /* @__PURE__ */ jsx25(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ jsx25("span", { className: "sr-only", children: `Status: ${label}` }),
1393
+ actions ? /* @__PURE__ */ jsxs16(DropdownMenu, { children: [
1394
+ /* @__PURE__ */ jsx25(
1138
1395
  DropdownMenuTrigger,
1139
1396
  {
1140
1397
  "aria-label": `Actions for ${scenario.title}`,
1141
1398
  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 })
1399
+ children: /* @__PURE__ */ jsx25(MoreHorizontalIcon, { "aria-hidden": true })
1143
1400
  }
1144
1401
  ),
1145
- /* @__PURE__ */ jsxs15(DropdownMenuContent, { align: "end", children: [
1146
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
1147
- /* @__PURE__ */ jsx23(LinkIcon, {}),
1402
+ /* @__PURE__ */ jsxs16(DropdownMenuContent, { align: "end", children: [
1403
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
1404
+ /* @__PURE__ */ jsx25(LinkIcon, {}),
1148
1405
  " Copy link"
1149
1406
  ] }),
1150
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
1151
- /* @__PURE__ */ jsx23(FileTextIcon, {}),
1407
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
1408
+ /* @__PURE__ */ jsx25(FileTextIcon, {}),
1152
1409
  " Copy as Markdown"
1153
1410
  ] }),
1154
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
1155
- /* @__PURE__ */ jsx23(SparklesIcon, {}),
1411
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
1412
+ /* @__PURE__ */ jsx25(SparklesIcon, {}),
1156
1413
  " Explain with AI"
1157
1414
  ] })
1158
1415
  ] })
1159
1416
  ] }) : null
1160
1417
  ] })
1161
1418
  ] }),
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}`))
1419
+ 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: [
1420
+ scenario.tags.map((t) => /* @__PURE__ */ jsx25("li", { children: /* @__PURE__ */ jsx25(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
1421
+ (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ jsx25("li", { children: ticket.url ? /* @__PURE__ */ jsx25("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx25(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ jsx25(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
1165
1422
  ] }) : null
1166
1423
  ] }),
1167
- /* @__PURE__ */ jsxs15(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
1168
- scenario.errorMessage ? /* @__PURE__ */ jsx23(
1424
+ /* @__PURE__ */ jsxs16(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
1425
+ scenario.errorMessage ? /* @__PURE__ */ jsx25(
1169
1426
  "pre",
1170
1427
  {
1171
1428
  role: "alert",
@@ -1173,10 +1430,11 @@ function ReportScenario({ scenario, hideTitle = false }) {
1173
1430
  children: scenario.errorMessage
1174
1431
  }
1175
1432
  ) : 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 })
1433
+ /* @__PURE__ */ jsx25(ReportStoryboard, { scenario }),
1434
+ /* @__PURE__ */ jsx25(ReportSteps, { scenario }),
1435
+ scenario.docEntries.length > 0 ? /* @__PURE__ */ jsx25("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ jsx25(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
1436
+ /* @__PURE__ */ jsx25(ReportAttachments, { attachments: scenario.attachments }),
1437
+ /* @__PURE__ */ jsx25(ReportTrace, { spans: scenario.otelSpans })
1180
1438
  ] })
1181
1439
  ]
1182
1440
  }
@@ -1184,13 +1442,13 @@ function ReportScenario({ scenario, hideTitle = false }) {
1184
1442
  }
1185
1443
 
1186
1444
  // src/components/ReportScenarioList.tsx
1187
- import { Fragment as Fragment8, jsx as jsx24 } from "react/jsx-runtime";
1445
+ import { Fragment as Fragment8, jsx as jsx26 } from "react/jsx-runtime";
1188
1446
  function ReportScenarioList({ feature }) {
1189
- return /* @__PURE__ */ jsx24(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx24(ReportScenario, { scenario }, scenario.id)) });
1447
+ return /* @__PURE__ */ jsx26(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx26(ReportScenario, { scenario }, scenario.id)) });
1190
1448
  }
1191
1449
 
1192
1450
  // src/components/ReportFeature.tsx
1193
- import { Fragment as Fragment9, jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
1451
+ import { Fragment as Fragment9, jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
1194
1452
  function ReportFeature({ feature }) {
1195
1453
  const titleId = `${feature.id}-title`;
1196
1454
  const bodyId = `${feature.id}-body`;
@@ -1201,7 +1459,7 @@ function ReportFeature({ feature }) {
1201
1459
  return (
1202
1460
  // Suite = a section heading + a divider, NOT another bordered card. Drops a
1203
1461
  // layer of nesting so the scenario cards below read as the primary unit.
1204
- /* @__PURE__ */ jsxs16(
1462
+ /* @__PURE__ */ jsxs17(
1205
1463
  "section",
1206
1464
  {
1207
1465
  id: feature.id,
@@ -1209,9 +1467,9 @@ function ReportFeature({ feature }) {
1209
1467
  "aria-labelledby": titleId,
1210
1468
  className: "flex flex-col gap-3",
1211
1469
  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(
1470
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1471
+ /* @__PURE__ */ jsxs17("div", { className: "min-w-0", children: [
1472
+ /* @__PURE__ */ jsx27("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs17(
1215
1473
  "button",
1216
1474
  {
1217
1475
  type: "button",
@@ -1220,31 +1478,31 @@ function ReportFeature({ feature }) {
1220
1478
  "aria-controls": bodyId,
1221
1479
  className: "flex w-full cursor-pointer items-center gap-2 text-left hover:text-foreground/80",
1222
1480
  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 })
1481
+ /* @__PURE__ */ jsx27("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1482
+ /* @__PURE__ */ jsx27("span", { className: "truncate", children: feature.title })
1225
1483
  ]
1226
1484
  }
1227
1485
  ) : 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 })
1486
+ /* @__PURE__ */ jsx27("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1229
1487
  ] }),
1230
- /* @__PURE__ */ jsxs16(
1488
+ /* @__PURE__ */ jsxs17(
1231
1489
  "p",
1232
1490
  {
1233
1491
  className: "flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",
1234
1492
  "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1235
1493
  children: [
1236
- /* @__PURE__ */ jsxs16("span", { children: [
1494
+ /* @__PURE__ */ jsxs17("span", { children: [
1237
1495
  s.passed,
1238
1496
  " passed"
1239
1497
  ] }),
1240
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1241
- /* @__PURE__ */ jsxs16("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1498
+ /* @__PURE__ */ jsx27("span", { "aria-hidden": true, children: "\xB7" }),
1499
+ /* @__PURE__ */ jsxs17("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1242
1500
  s.failed,
1243
1501
  " failed"
1244
1502
  ] }),
1245
- skipped > 0 ? /* @__PURE__ */ jsxs16(Fragment9, { children: [
1246
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1247
- /* @__PURE__ */ jsxs16("span", { children: [
1503
+ skipped > 0 ? /* @__PURE__ */ jsxs17(Fragment9, { children: [
1504
+ /* @__PURE__ */ jsx27("span", { "aria-hidden": true, children: "\xB7" }),
1505
+ /* @__PURE__ */ jsxs17("span", { children: [
1248
1506
  skipped,
1249
1507
  " skipped"
1250
1508
  ] })
@@ -1253,7 +1511,7 @@ function ReportFeature({ feature }) {
1253
1511
  }
1254
1512
  )
1255
1513
  ] }),
1256
- /* @__PURE__ */ jsx25("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx25(ReportScenarioList, { feature }) })
1514
+ /* @__PURE__ */ jsx27("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx27(ReportScenarioList, { feature }) })
1257
1515
  ]
1258
1516
  }
1259
1517
  )
@@ -1261,17 +1519,17 @@ function ReportFeature({ feature }) {
1261
1519
  }
1262
1520
 
1263
1521
  // src/components/ReportFeatureList.tsx
1264
- import { jsx as jsx26 } from "react/jsx-runtime";
1522
+ import { jsx as jsx28 } from "react/jsx-runtime";
1265
1523
  function ReportFeatureList() {
1266
1524
  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)) });
1525
+ return /* @__PURE__ */ jsx28("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx28(ReportFeature, { feature }, feature.id)) });
1268
1526
  }
1269
1527
 
1270
1528
  // src/components/ui/empty.tsx
1271
1529
  import { cva as cva2 } from "class-variance-authority";
1272
- import { jsx as jsx27 } from "react/jsx-runtime";
1530
+ import { jsx as jsx29 } from "react/jsx-runtime";
1273
1531
  function Empty({ className, ...props }) {
1274
- return /* @__PURE__ */ jsx27(
1532
+ return /* @__PURE__ */ jsx29(
1275
1533
  "div",
1276
1534
  {
1277
1535
  "data-slot": "empty",
@@ -1284,7 +1542,7 @@ function Empty({ className, ...props }) {
1284
1542
  );
1285
1543
  }
1286
1544
  function EmptyHeader({ className, ...props }) {
1287
- return /* @__PURE__ */ jsx27(
1545
+ return /* @__PURE__ */ jsx29(
1288
1546
  "div",
1289
1547
  {
1290
1548
  "data-slot": "empty-header",
@@ -1311,7 +1569,7 @@ var emptyMediaVariants = cva2(
1311
1569
  }
1312
1570
  );
1313
1571
  function EmptyTitle({ className, ...props }) {
1314
- return /* @__PURE__ */ jsx27(
1572
+ return /* @__PURE__ */ jsx29(
1315
1573
  "div",
1316
1574
  {
1317
1575
  "data-slot": "empty-title",
@@ -1322,16 +1580,16 @@ function EmptyTitle({ className, ...props }) {
1322
1580
  }
1323
1581
 
1324
1582
  // src/components/ReportEmpty.tsx
1325
- import { jsx as jsx28 } from "react/jsx-runtime";
1583
+ import { jsx as jsx30 } from "react/jsx-runtime";
1326
1584
  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." }) }) });
1585
+ return /* @__PURE__ */ jsx30(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx30(EmptyHeader, { children: /* @__PURE__ */ jsx30(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1328
1586
  }
1329
1587
 
1330
1588
  // src/components/ReportSummary.tsx
1331
- import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
1589
+ import { jsx as jsx31, jsxs as jsxs18 } from "react/jsx-runtime";
1332
1590
  function ReportSummary({ className }) {
1333
1591
  const report = useReport();
1334
- return /* @__PURE__ */ jsx29(
1592
+ return /* @__PURE__ */ jsx31(
1335
1593
  ReportSummaryView,
1336
1594
  {
1337
1595
  summary: report.summary,
@@ -1357,7 +1615,7 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1357
1615
  if (summary.pending > 0) {
1358
1616
  cards.push({ status: "pending", label: "Pending", value: summary.pending });
1359
1617
  }
1360
- return /* @__PURE__ */ jsx29(
1618
+ return /* @__PURE__ */ jsx31(
1361
1619
  "dl",
1362
1620
  {
1363
1621
  className: cn(
@@ -1370,17 +1628,17 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1370
1628
  "aria-label": ariaLabel,
1371
1629
  children: cards.map((c) => {
1372
1630
  const tone = TONE[c.status];
1373
- return /* @__PURE__ */ jsxs17(
1631
+ return /* @__PURE__ */ jsxs18(
1374
1632
  "div",
1375
1633
  {
1376
1634
  "data-status": c.status,
1377
1635
  className: "rounded-lg border bg-card px-4 py-3",
1378
1636
  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" }),
1637
+ /* @__PURE__ */ jsxs18("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1638
+ /* @__PURE__ */ jsx31("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1381
1639
  c.label
1382
1640
  ] }),
1383
- /* @__PURE__ */ jsx29("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1641
+ /* @__PURE__ */ jsx31("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1384
1642
  ]
1385
1643
  },
1386
1644
  c.status
@@ -1440,7 +1698,7 @@ function prUrl(ci) {
1440
1698
  }
1441
1699
 
1442
1700
  // src/components/ReportMeta.tsx
1443
- import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1701
+ import { jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
1444
1702
  function ReportMeta() {
1445
1703
  const report = useReport();
1446
1704
  const items = [];
@@ -1463,13 +1721,13 @@ function ReportMeta() {
1463
1721
  const short = sha.slice(0, 8);
1464
1722
  items.push({
1465
1723
  label: "Commit",
1466
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1724
+ value: url ? /* @__PURE__ */ jsx32("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1467
1725
  });
1468
1726
  }
1469
1727
  if (report.ci) {
1470
1728
  items.push({
1471
1729
  label: "CI",
1472
- value: report.ci.url ? /* @__PURE__ */ jsxs18("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1730
+ value: report.ci.url ? /* @__PURE__ */ jsxs19("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1473
1731
  ciDisplayName(report.ci.name),
1474
1732
  report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""
1475
1733
  ] }) : `${ciDisplayName(report.ci.name)}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""}`
@@ -1480,7 +1738,7 @@ function ReportMeta() {
1480
1738
  const label = `#${report.ci.prNumber}`;
1481
1739
  items.push({
1482
1740
  label: "PR",
1483
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1741
+ value: url ? /* @__PURE__ */ jsx32("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1484
1742
  });
1485
1743
  }
1486
1744
  if (items.length === 0) return null;
@@ -1488,50 +1746,50 @@ function ReportMeta() {
1488
1746
  // Run metadata is useful but secondary to "what failed" — tuck it into a
1489
1747
  // collapsed disclosure so it doesn't push the result down. Native <details>
1490
1748
  // 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" }),
1749
+ /* @__PURE__ */ jsxs19("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1750
+ /* @__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: [
1751
+ /* @__PURE__ */ jsx32("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1494
1752
  "Run details"
1495
1753
  ] }),
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 })
1754
+ /* @__PURE__ */ jsx32("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: [
1755
+ /* @__PURE__ */ jsx32("dt", { className: "font-medium", children: item.label }),
1756
+ /* @__PURE__ */ jsx32("dd", { className: "font-mono text-foreground", children: item.value })
1499
1757
  ] }, item.label)) })
1500
1758
  ] })
1501
1759
  );
1502
1760
  }
1503
1761
 
1504
1762
  // src/components/ReportSchemaError.tsx
1505
- import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1763
+ import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
1506
1764
  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: [
1765
+ return /* @__PURE__ */ jsxs20("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1766
+ /* @__PURE__ */ jsx33("p", { children: /* @__PURE__ */ jsx33("strong", { children: "Report could not be displayed." }) }),
1767
+ /* @__PURE__ */ jsx33("p", { children: error.message }),
1768
+ error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs20("p", { children: [
1511
1769
  "The report bundle is newer than this version of ",
1512
- /* @__PURE__ */ jsx31("code", { children: "executable-stories-react" }),
1770
+ /* @__PURE__ */ jsx33("code", { children: "executable-stories-react" }),
1513
1771
  ". Upgrade the package, or regenerate the report with an older formatters CLI."
1514
1772
  ] }) : null,
1515
- error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs19("details", { children: [
1516
- /* @__PURE__ */ jsxs19("summary", { children: [
1773
+ error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs20("details", { children: [
1774
+ /* @__PURE__ */ jsxs20("summary", { children: [
1517
1775
  error.issues.length,
1518
1776
  " validation issue",
1519
1777
  error.issues.length === 1 ? "" : "s"
1520
1778
  ] }),
1521
- /* @__PURE__ */ jsx31("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1779
+ /* @__PURE__ */ jsx33("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1522
1780
  ] }) : null
1523
1781
  ] });
1524
1782
  }
1525
1783
 
1526
1784
  // src/components/ReportShell.tsx
1527
- import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1785
+ import { Fragment as Fragment10, jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
1528
1786
  function ReportErrorShell({
1529
1787
  error,
1530
1788
  className,
1531
1789
  title,
1532
1790
  dataTheme
1533
1791
  }) {
1534
- return /* @__PURE__ */ jsx32("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx32(ReportSchemaError, { error }) });
1792
+ return /* @__PURE__ */ jsx34("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx34(ReportSchemaError, { error }) });
1535
1793
  }
1536
1794
 
1537
1795
  // src/interactive/ReportInteractive.tsx
@@ -1540,12 +1798,12 @@ import { Monitor, Moon, Sun } from "lucide-react";
1540
1798
  // src/components/ui/switch.tsx
1541
1799
  import "react";
1542
1800
  import { Switch as SwitchPrimitive } from "@base-ui/react/switch";
1543
- import { jsx as jsx33 } from "react/jsx-runtime";
1801
+ import { jsx as jsx35 } from "react/jsx-runtime";
1544
1802
  function Switch({
1545
1803
  className,
1546
1804
  ...props
1547
1805
  }) {
1548
- return /* @__PURE__ */ jsx33(
1806
+ return /* @__PURE__ */ jsx35(
1549
1807
  SwitchPrimitive.Root,
1550
1808
  {
1551
1809
  "data-slot": "switch",
@@ -1554,7 +1812,7 @@ function Switch({
1554
1812
  className
1555
1813
  ),
1556
1814
  ...props,
1557
- children: /* @__PURE__ */ jsx33(
1815
+ children: /* @__PURE__ */ jsx35(
1558
1816
  SwitchPrimitive.Thumb,
1559
1817
  {
1560
1818
  "data-slot": "switch-thumb",
@@ -1570,7 +1828,7 @@ import * as React5 from "react";
1570
1828
  import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
1571
1829
  import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
1572
1830
  import { cva as cva3 } from "class-variance-authority";
1573
- import { jsx as jsx34 } from "react/jsx-runtime";
1831
+ import { jsx as jsx36 } from "react/jsx-runtime";
1574
1832
  var toggleItemVariants = cva3(
1575
1833
  "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
1834
  {
@@ -1592,13 +1850,13 @@ function ToggleGroup({
1592
1850
  children,
1593
1851
  ...props
1594
1852
  }) {
1595
- return /* @__PURE__ */ jsx34(
1853
+ return /* @__PURE__ */ jsx36(
1596
1854
  ToggleGroupPrimitive,
1597
1855
  {
1598
1856
  "data-slot": "toggle-group",
1599
1857
  className: cn("flex w-fit items-center gap-0.5 rounded-lg bg-muted p-0.5", className),
1600
1858
  ...props,
1601
- children: /* @__PURE__ */ jsx34(ToggleGroupContext.Provider, { value: { size }, children })
1859
+ children: /* @__PURE__ */ jsx36(ToggleGroupContext.Provider, { value: { size }, children })
1602
1860
  }
1603
1861
  );
1604
1862
  }
@@ -1609,7 +1867,7 @@ function ToggleGroupItem({
1609
1867
  ...props
1610
1868
  }) {
1611
1869
  const context = React5.useContext(ToggleGroupContext);
1612
- return /* @__PURE__ */ jsx34(
1870
+ return /* @__PURE__ */ jsx36(
1613
1871
  TogglePrimitive,
1614
1872
  {
1615
1873
  "data-slot": "toggle-group-item",
@@ -1629,9 +1887,9 @@ import { Search } from "lucide-react";
1629
1887
 
1630
1888
  // src/components/ui/input.tsx
1631
1889
  import "react";
1632
- import { jsx as jsx35 } from "react/jsx-runtime";
1890
+ import { jsx as jsx37 } from "react/jsx-runtime";
1633
1891
  function Input({ className, type, ...props }) {
1634
- return /* @__PURE__ */ jsx35(
1892
+ return /* @__PURE__ */ jsx37(
1635
1893
  "input",
1636
1894
  {
1637
1895
  type,
@@ -1648,7 +1906,7 @@ function Input({ className, type, ...props }) {
1648
1906
  }
1649
1907
 
1650
1908
  // src/interactive/ReportSearch.tsx
1651
- import { jsx as jsx36, jsxs as jsxs21 } from "react/jsx-runtime";
1909
+ import { jsx as jsx38, jsxs as jsxs22 } from "react/jsx-runtime";
1652
1910
  var ReportSearch = forwardRef(
1653
1911
  function ReportSearch2(props, ref) {
1654
1912
  const {
@@ -1670,17 +1928,17 @@ var ReportSearch = forwardRef(
1670
1928
  e.preventDefault();
1671
1929
  }
1672
1930
  }
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(
1931
+ return /* @__PURE__ */ jsxs22("div", { className: cn("es-search flex flex-col gap-1", className), children: [
1932
+ /* @__PURE__ */ jsx38("label", { htmlFor: inputId, className: "sr-only", children: "Search" }),
1933
+ /* @__PURE__ */ jsxs22("div", { className: "relative w-full sm:w-72", children: [
1934
+ /* @__PURE__ */ jsx38(
1677
1935
  Search,
1678
1936
  {
1679
1937
  "aria-hidden": true,
1680
1938
  className: "pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground"
1681
1939
  }
1682
1940
  ),
1683
- /* @__PURE__ */ jsx36(
1941
+ /* @__PURE__ */ jsx38(
1684
1942
  Input,
1685
1943
  {
1686
1944
  ref,
@@ -1697,7 +1955,7 @@ var ReportSearch = forwardRef(
1697
1955
  }
1698
1956
  )
1699
1957
  ] }),
1700
- showCounts ? /* @__PURE__ */ jsxs21(
1958
+ showCounts ? /* @__PURE__ */ jsxs22(
1701
1959
  "span",
1702
1960
  {
1703
1961
  className: "text-xs tabular-nums text-muted-foreground",
@@ -1738,7 +1996,7 @@ function scrollToScenarioId(scenarioId, options = {}) {
1738
1996
  }
1739
1997
 
1740
1998
  // src/interactive/ReportFailureBanner.tsx
1741
- import { jsx as jsx37, jsxs as jsxs22 } from "react/jsx-runtime";
1999
+ import { jsx as jsx39, jsxs as jsxs23 } from "react/jsx-runtime";
1742
2000
  function ReportFailureBanner({ failures }) {
1743
2001
  const first = failures[0];
1744
2002
  const jumpToFirst = useCallback2(() => {
@@ -1746,7 +2004,7 @@ function ReportFailureBanner({ failures }) {
1746
2004
  scrollToScenarioId(first.scenarioId);
1747
2005
  }, [first]);
1748
2006
  if (failures.length === 0) return null;
1749
- return /* @__PURE__ */ jsxs22(
2007
+ return /* @__PURE__ */ jsxs23(
1750
2008
  "div",
1751
2009
  {
1752
2010
  className: "es-failure-banner",
@@ -1754,13 +2012,13 @@ function ReportFailureBanner({ failures }) {
1754
2012
  "aria-live": "polite",
1755
2013
  "aria-label": "Failure summary",
1756
2014
  children: [
1757
- /* @__PURE__ */ jsxs22("span", { className: "es-failure-banner-text", children: [
1758
- /* @__PURE__ */ jsx37("strong", { children: failures.length }),
2015
+ /* @__PURE__ */ jsxs23("span", { className: "es-failure-banner-text", children: [
2016
+ /* @__PURE__ */ jsx39("strong", { children: failures.length }),
1759
2017
  " ",
1760
2018
  "failure",
1761
2019
  failures.length === 1 ? "" : "s"
1762
2020
  ] }),
1763
- /* @__PURE__ */ jsx37(
2021
+ /* @__PURE__ */ jsx39(
1764
2022
  "button",
1765
2023
  {
1766
2024
  type: "button",
@@ -1777,7 +2035,7 @@ function ReportFailureBanner({ failures }) {
1777
2035
 
1778
2036
  // src/interactive/ReportFreshness.tsx
1779
2037
  import { useEffect, useState as useState2 } from "react";
1780
- import { Fragment as Fragment11, jsx as jsx38, jsxs as jsxs23 } from "react/jsx-runtime";
2038
+ import { Fragment as Fragment11, jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
1781
2039
  function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1782
2040
  const [now, setNow] = useState2(nowMs);
1783
2041
  useEffect(() => {
@@ -1785,7 +2043,7 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1785
2043
  }, [nowMs]);
1786
2044
  if (lastRunMs === void 0 || now === void 0) return null;
1787
2045
  const age = formatRelativeAge(lastRunMs, now);
1788
- const runLink = ciUrl ? /* @__PURE__ */ jsx38(
2046
+ const runLink = ciUrl ? /* @__PURE__ */ jsx40(
1789
2047
  "a",
1790
2048
  {
1791
2049
  href: ciUrl,
@@ -1796,9 +2054,9 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1796
2054
  }
1797
2055
  ) : null;
1798
2056
  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: [
2057
+ return /* @__PURE__ */ jsxs24("div", { className: "es-stale-banner", role: "status", "aria-label": "Report freshness", children: [
2058
+ /* @__PURE__ */ jsxs24("span", { children: [
2059
+ /* @__PURE__ */ jsxs24("strong", { children: [
1802
2060
  "Last verified ",
1803
2061
  age,
1804
2062
  "."
@@ -1808,10 +2066,10 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1808
2066
  runLink
1809
2067
  ] });
1810
2068
  }
1811
- return /* @__PURE__ */ jsxs23("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
2069
+ return /* @__PURE__ */ jsxs24("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
1812
2070
  "Verified ",
1813
2071
  age,
1814
- runLink ? /* @__PURE__ */ jsxs23(Fragment11, { children: [
2072
+ runLink ? /* @__PURE__ */ jsxs24(Fragment11, { children: [
1815
2073
  " \xB7 ",
1816
2074
  runLink
1817
2075
  ] }) : null
@@ -1819,15 +2077,15 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
1819
2077
  }
1820
2078
 
1821
2079
  // src/interactive/ReportLastRunDelta.tsx
1822
- import { Fragment as Fragment12, jsx as jsx39, jsxs as jsxs24 } from "react/jsx-runtime";
2080
+ import { Fragment as Fragment12, jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
1823
2081
  var MAX_LINKS = 5;
1824
2082
  function ScenarioLinks({ scenarios, tone }) {
1825
- return /* @__PURE__ */ jsxs24(Fragment12, { children: [
1826
- scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs24("span", { children: [
2083
+ return /* @__PURE__ */ jsxs25(Fragment12, { children: [
2084
+ scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs25("span", { children: [
1827
2085
  i > 0 ? ", " : "",
1828
- /* @__PURE__ */ jsx39("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
2086
+ /* @__PURE__ */ jsx41("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
1829
2087
  ] }, s.id)),
1830
- scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs24("span", { children: [
2088
+ scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs25("span", { children: [
1831
2089
  " and ",
1832
2090
  scenarios.length - MAX_LINKS,
1833
2091
  " more"
@@ -1844,23 +2102,23 @@ function ReportLastRunDelta({
1844
2102
  if (!delta) return null;
1845
2103
  const { newlyFailing, newlyPassing, added } = delta;
1846
2104
  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." });
2105
+ return /* @__PURE__ */ jsx41("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: "Since last run: no behavior changes." });
1848
2106
  }
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: [
2107
+ return /* @__PURE__ */ jsxs25("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: [
2108
+ /* @__PURE__ */ jsx41("span", { className: "font-medium text-foreground", children: "Since last run:" }),
2109
+ newlyFailing.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2 text-fail", children: [
1852
2110
  newlyFailing.length,
1853
2111
  " newly failing (",
1854
- /* @__PURE__ */ jsx39(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
2112
+ /* @__PURE__ */ jsx41(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
1855
2113
  ")"
1856
2114
  ] }) : null,
1857
- newlyPassing.length > 0 ? /* @__PURE__ */ jsxs24("span", { className: "ml-2 text-pass", children: [
2115
+ newlyPassing.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2 text-pass", children: [
1858
2116
  newlyPassing.length,
1859
2117
  " fixed (",
1860
- /* @__PURE__ */ jsx39(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
2118
+ /* @__PURE__ */ jsx41(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
1861
2119
  ")"
1862
2120
  ] }) : null,
1863
- added.length > 0 ? /* @__PURE__ */ jsxs24("span", { className: "ml-2", children: [
2121
+ added.length > 0 ? /* @__PURE__ */ jsxs25("span", { className: "ml-2", children: [
1864
2122
  added.length,
1865
2123
  " new"
1866
2124
  ] }) : null
@@ -1924,7 +2182,7 @@ function Button({
1924
2182
  }
1925
2183
 
1926
2184
  // src/interactive/ReportShortcutsHelp.tsx
1927
- import { jsx as jsx40, jsxs as jsxs25 } from "react/jsx-runtime";
2185
+ import { jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
1928
2186
  var SHORTCUTS = [
1929
2187
  { keys: "/", description: "Focus search" },
1930
2188
  { keys: "f", description: "Jump to next failure" },
@@ -1936,9 +2194,9 @@ var SHORTCUTS = [
1936
2194
  ];
1937
2195
  function Keys({ keys }) {
1938
2196
  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 })
2197
+ return /* @__PURE__ */ jsx42("span", { className: "inline-flex items-center gap-1", children: parts.map((k, i) => /* @__PURE__ */ jsxs26("span", { className: "inline-flex items-center gap-1", children: [
2198
+ i > 0 ? /* @__PURE__ */ jsx42("span", { className: "text-xs text-muted-foreground", children: "+" }) : null,
2199
+ /* @__PURE__ */ jsx42("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
2200
  ] }, k)) });
1943
2201
  }
1944
2202
  function ReportShortcutsHelp({ open, onClose }) {
@@ -1949,7 +2207,7 @@ function ReportShortcutsHelp({ open, onClose }) {
1949
2207
  if (open && !dialog.open) dialog.showModal();
1950
2208
  else if (!open && dialog.open) dialog.close();
1951
2209
  }, [open]);
1952
- return /* @__PURE__ */ jsxs25(
2210
+ return /* @__PURE__ */ jsxs26(
1953
2211
  "dialog",
1954
2212
  {
1955
2213
  ref: dialogRef,
@@ -1957,12 +2215,12 @@ function ReportShortcutsHelp({ open, onClose }) {
1957
2215
  "aria-label": "Keyboard shortcuts",
1958
2216
  onClose,
1959
2217
  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 })
2218
+ /* @__PURE__ */ jsx42("h2", { className: "text-base font-semibold", children: "Keyboard shortcuts" }),
2219
+ /* @__PURE__ */ jsx42("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: [
2220
+ /* @__PURE__ */ jsx42("dt", { className: "justify-self-start", children: /* @__PURE__ */ jsx42(Keys, { keys: s.keys }) }),
2221
+ /* @__PURE__ */ jsx42("dd", { className: "text-sm text-muted-foreground", children: s.description })
1964
2222
  ] }, s.keys)) }),
1965
- /* @__PURE__ */ jsx40("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx40(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
2223
+ /* @__PURE__ */ jsx42("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx42(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
1966
2224
  ]
1967
2225
  }
1968
2226
  );
@@ -2163,7 +2421,7 @@ function failuresFirst(report) {
2163
2421
 
2164
2422
  // src/interactive/ReportFilters.tsx
2165
2423
  import { useState as useState3 } from "react";
2166
- import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
2424
+ import { jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
2167
2425
  var TAG_LIMIT = 12;
2168
2426
  function ReportFilters({
2169
2427
  statuses,
@@ -2177,10 +2435,10 @@ function ReportFilters({
2177
2435
  if (statuses.length === 0 && tags.length === 0) return null;
2178
2436
  const tagsCollapsed = tags.length > TAG_LIMIT && !showAllTags;
2179
2437
  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) => {
2438
+ return /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-2", children: [
2439
+ statuses.length > 0 ? /* @__PURE__ */ jsx43("div", { role: "group", "aria-label": "Filter by status", className: "flex flex-wrap gap-1", children: statuses.map((opt) => {
2182
2440
  const active = status === opt.key;
2183
- return /* @__PURE__ */ jsxs26(
2441
+ return /* @__PURE__ */ jsxs27(
2184
2442
  "button",
2185
2443
  {
2186
2444
  type: "button",
@@ -2192,23 +2450,23 @@ function ReportFilters({
2192
2450
  ),
2193
2451
  children: [
2194
2452
  opt.label,
2195
- /* @__PURE__ */ jsx41("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2453
+ /* @__PURE__ */ jsx43("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2196
2454
  ]
2197
2455
  },
2198
2456
  opt.key
2199
2457
  );
2200
2458
  }) }) : null,
2201
- tags.length > 0 ? /* @__PURE__ */ jsxs26("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2459
+ tags.length > 0 ? /* @__PURE__ */ jsxs27("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2202
2460
  visibleTags.map((tag) => {
2203
2461
  const active = activeTags.includes(tag);
2204
- return /* @__PURE__ */ jsx41("li", { children: /* @__PURE__ */ jsx41(
2462
+ return /* @__PURE__ */ jsx43("li", { children: /* @__PURE__ */ jsx43(
2205
2463
  "button",
2206
2464
  {
2207
2465
  type: "button",
2208
2466
  "aria-pressed": active,
2209
2467
  onClick: () => onToggleTag(tag),
2210
2468
  className: "cursor-pointer",
2211
- children: /* @__PURE__ */ jsx41(
2469
+ children: /* @__PURE__ */ jsx43(
2212
2470
  Badge,
2213
2471
  {
2214
2472
  variant: "tag",
@@ -2221,7 +2479,7 @@ function ReportFilters({
2221
2479
  }
2222
2480
  ) }, tag);
2223
2481
  }),
2224
- tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx41("li", { children: /* @__PURE__ */ jsx41(
2482
+ tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx43("li", { children: /* @__PURE__ */ jsx43(
2225
2483
  "button",
2226
2484
  {
2227
2485
  type: "button",
@@ -2237,7 +2495,7 @@ function ReportFilters({
2237
2495
 
2238
2496
  // src/interactive/ReportToc.tsx
2239
2497
  import { useEffect as useEffect5, useMemo as useMemo2, useState as useState4 } from "react";
2240
- import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2498
+ import { jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
2241
2499
  var DOT = {
2242
2500
  passed: "bg-pass",
2243
2501
  failed: "bg-fail",
@@ -2266,11 +2524,11 @@ function TocContent({ onNavigate }) {
2266
2524
  return () => observer.disconnect();
2267
2525
  }, [scenarioIds]);
2268
2526
  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) => {
2527
+ return /* @__PURE__ */ jsx44("ul", { className: "flex list-none flex-col gap-4 pl-0", children: report.features.map((feature) => /* @__PURE__ */ jsxs28("li", { children: [
2528
+ /* @__PURE__ */ jsx44("p", { className: "mb-1.5 font-semibold leading-snug text-foreground", children: feature.title }),
2529
+ /* @__PURE__ */ jsx44("ul", { className: "flex list-none flex-col gap-0.5 pl-0", children: feature.scenarios.map((scenario) => {
2272
2530
  const active = activeId === scenario.id;
2273
- return /* @__PURE__ */ jsx42("li", { children: /* @__PURE__ */ jsxs27(
2531
+ return /* @__PURE__ */ jsx44("li", { children: /* @__PURE__ */ jsxs28(
2274
2532
  "a",
2275
2533
  {
2276
2534
  href: `#${scenario.id}`,
@@ -2285,14 +2543,14 @@ function TocContent({ onNavigate }) {
2285
2543
  active ? "border-primary font-medium text-foreground" : "border-border text-muted-foreground"
2286
2544
  ),
2287
2545
  children: [
2288
- /* @__PURE__ */ jsx42(
2546
+ /* @__PURE__ */ jsx44(
2289
2547
  "span",
2290
2548
  {
2291
2549
  "aria-hidden": true,
2292
2550
  className: cn("mt-1 size-1.5 shrink-0 rounded-full", DOT[scenario.status])
2293
2551
  }
2294
2552
  ),
2295
- /* @__PURE__ */ jsx42("span", { className: "break-words", children: scenario.title })
2553
+ /* @__PURE__ */ jsx44("span", { className: "break-words", children: scenario.title })
2296
2554
  ]
2297
2555
  }
2298
2556
  ) }, scenario.id);
@@ -2302,14 +2560,14 @@ function TocContent({ onNavigate }) {
2302
2560
  function ReportToc() {
2303
2561
  const report = useReport();
2304
2562
  if (report.features.length === 0) return null;
2305
- return /* @__PURE__ */ jsxs27(
2563
+ return /* @__PURE__ */ jsxs28(
2306
2564
  "nav",
2307
2565
  {
2308
2566
  "aria-label": "Table of contents",
2309
2567
  className: "sticky top-4 hidden h-fit w-64 shrink-0 self-start text-xs lg:block",
2310
2568
  children: [
2311
- /* @__PURE__ */ jsx42("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2312
- /* @__PURE__ */ jsx42(TocContent, {})
2569
+ /* @__PURE__ */ jsx44("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2570
+ /* @__PURE__ */ jsx44(TocContent, {})
2313
2571
  ]
2314
2572
  }
2315
2573
  );
@@ -2319,31 +2577,31 @@ function ReportToc() {
2319
2577
  import { useState as useState5 } from "react";
2320
2578
  import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
2321
2579
  import { ListIcon, XIcon } from "lucide-react";
2322
- import { jsx as jsx43, jsxs as jsxs28 } from "react/jsx-runtime";
2580
+ import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
2323
2581
  function ReportTocDrawer() {
2324
2582
  const report = useReport();
2325
2583
  const [open, setOpen] = useState5(false);
2326
2584
  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 }),
2585
+ return /* @__PURE__ */ jsxs29(DialogPrimitive.Root, { open, onOpenChange: setOpen, children: [
2586
+ /* @__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: [
2587
+ /* @__PURE__ */ jsx45(ListIcon, { "aria-hidden": true }),
2330
2588
  " Contents"
2331
2589
  ] }),
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(
2590
+ /* @__PURE__ */ jsxs29(DialogPrimitive.Portal, { children: [
2591
+ /* @__PURE__ */ jsx45(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" }),
2592
+ /* @__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: [
2593
+ /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between", children: [
2594
+ /* @__PURE__ */ jsx45(DialogPrimitive.Title, { className: "text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Contents" }),
2595
+ /* @__PURE__ */ jsx45(
2338
2596
  DialogPrimitive.Close,
2339
2597
  {
2340
2598
  "aria-label": "Close contents",
2341
2599
  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 })
2600
+ children: /* @__PURE__ */ jsx45(XIcon, { "aria-hidden": true })
2343
2601
  }
2344
2602
  )
2345
2603
  ] }),
2346
- /* @__PURE__ */ jsx43(TocContent, { onNavigate: () => setOpen(false) })
2604
+ /* @__PURE__ */ jsx45(TocContent, { onNavigate: () => setOpen(false) })
2347
2605
  ] })
2348
2606
  ] })
2349
2607
  ] });
@@ -2398,14 +2656,14 @@ function useTheme() {
2398
2656
  }
2399
2657
 
2400
2658
  // src/interactive/ReportInteractive.tsx
2401
- import { Fragment as Fragment13, jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
2659
+ import { Fragment as Fragment13, jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
2402
2660
  function ReportInteractive(props) {
2403
2661
  const { report, className, title, dataTheme } = props;
2404
2662
  const result = unwrapReport(report);
2405
2663
  if (!result.ok) {
2406
- return /* @__PURE__ */ jsx44(ReportErrorShell, { error: result.error, className, title, dataTheme });
2664
+ return /* @__PURE__ */ jsx46(ReportErrorShell, { error: result.error, className, title, dataTheme });
2407
2665
  }
2408
- return /* @__PURE__ */ jsx44(ReportInteractiveView, { ...props, report: result.data });
2666
+ return /* @__PURE__ */ jsx46(ReportInteractiveView, { ...props, report: result.data });
2409
2667
  }
2410
2668
  var THEME_OPTIONS = [
2411
2669
  { value: "light", label: "Light", Icon: Sun },
@@ -2413,7 +2671,7 @@ var THEME_OPTIONS = [
2413
2671
  { value: "dark", label: "Dark", Icon: Moon }
2414
2672
  ];
2415
2673
  function ThemeSegment({ pref, onPref }) {
2416
- return /* @__PURE__ */ jsx44(
2674
+ return /* @__PURE__ */ jsx46(
2417
2675
  ToggleGroup,
2418
2676
  {
2419
2677
  size: "sm",
@@ -2423,7 +2681,7 @@ function ThemeSegment({ pref, onPref }) {
2423
2681
  if (next) onPref(next);
2424
2682
  },
2425
2683
  "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))
2684
+ children: THEME_OPTIONS.map(({ value, label, Icon }) => /* @__PURE__ */ jsx46(ToggleGroupItem, { value, "aria-label": label, title: label, className: "px-2", children: /* @__PURE__ */ jsx46(Icon, {}) }, value))
2427
2685
  }
2428
2686
  );
2429
2687
  }
@@ -2545,13 +2803,13 @@ function ReportInteractiveView({
2545
2803
  const totalScenarios = report.summary.total;
2546
2804
  const matchedScenarios = filtered.summary.total;
2547
2805
  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(
2806
+ return /* @__PURE__ */ jsx46(CollapseProvider, { value: collapse.api, children: /* @__PURE__ */ jsx46(ScenarioActionsProvider, { value: scenarioActions, children: /* @__PURE__ */ jsx46(ScenarioHistoryProvider, { value: scenarioHistory ?? null, children: /* @__PURE__ */ jsx46(
2549
2807
  ReportRoot,
2550
2808
  {
2551
2809
  report: filtered,
2552
2810
  customRenderers,
2553
2811
  renderers,
2554
- children: /* @__PURE__ */ jsxs29(
2812
+ children: /* @__PURE__ */ jsxs30(
2555
2813
  "main",
2556
2814
  {
2557
2815
  className: cn("es-report", "es-report-interactive", className),
@@ -2560,8 +2818,8 @@ function ReportInteractiveView({
2560
2818
  "data-theme": dataTheme,
2561
2819
  "data-detail-level": detail,
2562
2820
  children: [
2563
- /* @__PURE__ */ jsxs29("header", { className: "es-report-header", children: [
2564
- /* @__PURE__ */ jsxs29(
2821
+ /* @__PURE__ */ jsxs30("header", { className: "es-report-header", children: [
2822
+ /* @__PURE__ */ jsxs30(
2565
2823
  "div",
2566
2824
  {
2567
2825
  "data-es-navbar": true,
@@ -2570,9 +2828,9 @@ function ReportInteractiveView({
2570
2828
  hideHeader ? "justify-end" : "justify-between"
2571
2829
  ),
2572
2830
  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(
2831
+ hideHeader ? null : /* @__PURE__ */ jsx46("h1", { className: "min-w-0", children: title ?? "Story Report" }),
2832
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2833
+ /* @__PURE__ */ jsx46(
2576
2834
  ReportSearch,
2577
2835
  {
2578
2836
  ref: searchRef,
@@ -2582,16 +2840,16 @@ function ReportInteractiveView({
2582
2840
  totalCount: totalScenarios
2583
2841
  }
2584
2842
  ),
2585
- /* @__PURE__ */ jsx44(ThemeSegment, { pref: themePref, onPref: setThemePref })
2843
+ /* @__PURE__ */ jsx46(ThemeSegment, { pref: themePref, onPref: setThemePref })
2586
2844
  ] })
2587
2845
  ]
2588
2846
  }
2589
2847
  ),
2590
- hideHeader ? null : /* @__PURE__ */ jsxs29(Fragment13, { children: [
2591
- /* @__PURE__ */ jsx44(ReportSummary, {}),
2592
- /* @__PURE__ */ jsx44(ReportMeta, {})
2848
+ hideHeader ? null : /* @__PURE__ */ jsxs30(Fragment13, { children: [
2849
+ /* @__PURE__ */ jsx46(ReportSummary, {}),
2850
+ /* @__PURE__ */ jsx46(ReportMeta, {})
2593
2851
  ] }),
2594
- /* @__PURE__ */ jsx44(
2852
+ /* @__PURE__ */ jsx46(
2595
2853
  ReportFreshness,
2596
2854
  {
2597
2855
  lastRunMs: reportLastRunMs(report),
@@ -2599,8 +2857,8 @@ function ReportInteractiveView({
2599
2857
  staleAfterDays
2600
2858
  }
2601
2859
  ),
2602
- /* @__PURE__ */ jsx44(ReportLastRunDelta, { history: scenarioHistory, report }),
2603
- /* @__PURE__ */ jsx44(
2860
+ /* @__PURE__ */ jsx46(ReportLastRunDelta, { history: scenarioHistory, report }),
2861
+ /* @__PURE__ */ jsx46(
2604
2862
  ReportFilters,
2605
2863
  {
2606
2864
  statuses: statusOptions,
@@ -2611,14 +2869,14 @@ function ReportInteractiveView({
2611
2869
  onToggleTag: toggleTag
2612
2870
  }
2613
2871
  ),
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" })
2872
+ /* @__PURE__ */ jsxs30("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2 border-t border-border/60 pt-3", children: [
2873
+ showToc ? /* @__PURE__ */ jsx46(ReportTocDrawer, {}) : null,
2874
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2875
+ /* @__PURE__ */ jsx46(Switch, { id: expandId, checked: expandedAll, onCheckedChange: setExpanded }),
2876
+ /* @__PURE__ */ jsx46("label", { htmlFor: expandId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Expand all" })
2619
2877
  ] }),
2620
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2", children: [
2621
- /* @__PURE__ */ jsx44(
2878
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-2", children: [
2879
+ /* @__PURE__ */ jsx46(
2622
2880
  Switch,
2623
2881
  {
2624
2882
  id: docsId,
@@ -2626,16 +2884,16 @@ function ReportInteractiveView({
2626
2884
  onCheckedChange: (checked) => setDetail(checked ? "full" : "minimal")
2627
2885
  }
2628
2886
  ),
2629
- /* @__PURE__ */ jsx44("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2887
+ /* @__PURE__ */ jsx46("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2630
2888
  ] })
2631
2889
  ] })
2632
2890
  ] }),
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(
2891
+ /* @__PURE__ */ jsx46(ReportFailureBanner, { failures }),
2892
+ hasContent ? showToc ? /* @__PURE__ */ jsxs30("div", { className: "flex gap-6", children: [
2893
+ /* @__PURE__ */ jsx46(ReportToc, {}),
2894
+ /* @__PURE__ */ jsx46("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: /* @__PURE__ */ jsx46(ReportFeatureList, {}) })
2895
+ ] }) : /* @__PURE__ */ jsx46("div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ jsx46(ReportFeatureList, {}) }) : /* @__PURE__ */ jsx46(ReportEmpty, { message: query ? "No scenarios match the search." : void 0 }),
2896
+ /* @__PURE__ */ jsx46(
2639
2897
  "button",
2640
2898
  {
2641
2899
  type: "button",
@@ -2646,8 +2904,8 @@ function ReportInteractiveView({
2646
2904
  children: "?"
2647
2905
  }
2648
2906
  ),
2649
- /* @__PURE__ */ jsx44(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2650
- toast ? /* @__PURE__ */ jsx44(
2907
+ /* @__PURE__ */ jsx46(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2908
+ toast ? /* @__PURE__ */ jsx46(
2651
2909
  "div",
2652
2910
  {
2653
2911
  role: "status",
@@ -2671,7 +2929,7 @@ import { createElement, useEffect as useEffect8, useState as useState9 } from "r
2671
2929
 
2672
2930
  // src/components/doc/MermaidView.tsx
2673
2931
  import { useEffect as useEffect7, useRef as useRef4, useState as useState8 } from "react";
2674
- import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2932
+ import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
2675
2933
  function prefersDark(el) {
2676
2934
  const themed = el?.closest("[data-theme]");
2677
2935
  if (themed?.dataset.theme === "dark") return true;
@@ -2708,9 +2966,9 @@ function MermaidView({ entry, load }) {
2708
2966
  };
2709
2967
  }, [entry.code, load]);
2710
2968
  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(
2969
+ return /* @__PURE__ */ jsxs31("figure", { ref, className: "my-3", children: [
2970
+ entry.title ? /* @__PURE__ */ jsx47("figcaption", { className: "mb-1.5 text-xs font-medium text-muted-foreground", children: entry.title }) : null,
2971
+ /* @__PURE__ */ jsx47(
2714
2972
  "div",
2715
2973
  {
2716
2974
  role: "img",
@@ -2721,11 +2979,11 @@ function MermaidView({ entry, load }) {
2721
2979
  )
2722
2980
  ] });
2723
2981
  }
2724
- return /* @__PURE__ */ jsx45(MermaidSource, { entry, ref });
2982
+ return /* @__PURE__ */ jsx47(MermaidSource, { entry, ref });
2725
2983
  }
2726
2984
 
2727
2985
  // src/interactive/island-renderers.tsx
2728
- import { jsx as jsx46 } from "react/jsx-runtime";
2986
+ import { jsx as jsx48 } from "react/jsx-runtime";
2729
2987
  var HLJS_ESM = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/es/highlight.min.js";
2730
2988
  var MERMAID_ESM = "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs";
2731
2989
  function cachedCdnModule(url) {
@@ -2759,13 +3017,13 @@ function CdnHighlightedCode({ entry }) {
2759
3017
  cancelled = true;
2760
3018
  };
2761
3019
  }, [entry.content, entry.lang]);
2762
- return /* @__PURE__ */ jsx46(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx46(
3020
+ return /* @__PURE__ */ jsx48(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx48(
2763
3021
  "code",
2764
3022
  {
2765
3023
  className: cn("hljs font-mono text-xs", entry.lang && `language-${entry.lang}`),
2766
3024
  dangerouslySetInnerHTML: { __html: html }
2767
3025
  }
2768
- ) : /* @__PURE__ */ jsx46("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
3026
+ ) : /* @__PURE__ */ jsx48("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
2769
3027
  }
2770
3028
  function buildIslandRenderers(opts) {
2771
3029
  const renderers = {};
@@ -2779,7 +3037,7 @@ function buildIslandRenderers(opts) {
2779
3037
  }
2780
3038
 
2781
3039
  // src/interactive/ReportInteractiveIsland.tsx
2782
- import { jsx as jsx47 } from "react/jsx-runtime";
3040
+ import { jsx as jsx49 } from "react/jsx-runtime";
2783
3041
  function ReportInteractiveIsland({
2784
3042
  report,
2785
3043
  title,
@@ -2793,7 +3051,7 @@ function ReportInteractiveIsland({
2793
3051
  () => buildIslandRenderers({ syntaxHighlighting, mermaid }),
2794
3052
  [syntaxHighlighting, mermaid]
2795
3053
  );
2796
- return /* @__PURE__ */ jsx47(
3054
+ return /* @__PURE__ */ jsx49(
2797
3055
  ReportInteractive,
2798
3056
  {
2799
3057
  report,