executable-stories-react 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ssr.js CHANGED
@@ -217,7 +217,7 @@ function DocLink({ entry }) {
217
217
  // src/components/doc/DocSection.tsx
218
218
  import { marked } from "marked";
219
219
 
220
- // src/lib/url.ts
220
+ // ../executable-stories-core/dist/utils/url.js
221
221
  function safeUrl(value) {
222
222
  if (!value) return void 0;
223
223
  const trimmed = value.trim();
@@ -512,18 +512,101 @@ function ReportStepItem({ step }) {
512
512
  );
513
513
  }
514
514
 
515
+ // ../executable-stories-core/dist/storyboard.js
516
+ function findScreenshot(entries) {
517
+ for (const entry of entries) {
518
+ if (entry.kind === "screenshot") return entry;
519
+ if (entry.children) {
520
+ const nested = findScreenshot(entry.children);
521
+ if (nested) return nested;
522
+ }
523
+ }
524
+ return void 0;
525
+ }
526
+ function extractStoryboardFrames(scenario) {
527
+ const frames = [];
528
+ for (const step of scenario.steps) {
529
+ const shot = findScreenshot(step.docEntries);
530
+ if (!shot) continue;
531
+ frames.push({
532
+ stepId: step.id,
533
+ stepIndex: step.index,
534
+ keyword: step.keyword,
535
+ text: step.text,
536
+ status: step.status,
537
+ path: shot.path,
538
+ ...shot.alt !== void 0 && { alt: shot.alt }
539
+ });
540
+ }
541
+ return frames;
542
+ }
543
+
544
+ // src/components/ReportStoryboard.tsx
545
+ import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
546
+ var FRAME_GLYPH = {
547
+ passed: "\u2713",
548
+ failed: "\u2717",
549
+ skipped: "\u25CB",
550
+ pending: "\u25CB"
551
+ };
552
+ var FRAME_GLYPH_COLOR = {
553
+ passed: "text-pass",
554
+ failed: "text-fail",
555
+ skipped: "text-skip",
556
+ pending: "text-pend"
557
+ };
558
+ function ReportStoryboard({ scenario }) {
559
+ const frames = extractStoryboardFrames(scenario);
560
+ if (frames.length < 2) return null;
561
+ return /* @__PURE__ */ jsxs11("section", { "data-slot": "storyboard", "aria-label": "Storyboard", className: "mb-3", children: [
562
+ /* @__PURE__ */ jsx18("h4", { className: "mb-1.5 text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Storyboard" }),
563
+ /* @__PURE__ */ jsx18("ol", { className: "flex gap-3 overflow-x-auto pb-2", children: frames.map((frame) => /* @__PURE__ */ jsx18(StoryboardFrameItem, { frame }, frame.stepId)) })
564
+ ] });
565
+ }
566
+ function StoryboardFrameItem({ frame }) {
567
+ const src = isLocalFsPath(frame.path) ? void 0 : safeImageUrl(frame.path);
568
+ const label = `${frame.keyword} ${frame.text}`;
569
+ return /* @__PURE__ */ jsxs11("li", { className: "w-40 shrink-0", children: [
570
+ /* @__PURE__ */ jsx18(
571
+ "a",
572
+ {
573
+ href: `#${frame.stepId}`,
574
+ "aria-label": `Jump to step: ${label}`,
575
+ className: "block overflow-hidden rounded-md border border-border transition-colors hover:border-ring",
576
+ children: src ? /* @__PURE__ */ jsx18(
577
+ "img",
578
+ {
579
+ src,
580
+ alt: frame.alt ?? label,
581
+ loading: "lazy",
582
+ className: "h-24 w-full bg-muted object-cover object-top"
583
+ }
584
+ ) : /* @__PURE__ */ jsx18("span", { className: "flex h-24 w-full items-center justify-center border-b border-dashed border-border bg-muted px-2 text-center text-[0.6875rem] text-muted-foreground", children: "Screenshot unavailable" })
585
+ }
586
+ ),
587
+ /* @__PURE__ */ jsxs11("p", { className: "mt-1 flex items-baseline gap-1.5 text-[0.6875rem] leading-snug", children: [
588
+ /* @__PURE__ */ jsx18("span", { "aria-hidden": true, className: cn("shrink-0", FRAME_GLYPH_COLOR[frame.status]), children: FRAME_GLYPH[frame.status] ?? "\u25CB" }),
589
+ /* @__PURE__ */ jsxs11("span", { className: "min-w-0", children: [
590
+ /* @__PURE__ */ jsx18("span", { className: "font-mono font-semibold text-keyword", children: frame.keyword }),
591
+ " ",
592
+ /* @__PURE__ */ jsx18("span", { className: "text-muted-foreground", children: frame.alt ?? frame.text })
593
+ ] })
594
+ ] })
595
+ ] });
596
+ }
597
+
515
598
  // src/components/ReportAttachments.tsx
516
- import { Fragment as Fragment6, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
599
+ import { Fragment as Fragment6, jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
517
600
  function ReportAttachments({ attachments }) {
518
601
  if (attachments.length === 0) return null;
519
602
  return (
520
603
  // role="group" (not a labelled <section>) so multiple scenarios' attachment
521
604
  // blocks don't create duplicate "Attachments" region landmarks.
522
- /* @__PURE__ */ jsx18("div", { role: "group", "aria-label": "Attachments", className: "mt-3 flex flex-col gap-2", children: attachments.map((att, i) => {
605
+ /* @__PURE__ */ jsx19("div", { role: "group", "aria-label": "Attachments", className: "mt-3 flex flex-col gap-2", children: attachments.map((att, i) => {
523
606
  const dataUri = att.contentEncoding === "BASE64" ? `data:${att.mediaType};base64,${att.body}` : `data:${att.mediaType},${encodeURIComponent(att.body)}`;
524
607
  const isImage = att.mediaType.startsWith("image/");
525
- return /* @__PURE__ */ jsx18("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs11(Fragment6, { children: [
526
- /* @__PURE__ */ jsx18(
608
+ return /* @__PURE__ */ jsx19("figure", { className: "m-0", children: isImage ? /* @__PURE__ */ jsxs12(Fragment6, { children: [
609
+ /* @__PURE__ */ jsx19(
527
610
  "img",
528
611
  {
529
612
  src: dataUri,
@@ -532,8 +615,8 @@ function ReportAttachments({ attachments }) {
532
615
  className: "max-w-full rounded-md border border-border"
533
616
  }
534
617
  ),
535
- /* @__PURE__ */ jsx18("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
536
- ] }) : /* @__PURE__ */ jsxs11(
618
+ /* @__PURE__ */ jsx19("figcaption", { className: "mt-1 text-xs text-muted-foreground", children: att.name })
619
+ ] }) : /* @__PURE__ */ jsxs12(
537
620
  "a",
538
621
  {
539
622
  href: dataUri,
@@ -542,7 +625,7 @@ function ReportAttachments({ attachments }) {
542
625
  children: [
543
626
  att.name,
544
627
  " ",
545
- /* @__PURE__ */ jsxs11("span", { className: "text-muted-foreground", children: [
628
+ /* @__PURE__ */ jsxs12("span", { className: "text-muted-foreground", children: [
546
629
  "(",
547
630
  att.mediaType,
548
631
  ")"
@@ -630,7 +713,7 @@ function traceWindow(rows) {
630
713
  }
631
714
 
632
715
  // src/components/ReportTrace.tsx
633
- import { jsx as jsx19, jsxs as jsxs12 } from "react/jsx-runtime";
716
+ import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
634
717
  var BAR_COLOR = {
635
718
  ok: "bg-pass",
636
719
  error: "bg-fail",
@@ -641,8 +724,8 @@ function ReportTrace({ spans }) {
641
724
  const rows = toTraceRows(spans);
642
725
  if (rows.length === 0) return null;
643
726
  const { minStartMs, totalMs } = traceWindow(rows);
644
- return /* @__PURE__ */ jsxs12("details", { className: "mt-3 rounded-md border border-border bg-muted/30", children: [
645
- /* @__PURE__ */ jsxs12("summary", { className: "cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground", children: [
727
+ return /* @__PURE__ */ jsxs13("details", { className: "mt-3 rounded-md border border-border bg-muted/30", children: [
728
+ /* @__PURE__ */ jsxs13("summary", { className: "cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground", children: [
646
729
  "Trace (",
647
730
  rows.length,
648
731
  " span",
@@ -651,11 +734,11 @@ function ReportTrace({ spans }) {
651
734
  formatDuration(totalMs),
652
735
  ")"
653
736
  ] }),
654
- /* @__PURE__ */ jsx19("ul", { className: "flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]", children: rows.map((row, i) => {
737
+ /* @__PURE__ */ jsx20("ul", { className: "flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]", children: rows.map((row, i) => {
655
738
  const leftPct = (row.startTimeMs - minStartMs) / totalMs * 100;
656
739
  const widthPct = Math.max(row.durationMs / totalMs * 100, 0.5);
657
- return /* @__PURE__ */ jsxs12("li", { className: "flex items-center gap-2", children: [
658
- /* @__PURE__ */ jsx19(
740
+ return /* @__PURE__ */ jsxs13("li", { className: "flex items-center gap-2", children: [
741
+ /* @__PURE__ */ jsx20(
659
742
  "span",
660
743
  {
661
744
  className: "min-w-0 flex-1 truncate text-foreground",
@@ -664,14 +747,14 @@ function ReportTrace({ spans }) {
664
747
  children: row.name
665
748
  }
666
749
  ),
667
- /* @__PURE__ */ jsx19("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx19(
750
+ /* @__PURE__ */ jsx20("span", { className: "relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40", children: /* @__PURE__ */ jsx20(
668
751
  "span",
669
752
  {
670
753
  className: cn("absolute top-0 h-full rounded-sm", BAR_COLOR[row.status]),
671
754
  style: { left: `${leftPct}%`, width: `${widthPct}%` }
672
755
  }
673
756
  ) }),
674
- /* @__PURE__ */ jsx19("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
757
+ /* @__PURE__ */ jsx20("span", { className: "w-16 shrink-0 text-right text-muted-foreground", children: formatDuration(row.durationMs) })
675
758
  ] }, `${row.spanId}-${i}`);
676
759
  }) })
677
760
  ] });
@@ -722,7 +805,7 @@ function flakinessOf(entries) {
722
805
  }
723
806
 
724
807
  // src/components/ScenarioRunHistory.tsx
725
- import { Fragment as Fragment7, jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
808
+ import { Fragment as Fragment7, jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
726
809
  var MAX_DOTS = 10;
727
810
  var DOT_COLOR = {
728
811
  passed: "bg-pass",
@@ -742,16 +825,16 @@ function ScenarioRunHistory({ scenarioId }) {
742
825
  const recent = entries.slice(-MAX_DOTS);
743
826
  const flaky = flakinessOf(recent) === "flaky";
744
827
  const summary = flaky ? `${describeRunHistory(recent)} \xB7 Flaky` : describeRunHistory(recent);
745
- return /* @__PURE__ */ jsxs13(Fragment7, { children: [
746
- flaky ? /* @__PURE__ */ jsx20(Badge, { variant: "pending", "aria-label": "Flaky: status flips between recent runs", title: summary, children: "Flaky" }) : null,
747
- /* @__PURE__ */ jsx20(
828
+ return /* @__PURE__ */ jsxs14(Fragment7, { children: [
829
+ flaky ? /* @__PURE__ */ jsx21(Badge, { variant: "pending", "aria-label": "Flaky: status flips between recent runs", title: summary, children: "Flaky" }) : null,
830
+ /* @__PURE__ */ jsx21(
748
831
  "span",
749
832
  {
750
833
  role: "img",
751
834
  "aria-label": `Run history: ${summary}`,
752
835
  title: summary,
753
836
  className: "flex shrink-0 items-center gap-[3px]",
754
- children: recent.map((e, i) => /* @__PURE__ */ jsx20(
837
+ children: recent.map((e, i) => /* @__PURE__ */ jsx21(
755
838
  "span",
756
839
  {
757
840
  "aria-hidden": true,
@@ -790,9 +873,9 @@ function useScenarioActions() {
790
873
 
791
874
  // src/components/ui/card.tsx
792
875
  import "react";
793
- import { jsx as jsx21 } from "react/jsx-runtime";
876
+ import { jsx as jsx22 } from "react/jsx-runtime";
794
877
  function Card({ className, ...props }) {
795
- return /* @__PURE__ */ jsx21(
878
+ return /* @__PURE__ */ jsx22(
796
879
  "div",
797
880
  {
798
881
  "data-slot": "card",
@@ -805,7 +888,7 @@ function Card({ className, ...props }) {
805
888
  );
806
889
  }
807
890
  function CardHeader({ className, ...props }) {
808
- return /* @__PURE__ */ jsx21(
891
+ return /* @__PURE__ */ jsx22(
809
892
  "div",
810
893
  {
811
894
  "data-slot": "card-header",
@@ -818,7 +901,7 @@ function CardHeader({ className, ...props }) {
818
901
  );
819
902
  }
820
903
  function CardContent({ className, ...props }) {
821
- return /* @__PURE__ */ jsx21(
904
+ return /* @__PURE__ */ jsx22(
822
905
  "div",
823
906
  {
824
907
  "data-slot": "card-content",
@@ -832,13 +915,13 @@ function CardContent({ className, ...props }) {
832
915
  import "react";
833
916
  import { Menu as MenuPrimitive } from "@base-ui/react/menu";
834
917
  import { CheckIcon } from "lucide-react";
835
- import { jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
918
+ import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
836
919
  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";
837
920
  function DropdownMenu(props) {
838
- return /* @__PURE__ */ jsx22(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
921
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
839
922
  }
840
923
  function DropdownMenuTrigger(props) {
841
- return /* @__PURE__ */ jsx22(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
924
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
842
925
  }
843
926
  function DropdownMenuContent({
844
927
  className,
@@ -846,14 +929,14 @@ function DropdownMenuContent({
846
929
  sideOffset = 4,
847
930
  ...props
848
931
  }) {
849
- return /* @__PURE__ */ jsx22(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx22(
932
+ return /* @__PURE__ */ jsx23(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx23(
850
933
  MenuPrimitive.Positioner,
851
934
  {
852
935
  "data-slot": "dropdown-menu-positioner",
853
936
  className: "z-50",
854
937
  align,
855
938
  sideOffset,
856
- children: /* @__PURE__ */ jsx22(
939
+ children: /* @__PURE__ */ jsx23(
857
940
  MenuPrimitive.Popup,
858
941
  {
859
942
  "data-slot": "dropdown-menu-content",
@@ -871,7 +954,7 @@ function DropdownMenuItem({
871
954
  className,
872
955
  ...props
873
956
  }) {
874
- return /* @__PURE__ */ jsx22(
957
+ return /* @__PURE__ */ jsx23(
875
958
  MenuPrimitive.Item,
876
959
  {
877
960
  "data-slot": "dropdown-menu-item",
@@ -883,7 +966,7 @@ function DropdownMenuItem({
883
966
 
884
967
  // src/components/ReportScenario.tsx
885
968
  import { LinkIcon, FileTextIcon, SparklesIcon, MoreHorizontalIcon } from "lucide-react";
886
- import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
969
+ import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
887
970
  var STATUS_META = {
888
971
  passed: { label: "Passed", glyph: "\u2713", glyphColor: "text-pass", badgeVariant: "passed", showPill: false },
889
972
  failed: { label: "Failed", glyph: "\u2717", glyphColor: "text-fail", badgeVariant: "failed", showPill: true },
@@ -899,7 +982,7 @@ function ReportScenario({ scenario, hideTitle = false }) {
899
982
  const collapsible = collapse !== null && !hideTitle;
900
983
  const collapsed = collapsible ? collapse.isCollapsed(scenario.id) : false;
901
984
  const actions = useScenarioActions();
902
- return /* @__PURE__ */ jsxs15(
985
+ return /* @__PURE__ */ jsxs16(
903
986
  Card,
904
987
  {
905
988
  id: scenario.id,
@@ -907,10 +990,10 @@ function ReportScenario({ scenario, hideTitle = false }) {
907
990
  ...hideTitle ? { "aria-label": `${scenario.title}, ${label}` } : { "aria-labelledby": titleId },
908
991
  className: "gap-0 py-0",
909
992
  children: [
910
- /* @__PURE__ */ jsxs15(CardHeader, { className: "px-4 py-3", children: [
911
- /* @__PURE__ */ jsxs15("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
912
- hideTitle ? null : /* @__PURE__ */ jsxs15("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
913
- collapsible ? /* @__PURE__ */ jsx23(
993
+ /* @__PURE__ */ jsxs16(CardHeader, { className: "px-4 py-3", children: [
994
+ /* @__PURE__ */ jsxs16("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
995
+ hideTitle ? null : /* @__PURE__ */ jsxs16("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
996
+ collapsible ? /* @__PURE__ */ jsx24(
914
997
  "button",
915
998
  {
916
999
  type: "button",
@@ -919,49 +1002,49 @@ function ReportScenario({ scenario, hideTitle = false }) {
919
1002
  "aria-controls": bodyId,
920
1003
  "aria-label": `Toggle ${scenario.title}`,
921
1004
  className: "shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",
922
- children: /* @__PURE__ */ jsx23("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
1005
+ children: /* @__PURE__ */ jsx24("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
923
1006
  }
924
1007
  ) : null,
925
- /* @__PURE__ */ jsx23("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
926
- /* @__PURE__ */ jsx23("span", { children: scenario.title })
1008
+ /* @__PURE__ */ jsx24("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
1009
+ /* @__PURE__ */ jsx24("span", { children: scenario.title })
927
1010
  ] }),
928
- /* @__PURE__ */ jsxs15("div", { className: "flex shrink-0 items-center gap-2", children: [
929
- /* @__PURE__ */ jsx23(ScenarioRunHistory, { scenarioId: scenario.id }),
930
- scenario.durationMs > 0 ? /* @__PURE__ */ jsx23("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
931
- meta.showPill ? /* @__PURE__ */ jsx23(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ jsx23("span", { className: "sr-only", children: `Status: ${label}` }),
932
- actions ? /* @__PURE__ */ jsxs15(DropdownMenu, { children: [
933
- /* @__PURE__ */ jsx23(
1011
+ /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2", children: [
1012
+ /* @__PURE__ */ jsx24(ScenarioRunHistory, { scenarioId: scenario.id }),
1013
+ scenario.durationMs > 0 ? /* @__PURE__ */ jsx24("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
1014
+ meta.showPill ? /* @__PURE__ */ jsx24(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ jsx24("span", { className: "sr-only", children: `Status: ${label}` }),
1015
+ actions ? /* @__PURE__ */ jsxs16(DropdownMenu, { children: [
1016
+ /* @__PURE__ */ jsx24(
934
1017
  DropdownMenuTrigger,
935
1018
  {
936
1019
  "aria-label": `Actions for ${scenario.title}`,
937
1020
  className: "cursor-pointer rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground [&_svg]:size-4",
938
- children: /* @__PURE__ */ jsx23(MoreHorizontalIcon, { "aria-hidden": true })
1021
+ children: /* @__PURE__ */ jsx24(MoreHorizontalIcon, { "aria-hidden": true })
939
1022
  }
940
1023
  ),
941
- /* @__PURE__ */ jsxs15(DropdownMenuContent, { align: "end", children: [
942
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
943
- /* @__PURE__ */ jsx23(LinkIcon, {}),
1024
+ /* @__PURE__ */ jsxs16(DropdownMenuContent, { align: "end", children: [
1025
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
1026
+ /* @__PURE__ */ jsx24(LinkIcon, {}),
944
1027
  " Copy link"
945
1028
  ] }),
946
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
947
- /* @__PURE__ */ jsx23(FileTextIcon, {}),
1029
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
1030
+ /* @__PURE__ */ jsx24(FileTextIcon, {}),
948
1031
  " Copy as Markdown"
949
1032
  ] }),
950
- /* @__PURE__ */ jsxs15(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
951
- /* @__PURE__ */ jsx23(SparklesIcon, {}),
1033
+ /* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
1034
+ /* @__PURE__ */ jsx24(SparklesIcon, {}),
952
1035
  " Explain with AI"
953
1036
  ] })
954
1037
  ] })
955
1038
  ] }) : null
956
1039
  ] })
957
1040
  ] }),
958
- 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: [
959
- scenario.tags.map((t) => /* @__PURE__ */ jsx23("li", { children: /* @__PURE__ */ jsx23(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
960
- (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}`))
1041
+ 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: [
1042
+ scenario.tags.map((t) => /* @__PURE__ */ jsx24("li", { children: /* @__PURE__ */ jsx24(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
1043
+ (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ jsx24("li", { children: ticket.url ? /* @__PURE__ */ jsx24("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx24(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ jsx24(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
961
1044
  ] }) : null
962
1045
  ] }),
963
- /* @__PURE__ */ jsxs15(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
964
- scenario.errorMessage ? /* @__PURE__ */ jsx23(
1046
+ /* @__PURE__ */ jsxs16(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
1047
+ scenario.errorMessage ? /* @__PURE__ */ jsx24(
965
1048
  "pre",
966
1049
  {
967
1050
  role: "alert",
@@ -969,10 +1052,11 @@ function ReportScenario({ scenario, hideTitle = false }) {
969
1052
  children: scenario.errorMessage
970
1053
  }
971
1054
  ) : null,
972
- /* @__PURE__ */ jsx23(ReportSteps, { scenario }),
973
- scenario.docEntries.length > 0 ? /* @__PURE__ */ jsx23("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ jsx23(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
974
- /* @__PURE__ */ jsx23(ReportAttachments, { attachments: scenario.attachments }),
975
- /* @__PURE__ */ jsx23(ReportTrace, { spans: scenario.otelSpans })
1055
+ /* @__PURE__ */ jsx24(ReportStoryboard, { scenario }),
1056
+ /* @__PURE__ */ jsx24(ReportSteps, { scenario }),
1057
+ scenario.docEntries.length > 0 ? /* @__PURE__ */ jsx24("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ jsx24(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
1058
+ /* @__PURE__ */ jsx24(ReportAttachments, { attachments: scenario.attachments }),
1059
+ /* @__PURE__ */ jsx24(ReportTrace, { spans: scenario.otelSpans })
976
1060
  ] })
977
1061
  ]
978
1062
  }
@@ -980,13 +1064,13 @@ function ReportScenario({ scenario, hideTitle = false }) {
980
1064
  }
981
1065
 
982
1066
  // src/components/ReportScenarioList.tsx
983
- import { Fragment as Fragment8, jsx as jsx24 } from "react/jsx-runtime";
1067
+ import { Fragment as Fragment8, jsx as jsx25 } from "react/jsx-runtime";
984
1068
  function ReportScenarioList({ feature }) {
985
- return /* @__PURE__ */ jsx24(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx24(ReportScenario, { scenario }, scenario.id)) });
1069
+ return /* @__PURE__ */ jsx25(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx25(ReportScenario, { scenario }, scenario.id)) });
986
1070
  }
987
1071
 
988
1072
  // src/components/ReportFeature.tsx
989
- import { Fragment as Fragment9, jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
1073
+ import { Fragment as Fragment9, jsx as jsx26, jsxs as jsxs17 } from "react/jsx-runtime";
990
1074
  function ReportFeature({ feature }) {
991
1075
  const titleId = `${feature.id}-title`;
992
1076
  const bodyId = `${feature.id}-body`;
@@ -997,7 +1081,7 @@ function ReportFeature({ feature }) {
997
1081
  return (
998
1082
  // Suite = a section heading + a divider, NOT another bordered card. Drops a
999
1083
  // layer of nesting so the scenario cards below read as the primary unit.
1000
- /* @__PURE__ */ jsxs16(
1084
+ /* @__PURE__ */ jsxs17(
1001
1085
  "section",
1002
1086
  {
1003
1087
  id: feature.id,
@@ -1005,9 +1089,9 @@ function ReportFeature({ feature }) {
1005
1089
  "aria-labelledby": titleId,
1006
1090
  className: "flex flex-col gap-3",
1007
1091
  children: [
1008
- /* @__PURE__ */ jsxs16("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1009
- /* @__PURE__ */ jsxs16("div", { className: "min-w-0", children: [
1010
- /* @__PURE__ */ jsx25("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs16(
1092
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1093
+ /* @__PURE__ */ jsxs17("div", { className: "min-w-0", children: [
1094
+ /* @__PURE__ */ jsx26("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs17(
1011
1095
  "button",
1012
1096
  {
1013
1097
  type: "button",
@@ -1016,31 +1100,31 @@ function ReportFeature({ feature }) {
1016
1100
  "aria-controls": bodyId,
1017
1101
  className: "flex w-full cursor-pointer items-center gap-2 text-left hover:text-foreground/80",
1018
1102
  children: [
1019
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1020
- /* @__PURE__ */ jsx25("span", { className: "truncate", children: feature.title })
1103
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1104
+ /* @__PURE__ */ jsx26("span", { className: "truncate", children: feature.title })
1021
1105
  ]
1022
1106
  }
1023
1107
  ) : feature.title }),
1024
- /* @__PURE__ */ jsx25("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1108
+ /* @__PURE__ */ jsx26("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1025
1109
  ] }),
1026
- /* @__PURE__ */ jsxs16(
1110
+ /* @__PURE__ */ jsxs17(
1027
1111
  "p",
1028
1112
  {
1029
1113
  className: "flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",
1030
1114
  "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1031
1115
  children: [
1032
- /* @__PURE__ */ jsxs16("span", { children: [
1116
+ /* @__PURE__ */ jsxs17("span", { children: [
1033
1117
  s.passed,
1034
1118
  " passed"
1035
1119
  ] }),
1036
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1037
- /* @__PURE__ */ jsxs16("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1120
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, children: "\xB7" }),
1121
+ /* @__PURE__ */ jsxs17("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1038
1122
  s.failed,
1039
1123
  " failed"
1040
1124
  ] }),
1041
- skipped > 0 ? /* @__PURE__ */ jsxs16(Fragment9, { children: [
1042
- /* @__PURE__ */ jsx25("span", { "aria-hidden": true, children: "\xB7" }),
1043
- /* @__PURE__ */ jsxs16("span", { children: [
1125
+ skipped > 0 ? /* @__PURE__ */ jsxs17(Fragment9, { children: [
1126
+ /* @__PURE__ */ jsx26("span", { "aria-hidden": true, children: "\xB7" }),
1127
+ /* @__PURE__ */ jsxs17("span", { children: [
1044
1128
  skipped,
1045
1129
  " skipped"
1046
1130
  ] })
@@ -1049,7 +1133,7 @@ function ReportFeature({ feature }) {
1049
1133
  }
1050
1134
  )
1051
1135
  ] }),
1052
- /* @__PURE__ */ jsx25("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx25(ReportScenarioList, { feature }) })
1136
+ /* @__PURE__ */ jsx26("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx26(ReportScenarioList, { feature }) })
1053
1137
  ]
1054
1138
  }
1055
1139
  )
@@ -1057,17 +1141,17 @@ function ReportFeature({ feature }) {
1057
1141
  }
1058
1142
 
1059
1143
  // src/components/ReportFeatureList.tsx
1060
- import { jsx as jsx26 } from "react/jsx-runtime";
1144
+ import { jsx as jsx27 } from "react/jsx-runtime";
1061
1145
  function ReportFeatureList() {
1062
1146
  const report = useReport();
1063
- return /* @__PURE__ */ jsx26("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx26(ReportFeature, { feature }, feature.id)) });
1147
+ return /* @__PURE__ */ jsx27("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx27(ReportFeature, { feature }, feature.id)) });
1064
1148
  }
1065
1149
 
1066
1150
  // src/components/ui/empty.tsx
1067
1151
  import { cva as cva2 } from "class-variance-authority";
1068
- import { jsx as jsx27 } from "react/jsx-runtime";
1152
+ import { jsx as jsx28 } from "react/jsx-runtime";
1069
1153
  function Empty({ className, ...props }) {
1070
- return /* @__PURE__ */ jsx27(
1154
+ return /* @__PURE__ */ jsx28(
1071
1155
  "div",
1072
1156
  {
1073
1157
  "data-slot": "empty",
@@ -1080,7 +1164,7 @@ function Empty({ className, ...props }) {
1080
1164
  );
1081
1165
  }
1082
1166
  function EmptyHeader({ className, ...props }) {
1083
- return /* @__PURE__ */ jsx27(
1167
+ return /* @__PURE__ */ jsx28(
1084
1168
  "div",
1085
1169
  {
1086
1170
  "data-slot": "empty-header",
@@ -1107,7 +1191,7 @@ var emptyMediaVariants = cva2(
1107
1191
  }
1108
1192
  );
1109
1193
  function EmptyTitle({ className, ...props }) {
1110
- return /* @__PURE__ */ jsx27(
1194
+ return /* @__PURE__ */ jsx28(
1111
1195
  "div",
1112
1196
  {
1113
1197
  "data-slot": "empty-title",
@@ -1118,16 +1202,16 @@ function EmptyTitle({ className, ...props }) {
1118
1202
  }
1119
1203
 
1120
1204
  // src/components/ReportEmpty.tsx
1121
- import { jsx as jsx28 } from "react/jsx-runtime";
1205
+ import { jsx as jsx29 } from "react/jsx-runtime";
1122
1206
  function ReportEmpty({ message }) {
1123
- return /* @__PURE__ */ jsx28(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx28(EmptyHeader, { children: /* @__PURE__ */ jsx28(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1207
+ return /* @__PURE__ */ jsx29(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx29(EmptyHeader, { children: /* @__PURE__ */ jsx29(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1124
1208
  }
1125
1209
 
1126
1210
  // src/components/ReportSummary.tsx
1127
- import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
1211
+ import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1128
1212
  function ReportSummary({ className }) {
1129
1213
  const report = useReport();
1130
- return /* @__PURE__ */ jsx29(
1214
+ return /* @__PURE__ */ jsx30(
1131
1215
  ReportSummaryView,
1132
1216
  {
1133
1217
  summary: report.summary,
@@ -1153,7 +1237,7 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1153
1237
  if (summary.pending > 0) {
1154
1238
  cards.push({ status: "pending", label: "Pending", value: summary.pending });
1155
1239
  }
1156
- return /* @__PURE__ */ jsx29(
1240
+ return /* @__PURE__ */ jsx30(
1157
1241
  "dl",
1158
1242
  {
1159
1243
  className: cn(
@@ -1166,17 +1250,17 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1166
1250
  "aria-label": ariaLabel,
1167
1251
  children: cards.map((c) => {
1168
1252
  const tone = TONE[c.status];
1169
- return /* @__PURE__ */ jsxs17(
1253
+ return /* @__PURE__ */ jsxs18(
1170
1254
  "div",
1171
1255
  {
1172
1256
  "data-status": c.status,
1173
1257
  className: "rounded-lg border bg-card px-4 py-3",
1174
1258
  children: [
1175
- /* @__PURE__ */ jsxs17("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1176
- /* @__PURE__ */ jsx29("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1259
+ /* @__PURE__ */ jsxs18("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1260
+ /* @__PURE__ */ jsx30("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1177
1261
  c.label
1178
1262
  ] }),
1179
- /* @__PURE__ */ jsx29("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1263
+ /* @__PURE__ */ jsx30("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1180
1264
  ]
1181
1265
  },
1182
1266
  c.status
@@ -1217,7 +1301,7 @@ function prUrl(ci) {
1217
1301
  }
1218
1302
 
1219
1303
  // src/components/ReportMeta.tsx
1220
- import { jsx as jsx30, jsxs as jsxs18 } from "react/jsx-runtime";
1304
+ import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1221
1305
  function ReportMeta() {
1222
1306
  const report = useReport();
1223
1307
  const items = [];
@@ -1240,13 +1324,13 @@ function ReportMeta() {
1240
1324
  const short = sha.slice(0, 8);
1241
1325
  items.push({
1242
1326
  label: "Commit",
1243
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1327
+ value: url ? /* @__PURE__ */ jsx31("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1244
1328
  });
1245
1329
  }
1246
1330
  if (report.ci) {
1247
1331
  items.push({
1248
1332
  label: "CI",
1249
- value: report.ci.url ? /* @__PURE__ */ jsxs18("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1333
+ value: report.ci.url ? /* @__PURE__ */ jsxs19("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1250
1334
  ciDisplayName(report.ci.name),
1251
1335
  report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""
1252
1336
  ] }) : `${ciDisplayName(report.ci.name)}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""}`
@@ -1257,7 +1341,7 @@ function ReportMeta() {
1257
1341
  const label = `#${report.ci.prNumber}`;
1258
1342
  items.push({
1259
1343
  label: "PR",
1260
- value: url ? /* @__PURE__ */ jsx30("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1344
+ value: url ? /* @__PURE__ */ jsx31("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1261
1345
  });
1262
1346
  }
1263
1347
  if (items.length === 0) return null;
@@ -1265,48 +1349,48 @@ function ReportMeta() {
1265
1349
  // Run metadata is useful but secondary to "what failed" — tuck it into a
1266
1350
  // collapsed disclosure so it doesn't push the result down. Native <details>
1267
1351
  // so it works with no JS (the SSR/no-hydration report still toggles).
1268
- /* @__PURE__ */ jsxs18("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1269
- /* @__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: [
1270
- /* @__PURE__ */ jsx30("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1352
+ /* @__PURE__ */ jsxs19("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1353
+ /* @__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: [
1354
+ /* @__PURE__ */ jsx31("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1271
1355
  "Run details"
1272
1356
  ] }),
1273
- /* @__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: [
1274
- /* @__PURE__ */ jsx30("dt", { className: "font-medium", children: item.label }),
1275
- /* @__PURE__ */ jsx30("dd", { className: "font-mono text-foreground", children: item.value })
1357
+ /* @__PURE__ */ jsx31("dl", { className: "flex flex-wrap gap-x-5 gap-y-2 border-t border-border px-4 py-3 text-muted-foreground", "aria-label": "Run metadata", children: items.map((item) => /* @__PURE__ */ jsxs19("div", { className: "flex items-baseline gap-1.5", children: [
1358
+ /* @__PURE__ */ jsx31("dt", { className: "font-medium", children: item.label }),
1359
+ /* @__PURE__ */ jsx31("dd", { className: "font-mono text-foreground", children: item.value })
1276
1360
  ] }, item.label)) })
1277
1361
  ] })
1278
1362
  );
1279
1363
  }
1280
1364
 
1281
1365
  // src/components/ReportSchemaError.tsx
1282
- import { jsx as jsx31, jsxs as jsxs19 } from "react/jsx-runtime";
1366
+ import { jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1283
1367
  function ReportSchemaError({ error }) {
1284
- return /* @__PURE__ */ jsxs19("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1285
- /* @__PURE__ */ jsx31("p", { children: /* @__PURE__ */ jsx31("strong", { children: "Report could not be displayed." }) }),
1286
- /* @__PURE__ */ jsx31("p", { children: error.message }),
1287
- error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs19("p", { children: [
1368
+ return /* @__PURE__ */ jsxs20("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1369
+ /* @__PURE__ */ jsx32("p", { children: /* @__PURE__ */ jsx32("strong", { children: "Report could not be displayed." }) }),
1370
+ /* @__PURE__ */ jsx32("p", { children: error.message }),
1371
+ error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs20("p", { children: [
1288
1372
  "The report bundle is newer than this version of ",
1289
- /* @__PURE__ */ jsx31("code", { children: "executable-stories-react" }),
1373
+ /* @__PURE__ */ jsx32("code", { children: "executable-stories-react" }),
1290
1374
  ". Upgrade the package, or regenerate the report with an older formatters CLI."
1291
1375
  ] }) : null,
1292
- error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs19("details", { children: [
1293
- /* @__PURE__ */ jsxs19("summary", { children: [
1376
+ error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs20("details", { children: [
1377
+ /* @__PURE__ */ jsxs20("summary", { children: [
1294
1378
  error.issues.length,
1295
1379
  " validation issue",
1296
1380
  error.issues.length === 1 ? "" : "s"
1297
1381
  ] }),
1298
- /* @__PURE__ */ jsx31("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1382
+ /* @__PURE__ */ jsx32("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1299
1383
  ] }) : null
1300
1384
  ] });
1301
1385
  }
1302
1386
 
1303
1387
  // src/components/ReportShell.tsx
1304
- import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
1388
+ import { Fragment as Fragment10, jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
1305
1389
  function ReportTitleBlock({ title }) {
1306
- return /* @__PURE__ */ jsxs20(Fragment10, { children: [
1307
- /* @__PURE__ */ jsx32("h1", { children: title ?? "Story Report" }),
1308
- /* @__PURE__ */ jsx32(ReportSummary, {}),
1309
- /* @__PURE__ */ jsx32(ReportMeta, {})
1390
+ return /* @__PURE__ */ jsxs21(Fragment10, { children: [
1391
+ /* @__PURE__ */ jsx33("h1", { children: title ?? "Story Report" }),
1392
+ /* @__PURE__ */ jsx33(ReportSummary, {}),
1393
+ /* @__PURE__ */ jsx33(ReportMeta, {})
1310
1394
  ] });
1311
1395
  }
1312
1396
  function ReportErrorShell({
@@ -1315,22 +1399,22 @@ function ReportErrorShell({
1315
1399
  title,
1316
1400
  dataTheme
1317
1401
  }) {
1318
- return /* @__PURE__ */ jsx32("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx32(ReportSchemaError, { error }) });
1402
+ return /* @__PURE__ */ jsx33("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx33(ReportSchemaError, { error }) });
1319
1403
  }
1320
1404
 
1321
1405
  // src/components/Report.tsx
1322
- import { jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
1406
+ import { jsx as jsx34, jsxs as jsxs22 } from "react/jsx-runtime";
1323
1407
  function Report(props) {
1324
1408
  const { report, customRenderers, renderers, className, title, dataTheme } = props;
1325
1409
  const result = unwrapReport(report);
1326
1410
  if (!result.ok) {
1327
- return /* @__PURE__ */ jsx33(ReportErrorShell, { error: result.error, className, title, dataTheme });
1411
+ return /* @__PURE__ */ jsx34(ReportErrorShell, { error: result.error, className, title, dataTheme });
1328
1412
  }
1329
1413
  const data = result.data;
1330
1414
  const hasContent = data.features.length > 0;
1331
- return /* @__PURE__ */ jsx33(ReportRoot, { report: data, customRenderers, renderers, children: /* @__PURE__ */ jsxs21("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: [
1332
- /* @__PURE__ */ jsx33("header", { className: "es-report-header", children: /* @__PURE__ */ jsx33(ReportTitleBlock, { title }) }),
1333
- hasContent ? /* @__PURE__ */ jsx33(ReportFeatureList, {}) : /* @__PURE__ */ jsx33(ReportEmpty, {})
1415
+ return /* @__PURE__ */ jsx34(ReportRoot, { report: data, customRenderers, renderers, children: /* @__PURE__ */ jsxs22("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: [
1416
+ /* @__PURE__ */ jsx34("header", { className: "es-report-header", children: /* @__PURE__ */ jsx34(ReportTitleBlock, { title }) }),
1417
+ hasContent ? /* @__PURE__ */ jsx34(ReportFeatureList, {}) : /* @__PURE__ */ jsx34(ReportEmpty, {})
1334
1418
  ] }) });
1335
1419
  }
1336
1420