Стратегия стилей (Tailwind + DaisyUI)
Контекст: Issue #97, Issue #70 — обсуждения рефакторинга стилей (актуальность стека смотрите по версиям в interface/package.json).
1. Основной выбор
Основа интерфейса — Tailwind CSS v4 + DaisyUI v5.
- Сборка стилей:
@tailwindcss/viteвinterface/vite.config.ts, без отдельногоtailwind.config.jsдля базового конвейера. Вinterface/src/app.css:@import "tailwindcss";и@plugin "daisyui" { themes: corporate --default, business --prefersdark; }. - Новый код (страницы, компоненты, виджеты) пишем с использованием утилит Tailwind и компонентов DaisyUI.
- Существующий SCSS и кастомные классы остаются до постепенной миграции; при доработке старых экранов предпочтительно переводить их на Tailwind/DaisyUI по мере возможности.
2. Для нового кода
2.1 Что использовать
- Разметка и утилиты: классы Tailwind (
flex,gap-4,text-base-content,rounded-boxи т.д.). - Компоненты UI: классы DaisyUI (
btn,btn-primary,card,modal,menu,tabs,alertи т.д.). Темы задаются вapp.cssчерез@plugin "daisyui": corporate (светлая по умолчанию), business с модификатором--prefersdark(тёмная при системной тёмной схеме). Дополнительно в том же файле в@layer baseзаданы кастомные CSS‑переменные и блок@media (prefers-color-scheme: dark)для старых поверхностей (glass, wizard и т.д.) — их постепенно выравнивают с токенами DaisyUI. - Цвета и темы: предпочтительно семантика DaisyUI (
base-content,primary,secondaryи т.д.). Для графиков/Chart.js можно использовать$lib/DaisyUiHelper.ts(получение цветов темы из DOM). - Тёмная тема: в первую очередь атрибут/классы темы DaisyUI и
business --prefersdark. Переход с глобальных переопределений вinterface/src/lib/styles/themes/_dark-theme.scssна единый слой DaisyUI — постепенно, по мере переноса экранов.
2.2 Когда допустимы исключения (SCSS / scoped-стили)
Допускается использовать SCSS (глобальные модули или <style lang="scss"> в компоненте) в случаях:
- Сложные миксины, которые нецелесообразно дублировать утилитами (например компактные сетки, повторяющиеся блоки с вложенностью).
- Специфичные анимации или эффекты (keyframes, сложные transition), если их проще держать в SCSS.
- Легаси или участки, запланированные к миграции позже — до переноса на Tailwind/DaisyUI можно оставлять текущие SCSS-классы.
При добавлении нового SCSS-кода желательно ограничиваться компонентом (<style lang="scss"> с @use общих модулей при необходимости) и не плодить новые глобальные классы без согласования.
3. Общие переменные и миксины
3.1 Текущее разделение (пока устраивает)
- CSS-переменные (цвета, тени, радиусы, z-index, glass-эффекты) задаются в
interface/src/app.cssв:rootи в@media (prefers-color-scheme: dark). Их можно использовать и в Tailwind-разметке (например черезvar(--primary-500)в произвольных значениях), и в SCSS. - Брейкпоинты и прочие SCSS-переменные — в
$lib/styles/base/_variables.scss(выровнены под Tailwind). Подключаются через@useв тех компонентах, где нужны миксины или медиа-запросы на эти переменные. - Миксины (glassmorphism, flex-center, dark-theme-color, compact-points и т.д.) — в
$lib/styles/base/_mixins.scss. Используются только в SCSS (глобальном или в компонентах с@use).
При миграции участков на Tailwind можно заменять использование миксинов эквивалентными утилитами или темами DaisyUI; переменные из app.css при необходимости оставить как общий слой токенов.
3.2 Как подключать в компонентах
- Только Tailwind/DaisyUI: достаточно глобального
app.css(уже в layout); дополнительные импорты не нужны. - SCSS (исключения): в компоненте в
<style lang="scss">использовать@use "$lib/styles/base/variables" as v;и/или@use "$lib/styles/base/mixins" as m;при необходимости. Для существующих блоков (настройки, таблицы, wizard) по-прежнему допускается@useсоответствующих модулей из$lib/styles/...(см. frontend.md).
4. Flowbite-svelte
Итог: зависимости Flowbite удалены. Popover заменён на DaisyUI tooltip (ValveParameters, KpnPopover), Spinner — на DaisyUI loading во всех компонентах, иконки — на Tabler (unplugin-icons). Новый функционал реализовывать на DaisyUI/Tailwind/Tabler, без Flowbite.
5. Очищенные/удалённые модули
Удалены неиспользуемые SCSS-модули (_buttons.scss, _modals.scss, _tabs.scss, _inputs.scss); стили кнопок, полей ввода, модалок и вкладок задаются в +layout.svelte и в компонентах (см. frontend.md).
6. Документация и ссылки
- Описание существующих SCSS-классов и миксинов: frontend.md.
Ссылка на эту стратегию добавлена в frontend.md и при необходимости может быть добавлена в README или в общий индекс документации.