@flanksource/clicky-ui 0.2.17 → 0.2.19

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.
Files changed (83) hide show
  1. package/dist/components/FilterBar.cjs +5 -0
  2. package/dist/components/FilterBar.cjs.map +1 -1
  3. package/dist/components/FilterBar.js +5 -0
  4. package/dist/components/FilterBar.js.map +1 -1
  5. package/dist/components/json-schema-form-types.d.ts +2 -0
  6. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  7. package/dist/components.cjs +7 -0
  8. package/dist/components.cjs.map +1 -1
  9. package/dist/components.d.ts +4 -1
  10. package/dist/components.d.ts.map +1 -1
  11. package/dist/components.js +8 -1
  12. package/dist/components.js.map +1 -1
  13. package/dist/data/TabButton.cjs +17 -2
  14. package/dist/data/TabButton.cjs.map +1 -1
  15. package/dist/data/TabButton.d.ts +5 -1
  16. package/dist/data/TabButton.d.ts.map +1 -1
  17. package/dist/data/TabButton.js +17 -2
  18. package/dist/data/TabButton.js.map +1 -1
  19. package/dist/data/test-runner/TestDetailPanel.cjs +8 -1
  20. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  21. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  22. package/dist/data/test-runner/TestDetailPanel.js +8 -1
  23. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  24. package/dist/data/test-runner/TestRunner.cjs +6 -0
  25. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  26. package/dist/data/test-runner/TestRunner.d.ts +5 -1
  27. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  28. package/dist/data/test-runner/TestRunner.js +6 -0
  29. package/dist/data/test-runner/TestRunner.js.map +1 -1
  30. package/dist/data/test-runner/context.cjs.map +1 -1
  31. package/dist/data/test-runner/context.d.ts +7 -0
  32. package/dist/data/test-runner/context.d.ts.map +1 -1
  33. package/dist/data/test-runner/context.js.map +1 -1
  34. package/dist/data/test-runner/index.d.ts +1 -0
  35. package/dist/data/test-runner/index.d.ts.map +1 -1
  36. package/dist/data/test-runner/routePath.cjs +39 -0
  37. package/dist/data/test-runner/routePath.cjs.map +1 -0
  38. package/dist/data/test-runner/routePath.d.ts +11 -0
  39. package/dist/data/test-runner/routePath.d.ts.map +1 -0
  40. package/dist/data/test-runner/routePath.js +39 -0
  41. package/dist/data/test-runner/routePath.js.map +1 -0
  42. package/dist/data/version-info.cjs +3 -3
  43. package/dist/data/version-info.js +3 -3
  44. package/dist/data.cjs +4 -0
  45. package/dist/data.cjs.map +1 -1
  46. package/dist/data.d.ts +1 -1
  47. package/dist/data.d.ts.map +1 -1
  48. package/dist/data.js +4 -0
  49. package/dist/data.js.map +1 -1
  50. package/dist/index.cjs +11 -0
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.js +12 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/layout/AppShell.cjs +182 -0
  55. package/dist/layout/AppShell.cjs.map +1 -0
  56. package/dist/layout/AppShell.d.ts +75 -0
  57. package/dist/layout/AppShell.d.ts.map +1 -0
  58. package/dist/layout/AppShell.js +182 -0
  59. package/dist/layout/AppShell.js.map +1 -0
  60. package/dist/layout/Panel.cjs +66 -0
  61. package/dist/layout/Panel.cjs.map +1 -0
  62. package/dist/layout/Panel.d.ts +34 -0
  63. package/dist/layout/Panel.d.ts.map +1 -0
  64. package/dist/layout/Panel.js +66 -0
  65. package/dist/layout/Panel.js.map +1 -0
  66. package/dist/layout/Tabs.cjs +36 -0
  67. package/dist/layout/Tabs.cjs.map +1 -0
  68. package/dist/layout/Tabs.d.ts +36 -0
  69. package/dist/layout/Tabs.d.ts.map +1 -0
  70. package/dist/layout/Tabs.js +36 -0
  71. package/dist/layout/Tabs.js.map +1 -0
  72. package/dist/styles.cjs +1 -0
  73. package/dist/styles.cjs.map +1 -1
  74. package/dist/styles.css +1 -1
  75. package/dist/styles.d.ts.map +1 -1
  76. package/dist/styles.js +1 -0
  77. package/dist/styles.js.map +1 -1
  78. package/dist/tailwind-preset.cjs +36 -19
  79. package/dist/tailwind-preset.cjs.map +1 -1
  80. package/dist/tailwind-preset.d.ts.map +1 -1
  81. package/dist/tailwind-preset.js +36 -19
  82. package/dist/tailwind-preset.js.map +1 -1
  83. package/package.json +1 -1
@@ -36,6 +36,8 @@ function TestRunner({
36
36
  statusText,
37
37
  now,
38
38
  busy,
39
+ activeTab,
40
+ onTabChange,
39
41
  onSelect,
40
42
  onFiltersChange,
41
43
  onExpandAllChange,
@@ -60,6 +62,8 @@ function TestRunner({
60
62
  filters,
61
63
  expandAll,
62
64
  busy: busy ?? {},
65
+ activeTab,
66
+ onTabChange,
63
67
  onSelect,
64
68
  onFiltersChange,
65
69
  onExpandAllChange,
@@ -77,6 +81,8 @@ function TestRunner({
77
81
  filters,
78
82
  expandAll,
79
83
  busy,
84
+ activeTab,
85
+ onTabChange,
80
86
  onSelect,
81
87
  onFiltersChange,
82
88
  onExpandAllChange,
@@ -1 +1 @@
1
- {"version":3,"file":"TestRunner.js","sources":["../../../src/data/test-runner/TestRunner.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport { UiBeaker } from \"../../icons\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport { collectFrameworks, sumNonTaskTests, type StatusCounts } from \"./status\";\nimport { type TestFilters } from \"./filterState\";\nimport {\n createTestRunnerRegistry,\n type TestNodeAdapter,\n TestNodeAdapterRegistry,\n} from \"./adapter\";\nimport { TestRunnerProvider, type TestRunnerContext } from \"./context\";\nimport { TestTree } from \"./TestTree\";\nimport { TestDetailPanel } from \"./TestDetailPanel\";\nimport { TestRunSummary } from \"./TestRunSummary\";\nimport { TestFilterBar } from \"./TestFilterBar\";\n\nexport type TestRunnerProps = {\n tests: Test[];\n selected: Test | null;\n filters: TestFilters;\n expandAll: boolean | null;\n done: boolean;\n runMeta?: RunMeta;\n status?: SnapshotStatus;\n /** Free-form status line shown next to the title (e.g. \"Running tests...\"). */\n statusText?: string;\n now?: number;\n busy?: { rerun?: boolean; stop?: boolean };\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n onRerun?: (node: Test) => void;\n onStop?: (node: Test) => void;\n\n /** Domain node adapters, or a pre-built registry. Defaults to default-only. */\n adapters?: TestNodeAdapter[] | TestNodeAdapterRegistry;\n /** Extra header content (e.g. export/download controls owned by the host). */\n headerSlot?: ReactNode;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n startTime?: number | null;\n endTime?: number | null;\n className?: string;\n};\n\nfunction counts(tests: Test[]): StatusCounts {\n return tests.reduce(\n (acc, t) => {\n const s = sumNonTaskTests(t);\n (Object.keys(acc) as (keyof StatusCounts)[]).forEach((k) => (acc[k] += s[k]));\n return acc;\n },\n { total: 0, passed: 0, failed: 0, warned: 0, skipped: 0, pending: 0, running: 0, timedout: 0 },\n );\n}\n\nfunction toRegistry(\n adapters: TestNodeAdapter[] | TestNodeAdapterRegistry | undefined,\n): TestNodeAdapterRegistry {\n if (adapters instanceof TestNodeAdapterRegistry) return adapters;\n return createTestRunnerRegistry(adapters ?? []);\n}\n\n/**\n * Top-level, pure-presentational test runner: a summary/filter header over a\n * resizable tree + detail split. All data and handlers flow in via props and\n * are exposed to sub-components through a single `TestRunnerContext`. Domain\n * rendering is pluggable via node adapters; no fetch/SSE/routing lives here.\n */\nexport function TestRunner({\n tests,\n selected,\n filters,\n expandAll,\n done,\n runMeta,\n status,\n statusText,\n now,\n busy,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n adapters,\n headerSlot,\n defaultSplit = 45,\n startTime,\n endTime,\n className,\n}: TestRunnerProps) {\n const registry = useMemo(() => toRegistry(adapters), [adapters]);\n\n const ctx: TestRunnerContext = useMemo(\n () => ({\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy: busy ?? {},\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n adapters: registry,\n }),\n [\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n registry,\n ],\n );\n\n const frameworks = useMemo(() => collectFrameworks(tests), [tests]);\n const filterCounts = useMemo(() => counts(tests), [tests]);\n const hasContent = tests.length > 0;\n\n return (\n <TestRunnerProvider value={ctx}>\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n <div className=\"border-b border-border bg-card px-density-4 py-density-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"inline-flex items-center gap-1.5 text-lg font-bold\">\n <Icon icon={UiBeaker} className=\"text-primary\" />\n Test Results\n </h1>\n {statusText && <span className=\"text-sm text-muted-foreground\">{statusText}</span>}\n </div>\n <div className=\"flex items-center gap-3\">\n {headerSlot}\n <TestRunSummary\n tests={tests}\n startTime={startTime}\n endTime={endTime}\n done={done}\n now={now}\n runMeta={runMeta}\n />\n </div>\n </div>\n {hasContent && (\n <div className=\"mt-2\">\n <TestFilterBar\n filters={filters}\n onChange={onFiltersChange}\n counts={filterCounts}\n frameworks={frameworks}\n />\n </div>\n )}\n </div>\n\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={<TestTree />}\n right={<TestDetailPanel />}\n />\n </div>\n </TestRunnerProvider>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestRunner.js","sources":["../../../src/data/test-runner/TestRunner.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport { UiBeaker } from \"../../icons\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport { collectFrameworks, sumNonTaskTests, type StatusCounts } from \"./status\";\nimport { type TestFilters } from \"./filterState\";\nimport {\n createTestRunnerRegistry,\n type TestNodeAdapter,\n TestNodeAdapterRegistry,\n} from \"./adapter\";\nimport { TestRunnerProvider, type TestRunnerContext } from \"./context\";\nimport { TestTree } from \"./TestTree\";\nimport { TestDetailPanel } from \"./TestDetailPanel\";\nimport { TestRunSummary } from \"./TestRunSummary\";\nimport { TestFilterBar } from \"./TestFilterBar\";\n\nexport type TestRunnerProps = {\n tests: Test[];\n selected: Test | null;\n filters: TestFilters;\n expandAll: boolean | null;\n done: boolean;\n runMeta?: RunMeta;\n status?: SnapshotStatus;\n /** Free-form status line shown next to the title (e.g. \"Running tests...\"). */\n statusText?: string;\n now?: number;\n busy?: { rerun?: boolean; stop?: boolean };\n\n /** Controlled active detail-tab id; omit to let the detail pane own tab state. */\n activeTab?: string;\n /** Called with the picked tab id when `activeTab` is controlled. */\n onTabChange?: (tabId: string) => void;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n onRerun?: (node: Test) => void;\n onStop?: (node: Test) => void;\n\n /** Domain node adapters, or a pre-built registry. Defaults to default-only. */\n adapters?: TestNodeAdapter[] | TestNodeAdapterRegistry;\n /** Extra header content (e.g. export/download controls owned by the host). */\n headerSlot?: ReactNode;\n /** Initial left-pane width percentage. */\n defaultSplit?: number;\n startTime?: number | null;\n endTime?: number | null;\n className?: string;\n};\n\nfunction counts(tests: Test[]): StatusCounts {\n return tests.reduce(\n (acc, t) => {\n const s = sumNonTaskTests(t);\n (Object.keys(acc) as (keyof StatusCounts)[]).forEach((k) => (acc[k] += s[k]));\n return acc;\n },\n { total: 0, passed: 0, failed: 0, warned: 0, skipped: 0, pending: 0, running: 0, timedout: 0 },\n );\n}\n\nfunction toRegistry(\n adapters: TestNodeAdapter[] | TestNodeAdapterRegistry | undefined,\n): TestNodeAdapterRegistry {\n if (adapters instanceof TestNodeAdapterRegistry) return adapters;\n return createTestRunnerRegistry(adapters ?? []);\n}\n\n/**\n * Top-level, pure-presentational test runner: a summary/filter header over a\n * resizable tree + detail split. All data and handlers flow in via props and\n * are exposed to sub-components through a single `TestRunnerContext`. Domain\n * rendering is pluggable via node adapters; no fetch/SSE/routing lives here.\n */\nexport function TestRunner({\n tests,\n selected,\n filters,\n expandAll,\n done,\n runMeta,\n status,\n statusText,\n now,\n busy,\n activeTab,\n onTabChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n adapters,\n headerSlot,\n defaultSplit = 45,\n startTime,\n endTime,\n className,\n}: TestRunnerProps) {\n const registry = useMemo(() => toRegistry(adapters), [adapters]);\n\n const ctx: TestRunnerContext = useMemo(\n () => ({\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy: busy ?? {},\n activeTab,\n onTabChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n adapters: registry,\n }),\n [\n tests,\n selected,\n runMeta,\n status,\n done,\n now,\n filters,\n expandAll,\n busy,\n activeTab,\n onTabChange,\n onSelect,\n onFiltersChange,\n onExpandAllChange,\n onRerun,\n onStop,\n registry,\n ],\n );\n\n const frameworks = useMemo(() => collectFrameworks(tests), [tests]);\n const filterCounts = useMemo(() => counts(tests), [tests]);\n const hasContent = tests.length > 0;\n\n return (\n <TestRunnerProvider value={ctx}>\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n <div className=\"border-b border-border bg-card px-density-4 py-density-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"inline-flex items-center gap-1.5 text-lg font-bold\">\n <Icon icon={UiBeaker} className=\"text-primary\" />\n Test Results\n </h1>\n {statusText && <span className=\"text-sm text-muted-foreground\">{statusText}</span>}\n </div>\n <div className=\"flex items-center gap-3\">\n {headerSlot}\n <TestRunSummary\n tests={tests}\n startTime={startTime}\n endTime={endTime}\n done={done}\n now={now}\n runMeta={runMeta}\n />\n </div>\n </div>\n {hasContent && (\n <div className=\"mt-2\">\n <TestFilterBar\n filters={filters}\n onChange={onFiltersChange}\n counts={filterCounts}\n frameworks={frameworks}\n />\n </div>\n )}\n </div>\n\n <SplitPane\n className=\"min-h-0 flex-1\"\n defaultSplit={defaultSplit}\n minLeft={25}\n minRight={30}\n leftClass=\"border-r-2 border-border bg-muted/30\"\n left={<TestTree />}\n right={<TestDetailPanel />}\n />\n </div>\n </TestRunnerProvider>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.cjs","sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"names":["createContext","useContext"],"mappings":";;;AA4CA,MAAM,UAAUA,MAAAA,cAAwC,IAAI;AAErD,MAAM,qBAAqB,QAAQ;AAEnC,SAAS,gBAAmC;AACjD,QAAM,MAAMC,MAAAA,WAAW,OAAO;AAC9B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;;;"}
1
+ {"version":3,"file":"context.cjs","sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"names":["createContext","useContext"],"mappings":";;;AAoDA,MAAM,UAAUA,MAAAA,cAAwC,IAAI;AAErD,MAAM,qBAAqB,QAAQ;AAEnC,SAAS,gBAAmC;AACjD,QAAM,MAAMC,MAAAA,WAAW,OAAO;AAC9B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;;;"}
@@ -25,6 +25,13 @@ export type TestRunnerContext = {
25
25
  rerun?: boolean;
26
26
  stop?: boolean;
27
27
  };
28
+ /**
29
+ * Active detail-tab id. When provided, TestDetailPanel renders this tab
30
+ * (controlled); when omitted it keeps its own internal tab state.
31
+ */
32
+ activeTab?: string | undefined;
33
+ /** Called with the picked tab id when the detail tab is controlled. */
34
+ onTabChange?: ((tabId: string) => void) | undefined;
28
35
  onSelect: (node: Test | null) => void;
29
36
  onFiltersChange: (next: TestFilters) => void;
30
37
  onExpandAllChange: (next: boolean | null) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gEAAgE;IAChE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,oCAAoC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,uCAAuC;IACvC,OAAO,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE1C,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAE5C,uDAAuD;IACvD,QAAQ,EAAE,uBAAuB,CAAC;CACnC,CAAC;AAIF,eAAO,MAAM,kBAAkB,oDAAmB,CAAC;AAEnD,wBAAgB,aAAa,IAAI,iBAAiB,CAMjD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gEAAgE;IAChE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,wCAAwC;IACxC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,oCAAoC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,uCAAuC;IACvC,OAAO,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,uEAAuE;IACvE,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEpD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAE5C,uDAAuD;IACvD,QAAQ,EAAE,uBAAuB,CAAC;CACnC,CAAC;AAIF,eAAO,MAAM,kBAAkB,oDAAmB,CAAC;AAEnD,wBAAgB,aAAa,IAAI,iBAAiB,CAMjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"names":[],"mappings":";AA4CA,MAAM,UAAU,cAAwC,IAAI;AAErD,MAAM,qBAAqB,QAAQ;AAEnC,SAAS,gBAAmC;AACjD,QAAM,MAAM,WAAW,OAAO;AAC9B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"context.js","sources":["../../../src/data/test-runner/context.ts"],"sourcesContent":["// A single context object carries all runner state + handlers, provided once\n// and read by every sub-component via useTestRunner() — instead of threading\n// onRerun/onStop/selected/runMeta/... through each component's props. Matches\n// clicky's existing Provider idiom (ClickyRuntimeProvider / TagActionsProvider).\n\nimport { createContext, useContext } from \"react\";\nimport type { RunMeta, SnapshotStatus, Test } from \"./types\";\nimport type { TestFilters } from \"./filterState\";\nimport type { TestNodeAdapterRegistry } from \"./adapter\";\n\nexport type TestRunnerContext = {\n /** The (already filtered, host-owned) test forest to render. */\n tests: Test[];\n /** Currently selected node, or null. */\n selected: Test | null;\n runMeta?: RunMeta | undefined;\n /** Run status flags (data only — no transport lives here). */\n status?: SnapshotStatus | undefined;\n /** Whether the run has finished. */\n done: boolean;\n /**\n * Injected wall-clock epoch ms for elapsed-time display. Kept as data so the\n * summary stays pure and testable; hosts pass `Date.now()`.\n */\n now?: number | undefined;\n /** Active status/framework filters. */\n filters: TestFilters;\n /** Tri-state expand-all: true (all open), false (all closed), null (default). */\n expandAll: boolean | null;\n /** In-flight action flags driving button disabled/spinner states. */\n busy: { rerun?: boolean; stop?: boolean };\n\n /**\n * Active detail-tab id. When provided, TestDetailPanel renders this tab\n * (controlled); when omitted it keeps its own internal tab state.\n */\n activeTab?: string | undefined;\n /** Called with the picked tab id when the detail tab is controlled. */\n onTabChange?: ((tabId: string) => void) | undefined;\n\n onSelect: (node: Test | null) => void;\n onFiltersChange: (next: TestFilters) => void;\n onExpandAllChange: (next: boolean | null) => void;\n /** Optional — when absent, the rerun affordance is hidden. */\n onRerun?: ((node: Test) => void) | undefined;\n /** Optional — when absent, the stop affordance is hidden. */\n onStop?: ((node: Test) => void) | undefined;\n\n /** Node adapters driving domain-specific rendering. */\n adapters: TestNodeAdapterRegistry;\n};\n\nconst Context = createContext<TestRunnerContext | null>(null);\n\nexport const TestRunnerProvider = Context.Provider;\n\nexport function useTestRunner(): TestRunnerContext {\n const ctx = useContext(Context);\n if (!ctx) {\n throw new Error(\"useTestRunner must be used within a <TestRunner> / TestRunnerProvider\");\n }\n return ctx;\n}\n"],"names":[],"mappings":";AAoDA,MAAM,UAAU,cAAwC,IAAI;AAErD,MAAM,qBAAqB,QAAQ;AAEnC,SAAS,gBAAmC;AACjD,QAAM,MAAM,WAAW,OAAO;AAC9B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;"}
@@ -9,6 +9,7 @@ export { TestRunnerProvider, useTestRunner, type TestRunnerContext, } from './co
9
9
  export { TestNodeAdapterRegistry, createTestRunnerRegistry, type TestNodeAdapter, type AdapterContext, type DetailTab, } from './adapter';
10
10
  export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, hasFailed, hasPending, testStatus, totalDuration, statusIconFor, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status';
11
11
  export { frameworkIcon } from './frameworkIcon';
12
+ export { slugify, annotateRoutePaths, findNodeByRoutePath } from './routePath';
12
13
  export { type FilterMode, type FilterState, type TestFilters, emptyTestFilters, decodeFilterState, encodeFilterState, cycleFilterState, matchesFilterState, } from './filterState';
13
14
  export type { Test, TestSummary, TestAttempt, FailureDetail, FailureKind, GoTestContext, GinkgoContext, FixtureContext, TaskContext, RunMeta, Snapshot, SnapshotGit, SnapshotStatus, } from './types';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function slugify(value) {
4
+ const slug = (value || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
5
+ return slug || "node";
6
+ }
7
+ function annotateRoutePaths(nodes, parentSegments = []) {
8
+ const counts = /* @__PURE__ */ new Map();
9
+ for (const node of nodes) {
10
+ const slug = slugify(node.name);
11
+ counts.set(slug, (counts.get(slug) || 0) + 1);
12
+ }
13
+ const seen = /* @__PURE__ */ new Map();
14
+ return nodes.map((node) => {
15
+ const slug = slugify(node.name);
16
+ const ordinal = (seen.get(slug) || 0) + 1;
17
+ seen.set(slug, ordinal);
18
+ const finalSlug = (counts.get(slug) || 0) > 1 ? `${slug}~${ordinal}` : slug;
19
+ const segments = [...parentSegments, finalSlug];
20
+ const annotated = { ...node, route_path: segments.join("/") };
21
+ if (node.children) annotated.children = annotateRoutePaths(node.children, segments);
22
+ return annotated;
23
+ });
24
+ }
25
+ function findNodeByRoutePath(nodes, target) {
26
+ if (!target) return null;
27
+ for (const node of nodes) {
28
+ if (node.route_path === target) return node;
29
+ if (node.children) {
30
+ const child = findNodeByRoutePath(node.children, target);
31
+ if (child) return child;
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+ exports.annotateRoutePaths = annotateRoutePaths;
37
+ exports.findNodeByRoutePath = findNodeByRoutePath;
38
+ exports.slugify = slugify;
39
+ //# sourceMappingURL=routePath.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routePath.cjs","sources":["../../../src/data/test-runner/routePath.ts"],"sourcesContent":["// Stable, URL-safe paths for selection/navigation. A host that wants to encode\n// the selected node in its route annotates the forest once with annotateRoutePaths\n// (writing Test.route_path), then resolves a path back to a node with\n// findNodeByRoutePath. Tree's nodeKey already prefers route_path, so an annotated\n// forest also gets stable React keys for free.\n\nimport type { Test } from \"./types\";\n\nexport function slugify(value: string): string {\n const slug = (value || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"node\";\n}\n\n/**\n * Return a deep copy of the forest with a stable, unique `route_path` on every\n * node. Each segment is the slug of the node's name; siblings that slug to the\n * same value are disambiguated with a `~N` ordinal so paths stay unique.\n */\nexport function annotateRoutePaths(nodes: Test[], parentSegments: string[] = []): Test[] {\n const counts = new Map<string, number>();\n for (const node of nodes) {\n const slug = slugify(node.name);\n counts.set(slug, (counts.get(slug) || 0) + 1);\n }\n\n const seen = new Map<string, number>();\n return nodes.map((node) => {\n const slug = slugify(node.name);\n const ordinal = (seen.get(slug) || 0) + 1;\n seen.set(slug, ordinal);\n const finalSlug = (counts.get(slug) || 0) > 1 ? `${slug}~${ordinal}` : slug;\n const segments = [...parentSegments, finalSlug];\n const annotated: Test = { ...node, route_path: segments.join(\"/\") };\n if (node.children) annotated.children = annotateRoutePaths(node.children, segments);\n return annotated;\n });\n}\n\n/** Depth-first lookup of the node whose route_path equals target, or null. */\nexport function findNodeByRoutePath(nodes: Test[], target: string): Test | null {\n if (!target) return null;\n for (const node of nodes) {\n if (node.route_path === target) return node;\n if (node.children) {\n const child = findNodeByRoutePath(node.children, target);\n if (child) return child;\n }\n }\n return null;\n}\n"],"names":[],"mappings":";;AAQO,SAAS,QAAQ,OAAuB;AAC7C,QAAM,QAAQ,SAAS,IACpB,YAAA,EACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,QAAQ;AACjB;AAOO,SAAS,mBAAmB,OAAe,iBAA2B,IAAY;AACvF,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,WAAO,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,2BAAW,IAAA;AACjB,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,KAAK;AACxC,SAAK,IAAI,MAAM,OAAO;AACtB,UAAM,aAAa,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,OAAO,KAAK;AACvE,UAAM,WAAW,CAAC,GAAG,gBAAgB,SAAS;AAC9C,UAAM,YAAkB,EAAE,GAAG,MAAM,YAAY,SAAS,KAAK,GAAG,EAAA;AAChE,QAAI,KAAK,SAAU,WAAU,WAAW,mBAAmB,KAAK,UAAU,QAAQ;AAClF,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,oBAAoB,OAAe,QAA6B;AAC9E,MAAI,CAAC,OAAQ,QAAO;AACpB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,eAAe,OAAQ,QAAO;AACvC,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,oBAAoB,KAAK,UAAU,MAAM;AACvD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;;;;"}
@@ -0,0 +1,11 @@
1
+ import { Test } from './types';
2
+ export declare function slugify(value: string): string;
3
+ /**
4
+ * Return a deep copy of the forest with a stable, unique `route_path` on every
5
+ * node. Each segment is the slug of the node's name; siblings that slug to the
6
+ * same value are disambiguated with a `~N` ordinal so paths stay unique.
7
+ */
8
+ export declare function annotateRoutePaths(nodes: Test[], parentSegments?: string[]): Test[];
9
+ /** Depth-first lookup of the node whose route_path equals target, or null. */
10
+ export declare function findNodeByRoutePath(nodes: Test[], target: string): Test | null;
11
+ //# sourceMappingURL=routePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routePath.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/routePath.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,IAAI,EAAE,CAkBvF;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAU9E"}
@@ -0,0 +1,39 @@
1
+ function slugify(value) {
2
+ const slug = (value || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
3
+ return slug || "node";
4
+ }
5
+ function annotateRoutePaths(nodes, parentSegments = []) {
6
+ const counts = /* @__PURE__ */ new Map();
7
+ for (const node of nodes) {
8
+ const slug = slugify(node.name);
9
+ counts.set(slug, (counts.get(slug) || 0) + 1);
10
+ }
11
+ const seen = /* @__PURE__ */ new Map();
12
+ return nodes.map((node) => {
13
+ const slug = slugify(node.name);
14
+ const ordinal = (seen.get(slug) || 0) + 1;
15
+ seen.set(slug, ordinal);
16
+ const finalSlug = (counts.get(slug) || 0) > 1 ? `${slug}~${ordinal}` : slug;
17
+ const segments = [...parentSegments, finalSlug];
18
+ const annotated = { ...node, route_path: segments.join("/") };
19
+ if (node.children) annotated.children = annotateRoutePaths(node.children, segments);
20
+ return annotated;
21
+ });
22
+ }
23
+ function findNodeByRoutePath(nodes, target) {
24
+ if (!target) return null;
25
+ for (const node of nodes) {
26
+ if (node.route_path === target) return node;
27
+ if (node.children) {
28
+ const child = findNodeByRoutePath(node.children, target);
29
+ if (child) return child;
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ export {
35
+ annotateRoutePaths,
36
+ findNodeByRoutePath,
37
+ slugify
38
+ };
39
+ //# sourceMappingURL=routePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routePath.js","sources":["../../../src/data/test-runner/routePath.ts"],"sourcesContent":["// Stable, URL-safe paths for selection/navigation. A host that wants to encode\n// the selected node in its route annotates the forest once with annotateRoutePaths\n// (writing Test.route_path), then resolves a path back to a node with\n// findNodeByRoutePath. Tree's nodeKey already prefers route_path, so an annotated\n// forest also gets stable React keys for free.\n\nimport type { Test } from \"./types\";\n\nexport function slugify(value: string): string {\n const slug = (value || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"node\";\n}\n\n/**\n * Return a deep copy of the forest with a stable, unique `route_path` on every\n * node. Each segment is the slug of the node's name; siblings that slug to the\n * same value are disambiguated with a `~N` ordinal so paths stay unique.\n */\nexport function annotateRoutePaths(nodes: Test[], parentSegments: string[] = []): Test[] {\n const counts = new Map<string, number>();\n for (const node of nodes) {\n const slug = slugify(node.name);\n counts.set(slug, (counts.get(slug) || 0) + 1);\n }\n\n const seen = new Map<string, number>();\n return nodes.map((node) => {\n const slug = slugify(node.name);\n const ordinal = (seen.get(slug) || 0) + 1;\n seen.set(slug, ordinal);\n const finalSlug = (counts.get(slug) || 0) > 1 ? `${slug}~${ordinal}` : slug;\n const segments = [...parentSegments, finalSlug];\n const annotated: Test = { ...node, route_path: segments.join(\"/\") };\n if (node.children) annotated.children = annotateRoutePaths(node.children, segments);\n return annotated;\n });\n}\n\n/** Depth-first lookup of the node whose route_path equals target, or null. */\nexport function findNodeByRoutePath(nodes: Test[], target: string): Test | null {\n if (!target) return null;\n for (const node of nodes) {\n if (node.route_path === target) return node;\n if (node.children) {\n const child = findNodeByRoutePath(node.children, target);\n if (child) return child;\n }\n }\n return null;\n}\n"],"names":[],"mappings":"AAQO,SAAS,QAAQ,OAAuB;AAC7C,QAAM,QAAQ,SAAS,IACpB,YAAA,EACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,QAAQ;AACjB;AAOO,SAAS,mBAAmB,OAAe,iBAA2B,IAAY;AACvF,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,WAAO,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,2BAAW,IAAA;AACjB,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,KAAK;AACxC,SAAK,IAAI,MAAM,OAAO;AACtB,UAAM,aAAa,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,OAAO,KAAK;AACvE,UAAM,WAAW,CAAC,GAAG,gBAAgB,SAAS;AAC9C,UAAM,YAAkB,EAAE,GAAG,MAAM,YAAY,SAAS,KAAK,GAAG,EAAA;AAChE,QAAI,KAAK,SAAU,WAAU,WAAW,mBAAmB,KAAK,UAAU,QAAQ;AAClF,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,oBAAoB,OAAe,QAA6B;AAC9E,MAAI,CAAC,OAAQ,QAAO;AACpB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,eAAe,OAAQ,QAAO;AACvC,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,oBAAoB,KAAK,UAAU,MAAM;AACvD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "31903cd", ""),
19
- tag: read(() => "clicky-ui@0.2.16", ""),
20
- date: read(() => "2026-06-12T10:05:04.159Z", ""),
18
+ commit: read(() => "a08ca5a", ""),
19
+ tag: read(() => "clicky-ui@0.2.18", ""),
20
+ date: read(() => "2026-06-15T20:03:50.837Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "31903cd", ""),
17
- tag: read(() => "clicky-ui@0.2.16", ""),
18
- date: read(() => "2026-06-12T10:04:52.267Z", ""),
16
+ commit: read(() => "a08ca5a", ""),
17
+ tag: read(() => "clicky-ui@0.2.18", ""),
18
+ date: read(() => "2026-06-15T20:03:38.711Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };
package/dist/data.cjs CHANGED
@@ -330,6 +330,7 @@ const UiWrench = require("./icons/components/UiWrench.cjs");
330
330
  const UiZap = require("./icons/components/UiZap.cjs");
331
331
  const UiZoomIn = require("./icons/components/UiZoomIn.cjs");
332
332
  const UiZoomOut = require("./icons/components/UiZoomOut.cjs");
333
+ const routePath = require("./data/test-runner/routePath.cjs");
333
334
  const api = require("./data/cache-browser/api.cjs");
334
335
  const changeIconAliases = require("./icons/changeIconAliases.cjs");
335
336
  const status = require("./data/test-runner/status.cjs");
@@ -947,6 +948,9 @@ exports.UiZoomIn = UiZoomIn.UiZoomIn;
947
948
  exports.UiZoomInFilled = UiZoomIn.UiZoomInFilled;
948
949
  exports.UiZoomOut = UiZoomOut.UiZoomOut;
949
950
  exports.UiZoomOutFilled = UiZoomOut.UiZoomOutFilled;
951
+ exports.annotateRoutePaths = routePath.annotateRoutePaths;
952
+ exports.findNodeByRoutePath = routePath.findNodeByRoutePath;
953
+ exports.slugify = routePath.slugify;
950
954
  exports.cacheQueryKeys = api.cacheQueryKeys;
951
955
  exports.createCacheClient = api.createCacheClient;
952
956
  exports.changeIconAliases = changeIconAliases.changeIconAliases;
package/dist/data.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/data.d.ts CHANGED
@@ -29,7 +29,7 @@ export { MethodBadge, type MethodBadgeProps } from './data/MethodBadge';
29
29
  export { ProgressBar, type ProgressBarProps, type ProgressSegment } from './data/ProgressBar';
30
30
  export { SignedDeltaBar, type SignedDeltaBarProps } from './data/SignedDeltaBar';
31
31
  export { SortableHeader, type SortableHeaderProps } from './data/SortableHeader';
32
- export { TabButton, type TabButtonProps } from './data/TabButton';
32
+ export { TabButton, type TabButtonProps, type TabButtonVariant } from './data/TabButton';
33
33
  export { TimeseriesPanel, resolveSeries, resolveBreakdown, type BreakdownItem, type ResolvedSeries, type TimeseriesPanelProps, type TimeseriesPoint, type TimeseriesResponse, type TimeseriesSeries, } from './data/TimeseriesPanel';
34
34
  export { TimeseriesGauge, type GaugeSeries, type TimeseriesGaugeProps, } from './data/TimeseriesGauge';
35
35
  export { TimeseriesCoreBars, deriveCoreBars, type TimeseriesCoreBarsProps, type CoreBar, type CoreBarsModel, } from './data/TimeseriesCoreBars';
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,KAAK,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EACL,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,SAAS,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EACL,IAAI,EACJ,SAAS,EACT,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,KAAK,uBAAuB,EAC5B,KAAK,OAAO,EACZ,KAAK,aAAa,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,2CAA2C,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,GACjB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,KAAK,iBAAiB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC"}
package/dist/data.js CHANGED
@@ -328,6 +328,7 @@ import { UiWrench, UiWrenchFilled } from "./icons/components/UiWrench.js";
328
328
  import { UiZap, UiZapFilled } from "./icons/components/UiZap.js";
329
329
  import { UiZoomIn, UiZoomInFilled } from "./icons/components/UiZoomIn.js";
330
330
  import { UiZoomOut, UiZoomOutFilled } from "./icons/components/UiZoomOut.js";
331
+ import { annotateRoutePaths, findNodeByRoutePath, slugify } from "./data/test-runner/routePath.js";
331
332
  import { cacheQueryKeys, createCacheClient } from "./data/cache-browser/api.js";
332
333
  import { changeIconAliases, getChangeIcon } from "./icons/changeIconAliases.js";
333
334
  import { collapseSingleChildChains, collectFrameworks, filterTests, formatCount, formatTestDuration, hasFailed, hasPending, humanizeName, statusIconFor, statusToneFor, sum, sumNonTaskTests, testStatus, totalDuration } from "./data/test-runner/status.js";
@@ -893,6 +894,7 @@ export {
893
894
  UiZoomOutFilled,
894
895
  Version,
895
896
  allGroupsTerminal,
897
+ annotateRoutePaths,
896
898
  badgeVariants,
897
899
  bucketTasks,
898
900
  cacheQueryKeys,
@@ -915,6 +917,7 @@ export {
915
917
  emptyTestFilters,
916
918
  encodeFilterState,
917
919
  filterTests,
920
+ findNodeByRoutePath,
918
921
  findProcessByPID,
919
922
  formatCount,
920
923
  formatDateTimeRelative,
@@ -955,6 +958,7 @@ export {
955
958
  resolveSeries,
956
959
  segment,
957
960
  setFallbackIconProvider,
961
+ slugify,
958
962
  splitTagToken,
959
963
  statusIconFor,
960
964
  statusToneFor,
package/dist/data.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.cjs CHANGED
@@ -41,6 +41,9 @@ const jsonSchemaFormSize = require("./components/json-schema-form-size.cjs");
41
41
  const jsonSchemaFormPreferences = require("./components/json-schema-form-preferences.cjs");
42
42
  const jsonSchemaFormResolve = require("./components/json-schema-form-resolve.cjs");
43
43
  const SplitPane = require("./layout/SplitPane.cjs");
44
+ const AppShell = require("./layout/AppShell.cjs");
45
+ const Panel = require("./layout/Panel.cjs");
46
+ const Tabs = require("./layout/Tabs.cjs");
44
47
  const Section = require("./layout/Section.cjs");
45
48
  const DropdownMenu = require("./overlay/DropdownMenu.cjs");
46
49
  const HoverCard = require("./overlay/HoverCard.cjs");
@@ -393,6 +396,7 @@ const UiWrench = require("./icons/components/UiWrench.cjs");
393
396
  const UiZap = require("./icons/components/UiZap.cjs");
394
397
  const UiZoomIn = require("./icons/components/UiZoomIn.cjs");
395
398
  const UiZoomOut = require("./icons/components/UiZoomOut.cjs");
399
+ const routePath = require("./data/test-runner/routePath.cjs");
396
400
  const api = require("./data/cache-browser/api.cjs");
397
401
  const changeIconAliases = require("./icons/changeIconAliases.cjs");
398
402
  const status = require("./data/test-runner/status.cjs");
@@ -436,6 +440,7 @@ exports.DateTimePicker = DateTimePicker.DateTimePicker;
436
440
  exports.TimeRange = TimeRange.TimeRange;
437
441
  exports.RangeSlider = RangeSlider.RangeSlider;
438
442
  exports.FilterBar = FilterBar.FilterBar;
443
+ exports.TriStateMultiSelect = FilterBar.TriStateMultiSelect;
439
444
  exports.applyFilterExtensions = FilterBar.applyFilterExtensions;
440
445
  exports.MultiSelect = MultiSelect.MultiSelect;
441
446
  exports.Select = select.Select;
@@ -462,6 +467,9 @@ exports.isOpenStringMap = jsonSchemaFormResolve.isOpenStringMap;
462
467
  exports.matchesIf = jsonSchemaFormResolve.matchesIf;
463
468
  exports.resolveControl = jsonSchemaFormResolve.resolveControl;
464
469
  exports.SplitPane = SplitPane.SplitPane;
470
+ exports.AppShell = AppShell.AppShell;
471
+ exports.Panel = Panel.Panel;
472
+ exports.Tabs = Tabs.Tabs;
465
473
  exports.DetailEmptyState = Section.DetailEmptyState;
466
474
  exports.Section = Section.Section;
467
475
  exports.DropdownMenu = DropdownMenu.DropdownMenu;
@@ -1106,6 +1114,9 @@ exports.UiZoomIn = UiZoomIn.UiZoomIn;
1106
1114
  exports.UiZoomInFilled = UiZoomIn.UiZoomInFilled;
1107
1115
  exports.UiZoomOut = UiZoomOut.UiZoomOut;
1108
1116
  exports.UiZoomOutFilled = UiZoomOut.UiZoomOutFilled;
1117
+ exports.annotateRoutePaths = routePath.annotateRoutePaths;
1118
+ exports.findNodeByRoutePath = routePath.findNodeByRoutePath;
1119
+ exports.slugify = routePath.slugify;
1109
1120
  exports.cacheQueryKeys = api.cacheQueryKeys;
1110
1121
  exports.createCacheClient = api.createCacheClient;
1111
1122
  exports.changeIconAliases = changeIconAliases.changeIconAliases;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ import { DatePicker } from "./components/DatePicker.js";
21
21
  import { DateTimePicker } from "./components/DateTimePicker.js";
22
22
  import { TimeRange } from "./components/TimeRange.js";
23
23
  import { RangeSlider } from "./components/RangeSlider.js";
24
- import { FilterBar, applyFilterExtensions } from "./components/FilterBar.js";
24
+ import { FilterBar, TriStateMultiSelect, applyFilterExtensions } from "./components/FilterBar.js";
25
25
  import { MultiSelect } from "./components/MultiSelect.js";
26
26
  import { Select } from "./components/select.js";
27
27
  import { Combobox } from "./components/Combobox.js";
@@ -39,6 +39,9 @@ import { DEFAULT_FORM_SIZE } from "./components/json-schema-form-size.js";
39
39
  import { DEFAULT_PREFERENCES_STORAGE_KEY, readPreferences, writePreferences } from "./components/json-schema-form-preferences.js";
40
40
  import { effectiveProperties, isOpenStringMap, matchesIf, resolveControl } from "./components/json-schema-form-resolve.js";
41
41
  import { SplitPane } from "./layout/SplitPane.js";
42
+ import { AppShell } from "./layout/AppShell.js";
43
+ import { Panel } from "./layout/Panel.js";
44
+ import { Tabs } from "./layout/Tabs.js";
42
45
  import { DetailEmptyState, Section } from "./layout/Section.js";
43
46
  import { DropdownMenu } from "./overlay/DropdownMenu.js";
44
47
  import { HoverCard } from "./overlay/HoverCard.js";
@@ -391,6 +394,7 @@ import { UiWrench, UiWrenchFilled } from "./icons/components/UiWrench.js";
391
394
  import { UiZap, UiZapFilled } from "./icons/components/UiZap.js";
392
395
  import { UiZoomIn, UiZoomInFilled } from "./icons/components/UiZoomIn.js";
393
396
  import { UiZoomOut, UiZoomOutFilled } from "./icons/components/UiZoomOut.js";
397
+ import { annotateRoutePaths, findNodeByRoutePath, slugify } from "./data/test-runner/routePath.js";
394
398
  import { cacheQueryKeys, createCacheClient } from "./data/cache-browser/api.js";
395
399
  import { changeIconAliases, getChangeIcon } from "./icons/changeIconAliases.js";
396
400
  import { collapseSingleChildChains, collectFrameworks, filterTests, formatCount, formatTestDuration, hasFailed, hasPending, humanizeName, statusIconFor, statusToneFor, sum, sumNonTaskTests, testStatus, totalDuration } from "./data/test-runner/status.js";
@@ -402,6 +406,7 @@ export {
402
406
  AVATAR_PALETTE,
403
407
  AcceptPicker,
404
408
  AnsiHtml,
409
+ AppShell,
405
410
  Avatar,
406
411
  AvatarBadge,
407
412
  Badge,
@@ -473,6 +478,7 @@ export {
473
478
  OperationCommandPage,
474
479
  OperationEntityPage,
475
480
  OperationsApiClientError,
481
+ Panel,
476
482
  PrettyStackTrace,
477
483
  ProgressBar,
478
484
  Properties,
@@ -491,6 +497,7 @@ export {
491
497
  StatusDot,
492
498
  StatusRows,
493
499
  TabButton,
500
+ Tabs,
494
501
  TagActionsProvider,
495
502
  TagList,
496
503
  TaskManager,
@@ -517,6 +524,7 @@ export {
517
524
  TreeGroupHeader,
518
525
  TreeNode,
519
526
  TreePickerField,
527
+ TriStateMultiSelect,
520
528
  UiActivity,
521
529
  UiAdd,
522
530
  UiAddFilled,
@@ -1010,6 +1018,7 @@ export {
1010
1018
  Version,
1011
1019
  WorkloadPicker,
1012
1020
  allGroupsTerminal,
1021
+ annotateRoutePaths,
1013
1022
  applyFilterExtensions,
1014
1023
  badgeVariants,
1015
1024
  bucketTasks,
@@ -1040,6 +1049,7 @@ export {
1040
1049
  filterTests,
1041
1050
  findDetailEndpoint,
1042
1051
  findListEndpoint,
1052
+ findNodeByRoutePath,
1043
1053
  findProcessByPID,
1044
1054
  fnv1a32,
1045
1055
  formatBytes,
@@ -1098,6 +1108,7 @@ export {
1098
1108
  resolveSize,
1099
1109
  segment,
1100
1110
  setFallbackIconProvider,
1111
+ slugify,
1101
1112
  splitTagToken,
1102
1113
  statusIconFor,
1103
1114
  statusToneFor,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}