refactor: update css vars lint rules and fix them

This commit is contained in:
2026-09-08 07:18:57 +05:00
parent 2d24f51fd5
commit e3d50f2128
25 changed files with 69 additions and 49 deletions
+2 -2
View File
@@ -6,14 +6,14 @@
// Properties that accept a COLOR. // Properties that accept a COLOR.
// ===================================================================== // =====================================================================
export const COLOR_PROPS = export const COLOR_PROPS =
/^(color|background|background-color|border|border-color|border-top|border-right|border-bottom|border-left|outline|outline-color|box-shadow|text-shadow|fill|stroke|fill-color|stroke-color|stop-color|flood-color|lighting-color|column-rule|column-rule-color|text-decoration|text-decoration-color|caret-color|accent-color|border-top-color|border-right-color|border-bottom-color|border-left-color)$/; /^(color|background|background-color|background-image|border|border-color|border-top|border-right|border-bottom|border-left|outline|outline-color|box-shadow|text-shadow|fill|stroke|fill-color|stroke-color|stop-color|flood-color|lighting-color|column-rule|column-rule-color|text-decoration|text-decoration-color|caret-color|accent-color|border-top-color|border-right-color|border-bottom-color|border-left-color)$/;
// ===================================================================== // =====================================================================
// Properties that accept a SIZE (px/rem/em). // Properties that accept a SIZE (px/rem/em).
// z-index is handled separately (it's an integer, not a length). // z-index is handled separately (it's an integer, not a length).
// ===================================================================== // =====================================================================
export const SIZE_PROPS = export const SIZE_PROPS =
/^(width|height|min-width|max-width|min-height|max-height|padding|padding-top|padding-right|padding-bottom|padding-left|margin|margin-top|margin-right|margin-bottom|margin-left|gap|column-gap|row-gap|top|right|bottom|left|inset|font-size|letter-spacing|word-spacing|line-height|border-radius|border-top-left-radius|border-top-right-radius|border-bottom-left-radius|border-bottom-right-radius|border-width|border-top-width|border-right-width|border-bottom-width|border-left-width|flex-basis|background-size|border-spacing)$/; /^(width|height|min-width|max-width|min-height|max-height|padding|padding-top|padding-right|padding-bottom|padding-left|margin|margin-top|margin-right|margin-bottom|margin-left|gap|column-gap|row-gap|top|right|bottom|left|inset|font|font-size|letter-spacing|word-spacing|line-height|border-radius|border-top-left-radius|border-top-right-radius|border-bottom-left-radius|border-bottom-right-radius|border-width|border-top-width|border-right-width|border-bottom-width|border-left-width|flex-basis|background-size|background-position|border-spacing|grid-template-columns|grid-template-rows)$/;
// ===================================================================== // =====================================================================
// SHORTHAND properties that accept BOTH a color and a size. The browser // SHORTHAND properties that accept BOTH a color and a size. The browser
@@ -9,6 +9,7 @@ import {
DURATION_PROPS, DURATION_PROPS,
FORBIDDEN_DURATION_TOKEN, FORBIDDEN_DURATION_TOKEN,
FORBIDDEN_SIZE_TOKEN, FORBIDDEN_SIZE_TOKEN,
MIXED_PROPS,
SIZE_PROPS, SIZE_PROPS,
} from "./lists.js"; } from "./lists.js";
import { getStyleNodeLoc, getStyleRoot } from "./style-context.js"; import { getStyleNodeLoc, getStyleRoot } from "./style-context.js";
@@ -125,13 +126,16 @@ export default {
// Sub-rule 2: sizes. // Sub-rule 2: sizes.
// Fire only on a real remaining px/rem/em token — percentages // Fire only on a real remaining px/rem/em token — percentages
// (width: 80%) and unitless values (line-height: 1.5) stay legal. // (width: 80%) and unitless values (line-height: 1.5) stay legal.
// Only legal absolute length is a single 1px border line. // The only legal absolute length is a 0px reset line.
if (SIZE_PROPS.test(prop)) { // MIXED_PROPS (border/outline shorthands) are checked for their
// SIZE half too — a border width must come from var(--size-*).
if (SIZE_PROPS.test(prop) || MIXED_PROPS.test(prop)) {
const withoutVars = stripVars(value); const withoutVars = stripVars(value);
const match = withoutVars.match(FORBIDDEN_SIZE_TOKEN); const reported = new Set();
if (match) { for (const match of withoutVars.matchAll(FORBIDDEN_SIZE_TOKEN)) {
const shown = match[0]; const shown = match[0];
if (shown !== "1px" && shown !== "0px") { if (shown !== "0px" && !reported.has(shown)) {
reported.add(shown);
report(decl, "hardcodedSize", { prop, value: shown }); report(decl, "hardcodedSize", { prop, value: shown });
} }
} }
@@ -150,12 +154,13 @@ export default {
) )
.trim(); .trim();
if (withoutKeywords !== "" && withoutKeywords !== "0") { if (withoutKeywords !== "" && withoutKeywords !== "0") {
const match = value.match(COLOR_LITERAL); const reported = new Set();
if (match) { for (const match of value.matchAll(COLOR_LITERAL)) {
report(decl, "hardcodedColor", { const shown = match[0].trim();
prop, if (!reported.has(shown)) {
value: match[0].trim(), reported.add(shown);
}); report(decl, "hardcodedColor", { prop, value: shown });
}
} }
} }
} }
@@ -31,7 +31,7 @@
justify-content: space-between; justify-content: space-between;
gap: var(--space-xl); gap: var(--space-xl);
padding-bottom: var(--space-m); padding-bottom: var(--space-m);
border-bottom: 1px solid var(--color-border); border-bottom: var(--size-border) solid var(--color-border);
} }
.group-title span { .group-title span {
font: var(--font-size-s) var(--font-mono); font: var(--font-size-s) var(--font-mono);
@@ -55,7 +55,7 @@
align-items: center; align-items: center;
gap: var(--space-m); gap: var(--space-m);
padding: var(--space-m) var(--space-l); padding: var(--space-m) var(--space-l);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
background: var(--color-panel); background: var(--color-panel);
color: var(--color-text-muted); color: var(--color-text-muted);
@@ -78,7 +78,7 @@
color: var(--color-text-muted); color: var(--color-text-muted);
} }
.catalog-filters button { .catalog-filters button {
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
background: transparent; background: transparent;
color: var(--color-text-muted); color: var(--color-text-muted);
font: var(--font-size-s) var(--font-mono); font: var(--font-size-s) var(--font-mono);
@@ -22,16 +22,16 @@
overflow: hidden; overflow: hidden;
background-color: var(--color-text); background-color: var(--color-text);
background-image: background-image:
linear-gradient(45deg, #1a2129 25%, transparent 25%), linear-gradient(45deg, var(--color-checker-main) 25%, transparent 25%),
linear-gradient(-45deg, #1a2129 25%, transparent 25%), linear-gradient(-45deg, var(--color-checker-main) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #1a2129 75%), linear-gradient(45deg, transparent 75%, var(--color-checker-main) 75%),
linear-gradient(-45deg, transparent 75%, #1a2129 75%); linear-gradient(-45deg, transparent 75%, var(--color-checker-main) 75%);
background-size: var(--space-xl) var(--space-xl); background-size: var(--space-xl) var(--space-xl);
background-position: background-position:
0 0, 0 0,
0 10px, 0 calc(var(--space-xl) / 2),
10px -10px, calc(var(--space-xl) / 2) calc(-1 * var(--space-xl) / 2),
-10px 0; calc(-1 * var(--space-xl) / 2) 0;
} }
.checker-canvas--sm { .checker-canvas--sm {
+1 -1
View File
@@ -24,7 +24,7 @@
<style> <style>
.code-block { .code-block {
position: relative; position: relative;
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
background: var(--color-background); background: var(--color-background);
padding: var(--space-m) var(--space-l); padding: var(--space-m) var(--space-l);
+1 -1
View File
@@ -66,7 +66,7 @@
gap: var(--space-m); gap: var(--space-m);
min-height: var(--size-panel-min-height); min-height: var(--size-panel-min-height);
padding: var(--space-xxxl); padding: var(--space-xxxl);
border: 1px dashed var(--color-border); border: var(--size-border) dashed var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
color: var(--color-text-muted); color: var(--color-text-muted);
background: var(--color-background); background: var(--color-background);
+1 -1
View File
@@ -20,7 +20,7 @@
flex-direction: column; flex-direction: column;
gap: var(--space-s); gap: var(--space-s);
margin: 0; margin: 0;
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
padding: var(--space-m); padding: var(--space-m);
background: var(--color-panel); background: var(--color-panel);
+1 -1
View File
@@ -15,7 +15,7 @@
<style> <style>
.meta-list { .meta-list {
border-top: 1px solid var(--color-border); border-top: var(--size-border) solid var(--color-border);
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
gap: var(--space-m); gap: var(--space-m);
padding-top: var(--space-l); padding-top: var(--space-l);
@@ -25,7 +25,7 @@
justify-content: space-between; justify-content: space-between;
gap: var(--space-xl); gap: var(--space-xl);
padding: var(--space-l) var(--space-xl); padding: var(--space-l) var(--space-xl);
border-bottom: 1px solid var(--color-border); border-bottom: var(--size-border) solid var(--color-border);
} }
.heading-text { .heading-text {
display: flex; display: flex;
@@ -267,7 +267,10 @@
} }
.workspace { .workspace {
display: grid; display: grid;
grid-template-columns: minmax(260px, 1fr) minmax(0, 2fr); grid-template-columns: minmax(var(--size-workspace-min), 1fr) minmax(
0,
2fr
);
gap: var(--space-xxl); gap: var(--space-xxl);
align-items: start; align-items: start;
} }
@@ -21,7 +21,7 @@
justify-content: space-between; justify-content: space-between;
gap: var(--space-xl); gap: var(--space-xl);
padding: var(--space-m) var(--space-xl); padding: var(--space-m) var(--space-xl);
border-bottom: 1px solid var(--color-border); border-bottom: var(--size-border) solid var(--color-border);
} }
.setting-control { .setting-control {
display: flex; display: flex;
@@ -16,6 +16,6 @@
justify-content: flex-end; justify-content: flex-end;
gap: var(--space-m); gap: var(--space-m);
padding: var(--space-l) var(--space-xl); padding: var(--space-l) var(--space-xl);
border-top: 1px solid var(--color-border); border-top: var(--size-border) solid var(--color-border);
} }
</style> </style>
+2 -2
View File
@@ -45,9 +45,9 @@
<style> <style>
.step-card { .step-card {
display: grid; display: grid;
grid-template-columns: 46px 20px 1fr; grid-template-columns: var(--size-step-index) var(--size-step-grip) 1fr;
min-height: var(--size-step-min-height); min-height: var(--size-step-min-height);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
background: var(--color-panel); background: var(--color-panel);
} }
.step-index { .step-index {
+5 -3
View File
@@ -29,12 +29,14 @@
<style> <style>
.tool-card { .tool-card {
display: grid; display: grid;
grid-template-columns: var(--size-tool-icon) minmax(0, 1fr) 24px 18px; grid-template-columns: var(--size-tool-icon) minmax(0, 1fr) var(
--space-xxl
) var(--size-tool-arrow);
align-items: center; align-items: center;
gap: var(--space-l); gap: var(--space-l);
min-height: var(--size-tool-min-height); min-height: var(--size-tool-min-height);
padding: var(--space-xl); padding: var(--space-xl);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
background: var(--color-panel); background: var(--color-panel);
color: var(--color-text); color: var(--color-text);
@@ -63,7 +65,7 @@
color: var(--color-text); color: var(--color-text);
} }
.tool-copy span { .tool-copy span {
font: 12px/1.5 var(--font-mono); font: var(--font-size-s)/1.5 var(--font-mono);
color: var(--color-text-muted); color: var(--color-text-muted);
} }
.tool-index { .tool-index {
@@ -56,12 +56,12 @@
padding-left: var(--space-m); padding-left: var(--space-m);
padding-right: var(--space-m); padding-right: var(--space-m);
height: var(--space-xxxl); height: var(--space-xxxl);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
} }
.swatch { .swatch {
width: var(--space-l); width: var(--space-l);
height: var(--space-l); height: var(--space-l);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
flex: none; flex: none;
} }
.color-field input { .color-field input {
@@ -35,7 +35,7 @@
font-size: var(--font-size-s); font-size: var(--font-size-s);
color: var(--color-text); color: var(--color-text);
background: var(--color-background); background: var(--color-background);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
padding: var(--space-s) var(--space-m); padding: var(--space-s) var(--space-m);
} }
@@ -39,7 +39,7 @@
font-size: var(--font-size-s); font-size: var(--font-size-s);
color: var(--color-text); color: var(--color-text);
background: var(--color-background); background: var(--color-background);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: var(--radius-m); border-radius: var(--radius-m);
padding: var(--space-s) var(--space-m); padding: var(--space-s) var(--space-m);
} }
@@ -23,7 +23,7 @@
.lang { .lang {
display: flex; display: flex;
align-items: center; align-items: center;
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
} }
.lang-btn { .lang-btn {
border: 0; border: 0;
+1 -1
View File
@@ -29,7 +29,7 @@
position: relative; position: relative;
width: var(--space-xxxl); width: var(--space-xxxl);
height: var(--space-xl); height: var(--space-xl);
border: 1px solid var(--color-border); border: var(--size-border) solid var(--color-border);
border-radius: 0; border-radius: 0;
background: var(--color-background); background: var(--color-background);
cursor: pointer; cursor: pointer;
+7
View File
@@ -156,7 +156,13 @@
--size-tool-icon: 42px; --size-tool-icon: 42px;
--size-tool-min-height: 106px; --size-tool-min-height: 106px;
--size-tool-arrow: 18px;
--size-step-min-height: 138px; --size-step-min-height: 138px;
--size-step-index: 46px;
--size-step-grip: 20px;
--size-card-min: 240px;
--size-card-min-narrow: 200px;
--size-workspace-min: 260px;
--size-content-max: 880px; --size-content-max: 880px;
--size-content-max-wide: 1680px; --size-content-max-wide: 1680px;
@@ -165,6 +171,7 @@
--font-size-l: 16px; --font-size-l: 16px;
--font-size-xl: 24px; --font-size-xl: 24px;
--font-size-2xl: 32px; --font-size-2xl: 32px;
--font-size-xs: 10px;
--radius-s: 0px; --radius-s: 0px;
--radius-m: 4px; --radius-m: 4px;
+2 -2
View File
@@ -59,8 +59,8 @@
main { main {
background-color: var(--color-background); background-color: var(--color-background);
background-image: background-image:
linear-gradient(var(--color-background-muted) 1px, #0000 1px), linear-gradient(var(--color-background-muted) 1px, transparent 1px),
linear-gradient(90deg, var(--color-background-muted) 1px, #0000 1px); linear-gradient(90deg, var(--color-background-muted) 1px, transparent 1px);
background-size: var(--space-xxxl) var(--space-xxxl); background-size: var(--space-xxxl) var(--space-xxxl);
min-height: 100vh; min-height: 100vh;
} }
+1 -1
View File
@@ -101,7 +101,7 @@
} }
.ws-results { .ws-results {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(var(--size-card-min), 1fr));
gap: var(--space-l); gap: var(--space-l);
padding: var(--space-m) var(--space-xl); padding: var(--space-m) var(--space-xl);
} }
+5 -2
View File
@@ -216,13 +216,16 @@
} }
.tool-grid { .tool-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(var(--size-card-min), 1fr));
gap: var(--space-l); gap: var(--space-l);
padding: var(--space-l) var(--space-xl); padding: var(--space-l) var(--space-xl);
} }
.preview-grid { .preview-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); grid-template-columns: repeat(
auto-fill,
minmax(var(--size-card-min-narrow), 1fr)
);
gap: var(--space-l); gap: var(--space-l);
padding: var(--space-l) var(--space-xl); padding: var(--space-l) var(--space-xl);
} }
@@ -64,8 +64,8 @@
flex-wrap: wrap; flex-wrap: wrap;
margin-top: var(--space-page-top); margin-top: var(--space-page-top);
padding-top: var(--space-xxl); padding-top: var(--space-xxl);
border-top: 1px solid var(--color-border); border-top: var(--size-border) solid var(--color-border);
font: 10px var(--font-mono); font: var(--font-size-xs) var(--font-mono);
letter-spacing: var(--space-text-l); letter-spacing: var(--space-text-l);
color: var(--color-text-muted); color: var(--color-text-muted);
} }