executable-stories-react 0.2.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interactive/ReportInteractive.tsx","../src/result.ts","../src/context/ReportRoot.tsx","../src/context/ReportContext.ts","../src/hooks/useReport.ts","../src/components/ReportScenario.tsx","../src/components/ReportSteps.tsx","../src/components/doc/DocNote.tsx","../src/components/ui/badge.tsx","../src/lib/utils.ts","../src/components/doc/DocTag.tsx","../src/components/doc/DocKv.tsx","../src/hooks/useRenderers.ts","../src/components/doc/DocCode.tsx","../src/components/doc/DocTable.tsx","../src/components/doc/DocLink.tsx","../src/components/doc/DocSection.tsx","../src/lib/url.ts","../src/components/doc/DocMermaid.tsx","../src/components/doc/DocScreenshot.tsx","../src/components/doc/DocVideo.tsx","../src/components/doc/DocHtml.tsx","../src/components/doc/DocCustom.tsx","../src/components/doc/DocEntry.tsx","../src/components/ReportDocEntries.tsx","../src/lib/step-params.tsx","../src/components/ReportAttachments.tsx","../src/components/ReportTrace.tsx","../src/lib/trace.ts","../src/interactive/collapse-context.ts","../src/interactive/scenario-actions.tsx","../src/components/ui/card.tsx","../src/components/ReportScenarioList.tsx","../src/components/ReportFeature.tsx","../src/components/ReportFeatureList.tsx","../src/components/ui/empty.tsx","../src/components/ReportEmpty.tsx","../src/components/ReportSummary.tsx","../src/components/ReportMeta.tsx","../src/components/ReportSchemaError.tsx","../src/components/ReportShell.tsx","../src/interactive/ReportSearch.tsx","../src/interactive/ReportFailureBanner.tsx","../src/lib/scroll.ts","../src/interactive/ReportShortcutsHelp.tsx","../src/interactive/use-keyboard-shortcuts.ts","../src/interactive/use-deep-link-scroll.ts","../src/interactive/filter.ts","../src/interactive/ReportFilters.tsx","../src/interactive/ReportToc.tsx","../src/interactive/use-theme.ts","../src/interactive/ReportInteractiveIsland.tsx","../src/interactive/island-renderers.tsx","../src/components/doc/MermaidView.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useDeferredValue,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { Result } from \"../result\";\nimport { unwrapReport } from \"../result\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\nimport { ReportRoot } from \"../context/ReportRoot\";\nimport { ReportFeatureList } from \"../components/ReportFeatureList\";\nimport { ReportEmpty } from \"../components/ReportEmpty\";\nimport { ReportTitleBlock, ReportErrorShell } from \"../components/ReportShell\";\nimport { cn } from \"../lib/utils\";\nimport { ReportSearch } from \"./ReportSearch\";\nimport { ReportFailureBanner } from \"./ReportFailureBanner\";\nimport { ReportShortcutsHelp } from \"./ReportShortcutsHelp\";\nimport { useKeyboardShortcuts } from \"./use-keyboard-shortcuts\";\nimport { useDeepLinkScroll } from \"./use-deep-link-scroll\";\nimport { filterReport, listFailures, allTags, type StatusFilter } from \"./filter\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\nimport { CollapseProvider, useCollapseState } from \"./collapse-context\";\nimport { ReportFilters } from \"./ReportFilters\";\nimport { ReportToc } from \"./ReportToc\";\nimport { useTheme } from \"./use-theme\";\nimport {\n ScenarioActionsProvider,\n scenarioToMarkdown,\n scenarioToPrompt,\n scenarioPermalink,\n type ScenarioActions,\n} from \"./scenario-actions\";\n\nexport interface ReportInteractiveProps {\n /** A StoryReport, or a Result-wrapped one (e.g., from parseStoryReport). */\n report: StoryReport | Result<StoryReport>;\n /** Renderers keyed by `story.custom({ type })` strings. */\n customRenderers?: CustomRenderers;\n /** Optional overrides for the heavy built-ins (mermaid, code, section). */\n renderers?: BuiltinRenderers;\n className?: string;\n title?: string;\n dataTheme?: \"light\" | \"dark\";\n /**\n * Drop the report's own title block (`<h1>` + summary + meta) while keeping\n * the search and filter controls. Use when the surrounding page already shows\n * the report title as its heading — e.g. the Astro stories index embedded in\n * Starlight, where Starlight renders the page `<h1>`.\n */\n hideHeader?: boolean;\n}\n\nexport function ReportInteractive(props: ReportInteractiveProps) {\n const { report, className, title, dataTheme } = props;\n const result = unwrapReport(report);\n if (!result.ok) {\n return <ReportErrorShell error={result.error} className={className} title={title} dataTheme={dataTheme} />;\n }\n return <ReportInteractiveView {...props} report={result.data} />;\n}\n\ninterface ReportInteractiveViewProps extends Omit<ReportInteractiveProps, \"report\"> {\n report: StoryReport;\n}\n\nfunction ReportInteractiveView({\n report,\n customRenderers,\n renderers,\n className,\n title,\n dataTheme,\n hideHeader = false,\n}: ReportInteractiveViewProps) {\n const [query, setQuery] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<StatusFilter>(\"all\");\n const [activeTags, setActiveTags] = useState<string[]>([]);\n const [detail, setDetail] = useState<\"full\" | \"minimal\">(\"full\");\n const [helpOpen, setHelpOpen] = useState(false);\n const { theme, toggle: toggleTheme } = useTheme();\n const searchRef = useRef<HTMLInputElement>(null);\n // Defer filtering off the live input value so typing stays responsive even\n // when the report is large — the input updates immediately, the filtered\n // tree catches up. (Vercel rerender-use-deferred-value.)\n const deferredQuery = useDeferredValue(query);\n const failures = useMemo(() => listFailures(report), [report]);\n const filtered = useMemo(\n () => filterReport(report, { query: deferredQuery, status: statusFilter, tags: activeTags }),\n [report, deferredQuery, statusFilter, activeTags],\n );\n const isFiltering = query !== deferredQuery;\n\n const statusOptions = useMemo(() => {\n const s = report.summary;\n const opts: Array<{ key: StatusFilter; label: string; count: number }> = [\n { key: \"all\", label: \"All\", count: s.total },\n ];\n if (s.passed) opts.push({ key: \"passed\", label: \"Passed\", count: s.passed });\n if (s.failed) opts.push({ key: \"failed\", label: \"Failed\", count: s.failed });\n if (s.skipped) opts.push({ key: \"skipped\", label: \"Skipped\", count: s.skipped });\n if (s.pending) opts.push({ key: \"pending\", label: \"Pending\", count: s.pending });\n return opts;\n }, [report]);\n const tagOptions = useMemo(() => allTags(report), [report]);\n const toggleTag = useCallback(\n (tag: string) =>\n setActiveTags((prev) => (prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag])),\n [],\n );\n\n const [toast, setToast] = useState<string | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((msg: string) => {\n setToast(msg);\n if (toastTimer.current) clearTimeout(toastTimer.current);\n toastTimer.current = setTimeout(() => setToast(null), 1800);\n }, []);\n const copy = useCallback(\n (text: string, msg: string) => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).then(() => showToast(msg), () => showToast(\"Copy failed\"));\n }\n },\n [showToast],\n );\n const scenarioActions = useMemo<ScenarioActions>(\n () => ({\n copyLink: (s) => copy(scenarioPermalink(s), \"Link copied\"),\n copyMarkdown: (s) => copy(scenarioToMarkdown(s), \"Markdown copied\"),\n copyPrompt: (s) => copy(scenarioToPrompt(s), \"Prompt copied\"),\n }),\n [copy],\n );\n const failureIndexRef = useRef(0);\n\n const collapse = useCollapseState();\n const allCollapsibleIds = useMemo(\n () => report.features.flatMap((f) => [f.id, ...f.scenarios.map((s) => s.id)]),\n [report],\n );\n const collapseAll = useCallback(() => collapse.collapseAll(allCollapsibleIds), [collapse, allCollapsibleIds]);\n\n const focusSearch = useCallback(() => {\n searchRef.current?.focus();\n }, []);\n\n const stepFailure = useCallback(\n (direction: 1 | -1) => {\n if (failures.length === 0) return;\n failureIndexRef.current =\n (failureIndexRef.current + direction + failures.length) % failures.length;\n const target = failures[failureIndexRef.current];\n if (target) scrollToScenarioId(target.scenarioId);\n },\n [failures],\n );\n\n const toggleHelp = useCallback(() => {\n setHelpOpen((v) => !v);\n }, []);\n\n const escape = useCallback(() => {\n if (helpOpen) setHelpOpen(false);\n else if (query !== \"\") setQuery(\"\");\n }, [helpOpen, query]);\n\n useKeyboardShortcuts({\n onFocusSearch: focusSearch,\n onNextFailure: () => stepFailure(1),\n onPrevFailure: () => stepFailure(-1),\n onToggleHelp: toggleHelp,\n onEscape: escape,\n onExpandAll: collapse.expandAll,\n onCollapseAll: collapseAll,\n });\n\n useDeepLinkScroll();\n\n const hasContent = filtered.features.length > 0;\n const totalScenarios = report.summary.total;\n const matchedScenarios = filtered.summary.total;\n\n return (\n <CollapseProvider value={collapse.api}>\n <ScenarioActionsProvider value={scenarioActions}>\n <ReportRoot\n report={filtered}\n customRenderers={customRenderers}\n renderers={renderers}\n >\n <main\n className={cn(\"es-report\", \"es-report-interactive\", className)}\n aria-label={title ?? \"Test report\"}\n aria-busy={isFiltering}\n data-theme={dataTheme}\n data-detail-level={detail}\n >\n <header className=\"es-report-header\">\n {hideHeader ? null : <ReportTitleBlock title={title} />}\n <div className=\"flex flex-wrap items-center gap-2\">\n <ReportSearch\n ref={searchRef}\n value={query}\n onChange={setQuery}\n matchedCount={matchedScenarios}\n totalCount={totalScenarios}\n />\n <div className=\"flex shrink-0 gap-1\">\n <button\n type=\"button\"\n onClick={collapse.expandAll}\n aria-keyshortcuts=\"e\"\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Expand all\n </button>\n <button\n type=\"button\"\n onClick={collapseAll}\n aria-keyshortcuts=\"c\"\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Collapse all\n </button>\n <button\n type=\"button\"\n onClick={() => setDetail((d) => (d === \"full\" ? \"minimal\" : \"full\"))}\n aria-pressed={detail === \"minimal\"}\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n {detail === \"full\" ? \"Hide docs\" : \"Show docs\"}\n </button>\n <button\n type=\"button\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"dark\" ? \"light\" : \"dark\"} theme`}\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n {theme === \"dark\" ? \"☀ Light\" : \"☾ Dark\"}\n </button>\n </div>\n </div>\n <ReportFilters\n statuses={statusOptions}\n status={statusFilter}\n onStatus={setStatusFilter}\n tags={tagOptions}\n activeTags={activeTags}\n onToggleTag={toggleTag}\n />\n </header>\n <ReportFailureBanner failures={failures} />\n {hasContent ? (\n <div className=\"flex gap-6\">\n <ReportToc />\n <div className=\"flex min-w-0 flex-1 flex-col gap-4\">\n <ReportFeatureList />\n </div>\n </div>\n ) : (\n <ReportEmpty message={query ? \"No scenarios match the search.\" : undefined} />\n )}\n <button\n type=\"button\"\n className=\"es-shortcuts-trigger\"\n aria-label=\"Keyboard shortcuts\"\n aria-keyshortcuts=\"Shift+?\"\n onClick={toggleHelp}\n >\n ?\n </button>\n <ReportShortcutsHelp open={helpOpen} onClose={() => setHelpOpen(false)} />\n {toast ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"fixed bottom-4 left-1/2 -translate-x-1/2 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background shadow-lg\"\n >\n {toast}\n </div>\n ) : null}\n </main>\n </ReportRoot>\n </ScenarioActionsProvider>\n </CollapseProvider>\n );\n}\n","/**\n * Result<T> — explicit success/error type matching the cookbook convention.\n *\n * Used at the boundary where a StoryReport is parsed: the consumer hands us\n * an unknown value (file contents, fetch body, prop) and we return a Result.\n */\nimport type { StoryReport } from \"executable-stories-core\";\n\nexport type Result<T, E = ReportParseError> =\n | { ok: true; data: T }\n | { ok: false; error: E };\n\nexport interface ReportParseError {\n message: string;\n code: ReportParseErrorCode;\n issues?: readonly { path: string; message: string }[];\n}\n\nexport type ReportParseErrorCode =\n | \"INVALID_INPUT\"\n | \"SCHEMA_VERSION_MISMATCH\"\n | \"VALIDATION_FAILED\";\n\nexport const ok = <T>(data: T): Result<T> => ({ ok: true, data });\nexport const err = (error: ReportParseError): Result<never> => ({ ok: false, error });\n\n/**\n * Normalize the `StoryReport | Result<StoryReport>` prop accepted across the\n * render entrypoints (`Report`, `ReportInteractive`, `renderReportToHtml`) into\n * a single `Result`. A bare report becomes `ok(report)`; an already-wrapped\n * value passes through. One place owns the \"is this a Result?\" discrimination.\n */\nexport function unwrapReport(value: StoryReport | Result<StoryReport>): Result<StoryReport> {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"ok\" in value &&\n typeof (value as { ok: unknown }).ok === \"boolean\"\n ) {\n return value as Result<StoryReport>;\n }\n return ok(value as StoryReport);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\nimport { ReportContext, type ReportContextValue } from \"./ReportContext\";\n\nexport interface ReportRootProps {\n report: StoryReport;\n customRenderers?: CustomRenderers;\n renderers?: BuiltinRenderers;\n children: ReactNode;\n}\n\nconst EMPTY_CUSTOM: CustomRenderers = {};\nconst EMPTY_RENDERERS: BuiltinRenderers = {};\n\nexport function ReportRoot({\n report,\n customRenderers,\n renderers,\n children,\n}: ReportRootProps) {\n const value = useMemo<ReportContextValue>(\n () => ({\n report,\n customRenderers: customRenderers ?? EMPTY_CUSTOM,\n renderers: renderers ?? EMPTY_RENDERERS,\n }),\n [report, customRenderers, renderers],\n );\n return <ReportContext.Provider value={value}>{children}</ReportContext.Provider>;\n}\n","import { createContext } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\n\nexport interface ReportContextValue {\n report: StoryReport;\n customRenderers: CustomRenderers;\n renderers: BuiltinRenderers;\n}\n\nexport const ReportContext = createContext<ReportContextValue | null>(null);\n","import { useContext } from \"react\";\nimport { ReportContext } from \"../context/ReportContext\";\n\nexport function useReport() {\n const ctx = useContext(ReportContext);\n if (!ctx) {\n throw new Error(\n \"useReport must be used inside <ReportRoot> or <Report>. Wrap your tree with one of those.\",\n );\n }\n return ctx.report;\n}\n","import type { ReportScenario as ReportScenarioT } from \"executable-stories-core\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { ReportSteps } from \"./ReportSteps\";\nimport { ReportDocEntries } from \"./ReportDocEntries\";\nimport { ReportAttachments } from \"./ReportAttachments\";\nimport { ReportTrace } from \"./ReportTrace\";\nimport { useCollapse } from \"../interactive/collapse-context\";\nimport { useScenarioActions } from \"../interactive/scenario-actions\";\nimport { Card, CardContent, CardHeader } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportScenarioProps {\n scenario: ReportScenarioT;\n /**\n * Omit the card's own title row (status badge + tags still render). Use when\n * the surrounding page already shows the scenario title as its heading — e.g.\n * the Astro detail page, where Starlight renders the title as the page `h1`.\n */\n hideTitle?: boolean;\n}\n\ntype Status = ReportScenarioT[\"status\"];\n\nconst STATUS_LABEL: Record<Status, string> = {\n passed: \"Passed\",\n failed: \"Failed\",\n skipped: \"Skipped\",\n pending: \"Pending\",\n};\n\nconst STATUS_GLYPH: Record<Status, string> = {\n passed: \"✓\",\n failed: \"✗\",\n skipped: \"○\",\n pending: \"○\",\n};\n\nconst STATUS_GLYPH_COLOR: Record<Status, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\nconst STATUS_BADGE: Record<Status, \"passed\" | \"failed\" | \"skipped\" | \"pending\"> = {\n passed: \"passed\",\n failed: \"failed\",\n skipped: \"skipped\",\n pending: \"pending\",\n};\n\nexport function ReportScenario({ scenario, hideTitle = false }: ReportScenarioProps) {\n const titleId = `${scenario.id}-title`;\n const bodyId = `${scenario.id}-body`;\n const label = STATUS_LABEL[scenario.status];\n const collapse = useCollapse();\n const collapsible = collapse !== null && !hideTitle;\n const collapsed = collapsible ? collapse!.isCollapsed(scenario.id) : false;\n const actions = useScenarioActions();\n return (\n <Card\n id={scenario.id}\n data-status={scenario.status}\n {...(hideTitle\n ? { \"aria-label\": `${scenario.title} — ${label}` }\n : { \"aria-labelledby\": titleId })}\n className=\"gap-0 py-0\"\n >\n <CardHeader className=\"px-4 py-3\">\n <div className={cn(\"flex items-start gap-4\", hideTitle ? \"justify-end\" : \"justify-between\")}>\n {hideTitle ? null : (\n <h3 id={titleId} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => collapse!.toggle(scenario.id)}\n aria-expanded={!collapsed}\n aria-controls={bodyId}\n aria-label={`Toggle ${scenario.title}`}\n className=\"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className={cn(\"inline-block text-xs transition-transform\", !collapsed && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n <span aria-hidden className={cn(\"text-sm leading-none\", STATUS_GLYPH_COLOR[scenario.status])}>\n {STATUS_GLYPH[scenario.status]}\n </span>\n <span>{scenario.title}</span>\n </h3>\n )}\n <div className=\"flex shrink-0 items-center gap-2\">\n {scenario.durationMs > 0 ? (\n <span className=\"whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground\">\n {formatDuration(scenario.durationMs)}\n </span>\n ) : null}\n <Badge variant={STATUS_BADGE[scenario.status]} aria-label={`Status: ${label}`}>\n {label}\n </Badge>\n {actions ? (\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={() => actions.copyLink(scenario)}\n aria-label={`Copy link to ${scenario.title}`}\n title=\"Copy permalink\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n link\n </button>\n <button\n type=\"button\"\n onClick={() => actions.copyMarkdown(scenario)}\n aria-label={`Copy ${scenario.title} as Markdown`}\n title=\"Copy as Markdown\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n md\n </button>\n <button\n type=\"button\"\n onClick={() => actions.copyPrompt(scenario)}\n aria-label={`Copy ${scenario.title} as an AI investigation prompt`}\n title=\"Copy as AI prompt\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n ai\n </button>\n </div>\n ) : null}\n </div>\n </div>\n {scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? (\n <ul aria-label=\"Tags and tickets\" className=\"flex flex-wrap gap-1.5\">\n {scenario.tags.map((t) => (\n <li key={`tag-${t}`}>\n <Badge variant=\"tag\">{t}</Badge>\n </li>\n ))}\n {(scenario.tickets ?? []).map((ticket) => (\n <li key={`ticket-${ticket.id}`}>\n {ticket.url ? (\n <a href={ticket.url} target=\"_blank\" rel=\"noreferrer noopener\">\n <Badge variant=\"outline\">{ticket.id}</Badge>\n </a>\n ) : (\n <Badge variant=\"outline\">{ticket.id}</Badge>\n )}\n </li>\n ))}\n </ul>\n ) : null}\n </CardHeader>\n <CardContent id={bodyId} hidden={collapsed} className=\"px-4 pt-0 pb-4\">\n {scenario.errorMessage ? (\n <pre\n role=\"alert\"\n className=\"mb-1 overflow-x-auto rounded-md border border-fail-border bg-fail-bg px-4 py-3.5 font-mono text-xs leading-relaxed whitespace-pre-wrap text-fail\"\n >\n {scenario.errorMessage}\n </pre>\n ) : null}\n <ReportSteps scenario={scenario} />\n {scenario.docEntries.length > 0 ? (\n <div data-es-docs className=\"mt-3\">\n <ReportDocEntries entries={scenario.docEntries} />\n </div>\n ) : null}\n <ReportAttachments attachments={scenario.attachments} />\n <ReportTrace spans={scenario.otelSpans} />\n </CardContent>\n </Card>\n );\n}\n","import type { ReportStep, ReportScenario } from \"executable-stories-core\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { ReportDocEntries } from \"./ReportDocEntries\";\nimport { highlightStepParams } from \"@/lib/step-params\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportStepsProps {\n scenario: ReportScenario;\n}\n\nconst STEP_GLYPH: Record<string, string> = {\n passed: \"✓\",\n failed: \"✗\",\n skipped: \"○\",\n pending: \"○\",\n};\n\nconst STEP_GLYPH_COLOR: Record<string, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\nexport function ReportSteps({ scenario }: ReportStepsProps) {\n if (scenario.steps.length === 0) return null;\n return (\n <ol data-slot=\"steps\" className=\"flex flex-col\">\n {scenario.steps.map((step) => (\n <ReportStepItem key={step.id} step={step} />\n ))}\n </ol>\n );\n}\n\nexport function ReportStepItem({ step }: { step: ReportStep }) {\n // And/But (incl. auto-And repeats) read as continuations of the prior step —\n // indented with a muted keyword, matching the report's `.step.continuation`.\n const kw = step.keyword.toLowerCase();\n const continuation = kw === \"and\" || kw === \"but\";\n return (\n <li\n id={step.id}\n data-status={step.status}\n className={cn(\"py-1.5 text-[0.8125rem] leading-normal\", continuation && \"pl-5\")}\n >\n <div className=\"flex items-baseline gap-2\">\n <span aria-hidden className={cn(\"w-4 shrink-0 text-center text-xs\", STEP_GLYPH_COLOR[step.status])}>\n {STEP_GLYPH[step.status] ?? \"○\"}\n </span>\n <span\n className={cn(\n \"min-w-[52px] shrink-0 font-mono text-xs font-semibold capitalize\",\n continuation ? \"font-medium text-muted-foreground\" : \"text-keyword\",\n )}\n >\n {step.keyword}\n </span>\n <span className=\"flex-1 text-foreground\">{highlightStepParams(step.text)}</span>\n {step.durationMs > 0 ? (\n <span className=\"shrink-0 whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground\">\n {formatDuration(step.durationMs)}\n </span>\n ) : null}\n </div>\n {step.errorMessage ? (\n <pre\n role=\"alert\"\n className=\"mt-2.5 ml-6 overflow-x-auto rounded-md border border-fail-border bg-fail-bg px-4 py-3.5 font-mono text-xs leading-relaxed whitespace-pre-wrap text-fail\"\n >\n {step.errorMessage}\n </pre>\n ) : null}\n {step.docEntries.length > 0 ? (\n <div data-es-docs className=\"mt-2 ml-6\">\n <ReportDocEntries entries={step.docEntries} />\n </div>\n ) : null}\n </li>\n );\n}\n","import type { ReportDocNote } from \"executable-stories-core\";\n\nexport function DocNote({ entry }: { entry: ReportDocNote }) {\n return <p className=\"my-2 text-sm text-muted-foreground\">{entry.text}</p>;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { useRender } from \"@base-ui/react/use-render\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90\",\n outline:\n \"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n ghost: \"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 [a&]:hover:underline\",\n passed: \"border-pass-border bg-pass-bg text-pass font-mono uppercase\",\n failed: \"border-fail-border bg-fail-bg text-fail font-mono uppercase\",\n skipped: \"border-skip-border bg-skip-bg text-skip font-mono uppercase\",\n pending: \"border-pend-border bg-pend-bg text-pend font-mono uppercase\",\n tag: \"border-pass-border bg-pass-bg text-pass font-mono font-medium\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & {\n // Base UI composition: pass `render={<a … />}` to swap the underlying tag —\n // replaces Radix's `asChild`. See rules/base-vs-radix.md.\n render?: useRender.RenderProp\n }) {\n return useRender({\n defaultTagName: \"span\",\n render,\n props: {\n \"data-slot\": \"badge\",\n \"data-variant\": variant,\n className: cn(badgeVariants({ variant }), className),\n ...props,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/** Merge class names with Tailwind-aware conflict resolution (shadcn `cn`). */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import type { ReportDocTag } from \"executable-stories-core\";\nimport { Badge } from \"@/components/ui/badge\";\n\nexport function DocTag({ entry }: { entry: ReportDocTag }) {\n return (\n <ul className=\"my-2 flex flex-wrap gap-1.5\" aria-label=\"Tags\">\n {entry.names.map((n) => (\n <li key={n}>\n <Badge variant=\"tag\">{n}</Badge>\n </li>\n ))}\n </ul>\n );\n}\n","import type { ReportDocKv } from \"executable-stories-core\";\n\nfunction formatValue(value: unknown): string {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function DocKv({ entry }: { entry: ReportDocKv }) {\n return (\n <dl className=\"my-2 flex flex-wrap items-baseline gap-x-2 text-sm\">\n <dt className=\"font-semibold text-muted-foreground\">{entry.label}</dt>\n <dd className=\"font-mono text-foreground\">{formatValue(entry.value)}</dd>\n </dl>\n );\n}\n","import { useContext } from \"react\";\nimport { ReportContext } from \"../context/ReportContext\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\n\nconst EMPTY_CUSTOM: CustomRenderers = {};\nconst EMPTY_RENDERERS: BuiltinRenderers = {};\n\nexport function useCustomRenderers(): CustomRenderers {\n const ctx = useContext(ReportContext);\n return ctx?.customRenderers ?? EMPTY_CUSTOM;\n}\n\nexport function useBuiltinRenderers(): BuiltinRenderers {\n const ctx = useContext(ReportContext);\n return ctx?.renderers ?? EMPTY_RENDERERS;\n}\n","import type { ReactNode } from \"react\";\nimport type { ReportDocCode } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Shared shell for code blocks: optional label + the scrollable `<pre>`. Both\n * the static `DocCode` and the island's CDN-highlighted variant render their\n * `<code>` into this so the two can never drift in spacing or chrome.\n */\nexport function CodeFigure({ label, children }: { label?: string; children: ReactNode }) {\n return (\n <figure className=\"my-3\">\n {label ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{label}</figcaption>\n ) : null}\n <pre tabIndex={0} className=\"overflow-x-auto rounded-md bg-muted p-3\">\n {children}\n </pre>\n </figure>\n );\n}\n\nexport function DocCode({ entry }: { entry: ReportDocCode }) {\n const renderers = useBuiltinRenderers();\n if (renderers.code) {\n return <>{renderers.code(entry)}</>;\n }\n return (\n <CodeFigure label={entry.label}>\n <code className={cn(\"font-mono text-xs\", entry.lang && `language-${entry.lang}`)}>\n {entry.content}\n </code>\n </CodeFigure>\n );\n}\n","import type { ReportDocTable } from \"executable-stories-core\";\n\nexport function DocTable({ entry }: { entry: ReportDocTable }) {\n return (\n <figure className=\"my-3\">\n {entry.label ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n {entry.label}\n </figcaption>\n ) : null}\n <div tabIndex={0} className=\"overflow-x-auto rounded-md border border-border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-muted/50\">\n {entry.columns.map((c) => (\n <th key={c} scope=\"col\" className=\"border-b border-border px-3 py-2 text-left font-semibold\">\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entry.rows.map((row, i) => (\n <tr key={i}>\n {row.map((cell, j) => (\n <td key={j} className=\"border-b border-border px-3 py-2 text-foreground\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </figure>\n );\n}\n","import type { ReportDocLink } from \"executable-stories-core\";\n\nexport function DocLink({ entry }: { entry: ReportDocLink }) {\n return (\n <a\n className=\"text-sm font-medium text-primary underline underline-offset-2 hover:no-underline\"\n href={entry.url}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n >\n {entry.label}\n </a>\n );\n}\n","import { marked } from \"marked\";\nimport type { ReportDocSection } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\nimport { safeUrl } from \"../../lib/url\";\n\n/**\n * Best-effort sanitizer for marked-generated HTML. `section` markdown is\n * authored in the test source (developer-trusted), so this is defense-in-depth,\n * not a hard boundary against hostile input. It:\n * - drops <script>/<style> and other active elements (iframe/object/embed/form)\n * - strips on* event-handler attributes\n * - neutralizes any non-http(s) scheme on href/src via the shared `safeUrl`\n * allow-list (covers javascript:/data:/vbscript:/file:, not just javascript:)\n *\n * It is NOT a substitute for a full HTML sanitizer (it won't catch entity-\n * obfuscated schemes). For untrusted markdown, supply `renderers.section` with\n * your own sanitizer.\n */\nfunction neutralizeUrl(value: string): string {\n return safeUrl(value) ?? \"#\";\n}\n\nfunction safeMarkdownHtml(markdown: string): string {\n const raw = marked.parse(markdown, { async: false }) as string;\n return raw\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<\\/?(?:iframe|object|embed|form|base)\\b[^>]*>/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*\"[^\"]*\"/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*'[^']*'/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*[^\\s>]+/gi, \"\")\n .replace(/(href|src)\\s*=\\s*\"([^\"]*)\"/gi, (_m, attr, val) => `${attr}=\"${neutralizeUrl(val)}\"`)\n .replace(/(href|src)\\s*=\\s*'([^']*)'/gi, (_m, attr, val) => `${attr}='${neutralizeUrl(val)}'`);\n}\n\nexport function DocSection({ entry }: { entry: ReportDocSection }) {\n const renderers = useBuiltinRenderers();\n if (renderers.section) {\n return <>{renderers.section(entry)}</>;\n }\n const html = safeMarkdownHtml(entry.markdown);\n return (\n <section className=\"my-3 text-sm\" aria-label={entry.title}>\n {entry.title ? <h4 className=\"mb-1 font-semibold text-foreground\">{entry.title}</h4> : null}\n <div\n className=\"es-doc-prose text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </section>\n );\n}\n","/**\n * A URL is safe to put in the DOM (href/src/poster) only if it's relative (no\n * scheme) or uses http/https. Anything with another scheme — notably\n * `javascript:` (which runs in the page context), plus `data:` / `vbscript:` /\n * `file:` — is rejected. Report JSON carries adapter-supplied URLs, so every\n * report-sourced URL that reaches the DOM is treated as untrusted and passed\n * through here (DocHtml iframe src, DocVideo src/poster, …).\n */\nexport function safeUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (scheme && !/^https?$/i.test(scheme[1] ?? \"\")) return undefined;\n return trimmed;\n}\n","import type { Ref } from \"react\";\nimport type { ReportDocMermaid } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\n\n/**\n * The raw mermaid source as a semantic `<pre data-mermaid>`. This is the\n * default render and the universal fallback: AI agents, screen readers, and\n * no-JS views all get the readable source. `<MermaidDiagram>` upgrades this to\n * a drawn diagram on the client.\n */\nexport function MermaidSource({ entry, ref }: { entry: ReportDocMermaid; ref?: Ref<HTMLElement> }) {\n return (\n <figure ref={ref} className=\"my-3\" aria-label={entry.title ?? \"Diagram\"}>\n {entry.title ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{entry.title}</figcaption>\n ) : null}\n <pre\n data-mermaid\n tabIndex={0}\n className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground\"\n >\n {entry.code}\n </pre>\n </figure>\n );\n}\n\n/**\n * Renders mermaid source as a semantic `<pre data-mermaid>` by default.\n *\n * To draw the diagram, supply a `renderers.mermaid` prop — e.g. the shipped\n * `MermaidDiagram` (`renderers={{ mermaid: (e) => <MermaidDiagram entry={e} /> }}`).\n */\nexport function DocMermaid({ entry }: { entry: ReportDocMermaid }) {\n const renderers = useBuiltinRenderers();\n if (renderers.mermaid) {\n return <>{renderers.mermaid(entry)}</>;\n }\n return <MermaidSource entry={entry} />;\n}\n","import type { ReportDocScreenshot } from \"executable-stories-core\";\n\nexport function DocScreenshot({ entry }: { entry: ReportDocScreenshot }) {\n return (\n <figure className=\"my-3\">\n <img\n src={entry.path}\n alt={entry.alt ?? \"\"}\n loading=\"lazy\"\n className=\"max-w-full rounded-md border border-border\"\n />\n {entry.alt ? <figcaption className=\"mt-1.5 text-xs text-muted-foreground\">{entry.alt}</figcaption> : null}\n </figure>\n );\n}\n","import type { ReportDocVideo } from \"executable-stories-core\";\nimport { safeUrl } from \"../../lib/url\";\n\n/**\n * Renders a video doc entry. Video bytes are large and never inlined; `path` is\n * a URL or a path that resolves alongside the report. Both `path` and `poster`\n * are adapter-supplied, so they go through the same scheme allow-list as the\n * DocHtml iframe src (no `javascript:`/`data:` URLs reach the DOM).\n */\nexport function DocVideo({ entry }: { entry: ReportDocVideo }) {\n const src = safeUrl(entry.path);\n const poster = safeUrl(entry.poster);\n return (\n <figure className=\"my-3\">\n <video\n controls\n preload=\"metadata\"\n {...(src ? { src } : {})}\n {...(poster ? { poster } : {})}\n className=\"max-w-full rounded-md border border-border\"\n />\n {entry.caption ? (\n <figcaption className=\"mt-1 text-xs text-muted-foreground\">{entry.caption}</figcaption>\n ) : null}\n </figure>\n );\n}\n","import type { ReportDocHtml } from \"executable-stories-core\";\nimport { safeUrl } from \"../../lib/url\";\n\n/**\n * Renders an embedded-HTML doc entry inside a SANDBOXED iframe. All embedded\n * HTML is untrusted, so the frame is `sandbox=\"allow-scripts\"` only (no\n * allow-same-origin) — embedded scripts run (charts work) but can't touch the\n * report DOM, cookies, or storage. Inline `content` → srcdoc (keeps the report\n * self-contained); `url`/`path` → src (scheme-validated).\n */\nexport function DocHtml({ entry }: { entry: ReportDocHtml }) {\n const height = typeof entry.height === \"number\" ? `${entry.height}px` : (entry.height ?? \"400px\");\n const title = entry.title ?? \"Embedded HTML\";\n const safeHref = safeUrl(entry.url ?? entry.path);\n\n // Exactly one of content / url / path is set. A url/path with an unsafe\n // scheme yields no src (the figure still renders, just empty).\n const frameProps = entry.content !== undefined ? { srcDoc: entry.content } : { src: safeHref ?? \"\" };\n\n return (\n <figure className=\"my-3 overflow-hidden rounded-md border border-border\">\n <figcaption className=\"flex items-center justify-between border-b border-border bg-muted/40 px-3 py-1.5 text-xs font-medium text-muted-foreground\">\n <span>{entry.title ?? \"HTML\"}</span>\n {safeHref ? (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n aria-label=\"Open in new tab\"\n title=\"Open in new tab\"\n className=\"text-primary\"\n >\n ↗\n </a>\n ) : null}\n </figcaption>\n <iframe\n {...frameProps}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n title={title}\n className=\"block w-full border-0\"\n style={{ height }}\n />\n </figure>\n );\n}\n","import type { ReportDocCustom } from \"executable-stories-core\";\nimport { useCustomRenderers } from \"../../hooks/useRenderers\";\n\nexport function DocCustom({ entry }: { entry: ReportDocCustom }) {\n const renderers = useCustomRenderers();\n const renderer = renderers[entry.type];\n if (renderer) {\n return <>{renderer(entry)}</>;\n }\n return (\n <div className=\"my-2\" data-type={entry.type}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{entry.type}</p>\n <pre tabIndex={0} className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground\">\n {safeStringify(entry.data)}\n </pre>\n </div>\n );\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { ReportDocEntry } from \"executable-stories-core\";\nimport { DocNote } from \"./DocNote\";\nimport { DocTag } from \"./DocTag\";\nimport { DocKv } from \"./DocKv\";\nimport { DocCode } from \"./DocCode\";\nimport { DocTable } from \"./DocTable\";\nimport { DocLink } from \"./DocLink\";\nimport { DocSection } from \"./DocSection\";\nimport { DocMermaid } from \"./DocMermaid\";\nimport { DocScreenshot } from \"./DocScreenshot\";\nimport { DocVideo } from \"./DocVideo\";\nimport { DocHtml } from \"./DocHtml\";\nimport { DocCustom } from \"./DocCustom\";\n\nexport function DocEntry({ entry }: { entry: ReportDocEntry }) {\n switch (entry.kind) {\n case \"note\":\n return <DocNote entry={entry} />;\n case \"tag\":\n return <DocTag entry={entry} />;\n case \"kv\":\n return <DocKv entry={entry} />;\n case \"code\":\n return <DocCode entry={entry} />;\n case \"table\":\n return <DocTable entry={entry} />;\n case \"link\":\n return <DocLink entry={entry} />;\n case \"section\":\n return <DocSection entry={entry} />;\n case \"mermaid\":\n return <DocMermaid entry={entry} />;\n case \"screenshot\":\n return <DocScreenshot entry={entry} />;\n case \"video\":\n return <DocVideo entry={entry} />;\n case \"html\":\n return <DocHtml entry={entry} />;\n case \"custom\":\n return <DocCustom entry={entry} />;\n }\n}\n","import type { ReportDocEntry } from \"executable-stories-core\";\nimport { DocEntry } from \"./doc/DocEntry\";\n\nexport interface ReportDocEntriesProps {\n entries: readonly ReportDocEntry[];\n}\n\nexport function ReportDocEntries({ entries }: ReportDocEntriesProps) {\n if (entries.length === 0) return null;\n return (\n <>\n {entries.map((entry, i) => (\n <DocEntry key={i} entry={entry} />\n ))}\n </>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/**\n * Highlight step parameters (double-quoted strings, standalone numbers) in step\n * text — the React equivalent of the report's highlightStepParams. Returns a\n * node array so the matched params can be wrapped in a styled <span> without\n * dangerouslySetInnerHTML.\n *\n * Regex mirrors the string renderer exactly:\n * - `\"[^\"]*\"` double-quoted strings (numbers inside quotes stay part of the string)\n * - `(?<![\\w.-])\\d+(?:\\.\\d+)?(?![\\w.-])` standalone numbers, dot/word-boundary aware\n */\nconst STEP_PARAM_PATTERN = /\"[^\"]*\"|(?<![\\w.-])\\d+(?:\\.\\d+)?(?![\\w.-])/g;\n\nexport function highlightStepParams(text: string): ReactNode {\n const matches = Array.from(text.matchAll(STEP_PARAM_PATTERN));\n if (matches.length === 0) return text;\n\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n matches.forEach((match, i) => {\n const start = match.index;\n const end = start + match[0].length;\n if (start > lastIndex) nodes.push(text.slice(lastIndex, start));\n nodes.push(\n <span key={i} className=\"font-medium text-step-param italic\">\n {match[0]}\n </span>,\n );\n lastIndex = end;\n });\n if (lastIndex < text.length) nodes.push(text.slice(lastIndex));\n return nodes;\n}\n","import type { ReportAttachment } from \"executable-stories-core\";\n\n/**\n * Renders scenario attachments. Base64 images embed inline; everything else\n * becomes a labelled data-URI download link. Mirrors the report's attachments\n * block (which also inlines images and links other media).\n */\nexport function ReportAttachments({ attachments }: { attachments: ReportAttachment[] }) {\n if (attachments.length === 0) return null;\n return (\n // role=\"group\" (not a labelled <section>) so multiple scenarios' attachment\n // blocks don't create duplicate \"Attachments\" region landmarks.\n <div role=\"group\" aria-label=\"Attachments\" className=\"mt-3 flex flex-col gap-2\">\n {attachments.map((att, i) => {\n const dataUri =\n att.contentEncoding === \"BASE64\"\n ? `data:${att.mediaType};base64,${att.body}`\n : `data:${att.mediaType},${encodeURIComponent(att.body)}`;\n const isImage = att.mediaType.startsWith(\"image/\");\n return (\n <figure key={`${att.name}-${i}`} className=\"m-0\">\n {isImage ? (\n <>\n <img\n src={dataUri}\n alt={att.name}\n loading=\"lazy\"\n className=\"max-w-full rounded-md border border-border\"\n />\n <figcaption className=\"mt-1 text-xs text-muted-foreground\">{att.name}</figcaption>\n </>\n ) : (\n <a\n href={dataUri}\n download={att.name}\n className=\"text-xs text-link underline underline-offset-2\"\n >\n {att.name} <span className=\"text-muted-foreground\">({att.mediaType})</span>\n </a>\n )}\n </figure>\n );\n })}\n </div>\n );\n}\n","import type { OtelSpan } from \"executable-stories-core/types/otel\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { toTraceRows, traceWindow } from \"@/lib/trace\";\nimport { cn } from \"@/lib/utils\";\n\nconst BAR_COLOR: Record<string, string> = {\n ok: \"bg-pass\",\n error: \"bg-fail\",\n unset: \"bg-skip\",\n};\n\n/**\n * OTel trace waterfall. Collapsed by default (native <details>, no JS) so it\n * renders in both the static and interactive reports. Each span is a row with a\n * depth-indented name and a bar positioned/sized by its time window.\n */\nexport function ReportTrace({ spans }: { spans: readonly OtelSpan[] | undefined }) {\n if (!spans || spans.length === 0) return null;\n const rows = toTraceRows(spans);\n if (rows.length === 0) return null;\n const { minStartMs, totalMs } = traceWindow(rows);\n\n return (\n <details className=\"mt-3 rounded-md border border-border bg-muted/30\">\n <summary className=\"cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground\">\n Trace ({rows.length} span{rows.length === 1 ? \"\" : \"s\"}, {formatDuration(totalMs)})\n </summary>\n <ul className=\"flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]\">\n {rows.map((row, i) => {\n const leftPct = ((row.startTimeMs - minStartMs) / totalMs) * 100;\n const widthPct = Math.max((row.durationMs / totalMs) * 100, 0.5);\n return (\n <li key={`${row.spanId}-${i}`} className=\"flex items-center gap-2\">\n <span\n className=\"min-w-0 flex-1 truncate text-foreground\"\n style={{ paddingLeft: `${row.depth * 12}px` }}\n title={row.statusMessage ? `${row.name} — ${row.statusMessage}` : row.name}\n >\n {row.name}\n </span>\n <span className=\"relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40\">\n <span\n className={cn(\"absolute top-0 h-full rounded-sm\", BAR_COLOR[row.status])}\n style={{ left: `${leftPct}%`, width: `${widthPct}%` }}\n />\n </span>\n <span className=\"w-16 shrink-0 text-right text-muted-foreground\">\n {formatDuration(row.durationMs)}\n </span>\n </li>\n );\n })}\n </ul>\n </details>\n );\n}\n","/**\n * Pure span normalization + tree building for the OTel trace waterfall.\n * Ported from the formatters trace-view renderer so the React waterfall shows\n * the same structure. Side-effect-free for unit testing.\n */\n\nimport type { OtelSpan } from \"executable-stories-core/types/otel\";\n\nexport interface NormalizedSpan {\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeMs: number;\n durationMs: number;\n status: \"ok\" | \"error\" | \"unset\";\n statusMessage?: string;\n}\n\nexport interface TraceRow extends NormalizedSpan {\n depth: number;\n}\n\nconst VALID = new Set([\"ok\", \"error\", \"unset\"]);\nconst safeStatus = (s: string): NormalizedSpan[\"status\"] => (VALID.has(s) ? (s as NormalizedSpan[\"status\"]) : \"unset\");\n\nexport function normalizeSpans(spans: readonly OtelSpan[]): NormalizedSpan[] {\n const out: NormalizedSpan[] = [];\n for (const span of spans) {\n if (!span || typeof span.spanId !== \"string\" || typeof span.name !== \"string\") continue;\n let startTimeMs: number;\n let durationMs: number;\n if (span.startTimeMs != null && span.durationMs != null) {\n startTimeMs = span.startTimeMs;\n durationMs = span.durationMs;\n } else if (span.startTimeUnixNano != null && span.endTimeUnixNano != null) {\n startTimeMs = span.startTimeUnixNano / 1e6;\n durationMs = (span.endTimeUnixNano - span.startTimeUnixNano) / 1e6;\n } else {\n continue;\n }\n durationMs = Math.max(0, durationMs);\n if (!isFinite(startTimeMs) || !isFinite(durationMs)) continue;\n out.push({\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n startTimeMs,\n durationMs,\n status: safeStatus(span.status),\n statusMessage: span.statusMessage,\n });\n }\n return out;\n}\n\n/** Flatten spans into rows in tree order with a depth, parent before children. */\nexport function toTraceRows(spans: readonly OtelSpan[]): TraceRow[] {\n const normalized = normalizeSpans(spans);\n if (normalized.length === 0) return [];\n\n interface Node {\n span: NormalizedSpan;\n children: Node[];\n depth: number;\n }\n const byId = new Map<string, Node>();\n for (const span of normalized) {\n let key = span.spanId;\n let suffix = 2;\n while (byId.has(key)) key = `${span.spanId}__dup${suffix++}`;\n byId.set(key, { span: { ...span, spanId: key }, children: [], depth: 0 });\n }\n\n const roots: Node[] = [];\n for (const node of byId.values()) {\n const parent = node.span.parentSpanId ? byId.get(node.span.parentSpanId) : undefined;\n if (parent && parent !== node) parent.children.push(node);\n else roots.push(node);\n }\n for (const node of byId.values()) node.children.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);\n roots.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);\n\n const rows: TraceRow[] = [];\n const seen = new Set<string>();\n const walk = (node: Node, depth: number): void => {\n if (seen.has(node.span.spanId)) return;\n seen.add(node.span.spanId);\n rows.push({ ...node.span, depth });\n for (const child of node.children) walk(child, depth + 1);\n };\n for (const root of roots) walk(root, 0);\n // Orphans from cycles: promote to depth 0.\n for (const node of byId.values()) {\n if (!seen.has(node.span.spanId)) walk(node, 0);\n }\n return rows;\n}\n\nexport interface TraceWindow {\n minStartMs: number;\n totalMs: number;\n}\n\nexport function traceWindow(rows: readonly TraceRow[]): TraceWindow {\n let min = Infinity;\n let max = -Infinity;\n for (const r of rows) {\n min = Math.min(min, r.startTimeMs);\n max = Math.max(max, r.startTimeMs + r.durationMs);\n }\n const total = max - min;\n return { minStartMs: isFinite(min) ? min : 0, totalMs: total > 0 ? total : 1 };\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useState } from \"react\";\n\nexport interface CollapseApi {\n isCollapsed: (id: string) => boolean;\n toggle: (id: string) => void;\n}\n\n/**\n * Provided only inside <ReportInteractive>. When null (the static <Report/>\n * render, Storybook, Astro), components render fully expanded with no toggle\n * affordance — so the static path and component-tier tests are unaffected.\n */\nconst CollapseContext = createContext<CollapseApi | null>(null);\n\nexport const CollapseProvider = CollapseContext.Provider;\n\nexport function useCollapse(): CollapseApi | null {\n return useContext(CollapseContext);\n}\n\nconst STORAGE_KEY = \"es-collapsed-ids\";\n\nfunction readPersisted(): Set<string> {\n if (typeof localStorage === \"undefined\") return new Set();\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n return raw ? new Set(JSON.parse(raw) as string[]) : new Set();\n } catch {\n return new Set();\n }\n}\n\nfunction persist(ids: Set<string>): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...ids]));\n } catch {\n /* quota / disabled — collapse still works for the session */\n }\n}\n\n/**\n * Collapse state for the interactive report: a persisted set of collapsed\n * feature/scenario ids, plus expand-all / collapse-all.\n */\nexport function useCollapseState() {\n const [collapsed, setCollapsed] = useState<Set<string>>(readPersisted);\n\n const isCollapsed = useCallback((id: string) => collapsed.has(id), [collapsed]);\n\n const toggle = useCallback((id: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n persist(next);\n return next;\n });\n }, []);\n\n const collapseAll = useCallback((ids: string[]) => {\n setCollapsed(() => {\n const next = new Set(ids);\n persist(next);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n setCollapsed(() => {\n const next = new Set<string>();\n persist(next);\n return next;\n });\n }, []);\n\n return { api: { isCollapsed, toggle } as CollapseApi, collapseAll, expandAll };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReportScenario } from \"executable-stories-core\";\n\nexport interface ScenarioActions {\n copyLink: (scenario: ReportScenario) => void;\n copyMarkdown: (scenario: ReportScenario) => void;\n copyPrompt: (scenario: ReportScenario) => void;\n}\n\n/**\n * Provided only inside <ReportInteractive>. When null (static render), scenarios\n * show no per-scenario action buttons.\n */\nconst ScenarioActionsContext = createContext<ScenarioActions | null>(null);\nexport const ScenarioActionsProvider = ScenarioActionsContext.Provider;\nexport function useScenarioActions(): ScenarioActions | null {\n return useContext(ScenarioActionsContext);\n}\n\n/** A scenario rendered as Markdown — for pasting into PRs / issues / docs. */\nexport function scenarioToMarkdown(scenario: ReportScenario): string {\n const lines: string[] = [`## ${scenario.title} _(${scenario.status})_`, \"\"];\n for (const step of scenario.steps) {\n lines.push(`- **${step.keyword}** ${step.text}`);\n }\n if (scenario.errorMessage) {\n lines.push(\"\", \"```\", scenario.errorMessage.trim(), \"```\");\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * A failed scenario rendered as an investigation prompt for an AI agent — the\n * \"cheap to verify\" loop: hand the agent the failing behaviour + error verbatim.\n */\nexport function scenarioToPrompt(scenario: ReportScenario): string {\n const lines: string[] = [\n `A test scenario is ${scenario.status}. Investigate the likely cause and propose a fix.`,\n \"\",\n `Scenario: ${scenario.title}`,\n \"Steps:\",\n ];\n for (const step of scenario.steps) {\n const mark = step.status === \"failed\" ? \" ⟵ failed here\" : \"\";\n lines.push(` ${step.keyword} ${step.text}${mark}`);\n }\n if (scenario.errorMessage) {\n lines.push(\"\", \"Error:\", scenario.errorMessage.trim());\n }\n if (scenario.errorStack) {\n lines.push(\"\", \"Stack:\", scenario.errorStack.trim());\n }\n return lines.join(\"\\n\");\n}\n\n/** Absolute permalink to a scenario in the current document. */\nexport function scenarioPermalink(scenario: ReportScenario): string {\n if (typeof location === \"undefined\") return `#${scenario.id}`;\n return `${location.href.split(\"#\")[0]}#${scenario.id}`;\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import type { ReportFeature } from \"executable-stories-core\";\nimport { ReportScenario } from \"./ReportScenario\";\n\nexport interface ReportScenarioListProps {\n feature: ReportFeature;\n}\n\nexport function ReportScenarioList({ feature }: ReportScenarioListProps) {\n return (\n <>\n {feature.scenarios.map((scenario) => (\n <ReportScenario key={scenario.id} scenario={scenario} />\n ))}\n </>\n );\n}\n","import type { ReportFeature as ReportFeatureT } from \"executable-stories-core\";\nimport { ReportScenarioList } from \"./ReportScenarioList\";\nimport { useCollapse } from \"../interactive/collapse-context\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportFeatureProps {\n feature: ReportFeatureT;\n}\n\n/**\n * Feature group — the report's `.feature` card: a header bar with the feature\n * title + mono source path and ✓/✗/○ status counts on the right, over a stack\n * of scenario cards. Kept a semantic <section> (a region), not a shadcn Card\n * div, so it stays a landmark and doesn't collide with the scenario cards'\n * `[data-slot=\"card\"]`.\n */\nexport function ReportFeature({ feature }: ReportFeatureProps) {\n const titleId = `${feature.id}-title`;\n const bodyId = `${feature.id}-body`;\n const s = feature.summary;\n const skipped = s.skipped + s.pending;\n const collapse = useCollapse();\n const collapsed = collapse?.isCollapsed(feature.id) ?? false;\n return (\n <section\n id={feature.id}\n data-slot=\"feature\"\n aria-labelledby={titleId}\n className=\"overflow-hidden rounded-xl border border-border bg-card shadow-sm\"\n >\n <div className=\"flex items-center justify-between gap-4 border-b border-border bg-muted/40 px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {collapse ? (\n <button\n type=\"button\"\n onClick={() => collapse.toggle(feature.id)}\n aria-expanded={!collapsed}\n aria-controls={bodyId}\n aria-label={`Toggle ${feature.title}`}\n className=\"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className={cn(\"inline-block text-xs transition-transform\", !collapsed && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n <div className=\"min-w-0\">\n <h2 id={titleId} className=\"text-sm font-semibold tracking-tight text-foreground\">\n {feature.title}\n </h2>\n <p className=\"mt-0.5 truncate font-mono text-xs text-muted-foreground\">{feature.sourceFile}</p>\n </div>\n </div>\n <div\n role=\"img\"\n className=\"flex shrink-0 items-center gap-2.5 font-mono text-xs font-medium\"\n aria-label={`${s.passed} passed, ${s.failed} failed, ${skipped} skipped`}\n >\n <span aria-hidden className=\"text-pass\">✓{s.passed}</span>\n <span aria-hidden className=\"text-fail\">✗{s.failed}</span>\n <span aria-hidden className=\"text-skip\">○{skipped}</span>\n </div>\n </div>\n <div id={bodyId} hidden={collapsed} className=\"flex flex-col gap-2 p-3\">\n <ReportScenarioList feature={feature} />\n </div>\n </section>\n );\n}\n","import { useReport } from \"../hooks/useReport\";\nimport { ReportFeature } from \"./ReportFeature\";\n\nexport function ReportFeatureList() {\n const report = useReport();\n return (\n <>\n {report.features.map((feature) => (\n <ReportFeature key={feature.id} feature={feature} />\n ))}\n </>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\n \"flex max-w-sm flex-col items-center gap-2 text-center\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\"text-lg font-medium tracking-tight\", className)}\n {...props}\n />\n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n","import { Empty, EmptyHeader, EmptyTitle } from \"@/components/ui/empty\";\n\nexport interface ReportEmptyProps {\n message?: string;\n}\n\nexport function ReportEmpty({ message }: ReportEmptyProps) {\n return (\n <Empty aria-live=\"polite\" className=\"border\">\n <EmptyHeader>\n <EmptyTitle>{message ?? \"No scenarios in this report.\"}</EmptyTitle>\n </EmptyHeader>\n </Empty>\n );\n}\n","import type { ReportSummary as ReportSummaryT } from \"executable-stories-core\";\nimport { useReport } from \"../hooks/useReport\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportSummaryProps {\n className?: string;\n}\n\nexport function ReportSummary({ className }: ReportSummaryProps) {\n const report = useReport();\n return (\n <ReportSummaryView\n summary={report.summary}\n {...(className !== undefined && { className })}\n ariaLabel=\"Run summary\"\n />\n );\n}\n\nexport interface ReportSummaryViewProps {\n summary: ReportSummaryT;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function ReportSummaryView({ summary, className, ariaLabel }: ReportSummaryViewProps) {\n return (\n <p className={cn(\"text-sm text-muted-foreground\", className)} aria-label={ariaLabel}>\n <span>\n <strong className=\"font-semibold text-foreground\">{summary.total}</strong> scenario\n {summary.total === 1 ? \"\" : \"s\"}\n </span>\n {\" · \"}\n <span data-status=\"passed\" className=\"text-pass\">{summary.passed} passed</span>\n {\" · \"}\n <span data-status=\"failed\" className=\"text-fail\">{summary.failed} failed</span>\n {summary.skipped > 0 ? (\n <>\n {\" · \"}\n <span data-status=\"skipped\" className=\"text-skip\">{summary.skipped} skipped</span>\n </>\n ) : null}\n {summary.pending > 0 ? (\n <>\n {\" · \"}\n <span data-status=\"pending\" className=\"text-pend\">{summary.pending} pending</span>\n </>\n ) : null}\n </p>\n );\n}\n","import { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { useReport } from \"../hooks/useReport\";\n\n/**\n * Run metadata line (started, duration, version, git SHA, CI) — the React\n * equivalent of the report's `.meta-info` block. Reads the top-level StoryReport\n * fields from context.\n */\nexport function ReportMeta() {\n const report = useReport();\n\n const items: Array<{ label: string; value: React.ReactNode }> = [];\n\n if (report.startedAtMs) {\n items.push({ label: \"Started\", value: new Date(report.startedAtMs).toLocaleString() });\n }\n if (report.durationMs) {\n items.push({ label: \"Duration\", value: formatDuration(report.durationMs) });\n }\n if (report.packageVersion) {\n items.push({ label: \"Version\", value: report.packageVersion });\n }\n if (report.gitSha) {\n items.push({ label: \"Commit\", value: report.gitSha.slice(0, 8) });\n }\n if (report.ci) {\n items.push({\n label: \"CI\",\n value: report.ci.url ? (\n <a href={report.ci.url} target=\"_blank\" rel=\"noreferrer noopener\" className=\"text-primary underline underline-offset-2\">\n {report.ci.name}\n {report.ci.buildNumber ? ` #${report.ci.buildNumber}` : \"\"}\n </a>\n ) : (\n `${report.ci.name}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : \"\"}`\n ),\n });\n }\n\n if (items.length === 0) return null;\n\n return (\n <dl aria-label=\"Run metadata\" className=\"flex flex-wrap gap-x-6 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item) => (\n <div key={item.label} className=\"flex gap-1.5\">\n <dt className=\"font-medium\">{item.label}</dt>\n <dd className=\"font-mono text-foreground\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import type { ReportParseError } from \"../result\";\n\nexport interface ReportSchemaErrorProps {\n error: ReportParseError;\n}\n\nexport function ReportSchemaError({ error }: ReportSchemaErrorProps) {\n return (\n <section className=\"es-schema-error\" role=\"alert\" aria-live=\"assertive\">\n <p>\n <strong>Report could not be displayed.</strong>\n </p>\n <p>{error.message}</p>\n {error.code === \"SCHEMA_VERSION_MISMATCH\" ? (\n <p>\n The report bundle is newer than this version of <code>executable-stories-react</code>.\n Upgrade the package, or regenerate the report with an older formatters CLI.\n </p>\n ) : null}\n {error.issues && error.issues.length > 0 ? (\n <details>\n <summary>{error.issues.length} validation issue{error.issues.length === 1 ? \"\" : \"s\"}</summary>\n <pre>\n {error.issues\n .slice(0, 20)\n .map((i) => `${i.path}: ${i.message}`)\n .join(\"\\n\")}\n </pre>\n </details>\n ) : null}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { ReportParseError } from \"../result\";\nimport { cn } from \"../lib/utils\";\nimport { ReportSummary } from \"./ReportSummary\";\nimport { ReportMeta } from \"./ReportMeta\";\nimport { ReportSchemaError } from \"./ReportSchemaError\";\n\n/**\n * The report's title block — `<h1>` + summary + meta. Shared by the static\n * `Report` header and the interactive `ReportInteractive` header so the two\n * views can't drift on the no-JS fallback.\n */\nexport function ReportTitleBlock({ title }: { title?: string }) {\n return (\n <>\n <h1>{title ?? \"Story Report\"}</h1>\n <ReportSummary />\n <ReportMeta />\n </>\n );\n}\n\n/**\n * The `<main>` landmark shown when the report failed to parse. Both entrypoints\n * render the identical shell on a `Result` error, so it lives here once.\n */\nexport function ReportErrorShell({\n error,\n className,\n title,\n dataTheme,\n}: {\n error: ReportParseError;\n className?: string;\n title?: string;\n dataTheme?: \"light\" | \"dark\";\n}): ReactNode {\n return (\n <main className={cn(\"es-report\", className)} aria-label={title ?? \"Test report\"} data-theme={dataTheme}>\n <ReportSchemaError error={error} />\n </main>\n );\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useId,\n type ChangeEvent,\n type KeyboardEvent,\n} from \"react\";\n\nexport interface ReportSearchProps {\n value: string;\n onChange: (next: string) => void;\n matchedCount?: number;\n totalCount?: number;\n placeholder?: string;\n className?: string;\n}\n\nexport const ReportSearch = forwardRef<HTMLInputElement, ReportSearchProps>(\n function ReportSearch(props, ref) {\n const {\n value,\n onChange,\n matchedCount,\n totalCount,\n placeholder = \"Search scenarios, tags, or step text…\",\n className,\n } = props;\n const inputId = useId();\n const showCounts =\n typeof matchedCount === \"number\" && typeof totalCount === \"number\";\n\n function handleChange(e: ChangeEvent<HTMLInputElement>) {\n onChange(e.target.value);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Escape\" && value !== \"\") {\n onChange(\"\");\n e.preventDefault();\n }\n }\n\n return (\n <div className={[\"es-search\", className].filter(Boolean).join(\" \")}>\n <label htmlFor={inputId} className=\"es-search-label\">\n Search\n </label>\n <input\n ref={ref}\n id={inputId}\n type=\"search\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n aria-keyshortcuts=\"/\"\n />\n {showCounts ? (\n <span className=\"es-search-counts\" aria-live=\"polite\">\n {value\n ? `${matchedCount} of ${totalCount}`\n : `${totalCount} total`}\n </span>\n ) : null}\n </div>\n );\n },\n);\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { FailureRef } from \"./filter\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\n\nexport interface ReportFailureBannerProps {\n failures: readonly FailureRef[];\n}\n\nexport function ReportFailureBanner({ failures }: ReportFailureBannerProps) {\n const first = failures[0];\n\n const jumpToFirst = useCallback(() => {\n if (!first) return;\n scrollToScenarioId(first.scenarioId);\n }, [first]);\n\n if (failures.length === 0) return null;\n\n // A live status region: `role=\"status\"` is not a valid role on <aside>\n // (whose implicit role is `complementary`), so use a <div> to carry it.\n return (\n <div\n className=\"es-failure-banner\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Failure summary\"\n >\n <span className=\"es-failure-banner-text\">\n <strong>{failures.length}</strong>{\" \"}\n failure{failures.length === 1 ? \"\" : \"s\"}\n </span>\n <button\n type=\"button\"\n className=\"es-failure-banner-jump\"\n onClick={jumpToFirst}\n aria-label=\"Jump to first failure\"\n >\n Jump to first ↓\n </button>\n </div>\n );\n}\n","/**\n * Scroll helpers that honour `prefers-reduced-motion`.\n *\n * JS `scrollIntoView({ behavior: \"smooth\" })` bypasses the CSS\n * `scroll-behavior` cascade, so reduced-motion users must be handled\n * explicitly here rather than in the stylesheet.\n */\n\n/** True when the user has asked the OS to minimise non-essential motion. */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport interface ScrollToScenarioOptions {\n /** Replace the URL hash with `#<scenarioId>` after scrolling. Defaults to true. */\n updateHash?: boolean;\n}\n\n/**\n * Scrolls a scenario into view by id. No-op in SSR or when the element is\n * absent. Uses an instant jump for reduced-motion users, smooth otherwise.\n */\nexport function scrollToScenarioId(\n scenarioId: string,\n options: ScrollToScenarioOptions = {},\n): void {\n if (typeof document === \"undefined\") return;\n const el = document.getElementById(scenarioId);\n if (!el) return;\n el.scrollIntoView({\n behavior: prefersReducedMotion() ? \"auto\" : \"smooth\",\n block: \"start\",\n });\n if (options.updateHash !== false && typeof history !== \"undefined\") {\n history.replaceState(null, \"\", `#${scenarioId}`);\n }\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport interface ReportShortcutsHelpProps {\n open: boolean;\n onClose: () => void;\n}\n\nconst SHORTCUTS: ReadonlyArray<{ keys: string; description: string }> = [\n { keys: \"/\", description: \"Focus search\" },\n { keys: \"f\", description: \"Jump to next failure\" },\n { keys: \"Shift+F\", description: \"Jump to previous failure\" },\n { keys: \"Esc\", description: \"Clear search / close dialog\" },\n { keys: \"?\", description: \"Toggle this help\" },\n];\n\nexport function ReportShortcutsHelp({ open, onClose }: ReportShortcutsHelpProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open && !dialog.open) dialog.showModal();\n else if (!open && dialog.open) dialog.close();\n }, [open]);\n\n return (\n <dialog\n ref={dialogRef}\n className=\"es-shortcuts-help\"\n aria-label=\"Keyboard shortcuts\"\n onClose={onClose}\n >\n <h2>Keyboard shortcuts</h2>\n <dl>\n {SHORTCUTS.map((s) => (\n <div key={s.keys}>\n <dt>\n <kbd>{s.keys}</kbd>\n </dt>\n <dd>{s.description}</dd>\n </div>\n ))}\n </dl>\n <form method=\"dialog\">\n <button type=\"submit\" className=\"es-shortcuts-close\">Close</button>\n </form>\n </dialog>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport interface KeyboardShortcutHandlers {\n onFocusSearch?: () => void;\n onNextFailure?: () => void;\n onPrevFailure?: () => void;\n onToggleHelp?: () => void;\n onEscape?: () => void;\n onExpandAll?: () => void;\n onCollapseAll?: () => void;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\n/**\n * Attaches one keydown listener for the lifetime of the component, regardless\n * of how often the consumer passes a fresh handlers object. Handlers are read\n * from a ref so each keypress hits the latest version — see Vercel's\n * advanced-use-latest pattern.\n */\nexport function useKeyboardShortcuts(handlers: KeyboardShortcutHandlers): void {\n const ref = useRef(handlers);\n ref.current = handlers;\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n const h = ref.current;\n if (e.key === \"Escape\") {\n h.onEscape?.();\n return;\n }\n\n if (isEditableTarget(e.target)) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n switch (e.key) {\n case \"/\":\n h.onFocusSearch?.();\n e.preventDefault();\n return;\n case \"?\":\n h.onToggleHelp?.();\n e.preventDefault();\n return;\n case \"f\":\n h.onNextFailure?.();\n e.preventDefault();\n return;\n case \"F\":\n h.onPrevFailure?.();\n e.preventDefault();\n return;\n case \"e\":\n h.onExpandAll?.();\n e.preventDefault();\n return;\n case \"c\":\n h.onCollapseAll?.();\n e.preventDefault();\n return;\n default:\n return;\n }\n }\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, []);\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\n\n/**\n * Scrolls to a scenario by URL hash on mount and whenever the hash changes.\n * No-op in SSR (only runs in useEffect). Honours `prefers-reduced-motion`.\n */\nexport function useDeepLinkScroll(): void {\n useEffect(() => {\n function scrollToHash() {\n const hash = window.location.hash.replace(/^#/, \"\");\n if (!hash) return;\n // The hash is already in the URL; don't rewrite history on arrival.\n requestAnimationFrame(() => {\n scrollToScenarioId(hash, { updateHash: false });\n });\n }\n scrollToHash();\n window.addEventListener(\"hashchange\", scrollToHash);\n return () => window.removeEventListener(\"hashchange\", scrollToHash);\n }, []);\n}\n","/**\n * Pure functions for filtering a StoryReport by a search query.\n * Used by <ReportInteractive>. Kept side-effect-free so it can be unit-tested.\n */\n\nimport type {\n ReportScenario,\n ReportFeature,\n StoryReport,\n} from \"executable-stories-core\";\n\nexport type StatusFilter = \"all\" | \"passed\" | \"failed\" | \"skipped\" | \"pending\";\n\nexport interface FilterCriteria {\n query?: string;\n status?: StatusFilter;\n /** Scenario matches if it carries ANY of these tags (empty = no tag filter). */\n tags?: string[];\n}\n\nexport function normalizeQuery(query: string): string {\n return query.trim().toLowerCase();\n}\n\n/** Unique scenario tags across the whole report, in first-seen order. */\nexport function allTags(report: StoryReport): string[] {\n const seen = new Set<string>();\n for (const feature of report.features) {\n for (const scenario of feature.scenarios) {\n for (const tag of scenario.tags) seen.add(tag);\n }\n }\n return [...seen];\n}\n\nfunction queryMatches(scenario: ReportScenario, q: string): boolean {\n if (q === \"\") return true;\n if (scenario.title.toLowerCase().includes(q)) return true;\n for (const tag of scenario.tags) {\n if (tag.toLowerCase().includes(q)) return true;\n }\n for (const step of scenario.steps) {\n if (step.text.toLowerCase().includes(q)) return true;\n }\n return false;\n}\n\nfunction scenarioMatches(\n scenario: ReportScenario,\n q: string,\n status: StatusFilter,\n tags: string[],\n): boolean {\n if (status !== \"all\" && scenario.status !== status) return false;\n if (tags.length > 0 && !tags.some((t) => scenario.tags.includes(t))) return false;\n return queryMatches(scenario, q);\n}\n\nfunction summarizeScenarios(scenarios: ReportScenario[]) {\n let total = 0,\n passed = 0,\n failed = 0,\n skipped = 0,\n pending = 0,\n durationMs = 0;\n for (const s of scenarios) {\n total += 1;\n durationMs += s.durationMs;\n if (s.status === \"passed\") passed += 1;\n else if (s.status === \"failed\") failed += 1;\n else if (s.status === \"skipped\") skipped += 1;\n else pending += 1;\n }\n return { total, passed, failed, skipped, pending, durationMs };\n}\n\nexport function filterReport(report: StoryReport, criteria: string | FilterCriteria): StoryReport {\n const c: FilterCriteria = typeof criteria === \"string\" ? { query: criteria } : criteria;\n const q = normalizeQuery(c.query ?? \"\");\n const status = c.status ?? \"all\";\n const tags = c.tags ?? [];\n if (q === \"\" && status === \"all\" && tags.length === 0) return report;\n\n const features: ReportFeature[] = [];\n let topTotal = 0,\n topPassed = 0,\n topFailed = 0,\n topSkipped = 0,\n topPending = 0,\n topDuration = 0;\n\n for (const feature of report.features) {\n const matched = feature.scenarios.filter((s) => scenarioMatches(s, q, status, tags));\n if (matched.length === 0) continue;\n const summary = summarizeScenarios(matched);\n features.push({ ...feature, summary, scenarios: matched });\n topTotal += summary.total;\n topPassed += summary.passed;\n topFailed += summary.failed;\n topSkipped += summary.skipped;\n topPending += summary.pending;\n topDuration += summary.durationMs;\n }\n\n return {\n ...report,\n summary: {\n total: topTotal,\n passed: topPassed,\n failed: topFailed,\n skipped: topSkipped,\n pending: topPending,\n durationMs: topDuration,\n },\n features,\n };\n}\n\nexport interface FailureRef {\n featureId: string;\n scenarioId: string;\n scenarioTitle: string;\n errorMessage?: string;\n}\n\nexport function listFailures(report: StoryReport): FailureRef[] {\n const out: FailureRef[] = [];\n for (const feature of report.features) {\n for (const scenario of feature.scenarios) {\n if (scenario.status === \"failed\") {\n const ref: FailureRef = {\n featureId: feature.id,\n scenarioId: scenario.id,\n scenarioTitle: scenario.title,\n };\n if (scenario.errorMessage !== undefined) {\n ref.errorMessage = scenario.errorMessage;\n }\n out.push(ref);\n }\n }\n }\n return out;\n}\n","\"use client\";\n\nimport type { StatusFilter } from \"./filter\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportFiltersProps {\n /** Status options to show (only those present in the run), with counts. */\n statuses: Array<{ key: StatusFilter; label: string; count: number }>;\n status: StatusFilter;\n onStatus: (status: StatusFilter) => void;\n tags: string[];\n activeTags: string[];\n onToggleTag: (tag: string) => void;\n}\n\nexport function ReportFilters({\n statuses,\n status,\n onStatus,\n tags,\n activeTags,\n onToggleTag,\n}: ReportFiltersProps) {\n if (statuses.length === 0 && tags.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-2\">\n {statuses.length > 0 ? (\n <div role=\"group\" aria-label=\"Filter by status\" className=\"flex flex-wrap gap-1\">\n {statuses.map((opt) => {\n const active = status === opt.key;\n return (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={active}\n onClick={() => onStatus(active && opt.key !== \"all\" ? \"all\" : opt.key)}\n className={cn(\n \"cursor-pointer rounded-md border px-2 py-1 text-xs transition-colors\",\n active\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border text-muted-foreground hover:bg-muted hover:text-foreground\",\n )}\n >\n {opt.label}\n <span className=\"ml-1 font-mono opacity-70\">{opt.count}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n {tags.length > 0 ? (\n <ul aria-label=\"Filter by tag\" className=\"flex flex-wrap gap-1.5\">\n {tags.map((tag) => {\n const active = activeTags.includes(tag);\n return (\n <li key={tag}>\n <button\n type=\"button\"\n aria-pressed={active}\n onClick={() => onToggleTag(tag)}\n className=\"cursor-pointer\"\n >\n <Badge variant={active ? \"default\" : \"tag\"}>{tag}</Badge>\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useReport } from \"../hooks/useReport\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\nimport { cn } from \"@/lib/utils\";\n\nconst DOT: Record<string, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\n/**\n * Sticky table-of-contents nav for the interactive report. Reads the (filtered)\n * report from context, so it syncs with search/status/tag filters automatically.\n * Tracks the scenario nearest the top of the viewport via IntersectionObserver.\n */\nexport function ReportToc() {\n const report = useReport();\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const scenarioIds = useMemo(\n () => report.features.flatMap((f) => f.scenarios.map((s) => s.id)),\n [report],\n );\n\n useEffect(() => {\n if (typeof IntersectionObserver === \"undefined\") return;\n const els = scenarioIds\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n if (els.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (visible[0]) setActiveId(visible[0].target.id);\n },\n { rootMargin: \"-8% 0px -80% 0px\" },\n );\n els.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [scenarioIds]);\n\n if (report.features.length === 0) return null;\n\n return (\n <nav\n aria-label=\"Table of contents\"\n className=\"sticky top-4 hidden h-fit w-56 shrink-0 self-start text-xs lg:block\"\n >\n <ul className=\"flex flex-col gap-3\">\n {report.features.map((feature) => (\n <li key={feature.id}>\n <p className=\"mb-1 truncate font-semibold text-foreground\">{feature.title}</p>\n <ul className=\"flex flex-col\">\n {feature.scenarios.map((scenario) => {\n const active = activeId === scenario.id;\n return (\n <li key={scenario.id}>\n <a\n href={`#${scenario.id}`}\n onClick={(e) => {\n e.preventDefault();\n scrollToScenarioId(scenario.id, { updateHash: true });\n }}\n aria-current={active ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-1.5 truncate border-l-2 py-0.5 pl-2 hover:text-foreground\",\n active\n ? \"border-primary font-medium text-foreground\"\n : \"border-border text-muted-foreground\",\n )}\n >\n <span aria-hidden className={cn(\"shrink-0\", DOT[scenario.status])}>•</span>\n <span className=\"truncate\">{scenario.title}</span>\n </a>\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\ntype Theme = \"light\" | \"dark\";\nconst KEY = \"es-theme\";\n\nfunction applyTheme(theme: Theme): void {\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-theme\", theme);\n }\n}\n\nfunction initialTheme(): Theme {\n if (typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(KEY);\n if (stored === \"light\" || stored === \"dark\") return stored;\n }\n if (typeof document !== \"undefined\" && document.documentElement.getAttribute(\"data-theme\") === \"dark\") {\n return \"dark\";\n }\n if (typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return \"dark\";\n }\n return \"light\";\n}\n\n/**\n * Dark/light theme toggle for the standalone report. Flips `data-theme` on\n * <html> (the Tailwind `dark` variant keys on any ancestor) and persists the\n * choice. No-ops gracefully outside the browser.\n */\nexport function useTheme(): { theme: Theme; toggle: () => void } {\n const [theme, setTheme] = useState<Theme>(\"light\");\n\n useEffect(() => {\n const t = initialTheme();\n setTheme(t);\n applyTheme(t);\n }, []);\n\n const toggle = useCallback(() => {\n setTheme((prev) => {\n const next: Theme = prev === \"dark\" ? \"light\" : \"dark\";\n applyTheme(next);\n try {\n localStorage.setItem(KEY, next);\n } catch {\n /* disabled / quota */\n }\n return next;\n });\n }, []);\n\n return { theme, toggle };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { Result } from \"../result\";\nimport { ReportInteractive } from \"./ReportInteractive\";\nimport { buildIslandRenderers } from \"./island-renderers\";\n\nexport interface ReportInteractiveIslandProps {\n report: StoryReport | Result<StoryReport>;\n title?: string;\n className?: string;\n hideHeader?: boolean;\n /** Render code blocks with CDN highlight.js (default true). */\n syntaxHighlighting?: boolean;\n /** Render `story.mermaid(...)` blocks as CDN-loaded SVG diagrams (default true). */\n mermaid?: boolean;\n}\n\n/**\n * Self-contained interactive island for host frameworks that hydrate this as a\n * client island (e.g. Astro `<ReportInteractiveIsland client:load/>`).\n *\n * Frameworks like Astro serialize island props as JSON, so they CANNOT pass the\n * `renderers` functions to <ReportInteractive> directly — which is why a host\n * would otherwise fall back to a separate post-hydration script that mutates the\n * island's DOM (and gets clobbered when the island re-renders). This wrapper\n * builds the React-OWNED highlighting + mermaid renderers internally, so the\n * enhancements live inside the React tree and survive every re-render. The\n * heavy libraries load from a CDN at runtime, so the host bundle stays lean.\n */\nexport function ReportInteractiveIsland({\n report,\n title,\n className,\n hideHeader,\n syntaxHighlighting = true,\n mermaid = true,\n}: ReportInteractiveIslandProps) {\n const renderers = useMemo(\n () => buildIslandRenderers({ syntaxHighlighting, mermaid }),\n [syntaxHighlighting, mermaid],\n );\n return (\n <ReportInteractive\n report={report}\n title={title}\n className={className}\n hideHeader={hideHeader}\n renderers={renderers}\n />\n );\n}\n","\"use client\";\n\n/**\n * Built-in renderer overrides for the standalone report island.\n *\n * The static HTML emits readable `<pre data-mermaid>` / `<pre><code>` fallbacks.\n * When the interactive island takes over (createRoot), it OWNS that DOM and will\n * clobber any externally-applied highlight spans / detach mermaid's injected SVG\n * on its next render. So highlighting + mermaid must live INSIDE the React tree\n * (rendered into state, owned by React) rather than as post-processing scripts\n * mutating island-managed nodes. These renderers do exactly that, loading the\n * heavy libraries from a CDN at runtime so they never bloat the inlined island.\n */\n\nimport { createElement, useEffect, useState } from \"react\";\nimport type { ReportDocCode } from \"executable-stories-core\";\nimport { MermaidView, type MermaidApi } from \"../components/doc/MermaidView\";\nimport { CodeFigure } from \"../components/doc/DocCode\";\nimport type { BuiltinRenderers } from \"../renderers\";\nimport { cn } from \"../lib/utils\";\n\n// CDN URLs mirror ssr-entry's cdnAssets so the standalone report stays\n// version-pinned and works offline-degraded (falls back to the readable source).\nconst HLJS_ESM = \"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/es/highlight.min.js\";\nconst MERMAID_ESM = \"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs\";\n\n/**\n * Import a module from a CDN URL once, caching the promise. The URL is passed as\n * a variable so it stays opaque to the bundler — the heavy library is loaded at\n * runtime, never inlined into the island. `default ?? namespace` tolerates both\n * default and namespace CDN builds.\n */\nfunction cachedCdnModule<T>(url: string): () => Promise<T> {\n let loader: Promise<T> | undefined;\n return () => {\n // Intentional runtime dynamic import of a CDN URL (not bundled into the island).\n // eslint-disable-next-line no-restricted-syntax\n loader ??= import(/* @vite-ignore */ /* webpackIgnore: true */ url).then((m) => (m.default ?? m) as T);\n return loader;\n };\n}\n\nconst loadMermaidFromCdn = cachedCdnModule<MermaidApi>(MERMAID_ESM);\n\ninterface Hljs {\n highlight(code: string, opts: { language: string; ignoreIllegals?: boolean }): { value: string };\n highlightAuto(code: string): { value: string };\n getLanguage(name: string): unknown;\n}\nconst loadHljs = cachedCdnModule<Hljs>(HLJS_ESM);\n\n/**\n * Code block whose syntax highlighting is produced by highlight.js loaded from\n * the CDN, rendered into React-owned markup via state. Falls back to the plain\n * (escaped) source before load and on any failure.\n */\nfunction CdnHighlightedCode({ entry }: { entry: ReportDocCode }) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const hljs = await loadHljs();\n const lang = entry.lang && hljs.getLanguage(entry.lang) ? entry.lang : undefined;\n const result = lang\n ? hljs.highlight(entry.content, { language: lang, ignoreIllegals: true })\n : hljs.highlightAuto(entry.content);\n if (!cancelled) setHtml(result.value);\n } catch {\n if (!cancelled) setHtml(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [entry.content, entry.lang]);\n\n return (\n <CodeFigure label={entry.label}>\n {html !== null ? (\n <code\n className={cn(\"hljs font-mono text-xs\", entry.lang && `language-${entry.lang}`)}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <code className={cn(\"font-mono text-xs\", entry.lang && `language-${entry.lang}`)}>{entry.content}</code>\n )}\n </CodeFigure>\n );\n}\n\nexport interface IslandRendererOptions {\n syntaxHighlighting: boolean;\n mermaid: boolean;\n}\n\n/**\n * Build the BuiltinRenderers map the island passes to <ReportInteractive>.\n * Created once at mount so the renderer functions stay referentially stable.\n */\nexport function buildIslandRenderers(opts: IslandRendererOptions): BuiltinRenderers {\n const renderers: BuiltinRenderers = {};\n if (opts.mermaid) {\n renderers.mermaid = (entry) => createElement(MermaidView, { entry, load: loadMermaidFromCdn });\n }\n if (opts.syntaxHighlighting) {\n renderers.code = (entry) => createElement(CdnHighlightedCode, { entry });\n }\n return renderers;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReportDocMermaid } from \"executable-stories-core\";\nimport { MermaidSource } from \"./DocMermaid\";\n\nexport type MermaidApi = typeof import(\"mermaid\").default;\nexport type MermaidLoader = () => Promise<MermaidApi>;\n\nfunction prefersDark(el: HTMLElement | null): boolean {\n const themed = el?.closest<HTMLElement>(\"[data-theme]\");\n if (themed?.dataset.theme === \"dark\") return true;\n if (themed?.dataset.theme === \"light\") return false;\n return typeof window !== \"undefined\" && !!window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Presentational mermaid renderer with the loader INJECTED — it contains no\n * literal `import(\"mermaid\")`, so a bundler following this module never pulls\n * mermaid in. `MermaidDiagram` wraps this with the installed-package loader;\n * the standalone report island wraps it with a CDN loader so the heavy library\n * never bloats the inlined island bundle.\n *\n * Draws the diagram to inline SVG (React-owned via state, so an island\n * re-render can't clobber it), redraws when the report's `data-theme` flips,\n * and falls back to `<MermaidSource>` (the readable, agent-friendly code) on\n * the server, before load, and on any error.\n */\nexport function MermaidView({ entry, load }: { entry: ReportDocMermaid; load: MermaidLoader }) {\n const ref = useRef<HTMLElement>(null);\n const [svg, setSvg] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const draw = async () => {\n try {\n const mermaid = await load();\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: \"strict\",\n theme: prefersDark(ref.current) ? \"dark\" : \"default\",\n });\n const id = `es-mermaid-${Math.random().toString(36).slice(2)}`;\n const { svg: rendered } = await mermaid.render(id, entry.code);\n if (!cancelled) setSvg(rendered);\n } catch {\n if (!cancelled) setSvg(null);\n }\n };\n void draw();\n\n // Redraw when the report toggles theme on an ancestor.\n const themed = ref.current?.closest<HTMLElement>(\"[data-theme]\");\n const observer = themed ? new MutationObserver(() => void draw()) : undefined;\n observer?.observe(themed!, { attributes: true, attributeFilter: [\"data-theme\"] });\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n };\n }, [entry.code, load]);\n\n if (svg) {\n return (\n <figure ref={ref} className=\"my-3\">\n {entry.title ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{entry.title}</figcaption>\n ) : null}\n {/* role=\"img\" presents the diagram as a single labelled graphic. */}\n <div\n role=\"img\"\n aria-label={entry.title ?? \"Mermaid diagram\"}\n className=\"overflow-x-auto rounded-md border border-border bg-card p-3 [&_svg]:mx-auto [&_svg]:h-auto [&_svg]:max-w-full\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </figure>\n );\n }\n\n // Pre-render / fallback: the readable source. The ref lets the effect locate\n // the themed ancestor from the same DOM position before the SVG swaps in.\n return <MermaidSource entry={entry} ref={ref} />;\n}\n"],"mappings":";;;AAEA;AAAA,EACE,eAAAA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;ACeA,IAAM,KAAK,CAAI,UAAwB,EAAE,IAAI,MAAM,KAAK;AASxD,SAAS,aAAa,OAA+D;AAC1F,MACE,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,SACR,OAAQ,MAA0B,OAAO,WACzC;AACA,WAAO;AAAA,EACT;AACA,SAAO,GAAG,KAAoB;AAChC;;;AC1CA,SAAS,eAA+B;;;ACAxC,SAAS,qBAAqB;AAUvB,IAAM,gBAAgB,cAAyC,IAAI;;;ADmBjE;AAjBT,IAAM,eAAgC,CAAC;AACvC,IAAM,kBAAoC,CAAC;AAEpC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA,iBAAiB,mBAAmB;AAAA,MACpC,WAAW,aAAa;AAAA,IAC1B;AAAA,IACA,CAAC,QAAQ,iBAAiB,SAAS;AAAA,EACrC;AACA,SAAO,oBAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AACzD;;;AE9BA,SAAS,kBAAkB;AAGpB,SAAS,YAAY;AAC1B,QAAM,MAAM,WAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AACb;;;ACVA,SAAS,kBAAAC,uBAAsB;;;ACA/B,SAAS,sBAAsB;;;ACEtB,gBAAAC,YAAA;AADF,SAAS,QAAQ,EAAE,MAAM,GAA6B;AAC3D,SAAO,gBAAAA,KAAC,OAAE,WAAU,sCAAsC,gBAAM,MAAK;AACvE;;;ACJA,OAAuB;AACvB,SAAS,WAA8B;AACvC,SAAS,iBAAiB;;;ACF1B,SAAS,YAA6B;AACtC,SAAS,eAAe;AAGjB,SAAS,MAAM,QAA8B;AAClD,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADAA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAKK;AACH,SAAO,UAAU;AAAA,IACf,gBAAgB;AAAA,IAChB;AAAA,IACA,OAAO;AAAA,MACL,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MACnD,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACH;;;AE9CU,gBAAAC,YAAA;AALH,SAAS,OAAO,EAAE,MAAM,GAA4B;AACzD,SACE,gBAAAA,KAAC,QAAG,WAAU,+BAA8B,cAAW,QACpD,gBAAM,MAAM,IAAI,CAAC,MAChB,gBAAAA,KAAC,QACC,0BAAAA,KAAC,SAAM,SAAQ,OAAO,aAAE,KADjB,CAET,CACD,GACH;AAEJ;;;ACEI,SACE,OAAAC,MADF;AAbJ,SAAS,YAAY,OAAwB;AAC3C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,KAAK;AAChF,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,SAAS,MAAM,EAAE,MAAM,GAA2B;AACvD,SACE,qBAAC,QAAG,WAAU,sDACZ;AAAA,oBAAAA,KAAC,QAAG,WAAU,uCAAuC,gBAAM,OAAM;AAAA,IACjE,gBAAAA,KAAC,QAAG,WAAU,6BAA6B,sBAAY,MAAM,KAAK,GAAE;AAAA,KACtE;AAEJ;;;ACpBA,SAAS,cAAAC,mBAAkB;AAI3B,IAAMC,gBAAgC,CAAC;AACvC,IAAMC,mBAAoC,CAAC;AAEpC,SAAS,qBAAsC;AACpD,QAAM,MAAMC,YAAW,aAAa;AACpC,SAAO,KAAK,mBAAmBF;AACjC;AAEO,SAAS,sBAAwC;AACtD,QAAM,MAAME,YAAW,aAAa;AACpC,SAAO,KAAK,aAAaD;AAC3B;;;ACHI,SAcO,UAZH,OAAAE,MAFJ,QAAAC,aAAA;AAFG,SAAS,WAAW,EAAE,OAAO,SAAS,GAA4C;AACvF,SACE,gBAAAA,MAAC,YAAO,WAAU,QACf;AAAA,YACC,gBAAAD,KAAC,gBAAW,WAAU,oDAAoD,iBAAM,IAC9E;AAAA,IACJ,gBAAAA,KAAC,SAAI,UAAU,GAAG,WAAU,2CACzB,UACH;AAAA,KACF;AAEJ;AAEO,SAAS,QAAQ,EAAE,MAAM,GAA6B;AAC3D,QAAM,YAAY,oBAAoB;AACtC,MAAI,UAAU,MAAM;AAClB,WAAO,gBAAAA,KAAA,YAAG,oBAAU,KAAK,KAAK,GAAE;AAAA,EAClC;AACA,SACE,gBAAAA,KAAC,cAAW,OAAO,MAAM,OACvB,0BAAAA,KAAC,UAAK,WAAW,GAAG,qBAAqB,MAAM,QAAQ,YAAY,MAAM,IAAI,EAAE,GAC5E,gBAAM,SACT,GACF;AAEJ;;;AC7BQ,gBAAAE,MAKA,QAAAC,aALA;AAJD,SAAS,SAAS,EAAE,MAAM,GAA8B;AAC7D,SACE,gBAAAA,MAAC,YAAO,WAAU,QACf;AAAA,UAAM,QACL,gBAAAD,KAAC,gBAAW,WAAU,oDACnB,gBAAM,OACT,IACE;AAAA,IACJ,gBAAAA,KAAC,SAAI,UAAU,GAAG,WAAU,mDAC1B,0BAAAC,MAAC,WAAM,WAAU,kCACf;AAAA,sBAAAD,KAAC,WACC,0BAAAA,KAAC,QAAG,WAAU,eACX,gBAAM,QAAQ,IAAI,CAAC,MAClB,gBAAAA,KAAC,QAAW,OAAM,OAAM,WAAU,4DAC/B,eADM,CAET,CACD,GACH,GACF;AAAA,MACA,gBAAAA,KAAC,WACE,gBAAM,KAAK,IAAI,CAAC,KAAK,MACpB,gBAAAA,KAAC,QACE,cAAI,IAAI,CAAC,MAAM,MACd,gBAAAA,KAAC,QAAW,WAAU,oDACnB,kBADM,CAET,CACD,KALM,CAMT,CACD,GACH;AAAA,OACF,GACF;AAAA,KACF;AAEJ;;;AChCI,gBAAAE,YAAA;AAFG,SAAS,QAAQ,EAAE,MAAM,GAA6B;AAC3D,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,KAAI;AAAA,MACJ,QAAO;AAAA,MAEN,gBAAM;AAAA;AAAA,EACT;AAEJ;;;ACbA,SAAS,cAAc;;;ACQhB,SAAS,QAAQ,OAA+C;AACrE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS,yBAAyB,KAAK,OAAO;AACpD,MAAI,UAAU,CAAC,YAAY,KAAK,OAAO,CAAC,KAAK,EAAE,EAAG,QAAO;AACzD,SAAO;AACT;;;ADwBW,qBAAAC,WAAA,OAAAC,MAIP,QAAAC,aAJO;AApBX,SAAS,cAAc,OAAuB;AAC5C,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,SAAS,iBAAiB,UAA0B;AAClD,QAAM,MAAM,OAAO,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AACnD,SAAO,IACJ,QAAQ,uCAAuC,EAAE,EACjD,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,mDAAmD,EAAE,EAC7D,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,gCAAgC,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,KAAK,cAAc,GAAG,CAAC,GAAG,EAC5F,QAAQ,gCAAgC,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,KAAK,cAAc,GAAG,CAAC,GAAG;AACjG;AAEO,SAAS,WAAW,EAAE,MAAM,GAAgC;AACjE,QAAM,YAAY,oBAAoB;AACtC,MAAI,UAAU,SAAS;AACrB,WAAO,gBAAAD,KAAAD,WAAA,EAAG,oBAAU,QAAQ,KAAK,GAAE;AAAA,EACrC;AACA,QAAM,OAAO,iBAAiB,MAAM,QAAQ;AAC5C,SACE,gBAAAE,MAAC,aAAQ,WAAU,gBAAe,cAAY,MAAM,OACjD;AAAA,UAAM,QAAQ,gBAAAD,KAAC,QAAG,WAAU,sCAAsC,gBAAM,OAAM,IAAQ;AAAA,IACvF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,yBAAyB,EAAE,QAAQ,KAAK;AAAA;AAAA,IAC1C;AAAA,KACF;AAEJ;;;AEtCI,SAwBO,YAAAE,WAtBH,OAAAC,MAFJ,QAAAC,aAAA;AAFG,SAAS,cAAc,EAAE,OAAO,IAAI,GAAwD;AACjG,SACE,gBAAAA,MAAC,YAAO,KAAU,WAAU,QAAO,cAAY,MAAM,SAAS,WAC3D;AAAA,UAAM,QACL,gBAAAD,KAAC,gBAAW,WAAU,oDAAoD,gBAAM,OAAM,IACpF;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,gBAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAU;AAAA,QAET,gBAAM;AAAA;AAAA,IACT;AAAA,KACF;AAEJ;AAQO,SAAS,WAAW,EAAE,MAAM,GAAgC;AACjE,QAAM,YAAY,oBAAoB;AACtC,MAAI,UAAU,SAAS;AACrB,WAAO,gBAAAA,KAAAD,WAAA,EAAG,oBAAU,QAAQ,KAAK,GAAE;AAAA,EACrC;AACA,SAAO,gBAAAC,KAAC,iBAAc,OAAc;AACtC;;;ACnCI,SACE,OAAAE,OADF,QAAAC,aAAA;AAFG,SAAS,cAAc,EAAE,MAAM,GAAmC;AACvE,SACE,gBAAAA,MAAC,YAAO,WAAU,QAChB;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,MAAM;AAAA,QACX,KAAK,MAAM,OAAO;AAAA,QAClB,SAAQ;AAAA,QACR,WAAU;AAAA;AAAA,IACZ;AAAA,IACC,MAAM,MAAM,gBAAAA,MAAC,gBAAW,WAAU,wCAAwC,gBAAM,KAAI,IAAgB;AAAA,KACvG;AAEJ;;;ACDI,SACE,OAAAE,OADF,QAAAC,aAAA;AAJG,SAAS,SAAS,EAAE,MAAM,GAA8B;AAC7D,QAAM,MAAM,QAAQ,MAAM,IAAI;AAC9B,QAAM,SAAS,QAAQ,MAAM,MAAM;AACnC,SACE,gBAAAA,MAAC,YAAO,WAAU,QAChB;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,UAAQ;AAAA,QACR,SAAQ;AAAA,QACP,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,QACrB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC5B,WAAU;AAAA;AAAA,IACZ;AAAA,IACC,MAAM,UACL,gBAAAA,MAAC,gBAAW,WAAU,sCAAsC,gBAAM,SAAQ,IACxE;AAAA,KACN;AAEJ;;;ACLM,SACE,OAAAE,OADF,QAAAC,aAAA;AAXC,SAAS,QAAQ,EAAE,MAAM,GAA6B;AAC3D,QAAM,SAAS,OAAO,MAAM,WAAW,WAAW,GAAG,MAAM,MAAM,OAAQ,MAAM,UAAU;AACzF,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,WAAW,QAAQ,MAAM,OAAO,MAAM,IAAI;AAIhD,QAAM,aAAa,MAAM,YAAY,SAAY,EAAE,QAAQ,MAAM,QAAQ,IAAI,EAAE,KAAK,YAAY,GAAG;AAEnG,SACE,gBAAAA,MAAC,YAAO,WAAU,wDAChB;AAAA,oBAAAA,MAAC,gBAAW,WAAU,8HACpB;AAAA,sBAAAD,MAAC,UAAM,gBAAM,SAAS,QAAO;AAAA,MAC5B,WACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,cAAW;AAAA,UACX,OAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,MAED,IACE;AAAA,OACN;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR;AAAA,QACA,WAAU;AAAA,QACV,OAAO,EAAE,OAAO;AAAA;AAAA,IAClB;AAAA,KACF;AAEJ;;;ACvCW,qBAAAE,WAAA,OAAAC,OAGP,QAAAC,aAHO;AAJJ,SAAS,UAAU,EAAE,MAAM,GAA+B;AAC/D,QAAM,YAAY,mBAAmB;AACrC,QAAM,WAAW,UAAU,MAAM,IAAI;AACrC,MAAI,UAAU;AACZ,WAAO,gBAAAD,MAAAD,WAAA,EAAG,mBAAS,KAAK,GAAE;AAAA,EAC5B;AACA,SACE,gBAAAE,MAAC,SAAI,WAAU,QAAO,aAAW,MAAM,MACrC;AAAA,oBAAAD,MAAC,OAAE,WAAU,kDAAkD,gBAAM,MAAK;AAAA,IAC1E,gBAAAA,MAAC,SAAI,UAAU,GAAG,WAAU,6EACzB,wBAAc,MAAM,IAAI,GAC3B;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;;;ACRa,gBAAAE,aAAA;AAHN,SAAS,SAAS,EAAE,MAAM,GAA8B;AAC7D,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,gBAAAA,MAAC,WAAQ,OAAc;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAO,OAAc;AAAA,IAC/B,KAAK;AACH,aAAO,gBAAAA,MAAC,SAAM,OAAc;AAAA,IAC9B,KAAK;AACH,aAAO,gBAAAA,MAAC,WAAQ,OAAc;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAA,MAAC,YAAS,OAAc;AAAA,IACjC,KAAK;AACH,aAAO,gBAAAA,MAAC,WAAQ,OAAc;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAA,MAAC,cAAW,OAAc;AAAA,IACnC,KAAK;AACH,aAAO,gBAAAA,MAAC,cAAW,OAAc;AAAA,IACnC,KAAK;AACH,aAAO,gBAAAA,MAAC,iBAAc,OAAc;AAAA,IACtC,KAAK;AACH,aAAO,gBAAAA,MAAC,YAAS,OAAc;AAAA,IACjC,KAAK;AACH,aAAO,gBAAAA,MAAC,WAAQ,OAAc;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAA,MAAC,aAAU,OAAc;AAAA,EACpC;AACF;;;AC/BI,qBAAAC,WAEI,OAAAC,aAFJ;AAHG,SAAS,iBAAiB,EAAE,QAAQ,GAA0B;AACnE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SACE,gBAAAA,MAAAD,WAAA,EACG,kBAAQ,IAAI,CAAC,OAAO,MACnB,gBAAAC,MAAC,YAAiB,SAAH,CAAiB,CACjC,GACH;AAEJ;;;ACSM,gBAAAC,aAAA;AAbN,IAAM,qBAAqB;AAEpB,SAAS,oBAAoB,MAAyB;AAC3D,QAAM,UAAU,MAAM,KAAK,KAAK,SAAS,kBAAkB,CAAC;AAC5D,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAAqB,CAAC;AAC5B,MAAI,YAAY;AAChB,UAAQ,QAAQ,CAAC,OAAO,MAAM;AAC5B,UAAM,QAAQ,MAAM;AACpB,UAAM,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC7B,QAAI,QAAQ,UAAW,OAAM,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC;AAC9D,UAAM;AAAA,MACJ,gBAAAA,MAAC,UAAa,WAAU,sCACrB,gBAAM,CAAC,KADC,CAEX;AAAA,IACF;AACA,gBAAY;AAAA,EACd,CAAC;AACD,MAAI,YAAY,KAAK,OAAQ,OAAM,KAAK,KAAK,MAAM,SAAS,CAAC;AAC7D,SAAO;AACT;;;AnBJQ,gBAAAC,OAiBF,QAAAC,cAjBE;AAnBR,IAAM,aAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,mBAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,YAAY,EAAE,SAAS,GAAqB;AAC1D,MAAI,SAAS,MAAM,WAAW,EAAG,QAAO;AACxC,SACE,gBAAAD,MAAC,QAAG,aAAU,SAAQ,WAAU,iBAC7B,mBAAS,MAAM,IAAI,CAAC,SACnB,gBAAAA,MAAC,kBAA6B,QAAT,KAAK,EAAgB,CAC3C,GACH;AAEJ;AAEO,SAAS,eAAe,EAAE,KAAK,GAAyB;AAG7D,QAAM,KAAK,KAAK,QAAQ,YAAY;AACpC,QAAM,eAAe,OAAO,SAAS,OAAO;AAC5C,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,KAAK;AAAA,MACT,eAAa,KAAK;AAAA,MAClB,WAAW,GAAG,0CAA0C,gBAAgB,MAAM;AAAA,MAE9E;AAAA,wBAAAA,OAAC,SAAI,WAAU,6BACb;AAAA,0BAAAD,MAAC,UAAK,eAAW,MAAC,WAAW,GAAG,oCAAoC,iBAAiB,KAAK,MAAM,CAAC,GAC9F,qBAAW,KAAK,MAAM,KAAK,UAC9B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eAAe,sCAAsC;AAAA,cACvD;AAAA,cAEC,eAAK;AAAA;AAAA,UACR;AAAA,UACA,gBAAAA,MAAC,UAAK,WAAU,0BAA0B,8BAAoB,KAAK,IAAI,GAAE;AAAA,UACxE,KAAK,aAAa,IACjB,gBAAAA,MAAC,UAAK,WAAU,+EACb,yBAAe,KAAK,UAAU,GACjC,IACE;AAAA,WACN;AAAA,QACC,KAAK,eACJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,QACR,IACE;AAAA,QACH,KAAK,WAAW,SAAS,IACxB,gBAAAA,MAAC,SAAI,gBAAY,MAAC,WAAU,aAC1B,0BAAAA,MAAC,oBAAiB,SAAS,KAAK,YAAY,GAC9C,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AoB1Dc,qBAAAE,WACE,OAAAC,OADF,QAAAC,cAAA;AAfP,SAAS,kBAAkB,EAAE,YAAY,GAAwC;AACtF,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC;AAAA;AAAA;AAAA,IAGE,gBAAAD,MAAC,SAAI,MAAK,SAAQ,cAAW,eAAc,WAAU,4BAClD,sBAAY,IAAI,CAAC,KAAK,MAAM;AAC3B,YAAM,UACJ,IAAI,oBAAoB,WACpB,QAAQ,IAAI,SAAS,WAAW,IAAI,IAAI,KACxC,QAAQ,IAAI,SAAS,IAAI,mBAAmB,IAAI,IAAI,CAAC;AAC3D,YAAM,UAAU,IAAI,UAAU,WAAW,QAAQ;AACjD,aACE,gBAAAA,MAAC,YAAgC,WAAU,OACxC,oBACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK,IAAI;AAAA,YACT,SAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA,MAAC,gBAAW,WAAU,sCAAsC,cAAI,MAAK;AAAA,SACvE,IAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,UAAU,IAAI;AAAA,UACd,WAAU;AAAA,UAET;AAAA,gBAAI;AAAA,YAAK;AAAA,YAAC,gBAAAA,OAAC,UAAK,WAAU,yBAAwB;AAAA;AAAA,cAAE,IAAI;AAAA,cAAU;AAAA,eAAC;AAAA;AAAA;AAAA,MACtE,KAlBS,GAAG,IAAI,IAAI,IAAI,CAAC,EAoB7B;AAAA,IAEJ,CAAC,GACH;AAAA;AAEJ;;;AC5CA,SAAS,kBAAAC,uBAAsB;;;ACqB/B,IAAM,QAAQ,oBAAI,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC;AAC9C,IAAM,aAAa,CAAC,MAAyC,MAAM,IAAI,CAAC,IAAK,IAAiC;AAEvG,SAAS,eAAe,OAA8C;AAC3E,QAAM,MAAwB,CAAC;AAC/B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,SAAS,SAAU;AAC/E,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,eAAe,QAAQ,KAAK,cAAc,MAAM;AACvD,oBAAc,KAAK;AACnB,mBAAa,KAAK;AAAA,IACpB,WAAW,KAAK,qBAAqB,QAAQ,KAAK,mBAAmB,MAAM;AACzE,oBAAc,KAAK,oBAAoB;AACvC,oBAAc,KAAK,kBAAkB,KAAK,qBAAqB;AAAA,IACjE,OAAO;AACL;AAAA,IACF;AACA,iBAAa,KAAK,IAAI,GAAG,UAAU;AACnC,QAAI,CAAC,SAAS,WAAW,KAAK,CAAC,SAAS,UAAU,EAAG;AACrD,QAAI,KAAK;AAAA,MACP,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,KAAK,MAAM;AAAA,MAC9B,eAAe,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGO,SAAS,YAAY,OAAwC;AAClE,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAOrC,QAAM,OAAO,oBAAI,IAAkB;AACnC,aAAW,QAAQ,YAAY;AAC7B,QAAI,MAAM,KAAK;AACf,QAAI,SAAS;AACb,WAAO,KAAK,IAAI,GAAG,EAAG,OAAM,GAAG,KAAK,MAAM,QAAQ,QAAQ;AAC1D,SAAK,IAAI,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,EAC1E;AAEA,QAAM,QAAgB,CAAC;AACvB,aAAW,QAAQ,KAAK,OAAO,GAAG;AAChC,UAAM,SAAS,KAAK,KAAK,eAAe,KAAK,IAAI,KAAK,KAAK,YAAY,IAAI;AAC3E,QAAI,UAAU,WAAW,KAAM,QAAO,SAAS,KAAK,IAAI;AAAA,QACnD,OAAM,KAAK,IAAI;AAAA,EACtB;AACA,aAAW,QAAQ,KAAK,OAAO,EAAG,MAAK,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW;AACtG,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW;AAE5D,QAAM,OAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAO,CAAC,MAAY,UAAwB;AAChD,QAAI,KAAK,IAAI,KAAK,KAAK,MAAM,EAAG;AAChC,SAAK,IAAI,KAAK,KAAK,MAAM;AACzB,SAAK,KAAK,EAAE,GAAG,KAAK,MAAM,MAAM,CAAC;AACjC,eAAW,SAAS,KAAK,SAAU,MAAK,OAAO,QAAQ,CAAC;AAAA,EAC1D;AACA,aAAW,QAAQ,MAAO,MAAK,MAAM,CAAC;AAEtC,aAAW,QAAQ,KAAK,OAAO,GAAG;AAChC,QAAI,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,EAAG,MAAK,MAAM,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAOO,SAAS,YAAY,MAAwC;AAClE,MAAI,MAAM;AACV,MAAI,MAAM;AACV,aAAW,KAAK,MAAM;AACpB,UAAM,KAAK,IAAI,KAAK,EAAE,WAAW;AACjC,UAAM,KAAK,IAAI,KAAK,EAAE,cAAc,EAAE,UAAU;AAAA,EAClD;AACA,QAAM,QAAQ,MAAM;AACpB,SAAO,EAAE,YAAY,SAAS,GAAG,IAAI,MAAM,GAAG,SAAS,QAAQ,IAAI,QAAQ,EAAE;AAC/E;;;ADxFM,SASQ,OAAAC,OATR,QAAAC,cAAA;AAnBN,IAAM,YAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AACT;AAOO,SAAS,YAAY,EAAE,MAAM,GAA+C;AACjF,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,QAAM,OAAO,YAAY,KAAK;AAC9B,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,EAAE,YAAY,QAAQ,IAAI,YAAY,IAAI;AAEhD,SACE,gBAAAA,OAAC,aAAQ,WAAU,oDACjB;AAAA,oBAAAA,OAAC,aAAQ,WAAU,sEAAqE;AAAA;AAAA,MAC9E,KAAK;AAAA,MAAO;AAAA,MAAM,KAAK,WAAW,IAAI,KAAK;AAAA,MAAI;AAAA,MAAGC,gBAAe,OAAO;AAAA,MAAE;AAAA,OACpF;AAAA,IACA,gBAAAF,MAAC,QAAG,WAAU,8DACX,eAAK,IAAI,CAAC,KAAK,MAAM;AACpB,YAAM,WAAY,IAAI,cAAc,cAAc,UAAW;AAC7D,YAAM,WAAW,KAAK,IAAK,IAAI,aAAa,UAAW,KAAK,GAAG;AAC/D,aACE,gBAAAC,OAAC,QAA8B,WAAU,2BACvC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,GAAG,IAAI,QAAQ,EAAE,KAAK;AAAA,YAC5C,OAAO,IAAI,gBAAgB,GAAG,IAAI,IAAI,WAAM,IAAI,aAAa,KAAK,IAAI;AAAA,YAErE,cAAI;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,uEACd,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,oCAAoC,UAAU,IAAI,MAAM,CAAC;AAAA,YACvE,OAAO,EAAE,MAAM,GAAG,OAAO,KAAK,OAAO,GAAG,QAAQ,IAAI;AAAA;AAAA,QACtD,GACF;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,kDACb,UAAAE,gBAAe,IAAI,UAAU,GAChC;AAAA,WAhBO,GAAG,IAAI,MAAM,IAAI,CAAC,EAiB3B;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;;;AErDA,SAAS,iBAAAC,gBAAe,aAAa,cAAAC,aAAY,gBAAgB;AAYjE,IAAM,kBAAkBD,eAAkC,IAAI;AAEvD,IAAM,mBAAmB,gBAAgB;AAEzC,SAAS,cAAkC;AAChD,SAAOC,YAAW,eAAe;AACnC;AAEA,IAAM,cAAc;AAEpB,SAAS,gBAA6B;AACpC,MAAI,OAAO,iBAAiB,YAAa,QAAO,oBAAI,IAAI;AACxD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW;AAC5C,WAAO,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG,CAAa,IAAI,oBAAI,IAAI;AAAA,EAC9D,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,QAAQ,KAAwB;AACvC,MAAI,OAAO,iBAAiB,YAAa;AACzC,MAAI;AACF,iBAAa,QAAQ,aAAa,KAAK,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,EAC5D,QAAQ;AAAA,EAER;AACF;AAMO,SAAS,mBAAmB;AACjC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,aAAa;AAErE,QAAM,cAAc,YAAY,CAAC,OAAe,UAAU,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;AAE9E,QAAM,SAAS,YAAY,CAAC,OAAe;AACzC,iBAAa,CAAC,SAAS;AACrB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,CAAC,QAAkB;AACjD,iBAAa,MAAM;AACjB,YAAM,OAAO,IAAI,IAAI,GAAG;AACxB,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,YAAY,MAAM;AAClC,iBAAa,MAAM;AACjB,YAAM,OAAO,oBAAI,IAAY;AAC7B,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,KAAK,EAAE,aAAa,OAAO,GAAkB,aAAa,UAAU;AAC/E;;;AC7EA,SAAS,iBAAAC,gBAAe,cAAAC,mBAAkB;AAa1C,IAAM,yBAAyBD,eAAsC,IAAI;AAClE,IAAM,0BAA0B,uBAAuB;AACvD,SAAS,qBAA6C;AAC3D,SAAOC,YAAW,sBAAsB;AAC1C;AAGO,SAAS,mBAAmB,UAAkC;AACnE,QAAM,QAAkB,CAAC,MAAM,SAAS,KAAK,MAAM,SAAS,MAAM,MAAM,EAAE;AAC1E,aAAW,QAAQ,SAAS,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,EAAE;AAAA,EACjD;AACA,MAAI,SAAS,cAAc;AACzB,UAAM,KAAK,IAAI,OAAO,SAAS,aAAa,KAAK,GAAG,KAAK;AAAA,EAC3D;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,iBAAiB,UAAkC;AACjE,QAAM,QAAkB;AAAA,IACtB,sBAAsB,SAAS,MAAM;AAAA,IACrC;AAAA,IACA,aAAa,SAAS,KAAK;AAAA,IAC3B;AAAA,EACF;AACA,aAAW,QAAQ,SAAS,OAAO;AACjC,UAAM,OAAO,KAAK,WAAW,WAAW,wBAAmB;AAC3D,UAAM,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE;AAAA,EACpD;AACA,MAAI,SAAS,cAAc;AACzB,UAAM,KAAK,IAAI,UAAU,SAAS,aAAa,KAAK,CAAC;AAAA,EACvD;AACA,MAAI,SAAS,YAAY;AACvB,UAAM,KAAK,IAAI,UAAU,SAAS,WAAW,KAAK,CAAC;AAAA,EACrD;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,kBAAkB,UAAkC;AAClE,MAAI,OAAO,aAAa,YAAa,QAAO,IAAI,SAAS,EAAE;AAC3D,SAAO,GAAG,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE;AACtD;;;AC7DA,OAAuB;AAMnB,gBAAAC,aAAA;AAFJ,SAAS,KAAK,EAAE,WAAW,GAAG,MAAM,GAAgC;AAClE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAmCA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,QAAQ,SAAS;AAAA,MAC9B,GAAG;AAAA;AAAA,EACN;AAEJ;;;A1BCY,SAUM,OAAAC,OAVN,QAAAC,cAAA;AAhDZ,IAAM,eAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,eAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,qBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,eAA4E;AAAA,EAChF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAEO,SAAS,eAAe,EAAE,UAAU,YAAY,MAAM,GAAwB;AACnF,QAAM,UAAU,GAAG,SAAS,EAAE;AAC9B,QAAM,SAAS,GAAG,SAAS,EAAE;AAC7B,QAAM,QAAQ,aAAa,SAAS,MAAM;AAC1C,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,aAAa,QAAQ,CAAC;AAC1C,QAAM,YAAY,cAAc,SAAU,YAAY,SAAS,EAAE,IAAI;AACrE,QAAM,UAAU,mBAAmB;AACnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,SAAS;AAAA,MACb,eAAa,SAAS;AAAA,MACrB,GAAI,YACD,EAAE,cAAc,GAAG,SAAS,KAAK,WAAM,KAAK,GAAG,IAC/C,EAAE,mBAAmB,QAAQ;AAAA,MACjC,WAAU;AAAA,MAEV;AAAA,wBAAAA,OAAC,cAAW,WAAU,aACpB;AAAA,0BAAAA,OAAC,SAAI,WAAW,GAAG,0BAA0B,YAAY,gBAAgB,iBAAiB,GACvF;AAAA,wBAAY,OACX,gBAAAA,OAAC,QAAG,IAAI,SAAS,WAAU,+DACxB;AAAA,4BACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,SAAU,OAAO,SAAS,EAAE;AAAA,kBAC3C,iBAAe,CAAC;AAAA,kBAChB,iBAAe;AAAA,kBACf,cAAY,UAAU,SAAS,KAAK;AAAA,kBACpC,WAAU;AAAA,kBAEV,0BAAAA,MAAC,UAAK,eAAW,MAAC,WAAW,GAAG,6CAA6C,CAAC,aAAa,WAAW,GAAG,oBAAC;AAAA;AAAA,cAC5G,IACE;AAAA,cACJ,gBAAAA,MAAC,UAAK,eAAW,MAAC,WAAW,GAAG,wBAAwB,mBAAmB,SAAS,MAAM,CAAC,GACxF,uBAAa,SAAS,MAAM,GAC/B;AAAA,cACA,gBAAAA,MAAC,UAAM,mBAAS,OAAM;AAAA,eACxB;AAAA,YAEF,gBAAAC,OAAC,SAAI,WAAU,oCACZ;AAAA,uBAAS,aAAa,IACrB,gBAAAD,MAAC,UAAK,WAAU,sEACb,UAAAE,gBAAe,SAAS,UAAU,GACrC,IACE;AAAA,cACJ,gBAAAF,MAAC,SAAM,SAAS,aAAa,SAAS,MAAM,GAAG,cAAY,WAAW,KAAK,IACxE,iBACH;AAAA,cACC,UACC,gBAAAC,OAAC,SAAI,WAAU,6BACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,QAAQ,SAAS,QAAQ;AAAA,oBACxC,cAAY,gBAAgB,SAAS,KAAK;AAAA,oBAC1C,OAAM;AAAA,oBACN,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,QAAQ,aAAa,QAAQ;AAAA,oBAC5C,cAAY,QAAQ,SAAS,KAAK;AAAA,oBAClC,OAAM;AAAA,oBACN,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,oBAC1C,cAAY,QAAQ,SAAS,KAAK;AAAA,oBAClC,OAAM;AAAA,oBACN,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF,IACE;AAAA,eACN;AAAA,aACF;AAAA,UACC,SAAS,KAAK,SAAS,MAAM,SAAS,SAAS,UAAU,KAAK,IAC7D,gBAAAC,OAAC,QAAG,cAAW,oBAAmB,WAAU,0BACzC;AAAA,qBAAS,KAAK,IAAI,CAAC,MAClB,gBAAAD,MAAC,QACC,0BAAAA,MAAC,SAAM,SAAQ,OAAO,aAAE,KADjB,OAAO,CAAC,EAEjB,CACD;AAAA,aACC,SAAS,WAAW,CAAC,GAAG,IAAI,CAAC,WAC7B,gBAAAA,MAAC,QACE,iBAAO,MACN,gBAAAA,MAAC,OAAE,MAAM,OAAO,KAAK,QAAO,UAAS,KAAI,uBACvC,0BAAAA,MAAC,SAAM,SAAQ,WAAW,iBAAO,IAAG,GACtC,IAEA,gBAAAA,MAAC,SAAM,SAAQ,WAAW,iBAAO,IAAG,KAN/B,UAAU,OAAO,EAAE,EAQ5B,CACD;AAAA,aACH,IACE;AAAA,WACN;AAAA,QACA,gBAAAC,OAAC,eAAY,IAAI,QAAQ,QAAQ,WAAW,WAAU,kBACnD;AAAA,mBAAS,eACR,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cAET,mBAAS;AAAA;AAAA,UACZ,IACE;AAAA,UACJ,gBAAAA,MAAC,eAAY,UAAoB;AAAA,UAChC,SAAS,WAAW,SAAS,IAC5B,gBAAAA,MAAC,SAAI,gBAAY,MAAC,WAAU,QAC1B,0BAAAA,MAAC,oBAAiB,SAAS,SAAS,YAAY,GAClD,IACE;AAAA,UACJ,gBAAAA,MAAC,qBAAkB,aAAa,SAAS,aAAa;AAAA,UACtD,gBAAAA,MAAC,eAAY,OAAO,SAAS,WAAW;AAAA,WAC1C;AAAA;AAAA;AAAA,EACF;AAEJ;;;A2BrKI,qBAAAG,WAEI,OAAAC,aAFJ;AAFG,SAAS,mBAAmB,EAAE,QAAQ,GAA4B;AACvE,SACE,gBAAAA,MAAAD,WAAA,EACG,kBAAQ,UAAU,IAAI,CAAC,aACtB,gBAAAC,MAAC,kBAAiC,YAAb,SAAS,EAAwB,CACvD,GACH;AAEJ;;;AC0Bc,gBAAAC,OAGJ,QAAAC,cAHI;AAzBP,SAAS,cAAc,EAAE,QAAQ,GAAuB;AAC7D,QAAM,UAAU,GAAG,QAAQ,EAAE;AAC7B,QAAM,SAAS,GAAG,QAAQ,EAAE;AAC5B,QAAM,IAAI,QAAQ;AAClB,QAAM,UAAU,EAAE,UAAU,EAAE;AAC9B,QAAM,WAAW,YAAY;AAC7B,QAAM,YAAY,UAAU,YAAY,QAAQ,EAAE,KAAK;AACvD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,QAAQ;AAAA,MACZ,aAAU;AAAA,MACV,mBAAiB;AAAA,MACjB,WAAU;AAAA,MAEV;AAAA,wBAAAA,OAAC,SAAI,WAAU,wFACb;AAAA,0BAAAA,OAAC,SAAI,WAAU,mCACZ;AAAA,uBACC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,SAAS,OAAO,QAAQ,EAAE;AAAA,gBACzC,iBAAe,CAAC;AAAA,gBAChB,iBAAe;AAAA,gBACf,cAAY,UAAU,QAAQ,KAAK;AAAA,gBACnC,WAAU;AAAA,gBAEV,0BAAAA,MAAC,UAAK,eAAW,MAAC,WAAW,GAAG,6CAA6C,CAAC,aAAa,WAAW,GAAG,oBAAC;AAAA;AAAA,YAC5G,IACE;AAAA,YACJ,gBAAAC,OAAC,SAAI,WAAU,WACb;AAAA,8BAAAD,MAAC,QAAG,IAAI,SAAS,WAAU,wDACxB,kBAAQ,OACX;AAAA,cACA,gBAAAA,MAAC,OAAE,WAAU,2DAA2D,kBAAQ,YAAW;AAAA,eAC7F;AAAA,aACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY,GAAG,EAAE,MAAM,YAAY,EAAE,MAAM,YAAY,OAAO;AAAA,cAE9D;AAAA,gCAAAA,OAAC,UAAK,eAAW,MAAC,WAAU,aAAY;AAAA;AAAA,kBAAE,EAAE;AAAA,mBAAO;AAAA,gBACnD,gBAAAA,OAAC,UAAK,eAAW,MAAC,WAAU,aAAY;AAAA;AAAA,kBAAE,EAAE;AAAA,mBAAO;AAAA,gBACnD,gBAAAA,OAAC,UAAK,eAAW,MAAC,WAAU,aAAY;AAAA;AAAA,kBAAE;AAAA,mBAAQ;AAAA;AAAA;AAAA,UACpD;AAAA,WACF;AAAA,QACA,gBAAAD,MAAC,SAAI,IAAI,QAAQ,QAAQ,WAAW,WAAU,2BAC5C,0BAAAA,MAAC,sBAAmB,SAAkB,GACxC;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC5DI,qBAAAE,WAEI,OAAAC,aAFJ;AAHG,SAAS,oBAAoB;AAClC,QAAM,SAAS,UAAU;AACzB,SACE,gBAAAA,MAAAD,WAAA,EACG,iBAAO,SAAS,IAAI,CAAC,YACpB,gBAAAC,MAAC,iBAA+B,WAAZ,QAAQ,EAAsB,CACnD,GACH;AAEJ;;;ACZA,SAAS,OAAAC,YAA8B;AAMnC,gBAAAC,aAAA;AAFJ,SAAS,MAAM,EAAE,WAAW,GAAG,MAAM,GAAgC;AACnE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,qBAAqBC;AAAA,EACzB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAiBA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC1DQ,gBAAAC,aAAA;AAJD,SAAS,YAAY,EAAE,QAAQ,GAAqB;AACzD,SACE,gBAAAA,MAAC,SAAM,aAAU,UAAS,WAAU,UAClC,0BAAAA,MAAC,eACC,0BAAAA,MAAC,cAAY,qBAAW,gCAA+B,GACzD,GACF;AAEJ;;;ACHI,SA0BI,YAAAC,WA1BJ,OAAAC,OAiBE,QAAAC,cAjBF;AAHG,SAAS,cAAc,EAAE,UAAU,GAAuB;AAC/D,QAAM,SAAS,UAAU;AACzB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,OAAO;AAAA,MACf,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,MAC5C,WAAU;AAAA;AAAA,EACZ;AAEJ;AAQO,SAAS,kBAAkB,EAAE,SAAS,WAAW,UAAU,GAA2B;AAC3F,SACE,gBAAAC,OAAC,OAAE,WAAW,GAAG,iCAAiC,SAAS,GAAG,cAAY,WACxE;AAAA,oBAAAA,OAAC,UACC;AAAA,sBAAAD,MAAC,YAAO,WAAU,iCAAiC,kBAAQ,OAAM;AAAA,MAAS;AAAA,MACzE,QAAQ,UAAU,IAAI,KAAK;AAAA,OAC9B;AAAA,IACC;AAAA,IACD,gBAAAC,OAAC,UAAK,eAAY,UAAS,WAAU,aAAa;AAAA,cAAQ;AAAA,MAAO;AAAA,OAAO;AAAA,IACvE;AAAA,IACD,gBAAAA,OAAC,UAAK,eAAY,UAAS,WAAU,aAAa;AAAA,cAAQ;AAAA,MAAO;AAAA,OAAO;AAAA,IACvE,QAAQ,UAAU,IACjB,gBAAAA,OAAAF,WAAA,EACG;AAAA;AAAA,MACD,gBAAAE,OAAC,UAAK,eAAY,WAAU,WAAU,aAAa;AAAA,gBAAQ;AAAA,QAAQ;AAAA,SAAQ;AAAA,OAC7E,IACE;AAAA,IACH,QAAQ,UAAU,IACjB,gBAAAA,OAAAF,WAAA,EACG;AAAA;AAAA,MACD,gBAAAE,OAAC,UAAK,eAAY,WAAU,WAAU,aAAa;AAAA,gBAAQ;AAAA,QAAQ;AAAA,SAAQ;AAAA,OAC7E,IACE;AAAA,KACN;AAEJ;;;AClDA,SAAS,kBAAAC,uBAAsB;AA6BvB,SAgBE,OAAAC,OAhBF,QAAAC,cAAA;AArBD,SAAS,aAAa;AAC3B,QAAM,SAAS,UAAU;AAEzB,QAAM,QAA0D,CAAC;AAEjE,MAAI,OAAO,aAAa;AACtB,UAAM,KAAK,EAAE,OAAO,WAAW,OAAO,IAAI,KAAK,OAAO,WAAW,EAAE,eAAe,EAAE,CAAC;AAAA,EACvF;AACA,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,EAAE,OAAO,YAAY,OAAOC,gBAAe,OAAO,UAAU,EAAE,CAAC;AAAA,EAC5E;AACA,MAAI,OAAO,gBAAgB;AACzB,UAAM,KAAK,EAAE,OAAO,WAAW,OAAO,OAAO,eAAe,CAAC;AAAA,EAC/D;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,KAAK,EAAE,OAAO,UAAU,OAAO,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC;AAAA,EAClE;AACA,MAAI,OAAO,IAAI;AACb,UAAM,KAAK;AAAA,MACT,OAAO;AAAA,MACP,OAAO,OAAO,GAAG,MACf,gBAAAD,OAAC,OAAE,MAAM,OAAO,GAAG,KAAK,QAAO,UAAS,KAAI,uBAAsB,WAAU,6CACzE;AAAA,eAAO,GAAG;AAAA,QACV,OAAO,GAAG,cAAc,KAAK,OAAO,GAAG,WAAW,KAAK;AAAA,SAC1D,IAEA,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,cAAc,KAAK,OAAO,GAAG,WAAW,KAAK,EAAE;AAAA,IAEjF,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE,gBAAAD,MAAC,QAAG,cAAW,gBAAe,WAAU,gEACrC,gBAAM,IAAI,CAAC,SACV,gBAAAC,OAAC,SAAqB,WAAU,gBAC9B;AAAA,oBAAAD,MAAC,QAAG,WAAU,eAAe,eAAK,OAAM;AAAA,IACxC,gBAAAA,MAAC,QAAG,WAAU,6BAA6B,eAAK,OAAM;AAAA,OAF9C,KAAK,KAGf,CACD,GACH;AAEJ;;;ACzCQ,gBAAAG,OAIA,QAAAC,cAJA;AAJD,SAAS,kBAAkB,EAAE,MAAM,GAA2B;AACnE,SACE,gBAAAA,OAAC,aAAQ,WAAU,mBAAkB,MAAK,SAAQ,aAAU,aAC1D;AAAA,oBAAAD,MAAC,OACC,0BAAAA,MAAC,YAAO,4CAA8B,GACxC;AAAA,IACA,gBAAAA,MAAC,OAAG,gBAAM,SAAQ;AAAA,IACjB,MAAM,SAAS,4BACd,gBAAAC,OAAC,OAAE;AAAA;AAAA,MAC+C,gBAAAD,MAAC,UAAK,sCAAwB;AAAA,MAAO;AAAA,OAEvF,IACE;AAAA,IACH,MAAM,UAAU,MAAM,OAAO,SAAS,IACrC,gBAAAC,OAAC,aACC;AAAA,sBAAAA,OAAC,aAAS;AAAA,cAAM,OAAO;AAAA,QAAO;AAAA,QAAkB,MAAM,OAAO,WAAW,IAAI,KAAK;AAAA,SAAI;AAAA,MACrF,gBAAAD,MAAC,SACE,gBAAM,OACJ,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EACpC,KAAK,IAAI,GACd;AAAA,OACF,IACE;AAAA,KACN;AAEJ;;;AClBI,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AAFG,SAAS,iBAAiB,EAAE,MAAM,GAAuB;AAC9D,SACE,gBAAAA,OAAAF,YAAA,EACE;AAAA,oBAAAC,MAAC,QAAI,mBAAS,gBAAe;AAAA,IAC7B,gBAAAA,MAAC,iBAAc;AAAA,IACf,gBAAAA,MAAC,cAAW;AAAA,KACd;AAEJ;AAMO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKc;AACZ,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,aAAa,SAAS,GAAG,cAAY,SAAS,eAAe,cAAY,WAC3F,0BAAAA,MAAC,qBAAkB,OAAc,GACnC;AAEJ;;;ACxCA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAqCD,SACE,OAAAE,OADF,QAAAC,cAAA;AA1BC,IAAM,eAAe;AAAA,EAC1B,SAASC,cAAa,OAAO,KAAK;AAChC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF,IAAI;AACJ,UAAM,UAAU,MAAM;AACtB,UAAM,aACJ,OAAO,iBAAiB,YAAY,OAAO,eAAe;AAE5D,aAAS,aAAa,GAAkC;AACtD,eAAS,EAAE,OAAO,KAAK;AAAA,IACzB;AAEA,aAAS,cAAc,GAAoC;AACzD,UAAI,EAAE,QAAQ,YAAY,UAAU,IAAI;AACtC,iBAAS,EAAE;AACX,UAAE,eAAe;AAAA,MACnB;AAAA,IACF;AAEA,WACE,gBAAAD,OAAC,SAAI,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D;AAAA,sBAAAD,MAAC,WAAM,SAAS,SAAS,WAAU,mBAAkB,oBAErD;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ,MAAK;AAAA,UACL;AAAA,UACA,UAAU;AAAA,UACV,WAAW;AAAA,UACX;AAAA,UACA,cAAa;AAAA,UACb,YAAY;AAAA,UACZ,qBAAkB;AAAA;AAAA,MACpB;AAAA,MACC,aACC,gBAAAA,MAAC,UAAK,WAAU,oBAAmB,aAAU,UAC1C,kBACG,GAAG,YAAY,OAAO,UAAU,KAChC,GAAG,UAAU,UACnB,IACE;AAAA,OACN;AAAA,EAEJ;AACF;;;ACpEA,SAAS,eAAAG,oBAAmB;;;ACOrB,SAAS,uBAAgC;AAC9C,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO;AAAA,EACT;AACA,SAAO,OAAO,WAAW,kCAAkC,EAAE;AAC/D;AAWO,SAAS,mBACd,YACA,UAAmC,CAAC,GAC9B;AACN,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,KAAK,SAAS,eAAe,UAAU;AAC7C,MAAI,CAAC,GAAI;AACT,KAAG,eAAe;AAAA,IAChB,UAAU,qBAAqB,IAAI,SAAS;AAAA,IAC5C,OAAO;AAAA,EACT,CAAC;AACD,MAAI,QAAQ,eAAe,SAAS,OAAO,YAAY,aAAa;AAClE,YAAQ,aAAa,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,EACjD;AACF;;;ADVM,SACE,OAAAC,OADF,QAAAC,cAAA;AAnBC,SAAS,oBAAoB,EAAE,SAAS,GAA6B;AAC1E,QAAM,QAAQ,SAAS,CAAC;AAExB,QAAM,cAAcC,aAAY,MAAM;AACpC,QAAI,CAAC,MAAO;AACZ,uBAAmB,MAAM,UAAU;AAAA,EACrC,GAAG,CAAC,KAAK,CAAC;AAEV,MAAI,SAAS,WAAW,EAAG,QAAO;AAIlC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAW;AAAA,MAEX;AAAA,wBAAAA,OAAC,UAAK,WAAU,0BACd;AAAA,0BAAAD,MAAC,YAAQ,mBAAS,QAAO;AAAA,UAAU;AAAA,UAAI;AAAA,UAC/B,SAAS,WAAW,IAAI,KAAK;AAAA,WACvC;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAW;AAAA,YACZ;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EACF;AAEJ;;;AEzCA,SAAS,WAAW,cAAc;AAgC5B,gBAAAG,OAGI,QAAAC,cAHJ;AAzBN,IAAM,YAAkE;AAAA,EACtE,EAAE,MAAM,KAAK,aAAa,eAAe;AAAA,EACzC,EAAE,MAAM,KAAK,aAAa,uBAAuB;AAAA,EACjD,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,EAC3D,EAAE,MAAM,OAAO,aAAa,8BAA8B;AAAA,EAC1D,EAAE,MAAM,KAAK,aAAa,mBAAmB;AAC/C;AAEO,SAAS,oBAAoB,EAAE,MAAM,QAAQ,GAA6B;AAC/E,QAAM,YAAY,OAA0B,IAAI;AAEhD,YAAU,MAAM;AACd,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,QAAI,QAAQ,CAAC,OAAO,KAAM,QAAO,UAAU;AAAA,aAClC,CAAC,QAAQ,OAAO,KAAM,QAAO,MAAM;AAAA,EAC9C,GAAG,CAAC,IAAI,CAAC;AAET,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,cAAW;AAAA,MACX;AAAA,MAEA;AAAA,wBAAAD,MAAC,QAAG,gCAAkB;AAAA,QACtB,gBAAAA,MAAC,QACE,oBAAU,IAAI,CAAC,MACd,gBAAAC,OAAC,SACC;AAAA,0BAAAD,MAAC,QACC,0BAAAA,MAAC,SAAK,YAAE,MAAK,GACf;AAAA,UACA,gBAAAA,MAAC,QAAI,YAAE,aAAY;AAAA,aAJX,EAAE,IAKZ,CACD,GACH;AAAA,QACA,gBAAAA,MAAC,UAAK,QAAO,UACX,0BAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,mBAAK,GAC5D;AAAA;AAAA;AAAA,EACF;AAEJ;;;AChDA,SAAS,aAAAE,YAAW,UAAAC,eAAc;AAYlC,SAAS,iBAAiB,QAAqC;AAC7D,MAAI,EAAE,kBAAkB,aAAc,QAAO;AAC7C,QAAM,MAAM,OAAO;AACnB,MAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,SAAU,QAAO;AACtE,MAAI,OAAO,kBAAmB,QAAO;AACrC,SAAO;AACT;AAQO,SAAS,qBAAqB,UAA0C;AAC7E,QAAM,MAAMA,QAAO,QAAQ;AAC3B,MAAI,UAAU;AAEd,EAAAD,WAAU,MAAM;AACd,aAAS,UAAU,GAAkB;AACnC,YAAM,IAAI,IAAI;AACd,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,WAAW;AACb;AAAA,MACF;AAEA,UAAI,iBAAiB,EAAE,MAAM,EAAG;AAChC,UAAI,EAAE,WAAW,EAAE,WAAW,EAAE,OAAQ;AAExC,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB;AAAA,QACF,KAAK;AACH,YAAE,eAAe;AACjB,YAAE,eAAe;AACjB;AAAA,QACF,KAAK;AACH,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB;AAAA,QACF,KAAK;AACH,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB;AAAA,QACF,KAAK;AACH,YAAE,cAAc;AAChB,YAAE,eAAe;AACjB;AAAA,QACF,KAAK;AACH,YAAE,gBAAgB;AAClB,YAAE,eAAe;AACjB;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,CAAC;AACP;;;AC1EA,SAAS,aAAAE,kBAAiB;AAOnB,SAAS,oBAA0B;AACxC,EAAAC,WAAU,MAAM;AACd,aAAS,eAAe;AACtB,YAAM,OAAO,OAAO,SAAS,KAAK,QAAQ,MAAM,EAAE;AAClD,UAAI,CAAC,KAAM;AAEX,4BAAsB,MAAM;AAC1B,2BAAmB,MAAM,EAAE,YAAY,MAAM,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AACA,iBAAa;AACb,WAAO,iBAAiB,cAAc,YAAY;AAClD,WAAO,MAAM,OAAO,oBAAoB,cAAc,YAAY;AAAA,EACpE,GAAG,CAAC,CAAC;AACP;;;ACHO,SAAS,eAAe,OAAuB;AACpD,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAGO,SAAS,QAAQ,QAA+B;AACrD,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,WAAW,OAAO,UAAU;AACrC,eAAW,YAAY,QAAQ,WAAW;AACxC,iBAAW,OAAO,SAAS,KAAM,MAAK,IAAI,GAAG;AAAA,IAC/C;AAAA,EACF;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAEA,SAAS,aAAa,UAA0B,GAAoB;AAClE,MAAI,MAAM,GAAI,QAAO;AACrB,MAAI,SAAS,MAAM,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AACrD,aAAW,OAAO,SAAS,MAAM;AAC/B,QAAI,IAAI,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AAAA,EAC5C;AACA,aAAW,QAAQ,SAAS,OAAO;AACjC,QAAI,KAAK,KAAK,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,gBACP,UACA,GACA,QACA,MACS;AACT,MAAI,WAAW,SAAS,SAAS,WAAW,OAAQ,QAAO;AAC3D,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,SAAS,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO;AAC5E,SAAO,aAAa,UAAU,CAAC;AACjC;AAEA,SAAS,mBAAmB,WAA6B;AACvD,MAAI,QAAQ,GACV,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,aAAa;AACf,aAAW,KAAK,WAAW;AACzB,aAAS;AACT,kBAAc,EAAE;AAChB,QAAI,EAAE,WAAW,SAAU,WAAU;AAAA,aAC5B,EAAE,WAAW,SAAU,WAAU;AAAA,aACjC,EAAE,WAAW,UAAW,YAAW;AAAA,QACvC,YAAW;AAAA,EAClB;AACA,SAAO,EAAE,OAAO,QAAQ,QAAQ,SAAS,SAAS,WAAW;AAC/D;AAEO,SAAS,aAAa,QAAqB,UAAgD;AAChG,QAAM,IAAoB,OAAO,aAAa,WAAW,EAAE,OAAO,SAAS,IAAI;AAC/E,QAAM,IAAI,eAAe,EAAE,SAAS,EAAE;AACtC,QAAM,SAAS,EAAE,UAAU;AAC3B,QAAM,OAAO,EAAE,QAAQ,CAAC;AACxB,MAAI,MAAM,MAAM,WAAW,SAAS,KAAK,WAAW,EAAG,QAAO;AAE9D,QAAM,WAA4B,CAAC;AACnC,MAAI,WAAW,GACb,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,aAAa,GACb,cAAc;AAEhB,aAAW,WAAW,OAAO,UAAU;AACrC,UAAM,UAAU,QAAQ,UAAU,OAAO,CAAC,MAAM,gBAAgB,GAAG,GAAG,QAAQ,IAAI,CAAC;AACnF,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,UAAU,mBAAmB,OAAO;AAC1C,aAAS,KAAK,EAAE,GAAG,SAAS,SAAS,WAAW,QAAQ,CAAC;AACzD,gBAAY,QAAQ;AACpB,iBAAa,QAAQ;AACrB,iBAAa,QAAQ;AACrB,kBAAc,QAAQ;AACtB,kBAAc,QAAQ;AACtB,mBAAe,QAAQ;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AASO,SAAS,aAAa,QAAmC;AAC9D,QAAM,MAAoB,CAAC;AAC3B,aAAW,WAAW,OAAO,UAAU;AACrC,eAAW,YAAY,QAAQ,WAAW;AACxC,UAAI,SAAS,WAAW,UAAU;AAChC,cAAM,MAAkB;AAAA,UACtB,WAAW,QAAQ;AAAA,UACnB,YAAY,SAAS;AAAA,UACrB,eAAe,SAAS;AAAA,QAC1B;AACA,YAAI,SAAS,iBAAiB,QAAW;AACvC,cAAI,eAAe,SAAS;AAAA,QAC9B;AACA,YAAI,KAAK,GAAG;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/Gc,SAaE,OAAAC,OAbF,QAAAC,cAAA;AAhBP,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,MAAI,SAAS,WAAW,KAAK,KAAK,WAAW,EAAG,QAAO;AACvD,SACE,gBAAAA,OAAC,SAAI,WAAU,uBACZ;AAAA,aAAS,SAAS,IACjB,gBAAAD,MAAC,SAAI,MAAK,SAAQ,cAAW,oBAAmB,WAAU,wBACvD,mBAAS,IAAI,CAAC,QAAQ;AACrB,YAAM,SAAS,WAAW,IAAI;AAC9B,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,gBAAc;AAAA,UACd,SAAS,MAAM,SAAS,UAAU,IAAI,QAAQ,QAAQ,QAAQ,IAAI,GAAG;AAAA,UACrE,WAAW;AAAA,YACT;AAAA,YACA,SACI,sDACA;AAAA,UACN;AAAA,UAEC;AAAA,gBAAI;AAAA,YACL,gBAAAD,MAAC,UAAK,WAAU,6BAA6B,cAAI,OAAM;AAAA;AAAA;AAAA,QAZlD,IAAI;AAAA,MAaX;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,IACH,KAAK,SAAS,IACb,gBAAAA,MAAC,QAAG,cAAW,iBAAgB,WAAU,0BACtC,eAAK,IAAI,CAAC,QAAQ;AACjB,YAAM,SAAS,WAAW,SAAS,GAAG;AACtC,aACE,gBAAAA,MAAC,QACC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,gBAAc;AAAA,UACd,SAAS,MAAM,YAAY,GAAG;AAAA,UAC9B,WAAU;AAAA,UAEV,0BAAAA,MAAC,SAAM,SAAS,SAAS,YAAY,OAAQ,eAAI;AAAA;AAAA,MACnD,KARO,GAST;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,KACN;AAEJ;;;ACtEA,SAAS,aAAAE,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAwDjC,gBAAAC,OAMQ,QAAAC,cANR;AAnDZ,IAAM,MAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAOO,SAAS,YAAY;AAC1B,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAwB,IAAI;AAE5D,QAAM,cAAcC;AAAA,IAClB,MAAM,OAAO,SAAS,QAAQ,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IACjE,CAAC,MAAM;AAAA,EACT;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,OAAO,yBAAyB,YAAa;AACjD,UAAM,MAAM,YACT,IAAI,CAAC,OAAO,SAAS,eAAe,EAAE,CAAC,EACvC,OAAO,CAAC,OAA0B,OAAO,IAAI;AAChD,QAAI,IAAI,WAAW,EAAG;AAEtB,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,cAAM,UAAU,QACb,OAAO,CAAC,MAAM,EAAE,cAAc,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,mBAAmB,MAAM,EAAE,mBAAmB,GAAG;AACrE,YAAI,QAAQ,CAAC,EAAG,aAAY,QAAQ,CAAC,EAAE,OAAO,EAAE;AAAA,MAClD;AAAA,MACA,EAAE,YAAY,mBAAmB;AAAA,IACnC;AACA,QAAI,QAAQ,CAAC,OAAO,SAAS,QAAQ,EAAE,CAAC;AACxC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,OAAO,SAAS,WAAW,EAAG,QAAO;AAEzC,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAU;AAAA,MAEV,0BAAAA,MAAC,QAAG,WAAU,uBACX,iBAAO,SAAS,IAAI,CAAC,YACpB,gBAAAC,OAAC,QACC;AAAA,wBAAAD,MAAC,OAAE,WAAU,+CAA+C,kBAAQ,OAAM;AAAA,QAC1E,gBAAAA,MAAC,QAAG,WAAU,iBACX,kBAAQ,UAAU,IAAI,CAAC,aAAa;AACnC,gBAAM,SAAS,aAAa,SAAS;AACrC,iBACE,gBAAAA,MAAC,QACC,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,SAAS,EAAE;AAAA,cACrB,SAAS,CAAC,MAAM;AACd,kBAAE,eAAe;AACjB,mCAAmB,SAAS,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA,cACtD;AAAA,cACA,gBAAc,SAAS,SAAS;AAAA,cAChC,WAAW;AAAA,gBACT;AAAA,gBACA,SACI,+CACA;AAAA,cACN;AAAA,cAEA;AAAA,gCAAAD,MAAC,UAAK,eAAW,MAAC,WAAW,GAAG,YAAY,IAAI,SAAS,MAAM,CAAC,GAAG,oBAAC;AAAA,gBACpE,gBAAAA,MAAC,UAAK,WAAU,YAAY,mBAAS,OAAM;AAAA;AAAA;AAAA,UAC7C,KAjBO,SAAS,EAkBlB;AAAA,QAEJ,CAAC,GACH;AAAA,WA3BO,QAAQ,EA4BjB,CACD,GACH;AAAA;AAAA,EACF;AAEJ;;;ACxFA,SAAS,eAAAK,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAGjD,IAAM,MAAM;AAEZ,SAAS,WAAW,OAAoB;AACtC,MAAI,OAAO,aAAa,aAAa;AACnC,aAAS,gBAAgB,aAAa,cAAc,KAAK;AAAA,EAC3D;AACF;AAEA,SAAS,eAAsB;AAC7B,MAAI,OAAO,iBAAiB,aAAa;AACvC,UAAM,SAAS,aAAa,QAAQ,GAAG;AACvC,QAAI,WAAW,WAAW,WAAW,OAAQ,QAAO;AAAA,EACtD;AACA,MAAI,OAAO,aAAa,eAAe,SAAS,gBAAgB,aAAa,YAAY,MAAM,QAAQ;AACrG,WAAO;AAAA,EACT;AACA,MAAI,OAAO,eAAe,eAAe,WAAW,8BAA8B,EAAE,SAAS;AAC3F,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOO,SAAS,WAAiD;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAgB,OAAO;AAEjD,EAAAD,WAAU,MAAM;AACd,UAAM,IAAI,aAAa;AACvB,aAAS,CAAC;AACV,eAAW,CAAC;AAAA,EACd,GAAG,CAAC,CAAC;AAEL,QAAM,SAASD,aAAY,MAAM;AAC/B,aAAS,CAAC,SAAS;AACjB,YAAM,OAAc,SAAS,SAAS,UAAU;AAChD,iBAAW,IAAI;AACf,UAAI;AACF,qBAAa,QAAQ,KAAK,IAAI;AAAA,MAChC,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,OAAO,OAAO;AACzB;;;AlDKW,gBAAAG,OAuJG,QAAAC,cAvJH;AAJJ,SAAS,kBAAkB,OAA+B;AAC/D,QAAM,EAAE,QAAQ,WAAW,OAAO,UAAU,IAAI;AAChD,QAAM,SAAS,aAAa,MAAM;AAClC,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,gBAAAD,MAAC,oBAAiB,OAAO,OAAO,OAAO,WAAsB,OAAc,WAAsB;AAAA,EAC1G;AACA,SAAO,gBAAAA,MAAC,yBAAuB,GAAG,OAAO,QAAQ,OAAO,MAAM;AAChE;AAMA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAA+B;AAC7B,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAuB,KAAK;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAmB,CAAC,CAAC;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA6B,MAAM;AAC/D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,EAAE,OAAO,QAAQ,YAAY,IAAI,SAAS;AAChD,QAAM,YAAYC,QAAyB,IAAI;AAI/C,QAAM,gBAAgB,iBAAiB,KAAK;AAC5C,QAAM,WAAWC,SAAQ,MAAM,aAAa,MAAM,GAAG,CAAC,MAAM,CAAC;AAC7D,QAAM,WAAWA;AAAA,IACf,MAAM,aAAa,QAAQ,EAAE,OAAO,eAAe,QAAQ,cAAc,MAAM,WAAW,CAAC;AAAA,IAC3F,CAAC,QAAQ,eAAe,cAAc,UAAU;AAAA,EAClD;AACA,QAAM,cAAc,UAAU;AAE9B,QAAM,gBAAgBA,SAAQ,MAAM;AAClC,UAAM,IAAI,OAAO;AACjB,UAAM,OAAmE;AAAA,MACvE,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,EAAE,MAAM;AAAA,IAC7C;AACA,QAAI,EAAE,OAAQ,MAAK,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,OAAO,EAAE,OAAO,CAAC;AAC3E,QAAI,EAAE,OAAQ,MAAK,KAAK,EAAE,KAAK,UAAU,OAAO,UAAU,OAAO,EAAE,OAAO,CAAC;AAC3E,QAAI,EAAE,QAAS,MAAK,KAAK,EAAE,KAAK,WAAW,OAAO,WAAW,OAAO,EAAE,QAAQ,CAAC;AAC/E,QAAI,EAAE,QAAS,MAAK,KAAK,EAAE,KAAK,WAAW,OAAO,WAAW,OAAO,EAAE,QAAQ,CAAC;AAC/E,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AACX,QAAM,aAAaA,SAAQ,MAAM,QAAQ,MAAM,GAAG,CAAC,MAAM,CAAC;AAC1D,QAAM,YAAYC;AAAA,IAChB,CAAC,QACC,cAAc,CAAC,SAAU,KAAK,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,CAAE;AAAA,IAC/F,CAAC;AAAA,EACH;AAEA,QAAM,CAAC,OAAO,QAAQ,IAAIH,UAAwB,IAAI;AACtD,QAAM,aAAaC,QAA6C,IAAI;AACpE,QAAM,YAAYE,aAAY,CAAC,QAAgB;AAC7C,aAAS,GAAG;AACZ,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,eAAW,UAAU,WAAW,MAAM,SAAS,IAAI,GAAG,IAAI;AAAA,EAC5D,GAAG,CAAC,CAAC;AACL,QAAM,OAAOA;AAAA,IACX,CAAC,MAAc,QAAgB;AAC7B,UAAI,OAAO,cAAc,eAAe,UAAU,WAAW;AAC3D,kBAAU,UAAU,UAAU,IAAI,EAAE,KAAK,MAAM,UAAU,GAAG,GAAG,MAAM,UAAU,aAAa,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AACA,QAAM,kBAAkBD;AAAA,IACtB,OAAO;AAAA,MACL,UAAU,CAAC,MAAM,KAAK,kBAAkB,CAAC,GAAG,aAAa;AAAA,MACzD,cAAc,CAAC,MAAM,KAAK,mBAAmB,CAAC,GAAG,iBAAiB;AAAA,MAClE,YAAY,CAAC,MAAM,KAAK,iBAAiB,CAAC,GAAG,eAAe;AAAA,IAC9D;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AACA,QAAM,kBAAkBD,QAAO,CAAC;AAEhC,QAAM,WAAW,iBAAiB;AAClC,QAAM,oBAAoBC;AAAA,IACxB,MAAM,OAAO,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAAA,IAC5E,CAAC,MAAM;AAAA,EACT;AACA,QAAM,cAAcC,aAAY,MAAM,SAAS,YAAY,iBAAiB,GAAG,CAAC,UAAU,iBAAiB,CAAC;AAE5G,QAAM,cAAcA,aAAY,MAAM;AACpC,cAAU,SAAS,MAAM;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA;AAAA,IAClB,CAAC,cAAsB;AACrB,UAAI,SAAS,WAAW,EAAG;AAC3B,sBAAgB,WACb,gBAAgB,UAAU,YAAY,SAAS,UAAU,SAAS;AACrE,YAAM,SAAS,SAAS,gBAAgB,OAAO;AAC/C,UAAI,OAAQ,oBAAmB,OAAO,UAAU;AAAA,IAClD;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,aAAaA,aAAY,MAAM;AACnC,gBAAY,CAAC,MAAM,CAAC,CAAC;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,SAASA,aAAY,MAAM;AAC/B,QAAI,SAAU,aAAY,KAAK;AAAA,aACtB,UAAU,GAAI,UAAS,EAAE;AAAA,EACpC,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,uBAAqB;AAAA,IACnB,eAAe;AAAA,IACf,eAAe,MAAM,YAAY,CAAC;AAAA,IAClC,eAAe,MAAM,YAAY,EAAE;AAAA,IACnC,cAAc;AAAA,IACd,UAAU;AAAA,IACV,aAAa,SAAS;AAAA,IACtB,eAAe;AAAA,EACjB,CAAC;AAED,oBAAkB;AAElB,QAAM,aAAa,SAAS,SAAS,SAAS;AAC9C,QAAM,iBAAiB,OAAO,QAAQ;AACtC,QAAM,mBAAmB,SAAS,QAAQ;AAE1C,SACE,gBAAAL,MAAC,oBAAiB,OAAO,SAAS,KACjC,0BAAAA,MAAC,2BAAwB,OAAO,iBAC/B,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,aAAa,yBAAyB,SAAS;AAAA,UAC7D,cAAY,SAAS;AAAA,UACrB,aAAW;AAAA,UACX,cAAY;AAAA,UACZ,qBAAmB;AAAA,UAEnB;AAAA,4BAAAA,OAAC,YAAO,WAAU,oBACf;AAAA,2BAAa,OAAO,gBAAAD,MAAC,oBAAiB,OAAc;AAAA,cACrD,gBAAAC,OAAC,SAAI,WAAU,qCACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,YAAY;AAAA;AAAA,gBACd;AAAA,gBACA,gBAAAC,OAAC,SAAI,WAAU,uBACb;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,SAAS;AAAA,sBAClB,qBAAkB;AAAA,sBAClB,WAAU;AAAA,sBACX;AAAA;AAAA,kBAED;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,qBAAkB;AAAA,sBAClB,WAAU;AAAA,sBACX;AAAA;AAAA,kBAED;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,UAAU,CAAC,MAAO,MAAM,SAAS,YAAY,MAAO;AAAA,sBACnE,gBAAc,WAAW;AAAA,sBACzB,WAAU;AAAA,sBAET,qBAAW,SAAS,cAAc;AAAA;AAAA,kBACrC;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,cAAY,aAAa,UAAU,SAAS,UAAU,MAAM;AAAA,sBAC5D,WAAU;AAAA,sBAET,oBAAU,SAAS,iBAAY;AAAA;AAAA,kBAClC;AAAA,mBACF;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN;AAAA,kBACA,aAAa;AAAA;AAAA,cACf;AAAA,eACF;AAAA,YACA,gBAAAA,MAAC,uBAAoB,UAAoB;AAAA,YACxC,aACC,gBAAAC,OAAC,SAAI,WAAU,cACb;AAAA,8BAAAD,MAAC,aAAU;AAAA,cACX,gBAAAA,MAAC,SAAI,WAAU,sCACb,0BAAAA,MAAC,qBAAkB,GACrB;AAAA,eACF,IAEA,gBAAAA,MAAC,eAAY,SAAS,QAAQ,mCAAmC,QAAW;AAAA,YAE9E,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,qBAAkB;AAAA,gBAClB,SAAS;AAAA,gBACV;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA,MAAC,uBAAoB,MAAM,UAAU,SAAS,MAAM,YAAY,KAAK,GAAG;AAAA,YACvE,QACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAU;AAAA,gBACV,WAAU;AAAA,gBAET;AAAA;AAAA,YACH,IACE;AAAA;AAAA;AAAA,MACN;AAAA;AAAA,EACF,GACD,GACD;AAEJ;;;AmDhSA,SAAS,WAAAM,gBAAe;;;ACYxB,SAAS,eAAe,aAAAC,YAAW,YAAAC,iBAAgB;;;ACZnD,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AA8DtC,SAEI,OAAAC,OAFJ,QAAAC,cAAA;AAvDN,SAAS,YAAY,IAAiC;AACpD,QAAM,SAAS,IAAI,QAAqB,cAAc;AACtD,MAAI,QAAQ,QAAQ,UAAU,OAAQ,QAAO;AAC7C,MAAI,QAAQ,QAAQ,UAAU,QAAS,QAAO;AAC9C,SAAO,OAAO,WAAW,eAAe,CAAC,CAAC,OAAO,aAAa,8BAA8B,EAAE;AAChG;AAcO,SAAS,YAAY,EAAE,OAAO,KAAK,GAAqD;AAC7F,QAAM,MAAMC,QAAoB,IAAI;AACpC,QAAM,CAAC,KAAK,MAAM,IAAIC,UAAwB,IAAI;AAElD,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAChB,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,KAAK;AAC3B,gBAAQ,WAAW;AAAA,UACjB,aAAa;AAAA,UACb,eAAe;AAAA,UACf,OAAO,YAAY,IAAI,OAAO,IAAI,SAAS;AAAA,QAC7C,CAAC;AACD,cAAM,KAAK,cAAc,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC5D,cAAM,EAAE,KAAK,SAAS,IAAI,MAAM,QAAQ,OAAO,IAAI,MAAM,IAAI;AAC7D,YAAI,CAAC,UAAW,QAAO,QAAQ;AAAA,MACjC,QAAQ;AACN,YAAI,CAAC,UAAW,QAAO,IAAI;AAAA,MAC7B;AAAA,IACF;AACA,SAAK,KAAK;AAGV,UAAM,SAAS,IAAI,SAAS,QAAqB,cAAc;AAC/D,UAAM,WAAW,SAAS,IAAI,iBAAiB,MAAM,KAAK,KAAK,CAAC,IAAI;AACpE,cAAU,QAAQ,QAAS,EAAE,YAAY,MAAM,iBAAiB,CAAC,YAAY,EAAE,CAAC;AAEhF,WAAO,MAAM;AACX,kBAAY;AACZ,gBAAU,WAAW;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;AAErB,MAAI,KAAK;AACP,WACE,gBAAAH,OAAC,YAAO,KAAU,WAAU,QACzB;AAAA,YAAM,QACL,gBAAAD,MAAC,gBAAW,WAAU,oDAAoD,gBAAM,OAAM,IACpF;AAAA,MAEJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAY,MAAM,SAAS;AAAA,UAC3B,WAAU;AAAA,UACV,yBAAyB,EAAE,QAAQ,IAAI;AAAA;AAAA,MACzC;AAAA,OACF;AAAA,EAEJ;AAIA,SAAO,gBAAAA,MAAC,iBAAc,OAAc,KAAU;AAChD;;;ADDQ,gBAAAK,aAAA;AA1DR,IAAM,WAAW;AACjB,IAAM,cAAc;AAQpB,SAAS,gBAAmB,KAA+B;AACzD,MAAI;AACJ,SAAO,MAAM;AAGX,eAAW;AAAA;AAAA;AAAA,MAAoD;AAAA,MAAK,KAAK,CAAC,MAAO,EAAE,WAAW,CAAO;AACrG,WAAO;AAAA,EACT;AACF;AAEA,IAAM,qBAAqB,gBAA4B,WAAW;AAOlE,IAAM,WAAW,gBAAsB,QAAQ;AAO/C,SAAS,mBAAmB,EAAE,MAAM,GAA6B;AAC/D,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAwB,IAAI;AAEpD,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAChB,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,OAAO,MAAM,QAAQ,KAAK,YAAY,MAAM,IAAI,IAAI,MAAM,OAAO;AACvE,cAAM,SAAS,OACX,KAAK,UAAU,MAAM,SAAS,EAAE,UAAU,MAAM,gBAAgB,KAAK,CAAC,IACtE,KAAK,cAAc,MAAM,OAAO;AACpC,YAAI,CAAC,UAAW,SAAQ,OAAO,KAAK;AAAA,MACtC,QAAQ;AACN,YAAI,CAAC,UAAW,SAAQ,IAAI;AAAA,MAC9B;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,MAAM,IAAI,CAAC;AAE9B,SACE,gBAAAF,MAAC,cAAW,OAAO,MAAM,OACtB,mBAAS,OACR,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,0BAA0B,MAAM,QAAQ,YAAY,MAAM,IAAI,EAAE;AAAA,MAC9E,yBAAyB,EAAE,QAAQ,KAAK;AAAA;AAAA,EAC1C,IAEA,gBAAAA,MAAC,UAAK,WAAW,GAAG,qBAAqB,MAAM,QAAQ,YAAY,MAAM,IAAI,EAAE,GAAI,gBAAM,SAAQ,GAErG;AAEJ;AAWO,SAAS,qBAAqB,MAA+C;AAClF,QAAM,YAA8B,CAAC;AACrC,MAAI,KAAK,SAAS;AAChB,cAAU,UAAU,CAAC,UAAU,cAAc,aAAa,EAAE,OAAO,MAAM,mBAAmB,CAAC;AAAA,EAC/F;AACA,MAAI,KAAK,oBAAoB;AAC3B,cAAU,OAAO,CAAC,UAAU,cAAc,oBAAoB,EAAE,MAAM,CAAC;AAAA,EACzE;AACA,SAAO;AACT;;;ADlEI,gBAAAG,aAAA;AAbG,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,UAAU;AACZ,GAAiC;AAC/B,QAAM,YAAYC;AAAA,IAChB,MAAM,qBAAqB,EAAE,oBAAoB,QAAQ,CAAC;AAAA,IAC1D,CAAC,oBAAoB,OAAO;AAAA,EAC9B;AACA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;","names":["useCallback","useMemo","useRef","useState","formatDuration","jsx","jsx","jsx","useContext","EMPTY_CUSTOM","EMPTY_RENDERERS","useContext","jsx","jsxs","jsx","jsxs","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","Fragment","jsx","jsx","jsx","jsxs","Fragment","jsx","jsxs","formatDuration","jsx","jsxs","formatDuration","createContext","useContext","createContext","useContext","jsx","jsx","jsx","jsxs","formatDuration","Fragment","jsx","jsx","jsxs","Fragment","jsx","cva","jsx","cva","jsx","jsx","Fragment","jsx","jsxs","formatDuration","jsx","jsxs","formatDuration","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","ReportSearch","useCallback","jsx","jsxs","useCallback","jsx","jsxs","useEffect","useRef","useEffect","useEffect","jsx","jsxs","useEffect","useMemo","useState","jsx","jsxs","useState","useMemo","useEffect","useCallback","useEffect","useState","jsx","jsxs","useState","useRef","useMemo","useCallback","useMemo","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","jsx","useState","useEffect","jsx","useMemo"]}
1
+ {"version":3,"sources":["../src/interactive/ReportInteractive.tsx","../src/result.ts","../src/context/ReportRoot.tsx","../src/context/ReportContext.ts","../src/hooks/useReport.ts","../src/components/ReportScenario.tsx","../src/components/ReportSteps.tsx","../src/components/doc/DocNote.tsx","../src/components/ui/badge.tsx","../src/lib/utils.ts","../src/components/doc/DocTag.tsx","../src/components/doc/DocKv.tsx","../src/hooks/useRenderers.ts","../src/components/doc/DocCode.tsx","../src/components/doc/DocTable.tsx","../src/components/doc/DocLink.tsx","../src/components/doc/DocSection.tsx","../src/lib/url.ts","../src/components/doc/DocMermaid.tsx","../src/components/doc/DocScreenshot.tsx","../src/components/doc/DocVideo.tsx","../src/components/doc/DocHtml.tsx","../src/components/doc/DocCustom.tsx","../src/components/doc/DocEntry.tsx","../src/components/ReportDocEntries.tsx","../src/lib/step-params.tsx","../src/components/ReportAttachments.tsx","../src/components/ReportTrace.tsx","../src/lib/trace.ts","../src/interactive/collapse-context.ts","../src/interactive/scenario-actions.tsx","../src/components/ui/card.tsx","../src/components/ReportScenarioList.tsx","../src/components/ReportFeature.tsx","../src/components/ReportFeatureList.tsx","../src/components/ui/empty.tsx","../src/components/ReportEmpty.tsx","../src/components/ReportSummary.tsx","../src/components/ReportMeta.tsx","../src/components/ReportSchemaError.tsx","../src/components/ReportShell.tsx","../src/interactive/ReportSearch.tsx","../src/interactive/ReportFailureBanner.tsx","../src/lib/scroll.ts","../src/interactive/ReportShortcutsHelp.tsx","../src/interactive/use-keyboard-shortcuts.ts","../src/interactive/use-deep-link-scroll.ts","../src/interactive/filter.ts","../src/interactive/ReportFilters.tsx","../src/interactive/ReportToc.tsx","../src/interactive/use-theme.ts","../src/interactive/ReportInteractiveIsland.tsx","../src/interactive/island-renderers.tsx","../src/components/doc/MermaidView.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useDeferredValue,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { Result } from \"../result\";\nimport { unwrapReport } from \"../result\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\nimport { ReportRoot } from \"../context/ReportRoot\";\nimport { ReportFeatureList } from \"../components/ReportFeatureList\";\nimport { ReportEmpty } from \"../components/ReportEmpty\";\nimport { ReportTitleBlock, ReportErrorShell } from \"../components/ReportShell\";\nimport { cn } from \"../lib/utils\";\nimport { ReportSearch } from \"./ReportSearch\";\nimport { ReportFailureBanner } from \"./ReportFailureBanner\";\nimport { ReportShortcutsHelp } from \"./ReportShortcutsHelp\";\nimport { useKeyboardShortcuts } from \"./use-keyboard-shortcuts\";\nimport { useDeepLinkScroll } from \"./use-deep-link-scroll\";\nimport { filterReport, listFailures, allTags, type StatusFilter } from \"./filter\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\nimport { CollapseProvider, useCollapseState } from \"./collapse-context\";\nimport { ReportFilters } from \"./ReportFilters\";\nimport { ReportToc } from \"./ReportToc\";\nimport { useTheme } from \"./use-theme\";\nimport {\n ScenarioActionsProvider,\n scenarioToMarkdown,\n scenarioToPrompt,\n scenarioPermalink,\n type ScenarioActions,\n} from \"./scenario-actions\";\n\nexport interface ReportInteractiveProps {\n /** A StoryReport, or a Result-wrapped one (e.g., from parseStoryReport). */\n report: StoryReport | Result<StoryReport>;\n /** Renderers keyed by `story.custom({ type })` strings. */\n customRenderers?: CustomRenderers;\n /** Optional overrides for the heavy built-ins (mermaid, code, section). */\n renderers?: BuiltinRenderers;\n className?: string;\n title?: string;\n dataTheme?: \"light\" | \"dark\";\n /**\n * Drop the report's own title block (`<h1>` + summary + meta) while keeping\n * the search and filter controls. Use when the surrounding page already shows\n * the report title as its heading — e.g. the Astro stories index embedded in\n * Starlight, where Starlight renders the page `<h1>`.\n */\n hideHeader?: boolean;\n}\n\nexport function ReportInteractive(props: ReportInteractiveProps) {\n const { report, className, title, dataTheme } = props;\n const result = unwrapReport(report);\n if (!result.ok) {\n return <ReportErrorShell error={result.error} className={className} title={title} dataTheme={dataTheme} />;\n }\n return <ReportInteractiveView {...props} report={result.data} />;\n}\n\ninterface ReportInteractiveViewProps extends Omit<ReportInteractiveProps, \"report\"> {\n report: StoryReport;\n}\n\nfunction ReportInteractiveView({\n report,\n customRenderers,\n renderers,\n className,\n title,\n dataTheme,\n hideHeader = false,\n}: ReportInteractiveViewProps) {\n const [query, setQuery] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<StatusFilter>(\"all\");\n const [activeTags, setActiveTags] = useState<string[]>([]);\n const [detail, setDetail] = useState<\"full\" | \"minimal\">(\"full\");\n const [helpOpen, setHelpOpen] = useState(false);\n const { theme, toggle: toggleTheme } = useTheme();\n const searchRef = useRef<HTMLInputElement>(null);\n // Defer filtering off the live input value so typing stays responsive even\n // when the report is large — the input updates immediately, the filtered\n // tree catches up. (Vercel rerender-use-deferred-value.)\n const deferredQuery = useDeferredValue(query);\n const failures = useMemo(() => listFailures(report), [report]);\n const filtered = useMemo(\n () => filterReport(report, { query: deferredQuery, status: statusFilter, tags: activeTags }),\n [report, deferredQuery, statusFilter, activeTags],\n );\n const isFiltering = query !== deferredQuery;\n\n const statusOptions = useMemo(() => {\n const s = report.summary;\n const opts: Array<{ key: StatusFilter; label: string; count: number }> = [\n { key: \"all\", label: \"All\", count: s.total },\n ];\n if (s.passed) opts.push({ key: \"passed\", label: \"Passed\", count: s.passed });\n if (s.failed) opts.push({ key: \"failed\", label: \"Failed\", count: s.failed });\n if (s.skipped) opts.push({ key: \"skipped\", label: \"Skipped\", count: s.skipped });\n if (s.pending) opts.push({ key: \"pending\", label: \"Pending\", count: s.pending });\n return opts;\n }, [report]);\n const tagOptions = useMemo(() => allTags(report), [report]);\n const toggleTag = useCallback(\n (tag: string) =>\n setActiveTags((prev) => (prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag])),\n [],\n );\n\n const [toast, setToast] = useState<string | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((msg: string) => {\n setToast(msg);\n if (toastTimer.current) clearTimeout(toastTimer.current);\n toastTimer.current = setTimeout(() => setToast(null), 1800);\n }, []);\n const copy = useCallback(\n (text: string, msg: string) => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).then(() => showToast(msg), () => showToast(\"Copy failed\"));\n }\n },\n [showToast],\n );\n const scenarioActions = useMemo<ScenarioActions>(\n () => ({\n copyLink: (s) => copy(scenarioPermalink(s), \"Link copied\"),\n copyMarkdown: (s) => copy(scenarioToMarkdown(s), \"Markdown copied\"),\n copyPrompt: (s) => copy(scenarioToPrompt(s), \"Prompt copied\"),\n }),\n [copy],\n );\n const failureIndexRef = useRef(0);\n\n const collapse = useCollapseState();\n const allCollapsibleIds = useMemo(\n () => report.features.flatMap((f) => [f.id, ...f.scenarios.map((s) => s.id)]),\n [report],\n );\n const collapseAll = useCallback(() => collapse.collapseAll(allCollapsibleIds), [collapse, allCollapsibleIds]);\n\n const focusSearch = useCallback(() => {\n searchRef.current?.focus();\n }, []);\n\n const stepFailure = useCallback(\n (direction: 1 | -1) => {\n if (failures.length === 0) return;\n failureIndexRef.current =\n (failureIndexRef.current + direction + failures.length) % failures.length;\n const target = failures[failureIndexRef.current];\n if (target) scrollToScenarioId(target.scenarioId);\n },\n [failures],\n );\n\n const toggleHelp = useCallback(() => {\n setHelpOpen((v) => !v);\n }, []);\n\n const escape = useCallback(() => {\n if (helpOpen) setHelpOpen(false);\n else if (query !== \"\") setQuery(\"\");\n }, [helpOpen, query]);\n\n useKeyboardShortcuts({\n onFocusSearch: focusSearch,\n onNextFailure: () => stepFailure(1),\n onPrevFailure: () => stepFailure(-1),\n onToggleHelp: toggleHelp,\n onEscape: escape,\n onExpandAll: collapse.expandAll,\n onCollapseAll: collapseAll,\n });\n\n useDeepLinkScroll();\n\n const hasContent = filtered.features.length > 0;\n const totalScenarios = report.summary.total;\n const matchedScenarios = filtered.summary.total;\n\n return (\n <CollapseProvider value={collapse.api}>\n <ScenarioActionsProvider value={scenarioActions}>\n <ReportRoot\n report={filtered}\n customRenderers={customRenderers}\n renderers={renderers}\n >\n <main\n className={cn(\"es-report\", \"es-report-interactive\", className)}\n aria-label={title ?? \"Test report\"}\n aria-busy={isFiltering}\n data-theme={dataTheme}\n data-detail-level={detail}\n >\n <header className=\"es-report-header\">\n {hideHeader ? null : <ReportTitleBlock title={title} />}\n <div className=\"flex flex-wrap items-center gap-2\">\n <ReportSearch\n ref={searchRef}\n value={query}\n onChange={setQuery}\n matchedCount={matchedScenarios}\n totalCount={totalScenarios}\n />\n <div className=\"flex shrink-0 gap-1\">\n <button\n type=\"button\"\n onClick={collapse.expandAll}\n aria-keyshortcuts=\"e\"\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Expand all\n </button>\n <button\n type=\"button\"\n onClick={collapseAll}\n aria-keyshortcuts=\"c\"\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Collapse all\n </button>\n <button\n type=\"button\"\n onClick={() => setDetail((d) => (d === \"full\" ? \"minimal\" : \"full\"))}\n aria-pressed={detail === \"minimal\"}\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n {detail === \"full\" ? \"Hide docs\" : \"Show docs\"}\n </button>\n <button\n type=\"button\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"dark\" ? \"light\" : \"dark\"} theme`}\n className=\"cursor-pointer rounded-md border border-border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n {theme === \"dark\" ? \"☀ Light\" : \"☾ Dark\"}\n </button>\n </div>\n </div>\n <ReportFilters\n statuses={statusOptions}\n status={statusFilter}\n onStatus={setStatusFilter}\n tags={tagOptions}\n activeTags={activeTags}\n onToggleTag={toggleTag}\n />\n </header>\n <ReportFailureBanner failures={failures} />\n {hasContent ? (\n <div className=\"flex gap-6\">\n <ReportToc />\n <div className=\"flex min-w-0 flex-1 flex-col gap-4\">\n <ReportFeatureList />\n </div>\n </div>\n ) : (\n <ReportEmpty message={query ? \"No scenarios match the search.\" : undefined} />\n )}\n <button\n type=\"button\"\n className=\"es-shortcuts-trigger\"\n aria-label=\"Keyboard shortcuts\"\n aria-keyshortcuts=\"Shift+?\"\n onClick={toggleHelp}\n >\n ?\n </button>\n <ReportShortcutsHelp open={helpOpen} onClose={() => setHelpOpen(false)} />\n {toast ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"fixed bottom-4 left-1/2 -translate-x-1/2 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background shadow-lg\"\n >\n {toast}\n </div>\n ) : null}\n </main>\n </ReportRoot>\n </ScenarioActionsProvider>\n </CollapseProvider>\n );\n}\n","/**\n * Result<T> — explicit success/error type matching the cookbook convention.\n *\n * Used at the boundary where a StoryReport is parsed: the consumer hands us\n * an unknown value (file contents, fetch body, prop) and we return a Result.\n */\nimport type { StoryReport } from \"executable-stories-core\";\n\nexport type Result<T, E = ReportParseError> =\n | { ok: true; data: T }\n | { ok: false; error: E };\n\nexport interface ReportParseError {\n message: string;\n code: ReportParseErrorCode;\n issues?: readonly { path: string; message: string }[];\n}\n\nexport type ReportParseErrorCode =\n | \"INVALID_INPUT\"\n | \"SCHEMA_VERSION_MISMATCH\"\n | \"VALIDATION_FAILED\";\n\nexport const ok = <T>(data: T): Result<T> => ({ ok: true, data });\nexport const err = (error: ReportParseError): Result<never> => ({ ok: false, error });\n\n/**\n * Normalize the `StoryReport | Result<StoryReport>` prop accepted across the\n * render entrypoints (`Report`, `ReportInteractive`, `renderReportToHtml`) into\n * a single `Result`. A bare report becomes `ok(report)`; an already-wrapped\n * value passes through. One place owns the \"is this a Result?\" discrimination.\n */\nexport function unwrapReport(value: StoryReport | Result<StoryReport>): Result<StoryReport> {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"ok\" in value &&\n typeof (value as { ok: unknown }).ok === \"boolean\"\n ) {\n return value as Result<StoryReport>;\n }\n return ok(value as StoryReport);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\nimport { ReportContext, type ReportContextValue } from \"./ReportContext\";\n\nexport interface ReportRootProps {\n report: StoryReport;\n customRenderers?: CustomRenderers;\n renderers?: BuiltinRenderers;\n children: ReactNode;\n}\n\nconst EMPTY_CUSTOM: CustomRenderers = {};\nconst EMPTY_RENDERERS: BuiltinRenderers = {};\n\nexport function ReportRoot({\n report,\n customRenderers,\n renderers,\n children,\n}: ReportRootProps) {\n const value = useMemo<ReportContextValue>(\n () => ({\n report,\n customRenderers: customRenderers ?? EMPTY_CUSTOM,\n renderers: renderers ?? EMPTY_RENDERERS,\n }),\n [report, customRenderers, renderers],\n );\n return <ReportContext.Provider value={value}>{children}</ReportContext.Provider>;\n}\n","import { createContext } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\n\nexport interface ReportContextValue {\n report: StoryReport;\n customRenderers: CustomRenderers;\n renderers: BuiltinRenderers;\n}\n\nexport const ReportContext = createContext<ReportContextValue | null>(null);\n","import { useContext } from \"react\";\nimport { ReportContext } from \"../context/ReportContext\";\n\nexport function useReport() {\n const ctx = useContext(ReportContext);\n if (!ctx) {\n throw new Error(\n \"useReport must be used inside <ReportRoot> or <Report>. Wrap your tree with one of those.\",\n );\n }\n return ctx.report;\n}\n","import type { ReportScenario as ReportScenarioT } from \"executable-stories-core\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { ReportSteps } from \"./ReportSteps\";\nimport { ReportDocEntries } from \"./ReportDocEntries\";\nimport { ReportAttachments } from \"./ReportAttachments\";\nimport { ReportTrace } from \"./ReportTrace\";\nimport { useCollapse } from \"../interactive/collapse-context\";\nimport { useScenarioActions } from \"../interactive/scenario-actions\";\nimport { Card, CardContent, CardHeader } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportScenarioProps {\n scenario: ReportScenarioT;\n /**\n * Omit the card's own title row (status badge + tags still render). Use when\n * the surrounding page already shows the scenario title as its heading — e.g.\n * the Astro detail page, where Starlight renders the title as the page `h1`.\n */\n hideTitle?: boolean;\n}\n\ntype Status = ReportScenarioT[\"status\"];\n\nconst STATUS_LABEL: Record<Status, string> = {\n passed: \"Passed\",\n failed: \"Failed\",\n skipped: \"Skipped\",\n pending: \"Pending\",\n};\n\nconst STATUS_GLYPH: Record<Status, string> = {\n passed: \"✓\",\n failed: \"✗\",\n skipped: \"○\",\n pending: \"○\",\n};\n\nconst STATUS_GLYPH_COLOR: Record<Status, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\nconst STATUS_BADGE: Record<Status, \"passed\" | \"failed\" | \"skipped\" | \"pending\"> = {\n passed: \"passed\",\n failed: \"failed\",\n skipped: \"skipped\",\n pending: \"pending\",\n};\n\nexport function ReportScenario({ scenario, hideTitle = false }: ReportScenarioProps) {\n const titleId = `${scenario.id}-title`;\n const bodyId = `${scenario.id}-body`;\n const label = STATUS_LABEL[scenario.status];\n const collapse = useCollapse();\n const collapsible = collapse !== null && !hideTitle;\n const collapsed = collapsible ? collapse!.isCollapsed(scenario.id) : false;\n const actions = useScenarioActions();\n return (\n <Card\n id={scenario.id}\n data-status={scenario.status}\n {...(hideTitle\n ? { \"aria-label\": `${scenario.title} — ${label}` }\n : { \"aria-labelledby\": titleId })}\n className=\"gap-0 py-0\"\n >\n <CardHeader className=\"px-4 py-3\">\n <div className={cn(\"flex items-start gap-4\", hideTitle ? \"justify-end\" : \"justify-between\")}>\n {hideTitle ? null : (\n <h3 id={titleId} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => collapse!.toggle(scenario.id)}\n aria-expanded={!collapsed}\n aria-controls={bodyId}\n aria-label={`Toggle ${scenario.title}`}\n className=\"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className={cn(\"inline-block text-xs transition-transform\", !collapsed && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n <span aria-hidden className={cn(\"text-sm leading-none\", STATUS_GLYPH_COLOR[scenario.status])}>\n {STATUS_GLYPH[scenario.status]}\n </span>\n <span>{scenario.title}</span>\n </h3>\n )}\n <div className=\"flex shrink-0 items-center gap-2\">\n {scenario.durationMs > 0 ? (\n <span className=\"whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground\">\n {formatDuration(scenario.durationMs)}\n </span>\n ) : null}\n <Badge variant={STATUS_BADGE[scenario.status]} aria-label={`Status: ${label}`}>\n {label}\n </Badge>\n {actions ? (\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={() => actions.copyLink(scenario)}\n aria-label={`Copy link to ${scenario.title}`}\n title=\"Copy permalink\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n link\n </button>\n <button\n type=\"button\"\n onClick={() => actions.copyMarkdown(scenario)}\n aria-label={`Copy ${scenario.title} as Markdown`}\n title=\"Copy as Markdown\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n md\n </button>\n <button\n type=\"button\"\n onClick={() => actions.copyPrompt(scenario)}\n aria-label={`Copy ${scenario.title} as an AI investigation prompt`}\n title=\"Copy as AI prompt\"\n className=\"cursor-pointer rounded px-1 py-0.5 font-mono text-[0.625rem] text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n ai\n </button>\n </div>\n ) : null}\n </div>\n </div>\n {scenario.tags.length > 0 || (scenario.tickets?.length ?? 0) > 0 ? (\n <ul aria-label=\"Tags and tickets\" className=\"flex flex-wrap gap-1.5\">\n {scenario.tags.map((t) => (\n <li key={`tag-${t}`}>\n <Badge variant=\"tag\">{t}</Badge>\n </li>\n ))}\n {(scenario.tickets ?? []).map((ticket) => (\n <li key={`ticket-${ticket.id}`}>\n {ticket.url ? (\n <a href={ticket.url} target=\"_blank\" rel=\"noreferrer noopener\">\n <Badge variant=\"outline\">{ticket.id}</Badge>\n </a>\n ) : (\n <Badge variant=\"outline\">{ticket.id}</Badge>\n )}\n </li>\n ))}\n </ul>\n ) : null}\n </CardHeader>\n <CardContent id={bodyId} hidden={collapsed} className=\"px-4 pt-0 pb-4\">\n {scenario.errorMessage ? (\n <pre\n role=\"alert\"\n className=\"mb-1 overflow-x-auto rounded-md border border-fail-border bg-fail-bg px-4 py-3.5 font-mono text-xs leading-relaxed whitespace-pre-wrap text-fail\"\n >\n {scenario.errorMessage}\n </pre>\n ) : null}\n <ReportSteps scenario={scenario} />\n {scenario.docEntries.length > 0 ? (\n <div data-es-docs className=\"mt-3\">\n <ReportDocEntries entries={scenario.docEntries} />\n </div>\n ) : null}\n <ReportAttachments attachments={scenario.attachments} />\n <ReportTrace spans={scenario.otelSpans} />\n </CardContent>\n </Card>\n );\n}\n","import type { ReportStep, ReportScenario } from \"executable-stories-core\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { ReportDocEntries } from \"./ReportDocEntries\";\nimport { highlightStepParams } from \"@/lib/step-params\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportStepsProps {\n scenario: ReportScenario;\n}\n\nconst STEP_GLYPH: Record<string, string> = {\n passed: \"✓\",\n failed: \"✗\",\n skipped: \"○\",\n pending: \"○\",\n};\n\nconst STEP_GLYPH_COLOR: Record<string, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\nexport function ReportSteps({ scenario }: ReportStepsProps) {\n if (scenario.steps.length === 0) return null;\n return (\n <ol data-slot=\"steps\" className=\"flex flex-col\">\n {scenario.steps.map((step) => (\n <ReportStepItem key={step.id} step={step} />\n ))}\n </ol>\n );\n}\n\nexport function ReportStepItem({ step }: { step: ReportStep }) {\n // And/But (incl. auto-And repeats) read as continuations of the prior step —\n // indented with a muted keyword, matching the report's `.step.continuation`.\n const kw = step.keyword.toLowerCase();\n const continuation = kw === \"and\" || kw === \"but\";\n return (\n <li\n id={step.id}\n data-status={step.status}\n className={cn(\"py-1.5 text-[0.8125rem] leading-normal\", continuation && \"pl-5\")}\n >\n <div className=\"flex items-baseline gap-2\">\n <span aria-hidden className={cn(\"w-4 shrink-0 text-center text-xs\", STEP_GLYPH_COLOR[step.status])}>\n {STEP_GLYPH[step.status] ?? \"○\"}\n </span>\n <span\n className={cn(\n \"min-w-[52px] shrink-0 font-mono text-xs font-semibold capitalize\",\n continuation ? \"font-medium text-muted-foreground\" : \"text-keyword\",\n )}\n >\n {step.keyword}\n </span>\n <span className=\"flex-1 text-foreground\">{highlightStepParams(step.text)}</span>\n {step.durationMs > 0 ? (\n <span className=\"shrink-0 whitespace-nowrap font-mono text-[0.6875rem] text-muted-foreground\">\n {formatDuration(step.durationMs)}\n </span>\n ) : null}\n </div>\n {step.errorMessage ? (\n <pre\n role=\"alert\"\n className=\"mt-2.5 ml-6 overflow-x-auto rounded-md border border-fail-border bg-fail-bg px-4 py-3.5 font-mono text-xs leading-relaxed whitespace-pre-wrap text-fail\"\n >\n {step.errorMessage}\n </pre>\n ) : null}\n {step.docEntries.length > 0 ? (\n <div data-es-docs className=\"mt-2 ml-6\">\n <ReportDocEntries entries={step.docEntries} />\n </div>\n ) : null}\n </li>\n );\n}\n","import type { ReportDocNote } from \"executable-stories-core\";\n\nexport function DocNote({ entry }: { entry: ReportDocNote }) {\n return <p className=\"my-2 text-sm text-muted-foreground\">{entry.text}</p>;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { useRender } from \"@base-ui/react/use-render\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90\",\n outline:\n \"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n ghost: \"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 [a&]:hover:underline\",\n passed: \"border-pass-border bg-pass-bg text-pass font-mono uppercase\",\n failed: \"border-fail-border bg-fail-bg text-fail font-mono uppercase\",\n skipped: \"border-skip-border bg-skip-bg text-skip font-mono uppercase\",\n pending: \"border-pend-border bg-pend-bg text-pend font-mono uppercase\",\n tag: \"border-pass-border bg-pass-bg text-pass font-mono font-medium\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & {\n // Base UI composition: pass `render={<a … />}` to swap the underlying tag —\n // replaces Radix's `asChild`. See rules/base-vs-radix.md.\n render?: useRender.RenderProp\n }) {\n return useRender({\n defaultTagName: \"span\",\n render,\n props: {\n \"data-slot\": \"badge\",\n \"data-variant\": variant,\n className: cn(badgeVariants({ variant }), className),\n ...props,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/** Merge class names with Tailwind-aware conflict resolution (shadcn `cn`). */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import type { ReportDocTag } from \"executable-stories-core\";\nimport { Badge } from \"@/components/ui/badge\";\n\nexport function DocTag({ entry }: { entry: ReportDocTag }) {\n return (\n <ul className=\"my-2 flex flex-wrap gap-1.5\" aria-label=\"Tags\">\n {entry.names.map((n) => (\n <li key={n}>\n <Badge variant=\"tag\">{n}</Badge>\n </li>\n ))}\n </ul>\n );\n}\n","import type { ReportDocKv } from \"executable-stories-core\";\n\nfunction formatValue(value: unknown): string {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function DocKv({ entry }: { entry: ReportDocKv }) {\n return (\n <dl className=\"my-2 flex flex-wrap items-baseline gap-x-2 text-sm\">\n <dt className=\"font-semibold text-muted-foreground\">{entry.label}</dt>\n <dd className=\"font-mono text-foreground\">{formatValue(entry.value)}</dd>\n </dl>\n );\n}\n","import { useContext } from \"react\";\nimport { ReportContext } from \"../context/ReportContext\";\nimport type { BuiltinRenderers, CustomRenderers } from \"../renderers\";\n\nconst EMPTY_CUSTOM: CustomRenderers = {};\nconst EMPTY_RENDERERS: BuiltinRenderers = {};\n\nexport function useCustomRenderers(): CustomRenderers {\n const ctx = useContext(ReportContext);\n return ctx?.customRenderers ?? EMPTY_CUSTOM;\n}\n\nexport function useBuiltinRenderers(): BuiltinRenderers {\n const ctx = useContext(ReportContext);\n return ctx?.renderers ?? EMPTY_RENDERERS;\n}\n","import type { ReactNode } from \"react\";\nimport type { ReportDocCode } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Shared shell for code blocks: optional label + the scrollable `<pre>`. Both\n * the static `DocCode` and the island's CDN-highlighted variant render their\n * `<code>` into this so the two can never drift in spacing or chrome.\n */\nexport function CodeFigure({ label, children }: { label?: string; children: ReactNode }) {\n return (\n <figure className=\"my-3\">\n {label ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{label}</figcaption>\n ) : null}\n <pre tabIndex={0} className=\"overflow-x-auto rounded-md bg-muted p-3\">\n {children}\n </pre>\n </figure>\n );\n}\n\nexport function DocCode({ entry }: { entry: ReportDocCode }) {\n const renderers = useBuiltinRenderers();\n if (renderers.code) {\n return <>{renderers.code(entry)}</>;\n }\n return (\n <CodeFigure label={entry.label}>\n <code className={cn(\"font-mono text-xs\", entry.lang && `language-${entry.lang}`)}>\n {entry.content}\n </code>\n </CodeFigure>\n );\n}\n","import type { ReportDocTable } from \"executable-stories-core\";\n\nexport function DocTable({ entry }: { entry: ReportDocTable }) {\n return (\n <figure className=\"my-3\">\n {entry.label ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n {entry.label}\n </figcaption>\n ) : null}\n <div tabIndex={0} className=\"overflow-x-auto rounded-md border border-border\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-muted/50\">\n {entry.columns.map((c) => (\n <th key={c} scope=\"col\" className=\"border-b border-border px-3 py-2 text-left font-semibold\">\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entry.rows.map((row, i) => (\n <tr key={i}>\n {row.map((cell, j) => (\n <td key={j} className=\"border-b border-border px-3 py-2 text-foreground\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </figure>\n );\n}\n","import type { ReportDocLink } from \"executable-stories-core\";\n\nexport function DocLink({ entry }: { entry: ReportDocLink }) {\n return (\n <a\n className=\"text-sm font-medium text-primary underline underline-offset-2 hover:no-underline\"\n href={entry.url}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n >\n {entry.label}\n </a>\n );\n}\n","import { marked } from \"marked\";\nimport type { ReportDocSection } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\nimport { safeUrl } from \"../../lib/url\";\n\n/**\n * Best-effort sanitizer for marked-generated HTML. `section` markdown is\n * authored in the test source (developer-trusted), so this is defense-in-depth,\n * not a hard boundary against hostile input. It:\n * - drops <script>/<style> and other active elements (iframe/object/embed/form)\n * - strips on* event-handler attributes\n * - neutralizes any non-http(s) scheme on href/src via the shared `safeUrl`\n * allow-list (covers javascript:/data:/vbscript:/file:, not just javascript:)\n *\n * It is NOT a substitute for a full HTML sanitizer (it won't catch entity-\n * obfuscated schemes). For untrusted markdown, supply `renderers.section` with\n * your own sanitizer.\n */\nfunction neutralizeUrl(value: string): string {\n return safeUrl(value) ?? \"#\";\n}\n\nfunction safeMarkdownHtml(markdown: string): string {\n const raw = marked.parse(markdown, { async: false }) as string;\n return raw\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<\\/?(?:iframe|object|embed|form|base)\\b[^>]*>/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*\"[^\"]*\"/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*'[^']*'/gi, \"\")\n .replace(/\\son[a-z]+\\s*=\\s*[^\\s>]+/gi, \"\")\n .replace(/(href|src)\\s*=\\s*\"([^\"]*)\"/gi, (_m, attr, val) => `${attr}=\"${neutralizeUrl(val)}\"`)\n .replace(/(href|src)\\s*=\\s*'([^']*)'/gi, (_m, attr, val) => `${attr}='${neutralizeUrl(val)}'`);\n}\n\nexport function DocSection({ entry }: { entry: ReportDocSection }) {\n const renderers = useBuiltinRenderers();\n if (renderers.section) {\n return <>{renderers.section(entry)}</>;\n }\n const html = safeMarkdownHtml(entry.markdown);\n return (\n <section className=\"my-3 text-sm\" aria-label={entry.title}>\n {entry.title ? <h4 className=\"mb-1 font-semibold text-foreground\">{entry.title}</h4> : null}\n <div\n className=\"es-doc-prose text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </section>\n );\n}\n","/**\n * A URL is safe to put in the DOM (href/src/poster) only if it's relative (no\n * scheme) or uses http/https. Anything with another scheme — notably\n * `javascript:` (which runs in the page context), plus `data:` / `vbscript:` /\n * `file:` — is rejected. Report JSON carries adapter-supplied URLs, so every\n * report-sourced URL that reaches the DOM is treated as untrusted and passed\n * through here (DocHtml iframe src, DocVideo src/poster, …).\n */\nexport function safeUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (scheme && !/^https?$/i.test(scheme[1] ?? \"\")) return undefined;\n return trimmed;\n}\n\n/**\n * Same trust boundary as safeUrl(), but for `<img src>`: also allows\n * `data:image/*` URIs, since that's how executable-stories-playwright's\n * story.screenshot() inlines a captured screenshot (see\n * inlineScreenshotIfPossible in that package). Browsers sandbox SVG rendered\n * via `<img>` — no script execution, no external resource loads — so\n * `data:image/svg+xml` is safe here even though data: URIs are rejected for\n * iframe/video src.\n */\nexport function safeImageUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^data:image\\//i.test(trimmed)) return trimmed;\n return safeUrl(trimmed);\n}\n\n/**\n * True for POSIX absolute paths (`/foo`, `\\foo`) and Windows drive-letter\n * paths (`C:\\foo`) — i.e. a local filesystem path rather than a URL. Report\n * assets are bundled (copied + rewritten to a relative `assets/...` path) at\n * format time when the source file can be found; a path that's still\n * absolute by the time it reaches the DOM means that bundling step couldn't\n * find the file — rendering it as `<img src>`/`<video src>` would 404 (or\n * silently resolve nothing) since it points at a path on the machine that\n * generated the report, not at the browser's origin.\n */\nexport function isLocalFsPath(value: string): boolean {\n return /^(?:[/\\\\]|[A-Za-z]:[/\\\\])/.test(value);\n}\n","import type { Ref } from \"react\";\nimport type { ReportDocMermaid } from \"executable-stories-core\";\nimport { useBuiltinRenderers } from \"../../hooks/useRenderers\";\n\n/**\n * The raw mermaid source as a semantic `<pre data-mermaid>`. This is the\n * default render and the universal fallback: AI agents, screen readers, and\n * no-JS views all get the readable source. `<MermaidDiagram>` upgrades this to\n * a drawn diagram on the client.\n */\nexport function MermaidSource({ entry, ref }: { entry: ReportDocMermaid; ref?: Ref<HTMLElement> }) {\n return (\n <figure ref={ref} className=\"my-3\" aria-label={entry.title ?? \"Diagram\"}>\n {entry.title ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{entry.title}</figcaption>\n ) : null}\n <pre\n data-mermaid\n tabIndex={0}\n className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground\"\n >\n {entry.code}\n </pre>\n </figure>\n );\n}\n\n/**\n * Renders mermaid source as a semantic `<pre data-mermaid>` by default.\n *\n * To draw the diagram, supply a `renderers.mermaid` prop — e.g. the shipped\n * `MermaidDiagram` (`renderers={{ mermaid: (e) => <MermaidDiagram entry={e} /> }}`).\n */\nexport function DocMermaid({ entry }: { entry: ReportDocMermaid }) {\n const renderers = useBuiltinRenderers();\n if (renderers.mermaid) {\n return <>{renderers.mermaid(entry)}</>;\n }\n return <MermaidSource entry={entry} />;\n}\n","import type { ReportDocScreenshot } from \"executable-stories-core\";\nimport { isLocalFsPath, safeImageUrl } from \"../../lib/url\";\n\n/**\n * A screenshot that's still an absolute local filesystem path by the time it\n * reaches this component means the report's asset bundler couldn't find the\n * file to inline/copy it (deleted, moved, or never captured — see\n * inlineScreenshotIfPossible in executable-stories-playwright). `<img src>`\n * would 404 against a path from the machine that generated the report, so\n * show a placeholder instead of a broken image.\n */\nexport function DocScreenshot({ entry }: { entry: ReportDocScreenshot }) {\n const src = isLocalFsPath(entry.path) ? undefined : safeImageUrl(entry.path);\n\n if (!src) {\n return (\n <figure className=\"my-3 rounded-md border border-dashed border-border p-3 text-sm text-muted-foreground\">\n <div className=\"font-medium\">Screenshot unavailable</div>\n <div className=\"mt-1 break-all font-mono text-xs\">{entry.path}</div>\n {entry.alt ? <figcaption className=\"mt-1.5 text-xs\">{entry.alt}</figcaption> : null}\n </figure>\n );\n }\n\n return (\n <figure className=\"my-3\">\n <img\n src={src}\n alt={entry.alt ?? \"\"}\n loading=\"lazy\"\n className=\"max-w-full rounded-md border border-border\"\n />\n {entry.alt ? <figcaption className=\"mt-1.5 text-xs text-muted-foreground\">{entry.alt}</figcaption> : null}\n </figure>\n );\n}\n","import type { ReportDocVideo } from \"executable-stories-core\";\nimport { isLocalFsPath, safeUrl } from \"../../lib/url\";\n\n/**\n * Renders a video doc entry. Video bytes are large and never inlined; `path` is\n * a URL or a path that resolves alongside the report. Both `path` and `poster`\n * are adapter-supplied, so they go through the same scheme allow-list as the\n * DocHtml iframe src (no `javascript:`/`data:` URLs reach the DOM).\n *\n * An absolute local filesystem path means the report's asset bundler\n * couldn't find/copy the file — a `<video src>` pointed at a runner-local\n * path would just fail to load, so show a placeholder instead.\n */\nexport function DocVideo({ entry }: { entry: ReportDocVideo }) {\n if (isLocalFsPath(entry.path)) {\n return (\n <figure className=\"my-3 rounded-md border border-dashed border-border p-3 text-sm text-muted-foreground\">\n <div className=\"font-medium\">Video unavailable</div>\n <div className=\"mt-1 break-all font-mono text-xs\">{entry.path}</div>\n {entry.caption ? <figcaption className=\"mt-1.5 text-xs\">{entry.caption}</figcaption> : null}\n </figure>\n );\n }\n\n const src = safeUrl(entry.path);\n const poster = safeUrl(entry.poster);\n return (\n <figure className=\"my-3\">\n <video\n controls\n preload=\"metadata\"\n {...(src ? { src } : {})}\n {...(poster ? { poster } : {})}\n className=\"max-w-full rounded-md border border-border\"\n />\n {entry.caption ? (\n <figcaption className=\"mt-1 text-xs text-muted-foreground\">{entry.caption}</figcaption>\n ) : null}\n </figure>\n );\n}\n","import type { ReportDocHtml } from \"executable-stories-core\";\nimport { safeUrl } from \"../../lib/url\";\n\n/**\n * Renders an embedded-HTML doc entry inside a SANDBOXED iframe. All embedded\n * HTML is untrusted, so the frame is `sandbox=\"allow-scripts\"` only (no\n * allow-same-origin) — embedded scripts run (charts work) but can't touch the\n * report DOM, cookies, or storage. Inline `content` → srcdoc (keeps the report\n * self-contained); `url`/`path` → src (scheme-validated).\n */\nexport function DocHtml({ entry }: { entry: ReportDocHtml }) {\n const height = typeof entry.height === \"number\" ? `${entry.height}px` : (entry.height ?? \"400px\");\n const title = entry.title ?? \"Embedded HTML\";\n const safeHref = safeUrl(entry.url ?? entry.path);\n\n // Exactly one of content / url / path is set. A url/path with an unsafe\n // scheme yields no src (the figure still renders, just empty).\n const frameProps = entry.content !== undefined ? { srcDoc: entry.content } : { src: safeHref ?? \"\" };\n\n return (\n <figure className=\"my-3 overflow-hidden rounded-md border border-border\">\n <figcaption className=\"flex items-center justify-between border-b border-border bg-muted/40 px-3 py-1.5 text-xs font-medium text-muted-foreground\">\n <span>{entry.title ?? \"HTML\"}</span>\n {safeHref ? (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n aria-label=\"Open in new tab\"\n title=\"Open in new tab\"\n className=\"text-primary\"\n >\n ↗\n </a>\n ) : null}\n </figcaption>\n <iframe\n {...frameProps}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n title={title}\n className=\"block w-full border-0\"\n style={{ height }}\n />\n </figure>\n );\n}\n","import type { ReportDocCustom } from \"executable-stories-core\";\nimport { useCustomRenderers } from \"../../hooks/useRenderers\";\n\nexport function DocCustom({ entry }: { entry: ReportDocCustom }) {\n const renderers = useCustomRenderers();\n const renderer = renderers[entry.type];\n if (renderer) {\n return <>{renderer(entry)}</>;\n }\n return (\n <div className=\"my-2\" data-type={entry.type}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{entry.type}</p>\n <pre tabIndex={0} className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs text-foreground\">\n {safeStringify(entry.data)}\n </pre>\n </div>\n );\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","import type { ReportDocEntry } from \"executable-stories-core\";\nimport { DocNote } from \"./DocNote\";\nimport { DocTag } from \"./DocTag\";\nimport { DocKv } from \"./DocKv\";\nimport { DocCode } from \"./DocCode\";\nimport { DocTable } from \"./DocTable\";\nimport { DocLink } from \"./DocLink\";\nimport { DocSection } from \"./DocSection\";\nimport { DocMermaid } from \"./DocMermaid\";\nimport { DocScreenshot } from \"./DocScreenshot\";\nimport { DocVideo } from \"./DocVideo\";\nimport { DocHtml } from \"./DocHtml\";\nimport { DocCustom } from \"./DocCustom\";\n\nexport function DocEntry({ entry }: { entry: ReportDocEntry }) {\n switch (entry.kind) {\n case \"note\":\n return <DocNote entry={entry} />;\n case \"tag\":\n return <DocTag entry={entry} />;\n case \"kv\":\n return <DocKv entry={entry} />;\n case \"code\":\n return <DocCode entry={entry} />;\n case \"table\":\n return <DocTable entry={entry} />;\n case \"link\":\n return <DocLink entry={entry} />;\n case \"section\":\n return <DocSection entry={entry} />;\n case \"mermaid\":\n return <DocMermaid entry={entry} />;\n case \"screenshot\":\n return <DocScreenshot entry={entry} />;\n case \"video\":\n return <DocVideo entry={entry} />;\n case \"html\":\n return <DocHtml entry={entry} />;\n case \"custom\":\n return <DocCustom entry={entry} />;\n }\n}\n","import type { ReportDocEntry } from \"executable-stories-core\";\nimport { DocEntry } from \"./doc/DocEntry\";\n\nexport interface ReportDocEntriesProps {\n entries: readonly ReportDocEntry[];\n}\n\nexport function ReportDocEntries({ entries }: ReportDocEntriesProps) {\n if (entries.length === 0) return null;\n return (\n <>\n {entries.map((entry, i) => (\n <DocEntry key={i} entry={entry} />\n ))}\n </>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/**\n * Highlight step parameters (double-quoted strings, standalone numbers) in step\n * text — the React equivalent of the report's highlightStepParams. Returns a\n * node array so the matched params can be wrapped in a styled <span> without\n * dangerouslySetInnerHTML.\n *\n * Regex mirrors the string renderer exactly:\n * - `\"[^\"]*\"` double-quoted strings (numbers inside quotes stay part of the string)\n * - `(?<![\\w.-])\\d+(?:\\.\\d+)?(?![\\w.-])` standalone numbers, dot/word-boundary aware\n */\nconst STEP_PARAM_PATTERN = /\"[^\"]*\"|(?<![\\w.-])\\d+(?:\\.\\d+)?(?![\\w.-])/g;\n\nexport function highlightStepParams(text: string): ReactNode {\n const matches = Array.from(text.matchAll(STEP_PARAM_PATTERN));\n if (matches.length === 0) return text;\n\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n matches.forEach((match, i) => {\n const start = match.index;\n const end = start + match[0].length;\n if (start > lastIndex) nodes.push(text.slice(lastIndex, start));\n nodes.push(\n <span key={i} className=\"font-medium text-step-param italic\">\n {match[0]}\n </span>,\n );\n lastIndex = end;\n });\n if (lastIndex < text.length) nodes.push(text.slice(lastIndex));\n return nodes;\n}\n","import type { ReportAttachment } from \"executable-stories-core\";\n\n/**\n * Renders scenario attachments. Base64 images embed inline; everything else\n * becomes a labelled data-URI download link. Mirrors the report's attachments\n * block (which also inlines images and links other media).\n */\nexport function ReportAttachments({ attachments }: { attachments: ReportAttachment[] }) {\n if (attachments.length === 0) return null;\n return (\n // role=\"group\" (not a labelled <section>) so multiple scenarios' attachment\n // blocks don't create duplicate \"Attachments\" region landmarks.\n <div role=\"group\" aria-label=\"Attachments\" className=\"mt-3 flex flex-col gap-2\">\n {attachments.map((att, i) => {\n const dataUri =\n att.contentEncoding === \"BASE64\"\n ? `data:${att.mediaType};base64,${att.body}`\n : `data:${att.mediaType},${encodeURIComponent(att.body)}`;\n const isImage = att.mediaType.startsWith(\"image/\");\n return (\n <figure key={`${att.name}-${i}`} className=\"m-0\">\n {isImage ? (\n <>\n <img\n src={dataUri}\n alt={att.name}\n loading=\"lazy\"\n className=\"max-w-full rounded-md border border-border\"\n />\n <figcaption className=\"mt-1 text-xs text-muted-foreground\">{att.name}</figcaption>\n </>\n ) : (\n <a\n href={dataUri}\n download={att.name}\n className=\"text-xs text-link underline underline-offset-2\"\n >\n {att.name} <span className=\"text-muted-foreground\">({att.mediaType})</span>\n </a>\n )}\n </figure>\n );\n })}\n </div>\n );\n}\n","import type { OtelSpan } from \"executable-stories-core/types/otel\";\nimport { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { toTraceRows, traceWindow } from \"@/lib/trace\";\nimport { cn } from \"@/lib/utils\";\n\nconst BAR_COLOR: Record<string, string> = {\n ok: \"bg-pass\",\n error: \"bg-fail\",\n unset: \"bg-skip\",\n};\n\n/**\n * OTel trace waterfall. Collapsed by default (native <details>, no JS) so it\n * renders in both the static and interactive reports. Each span is a row with a\n * depth-indented name and a bar positioned/sized by its time window.\n */\nexport function ReportTrace({ spans }: { spans: readonly OtelSpan[] | undefined }) {\n if (!spans || spans.length === 0) return null;\n const rows = toTraceRows(spans);\n if (rows.length === 0) return null;\n const { minStartMs, totalMs } = traceWindow(rows);\n\n return (\n <details className=\"mt-3 rounded-md border border-border bg-muted/30\">\n <summary className=\"cursor-pointer px-3 py-2 text-xs font-medium text-muted-foreground\">\n Trace ({rows.length} span{rows.length === 1 ? \"\" : \"s\"}, {formatDuration(totalMs)})\n </summary>\n <ul className=\"flex flex-col gap-0.5 px-3 pb-3 font-mono text-[0.6875rem]\">\n {rows.map((row, i) => {\n const leftPct = ((row.startTimeMs - minStartMs) / totalMs) * 100;\n const widthPct = Math.max((row.durationMs / totalMs) * 100, 0.5);\n return (\n <li key={`${row.spanId}-${i}`} className=\"flex items-center gap-2\">\n <span\n className=\"min-w-0 flex-1 truncate text-foreground\"\n style={{ paddingLeft: `${row.depth * 12}px` }}\n title={row.statusMessage ? `${row.name} — ${row.statusMessage}` : row.name}\n >\n {row.name}\n </span>\n <span className=\"relative h-3 w-1/2 shrink-0 overflow-hidden rounded-sm bg-border/40\">\n <span\n className={cn(\"absolute top-0 h-full rounded-sm\", BAR_COLOR[row.status])}\n style={{ left: `${leftPct}%`, width: `${widthPct}%` }}\n />\n </span>\n <span className=\"w-16 shrink-0 text-right text-muted-foreground\">\n {formatDuration(row.durationMs)}\n </span>\n </li>\n );\n })}\n </ul>\n </details>\n );\n}\n","/**\n * Pure span normalization + tree building for the OTel trace waterfall.\n * Ported from the formatters trace-view renderer so the React waterfall shows\n * the same structure. Side-effect-free for unit testing.\n */\n\nimport type { OtelSpan } from \"executable-stories-core/types/otel\";\n\nexport interface NormalizedSpan {\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeMs: number;\n durationMs: number;\n status: \"ok\" | \"error\" | \"unset\";\n statusMessage?: string;\n}\n\nexport interface TraceRow extends NormalizedSpan {\n depth: number;\n}\n\nconst VALID = new Set([\"ok\", \"error\", \"unset\"]);\nconst safeStatus = (s: string): NormalizedSpan[\"status\"] => (VALID.has(s) ? (s as NormalizedSpan[\"status\"]) : \"unset\");\n\nexport function normalizeSpans(spans: readonly OtelSpan[]): NormalizedSpan[] {\n const out: NormalizedSpan[] = [];\n for (const span of spans) {\n if (!span || typeof span.spanId !== \"string\" || typeof span.name !== \"string\") continue;\n let startTimeMs: number;\n let durationMs: number;\n if (span.startTimeMs != null && span.durationMs != null) {\n startTimeMs = span.startTimeMs;\n durationMs = span.durationMs;\n } else if (span.startTimeUnixNano != null && span.endTimeUnixNano != null) {\n startTimeMs = span.startTimeUnixNano / 1e6;\n durationMs = (span.endTimeUnixNano - span.startTimeUnixNano) / 1e6;\n } else {\n continue;\n }\n durationMs = Math.max(0, durationMs);\n if (!isFinite(startTimeMs) || !isFinite(durationMs)) continue;\n out.push({\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n startTimeMs,\n durationMs,\n status: safeStatus(span.status),\n statusMessage: span.statusMessage,\n });\n }\n return out;\n}\n\n/** Flatten spans into rows in tree order with a depth, parent before children. */\nexport function toTraceRows(spans: readonly OtelSpan[]): TraceRow[] {\n const normalized = normalizeSpans(spans);\n if (normalized.length === 0) return [];\n\n interface Node {\n span: NormalizedSpan;\n children: Node[];\n depth: number;\n }\n const byId = new Map<string, Node>();\n for (const span of normalized) {\n let key = span.spanId;\n let suffix = 2;\n while (byId.has(key)) key = `${span.spanId}__dup${suffix++}`;\n byId.set(key, { span: { ...span, spanId: key }, children: [], depth: 0 });\n }\n\n const roots: Node[] = [];\n for (const node of byId.values()) {\n const parent = node.span.parentSpanId ? byId.get(node.span.parentSpanId) : undefined;\n if (parent && parent !== node) parent.children.push(node);\n else roots.push(node);\n }\n for (const node of byId.values()) node.children.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);\n roots.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);\n\n const rows: TraceRow[] = [];\n const seen = new Set<string>();\n const walk = (node: Node, depth: number): void => {\n if (seen.has(node.span.spanId)) return;\n seen.add(node.span.spanId);\n rows.push({ ...node.span, depth });\n for (const child of node.children) walk(child, depth + 1);\n };\n for (const root of roots) walk(root, 0);\n // Orphans from cycles: promote to depth 0.\n for (const node of byId.values()) {\n if (!seen.has(node.span.spanId)) walk(node, 0);\n }\n return rows;\n}\n\nexport interface TraceWindow {\n minStartMs: number;\n totalMs: number;\n}\n\nexport function traceWindow(rows: readonly TraceRow[]): TraceWindow {\n let min = Infinity;\n let max = -Infinity;\n for (const r of rows) {\n min = Math.min(min, r.startTimeMs);\n max = Math.max(max, r.startTimeMs + r.durationMs);\n }\n const total = max - min;\n return { minStartMs: isFinite(min) ? min : 0, totalMs: total > 0 ? total : 1 };\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useState } from \"react\";\n\nexport interface CollapseApi {\n isCollapsed: (id: string) => boolean;\n toggle: (id: string) => void;\n}\n\n/**\n * Provided only inside <ReportInteractive>. When null (the static <Report/>\n * render, Storybook, Astro), components render fully expanded with no toggle\n * affordance — so the static path and component-tier tests are unaffected.\n */\nconst CollapseContext = createContext<CollapseApi | null>(null);\n\nexport const CollapseProvider = CollapseContext.Provider;\n\nexport function useCollapse(): CollapseApi | null {\n return useContext(CollapseContext);\n}\n\nconst STORAGE_KEY = \"es-collapsed-ids\";\n\nfunction readPersisted(): Set<string> {\n if (typeof localStorage === \"undefined\") return new Set();\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n return raw ? new Set(JSON.parse(raw) as string[]) : new Set();\n } catch {\n return new Set();\n }\n}\n\nfunction persist(ids: Set<string>): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...ids]));\n } catch {\n /* quota / disabled — collapse still works for the session */\n }\n}\n\n/**\n * Collapse state for the interactive report: a persisted set of collapsed\n * feature/scenario ids, plus expand-all / collapse-all.\n */\nexport function useCollapseState() {\n const [collapsed, setCollapsed] = useState<Set<string>>(readPersisted);\n\n const isCollapsed = useCallback((id: string) => collapsed.has(id), [collapsed]);\n\n const toggle = useCallback((id: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n persist(next);\n return next;\n });\n }, []);\n\n const collapseAll = useCallback((ids: string[]) => {\n setCollapsed(() => {\n const next = new Set(ids);\n persist(next);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n setCollapsed(() => {\n const next = new Set<string>();\n persist(next);\n return next;\n });\n }, []);\n\n return { api: { isCollapsed, toggle } as CollapseApi, collapseAll, expandAll };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ReportScenario } from \"executable-stories-core\";\n\nexport interface ScenarioActions {\n copyLink: (scenario: ReportScenario) => void;\n copyMarkdown: (scenario: ReportScenario) => void;\n copyPrompt: (scenario: ReportScenario) => void;\n}\n\n/**\n * Provided only inside <ReportInteractive>. When null (static render), scenarios\n * show no per-scenario action buttons.\n */\nconst ScenarioActionsContext = createContext<ScenarioActions | null>(null);\nexport const ScenarioActionsProvider = ScenarioActionsContext.Provider;\nexport function useScenarioActions(): ScenarioActions | null {\n return useContext(ScenarioActionsContext);\n}\n\n/** A scenario rendered as Markdown — for pasting into PRs / issues / docs. */\nexport function scenarioToMarkdown(scenario: ReportScenario): string {\n const lines: string[] = [`## ${scenario.title} _(${scenario.status})_`, \"\"];\n for (const step of scenario.steps) {\n lines.push(`- **${step.keyword}** ${step.text}`);\n }\n if (scenario.errorMessage) {\n lines.push(\"\", \"```\", scenario.errorMessage.trim(), \"```\");\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * A failed scenario rendered as an investigation prompt for an AI agent — the\n * \"cheap to verify\" loop: hand the agent the failing behaviour + error verbatim.\n */\nexport function scenarioToPrompt(scenario: ReportScenario): string {\n const lines: string[] = [\n `A test scenario is ${scenario.status}. Investigate the likely cause and propose a fix.`,\n \"\",\n `Scenario: ${scenario.title}`,\n \"Steps:\",\n ];\n for (const step of scenario.steps) {\n const mark = step.status === \"failed\" ? \" ⟵ failed here\" : \"\";\n lines.push(` ${step.keyword} ${step.text}${mark}`);\n }\n if (scenario.errorMessage) {\n lines.push(\"\", \"Error:\", scenario.errorMessage.trim());\n }\n if (scenario.errorStack) {\n lines.push(\"\", \"Stack:\", scenario.errorStack.trim());\n }\n return lines.join(\"\\n\");\n}\n\n/** Absolute permalink to a scenario in the current document. */\nexport function scenarioPermalink(scenario: ReportScenario): string {\n if (typeof location === \"undefined\") return `#${scenario.id}`;\n return `${location.href.split(\"#\")[0]}#${scenario.id}`;\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import type { ReportFeature } from \"executable-stories-core\";\nimport { ReportScenario } from \"./ReportScenario\";\n\nexport interface ReportScenarioListProps {\n feature: ReportFeature;\n}\n\nexport function ReportScenarioList({ feature }: ReportScenarioListProps) {\n return (\n <>\n {feature.scenarios.map((scenario) => (\n <ReportScenario key={scenario.id} scenario={scenario} />\n ))}\n </>\n );\n}\n","import type { ReportFeature as ReportFeatureT } from \"executable-stories-core\";\nimport { ReportScenarioList } from \"./ReportScenarioList\";\nimport { useCollapse } from \"../interactive/collapse-context\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportFeatureProps {\n feature: ReportFeatureT;\n}\n\n/**\n * Feature group — the report's `.feature` card: a header bar with the feature\n * title + mono source path and ✓/✗/○ status counts on the right, over a stack\n * of scenario cards. Kept a semantic <section> (a region), not a shadcn Card\n * div, so it stays a landmark and doesn't collide with the scenario cards'\n * `[data-slot=\"card\"]`.\n */\nexport function ReportFeature({ feature }: ReportFeatureProps) {\n const titleId = `${feature.id}-title`;\n const bodyId = `${feature.id}-body`;\n const s = feature.summary;\n const skipped = s.skipped + s.pending;\n const collapse = useCollapse();\n const collapsed = collapse?.isCollapsed(feature.id) ?? false;\n return (\n <section\n id={feature.id}\n data-slot=\"feature\"\n aria-labelledby={titleId}\n className=\"overflow-hidden rounded-xl border border-border bg-card shadow-sm\"\n >\n <div className=\"flex items-center justify-between gap-4 border-b border-border bg-muted/40 px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {collapse ? (\n <button\n type=\"button\"\n onClick={() => collapse.toggle(feature.id)}\n aria-expanded={!collapsed}\n aria-controls={bodyId}\n aria-label={`Toggle ${feature.title}`}\n className=\"shrink-0 cursor-pointer text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className={cn(\"inline-block text-xs transition-transform\", !collapsed && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n <div className=\"min-w-0\">\n <h2 id={titleId} className=\"text-sm font-semibold tracking-tight text-foreground\">\n {feature.title}\n </h2>\n <p className=\"mt-0.5 truncate font-mono text-xs text-muted-foreground\">{feature.sourceFile}</p>\n </div>\n </div>\n <div\n role=\"img\"\n className=\"flex shrink-0 items-center gap-2.5 font-mono text-xs font-medium\"\n aria-label={`${s.passed} passed, ${s.failed} failed, ${skipped} skipped`}\n >\n <span aria-hidden className=\"text-pass\">✓{s.passed}</span>\n <span aria-hidden className=\"text-fail\">✗{s.failed}</span>\n <span aria-hidden className=\"text-skip\">○{skipped}</span>\n </div>\n </div>\n <div id={bodyId} hidden={collapsed} className=\"flex flex-col gap-2 p-3\">\n <ReportScenarioList feature={feature} />\n </div>\n </section>\n );\n}\n","import { useReport } from \"../hooks/useReport\";\nimport { ReportFeature } from \"./ReportFeature\";\n\nexport function ReportFeatureList() {\n const report = useReport();\n return (\n <>\n {report.features.map((feature) => (\n <ReportFeature key={feature.id} feature={feature} />\n ))}\n </>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\n \"flex max-w-sm flex-col items-center gap-2 text-center\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\"text-lg font-medium tracking-tight\", className)}\n {...props}\n />\n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n","import { Empty, EmptyHeader, EmptyTitle } from \"@/components/ui/empty\";\n\nexport interface ReportEmptyProps {\n message?: string;\n}\n\nexport function ReportEmpty({ message }: ReportEmptyProps) {\n return (\n <Empty aria-live=\"polite\" className=\"border\">\n <EmptyHeader>\n <EmptyTitle>{message ?? \"No scenarios in this report.\"}</EmptyTitle>\n </EmptyHeader>\n </Empty>\n );\n}\n","import type { ReportSummary as ReportSummaryT } from \"executable-stories-core\";\nimport { useReport } from \"../hooks/useReport\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportSummaryProps {\n className?: string;\n}\n\nexport function ReportSummary({ className }: ReportSummaryProps) {\n const report = useReport();\n return (\n <ReportSummaryView\n summary={report.summary}\n {...(className !== undefined && { className })}\n ariaLabel=\"Run summary\"\n />\n );\n}\n\nexport interface ReportSummaryViewProps {\n summary: ReportSummaryT;\n className?: string;\n ariaLabel?: string;\n}\n\nexport function ReportSummaryView({ summary, className, ariaLabel }: ReportSummaryViewProps) {\n return (\n <p className={cn(\"text-sm text-muted-foreground\", className)} aria-label={ariaLabel}>\n <span>\n <strong className=\"font-semibold text-foreground\">{summary.total}</strong> scenario\n {summary.total === 1 ? \"\" : \"s\"}\n </span>\n {\" · \"}\n <span data-status=\"passed\" className=\"text-pass\">{summary.passed} passed</span>\n {\" · \"}\n <span data-status=\"failed\" className=\"text-fail\">{summary.failed} failed</span>\n {summary.skipped > 0 ? (\n <>\n {\" · \"}\n <span data-status=\"skipped\" className=\"text-skip\">{summary.skipped} skipped</span>\n </>\n ) : null}\n {summary.pending > 0 ? (\n <>\n {\" · \"}\n <span data-status=\"pending\" className=\"text-pend\">{summary.pending} pending</span>\n </>\n ) : null}\n </p>\n );\n}\n","import { formatDuration } from \"executable-stories-core/utils/duration\";\nimport { useReport } from \"../hooks/useReport\";\n\n/**\n * Run metadata line (started, duration, version, git SHA, CI) — the React\n * equivalent of the report's `.meta-info` block. Reads the top-level StoryReport\n * fields from context.\n */\nexport function ReportMeta() {\n const report = useReport();\n\n const items: Array<{ label: string; value: React.ReactNode }> = [];\n\n if (report.startedAtMs) {\n items.push({ label: \"Started\", value: new Date(report.startedAtMs).toLocaleString() });\n }\n if (report.durationMs) {\n items.push({ label: \"Duration\", value: formatDuration(report.durationMs) });\n }\n if (report.packageVersion) {\n items.push({ label: \"Version\", value: report.packageVersion });\n }\n if (report.gitSha) {\n items.push({ label: \"Commit\", value: report.gitSha.slice(0, 8) });\n }\n if (report.ci) {\n items.push({\n label: \"CI\",\n value: report.ci.url ? (\n <a href={report.ci.url} target=\"_blank\" rel=\"noreferrer noopener\" className=\"text-primary underline underline-offset-2\">\n {report.ci.name}\n {report.ci.buildNumber ? ` #${report.ci.buildNumber}` : \"\"}\n </a>\n ) : (\n `${report.ci.name}${report.ci.buildNumber ? ` #${report.ci.buildNumber}` : \"\"}`\n ),\n });\n }\n\n if (items.length === 0) return null;\n\n return (\n <dl aria-label=\"Run metadata\" className=\"flex flex-wrap gap-x-6 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item) => (\n <div key={item.label} className=\"flex gap-1.5\">\n <dt className=\"font-medium\">{item.label}</dt>\n <dd className=\"font-mono text-foreground\">{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import type { ReportParseError } from \"../result\";\n\nexport interface ReportSchemaErrorProps {\n error: ReportParseError;\n}\n\nexport function ReportSchemaError({ error }: ReportSchemaErrorProps) {\n return (\n <section className=\"es-schema-error\" role=\"alert\" aria-live=\"assertive\">\n <p>\n <strong>Report could not be displayed.</strong>\n </p>\n <p>{error.message}</p>\n {error.code === \"SCHEMA_VERSION_MISMATCH\" ? (\n <p>\n The report bundle is newer than this version of <code>executable-stories-react</code>.\n Upgrade the package, or regenerate the report with an older formatters CLI.\n </p>\n ) : null}\n {error.issues && error.issues.length > 0 ? (\n <details>\n <summary>{error.issues.length} validation issue{error.issues.length === 1 ? \"\" : \"s\"}</summary>\n <pre>\n {error.issues\n .slice(0, 20)\n .map((i) => `${i.path}: ${i.message}`)\n .join(\"\\n\")}\n </pre>\n </details>\n ) : null}\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { ReportParseError } from \"../result\";\nimport { cn } from \"../lib/utils\";\nimport { ReportSummary } from \"./ReportSummary\";\nimport { ReportMeta } from \"./ReportMeta\";\nimport { ReportSchemaError } from \"./ReportSchemaError\";\n\n/**\n * The report's title block — `<h1>` + summary + meta. Shared by the static\n * `Report` header and the interactive `ReportInteractive` header so the two\n * views can't drift on the no-JS fallback.\n */\nexport function ReportTitleBlock({ title }: { title?: string }) {\n return (\n <>\n <h1>{title ?? \"Story Report\"}</h1>\n <ReportSummary />\n <ReportMeta />\n </>\n );\n}\n\n/**\n * The `<main>` landmark shown when the report failed to parse. Both entrypoints\n * render the identical shell on a `Result` error, so it lives here once.\n */\nexport function ReportErrorShell({\n error,\n className,\n title,\n dataTheme,\n}: {\n error: ReportParseError;\n className?: string;\n title?: string;\n dataTheme?: \"light\" | \"dark\";\n}): ReactNode {\n return (\n <main className={cn(\"es-report\", className)} aria-label={title ?? \"Test report\"} data-theme={dataTheme}>\n <ReportSchemaError error={error} />\n </main>\n );\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useId,\n type ChangeEvent,\n type KeyboardEvent,\n} from \"react\";\n\nexport interface ReportSearchProps {\n value: string;\n onChange: (next: string) => void;\n matchedCount?: number;\n totalCount?: number;\n placeholder?: string;\n className?: string;\n}\n\nexport const ReportSearch = forwardRef<HTMLInputElement, ReportSearchProps>(\n function ReportSearch(props, ref) {\n const {\n value,\n onChange,\n matchedCount,\n totalCount,\n placeholder = \"Search scenarios, tags, or step text…\",\n className,\n } = props;\n const inputId = useId();\n const showCounts =\n typeof matchedCount === \"number\" && typeof totalCount === \"number\";\n\n function handleChange(e: ChangeEvent<HTMLInputElement>) {\n onChange(e.target.value);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Escape\" && value !== \"\") {\n onChange(\"\");\n e.preventDefault();\n }\n }\n\n return (\n <div className={[\"es-search\", className].filter(Boolean).join(\" \")}>\n <label htmlFor={inputId} className=\"es-search-label\">\n Search\n </label>\n <input\n ref={ref}\n id={inputId}\n type=\"search\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n aria-keyshortcuts=\"/\"\n />\n {showCounts ? (\n <span className=\"es-search-counts\" aria-live=\"polite\">\n {value\n ? `${matchedCount} of ${totalCount}`\n : `${totalCount} total`}\n </span>\n ) : null}\n </div>\n );\n },\n);\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { FailureRef } from \"./filter\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\n\nexport interface ReportFailureBannerProps {\n failures: readonly FailureRef[];\n}\n\nexport function ReportFailureBanner({ failures }: ReportFailureBannerProps) {\n const first = failures[0];\n\n const jumpToFirst = useCallback(() => {\n if (!first) return;\n scrollToScenarioId(first.scenarioId);\n }, [first]);\n\n if (failures.length === 0) return null;\n\n // A live status region: `role=\"status\"` is not a valid role on <aside>\n // (whose implicit role is `complementary`), so use a <div> to carry it.\n return (\n <div\n className=\"es-failure-banner\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Failure summary\"\n >\n <span className=\"es-failure-banner-text\">\n <strong>{failures.length}</strong>{\" \"}\n failure{failures.length === 1 ? \"\" : \"s\"}\n </span>\n <button\n type=\"button\"\n className=\"es-failure-banner-jump\"\n onClick={jumpToFirst}\n aria-label=\"Jump to first failure\"\n >\n Jump to first ↓\n </button>\n </div>\n );\n}\n","/**\n * Scroll helpers that honour `prefers-reduced-motion`.\n *\n * JS `scrollIntoView({ behavior: \"smooth\" })` bypasses the CSS\n * `scroll-behavior` cascade, so reduced-motion users must be handled\n * explicitly here rather than in the stylesheet.\n */\n\n/** True when the user has asked the OS to minimise non-essential motion. */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport interface ScrollToScenarioOptions {\n /** Replace the URL hash with `#<scenarioId>` after scrolling. Defaults to true. */\n updateHash?: boolean;\n}\n\n/**\n * Scrolls a scenario into view by id. No-op in SSR or when the element is\n * absent. Uses an instant jump for reduced-motion users, smooth otherwise.\n */\nexport function scrollToScenarioId(\n scenarioId: string,\n options: ScrollToScenarioOptions = {},\n): void {\n if (typeof document === \"undefined\") return;\n const el = document.getElementById(scenarioId);\n if (!el) return;\n el.scrollIntoView({\n behavior: prefersReducedMotion() ? \"auto\" : \"smooth\",\n block: \"start\",\n });\n if (options.updateHash !== false && typeof history !== \"undefined\") {\n history.replaceState(null, \"\", `#${scenarioId}`);\n }\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport interface ReportShortcutsHelpProps {\n open: boolean;\n onClose: () => void;\n}\n\nconst SHORTCUTS: ReadonlyArray<{ keys: string; description: string }> = [\n { keys: \"/\", description: \"Focus search\" },\n { keys: \"f\", description: \"Jump to next failure\" },\n { keys: \"Shift+F\", description: \"Jump to previous failure\" },\n { keys: \"Esc\", description: \"Clear search / close dialog\" },\n { keys: \"?\", description: \"Toggle this help\" },\n];\n\nexport function ReportShortcutsHelp({ open, onClose }: ReportShortcutsHelpProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open && !dialog.open) dialog.showModal();\n else if (!open && dialog.open) dialog.close();\n }, [open]);\n\n return (\n <dialog\n ref={dialogRef}\n className=\"es-shortcuts-help\"\n aria-label=\"Keyboard shortcuts\"\n onClose={onClose}\n >\n <h2>Keyboard shortcuts</h2>\n <dl>\n {SHORTCUTS.map((s) => (\n <div key={s.keys}>\n <dt>\n <kbd>{s.keys}</kbd>\n </dt>\n <dd>{s.description}</dd>\n </div>\n ))}\n </dl>\n <form method=\"dialog\">\n <button type=\"submit\" className=\"es-shortcuts-close\">Close</button>\n </form>\n </dialog>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport interface KeyboardShortcutHandlers {\n onFocusSearch?: () => void;\n onNextFailure?: () => void;\n onPrevFailure?: () => void;\n onToggleHelp?: () => void;\n onEscape?: () => void;\n onExpandAll?: () => void;\n onCollapseAll?: () => void;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\n/**\n * Attaches one keydown listener for the lifetime of the component, regardless\n * of how often the consumer passes a fresh handlers object. Handlers are read\n * from a ref so each keypress hits the latest version — see Vercel's\n * advanced-use-latest pattern.\n */\nexport function useKeyboardShortcuts(handlers: KeyboardShortcutHandlers): void {\n const ref = useRef(handlers);\n ref.current = handlers;\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n const h = ref.current;\n if (e.key === \"Escape\") {\n h.onEscape?.();\n return;\n }\n\n if (isEditableTarget(e.target)) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n switch (e.key) {\n case \"/\":\n h.onFocusSearch?.();\n e.preventDefault();\n return;\n case \"?\":\n h.onToggleHelp?.();\n e.preventDefault();\n return;\n case \"f\":\n h.onNextFailure?.();\n e.preventDefault();\n return;\n case \"F\":\n h.onPrevFailure?.();\n e.preventDefault();\n return;\n case \"e\":\n h.onExpandAll?.();\n e.preventDefault();\n return;\n case \"c\":\n h.onCollapseAll?.();\n e.preventDefault();\n return;\n default:\n return;\n }\n }\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, []);\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\n\n/**\n * Scrolls to a scenario by URL hash on mount and whenever the hash changes.\n * No-op in SSR (only runs in useEffect). Honours `prefers-reduced-motion`.\n */\nexport function useDeepLinkScroll(): void {\n useEffect(() => {\n function scrollToHash() {\n const hash = window.location.hash.replace(/^#/, \"\");\n if (!hash) return;\n // The hash is already in the URL; don't rewrite history on arrival.\n requestAnimationFrame(() => {\n scrollToScenarioId(hash, { updateHash: false });\n });\n }\n scrollToHash();\n window.addEventListener(\"hashchange\", scrollToHash);\n return () => window.removeEventListener(\"hashchange\", scrollToHash);\n }, []);\n}\n","/**\n * Pure functions for filtering a StoryReport by a search query.\n * Used by <ReportInteractive>. Kept side-effect-free so it can be unit-tested.\n */\n\nimport type {\n ReportScenario,\n ReportFeature,\n StoryReport,\n} from \"executable-stories-core\";\n\nexport type StatusFilter = \"all\" | \"passed\" | \"failed\" | \"skipped\" | \"pending\";\n\nexport interface FilterCriteria {\n query?: string;\n status?: StatusFilter;\n /** Scenario matches if it carries ANY of these tags (empty = no tag filter). */\n tags?: string[];\n}\n\nexport function normalizeQuery(query: string): string {\n return query.trim().toLowerCase();\n}\n\n/** Unique scenario tags across the whole report, in first-seen order. */\nexport function allTags(report: StoryReport): string[] {\n const seen = new Set<string>();\n for (const feature of report.features) {\n for (const scenario of feature.scenarios) {\n for (const tag of scenario.tags) seen.add(tag);\n }\n }\n return [...seen];\n}\n\nfunction queryMatches(scenario: ReportScenario, q: string): boolean {\n if (q === \"\") return true;\n if (scenario.title.toLowerCase().includes(q)) return true;\n for (const tag of scenario.tags) {\n if (tag.toLowerCase().includes(q)) return true;\n }\n for (const step of scenario.steps) {\n if (step.text.toLowerCase().includes(q)) return true;\n }\n return false;\n}\n\nfunction scenarioMatches(\n scenario: ReportScenario,\n q: string,\n status: StatusFilter,\n tags: string[],\n): boolean {\n if (status !== \"all\" && scenario.status !== status) return false;\n if (tags.length > 0 && !tags.some((t) => scenario.tags.includes(t))) return false;\n return queryMatches(scenario, q);\n}\n\nfunction summarizeScenarios(scenarios: ReportScenario[]) {\n let total = 0,\n passed = 0,\n failed = 0,\n skipped = 0,\n pending = 0,\n durationMs = 0;\n for (const s of scenarios) {\n total += 1;\n durationMs += s.durationMs;\n if (s.status === \"passed\") passed += 1;\n else if (s.status === \"failed\") failed += 1;\n else if (s.status === \"skipped\") skipped += 1;\n else pending += 1;\n }\n return { total, passed, failed, skipped, pending, durationMs };\n}\n\nexport function filterReport(report: StoryReport, criteria: string | FilterCriteria): StoryReport {\n const c: FilterCriteria = typeof criteria === \"string\" ? { query: criteria } : criteria;\n const q = normalizeQuery(c.query ?? \"\");\n const status = c.status ?? \"all\";\n const tags = c.tags ?? [];\n if (q === \"\" && status === \"all\" && tags.length === 0) return report;\n\n const features: ReportFeature[] = [];\n let topTotal = 0,\n topPassed = 0,\n topFailed = 0,\n topSkipped = 0,\n topPending = 0,\n topDuration = 0;\n\n for (const feature of report.features) {\n const matched = feature.scenarios.filter((s) => scenarioMatches(s, q, status, tags));\n if (matched.length === 0) continue;\n const summary = summarizeScenarios(matched);\n features.push({ ...feature, summary, scenarios: matched });\n topTotal += summary.total;\n topPassed += summary.passed;\n topFailed += summary.failed;\n topSkipped += summary.skipped;\n topPending += summary.pending;\n topDuration += summary.durationMs;\n }\n\n return {\n ...report,\n summary: {\n total: topTotal,\n passed: topPassed,\n failed: topFailed,\n skipped: topSkipped,\n pending: topPending,\n durationMs: topDuration,\n },\n features,\n };\n}\n\nexport interface FailureRef {\n featureId: string;\n scenarioId: string;\n scenarioTitle: string;\n errorMessage?: string;\n}\n\nexport function listFailures(report: StoryReport): FailureRef[] {\n const out: FailureRef[] = [];\n for (const feature of report.features) {\n for (const scenario of feature.scenarios) {\n if (scenario.status === \"failed\") {\n const ref: FailureRef = {\n featureId: feature.id,\n scenarioId: scenario.id,\n scenarioTitle: scenario.title,\n };\n if (scenario.errorMessage !== undefined) {\n ref.errorMessage = scenario.errorMessage;\n }\n out.push(ref);\n }\n }\n }\n return out;\n}\n","\"use client\";\n\nimport type { StatusFilter } from \"./filter\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ReportFiltersProps {\n /** Status options to show (only those present in the run), with counts. */\n statuses: Array<{ key: StatusFilter; label: string; count: number }>;\n status: StatusFilter;\n onStatus: (status: StatusFilter) => void;\n tags: string[];\n activeTags: string[];\n onToggleTag: (tag: string) => void;\n}\n\nexport function ReportFilters({\n statuses,\n status,\n onStatus,\n tags,\n activeTags,\n onToggleTag,\n}: ReportFiltersProps) {\n if (statuses.length === 0 && tags.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-2\">\n {statuses.length > 0 ? (\n <div role=\"group\" aria-label=\"Filter by status\" className=\"flex flex-wrap gap-1\">\n {statuses.map((opt) => {\n const active = status === opt.key;\n return (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={active}\n onClick={() => onStatus(active && opt.key !== \"all\" ? \"all\" : opt.key)}\n className={cn(\n \"cursor-pointer rounded-md border px-2 py-1 text-xs transition-colors\",\n active\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border text-muted-foreground hover:bg-muted hover:text-foreground\",\n )}\n >\n {opt.label}\n <span className=\"ml-1 font-mono opacity-70\">{opt.count}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n {tags.length > 0 ? (\n <ul aria-label=\"Filter by tag\" className=\"flex flex-wrap gap-1.5\">\n {tags.map((tag) => {\n const active = activeTags.includes(tag);\n return (\n <li key={tag}>\n <button\n type=\"button\"\n aria-pressed={active}\n onClick={() => onToggleTag(tag)}\n className=\"cursor-pointer\"\n >\n <Badge variant={active ? \"default\" : \"tag\"}>{tag}</Badge>\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useReport } from \"../hooks/useReport\";\nimport { scrollToScenarioId } from \"../lib/scroll\";\nimport { cn } from \"@/lib/utils\";\n\nconst DOT: Record<string, string> = {\n passed: \"text-pass\",\n failed: \"text-fail\",\n skipped: \"text-skip\",\n pending: \"text-pend\",\n};\n\n/**\n * Sticky table-of-contents nav for the interactive report. Reads the (filtered)\n * report from context, so it syncs with search/status/tag filters automatically.\n * Tracks the scenario nearest the top of the viewport via IntersectionObserver.\n */\nexport function ReportToc() {\n const report = useReport();\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const scenarioIds = useMemo(\n () => report.features.flatMap((f) => f.scenarios.map((s) => s.id)),\n [report],\n );\n\n useEffect(() => {\n if (typeof IntersectionObserver === \"undefined\") return;\n const els = scenarioIds\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n if (els.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (visible[0]) setActiveId(visible[0].target.id);\n },\n { rootMargin: \"-8% 0px -80% 0px\" },\n );\n els.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [scenarioIds]);\n\n if (report.features.length === 0) return null;\n\n return (\n <nav\n aria-label=\"Table of contents\"\n className=\"sticky top-4 hidden h-fit w-56 shrink-0 self-start text-xs lg:block\"\n >\n <ul className=\"flex flex-col gap-3\">\n {report.features.map((feature) => (\n <li key={feature.id}>\n <p className=\"mb-1 truncate font-semibold text-foreground\">{feature.title}</p>\n <ul className=\"flex flex-col\">\n {feature.scenarios.map((scenario) => {\n const active = activeId === scenario.id;\n return (\n <li key={scenario.id}>\n <a\n href={`#${scenario.id}`}\n onClick={(e) => {\n e.preventDefault();\n scrollToScenarioId(scenario.id, { updateHash: true });\n }}\n aria-current={active ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-1.5 truncate border-l-2 py-0.5 pl-2 hover:text-foreground\",\n active\n ? \"border-primary font-medium text-foreground\"\n : \"border-border text-muted-foreground\",\n )}\n >\n <span aria-hidden className={cn(\"shrink-0\", DOT[scenario.status])}>•</span>\n <span className=\"truncate\">{scenario.title}</span>\n </a>\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\ntype Theme = \"light\" | \"dark\";\nconst KEY = \"es-theme\";\n\nfunction applyTheme(theme: Theme): void {\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-theme\", theme);\n }\n}\n\nfunction initialTheme(): Theme {\n if (typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(KEY);\n if (stored === \"light\" || stored === \"dark\") return stored;\n }\n if (typeof document !== \"undefined\" && document.documentElement.getAttribute(\"data-theme\") === \"dark\") {\n return \"dark\";\n }\n if (typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return \"dark\";\n }\n return \"light\";\n}\n\n/**\n * Dark/light theme toggle for the standalone report. Flips `data-theme` on\n * <html> (the Tailwind `dark` variant keys on any ancestor) and persists the\n * choice. No-ops gracefully outside the browser.\n */\nexport function useTheme(): { theme: Theme; toggle: () => void } {\n const [theme, setTheme] = useState<Theme>(\"light\");\n\n useEffect(() => {\n const t = initialTheme();\n setTheme(t);\n applyTheme(t);\n }, []);\n\n const toggle = useCallback(() => {\n setTheme((prev) => {\n const next: Theme = prev === \"dark\" ? \"light\" : \"dark\";\n applyTheme(next);\n try {\n localStorage.setItem(KEY, next);\n } catch {\n /* disabled / quota */\n }\n return next;\n });\n }, []);\n\n return { theme, toggle };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { StoryReport } from \"executable-stories-core\";\nimport type { Result } from \"../result\";\nimport { ReportInteractive } from \"./ReportInteractive\";\nimport { buildIslandRenderers } from \"./island-renderers\";\n\nexport interface ReportInteractiveIslandProps {\n report: StoryReport | Result<StoryReport>;\n title?: string;\n className?: string;\n hideHeader?: boolean;\n /** Render code blocks with CDN highlight.js (default true). */\n syntaxHighlighting?: boolean;\n /** Render `story.mermaid(...)` blocks as CDN-loaded SVG diagrams (default true). */\n mermaid?: boolean;\n}\n\n/**\n * Self-contained interactive island for host frameworks that hydrate this as a\n * client island (e.g. Astro `<ReportInteractiveIsland client:load/>`).\n *\n * Frameworks like Astro serialize island props as JSON, so they CANNOT pass the\n * `renderers` functions to <ReportInteractive> directly — which is why a host\n * would otherwise fall back to a separate post-hydration script that mutates the\n * island's DOM (and gets clobbered when the island re-renders). This wrapper\n * builds the React-OWNED highlighting + mermaid renderers internally, so the\n * enhancements live inside the React tree and survive every re-render. The\n * heavy libraries load from a CDN at runtime, so the host bundle stays lean.\n */\nexport function ReportInteractiveIsland({\n report,\n title,\n className,\n hideHeader,\n syntaxHighlighting = true,\n mermaid = true,\n}: ReportInteractiveIslandProps) {\n const renderers = useMemo(\n () => buildIslandRenderers({ syntaxHighlighting, mermaid }),\n [syntaxHighlighting, mermaid],\n );\n return (\n <ReportInteractive\n report={report}\n title={title}\n className={className}\n hideHeader={hideHeader}\n renderers={renderers}\n />\n );\n}\n","\"use client\";\n\n/**\n * Built-in renderer overrides for the standalone report island.\n *\n * The static HTML emits readable `<pre data-mermaid>` / `<pre><code>` fallbacks.\n * When the interactive island takes over (createRoot), it OWNS that DOM and will\n * clobber any externally-applied highlight spans / detach mermaid's injected SVG\n * on its next render. So highlighting + mermaid must live INSIDE the React tree\n * (rendered into state, owned by React) rather than as post-processing scripts\n * mutating island-managed nodes. These renderers do exactly that, loading the\n * heavy libraries from a CDN at runtime so they never bloat the inlined island.\n */\n\nimport { createElement, useEffect, useState } from \"react\";\nimport type { ReportDocCode } from \"executable-stories-core\";\nimport { MermaidView, type MermaidApi } from \"../components/doc/MermaidView\";\nimport { CodeFigure } from \"../components/doc/DocCode\";\nimport type { BuiltinRenderers } from \"../renderers\";\nimport { cn } from \"../lib/utils\";\n\n// CDN URLs mirror ssr-entry's cdnAssets so the standalone report stays\n// version-pinned and works offline-degraded (falls back to the readable source).\nconst HLJS_ESM = \"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/es/highlight.min.js\";\nconst MERMAID_ESM = \"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs\";\n\n/**\n * Import a module from a CDN URL once, caching the promise. The URL is passed as\n * a variable so it stays opaque to the bundler — the heavy library is loaded at\n * runtime, never inlined into the island. `default ?? namespace` tolerates both\n * default and namespace CDN builds.\n */\nfunction cachedCdnModule<T>(url: string): () => Promise<T> {\n let loader: Promise<T> | undefined;\n return () => {\n // Intentional runtime dynamic import of a CDN URL (not bundled into the island).\n // eslint-disable-next-line no-restricted-syntax\n loader ??= import(/* @vite-ignore */ /* webpackIgnore: true */ url).then((m) => (m.default ?? m) as T);\n return loader;\n };\n}\n\nconst loadMermaidFromCdn = cachedCdnModule<MermaidApi>(MERMAID_ESM);\n\ninterface Hljs {\n highlight(code: string, opts: { language: string; ignoreIllegals?: boolean }): { value: string };\n highlightAuto(code: string): { value: string };\n getLanguage(name: string): unknown;\n}\nconst loadHljs = cachedCdnModule<Hljs>(HLJS_ESM);\n\n/**\n * Code block whose syntax highlighting is produced by highlight.js loaded from\n * the CDN, rendered into React-owned markup via state. Falls back to the plain\n * (escaped) source before load and on any failure.\n */\nfunction CdnHighlightedCode({ entry }: { entry: ReportDocCode }) {\n const [html, setHtml] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const hljs = await loadHljs();\n const lang = entry.lang && hljs.getLanguage(entry.lang) ? entry.lang : undefined;\n const result = lang\n ? hljs.highlight(entry.content, { language: lang, ignoreIllegals: true })\n : hljs.highlightAuto(entry.content);\n if (!cancelled) setHtml(result.value);\n } catch {\n if (!cancelled) setHtml(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [entry.content, entry.lang]);\n\n return (\n <CodeFigure label={entry.label}>\n {html !== null ? (\n <code\n className={cn(\"hljs font-mono text-xs\", entry.lang && `language-${entry.lang}`)}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <code className={cn(\"font-mono text-xs\", entry.lang && `language-${entry.lang}`)}>{entry.content}</code>\n )}\n </CodeFigure>\n );\n}\n\nexport interface IslandRendererOptions {\n syntaxHighlighting: boolean;\n mermaid: boolean;\n}\n\n/**\n * Build the BuiltinRenderers map the island passes to <ReportInteractive>.\n * Created once at mount so the renderer functions stay referentially stable.\n */\nexport function buildIslandRenderers(opts: IslandRendererOptions): BuiltinRenderers {\n const renderers: BuiltinRenderers = {};\n if (opts.mermaid) {\n renderers.mermaid = (entry) => createElement(MermaidView, { entry, load: loadMermaidFromCdn });\n }\n if (opts.syntaxHighlighting) {\n renderers.code = (entry) => createElement(CdnHighlightedCode, { entry });\n }\n return renderers;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReportDocMermaid } from \"executable-stories-core\";\nimport { MermaidSource } from \"./DocMermaid\";\n\nexport type MermaidApi = typeof import(\"mermaid\").default;\nexport type MermaidLoader = () => Promise<MermaidApi>;\n\nfunction prefersDark(el: HTMLElement | null): boolean {\n const themed = el?.closest<HTMLElement>(\"[data-theme]\");\n if (themed?.dataset.theme === \"dark\") return true;\n if (themed?.dataset.theme === \"light\") return false;\n return typeof window !== \"undefined\" && !!window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Presentational mermaid renderer with the loader INJECTED — it contains no\n * literal `import(\"mermaid\")`, so a bundler following this module never pulls\n * mermaid in. `MermaidDiagram` wraps this with the installed-package loader;\n * the standalone report island wraps it with a CDN loader so the heavy library\n * never bloats the inlined island bundle.\n *\n * Draws the diagram to inline SVG (React-owned via state, so an island\n * re-render can't clobber it), redraws when the report's `data-theme` flips,\n * and falls back to `<MermaidSource>` (the readable, agent-friendly code) on\n * the server, before load, and on any error.\n */\nexport function MermaidView({ entry, load }: { entry: ReportDocMermaid; load: MermaidLoader }) {\n const ref = useRef<HTMLElement>(null);\n const [svg, setSvg] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const draw = async () => {\n try {\n const mermaid = await load();\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: \"strict\",\n theme: prefersDark(ref.current) ? \"dark\" : \"default\",\n });\n const id = `es-mermaid-${Math.random().toString(36).slice(2)}`;\n const { svg: rendered } = await mermaid.render(id, entry.code);\n if (!cancelled) setSvg(rendered);\n } catch {\n if (!cancelled) setSvg(null);\n }\n };\n void draw();\n\n // Redraw when the report toggles theme on an ancestor.\n const themed = ref.current?.closest<HTMLElement>(\"[data-theme]\");\n const observer = themed ? new MutationObserver(() => void draw()) : undefined;\n observer?.observe(themed!, { attributes: true, attributeFilter: [\"data-theme\"] });\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n };\n }, [entry.code, load]);\n\n if (svg) {\n return (\n <figure ref={ref} className=\"my-3\">\n {entry.title ? (\n <figcaption className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{entry.title}</figcaption>\n ) : null}\n {/* role=\"img\" presents the diagram as a single labelled graphic. */}\n <div\n role=\"img\"\n aria-label={entry.title ?? \"Mermaid diagram\"}\n className=\"overflow-x-auto rounded-md border border-border bg-card p-3 [&_svg]:mx-auto [&_svg]:h-auto [&_svg]:max-w-full\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </figure>\n );\n }\n\n // Pre-render / fallback: the readable source. The ref lets the effect locate\n // the themed ancestor from the same DOM position before the SVG swaps in.\n return <MermaidSource entry={entry} ref={ref} />;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useRef","useState","formatDuration","jsx","jsx","jsx","useContext","EMPTY_CUSTOM","EMPTY_RENDERERS","useContext","jsx","jsxs","jsx","jsxs","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","Fragment","jsx","jsx","jsx","jsxs","Fragment","jsx","jsxs","formatDuration","jsx","jsxs","formatDuration","createContext","useContext","createContext","useContext","jsx","jsx","jsx","jsxs","formatDuration","Fragment","jsx","jsx","jsxs","Fragment","jsx","cva","jsx","cva","jsx","jsx","Fragment","jsx","jsxs","formatDuration","jsx","jsxs","formatDuration","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","ReportSearch","useCallback","jsx","jsxs","useCallback","jsx","jsxs","useEffect","useRef","useEffect","useEffect","jsx","jsxs","useEffect","useMemo","useState","jsx","jsxs","useState","useMemo","useEffect","useCallback","useEffect","useState","jsx","jsxs","useState","useRef","useMemo","useCallback","useMemo","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","jsx","useState","useEffect","jsx","useMemo"]}