# Topページの作成2

tailwindを使用してTopページを作成していきます。

TopPageというコンポーネントを作成していくのですが、今回コンポーネントを**Atomic Design**を用います。

**Atomic Design**は、コンポーネントの粒度に応じて、5つのディレクトリに分けて取り扱っていく設計手法になります。分けるディレクトリ名は決まっており、小さい順から

* atoms
* molecules
* organisms
* templates
* pages

の5つになります。

画像は

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FIaCnAJ1I9bsVGQiHoiUf%2Fj.png?alt=media&#x26;token=aa08f7f1-5416-4e2b-8126-62a8be155336" alt=""><figcaption></figcaption></figure>

各ディレクトリに関して説明していきます。

### atoms

最小単位のコンポーネントを格納します。入力欄やボタン等にあたります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F1AsYU5SZqKbhzcqwMe6r%2Fl.png?alt=media&#x26;token=b1f626d0-1719-49fe-8c1b-5a328ee251db" alt=""><figcaption></figcaption></figure>

### molecules

atomsを組み合わせたグループで、フォームのラベルと入力欄を組み合わせたもの等になります。

次のorganismsと違うところとして、**ドメイン（サービス）の知識を持っていないこと**になります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F1qzrUmZkPStroG06H6UB%2Fm.png?alt=media&#x26;token=1af84ac6-e9bb-46f8-9605-74a0d9111636" alt=""><figcaption></figcaption></figure>

### organisms

atomsやmoleculesを組み合わせて、特定の意味合いを持った集合体になります。こちらは**ドメインの知識を持っており**、ヘッダーやフッターに当たります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2Fs4h2QwMlCrZPjgMXiF0S%2Fn.png?alt=media&#x26;token=f5a8748e-4050-4bec-bd8b-46fc50395013" alt=""><figcaption></figcaption></figure>

### templates

atomsやmolecules、organismsを組み合わせて、ページ全体のレイアウトを構築するものになります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FFpRgy0T11WAqgokPz2iW%2Fo.png?alt=media&#x26;token=3bcec110-60a6-4d0e-911e-842b214d8e02" alt=""><figcaption></figcaption></figure>

### pages

templatesをより具体化させて、ユーザーに最終的に見せるページになります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FwCqPWmsN888G0aSNG2zf%2Fp.png?alt=media&#x26;token=b8c19af6-cf34-4965-be78-a8c5e92b20d6" alt=""><figcaption></figcaption></figure>

では、実際にatomic designにてコンポーネントを設計していきます。

`src`配下に`components`ディレクトリを作成し、`components`配下にあと`atoms`,

&#x20;`molecules`、`organisms`、`templates`、`pages`ディレクトリを作成しましょう。

そして、`pages`ディレクトリに、`TopPage.tsx`を作成しましょう、

```
src/
    components/
        atoms/
        molecules/
        organisms/
        templates/
        pages/
            TopPage.tsx
```

TopPage.tsxを編集していきます。

VSCodeの場合、`rafc`と入力し`Enter`を押すと、以下のようなテンプレートが出力されるかと思います。ちなみに一行目に`import React from 'react'`は昔のversionの際に必要な記述っだったのですが、現在では不要ですので、削除しちゃって大丈夫です。

{% code title="pages/TopPage.tsx◎" %}

```tsx
import React from 'react'

export const TopPage = () => {
  return (
    <div>TopPage</div>
  )
}
```

{% endcode %}

まずheader部分を作成していきます。以下のような記述しましょう。ヘッダーの左側にロゴを表示し、右側にナビゲーションメニューを配置するような構成にします。

<pre class="language-tsx" data-title="pages/TopPage.tsx◎"><code class="lang-tsx">export const TopPage = () => {
  return (
    &#x3C;div>
<strong>      &#x3C;header>
</strong><strong>        &#x3C;div>
</strong><strong>          &#x3C;p>スケジュール管理APP&#x3C;/p>
</strong><strong>          &#x3C;nav>
</strong><strong>            &#x3C;ul>
</strong><strong>              &#x3C;li>ご利用方法&#x3C;/li>
</strong><strong>              &#x3C;li>ログイン&#x3C;/li>
</strong><strong>            &#x3C;/ul>
</strong><strong>          &#x3C;/nav>
</strong><strong>        &#x3C;/div>
</strong><strong>      &#x3C;/header>
</strong>    &#x3C;/div>
  )
}
</code></pre>

こちらのコンポーネントを表示するようにしましょう。main.tsxを以下のように編集します。

<pre class="language-tsx" data-title="main.tsx◎"><code class="lang-tsx">import React from 'react'
import ReactDOM from 'react-dom/client'
import './styles/index.css'
import "./styles/output.css"
import "./styles/destyle.css";
<strong>import { TopPage } from './components/pages/TopPage';
</strong>
ReactDOM.createRoot(document.getElementById("root")!).render(
  &#x3C;React.StrictMode>
<strong>    &#x3C;TopPage />
</strong>  &#x3C;/React.StrictMode>
);

</code></pre>

こちらでブラウザにて確認しましょう。動作確認する際は以下二つを実行するようにしましょう。

```bash
npm run dev
```

```bash
npx tailwindcss -i ./src/styles/index.css -o ./src/styles/output.css --watch
```

ブラウザにて以下のように確認できるかと思います。destyle.cssにてタグのデフォルトのcssが全て消えているかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FDNEx4Gbnup5ti0cO03Og%2Fq.png?alt=media&#x26;token=4fb4133b-3136-442b-b9e4-480c610e2f18" alt=""><figcaption></figcaption></figure>

ではこちらにtailwindcssを当てていきましょう。

ますは、ロゴとナビゲーションメニューを横並びにして、各ナビゲーションメニューを横並びにしましょう。

&#x20;class名を調べる際は、以下サイトの左上の検索欄から変更したいプロパティ名から検索するのが良いかと思います。

{% embed url="<https://tailwindcss.com/docs/installation>" %}

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2Fm6mJJufB3ISJIjtHN6Hy%2Fr.png?alt=media&#x26;token=fa8c984a-3d93-4ec8-8f73-7c6148798fe7" alt=""><figcaption></figcaption></figure>

横並びにする際は、`class`名に`flex`を使用します。

<pre class="language-tsx" data-title="pages/TopPage.tsx"><code class="lang-tsx">export const TopPage = () => {
  return (
    &#x3C;div>
      &#x3C;header>
<strong>        &#x3C;div className="flex">
</strong>          &#x3C;p>スケジュール管理APP&#x3C;/p>
          &#x3C;nav>
<strong>            &#x3C;ul className="flex">
</strong>              &#x3C;li>ご利用方法&#x3C;/li>
              &#x3C;li>ログイン&#x3C;/li>
            &#x3C;/ul>
          &#x3C;/nav>
        &#x3C;/div>
      &#x3C;/header>
    &#x3C;/div>
  );
}

</code></pre>

こちらで横並びになったかと思います。

次に、ロゴとナビゲーションメニューの間にスペースを開けて、左右に配置するようにします。

cssでいう`justify-content: space-between`をしたいので、こちらは`justify-between`を使用します。

<pre class="language-tsx" data-title="pages/TopPage.tsx◎"><code class="lang-tsx">export const TopPage = () => {
  return (
    &#x3C;div>
      &#x3C;header>
<strong>        &#x3C;div className="flex justify-between">
</strong>          &#x3C;p>スケジュール管理APP&#x3C;/p>
          &#x3C;nav>
            &#x3C;ul className="flex">
              &#x3C;li>ご利用方法&#x3C;/li>
              &#x3C;li>ログイン&#x3C;/li>
            &#x3C;/ul>
          &#x3C;/nav>
        &#x3C;/div>
      &#x3C;/header>
    &#x3C;/div>
  );
}
</code></pre>

ナビゲーションメニューの方は、各メニューの間を`gap-5`(gap: 20px)てスペースを空けます。

<pre class="language-tsx" data-title="pages/TopPage.tsx◎"><code class="lang-tsx">export const TopPage = () => {
  return (
    &#x3C;div>
      &#x3C;header>
        &#x3C;div className="flex justify-between">
          &#x3C;p>スケジュール管理APP&#x3C;/p>
          &#x3C;nav>
<strong>            &#x3C;ul className="flex gap-5">
</strong>              &#x3C;li>ご利用方法&#x3C;/li>
              &#x3C;li>ログイン&#x3C;/li>
            &#x3C;/ul>
          &#x3C;/nav>
        &#x3C;/div>
      &#x3C;/header>
    &#x3C;/div>
  );
}
</code></pre>

こちらをブラウザにて確認すると、次のように表示されているかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FjEwLUcj4Fvi5gOiKBLPF%2Fs.png?alt=media&#x26;token=e859024b-a4c9-4a9b-bac4-0fa0fc9f7e8b" alt=""><figcaption></figcaption></figure>
