Для реализации мультибрендовой поддержки в приложении на Chakra UI ключевым элементом является управление темами и глобальными стилями. Chakra UI предоставляет мощный механизм ThemeProvider, который позволяет динамически менять визуальные параметры в зависимости от бренда.
Для начала необходимо установить Chakra UI и необходимые зависимости:
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion
Далее создаётся ThemeProvider с базовой темой:
import { ChakraProvider, extendTheme } from "@chakra-ui/react";
const baseTheme = extendTheme({
colors: {
brandPrimary: "#3182ce",
brandSecondary: "#2c5282"
},
fonts: {
heading: "Inter, sans-serif",
body: "Inter, sans-serif"
}
});
function App({ brandTheme }) {
return (
{/* Компоненты приложения */}
);
}
Для мультибрендового приложения создаются отдельные объекты тем для каждого бренда. Они могут включать цветовые палитры, типографику, размеры компонентов, глобальные стили:
const brandThemes = {
brandA: extendTheme({
colors: {
brandPrimary: "#ff6347",
brandSecondary: "#ff4500"
},
fonts: { heading: "Roboto, sans-serif" }
}),
brandB: extendTheme({
colors: {
brandPrimary: "#1e90ff",
brandSecondary: "#104e8b"
},
fonts: { heading: "Montserrat, sans-serif" }
})
};
Применение темы выбирается динамически на основе состояния приложения или URL-параметров:
const selectedBrand = "brandA";
Chakra UI поддерживает overrides для отдельных
компонентов через components в теме:
const brandATheme = extendTheme({
colors: { brandPrimary: "#ff6347" },
components: {
Button: {
variants: {
solid: props => ({
bg: props.colorMode === "dark" ? "brandPrimary" : "brandSecondary",
color: "white",
_hover: { bg: "red.500" }
})
}
}
}
});
Это позволяет создавать уникальные визуальные элементы для каждого бренда без дублирования кода.
Для интерактивного переключения бренда можно использовать React context или глобальное состояние через Redux/ Zustand:
import { createContext, useContext, useState } from "react";
const BrandContext = createContext();
export function BrandProvider({ children }) {
const [brand, setBrand] = useState("brandA");
return (
{children}
);
}
export function useBrand() {
return useContext(BrandContext);
}
Компоненты, подключённые к контексту, смогут автоматически реагировать на изменение темы:
function BrandSwitcher() {
const { brand, setBrand } = useBrand();
return (
);
}
Chakra UI позволяет задавать глобальные стили через
styles.global и использовать
CSS-переменные, что облегчает смену цветов и шрифтов на
лету:
const theme = extendTheme({
styles: {
global: props => ({
"body": {
bg: props.colorMode === "dark" ? "gray.800" : "white",
color: "var(--chakra-colors-brandPrimary)"
}
})
}
});
Использование переменных особенно удобно для темизации сторонних компонентов и наследования цветов в styled-составных элементах.
theme.brandA.js,
theme.brandB.js.Для сложных проектов часто используется дизайн-система, где каждый бренд имеет свой набор tokens:
brandPrimary, brandSecondary,
accent)heading, body)spacing, borderRadius,
shadow)Эти токены затем подключаются к Chakra UI theme, что позволяет автоматически масштабировать интерфейс под разные бренды без переписывания компонентов.