@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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +408 -0
  3. package/dist/index.d.ts +8 -0
  4. package/dist/index.js +532 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/browser.d.ts +16 -0
  7. package/dist/lib/browser.js +27 -0
  8. package/dist/lib/browser.js.map +1 -0
  9. package/dist/lib/colors.d.ts +101 -0
  10. package/dist/lib/colors.js +405 -0
  11. package/dist/lib/colors.js.map +1 -0
  12. package/dist/lib/compare.d.ts +31 -0
  13. package/dist/lib/compare.js +46 -0
  14. package/dist/lib/compare.js.map +1 -0
  15. package/dist/lib/discovery.d.ts +31 -0
  16. package/dist/lib/discovery.js +243 -0
  17. package/dist/lib/discovery.js.map +1 -0
  18. package/dist/lib/drift.d.ts +64 -0
  19. package/dist/lib/drift.js +383 -0
  20. package/dist/lib/drift.js.map +1 -0
  21. package/dist/lib/dtcg/validate.d.ts +51 -0
  22. package/dist/lib/dtcg/validate.js +1403 -0
  23. package/dist/lib/dtcg/validate.js.map +1 -0
  24. package/dist/lib/exit-codes.d.ts +29 -0
  25. package/dist/lib/exit-codes.js +26 -0
  26. package/dist/lib/exit-codes.js.map +1 -0
  27. package/dist/lib/extractors/breakpoints.d.ts +5 -0
  28. package/dist/lib/extractors/breakpoints.js +450 -0
  29. package/dist/lib/extractors/breakpoints.js.map +1 -0
  30. package/dist/lib/extractors/colors.d.ts +2 -0
  31. package/dist/lib/extractors/colors.js +657 -0
  32. package/dist/lib/extractors/colors.js.map +1 -0
  33. package/dist/lib/extractors/components.d.ts +4 -0
  34. package/dist/lib/extractors/components.js +370 -0
  35. package/dist/lib/extractors/components.js.map +1 -0
  36. package/dist/lib/extractors/index.d.ts +9 -0
  37. package/dist/lib/extractors/index.js +1257 -0
  38. package/dist/lib/extractors/index.js.map +1 -0
  39. package/dist/lib/extractors/logo.d.ts +2 -0
  40. package/dist/lib/extractors/logo.js +626 -0
  41. package/dist/lib/extractors/logo.js.map +1 -0
  42. package/dist/lib/extractors/spacing.d.ts +4 -0
  43. package/dist/lib/extractors/spacing.js +163 -0
  44. package/dist/lib/extractors/spacing.js.map +1 -0
  45. package/dist/lib/extractors/teach.d.ts +1 -0
  46. package/dist/lib/extractors/teach.js +66 -0
  47. package/dist/lib/extractors/teach.js.map +1 -0
  48. package/dist/lib/extractors/typography.d.ts +1 -0
  49. package/dist/lib/extractors/typography.js +163 -0
  50. package/dist/lib/extractors/typography.js.map +1 -0
  51. package/dist/lib/findings.d.ts +34 -0
  52. package/dist/lib/findings.js +166 -0
  53. package/dist/lib/findings.js.map +1 -0
  54. package/dist/lib/formatters/dtcg.d.ts +10 -0
  55. package/dist/lib/formatters/dtcg.js +416 -0
  56. package/dist/lib/formatters/dtcg.js.map +1 -0
  57. package/dist/lib/formatters/html.d.ts +25 -0
  58. package/dist/lib/formatters/html.js +479 -0
  59. package/dist/lib/formatters/html.js.map +1 -0
  60. package/dist/lib/formatters/markdown.d.ts +5 -0
  61. package/dist/lib/formatters/markdown.js +568 -0
  62. package/dist/lib/formatters/markdown.js.map +1 -0
  63. package/dist/lib/formatters/pdf.d.ts +12 -0
  64. package/dist/lib/formatters/pdf.js +1121 -0
  65. package/dist/lib/formatters/pdf.js.map +1 -0
  66. package/dist/lib/formatters/terminal.d.ts +6 -0
  67. package/dist/lib/formatters/terminal.js +954 -0
  68. package/dist/lib/formatters/terminal.js.map +1 -0
  69. package/dist/lib/formatters/theme.d.ts +35 -0
  70. package/dist/lib/formatters/theme.js +37 -0
  71. package/dist/lib/formatters/theme.js.map +1 -0
  72. package/dist/lib/merger.d.ts +14 -0
  73. package/dist/lib/merger.js +362 -0
  74. package/dist/lib/merger.js.map +1 -0
  75. package/dist/lib/normalize.d.ts +29 -0
  76. package/dist/lib/normalize.js +59 -0
  77. package/dist/lib/normalize.js.map +1 -0
  78. package/dist/lib/robots.d.ts +12 -0
  79. package/dist/lib/robots.js +110 -0
  80. package/dist/lib/robots.js.map +1 -0
  81. package/dist/lib/run-summary.d.ts +40 -0
  82. package/dist/lib/run-summary.js +64 -0
  83. package/dist/lib/run-summary.js.map +1 -0
  84. package/dist/lib/types.d.ts +329 -0
  85. package/dist/lib/types.js +7 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/dist/lib/version.d.ts +134 -0
  88. package/dist/lib/version.js +153 -0
  89. package/dist/lib/version.js.map +1 -0
  90. package/dist/mcp-server.d.ts +11 -0
  91. package/dist/mcp-server.js +311 -0
  92. package/dist/mcp-server.js.map +1 -0
  93. package/dist/package.json +106 -0
  94. package/dist/test/_vitest-shim.d.ts +13 -0
  95. package/dist/test/_vitest-shim.js +23 -0
  96. package/dist/test/_vitest-shim.js.map +1 -0
  97. package/dist/test/cli.test.d.ts +1 -0
  98. package/dist/test/cli.test.js +24 -0
  99. package/dist/test/cli.test.js.map +1 -0
  100. package/dist/test/colors.test.d.ts +1 -0
  101. package/dist/test/colors.test.js +64 -0
  102. package/dist/test/colors.test.js.map +1 -0
  103. package/dist/test/compare.test.d.ts +1 -0
  104. package/dist/test/compare.test.js +57 -0
  105. package/dist/test/compare.test.js.map +1 -0
  106. package/dist/test/drift.test.d.ts +1 -0
  107. package/dist/test/drift.test.js +53 -0
  108. package/dist/test/drift.test.js.map +1 -0
  109. package/dist/test/dtcg-formatter.test.d.ts +1 -0
  110. package/dist/test/dtcg-formatter.test.js +48 -0
  111. package/dist/test/dtcg-formatter.test.js.map +1 -0
  112. package/dist/test/dtcg-validate.test.d.ts +1 -0
  113. package/dist/test/dtcg-validate.test.js +2129 -0
  114. package/dist/test/dtcg-validate.test.js.map +1 -0
  115. package/dist/test/exit-codes.test.d.ts +1 -0
  116. package/dist/test/exit-codes.test.js +53 -0
  117. package/dist/test/exit-codes.test.js.map +1 -0
  118. package/dist/test/findings.test.d.ts +1 -0
  119. package/dist/test/findings.test.js +77 -0
  120. package/dist/test/findings.test.js.map +1 -0
  121. package/dist/test/html.test.d.ts +1 -0
  122. package/dist/test/html.test.js +95 -0
  123. package/dist/test/html.test.js.map +1 -0
  124. package/dist/test/markdown.test.d.ts +1 -0
  125. package/dist/test/markdown.test.js +145 -0
  126. package/dist/test/markdown.test.js.map +1 -0
  127. package/dist/test/merger.test.d.ts +1 -0
  128. package/dist/test/merger.test.js +98 -0
  129. package/dist/test/merger.test.js.map +1 -0
  130. package/dist/test/normalize.test.d.ts +1 -0
  131. package/dist/test/normalize.test.js +47 -0
  132. package/dist/test/normalize.test.js.map +1 -0
  133. package/dist/test/run-summary.test.d.ts +1 -0
  134. package/dist/test/run-summary.test.js +45 -0
  135. package/dist/test/run-summary.test.js.map +1 -0
  136. package/dist/test/version.test.d.ts +1 -0
  137. package/dist/test/version.test.js +73 -0
  138. package/dist/test/version.test.js.map +1 -0
  139. package/package.json +106 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Color Conversion Utilities
3
+ *
4
+ * Converts colors between RGB, LCH, and OKLCH color spaces.
5
+ */
6
+ /**
7
+ * Convert RGB to LCH
8
+ * @param {number} r - Red (0-255)
9
+ * @param {number} g - Green (0-255)
10
+ * @param {number} b - Blue (0-255)
11
+ * @returns {{ l: number, c: number, h: number }}
12
+ */
13
+ export declare function rgbToLch(r: any, g: any, b: any): {
14
+ l: any;
15
+ c: number;
16
+ h: number;
17
+ };
18
+ /**
19
+ * Convert RGB to OKLCH
20
+ * @param {number} r - Red (0-255)
21
+ * @param {number} g - Green (0-255)
22
+ * @param {number} b - Blue (0-255)
23
+ * @returns {{ l: number, c: number, h: number }}
24
+ */
25
+ export declare function rgbToOklch(r: any, g: any, b: any): {
26
+ l: any;
27
+ c: number;
28
+ h: number;
29
+ };
30
+ /**
31
+ * Format LCH values as CSS lch() string
32
+ * @param {{ l: number, c: number, h: number }} lch
33
+ * @param {number} [alpha] - Optional alpha value (0-1)
34
+ * @returns {string}
35
+ */
36
+ export declare function formatLch(lch: any, alpha: any): string;
37
+ /**
38
+ * Format OKLCH values as CSS oklch() string
39
+ * @param {{ l: number, c: number, h: number }} oklch
40
+ * @param {number} [alpha] - Optional alpha value (0-1)
41
+ * @returns {string}
42
+ */
43
+ export declare function formatOklch(oklch: any, alpha: any): string;
44
+ /**
45
+ * Compute CIE76 delta-E perceptual distance between two hex colors.
46
+ * Returns 0 for identical colors, ~100 for maximally different.
47
+ * @param {string} hex1 - Hex color string (e.g. "#ff0000")
48
+ * @param {string} hex2 - Hex color string
49
+ * @returns {number}
50
+ */
51
+ export declare function deltaE(hex1: any, hex2: any): number;
52
+ /**
53
+ * Perceptual color distance using CIEDE2000 — the accurate successor to the
54
+ * CIE76 Euclidean distance in deltaE(). Accepts hex or rgb()/rgba() strings.
55
+ * Returns 0 for identical inputs and 100 when either color cannot be parsed.
56
+ * A just-noticeable difference is ~2.3.
57
+ * @param {string} c1
58
+ * @param {string} c2
59
+ * @returns {number}
60
+ */
61
+ export declare function deltaE2000(c1: any, c2: any): number;
62
+ /**
63
+ * Parse a hex color string and return RGB values
64
+ * @param {string} hex - Hex color (#fff, #ffffff, #ffffffaa)
65
+ * @returns {{ r: number, g: number, b: number, a?: number } | null}
66
+ */
67
+ export declare function hexToRgb(hex: any): {
68
+ r: number;
69
+ g: number;
70
+ b: number;
71
+ a?: undefined;
72
+ } | {
73
+ r: number;
74
+ g: number;
75
+ b: number;
76
+ a: number;
77
+ };
78
+ /**
79
+ * Compute WCAG 2.1 relative luminance for a hex color.
80
+ * @param {string} hex
81
+ * @returns {number|null}
82
+ */
83
+ export declare function relativeLuminance(hex: any): number;
84
+ /**
85
+ * Compute WCAG contrast ratios for all pairs in a color palette.
86
+ * @param {Array<{color: string, normalized: string, confidence: string}>} palette
87
+ * @returns {Array<{fg: string, bg: string, ratio: number, aa: boolean, aaLarge: boolean, aaa: boolean}>}
88
+ */
89
+ export declare function computeWcag(palette: any): any[];
90
+ /**
91
+ * Convert any supported color format to all formats
92
+ * @param {string} colorString - Color in hex, rgb(), or rgba() format
93
+ * @returns {{ hex: string, rgb: string, lch: string, oklch: string, hasAlpha: boolean } | null}
94
+ */
95
+ export declare function convertColor(colorString: any): {
96
+ hex: string;
97
+ rgb: string;
98
+ lch: string;
99
+ oklch: string;
100
+ hasAlpha: boolean;
101
+ };
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Color Conversion Utilities
3
+ *
4
+ * Converts colors between RGB, LCH, and OKLCH color spaces.
5
+ */
6
+ /**
7
+ * Convert sRGB to linear RGB
8
+ */
9
+ function srgbToLinear(c) {
10
+ c = c / 255;
11
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
12
+ }
13
+ /**
14
+ * Convert linear RGB to XYZ (D65 illuminant)
15
+ */
16
+ function linearRgbToXyz(r, g, b) {
17
+ return {
18
+ x: 0.4124564 * r + 0.3575761 * g + 0.1804375 * b,
19
+ y: 0.2126729 * r + 0.7151522 * g + 0.0721750 * b,
20
+ z: 0.0193339 * r + 0.1191920 * g + 0.9503041 * b
21
+ };
22
+ }
23
+ /**
24
+ * Convert XYZ to Lab (D65 reference white)
25
+ */
26
+ function xyzToLab(x, y, z) {
27
+ // D65 reference white
28
+ const xn = 0.95047;
29
+ const yn = 1.00000;
30
+ const zn = 1.08883;
31
+ const f = (t) => t > 0.008856 ? Math.cbrt(t) : (903.3 * t + 16) / 116;
32
+ const fx = f(x / xn);
33
+ const fy = f(y / yn);
34
+ const fz = f(z / zn);
35
+ return {
36
+ l: 116 * fy - 16,
37
+ a: 500 * (fx - fy),
38
+ b: 200 * (fy - fz)
39
+ };
40
+ }
41
+ /**
42
+ * Convert Lab to LCH
43
+ */
44
+ function labToLch(l, a, b) {
45
+ const c = Math.sqrt(a * a + b * b);
46
+ let h = Math.atan2(b, a) * (180 / Math.PI);
47
+ if (h < 0)
48
+ h += 360;
49
+ return {
50
+ l: l,
51
+ c: c,
52
+ h: h
53
+ };
54
+ }
55
+ /**
56
+ * Convert RGB to LCH
57
+ * @param {number} r - Red (0-255)
58
+ * @param {number} g - Green (0-255)
59
+ * @param {number} b - Blue (0-255)
60
+ * @returns {{ l: number, c: number, h: number }}
61
+ */
62
+ export function rgbToLch(r, g, b) {
63
+ const lr = srgbToLinear(r);
64
+ const lg = srgbToLinear(g);
65
+ const lb = srgbToLinear(b);
66
+ const xyz = linearRgbToXyz(lr, lg, lb);
67
+ const lab = xyzToLab(xyz.x, xyz.y, xyz.z);
68
+ return labToLch(lab.l, lab.a, lab.b);
69
+ }
70
+ /**
71
+ * Convert linear RGB to OKLab
72
+ * Uses the OKLab color space for perceptual uniformity
73
+ */
74
+ function linearRgbToOklab(r, g, b) {
75
+ const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
76
+ const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
77
+ const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
78
+ return {
79
+ L: 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
80
+ a: 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
81
+ b: 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s
82
+ };
83
+ }
84
+ /**
85
+ * Convert OKLab to OKLCH
86
+ */
87
+ function oklabToOklch(L, a, b) {
88
+ const c = Math.sqrt(a * a + b * b);
89
+ let h = Math.atan2(b, a) * (180 / Math.PI);
90
+ if (h < 0)
91
+ h += 360;
92
+ return {
93
+ l: L,
94
+ c: c,
95
+ h: h
96
+ };
97
+ }
98
+ /**
99
+ * Convert RGB to OKLCH
100
+ * @param {number} r - Red (0-255)
101
+ * @param {number} g - Green (0-255)
102
+ * @param {number} b - Blue (0-255)
103
+ * @returns {{ l: number, c: number, h: number }}
104
+ */
105
+ export function rgbToOklch(r, g, b) {
106
+ const lr = srgbToLinear(r);
107
+ const lg = srgbToLinear(g);
108
+ const lb = srgbToLinear(b);
109
+ const oklab = linearRgbToOklab(lr, lg, lb);
110
+ return oklabToOklch(oklab.L, oklab.a, oklab.b);
111
+ }
112
+ /**
113
+ * Format LCH values as CSS lch() string
114
+ * @param {{ l: number, c: number, h: number }} lch
115
+ * @param {number} [alpha] - Optional alpha value (0-1)
116
+ * @returns {string}
117
+ */
118
+ export function formatLch(lch, alpha) {
119
+ const l = Math.round(lch.l * 100) / 100;
120
+ const c = Math.round(lch.c * 100) / 100;
121
+ const h = Math.round(lch.h * 100) / 100;
122
+ if (alpha !== undefined && alpha < 1) {
123
+ return `lch(${l}% ${c} ${h} / ${alpha})`;
124
+ }
125
+ return `lch(${l}% ${c} ${h})`;
126
+ }
127
+ /**
128
+ * Format OKLCH values as CSS oklch() string
129
+ * @param {{ l: number, c: number, h: number }} oklch
130
+ * @param {number} [alpha] - Optional alpha value (0-1)
131
+ * @returns {string}
132
+ */
133
+ export function formatOklch(oklch, alpha) {
134
+ // OKLCH lightness is 0-1, displayed as percentage
135
+ const l = Math.round(oklch.l * 10000) / 100;
136
+ const c = Math.round(oklch.c * 1000) / 1000;
137
+ const h = Math.round(oklch.h * 100) / 100;
138
+ if (alpha !== undefined && alpha < 1) {
139
+ return `oklch(${l}% ${c} ${h} / ${alpha})`;
140
+ }
141
+ return `oklch(${l}% ${c} ${h})`;
142
+ }
143
+ /**
144
+ * Compute CIE76 delta-E perceptual distance between two hex colors.
145
+ * Returns 0 for identical colors, ~100 for maximally different.
146
+ * @param {string} hex1 - Hex color string (e.g. "#ff0000")
147
+ * @param {string} hex2 - Hex color string
148
+ * @returns {number}
149
+ */
150
+ export function deltaE(hex1, hex2) {
151
+ function toLab(hex) {
152
+ const rgb = hexToRgb(hex);
153
+ if (!rgb)
154
+ return null;
155
+ const lr = srgbToLinear(rgb.r);
156
+ const lg = srgbToLinear(rgb.g);
157
+ const lb = srgbToLinear(rgb.b);
158
+ const xyz = linearRgbToXyz(lr, lg, lb);
159
+ return xyzToLab(xyz.x, xyz.y, xyz.z);
160
+ }
161
+ const lab1 = toLab(hex1);
162
+ const lab2 = toLab(hex2);
163
+ if (!lab1 || !lab2)
164
+ return 999;
165
+ return Math.sqrt(Math.pow(lab1.l - lab2.l, 2) +
166
+ Math.pow(lab1.a - lab2.a, 2) +
167
+ Math.pow(lab1.b - lab2.b, 2));
168
+ }
169
+ /**
170
+ * Perceptual color distance using CIEDE2000 — the accurate successor to the
171
+ * CIE76 Euclidean distance in deltaE(). Accepts hex or rgb()/rgba() strings.
172
+ * Returns 0 for identical inputs and 100 when either color cannot be parsed.
173
+ * A just-noticeable difference is ~2.3.
174
+ * @param {string} c1
175
+ * @param {string} c2
176
+ * @returns {number}
177
+ */
178
+ export function deltaE2000(c1, c2) {
179
+ if (c1 === c2)
180
+ return 0;
181
+ const lab1 = toLabFlexible(c1);
182
+ const lab2 = toLabFlexible(c2);
183
+ if (!lab1 || !lab2)
184
+ return 100;
185
+ return ciede2000(lab1, lab2);
186
+ }
187
+ function toLabFlexible(input) {
188
+ let rgb = hexToRgb(input);
189
+ if (!rgb) {
190
+ const m = String(input).match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i);
191
+ if (m)
192
+ rgb = { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) };
193
+ }
194
+ if (!rgb)
195
+ return null;
196
+ const xyz = linearRgbToXyz(srgbToLinear(rgb.r), srgbToLinear(rgb.g), srgbToLinear(rgb.b));
197
+ return xyzToLab(xyz.x, xyz.y, xyz.z); // { l, a, b }
198
+ }
199
+ function ciede2000(lab1, lab2) {
200
+ const rad = (deg) => (deg * Math.PI) / 180;
201
+ const deg = (r) => (r * 180) / Math.PI;
202
+ const { l: L1, a: a1, b: b1 } = lab1;
203
+ const { l: L2, a: a2, b: b2 } = lab2;
204
+ const C1 = Math.sqrt(a1 ** 2 + b1 ** 2);
205
+ const C2 = Math.sqrt(a2 ** 2 + b2 ** 2);
206
+ const Cab = (C1 + C2) / 2;
207
+ const Cab7 = Cab ** 7;
208
+ const G = 0.5 * (1 - Math.sqrt(Cab7 / (Cab7 + 25 ** 7)));
209
+ const a1p = a1 * (1 + G);
210
+ const a2p = a2 * (1 + G);
211
+ const C1p = Math.sqrt(a1p ** 2 + b1 ** 2);
212
+ const C2p = Math.sqrt(a2p ** 2 + b2 ** 2);
213
+ let h1p = deg(Math.atan2(b1, a1p));
214
+ if (h1p < 0)
215
+ h1p += 360;
216
+ let h2p = deg(Math.atan2(b2, a2p));
217
+ if (h2p < 0)
218
+ h2p += 360;
219
+ const dLp = L2 - L1;
220
+ const dCp = C2p - C1p;
221
+ let dhp;
222
+ if (C1p * C2p === 0)
223
+ dhp = 0;
224
+ else if (Math.abs(h2p - h1p) <= 180)
225
+ dhp = h2p - h1p;
226
+ else if (h2p - h1p > 180)
227
+ dhp = h2p - h1p - 360;
228
+ else
229
+ dhp = h2p - h1p + 360;
230
+ const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(rad(dhp / 2));
231
+ const Lpm = (L1 + L2) / 2;
232
+ const Cpm = (C1p + C2p) / 2;
233
+ let hpm;
234
+ if (C1p * C2p === 0)
235
+ hpm = h1p + h2p;
236
+ else if (Math.abs(h1p - h2p) <= 180)
237
+ hpm = (h1p + h2p) / 2;
238
+ else if (h1p + h2p < 360)
239
+ hpm = (h1p + h2p + 360) / 2;
240
+ else
241
+ hpm = (h1p + h2p - 360) / 2;
242
+ const T = 1
243
+ - 0.17 * Math.cos(rad(hpm - 30))
244
+ + 0.24 * Math.cos(rad(2 * hpm))
245
+ + 0.32 * Math.cos(rad(3 * hpm + 6))
246
+ - 0.20 * Math.cos(rad(4 * hpm - 63));
247
+ const SL = 1 + 0.015 * (Lpm - 50) ** 2 / Math.sqrt(20 + (Lpm - 50) ** 2);
248
+ const SC = 1 + 0.045 * Cpm;
249
+ const SH = 1 + 0.015 * Cpm * T;
250
+ const Cpm7 = Cpm ** 7;
251
+ const RC = 2 * Math.sqrt(Cpm7 / (Cpm7 + 25 ** 7));
252
+ const dTheta = 30 * Math.exp(-(((hpm - 275) / 25) ** 2));
253
+ const RT = -Math.sin(rad(2 * dTheta)) * RC;
254
+ return Math.sqrt((dLp / SL) ** 2 +
255
+ (dCp / SC) ** 2 +
256
+ (dHp / SH) ** 2 +
257
+ RT * (dCp / SC) * (dHp / SH));
258
+ }
259
+ /**
260
+ * Parse a hex color string and return RGB values
261
+ * @param {string} hex - Hex color (#fff, #ffffff, #ffffffaa)
262
+ * @returns {{ r: number, g: number, b: number, a?: number } | null}
263
+ */
264
+ export function hexToRgb(hex) {
265
+ if (!hex || !hex.startsWith('#'))
266
+ return null;
267
+ // Remove #
268
+ hex = hex.slice(1);
269
+ // Handle 3-digit hex
270
+ if (hex.length === 3) {
271
+ return {
272
+ r: parseInt(hex[0] + hex[0], 16),
273
+ g: parseInt(hex[1] + hex[1], 16),
274
+ b: parseInt(hex[2] + hex[2], 16)
275
+ };
276
+ }
277
+ // Handle 6-digit hex
278
+ if (hex.length === 6) {
279
+ return {
280
+ r: parseInt(hex.slice(0, 2), 16),
281
+ g: parseInt(hex.slice(2, 4), 16),
282
+ b: parseInt(hex.slice(4, 6), 16)
283
+ };
284
+ }
285
+ // Handle 8-digit hex (with alpha)
286
+ if (hex.length === 8) {
287
+ return {
288
+ r: parseInt(hex.slice(0, 2), 16),
289
+ g: parseInt(hex.slice(2, 4), 16),
290
+ b: parseInt(hex.slice(4, 6), 16),
291
+ a: parseInt(hex.slice(6, 8), 16) / 255
292
+ };
293
+ }
294
+ return null;
295
+ }
296
+ /**
297
+ * Compute WCAG 2.1 relative luminance for a hex color.
298
+ * @param {string} hex
299
+ * @returns {number|null}
300
+ */
301
+ export function relativeLuminance(hex) {
302
+ const rgb = hexToRgb(hex);
303
+ if (!rgb)
304
+ return null;
305
+ return 0.2126 * srgbToLinear(rgb.r) + 0.7152 * srgbToLinear(rgb.g) + 0.0722 * srgbToLinear(rgb.b);
306
+ }
307
+ /**
308
+ * Compute WCAG contrast ratios for all pairs in a color palette.
309
+ * @param {Array<{color: string, normalized: string, confidence: string}>} palette
310
+ * @returns {Array<{fg: string, bg: string, ratio: number, aa: boolean, aaLarge: boolean, aaa: boolean}>}
311
+ */
312
+ export function computeWcag(palette) {
313
+ const colors = palette
314
+ .filter(c => c.normalized && c.normalized.startsWith('#'))
315
+ .slice(0, 10);
316
+ const pairs = [];
317
+ for (let i = 0; i < colors.length; i++) {
318
+ for (let j = i + 1; j < colors.length; j++) {
319
+ const l1 = relativeLuminance(colors[i].normalized);
320
+ const l2 = relativeLuminance(colors[j].normalized);
321
+ if (l1 === null || l2 === null)
322
+ continue;
323
+ const lighter = Math.max(l1, l2);
324
+ const darker = Math.min(l1, l2);
325
+ const ratio = (lighter + 0.05) / (darker + 0.05);
326
+ const fg = l1 >= l2 ? colors[i].normalized : colors[j].normalized;
327
+ const bg = l1 >= l2 ? colors[j].normalized : colors[i].normalized;
328
+ pairs.push({
329
+ fg,
330
+ bg,
331
+ ratio: Math.round(ratio * 100) / 100,
332
+ aa: ratio >= 4.5,
333
+ aaLarge: ratio >= 3,
334
+ aaa: ratio >= 7,
335
+ });
336
+ }
337
+ }
338
+ return pairs.sort((a, b) => b.ratio - a.ratio);
339
+ }
340
+ /**
341
+ * Convert any supported color format to all formats
342
+ * @param {string} colorString - Color in hex, rgb(), or rgba() format
343
+ * @returns {{ hex: string, rgb: string, lch: string, oklch: string, hasAlpha: boolean } | null}
344
+ */
345
+ export function convertColor(colorString) {
346
+ let r, g, b, a;
347
+ // Parse rgba/rgb
348
+ const rgbaMatch = colorString.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);
349
+ if (rgbaMatch) {
350
+ r = parseInt(rgbaMatch[1]);
351
+ g = parseInt(rgbaMatch[2]);
352
+ b = parseInt(rgbaMatch[3]);
353
+ a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : undefined;
354
+ }
355
+ else if (/^hsla?\(/.test(colorString)) {
356
+ // Parse hsl/hsla
357
+ const hslMatch = colorString.match(/hsla?\(([\d.]+),\s*([\d.]+)%?,\s*([\d.]+)%?(?:,\s*([\d.]+))?\)/);
358
+ if (!hslMatch)
359
+ return null;
360
+ const h = parseFloat(hslMatch[1]) / 360;
361
+ const s = parseFloat(hslMatch[2]) / 100;
362
+ const l = parseFloat(hslMatch[3]) / 100;
363
+ a = hslMatch[4] ? parseFloat(hslMatch[4]) : undefined;
364
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
365
+ const p = 2 * l - q;
366
+ const hue2rgb = (p, q, t) => {
367
+ if (t < 0)
368
+ t += 1;
369
+ if (t > 1)
370
+ t -= 1;
371
+ if (t < 1 / 6)
372
+ return p + (q - p) * 6 * t;
373
+ if (t < 1 / 2)
374
+ return q;
375
+ if (t < 2 / 3)
376
+ return p + (q - p) * (2 / 3 - t) * 6;
377
+ return p;
378
+ };
379
+ r = Math.round(hue2rgb(p, q, h + 1 / 3) * 255);
380
+ g = Math.round(hue2rgb(p, q, h) * 255);
381
+ b = Math.round(hue2rgb(p, q, h - 1 / 3) * 255);
382
+ }
383
+ else {
384
+ // Try hex
385
+ const rgb = hexToRgb(colorString);
386
+ if (!rgb)
387
+ return null;
388
+ r = rgb.r;
389
+ g = rgb.g;
390
+ b = rgb.b;
391
+ a = rgb.a;
392
+ }
393
+ const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
394
+ const rgbStr = a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;
395
+ const lchValues = rgbToLch(r, g, b);
396
+ const oklchValues = rgbToOklch(r, g, b);
397
+ return {
398
+ hex: hex.toLowerCase(),
399
+ rgb: rgbStr,
400
+ lch: formatLch(lchValues, a),
401
+ oklch: formatOklch(oklchValues, a),
402
+ hasAlpha: a !== undefined && a < 1
403
+ };
404
+ }
405
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../lib/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * --compare dispatch. The argument is either:
3
+ * - a local file → diff against it here (free, offline, deterministic)
4
+ * - a baseline id → POST the candidate to the Dembrandt App, which stores
5
+ * baselines and runs the same engine server-side
6
+ *
7
+ * Same flag, two backends — the local path is the free wedge; the id path is the
8
+ * App platform (dembrandt-next/app). Both call the one canonical drift engine.
9
+ *
10
+ * Dependencies are injectable so the dispatch is unit-testable without a real
11
+ * filesystem or network.
12
+ */
13
+ import type { BrandingResult } from "./types.js";
14
+ import type { DriftReport } from "./drift.js";
15
+ export interface CompareResult {
16
+ report: DriftReport;
17
+ /** Human label for where the baseline came from (file path or "<api> #<id>"). */
18
+ source: string;
19
+ /** "local" file diff or "platform" App diff. */
20
+ mode: "local" | "platform";
21
+ }
22
+ export interface CompareDeps {
23
+ isFile?: (p: string) => boolean;
24
+ readFile?: (p: string, enc: "utf-8") => string;
25
+ fetchFn?: typeof fetch;
26
+ /** App base URL. Caller passes the `.dembrandtrc` `endpoint`; default is the
27
+ * production App at https://dembrandt.com. */
28
+ api?: string;
29
+ }
30
+ /** Resolve a `--compare <arg>` into a drift report, dispatching on file vs id. */
31
+ export declare function resolveCompare(arg: string, candidate: BrandingResult, deps?: CompareDeps): Promise<CompareResult>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * --compare dispatch. The argument is either:
3
+ * - a local file → diff against it here (free, offline, deterministic)
4
+ * - a baseline id → POST the candidate to the Dembrandt App, which stores
5
+ * baselines and runs the same engine server-side
6
+ *
7
+ * Same flag, two backends — the local path is the free wedge; the id path is the
8
+ * App platform (dembrandt-next/app). Both call the one canonical drift engine.
9
+ *
10
+ * Dependencies are injectable so the dispatch is unit-testable without a real
11
+ * filesystem or network.
12
+ */
13
+ import { existsSync, readFileSync } from "fs";
14
+ import { computeDrift } from "./drift.js";
15
+ /** Resolve a `--compare <arg>` into a drift report, dispatching on file vs id. */
16
+ export async function resolveCompare(arg, candidate, deps = {}) {
17
+ const isFile = deps.isFile ?? existsSync;
18
+ const readFile = deps.readFile ?? readFileSync;
19
+ if (isFile(arg)) {
20
+ const baseline = JSON.parse(readFile(arg, "utf-8"));
21
+ return { report: computeDrift(baseline, candidate), source: arg, mode: "local" };
22
+ }
23
+ // Not a local file → treat as a platform baseline id.
24
+ const fetchFn = deps.fetchFn ?? fetch;
25
+ const api = (deps.api ?? "https://dembrandt.com").replace(/\/$/, "");
26
+ const res = await fetchFn(`${api}/api/app/drift`, {
27
+ method: "POST",
28
+ headers: { "content-type": "application/json" },
29
+ body: JSON.stringify({ baselineId: arg, candidate }),
30
+ });
31
+ if (!res.ok) {
32
+ let detail = res.statusText;
33
+ try {
34
+ const e = (await res.json());
35
+ if (e?.error)
36
+ detail = e.error;
37
+ }
38
+ catch {
39
+ /* non-JSON error body */
40
+ }
41
+ throw new Error(`platform compare failed (${res.status}): ${detail}`);
42
+ }
43
+ const data = (await res.json());
44
+ return { report: data.drift, source: `${api} #${arg}`, mode: "platform" };
45
+ }
46
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../lib/compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB1C,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,SAAyB,EACzB,OAAoB,EAAE;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAK,YAAoD,CAAC;IAExF,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAmB,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnF,CAAC;IAED,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,gBAAgB,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;YACnD,IAAI,CAAC,EAAE,KAAK;gBAAE,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC1D,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Page Discovery
3
+ *
4
+ * Discovers internal pages from a starting URL via DOM link extraction
5
+ * or sitemap.xml parsing.
6
+ */
7
+ /**
8
+ * Score a URL path for importance (higher = more important).
9
+ * Prioritizes shallow, navigational paths over blog posts / legal pages.
10
+ */
11
+ export declare function scoreUrl(pathname: any): number;
12
+ /**
13
+ * Discover internal links from an already-loaded Playwright page.
14
+ * Call after extractBranding() has loaded and scrolled the page.
15
+ *
16
+ * @param {import('playwright-core').Page} page
17
+ * @param {string} baseUrl - The starting URL (used to determine same-origin)
18
+ * @param {number} maxPages - Maximum number of URLs to return
19
+ * @returns {Promise<string[]>} Ordered list of URLs to crawl (excluding homepage)
20
+ */
21
+ export declare function discoverLinks(page: any, baseUrl: any, maxPages: any): Promise<any>;
22
+ /**
23
+ * Discover pages from a site's sitemap.xml.
24
+ * Checks robots.txt for Sitemap directives, then tries common paths.
25
+ * Follows sitemapindex references one level deep.
26
+ *
27
+ * @param {string} baseUrl - The starting URL (should be post-redirect)
28
+ * @param {number} maxPages - Maximum number of URLs to return
29
+ * @returns {Promise<string[]>} List of URLs from sitemap (excluding homepage)
30
+ */
31
+ export declare function parseSitemap(baseUrl: any, maxPages: any): Promise<any[]>;