ds-health

Вставляешь URL и получаешь отчёт о здоровье дизайн-системы. Инструмент считает цвета, типографику, отступы и радиусы на живом сайте в настоящем браузере.

Что измеряет

  • ЦветаСколько цветов текста и фона на странице. Чем меньше уникальных значений и чем больше CSS-переменных, тем выше счёт.
  • ТипографикаСемейства, размеры и начертания видимого текста. Чем их меньше, тем собраннее система.
  • ОтступыСколько разных значений padding и gap. Хорошо, когда они сходятся к шкале.
  • РадиусСколько ненулевых радиусов. Меньше — ровнее углы.

Запуск

git clone https://github.com/AndrewAntoshkin/ds-health.git
cd ds-health
npm install
npm start

Открой http://localhost:3000. Если порт занят:

PORT=3002 npm start

Если Playwright не находит браузер:

npx playwright install chromium

Как устроено

Инструмент открывает страницу в настоящем Chromium через Playwright, снимает видимые элементы, читает computed styles и собирает отчёт: счёт, сигналы и рекомендации.

URL → Playwright (Chromium) → getComputedStyle() on sampled elements
→ Count unique colors, fonts, spacing, radii
→ Score each category (0–100)
→ Generate executive summary + priorities + recommendations

API

POST /api/analyze

curl -X POST http://localhost:3000/api/analyze \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

Запрос

ПолеТипОписание
urlстрокаПубличный HTTP/HTTPS-адрес страницы

Ответ

ПолеТипОписание
health.overallчислоСредний балл от 0 до 100
health.colorчислоОценка цельности цвета
health.typographyчислоОценка цельности типографики
health.spacingчислоОценка цельности отступов
health.radiusчислоОценка цельности скруглений
health.labelстрока«Здоровый», «В целом цельный» и другие
executiveSummaryстрокаКороткий вывод обычным языком
prioritiesмассивЧто чинить первым
recommendationsмассивКонкретные следующие шаги
signalsмассивОтдельные наблюдения
topValuesобъектСамые частые значения по категориям

GET /health

Возвращает { "ok": true } — удобно для проверки, что сервис жив.

Пример здорового сайта

Результат разбора barvian.me — собранный минималистичный сайт:

ЗначениеЧто значит
100Цвет
100Типографика
100Отступы
100Скругление
{
"elementsSampled": 69,
"textNodesSampled": 41,
"cssVariables": 4,
"textColors": 3,
"backgroundColors": 3,
"fontFamilies": 1,
"fontSizes": 1,
"fontWeights": 2,
"spacingValues": 4,
"radiusValues": 1
}

Executive summary:
"This page looks healthy. 4 CSS variables were
detected, and no major consistency issues stood
out in the sampled page."

Пример раздробленного сайта

Страница с кучей конкурирующих значений — обычная история легаси и быстрых прототипов:

ЗначениеЧто значит
65Цвет
45Типографика
70Отступы
90Скругление
Priority issues:
⚠ 14 text colors detected — consider consolidating
⚠ 4 font families in use — reduce to 1–2
⚠ 8 font sizes found — align to a type scale
⚠ No CSS variables detected — consider tokenizing

Recommendations:
→ Audit text colors and create a semantic palette
→ Standardize on 1–2 font families
→ Define a spacing scale (4, 8, 12, 16, 24, 32)
→ Introduce CSS custom properties for tokens

Как читать отчёт

Удобный порядок чтения: сначала счёт, потом резюме, потом приоритеты, потом сырые значения.

РазделЧто показывает
Общее здоровьеСреднее четырёх оценок — быстрый сигнал «прошло / не прошло»
Короткий выводВывод для тех, кто не читает сырые цифры
ПриоритетыЧто чинить первым — с наибольшим эффектом
РекомендацииПрактичные шаги, которые можно поставить в спринт
СигналыОтдельные наблюдения — сырые доказательства за оценкой
Частые значенияСамые частые цвета, размеры и отступы — где сведение в токены даст больше всего
Сведённые группыПочти одинаковые значения собраны в более чистые группы

Шкала

ДиапазонМеткаЧто значит
90–100ЗдоровыйЖёстко собрано: мало цветов, сдержанная типографика, небольшой набор отступов
70–89В целом цельныйЕсть разрозненность или несколько разовых значений
50–69Нужно вниманиеВизуальная система расползается — стоит посмотреть ближе
0–49РаздробленныйСлишком много конкурирующих значений — слоя токенов, скорее всего, нет

Цепочка

ds-health проверяет живую страницу после контура модели, когда интерфейс уже на проде:

ds-context prepares the pack
ds-eval scores generated UI
ds-health reads the live page ← you are here

Код