executable-stories-react 0.4.1 → 0.5.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.cjs CHANGED
@@ -123,11 +123,15 @@ var badgeVariants = (0, import_class_variance_authority.cva)(
123
123
  outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
124
124
  ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
125
125
  link: "text-primary underline-offset-4 [a&]:hover:underline",
126
- passed: "border-pass-border bg-pass-bg text-pass font-mono uppercase",
126
+ // Pass/skip/pending are the quiet states: outline + coloured text, no
127
+ // fill, so a green report reads calm. Only `failed` keeps a tinted
128
+ // fill, making it the single loud badge on the page, so red pops the
129
+ // instant something breaks. Colour-as-accent, matching the KPI cards.
130
+ passed: "border-pass-border text-pass font-mono uppercase",
127
131
  failed: "border-fail-border bg-fail-bg text-fail font-mono uppercase",
128
- skipped: "border-skip-border bg-skip-bg text-skip font-mono uppercase",
129
- pending: "border-pend-border bg-pend-bg text-pend font-mono uppercase",
130
- tag: "border-pass-border bg-pass-bg text-pass font-mono font-medium"
132
+ skipped: "border-skip-border text-skip font-mono uppercase",
133
+ pending: "border-pend-border text-pend font-mono uppercase",
134
+ tag: "border-border text-muted-foreground font-mono font-medium [a&]:hover:bg-muted"
131
135
  }
132
136
  },
133
137
  defaultVariants: {
@@ -680,7 +684,7 @@ function ReportTrace({ spans }) {
680
684
  {
681
685
  className: "min-w-0 flex-1 truncate text-foreground",
682
686
  style: { paddingLeft: `${row.depth * 12}px` },
683
- title: row.statusMessage ? `${row.name} \u2014 ${row.statusMessage}` : row.name,
687
+ title: row.statusMessage ? `${row.name}: ${row.statusMessage}` : row.name,
684
688
  children: row.name
685
689
  }
686
690
  ),
@@ -817,7 +821,7 @@ function Card({ className, ...props }) {
817
821
  {
818
822
  "data-slot": "card",
819
823
  className: cn(
820
- "flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
824
+ "flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-xs",
821
825
  className
822
826
  ),
823
827
  ...props
@@ -848,52 +852,89 @@ function CardContent({ className, ...props }) {
848
852
  );
849
853
  }
850
854
 
851
- // src/components/ReportScenario.tsx
855
+ // src/components/ui/dropdown-menu.tsx
856
+ var React3 = require("react");
857
+ var import_menu = require("@base-ui/react/menu");
858
+ var import_lucide_react = require("lucide-react");
852
859
  var import_jsx_runtime22 = require("react/jsx-runtime");
853
- var STATUS_LABEL = {
854
- passed: "Passed",
855
- failed: "Failed",
856
- skipped: "Skipped",
857
- pending: "Pending"
858
- };
859
- var STATUS_GLYPH = {
860
- passed: "\u2713",
861
- failed: "\u2717",
862
- skipped: "\u25CB",
863
- pending: "\u25CB"
864
- };
865
- var STATUS_GLYPH_COLOR = {
866
- passed: "text-pass",
867
- failed: "text-fail",
868
- skipped: "text-skip",
869
- pending: "text-pend"
870
- };
871
- var STATUS_BADGE = {
872
- passed: "passed",
873
- failed: "failed",
874
- skipped: "skipped",
875
- pending: "pending"
860
+ 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";
861
+ function DropdownMenu(props) {
862
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_menu.Menu.Root, { "data-slot": "dropdown-menu", ...props });
863
+ }
864
+ function DropdownMenuTrigger(props) {
865
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_menu.Menu.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
866
+ }
867
+ function DropdownMenuContent({
868
+ className,
869
+ align = "end",
870
+ sideOffset = 4,
871
+ ...props
872
+ }) {
873
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_menu.Menu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
874
+ import_menu.Menu.Positioner,
875
+ {
876
+ "data-slot": "dropdown-menu-positioner",
877
+ className: "z-50",
878
+ align,
879
+ sideOffset,
880
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
881
+ import_menu.Menu.Popup,
882
+ {
883
+ "data-slot": "dropdown-menu-content",
884
+ className: cn(
885
+ "z-50 min-w-[11rem] origin-[var(--transform-origin)] overflow-hidden rounded-md border border-border bg-popover p-1 font-sans text-sm text-popover-foreground shadow-md transition-[opacity,transform] data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[starting-style]:scale-95 data-[starting-style]:opacity-0",
886
+ className
887
+ ),
888
+ ...props
889
+ }
890
+ )
891
+ }
892
+ ) });
893
+ }
894
+ function DropdownMenuItem({
895
+ className,
896
+ ...props
897
+ }) {
898
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
899
+ import_menu.Menu.Item,
900
+ {
901
+ "data-slot": "dropdown-menu-item",
902
+ className: cn(itemClasses, className),
903
+ ...props
904
+ }
905
+ );
906
+ }
907
+
908
+ // src/components/ReportScenario.tsx
909
+ var import_lucide_react2 = require("lucide-react");
910
+ var import_jsx_runtime23 = require("react/jsx-runtime");
911
+ var STATUS_META = {
912
+ passed: { label: "Passed", glyph: "\u2713", glyphColor: "text-pass", badgeVariant: "passed", showPill: false },
913
+ failed: { label: "Failed", glyph: "\u2717", glyphColor: "text-fail", badgeVariant: "failed", showPill: true },
914
+ skipped: { label: "Skipped", glyph: "\u25CB", glyphColor: "text-skip", badgeVariant: "skipped", showPill: true },
915
+ pending: { label: "Pending", glyph: "\u25CB", glyphColor: "text-pend", badgeVariant: "pending", showPill: true }
876
916
  };
877
917
  function ReportScenario({ scenario, hideTitle = false }) {
878
918
  const titleId = `${scenario.id}-title`;
879
919
  const bodyId = `${scenario.id}-body`;
880
- const label = scenario.planned ? "Planned" : STATUS_LABEL[scenario.status];
920
+ const meta = STATUS_META[scenario.status];
921
+ const label = scenario.planned ? "Planned" : meta.label;
881
922
  const collapse = useCollapse();
882
923
  const collapsible = collapse !== null && !hideTitle;
883
924
  const collapsed = collapsible ? collapse.isCollapsed(scenario.id) : false;
884
925
  const actions = useScenarioActions();
885
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
926
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
886
927
  Card,
887
928
  {
888
929
  id: scenario.id,
889
930
  "data-status": scenario.status,
890
- ...hideTitle ? { "aria-label": `${scenario.title} \u2014 ${label}` } : { "aria-labelledby": titleId },
931
+ ...hideTitle ? { "aria-label": `${scenario.title}, ${label}` } : { "aria-labelledby": titleId },
891
932
  className: "gap-0 py-0",
892
933
  children: [
893
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(CardHeader, { className: "px-4 py-3", children: [
894
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
895
- hideTitle ? null : /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
896
- collapsible ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
934
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardHeader, { className: "px-4 py-3", children: [
935
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: cn("flex items-start gap-4", hideTitle ? "justify-end" : "justify-between"), children: [
936
+ hideTitle ? null : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("h3", { id: titleId, className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
937
+ collapsible ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
897
938
  "button",
898
939
  {
899
940
  type: "button",
@@ -902,60 +943,49 @@ function ReportScenario({ scenario, hideTitle = false }) {
902
943
  "aria-controls": bodyId,
903
944
  "aria-label": `Toggle ${scenario.title}`,
904
945
  className: "shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",
905
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
946
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
906
947
  }
907
948
  ) : null,
908
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { "aria-hidden": true, className: cn("text-sm leading-none", STATUS_GLYPH_COLOR[scenario.status]), children: STATUS_GLYPH[scenario.status] }),
909
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: scenario.title })
949
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { "aria-hidden": true, className: cn("text-sm leading-none", meta.glyphColor), children: meta.glyph }),
950
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: scenario.title })
910
951
  ] }),
911
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex shrink-0 items-center gap-2", children: [
912
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ScenarioRunHistory, { scenarioId: scenario.id }),
913
- scenario.durationMs > 0 ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
914
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Badge, { variant: STATUS_BADGE[scenario.status], "aria-label": `Status: ${label}`, children: label }),
915
- actions ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex items-center gap-0.5", children: [
916
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
917
- "button",
918
- {
919
- type: "button",
920
- onClick: () => actions.copyLink(scenario),
921
- "aria-label": `Copy link to ${scenario.title}`,
922
- title: "Copy permalink",
923
- className: "cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground",
924
- children: "link"
925
- }
926
- ),
927
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
928
- "button",
952
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex shrink-0 items-center gap-2", children: [
953
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ScenarioRunHistory, { scenarioId: scenario.id }),
954
+ scenario.durationMs > 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground", children: formatDuration(scenario.durationMs) }) : null,
955
+ meta.showPill ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: meta.badgeVariant, "aria-label": `Status: ${label}`, children: label }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "sr-only", children: `Status: ${label}` }),
956
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DropdownMenu, { children: [
957
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
958
+ DropdownMenuTrigger,
929
959
  {
930
- type: "button",
931
- onClick: () => actions.copyMarkdown(scenario),
932
- "aria-label": `Copy ${scenario.title} as Markdown`,
933
- title: "Copy as Markdown",
934
- className: "cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground",
935
- children: "md"
960
+ "aria-label": `Actions for ${scenario.title}`,
961
+ className: "cursor-pointer rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground [&_svg]:size-4",
962
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react2.MoreHorizontalIcon, { "aria-hidden": true })
936
963
  }
937
964
  ),
938
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
939
- "button",
940
- {
941
- type: "button",
942
- onClick: () => actions.copyPrompt(scenario),
943
- "aria-label": `Copy ${scenario.title} as an AI investigation prompt`,
944
- title: "Copy as AI prompt",
945
- className: "cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground",
946
- children: "ai"
947
- }
948
- )
965
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DropdownMenuContent, { align: "end", children: [
966
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DropdownMenuItem, { onClick: () => actions.copyLink(scenario), children: [
967
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react2.LinkIcon, {}),
968
+ " Copy link"
969
+ ] }),
970
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
971
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react2.FileTextIcon, {}),
972
+ " Copy as Markdown"
973
+ ] }),
974
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(DropdownMenuItem, { onClick: () => actions.copyPrompt(scenario), children: [
975
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react2.SparklesIcon, {}),
976
+ " Explain with AI"
977
+ ] })
978
+ ] })
949
979
  ] }) : null
950
980
  ] })
951
981
  ] }),
952
- scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("ul", { "aria-label": "Tags and tickets", className: "flex flex-wrap gap-1.5", children: [
953
- scenario.tags.map((t) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
954
- (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { children: ticket.url ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
982
+ scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("ul", { "aria-label": "Tags and tickets", className: "flex flex-wrap gap-1.5", children: [
983
+ scenario.tags.map((t) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: "tag", children: t }) }, `tag-${t}`)),
984
+ (scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { children: ticket.url ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { href: ticket.url, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: "outline", children: ticket.id }) }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: "outline", children: ticket.id }) }, `ticket-${ticket.id}`))
955
985
  ] }) : null
956
986
  ] }),
957
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
958
- scenario.errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
987
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardContent, { id: bodyId, hidden: collapsed, className: "px-4 pt-0 pb-4", children: [
988
+ scenario.errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
959
989
  "pre",
960
990
  {
961
991
  role: "alert",
@@ -963,10 +993,10 @@ function ReportScenario({ scenario, hideTitle = false }) {
963
993
  children: scenario.errorMessage
964
994
  }
965
995
  ) : null,
966
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ReportSteps, { scenario }),
967
- scenario.docEntries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
968
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ReportAttachments, { attachments: scenario.attachments }),
969
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ReportTrace, { spans: scenario.otelSpans })
996
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReportSteps, { scenario }),
997
+ scenario.docEntries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { "data-es-docs": true, className: "mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReportDocEntries, { entries: scenario.docEntries }) }) : null,
998
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReportAttachments, { attachments: scenario.attachments }),
999
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReportTrace, { spans: scenario.otelSpans })
970
1000
  ] })
971
1001
  ]
972
1002
  }
@@ -974,13 +1004,13 @@ function ReportScenario({ scenario, hideTitle = false }) {
974
1004
  }
975
1005
 
976
1006
  // src/components/ReportScenarioList.tsx
977
- var import_jsx_runtime23 = require("react/jsx-runtime");
1007
+ var import_jsx_runtime24 = require("react/jsx-runtime");
978
1008
  function ReportScenarioList({ feature }) {
979
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReportScenario, { scenario }, scenario.id)) });
1009
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ReportScenario, { scenario }, scenario.id)) });
980
1010
  }
981
1011
 
982
1012
  // src/components/ReportFeature.tsx
983
- var import_jsx_runtime24 = require("react/jsx-runtime");
1013
+ var import_jsx_runtime25 = require("react/jsx-runtime");
984
1014
  function ReportFeature({ feature }) {
985
1015
  const titleId = `${feature.id}-title`;
986
1016
  const bodyId = `${feature.id}-body`;
@@ -988,74 +1018,80 @@ function ReportFeature({ feature }) {
988
1018
  const skipped = s.skipped + s.pending;
989
1019
  const collapse = useCollapse();
990
1020
  const collapsed = collapse?.isCollapsed(feature.id) ?? false;
991
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
992
- "section",
993
- {
994
- id: feature.id,
995
- "data-slot": "feature",
996
- "aria-labelledby": titleId,
997
- className: "overflow-hidden rounded-xl border border-border bg-card shadow-sm",
998
- children: [
999
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center justify-between gap-4 border-b border-border bg-muted/40 px-4 py-3", children: [
1000
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex min-w-0 items-center gap-2", children: [
1001
- collapse ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1002
- "button",
1021
+ return (
1022
+ // Suite = a section heading + a divider, NOT another bordered card. Drops a
1023
+ // layer of nesting so the scenario cards below read as the primary unit.
1024
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1025
+ "section",
1026
+ {
1027
+ id: feature.id,
1028
+ "data-slot": "feature",
1029
+ "aria-labelledby": titleId,
1030
+ className: "flex flex-col gap-3",
1031
+ children: [
1032
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1033
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "min-w-0", children: [
1034
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1035
+ "button",
1036
+ {
1037
+ type: "button",
1038
+ onClick: () => collapse.toggle(feature.id),
1039
+ "aria-expanded": !collapsed,
1040
+ "aria-controls": bodyId,
1041
+ className: "flex w-full cursor-pointer items-center gap-2 text-left hover:text-foreground/80",
1042
+ children: [
1043
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1044
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "truncate", children: feature.title })
1045
+ ]
1046
+ }
1047
+ ) : feature.title }),
1048
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1049
+ ] }),
1050
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1051
+ "p",
1003
1052
  {
1004
- type: "button",
1005
- onClick: () => collapse.toggle(feature.id),
1006
- "aria-expanded": !collapsed,
1007
- "aria-controls": bodyId,
1008
- "aria-label": `Toggle ${feature.title}`,
1009
- className: "shrink-0 cursor-pointer text-muted-foreground hover:text-foreground",
1010
- children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { "aria-hidden": true, className: cn("inline-block text-xs transition-transform", !collapsed && "rotate-90"), children: "\u25B8" })
1053
+ className: "flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",
1054
+ "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1055
+ children: [
1056
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { children: [
1057
+ s.passed,
1058
+ " passed"
1059
+ ] }),
1060
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { "aria-hidden": true, children: "\xB7" }),
1061
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1062
+ s.failed,
1063
+ " failed"
1064
+ ] }),
1065
+ skipped > 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1066
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { "aria-hidden": true, children: "\xB7" }),
1067
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { children: [
1068
+ skipped,
1069
+ " skipped"
1070
+ ] })
1071
+ ] }) : null
1072
+ ]
1011
1073
  }
1012
- ) : null,
1013
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "min-w-0", children: [
1014
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { id: titleId, className: "text-sm font-semibold tracking-tight text-foreground", children: feature.title }),
1015
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-0.5 truncate font-mono text-xs text-muted-foreground", children: feature.sourceFile })
1016
- ] })
1074
+ )
1017
1075
  ] }),
1018
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
1019
- "div",
1020
- {
1021
- role: "img",
1022
- className: "flex shrink-0 items-center gap-2.5 font-mono text-xs font-medium",
1023
- "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1024
- children: [
1025
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { "aria-hidden": true, className: "text-pass", children: [
1026
- "\u2713",
1027
- s.passed
1028
- ] }),
1029
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { "aria-hidden": true, className: "text-fail", children: [
1030
- "\u2717",
1031
- s.failed
1032
- ] }),
1033
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { "aria-hidden": true, className: "text-skip", children: [
1034
- "\u25CB",
1035
- skipped
1036
- ] })
1037
- ]
1038
- }
1039
- )
1040
- ] }),
1041
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-2 p-3", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ReportScenarioList, { feature }) })
1042
- ]
1043
- }
1076
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ReportScenarioList, { feature }) })
1077
+ ]
1078
+ }
1079
+ )
1044
1080
  );
1045
1081
  }
1046
1082
 
1047
1083
  // src/components/ReportFeatureList.tsx
1048
- var import_jsx_runtime25 = require("react/jsx-runtime");
1084
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1049
1085
  function ReportFeatureList() {
1050
1086
  const report = useReport();
1051
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_jsx_runtime25.Fragment, { children: report.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ReportFeature, { feature }, feature.id)) });
1087
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ReportFeature, { feature }, feature.id)) });
1052
1088
  }
1053
1089
 
1054
1090
  // src/components/ui/empty.tsx
1055
1091
  var import_class_variance_authority2 = require("class-variance-authority");
1056
- var import_jsx_runtime26 = require("react/jsx-runtime");
1092
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1057
1093
  function Empty({ className, ...props }) {
1058
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1094
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1059
1095
  "div",
1060
1096
  {
1061
1097
  "data-slot": "empty",
@@ -1068,7 +1104,7 @@ function Empty({ className, ...props }) {
1068
1104
  );
1069
1105
  }
1070
1106
  function EmptyHeader({ className, ...props }) {
1071
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1107
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1072
1108
  "div",
1073
1109
  {
1074
1110
  "data-slot": "empty-header",
@@ -1095,7 +1131,7 @@ var emptyMediaVariants = (0, import_class_variance_authority2.cva)(
1095
1131
  }
1096
1132
  );
1097
1133
  function EmptyTitle({ className, ...props }) {
1098
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1134
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1099
1135
  "div",
1100
1136
  {
1101
1137
  "data-slot": "empty-title",
@@ -1106,16 +1142,16 @@ function EmptyTitle({ className, ...props }) {
1106
1142
  }
1107
1143
 
1108
1144
  // src/components/ReportEmpty.tsx
1109
- var import_jsx_runtime27 = require("react/jsx-runtime");
1145
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1110
1146
  function ReportEmpty({ message }) {
1111
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(EmptyHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1147
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(EmptyHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1112
1148
  }
1113
1149
 
1114
1150
  // src/components/ReportSummary.tsx
1115
- var import_jsx_runtime28 = require("react/jsx-runtime");
1151
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1116
1152
  function ReportSummary({ className }) {
1117
1153
  const report = useReport();
1118
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1154
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1119
1155
  ReportSummaryView,
1120
1156
  {
1121
1157
  summary: report.summary,
@@ -1124,38 +1160,54 @@ function ReportSummary({ className }) {
1124
1160
  }
1125
1161
  );
1126
1162
  }
1163
+ var TONE = {
1164
+ total: { num: "text-foreground", dot: "bg-muted-foreground/50" },
1165
+ passed: { num: "text-pass", dot: "bg-pass" },
1166
+ failed: { num: "text-fail", dot: "bg-fail" },
1167
+ skipped: { num: "text-skip", dot: "bg-skip" },
1168
+ pending: { num: "text-pend", dot: "bg-pend" }
1169
+ };
1127
1170
  function ReportSummaryView({ summary, className, ariaLabel }) {
1128
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("p", { className: cn("text-sm text-muted-foreground", className), "aria-label": ariaLabel, children: [
1129
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { children: [
1130
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("strong", { className: "font-semibold text-foreground", children: summary.total }),
1131
- " scenario",
1132
- summary.total === 1 ? "" : "s"
1133
- ] }),
1134
- " \xB7 ",
1135
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { "data-status": "passed", className: "text-pass", children: [
1136
- summary.passed,
1137
- " passed"
1138
- ] }),
1139
- " \xB7 ",
1140
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { "data-status": "failed", className: "text-fail", children: [
1141
- summary.failed,
1142
- " failed"
1143
- ] }),
1144
- summary.skipped > 0 ? /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
1145
- " \xB7 ",
1146
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { "data-status": "skipped", className: "text-skip", children: [
1147
- summary.skipped,
1148
- " skipped"
1149
- ] })
1150
- ] }) : null,
1151
- summary.pending > 0 ? /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
1152
- " \xB7 ",
1153
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { "data-status": "pending", className: "text-pend", children: [
1154
- summary.pending,
1155
- " pending"
1156
- ] })
1157
- ] }) : null
1158
- ] });
1171
+ const cards = [
1172
+ { status: "total", label: "Total", value: summary.total },
1173
+ { status: "passed", label: "Passed", value: summary.passed },
1174
+ { status: "failed", label: "Failed", value: summary.failed },
1175
+ { status: "skipped", label: "Skipped", value: summary.skipped }
1176
+ ];
1177
+ if (summary.pending > 0) {
1178
+ cards.push({ status: "pending", label: "Pending", value: summary.pending });
1179
+ }
1180
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1181
+ "dl",
1182
+ {
1183
+ className: cn(
1184
+ "grid grid-cols-2 gap-3",
1185
+ // Columns follow the card count so the row is always full — 5 statuses
1186
+ // (pending present) never leave a lone orphan card below a row of four.
1187
+ cards.length === 5 ? "sm:grid-cols-5" : "sm:grid-cols-4",
1188
+ className
1189
+ ),
1190
+ "aria-label": ariaLabel,
1191
+ children: cards.map((c) => {
1192
+ const tone = TONE[c.status];
1193
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1194
+ "div",
1195
+ {
1196
+ "data-status": c.status,
1197
+ className: "rounded-lg border bg-card px-4 py-3",
1198
+ children: [
1199
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1200
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1201
+ c.label
1202
+ ] }),
1203
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1204
+ ]
1205
+ },
1206
+ c.status
1207
+ );
1208
+ })
1209
+ }
1210
+ );
1159
1211
  }
1160
1212
 
1161
1213
  // src/lib/provenance.ts
@@ -1189,7 +1241,7 @@ function prUrl(ci) {
1189
1241
  }
1190
1242
 
1191
1243
  // src/components/ReportMeta.tsx
1192
- var import_jsx_runtime29 = require("react/jsx-runtime");
1244
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1193
1245
  function ReportMeta() {
1194
1246
  const report = useReport();
1195
1247
  const items = [];
@@ -1212,13 +1264,13 @@ function ReportMeta() {
1212
1264
  const short = sha.slice(0, 8);
1213
1265
  items.push({
1214
1266
  label: "Commit",
1215
- value: url ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1267
+ value: url ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1216
1268
  });
1217
1269
  }
1218
1270
  if (report.ci) {
1219
1271
  items.push({
1220
1272
  label: "CI",
1221
- value: report.ci.url ? /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1273
+ value: report.ci.url ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1222
1274
  ciDisplayName(report.ci.name),
1223
1275
  report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""
1224
1276
  ] }) : `${ciDisplayName(report.ci.name)}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""}`
@@ -1229,45 +1281,56 @@ function ReportMeta() {
1229
1281
  const label = `#${report.ci.prNumber}`;
1230
1282
  items.push({
1231
1283
  label: "PR",
1232
- value: url ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1284
+ value: url ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1233
1285
  });
1234
1286
  }
1235
1287
  if (items.length === 0) return null;
1236
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("dl", { "aria-label": "Run metadata", className: "flex flex-wrap gap-x-6 gap-y-1 text-xs text-muted-foreground", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex gap-1.5", children: [
1237
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("dt", { className: "font-medium", children: item.label }),
1238
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("dd", { className: "font-mono text-foreground", children: item.value })
1239
- ] }, item.label)) });
1288
+ return (
1289
+ // Run metadata is useful but secondary to "what failed" — tuck it into a
1290
+ // collapsed disclosure so it doesn't push the result down. Native <details>
1291
+ // so it works with no JS (the SSR/no-hydration report still toggles).
1292
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1293
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("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: [
1294
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1295
+ "Run details"
1296
+ ] }),
1297
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("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__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex items-baseline gap-1.5", children: [
1298
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("dt", { className: "font-medium", children: item.label }),
1299
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("dd", { className: "font-mono text-foreground", children: item.value })
1300
+ ] }, item.label)) })
1301
+ ] })
1302
+ );
1240
1303
  }
1241
1304
 
1242
1305
  // src/components/ReportSchemaError.tsx
1243
- var import_jsx_runtime30 = require("react/jsx-runtime");
1306
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1244
1307
  function ReportSchemaError({ error }) {
1245
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1246
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("strong", { children: "Report could not be displayed." }) }),
1247
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { children: error.message }),
1248
- error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("p", { children: [
1308
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1309
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("strong", { children: "Report could not be displayed." }) }),
1310
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { children: error.message }),
1311
+ error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("p", { children: [
1249
1312
  "The report bundle is newer than this version of ",
1250
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("code", { children: "executable-stories-react" }),
1313
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("code", { children: "executable-stories-react" }),
1251
1314
  ". Upgrade the package, or regenerate the report with an older formatters CLI."
1252
1315
  ] }) : null,
1253
- error.issues && error.issues.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("details", { children: [
1254
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("summary", { children: [
1316
+ error.issues && error.issues.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("details", { children: [
1317
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("summary", { children: [
1255
1318
  error.issues.length,
1256
1319
  " validation issue",
1257
1320
  error.issues.length === 1 ? "" : "s"
1258
1321
  ] }),
1259
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1322
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1260
1323
  ] }) : null
1261
1324
  ] });
1262
1325
  }
1263
1326
 
1264
1327
  // src/components/ReportShell.tsx
1265
- var import_jsx_runtime31 = require("react/jsx-runtime");
1328
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1266
1329
  function ReportTitleBlock({ title }) {
1267
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1268
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("h1", { children: title ?? "Story Report" }),
1269
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ReportSummary, {}),
1270
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ReportMeta, {})
1330
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
1331
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("h1", { children: title ?? "Story Report" }),
1332
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportSummary, {}),
1333
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportMeta, {})
1271
1334
  ] });
1272
1335
  }
1273
1336
  function ReportErrorShell({
@@ -1276,22 +1339,22 @@ function ReportErrorShell({
1276
1339
  title,
1277
1340
  dataTheme
1278
1341
  }) {
1279
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ReportSchemaError, { error }) });
1342
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportSchemaError, { error }) });
1280
1343
  }
1281
1344
 
1282
1345
  // src/components/Report.tsx
1283
- var import_jsx_runtime32 = require("react/jsx-runtime");
1346
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1284
1347
  function Report(props) {
1285
1348
  const { report, customRenderers, renderers, className, title, dataTheme } = props;
1286
1349
  const result = unwrapReport(report);
1287
1350
  if (!result.ok) {
1288
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportErrorShell, { error: result.error, className, title, dataTheme });
1351
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ReportErrorShell, { error: result.error, className, title, dataTheme });
1289
1352
  }
1290
1353
  const data = result.data;
1291
1354
  const hasContent = data.features.length > 0;
1292
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportRoot, { report: data, customRenderers, renderers, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: [
1293
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("header", { className: "es-report-header", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportTitleBlock, { title }) }),
1294
- hasContent ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportFeatureList, {}) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ReportEmpty, {})
1355
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ReportRoot, { report: data, customRenderers, renderers, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: [
1356
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("header", { className: "es-report-header", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ReportTitleBlock, { title }) }),
1357
+ hasContent ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ReportFeatureList, {}) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ReportEmpty, {})
1295
1358
  ] }) });
1296
1359
  }
1297
1360