Создание темы
Тему PrimeVue создаёт фасад. Модули потребляют эту тему; они не создают параллельные мини-дизайн-системы.
Сейчас Wippy запускает PrimeVue с theme: 'none'. Внешний вид компонентов обеспечивают написанный на Tailwind CSS PrimeVue от Wippy, публичные рантайм-переменные и настройки фасада.
Где чему место в оформлении
| Аспект оформления | Владелец |
|---|---|
| Внешний вид компонентов PrimeVue, общий для всего продукта | Тема PrimeVue фасада в custom_css и публичные переменные темы |
| Только оболочка интерфейса хоста | CSS фасада, ограниченный .wippy-host-app |
Общее правило .p-*, предназначенное для корней хоста и потомков |
Глобальный custom_css фасада; область хоста не требуется |
| Переопределение темы только для одной страницы | Конфигурация страницы с поддерживаемым фронтенд-регистром имён |
| Доменная вёрстка или новая структура | CSS модуля или Tailwind |
| Необходимая нестандартная часть вне PrimeVue | CSS модуля с переиспользованием публичных токенов и документированных инвариантных утилит |
| Одна и та же не-PrimeVue-часть, нужная нескольким вашим модулям | Общий пакет — см. Слой дизайна |
| Произвольный класс, ожидаемый от одного фасада | Непереносимо; запрещено правилом FE-STYLE-001 |
Глобальное правило .p-drawer-content — корректная реализация темы, когда оно предназначено для каждого Drawer в корнях хоста и потомков. .wippy-host-app .p-drawer-content уместно, только когда правило специфично для хоста.
Перенос дублирующегося CSS модуля в CSS фасада не устраняет зависимость. Если селектор не входит в общий словарь темы PrimeVue, он создаёт приватный контракт фасада. Место для словаря, общего для ваших собственных модулей, но отсутствующего в теме, — опубликованный пакет: см. Слой дизайна.
Семантическое равенство
Семантически эквивалентные элементы управления должны выглядеть одинаково. Предпочитайте компоненты PrimeVue напрямую. Когда действительно нужен собственный элемент управления, определите его визуального «родственника» в PrimeVue и используйте те же публичные рантайм-свойства для цвета, границ, фокуса, состояния и любой геометрии, классифицированной как theme-variable.
Собственная часть может владеть только новой структурой, которой у родственника нет. Переиспользуйте документированные контракты темы для отступов, размеров, типографики, скруглений, теней, фокуса и анимации везде, где они существуют. Не копируйте текущий литерал из сгенерированного CSS компонента, называя это наследованием.
Рантайм-свойства против инвариантных
У каждого общего свойства внешнего вида одна политика:
theme-variable: оно должно разрешаться через документированную публичную рантайм-переменную.platform-invariant: общее скомпилированное значение Tailwind намеренно стабильно во всех совместимых темах.
Не добавляйте рантайм-токены ради теоретической гибкости. Добавляйте или принимайте токен только после того, как реестр действующих контрактов докажет наличие реального пробела во время выполнения, точного поддерживаемого пути, реального потребителя и свидетельств изменяемости.
Транспорт CSS не даёт разрешения
Страницы получают стили в iframe. Веб-компоненты могут получать стили внутри shadow root. Это объясняет, где CSS может подействовать; это не даёт модулю права зависеть от произвольных селекторов фасада.
Переключение режима во время выполнения
Публичный контракт режима темы — это AppConfig плюс @wippy-fe/proxy:
import { host, on } from '@wippy-fe/proxy'
async function setThemeMode(mode: 'auto' | 'light' | 'dark') {
await new Promise<void>((resolve, reject) => {
const stop = on('@theme', (appliedMode) => {
if (appliedMode !== mode) return
stop()
const currentMode = host.getThemeMode()
if (currentMode !== mode) {
reject(new Error(`Theme propagation mismatch: ${currentMode}`))
return
}
resolve()
})
host.setThemeMode(mode)
})
}
await setThemeMode('dark')
Используйте только auto, light или dark. Хост владеет применением и
рекурсивным распространением в дочерние контексты; фасад/встраивающая сторона
владеет сохранением. Прямое редактирование w-theme-dark / w-theme-light,
вызов внутренних помощников темы, запись глобальных переменных AppConfig или
отправка сообщений хосту обходят этот контракт и являются несоответствующими.
Визуальные свидетельства действительны только после того, как публичный API
сообщил о распространённом режиме.
См. Контракт Tailwind, Каталог токенов и Контракт переносимого UI.