@polishd/next 0.2.2-dev.2 → 0.2.2-dev.3
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/CHANGELOG.md +61 -0
- package/README.md +8 -0
- package/dist/client/design-scan.d.ts +17 -1
- package/dist/client/design-scan.d.ts.map +1 -1
- package/dist/client/design-scan.js +7 -3
- package/dist/client/design-scan.js.map +1 -1
- package/dist/dashboard/color-chip.d.ts +5 -0
- package/dist/dashboard/color-chip.d.ts.map +1 -0
- package/dist/dashboard/color-chip.js +81 -0
- package/dist/dashboard/color-chip.js.map +1 -0
- package/dist/dashboard/design-review-card.d.ts.map +1 -1
- package/dist/dashboard/design-review-card.js +3 -2
- package/dist/dashboard/design-review-card.js.map +1 -1
- package/dist/dashboard/design-tokens.d.ts +33 -0
- package/dist/dashboard/design-tokens.d.ts.map +1 -0
- package/dist/dashboard/design-tokens.js +64 -0
- package/dist/dashboard/design-tokens.js.map +1 -0
- package/dist/dashboard/design.d.ts.map +1 -1
- package/dist/dashboard/design.js +9 -9
- package/dist/dashboard/design.js.map +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +2 -3
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/overflow-row.d.ts +24 -0
- package/dist/dashboard/overflow-row.d.ts.map +1 -0
- package/dist/dashboard/overflow-row.js +85 -0
- package/dist/dashboard/overflow-row.js.map +1 -0
- package/dist/dashboard/telemetry.d.ts.map +1 -1
- package/dist/dashboard/telemetry.js +71 -4
- package/dist/dashboard/telemetry.js.map +1 -1
- package/dist/dashboard.css +67 -10
- package/dist/server/queries.d.ts.map +1 -1
- package/dist/server/queries.js +10 -0
- package/dist/server/queries.js.map +1 -1
- package/dist/server/telemetry.d.ts +13 -0
- package/dist/server/telemetry.d.ts.map +1 -1
- package/dist/server/telemetry.js +14 -0
- package/dist/server/telemetry.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -44,6 +44,67 @@ seen, plus which dashboard tabs get used across the fleet. The tab only
|
|
|
44
44
|
renders on installations whose database actually holds telemetry — for the
|
|
45
45
|
senders, it would only ever be an empty screen.
|
|
46
46
|
|
|
47
|
+
### The full dashboard experience, over telemetry
|
|
48
|
+
|
|
49
|
+
A collector that cares about the dashboard-usage story more than its own
|
|
50
|
+
traffic can now flip one env var — `POLISHD_ANALYTICS_SOURCE=telemetry` —
|
|
51
|
+
and the *entire* dashboard reads the cross-install dataset: Analytics,
|
|
52
|
+
journeys, element breakdowns, device sizes, the Design tab, and the AI
|
|
53
|
+
summary, all through the same single source function the separation uses.
|
|
54
|
+
First-party events keep being captured and stored, just not shown, so the
|
|
55
|
+
switch is losslessly reversible.
|
|
56
|
+
|
|
57
|
+
To make that experience complete, the telemetry emitter now also captures
|
|
58
|
+
scroll depth (of the dashboard's own scroll container — the document never
|
|
59
|
+
scrolls under the shell), JS errors raised while the dashboard is up, and one
|
|
60
|
+
design scan of the dashboard per tab per session. `scheduleDesignScan` grew an
|
|
61
|
+
options form for this: a caller-supplied staleness check for namespaced path
|
|
62
|
+
labels, and a `scanDashboard` flag that lifts the "never measure the
|
|
63
|
+
dashboard" guard for the one caller whose target it is. On the collecting
|
|
64
|
+
side the Design tab therefore reviews the dashboard's own design as real
|
|
65
|
+
installs render it.
|
|
66
|
+
|
|
67
|
+
### Design findings read as colors and percentages, not raw tokens
|
|
68
|
+
|
|
69
|
+
A contrast finding used to arrive as a line of citations: `#ffffff text on
|
|
70
|
+
#ecae12 is 1.98:1 at 13.5px and #f5f5f5 text on #a17321 is 3.86:1 at 15px`,
|
|
71
|
+
set in 10px mono. Two things in that sentence are unreadable on sight — a hex
|
|
72
|
+
is a color nobody can picture, and `1.98:1` is a point on an open-ended scale
|
|
73
|
+
only accessibility people carry in their head.
|
|
74
|
+
|
|
75
|
+
**Hexes now render as swatches** wherever a design finding quotes one: the
|
|
76
|
+
deterministic flags, the model's evidence and suggestion, its assessment and
|
|
77
|
+
strengths, and the contrast rows. The code stays next to the swatch, because
|
|
78
|
+
that's what you search the codebase for — and the chip is a button: hover or
|
|
79
|
+
focus turns the swatch itself into a copy glyph, and a click puts the hex on
|
|
80
|
+
the clipboard and shows a tick. Swapping the swatch rather than revealing a
|
|
81
|
+
second icon keeps the chip one fixed width, so there's no slot sitting empty at
|
|
82
|
+
rest and no row of chips jumping as the pointer crosses it. Opened over plain
|
|
83
|
+
http on a LAN address, where there is no Clipboard API at all, it falls back to
|
|
84
|
+
the old selection trick and says so on the chip if even that fails.
|
|
85
|
+
|
|
86
|
+
**Ratios render as a 0–100% contrast score.** The scale is logarithmic, so the
|
|
87
|
+
steps read evenly instead of bunching every real pairing into the bottom fifth:
|
|
88
|
+
1:1 is 0%, AA's 4.5:1 lands at 49%, 21:1 is 100%. The exact ratio moves into
|
|
89
|
+
the tooltip rather than disappearing. Failing pairs are tinted red (clears
|
|
90
|
+
nothing) or amber (clears large text only); anything at AA stays neutral, since
|
|
91
|
+
these sentences quote the threshold as often as the measurement.
|
|
92
|
+
|
|
93
|
+
Each failing pair also gets a **meter** — the score as a bar, with a tick at
|
|
94
|
+
the level that text size actually needs — replacing `1.98:1 (needs 4.5:1 at
|
|
95
|
+
13.5px)`. The evidence and suggestion boxes went from 10px mono to 12px prose
|
|
96
|
+
with a real line height; only the tokens stay monospaced.
|
|
97
|
+
|
|
98
|
+
The **warning banner above the contrast table is gone**. It restated the rows
|
|
99
|
+
underneath it pair for pair, which was tolerable when the rows were dense
|
|
100
|
+
numbers and redundant once they weren't. The flags themselves stay in the data
|
|
101
|
+
— the AI digest reads them, with the page each failure was seen on.
|
|
102
|
+
|
|
103
|
+
Rewriting happens at render time. Stored flags, evidence strings and the AI
|
|
104
|
+
digest keep their verbatim numbers, because the review pipeline verifies an
|
|
105
|
+
issue by matching its citation against the digest it sent — so no cached review
|
|
106
|
+
is invalidated by this.
|
|
107
|
+
|
|
47
108
|
## 0.2.1
|
|
48
109
|
|
|
49
110
|
### Losses can be ignored, and the model remembers why
|
package/README.md
CHANGED
|
@@ -471,6 +471,13 @@ pages, features, journeys, the AI digest) and appear only in an **Installs**
|
|
|
471
471
|
dashboard tab — per-domain sessions, tab views, rage/dead clicks, last seen —
|
|
472
472
|
which only shows up on installations whose database actually holds telemetry.
|
|
473
473
|
|
|
474
|
+
A collector that cares about the dashboard-usage story more than its own
|
|
475
|
+
traffic can flip the whole thing: `POLISHD_ANALYTICS_SOURCE=telemetry` points
|
|
476
|
+
every dashboard feature — Analytics, journeys, elements, device sizes, the
|
|
477
|
+
Design tab (fed by the emitter's design scans *of the dashboard itself*), and
|
|
478
|
+
the AI summary — at the telemetry dataset instead. First-party events are
|
|
479
|
+
still captured and stored, just not shown, so flipping back loses nothing.
|
|
480
|
+
|
|
474
481
|
## Configuration
|
|
475
482
|
|
|
476
483
|
Defaults suit a low-traffic site. Override via `polishd.config.ts`:
|
|
@@ -545,6 +552,7 @@ POLISHD_SESSION_COOKIE=my_session
|
|
|
545
552
|
| `POLISHD_GITHUB_AUTO_ISSUES` | GitHub (optional) | `true` — file a GitHub issue automatically for each new problem a summary finds |
|
|
546
553
|
| `POLISHD_TELEMETRY` | optional | `off` (or `0`/`false`/`no`) — disable [dashboard telemetry](#dashboard-telemetry) entirely, consent prompt included |
|
|
547
554
|
| `POLISHD_TELEMETRY_ENDPOINT` | optional | Where dashboard telemetry is sent, if not the polishd project's own endpoint |
|
|
555
|
+
| `POLISHD_ANALYTICS_SOURCE` | collector only | `telemetry` — point the whole dashboard (every tab, the AI summary included) at collected cross-install telemetry instead of the site's own traffic |
|
|
548
556
|
|
|
549
557
|
AI settings are optional — the dashboard's **Settings** tab configures the same
|
|
550
558
|
fields, and what you save there overrides these env defaults.
|
|
@@ -27,11 +27,27 @@ export declare function normalizeColor(value: string): string | null;
|
|
|
27
27
|
export declare function collectDesignScan(root?: Element): PolishdDesignScanPayload | null;
|
|
28
28
|
/** Serialize, shrinking the longest lists if a pathological page overflows. */
|
|
29
29
|
export declare function serializeDesignScan(payload: PolishdDesignScanPayload): string;
|
|
30
|
+
export interface DesignScanOptions {
|
|
31
|
+
delayMs?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Replaces the default `location.pathname === path` staleness check — for
|
|
34
|
+
* callers whose `path` is a namespaced label rather than a URL (the
|
|
35
|
+
* dashboard telemetry emitter labels its scans `/~polishd/<tab>`). Return
|
|
36
|
+
* false to drop a scan whose moment has passed.
|
|
37
|
+
*/
|
|
38
|
+
stillCurrent?: () => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Scan even though the page is the dashboard. Only the telemetry emitter
|
|
41
|
+
* passes this: measuring the dashboard *is* its job, whereas for a host
|
|
42
|
+
* site's capture the dashboard must never count as the site's design.
|
|
43
|
+
*/
|
|
44
|
+
scanDashboard?: boolean;
|
|
45
|
+
}
|
|
30
46
|
/**
|
|
31
47
|
* Scan `path` once per session, after the page settles, and hand the payload
|
|
32
48
|
* to `emit`. Skips silently when the tab is hidden at fire time (layout of a
|
|
33
49
|
* backgrounded prerender isn't the design anyone sees) — a later visit to the
|
|
34
50
|
* same path in this session will still be un-scanned and retry.
|
|
35
51
|
*/
|
|
36
|
-
export declare function scheduleDesignScan(path: string, emit: (payloadJson: string, elements: number) => void,
|
|
52
|
+
export declare function scheduleDesignScan(path: string, emit: (payloadJson: string, elements: number) => void, options?: number | DesignScanOptions): void;
|
|
37
53
|
//# sourceMappingURL=design-scan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-scan.d.ts","sourceRoot":"","sources":["../../src/client/design-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAMV,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AA0BzB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAyCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,OAAuB,GAAG,wBAAwB,GAAG,IAAI,CAqKhG;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAe7E;AAID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"design-scan.d.ts","sourceRoot":"","sources":["../../src/client/design-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAMV,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AA0BzB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAyCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,OAAuB,GAAG,wBAAwB,GAAG,IAAI,CAqKhG;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAe7E;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACrD,OAAO,GAAE,MAAM,GAAG,iBAAwB,GACzC,IAAI,CAmDN"}
|
|
@@ -265,7 +265,10 @@ const SCANNED_PREFIX = "polishd_ds:";
|
|
|
265
265
|
* backgrounded prerender isn't the design anyone sees) — a later visit to the
|
|
266
266
|
* same path in this session will still be un-scanned and retry.
|
|
267
267
|
*/
|
|
268
|
-
export function scheduleDesignScan(path, emit,
|
|
268
|
+
export function scheduleDesignScan(path, emit, options = 1500) {
|
|
269
|
+
// The third argument was a bare delayMs before options existed.
|
|
270
|
+
const opts = typeof options === "number" ? { delayMs: options } : options;
|
|
271
|
+
const delayMs = opts.delayMs ?? 1500;
|
|
269
272
|
let done = false;
|
|
270
273
|
try {
|
|
271
274
|
if (sessionStorage.getItem(SCANNED_PREFIX + path))
|
|
@@ -279,7 +282,7 @@ export function scheduleDesignScan(path, emit, delayMs = 1500) {
|
|
|
279
282
|
return;
|
|
280
283
|
done = true;
|
|
281
284
|
// The page navigated on while we waited — that path's own scan will fire.
|
|
282
|
-
if (location.pathname !== path)
|
|
285
|
+
if (opts.stillCurrent ? !opts.stillCurrent() : location.pathname !== path)
|
|
283
286
|
return;
|
|
284
287
|
if (document.visibilityState === "hidden")
|
|
285
288
|
return;
|
|
@@ -287,7 +290,8 @@ export function scheduleDesignScan(path, emit, delayMs = 1500) {
|
|
|
287
290
|
// as the site's. The path check upstream normally catches this, but it
|
|
288
291
|
// only knows the configured route — this recognizes the dashboard by its
|
|
289
292
|
// own scope root, so a dashboard mounted anywhere is never scanned.
|
|
290
|
-
|
|
293
|
+
// (Unless the caller is the telemetry emitter, whose target it is.)
|
|
294
|
+
if (!opts.scanDashboard && document.querySelector(".polishd-root"))
|
|
291
295
|
return;
|
|
292
296
|
try {
|
|
293
297
|
const payload = collectDesignScan();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-scan.js","sourceRoot":"","sources":["../../src/client/design-scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"design-scan.js","sourceRoot":"","sources":["../../src/client/design-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-chip.d.ts","sourceRoot":"","sources":["../../src/dashboard/color-chip.tsx"],"names":[],"mappings":"AAyFA,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,+BAkDlD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Polishd — the color chip, and the one interactive thing in a design finding.
|
|
5
|
+
*
|
|
6
|
+
* A hex in a finding exists to be pasted into code, so the chip is a copy
|
|
7
|
+
* button: hover (or keyboard focus) turns the swatch itself into a copy glyph,
|
|
8
|
+
* and a click puts the value on the clipboard and shows a tick. Swapping the
|
|
9
|
+
* swatch rather than revealing a second icon keeps the chip one fixed width —
|
|
10
|
+
* no reserved slot sitting empty, and no row of chips jumping as the pointer
|
|
11
|
+
* crosses it. The color is what you were looking at before you reached for the
|
|
12
|
+
* chip, so trading it for the action while hovering costs nothing.
|
|
13
|
+
*
|
|
14
|
+
* This is the only client-side piece of the Design tab's prose — the rest of
|
|
15
|
+
* `design-tokens` stays renderable on the server, which is why the chip lives
|
|
16
|
+
* in its own file rather than pulling `Annotated` across the boundary with it.
|
|
17
|
+
*/
|
|
18
|
+
import { useEffect, useState } from "react";
|
|
19
|
+
/**
|
|
20
|
+
* Clipboard API first, selection trick second. The dashboard is often opened
|
|
21
|
+
* over plain http on a LAN address during development, where
|
|
22
|
+
* `navigator.clipboard` is simply absent — `execCommand` is what still works
|
|
23
|
+
* there, deprecated or not.
|
|
24
|
+
*/
|
|
25
|
+
async function copyText(text) {
|
|
26
|
+
try {
|
|
27
|
+
if (navigator.clipboard?.writeText) {
|
|
28
|
+
await navigator.clipboard.writeText(text);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Denied, or an insecure origin that exposes the API but refuses the write.
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const scratch = document.createElement("textarea");
|
|
37
|
+
scratch.value = text;
|
|
38
|
+
scratch.setAttribute("readonly", "");
|
|
39
|
+
scratch.style.position = "fixed";
|
|
40
|
+
scratch.style.top = "0";
|
|
41
|
+
scratch.style.opacity = "0";
|
|
42
|
+
document.body.appendChild(scratch);
|
|
43
|
+
scratch.select();
|
|
44
|
+
const ok = document.execCommand("copy");
|
|
45
|
+
scratch.remove();
|
|
46
|
+
return ok;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Glyphs are drawn heavy: they render into the swatch's 10px box. */
|
|
53
|
+
function Glyph({ children }) {
|
|
54
|
+
return (_jsx("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: children }));
|
|
55
|
+
}
|
|
56
|
+
const COPY_GLYPH = (_jsxs(Glyph, { children: [_jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2" }), _jsx("path", { d: "M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1" })] }));
|
|
57
|
+
const TICK_GLYPH = (_jsx(Glyph, { children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }));
|
|
58
|
+
const CROSS_GLYPH = (_jsx(Glyph, { children: _jsx("path", { d: "M18 6 6 18M6 6l12 12" }) }));
|
|
59
|
+
/** A hex as a swatch + its code, click to copy. */
|
|
60
|
+
export function ColorToken({ hex }) {
|
|
61
|
+
const [state, setState] = useState("idle");
|
|
62
|
+
// Back to the resting glyph on its own; a chip stuck on "copied" would read
|
|
63
|
+
// as a state of the color rather than of the last click.
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (state === "idle")
|
|
66
|
+
return;
|
|
67
|
+
const t = setTimeout(() => setState("idle"), 1400);
|
|
68
|
+
return () => clearTimeout(t);
|
|
69
|
+
}, [state]);
|
|
70
|
+
const label = state === "copied"
|
|
71
|
+
? `Copied ${hex}`
|
|
72
|
+
: state === "failed"
|
|
73
|
+
? `Couldn't copy ${hex} — select it and copy manually`
|
|
74
|
+
: `Copy ${hex}`;
|
|
75
|
+
return (_jsxs("button", { type: "button", onClick: () => void copyText(hex).then((ok) => setState(ok ? "copied" : "failed")), title: label, "aria-label": label, className: "group/chip inline-flex cursor-pointer items-center gap-1 rounded border border-[#2e2e2e] bg-[#161616] px-1 py-px align-middle font-mono text-[11px] text-[#ccc] transition-colors hover:border-[#555] hover:bg-[#1f1f1f] focus:outline-none focus-visible:border-[#777]", children: [_jsxs("span", { className: "relative h-2.5 w-2.5 shrink-0", children: [_jsx("span", { "aria-hidden": true, className: `absolute inset-0 rounded-[2px] border border-white/20 transition-opacity ${state === "idle" ? "group-hover/chip:opacity-0 group-focus-visible/chip:opacity-0" : "opacity-0"}`, style: { backgroundColor: hex } }), _jsx("span", { "aria-hidden": true, className: `absolute inset-0 flex items-center justify-center transition-opacity ${state === "copied"
|
|
76
|
+
? "text-emerald-400 opacity-100"
|
|
77
|
+
: state === "failed"
|
|
78
|
+
? "text-red-400 opacity-100"
|
|
79
|
+
: "text-[#ddd] opacity-0 group-hover/chip:opacity-100 group-focus-visible/chip:opacity-100"}`, children: state === "copied" ? TICK_GLYPH : state === "failed" ? CROSS_GLYPH : COPY_GLYPH })] }), hex] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=color-chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-chip.js","sourceRoot":"","sources":["../../src/dashboard/color-chip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAE5D;;;;;GAKG;AACH,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;YACnC,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,SAAS,KAAK,CAAC,EAAE,QAAQ,EAA2B;IAClD,OAAO,CACL,cACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,iCAGrB,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,MAAC,KAAK,eACJ,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EAClD,eAAM,CAAC,EAAC,0DAA0D,GAAG,IAC/D,CACT,CAAC;AAEF,MAAM,UAAU,GAAG,CACjB,KAAC,KAAK,cACJ,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAC9B,CACT,CAAC;AAEF,MAAM,WAAW,GAAG,CAClB,KAAC,KAAK,cACJ,eAAM,CAAC,EAAC,sBAAsB,GAAG,GAC3B,CACT,CAAC;AAEF,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,EAAE,GAAG,EAAmB;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA+B,MAAM,CAAC,CAAC;IAEzE,4EAA4E;IAC5E,yDAAyD;IACzD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,KAAK,GACT,KAAK,KAAK,QAAQ;QAChB,CAAC,CAAC,UAAU,GAAG,EAAE;QACjB,CAAC,CAAC,KAAK,KAAK,QAAQ;YAClB,CAAC,CAAC,iBAAiB,GAAG,gCAAgC;YACtD,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;IAEtB,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAClF,KAAK,EAAE,KAAK,gBACA,KAAK,EACjB,SAAS,EAAC,yQAAyQ,aAEnR,gBAAM,SAAS,EAAC,+BAA+B,aAC7C,oCAEE,SAAS,EAAE,4EACT,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,+DAA+D,CAAC,CAAC,CAAC,WACvF,EAAE,EACF,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,GAC/B,EACF,oCAEE,SAAS,EAAE,wEACT,KAAK,KAAK,QAAQ;4BAChB,CAAC,CAAC,8BAA8B;4BAChC,CAAC,CAAC,KAAK,KAAK,QAAQ;gCAClB,CAAC,CAAC,0BAA0B;gCAC5B,CAAC,CAAC,yFACR,EAAE,YAED,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,GAC3E,IACF,EACN,GAAG,IACG,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-review-card.d.ts","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"design-review-card.d.ts","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAK3E,4EAA4E;AAC5E,wBAAgB,oBAAoB,gCAenC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,gEAAgE;AAChE,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,YAAY,GACb,EAAE,qBAAqB,+BAsGvB"}
|
|
@@ -17,6 +17,7 @@ import { useState, useTransition } from "react";
|
|
|
17
17
|
import { useRouter } from "next/navigation";
|
|
18
18
|
import { generateDesignReviewAction } from "../ai/actions";
|
|
19
19
|
import { TabLink } from "./chrome";
|
|
20
|
+
import { Annotated } from "./design-tokens";
|
|
20
21
|
import { RefreshIcon, border, card, iconBtn, labelCls, primaryBtn, relTime } from "./ui";
|
|
21
22
|
/** Re-run the deterministic metrics: refresh the server render in place. */
|
|
22
23
|
export function RefreshMetricsButton() {
|
|
@@ -48,7 +49,7 @@ export default function DesignReviewCard({ initialReview, initialStale, hasApiKe
|
|
|
48
49
|
? "Connect a model first — Settings tab"
|
|
49
50
|
: scannedPages === 0
|
|
50
51
|
? "No pages scanned yet"
|
|
51
|
-
: "Regenerate the design review now", "aria-label": "Refresh design review", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) })] }), _jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [error && (_jsx("div", { className: "mb-3 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400", children: error })), review ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: review.text }), _jsx(StrengthsIssues, { strengths: review.strengths, issues: review.issues }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Generated ", relTime(review.generatedAt), " \u00B7 ", review.provider, "/", review.model] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "Metrics changed since this review \u2014 refresh to update" }))] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: !hasApiKey
|
|
52
|
+
: "Regenerate the design review now", "aria-label": "Refresh design review", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) })] }), _jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [error && (_jsx("div", { className: "mb-3 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400", children: error })), review ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: _jsx(Annotated, { text: review.text }) }), _jsx(StrengthsIssues, { strengths: review.strengths, issues: review.issues }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Generated ", relTime(review.generatedAt), " \u00B7 ", review.provider, "/", review.model] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "Metrics changed since this review \u2014 refresh to update" }))] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: !hasApiKey
|
|
52
53
|
? "No model connected. The design review uses the same provider and key as the analytics summary — add one in Settings."
|
|
53
54
|
: scannedPages === 0
|
|
54
55
|
? "No pages scanned yet — browse the site and the design metrics will appear here."
|
|
@@ -59,6 +60,6 @@ function StrengthsIssues({ strengths, issues, }) {
|
|
|
59
60
|
const hasIssues = !!issues?.length;
|
|
60
61
|
if (!hasStrengths && !hasIssues)
|
|
61
62
|
return null;
|
|
62
|
-
return (_jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [hasStrengths && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-emerald-500`, children: "Working" }), _jsx("ul", { className: "space-y-1.5", children: strengths.map((s, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-emerald-500", children: "\u2713" }), _jsx("span", { children: s })] }, i))) })] })), hasIssues && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-amber-400`, children: "Breaking the system" }), _jsx("ul", { className: "space-y-2.5", children: issues.map((iss, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-amber-400", children: "\u2715" }), _jsxs("span", { children: [iss.issue, _jsxs("span", { className: "mt-
|
|
63
|
+
return (_jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [hasStrengths && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-emerald-500`, children: "Working" }), _jsx("ul", { className: "space-y-1.5", children: strengths.map((s, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-emerald-500", children: "\u2713" }), _jsx("span", { children: _jsx(Annotated, { text: s }) })] }, i))) })] })), hasIssues && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-amber-400`, children: "Breaking the system" }), _jsx("ul", { className: "space-y-2.5", children: issues.map((iss, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-amber-400", children: "\u2715" }), _jsxs("span", { children: [iss.issue, _jsxs("span", { className: "mt-1.5 flex flex-col items-start gap-1", children: [_jsx("span", { className: "rounded bg-[#161616] px-2 py-1 text-[12px] leading-relaxed text-[#aaa]", children: _jsx(Annotated, { text: iss.evidence }) }), iss.suggestion && (_jsxs("span", { className: "rounded bg-[#101c14] px-2 py-1 text-[12px] leading-relaxed text-emerald-400", children: ["\u2192 ", _jsx(Annotated, { text: iss.suggestion })] }))] })] })] }, i))) })] }))] }));
|
|
63
64
|
}
|
|
64
65
|
//# sourceMappingURL=design-review-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-review-card.js","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"design-review-card.js","sourceRoot":"","sources":["../../src/dashboard/design-review-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ColorToken } from "./color-chip";
|
|
2
|
+
export { ColorToken };
|
|
3
|
+
/**
|
|
4
|
+
* A WCAG ratio as a 0–100% score. Logarithmic, so the scale reads evenly
|
|
5
|
+
* rather than bunching every real-world pairing into its bottom fifth:
|
|
6
|
+
* 1:1 → 0%, 3:1 → 36%, AA's 4.5:1 → 49%, 21:1 → 100%.
|
|
7
|
+
*/
|
|
8
|
+
export declare function contrastPercent(ratio: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* A ratio as a contrast percentage. Tinted only when it's a problem — red
|
|
11
|
+
* clears nothing, amber clears large text only. Anything at AA stays neutral:
|
|
12
|
+
* these sentences quote the threshold as often as the measurement, and a green
|
|
13
|
+
* "49% contrast" inside a failure note reads like the opposite of the finding.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ContrastToken({ ratio }: {
|
|
16
|
+
ratio: number;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
/**
|
|
19
|
+
* The measured pairing as a scale: how far the contrast gets, with a tick at
|
|
20
|
+
* the level this text size actually needs.
|
|
21
|
+
*/
|
|
22
|
+
export declare function ContrastMeter({ ratio, required }: {
|
|
23
|
+
ratio: number;
|
|
24
|
+
required: number;
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
/**
|
|
27
|
+
* A finding's text with its citations swapped for the tokens above. Anything
|
|
28
|
+
* unrecognized is left exactly as written.
|
|
29
|
+
*/
|
|
30
|
+
export declare function Annotated({ text }: {
|
|
31
|
+
text: string;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=design-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-tokens.d.ts","sourceRoot":"","sources":["../../src/dashboard/design-tokens.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,CAAC;AAStB;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,+BAWzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAyBrF;AAQD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAmBnD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { ColorToken } from "./color-chip";
|
|
3
|
+
export { ColorToken };
|
|
4
|
+
/** White on black — the top of the WCAG 2.x scale. */
|
|
5
|
+
const MAX_RATIO = 21;
|
|
6
|
+
/** Below this a pairing fails AA for body text; large text only needs 3:1. */
|
|
7
|
+
const AA_BODY = 4.5;
|
|
8
|
+
const AA_LARGE = 3;
|
|
9
|
+
/**
|
|
10
|
+
* A WCAG ratio as a 0–100% score. Logarithmic, so the scale reads evenly
|
|
11
|
+
* rather than bunching every real-world pairing into its bottom fifth:
|
|
12
|
+
* 1:1 → 0%, 3:1 → 36%, AA's 4.5:1 → 49%, 21:1 → 100%.
|
|
13
|
+
*/
|
|
14
|
+
export function contrastPercent(ratio) {
|
|
15
|
+
const clamped = Math.min(Math.max(ratio, 1), MAX_RATIO);
|
|
16
|
+
return Math.round((Math.log(clamped) / Math.log(MAX_RATIO)) * 100);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A ratio as a contrast percentage. Tinted only when it's a problem — red
|
|
20
|
+
* clears nothing, amber clears large text only. Anything at AA stays neutral:
|
|
21
|
+
* these sentences quote the threshold as often as the measurement, and a green
|
|
22
|
+
* "49% contrast" inside a failure note reads like the opposite of the finding.
|
|
23
|
+
*/
|
|
24
|
+
export function ContrastToken({ ratio }) {
|
|
25
|
+
const tone = ratio >= AA_BODY ? "text-[#ccc]" : ratio >= AA_LARGE ? "text-amber-400" : "text-red-400";
|
|
26
|
+
return (_jsxs("span", { className: `inline-flex items-center rounded bg-[#161616] px-1 py-px align-middle text-[11px] font-medium tabular-nums ${tone}`, title: `${ratio}:1 — WCAG AA wants ${AA_BODY}:1 for body text, ${AA_LARGE}:1 for large text`, children: [contrastPercent(ratio), "% contrast"] }));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The measured pairing as a scale: how far the contrast gets, with a tick at
|
|
30
|
+
* the level this text size actually needs.
|
|
31
|
+
*/
|
|
32
|
+
export function ContrastMeter({ ratio, required }) {
|
|
33
|
+
const pct = contrastPercent(ratio);
|
|
34
|
+
const need = contrastPercent(required);
|
|
35
|
+
const passes = ratio >= required;
|
|
36
|
+
return (_jsxs("span", { className: "flex items-center gap-2", role: "img", "aria-label": `Contrast ${pct}% of the scale, needs ${need}% — ${ratio}:1 against a ${required}:1 minimum`, title: `${ratio}:1 against the WCAG AA ${required}:1 minimum`, children: [_jsxs("span", { className: "relative h-1.5 w-20 overflow-hidden rounded-full bg-[#1c1c1c]", children: [_jsx("span", { className: `absolute inset-y-0 left-0 rounded-full ${passes ? "bg-emerald-500" : "bg-red-500"}`, style: { width: `${pct}%` } }), _jsx("span", { className: "absolute inset-y-0 w-px bg-[#777]", style: { left: `${need}%` } })] }), _jsxs("span", { className: `text-[12px] font-medium tabular-nums ${passes ? "text-emerald-400" : "text-red-400"}`, children: [pct, "%"] })] }));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Hexes (always 6 or 8 digits — the scanner normalizes them, so a CSS id like
|
|
40
|
+
* `#nav` can't be mistaken for a color) and `4.5:1`-style ratios.
|
|
41
|
+
*/
|
|
42
|
+
const CITATION = /#[0-9a-f]{8}\b|#[0-9a-f]{6}\b|\d+(?:\.\d+)?:1(?![\d.])/gi;
|
|
43
|
+
/**
|
|
44
|
+
* A finding's text with its citations swapped for the tokens above. Anything
|
|
45
|
+
* unrecognized is left exactly as written.
|
|
46
|
+
*/
|
|
47
|
+
export function Annotated({ text }) {
|
|
48
|
+
const parts = [];
|
|
49
|
+
let last = 0;
|
|
50
|
+
for (const m of text.matchAll(CITATION)) {
|
|
51
|
+
const at = m.index ?? 0;
|
|
52
|
+
if (at > last)
|
|
53
|
+
parts.push(text.slice(last, at));
|
|
54
|
+
const token = m[0];
|
|
55
|
+
parts.push(token.startsWith("#") ? (_jsx(ColorToken, { hex: token.toLowerCase() }, at)) : (_jsx(ContrastToken, { ratio: Number(token.slice(0, -2)) }, at)));
|
|
56
|
+
last = at + token.length;
|
|
57
|
+
}
|
|
58
|
+
if (parts.length === 0)
|
|
59
|
+
return _jsx(_Fragment, { children: text });
|
|
60
|
+
if (last < text.length)
|
|
61
|
+
parts.push(text.slice(last));
|
|
62
|
+
return _jsx(_Fragment, { children: parts });
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=design-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-tokens.js","sourceRoot":"","sources":["../../src/dashboard/design-tokens.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/dashboard/design.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAqZhF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAoEpF"}
|
package/dist/dashboard/design.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import DesignReviewCard, { RefreshMetricsButton } from "./design-review-card";
|
|
3
|
+
import { Annotated, ColorToken, ContrastMeter, contrastPercent } from "./design-tokens";
|
|
4
|
+
import OverflowRow from "./overflow-row";
|
|
3
5
|
import ShowMore from "./show-more";
|
|
4
6
|
import { border, card, divider, labelCls as label } from "./ui";
|
|
5
7
|
/** Rows shown before a list collapses behind "Show more". */
|
|
@@ -19,7 +21,7 @@ function SectionFlags({ flags, section }) {
|
|
|
19
21
|
const hasWarn = own.some((f) => f.severity === "warn");
|
|
20
22
|
return (_jsx("div", { className: `mx-4 mt-4 rounded-md border px-3 py-2.5 sm:mx-5 ${hasWarn
|
|
21
23
|
? "border-amber-900/50 bg-amber-950/30"
|
|
22
|
-
: "border-[#1e3a5f]/60 bg-[#0c1a2b]/60"}`, children: _jsx("ul", { className: own.length > 1 ? "space-y-1.5" : undefined, children: own.map((f, i) => (_jsxs("li", { className: `flex gap-2 text-[12px] leading-relaxed ${f.severity === "warn" ? "text-amber-400" : "text-[#7fb2e5]"}`, children: [own.length > 1 && (_jsx("span", { "aria-hidden": true, className: `mt-[7px] h-1 w-1 shrink-0 rounded-full ${f.severity === "warn" ? "bg-amber-400" : "bg-[#7fb2e5]"}` })), _jsx("span", { children: f.message })] }, i))) }) }));
|
|
24
|
+
: "border-[#1e3a5f]/60 bg-[#0c1a2b]/60"}`, children: _jsx("ul", { className: own.length > 1 ? "space-y-1.5" : undefined, children: own.map((f, i) => (_jsxs("li", { className: `flex gap-2 text-[12px] leading-relaxed ${f.severity === "warn" ? "text-amber-400" : "text-[#7fb2e5]"}`, children: [own.length > 1 && (_jsx("span", { "aria-hidden": true, className: `mt-[7px] h-1 w-1 shrink-0 rounded-full ${f.severity === "warn" ? "bg-amber-400" : "bg-[#7fb2e5]"}` })), _jsx("span", { children: _jsx(Annotated, { text: f.message }) })] }, i))) }) }));
|
|
23
25
|
}
|
|
24
26
|
function Section({ title, tip, children }) {
|
|
25
27
|
return (_jsxs("section", { className: "mb-8", children: [_jsxs("div", { className: `mb-3 flex items-baseline gap-2 ${label}`, children: [title, tip && _jsx("span", { className: "normal-case tracking-normal text-[11px] font-normal text-[#444]", children: tip })] }), children] }));
|
|
@@ -54,13 +56,12 @@ function ColorChip({ c }) {
|
|
|
54
56
|
}
|
|
55
57
|
function PaletteSection({ data }) {
|
|
56
58
|
const primary = data.colors.slice(0, 6);
|
|
57
|
-
const chips = data.colors.slice(6,
|
|
58
|
-
|
|
59
|
-
return (_jsx(Section, { title: "Color palette", tip: "\u2014 the colors your pages actually paint, weighted by how much of the UI they cover.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "color" }), primary.length > 0 && (_jsx("div", { className: "grid grid-cols-3 gap-3 px-4 pt-4 sm:grid-cols-6 sm:px-5", children: primary.map((c) => (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "h-16 w-full rounded-md border border-[#2e2e2e]", style: { backgroundColor: c.hex } }), _jsx("div", { className: "mt-1.5 truncate font-mono text-[11px] text-[#ccc]", children: c.hex }), _jsxs("div", { className: "flex flex-wrap items-center gap-1 text-[10px] text-[#555]", children: [_jsxs("span", { className: "tabular-nums", children: [c.pct, "%"] }), _jsxs("span", { children: ["\u00B7 ", roleLabel(c.roles)] }), c.outlier && _jsx(OutlierBadge, {})] })] }, c.hex))) })), chips.length > 0 && (_jsx("div", { className: "mt-4 flex flex-wrap gap-2 px-4 sm:px-5", children: chips.map((c) => (_jsx(ColorChip, { c: c }, c.hex))) })), _jsx(ShowMore, { count: overflow.length, label: "colors", children: _jsx("div", { className: "mt-2 flex flex-wrap gap-2 px-4 pb-1 sm:px-5", children: overflow.map((c) => (_jsx(ColorChip, { c: c }, c.hex))) }) })] }) }));
|
|
59
|
+
const chips = data.colors.slice(6, 48);
|
|
60
|
+
return (_jsx(Section, { title: "Color palette", tip: "\u2014 the colors your pages actually paint, weighted by how much of the UI they cover.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "color" }), primary.length > 0 && (_jsx("div", { className: "grid grid-cols-3 gap-3 px-4 pt-4 sm:grid-cols-6 sm:px-5", children: primary.map((c) => (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "h-16 w-full rounded-md border border-[#2e2e2e]", style: { backgroundColor: c.hex } }), _jsx("div", { className: "mt-1.5 truncate font-mono text-[11px] text-[#ccc]", children: c.hex }), _jsxs("div", { className: "flex flex-wrap items-center gap-1 text-[10px] text-[#555]", children: [_jsxs("span", { className: "tabular-nums", children: [c.pct, "%"] }), _jsxs("span", { children: ["\u00B7 ", roleLabel(c.roles)] }), c.outlier && _jsx(OutlierBadge, {})] })] }, c.hex))) })), chips.length > 0 && (_jsx(OverflowRow, { label: "colors", className: "mt-4 px-4 sm:px-5", rowClassName: "flex flex-wrap gap-2", children: chips.map((c) => (_jsx(ColorChip, { c: c }, c.hex))) }))] }) }));
|
|
60
61
|
}
|
|
61
62
|
// ── Contrast ─────────────────────────────────────────────────────────────────
|
|
62
63
|
function ContrastRow({ p, first }) {
|
|
63
|
-
return (_jsxs("div", { className: `flex flex-wrap items-center gap-3 px-4 py-3 sm:px-5 ${first ? "" : divider}`, children: [_jsx("span", { className: "flex h-9 w-14 shrink-0 items-center justify-center rounded-md border border-[#2e2e2e] text-[14px] font-medium", style: { backgroundColor: p.bg, color: p.fg }, children: "Aa" }), _jsxs("span", { className: "
|
|
64
|
+
return (_jsxs("div", { className: `flex flex-wrap items-center gap-3 px-4 py-3 sm:px-5 ${first ? "" : divider}`, children: [_jsx("span", { className: "flex h-9 w-14 shrink-0 items-center justify-center rounded-md border border-[#2e2e2e] text-[14px] font-medium", style: { backgroundColor: p.bg, color: p.fg }, children: "Aa" }), _jsxs("span", { className: "flex items-center gap-1.5 text-[11px] text-[#777]", children: [_jsx(ColorToken, { hex: p.fg }), " on ", _jsx(ColorToken, { hex: p.bg })] }), _jsxs("span", { className: "flex items-center gap-2", children: [_jsx(ContrastMeter, { ratio: p.ratio, required: p.required }), _jsxs("span", { className: "text-[11px] tabular-nums text-[#666]", children: ["needs ", contrastPercent(p.required), "% at ", p.minSizePx, "px"] })] }), _jsxs("span", { className: "text-[11px] text-[#555]", children: [p.pages.slice(0, 2).join(", "), p.pages.length > 2 ? ", …" : ""] })] }));
|
|
64
65
|
}
|
|
65
66
|
function ContrastSection({ data }) {
|
|
66
67
|
const failing = data.contrast.filter((p) => !p.passes);
|
|
@@ -68,7 +69,7 @@ function ContrastSection({ data }) {
|
|
|
68
69
|
return null;
|
|
69
70
|
const visible = failing.slice(0, VISIBLE_ROWS);
|
|
70
71
|
const overflow = failing.slice(VISIBLE_ROWS, 25);
|
|
71
|
-
return (_jsx(Section, { title: "Contrast", tip: "\u2014 every text-on-background pairing measured against WCAG AA.", children:
|
|
72
|
+
return (_jsx(Section, { title: "Contrast", tip: "\u2014 every text-on-background pairing measured against WCAG AA.", children: _jsx("div", { className: `${card} overflow-hidden`, children: failing.length === 0 ? (_jsxs("p", { className: "px-4 py-4 text-[13px] text-emerald-500 sm:px-5", children: ["All ", data.contrast.length, " measured text/background pairs meet WCAG AA. Nice."] })) : (_jsxs("div", { className: "mt-2", children: [visible.map((p, i) => (_jsx(ContrastRow, { p: p, first: i === 0 }, `${p.fg}|${p.bg}`))), _jsx(ShowMore, { count: overflow.length, label: "failing pairs", children: overflow.map((p) => (_jsx(ContrastRow, { p: p, first: false }, `${p.fg}|${p.bg}`))) })] })) }) }));
|
|
72
73
|
}
|
|
73
74
|
// ── Radii & spacing ──────────────────────────────────────────────────────────
|
|
74
75
|
function RadiusChip({ r }) {
|
|
@@ -79,9 +80,8 @@ function RadiusChip({ r }) {
|
|
|
79
80
|
function RadiusSection({ data }) {
|
|
80
81
|
if (data.radii.length === 0)
|
|
81
82
|
return null;
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
return (_jsx(Section, { title: "Corner radii", tip: "\u2014 rounding in use on visible boxes and controls.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "radius" }), _jsx("div", { className: "flex flex-wrap items-end gap-4 px-4 pt-4 sm:px-5", children: visible.map((r) => (_jsx(RadiusChip, { r: r }, r.value))) }), _jsx(ShowMore, { count: overflow.length, label: "radii", children: _jsx("div", { className: "mt-2 flex flex-wrap items-end gap-4 px-4 pb-1 sm:px-5", children: overflow.map((r) => (_jsx(RadiusChip, { r: r }, r.value))) }) })] }) }));
|
|
83
|
+
const radii = data.radii.slice(0, 20);
|
|
84
|
+
return (_jsx(Section, { title: "Corner radii", tip: "\u2014 rounding in use on visible boxes and controls.", children: _jsxs("div", { className: `${card} overflow-hidden pb-4`, children: [_jsx(SectionFlags, { flags: data.flags, section: "radius" }), _jsx(OverflowRow, { label: "radii", className: "px-4 pt-4 sm:px-5", rowClassName: "flex flex-wrap items-end gap-4", children: radii.map((r) => (_jsx(RadiusChip, { r: r }, r.value))) })] }) }));
|
|
85
85
|
}
|
|
86
86
|
function SpacingRow({ s, max }) {
|
|
87
87
|
return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "w-12 shrink-0 text-right font-mono text-[11px] tabular-nums text-[#999]", children: [s.px, "px"] }), _jsx("div", { className: "h-3 flex-1 overflow-hidden rounded-sm bg-[#141414]", children: _jsx("div", { className: `h-full rounded-sm ${s.offGrid ? "bg-amber-500/70" : "bg-blue-500/80"}`, style: { width: `${Math.max((s.px / max) * 100, 2)}%` } }) }), _jsxs("span", { className: "w-16 shrink-0 text-right text-[11px] tabular-nums text-[#555]", children: ["\u00D7", s.count.toLocaleString()] }), _jsx("span", { className: "w-14 shrink-0 text-[10px] text-amber-400", children: s.offGrid ? "off-grid" : "" })] }));
|