diff --git a/.env.test b/.env.test index 339027e..f9649bc 100644 --- a/.env.test +++ b/.env.test @@ -10,4 +10,7 @@ GITHUB_KEY = your_github_key LEETCODE_USERNAME = rezaageng -NEXT_PUBLIC_GA_MEASUREMENT_ID = G-YOUR_GA_MEASUREMENT_ID \ No newline at end of file +NEXT_PUBLIC_GA_MEASUREMENT_ID = G-YOUR_GA_MEASUREMENT_ID + +NEXT_PUBLIC_APP_VERSION = 1.0.0 +NEXT_PUBLIC_NEXT_VERSION = 13.4.5 diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 571f15b..9ef8bae 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -12,8 +12,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + node-version: [18.x, 20.x] steps: - uses: actions/checkout@v3 @@ -33,8 +32,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + node-version: [18.x, 20.x] steps: - uses: actions/checkout@v3 @@ -47,6 +45,8 @@ jobs: NEXT_PUBLIC_WAKA_COUNTRY = Indonesia} GITHUB_USERNAME = rezaageng GITHUB_KEY= ${{secrets.GH_KEY}} + NEXT_PUBLIC_APP_VERSION = 1.0.0 + NEXT_PUBLIC_NEXT_VERSION = 14.0.2 LEETCODE_USERNAME = rezaageng" > .env - uses: pnpm/action-setup@v2 with: diff --git a/next.config.js b/next.config.mjs similarity index 75% rename from next.config.js rename to next.config.mjs index 940ab67..6ed7735 100644 --- a/next.config.js +++ b/next.config.mjs @@ -1,3 +1,6 @@ +// @ts-check +import withPlaiceholder from '@plaiceholder/next' + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, @@ -16,4 +19,4 @@ const nextConfig = { } } -module.exports = nextConfig +export default withPlaiceholder(nextConfig) diff --git a/package.json b/package.json index aa5cfb0..e8341d1 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,13 @@ "preinstall": "npx only-allow pnpm" }, "dependencies": { - "@apollo/client": "3.8.6", - "@apollo/experimental-nextjs-app-support": "^0.4.3", + "@apollo/client": "3.8.7", + "@apollo/experimental-nextjs-app-support": "^0.5.1", "@habx/apollo-multi-endpoint-link": "^2.9.0", "@juggle/resize-observer": "^3.4.0", - "@react-three/drei": "^9.80.1", - "@react-three/fiber": "^8.13.6", + "@plaiceholder/next": "^3.0.0", + "@react-three/drei": "^9.88.14", + "@react-three/fiber": "^8.15.11", "@studio-freight/react-lenis": "^0.0.30", "@tanstack/react-query": "^4.32.1", "@tanstack/react-query-devtools": "^4.32.1", @@ -30,14 +31,15 @@ "@types/react": "18.2.18", "@types/react-dom": "18.2.7", "@types/testing-library__jest-dom": "^5.14.9", - "@types/three": "^0.155.0", + "@types/three": "^0.158.2", "@types/uuid": "^9.0.2", "date-fns": "^2.30.0", - "framer-motion": "^10.16.4", + "framer-motion": "^10.16.5", "highlight.js": "^11.9.0", "lottie-react": "^2.4.0", - "next": "13.4.12", + "next": "14.0.2", "next-mdx-remote": "^4.4.1", + "plaiceholder": "^3.0.0", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.45.2", @@ -49,7 +51,7 @@ "rehype-slug": "^6.0.0", "remark-gfm": "^3.0.1", "sharp": "^0.32.6", - "three": "^0.155.0", + "three": "^0.158.0", "uuid": "^9.0.0", "zustand": "^4.4.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29ebf58..47434e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,23 +6,26 @@ settings: dependencies: '@apollo/client': - specifier: 3.8.6 - version: 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + specifier: 3.8.7 + version: 3.8.7(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) '@apollo/experimental-nextjs-app-support': - specifier: ^0.4.3 - version: 0.4.3(@apollo/client@3.8.6)(next@13.4.12)(react@18.2.0) + specifier: ^0.5.1 + version: 0.5.1(@apollo/client@3.8.7)(next@14.0.2)(react@18.2.0) '@habx/apollo-multi-endpoint-link': specifier: ^2.9.0 - version: 2.9.0(@apollo/client@3.8.6) + version: 2.9.0(@apollo/client@3.8.7) '@juggle/resize-observer': specifier: ^3.4.0 version: 3.4.0 + '@plaiceholder/next': + specifier: ^3.0.0 + version: 3.0.0(next@14.0.2)(plaiceholder@3.0.0)(sharp@0.32.6) '@react-three/drei': - specifier: ^9.80.1 - version: 9.80.1(@react-three/fiber@8.13.6)(@types/three@0.155.0)(react-dom@18.2.0)(react@18.2.0)(three@0.155.0) + specifier: ^9.88.14 + version: 9.88.14(@react-three/fiber@8.15.11)(@types/three@0.158.2)(react-dom@18.2.0)(react@18.2.0)(three@0.158.0) '@react-three/fiber': - specifier: ^8.13.6 - version: 8.13.6(react-dom@18.2.0)(react@18.2.0)(three@0.155.0) + specifier: ^8.15.11 + version: 8.15.11(react-dom@18.2.0)(react@18.2.0)(three@0.158.0) '@studio-freight/react-lenis': specifier: ^0.0.30 version: 0.0.30(@types/react@18.2.18)(react-dom@18.2.0)(react@18.2.0) @@ -48,8 +51,8 @@ dependencies: specifier: ^5.14.9 version: 5.14.9 '@types/three': - specifier: ^0.155.0 - version: 0.155.0 + specifier: ^0.158.2 + version: 0.158.2 '@types/uuid': specifier: ^9.0.2 version: 9.0.2 @@ -57,8 +60,8 @@ dependencies: specifier: ^2.30.0 version: 2.30.0 framer-motion: - specifier: ^10.16.4 - version: 10.16.4(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.5 + version: 10.16.5(react-dom@18.2.0)(react@18.2.0) highlight.js: specifier: ^11.9.0 version: 11.9.0 @@ -66,11 +69,14 @@ dependencies: specifier: ^2.4.0 version: 2.4.0(react-dom@18.2.0)(react@18.2.0) next: - specifier: 13.4.12 - version: 13.4.12(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) + specifier: 14.0.2 + version: 14.0.2(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) next-mdx-remote: specifier: ^4.4.1 version: 4.4.1(react-dom@18.2.0)(react@18.2.0) + plaiceholder: + specifier: ^3.0.0 + version: 3.0.0(sharp@0.32.6) react: specifier: 18.2.0 version: 18.2.0 @@ -105,8 +111,8 @@ dependencies: specifier: ^0.32.6 version: 0.32.6 three: - specifier: ^0.155.0 - version: 0.155.0 + specifier: ^0.158.0 + version: 0.158.0 uuid: specifier: ^9.0.0 version: 9.0.0 @@ -123,7 +129,7 @@ devDependencies: version: 17.6.7 '@react-three/test-renderer': specifier: ^8.2.0 - version: 8.2.0(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0) + version: 8.2.0(@react-three/fiber@8.15.11)(react@18.2.0)(three@0.158.0) '@semantic-release/github': specifier: ^9.2.1 version: 9.2.1(semantic-release@22.0.5) @@ -258,10 +264,10 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - /@apollo/client@3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): + /@apollo/client@3.8.7(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): resolution: { - integrity: sha512-FnHg3vhQP8tQzgBs6oTJCFFIbovelDGYujj6MK7CJneiHf62TJstCIO0Ot4A1h7XrgFEtgl8a/OgajQWqrTuYw== + integrity: sha512-DnQtFkQrCyxHTSa9gR84YRLmU/al6HeXcLZazVe+VxKBmx/Hj4rV8xWtzfWYX5ijartsqDR7SJgV037MATEecA== } peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -280,8 +286,8 @@ packages: optional: true dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@wry/context': 0.7.3 - '@wry/equality': 0.5.6 + '@wry/context': 0.7.4 + '@wry/equality': 0.5.7 '@wry/trie': 0.4.3 graphql: 16.8.1 graphql-tag: 2.12.6(graphql@16.8.1) @@ -297,18 +303,18 @@ packages: zen-observable-ts: 1.2.5 dev: false - /@apollo/experimental-nextjs-app-support@0.4.3(@apollo/client@3.8.6)(next@13.4.12)(react@18.2.0): + /@apollo/experimental-nextjs-app-support@0.5.1(@apollo/client@3.8.7)(next@14.0.2)(react@18.2.0): resolution: { - integrity: sha512-UrgLMUIW7SFmeJyLvqh0E8KRvo6Nd/zzbUFt0ENT3BRa7z7kGsCk7I+kZEZEAn13nqlTC3M4VPS6tOfvtLFhxQ== + integrity: sha512-gQiFY/zntVAhPTTFfFFOogp4TKVMpbPsydv3gyMR5E0IK6WgtITTcl/uuWlnfL92+enk5mfrtoQ+0p+t2a9u2A== } peerDependencies: - '@apollo/client': '>=3.8.0-rc || ^3.8.0' - next: ^13.4.1 + '@apollo/client': '>=3.8.0-rc || ^3.8.0 || >=3.9.0-alpha || >=3.9.0-beta || >=3.9.0-rc' + next: ^13.4.1 || ^14.0.0 react: ^18 dependencies: - '@apollo/client': 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) - next: 13.4.12(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) + '@apollo/client': 3.8.7(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + next: 14.0.2(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 server-only: 0.0.1 superjson: 1.13.3 @@ -696,6 +702,15 @@ packages: dependencies: regenerator-runtime: 0.13.11 + /@babel/runtime@7.23.2: + resolution: + { + integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + } + engines: { node: '>=6.9.0' } + dependencies: + regenerator-runtime: 0.14.0 + /@babel/template@7.22.5: resolution: { @@ -745,41 +760,6 @@ packages: } dev: true - /@chevrotain/cst-dts-gen@10.5.0: - resolution: - { - integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw== - } - dependencies: - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - lodash: 4.17.21 - dev: false - - /@chevrotain/gast@10.5.0: - resolution: - { - integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A== - } - dependencies: - '@chevrotain/types': 10.5.0 - lodash: 4.17.21 - dev: false - - /@chevrotain/types@10.5.0: - resolution: - { - integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A== - } - dev: false - - /@chevrotain/utils@10.5.0: - resolution: - { - integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ== - } - dev: false - /@colors/colors@1.5.0: resolution: { @@ -1099,7 +1079,7 @@ packages: graphql: 16.8.1 dev: false - /@habx/apollo-multi-endpoint-link@2.9.0(@apollo/client@3.8.6): + /@habx/apollo-multi-endpoint-link@2.9.0(@apollo/client@3.8.7): resolution: { integrity: sha512-QH/6wm0m2g0mXk2T6ik/2Sv1hlr2wXR9kPvSVHcQJERmShBMFj2KWfPg6Fiai/8+katf9xmhr7JFC0SXWsqmpg== @@ -1107,7 +1087,7 @@ packages: peerDependencies: '@apollo/client': ^3.7.1 dependencies: - '@apollo/client': 3.8.6(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + '@apollo/client': 3.8.7(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) dev: false /@humanwhocodes/config-array@0.11.10: @@ -1540,10 +1520,10 @@ packages: react: 18.2.0 dev: false - /@mediapipe/tasks-vision@0.10.2: + /@mediapipe/tasks-vision@0.10.8: resolution: { - integrity: sha512-d8Q9uRK89ZRWmED2JLI9/blpJcfdbh0iEUuMo8TgkMzNfQBY1/GC0FEJWrairTwHkxIf6Oud1vFBP+aHicWqJA== + integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q== } dev: false @@ -1577,10 +1557,10 @@ packages: - supports-color dev: true - /@next/env@13.4.12: + /@next/env@14.0.2: resolution: { - integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ== + integrity: sha512-HAW1sljizEaduEOes/m84oUqeIDAUYBR1CDwu2tobNlNDFP3cSm9d6QsOsGeNlIppU1p/p1+bWbYCbvwjFiceA== } dev: false @@ -1593,10 +1573,10 @@ packages: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@13.4.12: + /@next/swc-darwin-arm64@14.0.2: resolution: { - integrity: sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg== + integrity: sha512-i+jQY0fOb8L5gvGvojWyZMfQoQtDVB2kYe7fufOEiST6sicvzI2W5/EXo4lX5bLUjapHKe+nFxuVv7BA+Pd7LQ== } engines: { node: '>= 10' } cpu: [arm64] @@ -1605,10 +1585,10 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.12: + /@next/swc-darwin-x64@14.0.2: resolution: { - integrity: sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ== + integrity: sha512-zRCAO0d2hW6gBEa4wJaLn+gY8qtIqD3gYd9NjruuN98OCI6YyelmhWVVLlREjS7RYrm9OUQIp/iVJFeB6kP1hg== } engines: { node: '>= 10' } cpu: [x64] @@ -1617,10 +1597,10 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.12: + /@next/swc-linux-arm64-gnu@14.0.2: resolution: { - integrity: sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig== + integrity: sha512-tSJmiaon8YaKsVhi7GgRizZoV0N1Sx5+i+hFTrCKKQN7s3tuqW0Rov+RYdPhAv/pJl4qiG+XfSX4eJXqpNg3dA== } engines: { node: '>= 10' } cpu: [arm64] @@ -1629,10 +1609,10 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.12: + /@next/swc-linux-arm64-musl@14.0.2: resolution: { - integrity: sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g== + integrity: sha512-dXJLMSEOwqJKcag1BeX1C+ekdPPJ9yXbWIt3nAadhbLx5CjACoB2NQj9Xcqu2tmdr5L6m34fR+fjGPs+ZVPLzA== } engines: { node: '>= 10' } cpu: [arm64] @@ -1641,10 +1621,10 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.12: + /@next/swc-linux-x64-gnu@14.0.2: resolution: { - integrity: sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg== + integrity: sha512-WC9KAPSowj6as76P3vf1J3mf2QTm3Wv3FBzQi7UJ+dxWjK3MhHVWsWUo24AnmHx9qDcEtHM58okgZkXVqeLB+Q== } engines: { node: '>= 10' } cpu: [x64] @@ -1653,10 +1633,10 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.12: + /@next/swc-linux-x64-musl@14.0.2: resolution: { - integrity: sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ== + integrity: sha512-KSSAwvUcjtdZY4zJFa2f5VNJIwuEVnOSlqYqbQIawREJA+gUI6egeiRu290pXioQXnQHYYdXmnVNZ4M+VMB7KQ== } engines: { node: '>= 10' } cpu: [x64] @@ -1665,10 +1645,10 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.12: + /@next/swc-win32-arm64-msvc@14.0.2: resolution: { - integrity: sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA== + integrity: sha512-2/O0F1SqJ0bD3zqNuYge0ok7OEWCQwk55RPheDYD0va5ij7kYwrFkq5ycCRN0TLjLfxSF6xI5NM6nC5ux7svEQ== } engines: { node: '>= 10' } cpu: [arm64] @@ -1677,10 +1657,10 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.12: + /@next/swc-win32-ia32-msvc@14.0.2: resolution: { - integrity: sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww== + integrity: sha512-vJI/x70Id0oN4Bq/R6byBqV1/NS5Dl31zC+lowO8SDu1fHmUxoAdILZR5X/sKbiJpuvKcCrwbYgJU8FF/Gh50Q== } engines: { node: '>= 10' } cpu: [ia32] @@ -1689,10 +1669,10 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.12: + /@next/swc-win32-x64-msvc@14.0.2: resolution: { - integrity: sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA== + integrity: sha512-Ut4LXIUvC5m8pHTe2j0vq/YDnTEyq6RSR9vHYPqnELrDapPhLNz9Od/L5Ow3J8RNDWpEnfCiQXuVdfjlNEJ7ug== } engines: { node: '>= 10' } cpu: [x64] @@ -1895,6 +1875,21 @@ packages: tslib: 2.6.2 dev: true + /@plaiceholder/next@3.0.0(next@14.0.2)(plaiceholder@3.0.0)(sharp@0.32.6): + resolution: + { + integrity: sha512-7UK/H1X64hwo2VaxOPKMXE+OY9IgmKLPsq/xKHZ+gU07oqQSfIWWIgpVVucMB3ZgVYah+68agR15BRuSxAuMHw== + } + peerDependencies: + next: '>= 10.0.0' + plaiceholder: '>=3.0.0' + sharp: '>= 0.30.6' + dependencies: + next: 14.0.2(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) + plaiceholder: 3.0.0(sharp@0.32.6) + sharp: 0.32.6 + dev: false + /@pnpm/config.env-replace@1.1.0: resolution: { @@ -1973,7 +1968,7 @@ packages: react: 18.2.0 dev: false - /@react-spring/three@9.6.1(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0): + /@react-spring/three@9.6.1(@react-three/fiber@8.15.11)(react@18.2.0)(three@0.158.0): resolution: { integrity: sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== @@ -1987,9 +1982,9 @@ packages: '@react-spring/core': 9.6.1(react@18.2.0) '@react-spring/shared': 9.6.1(react@18.2.0) '@react-spring/types': 9.6.1 - '@react-three/fiber': 8.13.6(react-dom@18.2.0)(react@18.2.0)(three@0.155.0) + '@react-three/fiber': 8.15.11(react-dom@18.2.0)(react@18.2.0)(three@0.158.0) react: 18.2.0 - three: 0.155.0 + three: 0.158.0 dev: false /@react-spring/types@9.6.1: @@ -1999,10 +1994,10 @@ packages: } dev: false - /@react-three/drei@9.80.1(@react-three/fiber@8.13.6)(@types/three@0.155.0)(react-dom@18.2.0)(react@18.2.0)(three@0.155.0): + /@react-three/drei@9.88.14(@react-three/fiber@8.15.11)(@types/three@0.158.2)(react-dom@18.2.0)(react@18.2.0)(three@0.158.0): resolution: { - integrity: sha512-BlntSFEQb+Zhtj1zVfVv4ts/Co6GUBeZLPgG4SYhecKdGy1ctFaH2Tb8Z8HIl8PToUeWEDfKO4g4+/pE89YrEw== + integrity: sha512-DKWwFA5UkXWdA3AlJkXVPXYXecnBRThWv3kYOWxSuNW3KfznsehCemgI0Cn81cHi59+J4N8xPLO8TuF4oYbfew== } peerDependencies: '@react-three/fiber': '>=8.0' @@ -2013,44 +2008,47 @@ packages: react-dom: optional: true dependencies: - '@babel/runtime': 7.22.6 - '@mediapipe/tasks-vision': 0.10.2 - '@react-spring/three': 9.6.1(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0) - '@react-three/fiber': 8.13.6(react-dom@18.2.0)(react@18.2.0)(three@0.155.0) - '@use-gesture/react': 10.2.27(react@18.2.0) - camera-controls: 2.7.0(three@0.155.0) - detect-gpu: 5.0.35 + '@babel/runtime': 7.23.2 + '@mediapipe/tasks-vision': 0.10.8 + '@react-spring/three': 9.6.1(@react-three/fiber@8.15.11)(react@18.2.0)(three@0.158.0) + '@react-three/fiber': 8.15.11(react-dom@18.2.0)(react@18.2.0)(three@0.158.0) + '@use-gesture/react': 10.3.0(react@18.2.0) + camera-controls: 2.7.3(three@0.158.0) + cross-env: 7.0.3 + detect-gpu: 5.0.37 glsl-noise: 0.0.0 lodash.clamp: 4.0.3 lodash.omit: 4.5.0 lodash.pick: 4.4.0 - maath: 0.6.0(@types/three@0.155.0)(three@0.155.0) - meshline: 3.1.6(three@0.155.0) + maath: 0.9.0(@types/three@0.158.2)(three@0.158.0) + meshline: 3.1.7(three@0.158.0) react: 18.2.0 react-composer: 5.0.3(react@18.2.0) react-dom: 18.2.0(react@18.2.0) react-merge-refs: 1.1.0 - stats-gl: 1.0.4 + stats-gl: 1.0.7 stats.js: 0.17.0 suspend-react: 0.1.3(react@18.2.0) - three: 0.155.0 - three-mesh-bvh: 0.6.3(three@0.155.0) - three-stdlib: 2.24.1(three@0.155.0) - troika-three-text: 0.47.2(three@0.155.0) + three: 0.158.0 + three-mesh-bvh: 0.6.8(three@0.158.0) + three-stdlib: 2.28.5(three@0.158.0) + troika-three-text: 0.47.2(three@0.158.0) utility-types: 3.10.0 + uuid: 9.0.1 zustand: 3.7.2(react@18.2.0) transitivePeerDependencies: - '@types/three' dev: false - /@react-three/fiber@8.13.6(react-dom@18.2.0)(react@18.2.0)(three@0.155.0): + /@react-three/fiber@8.15.11(react-dom@18.2.0)(react@18.2.0)(three@0.158.0): resolution: { - integrity: sha512-V49lldHcbsC7PMnnf4aYrMpHPQe8R7hJYL0AEFjqwioY0nkwga9A+Jx6lCLVG02DF03xwCfJZv5cjZCChffsWg== + integrity: sha512-jOJjrjVMBJQwIK6Uirc3bErUCTiclbS2alJG1eU8pV1jIwDZwPwcfHzSi2TautxoA4ddMt5DmlpatK4rIqM4jA== } peerDependencies: expo: '>=43.0' expo-asset: '>=8.4' + expo-file-system: '>=11.0' expo-gl: '>=11.0' react: '>=18.0' react-dom: '>=18.0' @@ -2061,6 +2059,8 @@ packages: optional: true expo-asset: optional: true + expo-file-system: + optional: true expo-gl: optional: true react-dom: @@ -2068,8 +2068,11 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.23.2 '@types/react-reconciler': 0.26.7 + '@types/webxr': 0.5.8 + base64-js: 1.5.1 + buffer: 6.0.3 its-fine: 1.1.1(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2077,10 +2080,10 @@ packages: react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) scheduler: 0.21.0 suspend-react: 0.1.3(react@18.2.0) - three: 0.155.0 + three: 0.158.0 zustand: 3.7.2(react@18.2.0) - /@react-three/test-renderer@8.2.0(@react-three/fiber@8.13.6)(react@18.2.0)(three@0.155.0): + /@react-three/test-renderer@8.2.0(@react-three/fiber@8.15.11)(react@18.2.0)(three@0.158.0): resolution: { integrity: sha512-sYTW/9AkU0f03M/rilYaCB9ORD3tS96bUhM+WRsx/QLtOKdUNCWrWwnxutm5M0orON0A0O84gbUosnqvCAKTsw== @@ -2090,9 +2093,9 @@ packages: react: '>=17.0' three: '>=0.126' dependencies: - '@react-three/fiber': 8.13.6(react-dom@18.2.0)(react@18.2.0)(three@0.155.0) + '@react-three/fiber': 8.15.11(react-dom@18.2.0)(react@18.2.0)(three@0.158.0) react: 18.2.0 - three: 0.155.0 + three: 0.158.0 dev: true /@rushstack/eslint-patch@1.3.2: @@ -2292,10 +2295,10 @@ packages: } dev: false - /@swc/helpers@0.5.1: + /@swc/helpers@0.5.2: resolution: { - integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== } dependencies: tslib: 2.6.2 @@ -2460,13 +2463,6 @@ packages: } dev: true - /@tweenjs/tween.js@18.6.4: - resolution: - { - integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ== - } - dev: false - /@types/acorn@4.0.6: resolution: { @@ -2539,10 +2535,10 @@ packages: dependencies: '@types/ms': 0.7.31 - /@types/draco3d@1.4.2: + /@types/draco3d@1.4.8: resolution: { - integrity: sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w== + integrity: sha512-hdA2gODc+1X5gG+buH8gMRnQdRTa3vep8+PyGFK9xDQmbdudobP//yXLK+C/SnjGLWHiER2QL+xWjq7qkFuivA== } dev: false @@ -2701,10 +2697,10 @@ packages: } dev: true - /@types/offscreencanvas@2019.7.0: + /@types/offscreencanvas@2019.7.3: resolution: { - integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== + integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== } dev: false @@ -2730,10 +2726,10 @@ packages: dependencies: '@types/react': 18.2.18 - /@types/react-reconciler@0.28.2: + /@types/react-reconciler@0.28.8: resolution: { - integrity: sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw== + integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g== } dependencies: '@types/react': 18.2.18 @@ -2776,10 +2772,10 @@ packages: integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== } - /@types/stats.js@0.17.0: + /@types/stats.js@0.17.3: resolution: { - integrity: sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w== + integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ== } dev: false @@ -2791,17 +2787,15 @@ packages: dependencies: '@types/jest': 29.5.3 - /@types/three@0.155.0: + /@types/three@0.158.2: resolution: { - integrity: sha512-IzdbqXsGsbG0flvq9D5L9pZRwySQQps2bGcizLYEsfvK3dM+B0sqKR6S+xAOXbouXemfDmHttrcQjVOM46YnAw== + integrity: sha512-KPYbdLI8VPhu7qnHqsayfkuk58Qk+20l1U5HBK7uG50EjtrqeCreurNNpnatMZje29XRuTM1A+pGHGdDBHPyUQ== } dependencies: - '@tweenjs/tween.js': 18.6.4 - '@types/stats.js': 0.17.0 - '@types/webxr': 0.5.2 + '@types/stats.js': 0.17.3 + '@types/webxr': 0.5.8 fflate: 0.6.10 - lil-gui: 0.17.0 meshoptimizer: 0.18.1 dev: false @@ -2833,12 +2827,11 @@ packages: } dev: false - /@types/webxr@0.5.2: + /@types/webxr@0.5.8: resolution: { - integrity: sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== + integrity: sha512-9vRpV4nMzuZIdJiu/nHUk1AQV0cguaBI32DIauJXBxpvG3wiXk3VD+kQKx111V7I/YvAoGyJZTyhaWODYEbZ0w== } - dev: false /@types/yargs-parser@21.0.0: resolution: @@ -3015,39 +3008,39 @@ packages: } dev: false - /@use-gesture/core@10.2.27: + /@use-gesture/core@10.3.0: resolution: { - integrity: sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA== + integrity: sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A== } dev: false - /@use-gesture/react@10.2.27(react@18.2.0): + /@use-gesture/react@10.3.0(react@18.2.0): resolution: { - integrity: sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w== + integrity: sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA== } peerDependencies: react: '>= 16.8.0' dependencies: - '@use-gesture/core': 10.2.27 + '@use-gesture/core': 10.3.0 react: 18.2.0 dev: false - /@wry/context@0.7.3: + /@wry/context@0.7.4: resolution: { - integrity: sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA== + integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== } engines: { node: '>=8' } dependencies: tslib: 2.6.2 dev: false - /@wry/equality@0.5.6: + /@wry/equality@0.5.7: resolution: { - integrity: sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA== + integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== } engines: { node: '>=8' } dependencies: @@ -3798,6 +3791,15 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + /builtins@5.0.1: resolution: { @@ -3881,15 +3883,15 @@ packages: engines: { node: '>=10' } dev: true - /camera-controls@2.7.0(three@0.155.0): + /camera-controls@2.7.3(three@0.158.0): resolution: { - integrity: sha512-HONMoMYHieOCQOoweS639bdWHP/P/fvVGR08imnECGVUp04mqGfsX/zp1ZufLeiAA5hA6i1JhP6SrnOwh01C0w== + integrity: sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw== } peerDependencies: three: '>=0.126.1' dependencies: - three: 0.155.0 + three: 0.158.0 dev: false /caniuse-lite@1.0.30001519: @@ -3898,10 +3900,10 @@ packages: integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== } - /caniuse-lite@1.0.30001543: + /caniuse-lite@1.0.30001561: resolution: { - integrity: sha512-qxdO8KPWPQ+Zk6bvNpPeQIOH47qZSYdFZd6dXQzb2KzhnSXju4Kd7H1PkSJx6NICSMgo/IhRZRhhfPTHYpJUCA== + integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== } dev: false @@ -4025,20 +4027,6 @@ packages: } dev: true - /chevrotain@10.5.0: - resolution: - { - integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A== - } - dependencies: - '@chevrotain/cst-dts-gen': 10.5.0 - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - '@chevrotain/utils': 10.5.0 - lodash: 4.17.21 - regexp-to-ast: 0.5.0 - dev: false - /chokidar@3.5.3: resolution: { @@ -4488,6 +4476,17 @@ packages: } dev: true + /cross-env@7.0.3: + resolution: + { + integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + } + engines: { node: '>=10.14', npm: '>=6', yarn: '>=1' } + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: false + /cross-spawn@7.0.3: resolution: { @@ -4819,10 +4818,10 @@ packages: } engines: { node: '>=6' } - /detect-gpu@5.0.35: + /detect-gpu@5.0.37: resolution: { - integrity: sha512-iPHtHRGTOP7fkmh7eeZ+EWLkhFBOXV+q1suXhibtCDe5g/Pw0J65P6vsC0Mkhljj73bQP0t6aJz0SA1rWRW4lw== + integrity: sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw== } dependencies: webgl-constants: 1.1.1 @@ -6125,10 +6124,10 @@ packages: } dev: true - /framer-motion@10.16.4(react-dom@18.2.0)(react@18.2.0): + /framer-motion@10.16.5(react-dom@18.2.0)(react@18.2.0): resolution: { - integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA== + integrity: sha512-GEzVjOYP2MIpV9bT/GbhcsBNoImG3/2X3O/xVNWmktkv9MdJ7P/44zELm/7Fjb+O3v39SmKFnoDQB32giThzpg== } peerDependencies: react: ^18.0.0 @@ -7623,7 +7622,7 @@ packages: peerDependencies: react: '>=18.0' dependencies: - '@types/react-reconciler': 0.28.2 + '@types/react-reconciler': 0.28.8 react: 18.2.0 /jackspeak@2.3.3: @@ -8384,13 +8383,6 @@ packages: engines: { node: '>=6' } dev: false - /ktx-parse@0.4.5: - resolution: - { - integrity: sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== - } - dev: false - /language-subtag-registry@0.3.22: resolution: { @@ -8426,13 +8418,6 @@ packages: type-check: 0.4.0 dev: true - /lil-gui@0.17.0: - resolution: - { - integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ== - } - dev: false - /lilconfig@2.1.0: resolution: { @@ -8703,6 +8688,7 @@ packages: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + dev: true /log-symbols@4.1.0: resolution: @@ -8808,17 +8794,17 @@ packages: hasBin: true dev: true - /maath@0.6.0(@types/three@0.155.0)(three@0.155.0): + /maath@0.9.0(@types/three@0.158.2)(three@0.158.0): resolution: { - integrity: sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw== + integrity: sha512-aAR8hoUqPxlsU8VOxkS9y37jhUzdUxM017NpCuxFU1Gk+nMaZASZxymZrV8LRSHzRk/watlbfyNKu6XPUhCFrQ== } peerDependencies: '@types/three': '>=0.144.0' three: '>=0.144.0' dependencies: - '@types/three': 0.155.0 - three: 0.155.0 + '@types/three': 0.158.2 + three: 0.158.0 dev: false /make-dir@4.0.0: @@ -9194,15 +9180,15 @@ packages: engines: { node: '>= 8' } dev: true - /meshline@3.1.6(three@0.155.0): + /meshline@3.1.7(three@0.158.0): resolution: { - integrity: sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug== + integrity: sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg== } peerDependencies: three: '>=0.137' dependencies: - three: 0.155.0 + three: 0.158.0 dev: false /meshoptimizer@0.18.1: @@ -9772,13 +9758,6 @@ packages: } dev: false - /mmd-parser@1.0.4: - resolution: - { - integrity: sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg== - } - dev: false - /moo-color@1.0.3: resolution: { @@ -9873,6 +9852,16 @@ packages: } engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true + dev: true + + /nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: false /napi-build-utils@1.0.2: resolution: @@ -9929,47 +9918,43 @@ packages: - supports-color dev: false - /next@13.4.12(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0): + /next@14.0.2(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0): resolution: { - integrity: sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw== + integrity: sha512-jsAU2CkYS40GaQYOiLl9m93RTv2DA/tTJ0NRlmZIBIL87YwQ/xR8k796z7IqgM3jydI8G25dXvyYMC9VDIevIg== } - engines: { node: '>=16.8.0' } + engines: { node: '>=18.17.0' } hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - fibers: - optional: true sass: optional: true dependencies: - '@next/env': 13.4.12 - '@swc/helpers': 0.5.1 + '@next/env': 14.0.2 + '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001543 - postcss: 8.4.14 + caniuse-lite: 1.0.30001561 + postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) styled-jsx: 5.1.1(@babel/core@7.22.9)(react@18.2.0) watchpack: 2.4.0 - zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.12 - '@next/swc-darwin-x64': 13.4.12 - '@next/swc-linux-arm64-gnu': 13.4.12 - '@next/swc-linux-arm64-musl': 13.4.12 - '@next/swc-linux-x64-gnu': 13.4.12 - '@next/swc-linux-x64-musl': 13.4.12 - '@next/swc-win32-arm64-msvc': 13.4.12 - '@next/swc-win32-ia32-msvc': 13.4.12 - '@next/swc-win32-x64-msvc': 13.4.12 + '@next/swc-darwin-arm64': 14.0.2 + '@next/swc-darwin-x64': 14.0.2 + '@next/swc-linux-arm64-gnu': 14.0.2 + '@next/swc-linux-arm64-musl': 14.0.2 + '@next/swc-linux-x64-gnu': 14.0.2 + '@next/swc-linux-x64-musl': 14.0.2 + '@next/swc-win32-arm64-msvc': 14.0.2 + '@next/swc-win32-ia32-msvc': 14.0.2 + '@next/swc-win32-x64-msvc': 14.0.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -10355,25 +10340,13 @@ packages: is-wsl: 2.2.0 dev: true - /opentype.js@1.3.4: - resolution: - { - integrity: sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw== - } - engines: { node: '>= 8.0.0' } - hasBin: true - dependencies: - string.prototype.codepointat: 0.2.1 - tiny-inflate: 1.0.3 - dev: false - /optimism@0.17.5: resolution: { integrity: sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw== } dependencies: - '@wry/context': 0.7.3 + '@wry/context': 0.7.4 '@wry/trie': 0.4.3 tslib: 2.6.2 dev: false @@ -10807,6 +10780,17 @@ packages: find-up: 4.1.0 dev: true + /plaiceholder@3.0.0(sharp@0.32.6): + resolution: + { + integrity: sha512-jwHxxHPnr1BwRzPCeZgEK2BMsEy2327sWynw3qb6XC/oGgGDUTPtR8pFxFQmNArhMBwhkUbUr5OPhhIJpCa8eQ== + } + peerDependencies: + sharp: '>= 0.30.6' + dependencies: + sharp: 0.32.6 + dev: false + /postcss-import@15.1.0(postcss@8.4.27): resolution: { @@ -10898,29 +10882,29 @@ packages: } dev: true - /postcss@8.4.14: + /postcss@8.4.27: resolution: { - integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== } engines: { node: ^10 || ^12 || >=14 } dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false + dev: true - /postcss@8.4.27: + /postcss@8.4.31: resolution: { - integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== } engines: { node: ^10 || ^12 || >=14 } dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true + dev: false /potpack@1.0.2: resolution: @@ -11424,12 +11408,11 @@ packages: integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== } - /regexp-to-ast@0.5.0: + /regenerator-runtime@0.14.0: resolution: { - integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw== + integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== } - dev: false /regexp.prototype.flags@1.5.0: resolution: @@ -12249,10 +12232,10 @@ packages: dependencies: escape-string-regexp: 2.0.0 - /stats-gl@1.0.4: + /stats-gl@1.0.7: resolution: { - integrity: sha512-oxo13HHonoMWIYcrIu4xCk8IcFEFaqAOkMOMIyfvZFxNZzGy+jnW8sy0W3VfEjKQd5JX0Kp2KhePAKhtI6/TSw== + integrity: sha512-vZI82CjefSxLC1bjw36z28v0+QE9rJKymGlXtfWu+ipW70ZEAwa4EbO4LxluAfLfpqiaAS04NzpYBRLDeAwYWQ== } dev: false @@ -12358,13 +12341,6 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string.prototype.codepointat@0.2.1: - resolution: - { - integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== - } - dev: false - /string.prototype.matchall@4.0.8: resolution: { @@ -12844,43 +12820,38 @@ packages: any-promise: 1.3.0 dev: true - /three-mesh-bvh@0.6.3(three@0.155.0): + /three-mesh-bvh@0.6.8(three@0.158.0): resolution: { - integrity: sha512-xjuGLSI9nBATIsWcT/DnnNma5xXYyvBiXfUbhGLAFqItOlOKYF5JWsUOX+cuSAnSWovEoHzd5Emx23qKiByrlw== + integrity: sha512-EGebF9DZx1S8+7OZYNNTT80GXJZVf+UYXD/HyTg/e2kR/ApofIFfUS4ZzIHNnUVIadpnLSzM4n96wX+l7GMbnQ== } peerDependencies: three: '>= 0.151.0' dependencies: - three: 0.155.0 + three: 0.158.0 dev: false - /three-stdlib@2.24.1(three@0.155.0): + /three-stdlib@2.28.5(three@0.158.0): resolution: { - integrity: sha512-imb4IQPtp6hGurwZhfv3K6MCxS/IhXmG6FZxxuVsERwZiVH7KjeHUFT66Jlqs8WC4f3pYkXrH7ht8HpdGcXlMQ== + integrity: sha512-JdLMhkpT+1ZWeQPyKQNW1zqUwISI2hsUljS6u3vB9lp5EvwsayaAzGnbVeR35895udOF+zxcTiQY3psk+qqlxg== } peerDependencies: three: '>=0.128.0' dependencies: - '@types/draco3d': 1.4.2 - '@types/offscreencanvas': 2019.7.0 - '@types/webxr': 0.5.2 - chevrotain: 10.5.0 + '@types/draco3d': 1.4.8 + '@types/offscreencanvas': 2019.7.3 + '@types/webxr': 0.5.8 draco3d: 1.5.6 fflate: 0.6.10 - ktx-parse: 0.4.5 - mmd-parser: 1.0.4 - opentype.js: 1.3.4 potpack: 1.0.2 - three: 0.155.0 - zstddec: 0.0.2 + three: 0.158.0 dev: false - /three@0.155.0: + /three@0.158.0: resolution: { - integrity: sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ== + integrity: sha512-TALj4EOpdDPF1henk2Q+s17K61uEAAWQ7TJB68nr7FKxqwyDr3msOt5IWdbGm4TaWKjrtWS8DJJWe9JnvsWOhQ== } /throttle-debounce@5.0.0: @@ -12917,13 +12888,6 @@ packages: } dev: true - /tiny-inflate@1.0.3: - resolution: - { - integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - } - dev: false - /titleize@3.0.0: resolution: { @@ -13017,7 +12981,7 @@ packages: engines: { node: '>=8' } dev: true - /troika-three-text@0.47.2(three@0.155.0): + /troika-three-text@0.47.2(three@0.158.0): resolution: { integrity: sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng== @@ -13026,13 +12990,13 @@ packages: three: '>=0.125.0' dependencies: bidi-js: 1.0.3 - three: 0.155.0 - troika-three-utils: 0.47.2(three@0.155.0) + three: 0.158.0 + troika-three-utils: 0.47.2(three@0.158.0) troika-worker-utils: 0.47.2 webgl-sdf-generator: 1.1.1 dev: false - /troika-three-utils@0.47.2(three@0.155.0): + /troika-three-utils@0.47.2(three@0.158.0): resolution: { integrity: sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg== @@ -13040,7 +13004,7 @@ packages: peerDependencies: three: '>=0.125.0' dependencies: - three: 0.155.0 + three: 0.158.0 dev: false /troika-worker-utils@0.47.2: @@ -13652,6 +13616,14 @@ packages: hasBin: true dev: false + /uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + } + hasBin: true + dev: false + /uvu@0.5.6: resolution: { @@ -14121,20 +14093,6 @@ packages: } dev: false - /zod@3.21.4: - resolution: - { - integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== - } - dev: false - - /zstddec@0.0.2: - resolution: - { - integrity: sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA== - } - dev: false - /zustand@3.7.2(react@18.2.0): resolution: { diff --git a/public/assets/icons/apollo.svg b/public/assets/icons/apollo.svg new file mode 100644 index 0000000..fb6c1f3 --- /dev/null +++ b/public/assets/icons/apollo.svg @@ -0,0 +1 @@ +Apollo GraphQL \ No newline at end of file diff --git a/public/assets/icons/css.svg b/public/assets/icons/css.svg new file mode 100644 index 0000000..5ca6bec --- /dev/null +++ b/public/assets/icons/css.svg @@ -0,0 +1 @@ +CSS3 \ No newline at end of file diff --git a/public/assets/icons/dart.svg b/public/assets/icons/dart.svg new file mode 100644 index 0000000..9f31966 --- /dev/null +++ b/public/assets/icons/dart.svg @@ -0,0 +1 @@ +Dart \ No newline at end of file diff --git a/public/assets/icons/flutter.svg b/public/assets/icons/flutter.svg new file mode 100644 index 0000000..0121216 --- /dev/null +++ b/public/assets/icons/flutter.svg @@ -0,0 +1 @@ +Flutter \ No newline at end of file diff --git a/public/assets/icons/framer.svg b/public/assets/icons/framer.svg new file mode 100644 index 0000000..e5a2d41 --- /dev/null +++ b/public/assets/icons/framer.svg @@ -0,0 +1 @@ +Framer \ No newline at end of file diff --git a/public/assets/icons/git.svg b/public/assets/icons/git.svg new file mode 100644 index 0000000..13af359 --- /dev/null +++ b/public/assets/icons/git.svg @@ -0,0 +1 @@ +Git \ No newline at end of file diff --git a/public/assets/icons/github.svg b/public/assets/icons/github.svg new file mode 100644 index 0000000..538ec5b --- /dev/null +++ b/public/assets/icons/github.svg @@ -0,0 +1 @@ +GitHub \ No newline at end of file diff --git a/public/assets/icons/html5.svg b/public/assets/icons/html5.svg new file mode 100644 index 0000000..e8b1e37 --- /dev/null +++ b/public/assets/icons/html5.svg @@ -0,0 +1 @@ +HTML5 \ No newline at end of file diff --git a/public/assets/icons/intellij.svg b/public/assets/icons/intellij.svg new file mode 100644 index 0000000..6cc5f0f --- /dev/null +++ b/public/assets/icons/intellij.svg @@ -0,0 +1 @@ +IntelliJ IDEA \ No newline at end of file diff --git a/public/assets/icons/jest.svg b/public/assets/icons/jest.svg new file mode 100644 index 0000000..3c36b3b --- /dev/null +++ b/public/assets/icons/jest.svg @@ -0,0 +1 @@ +Jest \ No newline at end of file diff --git a/public/assets/icons/js.svg b/public/assets/icons/js.svg new file mode 100644 index 0000000..91e5162 --- /dev/null +++ b/public/assets/icons/js.svg @@ -0,0 +1 @@ +JavaScript \ No newline at end of file diff --git a/public/assets/icons/lock.svg b/public/assets/icons/lock.svg new file mode 100644 index 0000000..a9a9bca --- /dev/null +++ b/public/assets/icons/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icons/md.svg b/public/assets/icons/md.svg new file mode 100644 index 0000000..53130fa --- /dev/null +++ b/public/assets/icons/md.svg @@ -0,0 +1 @@ +Markdown \ No newline at end of file diff --git a/public/assets/icons/nextjs.svg b/public/assets/icons/nextjs.svg new file mode 100644 index 0000000..9972859 --- /dev/null +++ b/public/assets/icons/nextjs.svg @@ -0,0 +1 @@ +Next.js \ No newline at end of file diff --git a/public/assets/icons/nodejs.svg b/public/assets/icons/nodejs.svg new file mode 100644 index 0000000..281c829 --- /dev/null +++ b/public/assets/icons/nodejs.svg @@ -0,0 +1 @@ +Node.js \ No newline at end of file diff --git a/public/assets/icons/npm.svg b/public/assets/icons/npm.svg new file mode 100644 index 0000000..e04468d --- /dev/null +++ b/public/assets/icons/npm.svg @@ -0,0 +1 @@ +npm \ No newline at end of file diff --git a/public/assets/icons/pnpm.svg b/public/assets/icons/pnpm.svg new file mode 100644 index 0000000..332a841 --- /dev/null +++ b/public/assets/icons/pnpm.svg @@ -0,0 +1 @@ +pnpm \ No newline at end of file diff --git a/public/assets/icons/react.svg b/public/assets/icons/react.svg new file mode 100644 index 0000000..6006995 --- /dev/null +++ b/public/assets/icons/react.svg @@ -0,0 +1 @@ +React \ No newline at end of file diff --git a/public/assets/icons/reactquery.svg b/public/assets/icons/reactquery.svg new file mode 100644 index 0000000..b500b4f --- /dev/null +++ b/public/assets/icons/reactquery.svg @@ -0,0 +1 @@ +React Query \ No newline at end of file diff --git a/public/assets/icons/rtl.svg b/public/assets/icons/rtl.svg new file mode 100644 index 0000000..45bf49c --- /dev/null +++ b/public/assets/icons/rtl.svg @@ -0,0 +1 @@ +Testing Library \ No newline at end of file diff --git a/public/assets/icons/strapi.svg b/public/assets/icons/strapi.svg new file mode 100644 index 0000000..67b522f --- /dev/null +++ b/public/assets/icons/strapi.svg @@ -0,0 +1 @@ +Strapi \ No newline at end of file diff --git a/public/assets/icons/styled.svg b/public/assets/icons/styled.svg new file mode 100644 index 0000000..f0562e2 --- /dev/null +++ b/public/assets/icons/styled.svg @@ -0,0 +1 @@ +styled-components \ No newline at end of file diff --git a/public/assets/icons/tailwind.svg b/public/assets/icons/tailwind.svg new file mode 100644 index 0000000..38b493f --- /dev/null +++ b/public/assets/icons/tailwind.svg @@ -0,0 +1 @@ +Tailwind CSS \ No newline at end of file diff --git a/public/assets/icons/three.svg b/public/assets/icons/three.svg new file mode 100644 index 0000000..a7f1829 --- /dev/null +++ b/public/assets/icons/three.svg @@ -0,0 +1 @@ +Three.js \ No newline at end of file diff --git a/public/assets/icons/ts.svg b/public/assets/icons/ts.svg new file mode 100644 index 0000000..e8beb74 --- /dev/null +++ b/public/assets/icons/ts.svg @@ -0,0 +1 @@ +TypeScript \ No newline at end of file diff --git a/public/assets/icons/vsc.svg b/public/assets/icons/vsc.svg new file mode 100644 index 0000000..51ed6bd --- /dev/null +++ b/public/assets/icons/vsc.svg @@ -0,0 +1 @@ +Visual Studio Code \ No newline at end of file diff --git a/src/@types/environment.d.ts b/src/@types/environment.d.ts index 56ec912..1fb7140 100644 --- a/src/@types/environment.d.ts +++ b/src/@types/environment.d.ts @@ -10,6 +10,8 @@ declare global { GITHUB_KEY: string LEETCODE_USERNAME: string NEXT_PUBLIC_GA_MEASUREMENT_ID: string + NEXT_PUBLIC_APP_VERSION: string + NEXT_PUBLIC_NEXT_VERSION: string } } interface Window { diff --git a/src/__tests__/components/projects/ProjectItem.test.tsx b/src/__tests__/components/projects/ProjectItem.test.tsx index 1335b05..8a8139b 100644 --- a/src/__tests__/components/projects/ProjectItem.test.tsx +++ b/src/__tests__/components/projects/ProjectItem.test.tsx @@ -2,6 +2,7 @@ import projectsResponse from '@/__mocks__/projects-response' import ProjectItem from '@/components/projects/ProjectItem' import { render, screen } from '@testing-library/react' +import Image from 'next/image' const data = projectsResponse.data[0] @@ -10,13 +11,21 @@ test('should render title', () => { + > + cover + ) const title = screen.getByRole('heading') @@ -29,13 +38,21 @@ test('should render cover', () => { + > + cover + ) const banner = screen.getByTestId('project-cover') @@ -48,13 +65,21 @@ test('should render correct link', () => { + > + cover + ) const link = screen.getAllByTestId('project-link') @@ -69,13 +94,21 @@ test('shoud render repository if not null', () => { + > + cover + ) const repository = screen.getByTestId('repository-url') @@ -91,13 +124,21 @@ test('should render website if not null', () => { + > + cover + ) const websiteUrls = screen.getByTestId('website-url') @@ -111,13 +152,21 @@ test('should render skills', () => { + > + cover + ) const skills = screen.getAllByTestId('skills') diff --git a/src/__tests__/components/terminal/Terminal.test.tsx b/src/__tests__/components/terminal/Terminal.test.tsx index 1d36aca..6b4c4bd 100644 --- a/src/__tests__/components/terminal/Terminal.test.tsx +++ b/src/__tests__/components/terminal/Terminal.test.tsx @@ -28,23 +28,23 @@ test('should focus on click', () => { render() const terminal = screen.getByTestId('terminal') - const prompt = screen.getByTestId('terminal-input') + const prompt = screen.getAllByTestId('terminal-input') - expect(prompt).not.toHaveFocus() + expect(prompt[1]).not.toHaveFocus() fireEvent.click(terminal) - expect(prompt).toHaveFocus() + expect(prompt[1]).toHaveFocus() }) test('should blur prompt when scrolled to bottom', () => { render() const terminal = screen.getByTestId('terminal') - const prompt = screen.getByTestId('terminal-input') + const prompt = screen.getAllByTestId('terminal-input') - expect(prompt).not.toHaveFocus() + expect(prompt[1]).not.toHaveFocus() fireEvent.scroll(terminal, { target: { scrollY: 100 } }) - expect(prompt).not.toHaveFocus() + expect(prompt[1]).not.toHaveFocus() }) diff --git a/src/__tests__/components/terminal/TerminalHelp.test.tsx b/src/__tests__/components/terminal/TerminalHelp.test.tsx index 4f67f4e..d2c7d88 100644 --- a/src/__tests__/components/terminal/TerminalHelp.test.tsx +++ b/src/__tests__/components/terminal/TerminalHelp.test.tsx @@ -3,7 +3,7 @@ import { render, screen, within } from '@testing-library/react' test('should render the correct version number', () => { render() - expect(screen.getByText(/version 0.1.0/i)).toBeInTheDocument() + expect(screen.getByText(/version 1.0.0/i)).toBeInTheDocument() }) test('should render the correct usage message', () => { diff --git a/src/__tests__/components/terminal/TerminalProjects.test.tsx b/src/__tests__/components/terminal/TerminalProjects.test.tsx index c643094..0fb9ee5 100644 --- a/src/__tests__/components/terminal/TerminalProjects.test.tsx +++ b/src/__tests__/components/terminal/TerminalProjects.test.tsx @@ -99,8 +99,8 @@ test('should has correct link', async () => { const links = await screen.findAllByTestId('project-link') expect(links).toHaveLength(2) - expect(links[0]).toHaveAttribute('href', '/projects/1') - expect(links[1]).toHaveAttribute('href', '/projects/2') + expect(links[0]).toHaveAttribute('href', '/projects/nothing') + expect(links[1]).toHaveAttribute('href', '/projects/medjed') }) test('should render description with 3 max lines', async () => { diff --git a/src/__tests__/stores/terminal-store.test.tsx b/src/__tests__/stores/terminal-store.test.tsx index 44bd2fc..18af405 100644 --- a/src/__tests__/stores/terminal-store.test.tsx +++ b/src/__tests__/stores/terminal-store.test.tsx @@ -1,10 +1,10 @@ import useTerminalStore from '@/stores/terminal-store' import { act, renderHook } from '@testing-library/react' -test('should initialize with one prompt', () => { +test('should initialize with two prompt', () => { const { result } = renderHook(() => useTerminalStore()) - expect(result.current.prompts).toHaveLength(1) + expect(result.current.prompts).toHaveLength(2) }) test('should add a new prompt', () => { @@ -14,7 +14,7 @@ test('should add a new prompt', () => { result.current.addPrompt() }) - expect(result.current.prompts).toHaveLength(2) + expect(result.current.prompts).toHaveLength(3) }) test('should update a prompt', () => { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2ee4cb6..1ae67e5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,7 @@ import { Poppins } from 'next/font/google' import localFont from 'next/font/local' import Navbar from '@/components/navbar/Navbar' import './globals.css' -import { type Metadata } from 'next' +import { type Viewport, type Metadata } from 'next' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' import GrainyTexture from '@/components/GrainyTexture' import PageProgressBar from '@/components/PageProgressBar' @@ -29,12 +29,9 @@ export const metadata: Metadata = { default: 'rezaa' }, description: 'hii, i'm rezaa', - viewport: 'width=device-width, initial-scale=1', metadataBase: new URL('https://rezaa.me'), - colorScheme: 'dark', creator: 'Reza Ageng Trihandoko', publisher: 'Reza Ageng Trihandoko', - themeColor: '#0D0409', openGraph: { type: 'website', title: { @@ -51,6 +48,13 @@ export const metadata: Metadata = { } } +export const viewport: Viewport = { + width: 'device-width', + initialScale: 1, + themeColor: '#0D0409', + colorScheme: 'dark' +} + const RootLayout = ({ children }: { diff --git a/src/app/loading.tsx b/src/app/loading.tsx new file mode 100644 index 0000000..739aaae --- /dev/null +++ b/src/app/loading.tsx @@ -0,0 +1,12 @@ +const Loading = (): JSX.Element => { + return ( +
+
+
+ + re().rendering + +
+ ) +} +export default Loading diff --git a/src/app/projects/[slug]/page.tsx b/src/app/projects/[slug]/page.tsx index 0291c11..e6e2c19 100644 --- a/src/app/projects/[slug]/page.tsx +++ b/src/app/projects/[slug]/page.tsx @@ -10,6 +10,7 @@ import { AiOutlineLink } from 'react-icons/ai' import rehypeHighlight from 'rehype-highlight' import 'highlight.js/styles/atom-one-dark.min.css' import { type Metadata } from 'next' +import Image from 'next/image' interface Props { params: { slug: string } @@ -130,8 +131,21 @@ const Project = async ({ params }: Props): Promise => {
-
- +
+ ( + {alt + ) + }} + />
) diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx index 6a41d71..de6086d 100644 --- a/src/app/projects/page.tsx +++ b/src/app/projects/page.tsx @@ -1,4 +1,5 @@ import ProjectItem from '@/components/projects/ProjectItem' +import ServerImage from '@/components/projects/ServerImage' import { getProjects, getProjectsPage } from '@/ssg' import { type Metadata } from 'next' @@ -68,21 +69,24 @@ const Projects = async (): Promise => { return (
- {data.map((project, i) => ( + {data.map(async (project, i) => ( + > + + ))}
) diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 4543d88..a13a969 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -2,16 +2,22 @@ import { type MetadataRoute } from 'next' const sitemap = (): MetadataRoute.Sitemap => [ { - url: 'https://rezaa.me/', - lastModified: new Date() + url: 'https://rezaa.me', + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 1 }, { url: 'https://rezaa.me/projects', - lastModified: new Date() + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.8 }, { url: 'https://rezaa.me/about', - lastModified: new Date() + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.8 } ] diff --git a/src/components/home/stats/HomeSkills.tsx b/src/components/home/stats/HomeSkills.tsx index 3bbc916..769b37a 100644 --- a/src/components/home/stats/HomeSkills.tsx +++ b/src/components/home/stats/HomeSkills.tsx @@ -4,7 +4,7 @@ import { Float, TrackballControls } from '@react-three/drei' import { Canvas } from '@react-three/fiber' import HomeSkillsCloud from './HomeSkillsCloud' import { ResizeObserver } from '@juggle/resize-observer' -import { useLayoutEffect, useRef, useState } from 'react' +import { Suspense, useLayoutEffect, useRef, useState } from 'react' import { TbCube, TbCubeOff } from 'react-icons/tb' import { AnimatePresence, @@ -106,18 +106,26 @@ const HomeSkills = ({ data, className = '' }: Props): JSX.Element => { exit={exit} className="mt-2 h-full w-full -translate-x-4 -translate-y-4 sm:flex-1" > - + {`re().rendering`} +
+ } > - - - - - - + + + + + + + + ) : ( diff --git a/src/components/home/stats/HomeSkillsCloud.tsx b/src/components/home/stats/HomeSkillsCloud.tsx index 850be2e..ae8cecd 100644 --- a/src/components/home/stats/HomeSkillsCloud.tsx +++ b/src/components/home/stats/HomeSkillsCloud.tsx @@ -1,8 +1,5 @@ import { Spherical, Vector3 } from 'three' -import * as Icons from 'react-icons/si' -import { HiLockClosed } from 'react-icons/hi' import { v4 as uuidv4 } from 'uuid' -import { renderToString } from 'react-dom/server' import { useMemo } from 'react' import HomeSkillsIcon from './HomeSkillsIcon' import isFloat from '@/helpers/isFloat' @@ -10,31 +7,32 @@ import isFloat from '@/helpers/isFloat' const HomeSkillsCloud = (): JSX.Element => { const icons = useMemo(() => { const temp: Array<[Vector3, string]> = [] - const skills: JSX.Element[] = [ - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - + const skills: string[] = [ + 'js', + 'ts', + 'dart', + 'html5', + 'css', + 'md', + 'vsc', + 'git', + 'github', + 'intellij', + 'nodejs', + 'npm', + 'react', + 'nextjs', + 'flutter', + 'tailwind', + 'styled', + 'framer', + 'strapi', + 'three', + 'reactquery', + 'apollo', + 'pnpm', + 'jest', + 'rtl' ] const lengthSqrt = Math.sqrt(skills.length) @@ -53,8 +51,8 @@ const HomeSkillsCloud = (): JSX.Element => { spherical.set(16, phiSpan * i, thetaSpan * j) ), skills[currIndex] !== undefined - ? renderToString(skills[currIndex]) - : renderToString() + ? `/assets/icons/${skills[currIndex]}.svg` + : '/assets/icons/lock.svg' ]) currIndex++ } diff --git a/src/components/navbar/Navbar.tsx b/src/components/navbar/Navbar.tsx index e8bc895..8878932 100644 --- a/src/components/navbar/Navbar.tsx +++ b/src/components/navbar/Navbar.tsx @@ -103,7 +103,9 @@ const Navbar = (): JSX.Element => { className="absolute left-0 top-0 h-full w-full rounded-full bg-primary bg-opacity-50 backdrop-blur-lg backdrop-filter" />
-

rezaa

+ + rezaa + {isLg ? (
    { ))}
) : ( - + )}
diff --git a/src/components/projects/ProjectItem.tsx b/src/components/projects/ProjectItem.tsx index 3c5e735..326ffde 100644 --- a/src/components/projects/ProjectItem.tsx +++ b/src/components/projects/ProjectItem.tsx @@ -1,7 +1,6 @@ 'use client' import { type Skill } from '@/@types/skills' -import Image from 'next/image' import Link from 'next/link' import { AiOutlineLink } from 'react-icons/ai' import { SiGithub } from 'react-icons/si' @@ -9,30 +8,31 @@ import { v4 as uuidv4 } from 'uuid' import { motion } from 'framer-motion' import { transition } from '@/constants/framer-motion' import useResponsive from '@/hooks/useResponsive' -import { useEffect, useState } from 'react' +import { type ReactNode, useEffect, useState } from 'react' interface Props { index: number slug: string title: string - cover: string repository: string | null website: string | null websiteLabel: string | null + children: ReactNode skills: Skill[] } const ProjectItem = ({ index, - cover, repository, skills, slug, title, website, - websiteLabel + websiteLabel, + children }: Props): JSX.Element => { const [origin, setOrigin] = useState<'left' | 'right' | 'center'>('center') + const [zIndex, setZIndex] = useState<'z-0' | 'z-10'>('z-0') const isLg = useResponsive(1024) @@ -63,7 +63,6 @@ const ProjectItem = ({ isLg ? { scale: 1.15, - zIndex: 10, transition: { ...transition, delay: 0.15 @@ -71,20 +70,23 @@ const ProjectItem = ({ } : {} } - className="group relative overflow-hidden rounded-2xl bg-primary" + onMouseEnter={() => { + setTimeout(() => { + setZIndex('z-10') + }, 150) + }} + onMouseLeave={() => { + setTimeout(() => { + setZIndex('z-0') + }, 150) + }} + className={`${zIndex} group relative overflow-hidden rounded-2xl bg-primary`} >
- cover + {children}
diff --git a/src/components/projects/ServerImage.tsx b/src/components/projects/ServerImage.tsx new file mode 100644 index 0000000..3019c28 --- /dev/null +++ b/src/components/projects/ServerImage.tsx @@ -0,0 +1,23 @@ +import { generateBuffer } from '@/helpers/generate-buffer' +import Image from 'next/image' +interface Props { + src: string +} + +const ServerImage = async ({ src }: Props): Promise => { + const blurData = await generateBuffer(src) + + return ( + cover + ) +} +export default ServerImage diff --git a/src/components/terminal/Terminal.tsx b/src/components/terminal/Terminal.tsx index 4cae3a9..65a914f 100644 --- a/src/components/terminal/Terminal.tsx +++ b/src/components/terminal/Terminal.tsx @@ -2,8 +2,9 @@ import useTerminalStore from '@/stores/terminal-store' import TerminalPrompt from './TerminalPrompt' import { v4 as uuidv4 } from 'uuid' import { useScroll, type MotionStyle, motion } from 'framer-motion' -import { useEffect, useRef } from 'react' +import { useEffect, useRef, useState } from 'react' import LenisProvider from '@/libs/react-lenis' +import { transition } from '@/constants/framer-motion' interface TerminalProps { className?: string @@ -13,6 +14,8 @@ interface TerminalProps { const Terminal = ({ className = '', style }: TerminalProps): JSX.Element => { const prompts = useTerminalStore((state) => state.prompts) + const [prevLength, setPrevLength] = useState(prompts.length) + const terminalRef = useRef(null) const promptRef = useRef(null) @@ -28,16 +31,24 @@ const Terminal = ({ className = '', style }: TerminalProps): JSX.Element => { }) useEffect(() => { - if (prompts.length === 1) return - promptRef.current?.focus() - }, [prompts.length]) + if (prompts.length <= prevLength) { + setPrevLength(prompts.length) + return + } + if (prompts.length > prevLength) { + setPrevLength(prompts.length - 1) + promptRef.current?.focus() + } + }, [prevLength, prompts.length]) return ( promptRef.current?.focus()} - className={`${className} h-[32rem] w-full overflow-hidden rounded-lg border border-white bg-primary bg-opacity-50 font-mono text-sm backdrop-blur-lg backdrop-filter`} + className={`${className} h-[32rem] w-full overflow-hidden rounded-lg border border-white bg-primary bg-opacity-50 font-mono text-sm text-gray-300 backdrop-blur-lg backdrop-filter`} data-testid="terminal" > {/*
*/} diff --git a/src/components/terminal/TerminalAscii.tsx b/src/components/terminal/TerminalAscii.tsx new file mode 100644 index 0000000..d487c1a --- /dev/null +++ b/src/components/terminal/TerminalAscii.tsx @@ -0,0 +1,30 @@ +const TerminalAscii = (): JSX.Element => { + return ( +
+      {`
+                      :=+#%@@@@@@%#*=:            
+                  .=#@@@@@@@@@@@@@@@@@@#=.        
+                -#@@@@@@@@@@@@@@@@@@@@@@@@#-      
+              :%@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-    
+             *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*   
+            #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#  
+           *@@@@@@@@@@   .#@@@@@@@@*..#@@@@@@@@@# 
+          :@@@@@@@@@@@     -@@@@@@@*::%@@@@@@@@@@-
+          #@@@@@@@@@@@  -#.  *@@@@@#==%@@@@@@@@@@#
+          @@@@@@@@@@@@  -@@=  :%@@@%++%@@@@@@@@@@@
+          @@@@@@@@@@@@  -@@@%.  +@@@##@@@@@@@@@@@@
+          #@@@@@@@@@@@  -@@@@@+  :%@@@@@@@@@@@@@@#
+          -@@@@@@@@@@@  -@@@@@@%:  +@@@@@@@@@@@@@-
+           *@@@@@@@@@@  -@@@@@@@@+..-%@@@@@@@@@@# 
+            #@@@@@@@@@@@@@@@@@@@@@@=--*@@@@@@@@%  
+             *@@@@@@@@@@@@@@@@@@@@@@%++*@@@@@@*   
+              -%@@@@@@@@@@@@@@@@@@@@@@###%@@%-    
+                -%@@@@@@@@@@@@@@@@@@@@@@%@%-      
+                  .+#@@@@@@@@@@@@@@@@@@%+:        
+                      :=*#%@@@@@@%#*=:            
+                       
+      `}
+    
+ ) +} +export default TerminalAscii diff --git a/src/components/terminal/TerminalHelp.tsx b/src/components/terminal/TerminalHelp.tsx index 5d70c84..727f3b2 100644 --- a/src/components/terminal/TerminalHelp.tsx +++ b/src/components/terminal/TerminalHelp.tsx @@ -1,26 +1,33 @@ -import React from 'react' +import TerminalAscii from './TerminalAscii' const TerminalHelp = (): JSX.Element => { return ( -
- version 0.1.0 - usage: xe [option] -
- all options: -
    -
  • summary
  • -
  • skills
  • -
  • experience
  • -
  • projects
  • -
  • educations
  • -
  • contact
  • -
-
-
- other commands: -
    -
  • clear
  • -
+
+ +
+ rezaa.me + -------- + + version {process.env.NEXT_PUBLIC_APP_VERSION} + + usage: xe [option] +
+ all options: +
    +
  • summary
  • +
  • skills
  • +
  • experience
  • +
  • projects
  • +
  • educations
  • +
  • contact
  • +
+
+
+ other commands: +
    +
  • clear
  • +
+
) diff --git a/src/components/terminal/TerminalProjects.tsx b/src/components/terminal/TerminalProjects.tsx index 7985cc5..7e03ad4 100644 --- a/src/components/terminal/TerminalProjects.tsx +++ b/src/components/terminal/TerminalProjects.tsx @@ -28,7 +28,7 @@ const TerminalProjects = (): JSX.Element => {

{project.attributes.name}  diff --git a/src/components/terminal/TerminalPrompt.tsx b/src/components/terminal/TerminalPrompt.tsx index efd49e8..22babc3 100644 --- a/src/components/terminal/TerminalPrompt.tsx +++ b/src/components/terminal/TerminalPrompt.tsx @@ -40,7 +40,7 @@ const TerminalPrompt = forwardRef( className="flex items-center gap-1 text-accent-3" > - v13.4.5 + v{process.env.NEXT_PUBLIC_NEXT_VERSION}

diff --git a/src/helpers/generate-buffer.ts b/src/helpers/generate-buffer.ts new file mode 100644 index 0000000..fcceea1 --- /dev/null +++ b/src/helpers/generate-buffer.ts @@ -0,0 +1,11 @@ +import { getPlaiceholder } from 'plaiceholder' + +export const generateBuffer = async (url: string): Promise => { + const buffer = await fetch(url).then(async (res) => + Buffer.from(await res.arrayBuffer()) + ) + + const { base64 } = await getPlaiceholder(buffer) + + return base64 +} diff --git a/src/stores/terminal-store.ts b/src/stores/terminal-store.tsx similarity index 80% rename from src/stores/terminal-store.ts rename to src/stores/terminal-store.tsx index 497c4e5..a788821 100644 --- a/src/stores/terminal-store.ts +++ b/src/stores/terminal-store.tsx @@ -1,3 +1,4 @@ +import TerminalHelp from '@/components/terminal/TerminalHelp' import { shallow } from 'zustand/shallow' import { createWithEqualityFn } from 'zustand/traditional' @@ -16,7 +17,14 @@ const defaultPrompt: Prompt = { const useTerminalStore = createWithEqualityFn()( (set, get) => ({ - prompts: [defaultPrompt], + prompts: [ + { + ...defaultPrompt, + isActive: false, + children: + }, + defaultPrompt + ], addPrompt: () => { set((state) => ({ prompts: [...state.prompts, defaultPrompt] })) },