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