Огляд
50 примітивіводна система для всіх фронтів

glass-ui: скло на вуалі

Колір живе у даних і діях, контейнери — нейтральне матове скло. import { Button, DataTable, PageShell } from "@residence/glass-ui"

Анатомія сторінки

Кожен екран платформи — цей скелет: PageShell (вуаль) → PageHeader → метрики → Surface-драбина 1→2→3. Нижче він зібраний наживо.

Журнал проводок

Активний період

PageHeader: крихти, заголовок, статус і дії — один компонент.

Оборот
₴ 1 250 400
+12% до червня
Контрагентів
184
Чернеток
7
Surface level 1: блок сторінкиавто-вкладеність
Surface level 2: секція
level 3: листова плитка
level 3: листова плитка

Кнопки

Чотири рівні за «гучністю» дії: Primary (насичена), Soft (кольорова тиха), Secondary (нейтральна рамка), Tertiary (прозора). Одна Primary на зону. Схема blue читає глобальну палітру — зміни її кнопкою «Палітра».

Стан × роль
Primaryvariant="solid"
Softvariant="soft"
Secondaryvariant="outline"
Tertiaryvariant="ghost"
Defaultстан спокою
Hoverнавести курсор ↓
Disabledдія недоступна
Loadingвиконується
Коли яку
Primary · solid

Головна дія зони. РІВНО ОДНА на екран/секцію.

Створити · Зберегти · Провести
Soft · soft

Кольорова, але тиха. Акцент тоном без крику: тони, чіп-дії.

Успіх · Інфо · Помилка
Secondary · outline

Вторинна дія поруч із Primary. Нейтральна скляна рамка.

Експорт · Скасувати · Назад
Tertiary · ghost

Тиха дія: icon-only в тулбарі, «Ще», лінк-дія.

Ще · Редагувати · закрити
Разом у тулбарі — одна Primary, решта тихіші
Destructive · rose · для незворотних дій
Розміри · xs → xl + icon-only
Схема кольору = роль, не декорація
blue
Головна дія. Ремапиться палітрою на бренд застосунку.
slate / dark
Другорядне, скасування, службові дії.
rose
Видалення, сторно, незворотні дії.

Решта схем (emerald, amber, orange, violet, pink, teal, indigo) — це палітра для даних (бейджі, статуси, графіки, категорії), а не варіанти кнопок дій. На екрані живе одна Primary-схема, кольори з'являються у даних, не в кнопках.

Вузька колонка · підпис НЕ ламається на два рядки
96px
128px
168px

Заборона живе в самому компоненті, тож сторінка не може її зняти своїм className. Іконка не стискається — місцем жертвує підпис.

Бейджі та статуси

Мітка на даних: Badge — категорія й лічильник, StatusPill — життєвий цикл документа, Pill — тег. Badge має ОДНЕ обличчя і три ваги: варіантів немає, вибирається лише розмір під щільність місця. Жодних ручних кольорових span-ів.

Схема × розмір · єдина вісь Badge
xssize="xs" · щільно
smsize="sm" · дефолт
mdsize="md" · помітно
blueнейтральний факт
24 документи24 документи24 документи
emeraldвсе добре
ОплаченоОплаченоОплачено
amberпотребує уваги
ПДВ 20%ПДВ 20%ПДВ 20%
roseпроблема
ПростроченоПростроченоПрострочено
slateбез забарвлення
ЧернеткаЧернеткаЧернетка

Обличчя одне на всі схеми — те саме мікроскло, що в StatusPill і Pill. Змінюється лише вага: xs для щільних рядків таблиці, sm (дефолт) — робоча, md — коли мітку треба виділити серед сусідніх. Верхньої межі немає навмисно: бейдж не може вирости в заголовок.

Коли який
Badge

Категорія, лічильник, атрибут рядка. Єдиний з іконкою, крапкою та count — і з вибором розміру.

24 документиПДВ 20%
24 документи · ПДВ 20% · Імпорт
StatusPill

Життєвий цикл документа. Щільний однорядковий, з лінзовою крапкою — саме вона відрізняє його від Badge.

ОплаченоОчікує
Оплачено · Очікує · Прострочено
Pill

Тег і контекстна мітка. Найбільший і найтихіший — не стан, а те, до чого запис належить.

комуналкаR2026-07
комуналка · R2026-07
Разом у рядку реєстру — один стан, одна мітка
ЧернеткаНадісланоОчікуєОплаченоПрострочено
Стани з іконками · showDot={false}
ОчікуєВ роботіНадісланоНа перевірціПрийнятоВідхиленоПротерміновано
Начинка · капсула, іконка, крапка, лічильник
капсулаз іконкоюз крапкоюпомилок12
Схема кольору = сенс у даних, не декорація
Оплачено
emerald
Завершено успішно, звірено, нічого не треба робити.
Очікує
amber
Потребує уваги: чекає дії, наближається дедлайн.
Прострочено
rose
Проблема: відхилено, прострочено, не збігається.

У кнопках схема — це роль дії (одна Primary на зону). У мітках навпаки: схема — це сенс самого запису, тому вся палітра (emerald, amber, violet, teal…) законно живе саме тут. Але один сенс = один колір по всьому продукту: якщо «прострочено» десь rose, воно rose скрізь.

Таби

Активний сегмент має ту саму вертикальну градієнт-фізику, що й solid-кнопка. Іконки та лічильники — пропсами, без самопису.

glass · дефолт
glass · size sm · без іконок
block

Таблиці

DataTable закриває 99% реєстрів: сортування, вибір рядків, футер-агрегат, липкі колонки, контекстне меню. Виділи кілька рядків, щоб побачити BulkActionsBar.

РФ-0347ТОВ «Далі-Транс»08.07.2026Оплачено148 200,00 ₴
РФ-0346ОСББ «Кримська 14»07.07.2026Надіслано36 540,50 ₴
РФ-0345ФОП Гайдамака О. В.05.07.2026Прострочено12 780,00 ₴
РФ-0344ТОВ «Ліфт-Сервіс»03.07.2026Оплачено89 400,00 ₴
РФ-0343КП «Київводоканал»01.07.2026Надіслано261 375,20 ₴
РФ-0342ТОВ «Енергозбут»28.06.2026Чернетка5 120,00 ₴
РФ-0341ПрАТ «Будматеріали»26.06.2026Оплачено47 830,75 ₴
Разом: 7 документів601 246,45 ₴
Канон реєстру: Toolbar → BulkActionsBar → DataTable. Гроші — тільки через Money, статуси — StatusPill.

Картки

Три рівні: MetricCard (метрика-число), EntityCard (запис реєстру), Card (скляний контейнер). Контейнер завжди нейтральний — колір живе в іконці, бейджах, даних.

MetricCard · метрика-стрічка
Оборот
₴ 1 250 400
+12% до червня
Контрагентів
184
Чернеток
7
EntityCard · картка запису · icon + title + статуси + поля + футер
Вода
ПоточнийОсновнийКт 311
IBANUA383052990000026001000010001
ПриватБанк· МФО 305299UAH
Послуги ЖК
КапремонтКт 484
IBANUA383052990000026001000010005
ПриватБанк· МФО 305299UAH
ТОВ «Далі-Транс»
Постачальник · договір №2026/14
Активний
ЄДРПОУ48000123
Заборгованість₴ 12 780,00
Платник ПДВостанній док. 08.07
Card · скляний контейнер для довільного вмісту
Довільний вміст

Card = матове скло (LiquidGlass). Коли потрібен контейнер, а не готова структура запису — сюди кладеться будь-що.

Виділена (selected)blue-рамка = стан
EntityCard · пропси
iconReactNodeіконка в кольоровому shell (тип запису)
colorScheme11 схемколір ЛИШЕ icon-shell, контейнер нейтральний
title / subtitleReactNodeзаголовок + опис
statusReactNodeслот праворуч — StatusPill / Badge
fields{label,value,mono}[]поля запису (IBAN → mono)
footerReactNodeнижній рядок з розділювачем
interactive / selectedbooleanлифт при hover / blue-рамка

Форми

FormControl дає label, підказку та помилку одним вузлом; FieldRow розкладає поля в адаптивну сітку. Жодних ручних grid-оберток.

Пошук у реєстрі за назвою або ЄДРПОУ

Перемикачі

Очікування та порожнеча

Стан екрана, поки даних немає. Progress — коли відомо скільки лишилось, Skeleton — коли відома форма майбутнього вмісту, Spinner — коли не відомо нічого, EmptyState — коли даних не буде, доки користувач щось не зробить.

Прогрес · відомо скільки
Skeleton + Spinner · відома форма / нічого
Порожній стан · із виходом
Немає документів

Створіть перший рахунок, щоб побачити його тут.

Сповіщення

Три рівні за гучністю: Toast (ефемерне, в кутку), Banner (на всю ширину, лишається), InlineMessage (тихий рядок). Обери за тим, наскільки повідомлення важливе й де воно живе. Окремо — ЗАДАЧА: тост без таймера, який тримається, доки робота не скінчиться або людина не відповість.

Toast · чотири тони · натисни, щоб спробувати
Ті самі тости на сторінці · без спливання
Документ проведено
РФ-0347 · Дт 361 Кт 703 · ₴ 148 200,00
Синхронізація завершена
184 контрагенти оновлено з реєстру.
Курс НБУ не завантажено
Використано вчорашній курс на 09.07.
Не вдалося провести
Період 06.2026 закритий для змін.
Toast · з дією та постійний (require close)
5 документів видалено
Дію можна скасувати.
Втрачено зв'язок із сервером
Спроби автоматичного перепідключення…
Задача · без таймера · йде по завершенню або по вибору

Таймера немає не за прапорцем, а за формою: щойно у тоста з'являється progress або actions, він перестає рахувати секунди. Смуга, що зникає на 40%, і питання, яке відповідає само собі за чотири секунди, — обидва баги, і обидва тут неможливо написати.

Завантажую «arthur-profile.jpeg»
Зачекайте, готуємось до передачі.
0% завантажено…
Завантажую «arthur-profile.jpeg»
Зачекайте, файл передається.
50% завантажено…
Завантажено «arthur-profile.jpeg»
Файл на місці.
100% завантажено!
Banner · на всю ширину блоку · лишається
Період 06.2026 ще відкритий
Закрийте період, щоб зафіксувати залишки й заборонити зміни заднім числом.
Усі проводки звірено
Оборотно-сальдова відомість збігається з банком.
InlineMessage · тихий рядок усередині блоку
Рахунок обліку підставлено автоматично за типом контрагента.
Сума не збігається з підсумком рядків: різниця ₴ 40,00.
Коли яке
Toast

Результат щойно виконаної дії. Ефемерний — сам зникає за кілька секунд.

«Проведено», «Збережено», «Не вдалося»
Banner

Стан контексту, що триває. Живе на сторінці, доки стан не зміниться.

«Період відкритий», «Режим імперсонації»
InlineMessage

Тиха підказка чи помилка поруч із конкретним полем або в блоці.

«Підставлено авто», «Різниця в сумі»

Оверлеї

Modal для дій, Drawer для перегляду запису, Popover для міні-форм, CommandPalette для ⌘K. Усе з фокус-трапом і єдиною z-шкалою.

Живі приклади

Статистика

Варіанти карточок статистики та фінансових графіків живуть на окремій сторінці. Кольори графіків читають глобальну палітру.

Галерея статистикиKPI-плитки, спарклайни, сегментні бари, heatmap, aging-кошики