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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/analyzer/index.d.ts +20 -0
  4. package/dist/analyzer/index.d.ts.map +1 -0
  5. package/dist/analyzer/index.js +387 -0
  6. package/dist/analyzer/index.js.map +1 -0
  7. package/dist/cli.d.ts +26 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +436 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/contrast/index.d.ts +88 -0
  12. package/dist/contrast/index.d.ts.map +1 -0
  13. package/dist/contrast/index.js +314 -0
  14. package/dist/contrast/index.js.map +1 -0
  15. package/dist/paintoliver.bundle.js +14530 -0
  16. package/dist/reporter/index.d.ts +43 -0
  17. package/dist/reporter/index.d.ts.map +1 -0
  18. package/dist/reporter/index.js +235 -0
  19. package/dist/reporter/index.js.map +1 -0
  20. package/dist/transformer/css-var-transformer.d.ts +46 -0
  21. package/dist/transformer/css-var-transformer.d.ts.map +1 -0
  22. package/dist/transformer/css-var-transformer.js +422 -0
  23. package/dist/transformer/css-var-transformer.js.map +1 -0
  24. package/dist/transformer/index.d.ts +17 -0
  25. package/dist/transformer/index.d.ts.map +1 -0
  26. package/dist/transformer/index.js +213 -0
  27. package/dist/transformer/index.js.map +1 -0
  28. package/dist/transformer/tailwind-transformer.d.ts +47 -0
  29. package/dist/transformer/tailwind-transformer.d.ts.map +1 -0
  30. package/dist/transformer/tailwind-transformer.js +402 -0
  31. package/dist/transformer/tailwind-transformer.js.map +1 -0
  32. package/dist/utils/backup.d.ts +41 -0
  33. package/dist/utils/backup.d.ts.map +1 -0
  34. package/dist/utils/backup.js +125 -0
  35. package/dist/utils/backup.js.map +1 -0
  36. package/dist/vibes/definitions/brutalist.d.ts +11 -0
  37. package/dist/vibes/definitions/brutalist.d.ts.map +1 -0
  38. package/dist/vibes/definitions/brutalist.js +203 -0
  39. package/dist/vibes/definitions/brutalist.js.map +1 -0
  40. package/dist/vibes/definitions/corporate.d.ts +12 -0
  41. package/dist/vibes/definitions/corporate.d.ts.map +1 -0
  42. package/dist/vibes/definitions/corporate.js +212 -0
  43. package/dist/vibes/definitions/corporate.js.map +1 -0
  44. package/dist/vibes/definitions/glassmorphism.d.ts +20 -0
  45. package/dist/vibes/definitions/glassmorphism.d.ts.map +1 -0
  46. package/dist/vibes/definitions/glassmorphism.js +217 -0
  47. package/dist/vibes/definitions/glassmorphism.js.map +1 -0
  48. package/dist/vibes/definitions/kinetic-terminal.d.ts +20 -0
  49. package/dist/vibes/definitions/kinetic-terminal.d.ts.map +1 -0
  50. package/dist/vibes/definitions/kinetic-terminal.js +242 -0
  51. package/dist/vibes/definitions/kinetic-terminal.js.map +1 -0
  52. package/dist/vibes/definitions/minimal.d.ts +11 -0
  53. package/dist/vibes/definitions/minimal.d.ts.map +1 -0
  54. package/dist/vibes/definitions/minimal.js +167 -0
  55. package/dist/vibes/definitions/minimal.js.map +1 -0
  56. package/dist/vibes/definitions/windows-xp.d.ts +12 -0
  57. package/dist/vibes/definitions/windows-xp.d.ts.map +1 -0
  58. package/dist/vibes/definitions/windows-xp.js +229 -0
  59. package/dist/vibes/definitions/windows-xp.js.map +1 -0
  60. package/dist/vibes/registry.d.ts +25 -0
  61. package/dist/vibes/registry.d.ts.map +1 -0
  62. package/dist/vibes/registry.js +52 -0
  63. package/dist/vibes/registry.js.map +1 -0
  64. package/dist/vibes/types.d.ts +428 -0
  65. package/dist/vibes/types.d.ts.map +1 -0
  66. package/dist/vibes/types.js +12 -0
  67. package/dist/vibes/types.js.map +1 -0
  68. 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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"}