Основы CSS
Правило, селектор, свойство и значение
CSS-файл — обычный текст с расширением.css. Вот условный учебный пример, которого нет в разметке лаунчера:
.example-card — селектор, адрес элементов с классом example-card. Точка означает класс. Фигурные скобки содержат настройки. Каждая строка — объявление: свойство слева от двоеточия и значение справа. Точка с запятой завершает объявление.
background-color задаёт фон, color — текст, border — границу толщиной 1 пиксель со сплошной линией заданного цвета. padding оставляет 16 пикселей внутри вокруг содержимого. border-radius скругляет углы на 8 пикселей. Этот пример ничего не изменит в Xneon Launcher: класса .example-card там нет.
Адреса элементов
Следующие селекторы уже относятся к реальному лаунчеру:> выбирает только непосредственного ребёнка. Например, .code-editor-wrapper > textarea относится к многострочному полю непосредственно в обёртке редактора кода. Селектор без пробела .sidebar-item-btn[data-active="true"] требует одновременно класс и атрибут на одном узле.
Переменные
CSS-переменная — именованное значение. Её имя начинается с двух дефисов;var() подставляет значение в свойство. :root выбирает корневой HTML-элемент, от которого переменные наследуются интерфейсом.
var() прямо или через Tailwind-утилиту. Своя переменная допустима, если вы сами её используете. Например, в этом учебном дополнении --my-shadow придумана автором темы, а ID кнопки — реальный:
Оформление небольшого элемента
#00000033 — чёрный с прозрачностью. letter-spacing меняет расстояние между буквами. transition делает изменение фильтра плавным. После вставки проверьте также состояние остановки и загрузки; CSS не меняет их логику.
Каскад и !important
Каскад — способ выбрать итоговое значение, когда несколько правил задают одно свойство. В пределах одинакового источника и уровня важности сначала учитываются слои CSS, затем специфичность, затем порядок. Специфичность — «точность адреса»: ID обычно сильнее класса/атрибута/псевдокласса, они сильнее селектора тега. Например, #launcher-sidebar .sidebar-item-btn сильнее .sidebar-item-btn. При одинаковой специфичности побеждает более позднее правило.
Обычный inline-стиль style="..." сильнее обычного правила таблицы стилей. !important повышает приоритет отдельного объявления; его не следует писать повсюду. У важных объявлений порядок слоёв обращается, поэтому простое увеличение числа ID не решает все конфликты.
ThemeEditor размер редактора задаётся inline как 12px, поэтому такой приём имеет конкретную причину. Для переменных обычного CSS темы !important обычно не нужен: лаунчер переносит свою базу в предшествующий <style>. Сначала ищите конфликт, затем повышайте приоритет.
Комментарии и ошибки
Комментарий записывается как/* пояснение */. Строка // пояснение не является обычным CSS-комментарием. Не забудьте ;, двоеточие и закрывающую }. Используйте #ffffff, а не ffffff для обычного CSS-цвета; исключения визуального HEX-поля не меняют синтаксис CSS.
Браузер часто отбрасывает только невалидное объявление и продолжает читать остальное. Поэтому отсутствие сообщения об ошибке редактора не доказывает корректность всех правил. Удаляйте последний добавленный фрагмент и возвращайте его по строке, если причина неясна.
Как лаунчер применяет тему
Файлы и способы стилизации
В
src/ и components/ найдены четыре собственных CSS-файла. SCSS, Less и CSS Modules в этой области исходников не обнаружены. Это не отменяет CSS зависимостей: Tailwind, tw-animate-css и подключённых шрифтов.
Большинство JSX-компонентов содержит className с Tailwind-утилитами (bg-card, text-muted-foreground, rounded-xl, hover:...). Tailwind генерирует CSS при сборке. @theme inline связывает цветовые утилиты с базовыми переменными, например bg-card читает --card. В файле пользовательской темы пишите обычный CSS: директивы сборки @apply, @theme и @custom-variant не обрабатываются редактором.
JSX также использует условные классы через cn, SVG-атрибуты и inline-стили — ширины прогресса, координаты, цвета превью, размер шрифта редактора. React обновляет их при изменении данных. Правило CSS сохраняется при перерисовке, ручная правка DOM через DevTools может быть заменена следующим рендером.
Применение и порядок
Инжекция CSS здесь означает подключение текста оформления к документу лаунчера через элементы<style>. Её выполняет механизм применения темы после «Применить CSS», сохранения или выбора темы. Prism.js отвечает за подсветку текста в редакторе, а «Инспектор CSS» помогает найти селектор. Это разные части работы с темой.
applyThemeубирает переменные, классы эффектов и оба<style>предыдущей темы.- Выбирает режим, переключает
.darkиdata-theme-modeна<html>. - Применяет палитру/акценты, семантические цвета, шрифт, фон и эффекты.
- Если включён непустой пользовательский CSS, переносит управляемые корневые inline-значения в
style#theme-base-css, а после него создаётstyle#theme-custom-cssс вашим CSS. - При смене темы эти правила заменяются; при выборе пресета пользовательский CSS прежней темы не остаётся.
:root { --primary: ...; } работает без !important против базы темы. Но адресный селектор с ID или inline-стиль конкретного элемента может потребовать более точного переопределения. Большая часть Tailwind находится в именованных слоях, обычное правило темы вне слоя имеет приоритет над обычными правилами этих слоёв. В src/index.css есть и правила вне слоёв — с ними учитываются специфичность и порядок.
CSS ленивой страницы может подключиться при первом открытии, особенно в dev. Для .agent-* не полагайтесь только на расположение одинаковых правил: задавайте контекст, например .agent-page .agent-composer. Итог проверяйте после открытия страницы.
Разбор текста и сохранение
Парсер читает первый блок:root. Распознанные HEX-значения 20 цветов переносит в палитру, восьмизначные HEX свечения — в параметры свечения, основную гарнитуру и размер в px — в настройки шрифта. Остальной CSS хранится как текст. Восстановимые ведущие блоки палитры удаляются из этого текстового хвоста, чтобы при повторном открытии не накапливались копии. Блок с собственными объявлениями сохраняется.
Практическое правило: держите палитру в первом :root, используйте #rrggbb, а адресные правила размещайте ниже. RGB/HSL/OKLCH допустимы в CSS, но могут не синхронизироваться с визуальным выбором цветов и миниатюрой. Парсер формата — не полноценный CSS-валидатор. Ограничение сохранённого theme.css при нормализации — 1 МиБ текста.
CSS связанных тем читается из папки themes; файл обновляет сохранённый снимок темы. БД (customThemes, выбранный ID — theme) хранит реестр и последнюю рабочую копию, localStorage ускоряет запуск. Соседние .css.json сохраняют структурированные настройки. Очистка только localStorage не удаляет тему. События settings:updated обновляют реестр без перезапуска. Для заставки кешируется отдельный снимок восьми цветов; произвольный CSS и медиа не применяются к самому раннему кадру запуска.
Переменные и палитра
Полная таблица из 166 имён, включая мосты Tailwind и внутренние параметры, находится в THEME_VARIABLES.md. В ней указаны исходные светлые и тёмные значения, результат применения темы, назначение, потребители и рекомендации. Число не включает все автоматически генерируемые--tw-* зависимостей.
20 цветов визуального редактора
Это HEX-значенияDARK_PALETTE, с которых начинается новая своя тема без основы. Активный Core использует собственные OKLCH-акценты; не путайте его с этой базой.
С палитрой
--popover следует за --card, --popover-foreground — за --card-foreground, --secondary — за --muted, --secondary-foreground — за --foreground. Стеклянные поверхности и пять токенов графиков также получают ссылки на палитру. Это позволяет переопределять их отдельным CSS.
Статусы, свечение и размеры
По умолчанию--destructive и --info следуют --primary, а --warning и --success — --accent. Это реальное поведение проекта: фиксированные красный/зелёный для всех тем не гарантируются. Расширенные настройки задают явные цвета статусов; старые Tailwind-цвета red/rose, yellow/amber, blue/sky, green/emerald оттенков 300–700 переназначаются на соответствующий статус. Значки и текст должны помогать различать смысл независимо от цвета.
--glow-primary и --glow-accent включают прозрачность; при обычном создании это цвет акцента с альфой 0.4. --ambient-primary/--ambient-accent — только цвета фоновых свечений, силу отдельного свечения задаёт его компонент. Изменение --primary только произвольным поздним CSS не обязано автоматически пересчитать независимые --ambient-*; при необходимости задайте их тоже.
--radius имеет исходное значение 0.75rem. sm/md ограничены снизу нулём и вычисляются как −4px/−2px, lg равен базе, xl — база +4px. xs, 2xl, 3xl и 4xl также привязаны к базе; собственные CSS-компоненты используют пропорциональные значения. Отдельный --radius-round задаёт круглые/овальные элементы. Поле радиуса в эффектах выставляет и --theme-radius, и общую базу --radius. Адресное авторское правило с явным border-radius по-прежнему имеет собственный смысл и может переопределить токен.
--theme-bg-* влияет на уже созданный слой фона, но не создаёт изображение само. --theme-blur-* требует соответствующей архитектуры эффектов; проще сначала включить эффект визуально. --current-value, --min-value, --max-value — значения реального ползунка, их не нужно подменять ради цвета. Единой пользовательской переменной «все отступы» или «все тени» в проекте нет.