自己紹介するためのPortfolioサイトを作りました。

## はじめ
会社のカジュアル面接でPPTを使って自己紹介をする姿を見て感銘を受けて自分を視覚化したサイトを通じて自己紹介をしたらいいと思って作りました。


## 一つ目のアイデア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/c6dde821-b551-ad9e-a970-31a0b4896b62.png)

このサイトを見た途端に作りたいと思って、何が必要なのか悩みながらMac os styleをReactで作りました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/e58b8f51-da20-ac33-36cb-ec20f79580e6.png)

作っている途中もう一度考えたんですが、申し1000人のポートフォリオを見る担当の立場だと何度もクリックしなければならないサイトを好むでしょうか？と考えた。
私なら嫌いと思ってあらためて考え直すことにしました。

## 二つ目のアイデア
この記事の中でアイデアを得ました。

https://qiita.com/naoki-00-ito/items/cdcf623aa79efdde1ffb#comment-c8ec20c27a18e198c273

記事のサイト見たいにスクロールだけで見るのができるよう作ろと考えました。


## 技術スタック

### 前提
tailwindではなくSassを使いたかったです。
jotai、recoilの使用が不可能な状況なので、zustandに対する学習をするためにzustand選びました。


- Next.js
- TypeScript
- React
- animejs
- emailjs
- eslint
- zustand
- Sass


## 実装紹介
### HeroSection
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/4730d344-32fa-7d1a-b0eb-fd235674d576.png)

コンポーネント : 
- Navigation : 
Home, About, Projects, Contact, Languageを現在のsectionに該当する場合は、赤色で表示されるようにしました。
Languageもここでステータス変更します。

- MouseTracker :
マウスをグローバルに追跡するため、使用しました。


- CanvasDot : 
パーティクルを作成し、マウスとパーティクル間の相互作用できるようにしました。
相互作用はマウスとパーティクル間の距離が近いとパーティクルとパーティクルが線を作ります。



- Hero : 
紹介する短い文とAbout buttonを作ります。
button hoverしriple効果を栗化します。

### AboutSection
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/59287a08-a442-48f8-d61a-047603c25bc6.png)

- About
自分紹介と今まで使った技術スタックをrow形に表現しました。



### Projects Section
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/ac456af1-6f5c-25c4-77f9-a6f3606c34ca.png)

- Projects
今まで参加したプロジェクトを配置し、childによってイメージを方向を配置しました。
この部分のchildは多くないので別にコンポーネントを作らずにハードコーディングしました。😅


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/bbb20168-ee6c-a80c-a782-599b5c465bfb.png)

他に勉強するためのプロジェクトと必要なものを作ったものをgridを使って、widthによって変更できるようにしました。

### Contact Section
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/8e504dee-6877-9770-1378-a5c409e0e49f.png)

メールで連絡ができるようにしたかったので、formを使用しました。
なお、emailjsを使ってメールを転送できるようしました。


__テストしました__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/4bfed217-e6b8-acd2-08d0-784d4a03853e.png)

転送を押すと...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/449b04db-6ee1-9fff-2c98-05ab0a4b21e5.png)

メールが転送を確認できます。


 __※ emailjsについては下のご確認してください。__

https://www.emailjs.com/

### Footer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981722/a2bda89d-7ee5-ca1a-d3bf-f3d6059fd3c1.png)

Footerではsnsをしなのでgithubとメールだけ追加しました。
homeに戻るbuttonを作って上と下に動くアニメーションを追加しました。



## 作りながら発生した問題

Q. : react19にアップデートによる問題があってCRAを使用できない問題が発生しました。
A. : 現在アップデートが止まっているのでCRAよりViteの使うとこをおすすめします。

__Link__

https://github.com/facebook/create-react-app/issues/13911

Q. : マウスと相互作用する背景を作りましたが、マウスがglobal状態の変数ではなく、Heroセッションにのみあったため、座標に対する問題が発生しました。
A. : Zustandを使用してマウスをstoreで管理し、globalで使用できるようにし、clinet基準ではなくpage基準で相互作用を設定し、解決しました。


Q. : Footerをfooterにしたため途中で名前を変更することになり、Gitで大文字の区分ができない問題でDeployの失敗しました。
A. : Gitでは大文字と小文字の両方を同じファイルとして認識するので、名前を変更しても適用されない問題だったので、Gitでfooter->Footerに変更して問題を解決しました。

※変更した理由はReactではコンポーネント作るとき大文字でするのが規則です。
__Link__

https://qiita.com/shuhosaka/items/4a11158b3e9060d3b612



### 最後に
ポートフォリオサイトをVercelでdeployしました。

https://portfolio-five-cyan-49.vercel.app/

最後まで読んでいただき、ありがとうございました。