Figmaのローカル変数・スタイルを、W3C Design Tokens Draft準拠のJSONへ変換・エクスポートする実験的プラグインです。エクスポートしたDesign TokensはStyle Dictionaryなどで各プラットフォームへ展開できます。
注意: 本プラグインは https://www.designtokens.org/tr/drafts/ を元にした実験的実装です。
- Variable CollectionsをmodeごとにGroupとして出力
- グループ名は makeGroupName の規則に従います
- modeが1つ: collection名
- modeが複数: collection名 + Capitalize(mode名)(例: MyCollection + dark → MyCollectionDark)
- Variableのエイリアス(ID参照)は名前参照に解決して出力(参照形式:
{GroupName.TokenName}) - Text Styles を Typography トークンとして出力
- Paint Styles を Color/Gradient トークンとして出力
- Effect Styles を Shadow トークンとして出力
- プラグイン実行 → ローカル変数/スタイルを取得 → エイリアス解決 → JSON生成 → ZIPでダウンロード
次の表は、変数の resolvedType と scopes に応じて出力されるトークン種別を示します(内部実装の変換ロジックに基づく)。
| Figma resolvedType | scope 条件 | 出力 token 種別 | 備考 |
|---|---|---|---|
| COLOR | scopesが設定されていること | color | 値がエイリアスなら参照文字列({path.to.token})に変換 |
| FLOAT | scopes に ALL_SCOPES または OPACITY を含む |
number | 不透明度や一般数値として扱いたい場合 |
| FLOAT | 上記以外(例: WIDTH_HEIGHT, GAP, FONT_SIZE など) |
dimension | 単位は "px" として出力 |
| FLOAT | ["FONT_WEIGHT"] |
fontWeight | 数値のフォントウェイト(例: 400) |
| STRING | ["FONT_STYLE"] |
fontWeight | 文字列のフォントウェイト(例: "regular") |
| STRING | ["FONT_FAMILY"] |
fontFamily | フォントファミリー名 |
| 上記以外 | — | 出力しない | 該当しない場合は除外 |
注意:
- scopes が未設定の Variable は出力対象外です
- FLOAT を dimension として出力したい場合、
ALL_SCOPES/OPACITYを含めないでください(含むと number とみなされます) - fontWeight は FLOAT/STRING で条件が異なります(上表参照)
Text Styles は typography トークンに変換されます。以下のプロパティが含まれます:
| プロパティ | 変換ルール |
|---|---|
| fontFamily | fontName.family をそのまま使用 |
| fontWeight | fontName.style から数値に変換(例: "Bold" → 700、未定義は 400) |
| fontSize | fontSize を { value: number, unit: "px" } 形式で出力 |
| letterSpacing | PIXELS の場合はそのまま、PERCENT の場合は fontSize * (value / 100) で px に変換 |
| lineHeight | unitless(数値)として出力。変換ルールは以下の通り |
| Figma unit | 変換ルール |
|---|---|
| AUTO | 1.5 を返す |
| PERCENT | value / 100 で比率に変換(小数第2位で四捨五入) |
| PIXELS(0.5〜3の範囲) | そのまま unitless として採用(小数第2位で四捨五入) |
| PIXELS(上記以外) | lineHeightPx / fontSizePx で比率を算出(小数第2位で四捨五入) |
注意:
- lineHeight/letterSpacing で Infinity/NaN が検出された場合は TypeError を投げます
- fontSize が 0 の場合も TypeError を投げます
- 数値の丸め処理には
roundTo2ndDecimalを使用し、浮動小数点誤差を軽減しています
Paint Styles は color または gradient トークンに変換されます。
- SOLID タイプのペイントを
colorトークンに変換 - boundVariables に color エイリアスがある場合:
paint.opacity === 1の場合のみエイリアス参照を使用({GroupName.tokenName})paint.opacity !== 1の場合は透明度を掛け合わせた値を出力
- boundVariables がない場合は RGB(A) 値をそのまま出力
- GRADIENT_LINEAR タイプのペイントを
gradientトークンに変換 - 各 gradientStop の色を以下のルールで処理:
- boundVariables に color エイリアスがある場合:
paint.opacity === 1の場合のみエイリアス参照を使用paint.opacity !== 1の場合は各停止点の透明度にペイント全体の透明度を掛け合わせ
- RGB(A) 値の場合は同様に透明度を適用
- boundVariables に color エイリアスがある場合:
- 単数:PaintStyle の name をそのまま使用
- 複数:
{name}-color-{index}または{name}-gradient-{index}で命名(0始まり)
- IMAGE/VIDEO タイプは出力対象外
Effect Styles は shadow トークンに変換されます。
- 対象:
visible: trueかつ、タイプがDROP_SHADOWまたはINNER_SHADOWのエフェクトのみ抽出 - 構造: 1つのStyleに複数のエフェクトがある場合、配列として出力されます(Figmaのスタック順序=配列順序を維持)
| プロパティ | 変換ルール |
|---|---|
| color | RGBA値を変換 |
| offsetX | offset.x を { value: number, unit: "px" } 形式で出力 |
| offsetY | offset.y を { value: number, unit: "px" } 形式で出力 |
| blur | radius を { value: number, unit: "px" } 形式で出力 |
| spread | spread を { value: number, unit: "px" } 形式で出力 |
| inset | INNER_SHADOW の場合 true、それ以外は省略 |
- FigmaのエイリアスはID参照ですが、出力時は
{GroupName.TokenName}形式に解決します - GroupNameは makeGroupName に基づく命名規則(単一: collection名、複数: collection名 + Capitalize(mode名))で決定されます
- modeごとに1 Group(フラットなトークン集合)
- Group名は makeGroupName の規則に従います
- Group内に各Tokenが格納されます(必要に応じてネスト可)
- local variables
- Text Styles
- Color Styles (Paint Styles)
- Effect Styles
ご意見・不具合の報告はIssueまで