コンテンツにスキップ

トークン

Hypermedia Components の視覚上の決定は DTCG 形式の JSON ファイルに 置かれ、--hc-* CSS カスタムプロパティとして出力されます。CSS の コンポーネント層は変数を読むだけで、16 進カラーやピクセルサイズを ハードコードすることはありません。

トークンには 4 つのレイヤーがあり、それぞれ単一の目的を持ちます:

1. Primitive → 生の値: カラースケール、スペーシング、角丸、フォントサイズ。
2. Semantic → UI 上の意味: bg, surface, text, border, action.primary。
3. Component → コンポーネントの値: ボタンの高さ、入力欄の枠線、カードの角丸。
4. Theme / density → light / dark、comfortable / compact / dense。

コンポーネント CSS が消費するのは component または semantic の 変数です — primitive を直接使うことはありません。primitive は匿名のまま にし、semantic レイヤーで意味を与えることで昇格させます。

packages/core/src/tokens/
primitive.tokens.json ← 値のみ。CSS 変数としては出力されない
semantic.tokens.json ← :root, [data-theme="light"]
component.tokens.json ← :root
theme.dark.tokens.json ← [data-theme="dark"]

小さなビルドスクリプト(scripts/build-tokens.mjs)が レイヤーをまたぐ {group.path} 参照を解決し、@layer hc.tokens で包んだ dist/hc.tokens.css を出力します。

トークンは $type$value を持つ葉ノードです。参照は波かっこと、 ファイル名前空間からのドット区切りパスで書きます。

{
"color": {
"bg": {
"$type": "color",
"$value": "{primitive.color.gray.50}"
}
}
}

解決は再帰的です — semantic トークンは primitive を、component トークンは semantic トークンを参照でき、以下同様です。

出力される変数名は、ファイルのトップレベル名前空間を除いた残りの JSON パスをハイフンで連結し、--hc- を前置したものです:

JSON パスCSS 変数
semantic.color.bg--hc-color-bg
semantic.color.action.primary.bg--hc-color-action-primary-bg
component.button.primary.bg--hc-button-primary-bg
component.field.label-font-size--hc-field-label-font-size

ライトのデフォルト値は semantic.tokens.json にあり、 :root, [data-theme="light"] に載ります。ダークの上書きは theme.dark.tokens.json にあり、[data-theme="dark"] に載ります。

テーマを切り替えるには、<html> または <body> に属性を設定します:

<html data-theme="dark"></html>

密度モード(comfortablecompactdense)も同じ属性パターン (data-density="compact")に従います。スケール全体とライブプレビューは トークン · 密度を参照して ください。

すべてが CSS カスタムプロパティなので、下流のアプリケーションはソース トークンをフォークすることなく、任意のスコープで上書きできます。

/* App-wide: rounder buttons, purple primary */
:root {
--hc-button-radius: 999px;
--hc-button-primary-bg: #6d28d9;
--hc-button-primary-hover-bg: #5b21b6;
}
/* Per-region: compact controls inside a sidebar */
.app-sidebar {
--hc-control-height: 32px;
}

これが HC をテーマ化する推奨方法です — @hypermedia-components/core の ソース CSS を直接編集しないでください。

  • レイアウトの基礎値(特定機能内のマージンやグリッドギャップ)。
  • 一度きりのイラスト用カラー。
  • ページ固有のスタイリング。

トークンはコンポーネント間で再利用される決定のためのものです。 一度しか使わない値をトークンにする必要はありません。

  • 命名規則 — CSS 変数、 クラス、属性の命名方法。
  • ボタン — component トークンで完全に駆動されるコンポーネントの例。