Дизайн-система для Vue 3

Мельче части — прочнее система.

Интерфейсы собираются из компонентов, основ и утилит. В сборку уезжает ровно то, что вы импортировали, — и ничего сверх.

Vue 3.5 · TypeScript · 77 компонентов · 0 runtime-зависимостей

Две оси, а не одна
КомпонентCSSJS
GrCard+ 223 B1 870 B
GrDialog+ 318 B9 789 B
GrDataTable+ 705 B16 243 B
GrSelect+ 2 335 B19 819 B

GrDataTable стоит втрое меньше стилей, чем GrSelect, и почти столько же кода. Одна цифра не предсказывает другую.

Сжато, только пакет: фреймворк ваш, и в этих числах его нет.

Не картинка

Работающий экран, собранный из тех же компонентов.

Conversion
4,8%
Revenue is a link, active users is a button (opened 0 times), conversion counts for 900 ms. Turn on "reduce motion" in the OS and the numbers stop counting.

То же демо, что стоит на странице GrStatistic: ради главной ничего не написано во второй раз.

Гранулярность

136 путей экспорта. Берёте компонент, composable или одну директиву — граф зависимостей на этом заканчивается.

Согласованность

Цвет, отступ и радиус — это роль, а не значение. Обе темы равноправны, и контраст проверяется в обеих.

Своя тема

Ребрендинг — это смена значений токенов. Исходники компонентов при этом не трогаются.

Для разработчика

Типы, авто-импорт, метаданные для IDE. Контракт доступности проверяется гейтом, а не декларируется.

Одна цена, четыре разреза

Одну цифру напечатать было бы проще.

Каждое число снято со сборки и сжато. Фреймворк в них не входит: он ваш, а не мой. Какой из разрезов важен, зависит от того, что вас ограничивает, — поэтому здесь все четыре.

Во что обойдётся начать

8 250B, дальше почти ничего

base + GrButton8 250 B
+ GrCard+ 223 B
+ GrDialog+ 318 B
+ GrDataTable+ 705 B
+ GrSelect+ 2 335 B

Первый компонент несёт токены, обе темы и базовый слой. Следующие четыре вместе стоят меньше трети от него.

Все ли компоненты лёгкие

13.6×разброс по набору

GrBadge1 455 B
GrCard1 870 B
GrAlert2 762 B
GrButton3 391 B
GrTabs4 819 B
GrDialog9 789 B
GrDataTable16 243 B
GrSelect19 819 B

Нет. GrSelect весит почти четырнадцать GrBadge. Если библиотека говорит, что все её компоненты лёгкие, — она их не мерила.

Что вы берёте на себя

0runtime-зависимостей

136 путей экспорта

Под узлом ничего нет. Ваш lock-файл, ваша поверхность аудита и ваш путь обновления остаются вашими, а 136 путей экспорта означают, что граф останавливается там же, где вы.

Во что обходится вторая тема

746B, при любом размере

1 · 7 504 B
2 · 8 250 B

Число почти не меняется между одним компонентом и всеми 77. Отказ от тёмной темы — не то место, где экономят вес.

Замерено 2026-08-29 · core 0.38.0 · preset 0.15.0 · gzip

Модель

Четыре слоя, каждый собран из предыдущего. Имя продукта и есть его архитектура.

01

Tokens

Цвет, отступы, радиусы, движение и слои — именованными ролями.

02

Components

77 в ядре, плюс пакеты-спутники вокруг. Каждый берётся отдельно от прочих.

03

Patterns

Композиции под задачу: формы, поиск, настройки, оверлеи.

04

Interfaces

Целые экраны. Компонент полезен. Система ценна.

Живые, а не картинки

Восемь компонентов, с которыми встретишься первыми.

Каждый смонтирован прямо здесь и отвечает на клавиатуру так же, как будет отвечать у вас. Карточка ведёт на страницу компонента.

GrButton

The same matrix that lived in `playground-5`: for each `tone` you can see live buttons and force-rendered `hover`, `focus`, and `active` states across all `variant`s.

tone: primary

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: neutral

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: success

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: warning

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: danger

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: info

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: slate

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

tone: azure

Live + 4 states × 5 variants
state \ variant primarysecondaryoutlineghostghost-border
Live
Rest
Hover
Focus
Active

GrInput

GrSelect

designplatform

GrDataTable

Номер
Маршрут
Перевозчик
Вес
Прибытие
Статус
SH-1043Санкт-Петербург — КазаньСеверный экспресс12,4 т14 августаВ пути
SH-1044Новороссийск — ПермьЮгТранс8,1 т16 августаПогрузка
SH-1045Владивосток — ИркутскДальлогистика21,7 т19 августаЗадержка

Номер закреплён слева, статус справа — при горизонтальной прокрутке они остаются на месте. Ширина тянется за правый край заголовка; с клавиатуры — стрелками на ручке, Enter возвращает колонку к авторазметке.

GrTabs

Overview tab is the default landing surface for a compact summary.
Active tab: overview

GrCommandPalette

or press K

Last command: · theme: light — try J without opening the palette.

GrToaster

One active `GrToaster` host is enough because `useToast` shares a global reactive store.

Все 108 компонентов из 8 пакетов

Основы

Токен — это роль, а не hex-код.

Цвет, отступ, радиус, движение и слои — именованные роли, прочитанные из пакета. Меняются значения, компоненты следуют за ними: 197 токенов в обеих темах.

Смотреть основы

От пустого проекта до кнопки

Три шага и ни одного генератора.

  1. 01

    Поставить

    yarn add @feugene/granularity vue @floating-ui/dom
  2. 02

    Импортировать

    import { GrButton } from '@feugene/granularity/components/GrButton'
  3. 03

    Отрисовать

    <GrButton tone="primary">Save</GrButton>

Полный путь — с конфигом UnoCSS и тремя импортами CSS — на странице быстрого старта. Он тоже помещается в один экран. Быстрый старт

Открытая разработка

Всё здесь проверяемо.

Версия ядра
0.41.0
Лицензия
LicenseRef-Granularity-EUC-1.1Apache-2.0 с оговоркой об этичном использовании: source-available, не OSI-лицензия.

Начните собирать на Granularity.

Самая короткая полезная страница — быстрый старт. Остальная документация подождёт, пока не понадобится.

Быстрый старт