テーマカスタマイズ
@lh-ui/react のデザイントークンはすべて @lh-ui/share/theme に由来し、本ライブラリは一切のトークンの複製を持ちません。テーマのカスタマイズとは、これらの CSS カスタムプロパティを上書きすることです。
トークンの階層
スタイルの優先順位は低い順に:
theme.css——@lh-ui/shareが発行する基礎トークン(--lh-primary-colorなど)theme-dark.css—— 暗色変数(theme.cssと排他、どちらかを選ぶ)LhConfigProviderのthemeVars—— ラップした要素にかけられるカスケード変数- コンポーネントの
themeVarsprop —— コンポーネントのルート要素にかかり、上位のすべてを上書き
ConfigProvider でカスタマイズする
最も推奨される方法:アプリのルートで themeVars を渡します。キー名には --lh- 接頭辞をつけません(内部で自動的に付加されます):
import { LhConfigProvider } from '@lh-ui/react'
export default function App() {
return (
<LhConfigProvider
themeVars={{
'primary-color': '#722ed1',
'bg-color': '#faf9f7',
'border-radius-base': '6px',
}}
>
<YourApp />
</LhConfigProvider>
)
}
変数はラップした要素の style="--lh-primary-color: #722ed1; ..." として描画され、下にカスケードします。
使用可能なトークン
| キー | 説明 |
|---|---|
primary-color | メインカラー |
success-color / warning-color / danger-color / info-color | セマンティックカラー |
gold-color / vermilion-color / jade-color | 中華風専用カラー(金黄 / 朱砂 / 翡翠) |
bg-color / text-color / border-color | ニュートラルカラー |
bg-pattern | 紋様背景の URL(例:var(--lh-pattern-willow)) |
bg-pattern-opacity / bg-pattern-color | 紋様の不透明度と色 |
decoration-color | 装飾色 |
単一コンポーネントのカスタマイズ
テーマをサポートするコンポーネントはどれも直接 themeVars を受け取り、自身にだけ影響します:
<LhButton themeVars={{ 'primary-color': '#13c2c2' }}>シアンのボタン</LhButton>
componentTheme でコンポーネント名ごとに一括設定もできます(キー名はファミリーの他のライブラリと共通):
<LhConfigProvider
componentTheme={{
button: { 'primary-color': '#722ed1' },
input: { 'border-color': '#d9d9d9' },
}}
>
<YourApp />
</LhConfigProvider>
優先順位:コンポーネント自身の props > componentTheme[コンポーネント名] > グローバル themeVars。
背景の紋様
中華風の背景紋様はデフォルトでオフです。patternComponents のホワイトリストで有効化し、ホワイトリストにあるコンポーネントだけがグローバルな紋様を適用します:
<LhConfigProvider
themeVars={{ 'bg-pattern': 'var(--lh-pattern-willow)' }}
patternComponents={['dialog', 'card']}
>
<YourApp />
</LhConfigProvider>
コンポーネントが自身の bgPattern prop で渡す紋様はホワイトリストの制限を受けません。
sx によるクイックレイアウト
一部のコンポーネントは sx prop をサポートし、よく使うレイアウトスタイルをオブジェクトで書けます(セマンティクスは emotion / MUI の sx と同じ):
<LhButton sx={{ marginTop: 2, width: '100%' }} block>
全幅ボタン
</LhButton>
ランタイムでの切り替え
テーマ切り替えの本質は CSS 変数を変えることなので、完全に動的にできます:
import { useState } from 'react'
import { LhConfigProvider } from '@lh-ui/react'
function App() {
const [primary, setPrimary] = useState('#1677ff')
return (
<LhConfigProvider themeVars={{ 'primary-color': primary }}>
<input type="color" onChange={(e) => setPrimary(e.target.value)} />
<YourApp />
</LhConfigProvider>
)
}
ソースコードで style="{ { '--lh-primary-color': x } }" と書くと TypeScript はエラーを出します(CSSProperties にカスタムプロパティのキーはない)。本ライブラリは cssVarsStyle() ユーティリティでキー名の変換とアサーションを一元的に処理しており、コンポーネント内部にカプセル化されているためユーザー層は気にする必要がありません。