paintoliver 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/analyzer/index.d.ts +20 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +387 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +436 -0
- package/dist/cli.js.map +1 -0
- package/dist/contrast/index.d.ts +88 -0
- package/dist/contrast/index.d.ts.map +1 -0
- package/dist/contrast/index.js +314 -0
- package/dist/contrast/index.js.map +1 -0
- package/dist/paintoliver.bundle.js +14530 -0
- package/dist/reporter/index.d.ts +43 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +235 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/transformer/css-var-transformer.d.ts +46 -0
- package/dist/transformer/css-var-transformer.d.ts.map +1 -0
- package/dist/transformer/css-var-transformer.js +422 -0
- package/dist/transformer/css-var-transformer.js.map +1 -0
- package/dist/transformer/index.d.ts +17 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +213 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/tailwind-transformer.d.ts +47 -0
- package/dist/transformer/tailwind-transformer.d.ts.map +1 -0
- package/dist/transformer/tailwind-transformer.js +402 -0
- package/dist/transformer/tailwind-transformer.js.map +1 -0
- package/dist/utils/backup.d.ts +41 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +125 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/vibes/definitions/brutalist.d.ts +11 -0
- package/dist/vibes/definitions/brutalist.d.ts.map +1 -0
- package/dist/vibes/definitions/brutalist.js +203 -0
- package/dist/vibes/definitions/brutalist.js.map +1 -0
- package/dist/vibes/definitions/corporate.d.ts +12 -0
- package/dist/vibes/definitions/corporate.d.ts.map +1 -0
- package/dist/vibes/definitions/corporate.js +212 -0
- package/dist/vibes/definitions/corporate.js.map +1 -0
- package/dist/vibes/definitions/glassmorphism.d.ts +20 -0
- package/dist/vibes/definitions/glassmorphism.d.ts.map +1 -0
- package/dist/vibes/definitions/glassmorphism.js +217 -0
- package/dist/vibes/definitions/glassmorphism.js.map +1 -0
- package/dist/vibes/definitions/kinetic-terminal.d.ts +20 -0
- package/dist/vibes/definitions/kinetic-terminal.d.ts.map +1 -0
- package/dist/vibes/definitions/kinetic-terminal.js +242 -0
- package/dist/vibes/definitions/kinetic-terminal.js.map +1 -0
- package/dist/vibes/definitions/minimal.d.ts +11 -0
- package/dist/vibes/definitions/minimal.d.ts.map +1 -0
- package/dist/vibes/definitions/minimal.js +167 -0
- package/dist/vibes/definitions/minimal.js.map +1 -0
- package/dist/vibes/definitions/windows-xp.d.ts +12 -0
- package/dist/vibes/definitions/windows-xp.d.ts.map +1 -0
- package/dist/vibes/definitions/windows-xp.js +229 -0
- package/dist/vibes/definitions/windows-xp.js.map +1 -0
- package/dist/vibes/registry.d.ts +25 -0
- package/dist/vibes/registry.d.ts.map +1 -0
- package/dist/vibes/registry.js +52 -0
- package/dist/vibes/registry.js.map +1 -0
- package/dist/vibes/types.d.ts +428 -0
- package/dist/vibes/types.d.ts.map +1 -0
- package/dist/vibes/types.js +12 -0
- package/dist/vibes/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WCAG 2.2 Contrast Engine
|
|
3
|
+
*
|
|
4
|
+
* Checks semantic color pairs against WCAG 2.2 AA thresholds:
|
|
5
|
+
* - 4.5:1 for normal text
|
|
6
|
+
* - 3.0:1 for UI components and large text
|
|
7
|
+
*
|
|
8
|
+
* When failures are found, the engine computes the least-disruptive fix —
|
|
9
|
+
* adjusting lightness (binary search, 24 iterations) on whichever side of
|
|
10
|
+
* the pair requires the smallest change.
|
|
11
|
+
*
|
|
12
|
+
* Surface roles (background, card, muted, etc.) get a 0.15 lightness bias
|
|
13
|
+
* against being modified, to avoid ripple effects across multiple pairs.
|
|
14
|
+
*
|
|
15
|
+
* Fixes are persisted in .paintoliver.json under `contrastOverrides`
|
|
16
|
+
* and merged at the start of every subsequent run.
|
|
17
|
+
*/
|
|
18
|
+
import fs from "fs";
|
|
19
|
+
import path from "path";
|
|
20
|
+
/** Only hex colors (#rrggbb, #rgb) can be checked — skip rgba/hsl/etc. */
|
|
21
|
+
export function isCheckableColor(str) {
|
|
22
|
+
if (!str)
|
|
23
|
+
return false;
|
|
24
|
+
const t = str.trim();
|
|
25
|
+
return /^#[0-9a-fA-F]{6}$/.test(t) || /^#[0-9a-fA-F]{3}$/.test(t);
|
|
26
|
+
}
|
|
27
|
+
function hexToRgb(hex) {
|
|
28
|
+
const h = hex.replace("#", "");
|
|
29
|
+
const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
|
|
30
|
+
return {
|
|
31
|
+
r: parseInt(full.slice(0, 2), 16),
|
|
32
|
+
g: parseInt(full.slice(2, 4), 16),
|
|
33
|
+
b: parseInt(full.slice(4, 6), 16),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function rgbToHex({ r, g, b }) {
|
|
37
|
+
return ("#" +
|
|
38
|
+
[r, g, b]
|
|
39
|
+
.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, "0"))
|
|
40
|
+
.join(""));
|
|
41
|
+
}
|
|
42
|
+
function linearChannel(v) {
|
|
43
|
+
const s = v / 255;
|
|
44
|
+
return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
45
|
+
}
|
|
46
|
+
function luminance({ r, g, b }) {
|
|
47
|
+
return 0.2126 * linearChannel(r) + 0.7152 * linearChannel(g) + 0.0722 * linearChannel(b);
|
|
48
|
+
}
|
|
49
|
+
export function contrastRatio(hex1, hex2) {
|
|
50
|
+
const l1 = luminance(hexToRgb(hex1));
|
|
51
|
+
const l2 = luminance(hexToRgb(hex2));
|
|
52
|
+
return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);
|
|
53
|
+
}
|
|
54
|
+
function rgbToHsl({ r, g, b }) {
|
|
55
|
+
const rn = r / 255, gn = g / 255, bn = b / 255;
|
|
56
|
+
const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn);
|
|
57
|
+
let h = 0, s = 0;
|
|
58
|
+
const l = (max + min) / 2;
|
|
59
|
+
if (max !== min) {
|
|
60
|
+
const d = max - min;
|
|
61
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
62
|
+
switch (max) {
|
|
63
|
+
case rn:
|
|
64
|
+
h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;
|
|
65
|
+
break;
|
|
66
|
+
case gn:
|
|
67
|
+
h = ((bn - rn) / d + 2) / 6;
|
|
68
|
+
break;
|
|
69
|
+
case bn:
|
|
70
|
+
h = ((rn - gn) / d + 4) / 6;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { h, s, l };
|
|
75
|
+
}
|
|
76
|
+
function hslToRgb({ h, s, l }) {
|
|
77
|
+
if (s === 0) {
|
|
78
|
+
const v = Math.round(l * 255);
|
|
79
|
+
return { r: v, g: v, b: v };
|
|
80
|
+
}
|
|
81
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
82
|
+
const p = 2 * l - q;
|
|
83
|
+
const hue = (t) => {
|
|
84
|
+
const tn = ((t % 1) + 1) % 1;
|
|
85
|
+
if (tn < 1 / 6)
|
|
86
|
+
return p + (q - p) * 6 * tn;
|
|
87
|
+
if (tn < 1 / 2)
|
|
88
|
+
return q;
|
|
89
|
+
if (tn < 2 / 3)
|
|
90
|
+
return p + (q - p) * (2 / 3 - tn) * 6;
|
|
91
|
+
return p;
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
r: Math.round(hue(h + 1 / 3) * 255),
|
|
95
|
+
g: Math.round(hue(h) * 255),
|
|
96
|
+
b: Math.round(hue(h - 1 / 3) * 255),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// ─── Nudge Engine ─────────────────────────────────────────────────────────────
|
|
100
|
+
/**
|
|
101
|
+
* Binary-search the minimum lightness adjustment needed to make colorHex
|
|
102
|
+
* contrast against bgHex at targetRatio.
|
|
103
|
+
* Returns adjusted hex, or null if the ratio is impossible to achieve.
|
|
104
|
+
*/
|
|
105
|
+
export function nudgeToContrast(colorHex, bgHex, targetRatio) {
|
|
106
|
+
if (contrastRatio(colorHex, bgHex) >= targetRatio)
|
|
107
|
+
return colorHex; // already passes
|
|
108
|
+
const hsl = rgbToHsl(hexToRgb(colorHex));
|
|
109
|
+
const bgDark = luminance(hexToRgb(bgHex)) < 0.18; // true → make fg lighter; false → darker
|
|
110
|
+
// Check if even the extreme achieves the ratio
|
|
111
|
+
const extreme = rgbToHex(hslToRgb({ ...hsl, l: bgDark ? 0.98 : 0.02 }));
|
|
112
|
+
if (contrastRatio(extreme, bgHex) < targetRatio)
|
|
113
|
+
return null; // impossible
|
|
114
|
+
let lo = bgDark ? hsl.l : 0.02;
|
|
115
|
+
let hi = bgDark ? 0.98 : hsl.l;
|
|
116
|
+
for (let i = 0; i < 24; i++) {
|
|
117
|
+
const mid = (lo + hi) / 2;
|
|
118
|
+
const passes = contrastRatio(rgbToHex(hslToRgb({ ...hsl, l: mid })), bgHex) >= targetRatio;
|
|
119
|
+
// bgDark: higher L → higher contrast; want minimum passing L → binary search towards lo
|
|
120
|
+
// bgLight: lower L → higher contrast; want maximum passing L → binary search towards hi
|
|
121
|
+
if (bgDark) {
|
|
122
|
+
if (passes)
|
|
123
|
+
hi = mid;
|
|
124
|
+
else
|
|
125
|
+
lo = mid;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (passes)
|
|
129
|
+
lo = mid;
|
|
130
|
+
else
|
|
131
|
+
hi = mid;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return rgbToHex(hslToRgb({ ...hsl, l: bgDark ? hi : lo }));
|
|
135
|
+
}
|
|
136
|
+
// ─── Surface Role Bias ────────────────────────────────────────────────────────
|
|
137
|
+
/**
|
|
138
|
+
* Roles whose adjustment would ripple across multiple contrast pairs.
|
|
139
|
+
* These get a 0.15 lightness bias — only modified if they save >0.15 vs the fg.
|
|
140
|
+
*/
|
|
141
|
+
const SURFACE_ROLES = new Set([
|
|
142
|
+
"background",
|
|
143
|
+
"card",
|
|
144
|
+
"muted",
|
|
145
|
+
"popover",
|
|
146
|
+
"secondary",
|
|
147
|
+
"accent",
|
|
148
|
+
"primary",
|
|
149
|
+
"destructive",
|
|
150
|
+
"success",
|
|
151
|
+
"warning",
|
|
152
|
+
]);
|
|
153
|
+
/**
|
|
154
|
+
* For a failing contrast pair, find which side (fg or bg) needs the least
|
|
155
|
+
* lightness change, biasing against modifying surface roles.
|
|
156
|
+
*/
|
|
157
|
+
export function leastDisruptiveFix(fgRole, fgHex, bgRole, bgHex, targetRatio) {
|
|
158
|
+
const fixedFg = nudgeToContrast(fgHex, bgHex, targetRatio);
|
|
159
|
+
const fixedBg = nudgeToContrast(bgHex, fgHex, targetRatio);
|
|
160
|
+
const origFgL = rgbToHsl(hexToRgb(fgHex)).l;
|
|
161
|
+
const origBgL = rgbToHsl(hexToRgb(bgHex)).l;
|
|
162
|
+
const fgDelta = fixedFg
|
|
163
|
+
? Math.abs(rgbToHsl(hexToRgb(fixedFg)).l - origFgL)
|
|
164
|
+
: Infinity;
|
|
165
|
+
// Add ripple bias for surface roles: only pick bg if it saves > 0.15 over fg
|
|
166
|
+
const bgBias = SURFACE_ROLES.has(bgRole) ? 0.15 : 0;
|
|
167
|
+
const bgDelta = fixedBg
|
|
168
|
+
? Math.abs(rgbToHsl(hexToRgb(fixedBg)).l - origBgL) + bgBias
|
|
169
|
+
: Infinity;
|
|
170
|
+
if (fgDelta <= bgDelta && fixedFg)
|
|
171
|
+
return { role: fgRole, original: fgHex, fixed: fixedFg };
|
|
172
|
+
if (fixedBg)
|
|
173
|
+
return { role: bgRole, original: bgHex, fixed: fixedBg };
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
// ─── Contrast Pairs ───────────────────────────────────────────────────────────
|
|
177
|
+
/** Semantic pairs to validate. Format: [fgRole, bgRole, minRatio, label] */
|
|
178
|
+
const CONTRAST_PAIRS = [
|
|
179
|
+
["foreground", "background", 4.5, "body text on background"],
|
|
180
|
+
["foreground", "card", 4.5, "text on card"],
|
|
181
|
+
["foreground", "muted", 4.5, "text on muted surface"],
|
|
182
|
+
["cardForeground", "card", 4.5, "card foreground on card"],
|
|
183
|
+
["mutedForeground", "background", 4.5, "muted text on background"],
|
|
184
|
+
["mutedForeground", "muted", 4.5, "muted text on muted bg"],
|
|
185
|
+
["mutedForeground", "card", 4.5, "muted text on card"],
|
|
186
|
+
["primaryForeground", "primary", 4.5, "primary button text"],
|
|
187
|
+
["secondaryForeground", "secondary", 4.5, "secondary button text"],
|
|
188
|
+
["accentForeground", "accent", 4.5, "accent text"],
|
|
189
|
+
["destructiveForeground", "destructive", 4.5, "destructive button text"],
|
|
190
|
+
["successForeground", "success", 4.5, "success state text"],
|
|
191
|
+
["warningForeground", "warning", 4.5, "warning state text"],
|
|
192
|
+
["popoverForeground", "popover", 4.5, "popover text"],
|
|
193
|
+
// UI component contrast (3:1)
|
|
194
|
+
["border", "background", 3.0, "border on background"],
|
|
195
|
+
["border", "card", 3.0, "border on card"],
|
|
196
|
+
["primary", "background", 3.0, "primary on background (focus / icon)"],
|
|
197
|
+
];
|
|
198
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
199
|
+
/**
|
|
200
|
+
* Check a resolved color set against all WCAG 2.2 AA contrast pairs.
|
|
201
|
+
* Returns an array of failures (empty = all pass).
|
|
202
|
+
*/
|
|
203
|
+
export function checkContrast(colors) {
|
|
204
|
+
const failures = [];
|
|
205
|
+
for (const [fgRole, bgRole, required, label] of CONTRAST_PAIRS) {
|
|
206
|
+
const fg = colors[fgRole];
|
|
207
|
+
const bg = colors[bgRole];
|
|
208
|
+
if (!fg || !bg || !isCheckableColor(fg) || !isCheckableColor(bg))
|
|
209
|
+
continue;
|
|
210
|
+
const ratio = contrastRatio(fg, bg);
|
|
211
|
+
if (ratio < required) {
|
|
212
|
+
failures.push({
|
|
213
|
+
fgRole,
|
|
214
|
+
bgRole,
|
|
215
|
+
fgHex: fg,
|
|
216
|
+
bgHex: bg,
|
|
217
|
+
ratio: Math.round(ratio * 100) / 100,
|
|
218
|
+
required,
|
|
219
|
+
label,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return failures;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Compute the minimum color fixes needed to make all failures pass.
|
|
227
|
+
* Returns overrides (role → fixedHex) and per-fix details for reporting.
|
|
228
|
+
*/
|
|
229
|
+
export function computeContrastFixes(failures, colors) {
|
|
230
|
+
const overrides = {};
|
|
231
|
+
const fixDetails = [];
|
|
232
|
+
for (const f of failures) {
|
|
233
|
+
const currentFg = overrides[f.fgRole] ?? colors[f.fgRole];
|
|
234
|
+
const currentBg = overrides[f.bgRole] ?? colors[f.bgRole];
|
|
235
|
+
// Already resolved by a previous fix in this batch
|
|
236
|
+
if (contrastRatio(currentFg, currentBg) >= f.required)
|
|
237
|
+
continue;
|
|
238
|
+
const fix = leastDisruptiveFix(f.fgRole, currentFg, f.bgRole, currentBg, f.required);
|
|
239
|
+
if (!fix)
|
|
240
|
+
continue;
|
|
241
|
+
overrides[fix.role] = fix.fixed;
|
|
242
|
+
const newFg = fix.role === f.fgRole ? fix.fixed : currentFg;
|
|
243
|
+
const newBg = fix.role === f.bgRole ? fix.fixed : currentBg;
|
|
244
|
+
fixDetails.push({
|
|
245
|
+
...fix,
|
|
246
|
+
fgRole: f.fgRole,
|
|
247
|
+
bgRole: f.bgRole,
|
|
248
|
+
ratioWas: f.ratio,
|
|
249
|
+
ratioNow: Math.round(contrastRatio(newFg, newBg) * 100) / 100,
|
|
250
|
+
label: f.label,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return { overrides, fixDetails };
|
|
254
|
+
}
|
|
255
|
+
// ─── Persistence ──────────────────────────────────────────────────────────────
|
|
256
|
+
/**
|
|
257
|
+
* Write (or merge) contrastOverrides into the project's .paintoliver.json.
|
|
258
|
+
* Returns the path that was written.
|
|
259
|
+
*/
|
|
260
|
+
export function writeContrastOverrides(projectPath, overrides) {
|
|
261
|
+
const configPath = path.join(path.resolve(projectPath), ".paintoliver.json");
|
|
262
|
+
let existing = {};
|
|
263
|
+
try {
|
|
264
|
+
existing = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// No config file yet — start fresh
|
|
268
|
+
}
|
|
269
|
+
fs.writeFileSync(configPath, JSON.stringify({ ...existing, contrastOverrides: overrides }, null, 2), "utf-8");
|
|
270
|
+
return configPath;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Remove the contrastOverrides block from .paintoliver.json.
|
|
274
|
+
* Returns the config path, or null if there was nothing to clear.
|
|
275
|
+
*/
|
|
276
|
+
export function clearContrastOverrides(projectPath) {
|
|
277
|
+
const configPath = path.join(path.resolve(projectPath), ".paintoliver.json");
|
|
278
|
+
let existing = null;
|
|
279
|
+
try {
|
|
280
|
+
existing = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
if (!existing?.contrastOverrides)
|
|
286
|
+
return null;
|
|
287
|
+
const { contrastOverrides: _, ...rest } = existing;
|
|
288
|
+
fs.writeFileSync(configPath, JSON.stringify(rest, null, 2), "utf-8");
|
|
289
|
+
return configPath;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Load contrastOverrides from the project's .paintoliver.json.
|
|
293
|
+
* Returns empty object if no config or no overrides block.
|
|
294
|
+
*/
|
|
295
|
+
export function loadContrastOverrides(projectPath) {
|
|
296
|
+
const configPath = path.join(path.resolve(projectPath), ".paintoliver.json");
|
|
297
|
+
try {
|
|
298
|
+
const data = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
299
|
+
if (data?.contrastOverrides && typeof data.contrastOverrides === "object") {
|
|
300
|
+
return data.contrastOverrides;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// No config
|
|
305
|
+
}
|
|
306
|
+
return {};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Resolve the final color map by merging base vibe colors with contrastOverrides.
|
|
310
|
+
*/
|
|
311
|
+
export function resolveColors(baseColors, contrastOverrides) {
|
|
312
|
+
return { ...baseColors, ...contrastOverrides };
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contrast/index.ts"],"names":[],"mappings":"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"}
|