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/index.cjs +303 -240
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +301 -238
- package/dist/index.js.map +1 -1
- package/dist/interactive.cjs +843 -471
- package/dist/interactive.cjs.map +1 -1
- package/dist/interactive.d.cts +10 -1
- package/dist/interactive.d.ts +10 -1
- package/dist/interactive.js +806 -443
- package/dist/interactive.js.map +1 -1
- package/dist/report-island.global.js +103 -59
- package/dist/ssr.cjs +269 -206
- package/dist/ssr.cjs.map +1 -1
- package/dist/ssr.js +269 -206
- package/dist/ssr.js.map +1 -1
- package/dist/styles.css +18 -42
- package/dist/tailwind.css +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
|
129
|
-
pending: "border-pend-border
|
|
130
|
-
tag: "border-
|
|
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}
|
|
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-
|
|
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/
|
|
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
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
};
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
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
|
|
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,
|
|
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}
|
|
931
|
+
...hideTitle ? { "aria-label": `${scenario.title}, ${label}` } : { "aria-labelledby": titleId },
|
|
891
932
|
className: "gap-0 py-0",
|
|
892
933
|
children: [
|
|
893
|
-
/* @__PURE__ */ (0,
|
|
894
|
-
/* @__PURE__ */ (0,
|
|
895
|
-
hideTitle ? null : /* @__PURE__ */ (0,
|
|
896
|
-
collapsible ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
909
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
912
|
-
/* @__PURE__ */ (0,
|
|
913
|
-
scenario.durationMs > 0 ? /* @__PURE__ */ (0,
|
|
914
|
-
/* @__PURE__ */ (0,
|
|
915
|
-
actions ? /* @__PURE__ */ (0,
|
|
916
|
-
/* @__PURE__ */ (0,
|
|
917
|
-
|
|
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
|
-
|
|
931
|
-
|
|
932
|
-
"aria-
|
|
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,
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
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,
|
|
953
|
-
scenario.tags.map((t) => /* @__PURE__ */ (0,
|
|
954
|
-
(scenario.tickets ?? []).map((ticket) => /* @__PURE__ */ (0,
|
|
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,
|
|
958
|
-
scenario.errorMessage ? /* @__PURE__ */ (0,
|
|
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,
|
|
967
|
-
scenario.docEntries.length > 0 ? /* @__PURE__ */ (0,
|
|
968
|
-
/* @__PURE__ */ (0,
|
|
969
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
1007
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
978
1008
|
function ReportScenarioList({ feature }) {
|
|
979
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
"
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
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
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
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
|
-
)
|
|
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,
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
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
|
|
1084
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1049
1085
|
function ReportFeatureList() {
|
|
1050
1086
|
const report = useReport();
|
|
1051
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
1092
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1057
1093
|
function Empty({ className, ...props }) {
|
|
1058
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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
|
|
1145
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1110
1146
|
function ReportEmpty({ message }) {
|
|
1111
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
1151
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
1116
1152
|
function ReportSummary({ className }) {
|
|
1117
1153
|
const report = useReport();
|
|
1118
|
-
return /* @__PURE__ */ (0,
|
|
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
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
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
|
|
1306
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
1244
1307
|
function ReportSchemaError({ error }) {
|
|
1245
|
-
return /* @__PURE__ */ (0,
|
|
1246
|
-
/* @__PURE__ */ (0,
|
|
1247
|
-
/* @__PURE__ */ (0,
|
|
1248
|
-
error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1254
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1328
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
1266
1329
|
function ReportTitleBlock({ title }) {
|
|
1267
|
-
return /* @__PURE__ */ (0,
|
|
1268
|
-
/* @__PURE__ */ (0,
|
|
1269
|
-
/* @__PURE__ */ (0,
|
|
1270
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
1293
|
-
/* @__PURE__ */ (0,
|
|
1294
|
-
hasContent ? /* @__PURE__ */ (0,
|
|
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
|
|