refactor: update color classes to use CSS variables for consistency

This commit is contained in:
hamed
2026-07-27 17:07:17 +03:30
parent bdc00fe267
commit e4edaea9b8
3 changed files with 32 additions and 2 deletions
+1 -1
View File
@@ -57,7 +57,7 @@ export default function ImageCropModal({ src, fileName, onCancel, onConfirm }: I
<span className="text-xs text-[var(--text-2)] shrink-0">بزرگنمایی</span>
<input type="range" min={1} max={3} step={0.01} value={zoom}
onChange={e => setZoom(Number(e.target.value))}
className="w-full accent-indigo-600" />
className="w-full accent-[var(--primary)]" />
</div>
<div className="flex items-center justify-end gap-3">
<button onClick={onCancel} disabled={processing}
+1 -1
View File
@@ -100,7 +100,7 @@ export default function PaymentDetailPage() {
label="نوبت مرتبط"
value={
<a href={`/admin/appointments/${payment.appointment_uuid}`}
className="text-primary-600 hover:underline text-xs font-mono">
className="text-[var(--primary)] hover:underline text-xs font-mono">
مشاهده نوبت
</a>
}
+30
View File
@@ -16,6 +16,13 @@ const INTENTIONAL = [
'lib/avatarColors.ts', // گرادیان تزئینی آواتار، در هر دو تم یکسان
];
/** پالت پیش‌فرض Tailwind v4 — هر خانوادهٔ دیگری باید در `@theme` تعریف شده باشد. */
const TAILWIND_FAMILIES = new Set([
'slate', 'gray', 'zinc', 'neutral', 'stone', 'red', 'orange', 'amber', 'yellow',
'lime', 'green', 'emerald', 'teal', 'cyan', 'sky', 'blue', 'indigo', 'violet',
'purple', 'fuchsia', 'pink', 'rose',
]);
const HEX = /#[0-9a-fA-F]{3,8}\b/;
const PALETTE_UTIL =
/(?:^|[\s"'`{])(?:dark:|hover:|focus:|active:|group-hover:|md:|lg:|sm:)*(?:bg|text|border|divide|ring|fill|stroke)-(?:white|black|gray|slate|zinc|neutral|stone|red|green|emerald|blue|sky|amber|yellow|orange|purple|indigo|violet|pink|rose|teal|cyan)(?:-\d{2,3})?\b/;
@@ -77,4 +84,27 @@ describe('theme tokens', () => {
.filter((f) => PALETTE_UTIL.test(strip(readFileSync(join(ROOT, f), 'utf8'))));
expect(offenders).toEqual([]);
});
/**
* `text-primary-600` و امثالش هیچ رنگی تولید نمی‌کنند: نه در پالت پیش‌فرض Tailwind
* هستند و نه در `@theme` تعریف شده‌اند — یعنی کلاسِ مرده در هر دو تم.
*/
it('کلاس رنگی با مقیاس تعریف‌نشده ندارد', () => {
const theme = readFileSync(join(ROOT, 'styles.css'), 'utf8');
const declared = new Set(
[...theme.matchAll(/--color-([a-z]+)-\d{2,3}\s*:/g)].map((m) => m[1]),
);
const utilities = new RegExp(
String.raw`\b(?:bg|text|border|ring|divide|from|to|via|outline|accent|caret|fill|stroke|placeholder|shadow)-([a-z]+)-\d{2,3}\b`,
'g',
);
const offenders: string[] = [];
for (const f of files) {
const src = strip(readFileSync(join(ROOT, f), 'utf8'));
for (const m of src.matchAll(utilities)) {
if (!TAILWIND_FAMILIES.has(m[1]) && !declared.has(m[1])) offenders.push(`${f}: ${m[0]}`);
}
}
expect(offenders).toEqual([]);
});
});