デザイントークンを用いたUID/FEのデザインシステム連携

# はじめに

株式会社medibaでフロントエンドエンジニアをしている [@kamabokochan](https://zenn.dev/kamabokochan) です。
この記事は [mediba Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mediba) の14日目です。

今回は、最近気になっていた

- [Tokens Studio for Figma](https://docs.tokens.studio/)
- [Style Dictionary](https://amzn.github.io/style-dictionary/)
- [React](https://ja.reactjs.org/)

を利用したUID/FE間の
[デザイントークン](https://blog.adobe.com/jp/publish/2021/03/29/cc-web-what-are-design-tokens)の管理/連携について、実際に触れてみたため、感想を書いていきたいと思います！

# 実装
## Tokens Studio for Figma
まずはFigmaにてトークン作成を行なっていきます。
トークンは、並列に定義するとname spaceでconflictが起きるため
以下のように区切っていきます。

```
- Color
    - background
    - text
...
```

`New Token` にてTokenを生成するフォームのNameにドット繋ぎで定義することで入れ子になるようです。

![スクリーンショット 2022-12-12 20.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199554/e5341aea-031a-034d-58b6-806cbc729a5f.png)


右上の `{}` から、jsonをプレビューできます。
ここはeditorになっているので、既存のトークン群をペーストすることでimportも可能です。
基本となる型のようなものを1つ作っておくと、使い回しができて便利そうだなと思いました♪

![スクリーンショット 2022-12-12 20.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199554/80d4f1cf-99d7-4c08-17fe-33b774f7b20f.png)


またgithubと連携することで、PR化も簡単に行えるようですが
今回は、お試しなので直接ソースコードに貼り付けたいと思います。

```json:token.json
{
  "background": {
    "primary": {
      "value": "#f6b3f4",
      "type": "color"
    },
    "secondary": {
      "value": "#f0de71",
      "type": "color"
    }
  }
}
```

## Style Dictionary
Style Dictionaryを使用して、先ほど作成したjsonを
扱いたい形式にconvertしていきたいと思います。

まずは

1. packageのinstall
2. 設定ファイル(config.json)の作成

を行なっていきます。
今回は、scssとjsにconvertしてみました。

```json:config.json
{
  "source": ["token.json"],
  "platforms": {
    "scss": {
      "transformGroup": "scss",
      "buildPath": "./src/style-dictionary-dist/",
      "prefix": "token",
      "files": [
        {
          "destination": "variables.scss",
          "format": "scss/variables"
        }
      ]
    },
    "js": {
      "transformGroup": "js",
      "buildPath": "./src/style-dictionary-dist/",
      "files": [
        {
          "destination": "variables.js",
          "format": "javascript/es6"
        }
      ]
    }
  }
}
```

## React
先ほど生成したjsをimportし、試しにstyle属性に適用させてみます。

```tsx:App.tex
import {
  BackgroundPrimary,
  BackgroundSecondary,
} from './style-dictionary-dist/variables.js';

function App() {
  return (
    <>
      <div className="App" style={{ background: BackgroundPrimary }}>
        <p>BackgroundPrimary 要素</p>
      </div>
      <div className="App" style={{ background: BackgroundSecondary }}>
        <p>BackgroundSecondary 要素</p>
      </div>
    </>
  );
}

export default App;
```

![スクリーンショット 2022-12-12 20.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199554/577de5f0-06e7-d83d-7897-7ecb33d3eba2.png)


色が変わりました。

さて、tokenの `background.primary` の色を少し変えて、再度convertしてみます。

```json:token.json
{
  "background": {
    "primary": {
      "value": "#c9f5b3",
      "type": "color"
    },
    "secondary": {
      "value": "#f0de71",
      "type": "color"
    }
  }
}
```

![スクリーンショット 2022-12-12 20.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199554/27b17add-2e43-0f43-7c9b-768622b5cba3.png)


新しい色に変更されました！


# まとめ
今回は簡略的に手作業でtokenのコピペを行いましたが、こちらの手順を自動化することで
tokenのvalueに留まる変更であれば、デザインの変更のみで
クライアントアプリに反映される仕組みができそうだということが確認できました。

機械的に誰でも管理や更新ができるシステムの構築ができていく様は触っていてとても嬉しいですね！

ぜひまだやったことがない人はお試しください♪

## 今回作成したもの
- https://stackblitz.com/edit/vitejs-vite-mh3trp

# 最後に
弊社からのお知らせです🦀

現在、medibaの募集求人ページから応募され入社が決定すると、お祝い金として30万円をプレゼントするキャンペーンを実施中です！！
リモート環境を充実のためディスプレイやマイク等を買いそろえるも良し。スキル習熟のために自己研鑽に使うも良し。使途は完全自由です。
→　[募集・応募ページ](https://hrmos.co/pages/mediba/jobs/1100000001)
いきなり応募だとちょっとハードルが高い・・でも興味がある方は、カジュアル面談も行っていますので、まずはお話してみませんか？
→　[カジュアル面談](https://hrmos.co/pages/mediba/jobs/6100000001)
※お祝い金は、試用期間（3か月）を経て、雇用が継続した場合に支給させて頂きます。