tether-ui 0.2.0 → 0.4.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/README.md +124 -2
- package/dist/approvals/match.d.ts +14 -0
- package/dist/approvals/match.js +216 -0
- package/dist/approvals/storage.d.ts +4 -0
- package/dist/approvals/storage.js +44 -0
- package/dist/cli/approvals.d.ts +2 -0
- package/dist/cli/approvals.js +113 -0
- package/dist/cli/format.d.ts +2 -2
- package/dist/cli/format.js +25 -5
- package/dist/cli/index.js +30 -21
- package/dist/cli/json.d.ts +62 -3
- package/dist/cli/json.js +66 -40
- package/dist/contract/describe.d.ts +2 -0
- package/dist/contract/describe.js +6 -0
- package/dist/contract/infer.d.ts +2 -2
- package/dist/contract/infer.js +69 -2
- package/dist/contract/read.d.ts +3 -0
- package/dist/contract/read.js +67 -0
- package/dist/contract/scopes.d.ts +5 -0
- package/dist/contract/scopes.js +150 -0
- package/dist/drift/compare.d.ts +4 -1
- package/dist/drift/compare.js +97 -33
- package/dist/drift/evidence.js +1 -0
- package/dist/scanner/collect.d.ts +4 -2
- package/dist/scanner/collect.js +61 -4
- package/dist/scanner/scan.js +127 -61
- package/dist/types.d.ts +103 -2
- package/dist/utils/config.js +18 -2
- package/dist/utils/coverage.d.ts +3 -0
- package/dist/utils/coverage.js +28 -0
- package/dist/utils/scenarios.d.ts +24 -0
- package/dist/utils/scenarios.js +82 -0
- package/dist/utils/storage.js +8 -3
- package/package.json +4 -3
- package/report/out/404/index.html +1 -1
- package/report/out/404.html +1 -1
- package/report/out/__next.__PAGE__.txt +3 -3
- package/report/out/__next._full.txt +3 -3
- package/report/out/__next._tree.txt +2 -2
- package/report/out/_next/static/chunks/330-b092d894bdb2103c.js +1 -0
- package/report/out/_next/static/chunks/app/_not-found/{page-032313fc4524b472.js → page-172b410568146bc8.js} +1 -1
- package/report/out/_next/static/chunks/app/contract/{page-60f6d610ece63f59.js → page-f49364851a596fef.js} +1 -1
- package/report/out/_next/static/chunks/app/drift/{page-655683d6032a79a8.js → page-e0f2eda1e981d86f.js} +1 -1
- package/report/out/_next/static/chunks/app/layout-9a410c21fc0ba3c9.js +1 -0
- package/report/out/_next/static/chunks/app/{page-bdfcce47bd844e7e.js → page-e399a35da3e55f00.js} +1 -1
- package/report/out/_next/static/chunks/app/viewports/{page-6e44561586c30871.js → page-5a01227414ac4842.js} +1 -1
- package/report/out/_next/static/chunks/{main-app-e3082ce30f616b80.js → main-app-e7e077df7256067f.js} +1 -1
- package/report/out/_next/static/chunks/next/dist/client/components/builtin/global-error-94732500710e6d55.js +1 -0
- package/report/out/_next/static/css/b754cdc60c7b43bb.css +1 -0
- package/report/out/_not-found/__next._full.txt +2 -2
- package/report/out/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/report/out/_not-found/__next._tree.txt +2 -2
- package/report/out/_not-found/index.html +1 -1
- package/report/out/_not-found/index.txt +2 -2
- package/report/out/contract/__next._full.txt +3 -3
- package/report/out/contract/__next._tree.txt +2 -2
- package/report/out/contract/__next.contract.__PAGE__.txt +3 -3
- package/report/out/contract/index.html +1 -1
- package/report/out/contract/index.txt +3 -3
- package/report/out/drift/__next._full.txt +3 -3
- package/report/out/drift/__next._tree.txt +2 -2
- package/report/out/drift/__next.drift.__PAGE__.txt +3 -3
- package/report/out/drift/index.html +1 -1
- package/report/out/drift/index.txt +3 -3
- package/report/out/index.html +1 -1
- package/report/out/index.txt +3 -3
- package/report/out/viewports/__next._full.txt +3 -3
- package/report/out/viewports/__next._tree.txt +2 -2
- package/report/out/viewports/__next.viewports.__PAGE__.txt +3 -3
- package/report/out/viewports/index.html +1 -1
- package/report/out/viewports/index.txt +3 -3
- package/report/out/_next/static/chunks/679-ea0b2616e7a83e6d.js +0 -1
- package/report/out/_next/static/chunks/app/layout-16ba70b55e65864f.js +0 -1
- package/report/out/_next/static/chunks/next/dist/client/components/builtin/global-error-d142454d28d73f8d.js +0 -1
- package/report/out/_next/static/css/5f0345b3d96e2143.css +0 -1
- /package/report/out/_next/static/{MCyQw-tRQ7-eGxwnJHR0Q → TBRjO9Fdl2ToZdlLQ7gIf}/_buildManifest.js +0 -0
- /package/report/out/_next/static/{MCyQw-tRQ7-eGxwnJHR0Q → TBRjO9Fdl2ToZdlLQ7gIf}/_ssgManifest.js +0 -0
package/dist/utils/config.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { validateScopes } from "../contract/scopes.js";
|
|
1
2
|
import { access } from "node:fs/promises";
|
|
2
|
-
import {
|
|
3
|
+
import { validateScenarios, safeUrl } from "./scenarios.js";
|
|
4
|
+
import { resolve, dirname, sep } from "node:path";
|
|
3
5
|
import { createJiti } from "jiti";
|
|
4
6
|
export const defaults = {
|
|
5
7
|
url: "http://localhost:3000",
|
|
@@ -35,7 +37,9 @@ export async function loadConfig(cwd, url, file) {
|
|
|
35
37
|
throw new Error("Configuration must export an object.");
|
|
36
38
|
const config = { ...defaults, ...input, ...(url ? { url } : {}) };
|
|
37
39
|
try {
|
|
38
|
-
if (!["http:", "https:"].includes(new URL(config.url).protocol)
|
|
40
|
+
if (!["http:", "https:"].includes(new URL(config.url).protocol) ||
|
|
41
|
+
new URL(config.url).username ||
|
|
42
|
+
new URL(config.url).password)
|
|
39
43
|
throw 0;
|
|
40
44
|
}
|
|
41
45
|
catch {
|
|
@@ -72,7 +76,19 @@ export async function loadConfig(cwd, url, file) {
|
|
|
72
76
|
if (!Array.isArray(config.ignore) ||
|
|
73
77
|
config.ignore.some((s) => typeof s !== "string" || !s.trim()))
|
|
74
78
|
throw new Error("Config ignore must be a list of CSS selectors.");
|
|
79
|
+
if (config.scopes !== undefined)
|
|
80
|
+
config.scopes = validateScopes(config.scopes);
|
|
75
81
|
config.routes = [...new Set(config.routes)];
|
|
82
|
+
validateScenarios(config);
|
|
83
|
+
if (config.storageState) {
|
|
84
|
+
config.storageState = resolve(dirname(path), config.storageState);
|
|
85
|
+
if (config.storageState.startsWith(resolve(cwd, ".tether") + sep))
|
|
86
|
+
throw new Error("Keep storageState outside .tether; use an ignored .auth directory.");
|
|
87
|
+
if (config.routes.some((r) => !config.scenarios?.some((s) => s.routes.includes(r))))
|
|
88
|
+
throw new Error("Every authenticated route needs a scenario with an explicit ready assertion.");
|
|
89
|
+
}
|
|
90
|
+
if (new Set(config.routes.map((r) => safeUrl(r))).size !== config.routes.length)
|
|
91
|
+
throw new Error("Routes must remain distinct after query-value redaction; use named scenarios for variants.");
|
|
76
92
|
return config;
|
|
77
93
|
}
|
|
78
94
|
export function targetUrl(base, route) {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { captures, safeUrl } from "./scenarios.js";
|
|
2
|
+
import { validateScopes } from "../contract/scopes.js";
|
|
3
|
+
export function coverage(scan) {
|
|
4
|
+
return scan.snapshots
|
|
5
|
+
.map((s) => JSON.stringify([
|
|
6
|
+
safeUrl(s.route),
|
|
7
|
+
s.viewport.name,
|
|
8
|
+
s.viewport.width,
|
|
9
|
+
s.viewport.height,
|
|
10
|
+
s.state ?? "default",
|
|
11
|
+
s.colorScheme ?? "light",
|
|
12
|
+
]))
|
|
13
|
+
.sort();
|
|
14
|
+
}
|
|
15
|
+
export function validateCoverage(config, contract, baseline) {
|
|
16
|
+
if (JSON.stringify(validateScopes(config.scopes ?? [])) !==
|
|
17
|
+
JSON.stringify(validateScopes(contract.scopes ?? [])))
|
|
18
|
+
throw new Error("Component scopes or overrides changed since the baseline. Run tether init --force to establish the new contract.");
|
|
19
|
+
const requested = captures(config).flatMap(({ route, scenario }) => config.viewports.map((viewport) => ({
|
|
20
|
+
route: safeUrl(route),
|
|
21
|
+
viewport,
|
|
22
|
+
state: scenario.id,
|
|
23
|
+
colorScheme: scenario.colorScheme ?? "light",
|
|
24
|
+
})));
|
|
25
|
+
if (JSON.stringify(coverage({ snapshots: requested })) !==
|
|
26
|
+
JSON.stringify(coverage(baseline)))
|
|
27
|
+
throw new Error("Routes, states, color schemes or viewports changed since the baseline. Run tether init --force to establish the new coverage.");
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Config, Scenario } from "../types.js";
|
|
2
|
+
/** Query values and fragments are runtime-only, regardless of parameter spelling. */
|
|
3
|
+
export declare function safeUrl(value: string): string;
|
|
4
|
+
export declare function captures(config: Config): {
|
|
5
|
+
route: string;
|
|
6
|
+
scenario: Scenario;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function validateScenarios(config: Config): void;
|
|
9
|
+
/** Deliberate allowlist: no hook sources, authentication paths or arbitrary config fields. */
|
|
10
|
+
export declare function persistedConfig(c: Config): {
|
|
11
|
+
states?: {
|
|
12
|
+
route: string;
|
|
13
|
+
id: string;
|
|
14
|
+
colorScheme: "light" | "dark";
|
|
15
|
+
}[] | undefined;
|
|
16
|
+
scopes?: import("../types.js").ScopeDefinition[] | undefined;
|
|
17
|
+
url: string;
|
|
18
|
+
routes: string[];
|
|
19
|
+
viewports: import("../types.js").Viewport[];
|
|
20
|
+
minOccurrences: number;
|
|
21
|
+
maxElements: number;
|
|
22
|
+
settleMs: number;
|
|
23
|
+
ignore: string[];
|
|
24
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** Query values and fragments are runtime-only, regardless of parameter spelling. */
|
|
2
|
+
export function safeUrl(value) {
|
|
3
|
+
const absolute = /^https?:\/\//.test(value);
|
|
4
|
+
const u = new URL(value, "http://tether.local");
|
|
5
|
+
u.username = "";
|
|
6
|
+
u.password = "";
|
|
7
|
+
u.hash = "";
|
|
8
|
+
for (const key of [...u.searchParams.keys()])
|
|
9
|
+
u.searchParams.set(key, "[redacted]");
|
|
10
|
+
return absolute
|
|
11
|
+
? u.toString().replace(/\/$/, value.endsWith("/") ? "/" : "")
|
|
12
|
+
: u.pathname + u.search;
|
|
13
|
+
}
|
|
14
|
+
export function captures(config) {
|
|
15
|
+
return config.routes.flatMap((route) => {
|
|
16
|
+
const selected = config.scenarios?.filter((s) => s.routes.includes(route));
|
|
17
|
+
return (selected?.length
|
|
18
|
+
? selected
|
|
19
|
+
: [{ id: "default", routes: [route], ready: async () => { } }]).map((scenario) => ({ route, scenario }));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function validateScenarios(config) {
|
|
23
|
+
if (config.storageState !== undefined &&
|
|
24
|
+
(typeof config.storageState !== "string" || !config.storageState.trim()))
|
|
25
|
+
throw new Error("storageState must be a local Playwright storage-state file path.");
|
|
26
|
+
if (config.sensitiveSelectors !== undefined &&
|
|
27
|
+
(!Array.isArray(config.sensitiveSelectors) ||
|
|
28
|
+
config.sensitiveSelectors.some((s) => typeof s !== "string" || !s.trim())))
|
|
29
|
+
throw new Error("sensitiveSelectors must be a list of CSS selectors.");
|
|
30
|
+
if (config.scenarios === undefined)
|
|
31
|
+
return;
|
|
32
|
+
if (!Array.isArray(config.scenarios) || !config.scenarios.length)
|
|
33
|
+
throw new Error("scenarios must be a nonempty list.");
|
|
34
|
+
const ids = new Set();
|
|
35
|
+
for (const s of config.scenarios) {
|
|
36
|
+
if (!s ||
|
|
37
|
+
typeof s.id !== "string" ||
|
|
38
|
+
!/^[a-zA-Z0-9_-]{1,64}$/.test(s.id) ||
|
|
39
|
+
ids.has(s.id))
|
|
40
|
+
throw new Error("Scenario IDs must be unique, 1–64 letters, digits, underscores or hyphens.");
|
|
41
|
+
ids.add(s.id);
|
|
42
|
+
if (!Array.isArray(s.routes) ||
|
|
43
|
+
!s.routes.length ||
|
|
44
|
+
s.routes.some((r) => !config.routes.includes(r)) ||
|
|
45
|
+
new Set(s.routes).size !== s.routes.length)
|
|
46
|
+
throw new Error(`Scenario ${s.id} must select unique configured routes.`);
|
|
47
|
+
if (typeof s.ready !== "function" ||
|
|
48
|
+
(s.setup !== undefined && typeof s.setup !== "function") ||
|
|
49
|
+
(s.interact !== undefined && typeof s.interact !== "function"))
|
|
50
|
+
throw new Error(`Scenario ${s.id} needs a ready function; setup/interact must be functions.`);
|
|
51
|
+
if (s.colorScheme !== undefined &&
|
|
52
|
+
!["light", "dark"].includes(s.colorScheme))
|
|
53
|
+
throw new Error(`Invalid color scheme in scenario ${s.id}.`);
|
|
54
|
+
if (s.timeoutMs !== undefined &&
|
|
55
|
+
(!Number.isInteger(s.timeoutMs) ||
|
|
56
|
+
s.timeoutMs < 100 ||
|
|
57
|
+
s.timeoutMs > 120000))
|
|
58
|
+
throw new Error(`Scenario ${s.id} timeoutMs must be 100–120000.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Deliberate allowlist: no hook sources, authentication paths or arbitrary config fields. */
|
|
62
|
+
export function persistedConfig(c) {
|
|
63
|
+
return {
|
|
64
|
+
url: safeUrl(c.url),
|
|
65
|
+
routes: c.routes.map(safeUrl),
|
|
66
|
+
viewports: c.viewports,
|
|
67
|
+
minOccurrences: c.minOccurrences,
|
|
68
|
+
maxElements: c.maxElements,
|
|
69
|
+
settleMs: c.settleMs,
|
|
70
|
+
ignore: c.ignore,
|
|
71
|
+
...(c.scopes ? { scopes: c.scopes } : {}),
|
|
72
|
+
...(c.scenarios
|
|
73
|
+
? {
|
|
74
|
+
states: captures(c).map(({ route, scenario }) => ({
|
|
75
|
+
route: safeUrl(route),
|
|
76
|
+
id: scenario.id,
|
|
77
|
+
colorScheme: scenario.colorScheme ?? "light",
|
|
78
|
+
})),
|
|
79
|
+
}
|
|
80
|
+
: {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
package/dist/utils/storage.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, writeFile, rename, mkdir } from "node:fs/promises";
|
|
1
|
+
import { readFile, writeFile, rename, mkdir, rm } from "node:fs/promises";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
export async function readJson(path) {
|
|
@@ -12,6 +12,11 @@ export async function readJson(path) {
|
|
|
12
12
|
export async function writeJson(path, data) {
|
|
13
13
|
await mkdir(dirname(path), { recursive: true });
|
|
14
14
|
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
try {
|
|
16
|
+
await writeFile(temporary, JSON.stringify(data, null, 2) + "\n");
|
|
17
|
+
await rename(temporary, path);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
await rm(temporary, { force: true });
|
|
21
|
+
}
|
|
17
22
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tether-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Visual linting for AI-coded interfaces. Learn the existing design language and detect frontend drift.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,12 +31,13 @@
|
|
|
31
31
|
"dev": "next dev report -p 4318",
|
|
32
32
|
"demo": "tsx demo/server.ts",
|
|
33
33
|
"test": "tsx --test tests/*.test.ts",
|
|
34
|
-
"test:e2e": "tsx scripts/e2e.ts",
|
|
34
|
+
"test:e2e": "tsx scripts/e2e.ts && tsx scripts/e2e-scopes.ts",
|
|
35
35
|
"assets": "tsx scripts/generate-readme-assets.ts",
|
|
36
36
|
"lint": "tsc --noEmit && tsc -p report/tsconfig.json --noEmit",
|
|
37
37
|
"browser:install": "playwright install chromium",
|
|
38
38
|
"prepack": "npm run build",
|
|
39
|
-
"format": "prettier --write src report/app scripts tests demo/server.ts"
|
|
39
|
+
"format": "prettier --write src report/app scripts tests demo/server.ts",
|
|
40
|
+
"benchmark": "tsx scripts/benchmark-scopes.ts"
|
|
40
41
|
},
|
|
41
42
|
"dependencies": {
|
|
42
43
|
"commander": "^14.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/b754cdc60c7b43bb.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-21c0bda91597affb.js"/><script src="/_next/static/chunks/c7879cf7-33323d49ba6da96a.js" async=""></script><script src="/_next/static/chunks/158-65f5491737ca4c2e.js" async=""></script><script src="/_next/static/chunks/main-app-e7e077df7256067f.js" async=""></script><meta name="robots" content="noindex"/><title>tether — Visual linting</title><meta name="description" content="tether learns your UI’s existing design language, then catches drift as humans and agents make changes."/><link rel="icon" href="/knot.svg"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-21c0bda91597affb.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1133,[],\"\"]\n3:I[4297,[],\"\"]\n4:I[1872,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[1872,[],\"ViewportBoundary\"]\na:I[1872,[],\"MetadataBoundary\"]\nc:I[7567,[],\"default\",1]\n:HL[\"/_next/static/css/b754cdc60c7b43bb.css\",\"style\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b754cdc60c7b43bb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"TBRjO9Fdl2ToZdlLQ7gIf\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nd:I[2569,[],\"IconMark\"]\n6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"tether — Visual linting\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"tether learns your UI’s existing design language, then catches drift as humans and agents make changes.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/knot.svg\"}],[\"$\",\"$Ld\",\"3\",{}]]\n"])</script></body></html>
|
package/report/out/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/b754cdc60c7b43bb.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-21c0bda91597affb.js"/><script src="/_next/static/chunks/c7879cf7-33323d49ba6da96a.js" async=""></script><script src="/_next/static/chunks/158-65f5491737ca4c2e.js" async=""></script><script src="/_next/static/chunks/main-app-e7e077df7256067f.js" async=""></script><meta name="robots" content="noindex"/><title>tether — Visual linting</title><meta name="description" content="tether learns your UI’s existing design language, then catches drift as humans and agents make changes."/><link rel="icon" href="/knot.svg"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-21c0bda91597affb.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1133,[],\"\"]\n3:I[4297,[],\"\"]\n4:I[1872,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[1872,[],\"ViewportBoundary\"]\na:I[1872,[],\"MetadataBoundary\"]\nc:I[7567,[],\"default\",1]\n:HL[\"/_next/static/css/b754cdc60c7b43bb.css\",\"style\"]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b754cdc60c7b43bb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"TBRjO9Fdl2ToZdlLQ7gIf\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nd:I[2569,[],\"IconMark\"]\n6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"tether — Visual linting\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"tether learns your UI’s existing design language, then catches drift as humans and agents make changes.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/knot.svg\"}],[\"$\",\"$Ld\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[
|
|
2
|
+
2:I[6652,["979","static/chunks/979-2cc4e681ca63e0b3.js","330","static/chunks/330-b092d894bdb2103c.js","974","static/chunks/app/page-e399a35da3e55f00.js"],"default"]
|
|
3
3
|
3:I[1872,[],"OutletBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
5
|
8:I[1872,[],"ViewportBoundary"]
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
a:I[2569,[],"IconMark"]
|
|
8
8
|
c:I[1133,[],""]
|
|
9
9
|
d:I[4297,[],""]
|
|
10
|
-
:HL["/_next/static/css/
|
|
10
|
+
:HL["/_next/static/css/b754cdc60c7b43bb.css","style"]
|
|
11
11
|
7:X
|
|
12
|
-
0:{"buildId":"
|
|
12
|
+
0:{"buildId":"TBRjO9Fdl2ToZdlLQ7gIf","data":[{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"page":"overview"}],null,["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":"$@6","staleTime":"$7","varyParams":null},{"rsc":["$","$1","h",{"children":[null,["$","$L8",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"tether — Visual linting"}],["$","meta","1",{"name":"description","content":"tether learns your UI’s existing design language, then catches drift as humans and agents make changes."}],["$","link","2",{"rel":"icon","href":"/knot.svg"}],["$","$La","3",{}]]}]}]}],null]}],"isPartial":"$@b","staleTime":"$7","varyParams":null},{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/b754cdc60c7b43bb.css","precedence":"next"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$Lc",null,{"parallelRouterKey":"children","template":["$","$Ld",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]]}],"isPartial":"$@e","staleTime":"$7","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@f","rootVaryParams":null,"needsRuntimeRequest":"$@10"}
|
|
13
13
|
5:null
|
|
14
14
|
7:300
|
|
15
15
|
10:true
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[1133,[],""]
|
|
3
3
|
3:I[4297,[],""]
|
|
4
|
-
4:I[
|
|
4
|
+
4:I[6652,["979","static/chunks/979-2cc4e681ca63e0b3.js","330","static/chunks/330-b092d894bdb2103c.js","974","static/chunks/app/page-e399a35da3e55f00.js"],"default"]
|
|
5
5
|
5:I[1872,[],"OutletBoundary"]
|
|
6
6
|
6:"$Sreact.suspense"
|
|
7
7
|
8:I[1872,[],"ViewportBoundary"]
|
|
8
8
|
a:I[1872,[],"MetadataBoundary"]
|
|
9
9
|
c:I[7567,[],"default",1]
|
|
10
|
-
:HL["/_next/static/css/
|
|
11
|
-
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/
|
|
10
|
+
:HL["/_next/static/css/b754cdc60c7b43bb.css","style"]
|
|
11
|
+
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/b754cdc60c7b43bb.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L4",null,{"page":"overview"}],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"TBRjO9Fdl2ToZdlLQ7gIf"}
|
|
12
12
|
9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
13
13
|
d:I[2569,[],"IconMark"]
|
|
14
14
|
7:null
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:HL["/_next/static/css/
|
|
2
|
-
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}},"staleTime":300,"buildId":"
|
|
1
|
+
:HL["/_next/static/css/b754cdc60c7b43bb.css","style"]
|
|
2
|
+
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}},"staleTime":300,"buildId":"TBRjO9Fdl2ToZdlLQ7gIf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[330],{6652:(e,s,a)=>{"use strict";a.d(s,{default:()=>T});var i=a(3365),n=a(1521),l=a(9568),t=a.n(l),r=a(3382);function c({label:e,capture:s,viewport:a}){let[l,t]=(0,n.useState)(!1);(0,n.useEffect)(()=>t(!1),[s?.screenshot]);let r=function(e,s){if(!e||![e.x,e.y,e.width,e.height,s.width,s.height].every(Number.isFinite)||e.width<=0||e.height<=0||s.width<=0||s.height<=0)return;let a=Math.max(0,e.x),i=Math.max(0,e.y),n=Math.min(s.width,e.x+e.width),l=Math.min(s.height,e.y+e.height);if(!(n<=a)&&!(l<=i))return{x:a,y:i,width:n-a,height:l-i}}(s?.bounds,a),d=!!s?.screenshot&&!l;return(0,i.jsxs)("figure",{className:"evidence-capture",children:[(0,i.jsx)("figcaption",{children:e}),d?(0,i.jsxs)("div",{className:"evidence-image",style:{aspectRatio:`${a.width} / ${a.height}`},children:[(0,i.jsx)("img",{src:`/${s.screenshot}`,alt:`${e.toLowerCase()} capture at ${a.name}`,onError:()=>t(!0)}),r&&(0,i.jsx)("span",{className:"evidence-outline","aria-label":"Matched element",style:{left:`${r.x/a.width*100}%`,top:`${r.y/a.height*100}%`,width:`${r.width/a.width*100}%`,height:`${r.height/a.height*100}%`}})]}):(0,i.jsx)("div",{className:"evidence-unavailable",children:"Capture unavailable."}),(0,i.jsx)("p",{className:"muted",children:d&&r?"Outline shows the visible portion of the matched element.":d&&s?.bounds?"Element outside this capture or bounds unavailable. No outline shown.":d?"No exact element location available. No outline shown.":"The screenshot may be missing from this checkout."})]})}function d({issue:e,report:s,onClose:a}){var l;let t,o=(0,n.useRef)(null),[h,p]=(0,n.useState)(0),x=e.evidence??s.scan.snapshots.filter(s=>s.route===e.route&&(s.state??"default")===(e.state??"default")&&e.viewports.includes(s.viewport.name)).map(e=>({viewport:e.viewport,current:{screenshot:e.screenshot}})),j=x[h];return(0,n.useEffect)(()=>{o.current?.showModal()},[]),(0,i.jsx)("dialog",{ref:o,className:"finding-dialog","aria-labelledby":"finding-title",onClose:a,onClick:e=>{e.target===o.current&&o.current?.close()},children:(0,i.jsxs)("div",{className:"finding-content",children:[(0,i.jsxs)("header",{className:"finding-header",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:`severity ${e.severity}`,children:e.severity}),(0,i.jsx)("h2",{id:"finding-title",children:e.title})]}),(0,i.jsx)("button",{autoFocus:!0,"aria-label":"Close evidence",onClick:()=>o.current?.close(),children:(0,i.jsx)(r.A,{size:20})})]}),(0,i.jsxs)("dl",{className:"finding-facts",children:[e.approval&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("dt",{children:"Approval"}),(0,i.jsxs)("dd",{children:[(0,i.jsx)("code",{children:e.approval.id})," \xb7 ",e.approval.reason]})]}),(0,i.jsx)("dt",{children:"Property"}),(0,i.jsx)("dd",{children:(0,i.jsx)("code",{children:e.property})}),(0,i.jsx)("dt",{children:"Current"}),(0,i.jsx)("dd",{children:(0,i.jsx)("code",{children:e.current})}),(0,i.jsx)("dt",{children:"Expected"}),(0,i.jsx)("dd",{children:(0,i.jsx)("code",{children:e.expected.join(" \xb7 ")||"Review baseline"})}),e.rule&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("dt",{children:"Rule"}),(0,i.jsx)("dd",{children:(t=(l=e.rule).scope?`${l.scope}${l.variant?` (${l.variant})`:""}/${l.part}`:"unscoped",`${l.source} \xb7 ${t}${l.reason?` \xb7 ${l.reason}`:""} \xb7 ${l.samples} component instances \xb7 tokens: ${l.tokens.map(e=>`${e.value} (${e.count})`).join(", ")||"none"}`)})]}),(0,i.jsx)("dt",{children:"Element"}),(0,i.jsx)("dd",{children:(0,i.jsx)("code",{children:e.selector})}),(0,i.jsx)("dt",{children:"Identity"}),(0,i.jsxs)("dd",{children:[(0,i.jsx)("code",{children:e.identity??"Legacy selector"})," \xb7"," ",e.identityConfidence??"low"," confidence"]})]}),j?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("label",{className:"evidence-viewport",children:["Viewport"," ",(0,i.jsx)("select",{value:h,onChange:e=>p(Number(e.target.value)),children:x.map((e,s)=>(0,i.jsxs)("option",{value:s,children:[e.viewport.name," \xb7 ",e.viewport.width," \xd7 ",e.viewport.height]},e.viewport.name))}),(0,i.jsxs)("code",{children:[e.route,e.state?` \xb7 ${e.state}`:""]})]}),(0,i.jsxs)("div",{className:"evidence-pair",children:[(0,i.jsx)(c,{label:"CURRENT",capture:j.current,viewport:j.viewport}),(0,i.jsx)(c,{label:"BASELINE",capture:j.baseline,viewport:j.viewport})]})]}):(0,i.jsx)("p",{children:"No screenshot evidence was recorded for this finding. Run a new check to collect it."})]})})}var o=a(9376),h=a(6504),p=a(21),x=a(4639),j=a(2665),m=a(8768),v=a(3960),u=a(634),g=a(4582),N=a(7494),f=a(8232),w=a(1613),y=a(6687),b=a(1838),k=a(2293);let A={overview:"Overview",drift:"Visual drift",contract:"Visual contract",viewports:"Viewports"},S={colors:"Color",fontFamilies:"Typography",fontSizes:"Typography",fontWeights:"Typography",lineHeights:"Typography",spacing:"Spacing",radii:"Radius",shadows:"Shadow",borders:"Border",elementHeights:"Height",layout:"Layout"},C=["All","Color","Typography","Spacing","Radius","Layout","Shadow","Border","Height"];function $(e){return new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function z({children:e}){return(0,i.jsx)("span",{className:"count",children:e})}function E({severity:e}){return(0,i.jsxs)("span",{className:`severity ${e}`,children:[(0,i.jsx)("i",{}),e]})}function R(){return(0,i.jsx)("p",{className:"muted",children:"No recurring values in this category."})}function F({issue:e,onInspect:s}){return(0,i.jsxs)("article",{className:"issue-card",children:[(0,i.jsxs)("div",{className:"issue-heading",children:[(0,i.jsx)("span",{className:"category",children:S[e.category]}),(0,i.jsx)(E,{severity:e.severity})]}),(0,i.jsx)("h3",{children:e.title}),e.approval&&(0,i.jsxs)("p",{className:"approval-note",children:["Approved \xb7 ",(0,i.jsx)("code",{children:e.approval.id}),(0,i.jsx)("br",{}),e.approval.reason]}),(0,i.jsxs)("div",{className:"comparison",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"micro",children:"CURRENT"}),(0,i.jsxs)("code",{className:"current",children:["colors"===e.category&&(0,i.jsx)("i",{className:"tiny-swatch",style:{background:e.current}}),e.current]})]}),(0,i.jsx)(o.A,{size:15,className:"muted"}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"micro",children:"EXPECTED"}),(0,i.jsx)("p",{className:"expected",children:e.expected.join(" \xb7 ")||"Review baseline"})]})]}),(0,i.jsxs)("div",{className:"issue-meta",children:[(0,i.jsx)("code",{children:e.selector}),(0,i.jsxs)("span",{children:[e.route,e.state?` \xb7 ${e.state}`:""," ",(0,i.jsx)("span",{className:"dot",children:"\xb7"})," ",e.viewports.join(", ")]})]}),(0,i.jsxs)("button",{className:"evidence-button",onClick:()=>s(e),children:["View evidence ",(0,i.jsx)(h.A,{size:14})]}),(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Inspect property"}),(0,i.jsx)("code",{children:e.property})]})]})}function T({page:e}){let[s,a]=(0,n.useState)(null),[l,c]=(0,n.useState)(""),[E,R]=(0,n.useState)("All"),[M,I]=(0,n.useState)("all"),[H,V]=(0,n.useState)("active"),[B,O]=(0,n.useState)(!1),[D,P]=(0,n.useState)(!1),[U,_]=(0,n.useState)(null),[W,q]=(0,n.useState)(null);async function G(){if(s)try{await navigator.clipboard.writeText(s.agentMarkdown),O(!0),P(!1),setTimeout(()=>O(!1),2200)}catch{P(!0)}}(0,n.useEffect)(()=>{fetch("/report.json",{cache:"no-store"}).then(e=>{if(!e.ok)throw Error("No scan data found. Run tether check, then reopen tether report.");return e.json()}).then(a).catch(e=>c(e.message))},[]),(0,n.useEffect)(()=>{if(!W)return;let e=e=>{"Escape"===e.key&&q(null)};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[W]);let J=[{key:"overview",href:"/",icon:p.A},{key:"drift",href:"/drift/",icon:x.A},{key:"contract",href:"/contract/",icon:j.A},{key:"viewports",href:"/viewports/",icon:m.A}],X=new Set,K=(s?.issues??[]).filter(e=>{let s=S[e.category];return!X.has(s)&&(X.add(s),!0)}).slice(0,4),Q=("approved"===H?s?.approvals?.approved??[]:"all"===H?[...s?.issues??[],...s?.approvals?.approved??[]]:s?.issues??[]).filter(e=>("All"===E||S[e.category]===E)&&("all"===M||e.severity===M))??[];return(0,i.jsxs)("div",{className:"shell",children:[(0,i.jsx)("a",{href:"#main",className:"skip",children:"Skip to report"}),(0,i.jsxs)("aside",{className:"sidebar",children:[(0,i.jsxs)(t(),{href:"/",className:"brand",children:[(0,i.jsx)("img",{className:"brand-symbol",src:"/knot.svg",alt:"",width:34,height:34}),"tether",(0,i.jsx)("span",{className:"version",children:"0.3"})]}),(0,i.jsxs)("div",{className:"workspace",children:[(0,i.jsx)("div",{className:"workspace-icon",children:(0,i.jsx)(v.A,{size:18})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("strong",{children:"Local workspace"}),(0,i.jsx)("small",{children:"Latest scan"})]}),(0,i.jsx)("span",{className:"connection",title:"Local report"})]}),(0,i.jsx)("nav",{"aria-label":"Report navigation",children:J.map(({key:a,href:n,icon:l})=>(0,i.jsxs)(t(),{href:n,className:e===a?"active":"","aria-current":e===a?"page":void 0,children:[(0,i.jsx)(l,{size:17}),"drift"===a?"Drift":A[a],"drift"===a&&!!s?.issues.length&&(0,i.jsx)(z,{children:s.issues.length})]},a))}),(0,i.jsx)("div",{className:"sidebar-bottom",children:(0,i.jsxs)("div",{className:"local-note",children:[(0,i.jsx)(u.A,{size:16}),(0,i.jsx)("span",{children:"Data stays on this device"})]})})]}),(0,i.jsxs)("div",{className:"main-shell",children:[(0,i.jsxs)("header",{className:"topbar",children:[(0,i.jsxs)("div",{children:["tether ",(0,i.jsx)(g.A,{size:13}),(0,i.jsx)("b",{children:A[e]})]}),(0,i.jsxs)("span",{className:"local-pill",children:[(0,i.jsx)("i",{})," Local report"]})]}),(0,i.jsxs)("main",{id:"main",children:[(0,i.jsxs)("div",{className:"page-heading",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("h1",{children:A[e]}),(0,i.jsx)("p",{children:"overview"===e?"Changes since your baseline scan.":"drift"===e?"Review changes by category and severity.":"contract"===e?"Saved colors, typography, spacing, and other styles.":"Screenshots and layout issues at each screen size."})]}),(0,i.jsxs)("button",{className:"button",onClick:G,disabled:!s,children:[B?(0,i.jsx)(N.A,{size:15}):(0,i.jsx)(f.A,{size:15}),B?"Copied to clipboard":"Copy agent brief"]})]}),D&&(0,i.jsxs)("p",{role:"status",className:"notice",children:["Clipboard unavailable."," ",(0,i.jsx)("a",{href:"data:text/markdown;charset=utf-8,"+encodeURIComponent(s?.agentMarkdown??""),download:"tether-agent.md",children:"Download the agent brief"}),"."]}),l&&(0,i.jsxs)("div",{role:"alert",className:"empty",children:[(0,i.jsx)(w.A,{}),(0,i.jsx)("h2",{children:"No scan yet"}),(0,i.jsx)("p",{children:l}),(0,i.jsx)("code",{children:"tether init && tether check"})]}),!l&&!s&&(0,i.jsx)("div",{className:"empty",role:"status",children:"Loading scan…"}),s&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"scan-strip",children:[(0,i.jsxs)("span",{className:"scan-state",children:[(0,i.jsx)(y.A,{size:15})," Scan complete"]}),(0,i.jsx)("code",{children:s.scan.url}),(0,i.jsx)("span",{className:"scan-time",children:$(s.scan.createdAt)}),(0,i.jsxs)("span",{className:"snapshot-label",children:[s.scan.snapshots.length," snapshots"]})]}),s.scan.snapshots.some(e=>e.truncated)&&(0,i.jsx)("p",{className:"notice",children:"Partial coverage: an element limit was reached. Increase maxElements and scan again."}),s.approvals&&(0,i.jsxs)("section",{className:"approval-summary","aria-label":"Approval summary",children:[(0,i.jsxs)("p",{children:["Active findings: ",s.issues.length," \xb7 Approved findings:"," ",s.approvals.approved.length," \xb7 Stale approvals:"," ",s.approvals.stale.length]}),(0,i.jsx)("p",{className:"muted",children:"Status reflects the saved scan. Run tether check after editing approvals."}),!!s.approvals.stale.length&&(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{children:"Inspect stale approvals"}),(0,i.jsx)("ul",{children:s.approvals.stale.map(e=>(0,i.jsxs)("li",{children:[(0,i.jsx)("code",{children:e.id})," \xb7 ",e.route," \xb7 ",e.state," \xb7"," ",e.property," = ",e.current," \xb7 ",e.viewport.name," \xb7"," ",e.reason]},e.id))})]})]}),"overview"===e&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("section",{className:"stats-grid","aria-label":"Findings by severity",children:[{label:s.approvals?"Active drift findings":"Total drift findings",count:s.issues.length},...["high","medium","low"].map(e=>({label:`${e[0].toUpperCase()}${e.slice(1)} priority`,count:s.issues.filter(s=>s.severity===e).length}))].map(e=>(0,i.jsxs)("div",{className:"stat",children:[(0,i.jsx)("span",{className:"stat-label",children:e.label}),(0,i.jsx)("strong",{children:e.count})]},e.label))}),(0,i.jsxs)("p",{className:"scan-context",children:[s.elementCount," elements inspected \xb7"," ",new Set(s.scan.snapshots.map(e=>e.route)).size," ",1===new Set(s.scan.snapshots.map(e=>e.route)).size?"route":"routes"," ","\xb7"," ",new Set(s.scan.snapshots.map(e=>e.viewport.name)).size," ","viewport sizes"]}),(0,i.jsxs)("div",{className:"overview-columns",children:[(0,i.jsxs)("section",{children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsxs)("h2",{children:["Visual drift ",(0,i.jsx)(z,{children:s.issues.length})]}),(0,i.jsxs)(t(),{href:"/drift/",children:["View all deviations ",(0,i.jsx)(h.A,{size:14})]})]}),(0,i.jsx)("p",{className:"section-description",children:"One finding from each affected category."}),(0,i.jsxs)("div",{className:"issue-list",children:[K.map(e=>(0,i.jsx)(F,{issue:e,onInspect:_},e.id)),!s.issues.length&&(0,i.jsxs)("div",{className:"empty",children:[(0,i.jsx)(y.A,{}),(0,i.jsx)("h3",{children:s.approvals?"No unapproved drift detected":"No drift detected"}),(0,i.jsx)("p",{children:s.approvals?.approved.length?"Intentional deviations are listed in the Approved filter.":"The scan matches your visual contract."})]})]})]}),(0,i.jsxs)("aside",{className:"overview-aside",children:[(0,i.jsxs)("div",{className:"contract-summary",children:[(0,i.jsx)("div",{className:"small-icon",children:(0,i.jsx)(j.A,{size:22})}),(0,i.jsx)("h3",{children:"Baseline styles"}),(0,i.jsx)("p",{children:"Styles saved from your baseline scan."}),(0,i.jsx)("div",{className:"palette-strip",children:s.contract.colors.slice(0,7).map(e=>(0,i.jsx)("span",{style:{background:e.value},title:e.value},e.value))}),(0,i.jsxs)("div",{className:"summary-pairs",children:[(0,i.jsx)("span",{children:"Color palette"}),(0,i.jsxs)("b",{children:[s.contract.colors.length," colors"]}),(0,i.jsx)("span",{children:"Type scale"}),(0,i.jsxs)("b",{children:[s.contract.fontSizes.length," sizes"]}),(0,i.jsx)("span",{children:"Spacing scale"}),(0,i.jsxs)("b",{children:[s.contract.spacing.length," values"]})]}),(0,i.jsxs)(t(),{className:"text-link",href:"/contract/",children:["View contract ",(0,i.jsx)(o.A,{size:15})]})]}),(0,i.jsxs)("div",{className:"viewport-summary",children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsx)("h3",{children:"Responsive checks"}),(0,i.jsx)(m.A,{size:16})]}),Array.from(new Map(s.scan.snapshots.map(e=>[e.viewport.name,e.viewport])).values()).map(e=>{let a=s.issues.filter(s=>"layout"===s.category&&s.viewports.includes(e.name)).length;return(0,i.jsxs)("div",{className:"viewport-line",children:[(0,i.jsxs)("span",{children:[e.name," ",(0,i.jsxs)("small",{children:[e.width,"px"]})]}),a?(0,i.jsxs)("span",{className:"layout-warning",children:[a," layout issues"]}):(0,i.jsx)(N.A,{size:15,className:"green"})]},e.name)}),(0,i.jsxs)(t(),{href:"/viewports/",className:"text-link",children:["Inspect screenshots ",(0,i.jsx)(o.A,{size:15})]})]}),(0,i.jsxs)("div",{className:"baseline-note",children:[(0,i.jsx)(u.A,{size:15}),(0,i.jsxs)("span",{children:["Baseline created ",$(s.baselineAt),(0,i.jsx)("br",{}),"Stored locally in ",(0,i.jsx)("code",{children:".tether/"})]})]})]})]})]}),"drift"===e&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"filter-toolbar",children:[(0,i.jsx)("div",{className:"filters","aria-label":"Filter by category",children:C.map(e=>(0,i.jsx)("button",{onClick:()=>R(e),"aria-pressed":E===e,className:E===e?"selected":"",children:e},e))}),s.approvals&&(0,i.jsxs)("label",{className:"severity-select",children:[(0,i.jsx)("span",{className:"sr-only",children:"Approval status"}),(0,i.jsxs)("select",{"aria-label":"Approval status",value:H,onChange:e=>V(e.target.value),children:[(0,i.jsx)("option",{value:"active",children:"Active findings"}),(0,i.jsx)("option",{value:"approved",children:"Approved findings"}),(0,i.jsx)("option",{value:"all",children:"All findings"})]})]}),(0,i.jsxs)("label",{className:"severity-select",children:[(0,i.jsx)("span",{className:"sr-only",children:"Severity"}),(0,i.jsxs)("select",{value:M,onChange:e=>I(e.target.value),children:[(0,i.jsx)("option",{value:"all",children:"All severities"}),(0,i.jsx)("option",{value:"high",children:"High severity"}),(0,i.jsx)("option",{value:"medium",children:"Medium severity"}),(0,i.jsx)("option",{value:"low",children:"Low severity"})]})]})]}),(0,i.jsxs)("div",{className:"results-line",children:[Q.length," ",1===Q.length?"deviation":"deviations",(0,i.jsx)("span",{children:"Sorted by severity"})]}),(0,i.jsx)("div",{className:"drift-grid",children:Q.map(e=>(0,i.jsx)(F,{issue:e,onInspect:_},e.id))}),!Q.length&&(0,i.jsxs)("div",{className:"empty",children:[(0,i.jsx)(y.A,{}),(0,i.jsx)("h2",{children:"No matching deviations"}),(0,i.jsx)("p",{children:"No deviations match these filters."})]})]}),"contract"===e&&(0,i.jsx)(L,{report:s}),"viewports"===e&&(0,i.jsx)(i.Fragment,{children:(0,i.jsx)("div",{className:"viewport-grid",children:s.scan.snapshots.map(e=>{let a=s.issues.filter(s=>s.route===e.route&&(s.state??"default")===(e.state??"default")&&s.viewports.includes(e.viewport.name)),n=a.filter(e=>"layout"===e.category);return(0,i.jsxs)("article",{className:"viewport-card",children:[(0,i.jsxs)("div",{className:"viewport-card-heading",children:[e.viewport.width<500?(0,i.jsx)(b.A,{size:18}):(0,i.jsx)(m.A,{size:18}),(0,i.jsx)("h3",{children:e.viewport.name}),(0,i.jsxs)("span",{children:[e.viewport.width," \xd7 ",e.viewport.height]})]}),(0,i.jsx)("button",{className:"screenshot-button",onClick:()=>q("/"+e.screenshot),"aria-label":`Enlarge ${e.viewport.name} screenshot for ${e.route}`,children:(0,i.jsx)("img",{src:"/"+e.screenshot,alt:`${e.route} at ${e.viewport.width} pixels`})}),(0,i.jsxs)("div",{className:"viewport-caption",children:[(0,i.jsxs)("code",{children:[e.route,e.state?` \xb7 ${e.state}`:""]}),(0,i.jsxs)("span",{children:[a.length," deviations"]})]}),(0,i.jsxs)("div",{className:n.length?"viewport-status warning":"viewport-status",children:[n.length?(0,i.jsx)(w.A,{size:14}):(0,i.jsx)(y.A,{size:14}),n.length?n.map(e=>e.title).join(" \xb7 "):"Content fits the viewport"]}),(0,i.jsxs)("a",{href:"/"+e.screenshot,download:!0,className:"download-shot",children:[(0,i.jsx)(k.A,{size:13}),"Download capture"]})]},`${e.route}-${e.state??"default"}-${e.viewport.name}`)})})})]})]})]}),U&&s&&(0,i.jsx)(d,{issue:U,report:s,onClose:()=>_(null)},U.id),W&&(0,i.jsxs)("div",{className:"preview",role:"dialog","aria-modal":"true","aria-label":"Screenshot preview",onClick:()=>q(null),children:[(0,i.jsx)("button",{autoFocus:!0,onClick:()=>q(null),"aria-label":"Close preview",children:(0,i.jsx)(r.A,{size:22})}),(0,i.jsx)("img",{src:W,alt:"Full viewport capture",onClick:e=>e.stopPropagation()})]})]})}function L({report:e}){let s=e.contract,a=e=>[...e].sort((e,s)=>parseFloat(e.value)-parseFloat(s.value));return(0,i.jsxs)("div",{className:"contract-content",children:[(0,i.jsxs)("div",{className:"contract-banner",children:[(0,i.jsx)(j.A,{size:20}),(0,i.jsxs)("div",{children:[(0,i.jsx)("b",{children:"Saved tokens"}),(0,i.jsxs)("span",{children:["Recurring values \xb7 target of ",s.minOccurrences,"+ distinct elements per token"]})]}),(0,i.jsxs)("span",{className:"contract-date",children:["Baseline \xb7 ",$(e.baselineAt)]})]}),2===s.version&&(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsx)("h2",{children:"Component rules"}),(0,i.jsx)("p",{children:"Explicit scopes take precedence over global tokens when supported. Unnamed descendants use global tokens."}),s.partial&&(0,i.jsx)("p",{children:"Partial baseline: inferred component rules fall back to global tokens. Explicit overrides still apply."}),(s.rules??[]).map(e=>{let a=s.scopes?.find(s=>s.name===e.scope),n=a?.minOccurrences??Math.max(2,s.minOccurrences),l="override"===e.source||!s.partial&&e.tokens.some(e=>e.count>=n);return(0,i.jsxs)("div",{className:"type-info",children:[(0,i.jsxs)("b",{children:[e.scope,a?.variant?` (${a.variant})`:""," / ",e.part]}),(0,i.jsxs)("code",{children:[e.property,":"," ",e.tokens.map(e=>`${e.value} (${e.count})`).join(" \xb7 ")]}),(0,i.jsxs)("span",{children:[e.samples," component instances \xb7"," ","override"===e.source?"Explicit override":l?`Inferred \xb7 minimum ${n} per token`:"Insufficient support: global fallback"]})]},JSON.stringify([e.scope,e.part,e.category,e.property]))}),!s.rules?.length&&(0,i.jsx)("p",{children:"No component samples. Global fallback applies."})]}),(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsxs)("h2",{children:["01 ",(0,i.jsx)("span",{children:"Color palette"})]}),(0,i.jsxs)(z,{children:[s.colors.length," tokens"]})]}),(0,i.jsxs)("div",{className:"color-grid",children:[s.colors.map(e=>(0,i.jsxs)("div",{className:"color-token",children:[(0,i.jsx)("div",{className:"swatch",style:{background:e.value}}),(0,i.jsxs)("div",{children:[(0,i.jsx)("code",{children:e.value}),(0,i.jsxs)("small",{children:[e.count," elements"]})]})]},e.value)),!s.colors.length&&(0,i.jsx)(R,{})]})]}),(0,i.jsxs)("div",{className:"contract-two-columns",children:[(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsxs)("h2",{children:["02 ",(0,i.jsx)("span",{children:"Typography"})]}),(0,i.jsxs)(z,{children:[s.fontSizes.length," sizes"]})]}),(0,i.jsxs)("div",{className:"type-info",children:[(0,i.jsx)("span",{children:s.fontFamilies.map(e=>e.value).join(" \xb7 ")}),(0,i.jsx)("code",{children:s.fontWeights.map(e=>e.value).join(" / ")})]}),(0,i.jsxs)("div",{className:"type-scale",children:[a(s.fontSizes).reverse().map(e=>(0,i.jsxs)("div",{children:[(0,i.jsx)("code",{children:e.value}),(0,i.jsx)("span",{style:{fontSize:e.value},children:"The quick brown fox"}),(0,i.jsxs)("small",{children:["\xd7",e.count]})]},e.value)),!s.fontSizes.length&&(0,i.jsx)(R,{})]}),(0,i.jsxs)("p",{className:"token-footnote",children:["Line heights:"," ",s.lineHeights.map(e=>e.value).join(" \xb7 ")||"Browser default"]})]}),(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsxs)("h2",{children:["03 ",(0,i.jsx)("span",{children:"Spacing"})]}),(0,i.jsxs)(z,{children:[s.spacing.length," steps"]})]}),(0,i.jsx)("p",{className:"token-caption",children:"Margins, padding, and gaps."}),(0,i.jsxs)("div",{className:"spacing-scale",children:[a(s.spacing).map(e=>(0,i.jsxs)("div",{children:[(0,i.jsx)("code",{children:e.value}),(0,i.jsx)("div",{className:"spacing-track",children:(0,i.jsx)("span",{style:{width:`${Math.min(4*Math.abs(parseFloat(e.value)),260)}px`}})}),(0,i.jsxs)("small",{children:["\xd7",e.count]})]},e.value)),!s.spacing.length&&(0,i.jsx)(R,{})]})]})]}),(0,i.jsxs)("div",{className:"contract-two-columns",children:[(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsxs)("div",{className:"section-heading",children:[(0,i.jsxs)("h2",{children:["04 ",(0,i.jsx)("span",{children:"Corner radii"})]}),(0,i.jsxs)(z,{children:[s.radii.length," tokens"]})]}),(0,i.jsxs)("div",{className:"radius-grid",children:[a(s.radii).map(e=>(0,i.jsxs)("div",{children:[(0,i.jsx)("div",{className:"radius-example",style:{borderRadius:e.value}}),(0,i.jsx)("code",{children:e.value}),(0,i.jsxs)("small",{children:[e.count," elements"]})]},e.value)),!s.radii.length&&(0,i.jsx)(R,{})]})]}),(0,i.jsxs)("section",{className:"token-section",children:[(0,i.jsx)("div",{className:"section-heading",children:(0,i.jsxs)("h2",{children:["05 ",(0,i.jsx)("span",{children:"Shadows & borders"})]})}),(0,i.jsxs)("div",{className:"shadow-grid",children:[s.shadows.map(e=>(0,i.jsxs)("div",{children:[(0,i.jsx)("div",{className:"shadow-example",style:{boxShadow:e.value},children:"Aa"}),(0,i.jsx)("code",{children:e.value})]},e.value)),!s.shadows.length&&(0,i.jsx)(R,{})]}),(0,i.jsx)("div",{className:"border-list",children:s.borders.map(e=>(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{style:{borderTop:e.value}}),(0,i.jsx)("code",{children:e.value}),(0,i.jsxs)("small",{children:["\xd7",e.count]})]},e.value))})]})]}),(0,i.jsxs)("section",{className:"token-section control-section",children:[(0,i.jsx)("div",{className:"section-heading",children:(0,i.jsxs)("h2",{children:["06 ",(0,i.jsx)("span",{children:"Control heights"})]})}),(0,i.jsxs)("div",{children:[a(s.elementHeights).map(e=>(0,i.jsxs)("span",{className:"control-token",children:[(0,i.jsx)("code",{children:e.value}),(0,i.jsxs)("small",{children:[e.count," controls"]})]},e.value)),!s.elementHeights.length&&(0,i.jsx)(R,{})]})]})]})}},7330:(e,s,a)=>{Promise.resolve().then(a.bind(a,6652))}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[492],{4760:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"styles",{enumerable:!0,get:function(){return l}});let l={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},desc:{display:"inline-block"},h1:{display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},h2:{fontSize:14,fontWeight:400,lineHeight:"49px",margin:0}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5465:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let r=l(3365),n=l(6553),o=function(){return(0,r.jsx)("html",{children:(0,r.jsx)("body",{children:(0,r.jsx)(n.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})})})};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6553:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HTTPAccessErrorFallback",{enumerable:!0,get:function(){return o}});let r=l(3365),n=l(4760);function o({status:e,message:t}){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("title",{children:`${e}: ${t}`}),(0,r.jsx)("div",{style:n.styles.error,children:(0,r.jsxs)("div",{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,r.jsx)("h1",{className:"next-error-h1",style:n.styles.h1,children:e}),(0,r.jsx)("div",{style:n.styles.desc,children:(0,r.jsx)("h2",{style:n.styles.h2,children:t})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[492],{4760:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"styles",{enumerable:!0,get:function(){return l}});let l={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},desc:{display:"inline-block"},h1:{display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},h2:{fontSize:14,fontWeight:400,lineHeight:"49px",margin:0}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5465:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let r=l(3365),n=l(6553),o=function(){return(0,r.jsx)("html",{children:(0,r.jsx)("body",{children:(0,r.jsx)(n.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})})})};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6553:(e,t,l)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HTTPAccessErrorFallback",{enumerable:!0,get:function(){return o}});let r=l(3365),n=l(4760);function o({status:e,message:t}){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("title",{children:`${e}: ${t}`}),(0,r.jsx)("div",{style:n.styles.error,children:(0,r.jsxs)("div",{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,r.jsx)("h1",{className:"next-error-h1",style:n.styles.h1,children:e}),(0,r.jsx)("div",{style:n.styles.desc,children:(0,r.jsx)("h2",{style:n.styles.h2,children:t})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},7366:(e,t,l)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return l(5465)}])}},e=>{e.O(0,[347,158,358],()=>e(e.s=7366)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[513],{},_=>{_.O(0,[979,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[513],{},_=>{_.O(0,[979,330,347,158,358],()=>_(_.s=7330)),_N_E=_.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[354],{},_=>{_.O(0,[979,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[354],{},_=>{_.O(0,[979,330,347,158,358],()=>_(_.s=7330)),_N_E=_.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[177],{894:()=>{},6711:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,894,23))}},e=>{e.O(0,[611,347,158,358],()=>e(e.s=6711)),_N_E=e.O()}]);
|
package/report/out/_next/static/chunks/app/{page-bdfcce47bd844e7e.js → page-e399a35da3e55f00.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{},_=>{_.O(0,[979,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{},_=>{_.O(0,[979,330,347,158,358],()=>_(_.s=7330)),_N_E=_.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[230],{},_=>{_.O(0,[979,
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[230],{},_=>{_.O(0,[979,330,347,158,358],()=>_(_.s=7330)),_N_E=_.O()}]);
|
package/report/out/_next/static/chunks/{main-app-e3082ce30f616b80.js → main-app-e7e077df7256067f.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[358],{
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[358],{4078:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,7567,23)),Promise.resolve().then(n.t.bind(n,1076,23)),Promise.resolve().then(n.t.bind(n,1580,23)),Promise.resolve().then(n.t.bind(n,7245,23)),Promise.resolve().then(n.t.bind(n,1133,23)),Promise.resolve().then(n.t.bind(n,4297,23)),Promise.resolve().then(n.t.bind(n,1872,23)),Promise.resolve().then(n.bind(n,2569))},6499:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[347,158],()=>(s(2521),s(4078))),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[337],{1621:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,7567,23))}},e=>{e.O(0,[347,158,358],()=>e(e.s=1621)),_N_E=e.O()}]);
|