Гибкая настройка внешнего вида административных панелей – боль большинства разработчиков веб-приложений. Особенно если они поставляются как npm-пакеты. Часто такие решения оказываются слишком «жёсткими» в плане внешнего вида: на изменение стилей, адаптацию компонентов под фирменный стиль или просто внесение небольших правок уходит много сил, часов и нервов.
Создавая нашу библиотеку компонентов в Admiral, мы постарались сделать внешний вид панели максимально удобным для кастомизации. В этой статье мы подробно расскажем, как устроена система стилизации, какие подходы и инструменты поддерживают ее гибкость. Вы узнаете, как легко интегрировать собственные стили или переопределять существующие.
Изменение темы приложения
Темы в Admiral работают на основе Consta.design. Если не вдаваться в подробности, то все, что вам необходимо сделать – иметь в своем проекте файлы с переменными, которые задекларированы предопределенными наименованиями.
Директория со всеми необходимыми файлами уже создана и находится здесь. Вы можете менять значения переменных под цели вашего проекта.
Далее передаем ваши пресеты для темной и светлой тем в компонент Admin:
import themeLight from './config/theme/themeLight'
import themeDark from './config/theme/themeDark'
<Admin
themePresets={{light: themeMaterialLight, dark: themeMaterialDark}}
>
<Routes />
</Admin>
В верхней части файлов, где определяются цветовые переменные, располагаются базовые цвета — именно от них строится вся остальная палитра. Достаточно изменить значения этих базовых переменных, чтобы автоматически скорректировать все производные цвета темы.
--color-base-base: #171a22;
--color-base-essential: #fff;
--color-base-project: #472f92;
--color-base-phantom: #bb2121;
--color-base-path: #5856d6;
--color-base-system: #ced8de;
--color-base-success: #62bb46;
--color-base-alert: #eb5757;
--color-base-warning: #f38b00;
--color-base-caution: #f2c94c;
--color-base-normal: #56b9f2;
--color-base-critical: #33000f;
Кастомизация стилей компонентов
При разработке компонентов нашей библиотеки была заложена логика модификации стилей с помощью CSS. Так вы можете открыть интересующий вас компонент в репозитории, например Card и посмотреть, какие переменные необходимо добавить в ваш проект, чтобы изменить определенные стили.
Card.module.scss
.card {
width: var(--card-width, 100%);
padding: var(--card-pt, var(--space-3xl)) var(--card-pr, var(--space-3xl))
var(--card-pb, var(--space-3xl)) var(--card-pl, var(--space-3xl));
border-radius: var(--card-radius, var(--radius-m));
background: var(--card-bg, var(--color-control-bg-default));
color: var(--card-color, var(--color-control-typo-default));
box-shadow: var(--shadow-group);
}
На примере выше, чтобы изменить задний фон компонента Card, достаточно создать CSS-переменную –card-bg, а для изменения скругления границ – переменную –card-radius.
Существует 3 способа добавить эти переменные:
- Глобально
- Постранично
- Локально
Кратко рассмотрим особенности каждого из них.
Глобальное добавление переменных
Если стиль нужно применить ко всем компонентам Card в проекте, создайте переменные в глобальном файле стилей и примените их к псевдоклассу:root.Если у вас уже есть файл с глобальными стилями, создайте переменные в начале файла. При отсутствии файла, создайте его в удобном для вас месте и импортируйте в main.tsx следующим образом:
main.tsx
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import './global.css'
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root'),
)
global.css
:root {
--card-bg: red;
--card-radius: 8px;
}
Постраничное создание переменных
Для переопределения стилей в рамках определенных страниц, оборачиваем их в CSS-класс, которому будут заданы переменные.
Создаём отдельный компонент для страницы.
index.tsx
import React from 'react'
import { CRUD } from '@/src/crud/users'
import styles from './UsersPage.module.scss'
const UsersPage = () => (
<div className={styles.users_page}>
<CRUD.IndexPage />
</div>
)
export default UsersPage
UsersPage.module.scss
Создаём css-файл для страницы.
.users_page {
--card-bg: blue;
--card-radius: 30px;
}
Импортируем компонент страницы в необходимую директорию каталога pages для создания роутинга.
pages/users/index.tsx
import UsersPage from '@/src/components/pages/UsersPage'
export default UsersPage
Локальное создание переменных
В случае, если необходимо переопределить стили конкретных компонентов, оборачиваем их в CSS-класс, которому будут заданы переменные.
Например, когда в верхнем контенте страницы CRUD есть компонент Card и мы хотим изменить его стили, можно сделать так:
index.tsx
export const CRUD = createCRUD({
...config,
topContent: (
<div className={styles.topContent}>
<Card>
<h2>Hello!</h2>
</Card>
</div>
),
})
css-file
.topContent {
--card-bg: green;
--card-radius: 8px;
}
✍ Даже если переменные уже заданы в глобальном файле, локальные переменные будут иметь наибольший приоритет.
Пример ниже показывает, как применяется локальная и постраничная модификация, где локальные переменные переопределяют постраничные.
Помимо темы и кастомизации с изменением CSS-переменных, в большинство компонентов можно передавать className. С его помощью вы будете менять тот или иной компонент. Так кастомизировать вашу панель администратора становится намного проще, если вы используете Admiral.
Остались вопросы по кастомизации внешнего вида панели администратора в Admiral? Мы здесь, чтобы помочь!
📩 Написать нам