Skip to content

🎨 全コンポーネントを新セマンティックトークンへ移行(beta) #298

Description

@touyou

概要

デザイン側でカラートークンのセマンティックレイヤーが刷新されたため、全コンポーネントを新しいセマンティックトークンへ移行する。

未リリースのスタイル更新のため、beta チャネルでリリースするgh workflow run "Publish to npm" の channel: beta)。

前提として sparkle-design-cli 側のトークン生成対応と beta リリースが先行する。

トラッキング: goodpatch/sparkle-design-internal#247

新しいセマンティックトークン体系

用途カテゴリ × 意味 × 強度 × 状態の 4 軸構成。状態(enabled / hover / active / disabled)がトークン名に内包されるのが最大の変更点。

  • surface(背景): base/0,100,200 / neutral|primary|negative × high|middle|low × enabled|hover|active|disabled / info|success|warning × high|middle|low / accent/1..3 / inverse / overlay
  • border(枠線): neutral × extra-high(enabled/hover/disabled)|high|middle|low / primary × extra-high|high|low / negative × extra-high(enabled/hover/disabled)|high|low / info|success|warning / ring
  • object(アイコン等): neutral × high|middle|low|disabled / primary|negative × enabled|hover|disabled / info|success|warning / inverse
  • text: neutral × high|middle|low|disabled / primary|negative × enabled|hover|disabled / info|success|warning / inverse

CSS 変数名はデザイン側のパス構造をそのまま写す(surface/primary/high/enabled--color-surface-primary-high-enabled)。

テーマ切り替えとの関係

  • primary と名の付くトークンが primary 設定に追従する
  • --color-border-ring青系固定で primary には追従しない
  • info / success / warning はステータス色なので固定色相

主な置換パターン

bg-white(背景) surface/base/0
text-white(文字・アイコン) text/inverse / object/inverse
text-text-{high,middle,low,disabled} text/neutral/{high,middle,low,disabled}
text/placeholder text/neutral/low
ring-normal border/ring
border-divider-{low,middle,high} border/neutral/{low,middle,high}
bg-primary-{500,600,700,200} surface/primary/high/{enabled,hover,active,disabled}
bg-primary-{50,100} surface/primary/low/{hover,active}
border-neutral-{500,600} border/neutral/extra-high/{enabled,hover}
secondary-700(アイコン) object/neutral/middle
skeleton-fill surface/base/200
black-alpha-300 surface/overlay
neutral-900(背景) surface/inverse

secondary カテゴリは廃止見込み(用途に応じて object/neutral/* / text/neutral/* に分岐)。

対象コンポーネント(24)

Button, Icon Button, Input, Input Password, Checkbox, Radio, Select, Switch, Slider, Textarea, Form,
Badge, Card, Divider, Tag, Inline Message, Skeleton, Spinner, Dialog, Modal, Overlay, Toast, Tooltip,
Tabs, Breadcrumb, Link, Icon

スタイル置換に留まらない構造変更(要注意)

デザイン側の指示には、単なるトークン差し替えでない変更が含まれる:

  • 枠線の削除: Button / Icon Button の solid バリアントの 1px 枠線、Switch のトラック枠線(12 件)、Badge の白枠線
  • シャドウの差し替え: Card(enable/hover: raise→flat、active: float→raise)、Slider disabled(raise→none)、Button(raise→base)
  • 角丸の変更: Card(minimum→container)、Clickable Card の Focus Ring(値は 8px で不変)
  • トークン統合: Input 系の text/disabled + neutral/400text/neutral/disabled

角丸のセマンティック名も halfModalcontainer にリネームされる(--radius-halfModal は beta 期間の後方互換エイリアスとして残る)。

旧トークンは beta 期間併存

--color-{semantic}-{50..900} / --color-text-* / --color-divider-* / --color-skeleton-fill / --color-ring-normal は beta 期間中そのまま利用可能。コンポーネントを順次移行し、beta 終了時に旧トークン削除 PR を別途立てる。

現行コードの旧語彙使用状況(src/components/ui

41 bg-white     33 text-white   21 border-negative-500   18 bg-neutral-50
17 bg-primary-500   13 text-text-low   13 ring-normal   13 text-neutral-700
11 text-text-high    8 text-text-middle   8 text-text-disabled   8 shadow-raise
 7 border-divider-middle

置換対象は広範。ユーティリティクラス名の機械置換だけでは足りず、状態別クラス(hover: / disabled:)の再構成が必要。

#274(React 19 ref-as-prop)との関係

#274 は「他の大規模アップデートと同時にまとめてリリース」する前提で塩漬けされている PR で、今回の beta サイクルがまさにその機会

ただし現在 CONFLICTING(DIRTY) かつ最終更新が 2026-05-19 で、main が 2.5 ヶ月分進んでいる。本 issue のトークン移行は #274同じ 17 ファイルを大幅に書き換えるため、順序で手戻り量が変わる。

方針: #274 を先に main へ追従させ(amend + force-push は規約で禁止のため、コンフリクト解決コミットを積む)、React 19 化を beta の土台にしてからトークン移行を載せる。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions