@calibrate-ds/core 0.1.85 → 0.1.86
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/dist/config/config-schema.d.ts +2 -2
- package/dist/doctor/check-config.d.ts.map +1 -1
- package/dist/doctor/check-config.js +27 -0
- package/dist/doctor/check-config.js.map +1 -1
- package/dist/tokens/build-token-model.d.ts.map +1 -1
- package/dist/tokens/build-token-model.js +16 -0
- package/dist/tokens/build-token-model.js.map +1 -1
- package/dist/tokens/normalize-token-collections.d.ts.map +1 -1
- package/dist/tokens/normalize-token-collections.js +52 -17
- package/dist/tokens/normalize-token-collections.js.map +1 -1
- package/dist/verify/pixel-diff.d.ts.map +1 -1
- package/dist/verify/pixel-diff.js +51 -2
- package/dist/verify/pixel-diff.js.map +1 -1
- package/dist/verify/types.d.ts +10 -0
- package/dist/verify/types.d.ts.map +1 -1
- package/dist/verify/verdict.d.ts +8 -0
- package/dist/verify/verdict.d.ts.map +1 -1
- package/dist/verify/verdict.js +23 -0
- package/dist/verify/verdict.js.map +1 -1
- package/package.json +3 -3
|
@@ -57,9 +57,9 @@ export declare const AIConfigSchema: z.ZodPipe<z.ZodTransform<any, any>, z.ZodOb
|
|
|
57
57
|
}, z.core.$strip>>;
|
|
58
58
|
export declare const DocsConfigSchema: z.ZodObject<{
|
|
59
59
|
tool: z.ZodEnum<{
|
|
60
|
-
none: "none";
|
|
61
60
|
storybook: "storybook";
|
|
62
61
|
docusaurus: "docusaurus";
|
|
62
|
+
none: "none";
|
|
63
63
|
}>;
|
|
64
64
|
}, z.core.$strip>;
|
|
65
65
|
export declare const ScanConfigSchema: z.ZodObject<{
|
|
@@ -127,9 +127,9 @@ export declare const PTBConfigSchema: z.ZodPipe<z.ZodTransform<any, any>, z.ZodO
|
|
|
127
127
|
}, z.core.$strip>>>;
|
|
128
128
|
docs: z.ZodOptional<z.ZodObject<{
|
|
129
129
|
tool: z.ZodEnum<{
|
|
130
|
-
none: "none";
|
|
131
130
|
storybook: "storybook";
|
|
132
131
|
docusaurus: "docusaurus";
|
|
132
|
+
none: "none";
|
|
133
133
|
}>;
|
|
134
134
|
}, z.core.$strip>>;
|
|
135
135
|
scan: z.ZodOptional<z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;AAIlE,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;AAIlE,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2FhF"}
|
|
@@ -62,6 +62,33 @@ export async function checkConfig(config) {
|
|
|
62
62
|
suggestion: "Run ptb scan to fetch and save the design system from Figma",
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
|
+
// B-3: when the project is configured for Storybook, verify its config actually
|
|
66
|
+
// exists. `storybook init` can exit 0 without writing .storybook/main.* (its
|
|
67
|
+
// interactive builder prompt gets skipped non-interactively), leaving a
|
|
68
|
+
// "storybook dev" script that fails — and verify needs Storybook. Surface it
|
|
69
|
+
// here so `ptb doctor` catches the broken funnel before the user hits verify.
|
|
70
|
+
if (config.docs?.tool === "storybook") {
|
|
71
|
+
const { packageRoot } = resolveDSPaths(config);
|
|
72
|
+
const mainExists = await (async () => {
|
|
73
|
+
for (const f of ["main.ts", "main.js", "main.mjs", "main.cjs"]) {
|
|
74
|
+
if (await fs.access(path.join(packageRoot, ".storybook", f)).then(() => true).catch(() => false)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
})();
|
|
80
|
+
if (!mainExists) {
|
|
81
|
+
issues.push({
|
|
82
|
+
severity: "warning",
|
|
83
|
+
check: "storybook",
|
|
84
|
+
message: "Storybook is configured but .storybook/main.* is missing",
|
|
85
|
+
suggestion: "Run: ptb document component . (or: cd <ui package> && npx storybook@latest init --no-dev --type react)",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
issues.push({ severity: "pass", check: "storybook", message: "Storybook config present", suggestion: "" });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
65
92
|
return { issues, snapshotAge };
|
|
66
93
|
}
|
|
67
94
|
//# sourceMappingURL=check-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-token-model.d.ts","sourceRoot":"","sources":["../../src/tokens/build-token-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,GAAG,GAAG,eAAe,EAAE,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,GAAG,GAAG,eAAe,EAAE,CAKxE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,oBAAoB,GAAG,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"build-token-model.d.ts","sourceRoot":"","sources":["../../src/tokens/build-token-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,GAAG,GAAG,eAAe,EAAE,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,GAAG,GAAG,eAAe,EAAE,CAKxE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,oBAAoB,GAAG,eAAe,EAAE,CA4DpG"}
|
|
@@ -43,19 +43,35 @@ export function adaptCanonicalToTokenCollections(exportData) {
|
|
|
43
43
|
aliasTargetId = rawAliasId.replace(/^VariableID:/i, "");
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
// E-19: preserve every mode's value, not just the default. Collections
|
|
47
|
+
// with >1 mode (Figma variable modes, e.g. Light/Dark) carry the full
|
|
48
|
+
// theme set here; the CSS emitter turns non-default modes into
|
|
49
|
+
// [data-theme] override blocks. Single-mode collections skip this
|
|
50
|
+
// entirely (valuesByMode stays undefined) to keep the model lean.
|
|
51
|
+
const hasMultipleModes = col.modes.length > 1;
|
|
52
|
+
const valuesByMode = hasMultipleModes
|
|
53
|
+
? Object.fromEntries(col.modes
|
|
54
|
+
.filter((m) => t.valuesByMode[m.id] !== undefined)
|
|
55
|
+
.map((m) => [m.id, t.valuesByMode[m.id].value]))
|
|
56
|
+
: undefined;
|
|
46
57
|
const token = {
|
|
47
58
|
id: t.id,
|
|
48
59
|
name: t.name,
|
|
49
60
|
type: typeString,
|
|
50
61
|
value: modeVal.value,
|
|
62
|
+
...(valuesByMode && Object.keys(valuesByMode).length > 1 ? { valuesByMode } : {}),
|
|
51
63
|
...(aliasTargetId ? { aliasTargetId } : {}),
|
|
52
64
|
};
|
|
53
65
|
return token;
|
|
54
66
|
});
|
|
67
|
+
const hasMultipleModes = col.modes.length > 1;
|
|
55
68
|
return {
|
|
56
69
|
id: col.id,
|
|
57
70
|
name: col.name,
|
|
58
71
|
tokens,
|
|
72
|
+
...(hasMultipleModes
|
|
73
|
+
? { modes: col.modes.map((m) => ({ id: m.id, name: m.name })), defaultModeId: col.modes[0]?.id }
|
|
74
|
+
: {}),
|
|
59
75
|
};
|
|
60
76
|
});
|
|
61
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-token-model.js","sourceRoot":"","sources":["../../src/tokens/build-token-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,aAAkB;IAC9C,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,yBAAyB,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAkB;IACjD,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,yBAAyB,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,UAAgC;IAC7E,OAAO,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtC,MAAM,MAAM,GAAkB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAElH,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAE7E,qEAAqE;YACrE,0EAA0E;YAC1E,uEAAuE;YACvE,IAAI,aAAiC,CAAC;YACtC,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACpC,MAAM,UAAU,GACZ,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;oBACxD,OAAe,CAAC,EAAyB;oBAC3C,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,OAAO,CAAC,KAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBAChG,EAAE,CAAC;gBACP,IAAI,UAAU,EAAE,CAAC;oBACb,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAgB;gBACvB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,UAAiC;gBACvC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC;YAEF,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO;YACH,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM;
|
|
1
|
+
{"version":3,"file":"build-token-model.js","sourceRoot":"","sources":["../../src/tokens/build-token-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-token-collections.d.ts","sourceRoot":"","sources":["../../src/tokens/normalize-token-collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,YAAY,CAAC;AAGvF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,iBAAiB,EAAE,wBAAwB,UAAQ,GAAG,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"normalize-token-collections.d.ts","sourceRoot":"","sources":["../../src/tokens/normalize-token-collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,YAAY,CAAC;AAGvF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,iBAAiB,EAAE,wBAAwB,UAAQ,GAAG,eAAe,EAAE,CA2E/H"}
|
|
@@ -14,6 +14,11 @@ export function normalizeTokenCollections(variablesMeta, includeHiddenCollection
|
|
|
14
14
|
continue; // Skip collections hidden from consumers (for export; keep for resolution)
|
|
15
15
|
}
|
|
16
16
|
const defaultModeId = rawCollection.defaultModeId;
|
|
17
|
+
// E-19: a collection with >1 mode carries multiple themes (e.g. Light/Dark).
|
|
18
|
+
// Preserve every mode's value so the emitter can produce [data-theme] blocks;
|
|
19
|
+
// single-mode collections keep the lean single-scalar shape (no valuesByMode).
|
|
20
|
+
const collectionModes = rawCollection.modes ?? [];
|
|
21
|
+
const hasMultipleModes = collectionModes.length > 1;
|
|
17
22
|
const tokens = [];
|
|
18
23
|
for (const variableId of rawCollection.variableIds) {
|
|
19
24
|
const rawVar = variables[variableId];
|
|
@@ -25,24 +30,22 @@ export function normalizeTokenCollections(variablesMeta, includeHiddenCollection
|
|
|
25
30
|
// Extract the value for the primary mode. If a collection has no modes
|
|
26
31
|
// for some reason, we fallback to the first object key value.
|
|
27
32
|
const valueForMode = rawVar.valuesByMode[defaultModeId] ?? Object.values(rawVar.valuesByMode)[0];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
let
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
const { normalizedValue, aliasTargetId } = normalizeVariableValue(valueForMode, variables);
|
|
34
|
+
// Per-mode values for multi-mode collections. Alias targets can differ per
|
|
35
|
+
// mode, but for the model we key on the value string and let the var()
|
|
36
|
+
// cascade in the emitter handle aliases; here we just capture each mode's
|
|
37
|
+
// normalized value so non-default modes can override in CSS.
|
|
38
|
+
let valuesByMode;
|
|
39
|
+
if (hasMultipleModes) {
|
|
40
|
+
const entries = [];
|
|
41
|
+
for (const m of collectionModes) {
|
|
42
|
+
const rawModeVal = rawVar.valuesByMode[m.modeId];
|
|
43
|
+
if (rawModeVal === undefined)
|
|
44
|
+
continue; // token missing this mode's value
|
|
45
|
+
entries.push([m.modeId, String(normalizeVariableValue(rawModeVal, variables).normalizedValue)]);
|
|
37
46
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
normalizedValue = rgbaToHex(valueForMode);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
// Number, String, Boolean
|
|
45
|
-
normalizedValue = valueForMode;
|
|
47
|
+
if (entries.length > 1)
|
|
48
|
+
valuesByMode = Object.fromEntries(entries);
|
|
46
49
|
}
|
|
47
50
|
tokens.push({
|
|
48
51
|
id: rawVar.id,
|
|
@@ -51,6 +54,7 @@ export function normalizeTokenCollections(variablesMeta, includeHiddenCollection
|
|
|
51
54
|
value: String(normalizedValue), // Store as string for flexibility inside model for now
|
|
52
55
|
type: classifyTokenKind(rawCollection.name), // Base type heavily off the parent classification collection
|
|
53
56
|
description: rawVar.description || undefined,
|
|
57
|
+
...(valuesByMode ? { valuesByMode } : {}),
|
|
54
58
|
...(aliasTargetId ? { aliasTargetId } : {}),
|
|
55
59
|
});
|
|
56
60
|
}
|
|
@@ -59,11 +63,42 @@ export function normalizeTokenCollections(variablesMeta, includeHiddenCollection
|
|
|
59
63
|
id: collectionId,
|
|
60
64
|
name: rawCollection.name,
|
|
61
65
|
tokens,
|
|
66
|
+
...(hasMultipleModes
|
|
67
|
+
? {
|
|
68
|
+
modes: collectionModes.map((m) => ({ id: m.modeId, name: m.name })),
|
|
69
|
+
defaultModeId,
|
|
70
|
+
}
|
|
71
|
+
: {}),
|
|
62
72
|
});
|
|
63
73
|
}
|
|
64
74
|
}
|
|
65
75
|
return collections;
|
|
66
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Normalizes a single raw Figma variable value (for one mode) into the model's
|
|
79
|
+
* scalar form: aliases → `{alias-name}` + aliasTargetId, colors → hex, primitives
|
|
80
|
+
* pass through. Shared by the default-value path and the per-mode (E-19) path so
|
|
81
|
+
* both stay identical.
|
|
82
|
+
*/
|
|
83
|
+
function normalizeVariableValue(valueForMode, variables) {
|
|
84
|
+
let normalizedValue = "";
|
|
85
|
+
let aliasTargetId;
|
|
86
|
+
if (typeof valueForMode === "object" && valueForMode !== null) {
|
|
87
|
+
if ("type" in valueForMode && valueForMode.type === "VARIABLE_ALIAS") {
|
|
88
|
+
const aliasedVar = variables[valueForMode.id];
|
|
89
|
+
normalizedValue = aliasedVar ? `{${aliasedVar.name.replace(/\//g, "-").replace(/\s+/g, "-")}}` : "[Unknown Alias]";
|
|
90
|
+
aliasTargetId = valueForMode.id;
|
|
91
|
+
}
|
|
92
|
+
else if ("r" in valueForMode) {
|
|
93
|
+
normalizedValue = rgbaToHex(valueForMode);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (valueForMode !== undefined) {
|
|
97
|
+
// Number, String, Boolean
|
|
98
|
+
normalizedValue = valueForMode;
|
|
99
|
+
}
|
|
100
|
+
return { normalizedValue, aliasTargetId };
|
|
101
|
+
}
|
|
67
102
|
// Convert 0-1 RGBA channels to Hex string (uppercase to match rgbToHex in normalize-components)
|
|
68
103
|
function rgbaToHex(color) {
|
|
69
104
|
const r = Math.round(color.r * 255).toString(16).padStart(2, "0");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-token-collections.js","sourceRoot":"","sources":["../../src/tokens/normalize-token-collections.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAgC,EAAE,wBAAwB,GAAG,KAAK;IACxG,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,GAAsB,aAAa,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE1H,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,wBAAwB,IAAI,aAAa,CAAC,oBAAoB,EAAE,CAAC;YAClE,SAAS,CAAC,2EAA2E;QACzF,CAAC;QAED,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"normalize-token-collections.js","sourceRoot":"","sources":["../../src/tokens/normalize-token-collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pixel-diff.d.ts","sourceRoot":"","sources":["../../src/verify/pixel-diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"pixel-diff.d.ts","sourceRoot":"","sources":["../../src/verify/pixel-diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8InD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAuElC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B/F"}
|
|
@@ -76,6 +76,53 @@ function applyRasterMask(target, mask, patchSize, patchCols, imgWidth, imgHeight
|
|
|
76
76
|
}
|
|
77
77
|
return maskedPixels;
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Estimates the reference background color from its four corners (each averaged
|
|
81
|
+
* over a small patch). UI frames are near-universally rendered on a uniform
|
|
82
|
+
* background, so the corners are a robust background sample.
|
|
83
|
+
*/
|
|
84
|
+
function estimateBackground(data, w, h) {
|
|
85
|
+
const S = 4; // corner patch size
|
|
86
|
+
const samples = [
|
|
87
|
+
[0, 0], [w - S, 0], [0, h - S], [w - S, h - S],
|
|
88
|
+
];
|
|
89
|
+
let r = 0, g = 0, b = 0, n = 0;
|
|
90
|
+
for (const [ox, oy] of samples) {
|
|
91
|
+
for (let y = oy; y < oy + S && y < h; y++) {
|
|
92
|
+
for (let x = ox; x < ox + S && x < w; x++) {
|
|
93
|
+
const i = (y * w + x) * 4;
|
|
94
|
+
r += data[i];
|
|
95
|
+
g += data[i + 1];
|
|
96
|
+
b += data[i + 2];
|
|
97
|
+
n++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return n === 0 ? [255, 255, 255] : [r / n, g / n, b / n];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* FLOOR-CALIB: content-coverage metric. Of the reference pixels that are "ink"
|
|
105
|
+
* (far enough from the background to be content), returns the fraction the impl
|
|
106
|
+
* also renders as ink at the same position. A blank scaffold draws background
|
|
107
|
+
* where the reference has content → ~0; a real implementation → high. Returns
|
|
108
|
+
* undefined when the reference has no detectable ink (nothing to cover).
|
|
109
|
+
*/
|
|
110
|
+
function computeContentCoverage(figmaData, implData, w, h) {
|
|
111
|
+
const bg = estimateBackground(figmaData, w, h);
|
|
112
|
+
const INK = 60; // summed per-channel distance from background to count as content
|
|
113
|
+
const dist = (data, i) => Math.abs(data[i] - bg[0]) + Math.abs(data[i + 1] - bg[1]) + Math.abs(data[i + 2] - bg[2]);
|
|
114
|
+
let refInk = 0, covered = 0;
|
|
115
|
+
for (let i = 0; i < w * h * 4; i += 4) {
|
|
116
|
+
if (dist(figmaData, i) > INK) {
|
|
117
|
+
refInk++;
|
|
118
|
+
if (dist(implData, i) > INK)
|
|
119
|
+
covered++;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (refInk === 0)
|
|
123
|
+
return undefined;
|
|
124
|
+
return parseFloat((covered / refInk).toFixed(4));
|
|
125
|
+
}
|
|
79
126
|
/**
|
|
80
127
|
* Compares two PNG files pixel-by-pixel using pixelmatch.
|
|
81
128
|
* Saves an annotated diff image to diffOutputPath.
|
|
@@ -108,11 +155,13 @@ export async function runPixelDiff(figmaPath, implPath, diffOutputPath) {
|
|
|
108
155
|
await fs.mkdir(path.dirname(diffOutputPath), { recursive: true });
|
|
109
156
|
await fs.writeFile(diffOutputPath, PNG.sync.write(diffPng));
|
|
110
157
|
const score = parseFloat((1 - diffPixels / totalPixels).toFixed(4));
|
|
158
|
+
// FLOOR-CALIB: how much of the reference's actual content the impl renders.
|
|
159
|
+
const contentCoverage = computeContentCoverage(figmaPng.data, implPng.data, width, height);
|
|
111
160
|
// ── Content-only score (exclude raster image patches) ────────────────
|
|
112
161
|
const { mask, patchCols } = buildRasterMask(figmaPng.data, width, height, PATCH_SIZE, RASTER_VARIANCE_THRESHOLD);
|
|
113
162
|
const rasterPatchCount = mask.filter(Boolean).length;
|
|
114
163
|
if (rasterPatchCount === 0) {
|
|
115
|
-
return { score, diffPixels, totalPixels };
|
|
164
|
+
return { score, contentCoverage, diffPixels, totalPixels };
|
|
116
165
|
}
|
|
117
166
|
// At least one raster patch: run a second comparison on masked copies.
|
|
118
167
|
// Both images get the same patches filled with mid-gray → pixelmatch sees
|
|
@@ -126,7 +175,7 @@ export async function runPixelDiff(figmaPath, implPath, diffOutputPath) {
|
|
|
126
175
|
const contentPixels = totalPixels - maskedPixels;
|
|
127
176
|
const contentScore = parseFloat((contentPixels > 0 ? 1 - contentDiffPixels / contentPixels : 1).toFixed(4));
|
|
128
177
|
const rasterPixelRatio = parseFloat((maskedPixels / totalPixels).toFixed(4));
|
|
129
|
-
return { score, contentScore, rasterPixelRatio, diffPixels, totalPixels };
|
|
178
|
+
return { score, contentScore, rasterPixelRatio, contentCoverage, diffPixels, totalPixels };
|
|
130
179
|
}
|
|
131
180
|
catch {
|
|
132
181
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pixel-diff.js","sourceRoot":"","sources":["../../src/verify/pixel-diff.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pixel-diff.js","sourceRoot":"","sources":["../../src/verify/pixel-diff.ts"],"names":[],"mappings":"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"}
|
package/dist/verify/types.d.ts
CHANGED
|
@@ -28,6 +28,16 @@ export type PixelMatchResult = {
|
|
|
28
28
|
contentScore?: number;
|
|
29
29
|
/** Fraction of total pixels identified as raster image regions (0–1). */
|
|
30
30
|
rasterPixelRatio?: number;
|
|
31
|
+
/**
|
|
32
|
+
* FLOOR-CALIB: of the pixels that are actual *content* (ink — differ from the
|
|
33
|
+
* reference's background) in the Figma reference, the fraction the implementation
|
|
34
|
+
* also renders as content at the same positions (0–1). Independent of visual
|
|
35
|
+
* complexity, unlike `score`: a blank scaffold on a visually-simple component
|
|
36
|
+
* still scores high on `score` (mostly background in both images) but ~0 here,
|
|
37
|
+
* because it draws nothing where the reference has content. Undefined when the
|
|
38
|
+
* reference has no detectable content (fully blank).
|
|
39
|
+
*/
|
|
40
|
+
contentCoverage?: number;
|
|
31
41
|
diffPixels: number;
|
|
32
42
|
totalPixels: number;
|
|
33
43
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verify/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verify/types.ts"],"names":[],"mappings":"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"}
|
package/dist/verify/verdict.d.ts
CHANGED
|
@@ -15,6 +15,14 @@ export declare const VERIFY_WARN_THRESHOLD = 0.7;
|
|
|
15
15
|
* inflates tokenScore to 1.0 on a blank shell, while pixel exposes the emptiness.
|
|
16
16
|
*/
|
|
17
17
|
export declare const PIXEL_FLOOR_VETO = 0.1;
|
|
18
|
+
/**
|
|
19
|
+
* FLOOR-CALIB: minimum share of the reference's content pixels an implementation
|
|
20
|
+
* must reproduce (see PixelMatchResult.contentCoverage) for a token-driven pass to
|
|
21
|
+
* stand. Below this, the pass is a blank/near-blank scaffold whose high pixel score
|
|
22
|
+
* is background dominance, not fidelity — it is downgraded to warn. Conservative so
|
|
23
|
+
* legitimate imperfect renders (which still draw their content) are unaffected.
|
|
24
|
+
*/
|
|
25
|
+
export declare const CONTENT_COVERAGE_FLOOR = 0.35;
|
|
18
26
|
export type VerifyVerdict = "pass" | "warn" | "fail" | "no-comparison";
|
|
19
27
|
export type VerifyVerdictResult = {
|
|
20
28
|
verdict: VerifyVerdict;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../src/verify/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAO,CAAC;AAC1C,eAAO,MAAM,qBAAqB,MAAO,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAO,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,8FAA8F;IAC9F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC;CACtE,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAC1D,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../src/verify/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAO,CAAC;AAC1C,eAAO,MAAM,qBAAqB,MAAO,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAO,CAAC;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,8FAA8F;IAC9F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC;CACtE,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAC1D,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,mBAAmB,CA4E7F"}
|
package/dist/verify/verdict.js
CHANGED
|
@@ -14,6 +14,14 @@ export const VERIFY_WARN_THRESHOLD = 0.70;
|
|
|
14
14
|
* inflates tokenScore to 1.0 on a blank shell, while pixel exposes the emptiness.
|
|
15
15
|
*/
|
|
16
16
|
export const PIXEL_FLOOR_VETO = 0.10;
|
|
17
|
+
/**
|
|
18
|
+
* FLOOR-CALIB: minimum share of the reference's content pixels an implementation
|
|
19
|
+
* must reproduce (see PixelMatchResult.contentCoverage) for a token-driven pass to
|
|
20
|
+
* stand. Below this, the pass is a blank/near-blank scaffold whose high pixel score
|
|
21
|
+
* is background dominance, not fidelity — it is downgraded to warn. Conservative so
|
|
22
|
+
* legitimate imperfect renders (which still draw their content) are unaffected.
|
|
23
|
+
*/
|
|
24
|
+
export const CONTENT_COVERAGE_FLOOR = 0.35;
|
|
17
25
|
/**
|
|
18
26
|
* Computes a single verdict from a VerifyReport.
|
|
19
27
|
*
|
|
@@ -85,6 +93,21 @@ export function computeVerifyVerdict(report) {
|
|
|
85
93
|
if (verdict === "pass" && metric === "token" && pixel && pixel.score < VERIFY_WARN_THRESHOLD && !meanIsHealthy) {
|
|
86
94
|
verdict = "warn";
|
|
87
95
|
}
|
|
96
|
+
// FLOOR-CALIB (content-area-aware): the pixel `score` and `variantMeanScore` are
|
|
97
|
+
// background-dominated — on a visually-simple component (a chip, a badge) most of
|
|
98
|
+
// the frame is background in BOTH the reference and a blank scaffold, so an empty
|
|
99
|
+
// shell scores high enough to clear the 0.10 veto AND lift the mean past 0.70,
|
|
100
|
+
// disabling the downgrade above (ChipsWeb blank ≈ 0.26 score, healthy mean → false
|
|
101
|
+
// pass). `contentCoverage` is immune to this: it measures how much of the reference's
|
|
102
|
+
// actual ink the impl reproduced, so a blank scaffold reads ~0 regardless of how
|
|
103
|
+
// simple the component is. When a token-driven pass reproduces almost none of the
|
|
104
|
+
// reference's content, the pass is an artifact — downgrade to warn. The floor is
|
|
105
|
+
// conservative (0.35) so a real-but-imperfect render, which still draws its content,
|
|
106
|
+
// keeps its pass.
|
|
107
|
+
const coverage = report.pixelMatch?.contentCoverage;
|
|
108
|
+
if (verdict === "pass" && metric === "token" && coverage !== undefined && coverage < CONTENT_COVERAGE_FLOOR) {
|
|
109
|
+
verdict = "warn";
|
|
110
|
+
}
|
|
88
111
|
return { verdict, score, metric };
|
|
89
112
|
}
|
|
90
113
|
//# sourceMappingURL=verdict.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/verify/verdict.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/verify/verdict.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAY3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB,CAAC,MACmC;IACpE,IAAI,OAAO,GAAoE,IAAI,CAAC;IAEpF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;SAAM,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,KAAK,GAAoE,IAAI,CAAC;IAClF,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,KAAK,SAAS;YAChD,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE;YACpE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9D,CAAC;IAED,iFAAiF;IACjF,gFAAgF;IAChF,gFAAgF;IAChF,EAAE;IACF,8EAA8E;IAC9E,kFAAkF;IAClF,+EAA+E;IAC/E,kFAAkF;IAClF,oFAAoF;IACpF,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,CAAC;IACjH,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAkB,MAAM,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAED,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK;QACzB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAEzB,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,OAAO,GAAkB,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAC,MAAM;QAChE,CAAC,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAC,MAAM;YACzC,CAAC,CAAC,MAAM,CAAC;IAEb,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,oEAAoE;IACpE,4EAA4E;IAC5E,4EAA4E;IAC5E,uEAAuE;IACvE,yEAAyE;IACzE,6BAA6B;IAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,IAAI,qBAAqB,CAAC;IAChH,IAAI,OAAO,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,qBAAqB,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7G,OAAO,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,iFAAiF;IACjF,kFAAkF;IAClF,kFAAkF;IAClF,+EAA+E;IAC/E,mFAAmF;IACnF,sFAAsF;IACtF,iFAAiF;IACjF,kFAAkF;IAClF,iFAAiF;IACjF,qFAAqF;IACrF,kBAAkB;IAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC;IACpD,IAAI,OAAO,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,sBAAsB,EAAE,CAAC;QAC1G,OAAO,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calibrate-ds/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.86",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"pixelmatch": "^6.0.0",
|
|
40
40
|
"pngjs": "^7.0.0",
|
|
41
41
|
"zod": "^4.3.6",
|
|
42
|
-
"@calibrate-ds/
|
|
43
|
-
"@calibrate-ds/
|
|
42
|
+
"@calibrate-ds/shared-types": "^0.1.86",
|
|
43
|
+
"@calibrate-ds/figma-client": "^0.1.86"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"build": "tsc -p tsconfig.json",
|