【Figma】Code Connect の 使い方

## はじめに

皆さんは、Code Connectをご存知でしょうか？

Code ConnectはFigma上のデザインシステムとコード上のデザインシステムのギャップを埋めるためのツールです。

この記事では、そんな Code Connectの使い方について解説します。

## Code Connect とは？
> Code Connectは、コードを開発者にとってよりアクセスしやすく、有用にすることで、組織におけるデザインシステムの導入を促進する新しいツールです。
> 
> Code Connectを使用すると、開発モードに表示されるコードスニペットをカスタマイズできるため、開発者は自動生成されたCSSではなく、実際のデザインシステムのコードを見ることができます。
> 
> その結果、より迅速かつ効率的な開発、そして組織全体でのデザインシステムの導入率の向上が実現されます。重複した、一時的なコンポーネントの作成やメンテナンス作業を削減することもできます。
> （[引用：デザインシステムに適したコード](https://www.figma.com/ja-jp/blog/introducing-code-connect/)）

つまり、Code Connectは、Figma上のデザインシステムとコード上のデザインシステムのギャップを埋め、エンジニアがより効率的に開発することができるツールということだそうです。

### 何ができるの？
<font color="gray">*2024年7月6日 時点*</font>

現時点では、以下のことができます。

:::note info
Dev Mode利用時のコードスニペットにコードで実際に使われているコードを表示させることができる
:::

例えば、以下のようなボタンコンポーネントを用意するとします。
(React、emotionを使っています。)

```Button.tsx
type ButtonType = "GreenFill" | "GreenBorder" | "BlueFill" | "BlueBorder" | "YellowFill" | "YellowBorder" | "RedFill" | "RedBorder"
  
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  buttonType: ButtonType
  fontSize: 14 | 16 | 18
  children: React.ReactNode
}

export const Button = ({ buttonType, children, fontSize, ...props }: ButtonProps) => {
  return (
    <button
      css={baseButtonStyle(buttonType, fontSize)}
      {...props}
    >
      {children}
    </button>
  )
}
```

ボタンコンポーネントは、`buttonType`・`fontSize`・`children`という値をPropsで渡して、以下のようなデザインを表示させています。

![スクリーンショット 2024-07-06 10.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/76687d09-43f5-e8aa-0829-cd27c8bf730e.png)

Code Connectで、コードとFigmaファイルを接続し、Devモードで見てみると、以下のようになります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/da6027d1-a3ae-146a-a787-10986a4e9604.png)

## Code Connect をセットアップする
Code Connect のセットアップについては、こちらの記事で紹介しているので、ぜひご覧ください。

https://qiita.com/degudegu2510/items/9bd37117b55788f373c8

## Code Connect の使い方
上記で説明したように、Code Connectでは、FigmaのDev Modeでみることができるインスペクトパネルで実際に使うコードを見ることができます。 

ここでは、新しく作ったコード上のコンポーネントをどのようにFigman上のコンポーネントに紐付けるかを解説します。

### ⚪︎ Code Connect 用のファイルを生成する
コード上のコンポーネントを作ったら、まずは、Code Connect用のファイルを生成します。

以下のコマンドをターミナル入力し、ターミナルの指示通りに入力することで、Code Connect用のファイルが生成できます。

```
npx figma connect
```


ファイルが生成されると以下のようなCode Connect 用のファイルが生成されます。
以下は、ボタンコンポーネントの Code Connect 用のファイルの中身になります。

```Button.figma.tsx
import { Button } from "./Button"
import figma from "@figma/code-connect"

figma.connect(
  Button,
  "https://www.figma.com/design/*****Figma上のコンポーネントのURL*****",
  {
    props: {
      children: figma.string("Children"),
      buttonType: figma.enum("buttonType", {
        RedBorder: "RedBorder",
        RedFill: "RedFill",
        GreenFill: "GreenFill",
        GreenBorder: "GreenBorder",
        BlueFill: "BlueFill",
        BlueBorder: "BlueBorder",
        YellowFill: "YellowFill",
        YellowBorder: "YellowBorder",
      }),
      fontSize: figma.enum("fontSize", {
        "14": 14,
        "18": 18,
        "16": 16,
      }),
    },
    example: (props) => 
      <Button
        buttonType={props.buttonType}
        fontSize={props.fontSize}
      >
        {props.children}
      </Button>,
  },
)
```

### ⚪︎ Code Connect 用のファイルを修正する
#### stringを指定する
以下のようにpropsに指定することで、任意の文字列を指定することができます。

このコードは、Figma上のコンポーネントのプロパティ`"children"`を `props.children` に定義しています。
```ts
props: {
  children: figma.string("children")
}
```

#### booleanを指定する
以下のようにpropsに指定することで、true/falseを指定することができます。

このコードは、Figma上のコンポーネントのプロパティ`"disabled"`を `props.disabled` に定義しています。
```ts
props: {
  disabled: figma.boolean("disabled")
}
```

また、以下のようにすることで、Figma上のコンポーネントでtrueの時に、Iconのインスタンスを表示させ、falseの時、非表示にすることができます。

```ts
props: {
  Icon: figma.boolean("isIcon", {
    true: figma.instance("Icon"),
    false: undifined,
  })
}
```

#### enumを指定する
以下のように指定することで、FigmaのコンポーネントプロパティのVariantを指定することができます。

このコードは、Figma上のコンポーネントのプロパティ `"buttonType"`を`props.buttonType`に定義しています。


```ts
props: {
  buttonType: figma.enum("buttonType", {
    breenFill: "GreenFill",
    breenBorder: "GreenBorder",
    blueFill: "BlueFill",
    blueBorder: "BlueBorder",
  }),
}
```

#### instaneを指定する
以下のように指定することで、Figmaのコンポーネントのinstanceを指定することができます。

このコードは、Figma上のインスタンス`"icon"`を`props.icon`に定義しています。
```ts
props: {
  icon: figma.instance("icon"),
}
```

#### Instance childrenを指定する
instance-swapをつかって、バインドされてないコンポーネントを指定したい時は、以下のようにします

このコードは、Figma上のバインドされていないインスタンスのレイヤー　名`"icon"`を`props.icon`に定義しています。

```ts
props: {
  icon: figma.children("icon"),
}
```

また、 `*` を使うこと、すべてのインスタンスや、部分的に一致しているレイヤー名のインスタンスを定義することができます。

```ts
// すべてのインスタンス
figma.children("*")

// Iconから始まるインスタンス
figma.children("Icon*")
```

#### Nested propertiesを指定する
Nested propertiesを使っているコンポーネントを指定したい場合は、以下のようにします。

```ts
props: {
  icon: figma.nestedProps("icon", {
    size: figma.enum({ ... }),
  }),
}
```

#### Text Contents を指定する
Figmaのコンポーネント使っている時、テキストコンテンツをオーバーライドする形にすることがあると思います。
そんな時わざわざ、propsで渡すことはほとんどないと思います。

そのような時は、以下のようにレイヤー名を指定するで、テキストのオーバーライドを指定することができます

```ts
props: {
  label: figma.textContent("Text Layer")
},
```

### ⚪︎ Figma　のコンポーネントに紐付ける
以下のコマンドをターミナル入力することで、Figma　のコンポーネントに紐付けることがきます。

```
npx figma connect publish
```

## まとめ
この記事では、Code Connect の 使い方について解説しました。
ぜひこの記事を参考にCode Connectを使ってみてください！

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510