Skip to content

テーマとダークモード ​

見た目はすべて @thl-ui/tokens が生成する CSS カスタムプロパティから決まります。コンポーネントは色をハードコードしないため、スキン、ダークモード、独自ブランドはどれもトークンの上書きにすぎません。

スキン ​

12 種類のスキンを内蔵しています: 6 つのブランドカラー × ライト / ダークのサイドバー。

スキンテーマトップバーのグラデーション
default#0277b9#0078bc → #00beda
green#2ecc71#25bf67 → #3fdd82
yellow#ffb136#f2a225 → #ffbb51
red#d6411d#d93c17 → #ff704f
purple#4a23ad#4a23ad → #693fd5
black#282f32#282f32 → #4b555b

-dark を付ける(例: green-dark)と、ダークな #4F5467 のサイドバーになります。設定の theme、または実行時に set({ theme }) で指定します。このサイトのトップバーにあるスキンセレクターで試してみてください。

アクセシブルな色の組み合わせ ​

#2ecc71 のような明るい塗りは、WCAG AA の基準では白い文字を載せられません(2.1:1)。thl-ui は塗りには色相をそのまま使い、補助トークンを追加しています。

トークン用途例
--thl-on-{color}--thl-color-{color} の塗りの上に描くテキスト / アイコンprimary 上は白、success / info / warning 上は濃いインク #1d2326
--thl-color-{color}-textサーフェス上でテキストとして使う色success のテキストは #18713d、danger のテキストは #b5361a
--thl-on-theme, --thl-theme-text現在のスキン用の同じ組み合わせgreen と yellow のスキンではアクティブなタブに暗い文字を使います

すべての組み合わせはライトモードとダークモードで 4.5:1 以上です。これはユニットテストで保証しています(packages/core/src/core.test.ts → token contrast)。primary(#0277b9)と danger(#d6411d)は白い文字を載せられる十分な暗さです。

ダークモード ​

colorMode: 'dark' はサーフェス、テキスト、ボーダーのトークンを切り替えます。'auto' は OS の設定(prefers-color-scheme)に従い、リアルタイムで更新されます。このサイトでは VitePress の外観トグルを colorMode と同期しています。

トークン ​

特によく使うトークン(--thl-*):

トークンライト用途
--thl-themeスキンアクセント: アクティブなメニュー、フォーカス、ホバー時のリンク、primary の強調
--thl-topbar-1, --thl-topbar-2スキントップバーのグラデーション
--thl-color-{primary,success,info,warning,danger,inverse,purple,…}パレットセマンティックカラー
--thl-body-bg#f4f8f9ページ背景
--thl-surface, --thl-surface-muted#fff, #f7fafcカード、入力欄、テーブルのストライプ
--thl-border-color#e5ebecボーダー
--thl-text, --thl-text-strong, --thl-heading, --thl-link文字色
--thl-sidebar-bg, --thl-sidebar-text, --thl-sidebar-activeサイドメニュー
--thl-font-family, --thl-font-size, --thl-line-heightOpen Sans, 14px, 1.6
--thl-radius-sm, --thl-radius, --thl-radius-lg2 / 4 / 6pxradius: 'sharp' → 0
--thl-topbar-height, --thl-sidebar-width, --thl-sidebar-mini-width60 / 265 / 60pxレイアウト
--thl-z-base1000zIndex 設定から

全一覧: node_modules/@thl-ui/styles/dist/tokens.css。

独自ブランド ​

自分の CSS でトークンを上書きします。グローバルにもスキンごとにも指定できます。

css
:root {
  --thl-font-family: 'Inter', system-ui, sans-serif;
  --thl-color-primary: #6d28d9;
}

/* 新しいスキン: config.theme = 'brand' を設定 */
[data-thl-theme='brand'] {
  --thl-theme: #6d28d9;
  --thl-topbar-1: #5b21b6;
  --thl-topbar-2: #8b5cf6;
}

/* ダークモードだけを調整 */
[data-thl-color-mode='dark'] {
  --thl-body-bg: #0b0d12;
}

theme の型は ThlSkin です。カスタムスキンではキャストするか型を広げてください: set({ theme: 'brand' as never })。

スコープ付きテーマ ​

トークンはただの CSS 変数なので、任意のサブツリーで別の見た目を使えます。

html
<section data-thl-theme="red" style="--thl-radius: 12px">
  <!-- ここのコンポーネントは red スキンと大きめの角丸を使います -->
</section>

クラスの prefix ​

すべてのクラスは設定可能な prefix 付きの BEM に従います: .thl-btn、.thl-btn--primary、.thl-btn__icon。別の prefix で出荷するには、設定で prefix を指定し、さらに SCSS ソースを $p でコンパイルします。

scss
@use '@thl-ui/styles/scss/index' with ($p: 'acme');

レイアウト ​

layout で AppLayout を 3 種類のシェルに切り替えます。

値シェル
verticalフルサイドバー(265px)
miniアイコンのみのサイドバー(60px)、フライアウトのサブメニュー
horizontal上部のメニューバー

1170px 未満ではサイドバーが自動的にミニになり、768px 未満ではオフキャンバスの drawer になります(components.Sidebar.breakpoint で設定可能)。