@mseep/dembrandt 0.19.5
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/LICENSE +21 -0
- package/README.md +408 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +532 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/browser.d.ts +16 -0
- package/dist/lib/browser.js +27 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/colors.d.ts +101 -0
- package/dist/lib/colors.js +405 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/compare.d.ts +31 -0
- package/dist/lib/compare.js +46 -0
- package/dist/lib/compare.js.map +1 -0
- package/dist/lib/discovery.d.ts +31 -0
- package/dist/lib/discovery.js +243 -0
- package/dist/lib/discovery.js.map +1 -0
- package/dist/lib/drift.d.ts +64 -0
- package/dist/lib/drift.js +383 -0
- package/dist/lib/drift.js.map +1 -0
- package/dist/lib/dtcg/validate.d.ts +51 -0
- package/dist/lib/dtcg/validate.js +1403 -0
- package/dist/lib/dtcg/validate.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +29 -0
- package/dist/lib/exit-codes.js +26 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/extractors/breakpoints.d.ts +5 -0
- package/dist/lib/extractors/breakpoints.js +450 -0
- package/dist/lib/extractors/breakpoints.js.map +1 -0
- package/dist/lib/extractors/colors.d.ts +2 -0
- package/dist/lib/extractors/colors.js +657 -0
- package/dist/lib/extractors/colors.js.map +1 -0
- package/dist/lib/extractors/components.d.ts +4 -0
- package/dist/lib/extractors/components.js +370 -0
- package/dist/lib/extractors/components.js.map +1 -0
- package/dist/lib/extractors/index.d.ts +9 -0
- package/dist/lib/extractors/index.js +1257 -0
- package/dist/lib/extractors/index.js.map +1 -0
- package/dist/lib/extractors/logo.d.ts +2 -0
- package/dist/lib/extractors/logo.js +626 -0
- package/dist/lib/extractors/logo.js.map +1 -0
- package/dist/lib/extractors/spacing.d.ts +4 -0
- package/dist/lib/extractors/spacing.js +163 -0
- package/dist/lib/extractors/spacing.js.map +1 -0
- package/dist/lib/extractors/teach.d.ts +1 -0
- package/dist/lib/extractors/teach.js +66 -0
- package/dist/lib/extractors/teach.js.map +1 -0
- package/dist/lib/extractors/typography.d.ts +1 -0
- package/dist/lib/extractors/typography.js +163 -0
- package/dist/lib/extractors/typography.js.map +1 -0
- package/dist/lib/findings.d.ts +34 -0
- package/dist/lib/findings.js +166 -0
- package/dist/lib/findings.js.map +1 -0
- package/dist/lib/formatters/dtcg.d.ts +10 -0
- package/dist/lib/formatters/dtcg.js +416 -0
- package/dist/lib/formatters/dtcg.js.map +1 -0
- package/dist/lib/formatters/html.d.ts +25 -0
- package/dist/lib/formatters/html.js +479 -0
- package/dist/lib/formatters/html.js.map +1 -0
- package/dist/lib/formatters/markdown.d.ts +5 -0
- package/dist/lib/formatters/markdown.js +568 -0
- package/dist/lib/formatters/markdown.js.map +1 -0
- package/dist/lib/formatters/pdf.d.ts +12 -0
- package/dist/lib/formatters/pdf.js +1121 -0
- package/dist/lib/formatters/pdf.js.map +1 -0
- package/dist/lib/formatters/terminal.d.ts +6 -0
- package/dist/lib/formatters/terminal.js +954 -0
- package/dist/lib/formatters/terminal.js.map +1 -0
- package/dist/lib/formatters/theme.d.ts +35 -0
- package/dist/lib/formatters/theme.js +37 -0
- package/dist/lib/formatters/theme.js.map +1 -0
- package/dist/lib/merger.d.ts +14 -0
- package/dist/lib/merger.js +362 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/normalize.d.ts +29 -0
- package/dist/lib/normalize.js +59 -0
- package/dist/lib/normalize.js.map +1 -0
- package/dist/lib/robots.d.ts +12 -0
- package/dist/lib/robots.js +110 -0
- package/dist/lib/robots.js.map +1 -0
- package/dist/lib/run-summary.d.ts +40 -0
- package/dist/lib/run-summary.js +64 -0
- package/dist/lib/run-summary.js.map +1 -0
- package/dist/lib/types.d.ts +329 -0
- package/dist/lib/types.js +7 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/version.d.ts +134 -0
- package/dist/lib/version.js +153 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.js +311 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/package.json +106 -0
- package/dist/test/_vitest-shim.d.ts +13 -0
- package/dist/test/_vitest-shim.js +23 -0
- package/dist/test/_vitest-shim.js.map +1 -0
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/cli.test.js +24 -0
- package/dist/test/cli.test.js.map +1 -0
- package/dist/test/colors.test.d.ts +1 -0
- package/dist/test/colors.test.js +64 -0
- package/dist/test/colors.test.js.map +1 -0
- package/dist/test/compare.test.d.ts +1 -0
- package/dist/test/compare.test.js +57 -0
- package/dist/test/compare.test.js.map +1 -0
- package/dist/test/drift.test.d.ts +1 -0
- package/dist/test/drift.test.js +53 -0
- package/dist/test/drift.test.js.map +1 -0
- package/dist/test/dtcg-formatter.test.d.ts +1 -0
- package/dist/test/dtcg-formatter.test.js +48 -0
- package/dist/test/dtcg-formatter.test.js.map +1 -0
- package/dist/test/dtcg-validate.test.d.ts +1 -0
- package/dist/test/dtcg-validate.test.js +2129 -0
- package/dist/test/dtcg-validate.test.js.map +1 -0
- package/dist/test/exit-codes.test.d.ts +1 -0
- package/dist/test/exit-codes.test.js +53 -0
- package/dist/test/exit-codes.test.js.map +1 -0
- package/dist/test/findings.test.d.ts +1 -0
- package/dist/test/findings.test.js +77 -0
- package/dist/test/findings.test.js.map +1 -0
- package/dist/test/html.test.d.ts +1 -0
- package/dist/test/html.test.js +95 -0
- package/dist/test/html.test.js.map +1 -0
- package/dist/test/markdown.test.d.ts +1 -0
- package/dist/test/markdown.test.js +145 -0
- package/dist/test/markdown.test.js.map +1 -0
- package/dist/test/merger.test.d.ts +1 -0
- package/dist/test/merger.test.js +98 -0
- package/dist/test/merger.test.js.map +1 -0
- package/dist/test/normalize.test.d.ts +1 -0
- package/dist/test/normalize.test.js +47 -0
- package/dist/test/normalize.test.js.map +1 -0
- package/dist/test/run-summary.test.d.ts +1 -0
- package/dist/test/run-summary.test.js +45 -0
- package/dist/test/run-summary.test.js.map +1 -0
- package/dist/test/version.test.d.ts +1 -0
- package/dist/test/version.test.js +73 -0
- package/dist/test/version.test.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML report formatter — a single self-contained HTML file (inline CSS, no
|
|
3
|
+
* external fetches) that renders an extraction and, optionally, a drift diff.
|
|
4
|
+
*
|
|
5
|
+
* This is the pre-platform bridge (DEM-94): a CI artifact you can open offline
|
|
6
|
+
* and attach to a PR, before the hosted dashboard exists. It is a *view* over
|
|
7
|
+
* the same deterministic data the platform will later diff server-side — it
|
|
8
|
+
* renders structured tokens and single-render contrast only, never re-derives
|
|
9
|
+
* drift from rendered CSS. Mode B reuses the canonical `computeDrift` engine.
|
|
10
|
+
*
|
|
11
|
+
* The summary header is Lighthouse-style: big score gauges, each backed by a
|
|
12
|
+
* concrete finding (lib/findings.ts) so no number is a vanity metric. The file
|
|
13
|
+
* is the rendered view only — the machine-readable form is `--json-only`.
|
|
14
|
+
*/
|
|
15
|
+
import { computeFindings } from "../findings.js";
|
|
16
|
+
/* ------------------------------- escaping ------------------------------- */
|
|
17
|
+
/** Escape text for HTML body / attribute context. */
|
|
18
|
+
function esc(s) {
|
|
19
|
+
return String(s ?? "")
|
|
20
|
+
.replace(/&/g, "&")
|
|
21
|
+
.replace(/</g, "<")
|
|
22
|
+
.replace(/>/g, ">")
|
|
23
|
+
.replace(/"/g, """)
|
|
24
|
+
.replace(/'/g, "'");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Allow only safe CSS color/length-ish tokens into inline style values, so
|
|
28
|
+
* extracted site CSS cannot inject `}` / `<` / `url()` etc. into the report.
|
|
29
|
+
* Anything outside the allowlist is dropped.
|
|
30
|
+
*/
|
|
31
|
+
function safeCss(value) {
|
|
32
|
+
const v = String(value ?? "").trim();
|
|
33
|
+
if (!v)
|
|
34
|
+
return "";
|
|
35
|
+
// hex, rgb/rgba, hsl/hsla, named-ish words, numbers+units, commas, %, spaces, parens, dots, slashes (for line-height font shorthand)
|
|
36
|
+
if (/^[#0-9a-zA-Z().,%\s/\-+]+$/.test(v) && !/[<>{};]/.test(v))
|
|
37
|
+
return v;
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
/* -------------------------------- styles -------------------------------- */
|
|
41
|
+
// Dembrandt design system (dark, Linear-inspired). This is the report's *chrome* —
|
|
42
|
+
// a Dembrandt report looks like Dembrandt. The extracted site's tokens are content
|
|
43
|
+
/*
|
|
44
|
+
* Dark by default (matching the App at /app), with a CSS-only light toggle — no
|
|
45
|
+
* JS, just `:root:has(#theme:checked)` flipping the token block. System fonts,
|
|
46
|
+
* no embedded JSON: stays small at scale. Typography is generic/system on
|
|
47
|
+
* purpose (no Red Hat Display / web fonts — keeps the file light); the fluid
|
|
48
|
+
* type scale, brand surfaces, #38BDF8 accent and tight Linear radii still mirror
|
|
49
|
+
* the App's design system (dembrandt-next/app/globals.css). color-scheme is
|
|
50
|
+
* pinned per theme so a browser's own dark mode can't repaint it. Type steps
|
|
51
|
+
* stay >=14px (the App's 2xs/xs at 11-13px are dropped for the no-sub-14px rule).
|
|
52
|
+
*/
|
|
53
|
+
const STYLE = `
|
|
54
|
+
:root{color-scheme:dark;--bg:#000;--surface:#0D0D0D;--elevated:#1A1A1A;--line:#242424;--ink:#fff;--muted:#8A8F98;--tertiary:#5E6772;--accent:#38BDF8;--accent-hover:#7dd3fc;--good:#4ade80;--avg:#fbbf24;--bad:#ef4444;--swring:rgba(255,255,255,.12);--sans:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;--mono:ui-monospace,SFMono-Regular,Menlo,monospace;--t-sm:clamp(0.875rem,0.85rem + 0.15vw,0.938rem);--t-base:clamp(1rem,0.975rem + 0.125vw,1.063rem);--t-md:clamp(1.125rem,1.075rem + 0.25vw,1.25rem);--t-lg:clamp(1.25rem,1.175rem + 0.375vw,1.5rem);--t-xl:clamp(1.5rem,1.375rem + 0.625vw,1.875rem);--t-2xl:clamp(1.875rem,1.675rem + 1vw,2.5rem)}
|
|
55
|
+
:root:has(#theme:checked){color-scheme:light;--bg:#F5F5F7;--surface:#ffffff;--elevated:#ECECEF;--line:#D8D8DE;--ink:#111827;--muted:#5E6772;--tertiary:#8A8F98;--accent:#0C6AE0;--accent-hover:#0a55b5;--good:#0a8c4a;--avg:#b36b00;--bad:#c0392b;--swring:rgba(0,0,0,.12)}
|
|
56
|
+
*{box-sizing:border-box}
|
|
57
|
+
html{background:var(--bg)}
|
|
58
|
+
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:var(--t-base);line-height:1.55;-webkit-font-smoothing:antialiased}
|
|
59
|
+
a{color:var(--accent);text-decoration:none}
|
|
60
|
+
a:hover{color:var(--accent-hover);text-decoration:underline;text-underline-offset:3px}
|
|
61
|
+
.mono{font-family:var(--mono)}
|
|
62
|
+
.muted{color:var(--muted)}
|
|
63
|
+
.sub{color:var(--muted);font-size:var(--t-sm)}
|
|
64
|
+
.row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
|
65
|
+
.kvs{display:flex;flex-wrap:wrap;gap:8px 22px;font-size:var(--t-sm)}
|
|
66
|
+
.kvs span{white-space:nowrap}
|
|
67
|
+
.topbar{position:sticky;top:0;z-index:10;background:var(--bg);border-bottom:1px solid var(--line);padding:8px 24px;display:flex;align-items:center;gap:12px}
|
|
68
|
+
.topbar .bm{display:inline-flex;align-items:center;color:var(--ink);flex:none}
|
|
69
|
+
.topbar .bm svg{height:16px;width:auto;display:block}
|
|
70
|
+
.tt{position:absolute;width:0;height:0;opacity:0;pointer-events:none}
|
|
71
|
+
.ttl{cursor:pointer;font-size:var(--t-sm);color:var(--muted);user-select:none}
|
|
72
|
+
.ttl:hover{color:var(--ink)}
|
|
73
|
+
.ttl::after{content:"Light"}
|
|
74
|
+
:root:has(#theme:checked) .ttl::after{content:"Dark"}
|
|
75
|
+
.counts{text-align:center;color:var(--muted);font-size:var(--t-sm);margin:0;padding:14px 24px 0}
|
|
76
|
+
.topbar .u{flex:1;min-width:0;color:var(--muted);font-family:var(--mono);font-size:var(--t-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
77
|
+
.topbar .meta{margin-left:auto;color:var(--muted);font-size:var(--t-sm);white-space:nowrap}
|
|
78
|
+
.wrap{max-width:960px;margin:0 auto;padding:8px 24px 80px}
|
|
79
|
+
.gauges{display:flex;flex-wrap:wrap;gap:34px;justify-content:center;padding:18px 0 28px;border-bottom:1px solid var(--line)}
|
|
80
|
+
.gauge{display:flex;flex-direction:column;align-items:center;gap:9px;text-decoration:none;color:inherit}
|
|
81
|
+
a.gauge:hover .glabel{text-decoration:underline}
|
|
82
|
+
.fgroup{margin-bottom:16px}
|
|
83
|
+
.fgroup:last-child{margin-bottom:0}
|
|
84
|
+
.fgrouph{font-size:var(--t-sm);font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding-bottom:8px;border-bottom:1px solid var(--line);margin-bottom:10px}
|
|
85
|
+
.findings{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
|
|
86
|
+
.findings li{display:grid;grid-template-columns:56px 1fr;gap:12px;align-items:baseline;font-size:var(--t-sm)}
|
|
87
|
+
.conf{font-size:var(--t-sm);font-weight:600}
|
|
88
|
+
.c-high{color:var(--good)}.c-med{color:var(--avg)}.c-low{color:var(--muted)}
|
|
89
|
+
.sev{font-size:var(--t-sm);font-weight:700;text-transform:uppercase;letter-spacing:.03em}
|
|
90
|
+
.s-err{color:var(--bad)}.s-warn{color:var(--avg)}
|
|
91
|
+
.gring{width:84px;height:84px}
|
|
92
|
+
.gring .gbg{fill:none;stroke:var(--line);stroke-width:8}
|
|
93
|
+
.gring .gfg{fill:none;stroke-width:8;stroke-linecap:round}
|
|
94
|
+
.gring.g-pass .gfg{stroke:var(--good)}.gring.g-pass .gnum{fill:var(--good)}
|
|
95
|
+
.gring.g-avg .gfg{stroke:var(--avg)}.gring.g-avg .gnum{fill:var(--avg)}
|
|
96
|
+
.gring.g-fail .gfg{stroke:var(--bad)}.gring.g-fail .gnum{fill:var(--bad)}
|
|
97
|
+
.gnum{font-weight:700;font-size:var(--t-2xl)}
|
|
98
|
+
.glabel{font-size:var(--t-sm);color:var(--ink);font-weight:600}
|
|
99
|
+
.gsub{font-size:var(--t-sm);color:var(--muted)}
|
|
100
|
+
details.card{border:1px solid var(--line);border-radius:8px;padding:16px 20px;margin:14px 0}
|
|
101
|
+
details.card>summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;font-size:var(--t-sm);font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
|
|
102
|
+
details.card>summary::-webkit-details-marker{display:none}
|
|
103
|
+
details.card>summary::after{content:"";margin-left:auto;width:8px;height:8px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:rotate(45deg);transition:transform .15s}
|
|
104
|
+
details.card[open]>summary::after{transform:rotate(-135deg)}
|
|
105
|
+
details.card>summary:hover::after{border-color:var(--accent)}
|
|
106
|
+
.cardbody{margin-top:16px}
|
|
107
|
+
.cardrow{display:flex;gap:14px;flex-wrap:wrap;margin:14px 0}
|
|
108
|
+
.cardrow>details.card{flex:1 1 280px;margin:0}
|
|
109
|
+
.colors{display:flex;flex-wrap:wrap;gap:14px}
|
|
110
|
+
.color{display:flex;flex-direction:column;gap:5px;align-items:center;text-align:center}
|
|
111
|
+
.color .sw2{width:36px;height:36px;border-radius:6px;box-shadow:inset 0 0 0 1px var(--swring)}
|
|
112
|
+
.color .hex{font-family:var(--mono);font-size:var(--t-sm);color:var(--ink)}
|
|
113
|
+
.color .cmeta{font-size:var(--t-sm);color:var(--muted);display:flex;align-items:center;gap:6px;white-space:nowrap}
|
|
114
|
+
.color .role{color:var(--accent);font-size:var(--t-sm);text-transform:uppercase;letter-spacing:.03em}
|
|
115
|
+
.chips{display:flex;flex-wrap:wrap;gap:8px}
|
|
116
|
+
.tok{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:6px 12px;font-family:var(--mono);font-size:var(--t-sm);color:var(--ink)}
|
|
117
|
+
table{width:100%;border-collapse:collapse;font-size:var(--t-sm)}
|
|
118
|
+
th,td{text-align:left;padding:8px 12px;vertical-align:top}
|
|
119
|
+
thead th{border-bottom:1px solid var(--line);color:var(--muted);font-weight:600;font-size:var(--t-sm);text-transform:uppercase;letter-spacing:.04em}
|
|
120
|
+
.badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:var(--t-sm);font-weight:600}
|
|
121
|
+
.b-good{background:rgba(10,140,74,.14);color:var(--good)}
|
|
122
|
+
.b-warn{background:rgba(179,107,0,.16);color:var(--avg)}
|
|
123
|
+
.b-bad{background:rgba(192,57,43,.14);color:var(--bad)}
|
|
124
|
+
.b-mut{background:var(--surface);color:var(--muted)}
|
|
125
|
+
.badgepv{display:inline-block;padding:3px 12px;border:1px solid var(--line);border-radius:999px;font-size:var(--t-sm)}
|
|
126
|
+
.drift{border:1px solid var(--line);border-radius:8px;padding:20px 22px;margin:14px 0}
|
|
127
|
+
.drift.is-drift{border-color:var(--bad)}
|
|
128
|
+
.drift.is-stable{border-color:var(--good)}
|
|
129
|
+
.score{font-size:var(--t-2xl);font-weight:700;line-height:1;letter-spacing:-.02em}
|
|
130
|
+
.previewbtn{cursor:pointer}
|
|
131
|
+
.shadowbox{width:84px;height:52px;border-radius:8px;background:#fff;display:inline-block;border:1px solid var(--line)}
|
|
132
|
+
.shadowpanel{background:#f0f0f0;border-radius:8px;padding:18px;display:flex;flex-wrap:wrap;gap:18px;align-items:center}
|
|
133
|
+
.shadowpanel .sb{width:56px;height:56px;border-radius:8px;background:#fff}
|
|
134
|
+
footer{margin-top:48px;color:var(--muted);font-size:var(--t-sm);text-align:center}
|
|
135
|
+
`;
|
|
136
|
+
// Dembrandt brand mark (from dembrandt-next/components/AppMarkIcon.tsx). Inlined,
|
|
137
|
+
// fill=currentColor so it inherits the topbar accent. Self-contained — no asset fetch.
|
|
138
|
+
const LOGO = `<svg viewBox="0 0 316.6 310.01" fill="currentColor" aria-hidden="true"><path d="M81.48,20.83h-34.92C20.85,20.83,0,41.68,0,67.39v175.22c0,25.72,20.85,46.56,46.56,46.56h34.92c2.3,0,4.17-1.87,4.17-4.17V25c0-2.3-1.87-4.17-4.17-4.17Z"/><path d="M268.66,0H110.47c-2.3,0-4.17,1.87-4.17,4.17v301.67c0,2.3,1.87,4.17,4.17,4.17h158.18c26.48,0,47.95-21.47,47.95-47.95V47.95c0-26.48-21.47-47.95-47.95-47.95Z"/></svg>`;
|
|
139
|
+
/* ------------------------------ components ------------------------------ */
|
|
140
|
+
function confBadge(c) {
|
|
141
|
+
const cls = c === "high" ? "c-high" : c === "medium" ? "c-med" : "c-low";
|
|
142
|
+
return `<span class="conf ${cls}">${esc(c ?? "low")}</span>`;
|
|
143
|
+
}
|
|
144
|
+
// Collapsible section card (Lighthouse-style, native <details> — no JS, stays
|
|
145
|
+
// self-contained). Open by default; the user can collapse any section.
|
|
146
|
+
function section(title, body, id) {
|
|
147
|
+
if (!body.trim())
|
|
148
|
+
return "";
|
|
149
|
+
return `<details class="card"${id ? ` id="${esc(id)}"` : ""} open><summary>${esc(title)}</summary><div class="cardbody">${body}</div></details>`;
|
|
150
|
+
}
|
|
151
|
+
/** Lay two (or more) small cards side by side — related scales read together. */
|
|
152
|
+
function cardRow(...cards) {
|
|
153
|
+
const present = cards.filter((c) => c.trim());
|
|
154
|
+
if (present.length < 2)
|
|
155
|
+
return present.join("");
|
|
156
|
+
return `<div class="cardrow">${present.join("")}</div>`;
|
|
157
|
+
}
|
|
158
|
+
/** A Lighthouse-style circular score gauge (0-100), coloured by threshold. */
|
|
159
|
+
function gauge(value, label, sub, invert = false, href) {
|
|
160
|
+
const v = Math.max(0, Math.min(100, Math.round(value)));
|
|
161
|
+
const cls = (invert ? v <= 10 : v >= 90) ? "g-pass" : (invert ? v <= 40 : v >= 50) ? "g-avg" : "g-fail";
|
|
162
|
+
const C = 339.292; // 2πr, r=54
|
|
163
|
+
const arc = ((C * v) / 100).toFixed(1);
|
|
164
|
+
const inner = `<svg viewBox="0 0 120 120" class="gring ${cls}" role="img" aria-label="${esc(label)} ${v} of 100"><circle class="gbg" cx="60" cy="60" r="54"/><circle class="gfg" cx="60" cy="60" r="54" stroke-dasharray="${arc} ${C}" transform="rotate(-90 60 60)"/><text class="gnum" x="60" y="60" text-anchor="middle" dominant-baseline="central">${v}</text></svg><span class="glabel">${esc(label)}</span>${sub ? `<span class="gsub">${esc(sub)}</span>` : ""}`;
|
|
165
|
+
return href
|
|
166
|
+
? `<a class="gauge" href="${esc(href)}">${inner}</a>`
|
|
167
|
+
: `<div class="gauge">${inner}</div>`;
|
|
168
|
+
}
|
|
169
|
+
/** A Lighthouse-style fraction tile (e.g. token coverage 6/6). */
|
|
170
|
+
/**
|
|
171
|
+
* The top "ranking" row — Dembrandt's axes, not Lighthouse's. Drift (did it
|
|
172
|
+
* change vs a baseline) and Contrast (WCAG AA) appear only when that data
|
|
173
|
+
* exists; Consistency is always computable. Every gauge links to the card that
|
|
174
|
+
* explains it, so no number is a mystery.
|
|
175
|
+
*/
|
|
176
|
+
function summaryGauges(result, fr, drift) {
|
|
177
|
+
const g = [];
|
|
178
|
+
if (drift) {
|
|
179
|
+
g.push(gauge(drift.score, "Drift", drift.status === "drift" ? "vs baseline" : "stable", true, "#drift"));
|
|
180
|
+
}
|
|
181
|
+
const cIssues = fr.findings.filter((f) => f.category !== "contrast").length;
|
|
182
|
+
g.push(gauge(fr.consistency, "Consistency", cIssues ? `${cIssues} issue${cIssues === 1 ? "" : "s"}` : "clean", false, "#findings"));
|
|
183
|
+
// Contrast is always present: real WCAG pairs when --wcag ran, else the
|
|
184
|
+
// self-computed contrast findings.
|
|
185
|
+
const wcag = result.wcag ?? [];
|
|
186
|
+
if (wcag.length) {
|
|
187
|
+
const passed = wcag.filter((p) => p.aa).length;
|
|
188
|
+
g.push(gauge((100 * passed) / wcag.length, "Contrast", `${passed}/${wcag.length} pairs AA`, false, "#wcag"));
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const xIssues = fr.findings.filter((f) => f.category === "contrast").length;
|
|
192
|
+
g.push(gauge(fr.contrast, "Contrast", xIssues ? `${xIssues} issue${xIssues === 1 ? "" : "s"}` : "clean", false, "#findings"));
|
|
193
|
+
}
|
|
194
|
+
return `<div class="gauges">${g.join("")}</div>`;
|
|
195
|
+
}
|
|
196
|
+
/** An at-a-glance executive line of token counts — honest, no score. */
|
|
197
|
+
function summaryCounts(result) {
|
|
198
|
+
const n = (a) => (Array.isArray(a) ? a.length : 0);
|
|
199
|
+
const plural = (c, one, many = one + "s") => `${c} ${c === 1 ? one : many}`;
|
|
200
|
+
const parts = [];
|
|
201
|
+
const colors = n(result.colors?.palette);
|
|
202
|
+
if (colors)
|
|
203
|
+
parts.push(plural(colors, "color"));
|
|
204
|
+
const styles = n(result.typography?.styles);
|
|
205
|
+
if (styles)
|
|
206
|
+
parts.push(plural(styles, "text style"));
|
|
207
|
+
const spacing = n(result.spacing?.commonValues);
|
|
208
|
+
if (spacing)
|
|
209
|
+
parts.push(`${spacing} spacing`);
|
|
210
|
+
const radii = n(result.borderRadius?.values);
|
|
211
|
+
if (radii)
|
|
212
|
+
parts.push(plural(radii, "radius", "radii"));
|
|
213
|
+
const shadows = n(result.shadows);
|
|
214
|
+
if (shadows)
|
|
215
|
+
parts.push(plural(shadows, "shadow"));
|
|
216
|
+
const bps = n(result.breakpoints);
|
|
217
|
+
if (bps)
|
|
218
|
+
parts.push(plural(bps, "breakpoint"));
|
|
219
|
+
return parts.length ? `<p class="counts">${esc(parts.join(" · "))}</p>` : "";
|
|
220
|
+
}
|
|
221
|
+
/** Actionable findings — the audits behind the scores, Lighthouse-style. */
|
|
222
|
+
function findingsSection(fr) {
|
|
223
|
+
if (!fr.findings.length)
|
|
224
|
+
return "";
|
|
225
|
+
const sev = (s) => s === "error" ? `<span class="sev s-err">error</span>` : `<span class="sev s-warn">warn</span>`;
|
|
226
|
+
// Group by display group (Gestalt proximity) so the list reads as Color /
|
|
227
|
+
// Typography / Spacing / Contrast rather than a flat mixed stream.
|
|
228
|
+
const groups = new Map();
|
|
229
|
+
for (const f of fr.findings) {
|
|
230
|
+
const arr = groups.get(f.group) ?? [];
|
|
231
|
+
arr.push(f);
|
|
232
|
+
groups.set(f.group, arr);
|
|
233
|
+
}
|
|
234
|
+
const blocks = [...groups.entries()]
|
|
235
|
+
.map(([group, items]) => {
|
|
236
|
+
const rows = items
|
|
237
|
+
.map((f) => `<li>${sev(f.severity)}<span>${esc(f.message)}</span></li>`)
|
|
238
|
+
.join("");
|
|
239
|
+
return `<div class="fgroup"><div class="fgrouph">${esc(group)} <span class="muted">${items.length}</span></div><ul class="findings">${rows}</ul></div>`;
|
|
240
|
+
})
|
|
241
|
+
.join("");
|
|
242
|
+
return `<details class="card" id="findings" open><summary>Findings (${fr.findings.length})</summary><div class="cardbody">${blocks}</div></details>`;
|
|
243
|
+
}
|
|
244
|
+
function paletteSection(result) {
|
|
245
|
+
const palette = result.colors?.palette ?? [];
|
|
246
|
+
if (!palette.length)
|
|
247
|
+
return "";
|
|
248
|
+
// role lookup: hex -> role from semantic map
|
|
249
|
+
const roleByHex = new Map();
|
|
250
|
+
for (const [role, hex] of Object.entries(result.colors?.semantic ?? {})) {
|
|
251
|
+
if (hex)
|
|
252
|
+
roleByHex.set(String(hex).toLowerCase(), role);
|
|
253
|
+
}
|
|
254
|
+
const cards = palette
|
|
255
|
+
.map((c) => {
|
|
256
|
+
const hex = c.normalized || c.color;
|
|
257
|
+
const role = roleByHex.get(String(hex).toLowerCase());
|
|
258
|
+
return `<div class="color"><div class="sw2" style="background:${safeCss(hex) || "transparent"}"></div><div class="hex">${esc(hex)}</div>${role ? `<div class="role">${esc(role)}</div>` : `<div class="cmeta">${confBadge(c.confidence)}</div>`}</div>`;
|
|
259
|
+
})
|
|
260
|
+
.join("");
|
|
261
|
+
return section("Palette", `<div class="colors">${cards}</div>`);
|
|
262
|
+
}
|
|
263
|
+
function semanticSection(result) {
|
|
264
|
+
const sem = Object.entries(result.colors?.semantic ?? {}).filter(([, v]) => v);
|
|
265
|
+
if (!sem.length)
|
|
266
|
+
return "";
|
|
267
|
+
const chips = sem
|
|
268
|
+
.map(([role, hex]) => `<div class="color"><div class="sw2" style="background:${safeCss(hex) || "transparent"}"></div><div class="role">${esc(role)}</div><div class="hex">${esc(hex)}</div></div>`)
|
|
269
|
+
.join("");
|
|
270
|
+
return section("Semantic colors", `<div class="colors">${chips}</div>`);
|
|
271
|
+
}
|
|
272
|
+
function typographySection(result) {
|
|
273
|
+
const styles = result.typography?.styles ?? [];
|
|
274
|
+
if (!styles.length)
|
|
275
|
+
return "";
|
|
276
|
+
const rows = styles
|
|
277
|
+
.map((s) => `<tr><td>${esc(s.context)}</td><td>${esc((s.family ?? "").split(",")[0])}</td><td class="mono">${esc(s.size)}</td><td class="mono">${esc(s.weight)}</td><td class="mono">${esc(s.lineHeight ?? "")}</td></tr>`)
|
|
278
|
+
.join("");
|
|
279
|
+
const srcs = result.typography?.sources ?? {};
|
|
280
|
+
const fams = [
|
|
281
|
+
...(srcs.googleFonts ?? []),
|
|
282
|
+
...(Array.isArray(srcs.adobeFonts) ? srcs.adobeFonts : []),
|
|
283
|
+
...(srcs.customFonts ?? []),
|
|
284
|
+
...(srcs.selfHostedFonts ?? []),
|
|
285
|
+
];
|
|
286
|
+
const srcLine = fams.length ? `<p class="sub">Sources: ${esc(fams.join(", "))}</p>` : "";
|
|
287
|
+
return section("Typography", `<table><thead><tr><th>Context</th><th>Family</th><th>Size</th><th>Weight</th><th>Line height</th></tr></thead><tbody>${rows}</tbody></table>${srcLine}`);
|
|
288
|
+
}
|
|
289
|
+
/** Numeric px of a token value, for ordering a scale low → high. */
|
|
290
|
+
function tokenPx(v) {
|
|
291
|
+
if (typeof v.numericValue === "number")
|
|
292
|
+
return v.numericValue;
|
|
293
|
+
if (typeof v.px === "number")
|
|
294
|
+
return v.px;
|
|
295
|
+
const m = String(v.display ?? v.value ?? v.px ?? "").match(/-?\d+(?:\.\d+)?/);
|
|
296
|
+
return m ? parseFloat(m[0]) : Number.POSITIVE_INFINITY;
|
|
297
|
+
}
|
|
298
|
+
/** Sort token values ascending so a scale reads in order. */
|
|
299
|
+
function sortByPx(values) {
|
|
300
|
+
return [...values].sort((a, b) => tokenPx(a) - tokenPx(b));
|
|
301
|
+
}
|
|
302
|
+
function tokenChips(values) {
|
|
303
|
+
return values
|
|
304
|
+
.map((v) => {
|
|
305
|
+
// px may already be a string like "2px" (pre-1.1.0 extractions); don't
|
|
306
|
+
// re-append the unit.
|
|
307
|
+
const label = v.display ?? v.value ?? (typeof v.px === "string" ? v.px : v.px != null ? `${v.px}px` : "");
|
|
308
|
+
if (!label)
|
|
309
|
+
return "";
|
|
310
|
+
return `<span class="tok">${esc(label)}${v.count != null ? ` <span class="muted">${esc(v.count)}×</span>` : ""}</span>`;
|
|
311
|
+
})
|
|
312
|
+
.join("");
|
|
313
|
+
}
|
|
314
|
+
function spacingSection(result) {
|
|
315
|
+
const vals = result.spacing?.commonValues ?? [];
|
|
316
|
+
if (!vals.length)
|
|
317
|
+
return "";
|
|
318
|
+
const scale = result.spacing?.scaleType ? `<p class="sub">Scale: ${esc(result.spacing.scaleType)}</p>` : "";
|
|
319
|
+
return section("Spacing", `<div class="chips">${tokenChips(sortByPx(vals))}</div>${scale}`);
|
|
320
|
+
}
|
|
321
|
+
function radiusSection(result) {
|
|
322
|
+
const vals = result.borderRadius?.values ?? [];
|
|
323
|
+
if (!vals.length)
|
|
324
|
+
return "";
|
|
325
|
+
return section("Border radius", `<div class="chips">${tokenChips(sortByPx(vals))}</div>`);
|
|
326
|
+
}
|
|
327
|
+
function shadowsSection(result) {
|
|
328
|
+
const shadows = result.shadows ?? [];
|
|
329
|
+
if (!shadows.length)
|
|
330
|
+
return "";
|
|
331
|
+
const boxes = shadows.map((s) => `<span class="sb" style="box-shadow:${safeCss(s.shadow)}"></span>`).join("");
|
|
332
|
+
const list = shadows.map((s) => `<div class="mono sub">${esc(s.shadow)}</div>`).join("");
|
|
333
|
+
return section("Shadows", `<div class="shadowpanel">${boxes}</div><div style="margin-top:12px;display:grid;gap:4px">${list}</div>`);
|
|
334
|
+
}
|
|
335
|
+
function buttonsSection(result) {
|
|
336
|
+
const buttons = result.components?.buttons ?? [];
|
|
337
|
+
if (!buttons.length)
|
|
338
|
+
return "";
|
|
339
|
+
const previews = buttons
|
|
340
|
+
.slice(0, 12)
|
|
341
|
+
.map((b) => {
|
|
342
|
+
const st = b.states?.default ?? {};
|
|
343
|
+
const style = [
|
|
344
|
+
st.backgroundColor ? `background:${safeCss(st.backgroundColor)}` : "",
|
|
345
|
+
st.color ? `color:${safeCss(st.color)}` : "",
|
|
346
|
+
st.borderRadius ? `border-radius:${safeCss(st.borderRadius)}` : "",
|
|
347
|
+
st.padding ? `padding:${safeCss(st.padding)}` : "padding:8px 14px",
|
|
348
|
+
st.border ? `border:${safeCss(st.border)}` : "",
|
|
349
|
+
b.fontWeight ? `font-weight:${safeCss(b.fontWeight)}` : "",
|
|
350
|
+
b.fontSize ? `font-size:${safeCss(b.fontSize)}` : "",
|
|
351
|
+
]
|
|
352
|
+
.filter(Boolean)
|
|
353
|
+
.join(";");
|
|
354
|
+
return `<button class="previewbtn" style="${esc(style)}">${esc(b.text || "Button")}</button>`;
|
|
355
|
+
})
|
|
356
|
+
.join(" ");
|
|
357
|
+
return section("Buttons", `<div class="row">${previews}</div>`);
|
|
358
|
+
}
|
|
359
|
+
function badgesSection(result) {
|
|
360
|
+
const raw = result.components?.badges;
|
|
361
|
+
const list = Array.isArray(raw) ? raw : raw?.all ?? [];
|
|
362
|
+
if (!list.length)
|
|
363
|
+
return "";
|
|
364
|
+
const chips = list
|
|
365
|
+
.slice(0, 16)
|
|
366
|
+
.map((bd) => {
|
|
367
|
+
const style = [
|
|
368
|
+
bd.backgroundColor ? `background:${safeCss(bd.backgroundColor)}` : "",
|
|
369
|
+
bd.color ? `color:${safeCss(bd.color)}` : "",
|
|
370
|
+
bd.borderRadius ? `border-radius:${safeCss(bd.borderRadius)}` : "",
|
|
371
|
+
]
|
|
372
|
+
.filter(Boolean)
|
|
373
|
+
.join(";");
|
|
374
|
+
return `<span class="badgepv" style="${esc(style)}">${esc(bd.styleType || "badge")}</span>`;
|
|
375
|
+
})
|
|
376
|
+
.join(" ");
|
|
377
|
+
return section("Badges", `<div class="row">${chips}</div>`);
|
|
378
|
+
}
|
|
379
|
+
function wcagSection(result) {
|
|
380
|
+
const pairs = result.wcag ?? [];
|
|
381
|
+
if (!pairs.length)
|
|
382
|
+
return "";
|
|
383
|
+
const rows = pairs
|
|
384
|
+
.slice(0, 60)
|
|
385
|
+
.map((p) => {
|
|
386
|
+
const verdict = p.aa ? `<span class="badge b-good">AA</span>` : p.aaLarge ? `<span class="badge b-warn">AA Large</span>` : `<span class="badge b-bad">Fail</span>`;
|
|
387
|
+
return `<tr><td><span class="shadowbox" style="width:22px;height:22px;border-radius:4px;background:${safeCss(p.bg)};border:1px solid var(--line)"></span></td><td class="mono">${esc(p.fg)}</td><td class="mono">${esc(p.bg)}</td><td class="mono">${esc(p.ratio?.toFixed ? p.ratio.toFixed(2) : p.ratio)}</td><td>${verdict}</td></tr>`;
|
|
388
|
+
})
|
|
389
|
+
.join("");
|
|
390
|
+
return section("WCAG contrast", `<table><thead><tr><th>bg</th><th>Foreground</th><th>Background</th><th>Ratio</th><th>AA</th></tr></thead><tbody>${rows}</tbody></table>`, "wcag");
|
|
391
|
+
}
|
|
392
|
+
function metaSection(result) {
|
|
393
|
+
const fw = (result.frameworks ?? []).map((f) => f.name);
|
|
394
|
+
const icons = (result.iconSystem ?? []).map((i) => i.name);
|
|
395
|
+
const bps = (result.breakpoints ?? []).map((b) => {
|
|
396
|
+
// b.px may be a bare number (360) or already a CSS length ("360px", "20rem").
|
|
397
|
+
// Only append the unit when it is a bare number, else we get "360pxpx".
|
|
398
|
+
const s = String(b.px).trim();
|
|
399
|
+
return /^\d+(\.\d+)?$/.test(s) ? `${s}px` : s;
|
|
400
|
+
});
|
|
401
|
+
const items = [];
|
|
402
|
+
if (fw.length)
|
|
403
|
+
items.push(`<span><span class="muted">Frameworks:</span> ${esc(fw.join(", "))}</span>`);
|
|
404
|
+
if (icons.length)
|
|
405
|
+
items.push(`<span><span class="muted">Icons:</span> ${esc(icons.join(", "))}</span>`);
|
|
406
|
+
if (bps.length)
|
|
407
|
+
items.push(`<span><span class="muted">Breakpoints:</span> ${esc(bps.join(", "))}</span>`);
|
|
408
|
+
if (!items.length)
|
|
409
|
+
return "";
|
|
410
|
+
return section("Detected", `<div class="kvs">${items.join("")}</div>`);
|
|
411
|
+
}
|
|
412
|
+
/* -------------------------------- drift --------------------------------- */
|
|
413
|
+
function driftSection(drift, baselineLabel) {
|
|
414
|
+
const cls = drift.status === "drift" ? "is-drift" : "is-stable";
|
|
415
|
+
const verdict = drift.status === "drift"
|
|
416
|
+
? `<span class="badge b-bad">DRIFT</span>`
|
|
417
|
+
: `<span class="badge b-good">STABLE</span>`;
|
|
418
|
+
const cats = drift.categories
|
|
419
|
+
.filter((c) => c.changed + c.added + c.removed > 0)
|
|
420
|
+
.map((c) => `<tr><td>${esc(c.category)}</td><td>${esc(Math.round(c.score * 100))}</td><td>${esc(c.changed)}</td><td>${esc(c.added)}</td><td>${esc(c.removed)}</td></tr>`)
|
|
421
|
+
.join("");
|
|
422
|
+
const changes = drift.changes
|
|
423
|
+
.slice(0, 120)
|
|
424
|
+
.map((ch) => {
|
|
425
|
+
const kindCls = ch.kind === "added" ? "b-good" : ch.kind === "removed" ? "b-bad" : "b-warn";
|
|
426
|
+
const detail = ch.before && ch.after ? `${esc(ch.before)} → ${esc(ch.after)}` : esc(ch.before ?? ch.after ?? "");
|
|
427
|
+
return `<tr><td>${esc(ch.category)}</td><td><span class="badge ${kindCls}">${esc(ch.kind)}</span></td><td class="mono">${esc(ch.label)}</td><td class="mono">${detail}</td><td class="mono">${ch.delta != null ? esc(ch.delta) : ""}</td></tr>`;
|
|
428
|
+
})
|
|
429
|
+
.join("");
|
|
430
|
+
const more = drift.changes.length > 120 ? `<p class="sub">… ${drift.changes.length - 120} more changes</p>` : "";
|
|
431
|
+
return `<div class="drift ${cls}" id="drift"><div class="row"><div class="score">${esc(drift.score)}</div><div><div>${verdict} <span class="sub">threshold ${esc(drift.threshold)}</span></div><div class="sub">${esc(drift.summary.changed)} changed · ${esc(drift.summary.added)} added · ${esc(drift.summary.removed)} removed${baselineLabel ? ` · vs ${esc(baselineLabel)}` : ""}</div></div></div>${cats ? `<table style="margin-top:14px"><thead><tr><th>Category</th><th>Score</th><th>Δ</th><th>+</th><th>−</th></tr></thead><tbody>${cats}</tbody></table>` : ""}${changes ? `<table style="margin-top:10px"><thead><tr><th>Category</th><th>Kind</th><th>Token</th><th>Change</th><th>Δ</th></tr></thead><tbody>${changes}</tbody></table>${more}` : ""}</div>`;
|
|
432
|
+
}
|
|
433
|
+
/* -------------------------------- entry --------------------------------- */
|
|
434
|
+
export function generateHtmlReport(result, options = {}) {
|
|
435
|
+
let domain = result.url;
|
|
436
|
+
try {
|
|
437
|
+
domain = new URL(result.url).hostname.replace(/^www\./, "");
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
/* leave as-is */
|
|
441
|
+
}
|
|
442
|
+
const version = options.version ?? result.meta?.dembrandtVersion ?? "";
|
|
443
|
+
const fr = computeFindings(result);
|
|
444
|
+
const body = [
|
|
445
|
+
options.drift ? driftSection(options.drift, options.baselineLabel) : "",
|
|
446
|
+
findingsSection(fr),
|
|
447
|
+
paletteSection(result),
|
|
448
|
+
semanticSection(result),
|
|
449
|
+
typographySection(result),
|
|
450
|
+
cardRow(spacingSection(result), radiusSection(result)),
|
|
451
|
+
shadowsSection(result),
|
|
452
|
+
buttonsSection(result),
|
|
453
|
+
badgesSection(result),
|
|
454
|
+
wcagSection(result),
|
|
455
|
+
metaSection(result),
|
|
456
|
+
].join("\n");
|
|
457
|
+
const gauges = summaryGauges(result, fr, options.drift);
|
|
458
|
+
return `<!doctype html>
|
|
459
|
+
<html lang="en">
|
|
460
|
+
<head>
|
|
461
|
+
<meta charset="utf-8">
|
|
462
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
463
|
+
<meta name="generator" content="dembrandt${version ? " " + esc(version) : ""}">
|
|
464
|
+
<title>Dembrandt report — ${esc(domain)}</title>
|
|
465
|
+
<style>${STYLE}</style>
|
|
466
|
+
</head>
|
|
467
|
+
<body>
|
|
468
|
+
<input type="checkbox" id="theme" class="tt">
|
|
469
|
+
<div class="topbar"><span class="bm">${LOGO}</span><span class="u">${esc(result.url)}</span><span class="meta">${esc(result.extractedAt)}${version ? " · v" + esc(version) : ""}</span><label for="theme" class="ttl" title="Toggle light / dark"></label></div>
|
|
470
|
+
<div class="wrap">
|
|
471
|
+
${gauges}
|
|
472
|
+
${summaryCounts(result)}
|
|
473
|
+
${body}
|
|
474
|
+
<footer>Generated by <a href="https://github.com/dembrandt/dembrandt">Dembrandt</a>${version ? " " + esc(version) : ""} · <a href="https://github.com/dembrandt/dembrandt/issues">File an issue</a></footer>
|
|
475
|
+
</div>
|
|
476
|
+
</body>
|
|
477
|
+
</html>`;
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../lib/formatters/html.ts"],"names":[],"mappings":"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"}
|