diff --git a/package-lock.json b/package-lock.json index f28683c..7f50b49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,16 @@ "name": "e2e-platform", "version": "0.1.0", "dependencies": { + "@react-three/drei": "^10.0.4", + "@react-three/fiber": "^9.1.0", "framer-motion": "^12.5.0", "lucide-react": "^0.479.0", "next": "15.2.2", "react": "^19.0.0", "react-dom": "^19.0.0", - "tailwind-scrollbar": "^3.1.0" + "react-intersection-observer": "^9.16.0", + "tailwind-scrollbar": "^3.1.0", + "three": "^0.174.0" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -40,6 +44,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", @@ -680,6 +696,24 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.1.0.tgz", + "integrity": "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@next/env": { "version": "15.2.2", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.2.tgz", @@ -879,6 +913,96 @@ "node": ">=14" } }, + "node_modules/@react-three/drei": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.0.4.tgz", + "integrity": "sha512-/ZtU4DAkJg72ipsa/UHXJ6SFs45G/rTzV+TdgZH2vyqaNbnFqNHQNXpr/HXWtceZOYI8Gzlv1yPAuk8EjuhLSA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mediapipe/tasks-vision": "0.10.17", + "@monogrid/gainmap-js": "^3.0.6", + "@use-gesture/react": "^10.3.1", + "camera-controls": "^2.9.0", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.56", + "glsl-noise": "^0.0.0", + "hls.js": "^1.5.17", + "maath": "^0.10.8", + "meshline": "^3.3.1", + "stats-gl": "^2.2.8", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.8.3", + "three-stdlib": "^2.35.6", + "troika-three-text": "^0.52.0", + "tunnel-rat": "^0.1.2", + "use-sync-external-store": "^1.4.0", + "utility-types": "^3.11.0", + "zustand": "^5.0.1" + }, + "peerDependencies": { + "@react-three/fiber": "^9.0.0", + "react": "^19", + "react-dom": "^19", + "three": ">=0.159" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.1.0.tgz", + "integrity": "sha512-r/a0dpqdz5ci17yMIWE+70WwxiTScGFEyvtDj0o4isZ7YUvPu0k78Zl7cJGL+KhheKXCzbNNxEz4+lFan6atyg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.28.9", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^2.0.0", + "react-reconciler": "^0.31.0", + "react-use-measure": "^2.1.7", + "scheduler": "^0.25.0", + "suspend-react": "^0.1.3", + "use-sync-external-store": "^1.4.0", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-native": ">=0.78", + "three": ">=0.156" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -908,6 +1032,18 @@ "tslib": "^2.8.0" } }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -939,11 +1075,16 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.0.10", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -959,6 +1100,41 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.174.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.174.0.tgz", + "integrity": "sha512-De/+vZnfg2aVWNiuy1Ldu+n2ydgw1osinmiZTAn0necE++eOfsygL8JpZgFjR2uHmAPo89MkxBj3JJ+2BMe+Uw==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": "*", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.21.tgz", + "integrity": "sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.26.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", @@ -1195,6 +1371,30 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.56.tgz", + "integrity": "sha512-JkT4ngqwk4gKAFoWtXCcC1+TGhSStVtauS9z27slOGSFYr+QqjS0CoawiAxP7Gq9xkT4Pw9uouvWPT44HwbUiw==", + "license": "BSD-3-Clause" + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1558,6 +1758,35 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1626,6 +1855,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1706,6 +1959,15 @@ "node": ">= 6" } }, + "node_modules/camera-controls": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.0.tgz", + "integrity": "sha512-vBQ5Daxv4KRsn07U/VqkPxoqD8U+S++0oq5NLf4HevMuh/BDta3rg49e/P564AMzFPBePQeXDKOkiIezRgyDwg==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.126.1" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001704", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz", @@ -1844,6 +2106,24 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1874,7 +2154,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -1999,6 +2278,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-gpu": { + "version": "5.0.70", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", + "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -2034,6 +2322,12 @@ "node": ">=0.10.0" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2765,6 +3059,12 @@ "reusify": "^1.0.4" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3111,6 +3411,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3231,6 +3537,32 @@ "node": ">= 0.4" } }, + "node_modules/hls.js": { + "version": "1.5.20", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.20.tgz", + "integrity": "sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==", + "license": "Apache-2.0" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3241,6 +3573,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -3550,6 +3888,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -3726,6 +4070,18 @@ "node": ">= 0.4" } }, + "node_modules/its-fine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", + "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.9" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -3864,6 +4220,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -3933,6 +4298,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3952,6 +4327,21 @@ "node": ">= 8" } }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4610,6 +5000,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4620,6 +5016,16 @@ "node": ">= 0.8.0" } }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4683,6 +5089,21 @@ "react": "^19.0.0" } }, + "node_modules/react-intersection-observer": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", + "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", + "license": "MIT", + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -4690,6 +5111,36 @@ "dev": true, "license": "MIT" }, + "node_modules/react-reconciler": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz", + "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", + "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4734,6 +5185,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -4755,6 +5212,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -5126,6 +5592,32 @@ "dev": true, "license": "MIT" }, + "node_modules/stats-gl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", + "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "license": "MIT", + "dependencies": { + "@types/three": "*", + "three": "^0.170.0" + }, + "peerDependencies": { + "@types/three": "*", + "three": "*" + } + }, + "node_modules/stats-gl/node_modules/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "license": "MIT" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -5436,6 +5928,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/tailwind-scrollbar": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", @@ -5544,6 +6045,44 @@ "node": ">=0.8" } }, + "node_modules/three": { + "version": "0.174.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.174.0.tgz", + "integrity": "sha512-p+WG3W6Ov74alh3geCMkGK9NWuT62ee21cV3jEnun201zodVF4tCE5aZa2U122/mkLRmhJJUQmLLW1BH00uQJQ==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", + "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.35.14", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.35.14.tgz", + "integrity": "sha512-kpCaEg59M9usFTgHC+YZNKvx7nMoLI2zQxZBV8pjoNW6vNZmGyXpaLBL09A2oLCsS3KepgMFkOuk6lRoebTNvA==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", @@ -5601,6 +6140,36 @@ "node": ">=8.0" } }, + "node_modules/troika-three-text": { + "version": "0.52.3", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.3.tgz", + "integrity": "sha512-jLhiwgV8kEkwWjvK12f2fHVpbOC75p7SgPQ0cgcz+IMtN5Bdyg4EuFdwuTOVu9ga8UeYdKBpzd1AxviyixtYTQ==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.0", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.0.tgz", + "integrity": "sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", @@ -5639,6 +6208,43 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", + "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5811,12 +6417,41 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6043,6 +6678,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 30102b3..8d5a1fa 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,16 @@ "lint": "next lint" }, "dependencies": { + "@react-three/drei": "^10.0.4", + "@react-three/fiber": "^9.1.0", "framer-motion": "^12.5.0", "lucide-react": "^0.479.0", "next": "15.2.2", "react": "^19.0.0", "react-dom": "^19.0.0", - "tailwind-scrollbar": "^3.1.0" + "react-intersection-observer": "^9.16.0", + "tailwind-scrollbar": "^3.1.0", + "three": "^0.174.0" }, "devDependencies": { "@eslint/eslintrc": "^3", diff --git a/public/images/how-it-works/employer1.avif b/public/images/how-it-works/employer1.avif new file mode 100644 index 0000000..37e2ea9 Binary files /dev/null and b/public/images/how-it-works/employer1.avif differ diff --git a/public/images/how-it-works/employer2.avif b/public/images/how-it-works/employer2.avif new file mode 100644 index 0000000..39b23fa Binary files /dev/null and b/public/images/how-it-works/employer2.avif differ diff --git a/public/images/how-it-works/employer3.avif b/public/images/how-it-works/employer3.avif new file mode 100644 index 0000000..f284f05 Binary files /dev/null and b/public/images/how-it-works/employer3.avif differ diff --git a/public/images/how-it-works/student1.avif b/public/images/how-it-works/student1.avif new file mode 100644 index 0000000..d608224 Binary files /dev/null and b/public/images/how-it-works/student1.avif differ diff --git a/public/images/how-it-works/student2.avif b/public/images/how-it-works/student2.avif new file mode 100644 index 0000000..7b5a548 Binary files /dev/null and b/public/images/how-it-works/student2.avif differ diff --git a/public/images/how-it-works/student3.avif b/public/images/how-it-works/student3.avif new file mode 100644 index 0000000..25a8986 Binary files /dev/null and b/public/images/how-it-works/student3.avif differ diff --git a/public/images/shapes/confetti.webp b/public/images/shapes/confetti.webp new file mode 100644 index 0000000..f50d590 Binary files /dev/null and b/public/images/shapes/confetti.webp differ diff --git a/public/images/shapes/cute-shape.png b/public/images/shapes/cute-shape.png new file mode 100644 index 0000000..e75444b Binary files /dev/null and b/public/images/shapes/cute-shape.png differ diff --git a/public/images/shapes/shapes.png b/public/images/shapes/shapes.png new file mode 100644 index 0000000..ebf33f3 Binary files /dev/null and b/public/images/shapes/shapes.png differ diff --git a/public/images/shapes/shapes2.png b/public/images/shapes/shapes2.png new file mode 100644 index 0000000..4638b0d Binary files /dev/null and b/public/images/shapes/shapes2.png differ diff --git a/public/images/shapes/square.png b/public/images/shapes/square.png new file mode 100644 index 0000000..f329e35 Binary files /dev/null and b/public/images/shapes/square.png differ diff --git a/public/images/shapes/star.png b/public/images/shapes/star.png new file mode 100644 index 0000000..f7b9e5a Binary files /dev/null and b/public/images/shapes/star.png differ diff --git a/public/images/sti/teacher1.jpg b/public/images/sti/teacher1.jpg new file mode 100644 index 0000000..a7ed8c0 Binary files /dev/null and b/public/images/sti/teacher1.jpg differ diff --git a/public/images/sti/teacher2.jpg b/public/images/sti/teacher2.jpg new file mode 100644 index 0000000..2f89c4c Binary files /dev/null and b/public/images/sti/teacher2.jpg differ diff --git a/public/images/sti/teacher3.jpg b/public/images/sti/teacher3.jpg new file mode 100644 index 0000000..cae2a56 Binary files /dev/null and b/public/images/sti/teacher3.jpg differ diff --git a/public/images/sti/teacher4.jpg b/public/images/sti/teacher4.jpg new file mode 100644 index 0000000..2dbf33f Binary files /dev/null and b/public/images/sti/teacher4.jpg differ diff --git a/public/images/sti/teacher5.jpg b/public/images/sti/teacher5.jpg new file mode 100644 index 0000000..b294249 Binary files /dev/null and b/public/images/sti/teacher5.jpg differ diff --git a/src/app/globals.css b/src/app/globals.css index 35facb6..405d662 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -2,11 +2,32 @@ @tailwind components; @tailwind utilities; -.scrollbar-hide::-webkit-scrollbar { - display: none; - } - .scrollbar-hide { - -ms-overflow-style: none; - scrollbar-width: none; +::-webkit-scrollbar-track { + background-color: transparent; +} + +::-webkit-scrollbar { + width: 0px; +} + +::-webkit-scrollbar-thumb { + background-color: rgb(207, 207, 207); + border-radius: 4px; +} + + + + @keyframes moveBackground { + 0% { background-position: 0% 50%; } + 25% { background-position: 30% 70%; } + 50% { background-position: 70% 30%; } + 75% { background-position: 50% 80%; } + 100% { background-position: 0% 50%; } } + + .bg-animate { + background-size: 300% 300%; + animation: moveBackground 10s infinite ease-in-out; + } + \ No newline at end of file diff --git a/src/app/landing/MainLanding.tsx b/src/app/landing/MainLanding.tsx index 62d85da..058279e 100644 --- a/src/app/landing/MainLanding.tsx +++ b/src/app/landing/MainLanding.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @next/next/no-img-element */ "use client"; import LandingNav from "./components/LandingNav"; import HeroSection from "./components/HeroSection"; @@ -6,8 +5,14 @@ import UploadIcon from "./components/icons/UploadIcon"; import JobMatcher from "./components/icons/JobMatcher"; import InterviewPrep from "./components/SwipableCard"; import Skills from "./components/icons/Skills"; -import AutoScrollingCarousel from "./components/Test"; +import AutoScrollingCarousel from "./components/CarouselCards"; import { motion } from 'framer-motion'; +import { useState, useEffect } from 'react'; +import ScrollToTop from "./components/ScrolltoTop"; +import HowItWorks from "./components/HowitWorks"; +import AnimatedButton from "./components/Button2"; +import { AnimatePresence } from "framer-motion"; +import Footer from "./components/Footer"; @@ -54,20 +59,49 @@ const companies = [ } ]; +const images = [ + 'images/sti/teacher1.jpg', + 'images/sti/teacher2.jpg', + 'images/sti/teacher3.jpg', + 'images/sti/teacher4.jpg', + 'images/sti/teacher5.jpg' + +]; + export default function MainLanding() { + const [hovered, setHovered] = useState(false); + + const [index, setIndex] = useState(0); + + useEffect(() => { + if (images.length <= 1) return; + + const interval = setInterval(() => { + setIndex((prevIndex) => { + const nextIndex = prevIndex + 1 >= images.length ? 0 : prevIndex + 1; + return nextIndex; + }); + }, 3000); + + return () => clearInterval(interval); + }, [images]); + + return ( -
-
-
+
+ +
+
+ -
+
{/* Header Section */}
-

+

Set up your Profile

@@ -75,9 +109,8 @@ export default function MainLanding() {

- - {/* 1st Section */} + + +
+ {/* Showcase your Resume Card */}
@@ -112,6 +148,7 @@ export default function MainLanding() { Showcase your skills and expertise to stand out. Let employers see what you bring to the table.

+
@@ -137,9 +174,19 @@ export default function MainLanding() {

Create clear, engaging job postings with AI assistance. Optimize your listings to attract the right candidates effortlessly.

- + + + +
Abstract Swirls @@ -178,9 +225,16 @@ export default function MainLanding() {

Build meaningful connections with people who can support your career journey. Use the in-app messaging system to network, ask questions, and explore new opportunities.

- + +
@@ -203,9 +257,16 @@ export default function MainLanding() {

Create clear, engaging job postings with AI assistance. Optimize your listings to attract the right candidates effortlessly.

- + +
Abstract Swirls @@ -223,7 +284,7 @@ export default function MainLanding() { viewport={{ once: false, amount: 0.2 }} > -
+
{/* Left Side */}

@@ -243,8 +304,14 @@ export default function MainLanding() { {/* 4th Section Note: Debating whether pwede to editable by admin or no na >__<*/} - -
+ +

Verified @@ -254,16 +321,155 @@ export default function MainLanding() { Explore opportunities with our partnered companies. Connect with top employers offering OJT programs and career growth opportunities

- - - -
+ +

+ {/* 5th Section */} +
+ +
+
+

+ STI is now Hiring +

+

+ Join our team at STI College! We’re looking for passionate individuals who are ready to make an impact in education and help shape future professionals. +

+ + + Apply Now + + +
+ + {/* Right: Slideshow */} +
+ + + + +
+
+ +
+

+ Education for Real Life +
+ Kick-start your career with STI College—where real-life education meets real opportunities. +

+
+
+
+ + {/* 6th Section */} +
+ +
+ + {/* 7th Section */} + + +
+ +
+ + {/* Floating Objects */} + + Shape + + + + + Shape + + + Shape + + + {/* CTA */} +
+
+

+ Be + Future + Ready +

+

Find Your Perfect OJT & Career Opportunities Today!

+ +

Connect with top employers, showcase your skills, and land the opportunity that takes your career to the next level. + Whether you're searching for internships or full-time jobs, we've got you covered.

+
+
+ + +
+
+
+ + +
+
+
+ +
); -} +} \ No newline at end of file diff --git a/src/app/landing/components/Button2.tsx b/src/app/landing/components/Button2.tsx new file mode 100644 index 0000000..16f9890 --- /dev/null +++ b/src/app/landing/components/Button2.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { motion } from "framer-motion"; +import Image from "next/image"; +import { useState } from "react"; + +export default function HoverImageButton() { + const [isHovered, setIsHovered] = useState(false); + + return ( +
+ + + + + + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + initial={{ backgroundColor: "#2196F3" }} + whileHover={{ + scale: 1.2, + backgroundColor: "#F9A825", + transition: { type: "spring", stiffness: 200, damping: 10 }, + }} + whileTap={{ scale: 0.9 }} + className="px-9 py-5 text-white font-bold text-lg rounded-lg shadow-md" + > + Sign-up Now + + +
+ ); +} diff --git a/src/app/landing/components/Test.tsx b/src/app/landing/components/CarouselCards.tsx similarity index 95% rename from src/app/landing/components/Test.tsx rename to src/app/landing/components/CarouselCards.tsx index 1362d05..dde7998 100644 --- a/src/app/landing/components/Test.tsx +++ b/src/app/landing/components/CarouselCards.tsx @@ -46,12 +46,12 @@ const AutoScrollingCarousel = ({ companies }: { companies: Company[] }) => { > {companies.map((company, index) => ( diff --git a/src/app/landing/components/Footer.tsx b/src/app/landing/components/Footer.tsx index e69de29..90455cf 100644 --- a/src/app/landing/components/Footer.tsx +++ b/src/app/landing/components/Footer.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { MapPin, Mail, Phone } from 'lucide-react'; + +const Footer = () => { + return ( + <> + {/* Footer */} + + +
+

© 2025 STI College Alabang Job Finder. All rights reserved.

+

Connecting Students to Opportunities

+
+ + ); +}; + +export default Footer; diff --git a/src/app/landing/components/HeroSection.tsx b/src/app/landing/components/HeroSection.tsx index 4d3d0c4..a48abaa 100644 --- a/src/app/landing/components/HeroSection.tsx +++ b/src/app/landing/components/HeroSection.tsx @@ -2,6 +2,7 @@ import { useState } from "react"; import Dropdown from "../components/Dropdown"; +import { motion } from "framer-motion"; export default function HomePage() { const [selectedCourse, setSelectedCourse] = useState(""); @@ -93,9 +94,22 @@ export default function HomePage() { width="w-[270px]" /> - + + Show Jobs + +
diff --git a/src/app/landing/components/HowitWorks.tsx b/src/app/landing/components/HowitWorks.tsx new file mode 100644 index 0000000..dd04dc3 --- /dev/null +++ b/src/app/landing/components/HowitWorks.tsx @@ -0,0 +1,164 @@ +"use client"; +import { motion, AnimatePresence } from "framer-motion"; +import { useInView } from "react-intersection-observer"; +import { useState } from "react"; +import ToggleSwitch from "./Toggle"; + +export default function HowItWorks() { + const [toggleState, setToggleState] = useState(false); + + return( +
+ + + {toggleState ? : } + + + +
+ ); +} + +{/*Student View*/} +function MainView() { + const { ref, inView } = useInView({ triggerOnce: false, threshold: 0.2 }); + return ( + + + {/* Left Section */} +
+

+ How It Works +

+ +
+ {steps.map((step, index) => ( + + ))} +
+
+ + {/* Right Section */} +
+
+ {images.map((img, index) => ( +
+ +

{img.title}

+
+ ))} +
+
+
+ ); +} + +function Step({ number, text }: { number: number; text: string }) { + const { ref, inView } = useInView({ triggerOnce: false, threshold: 0.2 }); + + return ( + +
+ {number} +
+

{text}

+
+ ); +} + +{/*Employer View*/} +function AlternateView() { + const { ref, inView } = useInView({ triggerOnce: false, threshold: 0.2 }); + return ( + + + {/* Left Section */} +
+

+ How It Works +

+ +
+ {steps2.map((step, index) => ( + + ))} +
+
+ + {/* Right Section */} +
+
+ {images2.map((img, index) => ( +
+ +

{img.title}

+
+ ))} +
+
+
+ ); +} + +const steps = [ + "Create your profile and upload your resume to showcase your skills.", + "AI recommends the best OJT opportunities. Chat directly with employers.", + "Easily apply for OJT programs and monitor your application status." +]; + +const images = [ + { src: "images/how-it-works/student1.avif", title: "Set Up Your Profile" }, + { src: "images/how-it-works/student3.avif", title: "Match & Connect" }, + { src: "images/how-it-works/student2.avif", title: "Apply & Track Progress" } +]; + +const steps2 = [ + "Create your profile and verify your employer account to gain trust and full access.", + "Find the right candidate with AI-powered candidate matching.", + "Streamline your hiring process with easycreal-time application tracking." +]; + +const images2 = [ + { src: "images/how-it-works/employer1.avif", title: "Verify your Account" }, + { src: "images/how-it-works/employer3.avif", title: "AI Matching" }, + { src: "images/how-it-works/employer2.avif", title: "Seamless Hiring" } +]; diff --git a/src/app/landing/components/LandingNav.tsx b/src/app/landing/components/LandingNav.tsx index c4621d7..0d83f71 100644 --- a/src/app/landing/components/LandingNav.tsx +++ b/src/app/landing/components/LandingNav.tsx @@ -11,12 +11,15 @@ export default function LandingNav() { {/* Desktop Nav */} {/* Mobile Menu Button */} @@ -27,11 +30,11 @@ export default function LandingNav() { {/* Mobile Menu */} {menuOpen && ( )} diff --git a/src/app/landing/components/ScrolltoTop.tsx b/src/app/landing/components/ScrolltoTop.tsx new file mode 100644 index 0000000..994516d --- /dev/null +++ b/src/app/landing/components/ScrolltoTop.tsx @@ -0,0 +1,42 @@ +"use client"; +import { useState, useEffect } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { ChevronUp } from 'lucide-react'; + +export default function ScrollToTop() { + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + const toggleVisibility = () => { + setIsVisible(window.scrollY > 50); + }; + + document.addEventListener("scroll", toggleVisibility); + + return () => document.removeEventListener("scroll", toggleVisibility); + }, []); + + + const scrollToTop = () => { + window.scrollTo({ top: 0, behavior: "smooth" }); + }; + + return ( + + {isVisible && ( + + + Back to Top + + )} + + ); +} diff --git a/src/app/landing/components/SwipableCard.tsx b/src/app/landing/components/SwipableCard.tsx index 5dc2129..ca4b6f0 100644 --- a/src/app/landing/components/SwipableCard.tsx +++ b/src/app/landing/components/SwipableCard.tsx @@ -28,7 +28,7 @@ export default function InterviewPrep() { return (
- + {/* Shadow */} void; + onToggle?: (state: boolean) => void; + knobWidth?: number; + onLabel?: string; + offLabel?: string; + className?: string; +} + +export default function ToggleSwitch({ + isOn, + setIsOn, + onToggle, + knobWidth = 60, + onLabel = "On", + offLabel = "Off", + className="", +}: ToggleSwitchProps) { + const switchWidth = knobWidth * 2.2; + const knobPosition = isOn ? switchWidth - knobWidth - 8 : 2; + + const handleToggle = () => { + setIsOn(!isOn); + if (onToggle) onToggle(!isOn); + }; + + return ( +
+
+
+ + {isOn ? onLabel : offLabel} + +
+
+
+ ); +}