diff --git a/package.json b/package.json index 039c9cd..d42c6c2 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,11 @@ "format": "prettier --write src" }, "dependencies": { - "framer-motion": "^12.16.0", + "framer-motion": "^12.18.1", "gray-matter": "^4.0.3", "highlight.js": "^11.11.1", "i18next": "^25.2.1", - "i18next-browser-languagedetector": "^8.1.0", + "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", "install": "^0.13.0", "lighthouse": "^12.6.1", @@ -45,7 +45,7 @@ }, "devDependencies": { "@eslint/eslintrc": "^3", - "@next/bundle-analyzer": "^15.4.0-canary.65", + "@next/bundle-analyzer": "^15.4.0-canary.81", "@tailwindcss/postcss": "^4", "@types/node": "^24", "@types/react": "^19", diff --git a/public/article-2025/06/add-music-section/article-en.md b/public/article-2025/06/add-music-section/article-en.md new file mode 100644 index 0000000..d50ee44 --- /dev/null +++ b/public/article-2025/06/add-music-section/article-en.md @@ -0,0 +1,112 @@ +--- +title: Music Player Now Available! +date: "2025-06-14" +description: "Been wrestling with bugs non-stop (´・ω・`)" +--- + +# Section of Music + +Hi there! This is The Infinity's! + +I create music as a hobby, and today I'm excited to announce that I've built a dedicated page to share my music with you all! + +## Key Features + +Our music player comes with the following features: + +1. Basic Playback Controls + - Play/Pause + - Track seeking + - Fast forward/Rewind + - Next/Previous track navigation + +2. Playback Speed Control + - Adjustable from 0.5x to 2x speed + +3. Equalizer Function + - 5-band equalizer + - Multiple presets + - Custom settings available + +4. Visualizer + - Toggle between linear and circular display + - Real-time audio waveform visualization + +## Technical Implementation Details + +### Audio Processing Implementation + +```tsx +const audioCtxRef = useRef(null); +const elementSource = audioCtxRef.current.createMediaElementSource( + audioRef.current +); +``` + +We're utilizing the Web Audio API to create an audio context, which enables us to process and analyze audio signals. + +### Equalizer Implementation + +```tsx +const eqFilters: BiquadFilterNode[] = [ + audioCtxRef.current.createBiquadFilter(), + // ... +]; + +const frequencies = [60, 250, 1000, 4000, 16000]; +``` + +The equalizer employs BiquadFilterNodes for each of the five frequency bands (from bass to treble). +Each filter is assigned a specific center frequency and can be adjusted using the gain parameter. + +### Visualizer Rendering + +```tsx +const renderFrame = () => { + analyserNode.getByteFrequencyData(dataArray); + // ... + animationFrameRef.current = requestAnimationFrame(renderFrame); +}; +``` + +We're using an AnalyserNode to analyze audio data in real-time and rendering the waveform using the Canvas API. +The requestAnimationFrame ensures smooth animation performance. + +### Playback Control Implementation + +```tsx +const handleTogglePlay = () => { + if (!audioRef.current || !audioCtxRef.current) return; + + if (audioCtxRef.current.state === "suspended") { + audioCtxRef.current.resume(); + setPlayState("play"); + } + // ... +}; +``` + +The playback control combines HTMLAudioElement and AudioContext to manage audio playback. +State management is handled appropriately based on user interactions. + +### Playlist Functionality + +```tsx +const handleNextTrack = () => { + if (!musicList || musicList.length === 0) return; + const nextId = getNextTrackId(); + window.location.href = `/music/${nextId}`; +}; +``` + +The playlist system determines the next or previous track based on the current track index +and handles navigation to the appropriate URL. + +## Conclusion + +By combining the Web Audio API and Canvas API, we've successfully created a full-featured music player in the browser. +While implementing the equalizer and visualizer presented some challenges, +we're pleased with the result - a user-friendly player with advanced audio playback capabilities! + +While there's always room for improvement, we're happy to have completed these core features. +In future updates, we plan to add more user-friendly features like playlist saving and shuffle play functionality! \ No newline at end of file diff --git a/public/article-2025/06/add-music-section/article.md b/public/article-2025/06/add-music-section/article.md new file mode 100644 index 0000000..543ef22 --- /dev/null +++ b/public/article-2025/06/add-music-section/article.md @@ -0,0 +1,117 @@ +--- +title: 音楽が聴けるようになりました! +date: "2025-06-14" +description: "不具合とひたすら格闘してました(´・ω・`)" +--- + +# Section of music + +どうも! The Infinity'sです! + +私、趣味で曲を作ったりしてるんですけど、 +今回、その作った曲を公開するためのページを作りました! + +![POWER](./player.png "player") + +## 主な機能について + +このミュージックプレイヤーには以下のような機能があります: + +1. 基本的な再生コントロール + - 再生/停止 + - 曲の頭出し + - 早送り/巻き戻し + - 次の曲/前の曲への移動 + +2. 再生速度の調整 + - 0.5倍速から2倍速まで切り替え可能 + +3. イコライザー機能 + - 5バンドのイコライザー + - 複数のプリセット + - カスタム設定可能 + +4. ビジュアライザー + - 線形表示とサークル表示の切り替え + - 音声波形のリアルタイム表示 + +## 技術的な解説 + +### オーディオ処理の実装 + +```tsx +const audioCtxRef = useRef(null); +const elementSource = audioCtxRef.current.createMediaElementSource( + audioRef.current +); +``` + +Web Audio APIを使用して、オーディオコンテキストを作成しています。これにより、音声信号の加工や分析が可能になります。 + +### イコライザーの実装 + +```tsx +const eqFilters: BiquadFilterNode[] = [ + audioCtxRef.current.createBiquadFilter(), + // ... +]; + +const frequencies = [60, 250, 1000, 4000, 16000]; +``` + +5つの周波数帯域(低音~高音)それぞれにBiquadFilterNodeを使用し、音声信号を加工しています。 +各フィルターは異なる中心周波数を持ち、gainパラメータで増減を調整できます。 + +### ビジュアライザーの描画 + +```tsx +const renderFrame = () => { + analyserNode.getByteFrequencyData(dataArray); + // ... + animationFrameRef.current = requestAnimationFrame(renderFrame); +}; +``` + +AnalyserNodeを使用して音声データをリアルタイムで解析し、Canvas APIで波形を描画しています。 +requestAnimationFrameを使用することで、スムーズなアニメーションを実現しています。 + +### 再生コントロールの実装 + +```tsx +const handleTogglePlay = () => { + if (!audioRef.current || !audioCtxRef.current) return; + + if (audioCtxRef.current.state === "suspended") { + audioCtxRef.current.resume(); + setPlayState("play"); + } + // ... +}; +``` + +HTMLAudioElementとAudioContextを組み合わせて、再生制御を実装しています。 +ユーザーインタラクションに応じて適切に状態を管理しています。 + +### プレイリスト機能 + +```tsx +const handleNextTrack = () => { + if (!musicList || musicList.length === 0) return; + const nextId = getNextTrackId(); + window.location.href = `/music/${nextId}`; +}; +``` + +現在の曲のインデックスを基に、次の曲や前の曲を特定し、 +適切なURLに遷移する実装になっています。 + +## まとめ + +Web Audio APIとCanvas APIを組み合わせることで、 +ブラウザ上で本格的な音楽プレイヤーを実現することができました。 +特にイコライザーとビジュアライザーの実装には工夫が必要でしたが、 +結果として使いやすいUIと高機能な音楽再生機能を備えたプレイヤーが完成しました! + +改善点はまだまだありますが、まずは基本機能を実装できて良かったです。 +次回は、再生リストの保存機能やシャッフル再生など、 +より使いやすい機能を追加していきたいと思います! diff --git a/public/article-2025/06/add-music-section/player.png b/public/article-2025/06/add-music-section/player.png new file mode 100644 index 0000000..31c02f5 Binary files /dev/null and b/public/article-2025/06/add-music-section/player.png differ diff --git a/public/article-2025/06/add-music-section/thumbnail.png b/public/article-2025/06/add-music-section/thumbnail.png new file mode 100644 index 0000000..e868312 Binary files /dev/null and b/public/article-2025/06/add-music-section/thumbnail.png differ diff --git a/public/music/entropy/Entropy.m4a b/public/music/entropy/Entropy.m4a new file mode 100644 index 0000000..e735e17 Binary files /dev/null and b/public/music/entropy/Entropy.m4a differ diff --git a/public/music/entropy/jacket.png b/public/music/entropy/jacket.png new file mode 100644 index 0000000..e868312 Binary files /dev/null and b/public/music/entropy/jacket.png differ diff --git a/public/music/entropy/music.json b/public/music/entropy/music.json new file mode 100644 index 0000000..014cac6 --- /dev/null +++ b/public/music/entropy/music.json @@ -0,0 +1,5 @@ +{ + "artist":"The Infinity's", + "title":"Entropy", + "date":"2025-06-14" +} diff --git a/src/app/template.tsx b/src/app/template.tsx index 7d41910..abbe885 100644 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -18,7 +18,7 @@ export default function Template({ children }: { children: React.ReactNode }) { minHeight: "100vh", }} transition={{ - type: "linear", + type: "keyframes", duration: 2, }} > diff --git a/yarn.lock b/yarn.lock index 9c611ef..ab91698 100644 --- a/yarn.lock +++ b/yarn.lock @@ -396,10 +396,10 @@ "@emnapi/runtime" "^1.4.3" "@tybys/wasm-util" "^0.9.0" -"@next/bundle-analyzer@^15.4.0-canary.65": - version "15.4.0-canary.77" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.4.0-canary.77.tgz#662de873ec24c359fbd78071600c62efc4de8e70" - integrity sha512-/aI3/RPvrM5ZaJLH18ztb577Xqn5EIYQ3qOgN28hR3t3lQpNa20M9M5xltEPHkJfvHHvM5MmmKUeA0NlZRXFRw== +"@next/bundle-analyzer@^15.4.0-canary.81": + version "15.4.0-canary.81" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-15.4.0-canary.81.tgz#731688001ff4b19fd695a2172c2e545767516433" + integrity sha512-r5Mip5ItgedmF+KKUdikP4yaKLwJEq04ZUl6Nx96NaaVYpWn3Zj9lYhsFFCYPpKvNIT6cDC4YoP9XpiEN8lIBw== dependencies: webpack-bundle-analyzer "4.10.1" @@ -863,10 +863,10 @@ dependencies: tslib "^2.8.0" -"@tailwindcss/node@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.8.tgz#e29187abec6194ce1e9f072208c62116a79a129b" - integrity sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q== +"@tailwindcss/node@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.10.tgz#7a53a224cdd79a926ed990bbf97c74de9dadf595" + integrity sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ== dependencies: "@ampproject/remapping" "^2.3.0" enhanced-resolve "^5.18.1" @@ -874,57 +874,57 @@ lightningcss "1.30.1" magic-string "^0.30.17" source-map-js "^1.2.1" - tailwindcss "4.1.8" - -"@tailwindcss/oxide-android-arm64@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.8.tgz#4cb4b464636fc7e3154a1bb7df38a828291b3e9a" - integrity sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg== - -"@tailwindcss/oxide-darwin-arm64@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.8.tgz#b0b8c02745f76aea683c30818e249d62821864b8" - integrity sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A== - -"@tailwindcss/oxide-darwin-x64@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.8.tgz#d0f3fa4c3bde21a772e29e31c9739d91db79de12" - integrity sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw== - -"@tailwindcss/oxide-freebsd-x64@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.8.tgz#545c94c941007ed1aa2e449465501b70d59cb3da" - integrity sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.8.tgz#e1bdbf63a179081669b8cd1c9523889774760eb9" - integrity sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ== - -"@tailwindcss/oxide-linux-arm64-gnu@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.8.tgz#8d28093bbd43bdae771a2dcca720e926baa57093" - integrity sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q== - -"@tailwindcss/oxide-linux-arm64-musl@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.8.tgz#cc6cece814d813885ead9cd8b9d55aeb3db56c97" - integrity sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ== - -"@tailwindcss/oxide-linux-x64-gnu@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.8.tgz#4cac14fa71382574773fb7986d9f0681ad89e3de" - integrity sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g== - -"@tailwindcss/oxide-linux-x64-musl@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.8.tgz#e085f1ccbc8f97625773a6a3afc2a6f88edf59da" - integrity sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg== - -"@tailwindcss/oxide-wasm32-wasi@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.8.tgz#c5e19fffe67f25cabf12a357bba4e87128151ea0" - integrity sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg== + tailwindcss "4.1.10" + +"@tailwindcss/oxide-android-arm64@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz#ad0f3cbfa219e1ee5fc8ad7170885feda397c4e3" + integrity sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ== + +"@tailwindcss/oxide-darwin-arm64@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz#d8d744f93310b45ce16420a9addd1c4329848929" + integrity sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ== + +"@tailwindcss/oxide-darwin-x64@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz#476490d1f95592a09801a53b48466e5065d7553f" + integrity sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ== + +"@tailwindcss/oxide-freebsd-x64@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz#7b7ccb813592209216ed39187eb8510ce6b4fc9d" + integrity sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz#9f223c7994da846b9f3c70ac0b5713371c9b3b32" + integrity sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ== + +"@tailwindcss/oxide-linux-arm64-gnu@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz#58412e6a359a83144b30b415f637a52c8207f311" + integrity sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA== + +"@tailwindcss/oxide-linux-arm64-musl@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz#3ed868b801a27e8cd35a615855bc94fd2786a6e8" + integrity sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ== + +"@tailwindcss/oxide-linux-x64-gnu@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz#aca15cc4cf9dcd687eda0f5cd2bc1f4bfb485562" + integrity sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA== + +"@tailwindcss/oxide-linux-x64-musl@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz#0c77d1e94e499a9f85c80013e6052dd98d3cfee4" + integrity sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA== + +"@tailwindcss/oxide-wasm32-wasi@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz#6e749424db4f6e076371a66da7c4daf1fcd4f9df" + integrity sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q== dependencies: "@emnapi/core" "^1.4.3" "@emnapi/runtime" "^1.4.3" @@ -933,47 +933,47 @@ "@tybys/wasm-util" "^0.9.0" tslib "^2.8.0" -"@tailwindcss/oxide-win32-arm64-msvc@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.8.tgz#77521f23f91604c587736927fd2cb526667b7344" - integrity sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA== +"@tailwindcss/oxide-win32-arm64-msvc@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz#e1663b5a95425f0f458f616399ed9f6707d4a786" + integrity sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA== -"@tailwindcss/oxide-win32-x64-msvc@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz#55c876ab35f8779d1dceec61483cd9834d7365ac" - integrity sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ== +"@tailwindcss/oxide-win32-x64-msvc@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz#de3d4e8b38c31caf2522ad0c6f0efdeb5034fc95" + integrity sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA== -"@tailwindcss/oxide@4.1.8": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.8.tgz#b7a3df10c6c47ac5a3ac9976ad334732c4870d16" - integrity sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A== +"@tailwindcss/oxide@4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.10.tgz#b8ad6ae678b54bb533c2074092aadebac0a6d8fe" + integrity sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q== dependencies: detect-libc "^2.0.4" tar "^7.4.3" optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.8" - "@tailwindcss/oxide-darwin-arm64" "4.1.8" - "@tailwindcss/oxide-darwin-x64" "4.1.8" - "@tailwindcss/oxide-freebsd-x64" "4.1.8" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.8" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.8" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.8" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.8" - "@tailwindcss/oxide-linux-x64-musl" "4.1.8" - "@tailwindcss/oxide-wasm32-wasi" "4.1.8" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.8" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.8" + "@tailwindcss/oxide-android-arm64" "4.1.10" + "@tailwindcss/oxide-darwin-arm64" "4.1.10" + "@tailwindcss/oxide-darwin-x64" "4.1.10" + "@tailwindcss/oxide-freebsd-x64" "4.1.10" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.10" + "@tailwindcss/oxide-linux-arm64-gnu" "4.1.10" + "@tailwindcss/oxide-linux-arm64-musl" "4.1.10" + "@tailwindcss/oxide-linux-x64-gnu" "4.1.10" + "@tailwindcss/oxide-linux-x64-musl" "4.1.10" + "@tailwindcss/oxide-wasm32-wasi" "4.1.10" + "@tailwindcss/oxide-win32-arm64-msvc" "4.1.10" + "@tailwindcss/oxide-win32-x64-msvc" "4.1.10" "@tailwindcss/postcss@^4": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@tailwindcss/postcss/-/postcss-4.1.8.tgz#b12374b49f3accd9bd902a4324d124e67803350f" - integrity sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@tailwindcss/postcss/-/postcss-4.1.10.tgz#28e4edd9266a07e3fbfbdbf802563054c408d56b" + integrity sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ== dependencies: "@alloc/quick-lru" "^5.2.0" - "@tailwindcss/node" "4.1.8" - "@tailwindcss/oxide" "4.1.8" + "@tailwindcss/node" "4.1.10" + "@tailwindcss/oxide" "4.1.10" postcss "^8.4.41" - tailwindcss "4.1.8" + tailwindcss "4.1.10" "@tootallnate/quickjs-emscripten@^0.23.0": version "0.23.0" @@ -1054,9 +1054,9 @@ integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== "@types/react@^19": - version "19.1.7" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.7.tgz#9fc4ab6003a8e4f38710c83cb5f8afbdacb7d687" - integrity sha512-BnsPLV43ddr05N71gaGzyZ5hzkCmGwhMvYc8zmvI8Ci1bRkkDSzDDVfAXfN2tk748OwI7ediiPX6PfT9p0QGVg== + version "19.1.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.8.tgz#ff8395f2afb764597265ced15f8dddb0720ae1c3" + integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g== dependencies: csstype "^3.0.2" @@ -2726,13 +2726,13 @@ foreground-child@^3.1.0: cross-spawn "^7.0.6" signal-exit "^4.0.1" -framer-motion@^12.16.0: - version "12.16.0" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.16.0.tgz#d715b81b1b41ba61ce842e7085390e1533ec3814" - integrity sha512-xryrmD4jSBQrS2IkMdcTmiS4aSKckbS7kLDCuhUn9110SQKG1w3zlq1RTqCblewg+ZYe+m3sdtzQA6cRwo5g8Q== +framer-motion@^12.18.1: + version "12.18.1" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.18.1.tgz#783dc9ea7c816d315c6eebc49cd3a82c5fc50615" + integrity sha512-6o4EDuRPLk4LSZ1kRnnEOurbQ86MklVk+Y1rFBUKiF+d2pCdvMjWVu0ZkyMVCTwl5UyTH2n/zJEJx+jvTYuxow== dependencies: - motion-dom "^12.16.0" - motion-utils "^12.12.1" + motion-dom "^12.18.1" + motion-utils "^12.18.1" tslib "^2.4.0" fs-minipass@^2.0.0: @@ -3165,10 +3165,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -i18next-browser-languagedetector@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.1.0.tgz#e7fcc1084e9ca8fece329c8c05b000a6e25bd82e" - integrity sha512-mHZxNx1Lq09xt5kCauZ/4bsXOEA2pfpwSoU11/QTJB+pD94iONFwp+ohqi///PwiFvjFOxe1akYCdHyFo1ng5Q== +i18next-browser-languagedetector@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz#c3ca311e249d2f7d8bb9b3b13ac9af380a3b15b0" + integrity sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g== dependencies: "@babel/runtime" "^7.23.2" @@ -4641,17 +4641,17 @@ mkdirp@^3.0.1: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -motion-dom@^12.16.0: - version "12.16.0" - resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.16.0.tgz#ccf88d45db04214f32d455e12621f5213968bfd5" - integrity sha512-Z2nGwWrrdH4egLEtgYMCEN4V2qQt1qxlKy/uV7w691ztyA41Q5Rbn0KNGbsNVDZr9E8PD2IOQ3hSccRnB6xWzw== +motion-dom@^12.18.1: + version "12.18.1" + resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.18.1.tgz#3a4d6b7f4a7940393ffdd60ec44f636d3472948f" + integrity sha512-dR/4EYT23Snd+eUSLrde63Ws3oXQtJNw/krgautvTfwrN/2cHfCZMdu6CeTxVfRRWREW3Fy1f5vobRDiBb/q+w== dependencies: - motion-utils "^12.12.1" + motion-utils "^12.18.1" -motion-utils@^12.12.1: - version "12.12.1" - resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.12.1.tgz#63e28751325cb9d1cd684f3c273a570022b0010e" - integrity sha512-f9qiqUHm7hWSLlNW8gS9pisnsN7CRFRD58vNjptKdsqFLpkVnX00TNeD6Q0d27V9KzT7ySFyK1TZ/DShfVOv6w== +motion-utils@^12.18.1: + version "12.18.1" + resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.18.1.tgz#d7543c2bc15e843286cbb86119f011da0a78515b" + integrity sha512-az26YDU4WoDP0ueAkUtABLk2BIxe28d8NH1qWT8jPGhPyf44XTdDUh8pDk9OPphaSrR9McgpcJlgwSOIw/sfkA== mrmime@^2.0.0: version "2.0.1" @@ -6247,10 +6247,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tailwindcss@4.1.8, tailwindcss@^4: - version "4.1.8" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.8.tgz#5d66d095ee7d82f03d6dbc6158bc248e064a5c05" - integrity sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og== +tailwindcss@4.1.10, tailwindcss@^4: + version "4.1.10" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.10.tgz#515741b0a79316d1971d182f7fbc435b68679373" + integrity sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA== tapable@^2.2.0: version "2.2.2"