shadcn/uiのNuxt用があることを知り狂喜乱舞した後に書いた記事

:::note info
viviONグループでは、DLsiteやcomipoなど、二次元コンテンツを世の中に届けるためのサービスを運営しています。
ともに働く仲間を募集していますので、興味のある方は[こちら](#punch-一緒に二次元業界を盛り上げていきませんか)まで。
:::

## :pencil: 概要

みなさんは[shadcn/ui](https://ui.shadcn.com/)というUIコンポーネントライブラリを知っていますか？

個人的に色々UIライブラリを見て回るのが好きなのですが、去年こちらのshadcn/uiが少し話題に挙がっていました。

:bulb: 後から知ったのですが、[JSライジングスター2023](https://risingstars.js.org/2023/ja)のReactエコシステム部門で一位になっていたらしい

当時はそのことを知らず、なんとなく公式サイトを見て

**「めっちゃおしゃれやんけ！！！！！！！！しかもTailwindサポートだから全然実務での採用も検討できるじゃん、ちょっと試してみよ :smile: 」**

とウキウキしていたら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/3cca0653-3af2-a305-eaee-42baf30a7a12.png)

**Nuxtが....ない....（遺言）**

ここで記事は途切れているようだ。

## :zap: Nuxt用が！！！！！ある！！！！！！！！

...となるはずだったのですが、先日インターネットの海を目的もなく漂っていると[shadcn-vue](https://www.shadcn-vue.com/)という文字が目に飛び込んできました。

公式サイトを見てみると....

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/6fed8431-7575-66dd-b080-fb20eb5e03d4.png)

**Nuxtがいる！！！！！！**

:::note warn
念のため記載しておくと、こちらは有志による非公式のライブラリです。
shadcn/ui作者から許諾を得て開発されたとのことです。
:::

ということで試していきます。

## :construction_site: 検証環境

**nuxt** v3.11.2
**vue** v3.4.21
**tailwindcss** v3.4.3

## :twisted_rightwards_arrows: 導入手順

冒頭で**UIコンポーネントライブラリ**と紹介しましたが、shadcn/uiの考えである「実装とスタイルは分けるべき（互いに依存してはいけない）」を実現するため、実はコンポーネント自体はnpmパッケージ化されていません。

https://ui.shadcn.com/docs

> **Why copy/paste and not packaged as a dependency?**
> 
> The idea behind this is to give you ownership and control over the code, allowing you to decide how the components are built and styled.
> 
> Start with some sensible defaults, then customize the components to your needs.
> 
> One of the drawback of packaging the components in an npm package is that the style is coupled with the implementation. The design of your components should be separate from their implementation.

代わりに専用のCLIを導入し、そこからコマンドで指定したコンポーネントのコードをプロジェクト内に追加する形をとっています。もちろんshadcn-vueも同様の形になります。

今回はNuxtで検証するため、[Nuxt用の導入手順](https://www.shadcn-vue.com/docs/installation/nuxt.html)に倣って進めていきます。

### 必要なモジュールの追加

今回すでにtailwindcss, typescriptが導入済みのNuxtプロジェクトで検証を行っているので、モジュールの追加から行います。

:::note warn
Nuxt3の場合デフォルトでTypeScriptをサポートしてくれていますが、shadcn-vueを使う際は依存関係に`typescript`が含まれている必要があります。
devDependenciesに`typescript`が含まれていることを確認してください。
:::

```zsh
$ npx nuxi@latest module add @nuxtjs/tailwindcss
```

その後CLIモジュールを追加します

```zsh
$ npx nuxi@latest module add shadcn-nuxt
```

CLIモジュールが追加できたら、`nuxt.config.ts`にshadcnの設定を追記します。

```typescript:nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/tailwindcss', 'shadcn-nuxt'],
  shadcn: {
    prefix: '', // 追加したコンポーネントに付与するプレフィックス
    componentDir: './components/shadcn' // デフォルトは'./components/ui'
  }
})
```

※ここで型エラーが出る方は一度vscodeを再起動するか`npm run dev`などを実行すると解消されるかもしれません

### CLIのセットアップ

ここまでで無事CLIモジュールが追加できたので、用意されてるinitコマンドでセットアップします。

```zsh
$ npx shadcn-vue@latest init

Would you like to use TypeScript (recommended)? no / yes
Which framework are you using? Vite / Nuxt / Laravel
Which style would you like to use? › Default
Which color would you like to use as base color? › Slate / Gray / Zinc / Neutral / Stone
Where is your tsconfig.json or jsconfig.json file? › ./tsconfig.json
Where is your global CSS file? › › src/index.css
Do you want to use CSS variables for colors? › no / yes
Where is your tailwind.config.js located? › tailwind.config.js
Configure the import alias for components: › @/components
Configure the import alias for utils: › @/lib/utils
Write configuration to components.json. Proceed? > Y/n
```

カラーは[tailwindのカスタムカラー](https://tailwindcss.com/docs/customizing-colors)のうち、暗色系の5つが選べるみたいです 🥰
今回は以下のように設定しました。

<details><summary>設定例</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/ea9de907-9443-fba8-3043-9698a607f5a5.png)

</details>

これで導入は一通り完了です！早速遊んでみましょう！！！！

## :fountain: 実際に遊んでみた

![localhost_3000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/1b230d01-e353-07bc-c98f-58c2184d9972.png)

この状態から色々コンポーネントを追加していきます。
まっさらなページだとスクショを貼ったときに意味が分からなかったので、とりあえず適当な言葉だけ置いておきました。

ひとまず使うコンポーネントを追加したいので、追加コマンドを叩きます。

```zsh
$ npx shadcn-vue@latest add button
```

実行後、`nuxt.config.ts`で設定したディレクトリにコンポーネントが追加されるはずです。

:::note warn
ちなみに僕は設定がどこか抜けていたのか、デフォルトのcomponents/ui/ディレクトリに追加されていました。なぜ？？？
:::

他にも公式の[各コンポーネントページ](https://www.shadcn-vue.com/docs/components/accordion.html)にそれぞれ追加コマンドが載っていますので、追加したいコンポーネントがあれば随時参照してください。

ということで、適当にコンポーネントを追加してみました(ButtonとTableだけですが)

![localhost_3000_ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/6178e2d5-05b2-5179-2889-431f6a85499d.png)

ここで総菜ドラゴン :dragon_face: の伏線を回収することになるとは思いませんでしたが、それよりキャプションが下にあるのが、日本語のテーブルだと違和感ありますね

そんなときは追加したコンポーネントファイルを直接いじればOKです！パッケージされたファイルではないので、気にせず好きなだけいじり放題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/b831a094-d312-9487-bf64-831e1993051c.png)

今回は`Table.vue`内のcaption-bottomの記述を消して、ついでに`TableCaption.vue`内のテキストクラスをちょろっといじりました。

このように、コンポーネントの機能自体を損なわずスタイルのみを気軽に・柔軟に変えられるのが最大の魅力ですね。

## 🥰 まとめ

今回shadcn-vueの導入検証を行ってみましたが、いかがでしたでしょうか？
個人的には、シックでモダンな見た目もそうですがなによりカスタマイズ性の高さ・柔軟さにかなり惹かれました。

みなさんもたまにはUIライブラリを眺めてみると、素敵な出会いがあるかもしれません。
それでは :wave:

## :punch: 一緒に二次元業界を盛り上げていきませんか
株式会社viviONでは、フロントエンドエンジニアを募集しています。

https://vivion.jp/recruit/

また、フロントエンドエンジニアに限らず、バックエンド・SRE・スマホアプリなど様々なエンジニア職を募集していますので、ぜひ採用情報をご覧ください。