executable-stories-react 0.10.1 → 0.11.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.
@@ -388,21 +388,29 @@ function DocLink({ entry }) {
388
388
  );
389
389
  }
390
390
 
391
- // src/components/doc/DocSection.tsx
391
+ // src/lib/markdown.ts
392
392
  import { marked } from "marked";
393
393
 
394
394
  // src/lib/url.ts
395
395
  import { safeUrl, safeImageUrl, isLocalFsPath } from "executable-stories-core/utils/url";
396
396
 
397
- // src/components/doc/DocSection.tsx
398
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
399
- function neutralizeUrl(value) {
400
- return safeUrl(value) ?? "#";
401
- }
397
+ // src/lib/markdown.ts
402
398
  function safeMarkdownHtml(markdown) {
403
399
  const raw = marked.parse(markdown, { async: false });
404
400
  return raw.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, "").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, "").replace(/<\/?(?:iframe|object|embed|form|base)\b[^>]*>/gi, "").replace(/\son[a-z]+\s*=\s*"[^"]*"/gi, "").replace(/\son[a-z]+\s*=\s*'[^']*'/gi, "").replace(/\son[a-z]+\s*=\s*[^\s>]+/gi, "").replace(/(href|src)\s*=\s*"([^"]*)"/gi, (_m, attr, val) => `${attr}="${neutralizeUrl(val)}"`).replace(/(href|src)\s*=\s*'([^']*)'/gi, (_m, attr, val) => `${attr}='${neutralizeUrl(val)}'`);
405
401
  }
402
+ function dedent(text) {
403
+ const lines = text.replace(/\t/g, " ").split("\n");
404
+ const indents = lines.filter((line) => line.trim().length > 0).map((line) => line.length - line.trimStart().length);
405
+ const shortest = indents.length > 0 ? Math.min(...indents) : 0;
406
+ return lines.map((line) => line.slice(shortest)).join("\n").trim();
407
+ }
408
+ function neutralizeUrl(value) {
409
+ return safeUrl(value) ?? "#";
410
+ }
411
+
412
+ // src/components/doc/DocSection.tsx
413
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
406
414
  function DocSection({ entry }) {
407
415
  const renderers = useBuiltinRenderers();
408
416
  if (renderers.section) {
@@ -1370,8 +1378,35 @@ function ReportScenarioList({ feature }) {
1370
1378
  return /* @__PURE__ */ jsx27(Fragment8, { children: feature.scenarios.map((scenario) => /* @__PURE__ */ jsx27(ReportScenario, { scenario }, scenario.id)) });
1371
1379
  }
1372
1380
 
1381
+ // src/components/ReportFeatureIntro.tsx
1382
+ import { jsx as jsx28, jsxs as jsxs18 } from "react/jsx-runtime";
1383
+ function ReportFeatureIntro({ feature }) {
1384
+ const hasNarrative = Boolean(feature.narrative?.trim());
1385
+ const hasGlossary = Boolean(feature.glossary?.length);
1386
+ if (!hasNarrative && !hasGlossary) return null;
1387
+ return /* @__PURE__ */ jsxs18("div", { className: "flex flex-col gap-3 border-l-2 border-border pl-4 text-sm", children: [
1388
+ hasNarrative ? /* @__PURE__ */ jsx28(
1389
+ "div",
1390
+ {
1391
+ className: "es-doc-prose prose prose-sm max-w-none text-muted-foreground",
1392
+ dangerouslySetInnerHTML: { __html: safeMarkdownHtml(dedent(feature.narrative)) }
1393
+ }
1394
+ ) : null,
1395
+ hasGlossary ? /* @__PURE__ */ jsx28("dl", { className: "grid gap-1.5", "aria-label": "Glossary", children: feature.glossary.map((entry) => /* @__PURE__ */ jsxs18("div", { className: "flex flex-wrap gap-x-2 text-xs", children: [
1396
+ /* @__PURE__ */ jsx28("dt", { className: "font-medium text-foreground", children: entry.term }),
1397
+ /* @__PURE__ */ jsx28("dd", { className: "flex-1 text-muted-foreground", children: entry.definition })
1398
+ ] }, entry.term)) }) : null
1399
+ ] });
1400
+ }
1401
+ function featureKindLabel(kind) {
1402
+ if (kind === "ability") return "Ability";
1403
+ if (kind === "business-need") return "Business need";
1404
+ if (kind === "feature") return "Feature";
1405
+ return null;
1406
+ }
1407
+
1373
1408
  // src/components/ReportFeature.tsx
1374
- import { Fragment as Fragment9, jsx as jsx28, jsxs as jsxs18 } from "react/jsx-runtime";
1409
+ import { Fragment as Fragment9, jsx as jsx29, jsxs as jsxs19 } from "react/jsx-runtime";
1375
1410
  function ReportFeature({ feature }) {
1376
1411
  const titleId = `${feature.id}-title`;
1377
1412
  const bodyId = `${feature.id}-body`;
@@ -1379,10 +1414,11 @@ function ReportFeature({ feature }) {
1379
1414
  const skipped = s.skipped + s.pending;
1380
1415
  const collapse = useCollapse();
1381
1416
  const collapsed = collapse?.isCollapsed(feature.id) ?? false;
1417
+ const kindLabel = featureKindLabel(feature.kind);
1382
1418
  return (
1383
1419
  // Suite = a section heading + a divider, NOT another bordered card. Drops a
1384
1420
  // layer of nesting so the scenario cards below read as the primary unit.
1385
- /* @__PURE__ */ jsxs18(
1421
+ /* @__PURE__ */ jsxs19(
1386
1422
  "section",
1387
1423
  {
1388
1424
  id: feature.id,
@@ -1390,9 +1426,9 @@ function ReportFeature({ feature }) {
1390
1426
  "aria-labelledby": titleId,
1391
1427
  className: "flex flex-col gap-3",
1392
1428
  children: [
1393
- /* @__PURE__ */ jsxs18("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1394
- /* @__PURE__ */ jsxs18("div", { className: "min-w-0", children: [
1395
- /* @__PURE__ */ jsx28("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs18(
1429
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-end justify-between gap-4 border-b border-border pb-2", children: [
1430
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
1431
+ /* @__PURE__ */ jsx29("h2", { id: titleId, className: "text-base font-semibold tracking-tight text-foreground", children: collapse ? /* @__PURE__ */ jsxs19(
1396
1432
  "button",
1397
1433
  {
1398
1434
  type: "button",
@@ -1401,31 +1437,34 @@ function ReportFeature({ feature }) {
1401
1437
  "aria-controls": bodyId,
1402
1438
  className: "flex w-full cursor-pointer items-center gap-2 text-left hover:text-foreground/80",
1403
1439
  children: [
1404
- /* @__PURE__ */ jsx28("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1405
- /* @__PURE__ */ jsx28("span", { className: "truncate", children: feature.title })
1440
+ /* @__PURE__ */ jsx29("span", { "aria-hidden": true, className: cn("shrink-0 text-xs text-muted-foreground transition-transform", !collapsed && "rotate-90"), children: "\u25B8" }),
1441
+ /* @__PURE__ */ jsx29("span", { className: "truncate", children: feature.title })
1406
1442
  ]
1407
1443
  }
1408
1444
  ) : feature.title }),
1409
- /* @__PURE__ */ jsx28("p", { className: cn("mt-0.5 truncate font-mono text-xs text-muted-foreground", collapse && "pl-5"), children: feature.sourceFile })
1445
+ /* @__PURE__ */ jsxs19("p", { className: cn("mt-0.5 flex items-center gap-2 text-xs text-muted-foreground", collapse && "pl-5"), children: [
1446
+ kindLabel ? /* @__PURE__ */ jsx29("span", { className: "shrink-0 rounded-sm bg-muted px-1.5 py-0.5 font-medium text-foreground", children: kindLabel }) : null,
1447
+ /* @__PURE__ */ jsx29("span", { className: "truncate font-mono", children: feature.sourceFile })
1448
+ ] })
1410
1449
  ] }),
1411
- /* @__PURE__ */ jsxs18(
1450
+ /* @__PURE__ */ jsxs19(
1412
1451
  "p",
1413
1452
  {
1414
1453
  className: "flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground",
1415
1454
  "aria-label": `${s.passed} passed, ${s.failed} failed, ${skipped} skipped`,
1416
1455
  children: [
1417
- /* @__PURE__ */ jsxs18("span", { children: [
1456
+ /* @__PURE__ */ jsxs19("span", { children: [
1418
1457
  s.passed,
1419
1458
  " passed"
1420
1459
  ] }),
1421
- /* @__PURE__ */ jsx28("span", { "aria-hidden": true, children: "\xB7" }),
1422
- /* @__PURE__ */ jsxs18("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1460
+ /* @__PURE__ */ jsx29("span", { "aria-hidden": true, children: "\xB7" }),
1461
+ /* @__PURE__ */ jsxs19("span", { className: cn(s.failed > 0 && "font-medium text-fail"), children: [
1423
1462
  s.failed,
1424
1463
  " failed"
1425
1464
  ] }),
1426
- skipped > 0 ? /* @__PURE__ */ jsxs18(Fragment9, { children: [
1427
- /* @__PURE__ */ jsx28("span", { "aria-hidden": true, children: "\xB7" }),
1428
- /* @__PURE__ */ jsxs18("span", { children: [
1465
+ skipped > 0 ? /* @__PURE__ */ jsxs19(Fragment9, { children: [
1466
+ /* @__PURE__ */ jsx29("span", { "aria-hidden": true, children: "\xB7" }),
1467
+ /* @__PURE__ */ jsxs19("span", { children: [
1429
1468
  skipped,
1430
1469
  " skipped"
1431
1470
  ] })
@@ -1434,7 +1473,10 @@ function ReportFeature({ feature }) {
1434
1473
  }
1435
1474
  )
1436
1475
  ] }),
1437
- /* @__PURE__ */ jsx28("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: /* @__PURE__ */ jsx28(ReportScenarioList, { feature }) })
1476
+ /* @__PURE__ */ jsxs19("div", { id: bodyId, hidden: collapsed, className: "flex flex-col gap-3", children: [
1477
+ /* @__PURE__ */ jsx29(ReportFeatureIntro, { feature }),
1478
+ /* @__PURE__ */ jsx29(ReportScenarioList, { feature })
1479
+ ] })
1438
1480
  ]
1439
1481
  }
1440
1482
  )
@@ -1442,17 +1484,17 @@ function ReportFeature({ feature }) {
1442
1484
  }
1443
1485
 
1444
1486
  // src/components/ReportFeatureList.tsx
1445
- import { jsx as jsx29 } from "react/jsx-runtime";
1487
+ import { jsx as jsx30 } from "react/jsx-runtime";
1446
1488
  function ReportFeatureList() {
1447
1489
  const report = useReport();
1448
- return /* @__PURE__ */ jsx29("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx29(ReportFeature, { feature }, feature.id)) });
1490
+ return /* @__PURE__ */ jsx30("div", { className: "flex flex-col gap-8", children: report.features.map((feature) => /* @__PURE__ */ jsx30(ReportFeature, { feature }, feature.id)) });
1449
1491
  }
1450
1492
 
1451
1493
  // src/components/ui/empty.tsx
1452
1494
  import { cva as cva2 } from "class-variance-authority";
1453
- import { jsx as jsx30 } from "react/jsx-runtime";
1495
+ import { jsx as jsx31 } from "react/jsx-runtime";
1454
1496
  function Empty({ className, ...props }) {
1455
- return /* @__PURE__ */ jsx30(
1497
+ return /* @__PURE__ */ jsx31(
1456
1498
  "div",
1457
1499
  {
1458
1500
  "data-slot": "empty",
@@ -1465,7 +1507,7 @@ function Empty({ className, ...props }) {
1465
1507
  );
1466
1508
  }
1467
1509
  function EmptyHeader({ className, ...props }) {
1468
- return /* @__PURE__ */ jsx30(
1510
+ return /* @__PURE__ */ jsx31(
1469
1511
  "div",
1470
1512
  {
1471
1513
  "data-slot": "empty-header",
@@ -1492,7 +1534,7 @@ var emptyMediaVariants = cva2(
1492
1534
  }
1493
1535
  );
1494
1536
  function EmptyTitle({ className, ...props }) {
1495
- return /* @__PURE__ */ jsx30(
1537
+ return /* @__PURE__ */ jsx31(
1496
1538
  "div",
1497
1539
  {
1498
1540
  "data-slot": "empty-title",
@@ -1503,16 +1545,16 @@ function EmptyTitle({ className, ...props }) {
1503
1545
  }
1504
1546
 
1505
1547
  // src/components/ReportEmpty.tsx
1506
- import { jsx as jsx31 } from "react/jsx-runtime";
1548
+ import { jsx as jsx32 } from "react/jsx-runtime";
1507
1549
  function ReportEmpty({ message }) {
1508
- return /* @__PURE__ */ jsx31(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx31(EmptyHeader, { children: /* @__PURE__ */ jsx31(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1550
+ return /* @__PURE__ */ jsx32(Empty, { "aria-live": "polite", className: "border", children: /* @__PURE__ */ jsx32(EmptyHeader, { children: /* @__PURE__ */ jsx32(EmptyTitle, { children: message ?? "No scenarios in this report." }) }) });
1509
1551
  }
1510
1552
 
1511
1553
  // src/components/ReportSummary.tsx
1512
- import { jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
1554
+ import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
1513
1555
  function ReportSummary({ className }) {
1514
1556
  const report = useReport();
1515
- return /* @__PURE__ */ jsx32(
1557
+ return /* @__PURE__ */ jsx33(
1516
1558
  ReportSummaryView,
1517
1559
  {
1518
1560
  summary: report.summary,
@@ -1538,7 +1580,7 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1538
1580
  if (summary.pending > 0) {
1539
1581
  cards.push({ status: "pending", label: "Pending", value: summary.pending });
1540
1582
  }
1541
- return /* @__PURE__ */ jsx32(
1583
+ return /* @__PURE__ */ jsx33(
1542
1584
  "dl",
1543
1585
  {
1544
1586
  className: cn(
@@ -1551,17 +1593,17 @@ function ReportSummaryView({ summary, className, ariaLabel }) {
1551
1593
  "aria-label": ariaLabel,
1552
1594
  children: cards.map((c) => {
1553
1595
  const tone = TONE[c.status];
1554
- return /* @__PURE__ */ jsxs19(
1596
+ return /* @__PURE__ */ jsxs20(
1555
1597
  "div",
1556
1598
  {
1557
1599
  "data-status": c.status,
1558
1600
  className: "rounded-lg border bg-card px-4 py-3",
1559
1601
  children: [
1560
- /* @__PURE__ */ jsxs19("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1561
- /* @__PURE__ */ jsx32("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1602
+ /* @__PURE__ */ jsxs20("dt", { className: "flex items-center gap-1.5 font-mono text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: [
1603
+ /* @__PURE__ */ jsx33("span", { className: cn("size-1.5 shrink-0 rounded-full", tone.dot), "aria-hidden": "true" }),
1562
1604
  c.label
1563
1605
  ] }),
1564
- /* @__PURE__ */ jsx32("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1606
+ /* @__PURE__ */ jsx33("dd", { className: cn("mt-2 text-3xl font-semibold leading-none tracking-tight tabular-nums", tone.num), children: c.value })
1565
1607
  ]
1566
1608
  },
1567
1609
  c.status
@@ -1624,7 +1666,7 @@ function prUrl(ci) {
1624
1666
  }
1625
1667
 
1626
1668
  // src/components/ReportMeta.tsx
1627
- import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
1669
+ import { jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
1628
1670
  function ReportMeta() {
1629
1671
  const report = useReport();
1630
1672
  const items = [];
@@ -1647,13 +1689,13 @@ function ReportMeta() {
1647
1689
  const short = sha.slice(0, 8);
1648
1690
  items.push({
1649
1691
  label: "Commit",
1650
- value: url ? /* @__PURE__ */ jsx33("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1692
+ value: url ? /* @__PURE__ */ jsx34("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: short }) : short
1651
1693
  });
1652
1694
  }
1653
1695
  if (report.ci) {
1654
1696
  items.push({
1655
1697
  label: "CI",
1656
- value: report.ci.url ? /* @__PURE__ */ jsxs20("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1698
+ value: report.ci.url ? /* @__PURE__ */ jsxs21("a", { href: report.ci.url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: [
1657
1699
  ciDisplayName(report.ci.name),
1658
1700
  report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""
1659
1701
  ] }) : `${ciDisplayName(report.ci.name)}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : ""}`
@@ -1664,7 +1706,7 @@ function ReportMeta() {
1664
1706
  const label = `#${report.ci.prNumber}`;
1665
1707
  items.push({
1666
1708
  label: "PR",
1667
- value: url ? /* @__PURE__ */ jsx33("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1709
+ value: url ? /* @__PURE__ */ jsx34("a", { href: url, target: "_blank", rel: "noreferrer noopener", className: linkClass, children: label }) : label
1668
1710
  });
1669
1711
  }
1670
1712
  if (items.length === 0) return null;
@@ -1672,50 +1714,50 @@ function ReportMeta() {
1672
1714
  // Run metadata is useful but secondary to "what failed" — tuck it into a
1673
1715
  // collapsed disclosure so it doesn't push the result down. Native <details>
1674
1716
  // so it works with no JS (the SSR/no-hydration report still toggles).
1675
- /* @__PURE__ */ jsxs20("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1676
- /* @__PURE__ */ jsxs20("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: [
1677
- /* @__PURE__ */ jsx33("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1717
+ /* @__PURE__ */ jsxs21("details", { "data-es-meta-card": true, className: "es-run-details group rounded-lg border border-border bg-card text-xs", children: [
1718
+ /* @__PURE__ */ jsxs21("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: [
1719
+ /* @__PURE__ */ jsx34("span", { "aria-hidden": true, className: "text-xs transition-transform group-open:rotate-90", children: "\u25B8" }),
1678
1720
  "Run details"
1679
1721
  ] }),
1680
- /* @__PURE__ */ jsx33("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__ */ jsxs20("div", { className: "flex items-baseline gap-1.5", children: [
1681
- /* @__PURE__ */ jsx33("dt", { className: "font-medium", children: item.label }),
1682
- /* @__PURE__ */ jsx33("dd", { className: "font-mono text-foreground", children: item.value })
1722
+ /* @__PURE__ */ jsx34("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__ */ jsxs21("div", { className: "flex items-baseline gap-1.5", children: [
1723
+ /* @__PURE__ */ jsx34("dt", { className: "font-medium", children: item.label }),
1724
+ /* @__PURE__ */ jsx34("dd", { className: "font-mono text-foreground", children: item.value })
1683
1725
  ] }, item.label)) })
1684
1726
  ] })
1685
1727
  );
1686
1728
  }
1687
1729
 
1688
1730
  // src/components/ReportSchemaError.tsx
1689
- import { jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
1731
+ import { jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
1690
1732
  function ReportSchemaError({ error }) {
1691
- return /* @__PURE__ */ jsxs21("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1692
- /* @__PURE__ */ jsx34("p", { children: /* @__PURE__ */ jsx34("strong", { children: "Report could not be displayed." }) }),
1693
- /* @__PURE__ */ jsx34("p", { children: error.message }),
1694
- error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs21("p", { children: [
1733
+ return /* @__PURE__ */ jsxs22("section", { className: "es-schema-error", role: "alert", "aria-live": "assertive", children: [
1734
+ /* @__PURE__ */ jsx35("p", { children: /* @__PURE__ */ jsx35("strong", { children: "Report could not be displayed." }) }),
1735
+ /* @__PURE__ */ jsx35("p", { children: error.message }),
1736
+ error.code === "SCHEMA_VERSION_MISMATCH" ? /* @__PURE__ */ jsxs22("p", { children: [
1695
1737
  "The report bundle is newer than this version of ",
1696
- /* @__PURE__ */ jsx34("code", { children: "executable-stories-react" }),
1738
+ /* @__PURE__ */ jsx35("code", { children: "executable-stories-react" }),
1697
1739
  ". Upgrade the package, or regenerate the report with an older formatters CLI."
1698
1740
  ] }) : null,
1699
- error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs21("details", { children: [
1700
- /* @__PURE__ */ jsxs21("summary", { children: [
1741
+ error.issues && error.issues.length > 0 ? /* @__PURE__ */ jsxs22("details", { children: [
1742
+ /* @__PURE__ */ jsxs22("summary", { children: [
1701
1743
  error.issues.length,
1702
1744
  " validation issue",
1703
1745
  error.issues.length === 1 ? "" : "s"
1704
1746
  ] }),
1705
- /* @__PURE__ */ jsx34("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1747
+ /* @__PURE__ */ jsx35("pre", { children: error.issues.slice(0, 20).map((i) => `${i.path}: ${i.message}`).join("\n") })
1706
1748
  ] }) : null
1707
1749
  ] });
1708
1750
  }
1709
1751
 
1710
1752
  // src/components/ReportShell.tsx
1711
- import { Fragment as Fragment10, jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
1753
+ import { Fragment as Fragment10, jsx as jsx36, jsxs as jsxs23 } from "react/jsx-runtime";
1712
1754
  function ReportErrorShell({
1713
1755
  error,
1714
1756
  className,
1715
1757
  title,
1716
1758
  dataTheme
1717
1759
  }) {
1718
- return /* @__PURE__ */ jsx35("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx35(ReportSchemaError, { error }) });
1760
+ return /* @__PURE__ */ jsx36("main", { className: cn("es-report", className), "aria-label": title ?? "Test report", "data-theme": dataTheme, children: /* @__PURE__ */ jsx36(ReportSchemaError, { error }) });
1719
1761
  }
1720
1762
 
1721
1763
  // src/interactive/ReportInteractive.tsx
@@ -1724,12 +1766,12 @@ import { Monitor, Moon, Sun } from "lucide-react";
1724
1766
  // src/components/ui/switch.tsx
1725
1767
  import "react";
1726
1768
  import { Switch as SwitchPrimitive } from "@base-ui/react/switch";
1727
- import { jsx as jsx36 } from "react/jsx-runtime";
1769
+ import { jsx as jsx37 } from "react/jsx-runtime";
1728
1770
  function Switch({
1729
1771
  className,
1730
1772
  ...props
1731
1773
  }) {
1732
- return /* @__PURE__ */ jsx36(
1774
+ return /* @__PURE__ */ jsx37(
1733
1775
  SwitchPrimitive.Root,
1734
1776
  {
1735
1777
  "data-slot": "switch",
@@ -1738,7 +1780,7 @@ function Switch({
1738
1780
  className
1739
1781
  ),
1740
1782
  ...props,
1741
- children: /* @__PURE__ */ jsx36(
1783
+ children: /* @__PURE__ */ jsx37(
1742
1784
  SwitchPrimitive.Thumb,
1743
1785
  {
1744
1786
  "data-slot": "switch-thumb",
@@ -1754,7 +1796,7 @@ import * as React5 from "react";
1754
1796
  import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
1755
1797
  import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
1756
1798
  import { cva as cva3 } from "class-variance-authority";
1757
- import { jsx as jsx37 } from "react/jsx-runtime";
1799
+ import { jsx as jsx38 } from "react/jsx-runtime";
1758
1800
  var toggleItemVariants = cva3(
1759
1801
  "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",
1760
1802
  {
@@ -1776,13 +1818,13 @@ function ToggleGroup({
1776
1818
  children,
1777
1819
  ...props
1778
1820
  }) {
1779
- return /* @__PURE__ */ jsx37(
1821
+ return /* @__PURE__ */ jsx38(
1780
1822
  ToggleGroupPrimitive,
1781
1823
  {
1782
1824
  "data-slot": "toggle-group",
1783
1825
  className: cn("flex w-fit items-center gap-0.5 rounded-lg bg-muted p-0.5", className),
1784
1826
  ...props,
1785
- children: /* @__PURE__ */ jsx37(ToggleGroupContext.Provider, { value: { size }, children })
1827
+ children: /* @__PURE__ */ jsx38(ToggleGroupContext.Provider, { value: { size }, children })
1786
1828
  }
1787
1829
  );
1788
1830
  }
@@ -1793,7 +1835,7 @@ function ToggleGroupItem({
1793
1835
  ...props
1794
1836
  }) {
1795
1837
  const context = React5.useContext(ToggleGroupContext);
1796
- return /* @__PURE__ */ jsx37(
1838
+ return /* @__PURE__ */ jsx38(
1797
1839
  TogglePrimitive,
1798
1840
  {
1799
1841
  "data-slot": "toggle-group-item",
@@ -1813,9 +1855,9 @@ import { Search } from "lucide-react";
1813
1855
 
1814
1856
  // src/components/ui/input.tsx
1815
1857
  import "react";
1816
- import { jsx as jsx38 } from "react/jsx-runtime";
1858
+ import { jsx as jsx39 } from "react/jsx-runtime";
1817
1859
  function Input({ className, type, ...props }) {
1818
- return /* @__PURE__ */ jsx38(
1860
+ return /* @__PURE__ */ jsx39(
1819
1861
  "input",
1820
1862
  {
1821
1863
  type,
@@ -1832,7 +1874,7 @@ function Input({ className, type, ...props }) {
1832
1874
  }
1833
1875
 
1834
1876
  // src/interactive/ReportSearch.tsx
1835
- import { jsx as jsx39, jsxs as jsxs23 } from "react/jsx-runtime";
1877
+ import { jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
1836
1878
  var ReportSearch = forwardRef(
1837
1879
  function ReportSearch2(props, ref) {
1838
1880
  const {
@@ -1854,17 +1896,17 @@ var ReportSearch = forwardRef(
1854
1896
  e.preventDefault();
1855
1897
  }
1856
1898
  }
1857
- return /* @__PURE__ */ jsxs23("div", { className: cn("es-search flex flex-col gap-1", className), children: [
1858
- /* @__PURE__ */ jsx39("label", { htmlFor: inputId, className: "sr-only", children: "Search" }),
1859
- /* @__PURE__ */ jsxs23("div", { className: "relative w-full sm:w-72", children: [
1860
- /* @__PURE__ */ jsx39(
1899
+ return /* @__PURE__ */ jsxs24("div", { className: cn("es-search flex flex-col gap-1", className), children: [
1900
+ /* @__PURE__ */ jsx40("label", { htmlFor: inputId, className: "sr-only", children: "Search" }),
1901
+ /* @__PURE__ */ jsxs24("div", { className: "relative w-full sm:w-72", children: [
1902
+ /* @__PURE__ */ jsx40(
1861
1903
  Search,
1862
1904
  {
1863
1905
  "aria-hidden": true,
1864
1906
  className: "pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground"
1865
1907
  }
1866
1908
  ),
1867
- /* @__PURE__ */ jsx39(
1909
+ /* @__PURE__ */ jsx40(
1868
1910
  Input,
1869
1911
  {
1870
1912
  ref,
@@ -1881,7 +1923,7 @@ var ReportSearch = forwardRef(
1881
1923
  }
1882
1924
  )
1883
1925
  ] }),
1884
- showCounts ? /* @__PURE__ */ jsxs23(
1926
+ showCounts ? /* @__PURE__ */ jsxs24(
1885
1927
  "span",
1886
1928
  {
1887
1929
  className: "text-xs tabular-nums text-muted-foreground",
@@ -1970,7 +2012,7 @@ function scrollToScenarioId(scenarioId, options = {}) {
1970
2012
  }
1971
2013
 
1972
2014
  // src/interactive/ReportFailureBanner.tsx
1973
- import { jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
2015
+ import { jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
1974
2016
  function ReportFailureBanner({ failures }) {
1975
2017
  const first = failures[0];
1976
2018
  const jumpToFirst = useCallback2(() => {
@@ -1978,7 +2020,7 @@ function ReportFailureBanner({ failures }) {
1978
2020
  scrollToScenarioId(first.scenarioId);
1979
2021
  }, [first]);
1980
2022
  if (failures.length === 0) return null;
1981
- return /* @__PURE__ */ jsxs24(
2023
+ return /* @__PURE__ */ jsxs25(
1982
2024
  "div",
1983
2025
  {
1984
2026
  className: "es-failure-banner",
@@ -1986,13 +2028,13 @@ function ReportFailureBanner({ failures }) {
1986
2028
  "aria-live": "polite",
1987
2029
  "aria-label": "Failure summary",
1988
2030
  children: [
1989
- /* @__PURE__ */ jsxs24("span", { className: "es-failure-banner-text", children: [
1990
- /* @__PURE__ */ jsx40("strong", { children: failures.length }),
2031
+ /* @__PURE__ */ jsxs25("span", { className: "es-failure-banner-text", children: [
2032
+ /* @__PURE__ */ jsx41("strong", { children: failures.length }),
1991
2033
  " ",
1992
2034
  "failure",
1993
2035
  failures.length === 1 ? "" : "s"
1994
2036
  ] }),
1995
- /* @__PURE__ */ jsx40(
2037
+ /* @__PURE__ */ jsx41(
1996
2038
  "button",
1997
2039
  {
1998
2040
  type: "button",
@@ -2009,7 +2051,7 @@ function ReportFailureBanner({ failures }) {
2009
2051
 
2010
2052
  // src/interactive/ReportFreshness.tsx
2011
2053
  import { useEffect, useState as useState2 } from "react";
2012
- import { Fragment as Fragment11, jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
2054
+ import { Fragment as Fragment11, jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
2013
2055
  function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
2014
2056
  const [now, setNow] = useState2(nowMs);
2015
2057
  useEffect(() => {
@@ -2017,7 +2059,7 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
2017
2059
  }, [nowMs]);
2018
2060
  if (lastRunMs === void 0 || now === void 0) return null;
2019
2061
  const age = formatRelativeAge(lastRunMs, now);
2020
- const runLink = ciUrl ? /* @__PURE__ */ jsx41(
2062
+ const runLink = ciUrl ? /* @__PURE__ */ jsx42(
2021
2063
  "a",
2022
2064
  {
2023
2065
  href: ciUrl,
@@ -2028,9 +2070,9 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
2028
2070
  }
2029
2071
  ) : null;
2030
2072
  if (isReportStale(lastRunMs, staleAfterDays, now)) {
2031
- return /* @__PURE__ */ jsxs25("div", { className: "es-stale-banner", role: "status", "aria-label": "Report freshness", children: [
2032
- /* @__PURE__ */ jsxs25("span", { children: [
2033
- /* @__PURE__ */ jsxs25("strong", { children: [
2073
+ return /* @__PURE__ */ jsxs26("div", { className: "es-stale-banner", role: "status", "aria-label": "Report freshness", children: [
2074
+ /* @__PURE__ */ jsxs26("span", { children: [
2075
+ /* @__PURE__ */ jsxs26("strong", { children: [
2034
2076
  "Last verified ",
2035
2077
  age,
2036
2078
  "."
@@ -2040,10 +2082,10 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
2040
2082
  runLink
2041
2083
  ] });
2042
2084
  }
2043
- return /* @__PURE__ */ jsxs25("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
2085
+ return /* @__PURE__ */ jsxs26("p", { className: "es-freshness", "aria-label": "Report freshness", children: [
2044
2086
  "Verified ",
2045
2087
  age,
2046
- runLink ? /* @__PURE__ */ jsxs25(Fragment11, { children: [
2088
+ runLink ? /* @__PURE__ */ jsxs26(Fragment11, { children: [
2047
2089
  " \xB7 ",
2048
2090
  runLink
2049
2091
  ] }) : null
@@ -2051,15 +2093,15 @@ function ReportFreshness({ lastRunMs, ciUrl, staleAfterDays, nowMs }) {
2051
2093
  }
2052
2094
 
2053
2095
  // src/interactive/ReportLastRunDelta.tsx
2054
- import { Fragment as Fragment12, jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
2096
+ import { Fragment as Fragment12, jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
2055
2097
  var MAX_LINKS = 5;
2056
2098
  function ScenarioLinks({ scenarios, tone }) {
2057
- return /* @__PURE__ */ jsxs26(Fragment12, { children: [
2058
- scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs26("span", { children: [
2099
+ return /* @__PURE__ */ jsxs27(Fragment12, { children: [
2100
+ scenarios.slice(0, MAX_LINKS).map((s, i) => /* @__PURE__ */ jsxs27("span", { children: [
2059
2101
  i > 0 ? ", " : "",
2060
- /* @__PURE__ */ jsx42("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
2102
+ /* @__PURE__ */ jsx43("a", { href: `#${s.id}`, className: cn("underline underline-offset-2 hover:no-underline", tone), children: s.title })
2061
2103
  ] }, s.id)),
2062
- scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs26("span", { children: [
2104
+ scenarios.length > MAX_LINKS ? /* @__PURE__ */ jsxs27("span", { children: [
2063
2105
  " and ",
2064
2106
  scenarios.length - MAX_LINKS,
2065
2107
  " more"
@@ -2076,23 +2118,23 @@ function ReportLastRunDelta({
2076
2118
  if (!delta) return null;
2077
2119
  const { newlyFailing, newlyPassing, added } = delta;
2078
2120
  if (newlyFailing.length === 0 && newlyPassing.length === 0 && added.length === 0) {
2079
- return /* @__PURE__ */ jsx42("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: "Since last run: no behavior changes." });
2121
+ return /* @__PURE__ */ jsx43("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: "Since last run: no behavior changes." });
2080
2122
  }
2081
- return /* @__PURE__ */ jsxs26("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: [
2082
- /* @__PURE__ */ jsx42("span", { className: "font-medium text-foreground", children: "Since last run:" }),
2083
- newlyFailing.length > 0 ? /* @__PURE__ */ jsxs26("span", { className: "ml-2 text-fail", children: [
2123
+ return /* @__PURE__ */ jsxs27("p", { className: "text-xs text-muted-foreground", "data-testid": "es-last-run-delta", children: [
2124
+ /* @__PURE__ */ jsx43("span", { className: "font-medium text-foreground", children: "Since last run:" }),
2125
+ newlyFailing.length > 0 ? /* @__PURE__ */ jsxs27("span", { className: "ml-2 text-fail", children: [
2084
2126
  newlyFailing.length,
2085
2127
  " newly failing (",
2086
- /* @__PURE__ */ jsx42(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
2128
+ /* @__PURE__ */ jsx43(ScenarioLinks, { scenarios: newlyFailing, tone: "text-fail" }),
2087
2129
  ")"
2088
2130
  ] }) : null,
2089
- newlyPassing.length > 0 ? /* @__PURE__ */ jsxs26("span", { className: "ml-2 text-pass", children: [
2131
+ newlyPassing.length > 0 ? /* @__PURE__ */ jsxs27("span", { className: "ml-2 text-pass", children: [
2090
2132
  newlyPassing.length,
2091
2133
  " fixed (",
2092
- /* @__PURE__ */ jsx42(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
2134
+ /* @__PURE__ */ jsx43(ScenarioLinks, { scenarios: newlyPassing, tone: "text-pass" }),
2093
2135
  ")"
2094
2136
  ] }) : null,
2095
- added.length > 0 ? /* @__PURE__ */ jsxs26("span", { className: "ml-2", children: [
2137
+ added.length > 0 ? /* @__PURE__ */ jsxs27("span", { className: "ml-2", children: [
2096
2138
  added.length,
2097
2139
  " new"
2098
2140
  ] }) : null
@@ -2156,7 +2198,7 @@ function Button({
2156
2198
  }
2157
2199
 
2158
2200
  // src/interactive/ReportShortcutsHelp.tsx
2159
- import { jsx as jsx43, jsxs as jsxs27 } from "react/jsx-runtime";
2201
+ import { jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
2160
2202
  var SHORTCUTS = [
2161
2203
  { keys: "/", description: "Focus search" },
2162
2204
  { keys: "f", description: "Jump to next failure" },
@@ -2168,9 +2210,9 @@ var SHORTCUTS = [
2168
2210
  ];
2169
2211
  function Keys({ keys }) {
2170
2212
  const parts = keys.split(" ");
2171
- return /* @__PURE__ */ jsx43("span", { className: "inline-flex items-center gap-1", children: parts.map((k, i) => /* @__PURE__ */ jsxs27("span", { className: "inline-flex items-center gap-1", children: [
2172
- i > 0 ? /* @__PURE__ */ jsx43("span", { className: "text-xs text-muted-foreground", children: "+" }) : null,
2173
- /* @__PURE__ */ jsx43("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 })
2213
+ return /* @__PURE__ */ jsx44("span", { className: "inline-flex items-center gap-1", children: parts.map((k, i) => /* @__PURE__ */ jsxs28("span", { className: "inline-flex items-center gap-1", children: [
2214
+ i > 0 ? /* @__PURE__ */ jsx44("span", { className: "text-xs text-muted-foreground", children: "+" }) : null,
2215
+ /* @__PURE__ */ jsx44("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 })
2174
2216
  ] }, k)) });
2175
2217
  }
2176
2218
  function ReportShortcutsHelp({ open, onClose }) {
@@ -2181,7 +2223,7 @@ function ReportShortcutsHelp({ open, onClose }) {
2181
2223
  if (open && !dialog.open) dialog.showModal();
2182
2224
  else if (!open && dialog.open) dialog.close();
2183
2225
  }, [open]);
2184
- return /* @__PURE__ */ jsxs27(
2226
+ return /* @__PURE__ */ jsxs28(
2185
2227
  "dialog",
2186
2228
  {
2187
2229
  ref: dialogRef,
@@ -2189,12 +2231,12 @@ function ReportShortcutsHelp({ open, onClose }) {
2189
2231
  "aria-label": "Keyboard shortcuts",
2190
2232
  onClose,
2191
2233
  children: [
2192
- /* @__PURE__ */ jsx43("h2", { className: "text-base font-semibold", children: "Keyboard shortcuts" }),
2193
- /* @__PURE__ */ jsx43("dl", { className: "mt-4 grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-2.5", children: SHORTCUTS.map((s) => /* @__PURE__ */ jsxs27("div", { className: "col-span-2 grid grid-cols-subgrid items-center", children: [
2194
- /* @__PURE__ */ jsx43("dt", { className: "justify-self-start", children: /* @__PURE__ */ jsx43(Keys, { keys: s.keys }) }),
2195
- /* @__PURE__ */ jsx43("dd", { className: "text-sm text-muted-foreground", children: s.description })
2234
+ /* @__PURE__ */ jsx44("h2", { className: "text-base font-semibold", children: "Keyboard shortcuts" }),
2235
+ /* @__PURE__ */ jsx44("dl", { className: "mt-4 grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-2.5", children: SHORTCUTS.map((s) => /* @__PURE__ */ jsxs28("div", { className: "col-span-2 grid grid-cols-subgrid items-center", children: [
2236
+ /* @__PURE__ */ jsx44("dt", { className: "justify-self-start", children: /* @__PURE__ */ jsx44(Keys, { keys: s.keys }) }),
2237
+ /* @__PURE__ */ jsx44("dd", { className: "text-sm text-muted-foreground", children: s.description })
2196
2238
  ] }, s.keys)) }),
2197
- /* @__PURE__ */ jsx43("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx43(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
2239
+ /* @__PURE__ */ jsx44("form", { method: "dialog", className: "mt-6", children: /* @__PURE__ */ jsx44(Button, { type: "submit", variant: "outline", size: "sm", children: "Close" }) })
2198
2240
  ]
2199
2241
  }
2200
2242
  );
@@ -2397,7 +2439,7 @@ function failuresFirst(report) {
2397
2439
 
2398
2440
  // src/interactive/ReportFilters.tsx
2399
2441
  import { useState as useState3 } from "react";
2400
- import { jsx as jsx44, jsxs as jsxs28 } from "react/jsx-runtime";
2442
+ import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
2401
2443
  var TAG_LIMIT = 12;
2402
2444
  function ReportFilters({
2403
2445
  statuses,
@@ -2411,10 +2453,10 @@ function ReportFilters({
2411
2453
  if (statuses.length === 0 && tags.length === 0) return null;
2412
2454
  const tagsCollapsed = tags.length > TAG_LIMIT && !showAllTags;
2413
2455
  const visibleTags = tagsCollapsed ? tags.slice(0, TAG_LIMIT) : tags;
2414
- return /* @__PURE__ */ jsxs28("div", { className: "flex flex-col gap-2", children: [
2415
- statuses.length > 0 ? /* @__PURE__ */ jsx44("div", { role: "group", "aria-label": "Filter by status", className: "flex flex-wrap gap-1", children: statuses.map((opt) => {
2456
+ return /* @__PURE__ */ jsxs29("div", { className: "flex flex-col gap-2", children: [
2457
+ statuses.length > 0 ? /* @__PURE__ */ jsx45("div", { role: "group", "aria-label": "Filter by status", className: "flex flex-wrap gap-1", children: statuses.map((opt) => {
2416
2458
  const active = status === opt.key;
2417
- return /* @__PURE__ */ jsxs28(
2459
+ return /* @__PURE__ */ jsxs29(
2418
2460
  "button",
2419
2461
  {
2420
2462
  type: "button",
@@ -2426,23 +2468,23 @@ function ReportFilters({
2426
2468
  ),
2427
2469
  children: [
2428
2470
  opt.label,
2429
- /* @__PURE__ */ jsx44("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2471
+ /* @__PURE__ */ jsx45("span", { className: "ml-1 font-mono opacity-70", children: opt.count })
2430
2472
  ]
2431
2473
  },
2432
2474
  opt.key
2433
2475
  );
2434
2476
  }) }) : null,
2435
- tags.length > 0 ? /* @__PURE__ */ jsxs28("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2477
+ tags.length > 0 ? /* @__PURE__ */ jsxs29("ul", { "aria-label": "Filter by tag", className: "flex flex-wrap items-center gap-1.5", children: [
2436
2478
  visibleTags.map((tag) => {
2437
2479
  const active = activeTags.includes(tag);
2438
- return /* @__PURE__ */ jsx44("li", { children: /* @__PURE__ */ jsx44(
2480
+ return /* @__PURE__ */ jsx45("li", { children: /* @__PURE__ */ jsx45(
2439
2481
  "button",
2440
2482
  {
2441
2483
  type: "button",
2442
2484
  "aria-pressed": active,
2443
2485
  onClick: () => onToggleTag(tag),
2444
2486
  className: "cursor-pointer",
2445
- children: /* @__PURE__ */ jsx44(
2487
+ children: /* @__PURE__ */ jsx45(
2446
2488
  Badge,
2447
2489
  {
2448
2490
  variant: "tag",
@@ -2455,7 +2497,7 @@ function ReportFilters({
2455
2497
  }
2456
2498
  ) }, tag);
2457
2499
  }),
2458
- tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx44("li", { children: /* @__PURE__ */ jsx44(
2500
+ tags.length > TAG_LIMIT ? /* @__PURE__ */ jsx45("li", { children: /* @__PURE__ */ jsx45(
2459
2501
  "button",
2460
2502
  {
2461
2503
  type: "button",
@@ -2471,7 +2513,7 @@ function ReportFilters({
2471
2513
 
2472
2514
  // src/interactive/ReportToc.tsx
2473
2515
  import { useEffect as useEffect5, useMemo as useMemo2, useState as useState4 } from "react";
2474
- import { jsx as jsx45, jsxs as jsxs29 } from "react/jsx-runtime";
2516
+ import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
2475
2517
  var DOT = {
2476
2518
  passed: "bg-pass",
2477
2519
  failed: "bg-fail",
@@ -2500,11 +2542,11 @@ function TocContent({ onNavigate }) {
2500
2542
  return () => observer.disconnect();
2501
2543
  }, [scenarioIds]);
2502
2544
  if (report.features.length === 0) return null;
2503
- return /* @__PURE__ */ jsx45("ul", { className: "flex list-none flex-col gap-4 pl-0", children: report.features.map((feature) => /* @__PURE__ */ jsxs29("li", { children: [
2504
- /* @__PURE__ */ jsx45("p", { className: "mb-1.5 font-semibold leading-snug text-foreground", children: feature.title }),
2505
- /* @__PURE__ */ jsx45("ul", { className: "flex list-none flex-col gap-0.5 pl-0", children: feature.scenarios.map((scenario) => {
2545
+ return /* @__PURE__ */ jsx46("ul", { className: "flex list-none flex-col gap-4 pl-0", children: report.features.map((feature) => /* @__PURE__ */ jsxs30("li", { children: [
2546
+ /* @__PURE__ */ jsx46("p", { className: "mb-1.5 font-semibold leading-snug text-foreground", children: feature.title }),
2547
+ /* @__PURE__ */ jsx46("ul", { className: "flex list-none flex-col gap-0.5 pl-0", children: feature.scenarios.map((scenario) => {
2506
2548
  const active = activeId === scenario.id;
2507
- return /* @__PURE__ */ jsx45("li", { children: /* @__PURE__ */ jsxs29(
2549
+ return /* @__PURE__ */ jsx46("li", { children: /* @__PURE__ */ jsxs30(
2508
2550
  "a",
2509
2551
  {
2510
2552
  href: `#${scenario.id}`,
@@ -2519,14 +2561,14 @@ function TocContent({ onNavigate }) {
2519
2561
  active ? "border-primary font-medium text-foreground" : "border-border text-muted-foreground"
2520
2562
  ),
2521
2563
  children: [
2522
- /* @__PURE__ */ jsx45(
2564
+ /* @__PURE__ */ jsx46(
2523
2565
  "span",
2524
2566
  {
2525
2567
  "aria-hidden": true,
2526
2568
  className: cn("mt-1 size-1.5 shrink-0 rounded-full", DOT[scenario.status])
2527
2569
  }
2528
2570
  ),
2529
- /* @__PURE__ */ jsx45("span", { className: "break-words", children: scenario.title })
2571
+ /* @__PURE__ */ jsx46("span", { className: "break-words", children: scenario.title })
2530
2572
  ]
2531
2573
  }
2532
2574
  ) }, scenario.id);
@@ -2536,14 +2578,14 @@ function TocContent({ onNavigate }) {
2536
2578
  function ReportToc() {
2537
2579
  const report = useReport();
2538
2580
  if (report.features.length === 0) return null;
2539
- return /* @__PURE__ */ jsxs29(
2581
+ return /* @__PURE__ */ jsxs30(
2540
2582
  "nav",
2541
2583
  {
2542
2584
  "aria-label": "Table of contents",
2543
2585
  className: "sticky top-4 hidden h-fit w-64 shrink-0 self-start text-xs lg:block",
2544
2586
  children: [
2545
- /* @__PURE__ */ jsx45("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2546
- /* @__PURE__ */ jsx45(TocContent, {})
2587
+ /* @__PURE__ */ jsx46("p", { className: "mb-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Contents" }),
2588
+ /* @__PURE__ */ jsx46(TocContent, {})
2547
2589
  ]
2548
2590
  }
2549
2591
  );
@@ -2553,31 +2595,31 @@ function ReportToc() {
2553
2595
  import { useState as useState5 } from "react";
2554
2596
  import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
2555
2597
  import { ListIcon, XIcon } from "lucide-react";
2556
- import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
2598
+ import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
2557
2599
  function ReportTocDrawer() {
2558
2600
  const report = useReport();
2559
2601
  const [open, setOpen] = useState5(false);
2560
2602
  if (report.features.length === 0) return null;
2561
- return /* @__PURE__ */ jsxs30(DialogPrimitive.Root, { open, onOpenChange: setOpen, children: [
2562
- /* @__PURE__ */ jsxs30(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: [
2563
- /* @__PURE__ */ jsx46(ListIcon, { "aria-hidden": true }),
2603
+ return /* @__PURE__ */ jsxs31(DialogPrimitive.Root, { open, onOpenChange: setOpen, children: [
2604
+ /* @__PURE__ */ jsxs31(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: [
2605
+ /* @__PURE__ */ jsx47(ListIcon, { "aria-hidden": true }),
2564
2606
  " Contents"
2565
2607
  ] }),
2566
- /* @__PURE__ */ jsxs30(DialogPrimitive.Portal, { children: [
2567
- /* @__PURE__ */ jsx46(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" }),
2568
- /* @__PURE__ */ jsxs30(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: [
2569
- /* @__PURE__ */ jsxs30("div", { className: "flex items-center justify-between", children: [
2570
- /* @__PURE__ */ jsx46(DialogPrimitive.Title, { className: "text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Contents" }),
2571
- /* @__PURE__ */ jsx46(
2608
+ /* @__PURE__ */ jsxs31(DialogPrimitive.Portal, { children: [
2609
+ /* @__PURE__ */ jsx47(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" }),
2610
+ /* @__PURE__ */ jsxs31(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: [
2611
+ /* @__PURE__ */ jsxs31("div", { className: "flex items-center justify-between", children: [
2612
+ /* @__PURE__ */ jsx47(DialogPrimitive.Title, { className: "text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Contents" }),
2613
+ /* @__PURE__ */ jsx47(
2572
2614
  DialogPrimitive.Close,
2573
2615
  {
2574
2616
  "aria-label": "Close contents",
2575
2617
  className: "cursor-pointer rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground [&_svg]:size-4",
2576
- children: /* @__PURE__ */ jsx46(XIcon, { "aria-hidden": true })
2618
+ children: /* @__PURE__ */ jsx47(XIcon, { "aria-hidden": true })
2577
2619
  }
2578
2620
  )
2579
2621
  ] }),
2580
- /* @__PURE__ */ jsx46(TocContent, { onNavigate: () => setOpen(false) })
2622
+ /* @__PURE__ */ jsx47(TocContent, { onNavigate: () => setOpen(false) })
2581
2623
  ] })
2582
2624
  ] })
2583
2625
  ] });
@@ -2660,14 +2702,14 @@ function useUrlState() {
2660
2702
  }
2661
2703
 
2662
2704
  // src/interactive/ReportInteractive.tsx
2663
- import { Fragment as Fragment13, jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
2705
+ import { Fragment as Fragment13, jsx as jsx48, jsxs as jsxs32 } from "react/jsx-runtime";
2664
2706
  function ReportInteractive(props) {
2665
2707
  const { report, className, title, dataTheme } = props;
2666
2708
  const result = unwrapReport(report);
2667
2709
  if (!result.ok) {
2668
- return /* @__PURE__ */ jsx47(ReportErrorShell, { error: result.error, className, title, dataTheme });
2710
+ return /* @__PURE__ */ jsx48(ReportErrorShell, { error: result.error, className, title, dataTheme });
2669
2711
  }
2670
- return /* @__PURE__ */ jsx47(ReportInteractiveView, { ...props, report: result.data });
2712
+ return /* @__PURE__ */ jsx48(ReportInteractiveView, { ...props, report: result.data });
2671
2713
  }
2672
2714
  var THEME_OPTIONS = [
2673
2715
  { value: "light", label: "Light", Icon: Sun },
@@ -2675,7 +2717,7 @@ var THEME_OPTIONS = [
2675
2717
  { value: "dark", label: "Dark", Icon: Moon }
2676
2718
  ];
2677
2719
  function ThemeSegment({ pref, onPref }) {
2678
- return /* @__PURE__ */ jsx47(
2720
+ return /* @__PURE__ */ jsx48(
2679
2721
  ToggleGroup,
2680
2722
  {
2681
2723
  size: "sm",
@@ -2685,7 +2727,7 @@ function ThemeSegment({ pref, onPref }) {
2685
2727
  if (next) onPref(next);
2686
2728
  },
2687
2729
  "aria-label": "Color theme",
2688
- children: THEME_OPTIONS.map(({ value, label, Icon }) => /* @__PURE__ */ jsx47(ToggleGroupItem, { value, "aria-label": label, title: label, className: "px-2", children: /* @__PURE__ */ jsx47(Icon, {}) }, value))
2730
+ children: THEME_OPTIONS.map(({ value, label, Icon }) => /* @__PURE__ */ jsx48(ToggleGroupItem, { value, "aria-label": label, title: label, className: "px-2", children: /* @__PURE__ */ jsx48(Icon, {}) }, value))
2689
2731
  }
2690
2732
  );
2691
2733
  }
@@ -2816,13 +2858,13 @@ function ReportInteractiveView({
2816
2858
  const totalScenarios = report.summary.total;
2817
2859
  const matchedScenarios = filtered.summary.total;
2818
2860
  const showToc = !hideToc && totalScenarios > 3;
2819
- return /* @__PURE__ */ jsx47(CollapseProvider, { value: collapse.api, children: /* @__PURE__ */ jsx47(ScenarioActionsProvider, { value: scenarioActions, children: /* @__PURE__ */ jsx47(ScenarioHistoryProvider, { value: scenarioHistory ?? null, children: /* @__PURE__ */ jsx47(
2861
+ return /* @__PURE__ */ jsx48(CollapseProvider, { value: collapse.api, children: /* @__PURE__ */ jsx48(ScenarioActionsProvider, { value: scenarioActions, children: /* @__PURE__ */ jsx48(ScenarioHistoryProvider, { value: scenarioHistory ?? null, children: /* @__PURE__ */ jsx48(
2820
2862
  ReportRoot,
2821
2863
  {
2822
2864
  report: filtered,
2823
2865
  customRenderers,
2824
2866
  renderers,
2825
- children: /* @__PURE__ */ jsxs31(
2867
+ children: /* @__PURE__ */ jsxs32(
2826
2868
  "main",
2827
2869
  {
2828
2870
  className: cn("es-report", "es-report-interactive", className),
@@ -2831,8 +2873,8 @@ function ReportInteractiveView({
2831
2873
  "data-theme": dataTheme,
2832
2874
  "data-detail-level": detail,
2833
2875
  children: [
2834
- /* @__PURE__ */ jsxs31("header", { className: "es-report-header", children: [
2835
- /* @__PURE__ */ jsxs31(
2876
+ /* @__PURE__ */ jsxs32("header", { className: "es-report-header", children: [
2877
+ /* @__PURE__ */ jsxs32(
2836
2878
  "div",
2837
2879
  {
2838
2880
  "data-es-navbar": true,
@@ -2841,9 +2883,9 @@ function ReportInteractiveView({
2841
2883
  hideHeader ? "justify-end" : "justify-between"
2842
2884
  ),
2843
2885
  children: [
2844
- hideHeader ? null : /* @__PURE__ */ jsx47("h1", { className: "min-w-0", children: title ?? "Story Report" }),
2845
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2", children: [
2846
- /* @__PURE__ */ jsx47(
2886
+ hideHeader ? null : /* @__PURE__ */ jsx48("h1", { className: "min-w-0", children: title ?? "Story Report" }),
2887
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
2888
+ /* @__PURE__ */ jsx48(
2847
2889
  ReportSearch,
2848
2890
  {
2849
2891
  ref: searchRef,
@@ -2853,16 +2895,16 @@ function ReportInteractiveView({
2853
2895
  totalCount: totalScenarios
2854
2896
  }
2855
2897
  ),
2856
- /* @__PURE__ */ jsx47(ThemeSegment, { pref: themePref, onPref: setThemePref })
2898
+ /* @__PURE__ */ jsx48(ThemeSegment, { pref: themePref, onPref: setThemePref })
2857
2899
  ] })
2858
2900
  ]
2859
2901
  }
2860
2902
  ),
2861
- hideHeader ? null : /* @__PURE__ */ jsxs31(Fragment13, { children: [
2862
- /* @__PURE__ */ jsx47(ReportSummary, {}),
2863
- /* @__PURE__ */ jsx47(ReportMeta, {})
2903
+ hideHeader ? null : /* @__PURE__ */ jsxs32(Fragment13, { children: [
2904
+ /* @__PURE__ */ jsx48(ReportSummary, {}),
2905
+ /* @__PURE__ */ jsx48(ReportMeta, {})
2864
2906
  ] }),
2865
- /* @__PURE__ */ jsx47(
2907
+ /* @__PURE__ */ jsx48(
2866
2908
  ReportFreshness,
2867
2909
  {
2868
2910
  lastRunMs: reportLastRunMs(report),
@@ -2870,8 +2912,8 @@ function ReportInteractiveView({
2870
2912
  staleAfterDays
2871
2913
  }
2872
2914
  ),
2873
- /* @__PURE__ */ jsx47(ReportLastRunDelta, { history: scenarioHistory, report }),
2874
- /* @__PURE__ */ jsx47(
2915
+ /* @__PURE__ */ jsx48(ReportLastRunDelta, { history: scenarioHistory, report }),
2916
+ /* @__PURE__ */ jsx48(
2875
2917
  ReportFilters,
2876
2918
  {
2877
2919
  statuses: statusOptions,
@@ -2882,14 +2924,14 @@ function ReportInteractiveView({
2882
2924
  onToggleTag: toggleTag
2883
2925
  }
2884
2926
  ),
2885
- /* @__PURE__ */ jsxs31("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2 border-t border-border/60 pt-3", children: [
2886
- showToc ? /* @__PURE__ */ jsx47(ReportTocDrawer, {}) : null,
2887
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2", children: [
2888
- /* @__PURE__ */ jsx47(Switch, { id: expandId, checked: expandedAll, onCheckedChange: setExpanded }),
2889
- /* @__PURE__ */ jsx47("label", { htmlFor: expandId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Expand all" })
2927
+ /* @__PURE__ */ jsxs32("div", { className: "flex flex-wrap items-center gap-x-6 gap-y-2 border-t border-border/60 pt-3", children: [
2928
+ showToc ? /* @__PURE__ */ jsx48(ReportTocDrawer, {}) : null,
2929
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
2930
+ /* @__PURE__ */ jsx48(Switch, { id: expandId, checked: expandedAll, onCheckedChange: setExpanded }),
2931
+ /* @__PURE__ */ jsx48("label", { htmlFor: expandId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Expand all" })
2890
2932
  ] }),
2891
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2", children: [
2892
- /* @__PURE__ */ jsx47(
2933
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
2934
+ /* @__PURE__ */ jsx48(
2893
2935
  Switch,
2894
2936
  {
2895
2937
  id: docsId,
@@ -2897,16 +2939,16 @@ function ReportInteractiveView({
2897
2939
  onCheckedChange: (checked) => setDetail(checked ? "full" : "minimal")
2898
2940
  }
2899
2941
  ),
2900
- /* @__PURE__ */ jsx47("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2942
+ /* @__PURE__ */ jsx48("label", { htmlFor: docsId, className: "cursor-pointer text-sm text-muted-foreground select-none", children: "Show documentation" })
2901
2943
  ] })
2902
2944
  ] })
2903
2945
  ] }),
2904
- /* @__PURE__ */ jsx47(ReportFailureBanner, { failures }),
2905
- hasContent ? showToc ? /* @__PURE__ */ jsxs31("div", { className: "flex gap-6", children: [
2906
- /* @__PURE__ */ jsx47(ReportToc, {}),
2907
- /* @__PURE__ */ jsx47("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: /* @__PURE__ */ jsx47(ReportFeatureList, {}) })
2908
- ] }) : /* @__PURE__ */ jsx47("div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ jsx47(ReportFeatureList, {}) }) : /* @__PURE__ */ jsx47(ReportEmpty, { message: query ? "No scenarios match the search." : void 0 }),
2909
- /* @__PURE__ */ jsx47(
2946
+ /* @__PURE__ */ jsx48(ReportFailureBanner, { failures }),
2947
+ hasContent ? showToc ? /* @__PURE__ */ jsxs32("div", { className: "flex gap-6", children: [
2948
+ /* @__PURE__ */ jsx48(ReportToc, {}),
2949
+ /* @__PURE__ */ jsx48("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: /* @__PURE__ */ jsx48(ReportFeatureList, {}) })
2950
+ ] }) : /* @__PURE__ */ jsx48("div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ jsx48(ReportFeatureList, {}) }) : /* @__PURE__ */ jsx48(ReportEmpty, { message: query ? "No scenarios match the search." : void 0 }),
2951
+ /* @__PURE__ */ jsx48(
2910
2952
  "button",
2911
2953
  {
2912
2954
  type: "button",
@@ -2917,8 +2959,8 @@ function ReportInteractiveView({
2917
2959
  children: "?"
2918
2960
  }
2919
2961
  ),
2920
- /* @__PURE__ */ jsx47(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2921
- toast ? /* @__PURE__ */ jsx47(
2962
+ /* @__PURE__ */ jsx48(ReportShortcutsHelp, { open: helpOpen, onClose: () => setHelpOpen(false) }),
2963
+ toast ? /* @__PURE__ */ jsx48(
2922
2964
  "div",
2923
2965
  {
2924
2966
  role: "status",
@@ -2942,7 +2984,7 @@ import { createElement, useEffect as useEffect9, useState as useState10 } from "
2942
2984
 
2943
2985
  // src/components/doc/MermaidView.tsx
2944
2986
  import { useEffect as useEffect8, useRef as useRef6, useState as useState9 } from "react";
2945
- import { Fragment as Fragment14, jsx as jsx48, jsxs as jsxs32 } from "react/jsx-runtime";
2987
+ import { Fragment as Fragment14, jsx as jsx49, jsxs as jsxs33 } from "react/jsx-runtime";
2946
2988
  function prefersDark(el) {
2947
2989
  const themed = el?.closest("[data-theme]");
2948
2990
  if (themed?.dataset.theme === "dark") return true;
@@ -2996,9 +3038,9 @@ function MermaidView({ entry, load }) {
2996
3038
  };
2997
3039
  }, [entry.code, load]);
2998
3040
  if (svg) {
2999
- return /* @__PURE__ */ jsxs32("figure", { ref, className: "my-3", children: [
3000
- entry.title ? /* @__PURE__ */ jsx48("figcaption", { className: "mb-1.5 text-xs font-medium text-muted-foreground", children: entry.title }) : null,
3001
- /* @__PURE__ */ jsx48(
3041
+ return /* @__PURE__ */ jsxs33("figure", { ref, className: "my-3", children: [
3042
+ entry.title ? /* @__PURE__ */ jsx49("figcaption", { className: "mb-1.5 text-xs font-medium text-muted-foreground", children: entry.title }) : null,
3043
+ /* @__PURE__ */ jsx49(
3002
3044
  "div",
3003
3045
  {
3004
3046
  role: "img",
@@ -3009,8 +3051,8 @@ function MermaidView({ entry, load }) {
3009
3051
  )
3010
3052
  ] });
3011
3053
  }
3012
- return /* @__PURE__ */ jsxs32(Fragment14, { children: [
3013
- error ? /* @__PURE__ */ jsxs32(
3054
+ return /* @__PURE__ */ jsxs33(Fragment14, { children: [
3055
+ error ? /* @__PURE__ */ jsxs33(
3014
3056
  "p",
3015
3057
  {
3016
3058
  role: "alert",
@@ -3022,12 +3064,12 @@ function MermaidView({ entry, load }) {
3022
3064
  ]
3023
3065
  }
3024
3066
  ) : null,
3025
- /* @__PURE__ */ jsx48(MermaidSource, { entry, ref })
3067
+ /* @__PURE__ */ jsx49(MermaidSource, { entry, ref })
3026
3068
  ] });
3027
3069
  }
3028
3070
 
3029
3071
  // src/interactive/island-renderers.tsx
3030
- import { jsx as jsx49 } from "react/jsx-runtime";
3072
+ import { jsx as jsx50 } from "react/jsx-runtime";
3031
3073
  var HLJS_ESM = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/es/highlight.min.js";
3032
3074
  var MERMAID_ESM = "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs";
3033
3075
  function cachedCdnModule(url) {
@@ -3061,13 +3103,13 @@ function CdnHighlightedCode({ entry }) {
3061
3103
  cancelled = true;
3062
3104
  };
3063
3105
  }, [entry.content, entry.lang]);
3064
- return /* @__PURE__ */ jsx49(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx49(
3106
+ return /* @__PURE__ */ jsx50(CodeFigure, { label: entry.label, children: html !== null ? /* @__PURE__ */ jsx50(
3065
3107
  "code",
3066
3108
  {
3067
3109
  className: cn("hljs font-mono text-xs", entry.lang && `language-${entry.lang}`),
3068
3110
  dangerouslySetInnerHTML: { __html: html }
3069
3111
  }
3070
- ) : /* @__PURE__ */ jsx49("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
3112
+ ) : /* @__PURE__ */ jsx50("code", { className: cn("font-mono text-xs", entry.lang && `language-${entry.lang}`), children: entry.content }) });
3071
3113
  }
3072
3114
  function buildIslandRenderers(opts) {
3073
3115
  const renderers = {};
@@ -3081,7 +3123,7 @@ function buildIslandRenderers(opts) {
3081
3123
  }
3082
3124
 
3083
3125
  // src/interactive/ReportInteractiveIsland.tsx
3084
- import { jsx as jsx50 } from "react/jsx-runtime";
3126
+ import { jsx as jsx51 } from "react/jsx-runtime";
3085
3127
  function ReportInteractiveIsland({
3086
3128
  report,
3087
3129
  title,
@@ -3095,7 +3137,7 @@ function ReportInteractiveIsland({
3095
3137
  () => buildIslandRenderers({ syntaxHighlighting, mermaid }),
3096
3138
  [syntaxHighlighting, mermaid]
3097
3139
  );
3098
- return /* @__PURE__ */ jsx50(
3140
+ return /* @__PURE__ */ jsx51(
3099
3141
  ReportInteractive,
3100
3142
  {
3101
3143
  report,