@fartinmartin/ruintime 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/ruintime.css +1 -0
- package/dist/svelte.js +3719 -0
- package/dist/svelte.js.map +1 -0
- package/package.json +67 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
function S(t) {
|
|
2
|
+
if (t instanceof Error) {
|
|
3
|
+
const n = { message: t.message, stack: t.stack };
|
|
4
|
+
return "expected" in t && (n.expected = String(t.expected)), "actual" in t && (n.actual = String(t.actual)), n;
|
|
5
|
+
}
|
|
6
|
+
return { message: String(t) };
|
|
7
|
+
}
|
|
8
|
+
function y(t) {
|
|
9
|
+
let n = 0, e = 0, s = 0, i = 0, r = 0, l = 0;
|
|
10
|
+
for (const d of t)
|
|
11
|
+
d.status === "passed" ? n++ : d.status === "failed" ? e++ : d.status === "skipped" ? s++ : d.status === "running" ? i++ : r++, l += d.duration ?? 0;
|
|
12
|
+
return {
|
|
13
|
+
total: t.length,
|
|
14
|
+
passed: n,
|
|
15
|
+
failed: e,
|
|
16
|
+
skipped: s,
|
|
17
|
+
running: i,
|
|
18
|
+
idle: r,
|
|
19
|
+
duration: l
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function C(t, n) {
|
|
23
|
+
const e = n.search?.toLowerCase() ?? "", s = n.failedOnly ?? !1;
|
|
24
|
+
return t.map((i) => {
|
|
25
|
+
const r = i.tests.filter((l) => s && l.status !== "failed" ? !1 : e ? l.name.toLowerCase().includes(e) || i.name.toLowerCase().includes(e) || i.file?.toLowerCase().includes(e) : !0);
|
|
26
|
+
return { ...i, tests: r };
|
|
27
|
+
}).filter((i) => i.tests.length > 0);
|
|
28
|
+
}
|
|
29
|
+
function R(t) {
|
|
30
|
+
return t.flatMap((n) => n.tests);
|
|
31
|
+
}
|
|
32
|
+
const o = [];
|
|
33
|
+
let h = 0, E = 0, m, p = !1, c = null, a = null, f = {};
|
|
34
|
+
const u = () => f.onChange?.();
|
|
35
|
+
function T(t) {
|
|
36
|
+
f = t;
|
|
37
|
+
}
|
|
38
|
+
function k(t, n, e) {
|
|
39
|
+
const s = `suite-${h++}`, i = { id: s, name: t, file: e, tests: [], isExpanded: !0 };
|
|
40
|
+
o.push(i);
|
|
41
|
+
const r = m;
|
|
42
|
+
m = s, n(), m = r;
|
|
43
|
+
}
|
|
44
|
+
function v(t, n) {
|
|
45
|
+
const e = m;
|
|
46
|
+
if (!e)
|
|
47
|
+
throw new Error(`it("${t}") must be called inside describe()`);
|
|
48
|
+
const s = o.find((r) => r.id === e);
|
|
49
|
+
if (!s) throw new Error(`Suite ${e} not found`);
|
|
50
|
+
const i = `test-${E++}`;
|
|
51
|
+
s.tests.push({ id: i, name: t, suiteId: e, status: "idle", fn: n });
|
|
52
|
+
}
|
|
53
|
+
function b(t, n, e) {
|
|
54
|
+
const s = `suite-${h++}`, i = {
|
|
55
|
+
id: s,
|
|
56
|
+
name: t,
|
|
57
|
+
file: e,
|
|
58
|
+
tests: n.map((r) => ({
|
|
59
|
+
id: `test-${E++}`,
|
|
60
|
+
name: r.name,
|
|
61
|
+
suiteId: s,
|
|
62
|
+
fn: r.fn,
|
|
63
|
+
status: "idle"
|
|
64
|
+
})),
|
|
65
|
+
isExpanded: !0
|
|
66
|
+
};
|
|
67
|
+
return o.push(i), s;
|
|
68
|
+
}
|
|
69
|
+
async function g(t, n) {
|
|
70
|
+
const e = o.find((r) => r.id === t);
|
|
71
|
+
if (!e) throw new Error(`Suite ${t} not found`);
|
|
72
|
+
const s = e.tests.find((r) => r.id === n);
|
|
73
|
+
if (!s) throw new Error(`Test ${n} not found in suite ${t}`);
|
|
74
|
+
s.status = "running", s.duration = void 0, s.error = void 0, u();
|
|
75
|
+
const i = performance.now();
|
|
76
|
+
try {
|
|
77
|
+
await s.fn(), s.status = "passed";
|
|
78
|
+
} catch (r) {
|
|
79
|
+
s.status = "failed", s.error = S(r);
|
|
80
|
+
}
|
|
81
|
+
return s.duration = performance.now() - i, u(), w(s);
|
|
82
|
+
}
|
|
83
|
+
async function A(t) {
|
|
84
|
+
const n = o.find((s) => s.id === t);
|
|
85
|
+
if (!n) throw new Error(`Suite ${t} not found`);
|
|
86
|
+
const e = [];
|
|
87
|
+
for (const s of n.tests)
|
|
88
|
+
e.push(await g(t, s.id));
|
|
89
|
+
return e;
|
|
90
|
+
}
|
|
91
|
+
async function L() {
|
|
92
|
+
p = !0, c = Date.now(), a = null, x(), f.onRunStart?.(), u();
|
|
93
|
+
const t = [];
|
|
94
|
+
for (const n of o)
|
|
95
|
+
for (const e of n.tests)
|
|
96
|
+
t.push(await g(n.id, e.id));
|
|
97
|
+
return a = Date.now(), p = !1, f.onRunEnd?.(), u(), t;
|
|
98
|
+
}
|
|
99
|
+
async function D() {
|
|
100
|
+
p = !0, f.onRunStart?.(), u();
|
|
101
|
+
const t = [];
|
|
102
|
+
for (const n of o)
|
|
103
|
+
for (const e of n.tests)
|
|
104
|
+
e.status === "failed" && t.push(await g(n.id, e.id));
|
|
105
|
+
return p = !1, f.onRunEnd?.(), u(), t;
|
|
106
|
+
}
|
|
107
|
+
function x() {
|
|
108
|
+
for (const t of o)
|
|
109
|
+
for (const n of t.tests)
|
|
110
|
+
n.status = "idle", n.duration = void 0, n.error = void 0;
|
|
111
|
+
c = null, a = null, u();
|
|
112
|
+
}
|
|
113
|
+
function M(t) {
|
|
114
|
+
const n = o.find((e) => e.id === t);
|
|
115
|
+
n && (n.isExpanded = !n.isExpanded, u());
|
|
116
|
+
}
|
|
117
|
+
function O() {
|
|
118
|
+
for (const t of o) t.isExpanded = !0;
|
|
119
|
+
u();
|
|
120
|
+
}
|
|
121
|
+
function z() {
|
|
122
|
+
for (const t of o) t.isExpanded = !1;
|
|
123
|
+
u();
|
|
124
|
+
}
|
|
125
|
+
function w(t) {
|
|
126
|
+
return {
|
|
127
|
+
id: t.id,
|
|
128
|
+
name: t.name,
|
|
129
|
+
suiteId: t.suiteId,
|
|
130
|
+
status: t.status,
|
|
131
|
+
duration: t.duration,
|
|
132
|
+
error: t.error ? { ...t.error } : void 0
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function $(t) {
|
|
136
|
+
return {
|
|
137
|
+
id: t.id,
|
|
138
|
+
name: t.name,
|
|
139
|
+
file: t.file,
|
|
140
|
+
tests: t.tests.map(w),
|
|
141
|
+
isExpanded: t.isExpanded
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function F() {
|
|
145
|
+
return o.map($);
|
|
146
|
+
}
|
|
147
|
+
function H() {
|
|
148
|
+
return o.flatMap((t) => t.tests.map(w));
|
|
149
|
+
}
|
|
150
|
+
function I() {
|
|
151
|
+
return {
|
|
152
|
+
startTime: c,
|
|
153
|
+
endTime: a,
|
|
154
|
+
elapsed: c != null && a != null ? a - c : null
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function j() {
|
|
158
|
+
return p;
|
|
159
|
+
}
|
|
160
|
+
function q() {
|
|
161
|
+
return o.some((t) => t.tests.some((n) => n.status !== "idle"));
|
|
162
|
+
}
|
|
163
|
+
export {
|
|
164
|
+
b as addSuite,
|
|
165
|
+
x as clearResults,
|
|
166
|
+
z as collapseAll,
|
|
167
|
+
k as describe,
|
|
168
|
+
O as expandAll,
|
|
169
|
+
C as filterSuites,
|
|
170
|
+
R as flattenTests,
|
|
171
|
+
H as getAllTests,
|
|
172
|
+
q as getHasResults,
|
|
173
|
+
j as getIsRunning,
|
|
174
|
+
F as getSnapshot,
|
|
175
|
+
y as getSummary,
|
|
176
|
+
I as getTiming,
|
|
177
|
+
v as it,
|
|
178
|
+
S as normalizeError,
|
|
179
|
+
L as runAll,
|
|
180
|
+
D as runFailed,
|
|
181
|
+
A as runSuite,
|
|
182
|
+
g as runTest,
|
|
183
|
+
T as setCallbacks,
|
|
184
|
+
M as toggleSuite
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/utils.ts","../src/core/runner.ts"],"sourcesContent":["import type {\n\tTestError,\n\tTestSnapshot,\n\tSuiteSnapshot,\n\tSummary,\n\tFilterOptions,\n} from './types.js';\n\nexport function normalizeError(e: unknown): TestError {\n\tif (e instanceof Error) {\n\t\tconst te: TestError = { message: e.message, stack: e.stack };\n\t\tif ('expected' in e) te.expected = String((e as any).expected);\n\t\tif ('actual' in e) te.actual = String((e as any).actual);\n\t\treturn te;\n\t}\n\treturn { message: String(e) };\n}\n\nexport function getSummary(tests: readonly TestSnapshot[]): Summary {\n\tlet passed = 0,\n\t\tfailed = 0,\n\t\tskipped = 0,\n\t\trunning = 0,\n\t\tidle = 0,\n\t\tduration = 0;\n\n\tfor (const t of tests) {\n\t\tif (t.status === 'passed') passed++;\n\t\telse if (t.status === 'failed') failed++;\n\t\telse if (t.status === 'skipped') skipped++;\n\t\telse if (t.status === 'running') running++;\n\t\telse idle++;\n\t\tduration += t.duration ?? 0;\n\t}\n\n\treturn {\n\t\ttotal: tests.length,\n\t\tpassed,\n\t\tfailed,\n\t\tskipped,\n\t\trunning,\n\t\tidle,\n\t\tduration,\n\t};\n}\n\nexport function filterSuites(\n\tsuites: readonly SuiteSnapshot[],\n\toptions: FilterOptions,\n): SuiteSnapshot[] {\n\tconst search = options.search?.toLowerCase() ?? '';\n\tconst failedOnly = options.failedOnly ?? false;\n\n\treturn suites\n\t\t.map((suite) => {\n\t\t\tconst filtered = suite.tests.filter((t) => {\n\t\t\t\tif (failedOnly && t.status !== 'failed') return false;\n\t\t\t\tif (search) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tt.name.toLowerCase().includes(search) ||\n\t\t\t\t\t\tsuite.name.toLowerCase().includes(search) ||\n\t\t\t\t\t\tsuite.file?.toLowerCase().includes(search)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\treturn { ...suite, tests: filtered };\n\t\t})\n\t\t.filter((s) => s.tests.length > 0);\n}\n\nexport function flattenTests(suites: readonly SuiteSnapshot[]): TestSnapshot[] {\n\treturn suites.flatMap((s) => s.tests);\n}\n","import type {\n\tSuite,\n\tTest,\n\tTestFn,\n\tTestSnapshot,\n\tSuiteSnapshot,\n\tRunTiming,\n\tRunnerCallbacks,\n} from './types.js';\nimport { normalizeError } from './utils.js';\n\n// ── Module state ───────────────────────────────────────────────────────────\n\nconst suites: Suite[] = [];\nlet suiteCounter = 0;\nlet testCounter = 0;\nlet currentSuiteId: string | undefined;\nlet isRunningAll = false;\nlet startTime: number | null = null;\nlet endTime: number | null = null;\nlet callbacks: RunnerCallbacks = {};\n\nconst notify = () => callbacks.onChange?.();\n\n// ── Callbacks ──────────────────────────────────────────────────────────────\n\nexport function setCallbacks(cb: RunnerCallbacks): void {\n\tcallbacks = cb;\n}\n\n// ── Registration ───────────────────────────────────────────────────────────\n\nexport function describe(name: string, fn: () => void, file?: string): void {\n\tconst id = `suite-${suiteCounter++}`;\n\tconst suite: Suite = { id, name, file, tests: [], isExpanded: true };\n\tsuites.push(suite);\n\n\tconst prev = currentSuiteId;\n\tcurrentSuiteId = id;\n\tfn();\n\tcurrentSuiteId = prev;\n}\n\nexport function it(name: string, fn: TestFn): void {\n\tconst suiteId = currentSuiteId;\n\tif (!suiteId) {\n\t\tthrow new Error(`it(\"${name}\") must be called inside describe()`);\n\t}\n\tconst suite = suites.find((s) => s.id === suiteId);\n\tif (!suite) throw new Error(`Suite ${suiteId} not found`);\n\n\tconst id = `test-${testCounter++}`;\n\tsuite.tests.push({ id, name, suiteId, status: 'idle', fn });\n}\n\nexport function addSuite(\n\tname: string,\n\ttests: { name: string; fn: TestFn }[],\n\tfile?: string,\n): string {\n\tconst id = `suite-${suiteCounter++}`;\n\tconst suite: Suite = {\n\t\tid,\n\t\tname,\n\t\tfile,\n\t\ttests: tests.map((t) => ({\n\t\t\tid: `test-${testCounter++}`,\n\t\t\tname: t.name,\n\t\t\tsuiteId: id,\n\t\t\tfn: t.fn,\n\t\t\tstatus: 'idle' as const,\n\t\t})),\n\t\tisExpanded: true,\n\t};\n\tsuites.push(suite);\n\treturn id;\n}\n\n// ── Execution ──────────────────────────────────────────────────────────────\n\nexport async function runTest(\n\tsuiteId: string,\n\ttestId: string,\n): Promise<TestSnapshot> {\n\tconst suite = suites.find((s) => s.id === suiteId);\n\tif (!suite) throw new Error(`Suite ${suiteId} not found`);\n\tconst test = suite.tests.find((t) => t.id === testId);\n\tif (!test) throw new Error(`Test ${testId} not found in suite ${suiteId}`);\n\n\ttest.status = 'running';\n\ttest.duration = undefined;\n\ttest.error = undefined;\n\tnotify();\n\n\tconst start = performance.now();\n\ttry {\n\t\tawait test.fn();\n\t\ttest.status = 'passed';\n\t} catch (e) {\n\t\ttest.status = 'failed';\n\t\ttest.error = normalizeError(e);\n\t}\n\ttest.duration = performance.now() - start;\n\tnotify();\n\n\treturn snapshotTest(test);\n}\n\nexport async function runSuite(suiteId: string): Promise<TestSnapshot[]> {\n\tconst suite = suites.find((s) => s.id === suiteId);\n\tif (!suite) throw new Error(`Suite ${suiteId} not found`);\n\n\tconst results: TestSnapshot[] = [];\n\tfor (const test of suite.tests) {\n\t\tresults.push(await runTest(suiteId, test.id));\n\t}\n\treturn results;\n}\n\nexport async function runAll(): Promise<TestSnapshot[]> {\n\tisRunningAll = true;\n\tstartTime = Date.now();\n\tendTime = null;\n\tclearResults();\n\tcallbacks.onRunStart?.();\n\tnotify();\n\n\tconst results: TestSnapshot[] = [];\n\tfor (const suite of suites) {\n\t\tfor (const test of suite.tests) {\n\t\t\tresults.push(await runTest(suite.id, test.id));\n\t\t}\n\t}\n\n\tendTime = Date.now();\n\tisRunningAll = false;\n\tcallbacks.onRunEnd?.();\n\tnotify();\n\treturn results;\n}\n\nexport async function runFailed(): Promise<TestSnapshot[]> {\n\tisRunningAll = true;\n\tcallbacks.onRunStart?.();\n\tnotify();\n\n\tconst results: TestSnapshot[] = [];\n\tfor (const suite of suites) {\n\t\tfor (const test of suite.tests) {\n\t\t\tif (test.status === 'failed') {\n\t\t\t\tresults.push(await runTest(suite.id, test.id));\n\t\t\t}\n\t\t}\n\t}\n\n\tisRunningAll = false;\n\tcallbacks.onRunEnd?.();\n\tnotify();\n\treturn results;\n}\n\n// ── State mutation ─────────────────────────────────────────────────────────\n\nexport function clearResults(): void {\n\tfor (const suite of suites) {\n\t\tfor (const test of suite.tests) {\n\t\t\ttest.status = 'idle';\n\t\t\ttest.duration = undefined;\n\t\t\ttest.error = undefined;\n\t\t}\n\t}\n\tstartTime = null;\n\tendTime = null;\n\tnotify();\n}\n\nexport function toggleSuite(suiteId: string): void {\n\tconst suite = suites.find((s) => s.id === suiteId);\n\tif (suite) {\n\t\tsuite.isExpanded = !suite.isExpanded;\n\t\tnotify();\n\t}\n}\n\nexport function expandAll(): void {\n\tfor (const suite of suites) suite.isExpanded = true;\n\tnotify();\n}\n\nexport function collapseAll(): void {\n\tfor (const suite of suites) suite.isExpanded = false;\n\tnotify();\n}\n\n// ── Snapshots ─────────────────────────────────────────────────────────────\n\nfunction snapshotTest(test: Test): TestSnapshot {\n\treturn {\n\t\tid: test.id,\n\t\tname: test.name,\n\t\tsuiteId: test.suiteId,\n\t\tstatus: test.status,\n\t\tduration: test.duration,\n\t\terror: test.error ? { ...test.error } : undefined,\n\t};\n}\n\nfunction snapshotSuite(suite: Suite): SuiteSnapshot {\n\treturn {\n\t\tid: suite.id,\n\t\tname: suite.name,\n\t\tfile: suite.file,\n\t\ttests: suite.tests.map(snapshotTest),\n\t\tisExpanded: suite.isExpanded,\n\t};\n}\n\nexport function getSnapshot(): SuiteSnapshot[] {\n\treturn suites.map(snapshotSuite);\n}\n\nexport function getAllTests(): TestSnapshot[] {\n\treturn suites.flatMap((s) => s.tests.map(snapshotTest));\n}\n\nexport function getTiming(): RunTiming {\n\treturn {\n\t\tstartTime,\n\t\tendTime,\n\t\telapsed: startTime != null && endTime != null ? endTime - startTime : null,\n\t};\n}\n\nexport function getIsRunning(): boolean {\n\treturn isRunningAll;\n}\n\nexport function getHasResults(): boolean {\n\treturn suites.some((s) => s.tests.some((t) => t.status !== 'idle'));\n}\n"],"names":["normalizeError","e","te","getSummary","tests","passed","failed","skipped","running","idle","duration","t","filterSuites","suites","options","search","failedOnly","suite","filtered","s","flattenTests","suiteCounter","testCounter","currentSuiteId","isRunningAll","startTime","endTime","callbacks","notify","setCallbacks","cb","describe","name","fn","file","id","prev","it","suiteId","addSuite","runTest","testId","test","start","snapshotTest","runSuite","results","runAll","clearResults","runFailed","toggleSuite","expandAll","collapseAll","snapshotSuite","getSnapshot","getAllTests","getTiming","getIsRunning","getHasResults"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}:root{--font-mono: ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace;--color-bg-card: light-dark(#ffffff, #1a1a1a);--color-bg-muted: light-dark(#f5f5f5, #262626);--color-bg-background: light-dark(#ffffff, #0a0a0a);--color-border: light-dark(#e5e5e5, #404040);--color-text-foreground: light-dark(#171717, #fafafa);--color-text-muted: light-dark(#737373, #a3a3a3);--color-success: #10b981;--color-error: #ef4444;--color-info: #3b82f6;--color-primary: light-dark(#171717, #3b82f6);--color-bg-success: color-mix(in srgb, var(--color-success) 10%, transparent);--color-bg-error: color-mix(in srgb, var(--color-error) 10%, transparent);--color-bg-info: color-mix(in srgb, var(--color-info) 10%, transparent);--color-border-error: color-mix(in srgb, var(--color-error) 20%, transparent)}:root{color-scheme:light dark;font-family:var(--font-mono);font-size:var(--step-1)}.dark{color-scheme:dark}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}:root{--step--2: clamp(.6076rem, .5289rem + .3497vw, .8rem);--step--1: clamp(.7292rem, .6184rem + .4924vw, 1rem);--step-0: clamp(.875rem, .7216rem + .6818vw, 1.25rem);--step-1: clamp(1.05rem, .8403rem + .9318vw, 1.5625rem);--step-2: clamp(1.26rem, .9764rem + 1.2602vw, 1.9531rem);--step-3: clamp(1.512rem, 1.1318rem + 1.6898vw, 2.4414rem);--step-4: clamp(1.8144rem, 1.3082rem + 2.2497vw, 3.0518rem);--step-5: clamp(2.1773rem, 1.5074rem + 2.9771vw, 3.8147rem)}:root{--grid-size: .25rem;--space-3xs: clamp(.25rem, .2244rem + .1136vw, .3125rem);--space-2xs: clamp(.4375rem, .3608rem + .3409vw, .625rem);--space-xs: clamp(.6875rem, .5852rem + .4545vw, .9375rem);--space-s: clamp(.875rem, .7216rem + .6818vw, 1.25rem);--space-m: clamp(1.3125rem, 1.0824rem + 1.0227vw, 1.875rem);--space-l: clamp(1.75rem, 1.4432rem + 1.3636vw, 2.5rem);--space-xl: clamp(2.625rem, 2.1648rem + 2.0455vw, 3.75rem);--space-2xl: clamp(3.5rem, 2.8864rem + 2.7273vw, 5rem);--space-3xl: clamp(5.25rem, 4.3295rem + 4.0909vw, 7.5rem);--space-3xs-2xs: clamp(.25rem, .0966rem + .6818vw, .625rem);--space-2xs-xs: clamp(.4375rem, .233rem + .9091vw, .9375rem);--space-xs-s: clamp(.6875rem, .4574rem + 1.0227vw, 1.25rem);--space-s-m: clamp(.875rem, .4659rem + 1.8182vw, 1.875rem);--space-m-l: clamp(1.3125rem, .8267rem + 2.1591vw, 2.5rem);--space-l-xl: clamp(1.75rem, .9318rem + 3.6364vw, 3.75rem);--space-xl-2xl: clamp(2.625rem, 1.6534rem + 4.3182vw, 5rem);--space-2xl-3xl: clamp(3.5rem, 1.8636rem + 7.2727vw, 7.5rem);--space-s-l: clamp(.875rem, .2102rem + 2.9545vw, 2.5rem)}:root{--grid-max-width: 77.5rem;--grid-gutter: var(--space-s-l, clamp(1.125rem, .5625rem + 2.5vw, 2.5rem));--grid-columns: 12}.button,.icon-button{display:inline-flex;align-items:center;justify-content:center;border:none;cursor:pointer;border-radius:var(--grid-size);font-family:inherit;transition:background-color .15s,opacity .15s}.button{gap:var(--grid-size);padding:0 var(--space-xs);height:calc(var(--grid-size) * 8);font-size:var(--step--1);font-weight:500;line-height:1;white-space:nowrap}.icon-button{width:calc(var(--grid-size) * 6);height:calc(var(--grid-size) * 6);padding:0;background:transparent;color:var(--color-text-foreground)}.button:disabled,.icon-button:disabled{opacity:.5;cursor:not-allowed}.button-sm{height:calc(var(--grid-size) * 6);padding:0 var(--space-2xs);font-size:var(--step--2)}.button-lg{height:calc(var(--grid-size) * 10);padding:0 var(--space-s);font-size:var(--step-0)}.icon-button-sm{width:calc(var(--grid-size) * 5);height:calc(var(--grid-size) * 5)}.icon-button-lg{width:calc(var(--grid-size) * 8);height:calc(var(--grid-size) * 8)}.button .icon,.icon-button .icon{width:var(--icon-xs);height:var(--icon-xs)}.button-primary{background-color:var(--color-primary);color:var(--color-bg-card)}.button-primary:hover:not(:disabled){background-color:color-mix(in srgb,var(--color-primary) 90%,black)}.button-ghost{background:transparent;color:var(--color-text-foreground)}.button-ghost:hover:not(:disabled),.icon-button:hover:not(:disabled){background-color:color-mix(in srgb,var(--color-bg-muted) 50%,transparent)}.button-secondary{background-color:var(--color-bg-muted);color:var(--color-text-foreground)}.button-secondary:hover:not(:disabled){background-color:color-mix(in srgb,var(--color-bg-muted) 80%,black)}details{border:1px solid var(--color-border)}details summary{cursor:pointer;list-style:none;padding:var(--space-xs);transition:background-color .15s}details summary::-webkit-details-marker{display:none}details summary:hover{background-color:color-mix(in srgb,var(--color-bg-muted) 30%,transparent)}details>*:not(summary){padding:var(--space-xs)}.input{width:100%;height:calc(var(--grid-size) * 8);padding:0 var(--space-xs);font-family:inherit;background-color:var(--color-bg-background);color:var(--color-text-foreground);border:1px solid var(--color-border);border-radius:var(--grid-size);outline:none}.input::placeholder{color:var(--color-text-muted)}.input-sm{height:calc(var(--grid-size) * 6);padding:0 var(--space-2xs);font-size:var(--step--2)}.input-lg{height:calc(var(--grid-size) * 10);font-size:var(--step-0)}.input-with-icon-left{padding-left:calc(var(--grid-size) * 7)}.input-with-icon-right{padding-right:calc(var(--grid-size) * 7)}:root{--icon-3xs: calc(var(--grid-size) * 2);--icon-2xs: calc(var(--grid-size) * 2.5);--icon-xs: calc(var(--grid-size) * 3);--icon-sm: calc(var(--grid-size) * 3.5);--icon-md: calc(var(--grid-size) * 4)}.icon,.lucide-icon{--size: var(--icon-xs);width:var(--size);height:var(--size)}:is(.icon,.lucide-icon).xxxs{--size: var(--icon-3xs)}:is(.icon,.lucide-icon).xxs{--size: var(--icon-2xs)}:is(.icon,.lucide-icon).sm{--size: var(--icon-sm)}:is(.icon,.lucide-icon).md{--size: var(--icon-md)}.status{display:flex;align-items:center;gap:calc(var(--grid-size) * .5)}.status-badge{display:flex;align-items:center;justify-content:center;width:calc(var(--grid-size) * 4);height:calc(var(--grid-size) * 4);border-radius:calc(var(--grid-size) * .5)}.progress-bar{height:calc(var(--grid-size) * .5);background-color:var(--color-bg-muted);overflow:hidden;opacity:0;transition:opacity .15s ease-out}.progress-bar.is-visible{opacity:1}.progress-fill{height:100%;background-color:var(--color-primary);transition:width .15s ease-out}#app{min-height:100dvh;background-color:var(--color-bg-background);color:var(--color-text-foreground);font-family:var(--font-mono)}.container{max-width:var(--grid-max-width);padding:0 var(--grid-gutter);margin:0 auto}.column{border-left:1px solid var(--color-border);border-right:1px solid var(--color-border);min-height:100dvh;display:flex;flex-direction:column}header{border-bottom:1px solid var(--color-border);background-color:var(--color-bg-card);padding:var(--space-2xs) var(--space-xs)}header .content{display:flex;align-items:center;justify-content:space-between;gap:var(--space-xs)}header .left{display:flex;align-items:center;gap:var(--space-xs)}header h1{font-size:var(--step--1);font-weight:600}header .elapsed,header .total{color:var(--color-text-muted)}header .stats{display:flex;align-items:center;gap:var(--space-2xs);font-size:var(--step--2)}header .actions{display:flex;align-items:center;gap:var(--grid-size)}.filters{display:flex;align-items:center;gap:var(--space-xs);border-bottom:1px solid var(--color-border);background-color:color-mix(in srgb,var(--color-bg-muted) 30%,transparent)}.filters .search-wrapper{position:relative;flex:1;padding:var(--space-2xs) var(--space-xs)}.search-icon{position:absolute;left:var(--space-2xs);top:50%;transform:translateY(-50%);color:var(--color-text-muted);pointer-events:none}.filters .button-wrapper{display:flex;align-items:center;gap:var(--grid-size);padding:var(--space-2xs) var(--space-xs)}.filters .input{background-color:transparent;padding-left:var(--space-xs);border:none;width:100%}.filters .input:focus{box-shadow:none;outline:none}.clear-btn{position:absolute;right:var(--space-2xs);top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--color-text-muted);cursor:pointer;border-radius:var(--grid-size)}.clear-btn:hover{color:var(--color-text-foreground)}.button.is-error{background-color:var(--color-bg-error);color:var(--color-error)}.button.is-error:hover:not(:disabled){background-color:color-mix(in srgb,var(--color-bg-error) 80%,var(--color-error))}main{flex:1}.empty-state{padding:var(--space-l) var(--space-xs);text-align:center;font-size:var(--step--2);color:var(--color-text-muted)}footer{border-top:1px solid var(--color-border);padding:var(--space-xs);font-size:calc(var(--step--2) * .85);color:var(--color-text-muted);display:flex;align-items:center;justify-content:space-between}footer div{display:flex;align-items:center;justify-content:space-between;gap:var(--space-xs)}.suite{border:none;border-bottom:1px solid var(--color-border);font-family:var(--font-mono)}.suite:last-child{border-bottom:none}.suite-header{display:flex;align-items:center;gap:var(--grid-size);padding:var(--space-3xs) var(--space-2xs);transition:background-color .15s;cursor:pointer;list-style:none}.suite-header::-webkit-details-marker{display:none}.suite-header:hover{background-color:color-mix(in srgb,var(--color-bg-muted) 30%,transparent)}.suite-trigger{display:flex;align-items:center;gap:calc(var(--grid-size) * 1.5);flex:1}.chevron-icon,.file-icon{color:var(--color-text-muted)}.chevron-icon{transition:transform .15s}details[open] .chevron-icon{transform:rotate(90deg)}.suite-name{font-size:var(--step--2);font-weight:500}.suite-count{font-size:calc(var(--step--2) * .85);color:var(--color-text-muted)}.suite-stats{display:flex;align-items:center;gap:calc(var(--grid-size) * 1.5);font-size:calc(var(--step--2) * .85)}.suite-stats .duration{color:var(--color-text-muted);font-variant-numeric:tabular-nums}ul.content{border-top:1px dashed var(--color-border);background-color:color-mix(in srgb,var(--color-bg-muted) 20%,transparent);list-style:none;padding:0;margin:0}li{position:relative;font-family:var(--font-mono);font-size:var(--step--2)}li:hover .row{background-color:color-mix(in srgb,var(--color-bg-muted) 50%,transparent)}li .run-button{opacity:0}li:hover .run-button{opacity:1}.row{display:flex;align-items:center;gap:var(--space-2xs);padding:var(--space-3xs) var(--space-2xs);transition:background-color .15s}.name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2;color:color-mix(in srgb,var(--color-text-foreground) 80%,transparent)}.failed-text{color:var(--color-error)}li .duration{color:var(--color-text-muted);font-variant-numeric:tabular-nums;font-size:calc(var(--step--2) * .85)}.error-message{margin:0 var(--space-xs) var(--space-3xs);padding:calc(var(--grid-size) * 1.5) var(--space-2xs);border-radius:calc(var(--grid-size) * 1);background-color:var(--color-bg-error);border:1px solid var(--color-border-error)}.error-code{font-size:calc(var(--step--2) * .85);color:var(--color-error);line-height:1.4}
|