Skip to content

テーマカスタマイズ ​

lh-ui-plus は完全な CSS 変数テーマシステムを提供し、中華風テーマ色、ダークモード、紋様背景、実行時の切り替えなど、豊富なカスタマイズ能力をサポートします。

カラーを視覚的に調整して scss を直接エクスポートしたい場合は、テーマスタジオを参照してください。

中華風テーマ色体系 ​

コンポーネントライブラリは伝統的な水墨丹青をデザインのインスピレーションとし、8 種類の中華風のテーマ色を定義しています:

色由来主要色hover用途
靛藍青花瓷の青#2B4C7C#3D649E主要ボタン、リンク、フォーカス状態
松花绿竹の影の青々しさ#5B8C5A#6FA36E成功状態
藤黄秋の葉の黄金色#C4A35A#D4B76F警告状態
朱砂(危険)印泥の朱赤#B23A3A#C45050危険/エラー状態(--lh-danger-*)
黛色水墨の淡彩#7A7A7A#8F8F8F情報状態
金色華貴な古韻#B8860B#D4A843装飾のアクセント(--lh-gold-*)
朱砂红(強調)朱砂の赤寄りの強調バリアント#C43A31#E85D4A強調色(--lh-vermilion-*)
玉色翠竹の清雅#5B8C5A#7AAE7A成功/装飾(松花绿 と同値)

各色は通常 4 つの階層を含み(主要色/hover/active/light 背景色)。主要色と金色には追加で lighter のボーダー色(*-color-border)が提供され、さまざまな場面で適切なコントラストが保たれます。

CSS 変数テーマシステム ​

すべてのテーマ色は CSS カスタムプロパティ(--lh-*)で実現され、合計 88 以上の変数が以下のカテゴリをカバーしています:

色変数 ​

変数プレフィックス説明例
--lh-primary-color主要色の基本値#2B4C7C
--lh-primary-color-hover主要色の hover 状態#3D649E
--lh-primary-color-active主要色の active 状態#1F3A5F
--lh-primary-color-bg主要色の淡い背景#E8EDF3
--lh-success-color成功色#5B8C5A
--lh-warning-color警告色#C4A35A
--lh-danger-color危険色#B23A3A
--lh-info-color情報色#7A7A7A

テキスト変数 ​

変数名説明デフォルト値
--lh-text-primary主要なテキスト#2C2C2C
--lh-text-regular通常のテキスト#5A5A5A
--lh-text-secondary補助的なテキスト#8A8A8A
--lh-text-placeholderプレースホルダー#B0B0B0
--lh-text-disabled無効なテキスト#C8C8C8

ボーダー変数 ​

変数名説明デフォルト値
--lh-border-color-baseデフォルトのボーダー#D8D3CC
--lh-border-color-light軽量なボーダー#E5E0D8
--lh-border-radius-base基本の角丸2px
--lh-border-radius-roundカプセル型の角丸20px

背景変数 ​

変数名説明デフォルト値
--lh-bg-colorコンポーネントの背景#FAF6F0(宣紙の色)
--lh-bg-color-pageページの背景#F5F0EB
--lh-bg-color-overlayオーバーレイの背景rgba(26, 26, 26, 0.4)

シャドウ変数 ​

変数名説明
--lh-box-shadow-baseデフォルトのシャドウ
--lh-box-shadow-light軽量なシャドウ
--lh-box-shadow-lighterごく軽量なシャドウ

フォント変数 ​

変数名説明デフォルト値
--lh-font-familyフォントファミリーNoto Serif SC, STSong, SimSun...
--lh-font-size-base基本のフォントサイズ14px
--lh-font-size-small小さなフォントサイズ13px
--lh-font-weight-primary通常のフォントの太さ400
--lh-font-line-height-primary行の高さ1.8

余白変数 ​

変数名値用途
--lh-spacing-xs4px極小の余白
--lh-spacing-sm8px小さな余白
--lh-spacing-md12px中程度の余白
--lh-spacing-base16px基本の余白
--lh-spacing-lg20px大きな余白
--lh-spacing-xl24px特大の余白

Z-Index 変数 ​

変数名値用途
--lh-z-index-dropdown1000ドロップダウンメニュー
--lh-z-index-modal1050モーダルダイアログ
--lh-z-index-tooltip2000ツールチップ

トランジション変数 ​

変数名値説明
--lh-transition-duration-fast0.25s高速トランジション
--lh-transition-duration-base0.3sデフォルトのトランジション
--lh-transition-duration-slow0.4s低速トランジション

ダークテーマ ​

コンポーネントライブラリはダークテーマのスタイルを内蔵しており、すべての CSS 変数はダークモードで自動的に適合した値に切り替わります。

方式 1:useLhTheme composable 関数を使う ​

Composition API ​

vue
<script setup lang="ts">
import { useLhTheme } from '@lh-ui/vue3'

const { theme, toggleTheme, setTheme } = useLhTheme()
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'ライトに切り替え' : 'ダークに切り替え' }}
    </LhButton>
    <LhButton @click="() => setTheme('light')">ライト</LhButton>
    <LhButton @click="() => setTheme('dark')">ダーク</LhButton>
  </div>
</template>

Options API ​

vue
<script>
import { useLhTheme } from '@lh-ui/vue3'

export default {
  setup() {
    const { theme, toggleTheme, setTheme } = useLhTheme()
    return { theme, toggleTheme, setTheme }
  },
}
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'ライトに切り替え' : 'ダークに切り替え' }}
    </LhButton>
  </div>
</template>

useLhTheme はテーマの状態を自動的に localStorage に永続化します(key: lh-ui-theme)。ページをリロードした後もテーマは失われません。

方式 2:HTML 属性の切り替え ​

ルート要素に data-theme="dark" を設定すると、グローバルにダークモードが有効になります:

html
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
  <!-- ... -->
</html>

カスタムテーマ色(青花瓷 / 松花绿 / 朱砂红) ​

内蔵のライト/ダークテーマに加えて、コンポーネントライブラリは themeVars による任意の色の組み合わせのカスタマイズをサポートし、パーソナライズされたテーマを実現します。

以下の例は手書きでカスタム変数を定義するデモです。解説のために値を調整しており、プリセットテーマの同名の内蔵プリセット(cerblue / songhua / zhusha)とは完全には一致しません。内蔵プリセットをそのまま使うには、useLhPresetTheme または getThemeVars(name) を使用してください。

青花瓷テーマ ​

深い靛藍を主要色とし、伝統的な青花瓷にインスピレーションを得ています。

Composition API ​

vue
<script setup lang="ts">
const cerblueTheme = {
  'primary-color': '#2B4C7C',
  'primary-color-hover': '#3D649E',
  'primary-color-active': '#1F3A5F',
  'primary-color-bg': '#E8EDF3',
  'bg-color': '#F0F4F8',
  'border-color-base': '#C8D6E5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">青花瓷ボタン</LhButton>
    <LhInput placeholder="青花瓷入力フィールド" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { LhConfigProvider, LhButton, LhInput } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton, LhInput },
  data() {
    return {
      cerblueTheme: {
        'primary-color': '#2B4C7C',
        'primary-color-hover': '#3D649E',
        'primary-color-bg': '#E8EDF3',
        'bg-color': '#F0F4F8',
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">青花瓷ボタン</LhButton>
  </LhConfigProvider>
</template>

松花绿テーマ ​

竹の緑をアクセントにし、清新で自然な雰囲気を演出します。

vue
<script setup lang="ts">
const bambooTheme = {
  'primary-color': '#5B8C5A',
  'primary-color-hover': '#6FA36E',
  'primary-color-bg': '#EDF5EC',
  'success-color': '#5B8C5A',
  'bg-color': '#F6FAF5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="bambooTheme">
    <LhButton type="primary">竹林の小径</LhButton>
    <LhTag type="success">新葉</LhTag>
  </LhConfigProvider>
</template>

朱砂红テーマ ​

印泥の朱赤を基調とし、典雅で華貴な雰囲気を際立たせます。

vue
<script setup lang="ts">
const vermilionTheme = {
  'primary-color': '#C43A31',
  'primary-color-hover': '#E85D4A',
  'primary-color-bg': '#FDF0EE',
  'bg-color': '#FFFBF9',
  'border-color-base': '#F0D5CF',
}
</script>

<template>
  <LhConfigProvider :theme-vars="vermilionTheme">
    <LhButton type="primary">丹書鉄券</LhButton>
  </LhConfigProvider>
</template>

紋様背景システム ​

コンポーネントライブラリは中華風の詩的な紋様背景システムを提供し、6 種類のプリセット紋様をサポートします。patternComponents のホワイトリストと組み合わせて適用範囲を正確に制御できます。

プリセット紋様 ​

紋様名CSS 変数説明
柳葉var(--lh-pattern-willow)細長い柳の葉、疎密のバランス
祥雲var(--lh-pattern-cloud)祥雲が広がり、蜿蜒と流れる
水波var(--lh-pattern-water)涟漪が微かに動き、幾重にも重なる
雪花var(--lh-pattern-snow)六角の雪花、細い枝が分かれる
梅花var(--lh-pattern-plum)五弁が広がり、蕊の中心がはっきりと
竹葉var(--lh-pattern-bamboo)披針形の竹の葉、雑然とせず整然と並ぶ

グローバルな紋様設定 ​

Composition API ​

vue
<script setup lang="ts">
const config = {
  themeVars: {
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input'] as const,
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <!-- ボタンと入力フィールドに紋様が適用され、Dialog には適用されない -->
    <LhButton>紋様付きボタン</LhButton>
    <LhInput placeholder="紋様付き入力フィールド" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
export default {
  data() {
    return {
      config: {
        themeVars: {
          'bg-pattern': 'var(--lh-pattern-cloud)',
          'bg-pattern-opacity': '0.15',
        },
        patternComponents: ['button', 'input'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <LhButton>紋様付きボタン</LhButton>
  </LhConfigProvider>
</template>

紋様変数リファレンス ​

変数名説明デフォルト値
--lh-bg-pattern紋様背景の URLnone
--lh-bg-pattern-repeatタイリングモードrepeat
--lh-bg-pattern-size紋様のサイズ40px
--lh-bg-pattern-opacity紋様の不透明度0.15
--lh-bg-pattern-color紋様の色var(--lh-decoration-color, rgba(184, 134, 11, 0.12))
--lh-bg-pattern-blendブレンドモードsoft-light

完全な設定例 ​

以下は ConfigProvider の完全な設定の使用例で、テーマ、言語、サイズ、紋様などのすべての能力を統合しています。

Composition API ​

vue
<script setup lang="ts">
import { zhCN } from '@lh-ui/vue3'

const configProvider = {
  size: 'medium' as const,
  locale: zhCN,
  themeVars: {
    'primary-color': '#2B4C7C',
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input', 'dialog'],
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { zhCN } from '@lh-ui/vue3'

export default {
  data() {
    return {
      configProvider: {
        size: 'medium',
        locale: zhCN,
        themeVars: {
          'primary-color': '#2B4C7C',
          'bg-pattern': 'var(--lh-pattern-cloud)',
        },
        patternComponents: ['button', 'input', 'dialog'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

テーマ変数の優先順位 ​

コンポーネントが最終的に使用する CSS 変数は、以下の優先順位でマージされます(後のものが前のものを上書きします):

  1. ConfigProvider のグローバル themeVars(最優先順位が低い)
  2. ConfigProvider のコンポーネント別 componentTheme[コンポーネント名]
  3. コンポーネント自身の themeVars prop
  4. コンポーネント自身の bgPattern prop(最優先順位が高い)

bg-pattern 変数については、さらに patternComponents ホワイトリストの制御を受けます:ホワイトリストに含まれるコンポーネントだけがグローバル設定の bg-pattern を適用します。

sx クイックレイアウト ​

sx プロパティは宣言的なインラインレイアウトの方法を提供し、CSS を書かずにコンポーネントの余白とサイズを設定できます。現在以下のコンポーネントでサポートされています:Button、Input、Dialog、Tooltip、Alert、Card、Empty、Breadcrumb、Pagination、Steps、Tabs、Skeleton。

原理 ​

sx は 8px のベースグリッドに基づき、数値に 8 を掛けたものが実際のピクセル値になります。例えば mt: 2 は marginTop: 16px と等価です。

サポートされるプロパティ ​

余白 ​

プロパティ説明例等価な CSS
m四辺の外側余白m: 2margin: 16px
mx水平方向の外側余白mx: 1marginLeft: 8px; marginRight: 8px
my垂直方向の外側余白my: 1marginTop: 8px; marginBottom: 8px
mt, mr, mb, ml一辺の外側余白mt: 2marginTop: 16px
p四辺の内側余白p: 3padding: 24px
px水平方向の内側余白px: 2paddingLeft: 16px; paddingRight: 16px
py垂直方向の内側余白py: 1paddingTop: 8px; paddingBottom: 8px
pt, pr, pb, pl一辺の内側余白pt: 2paddingTop: 16px

サイズ ​

プロパティ説明例
w幅(数値は px、文字列は値そのもの)w: 200 または w: '100%'
h高さh: 100 または h: 'auto'

Flex レイアウト ​

プロパティ説明例
display表示タイプdisplay: 'flex'
flexflex の一括指定flex: '1 1 0%'
flexDirection主軸の方向flexDirection: 'column'
alignItems交差軸の整列alignItems: 'center'
justifyContent主軸の整列justifyContent: 'flex-end'

使用例 ​

vue
<script setup lang="ts">
import { ref } from 'vue'

const visible = ref(false)
</script>

<template>
  <!-- ボタンの余白 -->
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">余白付きボタン</LhButton>

  <!-- 入力フィールドの外側余白 -->
  <LhInput placeholder="入力フィールドの上下余白" :sx="{ my: 1 }" />

  <!-- Dialog の幅:sx は w/h と余白系プロパティのみサポート -->
  <LhDialog v-model="visible" title="例" :sx="{ w: 480 }">
    <p>幅が固定されたダイアログ</p>
  </LhDialog>
</template>
vue
<script>
export default {
  data() {
    return { visible: false }
  },
}
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">余白付きボタン</LhButton>
</template>

国風の美で、コードの基を築く