@polishd/next 0.2.0 → 0.2.1-dev.1
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 +69 -0
- package/README.md +49 -2
- package/dist/ai/actions.d.ts +7 -1
- package/dist/ai/actions.d.ts.map +1 -1
- package/dist/ai/actions.js +10 -0
- package/dist/ai/actions.js.map +1 -1
- package/dist/ai/design.d.ts +28 -0
- package/dist/ai/design.d.ts.map +1 -0
- package/dist/ai/design.js +245 -0
- package/dist/ai/design.js.map +1 -0
- package/dist/ai/types.d.ts +47 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/client/design-scan.d.ts +37 -0
- package/dist/client/design-scan.d.ts.map +1 -0
- package/dist/client/design-scan.js +325 -0
- package/dist/client/design-scan.js.map +1 -0
- package/dist/client/init.d.ts.map +1 -1
- package/dist/client/init.js +16 -0
- package/dist/client/init.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -1
- package/dist/dashboard/design-review-card.d.ts +15 -0
- package/dist/dashboard/design-review-card.d.ts.map +1 -0
- package/dist/dashboard/design-review-card.js +82 -0
- package/dist/dashboard/design-review-card.js.map +1 -0
- package/dist/dashboard/design.d.ts +10 -0
- package/dist/dashboard/design.d.ts.map +1 -0
- package/dist/dashboard/design.js +118 -0
- package/dist/dashboard/design.js.map +1 -0
- package/dist/dashboard/index.d.ts +11 -0
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +58 -8
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/journeys.d.ts.map +1 -1
- package/dist/dashboard/journeys.js +1 -0
- package/dist/dashboard/journeys.js.map +1 -1
- package/dist/dashboard/show-more.d.ts +17 -0
- package/dist/dashboard/show-more.d.ts.map +1 -0
- package/dist/dashboard/show-more.js +18 -0
- package/dist/dashboard/show-more.js.map +1 -0
- package/dist/dashboard.css +159 -0
- package/dist/server/design.d.ts +93 -0
- package/dist/server/design.d.ts.map +1 -0
- package/dist/server/design.js +405 -0
- package/dist/server/design.js.map +1 -0
- package/dist/server/ingest.d.ts.map +1 -1
- package/dist/server/ingest.js +15 -3
- package/dist/server/ingest.js.map +1 -1
- package/dist/server/queries.d.ts +22 -0
- package/dist/server/queries.d.ts.map +1 -1
- package/dist/server/queries.js +22 -25
- package/dist/server/queries.js.map +1 -1
- package/dist/shared/types.d.ts +31 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { polishdEventsSource } from "./queries";
|
|
2
|
+
import { parseMeta, query, storeReady } from "./store";
|
|
3
|
+
export const EMPTY_DESIGN_DATA = {
|
|
4
|
+
ready: false,
|
|
5
|
+
pages: [],
|
|
6
|
+
fonts: [],
|
|
7
|
+
families: [],
|
|
8
|
+
colors: [],
|
|
9
|
+
contrast: [],
|
|
10
|
+
radii: [],
|
|
11
|
+
spacing: [],
|
|
12
|
+
flags: [],
|
|
13
|
+
};
|
|
14
|
+
// ── Color math ───────────────────────────────────────────────────────────────
|
|
15
|
+
function rgbOf(hex) {
|
|
16
|
+
const m = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i);
|
|
17
|
+
if (!m)
|
|
18
|
+
return null;
|
|
19
|
+
return [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16)];
|
|
20
|
+
}
|
|
21
|
+
/** WCAG 2.x relative luminance. */
|
|
22
|
+
function luminance(hex) {
|
|
23
|
+
const rgb = rgbOf(hex);
|
|
24
|
+
if (!rgb)
|
|
25
|
+
return null;
|
|
26
|
+
const [r, g, b] = rgb.map((v) => {
|
|
27
|
+
const s = v / 255;
|
|
28
|
+
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
29
|
+
});
|
|
30
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
31
|
+
}
|
|
32
|
+
/** WCAG 2.x contrast ratio between two hex colors, or null if unparseable. */
|
|
33
|
+
export function contrastRatio(a, b) {
|
|
34
|
+
const la = luminance(a);
|
|
35
|
+
const lb = luminance(b);
|
|
36
|
+
if (la === null || lb === null)
|
|
37
|
+
return null;
|
|
38
|
+
const [hi, lo] = la >= lb ? [la, lb] : [lb, la];
|
|
39
|
+
return Math.round(((hi + 0.05) / (lo + 0.05)) * 100) / 100;
|
|
40
|
+
}
|
|
41
|
+
/** Euclidean RGB distance — crude but plenty to catch #fefefe vs #ffffff. */
|
|
42
|
+
function colorDistance(a, b) {
|
|
43
|
+
const ra = rgbOf(a);
|
|
44
|
+
const rb = rgbOf(b);
|
|
45
|
+
if (!ra || !rb)
|
|
46
|
+
return null;
|
|
47
|
+
return Math.sqrt((ra[0] - rb[0]) ** 2 + (ra[1] - rb[1]) ** 2 + (ra[2] - rb[2]) ** 2);
|
|
48
|
+
}
|
|
49
|
+
// ── Aggregation ──────────────────────────────────────────────────────────────
|
|
50
|
+
function toNum(v) {
|
|
51
|
+
if (typeof v === "number")
|
|
52
|
+
return Number.isFinite(v) ? v : 0;
|
|
53
|
+
if (typeof v === "string") {
|
|
54
|
+
const n = Number(v);
|
|
55
|
+
return Number.isFinite(n) ? n : 0;
|
|
56
|
+
}
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
/** Latest parseable scan per page, newest first. */
|
|
60
|
+
async function loadPageScans() {
|
|
61
|
+
const rows = await query(`SELECT path, ts, meta FROM ${polishdEventsSource()}
|
|
62
|
+
WHERE type = 'design_scan'
|
|
63
|
+
ORDER BY id DESC
|
|
64
|
+
LIMIT 300`);
|
|
65
|
+
const byPath = new Map();
|
|
66
|
+
for (const r of rows) {
|
|
67
|
+
const path = r.path;
|
|
68
|
+
if (byPath.has(path))
|
|
69
|
+
continue; // newest wins (rows are id DESC)
|
|
70
|
+
const meta = parseMeta(r.meta);
|
|
71
|
+
const raw = meta && typeof meta.payload === "string" ? meta.payload : null;
|
|
72
|
+
if (!raw)
|
|
73
|
+
continue;
|
|
74
|
+
try {
|
|
75
|
+
const payload = JSON.parse(raw);
|
|
76
|
+
if (payload?.v !== 1 || !Array.isArray(payload.fonts))
|
|
77
|
+
continue;
|
|
78
|
+
byPath.set(path, { path, ts: toNum(r.ts), payload });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// A clipped or malformed payload is dropped, never fatal.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return [...byPath.values()].sort((a, b) => b.ts - a.ts);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build the full design dataset: merge per-page tallies site-wide, then run
|
|
88
|
+
* the deterministic checks. Read-only; degrades to `EMPTY_DESIGN_DATA`.
|
|
89
|
+
*/
|
|
90
|
+
export async function getDesignData() {
|
|
91
|
+
if (!(await storeReady()))
|
|
92
|
+
return EMPTY_DESIGN_DATA;
|
|
93
|
+
const scans = await loadPageScans();
|
|
94
|
+
if (scans.length === 0)
|
|
95
|
+
return { ...EMPTY_DESIGN_DATA, ready: true };
|
|
96
|
+
// fonts: family|size|weight → merged usage
|
|
97
|
+
const fonts = new Map();
|
|
98
|
+
// colors: hex → role tallies
|
|
99
|
+
const colors = new Map();
|
|
100
|
+
const pairs = new Map();
|
|
101
|
+
const radii = new Map();
|
|
102
|
+
const spacing = new Map();
|
|
103
|
+
const addColor = (hex, role, count, page) => {
|
|
104
|
+
// Palette ignores alpha variants' suffix so #ffffff and #ffffffcc merge
|
|
105
|
+
// visually apart — keep them distinct only when fully opaque differs.
|
|
106
|
+
let c = colors.get(hex);
|
|
107
|
+
if (!c)
|
|
108
|
+
colors.set(hex, (c = { count: 0, roles: { text: 0, background: 0, border: 0 }, pages: new Set() }));
|
|
109
|
+
c.count += count;
|
|
110
|
+
c.roles[role] += count;
|
|
111
|
+
c.pages.add(page);
|
|
112
|
+
};
|
|
113
|
+
for (const scan of scans) {
|
|
114
|
+
const p = scan.payload;
|
|
115
|
+
const page = scan.path;
|
|
116
|
+
for (const [family, sizePx, weight, count, sample, tags] of p.fonts) {
|
|
117
|
+
if (typeof family !== "string" || !Number.isFinite(sizePx) || !Number.isFinite(count))
|
|
118
|
+
continue;
|
|
119
|
+
const key = `${family}|${sizePx}|${weight}`;
|
|
120
|
+
let f = fonts.get(key);
|
|
121
|
+
if (!f) {
|
|
122
|
+
fonts.set(key, (f = { family, sizePx, weight, count: 0, sample: "", tags: new Set(), pages: new Set() }));
|
|
123
|
+
}
|
|
124
|
+
f.count += count;
|
|
125
|
+
f.pages.add(page);
|
|
126
|
+
if (!f.sample && typeof sample === "string")
|
|
127
|
+
f.sample = sample;
|
|
128
|
+
if (typeof tags === "string") {
|
|
129
|
+
for (const t of tags.split(","))
|
|
130
|
+
if (t && f.tags.size < 6)
|
|
131
|
+
f.tags.add(t);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const roleLists = [
|
|
135
|
+
[p.text ?? [], "text"],
|
|
136
|
+
[p.bg ?? [], "background"],
|
|
137
|
+
[p.border ?? [], "border"],
|
|
138
|
+
];
|
|
139
|
+
for (const [list, role] of roleLists) {
|
|
140
|
+
for (const [hex, count] of list) {
|
|
141
|
+
if (typeof hex !== "string" || !hex.startsWith("#"))
|
|
142
|
+
continue;
|
|
143
|
+
addColor(hex.toLowerCase(), role, toNum(count), page);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
for (const [fg, bg, count, minSizePx] of p.pairs ?? []) {
|
|
147
|
+
if (typeof fg !== "string" || typeof bg !== "string")
|
|
148
|
+
continue;
|
|
149
|
+
const key = `${fg}|${bg}`;
|
|
150
|
+
let pr = pairs.get(key);
|
|
151
|
+
if (!pr)
|
|
152
|
+
pairs.set(key, (pr = { fg: fg.toLowerCase(), bg: bg.toLowerCase(), count: 0, minSizePx: Infinity, pages: new Set() }));
|
|
153
|
+
pr.count += toNum(count);
|
|
154
|
+
if (Number.isFinite(minSizePx) && minSizePx < pr.minSizePx)
|
|
155
|
+
pr.minSizePx = minSizePx;
|
|
156
|
+
pr.pages.add(page);
|
|
157
|
+
}
|
|
158
|
+
for (const [value, count] of p.radii ?? []) {
|
|
159
|
+
if (typeof value !== "string")
|
|
160
|
+
continue;
|
|
161
|
+
let rd = radii.get(value);
|
|
162
|
+
if (!rd)
|
|
163
|
+
radii.set(value, (rd = { count: 0, pages: new Set() }));
|
|
164
|
+
rd.count += toNum(count);
|
|
165
|
+
rd.pages.add(page);
|
|
166
|
+
}
|
|
167
|
+
for (const [px, count] of p.pad ?? []) {
|
|
168
|
+
if (!Number.isFinite(px))
|
|
169
|
+
continue;
|
|
170
|
+
let sp = spacing.get(px);
|
|
171
|
+
if (!sp)
|
|
172
|
+
spacing.set(px, (sp = { count: 0, pages: new Set() }));
|
|
173
|
+
sp.count += toNum(count);
|
|
174
|
+
sp.pages.add(page);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ── Shape + outlier marking ────────────────────────────────────────────────
|
|
178
|
+
const totalFontTally = [...fonts.values()].reduce((s, f) => s + f.count, 0);
|
|
179
|
+
// With only a handful of measured elements, everything is statistically a
|
|
180
|
+
// one-off — the badge means nothing until there's enough signal to compare
|
|
181
|
+
// against, so outlier marking waits for a minimum sample per section.
|
|
182
|
+
const fontSignal = totalFontTally >= 60;
|
|
183
|
+
const fontList = [...fonts.values()]
|
|
184
|
+
.sort((a, b) => b.count - a.count)
|
|
185
|
+
.map((f) => ({
|
|
186
|
+
family: f.family,
|
|
187
|
+
sizePx: f.sizePx,
|
|
188
|
+
weight: f.weight,
|
|
189
|
+
count: f.count,
|
|
190
|
+
sample: f.sample || null,
|
|
191
|
+
tags: [...f.tags],
|
|
192
|
+
pages: [...f.pages],
|
|
193
|
+
// A combination carrying under ~1.5% of all text, on one page only, is a
|
|
194
|
+
// one-off — the kind of stray 17px that makes a type scale incoherent.
|
|
195
|
+
outlier: fontSignal && f.count <= Math.max(2, totalFontTally * 0.015) && f.pages.size === 1,
|
|
196
|
+
}));
|
|
197
|
+
const familyTally = new Map();
|
|
198
|
+
for (const f of fontList)
|
|
199
|
+
familyTally.set(f.family, (familyTally.get(f.family) ?? 0) + f.count);
|
|
200
|
+
const families = [...familyTally.entries()]
|
|
201
|
+
.map(([family, count]) => ({ family, count }))
|
|
202
|
+
.sort((a, b) => b.count - a.count);
|
|
203
|
+
const totalColorTally = [...colors.values()].reduce((s, c) => s + c.count, 0);
|
|
204
|
+
const colorSignal = totalColorTally >= 120;
|
|
205
|
+
const colorList = [...colors.entries()]
|
|
206
|
+
.sort((a, b) => b[1].count - a[1].count)
|
|
207
|
+
.map(([hex, c]) => ({
|
|
208
|
+
hex,
|
|
209
|
+
count: c.count,
|
|
210
|
+
roles: c.roles,
|
|
211
|
+
pages: [...c.pages],
|
|
212
|
+
pct: totalColorTally > 0 ? Math.round((c.count / totalColorTally) * 1000) / 10 : 0,
|
|
213
|
+
outlier: colorSignal && c.count <= Math.max(2, totalColorTally * 0.005) && c.pages.size === 1,
|
|
214
|
+
}))
|
|
215
|
+
.slice(0, 64);
|
|
216
|
+
const contrast = [...pairs.values()]
|
|
217
|
+
.map((pr) => {
|
|
218
|
+
const ratio = contrastRatio(pr.fg, pr.bg);
|
|
219
|
+
if (ratio === null)
|
|
220
|
+
return null;
|
|
221
|
+
const minSizePx = Number.isFinite(pr.minSizePx) ? pr.minSizePx : 16;
|
|
222
|
+
// WCAG AA: 3.0 for large text (≥24px, or ≥18.66px bold — we lack the
|
|
223
|
+
// bold flag post-merge, so use the conservative 24px cut), else 4.5.
|
|
224
|
+
const required = minSizePx >= 24 ? 3 : 4.5;
|
|
225
|
+
return {
|
|
226
|
+
fg: pr.fg,
|
|
227
|
+
bg: pr.bg,
|
|
228
|
+
count: pr.count,
|
|
229
|
+
minSizePx,
|
|
230
|
+
ratio,
|
|
231
|
+
required,
|
|
232
|
+
passes: ratio >= required,
|
|
233
|
+
pages: [...pr.pages],
|
|
234
|
+
};
|
|
235
|
+
})
|
|
236
|
+
.filter((p) => p !== null)
|
|
237
|
+
.sort((a, b) => Number(a.passes) - Number(b.passes) || a.ratio - b.ratio);
|
|
238
|
+
const totalRadiusTally = [...radii.values()].reduce((s, r) => s + r.count, 0);
|
|
239
|
+
const radiusSignal = totalRadiusTally >= 20;
|
|
240
|
+
const radiusList = [...radii.entries()]
|
|
241
|
+
.sort((a, b) => b[1].count - a[1].count)
|
|
242
|
+
.map(([value, r]) => ({
|
|
243
|
+
value,
|
|
244
|
+
count: r.count,
|
|
245
|
+
pages: [...r.pages],
|
|
246
|
+
outlier: radiusSignal &&
|
|
247
|
+
value !== "full" &&
|
|
248
|
+
r.count <= Math.max(2, totalRadiusTally * 0.02) &&
|
|
249
|
+
r.pages.size === 1,
|
|
250
|
+
}));
|
|
251
|
+
// Dominant grid: 4px unless the site's own values say 8px.
|
|
252
|
+
const spacingEntries = [...spacing.entries()].sort((a, b) => b[1].count - a[1].count);
|
|
253
|
+
const spacingList = spacingEntries.map(([px, s]) => ({
|
|
254
|
+
px,
|
|
255
|
+
count: s.count,
|
|
256
|
+
pages: [...s.pages],
|
|
257
|
+
offGrid: px % 4 !== 0,
|
|
258
|
+
}));
|
|
259
|
+
const data = {
|
|
260
|
+
ready: true,
|
|
261
|
+
pages: scans.map((s) => ({ path: s.path, scannedAt: s.ts, elements: s.payload.el })),
|
|
262
|
+
fonts: fontList,
|
|
263
|
+
families,
|
|
264
|
+
colors: colorList,
|
|
265
|
+
contrast,
|
|
266
|
+
radii: radiusList,
|
|
267
|
+
spacing: spacingList,
|
|
268
|
+
flags: [],
|
|
269
|
+
};
|
|
270
|
+
data.flags = buildDesignFlags(data);
|
|
271
|
+
return data;
|
|
272
|
+
}
|
|
273
|
+
// ── Deterministic review ─────────────────────────────────────────────────────
|
|
274
|
+
/** Cohesion thresholds, drawn from common design-system practice. */
|
|
275
|
+
const LIMITS = {
|
|
276
|
+
fontSizes: 8, // a considered type scale is 5–8 steps
|
|
277
|
+
fontFamilies: 2, // one for UI, maybe one display/mono
|
|
278
|
+
fontWeights: 4,
|
|
279
|
+
colors: 24, // full palette incl. neutrals
|
|
280
|
+
radii: 4, // distinct corner radii (excluding 0/full)
|
|
281
|
+
spacingValues: 14,
|
|
282
|
+
};
|
|
283
|
+
/**
|
|
284
|
+
* Rule-based checks over the aggregated data. Pure function of its input so
|
|
285
|
+
* it's easy to test and the AI layer can quote the same findings verbatim.
|
|
286
|
+
*/
|
|
287
|
+
export function buildDesignFlags(data) {
|
|
288
|
+
const flags = [];
|
|
289
|
+
if (data.pages.length === 0)
|
|
290
|
+
return flags;
|
|
291
|
+
// Typography ---------------------------------------------------------------
|
|
292
|
+
const sizes = [...new Set(data.fonts.map((f) => f.sizePx))].sort((a, b) => a - b);
|
|
293
|
+
if (sizes.length > LIMITS.fontSizes) {
|
|
294
|
+
flags.push({
|
|
295
|
+
section: "typography",
|
|
296
|
+
severity: "warn",
|
|
297
|
+
message: `${sizes.length} distinct font sizes in use (${sizes.slice(0, 12).map((s) => `${s}px`).join(", ")}${sizes.length > 12 ? ", …" : ""}). ` +
|
|
298
|
+
`Cohesive interfaces usually hold to a 5–8 step type scale; sizes 1–2px apart read as accidental.`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
if (data.families.length > LIMITS.fontFamilies) {
|
|
302
|
+
// A mono family for code is normal; flag only when even ignoring one
|
|
303
|
+
// there are still too many.
|
|
304
|
+
const nonMono = data.families.filter((f) => !/mono|courier|consolas|menlo/i.test(f.family));
|
|
305
|
+
if (nonMono.length > LIMITS.fontFamilies) {
|
|
306
|
+
flags.push({
|
|
307
|
+
section: "typography",
|
|
308
|
+
severity: "warn",
|
|
309
|
+
message: `${data.families.length} font families detected (${data.families.map((f) => f.family).join(", ")}). ` +
|
|
310
|
+
`Most coherent brands use one or two, plus a monospace for code.`,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const weights = [...new Set(data.fonts.map((f) => f.weight))].sort((a, b) => a - b);
|
|
315
|
+
if (weights.length > LIMITS.fontWeights) {
|
|
316
|
+
flags.push({
|
|
317
|
+
section: "typography",
|
|
318
|
+
severity: "info",
|
|
319
|
+
message: `${weights.length} font weights in use (${weights.join(", ")}) — hierarchies usually need 3–4.`,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
const tiny = data.fonts.filter((f) => f.sizePx < 11 && f.count >= 3);
|
|
323
|
+
if (tiny.length > 0) {
|
|
324
|
+
flags.push({
|
|
325
|
+
section: "typography",
|
|
326
|
+
severity: "warn",
|
|
327
|
+
message: `Text below 11px found (${[...new Set(tiny.map((t) => `${t.sizePx}px`))].join(", ")}) — hard to read on most screens.`,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
const oneOffs = data.fonts.filter((f) => f.outlier);
|
|
331
|
+
if (oneOffs.length >= 3) {
|
|
332
|
+
flags.push({
|
|
333
|
+
section: "typography",
|
|
334
|
+
severity: "info",
|
|
335
|
+
message: `${oneOffs.length} one-off type styles appear on a single page each — candidates to fold into the scale.`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
// Color ----------------------------------------------------------------------
|
|
339
|
+
const opaque = data.colors.filter((c) => c.hex.length === 7);
|
|
340
|
+
if (opaque.length > LIMITS.colors) {
|
|
341
|
+
flags.push({
|
|
342
|
+
section: "color",
|
|
343
|
+
severity: "warn",
|
|
344
|
+
message: `${opaque.length} distinct colors rendered site-wide — palettes past ~${LIMITS.colors} usually mean drifted one-off values rather than a system.`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// Near-duplicates among the meaningfully used colors.
|
|
348
|
+
const used = opaque.filter((c) => c.count >= 3).slice(0, 32);
|
|
349
|
+
const dupes = [];
|
|
350
|
+
for (let i = 0; i < used.length; i++) {
|
|
351
|
+
for (let j = i + 1; j < used.length; j++) {
|
|
352
|
+
const d = colorDistance(used[i].hex, used[j].hex);
|
|
353
|
+
if (d !== null && d > 0 && d < 10)
|
|
354
|
+
dupes.push(`${used[i].hex} ≈ ${used[j].hex}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (dupes.length > 0) {
|
|
358
|
+
flags.push({
|
|
359
|
+
section: "color",
|
|
360
|
+
severity: "warn",
|
|
361
|
+
message: `Near-duplicate colors: ${dupes.slice(0, 4).join("; ")}${dupes.length > 4 ? ` (+${dupes.length - 4} more)` : ""} — likely meant to be the same token.`,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
// Contrast -------------------------------------------------------------------
|
|
365
|
+
const failing = data.contrast.filter((p) => !p.passes && p.count >= 2);
|
|
366
|
+
for (const p of failing.slice(0, 5)) {
|
|
367
|
+
flags.push({
|
|
368
|
+
section: "contrast",
|
|
369
|
+
severity: "warn",
|
|
370
|
+
message: `${p.fg} text on ${p.bg} is ${p.ratio}:1 at ${p.minSizePx}px — below the WCAG AA ${p.required}:1 minimum` +
|
|
371
|
+
` (seen on ${p.pages.slice(0, 2).join(", ")}${p.pages.length > 2 ? ", …" : ""}).`,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Radius ----------------------------------------------------------------------
|
|
375
|
+
const distinctRadii = data.radii.filter((r) => r.value !== "full" && !r.value.includes("mixed"));
|
|
376
|
+
if (distinctRadii.length > LIMITS.radii) {
|
|
377
|
+
flags.push({
|
|
378
|
+
section: "radius",
|
|
379
|
+
severity: "warn",
|
|
380
|
+
message: `${distinctRadii.length} distinct corner radii (${distinctRadii.slice(0, 8).map((r) => r.value).join(", ")}${distinctRadii.length > 8 ? ", …" : ""}) — ` +
|
|
381
|
+
`most systems settle on 2–4 (e.g. small, medium, full).`,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
// Spacing ----------------------------------------------------------------------
|
|
385
|
+
const totalPad = data.spacing.reduce((s, v) => s + v.count, 0);
|
|
386
|
+
const offGrid = data.spacing.filter((v) => v.offGrid);
|
|
387
|
+
const offGridShare = totalPad > 0 ? offGrid.reduce((s, v) => s + v.count, 0) / totalPad : 0;
|
|
388
|
+
if (offGridShare > 0.25 && offGrid.length >= 3) {
|
|
389
|
+
flags.push({
|
|
390
|
+
section: "spacing",
|
|
391
|
+
severity: "info",
|
|
392
|
+
message: `${Math.round(offGridShare * 100)}% of padding values sit off a 4px grid (${offGrid.slice(0, 6).map((v) => `${v.px}px`).join(", ")}${offGrid.length > 6 ? ", …" : ""}) — ` +
|
|
393
|
+
`consistent rhythm usually comes from a 4px or 8px base unit.`,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
if (data.spacing.length > LIMITS.spacingValues) {
|
|
397
|
+
flags.push({
|
|
398
|
+
section: "spacing",
|
|
399
|
+
severity: "info",
|
|
400
|
+
message: `${data.spacing.length} distinct padding values in use — a spacing scale of 6–10 steps covers most interfaces.`,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
return flags;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/server/design.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/server/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/server/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAenB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAExD,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA+BD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAElF;AAkCD;;;;;;GAMG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAClC,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
package/dist/server/ingest.js
CHANGED
|
@@ -5,12 +5,19 @@
|
|
|
5
5
|
* store. The session id is taken from the request's cookie, never from the
|
|
6
6
|
* body, so events are always attributed to the bearer of the cookie.
|
|
7
7
|
*/
|
|
8
|
-
import { defaultPolishdConfig, isDashboardPath } from "../config";
|
|
8
|
+
import { defaultPolishdConfig, isDashboardPath, resolveDashboardRoute, } from "../config";
|
|
9
9
|
import { CLIENT_EVENT_TYPES } from "../shared/types";
|
|
10
10
|
import { getMeta, insertEvents, setMeta } from "./store";
|
|
11
11
|
const MAX_EVENTS_PER_BATCH = 200;
|
|
12
12
|
const MAX_TEXT_LEN = 120;
|
|
13
13
|
const MAX_SELECTOR_LEN = 300;
|
|
14
|
+
/**
|
|
15
|
+
* `design_scan` events carry a whole page's design tallies as one JSON string
|
|
16
|
+
* in `meta.payload`, so that one key gets a wider (but still bounded) cap than
|
|
17
|
+
* the 500 chars every other meta value is clamped to. The client serializes to
|
|
18
|
+
* ≤28KB (see client/design-scan.ts); anything beyond this is not ours.
|
|
19
|
+
*/
|
|
20
|
+
const MAX_DESIGN_PAYLOAD_LEN = 32_000;
|
|
14
21
|
/**
|
|
15
22
|
* Beacons dropped for want of a session cookie, recorded in `polishd_meta`.
|
|
16
23
|
*
|
|
@@ -86,8 +93,9 @@ function sanitize(raw) {
|
|
|
86
93
|
for (const [k, v] of Object.entries(e.meta)) {
|
|
87
94
|
if (k.length > 40)
|
|
88
95
|
continue;
|
|
96
|
+
const cap = out.type === "design_scan" && k === "payload" ? MAX_DESIGN_PAYLOAD_LEN : 500;
|
|
89
97
|
if (typeof v === "string")
|
|
90
|
-
meta[k] = v.slice(0,
|
|
98
|
+
meta[k] = v.slice(0, cap);
|
|
91
99
|
else if (typeof v === "number" || typeof v === "boolean" || v === null)
|
|
92
100
|
meta[k] = v;
|
|
93
101
|
}
|
|
@@ -104,6 +112,10 @@ function sanitize(raw) {
|
|
|
104
112
|
*/
|
|
105
113
|
export async function ingest(body, cookieValue, config = {}) {
|
|
106
114
|
const cfg = { ...defaultPolishdConfig, ...config };
|
|
115
|
+
// The host's explicit route wins; otherwise consult the registered route /
|
|
116
|
+
// POLISHD_DASHBOARD_ROUTE, so a dashboard moved off /polishd is still
|
|
117
|
+
// excluded even when the route handler wasn't handed a config object.
|
|
118
|
+
const dashboardRoute = resolveDashboardRoute(config.dashboardRoute);
|
|
107
119
|
const sessionId = sessionIdFromCookie(cookieValue);
|
|
108
120
|
if (!sessionId) {
|
|
109
121
|
await recordNoSession();
|
|
@@ -120,7 +132,7 @@ export async function ingest(body, cookieValue, config = {}) {
|
|
|
120
132
|
const events = rawEvents
|
|
121
133
|
.slice(0, MAX_EVENTS_PER_BATCH)
|
|
122
134
|
.map(sanitize)
|
|
123
|
-
.filter((e) => e !== null && !isDashboardPath(e.path,
|
|
135
|
+
.filter((e) => e !== null && !isDashboardPath(e.path, dashboardRoute));
|
|
124
136
|
const stored = await insertEvents(sessionId, events);
|
|
125
137
|
return { ok: true, stored };
|
|
126
138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/server/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/server/ingest.ts"],"names":[],"mappings":"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"}
|
package/dist/server/queries.d.ts
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
import type { PolishdEventType } from "../shared/types";
|
|
2
|
+
/**
|
|
3
|
+
* The events table with the dashboard's own route filtered out, aliased back to
|
|
4
|
+
* `events` so every query below reads from it unchanged.
|
|
5
|
+
*
|
|
6
|
+
* Capture already skips the dashboard on both the client and the ingest
|
|
7
|
+
* endpoint, so this is what hides rows recorded *before* that landed — an
|
|
8
|
+
* existing install shouldn't have to wipe its database to stop seeing its own
|
|
9
|
+
* dashboard ranked as the site's busiest page.
|
|
10
|
+
*
|
|
11
|
+
* The route is inlined rather than bound as a parameter because these queries
|
|
12
|
+
* mix positional `?` params in query-specific orders, and a shared leading
|
|
13
|
+
* param would have to be threaded through every call site. It's a
|
|
14
|
+
* developer-set config value rather than user input, and the comparison is
|
|
15
|
+
* `substr`-based so there are no LIKE wildcards to escape.
|
|
16
|
+
*
|
|
17
|
+
* Resolved per call, not at module load: these queries are public API called
|
|
18
|
+
* with no arguments, so the route arrives out of band — registered by
|
|
19
|
+
* `createPolishdPage({ config })` when the page module evaluates, or set via
|
|
20
|
+
* `POLISHD_DASHBOARD_ROUTE` — and module evaluation order means neither is
|
|
21
|
+
* guaranteed to have happened by the time this file is imported.
|
|
22
|
+
*/
|
|
23
|
+
export declare function polishdEventsSource(): string;
|
|
2
24
|
export interface OverviewStats {
|
|
3
25
|
ready: boolean;
|
|
4
26
|
totalEvents: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/server/queries.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/server/queries.ts"],"names":[],"mappings":"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"}
|