Пользовательская тема
Пользовательская тема
Создание пользовательской темы
Примечание: АПИ находится в стадии разработки и может измениться в ближайшем будущем. Мы рекомендуем пока использовать встроенные темы.
Хотя встроенные темы обеспечивают некоторый уровень настройки, тип Theme
предоставляется, чтобы помочь вам определить свои собственные пользовательские темы с более низким уровнем доступа к основным переменным темы.
import { RainbowKitProvider, Theme } from '@rainbow-me/rainbowkit';
const myCustomTheme: Theme = {
blurs: {
modalOverlay: '...',
},
colors: {
accentColor: '...',
accentColorForeground: '...',
actionButtonBorder: '...',
actionButtonBorderMobile: '...',
actionButtonSecondaryBackground: '...',
closeButton: '...',
closeButtonBackground: '...',
connectButtonBackground: '...',
connectButtonBackgroundError: '...',
connectButtonInnerBackground: '...',
connectButtonText: '...',
connectButtonTextError: '...',
connectionIndicator: '...',
downloadBottomCardBackground: '...',
downloadTopCardBackground: '...',
error: '...',
generalBorder: '...',
generalBorderDim: '...',
menuItemBackground: '...',
modalBackdrop: '...',
modalBackground: '...',
modalBorder: '...',
modalText: '...',
modalTextDim: '...',
modalTextSecondary: '...',
profileAction: '...',
profileActionHover: '...',
profileForeground: '...',
selectedOptionBorder: '...',
standby: '...',
},
fonts: {
body: '...',
},
radii: {
actionButton: '...',
connectButton: '...',
menuButton: '...',
modal: '...',
modalMobile: '...',
},
shadows: {
connectButton: '...',
dialog: '...',
profileDetailsAction: '...',
selectedOption: '...',
selectedWallet: '...',
walletLogo: '...',
},
};
const App = () => (
<RainbowKitProvider theme={myCustomTheme} {...etc}>
{}
</RainbowKitProvider>;
)
Вы можете расширить встроенную тему, не переопределяя всю тему. Это полезно, когда вы хотите изменить только определенные токены темы.
Для этого установите lodash.merge
(или аналогичный пакет):
Импортируйте его вместе с темой, которую хотите расширить (например, darkTheme
) и типом TypeScript Theme
:
import merge from 'lodash.merge';
import {
RainbowKitProvider,
darkTheme,
Theme,
} from '@rainbow-me/rainbowkit';
Затем объедините встроенную тему с токенами, которые вы хотите переопределить. В этом примере я переопределяю токен accentColor
, чтобы он соответствовал акцентному цвету моего бренда.
const myTheme = merge(darkTheme(), {
colors: {
accentColor: '#07296d',
},
} as Theme);
Наконец, вы можете передать вашу пользовательскую тему свойству theme
провайдера RainbowKitProvider
.
const App = () => {
return (
<RainbowKitProvider theme={myTheme} {...etc}>
{}
</RainbowKitProvider>
);
};
Если ваше приложение рендерится на сервере/статично и позволяет пользователям вручную переключаться между темами, система тем RainbowKit может быть подключена к пользовательским селекторам CSS с помощью следующих функций, которые могут быть использованы с любой системой CSS-in-JS:
cssStringFromTheme
cssObjectFromTheme
Эти функции возвращают CSS, который устанавливает все необходимые переменные темы. Поскольку поддерживаются как строки, так и объекты, это можно интегрировать с любой системой CSS-in-JS.
В качестве основного примера вы можете отрисовать собственный элемент style
с пользовательскими селекторами для каждой темы. Поскольку мы контролируем рендеринг CSS темы, мы передаем null
свойству theme
, чтобы RainbowKitProvider не рендерил никаких стилей для нас. Также обратите внимание на использование опции extends в функции cssStringFromTheme, которая исключает любые переменные темы, которые такие же, как в базовой теме.
import {
RainbowKitProvider,
cssStringFromTheme,
lightTheme,
darkTheme,
} from '@rainbow-me/rainbowkit';
const App = () => {
return (
<RainbowKitProvider theme={null} {...etc}>
<style
dangerouslySetInnerHTML={{
__html: `
:root {
${cssStringFromTheme(lightTheme)}
}
html[data-dark] {
${cssStringFromTheme(darkTheme, {
extends: lightTheme,
})}
}
`,
}}
/>
{}
</RainbowKitProvider>
);
};