executable-stories-react 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +244 -158
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +243 -158
- package/dist/index.js.map +1 -1
- package/dist/interactive.cjs +328 -244
- package/dist/interactive.cjs.map +1 -1
- package/dist/interactive.js +328 -244
- package/dist/interactive.js.map +1 -1
- package/dist/report-island.global.js +29 -29
- package/dist/ssr.cjs +210 -126
- package/dist/ssr.cjs.map +1 -1
- package/dist/ssr.js +210 -126
- package/dist/ssr.js.map +1 -1
- package/dist/tailwind.css +1 -1
- package/package.json +1 -1
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
|
-
//
|
|
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
|
|
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__ */
|
|
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__ */
|
|
526
|
-
/* @__PURE__ */
|
|
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__ */
|
|
536
|
-
] }) : /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
645
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
658
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
746
|
-
flaky ? /* @__PURE__ */
|
|
747
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
876
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
794
877
|
function Card({ className, ...props }) {
|
|
795
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
921
|
+
return /* @__PURE__ */ jsx23(MenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
|
|
839
922
|
}
|
|
840
923
|
function DropdownMenuTrigger(props) {
|
|
841
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
911
|
-
/* @__PURE__ */
|
|
912
|
-
hideTitle ? null : /* @__PURE__ */
|
|
913
|
-
collapsible ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
926
|
-
/* @__PURE__ */
|
|
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__ */
|
|
929
|
-
/* @__PURE__ */
|
|
930
|
-
scenario.durationMs > 0 ? /* @__PURE__ */
|
|
931
|
-
meta.showPill ? /* @__PURE__ */
|
|
932
|
-
actions ? /* @__PURE__ */
|
|
933
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1021
|
+
children: /* @__PURE__ */ jsx24(MoreHorizontalIcon, { "aria-hidden": true })
|
|
939
1022
|
}
|
|
940
1023
|
),
|
|
941
|
-
/* @__PURE__ */
|
|
942
|
-
/* @__PURE__ */
|
|
943
|
-
/* @__PURE__ */
|
|
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__ */
|
|
947
|
-
/* @__PURE__ */
|
|
1029
|
+
/* @__PURE__ */ jsxs16(DropdownMenuItem, { onClick: () => actions.copyMarkdown(scenario), children: [
|
|
1030
|
+
/* @__PURE__ */ jsx24(FileTextIcon, {}),
|
|
948
1031
|
" Copy as Markdown"
|
|
949
1032
|
] }),
|
|
950
|
-
/* @__PURE__ */
|
|
951
|
-
/* @__PURE__ */
|
|
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__ */
|
|
959
|
-
scenario.tags.map((t) => /* @__PURE__ */
|
|
960
|
-
(scenario.tickets ?? []).map((ticket) => /* @__PURE__ */
|
|
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__ */
|
|
964
|
-
scenario.errorMessage ? /* @__PURE__ */
|
|
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__ */
|
|
973
|
-
|
|
974
|
-
/* @__PURE__ */
|
|
975
|
-
/* @__PURE__ */
|
|
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
|
|
1067
|
+
import { Fragment as Fragment8, jsx as jsx25 } from "react/jsx-runtime";
|
|
984
1068
|
function ReportScenarioList({ feature }) {
|
|
985
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1009
|
-
/* @__PURE__ */
|
|
1010
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1020
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1116
|
+
/* @__PURE__ */ jsxs17("span", { children: [
|
|
1033
1117
|
s.passed,
|
|
1034
1118
|
" passed"
|
|
1035
1119
|
] }),
|
|
1036
|
-
/* @__PURE__ */
|
|
1037
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1042
|
-
/* @__PURE__ */
|
|
1043
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
1144
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
1061
1145
|
function ReportFeatureList() {
|
|
1062
1146
|
const report = useReport();
|
|
1063
|
-
return /* @__PURE__ */
|
|
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
|
|
1152
|
+
import { jsx as jsx28 } from "react/jsx-runtime";
|
|
1069
1153
|
function Empty({ className, ...props }) {
|
|
1070
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1205
|
+
import { jsx as jsx29 } from "react/jsx-runtime";
|
|
1122
1206
|
function ReportEmpty({ message }) {
|
|
1123
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1176
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1269
|
-
/* @__PURE__ */
|
|
1270
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1274
|
-
/* @__PURE__ */
|
|
1275
|
-
/* @__PURE__ */
|
|
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
|
|
1366
|
+
import { jsx as jsx32, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1283
1367
|
function ReportSchemaError({ error }) {
|
|
1284
|
-
return /* @__PURE__ */
|
|
1285
|
-
/* @__PURE__ */
|
|
1286
|
-
/* @__PURE__ */
|
|
1287
|
-
error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1293
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
1388
|
+
import { Fragment as Fragment10, jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1305
1389
|
function ReportTitleBlock({ title }) {
|
|
1306
|
-
return /* @__PURE__ */
|
|
1307
|
-
/* @__PURE__ */
|
|
1308
|
-
/* @__PURE__ */
|
|
1309
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1332
|
-
/* @__PURE__ */
|
|
1333
|
-
hasContent ? /* @__PURE__ */
|
|
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
|
|